ai/at
1
0
This commit is contained in:
2025-12-07 19:33:34 +09:00
parent a38fcab8db
commit 87586047f4
6 changed files with 93 additions and 1210 deletions

View File

@@ -1,763 +1,19 @@
diff --git a/src/Navigation.tsx b/src/Navigation.tsx
index fa33a9d56..c48d078d4 100644
index fa33a9d56..59f54d0b0 100644
--- a/src/Navigation.tsx
+++ b/src/Navigation.tsx
@@ -1,8 +1,8 @@
-import {type JSX, useCallback, useRef} from 'react'
-import {Linking} from 'react-native'
+import { type JSX, useCallback, useRef } from 'react'
+import { Linking } from 'react-native'
import * as Notifications from 'expo-notifications'
-import {i18n, type MessageDescriptor} from '@lingui/core'
-import {msg} from '@lingui/macro'
+import { i18n, type MessageDescriptor } from '@lingui/core'
+import { msg } from '@lingui/macro'
import {
type BottomTabBarProps,
createBottomTabNavigator,
@@ -17,17 +17,17 @@ import {
StackActions,
} from '@react-navigation/native'
-import {timeout} from '#/lib/async/timeout'
-import {useColorSchemeStyle} from '#/lib/hooks/useColorSchemeStyle'
+import { timeout } from '#/lib/async/timeout'
+import { useColorSchemeStyle } from '#/lib/hooks/useColorSchemeStyle'
import {
getNotificationPayload,
type NotificationPayload,
notificationToURL,
storePayloadForAccountSwitch,
} from '#/lib/hooks/useNotificationHandler'
-import {useWebScrollRestoration} from '#/lib/hooks/useWebScrollRestoration'
-import {logger as notyLogger} from '#/lib/notifications/util'
-import {buildStateObject} from '#/lib/routes/helpers'
+import { useWebScrollRestoration } from '#/lib/hooks/useWebScrollRestoration'
+import { logger as notyLogger } from '#/lib/notifications/util'
+import { buildStateObject } from '#/lib/routes/helpers'
import {
type AllNavigatorParams,
type BottomTabNavigatorParams,
@@ -38,106 +38,107 @@ import {
type NotificationsTabNavigatorParams,
type SearchTabNavigatorParams,
} from '#/lib/routes/types'
-import {type RouteParams, type State} from '#/lib/routes/types'
-import {attachRouteToLogEvents, logEvent} from '#/lib/statsig/statsig'
-import {bskyTitle} from '#/lib/strings/headings'
-import {logger} from '#/logger'
-import {isNative, isWeb} from '#/platform/detection'
-import {useUnreadNotifications} from '#/state/queries/notifications/unread'
-import {useSession} from '#/state/session'
+import { type RouteParams, type State } from '#/lib/routes/types'
+import { attachRouteToLogEvents, logEvent } from '#/lib/statsig/statsig'
+import { bskyTitle } from '#/lib/strings/headings'
+import { logger } from '#/logger'
+import { isNative, isWeb } from '#/platform/detection'
+import { useUnreadNotifications } from '#/state/queries/notifications/unread'
+import { useSession } from '#/state/session'
import {
@@ -49,6 +49,7 @@ import {
shouldRequestEmailConfirmation,
snoozeEmailConfirmationPrompt,
} from '#/state/shell/reminders'
-import {CommunityGuidelinesScreen} from '#/view/screens/CommunityGuidelines'
-import {CopyrightPolicyScreen} from '#/view/screens/CopyrightPolicy'
-import {DebugModScreen} from '#/view/screens/DebugMod'
-import {FeedsScreen} from '#/view/screens/Feeds'
-import {HomeScreen} from '#/view/screens/Home'
-import {ListsScreen} from '#/view/screens/Lists'
-import {ModerationBlockedAccounts} from '#/view/screens/ModerationBlockedAccounts'
-import {ModerationModlistsScreen} from '#/view/screens/ModerationModlists'
-import {ModerationMutedAccounts} from '#/view/screens/ModerationMutedAccounts'
-import {NotFoundScreen} from '#/view/screens/NotFound'
-import {NotificationsScreen} from '#/view/screens/Notifications'
-import {PostThreadScreen} from '#/view/screens/PostThread'
-import {PrivacyPolicyScreen} from '#/view/screens/PrivacyPolicy'
-import {ProfileScreen} from '#/view/screens/Profile'
-import {ProfileFeedLikedByScreen} from '#/view/screens/ProfileFeedLikedBy'
-import {Storybook} from '#/view/screens/Storybook'
-import {SupportScreen} from '#/view/screens/Support'
-import {TermsOfServiceScreen} from '#/view/screens/TermsOfService'
-import {BottomBar} from '#/view/shell/bottom-bar/BottomBar'
-import {createNativeStackNavigatorWithAuth} from '#/view/shell/createNativeStackNavigatorWithAuth'
-import {BookmarksScreen} from '#/screens/Bookmarks'
-import {SharedPreferencesTesterScreen} from '#/screens/E2E/SharedPreferencesTesterScreen'
+import { LicenseScreen } from '#/view/screens/License'
+import { CommunityGuidelinesScreen } from '#/view/screens/CommunityGuidelines'
+import { CopyrightPolicyScreen } from '#/view/screens/CopyrightPolicy'
+import { DebugModScreen } from '#/view/screens/DebugMod'
+import { FeedsScreen } from '#/view/screens/Feeds'
+import { HomeScreen } from '#/view/screens/Home'
+import { ListsScreen } from '#/view/screens/Lists'
+import { ModerationBlockedAccounts } from '#/view/screens/ModerationBlockedAccounts'
+import { ModerationModlistsScreen } from '#/view/screens/ModerationModlists'
+import { ModerationMutedAccounts } from '#/view/screens/ModerationMutedAccounts'
+import { NotFoundScreen } from '#/view/screens/NotFound'
+import { NotificationsScreen } from '#/view/screens/Notifications'
+import { PostThreadScreen } from '#/view/screens/PostThread'
+import { PrivacyPolicyScreen } from '#/view/screens/PrivacyPolicy'
+import { ProfileScreen } from '#/view/screens/Profile'
+import { ProfileFeedLikedByScreen } from '#/view/screens/ProfileFeedLikedBy'
+import { Storybook } from '#/view/screens/Storybook'
+import { SupportScreen } from '#/view/screens/Support'
+import { TermsOfServiceScreen } from '#/view/screens/TermsOfService'
+import { BottomBar } from '#/view/shell/bottom-bar/BottomBar'
+import { createNativeStackNavigatorWithAuth } from '#/view/shell/createNativeStackNavigatorWithAuth'
+import { BookmarksScreen } from '#/screens/Bookmarks'
+import { SharedPreferencesTesterScreen } from '#/screens/E2E/SharedPreferencesTesterScreen'
import HashtagScreen from '#/screens/Hashtag'
-import {LogScreen} from '#/screens/Log'
-import {MessagesScreen} from '#/screens/Messages/ChatList'
-import {MessagesConversationScreen} from '#/screens/Messages/Conversation'
-import {MessagesInboxScreen} from '#/screens/Messages/Inbox'
-import {MessagesSettingsScreen} from '#/screens/Messages/Settings'
-import {ModerationScreen} from '#/screens/Moderation'
-import {Screen as ModerationVerificationSettings} from '#/screens/Moderation/VerificationSettings'
-import {Screen as ModerationInteractionSettings} from '#/screens/ModerationInteractionSettings'
-import {NotificationsActivityListScreen} from '#/screens/Notifications/ActivityList'
-import {PostLikedByScreen} from '#/screens/Post/PostLikedBy'
-import {PostQuotesScreen} from '#/screens/Post/PostQuotes'
-import {PostRepostedByScreen} from '#/screens/Post/PostRepostedBy'
-import {ProfileKnownFollowersScreen} from '#/screens/Profile/KnownFollowers'
-import {ProfileFeedScreen} from '#/screens/Profile/ProfileFeed'
-import {ProfileFollowersScreen} from '#/screens/Profile/ProfileFollowers'
-import {ProfileFollowsScreen} from '#/screens/Profile/ProfileFollows'
-import {ProfileLabelerLikedByScreen} from '#/screens/Profile/ProfileLabelerLikedBy'
-import {ProfileSearchScreen} from '#/screens/Profile/ProfileSearch'
-import {ProfileListScreen} from '#/screens/ProfileList'
-import {SavedFeeds} from '#/screens/SavedFeeds'
-import {SearchScreen} from '#/screens/Search'
-import {AboutSettingsScreen} from '#/screens/Settings/AboutSettings'
-import {AccessibilitySettingsScreen} from '#/screens/Settings/AccessibilitySettings'
-import {AccountSettingsScreen} from '#/screens/Settings/AccountSettings'
-import {ActivityPrivacySettingsScreen} from '#/screens/Settings/ActivityPrivacySettings'
-import {AppearanceSettingsScreen} from '#/screens/Settings/AppearanceSettings'
-import {AppIconSettingsScreen} from '#/screens/Settings/AppIconSettings'
-import {AppPasswordsScreen} from '#/screens/Settings/AppPasswords'
-import {ContentAndMediaSettingsScreen} from '#/screens/Settings/ContentAndMediaSettings'
-import {ExternalMediaPreferencesScreen} from '#/screens/Settings/ExternalMediaPreferences'
-import {FollowingFeedPreferencesScreen} from '#/screens/Settings/FollowingFeedPreferences'
-import {InterestsSettingsScreen} from '#/screens/Settings/InterestsSettings'
-import {LanguageSettingsScreen} from '#/screens/Settings/LanguageSettings'
-import {LegacyNotificationSettingsScreen} from '#/screens/Settings/LegacyNotificationSettings'
-import {NotificationSettingsScreen} from '#/screens/Settings/NotificationSettings'
-import {ActivityNotificationSettingsScreen} from '#/screens/Settings/NotificationSettings/ActivityNotificationSettings'
-import {LikeNotificationSettingsScreen} from '#/screens/Settings/NotificationSettings/LikeNotificationSettings'
-import {LikesOnRepostsNotificationSettingsScreen} from '#/screens/Settings/NotificationSettings/LikesOnRepostsNotificationSettings'
-import {MentionNotificationSettingsScreen} from '#/screens/Settings/NotificationSettings/MentionNotificationSettings'
-import {MiscellaneousNotificationSettingsScreen} from '#/screens/Settings/NotificationSettings/MiscellaneousNotificationSettings'
-import {NewFollowerNotificationSettingsScreen} from '#/screens/Settings/NotificationSettings/NewFollowerNotificationSettings'
-import {QuoteNotificationSettingsScreen} from '#/screens/Settings/NotificationSettings/QuoteNotificationSettings'
-import {ReplyNotificationSettingsScreen} from '#/screens/Settings/NotificationSettings/ReplyNotificationSettings'
-import {RepostNotificationSettingsScreen} from '#/screens/Settings/NotificationSettings/RepostNotificationSettings'
-import {RepostsOnRepostsNotificationSettingsScreen} from '#/screens/Settings/NotificationSettings/RepostsOnRepostsNotificationSettings'
-import {PrivacyAndSecuritySettingsScreen} from '#/screens/Settings/PrivacyAndSecuritySettings'
-import {SettingsScreen} from '#/screens/Settings/Settings'
-import {ThreadPreferencesScreen} from '#/screens/Settings/ThreadPreferences'
+import { LogScreen } from '#/screens/Log'
+import { MessagesScreen } from '#/screens/Messages/ChatList'
+import { MessagesConversationScreen } from '#/screens/Messages/Conversation'
+import { MessagesInboxScreen } from '#/screens/Messages/Inbox'
+import { MessagesSettingsScreen } from '#/screens/Messages/Settings'
+import { ModerationScreen } from '#/screens/Moderation'
+import { Screen as ModerationVerificationSettings } from '#/screens/Moderation/VerificationSettings'
+import { Screen as ModerationInteractionSettings } from '#/screens/ModerationInteractionSettings'
+import { NotificationsActivityListScreen } from '#/screens/Notifications/ActivityList'
+import { PostLikedByScreen } from '#/screens/Post/PostLikedBy'
+import { PostQuotesScreen } from '#/screens/Post/PostQuotes'
+import { PostRepostedByScreen } from '#/screens/Post/PostRepostedBy'
+import { ProfileKnownFollowersScreen } from '#/screens/Profile/KnownFollowers'
+import { ProfileFeedScreen } from '#/screens/Profile/ProfileFeed'
+import { ProfileFollowersScreen } from '#/screens/Profile/ProfileFollowers'
+import { ProfileFollowsScreen } from '#/screens/Profile/ProfileFollows'
+import { ProfileLabelerLikedByScreen } from '#/screens/Profile/ProfileLabelerLikedBy'
+import { ProfileSearchScreen } from '#/screens/Profile/ProfileSearch'
+import { ProfileListScreen } from '#/screens/ProfileList'
+import { SavedFeeds } from '#/screens/SavedFeeds'
+import { SearchScreen } from '#/screens/Search'
+import { AboutSettingsScreen } from '#/screens/Settings/AboutSettings'
+import { AccessibilitySettingsScreen } from '#/screens/Settings/AccessibilitySettings'
+import { AccountSettingsScreen } from '#/screens/Settings/AccountSettings'
+import { ActivityPrivacySettingsScreen } from '#/screens/Settings/ActivityPrivacySettings'
+import { AppearanceSettingsScreen } from '#/screens/Settings/AppearanceSettings'
+import { AppIconSettingsScreen } from '#/screens/Settings/AppIconSettings'
+import { AppPasswordsScreen } from '#/screens/Settings/AppPasswords'
+import { ContentAndMediaSettingsScreen } from '#/screens/Settings/ContentAndMediaSettings'
+import { ExternalMediaPreferencesScreen } from '#/screens/Settings/ExternalMediaPreferences'
+import { FollowingFeedPreferencesScreen } from '#/screens/Settings/FollowingFeedPreferences'
+import { InterestsSettingsScreen } from '#/screens/Settings/InterestsSettings'
+import { LanguageSettingsScreen } from '#/screens/Settings/LanguageSettings'
+import { LegacyNotificationSettingsScreen } from '#/screens/Settings/LegacyNotificationSettings'
+import { NotificationSettingsScreen } from '#/screens/Settings/NotificationSettings'
+import { ActivityNotificationSettingsScreen } from '#/screens/Settings/NotificationSettings/ActivityNotificationSettings'
+import { LikeNotificationSettingsScreen } from '#/screens/Settings/NotificationSettings/LikeNotificationSettings'
+import { LikesOnRepostsNotificationSettingsScreen } from '#/screens/Settings/NotificationSettings/LikesOnRepostsNotificationSettings'
+import { MentionNotificationSettingsScreen } from '#/screens/Settings/NotificationSettings/MentionNotificationSettings'
+import { MiscellaneousNotificationSettingsScreen } from '#/screens/Settings/NotificationSettings/MiscellaneousNotificationSettings'
+import { NewFollowerNotificationSettingsScreen } from '#/screens/Settings/NotificationSettings/NewFollowerNotificationSettings'
+import { QuoteNotificationSettingsScreen } from '#/screens/Settings/NotificationSettings/QuoteNotificationSettings'
+import { ReplyNotificationSettingsScreen } from '#/screens/Settings/NotificationSettings/ReplyNotificationSettings'
+import { RepostNotificationSettingsScreen } from '#/screens/Settings/NotificationSettings/RepostNotificationSettings'
+import { RepostsOnRepostsNotificationSettingsScreen } from '#/screens/Settings/NotificationSettings/RepostsOnRepostsNotificationSettings'
+import { PrivacyAndSecuritySettingsScreen } from '#/screens/Settings/PrivacyAndSecuritySettings'
+import { SettingsScreen } from '#/screens/Settings/Settings'
+import { ThreadPreferencesScreen } from '#/screens/Settings/ThreadPreferences'
import {
StarterPackScreen,
StarterPackScreenShort,
} from '#/screens/StarterPack/StarterPackScreen'
-import {Wizard} from '#/screens/StarterPack/Wizard'
+import { Wizard } from '#/screens/StarterPack/Wizard'
import TopicScreen from '#/screens/Topic'
-import {VideoFeed} from '#/screens/VideoFeed'
-import {type Theme, useTheme} from '#/alf'
+import { VideoFeed } from '#/screens/VideoFeed'
+import { type Theme, useTheme } from '#/alf'
import {
EmailDialogScreenID,
useEmailDialogControl,
} from '#/components/dialogs/EmailDialog'
-import {router} from '#/routes'
-import {Referrer} from '../modules/expo-bluesky-swiss-army'
-import {useAccountSwitcher} from './lib/hooks/useAccountSwitcher'
-import {useNonReactiveCallback} from './lib/hooks/useNonReactiveCallback'
-import {useLoggedOutViewControls} from './state/shell/logged-out'
-import {useCloseAllActiveElements} from './state/util'
+import { router } from '#/routes'
+import { Referrer } from '../modules/expo-bluesky-swiss-army'
+import { useAccountSwitcher } from './lib/hooks/useAccountSwitcher'
+import { useNonReactiveCallback } from './lib/hooks/useNonReactiveCallback'
+import { useLoggedOutViewControls } from './state/shell/logged-out'
+import { useCloseAllActiveElements } from './state/util'
const navigationRef = createNavigationContainerRef<AllNavigatorParams>()
@@ -164,32 +165,32 @@ function commonScreens(Stack: typeof Flat, unreadCountLabel?: string) {
<Stack.Screen
name="NotFound"
getComponent={() => NotFoundScreen}
- options={{title: title(msg`Not Found`)}}
+ options={{ title: title(msg`Not Found`) }}
/>
<Stack.Screen
name="Lists"
component={ListsScreen}
- options={{title: title(msg`Lists`), requireAuth: true}}
+ options={{ title: title(msg`Lists`), requireAuth: true }}
/>
<Stack.Screen
name="Moderation"
getComponent={() => ModerationScreen}
- options={{title: title(msg`Moderation`), requireAuth: true}}
+ options={{ title: title(msg`Moderation`), requireAuth: true }}
/>
<Stack.Screen
name="ModerationModlists"
getComponent={() => ModerationModlistsScreen}
- options={{title: title(msg`Moderation Lists`), requireAuth: true}}
+ options={{ title: title(msg`Moderation Lists`), requireAuth: true }}
/>
<Stack.Screen
name="ModerationMutedAccounts"
getComponent={() => ModerationMutedAccounts}
- options={{title: title(msg`Muted Accounts`), requireAuth: true}}
+ options={{ title: title(msg`Muted Accounts`), requireAuth: true }}
/>
<Stack.Screen
name="ModerationBlockedAccounts"
getComponent={() => ModerationBlockedAccounts}
- options={{title: title(msg`Blocked Accounts`), requireAuth: true}}
+ options={{ title: title(msg`Blocked Accounts`), requireAuth: true }}
/>
<Stack.Screen
name="ModerationInteractionSettings"
@@ -210,150 +211,150 @@ function commonScreens(Stack: typeof Flat, unreadCountLabel?: string) {
<Stack.Screen
name="Settings"
getComponent={() => SettingsScreen}
- options={{title: title(msg`Settings`), requireAuth: true}}
+ options={{ title: title(msg`Settings`), requireAuth: true }}
/>
<Stack.Screen
name="LanguageSettings"
getComponent={() => LanguageSettingsScreen}
- options={{title: title(msg`Language Settings`), requireAuth: true}}
+ options={{ title: title(msg`Language Settings`), requireAuth: true }}
/>
<Stack.Screen
name="Profile"
getComponent={() => ProfileScreen}
- options={({route}) => ({
+ options={({ route }) => ({
title: bskyTitle(`@${route.params.name}`, unreadCountLabel),
})}
/>
<Stack.Screen
name="ProfileFollowers"
getComponent={() => ProfileFollowersScreen}
- options={({route}) => ({
+ options={({ route }) => ({
title: title(msg`People following @${route.params.name}`),
})}
/>
<Stack.Screen
name="ProfileFollows"
getComponent={() => ProfileFollowsScreen}
- options={({route}) => ({
+ options={({ route }) => ({
title: title(msg`People followed by @${route.params.name}`),
})}
/>
<Stack.Screen
name="ProfileKnownFollowers"
getComponent={() => ProfileKnownFollowersScreen}
- options={({route}) => ({
+ options={({ route }) => ({
title: title(msg`Followers of @${route.params.name} that you know`),
})}
/>
<Stack.Screen
name="ProfileList"
getComponent={() => ProfileListScreen}
- options={{title: title(msg`List`), requireAuth: true}}
+ options={{ title: title(msg`List`), requireAuth: true }}
/>
<Stack.Screen
name="ProfileSearch"
getComponent={() => ProfileSearchScreen}
- options={({route}) => ({
+ options={({ route }) => ({
title: title(msg`Search @${route.params.name}'s posts`),
})}
/>
<Stack.Screen
name="PostThread"
getComponent={() => PostThreadScreen}
- options={({route}) => ({
+ options={({ route }) => ({
title: title(msg`Post by @${route.params.name}`),
})}
/>
<Stack.Screen
name="PostLikedBy"
getComponent={() => PostLikedByScreen}
- options={({route}) => ({
+ options={({ route }) => ({
title: title(msg`Post by @${route.params.name}`),
})}
/>
<Stack.Screen
name="PostRepostedBy"
getComponent={() => PostRepostedByScreen}
- options={({route}) => ({
+ options={({ route }) => ({
title: title(msg`Post by @${route.params.name}`),
})}
/>
<Stack.Screen
name="PostQuotes"
getComponent={() => PostQuotesScreen}
- options={({route}) => ({
+ options={({ route }) => ({
title: title(msg`Post by @${route.params.name}`),
})}
/>
<Stack.Screen
name="ProfileFeed"
getComponent={() => ProfileFeedScreen}
- options={{title: title(msg`Feed`)}}
+ options={{ title: title(msg`Feed`) }}
/>
<Stack.Screen
name="ProfileFeedLikedBy"
getComponent={() => ProfileFeedLikedByScreen}
- options={{title: title(msg`Liked by`)}}
+ options={{ title: title(msg`Liked by`) }}
/>
<Stack.Screen
name="ProfileLabelerLikedBy"
getComponent={() => ProfileLabelerLikedByScreen}
- options={{title: title(msg`Liked by`)}}
+ options={{ title: title(msg`Liked by`) }}
/>
<Stack.Screen
name="Debug"
getComponent={() => Storybook}
- options={{title: title(msg`Storybook`), requireAuth: true}}
+ options={{ title: title(msg`Storybook`), requireAuth: true }}
/>
<Stack.Screen
name="DebugMod"
getComponent={() => DebugModScreen}
- options={{title: title(msg`Moderation states`), requireAuth: true}}
+ options={{ title: title(msg`Moderation states`), requireAuth: true }}
/>
<Stack.Screen
name="SharedPreferencesTester"
getComponent={() => SharedPreferencesTesterScreen}
- options={{title: title(msg`Shared Preferences Tester`)}}
+ options={{ title: title(msg`Shared Preferences Tester`) }}
/>
<Stack.Screen
name="Log"
getComponent={() => LogScreen}
- options={{title: title(msg`Log`), requireAuth: true}}
+ options={{ title: title(msg`Log`), requireAuth: true }}
/>
<Stack.Screen
name="Support"
getComponent={() => SupportScreen}
- options={{title: title(msg`Support`)}}
+ options={{ title: title(msg`Support`) }}
/>
<Stack.Screen
name="PrivacyPolicy"
getComponent={() => PrivacyPolicyScreen}
- options={{title: title(msg`Privacy Policy`)}}
+ options={{ title: title(msg`Privacy Policy`) }}
/>
<Stack.Screen
name="TermsOfService"
getComponent={() => TermsOfServiceScreen}
- options={{title: title(msg`Terms of Service`)}}
+ options={{ title: title(msg`Terms of Service`) }}
/>
<Stack.Screen
name="CommunityGuidelines"
getComponent={() => CommunityGuidelinesScreen}
- options={{title: title(msg`Community Guidelines`)}}
+ options={{ title: title(msg`Community Guidelines`) }}
/>
<Stack.Screen
name="CopyrightPolicy"
getComponent={() => CopyrightPolicyScreen}
- options={{title: title(msg`Copyright Policy`)}}
+ options={{ title: title(msg`Copyright Policy`) }}
/>
<Stack.Screen
name="AppPasswords"
getComponent={() => AppPasswordsScreen}
- options={{title: title(msg`App Passwords`), requireAuth: true}}
+ options={{ title: title(msg`App Passwords`), requireAuth: true }}
/>
<Stack.Screen
name="SavedFeeds"
getComponent={() => SavedFeeds}
- options={{title: title(msg`Edit My Feeds`), requireAuth: true}}
+ options={{ title: title(msg`Edit My Feeds`), requireAuth: true }}
/>
<Stack.Screen
name="PreferencesFollowingFeed"
@@ -366,7 +367,7 @@ function commonScreens(Stack: typeof Flat, unreadCountLabel?: string) {
<Stack.Screen
name="PreferencesThreads"
getComponent={() => ThreadPreferencesScreen}
- options={{title: title(msg`Threads Preferences`), requireAuth: true}}
+ options={{ title: title(msg`Threads Preferences`), requireAuth: true }}
/>
<Stack.Screen
name="PreferencesExternalEmbeds"
@@ -419,7 +420,7 @@ function commonScreens(Stack: typeof Flat, unreadCountLabel?: string) {
<Stack.Screen
name="NotificationSettings"
getComponent={() => NotificationSettingsScreen}
- options={{title: title(msg`Notification settings`), requireAuth: true}}
+ options={{ title: title(msg`Notification settings`), requireAuth: true }}
/>
<Stack.Screen
name="ReplyNotificationSettings"
@@ -536,62 +537,62 @@ function commonScreens(Stack: typeof Flat, unreadCountLabel?: string) {
<Stack.Screen
name="Hashtag"
getComponent={() => HashtagScreen}
- options={{title: title(msg`Hashtag`)}}
+ options={{ title: title(msg`Hashtag`) }}
/>
<Stack.Screen
name="Topic"
getComponent={() => TopicScreen}
- options={{title: title(msg`Topic`)}}
+ options={{ title: title(msg`Topic`) }}
/>
<Stack.Screen
name="MessagesConversation"
getComponent={() => MessagesConversationScreen}
- options={{title: title(msg`Chat`), requireAuth: true}}
+ options={{ title: title(msg`Chat`), requireAuth: true }}
/>
<Stack.Screen
name="MessagesSettings"
getComponent={() => MessagesSettingsScreen}
- options={{title: title(msg`Chat settings`), requireAuth: true}}
+ options={{ title: title(msg`Chat settings`), requireAuth: true }}
/>
<Stack.Screen
name="MessagesInbox"
getComponent={() => MessagesInboxScreen}
- options={{title: title(msg`Chat request inbox`), requireAuth: true}}
+ options={{ title: title(msg`Chat request inbox`), requireAuth: true }}
/>
<Stack.Screen
name="NotificationsActivityList"
getComponent={() => NotificationsActivityListScreen}
- options={{title: title(msg`Notifications`), requireAuth: true}}
+ options={{ title: title(msg`Notifications`), requireAuth: true }}
/>
<Stack.Screen
name="LegacyNotificationSettings"
getComponent={() => LegacyNotificationSettingsScreen}
- options={{title: title(msg`Notification settings`), requireAuth: true}}
+ options={{ title: title(msg`Notification settings`), requireAuth: true }}
/>
<Stack.Screen
name="Feeds"
getComponent={() => FeedsScreen}
- options={{title: title(msg`Feeds`)}}
+ options={{ title: title(msg`Feeds`) }}
/>
<Stack.Screen
name="StarterPack"
getComponent={() => StarterPackScreen}
- options={{title: title(msg`Starter Pack`)}}
+ options={{ title: title(msg`Starter Pack`) }}
/>
<Stack.Screen
name="StarterPackShort"
getComponent={() => StarterPackScreenShort}
- options={{title: title(msg`Starter Pack`)}}
+ options={{ title: title(msg`Starter Pack`) }}
/>
<Stack.Screen
name="StarterPackWizard"
getComponent={() => Wizard}
- options={{title: title(msg`Create a starter pack`), requireAuth: true}}
+ options={{ title: title(msg`Create a starter pack`), requireAuth: true }}
/>
<Stack.Screen
name="StarterPackEdit"
getComponent={() => Wizard}
- options={{title: title(msg`Edit your starter pack`), requireAuth: true}}
+ options={{ title: title(msg`Edit your starter pack`), requireAuth: true }}
/>
<Stack.Screen
name="VideoFeed"
@@ -629,7 +630,7 @@ function TabsNavigator() {
<Tab.Navigator
initialRouteName="HomeTab"
backBehavior="initialRoute"
- screenOptions={{headerShown: false, lazy: true}}
+ screenOptions={{ headerShown: false, lazy: true }}
tabBar={tabBar}>
<Tab.Screen name="HomeTab" getComponent={() => HomeTabNavigator} />
<Tab.Screen name="SearchTab" getComponent={() => SearchTabNavigator} />
@@ -663,6 +664,8 @@ function HomeTabNavigator() {
return (
<HomeTab.Navigator screenOptions={screenOptions(t)} initialRouteName="Home">
<HomeTab.Screen name="Home" getComponent={() => HomeScreen} />
+ <HomeTab.Screen name="TermsOfService" component={TermsOfServiceScreen} />
+ <HomeTab.Screen name="License" component={LicenseScreen} />
<HomeTab.Screen name="Start" getComponent={() => HomeScreen} />
{commonScreens(HomeTab as typeof Flat)}
</HomeTab.Navigator>
@@ -690,7 +693,7 @@ function NotificationsTabNavigator() {
<NotificationsTab.Screen
name="Notifications"
getComponent={() => NotificationsScreen}
- options={{requireAuth: true}}
+ options={{ requireAuth: true }}
/>
{commonScreens(NotificationsTab as typeof Flat)}
</NotificationsTab.Navigator>
@@ -708,7 +711,7 @@ function MyProfileTabNavigator() {
// gives us typechecking for initialParams -sfn
name={'MyProfile' as 'Profile'}
getComponent={() => ProfileScreen}
- initialParams={{name: 'me', hideBackButton: true}}
+ initialParams={{ name: 'me', hideBackButton: true }}
/>
{commonScreens(MyProfileTab as unknown as typeof Flat)}
</MyProfileTab.Navigator>
@@ -724,7 +727,7 @@ function MessagesTabNavigator() {
<MessagesTab.Screen
name="Messages"
getComponent={() => MessagesScreen}
- options={({route}) => ({
+ options={({ route }) => ({
requireAuth: true,
animationTypeForReplace: route.params?.animation ?? 'push',
})}
@@ -751,27 +754,27 @@ const FlatNavigator = () => {
<Flat.Screen
name="Home"
getComponent={() => HomeScreen}
- options={{title: title(msg`Home`)}}
+ options={{ title: title(msg`Home`) }}
/>
<Flat.Screen
name="Search"
getComponent={() => SearchScreen}
- options={{title: title(msg`Explore`)}}
+ options={{ title: title(msg`Explore`) }}
/>
<Flat.Screen
name="Notifications"
getComponent={() => NotificationsScreen}
- options={{title: title(msg`Notifications`), requireAuth: true}}
+ options={{ title: title(msg`Notifications`), requireAuth: true }}
/>
<Flat.Screen
name="Messages"
getComponent={() => MessagesScreen}
- options={{title: title(msg`Messages`), requireAuth: true}}
+ options={{ title: title(msg`Messages`), requireAuth: true }}
/>
<Flat.Screen
name="Start"
getComponent={() => HomeScreen}
- options={{title: title(msg`Home`)}}
+ options={{ title: title(msg`Home`) }}
/>
{commonScreens(Flat, numUnread)}
</Flat.Navigator>
@@ -849,11 +852,11 @@ const LINKING = {
*/
let lastHandledNotificationDateDedupe: number | undefined
-function RoutesContainer({children}: React.PropsWithChildren<{}>) {
+function RoutesContainer({ children }: React.PropsWithChildren<{}>) {
const theme = useColorSchemeStyle(DefaultTheme, DarkTheme)
- const {currentAccount, accounts} = useSession()
- const {onPressSwitchAccount} = useAccountSwitcher()
- const {setShowLoggedOut} = useLoggedOutViewControls()
+ const { currentAccount, accounts } = useSession()
+ const { onPressSwitchAccount } = useAccountSwitcher()
+ const { setShowLoggedOut } = useLoggedOutViewControls()
const prevLoggedRouteName = useRef<string | undefined>(undefined)
const emailDialogControl = useEmailDialogControl()
const closeAllActiveElements = useCloseAllActiveElements()
@@ -865,8 +868,8 @@ function RoutesContainer({children}: React.PropsWithChildren<{}>) {
* after an async call - sfn
*/
const handleChatMessage = useNonReactiveCallback(
- (payload: Extract<NotificationPayload, {reason: 'chat-message'}>) => {
- notyLogger.debug(`handleChatMessage`, {payload})
+ (payload: Extract<NotificationPayload, { reason: 'chat-message' }>) => {
+ notyLogger.debug(`handleChatMessage`, { payload })
if (payload.recipientDid !== currentAccount?.did) {
// handled in useNotificationHandler after account switch finishes
@@ -907,7 +910,7 @@ function RoutesContainer({children}: React.PropsWithChildren<{}>) {
const response = await Notifications.getLastNotificationResponseAsync()
if (response) {
- notyLogger.debug(`handlePushNotificationEntry: response`, {response})
+ notyLogger.debug(`handlePushNotificationEntry: response`, { response })
if (response.notification.date === lastHandledNotificationDateDedupe)
return
@@ -918,8 +921,8 @@ function RoutesContainer({children}: React.PropsWithChildren<{}>) {
if (payload) {
notyLogger.metric(
'notifications:openApp',
- {reason: payload.reason, causedBoot: true},
- {statsig: false},
+ { reason: payload.reason, causedBoot: true },
+ { statsig: false },
)
if (payload.reason === 'chat-message') {
@@ -933,7 +936,7 @@ function RoutesContainer({children}: React.PropsWithChildren<{}>) {
} else if (path) {
const [screen, params] = router.matchPath(path)
// @ts-expect-error nested navigators aren't typed -sfn
- navigate('HomeTab', {screen, params})
+ navigate('HomeTab', { screen, params })
notyLogger.debug(`handlePushNotificationEntry: navigate`, {
screen,
params,
@@ -963,8 +966,8 @@ function RoutesContainer({children}: React.PropsWithChildren<{}>) {
onStateChange={() => {
logger.metric(
'router:navigate',
- {from: prevLoggedRouteName.current},
- {statsig: false},
+ { from: prevLoggedRouteName.current },
+ { statsig: false },
)
prevLoggedRouteName.current = getCurrentRouteName()
}}
@@ -972,7 +975,7 @@ function RoutesContainer({children}: React.PropsWithChildren<{}>) {
attachRouteToLogEvents(getCurrentRouteName)
logModuleInitTime()
onReady()
- logger.metric('router:navigate', {}, {statsig: false})
+ logger.metric('router:navigate', {}, { statsig: false })
handlePushNotificationEntry()
}}
// WARNING: Implicit navigation to nested navigators is depreciated in React Navigation 7.x
@@ -1040,7 +1043,7 @@ function reset(): Promise<void> {
navigationRef.dispatch(
CommonActions.reset({
index: 0,
- routes: [{name: isNative ? 'HomeTab' : 'Home'}],
+ routes: [{ name: isNative ? 'HomeTab' : 'Home' }],
}),
)
return Promise.race([
+import {LicenseScreen} from '#/view/screens/License'
import {CommunityGuidelinesScreen} from '#/view/screens/CommunityGuidelines'
import {CopyrightPolicyScreen} from '#/view/screens/CopyrightPolicy'
import {DebugModScreen} from '#/view/screens/DebugMod'
diff --git a/src/lib/routes/types.ts b/src/lib/routes/types.ts
index c315a8341..dc84545f7 100644
index c315a8341..9b2f50a83 100644
--- a/src/lib/routes/types.ts
+++ b/src/lib/routes/types.ts
@@ -1,9 +1,9 @@
-import {type NavigationState, type PartialState} from '@react-navigation/native'
-import {type NativeStackNavigationProp} from '@react-navigation/native-stack'
+import { type NavigationState, type PartialState } from '@react-navigation/native'
+import { type NativeStackNavigationProp } from '@react-navigation/native-stack'
-import {type VideoFeedSourceContext} from '#/screens/VideoFeed/types'
+import { type VideoFeedSourceContext } from '#/screens/VideoFeed/types'
-export type {NativeStackScreenProps} from '@react-navigation/native-stack'
+export type { NativeStackScreenProps } from '@react-navigation/native-stack'
export type CommonNavigatorParams = {
NotFound: undefined
@@ -15,23 +15,23 @@ export type CommonNavigatorParams = {
ModerationInteractionSettings: undefined
ModerationVerificationSettings: undefined
Settings: undefined
- Profile: {name: string; hideBackButton?: boolean}
- ProfileFollowers: {name: string}
- ProfileFollows: {name: string}
- ProfileKnownFollowers: {name: string}
- ProfileSearch: {name: string; q?: string}
- ProfileList: {name: string; rkey: string}
- PostThread: {name: string; rkey: string}
- PostLikedBy: {name: string; rkey: string}
- PostRepostedBy: {name: string; rkey: string}
- PostQuotes: {name: string; rkey: string}
+ Profile: { name: string; hideBackButton?: boolean }
+ ProfileFollowers: { name: string }
+ ProfileFollows: { name: string }
+ ProfileKnownFollowers: { name: string }
+ ProfileSearch: { name: string; q?: string }
+ ProfileList: { name: string; rkey: string }
+ PostThread: { name: string; rkey: string }
+ PostLikedBy: { name: string; rkey: string }
+ PostRepostedBy: { name: string; rkey: string }
+ PostQuotes: { name: string; rkey: string }
ProfileFeed: {
name: string
rkey: string
feedCacheKey?: 'discover' | 'explore' | undefined
}
- ProfileFeedLikedBy: {name: string; rkey: string}
- ProfileLabelerLikedBy: {name: string}
+ ProfileFeedLikedBy: { name: string; rkey: string }
+ ProfileLabelerLikedBy: { name: string }
Debug: undefined
DebugMod: undefined
SharedPreferencesTester: undefined
@@ -39,6 +39,7 @@ export type CommonNavigatorParams = {
Support: undefined
PrivacyPolicy: undefined
@@ -766,117 +22,18 @@ index c315a8341..dc84545f7 100644
CommunityGuidelines: undefined
CopyrightPolicy: undefined
LanguageSettings: undefined
@@ -67,24 +68,24 @@ export type CommonNavigatorParams = {
InterestsSettings: undefined
AboutSettings: undefined
AppIconSettings: undefined
- Search: {q?: string; tab?: 'user' | 'profile' | 'feed'}
- Hashtag: {tag: string; author?: string}
- Topic: {topic: string}
- MessagesConversation: {conversation: string; embed?: string; accept?: true}
+ Search: { q?: string; tab?: 'user' | 'profile' | 'feed' }
+ Hashtag: { tag: string; author?: string }
+ Topic: { topic: string }
+ MessagesConversation: { conversation: string; embed?: string; accept?: true }
MessagesSettings: undefined
MessagesInbox: undefined
- NotificationsActivityList: {posts: string}
+ NotificationsActivityList: { posts: string }
LegacyNotificationSettings: undefined
Feeds: undefined
- Start: {name: string; rkey: string}
- StarterPack: {name: string; rkey: string; new?: boolean}
- StarterPackShort: {code: string}
+ Start: { name: string; rkey: string }
+ StarterPack: { name: string; rkey: string; new?: boolean }
+ StarterPackShort: { code: string }
StarterPackWizard: {
fromDialog?: boolean
targetDid?: string
onSuccess?: () => void
}
- StarterPackEdit: {rkey?: string}
+ StarterPackEdit: { rkey?: string }
VideoFeed: VideoFeedSourceContext
Bookmarks: undefined
}
@@ -102,7 +103,7 @@ export type HomeTabNavigatorParams = CommonNavigatorParams & {
}
export type SearchTabNavigatorParams = CommonNavigatorParams & {
- Search: {q?: string; tab?: 'user' | 'profile' | 'feed'}
+ Search: { q?: string; tab?: 'user' | 'profile' | 'feed' }
}
export type NotificationsTabNavigatorParams = CommonNavigatorParams & {
@@ -110,32 +111,32 @@ export type NotificationsTabNavigatorParams = CommonNavigatorParams & {
}
export type MyProfileTabNavigatorParams = CommonNavigatorParams & {
- MyProfile: {name: 'me'; hideBackButton: true}
+ MyProfile: { name: 'me'; hideBackButton: true }
}
export type MessagesTabNavigatorParams = CommonNavigatorParams & {
- Messages: {pushToConversation?: string; animation?: 'push' | 'pop'}
+ Messages: { pushToConversation?: string; animation?: 'push' | 'pop' }
}
export type FlatNavigatorParams = CommonNavigatorParams & {
Home: undefined
- Search: {q?: string; tab?: 'user' | 'profile' | 'feed'}
+ Search: { q?: string; tab?: 'user' | 'profile' | 'feed' }
Feeds: undefined
Notifications: undefined
- Messages: {pushToConversation?: string; animation?: 'push' | 'pop'}
+ Messages: { pushToConversation?: string; animation?: 'push' | 'pop' }
}
export type AllNavigatorParams = CommonNavigatorParams & {
HomeTab: undefined
Home: undefined
SearchTab: undefined
- Search: {q?: string; tab?: 'user' | 'profile' | 'feed'}
+ Search: { q?: string; tab?: 'user' | 'profile' | 'feed' }
Feeds: undefined
NotificationsTab: undefined
Notifications: undefined
MyProfileTab: undefined
MessagesTab: undefined
- Messages: {animation?: 'push' | 'pop'}
+ Messages: { animation?: 'push' | 'pop' }
}
// NOTE
@@ -149,7 +150,7 @@ export type State =
| Omit<PartialState<NavigationState>, 'stale'>
export type RouteParams = Record<string, string>
-export type MatchResult = {params: RouteParams}
+export type MatchResult = { params: RouteParams }
export type Route = {
match: (path: string) => MatchResult | undefined
build: (params?: Record<string, any>) => string
diff --git a/src/routes.ts b/src/routes.ts
index 1ed913bb2..3fe7041da 100644
index 1ed913bb2..77ea6deca 100644
--- a/src/routes.ts
+++ b/src/routes.ts
@@ -1,5 +1,5 @@
-import {Router} from '#/lib/routes/router'
-import {type FlatNavigatorParams} from './lib/routes/types'
+import { Router } from '#/lib/routes/router'
+import { type FlatNavigatorParams } from './lib/routes/types'
type AllNavigatableRoutes = Omit<
FlatNavigatorParams,
@@ -71,8 +71,9 @@ export const router = new Router<AllNavigatableRoutes>({
@@ -71,8 +71,8 @@ export const router = new Router<AllNavigatableRoutes>({
MiscellaneousNotificationSettings: '/settings/notifications/miscellaneous',
// support
Support: '/support',
- PrivacyPolicy: '/support/privacy',
- TermsOfService: '/support/tos',
+ PrivacyPolicy: 'https://syu.is/about/support/privacy-policy',
TermsOfService: '/support/tos',
+ License: '/support/license',
+ TermsOfService: 'https://syu.is/about/support/tos',
CommunityGuidelines: '/support/community-guidelines',
CopyrightPolicy: '/support/copyright',
// hashtags