mirror of https://git.lenooby09.tech/LeNooby09/social-app.git
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

at session-alignment 91 lines 2.5 kB view raw
1import React from 'react' 2import * as persisted from '#/state/persisted' 3import {Linking} from 'react-native' 4import * as WebBrowser from 'expo-web-browser' 5import {isNative} from '#/platform/detection' 6import {useModalControls} from '../modals' 7import {usePalette} from 'lib/hooks/usePalette' 8import { 9 isBskyRSSUrl, 10 isRelativeUrl, 11 createBskyAppAbsoluteUrl, 12} from 'lib/strings/url-helpers' 13 14type StateContext = persisted.Schema['useInAppBrowser'] 15type SetContext = (v: persisted.Schema['useInAppBrowser']) => void 16 17const stateContext = React.createContext<StateContext>( 18 persisted.defaults.useInAppBrowser, 19) 20const setContext = React.createContext<SetContext>( 21 (_: persisted.Schema['useInAppBrowser']) => {}, 22) 23 24export function Provider({children}: React.PropsWithChildren<{}>) { 25 const [state, setState] = React.useState(persisted.get('useInAppBrowser')) 26 27 const setStateWrapped = React.useCallback( 28 (inAppBrowser: persisted.Schema['useInAppBrowser']) => { 29 setState(inAppBrowser) 30 persisted.write('useInAppBrowser', inAppBrowser) 31 }, 32 [setState], 33 ) 34 35 React.useEffect(() => { 36 return persisted.onUpdate(() => { 37 setState(persisted.get('useInAppBrowser')) 38 }) 39 }, [setStateWrapped]) 40 41 return ( 42 <stateContext.Provider value={state}> 43 <setContext.Provider value={setStateWrapped}> 44 {children} 45 </setContext.Provider> 46 </stateContext.Provider> 47 ) 48} 49 50export function useInAppBrowser() { 51 return React.useContext(stateContext) 52} 53 54export function useSetInAppBrowser() { 55 return React.useContext(setContext) 56} 57 58export function useOpenLink() { 59 const {openModal} = useModalControls() 60 const enabled = useInAppBrowser() 61 const pal = usePalette('default') 62 63 const openLink = React.useCallback( 64 (url: string, override?: boolean) => { 65 if (isBskyRSSUrl(url) && isRelativeUrl(url)) { 66 url = createBskyAppAbsoluteUrl(url) 67 } 68 69 if (isNative && !url.startsWith('mailto:')) { 70 if (override === undefined && enabled === undefined) { 71 openModal({ 72 name: 'in-app-browser-consent', 73 href: url, 74 }) 75 return 76 } else if (override ?? enabled) { 77 WebBrowser.openBrowserAsync(url, { 78 presentationStyle: 79 WebBrowser.WebBrowserPresentationStyle.FULL_SCREEN, 80 toolbarColor: pal.colors.backgroundLight, 81 }) 82 return 83 } 84 } 85 Linking.openURL(url) 86 }, 87 [enabled, openModal, pal.colors.backgroundLight], 88 ) 89 90 return openLink 91}