This commit is contained in:
Samuel Newman
2025-02-12 18:41:39 +00:00
parent 7d694f605a
commit c10136083d
25 changed files with 198 additions and 135 deletions
+5 -5
View File
@@ -85,10 +85,10 @@
"@react-native-async-storage/async-storage": "1.23.1", "@react-native-async-storage/async-storage": "1.23.1",
"@react-native-menu/menu": "^1.1.7", "@react-native-menu/menu": "^1.1.7",
"@react-native-picker/picker": "2.10.2", "@react-native-picker/picker": "2.10.2",
"@react-navigation/bottom-tabs": "^6.5.20", "@react-navigation/bottom-tabs": "^7.2.0",
"@react-navigation/drawer": "^6.6.15", "@react-navigation/drawer": "^7.1.1",
"@react-navigation/native": "^6.1.17", "@react-navigation/native": "^7.0.14",
"@react-navigation/native-stack": "^6.9.26", "@react-navigation/native-stack": "^7.2.0",
"@sentry/react-native": "5.24.3", "@sentry/react-native": "5.24.3",
"@tanstack/query-async-storage-persister": "^5.25.0", "@tanstack/query-async-storage-persister": "^5.25.0",
"@tanstack/react-query": "^5.8.1", "@tanstack/react-query": "^5.8.1",
@@ -189,7 +189,7 @@
"react-native-reanimated": "3.17.0-nightly-20241211-17e89ca24", "react-native-reanimated": "3.17.0-nightly-20241211-17e89ca24",
"react-native-root-siblings": "^4.1.1", "react-native-root-siblings": "^4.1.1",
"react-native-safe-area-context": "4.14.0", "react-native-safe-area-context": "4.14.0",
"react-native-screens": "~4.3.0", "react-native-screens": "~4.6.0",
"react-native-svg": "^15.8.0", "react-native-svg": "^15.8.0",
"react-native-uitextview": "^1.4.0", "react-native-uitextview": "^1.4.0",
"react-native-url-polyfill": "^1.3.0", "react-native-url-polyfill": "^1.3.0",
+2 -2
View File
@@ -349,7 +349,7 @@ export function ProfileGrid({
<View style={[a.flex_row, a.justify_end, a.align_center, a.gap_md]}> <View style={[a.flex_row, a.justify_end, a.align_center, a.gap_md]}>
<InlineLinkText <InlineLinkText
label={_(msg`Browse more suggestions`)} label={_(msg`Browse more suggestions`)}
to="/search" screen="Search"
style={[t.atoms.text_contrast_medium]}> style={[t.atoms.text_contrast_medium]}>
<Trans>Browse more suggestions</Trans> <Trans>Browse more suggestions</Trans>
</InlineLinkText> </InlineLinkText>
@@ -486,7 +486,7 @@ export function SuggestedFeeds() {
]}> ]}>
<InlineLinkText <InlineLinkText
label={_(msg`Browse more suggestions`)} label={_(msg`Browse more suggestions`)}
to="/search" screen="Search"
style={[t.atoms.text_contrast_medium]}> style={[t.atoms.text_contrast_medium]}>
<Trans>Browse more suggestions</Trans> <Trans>Browse more suggestions</Trans>
</InlineLinkText> </InlineLinkText>
+65 -16
View File
@@ -28,10 +28,29 @@ import {router} from '#/routes'
*/ */
export {useButtonContext as useLinkContext} from '#/components/Button' export {useButtonContext as useLinkContext} from '#/components/Button'
type BaseLinkProps = Pick< /**
Parameters<typeof useLinkProps<AllNavigatorParams>>[0], * Copied from react-nativgation's LinkProps, but with `action` removed. Removing action breaks
'to' * the type, causing screen and params to lose their 'connection'
> & { */
export type CustomLinkProps<
ParamList = AllNavigatorParams,
RouteName extends keyof ParamList = keyof ParamList,
> =
| ({
href?: string
} & {
[Screen in keyof ParamList]: undefined extends ParamList[Screen]
? {screen: Screen; params?: ParamList[Screen]}
: {screen: Screen; params: ParamList[Screen]}
}[RouteName])
| {
href: string
screen?: undefined
params?: undefined
}
type BaseLinkProps = CustomLinkProps & {
testID?: string testID?: string
/** /**
@@ -71,8 +90,18 @@ type BaseLinkProps = Pick<
shareOnLongPress?: boolean shareOnLongPress?: boolean
} }
function test({screen, params}: CustomLinkProps) {
if (screen === 'Search') {
params.q
// @ts-expect-error hiasuhdas
params.did
}
}
export function useLink({ export function useLink({
to, screen,
params,
href: hrefProp,
displayText, displayText,
action = 'push', action = 'push',
disableMismatchWarning, disableMismatchWarning,
@@ -85,10 +114,22 @@ export function useLink({
overridePresentation?: boolean overridePresentation?: boolean
}) { }) {
const navigation = useNavigationDeduped() const navigation = useNavigationDeduped()
const {href} = useLinkProps<AllNavigatorParams>({ const safeHrefProp = hrefProp
to: ? convertBskyAppUrlIfNeeded(sanitizeUrl(hrefProp))
typeof to === 'string' ? convertBskyAppUrlIfNeeded(sanitizeUrl(to)) : to, : undefined
let {href} = useLinkProps<AllNavigatorParams>({
screen: screen!,
params,
href: safeHrefProp,
}) })
if (!href) {
if (safeHrefProp) {
href = safeHrefProp
} else {
throw new Error('No href provided')
}
}
const isExternal = isExternalUrl(href) const isExternal = isExternalUrl(href)
const {openModal, closeModal} = useModalControls() const {openModal, closeModal} = useModalControls()
const openLink = useOpenLink() const openLink = useOpenLink()
@@ -97,7 +138,7 @@ export function useLink({
(e: GestureResponderEvent) => { (e: GestureResponderEvent) => {
const exitEarlyIfFalse = outerOnPress?.(e) const exitEarlyIfFalse = outerOnPress?.(e)
if (exitEarlyIfFalse === false) return if (exitEarlyIfFalse === false || e.defaultPrevented) return
const requiresWarning = Boolean( const requiresWarning = Boolean(
!disableMismatchWarning && !disableMismatchWarning &&
@@ -214,7 +255,9 @@ export type LinkProps = Omit<BaseLinkProps, 'disableMismatchWarning'> &
*/ */
export function Link({ export function Link({
children, children,
to, screen,
params,
href: hrefProp,
action = 'push', action = 'push',
onPress: outerOnPress, onPress: outerOnPress,
onLongPress: outerOnLongPress, onLongPress: outerOnLongPress,
@@ -222,7 +265,9 @@ export function Link({
...rest ...rest
}: LinkProps) { }: LinkProps) {
const {href, isExternal, onPress, onLongPress} = useLink({ const {href, isExternal, onPress, onLongPress} = useLink({
to, screen,
params,
href: hrefProp,
displayText: typeof children === 'string' ? children : '', displayText: typeof children === 'string' ? children : '',
action, action,
onPress: outerOnPress, onPress: outerOnPress,
@@ -267,7 +312,9 @@ export type InlineLinkProps = React.PropsWithChildren<
export function InlineLinkText({ export function InlineLinkText({
children, children,
to, screen,
params,
href: hrefProp,
action = 'push', action = 'push',
disableMismatchWarning, disableMismatchWarning,
style, style,
@@ -284,7 +331,9 @@ export function InlineLinkText({
const t = useTheme() const t = useTheme()
const stringChildren = typeof children === 'string' const stringChildren = typeof children === 'string'
const {href, isExternal, onPress, onLongPress} = useLink({ const {href, isExternal, onPress, onLongPress} = useLink({
to, screen,
params,
href: hrefProp,
displayText: stringChildren ? children : '', displayText: stringChildren ? children : '',
action, action,
disableMismatchWarning, disableMismatchWarning,
@@ -344,12 +393,12 @@ export function InlineLinkText({
export function WebOnlyInlineLinkText({ export function WebOnlyInlineLinkText({
children, children,
to, href,
onPress, onPress,
...props ...props
}: Omit<InlineLinkProps, 'onLongPress'>) { }: Omit<InlineLinkProps, 'onLongPress'>) {
return isWeb ? ( return isWeb ? (
<InlineLinkText {...props} to={to} onPress={onPress}> <InlineLinkText {...props} href={href} onPress={onPress}>
{children} {children}
</InlineLinkText> </InlineLinkText>
) : ( ) : (
@@ -366,7 +415,7 @@ export function WebOnlyInlineLinkText({
export function createStaticClick( export function createStaticClick(
onPressHandler: Exclude<BaseLinkProps['onPress'], undefined>, onPressHandler: Exclude<BaseLinkProps['onPress'], undefined>,
): { ): {
to: BaseLinkProps['to'] to: BaseLinkProps['href']
onPress: Exclude<BaseLinkProps['onPress'], undefined> onPress: Exclude<BaseLinkProps['onPress'], undefined>
} { } {
return { return {
+2 -2
View File
@@ -158,7 +158,7 @@ export function Inner({
</Text> </Text>
?{' '} ?{' '}
<InlineLinkText <InlineLinkText
to="#" href="#"
label={_(msg`Change email address`)} label={_(msg`Change email address`)}
style={[a.text_md, a.leading_snug]} style={[a.text_md, a.leading_snug]}
onPress={e => { onPress={e => {
@@ -183,7 +183,7 @@ export function Inner({
to verify it's you. to verify it's you.
</Trans>{' '} </Trans>{' '}
<InlineLinkText <InlineLinkText
to="#" href="#"
label={_(msg`Change email address`)} label={_(msg`Change email address`)}
style={[a.text_md, a.leading_snug]} style={[a.text_md, a.leading_snug]}
onPress={e => { onPress={e => {
+1 -1
View File
@@ -239,7 +239,7 @@ let MessageItemMetadata = ({
&middot;{' '} &middot;{' '}
<InlineLinkText <InlineLinkText
label={_(msg`Click to retry failed message`)} label={_(msg`Click to retry failed message`)}
to="#" href="#"
onPress={handleRetry} onPress={handleRetry}
style={[a.text_xs]}> style={[a.text_xs]}>
{_(msg`Retry`)} {_(msg`Retry`)}
@@ -245,7 +245,7 @@ export function LabelerLabelPreference({
Configured in{' '} Configured in{' '}
<InlineLinkText <InlineLinkText
label={_(msg`moderation settings`)} label={_(msg`moderation settings`)}
to="/moderation" screen="Moderation"
style={a.text_sm}> style={a.text_sm}>
moderation settings moderation settings
</InlineLinkText> </InlineLinkText>
+25 -19
View File
@@ -105,25 +105,27 @@ export type FlatNavigatorParams = CommonNavigatorParams & {
Messages: {pushToConversation?: string; animation?: 'push' | 'pop'} Messages: {pushToConversation?: string; animation?: 'push' | 'pop'}
} }
export type AllNavigatorParams = CommonNavigatorParams & { export type AllNavigatorParams = Prettify<
HomeTab: undefined CommonNavigatorParams & {
Home: undefined HomeTab: undefined
SearchTab: undefined Home: undefined
Search: {q?: string} SearchTab: undefined
Feeds: undefined Search: {q?: string}
NotificationsTab: undefined Feeds: undefined
Notifications: undefined NotificationsTab: undefined
MyProfileTab: undefined Notifications: undefined
Hashtag: {tag: string; author?: string} MyProfileTab: undefined
Topic: {topic: string} Hashtag: {tag: string; author?: string}
MessagesTab: undefined Topic: {topic: string}
Messages: {animation?: 'push' | 'pop'} MessagesTab: undefined
Start: {name: string; rkey: string} Messages: {animation?: 'push' | 'pop'}
StarterPack: {name: string; rkey: string; new?: boolean} Start: {name: string; rkey: string}
StarterPackShort: {code: string} StarterPack: {name: string; rkey: string; new?: boolean}
StarterPackWizard: undefined StarterPackShort: {code: string}
StarterPackEdit: {rkey?: string} StarterPackWizard: undefined
} StarterPackEdit: {rkey?: string}
}
>
// NOTE // NOTE
// this isn't strictly correct but it should be close enough // this isn't strictly correct but it should be close enough
@@ -141,3 +143,7 @@ export type Route = {
match: (path: string) => MatchResult | undefined match: (path: string) => MatchResult | undefined
build: (params: RouteParams) => string build: (params: RouteParams) => string
} }
type Prettify<T> = {
[K in keyof T]: T[K]
} & {}
+1 -1
View File
@@ -37,7 +37,7 @@ export function NoFollowingFeed() {
<Trans> <Trans>
Looks like you're missing a following feed.{' '} Looks like you're missing a following feed.{' '}
<InlineLinkText <InlineLinkText
to="/" href="#"
label={_(msg`Add the default feed of only people you follow`)} label={_(msg`Add the default feed of only people you follow`)}
onPress={addRecommendedFeeds} onPress={addRecommendedFeeds}
style={[a.leading_snug]}> style={[a.leading_snug]}>
+1 -1
View File
@@ -101,7 +101,7 @@ export function NoFeedsPinned({
<Link <Link
label={_(msg`Browse other feeds`)} label={_(msg`Browse other feeds`)}
to="/feeds" screen="Feeds"
size="large" size="large"
variant="solid" variant="solid"
color="secondary"> color="secondary">
@@ -44,7 +44,7 @@ export function MessageListError({item}: {item: ConvoItem & {type: 'error'}}) {
{description} &middot;{' '} {description} &middot;{' '}
{item.retry && ( {item.retry && (
<InlineLinkText <InlineLinkText
to="#" href="#"
label={help} label={help}
onPress={e => { onPress={e => {
e.preventDefault() e.preventDefault()
+5 -5
View File
@@ -203,7 +203,7 @@ export function ModerationScreenInner({
<Link <Link
label={_(msg`View your default post interaction settings`)} label={_(msg`View your default post interaction settings`)}
testID="interactionSettingsBtn" testID="interactionSettingsBtn"
to="/moderation/interaction-settings"> screen="ModerationInteractionSettings">
{state => ( {state => (
<SubItem <SubItem
title={_(msg`Interaction settings`)} title={_(msg`Interaction settings`)}
@@ -233,7 +233,7 @@ export function ModerationScreenInner({
<Link <Link
label={_(msg`View your moderation lists`)} label={_(msg`View your moderation lists`)}
testID="moderationlistsBtn" testID="moderationlistsBtn"
to="/moderation/modlists"> screen="ModerationModlists">
{state => ( {state => (
<SubItem <SubItem
title={_(msg`Moderation lists`)} title={_(msg`Moderation lists`)}
@@ -248,7 +248,7 @@ export function ModerationScreenInner({
<Link <Link
label={_(msg`View your muted accounts`)} label={_(msg`View your muted accounts`)}
testID="mutedAccountsBtn" testID="mutedAccountsBtn"
to="/moderation/muted-accounts"> screen="ModerationMutedAccounts">
{state => ( {state => (
<SubItem <SubItem
title={_(msg`Muted accounts`)} title={_(msg`Muted accounts`)}
@@ -263,7 +263,7 @@ export function ModerationScreenInner({
<Link <Link
label={_(msg`View your blocked accounts`)} label={_(msg`View your blocked accounts`)}
testID="blockedAccountsBtn" testID="blockedAccountsBtn"
to="/moderation/blocked-accounts"> screen="ModerationBlockedAccounts">
{state => ( {state => (
<SubItem <SubItem
title={_(msg`Blocked accounts`)} title={_(msg`Blocked accounts`)}
@@ -356,7 +356,7 @@ export function ModerationScreenInner({
Adult content can only be enabled via the Web at{' '} Adult content can only be enabled via the Web at{' '}
<InlineLinkText <InlineLinkText
label={_(msg`The Bluesky web application`)} label={_(msg`The Bluesky web application`)}
to="" href="#"
onPress={evt => { onPress={evt => {
evt.preventDefault() evt.preventDefault()
Linking.openURL('https://bsky.app/') Linking.openURL('https://bsky.app/')
+4 -4
View File
@@ -33,7 +33,7 @@ export function AboutSettingsScreen({}: Props) {
<Layout.Content> <Layout.Content>
<SettingsList.Container> <SettingsList.Container>
<SettingsList.LinkItem <SettingsList.LinkItem
to="https://bsky.social/about/support/tos" href="https://bsky.social/about/support/tos"
label={_(msg`Terms of Service`)}> label={_(msg`Terms of Service`)}>
<SettingsList.ItemIcon icon={NewspaperIcon} /> <SettingsList.ItemIcon icon={NewspaperIcon} />
<SettingsList.ItemText> <SettingsList.ItemText>
@@ -41,7 +41,7 @@ export function AboutSettingsScreen({}: Props) {
</SettingsList.ItemText> </SettingsList.ItemText>
</SettingsList.LinkItem> </SettingsList.LinkItem>
<SettingsList.LinkItem <SettingsList.LinkItem
to="https://bsky.social/about/support/privacy-policy" href="https://bsky.social/about/support/privacy-policy"
label={_(msg`Privacy Policy`)}> label={_(msg`Privacy Policy`)}>
<SettingsList.ItemIcon icon={NewspaperIcon} /> <SettingsList.ItemIcon icon={NewspaperIcon} />
<SettingsList.ItemText> <SettingsList.ItemText>
@@ -49,7 +49,7 @@ export function AboutSettingsScreen({}: Props) {
</SettingsList.ItemText> </SettingsList.ItemText>
</SettingsList.LinkItem> </SettingsList.LinkItem>
<SettingsList.LinkItem <SettingsList.LinkItem
to={STATUS_PAGE_URL} href={STATUS_PAGE_URL}
label={_(msg`Status Page`)}> label={_(msg`Status Page`)}>
<SettingsList.ItemIcon icon={GlobeIcon} /> <SettingsList.ItemIcon icon={GlobeIcon} />
<SettingsList.ItemText> <SettingsList.ItemText>
@@ -57,7 +57,7 @@ export function AboutSettingsScreen({}: Props) {
</SettingsList.ItemText> </SettingsList.ItemText>
</SettingsList.LinkItem> </SettingsList.LinkItem>
<SettingsList.Divider /> <SettingsList.Divider />
<SettingsList.LinkItem to="/sys/log" label={_(msg`System log`)}> <SettingsList.LinkItem screen="Log" label={_(msg`System log`)}>
<SettingsList.ItemIcon icon={CodeLinesIcon} /> <SettingsList.ItemIcon icon={CodeLinesIcon} />
<SettingsList.ItemText> <SettingsList.ItemText>
<Trans>System log</Trans> <Trans>System log</Trans>
@@ -105,7 +105,7 @@ export function AccessibilitySettingsScreen({}: Props) {
<Trans> <Trans>
Autoplay options have moved to the{' '} Autoplay options have moved to the{' '}
<InlineLinkText <InlineLinkText
to="/settings/content-and-media" screen="ContentAndMediaSettings"
label={_(msg`Content and media`)}> label={_(msg`Content and media`)}>
Content and Media settings Content and Media settings
</InlineLinkText> </InlineLinkText>
@@ -14,7 +14,7 @@ export function SettingsListItem() {
return ( return (
<SettingsList.LinkItem <SettingsList.LinkItem
to="/settings/app-icon" screen="AppIconSettings"
label={_(msg`App Icon`)} label={_(msg`App Icon`)}
contentContainerStyle={[a.align_start]}> contentContainerStyle={[a.align_start]}>
<SettingsList.ItemIcon icon={Shapes} /> <SettingsList.ItemIcon icon={Shapes} />
@@ -55,7 +55,7 @@ export function ContentAndMediaSettingsScreen({}: Props) {
<Layout.Content> <Layout.Content>
<SettingsList.Container> <SettingsList.Container>
<SettingsList.LinkItem <SettingsList.LinkItem
to="/settings/saved-feeds" screen="SavedFeeds"
label={_(msg`Manage saved feeds`)}> label={_(msg`Manage saved feeds`)}>
<SettingsList.ItemIcon icon={HashtagIcon} /> <SettingsList.ItemIcon icon={HashtagIcon} />
<SettingsList.ItemText> <SettingsList.ItemText>
@@ -63,7 +63,7 @@ export function ContentAndMediaSettingsScreen({}: Props) {
</SettingsList.ItemText> </SettingsList.ItemText>
</SettingsList.LinkItem> </SettingsList.LinkItem>
<SettingsList.LinkItem <SettingsList.LinkItem
to="/settings/threads" screen="PreferencesThreads"
label={_(msg`Thread preferences`)}> label={_(msg`Thread preferences`)}>
<SettingsList.ItemIcon icon={BubblesIcon} /> <SettingsList.ItemIcon icon={BubblesIcon} />
<SettingsList.ItemText> <SettingsList.ItemText>
@@ -71,7 +71,7 @@ export function ContentAndMediaSettingsScreen({}: Props) {
</SettingsList.ItemText> </SettingsList.ItemText>
</SettingsList.LinkItem> </SettingsList.LinkItem>
<SettingsList.LinkItem <SettingsList.LinkItem
to="/settings/following-feed" screen="PreferencesFollowingFeed"
label={_(msg`Following feed preferences`)}> label={_(msg`Following feed preferences`)}>
<SettingsList.ItemIcon icon={HomeIcon} /> <SettingsList.ItemIcon icon={HomeIcon} />
<SettingsList.ItemText> <SettingsList.ItemText>
@@ -79,7 +79,7 @@ export function ContentAndMediaSettingsScreen({}: Props) {
</SettingsList.ItemText> </SettingsList.ItemText>
</SettingsList.LinkItem> </SettingsList.LinkItem>
<SettingsList.LinkItem <SettingsList.LinkItem
to="/settings/external-embeds" screen="PreferencesExternalEmbeds"
label={_(msg`External media`)}> label={_(msg`External media`)}>
<SettingsList.ItemIcon icon={MacintoshIcon} /> <SettingsList.ItemIcon icon={MacintoshIcon} />
<SettingsList.ItemText> <SettingsList.ItemText>
@@ -59,7 +59,7 @@ export function PrivacyAndSecuritySettingsScreen({}: Props) {
<Email2FAToggle /> <Email2FAToggle />
</SettingsList.Item> </SettingsList.Item>
<SettingsList.LinkItem <SettingsList.LinkItem
to="/settings/app-passwords" screen="AppPasswords"
label={_(msg`App passwords`)}> label={_(msg`App passwords`)}>
<SettingsList.ItemIcon icon={KeyIcon} /> <SettingsList.ItemIcon icon={KeyIcon} />
<SettingsList.ItemText> <SettingsList.ItemText>
@@ -98,7 +98,7 @@ export function PrivacyAndSecuritySettingsScreen({}: Props) {
label={_( label={_(
msg`Learn more about what is public on Bluesky.`, msg`Learn more about what is public on Bluesky.`,
)} )}
to="https://blueskyweb.zendesk.com/hc/en-us/articles/15835264007693-Data-Privacy"> href="https://blueskyweb.zendesk.com/hc/en-us/articles/15835264007693-Data-Privacy">
<Trans>Learn more about what is public on Bluesky.</Trans> <Trans>Learn more about what is public on Bluesky.</Trans>
</InlineLinkText> </InlineLinkText>
</Admonition.Text> </Admonition.Text>
+10 -8
View File
@@ -150,28 +150,30 @@ export function SettingsScreen({}: Props) {
<AddAccountRow /> <AddAccountRow />
)} )}
<SettingsList.Divider /> <SettingsList.Divider />
<SettingsList.LinkItem to="/settings/account" label={_(msg`Account`)}> <SettingsList.LinkItem
screen="AccountSettings"
label={_(msg`Account`)}>
<SettingsList.ItemIcon icon={PersonIcon} /> <SettingsList.ItemIcon icon={PersonIcon} />
<SettingsList.ItemText> <SettingsList.ItemText>
<Trans>Account</Trans> <Trans>Account</Trans>
</SettingsList.ItemText> </SettingsList.ItemText>
</SettingsList.LinkItem> </SettingsList.LinkItem>
<SettingsList.LinkItem <SettingsList.LinkItem
to="/settings/privacy-and-security" screen="PrivacyAndSecuritySettings"
label={_(msg`Privacy and security`)}> label={_(msg`Privacy and security`)}>
<SettingsList.ItemIcon icon={LockIcon} /> <SettingsList.ItemIcon icon={LockIcon} />
<SettingsList.ItemText> <SettingsList.ItemText>
<Trans>Privacy and security</Trans> <Trans>Privacy and security</Trans>
</SettingsList.ItemText> </SettingsList.ItemText>
</SettingsList.LinkItem> </SettingsList.LinkItem>
<SettingsList.LinkItem to="/moderation" label={_(msg`Moderation`)}> <SettingsList.LinkItem screen="Moderation" label={_(msg`Moderation`)}>
<SettingsList.ItemIcon icon={HandIcon} /> <SettingsList.ItemIcon icon={HandIcon} />
<SettingsList.ItemText> <SettingsList.ItemText>
<Trans>Moderation</Trans> <Trans>Moderation</Trans>
</SettingsList.ItemText> </SettingsList.ItemText>
</SettingsList.LinkItem> </SettingsList.LinkItem>
<SettingsList.LinkItem <SettingsList.LinkItem
to="/settings/content-and-media" screen="ContentAndMediaSettings"
label={_(msg`Content and media`)}> label={_(msg`Content and media`)}>
<SettingsList.ItemIcon icon={WindowIcon} /> <SettingsList.ItemIcon icon={WindowIcon} />
<SettingsList.ItemText> <SettingsList.ItemText>
@@ -179,7 +181,7 @@ export function SettingsScreen({}: Props) {
</SettingsList.ItemText> </SettingsList.ItemText>
</SettingsList.LinkItem> </SettingsList.LinkItem>
<SettingsList.LinkItem <SettingsList.LinkItem
to="/settings/appearance" screen="AppearanceSettings"
label={_(msg`Appearance`)}> label={_(msg`Appearance`)}>
<SettingsList.ItemIcon icon={PaintRollerIcon} /> <SettingsList.ItemIcon icon={PaintRollerIcon} />
<SettingsList.ItemText> <SettingsList.ItemText>
@@ -187,7 +189,7 @@ export function SettingsScreen({}: Props) {
</SettingsList.ItemText> </SettingsList.ItemText>
</SettingsList.LinkItem> </SettingsList.LinkItem>
<SettingsList.LinkItem <SettingsList.LinkItem
to="/settings/accessibility" screen="AccessibilitySettings"
label={_(msg`Accessibility`)}> label={_(msg`Accessibility`)}>
<SettingsList.ItemIcon icon={AccessibilityIcon} /> <SettingsList.ItemIcon icon={AccessibilityIcon} />
<SettingsList.ItemText> <SettingsList.ItemText>
@@ -195,7 +197,7 @@ export function SettingsScreen({}: Props) {
</SettingsList.ItemText> </SettingsList.ItemText>
</SettingsList.LinkItem> </SettingsList.LinkItem>
<SettingsList.LinkItem <SettingsList.LinkItem
to="/settings/language" screen="LanguageSettings"
label={_(msg`Languages`)}> label={_(msg`Languages`)}>
<SettingsList.ItemIcon icon={EarthIcon} /> <SettingsList.ItemIcon icon={EarthIcon} />
<SettingsList.ItemText> <SettingsList.ItemText>
@@ -212,7 +214,7 @@ export function SettingsScreen({}: Props) {
</SettingsList.ItemText> </SettingsList.ItemText>
<SettingsList.Chevron /> <SettingsList.Chevron />
</SettingsList.PressableItem> </SettingsList.PressableItem>
<SettingsList.LinkItem to="/settings/about" label={_(msg`About`)}> <SettingsList.LinkItem screen="AboutSettings" label={_(msg`About`)}>
<SettingsList.ItemIcon icon={BubbleInfoIcon} /> <SettingsList.ItemIcon icon={BubbleInfoIcon} />
<SettingsList.ItemText> <SettingsList.ItemText>
<Trans>About</Trans> <Trans>About</Trans>
@@ -250,7 +250,7 @@ function ProvidedHandlePage({
lets you self-verify your identity.{' '} lets you self-verify your identity.{' '}
<InlineLinkText <InlineLinkText
label={_(msg`learn more`)} label={_(msg`learn more`)}
to="https://bsky.social/about/blog/4-28-2023-domain-handle-tutorial" href="https://bsky.social/about/blog/4-28-2023-domain-handle-tutorial"
style={[a.font_bold]} style={[a.font_bold]}
disableMismatchWarning> disableMismatchWarning>
Learn more here. Learn more here.
@@ -96,7 +96,7 @@ export function ExportCarDialog({
exports in{' '} exports in{' '}
<InlineLinkText <InlineLinkText
label={_(msg`View blogpost for more details`)} label={_(msg`View blogpost for more details`)}
to="https://docs.bsky.app/blog/repo-export" href="https://docs.bsky.app/blog/repo-export"
style={[a.text_sm]}> style={[a.text_sm]}>
this blogpost this blogpost
</InlineLinkText> </InlineLinkText>
+1 -1
View File
@@ -215,7 +215,7 @@ export function Takendown() {
Your account was found to be in violation of the{' '} Your account was found to be in violation of the{' '}
<InlineLinkText <InlineLinkText
label={_(msg`Bluesky Social Terms of Service`)} label={_(msg`Bluesky Social Terms of Service`)}
to="https://bsky.social/about/support/tos" href="https://bsky.social/about/support/tos"
style={[a.text_md, a.leading_normal]} style={[a.text_md, a.leading_normal]}
overridePresentation> overridePresentation>
Bluesky Social Terms of Service Bluesky Social Terms of Service
+2 -2
View File
@@ -164,12 +164,12 @@ function Footer() {
]}> ]}>
<InlineLinkText <InlineLinkText
label={_(msg`Learn more about Bluesky`)} label={_(msg`Learn more about Bluesky`)}
to="https://bsky.social"> href="https://bsky.social/about">
<Trans>Business</Trans> <Trans>Business</Trans>
</InlineLinkText> </InlineLinkText>
<InlineLinkText <InlineLinkText
label={_(msg`Read the Bluesky blog`)} label={_(msg`Read the Bluesky blog`)}
to="https://bsky.social/about/blog"> href="https://bsky.social/about/blog">
<Trans>Blog</Trans> <Trans>Blog</Trans>
</InlineLinkText> </InlineLinkText>
<InlineLinkText <InlineLinkText
+1 -1
View File
@@ -51,7 +51,7 @@ function HomeHeaderLayoutDesktopAndTablet({
<Logo width={kawaii ? 60 : 28} /> <Logo width={kawaii ? 60 : 28} />
</View> </View>
<Link <Link
to="/feeds" screen="Feeds"
hitSlop={10} hitSlop={10}
label={_(msg`View your feeds and explore more`)} label={_(msg`View your feeds and explore more`)}
size="small" size="small"
+1 -1
View File
@@ -72,7 +72,7 @@ export function HomeHeaderLayoutMobile({
{hasSession && ( {hasSession && (
<Link <Link
testID="viewHeaderHomeFeedPrefsBtn" testID="viewHeaderHomeFeedPrefsBtn"
to="/feeds" screen="Feeds"
hitSlop={HITSLOP_10} hitSlop={HITSLOP_10}
label={_(msg`View your feeds and explore more`)} label={_(msg`View your feeds and explore more`)}
size="small" size="small"
+2
View File
@@ -101,6 +101,8 @@ export function FeedShutdownMsg({feedUri}: {feedUri: string}) {
<InlineLinkText <InlineLinkText
label={_(msg`The Discover feed`)} label={_(msg`The Discover feed`)}
to="/profile/bsky.app/feed/whats-hot" to="/profile/bsky.app/feed/whats-hot"
screen="ProfileFeed"
params={{}}
style={[a.text_md]}> style={[a.text_md]}>
Discover Discover
</InlineLinkText>{' '} </InlineLinkText>{' '}
+58 -54
View File
@@ -5886,65 +5886,69 @@
invariant "^2.2.4" invariant "^2.2.4"
nullthrows "^1.1.1" nullthrows "^1.1.1"
"@react-navigation/bottom-tabs@^6.5.20": "@react-navigation/bottom-tabs@^7.2.0":
version "6.5.20" version "7.2.0"
resolved "https://registry.yarnpkg.com/@react-navigation/bottom-tabs/-/bottom-tabs-6.5.20.tgz#5335e75b02c527ef0569bd97d4f9185d65616e49" resolved "https://registry.yarnpkg.com/@react-navigation/bottom-tabs/-/bottom-tabs-7.2.0.tgz#5b336b823226647a263b4fe743655462796b6aaf"
integrity sha512-ow6Z06iS4VqBO8d7FP+HsGjJLWt2xTWIvuWjpoCvsM/uQXzCRDIjBv9HaKcXbF0yTW7IMir0oDAbU5PFzEDdgA== integrity sha512-1LxjgnbPyFINyf9Qr5d1YE0pYhuJayg5TCIIFQmbcX4PRhX7FKUXV7cX8OzrKXEdZi/UE/VNXugtozPAR9zgvA==
dependencies: dependencies:
"@react-navigation/elements" "^1.3.30" "@react-navigation/elements" "^2.2.5"
color "^4.2.3" color "^4.2.3"
warn-once "^0.1.0"
"@react-navigation/core@^6.4.16": "@react-navigation/core@^7.3.1":
version "6.4.16" version "7.3.1"
resolved "https://registry.yarnpkg.com/@react-navigation/core/-/core-6.4.16.tgz#f9369a134805174536b9aa0f0f483b930511caf9" resolved "https://registry.yarnpkg.com/@react-navigation/core/-/core-7.3.1.tgz#c6d4857fa2dd321d12ca87e200478c38c420f157"
integrity sha512-UDTJBsHxnzgFETR3ZxhctP+RWr4SkyeZpbhpkQoIGOuwSCkt1SE0qjU48/u6r6w6XlX8OqVudn1Ab0QFXTHxuQ== integrity sha512-S3KCGvNsoqVk8ErAtQI2EAhg9185lahF5OY01ofrrD4Ij/uk3QEHHjoGQhR5l5DXSCSKr1JbMQA7MEKMsBiWZA==
dependencies: dependencies:
"@react-navigation/routers" "^6.1.9" "@react-navigation/routers" "^7.1.2"
escape-string-regexp "^4.0.0" escape-string-regexp "^4.0.0"
nanoid "^3.1.23" nanoid "3.3.8"
query-string "^7.1.3" query-string "^7.1.3"
react-is "^16.13.0" react-is "^18.2.0"
use-latest-callback "^0.1.9" use-latest-callback "^0.2.1"
use-sync-external-store "^1.2.2"
"@react-navigation/drawer@^6.6.15": "@react-navigation/drawer@^7.1.1":
version "6.6.15" version "7.1.1"
resolved "https://registry.yarnpkg.com/@react-navigation/drawer/-/drawer-6.6.15.tgz#fcedba68f735103dbc035911f5959ce926081d62" resolved "https://registry.yarnpkg.com/@react-navigation/drawer/-/drawer-7.1.1.tgz#4e0235ada1a9dac35e97f1492f7cf4cda98d19b0"
integrity sha512-GLkFQNxjtmxB/qXSHmu1DfoB89jCzW64tmX68iPndth+9U+0IP27GcCCaMZxQfwj+nI8Kn2zlTlXAZDIIHE+DQ== integrity sha512-34UqRS5OLFaNXPs5ocz3Du9c7em0P7fFMPYCZn/MxadDzQ4Mn/74pmJczmiyvyvz8vcWsNRbZ3Qswm0Dv6z60w==
dependencies: dependencies:
"@react-navigation/elements" "^1.3.30" "@react-navigation/elements" "^2.2.5"
color "^4.2.3" color "^4.2.3"
warn-once "^0.1.0" react-native-drawer-layout "^4.1.1"
use-latest-callback "^0.2.1"
"@react-navigation/elements@^1.3.30": "@react-navigation/elements@^2.2.5":
version "1.3.30" version "2.2.5"
resolved "https://registry.yarnpkg.com/@react-navigation/elements/-/elements-1.3.30.tgz#a81371f599af1070b12014f05d6c09b1a611fd9a" resolved "https://registry.yarnpkg.com/@react-navigation/elements/-/elements-2.2.5.tgz#0e2ca76e2003e96b417a3d7c2829bf1afd69193f"
integrity sha512-plhc8UvCZs0UkV+sI+3bisIyn78wz9O/BiWZXpounu72k/R/Sj5PuZYFJ1fi6psvriUveMCGh4LeZckAZu2qiQ== integrity sha512-sDhE+W14P7MNWLMxXg1MEVXwkLUpMZJGflE6nQNzLmolJQIHgcia0Mrm8uRa3bQovhxYu1UzEojLZ+caoZt7Fg==
"@react-navigation/native-stack@^6.9.26":
version "6.9.26"
resolved "https://registry.yarnpkg.com/@react-navigation/native-stack/-/native-stack-6.9.26.tgz#90facf7783c9927f094bc9f01c613af75b6c241e"
integrity sha512-++dueQ+FDj2XkZ902DVrK79ub1vp19nSdAZWxKRgd6+Bc0Niiesua6rMCqymYOVaYh+dagwkA9r00bpt/U5WLw==
dependencies: dependencies:
"@react-navigation/elements" "^1.3.30" color "^4.2.3"
warn-once "^0.1.0"
"@react-navigation/native@^6.1.17": "@react-navigation/native-stack@^7.2.0":
version "6.1.17" version "7.2.0"
resolved "https://registry.yarnpkg.com/@react-navigation/native/-/native-6.1.17.tgz#439f15a99809d26ea4682d2a3766081cf2ca31cf" resolved "https://registry.yarnpkg.com/@react-navigation/native-stack/-/native-stack-7.2.0.tgz#8aa489f88d662b3543a931b9cb934bb2e09a4893"
integrity sha512-mer3OvfwWOHoUSMJyLa4vnBH3zpFmCwuzrBPlw7feXklurr/ZDiLjLxUScOot6jLRMz/67GyilEYMmP99LL0RQ== integrity sha512-mw7Nq9qQrGsmJmCTwIIWB7yY/3tWYXvQswx+HJScGAadIjemvytJXm1fcl3+YZ9T9Ym0aERcVe5kDs+ny3X4vA==
dependencies: dependencies:
"@react-navigation/core" "^6.4.16" "@react-navigation/elements" "^2.2.5"
warn-once "^0.1.1"
"@react-navigation/native@^7.0.14":
version "7.0.14"
resolved "https://registry.yarnpkg.com/@react-navigation/native/-/native-7.0.14.tgz#b3ee2879038dcf0523d26516af88d3adc549ce5e"
integrity sha512-Gi6lLw4VOGSWAhmUdJOMauOKGK51/YA1CprjXm91sNfgERWvznqEMw8QmUQx9SEqYfi0LfZhbzpMst09SJ00lw==
dependencies:
"@react-navigation/core" "^7.3.1"
escape-string-regexp "^4.0.0" escape-string-regexp "^4.0.0"
fast-deep-equal "^3.1.3" fast-deep-equal "^3.1.3"
nanoid "^3.1.23" nanoid "3.3.8"
use-latest-callback "^0.2.1"
"@react-navigation/routers@^6.1.9": "@react-navigation/routers@^7.1.2":
version "6.1.9" version "7.1.2"
resolved "https://registry.yarnpkg.com/@react-navigation/routers/-/routers-6.1.9.tgz#73f5481a15a38e36592a0afa13c3c064b9f90bed" resolved "https://registry.yarnpkg.com/@react-navigation/routers/-/routers-7.1.2.tgz#647a63e383673de0c4fc10c64a17f551d5da0a17"
integrity sha512-lTM8gSFHSfkJvQkxacGM6VJtBt61ip2XO54aNfswD+KMw6eeZ4oehl7m0me3CR9hnDE4+60iAZR8sAhvCiI3NA== integrity sha512-emdEjpVDK8zbiu2GChC8oYIAub9i/OpNuQJekVsbyFCBz4/TzaBzms38Q53YaNhdIFNmiYLfHv/Y1Ub7KYfm3w==
dependencies: dependencies:
nanoid "^3.1.23" nanoid "3.3.8"
"@remirror/core-constants@3.0.0": "@remirror/core-constants@3.0.0":
version "3.0.0" version "3.0.0"
@@ -14370,7 +14374,12 @@ mz@^2.7.0:
object-assign "^4.0.1" object-assign "^4.0.1"
thenify-all "^1.0.0" thenify-all "^1.0.0"
nanoid@^3.1.23, nanoid@^3.3.1, nanoid@^3.3.6: nanoid@3.3.8:
version "3.3.8"
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf"
integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==
nanoid@^3.3.1, nanoid@^3.3.6:
version "3.3.6" version "3.3.6"
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c"
integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==
@@ -16068,7 +16077,7 @@ react-image-crop@^11.0.7:
resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b"
integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==
react-is@^16.13.0, react-is@^16.13.1, react-is@^16.7.0: react-is@^16.13.1, react-is@^16.7.0:
version "16.13.1" version "16.13.1"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
@@ -16216,10 +16225,10 @@ react-native-safe-area-context@4.14.0:
resolved "https://registry.yarnpkg.com/react-native-safe-area-context/-/react-native-safe-area-context-4.14.0.tgz#138f4b2e180cb7517c78bd5f4d4cf91325ba0b1a" resolved "https://registry.yarnpkg.com/react-native-safe-area-context/-/react-native-safe-area-context-4.14.0.tgz#138f4b2e180cb7517c78bd5f4d4cf91325ba0b1a"
integrity sha512-/SyYpCulWQOnnXhRq6wepkhoyQMowHm1ptDyRz20s+YS/R9mbd+mK+jFyFCyXFJn8jp7vFl43VUCgspuOiEbwA== integrity sha512-/SyYpCulWQOnnXhRq6wepkhoyQMowHm1ptDyRz20s+YS/R9mbd+mK+jFyFCyXFJn8jp7vFl43VUCgspuOiEbwA==
react-native-screens@~4.3.0: react-native-screens@~4.6.0:
version "4.3.0" version "4.6.0"
resolved "https://registry.yarnpkg.com/react-native-screens/-/react-native-screens-4.3.0.tgz#c4fef7583535c963e9257cdd1d91a9889961ab61" resolved "https://registry.yarnpkg.com/react-native-screens/-/react-native-screens-4.6.0.tgz#2b60ab6f4cd5010c6f9cb01b034f2aa0e17ccf4b"
integrity sha512-G0u8BPgu2vcRZoQTlRpBXKa0ElQSDvDBlRe6ncWwCeBmd5Uqa2I3tQ6Vn6trIE6+yneW/nD4p5wihEHlAWZPEw== integrity sha512-PqGtR/moJLiTMSavhfo5spKXNHZrlxffq3g5UUVPmyuu7MmazFlPvYqiAYnR2iB9tkJYgvZO6sbjYAE7619M0A==
dependencies: dependencies:
react-freeze "^1.0.0" react-freeze "^1.0.0"
warn-once "^0.1.0" warn-once "^0.1.0"
@@ -18603,11 +18612,6 @@ use-isomorphic-layout-effect@^1.1.1:
resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz#497cefb13d863d687b08477d9e5a164ad8c1a6fb" resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz#497cefb13d863d687b08477d9e5a164ad8c1a6fb"
integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA== integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==
use-latest-callback@^0.1.9:
version "0.1.9"
resolved "https://registry.yarnpkg.com/use-latest-callback/-/use-latest-callback-0.1.9.tgz#10191dc54257e65a8e52322127643a8940271e2a"
integrity sha512-CL/29uS74AwreI/f2oz2hLTW7ZqVeV5+gxFeGudzQrgkCytrHw33G4KbnQOrRlAEzzAFXi7dDLMC9zhWcVpzmw==
use-latest-callback@^0.2.1: use-latest-callback@^0.2.1:
version "0.2.1" version "0.2.1"
resolved "https://registry.yarnpkg.com/use-latest-callback/-/use-latest-callback-0.2.1.tgz#4d4e6a9e4817b13142834850dcfa8d24ca4569cf" resolved "https://registry.yarnpkg.com/use-latest-callback/-/use-latest-callback-0.2.1.tgz#4d4e6a9e4817b13142834850dcfa8d24ca4569cf"
@@ -18736,7 +18740,7 @@ walker@^1.0.7, walker@^1.0.8:
dependencies: dependencies:
makeerror "1.0.12" makeerror "1.0.12"
warn-once@0.1.1, warn-once@^0.1.0: warn-once@0.1.1, warn-once@^0.1.0, warn-once@^0.1.1:
version "0.1.1" version "0.1.1"
resolved "https://registry.yarnpkg.com/warn-once/-/warn-once-0.1.1.tgz#952088f4fb56896e73fd4e6a3767272a3fccce43" resolved "https://registry.yarnpkg.com/warn-once/-/warn-once-0.1.1.tgz#952088f4fb56896e73fd4e6a3767272a3fccce43"
integrity sha512-VkQZJbO8zVImzYFteBXvBOZEl1qL175WH8VmZcxF2fZAoudNhNDvHi+doCaAEdU2l2vtcIwa2zn0QK5+I1HQ3Q== integrity sha512-VkQZJbO8zVImzYFteBXvBOZEl1qL175WH8VmZcxF2fZAoudNhNDvHi+doCaAEdU2l2vtcIwa2zn0QK5+I1HQ3Q==