diff options
author | Samuel Newman <mozzius@protonmail.com> | 2024-10-12 02:42:58 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-10-11 16:42:58 -0700 |
commit | d6322477fea0a55f1dd0c49865a248cb2f578f75 (patch) | |
tree | 1453d76eca95a8f6c86c4954d4180920dea0f830 /src | |
parent | 8e16427497dc1d0b288e889c4a4a72abbfdf5a7e (diff) | |
download | voidsky-d6322477fea0a55f1dd0c49865a248cb2f578f75.tar.zst |
Present in-app browser as sheet (#5718)
* use page sheet presentation * move to its own file rather than sitting in prefs * whoops, missed one
Diffstat (limited to 'src')
-rw-r--r-- | src/components/Link.tsx | 2 | ||||
-rw-r--r-- | src/components/dms/MessageMenu.tsx | 2 | ||||
-rw-r--r-- | src/lib/hooks/useOpenLink.ts | 54 | ||||
-rw-r--r-- | src/state/preferences/in-app-browser.tsx | 46 | ||||
-rw-r--r-- | src/view/com/modals/InAppBrowserConsent.tsx | 12 | ||||
-rw-r--r-- | src/view/com/modals/LinkWarning.tsx | 2 | ||||
-rw-r--r-- | src/view/com/post-thread/PostThreadItem.tsx | 2 | ||||
-rw-r--r-- | src/view/com/util/Link.tsx | 14 | ||||
-rw-r--r-- | src/view/com/util/forms/PostDropdownBtn.tsx | 2 |
9 files changed, 71 insertions, 65 deletions
diff --git a/src/components/Link.tsx b/src/components/Link.tsx index 447833a23..fa8fa0cc3 100644 --- a/src/components/Link.tsx +++ b/src/components/Link.tsx @@ -10,6 +10,7 @@ import {StackActions, useLinkProps} from '@react-navigation/native' import {BSKY_DOWNLOAD_URL} from '#/lib/constants' import {useNavigationDeduped} from '#/lib/hooks/useNavigationDeduped' +import {useOpenLink} from '#/lib/hooks/useOpenLink' import {AllNavigatorParams} from '#/lib/routes/types' import {shareUrl} from '#/lib/sharing' import { @@ -21,7 +22,6 @@ import { import {isNative, isWeb} from '#/platform/detection' import {shouldClickOpenNewTab} from '#/platform/urls' import {useModalControls} from '#/state/modals' -import {useOpenLink} from '#/state/preferences/in-app-browser' import {atoms as a, flatten, TextStyleProp, useTheme, web} from '#/alf' import {Button, ButtonProps} from '#/components/Button' import {useInteractionState} from '#/components/hooks/useInteractionState' diff --git a/src/components/dms/MessageMenu.tsx b/src/components/dms/MessageMenu.tsx index 8680a68bf..c1867e727 100644 --- a/src/components/dms/MessageMenu.tsx +++ b/src/components/dms/MessageMenu.tsx @@ -5,12 +5,12 @@ import {ChatBskyConvoDefs, RichText} from '@atproto/api' import {msg} from '@lingui/macro' import {useLingui} from '@lingui/react' +import {useOpenLink} from '#/lib/hooks/useOpenLink' import {richTextToString} from '#/lib/strings/rich-text-helpers' import {getTranslatorLink} from '#/locale/helpers' import {isWeb} from '#/platform/detection' import {useConvoActive} from '#/state/messages/convo' import {useLanguagePrefs} from '#/state/preferences' -import {useOpenLink} from '#/state/preferences/in-app-browser' import {useSession} from '#/state/session' import * as Toast from '#/view/com/util/Toast' import {atoms as a, useTheme} from '#/alf' diff --git a/src/lib/hooks/useOpenLink.ts b/src/lib/hooks/useOpenLink.ts new file mode 100644 index 000000000..5b75695b8 --- /dev/null +++ b/src/lib/hooks/useOpenLink.ts @@ -0,0 +1,54 @@ +import {useCallback} from 'react' +import {Linking} from 'react-native' +import * as WebBrowser from 'expo-web-browser' + +import { + createBskyAppAbsoluteUrl, + isBskyRSSUrl, + isRelativeUrl, +} from '#/lib/strings/url-helpers' +import {isNative} from '#/platform/detection' +import {useModalControls} from '#/state/modals' +import {useInAppBrowser} from '#/state/preferences/in-app-browser' +import {useTheme} from '#/alf' +import {useSheetWrapper} from '#/components/Dialog/sheet-wrapper' + +export function useOpenLink() { + const {openModal} = useModalControls() + const enabled = useInAppBrowser() + const t = useTheme() + const sheetWrapper = useSheetWrapper() + + const openLink = useCallback( + async (url: string, override?: boolean) => { + if (isBskyRSSUrl(url) && isRelativeUrl(url)) { + url = createBskyAppAbsoluteUrl(url) + } + + if (isNative && !url.startsWith('mailto:')) { + if (override === undefined && enabled === undefined) { + openModal({ + name: 'in-app-browser-consent', + href: url, + }) + return + } else if (override ?? enabled) { + await sheetWrapper( + WebBrowser.openBrowserAsync(url, { + presentationStyle: + WebBrowser.WebBrowserPresentationStyle.PAGE_SHEET, + toolbarColor: t.atoms.bg.backgroundColor, + controlsColor: t.palette.primary_500, + createTask: false, + }), + ) + return + } + } + Linking.openURL(url) + }, + [enabled, openModal, t, sheetWrapper], + ) + + return openLink +} diff --git a/src/state/preferences/in-app-browser.tsx b/src/state/preferences/in-app-browser.tsx index 1494fa4e8..f8af067ee 100644 --- a/src/state/preferences/in-app-browser.tsx +++ b/src/state/preferences/in-app-browser.tsx @@ -1,16 +1,6 @@ import React from 'react' -import {Linking} from 'react-native' -import * as WebBrowser from 'expo-web-browser' -import {usePalette} from '#/lib/hooks/usePalette' -import { - createBskyAppAbsoluteUrl, - isBskyRSSUrl, - isRelativeUrl, -} from '#/lib/strings/url-helpers' -import {isNative} from '#/platform/detection' import * as persisted from '#/state/persisted' -import {useModalControls} from '../modals' type StateContext = persisted.Schema['useInAppBrowser'] type SetContext = (v: persisted.Schema['useInAppBrowser']) => void @@ -55,39 +45,3 @@ export function useInAppBrowser() { export function useSetInAppBrowser() { return React.useContext(setContext) } - -export function useOpenLink() { - const {openModal} = useModalControls() - const enabled = useInAppBrowser() - const pal = usePalette('default') - - const openLink = React.useCallback( - async (url: string, override?: boolean) => { - if (isBskyRSSUrl(url) && isRelativeUrl(url)) { - url = createBskyAppAbsoluteUrl(url) - } - - if (isNative && !url.startsWith('mailto:')) { - if (override === undefined && enabled === undefined) { - openModal({ - name: 'in-app-browser-consent', - href: url, - }) - return - } else if (override ?? enabled) { - await WebBrowser.openBrowserAsync(url, { - presentationStyle: - WebBrowser.WebBrowserPresentationStyle.FULL_SCREEN, - toolbarColor: pal.colors.backgroundLight, - createTask: false, - }) - return - } - } - Linking.openURL(url) - }, - [enabled, openModal, pal.colors.backgroundLight], - ) - - return openLink -} diff --git a/src/view/com/modals/InAppBrowserConsent.tsx b/src/view/com/modals/InAppBrowserConsent.tsx index 37b039c60..105edfbc6 100644 --- a/src/view/com/modals/InAppBrowserConsent.tsx +++ b/src/view/com/modals/InAppBrowserConsent.tsx @@ -3,16 +3,14 @@ import {StyleSheet, View} from 'react-native' import {msg, Trans} from '@lingui/macro' import {useLingui} from '@lingui/react' +import {useOpenLink} from '#/lib/hooks/useOpenLink' import {usePalette} from '#/lib/hooks/usePalette' import {s} from '#/lib/styles' import {useModalControls} from '#/state/modals' -import { - useOpenLink, - useSetInAppBrowser, -} from '#/state/preferences/in-app-browser' -import {Button} from '../util/forms/Button' -import {Text} from '../util/text/Text' -import {ScrollView} from './util' +import {useSetInAppBrowser} from '#/state/preferences/in-app-browser' +import {ScrollView} from '#/view/com/modals/util' +import {Button} from '#/view/com/util/forms/Button' +import {Text} from '#/view/com/util/text/Text' export const snapPoints = [350] diff --git a/src/view/com/modals/LinkWarning.tsx b/src/view/com/modals/LinkWarning.tsx index bf5bf6d29..dde4fee60 100644 --- a/src/view/com/modals/LinkWarning.tsx +++ b/src/view/com/modals/LinkWarning.tsx @@ -4,6 +4,7 @@ import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome' import {msg, Trans} from '@lingui/macro' import {useLingui} from '@lingui/react' +import {useOpenLink} from '#/lib/hooks/useOpenLink' import {usePalette} from '#/lib/hooks/usePalette' import {useWebMediaQueries} from '#/lib/hooks/useWebMediaQueries' import {shareUrl} from '#/lib/sharing' @@ -11,7 +12,6 @@ import {isPossiblyAUrl, splitApexDomain} from '#/lib/strings/url-helpers' import {colors, s} from '#/lib/styles' import {isWeb} from '#/platform/detection' import {useModalControls} from '#/state/modals' -import {useOpenLink} from '#/state/preferences/in-app-browser' import {Button} from '#/view/com/util/forms/Button' import {Text} from '#/view/com/util/text/Text' import {ScrollView} from './util' diff --git a/src/view/com/post-thread/PostThreadItem.tsx b/src/view/com/post-thread/PostThreadItem.tsx index 4701f225c..99950495f 100644 --- a/src/view/com/post-thread/PostThreadItem.tsx +++ b/src/view/com/post-thread/PostThreadItem.tsx @@ -13,6 +13,7 @@ import {msg, Plural, Trans} from '@lingui/macro' import {useLingui} from '@lingui/react' import {MAX_POST_LINES} from '#/lib/constants' +import {useOpenLink} from '#/lib/hooks/useOpenLink' import {usePalette} from '#/lib/hooks/usePalette' import {makeProfileLink} from '#/lib/routes/links' import {sanitizeDisplayName} from '#/lib/strings/display-names' @@ -22,7 +23,6 @@ import {niceDate} from '#/lib/strings/time' import {s} from '#/lib/styles' import {POST_TOMBSTONE, Shadow, usePostShadow} from '#/state/cache/post-shadow' import {useLanguagePrefs} from '#/state/preferences' -import {useOpenLink} from '#/state/preferences/in-app-browser' import {ThreadPost} from '#/state/queries/post-thread' import {useSession} from '#/state/session' import {useComposerControls} from '#/state/shell/composer' diff --git a/src/view/com/util/Link.tsx b/src/view/com/util/Link.tsx index ab6fd200f..2ae72742d 100644 --- a/src/view/com/util/Link.tsx +++ b/src/view/com/util/Link.tsx @@ -13,20 +13,20 @@ import { import {sanitizeUrl} from '@braintree/sanitize-url' import {StackActions, useLinkProps} from '@react-navigation/native' -import {useModalControls} from '#/state/modals' -import {useOpenLink} from '#/state/preferences/in-app-browser' import { DebouncedNavigationProp, useNavigationDeduped, -} from 'lib/hooks/useNavigationDeduped' +} from '#/lib/hooks/useNavigationDeduped' +import {useOpenLink} from '#/lib/hooks/useOpenLink' import { convertBskyAppUrlIfNeeded, isExternalUrl, linkRequiresWarning, -} from 'lib/strings/url-helpers' -import {TypographyVariant} from 'lib/ThemeContext' -import {isAndroid, isWeb} from 'platform/detection' -import {WebAuxClickWrapper} from 'view/com/util/WebAuxClickWrapper' +} from '#/lib/strings/url-helpers' +import {TypographyVariant} from '#/lib/ThemeContext' +import {isAndroid, isWeb} from '#/platform/detection' +import {useModalControls} from '#/state/modals' +import {WebAuxClickWrapper} from '#/view/com/util/WebAuxClickWrapper' import {useTheme} from '#/alf' import {router} from '../../../routes' import {PressableWithHover} from './PressableWithHover' diff --git a/src/view/com/util/forms/PostDropdownBtn.tsx b/src/view/com/util/forms/PostDropdownBtn.tsx index cd1f2d3de..dc66746fd 100644 --- a/src/view/com/util/forms/PostDropdownBtn.tsx +++ b/src/view/com/util/forms/PostDropdownBtn.tsx @@ -18,6 +18,7 @@ import {msg, Trans} from '@lingui/macro' import {useLingui} from '@lingui/react' import {useNavigation} from '@react-navigation/native' +import {useOpenLink} from '#/lib/hooks/useOpenLink' import {getCurrentRoute} from '#/lib/routes/helpers' import {makeProfileLink} from '#/lib/routes/links' import {CommonNavigatorParams, NavigationProp} from '#/lib/routes/types' @@ -33,7 +34,6 @@ import {Shadow} from '#/state/cache/post-shadow' import {useFeedFeedbackContext} from '#/state/feed-feedback' import {useLanguagePrefs} from '#/state/preferences' import {useHiddenPosts, useHiddenPostsApi} from '#/state/preferences' -import {useOpenLink} from '#/state/preferences/in-app-browser' import {usePinnedPostMutation} from '#/state/queries/pinned-post' import { usePostDeleteMutation, |