mirror of https://git.lenooby09.tech/LeNooby09/social-app.git
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}