BlueWallet/components/Context/LargeScreenProvider.tsx

56 lines
1.8 KiB
TypeScript
Raw Normal View History

2024-05-20 10:54:13 +01:00
import React, { createContext, ReactNode, useEffect, useMemo, useState } from 'react';
import { Dimensions } from 'react-native';
2024-05-20 10:54:13 +01:00
2024-05-14 19:50:13 -04:00
import { isDesktop, isTablet } from '../../blue_modules/environment';
2024-08-25 10:47:44 -04:00
type ScreenSize = 'Handheld' | 'LargeScreen' | undefined;
interface ILargeScreenContext {
isLargeScreen: boolean;
2024-08-25 10:47:44 -04:00
setLargeScreenValue: (value: ScreenSize) => void;
}
export const LargeScreenContext = createContext<ILargeScreenContext | undefined>(undefined);
interface LargeScreenProviderProps {
children: ReactNode;
}
export const LargeScreenProvider: React.FC<LargeScreenProviderProps> = ({ children }) => {
const [windowWidth, setWindowWidth] = useState<number>(Dimensions.get('window').width);
2024-08-25 10:47:44 -04:00
const [largeScreenValue, setLargeScreenValue] = useState<ScreenSize>(undefined);
useEffect(() => {
const updateScreenUsage = (): void => {
const newWindowWidth = Dimensions.get('window').width;
if (newWindowWidth !== windowWidth) {
setWindowWidth(newWindowWidth);
}
};
const subscription = Dimensions.addEventListener('change', updateScreenUsage);
return () => subscription.remove();
}, [windowWidth]);
const isLargeScreen: boolean = useMemo(() => {
2024-08-25 10:47:44 -04:00
if (largeScreenValue === 'LargeScreen') {
return true;
} else if (largeScreenValue === 'Handheld') {
return false;
}
const screenWidth: number = Dimensions.get('screen').width;
const halfScreenWidth = windowWidth >= screenWidth / 2;
2024-08-25 10:47:44 -04:00
return (isTablet && halfScreenWidth) || isDesktop;
}, [windowWidth, largeScreenValue]);
const contextValue = useMemo(
() => ({
isLargeScreen,
setLargeScreenValue,
}),
[isLargeScreen, setLargeScreenValue],
);
return <LargeScreenContext.Provider value={contextValue}>{children}</LargeScreenContext.Provider>;
};