diff --git a/src/state/feed-feedback.tsx b/src/state/feed-feedback.tsx index 88d9a47d0..e56bdc2bd 100644 --- a/src/state/feed-feedback.tsx +++ b/src/state/feed-feedback.tsx @@ -28,9 +28,21 @@ import {useAgent} from './session' export const FEEDBACK_FEEDS = [...PROD_FEEDS, ...STAGING_FEEDS] -export const DIRECT_FEEDBACK_INTERACTIONS = new Set< +export const THIRD_PARTY_ALLOWED_INTERACTIONS = new Set< AppBskyFeedDefs.Interaction['event'] ->(['app.bsky.feed.defs#requestLess', 'app.bsky.feed.defs#requestMore']) +>([ + // These are explicit actions and are therefore fine to send. + 'app.bsky.feed.defs#requestLess', + 'app.bsky.feed.defs#requestMore', + // These can be inferred from the firehose and are therefore fine to send. + 'app.bsky.feed.defs#interactionLike', + 'app.bsky.feed.defs#interactionQuote', + 'app.bsky.feed.defs#interactionReply', + 'app.bsky.feed.defs#interactionRepost', + // This can be inferred from pagination requests for everything except the very last page + // so it is fine to send. It is crucial for third party algorithmic feeds to receive these. + 'app.bsky.feed.defs#interactionSeen', +]) const logger = Logger.create(Logger.Context.FeedFeedback) @@ -228,7 +240,7 @@ function isInteractionAllowed( return false } const isDiscover = isDiscoverFeed(feed.feedDescriptor) - return isDiscover ? true : DIRECT_FEEDBACK_INTERACTIONS.has(interaction) + return isDiscover ? true : THIRD_PARTY_ALLOWED_INTERACTIONS.has(interaction) } function toString(interaction: AppBskyFeedDefs.Interaction): string { -- 2.51.2 From 2b32fff1d023de5aaad1b04cdc5591d023b2005d Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Mon, 29 Sep 2025 22:14:13 +0300 Subject: [PATCH 02/20] Fix link crash (#9102) * fix link crash * fix link crash --- src/components/Link.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/Link.tsx b/src/components/Link.tsx index 421a7fe9d..2b533b599 100644 --- a/src/components/Link.tsx +++ b/src/components/Link.tsx @@ -165,8 +165,8 @@ export function useLink({ if (isNative && screen !== 'NotFound') { const state = navigation.getState() // if screen is not in the current navigator, it means it's - // most likely a tab screen - if (!state.routeNames.includes(screen)) { + // most likely a tab screen. note: state can be undefined + if (!state?.routeNames.includes(screen)) { const parent = navigation.getParent() if ( parent && -- 2.51.2 From 02a25d2aa257ba4b2709c695c5ac9e509143335c Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Mon, 29 Sep 2025 22:14:39 +0300 Subject: [PATCH 03/20] Log OTA errors properly (#9101) * Log OTA errors properly * filter out network errors --- src/lib/hooks/useOTAUpdates.ts | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/lib/hooks/useOTAUpdates.ts b/src/lib/hooks/useOTAUpdates.ts index 9c5750606..466d03208 100644 --- a/src/lib/hooks/useOTAUpdates.ts +++ b/src/lib/hooks/useOTAUpdates.ts @@ -10,6 +10,7 @@ import { useUpdates, } from 'expo-updates' +import {isNetworkError} from '#/lib/strings/errors' import {logger} from '#/logger' import {isIOS} from '#/platform/detection' import {IS_TESTFLIGHT} from '#/env' @@ -145,8 +146,10 @@ export function useOTAUpdates() { } else { logger.debug('No update available.') } - } catch (e) { - logger.error('OTA Update Error', {error: `${e}`}) + } catch (err) { + if (!isNetworkError(err)) { + logger.error('OTA Update Error', {safeMessage: err}) + } } }, 10e3) }, []) @@ -154,8 +157,10 @@ export function useOTAUpdates() { const onIsTestFlight = React.useCallback(async () => { try { await updateTestflight() - } catch (e: any) { - logger.error('Internal OTA Update Error', {error: `${e}`}) + } catch (err: any) { + if (!isNetworkError(err)) { + logger.error('Internal OTA Update Error', {safeMessage: err}) + } } }, []) -- 2.51.2 From ae2c9a832ff88a144edc332b1fe4da90ffa2c586 Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Mon, 29 Sep 2025 22:15:38 +0300 Subject: [PATCH 04/20] don't send some "activity no longer available" errors (#9100) --- src/App.native.tsx | 6 +++++- src/alf/util/systemUI.ts | 14 ++++++++++---- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/App.native.tsx b/src/App.native.tsx index 104a7ecae..9821aa871 100644 --- a/src/App.native.tsx +++ b/src/App.native.tsx @@ -84,7 +84,11 @@ if (isIOS) { } if (isAndroid) { // iOS is handled by the config plugin -sfn - ScreenOrientation.lockAsync(ScreenOrientation.OrientationLock.PORTRAIT_UP) + ScreenOrientation.lockAsync( + ScreenOrientation.OrientationLock.PORTRAIT_UP, + ).catch(error => + logger.debug('Could not lock orientation', {safeMessage: error}), + ) } /** diff --git a/src/alf/util/systemUI.ts b/src/alf/util/systemUI.ts index 02b5363ff..d013f0c3f 100644 --- a/src/alf/util/systemUI.ts +++ b/src/alf/util/systemUI.ts @@ -1,14 +1,20 @@ import * as SystemUI from 'expo-system-ui' import {type Theme} from '@bsky.app/alf' +import {logger} from '#/logger' import {isAndroid} from '#/platform/detection' export function setSystemUITheme(themeType: 'theme' | 'lightbox', t: Theme) { if (isAndroid) { - if (themeType === 'theme') { - SystemUI.setBackgroundColorAsync(t.atoms.bg.backgroundColor) - } else { - SystemUI.setBackgroundColorAsync('black') + try { + if (themeType === 'theme') { + SystemUI.setBackgroundColorAsync(t.atoms.bg.backgroundColor) + } else { + SystemUI.setBackgroundColorAsync('black') + } + } catch (error) { + // Can reject with 'The current activity is no longer available' - no big deal + logger.debug('Could not set system UI theme', {safeMessage: error}) } } } -- 2.51.2 From 031fa95715c7244d744424d93446b5d4d5483697 Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Mon, 29 Sep 2025 22:31:55 +0300 Subject: [PATCH 05/20] remove root sibling library (#9097) --- jest/test-utils.tsx | 20 +++----- package.json | 1 - src/App.native.tsx | 115 +++++++++++++++++++++----------------------- src/App.web.tsx | 111 +++++++++++++++++++++--------------------- yarn.lock | 5 -- 5 files changed, 118 insertions(+), 134 deletions(-) diff --git a/jest/test-utils.tsx b/jest/test-utils.tsx index 0a22d792b..264b31fae 100644 --- a/jest/test-utils.tsx +++ b/jest/test-utils.tsx @@ -1,22 +1,18 @@ -import React from 'react' -import {render} from '@testing-library/react-native' import {GestureHandlerRootView} from 'react-native-gesture-handler' -import {RootSiblingParent} from 'react-native-root-siblings' import {SafeAreaProvider} from 'react-native-safe-area-context' -import {RootStoreProvider, RootStoreModel} from '../src/state' +import {render} from '@testing-library/react-native' + import {ThemeProvider} from '../src/lib/ThemeContext' +import {type RootStoreModel, RootStoreProvider} from '../src/state' const customRender = (ui: any, rootStore: RootStoreModel) => render( - // eslint-disable-next-line react-native/no-inline-styles - - - - {ui} - - - + + + {ui} + + , ) diff --git a/package.json b/package.json index 71c28fe0a..6ff871110 100644 --- a/package.json +++ b/package.json @@ -197,7 +197,6 @@ "react-native-progress": "bluesky-social/react-native-progress", "react-native-qrcode-styled": "^0.3.3", "react-native-reanimated": "^3.19.1", - "react-native-root-siblings": "^5.0.1", "react-native-safe-area-context": "~5.6.0", "react-native-screens": "~4.16.0", "react-native-svg": "15.12.1", diff --git a/src/App.native.tsx b/src/App.native.tsx index 9821aa871..30a5e8129 100644 --- a/src/App.native.tsx +++ b/src/App.native.tsx @@ -4,7 +4,6 @@ import '#/view/icons' import React, {useEffect, useState} from 'react' import {GestureHandlerRootView} from 'react-native-gesture-handler' -import {RootSiblingParent} from 'react-native-root-siblings' import { initialWindowMetrics, SafeAreaProvider, @@ -137,64 +136,62 @@ function InnerApp() { - - - - - - - - - - {/* LabelDefsProvider MUST come before ModerationOptsProvider */} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + {/* LabelDefsProvider MUST come before ModerationOptsProvider */} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/App.web.tsx b/src/App.web.tsx index 569c9be79..b7cba6122 100644 --- a/src/App.web.tsx +++ b/src/App.web.tsx @@ -3,7 +3,6 @@ import '#/view/icons' import './style.css' import React, {useEffect, useState} from 'react' -import {RootSiblingParent} from 'react-native-root-siblings' import {SafeAreaProvider} from 'react-native-safe-area-context' import {msg} from '@lingui/macro' import {useLingui} from '@lingui/react' @@ -111,62 +110,60 @@ function InnerApp() { - - - - - - - - - - - {/* LabelDefsProvider MUST come before ModerationOptsProvider */} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + {/* LabelDefsProvider MUST come before ModerationOptsProvider */} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/yarn.lock b/yarn.lock index a773233e7..dfab6f354 100644 --- a/yarn.lock +++ b/yarn.lock @@ -17071,11 +17071,6 @@ react-native-reanimated@^3.19.1: invariant "^2.2.4" react-native-is-edge-to-edge "1.1.7" -react-native-root-siblings@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/react-native-root-siblings/-/react-native-root-siblings-5.0.1.tgz#97e050e5155228f65810fb1c466ff8e769c5272c" - integrity sha512-Ay3k/fBj6ReUkWX5WNS+oEAcgPLEGOK8n7K/L7D85mf3xvd8rm/b4spsv26E4HlFzluVx5HKbxEt9cl0wQ1u3g== - react-native-safe-area-context@~5.6.0: version "5.6.1" resolved "https://registry.yarnpkg.com/react-native-safe-area-context/-/react-native-safe-area-context-5.6.1.tgz#cb4d249ef1a6f7e8fd0cfdfa9764838dffda26b6" -- 2.51.2 From d3dbb9468949e5122a18c1e07e28fe76cbeb5d36 Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Mon, 29 Sep 2025 23:12:50 +0300 Subject: [PATCH 06/20] Catch errors on geolocation request, reduce Sentry logs (#9098) --- .../geolocation/useSyncedDeviceGeolocation.ts | 37 ++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/src/state/geolocation/useSyncedDeviceGeolocation.ts b/src/state/geolocation/useSyncedDeviceGeolocation.ts index 602f29a30..fea6198d4 100644 --- a/src/state/geolocation/useSyncedDeviceGeolocation.ts +++ b/src/state/geolocation/useSyncedDeviceGeolocation.ts @@ -1,10 +1,45 @@ import {useEffect, useRef} from 'react' import * as Location from 'expo-location' +import {createPermissionHook} from 'expo-modules-core' import {logger} from '#/state/geolocation/logger' import {getDeviceGeolocation} from '#/state/geolocation/util' import {device, useStorage} from '#/storage' +/** + * Location.useForegroundPermissions on web just errors if the navigator.permissions API is not available. + * We need to catch and ignore it, since it's effectively denied. + * @see https://github.com/expo/expo/blob/72f1562ed9cce5ff6dfe04aa415b71632a3d4b87/packages/expo-location/src/Location.ts#L290-L293 + */ +const useForegroundPermissions = createPermissionHook({ + getMethod: () => + Location.getForegroundPermissionsAsync().catch(error => { + logger.debug( + 'useForegroundPermission: error getting location permissions', + {safeMessage: error}, + ) + return { + status: Location.PermissionStatus.DENIED, + granted: false, + canAskAgain: false, + expires: 0, + } + }), + requestMethod: () => + Location.requestForegroundPermissionsAsync().catch(error => { + logger.debug( + 'useForegroundPermission: error requesting location permissions', + {safeMessage: error}, + ) + return { + status: Location.PermissionStatus.DENIED, + granted: false, + canAskAgain: false, + expires: 0, + } + }), +}) + /** * Hook to get and sync the device geolocation from the device GPS and store it * using device storage. If permissions are not granted, it will clear any cached @@ -12,7 +47,7 @@ import {device, useStorage} from '#/storage' */ export function useSyncedDeviceGeolocation() { const synced = useRef(false) - const [status] = Location.useForegroundPermissions() + const [status] = useForegroundPermissions() const [deviceGeolocation, setDeviceGeolocation] = useStorage(device, [ 'deviceGeolocation', ]) -- 2.51.2 From 9e0f192546f4951da48ddcc529a5c098cd6d0a10 Mon Sep 17 00:00:00 2001 From: pfrazee <1270099+pfrazee@users.noreply.github.com> Date: Tue, 30 Sep 2025 02:34:39 +0000 Subject: [PATCH 07/20] Nightly source-language update --- src/locale/locales/en/messages.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/locale/locales/en/messages.po b/src/locale/locales/en/messages.po index 6f357bf15..36b0c3160 100644 --- a/src/locale/locales/en/messages.po +++ b/src/locale/locales/en/messages.po @@ -8298,8 +8298,8 @@ msgstr "" msgid "Something wrong? Let us know." msgstr "" -#: src/App.native.tsx:125 -#: src/App.web.tsx:101 +#: src/App.native.tsx:128 +#: src/App.web.tsx:100 msgid "Sorry! Your session expired. Please sign in again." msgstr "" -- 2.51.2 From c7ce827bfef59db09d9c93d1fc1fddbebab8bade Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Tue, 30 Sep 2025 07:28:50 +0300 Subject: [PATCH 08/20] fix gap on profile (#9081) --- .../moderation/LabelsOnMeDialog.tsx | 4 ++- .../moderation/ModerationDetailsDialog.tsx | 4 ++- .../moderation/ProfileHeaderAlerts.tsx | 3 +- src/screens/Profile/Header/Shell.tsx | 34 +++++++++++++------ 4 files changed, 31 insertions(+), 14 deletions(-) diff --git a/src/components/moderation/LabelsOnMeDialog.tsx b/src/components/moderation/LabelsOnMeDialog.tsx index 5d9fd0074..c81743111 100644 --- a/src/components/moderation/LabelsOnMeDialog.tsx +++ b/src/components/moderation/LabelsOnMeDialog.tsx @@ -32,7 +32,9 @@ export interface LabelsOnMeDialogProps { export function LabelsOnMeDialog(props: LabelsOnMeDialogProps) { return ( - + diff --git a/src/components/moderation/ModerationDetailsDialog.tsx b/src/components/moderation/ModerationDetailsDialog.tsx index af48d3342..18cbe26fd 100644 --- a/src/components/moderation/ModerationDetailsDialog.tsx +++ b/src/components/moderation/ModerationDetailsDialog.tsx @@ -24,7 +24,9 @@ export interface ModerationDetailsDialogProps { export function ModerationDetailsDialog(props: ModerationDetailsDialogProps) { return ( - + diff --git a/src/components/moderation/ProfileHeaderAlerts.tsx b/src/components/moderation/ProfileHeaderAlerts.tsx index 21359a86e..f35bf14fe 100644 --- a/src/components/moderation/ProfileHeaderAlerts.tsx +++ b/src/components/moderation/ProfileHeaderAlerts.tsx @@ -6,6 +6,7 @@ import * as Pills from '#/components/Pills' export function ProfileHeaderAlerts({ moderation, + style, }: { moderation: ModerationDecision style?: StyleProp @@ -16,7 +17,7 @@ export function ProfileHeaderAlerts({ } return ( - + {modui.alerts.filter(unique).map(cause => ( - {isMe ? ( - - ) : ( - - )} - - )} + {!isPlaceholderProfile && + (isMe ? ( + + ) : ( + + ))} Date: Tue, 30 Sep 2025 05:27:19 -0700 Subject: [PATCH 09/20] Update admonition component (#9068) * update admonition component * fix linting, adominition alighment * design tweak * edge cases for admonition, update storybook * Update src/components/Admonition.tsx Co-authored-by: Samuel Newman * fix mobile version * change button style --------- Co-authored-by: Samuel Newman --- src/components/Admonition.tsx | 68 ++++++++++------ .../moderation/ReportDialog/index.tsx | 9 ++- .../components/ThreadItemAnchor.tsx | 2 +- src/screens/Settings/AppPasswords.tsx | 2 +- .../ActivityNotificationSettings.tsx | 4 +- .../Settings/PrivacyAndSecuritySettings.tsx | 5 +- src/view/screens/Storybook/Admonitions.tsx | 77 ++++++++++++++++++- 7 files changed, 130 insertions(+), 37 deletions(-) diff --git a/src/components/Admonition.tsx b/src/components/Admonition.tsx index ea6751955..961d94b37 100644 --- a/src/components/Admonition.tsx +++ b/src/components/Admonition.tsx @@ -3,17 +3,13 @@ import {type StyleProp, View, type ViewStyle} from 'react-native' import {atoms as a, useBreakpoints, useTheme} from '#/alf' import {Button as BaseButton, type ButtonProps} from '#/components/Button' -import {CircleInfo_Stroke2_Corner0_Rounded as ErrorIcon} from '#/components/icons/CircleInfo' -import {Eye_Stroke2_Corner0_Rounded as InfoIcon} from '#/components/icons/Eye' -import {Leaf_Stroke2_Corner0_Rounded as TipIcon} from '#/components/icons/Leaf' +import {CircleInfo_Stroke2_Corner0_Rounded as CircleInfoIcon} from '#/components/icons/CircleInfo' +import {CircleX_Stroke2_Corner0_Rounded as CircleXIcon} from '#/components/icons/CircleX' import {Warning_Stroke2_Corner0_Rounded as WarningIcon} from '#/components/icons/Warning' import {Text as BaseText, type TextProps} from '#/components/Typography' export const colors = { - warning: { - light: '#DFBC00', - dark: '#BFAF1F', - }, + warning: '#FFC404', } type Context = { @@ -29,29 +25,44 @@ export function Icon() { const t = useTheme() const {type} = useContext(Context) const Icon = { - info: InfoIcon, - tip: TipIcon, + info: CircleInfoIcon, + tip: CircleInfoIcon, warning: WarningIcon, - error: ErrorIcon, + error: CircleXIcon, }[type] const fill = { info: t.atoms.text_contrast_medium.color, tip: t.palette.primary_500, - warning: colors.warning.light, + warning: colors.warning, error: t.palette.negative_500, }[type] return } +export function Content({ + children, + style, + ...rest +}: { + children: React.ReactNode + style?: StyleProp +}) { + return ( + + {children} + + ) +} + export function Text({ children, style, ...rest }: Pick) { return ( - + {children} ) @@ -60,17 +71,23 @@ export function Text({ export function Button({ children, ...props -}: Omit) { +}: Omit) { return ( - + {children} ) } -export function Row({children}: {children: React.ReactNode}) { +export function Row({ + children, + style, +}: { + children: React.ReactNode + style?: StyleProp +}) { return ( - + {children} ) @@ -88,19 +105,20 @@ export function Outer({ const t = useTheme() const {gtMobile} = useBreakpoints() const borderColor = { - info: t.atoms.border_contrast_low.borderColor, - tip: t.atoms.border_contrast_low.borderColor, - warning: t.atoms.border_contrast_low.borderColor, - error: t.atoms.border_contrast_low.borderColor, + info: t.atoms.border_contrast_high.borderColor, + tip: t.palette.primary_500, + warning: colors.warning, + error: t.palette.negative_500, }[type] return ( @@ -123,7 +141,9 @@ export function Admonition({ - {children} + + {children} + ) diff --git a/src/components/moderation/ReportDialog/index.tsx b/src/components/moderation/ReportDialog/index.tsx index 9293f7530..ebfbe0dcd 100644 --- a/src/components/moderation/ReportDialog/index.tsx +++ b/src/components/moderation/ReportDialog/index.tsx @@ -219,10 +219,13 @@ function Inner(props: ReportDialogProps) { - - Something went wrong, please try again - + + + Something went wrong, please try again + + refetchLabelers()}> diff --git a/src/screens/PostThread/components/ThreadItemAnchor.tsx b/src/screens/PostThread/components/ThreadItemAnchor.tsx index f11748d6d..301124aaa 100644 --- a/src/screens/PostThread/components/ThreadItemAnchor.tsx +++ b/src/screens/PostThread/components/ThreadItemAnchor.tsx @@ -621,7 +621,7 @@ function BackdatedPostIndicator({post}: {post: AppBskyFeedDefs.PostView}) { if (!isBackdated) return null - const orange = t.name === 'light' ? colors.warning.dark : colors.warning.light + const orange = colors.warning return ( <> diff --git a/src/screens/Settings/AppPasswords.tsx b/src/screens/Settings/AppPasswords.tsx index ef7339073..9bacf67cb 100644 --- a/src/screens/Settings/AppPasswords.tsx +++ b/src/screens/Settings/AppPasswords.tsx @@ -195,7 +195,7 @@ function AppPasswordCard({ {appPassword.privileged && ( - + Allows access to direct messages diff --git a/src/screens/Settings/NotificationSettings/ActivityNotificationSettings.tsx b/src/screens/Settings/NotificationSettings/ActivityNotificationSettings.tsx index 3f2503bb8..73613c4c3 100644 --- a/src/screens/Settings/NotificationSettings/ActivityNotificationSettings.tsx +++ b/src/screens/Settings/NotificationSettings/ActivityNotificationSettings.tsx @@ -134,7 +134,7 @@ export function ActivityNotificationSettingsScreen({}: Props) { - + Enable notifications for an account by visiting their @@ -166,7 +166,7 @@ export function ActivityNotificationSettingsScreen({}: Props) { . - + ) : ( diff --git a/src/screens/Settings/PrivacyAndSecuritySettings.tsx b/src/screens/Settings/PrivacyAndSecuritySettings.tsx index 9cf83f479..2e8ffdd61 100644 --- a/src/screens/Settings/PrivacyAndSecuritySettings.tsx +++ b/src/screens/Settings/PrivacyAndSecuritySettings.tsx @@ -1,4 +1,3 @@ -import {View} from 'react-native' import {type AppBskyNotificationDeclaration} from '@atproto/api' import {msg, Trans} from '@lingui/macro' import {useLingui} from '@lingui/react' @@ -112,7 +111,7 @@ export function PrivacyAndSecuritySettingsScreen({}: Props) { - + Note: Bluesky is an open and public network. This setting @@ -131,7 +130,7 @@ export function PrivacyAndSecuritySettingsScreen({}: Props) { Learn more about what is public on Bluesky. - + diff --git a/src/view/screens/Storybook/Admonitions.tsx b/src/view/screens/Storybook/Admonitions.tsx index 988342f17..6badb9ddf 100644 --- a/src/view/screens/Storybook/Admonitions.tsx +++ b/src/view/screens/Storybook/Admonitions.tsx @@ -1,11 +1,27 @@ -import {View} from 'react-native' +import {Text as RNText, View} from 'react-native' +import {msg, Trans} from '@lingui/macro' +import {useLingui} from '@lingui/react' -import {atoms as a} from '#/alf' -import {Admonition} from '#/components/Admonition' +import {atoms as a, useTheme} from '#/alf' +import { + Admonition, + Button as AdmonitionButton, + Content as AdmonitionContent, + Icon as AdmonitionIcon, + Outer as AdmonitionOuter, + Row as AdmonitionRow, + Text as AdmonitionText, +} from '#/components/Admonition' +import {ButtonIcon, ButtonText} from '#/components/Button' +import {ArrowRotateCounterClockwise_Stroke2_Corner0_Rounded as Retry} from '#/components/icons/ArrowRotateCounterClockwise' +import {BellRinging_Filled_Corner0_Rounded as BellRingingFilledIcon} from '#/components/icons/BellRinging' import {InlineLinkText} from '#/components/Link' import {H1} from '#/components/Typography' export function Admonitions() { + const {_} = useLingui() + const t = useTheme() + return (

Admonitions

@@ -30,6 +46,61 @@ export function Admonitions() { The quick brown fox jumps over the lazy dog. + + + + + + + Something went wrong, please try again + + + {}}> + + Retry + + + + + + + + + + + + + Enable notifications for an account by visiting their profile + and pressing the{' '} + + bell icon + {' '} + + . + + + + + If you want to restrict who can receive notifications for your + account's activity, you can change this in{' '} + + Settings → Privacy and Security + + . + + + + +
) } -- 2.51.2 From 3e55e52858de146e46e09b7126d6fbecd77718ed Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Tue, 30 Sep 2025 08:40:21 -0500 Subject: [PATCH 10/20] Button tweaks (#9106) * Tweak button colors * Semi bold only for tiny buttons --- src/components/Button.tsx | 50 +++++++-------------------------------- 1 file changed, 9 insertions(+), 41 deletions(-) diff --git a/src/components/Button.tsx b/src/components/Button.tsx index 758da701f..5e78c40e2 100644 --- a/src/components/Button.tsx +++ b/src/components/Button.tsx @@ -274,18 +274,10 @@ export const Button = React.forwardRef( } else if (color === 'primary_subtle') { if (!disabled) { baseStyles.push({ - backgroundColor: select(t.name, { - light: t.palette.primary_50, - dim: t.palette.primary_100, - dark: t.palette.primary_100, - }), + backgroundColor: t.palette.primary_50, }) hoverStyles.push({ - backgroundColor: select(t.name, { - light: t.palette.primary_100, - dim: t.palette.primary_200, - dark: t.palette.primary_200, - }), + backgroundColor: t.palette.primary_100, }) } else { baseStyles.push({ @@ -295,18 +287,10 @@ export const Button = React.forwardRef( } else if (color === 'negative_subtle') { if (!disabled) { baseStyles.push({ - backgroundColor: select(t.name, { - light: t.palette.negative_50, - dim: t.palette.negative_100, - dark: t.palette.negative_100, - }), + backgroundColor: t.palette.negative_50, }) hoverStyles.push({ - backgroundColor: select(t.name, { - light: t.palette.negative_100, - dim: t.palette.negative_200, - dark: t.palette.negative_200, - }), + backgroundColor: t.palette.negative_100, }) } else { baseStyles.push({ @@ -618,37 +602,21 @@ export function useSharedButtonTextStyles() { } else if (color === 'primary_subtle') { if (!disabled) { baseStyles.push({ - color: select(t.name, { - light: t.palette.primary_600, - dim: t.palette.primary_800, - dark: t.palette.primary_800, - }), + color: t.palette.primary_600, }) } else { baseStyles.push({ - color: select(t.name, { - light: t.palette.primary_200, - dim: t.palette.primary_200, - dark: t.palette.primary_200, - }), + color: t.palette.primary_200, }) } } else if (color === 'negative_subtle') { if (!disabled) { baseStyles.push({ - color: select(t.name, { - light: t.palette.negative_600, - dim: t.palette.negative_800, - dark: t.palette.negative_800, - }), + color: t.palette.negative_600, }) } else { baseStyles.push({ - color: select(t.name, { - light: t.palette.negative_200, - dim: t.palette.negative_200, - dark: t.palette.negative_200, - }), + color: t.palette.negative_200, }) } } @@ -755,7 +723,7 @@ export function useSharedButtonTextStyles() { } else if (size === 'small') { baseStyles.push(a.text_sm, a.leading_snug, a.font_medium) } else if (size === 'tiny') { - baseStyles.push(a.text_xs, a.leading_snug, a.font_medium) + baseStyles.push(a.text_xs, a.leading_snug, a.font_semi_bold) } return StyleSheet.flatten(baseStyles) -- 2.51.2 From 5df6036c2c8bda0e2a43ebc7a22bc012fe4a0108 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 30 Sep 2025 16:46:31 +0100 Subject: [PATCH 11/20] [Web] Fix thread jumps (#9111) * [Web] Fix thread jumps * Comment formatting --------- Co-authored-by: Eric Bailey --- src/screens/PostThread/index.tsx | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/screens/PostThread/index.tsx b/src/screens/PostThread/index.tsx index c27f2c322..1e646e1bb 100644 --- a/src/screens/PostThread/index.tsx +++ b/src/screens/PostThread/index.tsx @@ -148,7 +148,9 @@ export function PostThread({uri}: {uri: string}) { */ const shouldHandleScroll = useRef(true) /** - * Called any time the content size of the list changes, _just_ before paint. + * Called any time the content size of the list changes. Could be a fresh + * render, items being added to the list, or any resize that changes the + * scrollable size of the content. * * We want this to fire every time we change params (which will reset * `deferParents` via `onLayout` on the anchor post, due to the key change), @@ -193,24 +195,23 @@ export function PostThread({uri}: {uri: string}) { * will give us a _positive_ offset, which will scroll the anchor post * back _up_ to the top of the screen. */ - list.scrollToOffset({ - offset: anchorOffsetTop - headerHeight, - }) + const offset = anchorOffsetTop - headerHeight + list.scrollToOffset({offset}) /* - * After the second pass, `deferParents` will be `false`, and we need - * to ensure this doesn't run again until scroll handling is requested - * again via `shouldHandleScroll.current === true` and a params - * change via `prepareForParamsUpdate`. + * After we manage to do a positive adjustment, we need to ensure this + * doesn't run again until scroll handling is requested again via + * `shouldHandleScroll.current === true` and a params change via + * `prepareForParamsUpdate`. * * The `isRoot` here is needed because if we're looking at the anchor * post, this handler will not fire after `deferParents` is set to * `false`, since there are no parents to render above it. In this case, - * we want to make sure `shouldHandleScroll` is set to `false` so that - * subsequent size changes unrelated to a params change (like pagination) - * do not affect scroll. + * we want to make sure `shouldHandleScroll` is set to `false` right away + * so that subsequent size changes unrelated to a params change (like + * pagination) do not affect scroll. */ - if (!deferParents || isRoot) shouldHandleScroll.current = false + if (offset > 0 || isRoot) shouldHandleScroll.current = false } }) -- 2.51.2 From 381feacd262230cb1c61d683f749de9a5879b9d2 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Tue, 30 Sep 2025 16:18:36 -0500 Subject: [PATCH 12/20] Add StackedButton component (#9086) --- .eslintrc.js | 1 + src/components/Button.tsx | 44 ++++++++++++++++++++++++++ src/view/screens/Storybook/Buttons.tsx | 25 +++++++++++++++ 3 files changed, 70 insertions(+) diff --git a/.eslintrc.js b/.eslintrc.js index 04914bde6..fa2c74d9e 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -37,6 +37,7 @@ module.exports = { 'Toast.Action', 'AgeAssuranceAdmonition', 'Span', + 'StackedButton', ], impliedTextProps: [], suggestedTextWrappers: { diff --git a/src/components/Button.tsx b/src/components/Button.tsx index 5e78c40e2..ad55e16ca 100644 --- a/src/components/Button.tsx +++ b/src/components/Button.tsx @@ -837,3 +837,47 @@ export function ButtonIcon({
) } + +export type StackedButtonProps = Omit< + ButtonProps, + keyof VariantProps | 'children' +> & + Pick & { + children: React.ReactNode + icon: React.ComponentType + } + +export function StackedButton({children, ...props}: StackedButtonProps) { + return ( + + ) +} + +function StackedButtonInnerText({ + children, + icon: Icon, +}: Pick) { + const textStyles = useSharedButtonTextStyles() + return ( + <> + + {children} + + ) +} diff --git a/src/view/screens/Storybook/Buttons.tsx b/src/view/screens/Storybook/Buttons.tsx index eebb6f892..f6a2c36a0 100644 --- a/src/view/screens/Storybook/Buttons.tsx +++ b/src/view/screens/Storybook/Buttons.tsx @@ -8,6 +8,7 @@ import { ButtonIcon, type ButtonSize, ButtonText, + StackedButton, } from '#/components/Button' import {ChevronLeft_Stroke2_Corner0_Rounded as ChevronLeft} from '#/components/icons/Chevron' import {Globe_Stroke2_Corner0_Rounded as Globe} from '#/components/icons/Globe' @@ -18,6 +19,30 @@ export function Buttons() { Buttons + + + Bop it + + + Twist it + + + Pull it + + + {[ 'primary', 'secondary', -- 2.51.2 From 144d61ef7655002f917be3ec624016b302100b80 Mon Sep 17 00:00:00 2001 From: pfrazee <1270099+pfrazee@users.noreply.github.com> Date: Wed, 1 Oct 2025 02:40:10 +0000 Subject: [PATCH 13/20] Nightly source-language update --- src/locale/locales/en/messages.po | 174 +++++++++++++++--------------- 1 file changed, 90 insertions(+), 84 deletions(-) diff --git a/src/locale/locales/en/messages.po b/src/locale/locales/en/messages.po index 36b0c3160..97a49b20a 100644 --- a/src/locale/locales/en/messages.po +++ b/src/locale/locales/en/messages.po @@ -604,12 +604,12 @@ msgctxt "toast" msgid "Account muted" msgstr "" -#: src/components/moderation/ModerationDetailsDialog.tsx:103 +#: src/components/moderation/ModerationDetailsDialog.tsx:105 #: src/lib/moderation/useModerationCauseDescription.ts:98 msgid "Account Muted" msgstr "" -#: src/components/moderation/ModerationDetailsDialog.tsx:89 +#: src/components/moderation/ModerationDetailsDialog.tsx:91 msgid "Account Muted by List" msgstr "" @@ -735,8 +735,8 @@ msgstr "" msgid "Add media to post" msgstr "" -#: src/components/moderation/ReportDialog/index.tsx:403 -#: src/components/moderation/ReportDialog/index.tsx:407 +#: src/components/moderation/ReportDialog/index.tsx:406 +#: src/components/moderation/ReportDialog/index.tsx:410 msgid "Add more details (optional)" msgstr "" @@ -813,7 +813,7 @@ msgstr "" msgid "Additional details (limit 1000 characters)" msgstr "" -#: src/components/moderation/ReportDialog/index.tsx:421 +#: src/components/moderation/ReportDialog/index.tsx:424 msgid "Additional details (limit 300 characters)" msgstr "" @@ -903,7 +903,7 @@ msgid "Allow new messages from" msgstr "" #: src/screens/Settings/ActivityPrivacySettings.tsx:52 -#: src/screens/Settings/PrivacyAndSecuritySettings.tsx:92 +#: src/screens/Settings/PrivacyAndSecuritySettings.tsx:91 msgid "Allow others to be notified of your posts" msgstr "" @@ -1051,7 +1051,7 @@ msgstr "" msgid "an unknown error occurred" msgstr "" -#: src/components/moderation/ModerationDetailsDialog.tsx:134 +#: src/components/moderation/ModerationDetailsDialog.tsx:136 #: src/lib/moderation/useModerationCauseDescription.ts:144 msgid "an unknown labeler" msgstr "" @@ -1089,7 +1089,7 @@ msgstr "" #: src/screens/Settings/ActivityPrivacySettings.tsx:111 #: src/screens/Settings/ActivityPrivacySettings.tsx:116 -#: src/screens/Settings/PrivacyAndSecuritySettings.tsx:163 +#: src/screens/Settings/PrivacyAndSecuritySettings.tsx:162 msgid "Anyone who follows me" msgstr "" @@ -1125,8 +1125,8 @@ msgstr "" msgid "App password names must be at least 4 characters long" msgstr "" -#: src/screens/Settings/PrivacyAndSecuritySettings.tsx:72 -#: src/screens/Settings/PrivacyAndSecuritySettings.tsx:75 +#: src/screens/Settings/PrivacyAndSecuritySettings.tsx:71 +#: src/screens/Settings/PrivacyAndSecuritySettings.tsx:74 msgid "App passwords" msgstr "" @@ -1135,16 +1135,16 @@ msgstr "" msgid "App Passwords" msgstr "" -#: src/components/moderation/LabelsOnMeDialog.tsx:150 -#: src/components/moderation/LabelsOnMeDialog.tsx:153 +#: src/components/moderation/LabelsOnMeDialog.tsx:152 +#: src/components/moderation/LabelsOnMeDialog.tsx:155 msgid "Appeal" msgstr "" -#: src/components/moderation/LabelsOnMeDialog.tsx:268 +#: src/components/moderation/LabelsOnMeDialog.tsx:270 msgid "Appeal \"{0}\" label" msgstr "" -#: src/components/moderation/LabelsOnMeDialog.tsx:258 +#: src/components/moderation/LabelsOnMeDialog.tsx:260 #: src/screens/Messages/components/ChatDisabled.tsx:103 msgctxt "toast" msgid "Appeal submitted" @@ -1274,8 +1274,8 @@ msgstr "" msgid "Available" msgstr "" -#: src/components/moderation/LabelsOnMeDialog.tsx:315 -#: src/components/moderation/LabelsOnMeDialog.tsx:316 +#: src/components/moderation/LabelsOnMeDialog.tsx:317 +#: src/components/moderation/LabelsOnMeDialog.tsx:318 #: src/screens/Login/ChooseAccountForm.tsx:90 #: src/screens/Login/ChooseAccountForm.tsx:95 #: src/screens/Login/ForgotPasswordForm.tsx:123 @@ -1558,7 +1558,7 @@ msgid "Business" msgstr "" #: src/components/LabelingServiceCard/index.tsx:62 -#: src/components/moderation/ReportDialog/index.tsx:683 +#: src/components/moderation/ReportDialog/index.tsx:686 #: src/screens/Search/components/StarterPackCard.tsx:106 #: src/screens/Search/Explore.tsx:930 msgid "By {0}" @@ -1695,7 +1695,7 @@ msgstr "" msgid "Change Handle" msgstr "" -#: src/components/moderation/ReportDialog/index.tsx:325 +#: src/components/moderation/ReportDialog/index.tsx:328 msgid "Change moderation service" msgstr "" @@ -1712,7 +1712,7 @@ msgstr "" msgid "Change post language to {suggestedLanguageName}" msgstr "" -#: src/components/moderation/ReportDialog/index.tsx:244 +#: src/components/moderation/ReportDialog/index.tsx:247 msgid "Change report reason" msgstr "" @@ -2186,12 +2186,12 @@ msgstr "" msgid "Content Languages" msgstr "" -#: src/components/moderation/ModerationDetailsDialog.tsx:82 +#: src/components/moderation/ModerationDetailsDialog.tsx:84 #: src/lib/moderation/useModerationCauseDescription.ts:82 msgid "Content Not Available" msgstr "" -#: src/components/moderation/ModerationDetailsDialog.tsx:50 +#: src/components/moderation/ModerationDetailsDialog.tsx:52 #: src/components/moderation/ScreenHider.tsx:99 #: src/lib/moderation/useGlobalLabelStrings.ts:22 #: src/lib/moderation/useModerationCauseDescription.ts:45 @@ -2478,7 +2478,7 @@ msgstr "" msgid "Create new account" msgstr "" -#: src/components/moderation/ReportDialog/index.tsx:585 +#: src/components/moderation/ReportDialog/index.tsx:588 #: src/components/ReportDialog/SelectReportOptionView.tsx:102 msgid "Create report for {0}" msgstr "" @@ -3055,7 +3055,7 @@ msgctxt "toast" msgid "Email 2FA disabled" msgstr "" -#: src/screens/Settings/PrivacyAndSecuritySettings.tsx:63 +#: src/screens/Settings/PrivacyAndSecuritySettings.tsx:62 msgid "Email 2FA enabled" msgstr "" @@ -3126,6 +3126,7 @@ msgid "Enable media players for" msgstr "" #: src/screens/Settings/NotificationSettings/ActivityNotificationSettings.tsx:139 +#: src/view/screens/Storybook/Admonitions.tsx:75 msgid "Enable notifications for an account by visiting their profile and pressing the <0>bell icon <1/>." msgstr "" @@ -3231,7 +3232,7 @@ msgstr "" msgid "Error loading post" msgstr "" -#: src/screens/Settings/PrivacyAndSecuritySettings.tsx:154 +#: src/screens/Settings/PrivacyAndSecuritySettings.tsx:153 msgid "Error loading preference" msgstr "" @@ -3345,8 +3346,8 @@ msgstr "" msgid "Expires {0}" msgstr "" -#: src/components/moderation/LabelsOnMeDialog.tsx:199 -#: src/components/moderation/ModerationDetailsDialog.tsx:208 +#: src/components/moderation/LabelsOnMeDialog.tsx:201 +#: src/components/moderation/ModerationDetailsDialog.tsx:210 msgid "Expires in {0}" msgstr "" @@ -3554,7 +3555,7 @@ msgstr "" msgid "Failed to send email, please try again." msgstr "" -#: src/components/moderation/LabelsOnMeDialog.tsx:254 +#: src/components/moderation/LabelsOnMeDialog.tsx:256 #: src/screens/Messages/components/ChatDisabled.tsx:99 msgid "Failed to submit appeal, please try again." msgstr "" @@ -4418,6 +4419,7 @@ msgid "If you want to change your password, we will send you a code to verify th msgstr "" #: src/screens/Settings/NotificationSettings/ActivityNotificationSettings.tsx:157 +#: src/view/screens/Storybook/Admonitions.tsx:89 msgid "If you want to restrict who can receive notifications for your account's activity, you can change this in <0>Settings → Privacy and Security." msgstr "" @@ -4660,11 +4662,11 @@ msgstr "" msgid "Labels are annotations on users and content. They can be used to hide, warn, and categorize the network." msgstr "" -#: src/components/moderation/LabelsOnMeDialog.tsx:72 +#: src/components/moderation/LabelsOnMeDialog.tsx:74 msgid "Labels on your account" msgstr "" -#: src/components/moderation/LabelsOnMeDialog.tsx:74 +#: src/components/moderation/LabelsOnMeDialog.tsx:76 msgid "Labels on your content" msgstr "" @@ -4746,8 +4748,8 @@ msgctxt "english-only-resource" msgid "Learn more about verification on Bluesky" msgstr "" -#: src/screens/Settings/PrivacyAndSecuritySettings.tsx:128 -#: src/screens/Settings/PrivacyAndSecuritySettings.tsx:131 +#: src/screens/Settings/PrivacyAndSecuritySettings.tsx:127 +#: src/screens/Settings/PrivacyAndSecuritySettings.tsx:130 msgid "Learn more about what is public on Bluesky." msgstr "" @@ -5031,7 +5033,7 @@ msgstr "" msgid "Log" msgstr "" -#: src/screens/Settings/PrivacyAndSecuritySettings.tsx:107 +#: src/screens/Settings/PrivacyAndSecuritySettings.tsx:106 msgid "Logged-out visibility" msgstr "" @@ -5205,7 +5207,7 @@ msgstr "" msgid "Moderation" msgstr "" -#: src/components/moderation/ModerationDetailsDialog.tsx:138 +#: src/components/moderation/ModerationDetailsDialog.tsx:140 msgid "Moderation details" msgstr "" @@ -5254,7 +5256,7 @@ msgstr "" msgid "Moderation tools" msgstr "" -#: src/components/moderation/ModerationDetailsDialog.tsx:52 +#: src/components/moderation/ModerationDetailsDialog.tsx:54 #: src/lib/moderation/useModerationCauseDescription.ts:47 msgid "Moderator has chosen to set a general warning on the content." msgstr "" @@ -5437,8 +5439,8 @@ msgstr "" msgid "Navigates to your profile" msgstr "" -#: src/components/moderation/ReportDialog/index.tsx:271 -#: src/components/moderation/ReportDialog/index.tsx:288 +#: src/components/moderation/ReportDialog/index.tsx:274 +#: src/components/moderation/ReportDialog/index.tsx:291 msgid "Need to report a copyright violation, legal request, or regulatory compliance issue?" msgstr "" @@ -5649,7 +5651,7 @@ msgstr "" #: src/screens/Messages/Settings.tsx:109 #: src/screens/Settings/ActivityPrivacySettings.tsx:129 #: src/screens/Settings/ActivityPrivacySettings.tsx:134 -#: src/screens/Settings/PrivacyAndSecuritySettings.tsx:160 +#: src/screens/Settings/PrivacyAndSecuritySettings.tsx:159 msgid "No one" msgstr "" @@ -5760,7 +5762,7 @@ msgstr "" msgid "Note about sharing" msgstr "" -#: src/screens/Settings/PrivacyAndSecuritySettings.tsx:117 +#: src/screens/Settings/PrivacyAndSecuritySettings.tsx:116 msgid "Note: Bluesky is an open and public network. This setting only limits the visibility of your content on the Bluesky app and website, and other apps may not respect this setting. Your content may still be shown to logged-out users by other apps and websites." msgstr "" @@ -5908,7 +5910,7 @@ msgstr "" #: src/screens/Settings/ActivityPrivacySettings.tsx:120 #: src/screens/Settings/ActivityPrivacySettings.tsx:125 -#: src/screens/Settings/PrivacyAndSecuritySettings.tsx:158 +#: src/screens/Settings/PrivacyAndSecuritySettings.tsx:157 msgid "Only followers who I follow" msgstr "" @@ -6411,7 +6413,7 @@ msgstr "" msgid "Please enter your username" msgstr "" -#: src/components/moderation/LabelsOnMeDialog.tsx:290 +#: src/components/moderation/LabelsOnMeDialog.tsx:292 msgid "Please explain why you think this label was incorrectly applied by {0}" msgstr "" @@ -6463,7 +6465,7 @@ msgstr "" msgid "Porn" msgstr "" -#: src/screens/PostThread/index.tsx:502 +#: src/screens/PostThread/index.tsx:503 msgctxt "description" msgid "Post" msgstr "" @@ -6505,12 +6507,12 @@ msgstr "" msgid "Post has been deleted" msgstr "" -#: src/components/moderation/ModerationDetailsDialog.tsx:107 +#: src/components/moderation/ModerationDetailsDialog.tsx:109 #: src/lib/moderation/useModerationCauseDescription.ts:106 msgid "Post Hidden by Muted Word" msgstr "" -#: src/components/moderation/ModerationDetailsDialog.tsx:110 +#: src/components/moderation/ModerationDetailsDialog.tsx:112 #: src/lib/moderation/useModerationCauseDescription.ts:115 msgid "Post Hidden by You" msgstr "" @@ -6618,11 +6620,12 @@ msgstr "" #: src/Navigation.tsx:407 #: src/Navigation.tsx:415 #: src/screens/Settings/ActivityPrivacySettings.tsx:40 -#: src/screens/Settings/PrivacyAndSecuritySettings.tsx:45 +#: src/screens/Settings/PrivacyAndSecuritySettings.tsx:44 msgid "Privacy and Security" msgstr "" #: src/screens/Settings/NotificationSettings/ActivityNotificationSettings.tsx:161 +#: src/view/screens/Storybook/Admonitions.tsx:93 msgid "Privacy and Security settings" msgstr "" @@ -7091,12 +7094,12 @@ msgstr "" msgid "Reply ({0, plural, one {# reply} other {# replies}})" msgstr "" -#: src/components/moderation/ModerationDetailsDialog.tsx:116 +#: src/components/moderation/ModerationDetailsDialog.tsx:118 #: src/lib/moderation/useModerationCauseDescription.ts:125 msgid "Reply Hidden by Thread Author" msgstr "" -#: src/components/moderation/ModerationDetailsDialog.tsx:115 +#: src/components/moderation/ModerationDetailsDialog.tsx:117 #: src/lib/moderation/useModerationCauseDescription.ts:124 msgid "Reply Hidden by You" msgstr "" @@ -7345,7 +7348,7 @@ msgstr "" #: src/components/dms/MessageItem.tsx:322 #: src/components/Error.tsx:65 #: src/components/Lists.tsx:110 -#: src/components/moderation/ReportDialog/index.tsx:229 +#: src/components/moderation/ReportDialog/index.tsx:232 #: src/components/Post/Embed/VideoEmbed/VideoEmbedInner/VideoFallback.tsx:55 #: src/components/Post/Embed/VideoEmbed/VideoEmbedInner/VideoFallback.tsx:58 #: src/components/StarterPack/ProfileStarterPacks.tsx:342 @@ -7363,10 +7366,12 @@ msgstr "" #: src/screens/Signup/BackNextButtons.tsx:53 #: src/view/com/util/error/ErrorMessage.tsx:60 #: src/view/com/util/error/ErrorScreen.tsx:97 +#: src/view/screens/Storybook/Admonitions.tsx:63 msgid "Retry" msgstr "" -#: src/components/moderation/ReportDialog/index.tsx:226 +#: src/components/moderation/ReportDialog/index.tsx:229 +#: src/view/screens/Storybook/Admonitions.tsx:60 msgid "Retry loading report options" msgstr "" @@ -7709,7 +7714,7 @@ msgstr "" msgid "Select languages" msgstr "" -#: src/components/moderation/ReportDialog/index.tsx:310 +#: src/components/moderation/ReportDialog/index.tsx:313 msgid "Select moderation service" msgstr "" @@ -7819,7 +7824,7 @@ msgstr "" msgid "Send report to {0}" msgstr "" -#: src/components/moderation/ReportDialog/index.tsx:649 +#: src/components/moderation/ReportDialog/index.tsx:652 msgid "Send report to {title}" msgstr "" @@ -7875,7 +7880,7 @@ msgstr "" msgid "Settings for activity from others" msgstr "" -#: src/screens/Settings/PrivacyAndSecuritySettings.tsx:85 +#: src/screens/Settings/PrivacyAndSecuritySettings.tsx:84 msgid "Settings for allowing others to be notified of your posts" msgstr "" @@ -8270,9 +8275,10 @@ msgid "Something went wrong" msgstr "" #: src/components/ageAssurance/AgeAssuranceInitDialog.tsx:138 -#: src/components/moderation/ReportDialog/index.tsx:223 +#: src/components/moderation/ReportDialog/index.tsx:224 #: src/screens/Deactivated.tsx:94 #: src/screens/Settings/components/DeactivateAccountDialog.tsx:59 +#: src/view/screens/Storybook/Admonitions.tsx:55 msgid "Something went wrong, please try again" msgstr "" @@ -8315,8 +8321,8 @@ msgstr "" msgid "Sort replies to the same post by:" msgstr "" -#: src/components/moderation/LabelsOnMeDialog.tsx:178 -#: src/components/moderation/ModerationDetailsDialog.tsx:186 +#: src/components/moderation/LabelsOnMeDialog.tsx:180 +#: src/components/moderation/ModerationDetailsDialog.tsx:188 msgid "Source: <0>{sourceName}" msgstr "" @@ -8412,8 +8418,8 @@ msgstr "" #: src/components/ageAssurance/AgeAssuranceAppealDialog.tsx:117 #: src/components/ageAssurance/AgeAssuranceAppealDialog.tsx:123 -#: src/components/moderation/LabelsOnMeDialog.tsx:324 -#: src/components/moderation/LabelsOnMeDialog.tsx:325 +#: src/components/moderation/LabelsOnMeDialog.tsx:326 +#: src/components/moderation/LabelsOnMeDialog.tsx:327 #: src/screens/Messages/components/ChatDisabled.tsx:154 #: src/screens/Messages/components/ChatDisabled.tsx:155 msgid "Submit" @@ -8427,9 +8433,9 @@ msgstr "" msgid "Submit Appeal" msgstr "" -#: src/components/moderation/ReportDialog/index.tsx:387 -#: src/components/moderation/ReportDialog/index.tsx:444 -#: src/components/moderation/ReportDialog/index.tsx:451 +#: src/components/moderation/ReportDialog/index.tsx:390 +#: src/components/moderation/ReportDialog/index.tsx:447 +#: src/components/moderation/ReportDialog/index.tsx:454 msgid "Submit report" msgstr "" @@ -8630,7 +8636,7 @@ msgstr "" msgid "Text field" msgstr "" -#: src/components/moderation/LabelsOnMeDialog.tsx:288 +#: src/components/moderation/LabelsOnMeDialog.tsx:290 #: src/screens/Messages/components/ChatDisabled.tsx:120 msgid "Text input field" msgstr "" @@ -8687,7 +8693,7 @@ msgstr "" msgid "The app will be restarted" msgstr "" -#: src/components/moderation/ModerationDetailsDialog.tsx:119 +#: src/components/moderation/ModerationDetailsDialog.tsx:121 #: src/lib/moderation/useModerationCauseDescription.ts:128 msgid "The author of this thread has hidden this reply." msgstr "" @@ -8724,11 +8730,11 @@ msgstr "" msgid "The feed has been replaced with Discover." msgstr "" -#: src/components/moderation/LabelsOnMeDialog.tsx:59 +#: src/components/moderation/LabelsOnMeDialog.tsx:61 msgid "The following labels were applied to your account." msgstr "" -#: src/components/moderation/LabelsOnMeDialog.tsx:60 +#: src/components/moderation/LabelsOnMeDialog.tsx:62 msgid "The following labels were applied to your content." msgstr "" @@ -8915,7 +8921,7 @@ msgstr "" msgid "This action can be undone at any time." msgstr "" -#: src/components/moderation/LabelsOnMeDialog.tsx:271 +#: src/components/moderation/LabelsOnMeDialog.tsx:273 msgid "This appeal will be sent to <0>{sourceName}." msgstr "" @@ -8943,7 +8949,7 @@ msgstr "" msgid "This content is hosted by {0}. Do you want to enable external media?" msgstr "" -#: src/components/moderation/ModerationDetailsDialog.tsx:84 +#: src/components/moderation/ModerationDetailsDialog.tsx:86 #: src/lib/moderation/useModerationCauseDescription.ts:84 msgid "This content is not available because one of the users involved has blocked the other." msgstr "" @@ -9007,11 +9013,11 @@ msgstr "" msgid "This is not a valid link" msgstr "" -#: src/components/moderation/ModerationDetailsDialog.tsx:168 +#: src/components/moderation/ModerationDetailsDialog.tsx:170 msgid "This label was applied by the author." msgstr "" -#: src/components/moderation/LabelsOnMeDialog.tsx:165 +#: src/components/moderation/LabelsOnMeDialog.tsx:167 msgid "This label was applied by you." msgstr "" @@ -9095,7 +9101,7 @@ msgstr "" msgid "This user has blocked you" msgstr "" -#: src/components/moderation/ModerationDetailsDialog.tsx:79 +#: src/components/moderation/ModerationDetailsDialog.tsx:81 #: src/lib/moderation/useModerationCauseDescription.ts:75 msgid "This user has blocked you. You cannot view their content." msgstr "" @@ -9104,11 +9110,11 @@ msgstr "" msgid "This user has requested that their content only be shown to signed-in users." msgstr "" -#: src/components/moderation/ModerationDetailsDialog.tsx:59 +#: src/components/moderation/ModerationDetailsDialog.tsx:61 msgid "This user is included in the <0>{0} list which you have blocked." msgstr "" -#: src/components/moderation/ModerationDetailsDialog.tsx:91 +#: src/components/moderation/ModerationDetailsDialog.tsx:93 msgid "This user is included in the <0>{0} list which you have muted." msgstr "" @@ -9240,7 +9246,7 @@ msgstr "" msgid "TV" msgstr "" -#: src/screens/Settings/PrivacyAndSecuritySettings.tsx:65 +#: src/screens/Settings/PrivacyAndSecuritySettings.tsx:64 msgid "Two-factor authentication (2FA)" msgstr "" @@ -9365,7 +9371,7 @@ msgstr "" msgid "Unfortunately, Bluesky is unavailable in Mississippi right now." msgstr "" -#: src/components/moderation/ReportDialog/index.tsx:372 +#: src/components/moderation/ReportDialog/index.tsx:375 msgid "Unfortunately, none of your subscribed labelers supports this report type." msgstr "" @@ -9617,7 +9623,7 @@ msgctxt "toast" msgid "User blocked" msgstr "" -#: src/components/moderation/ModerationDetailsDialog.tsx:71 +#: src/components/moderation/ModerationDetailsDialog.tsx:73 #: src/lib/moderation/useModerationCauseDescription.ts:63 msgid "User Blocked" msgstr "" @@ -9630,7 +9636,7 @@ msgstr "" msgid "User blocked by list" msgstr "" -#: src/components/moderation/ModerationDetailsDialog.tsx:57 +#: src/components/moderation/ModerationDetailsDialog.tsx:59 msgid "User Blocked by List" msgstr "" @@ -9638,7 +9644,7 @@ msgstr "" msgid "User Blocking You" msgstr "" -#: src/components/moderation/ModerationDetailsDialog.tsx:77 +#: src/components/moderation/ModerationDetailsDialog.tsx:79 msgid "User Blocks You" msgstr "" @@ -9852,7 +9858,7 @@ msgctxt "Action to view the post the user just created" msgid "View" msgstr "" -#: src/screens/Profile/Header/Shell.tsx:229 +#: src/screens/Profile/Header/Shell.tsx:241 msgid "View {0}'s avatar" msgstr "" @@ -10456,7 +10462,7 @@ msgstr "" msgid "You have blocked this user" msgstr "" -#: src/components/moderation/ModerationDetailsDialog.tsx:73 +#: src/components/moderation/ModerationDetailsDialog.tsx:75 #: src/lib/moderation/useModerationCauseDescription.ts:57 #: src/lib/moderation/useModerationCauseDescription.ts:65 msgid "You have blocked this user. You cannot view their content." @@ -10476,11 +10482,11 @@ msgstr "" msgid "You have hidden this post" msgstr "" -#: src/components/moderation/ModerationDetailsDialog.tsx:111 +#: src/components/moderation/ModerationDetailsDialog.tsx:113 msgid "You have hidden this post." msgstr "" -#: src/components/moderation/ModerationDetailsDialog.tsx:104 +#: src/components/moderation/ModerationDetailsDialog.tsx:106 #: src/lib/moderation/useModerationCauseDescription.ts:99 msgid "You have muted this account." msgstr "" @@ -10534,7 +10540,7 @@ msgstr "" msgid "You haven't muted any words or tags yet" msgstr "" -#: src/components/moderation/ModerationDetailsDialog.tsx:118 +#: src/components/moderation/ModerationDetailsDialog.tsx:120 #: src/lib/moderation/useModerationCauseDescription.ts:127 msgid "You hid this reply." msgstr "" @@ -10551,11 +10557,11 @@ msgstr "" msgid "You joined Bluesky using a starter pack {timeAgoString} ago" msgstr "" -#: src/components/moderation/LabelsOnMeDialog.tsx:79 +#: src/components/moderation/LabelsOnMeDialog.tsx:81 msgid "You may appeal non-self labels if you feel they were placed in error." msgstr "" -#: src/components/moderation/LabelsOnMeDialog.tsx:84 +#: src/components/moderation/LabelsOnMeDialog.tsx:86 msgid "You may appeal these labels if you feel they were placed in error." msgstr "" @@ -10694,7 +10700,7 @@ msgstr "" msgid "You're signed in with an App Password. Please sign in with your main password to continue deactivating your account." msgstr "" -#: src/components/moderation/ModerationDetailsDialog.tsx:108 +#: src/components/moderation/ModerationDetailsDialog.tsx:110 #: src/lib/moderation/useModerationCauseDescription.ts:108 msgid "You've chosen to hide a word or tag within this post." msgstr "" @@ -10881,7 +10887,7 @@ msgstr "" msgid "Your reply was sent" msgstr "" -#: src/components/moderation/ReportDialog/index.tsx:394 +#: src/components/moderation/ReportDialog/index.tsx:397 msgid "Your report will be sent to <0>{0}." msgstr "" -- 2.51.2 From 1e6a44f2e87a5bdaafff9d2a086dd98db6034135 Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Wed, 1 Oct 2025 16:09:12 +0300 Subject: [PATCH 14/20] Fix feedfeedback metrics not distinguishing which feed it's from (#9099) * fix feedfeedback metrics being sent for all feeds * remove `discover:` metrics --- src/logger/metrics.ts | 15 ++++++++++----- src/state/feed-feedback.tsx | 38 +++++++++++++++++++++++++------------ 2 files changed, 36 insertions(+), 17 deletions(-) diff --git a/src/logger/metrics.ts b/src/logger/metrics.ts index 1ba1cd3b5..f2c56d963 100644 --- a/src/logger/metrics.ts +++ b/src/logger/metrics.ts @@ -175,19 +175,24 @@ export type MetricEvents = { 'feed:suggestion:press': { feedUrl: string } - 'discover:showMore': { + 'feed:showMore': { + feed: string feedContext: string } - 'discover:showLess': { + 'feed:showLess': { + feed: string feedContext: string } - 'discover:clickthrough': { + 'feed:clickthrough': { + feed: string count: number } - 'discover:engaged': { + 'feed:engaged': { + feed: string count: number } - 'discover:seen': { + 'feed:seen': { + feed: string count: number } diff --git a/src/state/feed-feedback.tsx b/src/state/feed-feedback.tsx index e56bdc2bd..67ac77ba3 100644 --- a/src/state/feed-feedback.tsx +++ b/src/state/feed-feedback.tsx @@ -12,7 +12,6 @@ import throttle from 'lodash.throttle' import {PROD_FEEDS, STAGING_FEEDS} from '#/lib/constants' import {isNetworkError} from '#/lib/hooks/useCleanError' -import {logEvent} from '#/lib/statsig/statsig' import {Logger} from '#/logger' import { type FeedSourceFeedInfo, @@ -90,11 +89,19 @@ export function useFeedFeedback( const aggregatedStats = useRef(null) const throttledFlushAggregatedStats = useMemo( () => - throttle(() => flushToStatsig(aggregatedStats.current), 45e3, { - leading: true, // The outer call is already throttled somewhat. - trailing: true, - }), - [], + throttle( + () => + flushToStatsig( + aggregatedStats.current, + feed?.feedDescriptor ?? 'unknown', + ), + 45e3, + { + leading: true, // The outer call is already throttled somewhat. + trailing: true, + }, + ), + [feed?.feedDescriptor], ) const sendToFeedNoDelay = useCallback(() => { @@ -135,6 +142,7 @@ export function useFeedFeedback( sendOrAggregateInteractionsForStats( aggregatedStats.current, interactionsToSend, + feed?.feedDescriptor ?? 'unknown', ) throttledFlushAggregatedStats() logger.debug('flushed') @@ -271,19 +279,22 @@ function createAggregatedStats(): AggregatedStats { function sendOrAggregateInteractionsForStats( stats: AggregatedStats, interactions: AppBskyFeedDefs.Interaction[], + feed: string, ) { for (let interaction of interactions) { switch (interaction.event) { // Pressing "Show more" / "Show less" is relatively uncommon so we won't aggregate them. // This lets us send the feed context together with them. case 'app.bsky.feed.defs#requestLess': { - logEvent('discover:showLess', { + logger.metric('feed:showLess', { + feed, feedContext: interaction.feedContext ?? '', }) break } case 'app.bsky.feed.defs#requestMore': { - logEvent('discover:showMore', { + logger.metric('feed:showMore', { + feed, feedContext: interaction.feedContext ?? '', }) break @@ -313,28 +324,31 @@ function sendOrAggregateInteractionsForStats( } } -function flushToStatsig(stats: AggregatedStats | null) { +function flushToStatsig(stats: AggregatedStats | null, feedDescriptor: string) { if (stats === null) { return } if (stats.clickthroughCount > 0) { - logEvent('discover:clickthrough', { + logger.metric('feed:clickthrough', { count: stats.clickthroughCount, + feed: feedDescriptor, }) stats.clickthroughCount = 0 } if (stats.engagedCount > 0) { - logEvent('discover:engaged', { + logger.metric('feed:engaged', { count: stats.engagedCount, + feed: feedDescriptor, }) stats.engagedCount = 0 } if (stats.seenCount > 0) { - logEvent('discover:seen', { + logger.metric('feed:seen', { count: stats.seenCount, + feed: feedDescriptor, }) stats.seenCount = 0 } -- 2.51.2 From 5fd52b3d300fa2a7892a3235c48be69ec75a0324 Mon Sep 17 00:00:00 2001 From: Daniel Holmgren Date: Wed, 1 Oct 2025 13:49:06 -0500 Subject: [PATCH 15/20] add patent pledge link to readme (#9118) --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index eed6ac4fe..ae4511cc3 100644 --- a/README.md +++ b/README.md @@ -70,6 +70,8 @@ Bluesky is an open social network built on the AT Protocol, a flexible technolog See [./LICENSE](./LICENSE) for the full license. +Bluesky Social PBC has committed to a software patent non-aggression pledge. For details see [the original announcement](https://bsky.social/about/blog/10-01-2025-patent-pledge). + ## P.S. We ❤️ you and all of the ways you support us. Thank you for making Bluesky a great place! -- 2.51.2 From 02b189a40ec24998fbf00d3ec625a2a423247235 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Thu, 2 Oct 2025 09:18:52 -0500 Subject: [PATCH 16/20] Language selection and suggestion UX improvements (#9067) * feat: don't retain accepted language suggestion after finishing or exiting post (#8886) * feat: don't retain accepted language suggestion after finishing or exiting post * fix: rebase fixes * fix: rebase fixes * chore: lint * Rename onChange for clarity * Improve logic in composer * Handle user override more explicitly * Drill in onSelectLanguage callback into dialog too * Fix typo Co-authored-by: surfdude29 <149612116+surfdude29@users.noreply.github.com> * Make text crystal clear * Handle multiple languages --------- Co-authored-by: Elijah Seed-Arita Co-authored-by: surfdude29 <149612116+surfdude29@users.noreply.github.com> --- src/state/persisted/schema.ts | 2 +- src/state/preferences/languages.tsx | 4 + src/view/com/composer/Composer.tsx | 61 ++++++- .../select-language/PostLanguageSelect.tsx | 44 ++++- .../PostLanguageSelectDialog.tsx | 28 ++- .../select-language/SuggestedLanguage.tsx | 165 +++++++++++++----- 6 files changed, 241 insertions(+), 63 deletions(-) diff --git a/src/state/persisted/schema.ts b/src/state/persisted/schema.ts index 11204f309..1381f66b5 100644 --- a/src/state/persisted/schema.ts +++ b/src/state/persisted/schema.ts @@ -71,7 +71,7 @@ const schema = z.object({ contentLanguages: z.array(z.string()), /** * The language(s) the user is currently posting in, configured within the - * composer. Multiple languages are psearate by commas. + * composer. Multiple languages are separated by commas. * * BCP-47 2-letter language code without region. */ diff --git a/src/state/preferences/languages.tsx b/src/state/preferences/languages.tsx index 14ba62dba..5d4336814 100644 --- a/src/state/preferences/languages.tsx +++ b/src/state/preferences/languages.tsx @@ -156,6 +156,10 @@ export function toPostLanguages(postLanguage: string): string[] { return postLanguage.split(',').filter(Boolean) } +export function fromPostLanguages(languages: string[]): string { + return languages.filter(Boolean).join(',') +} + export function hasPostLanguage(postLanguage: string, code2: string): boolean { return toPostLanguages(postLanguage).includes(code2) } diff --git a/src/view/com/composer/Composer.tsx b/src/view/com/composer/Composer.tsx index badb0bb9f..8cbb2d37b 100644 --- a/src/view/com/composer/Composer.tsx +++ b/src/view/com/composer/Composer.tsx @@ -88,6 +88,7 @@ import { import {useModalControls} from '#/state/modals' import {useRequireAltTextEnabled} from '#/state/preferences' import { + fromPostLanguages, toPostLanguages, useLanguagePrefs, useLanguagePrefsApi, @@ -197,6 +198,44 @@ export const ComposePost = ({ const [publishingStage, setPublishingStage] = useState('') const [error, setError] = useState('') + /** + * A temporary local reference to a language suggestion that the user has + * accepted. This overrides the global post language preference, but is not + * stored permanently. + */ + const [acceptedLanguageSuggestion, setAcceptedLanguageSuggestion] = useState< + string | null + >(null) + + /** + * The language(s) of the post being replied to. + */ + const [replyToLanguages, setReplyToLanguages] = useState( + replyTo?.langs || [], + ) + + /** + * The currently selected languages of the post. Prefer local temporary + * language suggestion over global lang prefs, if available. + */ + const currentLanguages = useMemo( + () => + acceptedLanguageSuggestion + ? [acceptedLanguageSuggestion] + : toPostLanguages(langPrefs.postLanguage), + [acceptedLanguageSuggestion, langPrefs.postLanguage], + ) + + /** + * When the user selects a language from the composer language selector, + * clear any temporary language suggestions they may have selected + * previously, and any we might try to suggest to them. + */ + const onSelectLanguage = () => { + setAcceptedLanguageSuggestion(null) + setReplyToLanguages([]) + } + const [composerState, composerDispatch] = useReducer( composerReducer, { @@ -414,7 +453,7 @@ export const ComposePost = ({ thread, replyTo: replyTo?.uri, onStateChange: setPublishingStage, - langs: toPostLanguages(langPrefs.postLanguage), + langs: currentLanguages, }) ).uris[0] @@ -490,7 +529,7 @@ export const ComposePost = ({ isPartOfThread: thread.posts.length > 1, hasLink: !!post.embed.link, hasQuote: !!post.embed.quote, - langs: langPrefs.postLanguage, + langs: fromPostLanguages(currentLanguages), logContext: 'Composer', }) index++ @@ -557,7 +596,7 @@ export const ComposePost = ({ thread, canPost, isPublishing, - langPrefs.postLanguage, + currentLanguages, onClose, onPost, onPostSuccess, @@ -654,8 +693,9 @@ export const ComposePost = ({ <> ) @@ -1289,6 +1331,8 @@ function ComposerFooter({ onEmojiButtonPress, onSelectVideo, onAddPost, + currentLanguages, + onSelectLanguage, }: { post: PostDraft dispatch: (action: PostAction) => void @@ -1297,6 +1341,8 @@ function ComposerFooter({ onError: (error: string) => void onSelectVideo: (postId: string, asset: ImagePickerAsset) => void onAddPost: () => void + currentLanguages: string[] + onSelectLanguage?: (language: string) => void }) { const t = useTheme() const {_} = useLingui() @@ -1450,7 +1496,10 @@ function ComposerFooter({ )} - + void +}) { const {_} = useLingui() const langPrefs = useLanguagePrefs() const setLangPrefs = useLanguagePrefsApi() @@ -27,6 +33,9 @@ export function PostLanguageSelect() { new Set([...langPrefs.postLanguageHistory, langPrefs.postLanguage]), ) + const currentLanguages = + currentLanguagesProp ?? toPostLanguages(langPrefs.postLanguage) + if ( dedupedHistory.length === 1 && dedupedHistory[0] === langPrefs.postLanguage @@ -34,7 +43,10 @@ export function PostLanguageSelect() { return ( <> - + ) } @@ -43,7 +55,9 @@ export function PostLanguageSelect() { <> - {({props}) => } + {({props}) => ( + + )} @@ -56,10 +70,13 @@ export function PostLanguageSelect() { setLangPrefs.setPostLanguage(historyItem)}> + onPress={() => { + setLangPrefs.setPostLanguage(historyItem) + onSelectLanguage?.(historyItem) + }}> {langName} ) @@ -77,17 +94,26 @@ export function PostLanguageSelect() { - + ) } -function LanguageBtn(props: Omit) { +function LanguageBtn( + props: Omit & { + currentLanguages?: string[] + }, +) { const {_} = useLingui() const langPrefs = useLanguagePrefs() const t = useTheme() const postLanguagesPref = toPostLanguages(langPrefs.postLanguage) + const currentLanguages = props.currentLanguages ?? postLanguagesPref return ( - ) - } else { - return null - } +
+ ) } /** -- 2.51.2 From 77bf49f212271dc749e967a25d6a22c0d86243b1 Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Thu, 2 Oct 2025 19:59:05 +0300 Subject: [PATCH 17/20] Tighten up eslint rule to catch unused `const {_} = useLingui()` (#9122) * tighten eslint config to catch unused `useLingui`s * fix now-invalid uses of _ * remove unused function that produces a ton of eslint warnings * upgrade react compiler plugin --- .eslintrc.js | 2 +- package.json | 4 ++-- .../PostControls/ShareMenu/RecentChats.tsx | 1 - src/components/dialogs/StarterPackDialog.tsx | 1 - src/lib/hooks/useIntentHandler.ts | 2 +- src/lib/strings/embed-player.ts | 22 +++++++++---------- src/lib/strings/helpers.ts | 17 -------------- src/lib/strings/starter-pack.ts | 2 +- src/screens/Onboarding/StepFinished.tsx | 2 -- src/screens/Search/Shell.tsx | 1 - .../Search/modules/ExploreTrendingVideos.tsx | 1 - src/state/queries/post-feed.ts | 10 ++++----- .../trending/useGetSuggestedUsersQuery.ts | 2 +- .../composer/photos/EditImageDialog.web.tsx | 1 - .../composer/text-input/web/TagDecorator.ts | 2 +- src/view/com/posts/PostFeedErrorMessage.tsx | 2 +- src/view/screens/ModerationMutedAccounts.tsx | 2 -- src/view/screens/ProfileFeedLikedBy.tsx | 2 -- yarn.lock | 17 +++++--------- 19 files changed, 29 insertions(+), 64 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index fa2c74d9e..8dab053c2 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -89,7 +89,7 @@ module.exports = { 'no-unused-vars': 'off', '@typescript-eslint/no-unused-vars': [ 'error', - {argsIgnorePattern: '^_', varsIgnorePattern: '^_'}, + {argsIgnorePattern: '^_', varsIgnorePattern: '^_.+'}, ], '@typescript-eslint/consistent-type-imports': [ 'warn', diff --git a/package.json b/package.json index 6ff871110..ae45d38f8 100644 --- a/package.json +++ b/package.json @@ -246,7 +246,7 @@ "babel-jest": "^29.7.0", "babel-plugin-macros": "^3.1.0", "babel-plugin-module-resolver": "^5.0.2", - "babel-plugin-react-compiler": "^19.1.0-rc.1", + "babel-plugin-react-compiler": "^19.1.0-rc.3", "babel-preset-expo": "~54.0.0", "eslint": "^8.19.0", "eslint-plugin-bsky-internal": "link:./eslint", @@ -254,7 +254,7 @@ "eslint-plugin-import": "^2.31.0", "eslint-plugin-lingui": "^0.2.0", "eslint-plugin-react": "^7.33.2", - "eslint-plugin-react-compiler": "^19.1.0-rc.1", + "eslint-plugin-react-compiler": "^19.1.0-rc.2", "eslint-plugin-react-native-a11y": "^3.3.0", "eslint-plugin-simple-import-sort": "^12.0.0", "file-loader": "6.2.0", diff --git a/src/components/PostControls/ShareMenu/RecentChats.tsx b/src/components/PostControls/ShareMenu/RecentChats.tsx index 28724061f..0862951b2 100644 --- a/src/components/PostControls/ShareMenu/RecentChats.tsx +++ b/src/components/PostControls/ShareMenu/RecentChats.tsx @@ -24,7 +24,6 @@ import type * as bsky from '#/types/bsky' export function RecentChats({postUri}: {postUri: string}) { const control = useDialogContext() - const {_} = useLingui() const {currentAccount} = useSession() const {data} = useListConvosQuery({status: 'accepted'}) const convos = data?.pages[0]?.convos?.slice(0, 10) diff --git a/src/components/dialogs/StarterPackDialog.tsx b/src/components/dialogs/StarterPackDialog.tsx index 13b04e201..78f47b199 100644 --- a/src/components/dialogs/StarterPackDialog.tsx +++ b/src/components/dialogs/StarterPackDialog.tsx @@ -47,7 +47,6 @@ export function StarterPackDialog({ targetDid, enabled, }: StarterPackDialogProps) { - const {_} = useLingui() const navigation = useNavigation() const requireEmailVerification = useRequireEmailVerification() diff --git a/src/lib/hooks/useIntentHandler.ts b/src/lib/hooks/useIntentHandler.ts index c359b2bd6..0c8397008 100644 --- a/src/lib/hooks/useIntentHandler.ts +++ b/src/lib/hooks/useIntentHandler.ts @@ -51,7 +51,7 @@ export function useIntentHandler() { } const urlp = new URL(url) - const [_, intent, intentType] = urlp.pathname.split('/') + const [__, intent, intentType] = urlp.pathname.split('/') // On native, our links look like bluesky://intent/SomeIntent, so we have to check the hostname for the // intent check. On web, we have to check the first part of the path since we have an actual hostname diff --git a/src/lib/strings/embed-player.ts b/src/lib/strings/embed-player.ts index 0cd0b4921..a7ce441fc 100644 --- a/src/lib/strings/embed-player.ts +++ b/src/lib/strings/embed-player.ts @@ -105,7 +105,7 @@ export function parseEmbedPlayerFromUrl( urlp.hostname === 'm.youtube.com' || urlp.hostname === 'music.youtube.com' ) { - const [_, page, shortOrLiveVideoId] = urlp.pathname.split('/') + const [__, page, shortOrLiveVideoId] = urlp.pathname.split('/') const isShorts = page === 'shorts' const isLive = page === 'live' @@ -137,7 +137,7 @@ export function parseEmbedPlayerFromUrl( window.location.hostname : 'localhost' - const [_, channelOrVideo, clipOrId, id] = urlp.pathname.split('/') + const [__, channelOrVideo, clipOrId, id] = urlp.pathname.split('/') if (channelOrVideo === 'videos') { return { @@ -162,7 +162,7 @@ export function parseEmbedPlayerFromUrl( // spotify if (urlp.hostname === 'open.spotify.com') { - const [_, typeOrLocale, idOrType, id] = urlp.pathname.split('/') + const [__, typeOrLocale, idOrType, id] = urlp.pathname.split('/') if (idOrType) { if (typeOrLocale === 'playlist' || idOrType === 'playlist') { @@ -210,7 +210,7 @@ export function parseEmbedPlayerFromUrl( urlp.hostname === 'soundcloud.com' || urlp.hostname === 'www.soundcloud.com' ) { - const [_, user, trackOrSets, set] = urlp.pathname.split('/') + const [__, user, trackOrSets, set] = urlp.pathname.split('/') if (user && trackOrSets) { if (trackOrSets === 'sets' && set) { @@ -270,7 +270,7 @@ export function parseEmbedPlayerFromUrl( } if (urlp.hostname === 'vimeo.com' || urlp.hostname === 'www.vimeo.com') { - const [_, videoId] = urlp.pathname.split('/') + const [__, videoId] = urlp.pathname.split('/') if (videoId) { return { type: 'vimeo_video', @@ -281,7 +281,7 @@ export function parseEmbedPlayerFromUrl( } if (urlp.hostname === 'giphy.com' || urlp.hostname === 'www.giphy.com') { - const [_, gifs, nameAndId] = urlp.pathname.split('/') + const [__, gifs, nameAndId] = urlp.pathname.split('/') /* * nameAndId is a string that consists of the name (dash separated) and the id of the gif (the last part of the name) @@ -309,7 +309,7 @@ export function parseEmbedPlayerFromUrl( // These can include (presumably) a tracking id in the path name, so we have to check for that as well if (giphyRegex.test(urlp.hostname)) { // We can link directly to the gif, if its a proper link - const [_, media, trackingOrId, idOrFilename, filename] = + const [__, media, trackingOrId, idOrFilename, filename] = urlp.pathname.split('/') if (media === 'media') { @@ -338,7 +338,7 @@ export function parseEmbedPlayerFromUrl( // Finally, we should see if it is a link to i.giphy.com. These links don't necessarily end in .gif but can also // be .webp if (urlp.hostname === 'i.giphy.com' || urlp.hostname === 'www.i.giphy.com') { - const [_, mediaOrFilename, filename] = urlp.pathname.split('/') + const [__, mediaOrFilename, filename] = urlp.pathname.split('/') if (mediaOrFilename === 'media' && filename) { const gifId = filename.split('.')[0] @@ -389,7 +389,7 @@ export function parseEmbedPlayerFromUrl( const path_components = urlp.pathname.slice(1, i + 1).split('/') if (path_components.length === 4) { // discard username - it's not relevant - const [photos, _, albums, id] = path_components + const [photos, __, albums, id] = path_components if (photos === 'photos' && albums === 'albums') { // this at least has the shape of a valid photo-album URL! return { @@ -417,7 +417,7 @@ export function parseEmbedPlayerFromUrl( // link shortened flickr path if (urlp.hostname === 'flic.kr') { const b58alph = '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ' - let [_, type, idBase58Enc] = urlp.pathname.split('/') + let [__, type, idBase58Enc] = urlp.pathname.split('/') let id = 0n for (const char of idBase58Enc) { const nextIdx = b58alph.indexOf(char) @@ -528,7 +528,7 @@ export function parseTenorGif(urlp: URL): return {success: false} } - let [_, id, filename] = urlp.pathname.split('/') + let [__, id, filename] = urlp.pathname.split('/') if (!id || !filename) { return {success: false} diff --git a/src/lib/strings/helpers.ts b/src/lib/strings/helpers.ts index 3f7c0d478..9ecbfd38d 100644 --- a/src/lib/strings/helpers.ts +++ b/src/lib/strings/helpers.ts @@ -62,23 +62,6 @@ export function useWarnMaxGraphemeCount({ }, [splitter, maxCount, text]) } -// https://stackoverflow.com/a/52171480 -export function toHashCode(str: string, seed = 0): number { - let h1 = 0xdeadbeef ^ seed, - h2 = 0x41c6ce57 ^ seed - for (let i = 0, ch; i < str.length; i++) { - ch = str.charCodeAt(i) - h1 = Math.imul(h1 ^ ch, 2654435761) - h2 = Math.imul(h2 ^ ch, 1597334677) - } - h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507) - h1 ^= Math.imul(h2 ^ (h2 >>> 13), 3266489909) - h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507) - h2 ^= Math.imul(h1 ^ (h1 >>> 13), 3266489909) - - return 4294967296 * (2097151 & h2) + (h1 >>> 0) -} - export function countLines(str: string | undefined): number { if (!str) return 0 return str.match(/\n/g)?.length ?? 0 diff --git a/src/lib/strings/starter-pack.ts b/src/lib/strings/starter-pack.ts index 01e0256b5..475b00033 100644 --- a/src/lib/strings/starter-pack.ts +++ b/src/lib/strings/starter-pack.ts @@ -46,7 +46,7 @@ export function parseStarterPackUri(uri?: string): { } else { const url = new URL(uri) const parts = url.pathname.split('/') - const [_, path, name, rkey] = parts + const [__, path, name, rkey] = parts if (parts.length !== 4) return null if (path !== 'starter-pack' && path !== 'start') return null diff --git a/src/screens/Onboarding/StepFinished.tsx b/src/screens/Onboarding/StepFinished.tsx index b6d0c0d1e..3ed268a57 100644 --- a/src/screens/Onboarding/StepFinished.tsx +++ b/src/screens/Onboarding/StepFinished.tsx @@ -69,7 +69,6 @@ import {Text} from '#/components/Typography' import * as bsky from '#/types/bsky' export function StepFinished() { - const {_} = useLingui() const {state, dispatch} = useContext(Context) const onboardDispatch = useOnboardingDispatch() const [saving, setSaving] = useState(false) @@ -495,7 +494,6 @@ function ValueProposition({ function Dot({active}: {active: boolean}) { const t = useTheme() - const {_} = useLingui() return ( { diff --git a/src/screens/Search/modules/ExploreTrendingVideos.tsx b/src/screens/Search/modules/ExploreTrendingVideos.tsx index 54eb73312..f57cdb08a 100644 --- a/src/screens/Search/modules/ExploreTrendingVideos.tsx +++ b/src/screens/Search/modules/ExploreTrendingVideos.tsx @@ -31,7 +31,6 @@ const FEED_PARAMS: { } export function ExploreTrendingVideos() { - const {_} = useLingui() const gutters = useGutters([0, 'base']) const {data, isLoading, error} = usePostFeedQuery(FEED_DESC, FEED_PARAMS) diff --git a/src/state/queries/post-feed.ts b/src/state/queries/post-feed.ts index 22e95fcd6..7f95a34e7 100644 --- a/src/state/queries/post-feed.ts +++ b/src/state/queries/post-feed.ts @@ -492,23 +492,23 @@ function createApi({ } } } else if (feedDesc.startsWith('author')) { - const [_, actor, filter] = feedDesc.split('|') + const [__, actor, filter] = feedDesc.split('|') return new AuthorFeedAPI({agent, feedParams: {actor, filter}}) } else if (feedDesc.startsWith('likes')) { - const [_, actor] = feedDesc.split('|') + const [__, actor] = feedDesc.split('|') return new LikesFeedAPI({agent, feedParams: {actor}}) } else if (feedDesc.startsWith('feedgen')) { - const [_, feed] = feedDesc.split('|') + const [__, feed] = feedDesc.split('|') return new CustomFeedAPI({ agent, feedParams: {feed}, userInterests, }) } else if (feedDesc.startsWith('list')) { - const [_, list] = feedDesc.split('|') + const [__, list] = feedDesc.split('|') return new ListFeedAPI({agent, feedParams: {list}}) } else if (feedDesc.startsWith('posts')) { - const [_, uriList] = feedDesc.split('|') + const [__, uriList] = feedDesc.split('|') return new PostListFeedAPI({agent, feedParams: {uris: uriList.split(',')}}) } else if (feedDesc === 'demo') { return new DemoFeedAPI({agent}) diff --git a/src/state/queries/trending/useGetSuggestedUsersQuery.ts b/src/state/queries/trending/useGetSuggestedUsersQuery.ts index 898029398..4ecee2986 100644 --- a/src/state/queries/trending/useGetSuggestedUsersQuery.ts +++ b/src/state/queries/trending/useGetSuggestedUsersQuery.ts @@ -69,7 +69,7 @@ export function* findAllProfilesInQueryData( queryClient.getQueriesData({ queryKey: [getSuggestedUsersQueryKeyRoot], }) - for (const [_, response] of responses) { + for (const [_key, response] of responses) { if (!response) { continue } diff --git a/src/view/com/composer/photos/EditImageDialog.web.tsx b/src/view/com/composer/photos/EditImageDialog.web.tsx index b448fad3a..6131e3046 100644 --- a/src/view/com/composer/photos/EditImageDialog.web.tsx +++ b/src/view/com/composer/photos/EditImageDialog.web.tsx @@ -116,7 +116,6 @@ function EditImageInner({ }) { const t = useTheme() const [isDragging, setIsDragging] = useState(false) - const {_} = useLingui() const control = Dialog.useDialogContext() const source = image.source diff --git a/src/view/com/composer/text-input/web/TagDecorator.ts b/src/view/com/composer/text-input/web/TagDecorator.ts index 5af70de6d..f1698d8c4 100644 --- a/src/view/com/composer/text-input/web/TagDecorator.ts +++ b/src/view/com/composer/text-input/web/TagDecorator.ts @@ -30,7 +30,7 @@ function getDecorations(doc: ProsemirrorNode) { let match while ((match = regex.exec(textContent))) { - const [matchedString, _, tag] = match + const [matchedString, __, tag] = match if (!tag || tag.replace(TRAILING_PUNCTUATION_REGEX, '').length > 64) continue diff --git a/src/view/com/posts/PostFeedErrorMessage.tsx b/src/view/com/posts/PostFeedErrorMessage.tsx index 808ef9fff..5a8cf904b 100644 --- a/src/view/com/posts/PostFeedErrorMessage.tsx +++ b/src/view/com/posts/PostFeedErrorMessage.tsx @@ -126,7 +126,7 @@ function FeedgenErrorMessage({ })[knownError], [_l, knownError], ) - const [_, uri] = feedDesc.split('|') + const [__, uri] = feedDesc.split('|') const [ownerDid] = safeParseFeedgenUri(uri) const removePromptControl = Prompt.usePromptControl() const {mutateAsync: removeFeed} = useRemoveFeedMutation() diff --git a/src/view/screens/ModerationMutedAccounts.tsx b/src/view/screens/ModerationMutedAccounts.tsx index 11d787ca1..891a379b6 100644 --- a/src/view/screens/ModerationMutedAccounts.tsx +++ b/src/view/screens/ModerationMutedAccounts.tsx @@ -2,7 +2,6 @@ import {useCallback, useMemo, useState} from 'react' import {type StyleProp, View, type ViewStyle} from 'react-native' import {type AppBskyActorDefs as ActorDefs} from '@atproto/api' import {Trans} from '@lingui/macro' -import {useLingui} from '@lingui/react' import {useFocusEffect} from '@react-navigation/native' import {type NativeStackScreenProps} from '@react-navigation/native-stack' @@ -27,7 +26,6 @@ type Props = NativeStackScreenProps< export function ModerationMutedAccounts({}: Props) { const t = useTheme() const moderationOpts = useModerationOpts() - const {_} = useLingui() const setMinimalShellMode = useSetMinimalShellMode() const [isPTRing, setIsPTRing] = useState(false) diff --git a/src/view/screens/ProfileFeedLikedBy.tsx b/src/view/screens/ProfileFeedLikedBy.tsx index d26ff6172..56f397809 100644 --- a/src/view/screens/ProfileFeedLikedBy.tsx +++ b/src/view/screens/ProfileFeedLikedBy.tsx @@ -1,6 +1,5 @@ import {useCallback} from 'react' import {Trans} from '@lingui/macro' -import {useLingui} from '@lingui/react' import {useFocusEffect} from '@react-navigation/native' import { @@ -17,7 +16,6 @@ export const ProfileFeedLikedByScreen = ({route}: Props) => { const setMinimalShellMode = useSetMinimalShellMode() const {name, rkey} = route.params const uri = makeRecordUri(name, 'app.bsky.feed.generator', rkey) - const {_} = useLingui() useFocusEffect( useCallback(() => { diff --git a/yarn.lock b/yarn.lock index dfab6f354..8497bface 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8603,14 +8603,7 @@ babel-plugin-polyfill-regenerator@^0.6.1: dependencies: "@babel/helper-define-polyfill-provider" "^0.6.3" -babel-plugin-react-compiler@^19.1.0-rc.1: - version "19.1.0-rc.1" - resolved "https://registry.yarnpkg.com/babel-plugin-react-compiler/-/babel-plugin-react-compiler-19.1.0-rc.1.tgz#99d131be61017e40abbaedd98321069bf8b7e54a" - integrity sha512-M4fpG+Hfq5gWzsJeeMErdRokzg0fdJ8IAk+JDhfB/WLT+U3WwJWR8edphypJrk447/JEvYu6DBFwsTn10bMW4Q== - dependencies: - "@babel/types" "^7.26.0" - -babel-plugin-react-compiler@^19.1.0-rc.2: +babel-plugin-react-compiler@^19.1.0-rc.2, babel-plugin-react-compiler@^19.1.0-rc.3: version "19.1.0-rc.3" resolved "https://registry.yarnpkg.com/babel-plugin-react-compiler/-/babel-plugin-react-compiler-19.1.0-rc.3.tgz#45e5a282a2460b3701971e5eb8310a90a7919022" integrity sha512-mjRn69WuTz4adL0bXGx8Rsyk1086zFJeKmes6aK0xPuK3aaXmDJdLHqwKKMrpm6KAI1MCoUK72d2VeqQbu8YIA== @@ -10824,10 +10817,10 @@ eslint-plugin-lingui@^0.2.0: dependencies: "@typescript-eslint/utils" "^5.61.0" -eslint-plugin-react-compiler@^19.1.0-rc.1: - version "19.1.0-rc.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-compiler/-/eslint-plugin-react-compiler-19.1.0-rc.1.tgz#e974ba9541c9a4464d77723e0505b5742bc22e56" - integrity sha512-3umw5eqZXapBl7aQGmvcjheKhUbsElb9jTETxRZg371e1LG4EPs/zCHt2JzP+wNcdaZWzjU/R730zPUJblY2zw== +eslint-plugin-react-compiler@^19.1.0-rc.2: + version "19.1.0-rc.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-compiler/-/eslint-plugin-react-compiler-19.1.0-rc.2.tgz#83343e7422e00fa61e729af8e8468f0ddec37925" + integrity sha512-oKalwDGcD+RX9mf3NEO4zOoUMeLvjSvcbbEOpquzmzqEEM2MQdp7/FY/Hx9NzmUwFzH1W9SKTz5fihfMldpEYw== dependencies: "@babel/core" "^7.24.4" "@babel/parser" "^7.24.4" -- 2.51.2 From 1354fd266134c383fc98bdcc9899f881b5427615 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 2 Oct 2025 20:01:10 +0100 Subject: [PATCH 18/20] [Fix Logouts] Remove buggy hackfix (#9108) * Rip out the network hack in favor of bluesky-social/atproto#4238 * Bump api pkg * Debug code * Revert "Debug code" This reverts commit 38445f31f4d7bc6c360a18080a059040bd6b07d1. --------- Co-authored-by: Eric Bailey --- package.json | 2 +- src/state/session/agent.ts | 8 ------- yarn.lock | 43 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 44 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index ae45d38f8..500edc4dc 100644 --- a/package.json +++ b/package.json @@ -71,7 +71,7 @@ "icons:optimize": "svgo -f ./assets/icons" }, "dependencies": { - "@atproto/api": "^0.16.7", + "@atproto/api": "^0.17.0", "@bitdrift/react-native": "^0.6.8", "@braintree/sanitize-url": "^6.0.2", "@bsky.app/alf": "^0.1.2", diff --git a/src/state/session/agent.ts b/src/state/session/agent.ts index 4f14173e2..36d19299b 100644 --- a/src/state/session/agent.ts +++ b/src/state/session/agent.ts @@ -321,15 +321,7 @@ class BskyAppAgent extends BskyAgent { // Now the agent is ready. const account = agentToSessionAccountOrThrow(this) - let lastSession = this.sessionManager.session this.persistSessionHandler = event => { - if (this.sessionManager.session) { - lastSession = this.sessionManager.session - } else if (event === 'network-error') { - // Put it back, we'll try again later. - this.sessionManager.session = lastSession - } - onSessionChange(this, account.did, event) if (event !== 'create' && event !== 'update') { addSessionErrorLog(account.did, event) diff --git a/yarn.lock b/yarn.lock index 8497bface..403885e5a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -77,6 +77,20 @@ tlds "^1.234.0" zod "^3.23.8" +"@atproto/api@^0.17.0": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@atproto/api/-/api-0.17.0.tgz#1fe87ef703f8020dbe00bb5e5cc18622b8b91f4a" + integrity sha512-FNS9SW7/3kslAnJH7F4fO9/jPjXzC0NMD6u9NjJ/h4EnaIEpWHZQPkmD9Q2hvAwD6+Uo2boYZEPKkOa55Lr5Dg== + dependencies: + "@atproto/common-web" "^0.4.3" + "@atproto/lexicon" "^0.5.1" + "@atproto/syntax" "^0.4.1" + "@atproto/xrpc" "^0.7.5" + await-lock "^2.2.2" + multiformats "^9.9.0" + tlds "^1.234.0" + zod "^3.23.8" + "@atproto/aws@^0.2.28": version "0.2.28" resolved "https://registry.yarnpkg.com/@atproto/aws/-/aws-0.2.28.tgz#17bd88a6276e323ebb094a3f01bd94b1173a29a4" @@ -170,6 +184,16 @@ uint8arrays "3.0.0" zod "^3.23.8" +"@atproto/common-web@^0.4.3": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@atproto/common-web/-/common-web-0.4.3.tgz#b4480220b5682db09da45f4ef906eb7619c838b5" + integrity sha512-nRDINmSe4VycJzPo6fP/hEltBcULFxt9Kw7fQk6405FyAWZiTluYHlXOnU7GkQfeUK44OENG1qFTBcmCJ7e8pg== + dependencies: + graphemer "^1.4.0" + multiformats "^9.9.0" + uint8arrays "3.0.0" + zod "^3.23.8" + "@atproto/common@0.1.0": version "0.1.0" resolved "https://registry.yarnpkg.com/@atproto/common/-/common-0.1.0.tgz#4216a8fef5b985ab62ac21252a0f8ca0f4a0f210" @@ -303,6 +327,17 @@ multiformats "^9.9.0" zod "^3.23.8" +"@atproto/lexicon@^0.5.1": + version "0.5.1" + resolved "https://registry.yarnpkg.com/@atproto/lexicon/-/lexicon-0.5.1.tgz#e9b7d5c70dc5a38518a8069cd80fea77ab526947" + integrity sha512-y8AEtYmfgVl4fqFxqXAeGvhesiGkxiy3CWoJIfsFDDdTlZUC8DFnZrYhcqkIop3OlCkkljvpSJi1hbeC1tbi8A== + dependencies: + "@atproto/common-web" "^0.4.3" + "@atproto/syntax" "^0.4.1" + iso-datestring-validator "^2.2.2" + multiformats "^9.9.0" + zod "^3.23.8" + "@atproto/oauth-provider-api@0.3.0": version "0.3.0" resolved "https://registry.yarnpkg.com/@atproto/oauth-provider-api/-/oauth-provider-api-0.3.0.tgz#c53a6f2584e6e53746b6cdf233be591fdf7d4355" @@ -516,6 +551,14 @@ "@atproto/lexicon" "^0.5.0" zod "^3.23.8" +"@atproto/xrpc@^0.7.5": + version "0.7.5" + resolved "https://registry.yarnpkg.com/@atproto/xrpc/-/xrpc-0.7.5.tgz#40cef1a657b5f28af8ebec9e3dac5872e58e88ea" + integrity sha512-MUYNn5d2hv8yVegRL0ccHvTHAVj5JSnW07bkbiaz96UH45lvYNRVwt44z+yYVnb0/mvBzyD3/ZQ55TRGt7fHkA== + dependencies: + "@atproto/lexicon" "^0.5.1" + zod "^3.23.8" + "@aws-crypto/crc32@3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@aws-crypto/crc32/-/crc32-3.0.0.tgz#07300eca214409c33e3ff769cd5697b57fdd38fa" -- 2.51.2 From b68f80050c0985d0e27a772862d1ea3b921f88e7 Mon Sep 17 00:00:00 2001 From: pfrazee <1270099+pfrazee@users.noreply.github.com> Date: Fri, 3 Oct 2025 02:34:02 +0000 Subject: [PATCH 19/20] Nightly source-language update --- src/locale/locales/en/messages.po | 262 +++++++++++++++--------------- 1 file changed, 133 insertions(+), 129 deletions(-) diff --git a/src/locale/locales/en/messages.po b/src/locale/locales/en/messages.po index 97a49b20a..3279939cb 100644 --- a/src/locale/locales/en/messages.po +++ b/src/locale/locales/en/messages.po @@ -124,7 +124,7 @@ msgstr "" msgid "{0, plural, other {# people have}} used this starter pack!" msgstr "" -#: src/components/dialogs/StarterPackDialog.tsx:357 +#: src/components/dialogs/StarterPackDialog.tsx:356 msgid "{0, plural, other {+# more}}" msgstr "" @@ -521,7 +521,7 @@ msgstr "" msgid "7 days" msgstr "" -#: src/screens/Onboarding/StepFinished.tsx:341 +#: src/screens/Onboarding/StepFinished.tsx:340 msgid "A collection of popular feeds you can find on Bluesky, including News, Booksky, Game Dev, Blacksky, and Fountain Pens" msgstr "" @@ -568,6 +568,10 @@ msgstr "" msgid "Accept Request" msgstr "" +#: src/view/com/composer/select-language/SuggestedLanguage.tsx:179 +msgid "Accept this language suggestion" +msgstr "" + #: src/screens/Settings/AccessibilitySettings.tsx:44 #: src/screens/Settings/Settings.tsx:220 #: src/screens/Settings/Settings.tsx:223 @@ -654,8 +658,8 @@ msgstr "" #: src/components/dialogs/lists/ListAddRemoveUsersDialog.tsx:169 #: src/components/dialogs/MutedWords.tsx:333 -#: src/components/dialogs/StarterPackDialog.tsx:371 -#: src/components/dialogs/StarterPackDialog.tsx:377 +#: src/components/dialogs/StarterPackDialog.tsx:370 +#: src/components/dialogs/StarterPackDialog.tsx:376 #: src/view/com/modals/UserAddRemoveLists.tsx:235 msgid "Add" msgstr "" @@ -708,11 +712,11 @@ msgstr "" msgid "Add another account" msgstr "" -#: src/view/com/composer/Composer.tsx:811 +#: src/view/com/composer/Composer.tsx:853 msgid "Add another post" msgstr "" -#: src/view/com/composer/Composer.tsx:1444 +#: src/view/com/composer/Composer.tsx:1490 msgid "Add another post to thread" msgstr "" @@ -790,7 +794,7 @@ msgstr "" msgid "Add to saved posts" msgstr "" -#: src/components/dialogs/StarterPackDialog.tsx:176 +#: src/components/dialogs/StarterPackDialog.tsx:175 #: src/view/com/profile/ProfileMenu.tsx:308 #: src/view/com/profile/ProfileMenu.tsx:311 msgid "Add to starter packs" @@ -805,7 +809,7 @@ msgstr "" msgid "Added to list" msgstr "" -#: src/components/dialogs/StarterPackDialog.tsx:258 +#: src/components/dialogs/StarterPackDialog.tsx:257 msgid "Added to starter pack" msgstr "" @@ -879,7 +883,7 @@ msgstr "" #: src/screens/Search/components/SearchLanguageDropdown.tsx:64 #: src/screens/Search/components/SearchLanguageDropdown.tsx:99 #: src/screens/Search/components/SearchLanguageDropdown.tsx:101 -#: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:216 +#: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:238 msgid "All languages" msgstr "" @@ -967,7 +971,7 @@ msgid "An email has been sent to {0}. It includes a confirmation code which you msgstr "" #: src/components/dialogs/GifSelect.tsx:253 -#: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:298 +#: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:320 msgid "An error has occurred" msgstr "" @@ -1012,7 +1016,7 @@ msgstr "" msgid "An error occurred while uploading the video." msgstr "" -#: src/screens/Onboarding/StepFinished.tsx:359 +#: src/screens/Onboarding/StepFinished.tsx:358 msgid "An illustration of several Bluesky posts alongside repost, like, and comment icons" msgstr "" @@ -1221,11 +1225,11 @@ msgstr "" msgid "Are you sure you want to remove this from your feeds?" msgstr "" -#: src/view/com/composer/Composer.tsx:760 +#: src/view/com/composer/Composer.tsx:802 msgid "Are you sure you'd like to discard this draft?" msgstr "" -#: src/view/com/composer/Composer.tsx:950 +#: src/view/com/composer/Composer.tsx:992 msgid "Are you sure you'd like to discard this post?" msgstr "" @@ -1233,7 +1237,7 @@ msgstr "" msgid "Are you sure?" msgstr "" -#: src/view/com/composer/select-language/SuggestedLanguage.tsx:89 +#: src/view/com/composer/select-language/SuggestedLanguage.tsx:99 msgid "Are you writing in <0>{suggestedLanguageName}?" msgstr "" @@ -1307,7 +1311,7 @@ msgstr "" msgid "Before creating a post or replying, you must first verify your email." msgstr "" -#: src/components/dialogs/StarterPackDialog.tsx:71 +#: src/components/dialogs/StarterPackDialog.tsx:70 #: src/components/StarterPack/ProfileStarterPacks.tsx:231 #: src/components/StarterPack/ProfileStarterPacks.tsx:241 msgid "Before creating a starter pack, you must first verify your email." @@ -1626,8 +1630,8 @@ msgstr "" #: src/screens/Settings/Settings.tsx:289 #: src/screens/Takendown.tsx:108 #: src/screens/Takendown.tsx:111 -#: src/view/com/composer/Composer.tsx:1005 -#: src/view/com/composer/Composer.tsx:1016 +#: src/view/com/composer/Composer.tsx:1047 +#: src/view/com/composer/Composer.tsx:1058 #: src/view/com/composer/photos/EditImageDialog.web.tsx:43 #: src/view/com/composer/photos/EditImageDialog.web.tsx:52 #: src/view/shell/desktop/LeftNav.tsx:213 @@ -1708,10 +1712,6 @@ msgstr "" msgid "Change password dialog" msgstr "" -#: src/view/com/composer/select-language/SuggestedLanguage.tsx:100 -msgid "Change post language to {suggestedLanguageName}" -msgstr "" - #: src/components/moderation/ReportDialog/index.tsx:247 msgid "Change report reason" msgstr "" @@ -1823,11 +1823,11 @@ msgstr "" msgid "Choose People" msgstr "" -#: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:162 +#: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:184 msgid "Choose Post Languages" msgstr "" -#: src/screens/Onboarding/StepFinished.tsx:575 +#: src/screens/Onboarding/StepFinished.tsx:573 msgid "Choose the algorithms that power your custom feeds." msgstr "" @@ -1920,7 +1920,7 @@ msgstr "" #: src/components/dialogs/nuxs/InitialVerificationAnnouncement.tsx:178 #: src/components/dialogs/nuxs/InitialVerificationAnnouncement.tsx:187 #: src/components/dialogs/SearchablePeopleList.tsx:295 -#: src/components/dialogs/StarterPackDialog.tsx:179 +#: src/components/dialogs/StarterPackDialog.tsx:178 #: src/components/dms/EmojiPopup.android.tsx:58 #: src/components/dms/ReportDialog.tsx:387 #: src/components/dms/ReportDialog.tsx:396 @@ -1938,7 +1938,7 @@ msgstr "" #: src/components/WhoCanReply.tsx:209 #: src/screens/Settings/components/ChangePasswordDialog.tsx:286 #: src/screens/Settings/components/ChangePasswordDialog.tsx:291 -#: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:313 +#: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:335 #: src/view/com/feeds/MissingFeed.tsx:210 #: src/view/com/feeds/MissingFeed.tsx:217 msgid "Close" @@ -1962,9 +1962,9 @@ msgstr "" #: src/components/dialogs/GifSelect.tsx:263 #: src/components/verification/VerificationsDialog.tsx:136 #: src/components/verification/VerifierDialog.tsx:142 -#: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:182 -#: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:276 -#: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:308 +#: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:204 +#: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:298 +#: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:330 msgid "Close dialog" msgstr "" @@ -2007,7 +2007,7 @@ msgstr "" msgid "Closes password update alert" msgstr "" -#: src/view/com/composer/Composer.tsx:1013 +#: src/view/com/composer/Composer.tsx:1055 msgid "Closes post composer and discards post draft" msgstr "" @@ -2053,8 +2053,8 @@ msgstr "" msgid "Community Guidelines" msgstr "" -#: src/screens/Onboarding/StepFinished.tsx:473 -#: src/screens/Onboarding/StepFinished.tsx:588 +#: src/screens/Onboarding/StepFinished.tsx:472 +#: src/screens/Onboarding/StepFinished.tsx:586 msgid "Complete onboarding and start using your account" msgstr "" @@ -2066,7 +2066,7 @@ msgstr "" msgid "Compose new post" msgstr "" -#: src/view/com/composer/Composer.tsx:914 +#: src/view/com/composer/Composer.tsx:956 msgid "Compose posts up to {0, plural, other {# characters}} in length" msgstr "" @@ -2074,7 +2074,7 @@ msgstr "" msgid "Compose reply" msgstr "" -#: src/view/com/composer/Composer.tsx:1834 +#: src/view/com/composer/Composer.tsx:1883 msgid "Compressing video..." msgstr "" @@ -2411,8 +2411,8 @@ msgstr "" #. Text on button to create a new starter pack #. Text on button to create a new starter pack -#: src/components/dialogs/StarterPackDialog.tsx:112 -#: src/components/dialogs/StarterPackDialog.tsx:201 +#: src/components/dialogs/StarterPackDialog.tsx:111 +#: src/components/dialogs/StarterPackDialog.tsx:200 #: src/components/StarterPack/ProfileStarterPacks.tsx:296 msgid "Create" msgstr "" @@ -2483,8 +2483,8 @@ msgstr "" msgid "Create report for {0}" msgstr "" -#: src/components/dialogs/StarterPackDialog.tsx:107 -#: src/components/dialogs/StarterPackDialog.tsx:196 +#: src/components/dialogs/StarterPackDialog.tsx:106 +#: src/components/dialogs/StarterPackDialog.tsx:195 msgid "Create starter pack" msgstr "" @@ -2639,7 +2639,7 @@ msgstr "" #: src/components/PostControls/PostMenu/PostMenuItems.tsx:685 #: src/components/PostControls/PostMenu/PostMenuItems.tsx:687 -#: src/view/com/composer/Composer.tsx:924 +#: src/view/com/composer/Composer.tsx:966 msgid "Delete post" msgstr "" @@ -2752,8 +2752,8 @@ msgstr "" #: src/components/dialogs/lists/CreateOrEditListDialog.tsx:92 #: src/screens/Profile/Header/EditProfileDialog.tsx:82 -#: src/view/com/composer/Composer.tsx:762 -#: src/view/com/composer/Composer.tsx:957 +#: src/view/com/composer/Composer.tsx:804 +#: src/view/com/composer/Composer.tsx:999 msgid "Discard" msgstr "" @@ -2762,11 +2762,11 @@ msgstr "" msgid "Discard changes?" msgstr "" -#: src/view/com/composer/Composer.tsx:759 +#: src/view/com/composer/Composer.tsx:801 msgid "Discard draft?" msgstr "" -#: src/view/com/composer/Composer.tsx:949 +#: src/view/com/composer/Composer.tsx:991 msgid "Discard post?" msgstr "" @@ -2789,7 +2789,7 @@ msgstr "" msgid "Dismiss" msgstr "" -#: src/view/com/composer/Composer.tsx:1758 +#: src/view/com/composer/Composer.tsx:1807 msgid "Dismiss error" msgstr "" @@ -2815,7 +2815,7 @@ msgstr "" msgid "Display name" msgstr "" -#: src/screens/Onboarding/StepFinished.tsx:347 +#: src/screens/Onboarding/StepFinished.tsx:346 msgid "Ditch the trolls and clickbait. Find real people and conversations that matter to you." msgstr "" @@ -2868,7 +2868,7 @@ msgstr "" #: src/view/com/auth/server-input/index.tsx:233 #: src/view/com/composer/labels/LabelsBtn.tsx:223 #: src/view/com/composer/labels/LabelsBtn.tsx:230 -#: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:281 +#: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:303 #: src/view/com/composer/videos/SubtitleDialog.tsx:168 #: src/view/com/composer/videos/SubtitleDialog.tsx:178 msgid "Done" @@ -3223,7 +3223,7 @@ msgstr "" msgid "Entertainment" msgstr "" -#: src/view/com/composer/Composer.tsx:1843 +#: src/view/com/composer/Composer.tsx:1892 #: src/view/com/util/error/ErrorScreen.tsx:42 msgid "Error" msgstr "" @@ -3415,7 +3415,7 @@ msgstr "" msgid "Failed to add emoji reaction" msgstr "" -#: src/components/dialogs/StarterPackDialog.tsx:270 +#: src/components/dialogs/StarterPackDialog.tsx:269 msgid "Failed to add to starter pack" msgstr "" @@ -3521,7 +3521,7 @@ msgstr "" msgid "Failed to remove emoji reaction" msgstr "" -#: src/components/dialogs/StarterPackDialog.tsx:289 +#: src/components/dialogs/StarterPackDialog.tsx:288 msgid "Failed to remove from starter pack" msgstr "" @@ -3698,8 +3698,8 @@ msgstr "" msgid "Filter who you receive notifications from" msgstr "" -#: src/screens/Onboarding/StepFinished.tsx:479 -#: src/screens/Onboarding/StepFinished.tsx:591 +#: src/screens/Onboarding/StepFinished.tsx:478 +#: src/screens/Onboarding/StepFinished.tsx:589 msgid "Finalizing" msgstr "" @@ -3719,11 +3719,11 @@ msgstr "" msgid "Find people to follow" msgstr "" -#: src/screens/Search/Shell.tsx:476 +#: src/screens/Search/Shell.tsx:475 msgid "Find posts, users, and feeds on Bluesky" msgstr "" -#: src/screens/Onboarding/StepFinished.tsx:345 +#: src/screens/Onboarding/StepFinished.tsx:344 msgid "Find your people" msgstr "" @@ -3750,7 +3750,7 @@ msgctxt "Name of app icon variant" msgid "Flat White" msgstr "" -#: src/screens/Onboarding/StepFinished.tsx:571 +#: src/screens/Onboarding/StepFinished.tsx:569 msgid "Flexible" msgstr "" @@ -3924,7 +3924,7 @@ msgstr "" msgid "Forever" msgstr "" -#: src/screens/Onboarding/StepFinished.tsx:354 +#: src/screens/Onboarding/StepFinished.tsx:353 msgid "Forget the noise" msgstr "" @@ -3941,7 +3941,7 @@ msgstr "" msgid "Forgot?" msgstr "" -#: src/screens/Onboarding/StepFinished.tsx:336 +#: src/screens/Onboarding/StepFinished.tsx:335 msgid "Free your feed" msgstr "" @@ -4598,7 +4598,7 @@ msgstr "" msgid "It's just you right now! Add more people to your starter pack by searching above." msgstr "" -#: src/view/com/composer/Composer.tsx:1777 +#: src/view/com/composer/Composer.tsx:1826 msgid "Job ID: {0}" msgstr "" @@ -4801,8 +4801,8 @@ msgstr "" msgid "Let's get your password reset!" msgstr "" -#: src/screens/Onboarding/StepFinished.tsx:481 -#: src/screens/Onboarding/StepFinished.tsx:591 +#: src/screens/Onboarding/StepFinished.tsx:480 +#: src/screens/Onboarding/StepFinished.tsx:589 msgid "Let's go!" msgstr "" @@ -4854,7 +4854,7 @@ msgstr "" #: src/screens/Post/PostLikedBy.tsx:41 #: src/screens/Profile/ProfileLabelerLikedBy.tsx:32 -#: src/view/screens/ProfileFeedLikedBy.tsx:34 +#: src/view/screens/ProfileFeedLikedBy.tsx:32 msgid "Liked By" msgstr "" @@ -5266,8 +5266,8 @@ msgstr "" msgid "More feeds" msgstr "" -#: src/view/com/composer/select-language/PostLanguageSelect.tsx:70 -#: src/view/com/composer/select-language/PostLanguageSelect.tsx:73 +#: src/view/com/composer/select-language/PostLanguageSelect.tsx:87 +#: src/view/com/composer/select-language/PostLanguageSelect.tsx:90 msgid "More languages..." msgstr "" @@ -5372,11 +5372,11 @@ msgid "Muted accounts" msgstr "" #: src/Navigation.tsx:187 -#: src/view/screens/ModerationMutedAccounts.tsx:118 +#: src/view/screens/ModerationMutedAccounts.tsx:116 msgid "Muted Accounts" msgstr "" -#: src/view/screens/ModerationMutedAccounts.tsx:204 +#: src/view/screens/ModerationMutedAccounts.tsx:202 msgid "Muted accounts have their posts removed from your feed and from your notifications. Mutes are completely private." msgstr "" @@ -5448,7 +5448,7 @@ msgstr "" msgid "Need to report a copyright violation?" msgstr "" -#: src/screens/Onboarding/StepFinished.tsx:559 +#: src/screens/Onboarding/StepFinished.tsx:557 msgid "Never lose access to your followers or data." msgstr "" @@ -5548,7 +5548,7 @@ msgstr "" msgid "New posts from {firstAuthorName} and {additionalAuthorsCount, plural, one {{formattedAuthorsCount} other} other {{formattedAuthorsCount} others}}" msgstr "" -#: src/components/dialogs/StarterPackDialog.tsx:193 +#: src/components/dialogs/StarterPackDialog.tsx:192 msgid "New starter pack" msgstr "" @@ -5575,8 +5575,8 @@ msgstr "" #: src/screens/Login/LoginForm.tsx:350 #: src/screens/Login/SetNewPasswordForm.tsx:182 #: src/screens/Login/SetNewPasswordForm.tsx:188 -#: src/screens/Onboarding/StepFinished.tsx:474 -#: src/screens/Onboarding/StepFinished.tsx:483 +#: src/screens/Onboarding/StepFinished.tsx:473 +#: src/screens/Onboarding/StepFinished.tsx:482 #: src/screens/Settings/components/AddAppPasswordDialog.tsx:157 #: src/screens/Settings/components/AddAppPasswordDialog.tsx:165 #: src/screens/Signup/BackNextButtons.tsx:67 @@ -5596,7 +5596,7 @@ msgstr "" msgid "Next image" msgstr "" -#: src/screens/Onboarding/StepFinished.tsx:356 +#: src/screens/Onboarding/StepFinished.tsx:355 msgid "No ads, no invasive tracking, no engagement traps. Bluesky respects your time and attention." msgstr "" @@ -5639,7 +5639,7 @@ msgstr "" msgid "No messages yet" msgstr "" -#: src/screens/Onboarding/StepFinished.tsx:338 +#: src/screens/Onboarding/StepFinished.tsx:337 msgid "No more doomscrolling junk-filled algorithms. Find feeds that work for you, not against you." msgstr "" @@ -5843,7 +5843,7 @@ msgid "Off" msgstr "" #: src/components/dialogs/GifSelect.tsx:256 -#: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:301 +#: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:323 #: src/view/com/util/ErrorBoundary.tsx:57 msgid "Oh no!" msgstr "" @@ -5880,11 +5880,11 @@ msgstr "" msgid "Onboarding reset" msgstr "" -#: src/view/com/composer/Composer.tsx:359 +#: src/view/com/composer/Composer.tsx:398 msgid "One or more GIFs is missing alt text." msgstr "" -#: src/view/com/composer/Composer.tsx:356 +#: src/view/com/composer/Composer.tsx:395 msgid "One or more images is missing alt text." msgstr "" @@ -5896,7 +5896,7 @@ msgstr "" msgid "One or more of your selected files are too large. Maximum size is 100 MB." msgstr "" -#: src/view/com/composer/Composer.tsx:366 +#: src/view/com/composer/Composer.tsx:405 msgid "One or more videos is missing alt text." msgstr "" @@ -5935,7 +5935,7 @@ msgstr "" msgid "Oops!" msgstr "" -#: src/screens/Onboarding/StepFinished.tsx:555 +#: src/screens/Onboarding/StepFinished.tsx:553 msgid "Open" msgstr "" @@ -5953,7 +5953,7 @@ msgid "Open drawer menu" msgstr "" #: src/screens/Messages/components/MessageInput.web.tsx:181 -#: src/view/com/composer/Composer.tsx:1429 +#: src/view/com/composer/Composer.tsx:1475 msgid "Open emoji picker" msgstr "" @@ -6053,7 +6053,7 @@ msgstr "" msgid "Opens device gallery to select up to {MAX_IMAGES, plural, other {# images}}, or a single video or GIF." msgstr "" -#: src/view/com/composer/Composer.tsx:1430 +#: src/view/com/composer/Composer.tsx:1476 msgid "Opens emoji picker" msgstr "" @@ -6087,7 +6087,7 @@ msgstr "" msgid "Opens password reset form" msgstr "" -#: src/view/com/composer/select-language/PostLanguageSelect.tsx:103 +#: src/view/com/composer/select-language/PostLanguageSelect.tsx:129 msgid "Opens post language settings" msgstr "" @@ -6470,12 +6470,12 @@ msgctxt "description" msgid "Post" msgstr "" -#: src/view/com/composer/Composer.tsx:1076 +#: src/view/com/composer/Composer.tsx:1118 msgctxt "action" msgid "Post" msgstr "" -#: src/view/com/composer/Composer.tsx:1074 +#: src/view/com/composer/Composer.tsx:1116 msgctxt "action" msgid "Post All" msgstr "" @@ -6527,7 +6527,7 @@ msgid "Post Interaction Settings" msgstr "" #. Accessibility label for button that opens dialog to choose post language settings -#: src/view/com/composer/select-language/PostLanguageSelect.tsx:98 +#: src/view/com/composer/select-language/PostLanguageSelect.tsx:124 msgid "Post language selection" msgstr "" @@ -6640,7 +6640,7 @@ msgstr "" msgid "Privacy Policy" msgstr "" -#: src/view/com/composer/Composer.tsx:1840 +#: src/view/com/composer/Composer.tsx:1889 msgid "Processing video..." msgstr "" @@ -6666,7 +6666,7 @@ msgctxt "toast" msgid "Profile updated" msgstr "" -#: src/screens/Onboarding/StepFinished.tsx:541 +#: src/screens/Onboarding/StepFinished.tsx:539 msgid "Public" msgstr "" @@ -6679,22 +6679,22 @@ msgid "Public, sharable lists which can be used to drive feeds." msgstr "" #. Accessibility label for button to publish a single post -#: src/view/com/composer/Composer.tsx:1056 +#: src/view/com/composer/Composer.tsx:1098 msgid "Publish post" msgstr "" #. Accessibility label for button to publish multiple posts in a thread -#: src/view/com/composer/Composer.tsx:1049 +#: src/view/com/composer/Composer.tsx:1091 msgid "Publish posts" msgstr "" #. Accessibility label for button to publish multiple replies in a thread -#: src/view/com/composer/Composer.tsx:1034 +#: src/view/com/composer/Composer.tsx:1076 msgid "Publish replies" msgstr "" #. Accessibility label for button to publish a single reply -#: src/view/com/composer/Composer.tsx:1041 +#: src/view/com/composer/Composer.tsx:1083 msgid "Publish reply" msgstr "" @@ -6853,7 +6853,7 @@ msgstr "" msgid "Recent Searches" msgstr "" -#: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:210 +#: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:232 msgid "Recently used" msgstr "" @@ -6881,8 +6881,8 @@ msgstr "" #: src/components/dialogs/lists/ListAddRemoveUsersDialog.tsx:171 #: src/components/dialogs/MutedWords.tsx:443 -#: src/components/dialogs/StarterPackDialog.tsx:371 -#: src/components/dialogs/StarterPackDialog.tsx:377 +#: src/components/dialogs/StarterPackDialog.tsx:370 +#: src/components/dialogs/StarterPackDialog.tsx:376 #: src/components/FeedCard.tsx:343 #: src/components/StarterPack/Wizard/WizardListCard.tsx:104 #: src/components/StarterPack/Wizard/WizardListCard.tsx:111 @@ -7027,7 +7027,7 @@ msgstr "" msgid "Removed from saved posts" msgstr "" -#: src/components/dialogs/StarterPackDialog.tsx:277 +#: src/components/dialogs/StarterPackDialog.tsx:276 msgid "Removed from starter pack" msgstr "" @@ -7084,7 +7084,7 @@ msgstr "" msgid "Replies to this post are disabled." msgstr "" -#: src/view/com/composer/Composer.tsx:1072 +#: src/view/com/composer/Composer.tsx:1114 msgctxt "action" msgid "Reply" msgstr "" @@ -7501,7 +7501,7 @@ msgstr "" #: src/components/forms/SearchInput.tsx:34 #: src/components/forms/SearchInput.tsx:36 #: src/screens/Search/Shell.tsx:307 -#: src/screens/Search/Shell.tsx:464 +#: src/screens/Search/Shell.tsx:463 #: src/view/shell/bottom-bar/BottomBar.tsx:198 msgid "Search" msgstr "" @@ -7561,8 +7561,8 @@ msgstr "" msgid "Search is currently unavailable when logged out" msgstr "" -#: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:193 -#: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:194 +#: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:215 +#: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:216 msgid "Search languages" msgstr "" @@ -7644,7 +7644,7 @@ msgstr "" msgid "Select {0}" msgstr "" -#: src/view/com/composer/select-language/PostLanguageSelect.tsx:58 +#: src/view/com/composer/select-language/PostLanguageSelect.tsx:72 msgid "Select {langName}" msgstr "" @@ -7710,7 +7710,7 @@ msgid "Select language..." msgstr "" #: src/screens/Settings/LanguageSettings.tsx:178 -#: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:226 +#: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:248 msgid "Select languages" msgstr "" @@ -7722,7 +7722,7 @@ msgstr "" msgid "Select moderator" msgstr "" -#: src/view/com/composer/select-language/PostLanguageSelect.tsx:45 +#: src/view/com/composer/select-language/PostLanguageSelect.tsx:57 msgid "Select post language" msgstr "" @@ -7743,7 +7743,7 @@ msgstr "" msgid "Select the moderation service(s) to report to" msgstr "" -#: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:172 +#: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:194 msgid "Select up to 3 languages used in this post" msgstr "" @@ -7805,7 +7805,7 @@ msgstr "" msgid "Send message" msgstr "" -#: src/components/PostControls/ShareMenu/RecentChats.tsx:123 +#: src/components/PostControls/ShareMenu/RecentChats.tsx:122 msgid "Send post to {name}" msgstr "" @@ -8211,16 +8211,16 @@ msgstr "" msgid "Similar accounts" msgstr "" -#: src/screens/Onboarding/StepFinished.tsx:380 -#: src/screens/Onboarding/StepFinished.tsx:462 +#: src/screens/Onboarding/StepFinished.tsx:379 +#: src/screens/Onboarding/StepFinished.tsx:461 #: src/screens/Onboarding/StepInterests/index.tsx:240 #: src/screens/Onboarding/StepSuggestedAccounts/index.tsx:222 #: src/screens/StarterPack/Wizard/index.tsx:218 msgid "Skip" msgstr "" -#: src/screens/Onboarding/StepFinished.tsx:373 -#: src/screens/Onboarding/StepFinished.tsx:459 +#: src/screens/Onboarding/StepFinished.tsx:372 +#: src/screens/Onboarding/StepFinished.tsx:458 msgid "Skip introduction and start using your account" msgstr "" @@ -8344,7 +8344,7 @@ msgstr "" msgid "Sports" msgstr "" -#: src/components/PostControls/ShareMenu/RecentChats.tsx:208 +#: src/components/PostControls/ShareMenu/RecentChats.tsx:207 msgid "Start a conversation, and it will appear here." msgstr "" @@ -8754,6 +8754,10 @@ msgstr "" msgid "The open social network." msgstr "" +#: src/view/com/composer/select-language/SuggestedLanguage.tsx:119 +msgid "The post you're replying to was marked as being written in {suggestedLanguageName} by its author. Would you like to reply in <0>{suggestedLanguageName}?" +msgstr "" + #: src/view/screens/PrivacyPolicy.tsx:38 msgid "The Privacy Policy has been moved to <0/>" msgstr "" @@ -8884,7 +8888,7 @@ msgid "There was an issue. Please check your internet connection and try again." msgstr "" #: src/components/dialogs/GifSelect.tsx:258 -#: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:303 +#: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:325 #: src/view/com/util/ErrorBoundary.tsx:59 msgid "There was an unexpected issue in the application. Please let us know if this happened to you!" msgstr "" @@ -9065,7 +9069,7 @@ msgstr "" msgid "This post will be hidden from feeds and threads. This cannot be undone." msgstr "" -#: src/view/com/composer/Composer.tsx:475 +#: src/view/com/composer/Composer.tsx:514 msgid "This post's author has disabled quote posts." msgstr "" @@ -9493,7 +9497,7 @@ msgstr "" msgid "Unsubscribed from list" msgstr "" -#: src/view/com/composer/Composer.tsx:852 +#: src/view/com/composer/Composer.tsx:894 msgid "Unsupported video type: {mimeType}" msgstr "" @@ -9579,7 +9583,7 @@ msgstr "" msgid "Uploading link thumbnail..." msgstr "" -#: src/view/com/composer/Composer.tsx:1837 +#: src/view/com/composer/Composer.tsx:1886 msgid "Uploading video..." msgstr "" @@ -9837,7 +9841,7 @@ msgstr "" msgid "Video settings" msgstr "" -#: src/view/com/composer/Composer.tsx:1847 +#: src/view/com/composer/Composer.tsx:1896 msgid "Video uploaded" msgstr "" @@ -9853,7 +9857,7 @@ msgstr "" msgid "Videos must be less than 3 minutes long." msgstr "" -#: src/view/com/composer/Composer.tsx:546 +#: src/view/com/composer/Composer.tsx:585 msgctxt "Action to view the post the user just created" msgid "View" msgstr "" @@ -9906,8 +9910,8 @@ msgstr "" #: src/components/interstitials/TrendingVideos.tsx:198 #: src/components/interstitials/TrendingVideos.tsx:220 -#: src/screens/Search/modules/ExploreTrendingVideos.tsx:194 -#: src/screens/Search/modules/ExploreTrendingVideos.tsx:213 +#: src/screens/Search/modules/ExploreTrendingVideos.tsx:193 +#: src/screens/Search/modules/ExploreTrendingVideos.tsx:212 msgid "View more" msgstr "" @@ -9915,7 +9919,7 @@ msgstr "" msgid "View more trending videos" msgstr "" -#: src/view/com/composer/Composer.tsx:541 +#: src/view/com/composer/Composer.tsx:580 msgid "View post" msgstr "" @@ -10046,7 +10050,7 @@ msgstr "" msgid "We have sent another verification email to <0>{0}." msgstr "" -#: src/screens/Onboarding/StepFinished.tsx:533 +#: src/screens/Onboarding/StepFinished.tsx:531 msgid "We hope you have a wonderful time. Remember, Bluesky is:" msgstr "" @@ -10143,7 +10147,7 @@ msgstr "" msgid "We're sorry, but your search could not be completed. Please try again in a few minutes." msgstr "" -#: src/view/com/composer/Composer.tsx:472 +#: src/view/com/composer/Composer.tsx:511 msgid "We're sorry! The post you are replying to has been deleted." msgstr "" @@ -10194,7 +10198,7 @@ msgstr "" #: src/view/com/auth/SplashScreen.tsx:51 #: src/view/com/auth/SplashScreen.web.tsx:103 -#: src/view/com/composer/Composer.tsx:812 +#: src/view/com/composer/Composer.tsx:854 msgid "What's up?" msgstr "" @@ -10225,7 +10229,7 @@ msgid "Whoops!" msgstr "" #: src/components/interstitials/TrendingVideos.tsx:125 -#: src/screens/Search/modules/ExploreTrendingVideos.tsx:108 +#: src/screens/Search/modules/ExploreTrendingVideos.tsx:107 msgid "Whoops! Trending videos failed to load." msgstr "" @@ -10272,12 +10276,12 @@ msgstr "" msgid "Write a message" msgstr "" -#: src/view/com/composer/Composer.tsx:912 +#: src/view/com/composer/Composer.tsx:954 msgid "Write post" msgstr "" #: src/screens/PostThread/components/ThreadComposePrompt.tsx:90 -#: src/view/com/composer/Composer.tsx:810 +#: src/view/com/composer/Composer.tsx:852 msgid "Write your reply" msgstr "" @@ -10295,7 +10299,7 @@ msgstr "" msgid "www.mylivestream.tv" msgstr "" -#: src/view/com/composer/select-language/SuggestedLanguage.tsx:102 +#: src/view/com/composer/select-language/SuggestedLanguage.tsx:181 msgid "Yes" msgstr "" @@ -10508,7 +10512,7 @@ msgstr "" msgid "You have no lists." msgstr "" -#: src/components/dialogs/StarterPackDialog.tsx:101 +#: src/components/dialogs/StarterPackDialog.tsx:100 msgid "You have no starter packs." msgstr "" @@ -10516,7 +10520,7 @@ msgstr "" msgid "You have not blocked any accounts yet. To block an account, go to their profile and select \"Block account\" from the menu on their account." msgstr "" -#: src/view/screens/ModerationMutedAccounts.tsx:179 +#: src/view/screens/ModerationMutedAccounts.tsx:177 msgid "You have not muted any accounts yet. To mute an account, go to their profile and select \"Mute account\" from the menu on their account." msgstr "" @@ -10691,7 +10695,7 @@ msgstr "" msgid "You're in line" msgstr "" -#: src/screens/Onboarding/StepFinished.tsx:530 +#: src/screens/Onboarding/StepFinished.tsx:528 msgid "You're ready to go!" msgstr "" @@ -10855,15 +10859,15 @@ msgstr "" msgid "Your password must be at least 8 characters long." msgstr "" -#: src/view/com/composer/Composer.tsx:537 +#: src/view/com/composer/Composer.tsx:576 msgid "Your post was sent" msgstr "" -#: src/view/com/composer/Composer.tsx:534 +#: src/view/com/composer/Composer.tsx:573 msgid "Your posts were sent" msgstr "" -#: src/screens/Onboarding/StepFinished.tsx:545 +#: src/screens/Onboarding/StepFinished.tsx:543 msgid "Your posts, likes, and blocks are public. Mutes are private." msgstr "" @@ -10871,11 +10875,11 @@ msgstr "" msgid "Your preferred language" msgstr "" -#: src/screens/Onboarding/StepFinished.tsx:422 +#: src/screens/Onboarding/StepFinished.tsx:421 msgid "Your profile picture" msgstr "" -#: src/screens/Onboarding/StepFinished.tsx:350 +#: src/screens/Onboarding/StepFinished.tsx:349 msgid "Your profile picture surrounded by concentric circles of other users' profile pictures" msgstr "" @@ -10883,7 +10887,7 @@ msgstr "" msgid "Your profile, posts, feeds, and lists will no longer be visible to other Bluesky users. You can reactivate your account at any time by logging in." msgstr "" -#: src/view/com/composer/Composer.tsx:536 +#: src/view/com/composer/Composer.tsx:575 msgid "Your reply was sent" msgstr "" -- 2.51.2 From 120a124b3b3c2abe1c4ef04449b28a50c61fc779 Mon Sep 17 00:00:00 2001 From: serenity <98162476+NekoDrone@users.noreply.github.com> Date: Fri, 3 Oct 2025 15:34:38 +0800 Subject: [PATCH 20/20] fix: missed alf reversion --- src/components/Button.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Button.tsx b/src/components/Button.tsx index 050c01675..4a7171987 100644 --- a/src/components/Button.tsx +++ b/src/components/Button.tsx @@ -731,7 +731,7 @@ export function useSharedButtonTextStyles() { } else if (size === 'small') { baseStyles.push(a.text_sm, a.leading_snug, a.font_medium) } else if (size === 'tiny') { - baseStyles.push(a.text_xs, a.leading_snug, a.font_semi_bold) + baseStyles.push(a.text_xs, a.leading_snug, a.font_bold) } return StyleSheet.flatten(baseStyles)