diff --git a/app/(auth)/(tabs)/(libraries)/[libraryId].tsx b/app/(auth)/(tabs)/(libraries)/[libraryId].tsx index 327d11b5..77b2e3ff 100644 --- a/app/(auth)/(tabs)/(libraries)/[libraryId].tsx +++ b/app/(auth)/(tabs)/(libraries)/[libraryId].tsx @@ -45,6 +45,7 @@ import { import { FlashList } from "@shopify/flash-list"; import { Loader } from "@/components/Loader"; import { useSafeAreaInsets } from "react-native-safe-area-context"; +import { orientationAtom } from "@/utils/atoms/orientation"; const MemoizedTouchableItemRouter = React.memo(TouchableItemRouter); @@ -63,9 +64,7 @@ const Page = () => { const [sortBy, setSortBy] = useAtom(sortByAtom); const [sortOrder, setSortOrder] = useAtom(sortOrderAtom); - const [orientation, setOrientation] = useState( - ScreenOrientation.Orientation.PORTRAIT_UP - ); + const [orientation, setOrientation] = useAtom(orientationAtom); const getNumberOfColumns = useCallback(() => { if (orientation === ScreenOrientation.Orientation.PORTRAIT_UP) return 3; @@ -73,7 +72,7 @@ const Page = () => { if (screenWidth < 960) return 6; if (screenWidth < 1280) return 7; return 6; - }, [screenWidth]); + }, [screenWidth, orientation]); useLayoutEffect(() => { setSortBy([ @@ -90,22 +89,6 @@ const Page = () => { ]); }, []); - useEffect(() => { - const subscription = ScreenOrientation.addOrientationChangeListener( - (event) => { - setOrientation(event.orientationInfo.orientation); - } - ); - - ScreenOrientation.getOrientationAsync().then((initialOrientation) => { - setOrientation(initialOrientation); - }); - - return () => { - ScreenOrientation.removeOrientationChangeListener(subscription); - }; - }, []); - const { data: library, isLoading: isLibraryLoading } = useQuery({ queryKey: ["library", libraryId], queryFn: async () => { @@ -417,6 +400,7 @@ const Page = () => { contentInsetAdjustmentBehavior="automatic" data={flatData} renderItem={renderItem} + extraData={orientation} keyExtractor={keyExtractor} estimatedItemSize={244} numColumns={getNumberOfColumns()} diff --git a/app/_layout.tsx b/app/_layout.tsx index db1a105e..8f852130 100644 --- a/app/_layout.tsx +++ b/app/_layout.tsx @@ -13,11 +13,12 @@ import { Stack, useRouter } from "expo-router"; import * as ScreenOrientation from "expo-screen-orientation"; import * as SplashScreen from "expo-splash-screen"; import { StatusBar } from "expo-status-bar"; -import { Provider as JotaiProvider } from "jotai"; +import { Provider as JotaiProvider, useAtom } from "jotai"; import { useEffect, useRef } from "react"; import { GestureHandlerRootView } from "react-native-gesture-handler"; import "react-native-reanimated"; import * as Linking from "expo-linking"; +import { orientationAtom } from "@/utils/atoms/orientation"; SplashScreen.preventAutoHideAsync(); @@ -45,6 +46,7 @@ export default function RootLayout() { function Layout() { const [settings, updateSettings] = useSettings(); + const [orientation, setOrientation] = useAtom(orientationAtom); useKeepAwake(); @@ -71,8 +73,24 @@ function Layout() { ); }, [settings]); + useEffect(() => { + const subscription = ScreenOrientation.addOrientationChangeListener( + (event) => { + console.log(event.orientationInfo.orientation); + setOrientation(event.orientationInfo.orientation); + } + ); + + ScreenOrientation.getOrientationAsync().then((initialOrientation) => { + setOrientation(initialOrientation); + }); + + return () => { + ScreenOrientation.removeOrientationChangeListener(subscription); + }; + }, []); + const url = Linking.useURL(); - const router = useRouter(); if (url) { const { hostname, path, queryParams } = Linking.parse(url); diff --git a/utils/atoms/orientation.ts b/utils/atoms/orientation.ts new file mode 100644 index 00000000..19c40dad --- /dev/null +++ b/utils/atoms/orientation.ts @@ -0,0 +1,7 @@ +import * as ScreenOrientation from "expo-screen-orientation"; +import { Orientation } from "expo-screen-orientation"; +import { atom } from "jotai"; + +export const orientationAtom = atom( + ScreenOrientation.OrientationLock.PORTRAIT_UP +);