Make StandardSiteEmbed peekable (#10866)

This commit is contained in:
Samuel Newman
2026-06-11 23:49:09 +03:00
committed by GitHub
parent b281e23f11
commit f0e20d4c56
4 changed files with 129 additions and 120 deletions
+1 -22
View File
@@ -617,11 +617,6 @@
"count": 3 "count": 3
} }
}, },
"src/components/dialogs/InAppBrowserConsent.tsx": {
"@typescript-eslint/no-floating-promises": {
"count": 2
}
},
"src/components/dialogs/LanguageSelectDialog.tsx": { "src/components/dialogs/LanguageSelectDialog.tsx": {
"@typescript-eslint/no-explicit-any": { "@typescript-eslint/no-explicit-any": {
"count": 1 "count": 1
@@ -629,7 +624,7 @@
}, },
"src/components/dialogs/LinkWarning.tsx": { "src/components/dialogs/LinkWarning.tsx": {
"@typescript-eslint/no-floating-promises": { "@typescript-eslint/no-floating-promises": {
"count": 2 "count": 1
} }
}, },
"src/components/dialogs/MutedWords.tsx": { "src/components/dialogs/MutedWords.tsx": {
@@ -848,11 +843,6 @@
"count": 1 "count": 1
} }
}, },
"src/features/liveNow/components/LiveStatusDialog.tsx": {
"@typescript-eslint/no-floating-promises": {
"count": 1
}
},
"src/features/liveNow/index.tsx": { "src/features/liveNow/index.tsx": {
"@typescript-eslint/no-explicit-any": { "@typescript-eslint/no-explicit-any": {
"count": 3 "count": 3
@@ -975,14 +965,6 @@
"count": 4 "count": 4
} }
}, },
"src/lib/hooks/useOpenLink.ts": {
"@typescript-eslint/no-floating-promises": {
"count": 2
},
"@typescript-eslint/require-await": {
"count": 1
}
},
"src/lib/hooks/usePermissions.ts": { "src/lib/hooks/usePermissions.ts": {
"@typescript-eslint/no-misused-promises": { "@typescript-eslint/no-misused-promises": {
"count": 1 "count": 1
@@ -2394,9 +2376,6 @@
"src/view/com/util/Link.tsx": { "src/view/com/util/Link.tsx": {
"@typescript-eslint/no-explicit-any": { "@typescript-eslint/no-explicit-any": {
"count": 2 "count": 2
},
"@typescript-eslint/no-misused-promises": {
"count": 2
} }
}, },
"src/view/com/util/LoadingPlaceholder.tsx": { "src/view/com/util/LoadingPlaceholder.tsx": {
@@ -127,7 +127,6 @@ export const StandardSiteEmbed = ({
style={[ style={[
a.flex_col, a.flex_col,
a.rounded_lg, a.rounded_lg,
a.overflow_hidden,
a.w_full, a.w_full,
a.border, a.border,
t.atoms.bg, t.atoms.bg,
@@ -135,28 +134,44 @@ export const StandardSiteEmbed = ({
preview && a.pointer_events_none, preview && a.pointer_events_none,
style, style,
]}> ]}>
{/*
* The article is an in-flow `Link` wrapping the content so the iOS peek
* menu has something to lift. The publication footer below lives outside
* it - it has its own link (to the publication) and Subscribe button, so
* it can't be nested inside the article's peek.
*/}
<Link <Link
peek
shouldProxy shouldProxy
to={view.uri} to={view.uri}
label={view.title || l`Open link to ${niceUrl}`} label={view.title || l`Open link to ${niceUrl}`}
onPress={onPress} onPress={onPress}
onLongPress={onLongPress} onLongPress={onLongPress}
style={[a.absolute, a.inset_0, a.z_10]} style={[a.rounded_lg]}
{...web({ {...web({
onMouseEnter: onInteract, onMouseEnter: onInteract,
onMouseLeave: onInteractOut, onMouseLeave: onInteractOut,
})} })}
onFocus={onInteract} onFocus={onInteract}
onBlur={onInteractOut}> onBlur={onInteractOut}>
<></> {() => (
</Link>
<View <View
style={[ style={[
a.w_full, a.w_full,
a.z_10, a.overflow_hidden,
a.pointer_events_none, // The container can't clip (overflow_hidden there breaks the peek
interacted && [t.atoms.bg_contrast_25], // lift animation), so each half rounds its own outer corners to
// match the container border. The article rounds the top, plus the
// bottom when there's no footer beneath it.
{
borderTopLeftRadius: a.rounded_lg.borderRadius,
borderTopRightRadius: a.rounded_lg.borderRadius,
},
!view.source && {
borderBottomLeftRadius: a.rounded_lg.borderRadius,
borderBottomRightRadius: a.rounded_lg.borderRadius,
},
interacted ? t.atoms.bg_contrast_25 : t.atoms.bg,
]}> ]}>
{imageUri ? ( {imageUri ? (
<Image <Image
@@ -208,7 +223,12 @@ export const StandardSiteEmbed = ({
{isStandard && (view.createdAt || view.readingTime) && ( {isStandard && (view.createdAt || view.readingTime) && (
<View <View
style={[a.flex_row, a.align_center, a.gap_md, {paddingTop: 2}]}> style={[
a.flex_row,
a.align_center,
a.gap_md,
{paddingTop: 2},
]}>
{view.createdAt && ( {view.createdAt && (
<Text <Text
style={[ style={[
@@ -252,9 +272,11 @@ export const StandardSiteEmbed = ({
</View> </View>
)} )}
</View> </View>
)}
</Link>
{view.source && ( {view.source && (
<View style={[a.z_20]}> <View>
<Divider /> <Divider />
<PublicationFooter <PublicationFooter
preview={preview} preview={preview}
@@ -629,6 +651,14 @@ export function PublicationFooter({
a.justify_between, a.justify_between,
a.p_md, a.p_md,
a.gap_md, a.gap_md,
a.overflow_hidden,
// Rounds the bottom corners to match the container border, since the
// container itself can't clip (overflow_hidden there breaks the peek
// lift animation on the article above).
{
borderBottomLeftRadius: a.rounded_lg.borderRadius,
borderBottomRightRadius: a.rounded_lg.borderRadius,
},
gtPhone && [a.flex_row, a.gap_sm], gtPhone && [a.flex_row, a.gap_sm],
interactedOuter && t.atoms.bg_contrast_25, interactedOuter && t.atoms.bg_contrast_25,
preview && a.pointer_events_none, preview && a.pointer_events_none,
+2 -2
View File
@@ -50,10 +50,10 @@ export function useGoogleTranslate() {
} catch (err) { } catch (err) {
if (__DEV__) console.error(err) if (__DEV__) console.error(err)
// most likely means they don't have the translate app // most likely means they don't have the translate app
await openLink(translateUrl) openLink(translateUrl)
} }
} else { } else {
await openLink(translateUrl) openLink(translateUrl)
} }
}, },
[openLink], [openLink],
+3 -3
View File
@@ -26,7 +26,7 @@ export function useOpenLink() {
const {inAppBrowserConsentControl} = useGlobalDialogsControlContext() const {inAppBrowserConsentControl} = useGlobalDialogsControlContext()
const openLink = useCallback( const openLink = useCallback(
async (url: string, override?: boolean, shouldProxy?: boolean) => { (url: string, override?: boolean, shouldProxy?: boolean) => {
if (isBskyRSSUrl(url) && isRelativeUrl(url)) { if (isBskyRSSUrl(url) && isRelativeUrl(url)) {
url = createBskyAppAbsoluteUrl(url) url = createBskyAppAbsoluteUrl(url)
} }
@@ -66,12 +66,12 @@ export function useOpenLink() {
}).catch(err => { }).catch(err => {
if (__DEV__) if (__DEV__)
logger.error('Could not open web browser', {message: err}) logger.error('Could not open web browser', {message: err})
Linking.openURL(url) void Linking.openURL(url)
}) })
return return
} }
} }
Linking.openURL(url) void Linking.openURL(url)
}, },
[ax, enabled, inAppBrowserConsentControl, t, dialogContext], [ax, enabled, inAppBrowserConsentControl, t, dialogContext],
) )