diff --git a/shared/chat/conversation/input-area/normal/index.tsx b/shared/chat/conversation/input-area/normal/index.tsx index 093560e2779d..54dc042f0f5a 100644 --- a/shared/chat/conversation/input-area/normal/index.tsx +++ b/shared/chat/conversation/input-area/normal/index.tsx @@ -126,7 +126,7 @@ const doInjectText = (inputRef: React.RefObject, text: string, } const ConnectedPlatformInput = function ConnectedPlatformInput() { - const route = useRoute | RootRouteProps<'chatRoot'>>() + const route = useRoute() as RootRouteProps<'chatConversation'> | RootRouteProps<'chatRoot'> const params = getRouteParamsFromRoute<'chatConversation' | 'chatRoot'>(route) const infoPanelShowing = !!(params && typeof params === 'object' && 'infoPanel' in params && params.infoPanel) const uiData = InputState.useConversationInput( diff --git a/shared/chat/conversation/thread-load-status-context.test.tsx b/shared/chat/conversation/thread-load-status-context.test.tsx index ca7f77d2e1b6..ae747f8f18a5 100644 --- a/shared/chat/conversation/thread-load-status-context.test.tsx +++ b/shared/chat/conversation/thread-load-status-context.test.tsx @@ -6,7 +6,6 @@ import * as T from '@/constants/types' import {notifyEngineActionListeners} from '@/engine/action-listener' import {resetAllStores} from '@/util/zustand' import {useCurrentUserState} from '@/stores/current-user' -import {useShellState} from '@/stores/shell' import { ConversationThreadLoadStatusProvider, useThreadLoadStatus, @@ -15,20 +14,6 @@ import { } from './thread-load-status-context' import {ConversationThreadProvider} from './thread-context' -let mockRouteFocused = true -let mockVisibleScreenName: string | undefined -jest.mock('@react-navigation/core', () => ({ - createNavigationContainerRef: jest.fn(() => ({current: null})), - useIsFocused: () => mockRouteFocused, -})) -jest.mock('@/constants/router', () => { - const actual = jest.requireActual('@/constants/router') - return { - ...actual, - getVisibleScreen: () => (mockVisibleScreenName ? {name: mockVisibleScreenName} : undefined), - } -}) - jest.mock('@/stores/inbox-rows', () => ({ flushInboxRowUpdates: jest.fn(), getInboxRowTrustedState: jest.fn(() => undefined), @@ -53,8 +38,6 @@ const flushPromises = async () => { } beforeEach(() => { - mockRouteFocused = true - mockVisibleScreenName = undefined jest.spyOn(T.RPCChat, 'localRequestInboxUnboxRpcPromise').mockResolvedValue(undefined) useCurrentUserState.getState().dispatch.setBootstrap({ deviceID: 'device-id', @@ -143,71 +126,3 @@ test('mounted stale-thread reload reports status through the provider', async () expect(result.current).toBe(T.RPCChat.UIChatThreadStatusTyp.server) }) - -test('mounted route focus reload reports status through the provider', async () => { - mockRouteFocused = false - jest.spyOn(T.RPCChat, 'localGetThreadNonblockRpcListener').mockImplementation(async p => { - p.incomingCallMap['chat.1.chatUi.chatThreadStatus']?.({ - status: {typ: T.RPCChat.UIChatThreadStatusTyp.server}, - }) - await Promise.resolve() - return {offline: false} - }) - const {rerender, result} = renderHook(() => useThreadLoadStatus(), {wrapper}) - - act(() => { - mockRouteFocused = true - rerender() - }) - await act(async () => { - await flushPromises() - }) - - expect(result.current).toBe(T.RPCChat.UIChatThreadStatusTyp.server) -}) - -test('mounted route focus skips reload after returning from emoji picker', async () => { - mockRouteFocused = false - mockVisibleScreenName = 'chatChooseEmoji' - const getThread = jest.spyOn(T.RPCChat, 'localGetThreadNonblockRpcListener').mockResolvedValue({ - offline: false, - }) - const {rerender} = renderHook(() => useThreadLoadStatus(), {wrapper}) - - act(() => { - mockRouteFocused = true - mockVisibleScreenName = undefined - rerender() - }) - await act(async () => { - await flushPromises() - }) - - expect(getThread).not.toHaveBeenCalled() -}) - -test('mounted app foreground does not reload the thread', async () => { - const getThread = jest.spyOn(T.RPCChat, 'localGetThreadNonblockRpcListener').mockImplementation(async p => { - p.incomingCallMap['chat.1.chatUi.chatThreadStatus']?.({ - status: {typ: T.RPCChat.UIChatThreadStatusTyp.server}, - }) - await Promise.resolve() - return {offline: false} - }) - renderHook(() => useThreadLoadStatus(), {wrapper}) - - act(() => { - useShellState.getState().dispatch.changedFocus(false) - }) - await act(async () => { - await flushPromises() - }) - act(() => { - useShellState.getState().dispatch.changedFocus(true) - }) - await act(async () => { - await flushPromises() - }) - - expect(getThread).not.toHaveBeenCalled() -}) diff --git a/shared/chat/conversation/thread-load-status-context.tsx b/shared/chat/conversation/thread-load-status-context.tsx index ff0c2f365090..aa9f44357a38 100644 --- a/shared/chat/conversation/thread-load-status-context.tsx +++ b/shared/chat/conversation/thread-load-status-context.tsx @@ -130,7 +130,6 @@ export const ConversationThreadLoadStatusProvider = ( }) } - useEngineActionListener('chat.1.NotifyChat.ChatThreadsStale', action => { const hasStaleThread = (action.payload.params.updates ?? []).some( update => T.Chat.conversationIDToKey(update.convID) === id diff --git a/shared/chat/conversation/thread-search-route.tsx b/shared/chat/conversation/thread-search-route.tsx index 5db5f4694747..cc6d8ee2ac0b 100644 --- a/shared/chat/conversation/thread-search-route.tsx +++ b/shared/chat/conversation/thread-search-route.tsx @@ -30,7 +30,7 @@ const isThreadSearchRouteParams = ( Object.prototype.hasOwnProperty.call(params, 'inputAction')) export const useChatThreadRouteParams = (): ThreadSearchRouteProps | undefined => { - const route = useRoute | RootRouteProps<'chatRoot'>>() + const route = useRoute() as RootRouteProps<'chatConversation'> | RootRouteProps<'chatRoot'> const params = getRouteParamsFromRoute<'chatConversation' | 'chatRoot'>(route) return isThreadSearchRouteParams(params) ? params : undefined } diff --git a/shared/chat/inbox-and-conversation-header.tsx b/shared/chat/inbox-and-conversation-header.tsx index c3844a016c84..d47fb36e0df2 100644 --- a/shared/chat/inbox-and-conversation-header.tsx +++ b/shared/chat/inbox-and-conversation-header.tsx @@ -28,7 +28,7 @@ const Header = () => { } const Header2 = () => { - const {params} = useRoute() + const {params} = useRoute() as ChatRootRoute const username = useCurrentUserState(s => s.username) const infoPanelShowing = !!params.infoPanel const conversationIDKey = params.conversationIDKey ?? Chat.noConversationIDKey diff --git a/shared/chat/inbox/get-options.tsx b/shared/chat/inbox/get-options.tsx index c7e6afc12be6..70d2bddc2484 100644 --- a/shared/chat/inbox/get-options.tsx +++ b/shared/chat/inbox/get-options.tsx @@ -38,7 +38,7 @@ const desktopOptions = { } export default { - freezeOnBlur: false, + inactiveBehavior: 'none' as const, ...(Kb.Styles.isMobile ? mobileOptions : desktopOptions), headerTitle: () => ( diff --git a/shared/chat/inbox/index.native.tsx b/shared/chat/inbox/index.native.tsx index 9c791b8cac81..28bc5430d979 100644 --- a/shared/chat/inbox/index.native.tsx +++ b/shared/chat/inbox/index.native.tsx @@ -5,7 +5,7 @@ import * as React from 'react' import {isLiquidGlassSupported as _isLiquidGlassSupported} from '@callstack/liquid-glass' import {useChosenChannelsTeamnames} from '@/chat/conversation/manage-channels-badge' import {useNavigation, type NavigationProp} from '@react-navigation/native' -import type {NativeBottomTabNavigationProp} from '@react-navigation/bottom-tabs/unstable' +import type {BottomTabNavigationProp} from '@react-navigation/bottom-tabs' import {PerfProfiler} from '@/perf/react-profiler' import * as RowSizes from './row/sizes' import BigTeamsDivider from './row/big-teams-divider' @@ -85,7 +85,7 @@ function InboxBody(p: ControlledInboxProps) { const {unreadIndices, unreadTotal, rows, smallTeamsExpanded, isSearching, allowShowFloatingButton} = inbox const {neverLoaded, onNewChat, inboxNumSmallRows, setInboxNumSmallRows} = inbox const headComponent = C.isTablet ? null : - const navigation = useNavigation>() + const navigation = useNavigation() as NavigationProp const chosenChannelsTeamnames = useChosenChannelsTeamnames() const listExtraData = React.useMemo( () => ({ @@ -196,7 +196,7 @@ function InboxBody(p: ControlledInboxProps) { if (!useTabBottomAccessory) { return } - const parent = navigation.getParent | undefined>() + const parent = navigation.getParent() as BottomTabNavigationProp | undefined parent?.setOptions({bottomAccessory: showFloatingDivider ? renderBottomAccessory : undefined}) return () => { parent?.setOptions({bottomAccessory: undefined}) diff --git a/shared/crypto/decrypt.tsx b/shared/crypto/decrypt.tsx index 7246953b4c9d..98c9e2a9116d 100644 --- a/shared/crypto/decrypt.tsx +++ b/shared/crypto/decrypt.tsx @@ -136,7 +136,7 @@ export const useDecryptState = (params?: CryptoInputRouteParams) => { } export const DecryptInput = (_props: unknown) => { - const {params} = useRoute>() + const {params} = useRoute() as RootRouteProps<'decryptTab'> const controller = useDecryptState(params) const navigateAppend = C.Router2.navigateAppend @@ -207,7 +207,7 @@ export const DecryptOutput = ({route}: {route: {params: CommonOutputRouteParams} } export const DecryptIO = () => { - const {params} = useRoute>() + const {params} = useRoute() as RootRouteProps<'decryptTab'> const controller = useDecryptState(params) return ( ( ) export const EncryptInput = (_props: unknown) => { - const {params} = useRoute>() + const {params} = useRoute() as RootRouteProps<'encryptTab'> return } @@ -564,7 +564,7 @@ export const EncryptOutput = ({route}: {route: {params: EncryptOutputRouteParams } export const EncryptIO = () => { - const {params} = useRoute>() + const {params} = useRoute() as RootRouteProps<'encryptTab'> const controller = useEncryptScreenState(params) const appendEncryptRecipientsBuilder = C.Router2.appendEncryptRecipientsBuilder diff --git a/shared/crypto/sign.tsx b/shared/crypto/sign.tsx index 10a09a548e50..521d25575c16 100644 --- a/shared/crypto/sign.tsx +++ b/shared/crypto/sign.tsx @@ -144,7 +144,7 @@ const SignOutputBanner = ({state}: {state: CommonOutputRouteParams}) => ( ) export const SignInput = (_props: unknown) => { - const {params} = useRoute>() + const {params} = useRoute() as RootRouteProps<'signTab'> const controller = useSignState(params) const blurCBRef = React.useRef(() => {}) const navigateAppend = C.Router2.navigateAppend @@ -217,7 +217,7 @@ export const SignOutput = ({route}: {route: {params: CommonOutputRouteParams}}) } export const SignIO = () => { - const {params} = useRoute>() + const {params} = useRoute() as RootRouteProps<'signTab'> const controller = useSignState(params) return ( { } export const VerifyInput = (_props: unknown) => { - const {params} = useRoute>() + const {params} = useRoute() as RootRouteProps<'verifyTab'> const controller = useVerifyState(params) const navigateAppend = C.Router2.navigateAppend @@ -204,7 +204,7 @@ export const VerifyOutput = ({route}: {route: {params: CommonOutputRouteParams}} } export const VerifyIO = () => { - const {params} = useRoute>() + const {params} = useRoute() as RootRouteProps<'verifyTab'> const controller = useVerifyState(params) return ( ) => const itemHeight = {height: 48, type: 'fixed'} as const function ReloadableDevices() { - const navigation = useNavigation>() + const navigation = useNavigation() as unknown as NativeStackNavigationProp const [devices, setDevices] = React.useState>([]) const waiting = C.Waiting.useAnyWaiting(C.waitingKeyDevices) const loadDevicesRPC = C.useRPC(T.RPCGen.deviceDeviceHistoryListRpcPromise) diff --git a/shared/fs/footer/upload-container.native.tsx b/shared/fs/footer/upload-container.native.tsx index c5715fbf89f4..b0870167bf3f 100644 --- a/shared/fs/footer/upload-container.native.tsx +++ b/shared/fs/footer/upload-container.native.tsx @@ -5,7 +5,7 @@ import * as T from '@/constants/types' import {useColorScheme, Image} from 'react-native' import {useNavigation} from '@react-navigation/native' import {useIsFocused} from '@react-navigation/core' -import type {NativeBottomTabNavigationProp} from '@react-navigation/bottom-tabs/unstable' +import type {BottomTabNavigationProp} from '@react-navigation/bottom-tabs' import {isLiquidGlassSupported as _isLiquidGlassSupported} from '@callstack/liquid-glass' import type {RootParamList} from '@/router-v2/route-params' import Upload from './upload' @@ -79,7 +79,7 @@ const UploadContainer = () => { React.useEffect(() => { if (!useTabBottomAccessory || !isFocused) return - const parent = navigation.getParent | undefined>() + const parent = navigation.getParent() as BottomTabNavigationProp | undefined parent?.setOptions({bottomAccessory: np.showing ? renderBottomAccessory : undefined}) return () => { parent?.setOptions({bottomAccessory: undefined}) diff --git a/shared/ios/Podfile.lock b/shared/ios/Podfile.lock index 975fa1c4029b..94db986a126c 100644 --- a/shared/ios/Podfile.lock +++ b/shared/ios/Podfile.lock @@ -2151,6 +2151,28 @@ PODS: - React-utils (= 0.85.3) - ReactNativeDependencies - ReactNativeDependencies (0.85.3) + - ReactNavigation (8.0.0-alpha.23): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-Core + - React-Core-prebuilt + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - Yoga - RNCMaskedView (0.3.2): - hermes-engine - RCTRequired @@ -2541,6 +2563,7 @@ DEPENDENCIES: - ReactCodegen (from `build/generated/ios/ReactCodegen`) - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) - ReactNativeDependencies (from `../node_modules/react-native/third-party-podspecs/ReactNativeDependencies.podspec`) + - "ReactNavigation (from `../node_modules/@react-navigation/native`)" - "RNCMaskedView (from `../node_modules/@react-native-masked-view/masked-view`)" - "RNCPicker (from `../node_modules/@react-native-picker/picker`)" - RNGestureHandler (from `../node_modules/react-native-gesture-handler`) @@ -2784,6 +2807,8 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon" ReactNativeDependencies: :podspec: "../node_modules/react-native/third-party-podspecs/ReactNativeDependencies.podspec" + ReactNavigation: + :path: "../node_modules/@react-navigation/native" RNCMaskedView: :path: "../node_modules/@react-native-masked-view/masked-view" RNCPicker: @@ -2916,6 +2941,7 @@ SPEC CHECKSUMS: ReactCodegen: 7016a2114079361a2f1536b3c91a15ceb8eb7ca4 ReactCommon: 7dfc3250793bf36cf221096ff59e1179e13eef7f ReactNativeDependencies: a6322d261348755da88238e31671807522b1ad9d + ReactNavigation: eab388d91957f537b337f21486b08931dd08d148 RNCMaskedView: 8069b4d4e23b3d28b4fcac70bf266be43ffc3d2e RNCPicker: a3921be99ae291e420e3e8940e5b2b53e572c543 RNGestureHandler: d4cbb1077ca262ff651f66d4aebcd1448fc3463b diff --git a/shared/jest.config.js b/shared/jest.config.js index 0f72e3c4a4c8..e805013413e2 100644 --- a/shared/jest.config.js +++ b/shared/jest.config.js @@ -19,6 +19,7 @@ module.exports = { '^@/(.*)$': '/$1', '^@/logger$': '/test/mocks/logger.js', '^@react-navigation/core$': '/test/mocks/react-navigation-core.js', + '^@react-navigation/native$': '/test/mocks/react-navigation-native.js', '^react-native$': '/test/mocks/react-native.js', }, setupFiles: ['/jest.setup.js'], diff --git a/shared/login/reset/confirm.test.tsx b/shared/login/reset/confirm.test.tsx index 1f75e00fb4e3..ad338bfd08db 100644 --- a/shared/login/reset/confirm.test.tsx +++ b/shared/login/reset/confirm.test.tsx @@ -69,7 +69,7 @@ describe('ConfirmReset', () => { }) mockSetOptions.mockReset() mockSubmitResetPrompt.mockReset() - ;(useNavigation as jest.Mock).mockReturnValue({ + ;(useNavigation as unknown as jest.Mock).mockReturnValue({ addListener: mockAddListener, setOptions: mockSetOptions, }) diff --git a/shared/package.json b/shared/package.json index 77066be308cd..8d780aed068e 100644 --- a/shared/package.json +++ b/shared/package.json @@ -93,10 +93,10 @@ "@react-native-community/netinfo": "12.0.1", "@react-native-masked-view/masked-view": "0.3.2", "@react-native-picker/picker": "2.11.4", - "@react-navigation/bottom-tabs": "7.15.12", - "@react-navigation/core": "7.17.3", - "@react-navigation/native": "7.2.3", - "@react-navigation/native-stack": "7.14.13", + "@react-navigation/bottom-tabs": "8.0.0-alpha.28", + "@react-navigation/core": "8.0.0-alpha.14", + "@react-navigation/native": "8.0.0-alpha.23", + "@react-navigation/native-stack": "8.0.0-alpha.29", "date-fns": "4.1.0", "emoji-datasource-apple": "16.0.0", "emoji-regex": "10.6.0", diff --git a/shared/patches/@react-navigation+bottom-tabs+7.15.12.patch b/shared/patches/@react-navigation+bottom-tabs+8.0.0-alpha.26.patch similarity index 66% rename from shared/patches/@react-navigation+bottom-tabs+7.15.12.patch rename to shared/patches/@react-navigation+bottom-tabs+8.0.0-alpha.26.patch index 8ff178fc8fef..4f8eb94421de 100644 --- a/shared/patches/@react-navigation+bottom-tabs+7.15.12.patch +++ b/shared/patches/@react-navigation+bottom-tabs+8.0.0-alpha.26.patch @@ -1,10 +1,10 @@ -diff --git a/node_modules/@react-navigation/bottom-tabs/lib/module/unstable/NativeBottomTabView.native.js b/node_modules/@react-navigation/bottom-tabs/lib/module/unstable/NativeBottomTabView.native.js -index dfcee2b..dd1b37a 100644 ---- a/node_modules/@react-navigation/bottom-tabs/lib/module/unstable/NativeBottomTabView.native.js -+++ b/node_modules/@react-navigation/bottom-tabs/lib/module/unstable/NativeBottomTabView.native.js -@@ -23,6 +23,10 @@ export function NativeBottomTabView({ - } = useTheme(); - const focusedRouteKey = state.routes[state.index].key; +diff --git a/node_modules/@react-navigation/bottom-tabs/lib/module/views/BottomTabViewNativeImpl.js b/node_modules/@react-navigation/bottom-tabs/lib/module/views/BottomTabViewNativeImpl.js +index 8c6a647..0f07d38 100644 +--- a/node_modules/@react-navigation/bottom-tabs/lib/module/views/BottomTabViewNativeImpl.js ++++ b/node_modules/@react-navigation/bottom-tabs/lib/module/views/BottomTabViewNativeImpl.js +@@ -36,6 +36,10 @@ export function BottomTabViewNative({ + } + const [pendingNavigation, setPendingNavigation] = React.useState(null); const previousRouteKeyRef = React.useRef(focusedRouteKey); + const [navStateRequest, setNavStateRequest] = React.useState(() => ({ + selectedScreenKey: state.routes[state.index].key, @@ -13,7 +13,7 @@ index dfcee2b..dd1b37a 100644 React.useEffect(() => { const previousRouteKey = previousRouteKeyRef.current; if (previousRouteKey !== focusedRouteKey && descriptors[previousRouteKey]?.options.popToTopOnBlur) { -@@ -109,9 +113,14 @@ export function NativeBottomTabView({ +@@ -168,9 +172,14 @@ export function BottomTabViewNative({ tabBarItemActiveIndicatorEnabled: currentOptions?.tabBarActiveIndicatorEnabled, tabBarItemRippleColor: currentOptions?.tabBarRippleColor, experimentalControlNavigationStateInJS: false, @@ -27,11 +27,11 @@ index dfcee2b..dd1b37a 100644 + selectedScreenKey: e.nativeEvent.selectedScreenKey, + baseProvenance: e.nativeEvent.provenance, + }); - navigation.emit({ + const event = navigation.emit({ type: 'tabPress', - target: route.key -@@ -190,9 +199,8 @@ export function NativeBottomTabView({ - closing: true, + target: route.key, +@@ -271,9 +280,8 @@ export function BottomTabViewNative({ + onDidAppear: () => onTransitionEnd({ route }), - tabKey: route.key, @@ -41,4 +41,4 @@ index dfcee2b..dd1b37a 100644 + ios: {icon: icon?.ios, selectedIcon: selectedIcon?.ios ?? selectedIcon?.shared}, tabBarItemBadgeBackgroundColor: badgeBackgroundColor, tabBarItemBadgeTextColor: badgeTextColor, - badgeValue: tabBarBadge?.toString(), + tabBarItemAccessibilityLabel: tabBarAccessibilityLabel, diff --git a/shared/patches/react-native-gesture-handler+3.0.0-beta.3.patch b/shared/patches/react-native-gesture-handler+3.0.0-beta.3.patch new file mode 100644 index 000000000000..e64acccfb9bc --- /dev/null +++ b/shared/patches/react-native-gesture-handler+3.0.0-beta.3.patch @@ -0,0 +1,15 @@ +diff --git a/node_modules/react-native-gesture-handler/apple/RNGestureHandlerRegistry.m b/node_modules/react-native-gesture-handler/apple/RNGestureHandlerRegistry.m +index 0c52243..9e7e4b9 100644 +--- a/node_modules/react-native-gesture-handler/apple/RNGestureHandlerRegistry.m ++++ b/node_modules/react-native-gesture-handler/apple/RNGestureHandlerRegistry.m +@@ -52,7 +52,9 @@ - (void)attachHandlerWithTag:(NSNumber *)handlerTag + handler = _handlers[handlerTag]; + } + +- RCTAssert(handler != nil, @"Handler for tag %@ does not exists", handlerTag); ++ if (handler == nil) { ++ return; ++ } + [handler unbindFromView]; + handler.actionType = actionType; + [handler bindToView:view]; diff --git a/shared/router-v2/react-navigation.d.ts b/shared/router-v2/react-navigation.d.ts index 27cc0898d72b..8f4032e3631d 100644 --- a/shared/router-v2/react-navigation.d.ts +++ b/shared/router-v2/react-navigation.d.ts @@ -1,10 +1,9 @@ import type {RootParamList as KBRootParamList} from './route-params' +import type {PrivateValueStore} from '@react-navigation/core' -declare global { - // eslint-disable-next-line @typescript-eslint/no-namespace - namespace ReactNavigation { - interface RootParamList extends KBRootParamList {} - } +declare module '@react-navigation/core' { + // eslint-disable-next-line @typescript-eslint/no-empty-object-type + interface RootNavigator extends PrivateValueStore<[KBRootParamList, unknown, unknown]> {} } export {} diff --git a/shared/router-v2/router.native.tsx b/shared/router-v2/router.native.tsx index 7e28c3c79eae..dd4bd2046a71 100644 --- a/shared/router-v2/router.native.tsx +++ b/shared/router-v2/router.native.tsx @@ -12,8 +12,7 @@ import logger from '@/logger' import {Platform, StatusBar, View} from 'react-native' import {HeaderLeftButton} from '@/common-adapters/header-buttons' import {NavigationContainer, type NavigationProp} from '@react-navigation/native' -// NAV8: import {createBottomTabNavigator} from '@react-navigation/bottom-tabs' -import {createNativeBottomTabNavigator} from '@react-navigation/bottom-tabs/unstable' // NAV7 +import {createBottomTabNavigator} from '@react-navigation/bottom-tabs' import {modalRoutes, routes, loggedOutRoutes, tabRoots, routeMapToStaticScreens} from './routes' import {createNativeStackNavigator} from '@react-navigation/native-stack' import {isLiquidGlassSupported as _isLiquidGlassSupported} from '@callstack/liquid-glass' @@ -47,8 +46,7 @@ const tabToLabel = new Map([ // just to get badge rollups const tabs = C.isTablet ? Tabs.tabletTabs : Tabs.phoneTabs -// NAV8: const Tab = createBottomTabNavigator() -const Tab = createNativeBottomTabNavigator() // NAV7 +const Tab = createBottomTabNavigator() const tabRoutes = routes const settingsTabChildren = [Tabs.gitTab, Tabs.devicesTab, Tabs.settingsTab] as const diff --git a/shared/settings/account/index.tsx b/shared/settings/account/index.tsx index f245d14bb75e..828e64988f5d 100644 --- a/shared/settings/account/index.tsx +++ b/shared/settings/account/index.tsx @@ -183,13 +183,10 @@ type AddedBannerState = { const AccountSettings = ({route}: Props) => { const addedEmailFromRoute = route.params?.addedEmailBannerEmail const addedPhoneFromRoute = !!route.params?.addedPhoneBanner - const navigation = - useNavigation< - NavigationProp< - Record, - typeof settingsAccountTab - > - >() + const navigation = useNavigation() as NavigationProp< + Record, + typeof settingsAccountTab + > const isFocused = useIsFocused() const emails = useSettingsEmailState(s => s.emails) const phones = useSettingsPhoneState(s => s.phones) diff --git a/shared/team-building/list-body.tsx b/shared/team-building/list-body.tsx index 5fe313d51b84..14dfd8b1537b 100644 --- a/shared/team-building/list-body.tsx +++ b/shared/team-building/list-body.tsx @@ -401,7 +401,7 @@ export const ListBody = ({ onFinishTeamBuilding, enterInputCounter, }: ListBodyProps) => { - const {params} = useRoute>() + const {params} = (useRoute() as RootRouteProps<'peopleTeamBuilder'>) const recommendedHideYourself = params.recommendedHideYourself ?? false const teamID = params.teamID const ResultRow = namespace === 'people' ? PeopleResult : UserResult diff --git a/shared/teams/add-members-wizard/confirm.tsx b/shared/teams/add-members-wizard/confirm.tsx index 6f3936ddd1f4..87d1297374cd 100644 --- a/shared/teams/add-members-wizard/confirm.tsx +++ b/shared/teams/add-members-wizard/confirm.tsx @@ -43,7 +43,7 @@ type TeamAddToTeamConfirmParamList = { const AddMembersConfirm = ({wizard: initialWizard}: Props) => { const navigation = - useNavigation>() + useNavigation() as NativeStackNavigationProp const [wizardState, setWizardState] = React.useState(() => ({ initialWizard, wizard: initialWizard, diff --git a/shared/teams/container.tsx b/shared/teams/container.tsx index c9491f78062d..16fb6ad7b5f7 100644 --- a/shared/teams/container.tsx +++ b/shared/teams/container.tsx @@ -82,7 +82,7 @@ const Connected = ({filter = '', sort = 'role'}: Props) => { })) const nav = useSafeNavigation() - const navigation = useNavigation>() + const navigation = useNavigation() as NativeStackNavigationProp const onCreateTeam = () => nav.safeNavigateAppend({name: 'teamWizard1TeamPurpose', params: {wizard: makeNewTeamWizard()}}) const onJoinTeam = () => nav.safeNavigateAppend({name: 'teamJoinTeamDialog', params: {}}) diff --git a/shared/teams/get-options.tsx b/shared/teams/get-options.tsx index 0d8df4314033..86c3634218c6 100644 --- a/shared/teams/get-options.tsx +++ b/shared/teams/get-options.tsx @@ -24,9 +24,9 @@ const useHeaderActions = () => { } const TeamsFilter = () => { - const route = useRoute>() + const route = useRoute() as RouteProp const params = route.params - const navigation = useNavigation>() + const navigation = useNavigation() as NativeStackNavigationProp const filterValue = params.filter ?? '' const {teams} = useTeamsList() const numTeams = teams.length diff --git a/shared/teams/join-team/container.tsx b/shared/teams/join-team/container.tsx index 9e977f16b95d..fcb270dd37c0 100644 --- a/shared/teams/join-team/container.tsx +++ b/shared/teams/join-team/container.tsx @@ -33,9 +33,8 @@ const ContainerInner = ({initialTeamname, success: successParam}: OwnProps) => { const [successTeamName, setSuccessTeamName] = React.useState('') const [name, _setName] = React.useState(initialTeamname ?? '') const joinTeam = C.useRPC(T.RPCGen.teamsTeamAcceptInviteOrRequestAccessRpcListener) - const navigation = useNavigation< - NativeStackNavigationProp - >() + const navigation = + useNavigation() as NativeStackNavigationProp const navigateUp = C.Router2.navigateUp const success = !!successParam const handoffToInviteRef = React.useRef(false) diff --git a/shared/teams/new-team/wizard/add-subteam-members.tsx b/shared/teams/new-team/wizard/add-subteam-members.tsx index f943e5463a30..87b80447e294 100644 --- a/shared/teams/new-team/wizard/add-subteam-members.tsx +++ b/shared/teams/new-team/wizard/add-subteam-members.tsx @@ -21,9 +21,7 @@ type TeamWizardSubteamMembersParamList = { const AddSubteamMembers = ({wizard: wizardState}: Props) => { const navigation = - useNavigation< - NativeStackNavigationProp - >() + useNavigation() as NativeStackNavigationProp const [selectedMembers, setSelectedMembers] = React.useState(new Set()) const [filter, setFilter] = React.useState('') const filterL = filter.toLowerCase() diff --git a/shared/teams/new-team/wizard/create-channels.tsx b/shared/teams/new-team/wizard/create-channels.tsx index df617adca51f..2c736a17ddca 100644 --- a/shared/teams/new-team/wizard/create-channels.tsx +++ b/shared/teams/new-team/wizard/create-channels.tsx @@ -99,7 +99,7 @@ type TeamWizard5ChannelsParamList = { const WizardCreateChannels = ({wizard: initialWizard}: WizardProps) => { const navigation = - useNavigation>() + useNavigation() as NativeStackNavigationProp const navigateAppend = C.Router2.navigateAppend return ( { const navigation = - useNavigation>() + useNavigation() as NativeStackNavigationProp const navigateAppend = C.Router2.navigateAppend const teamname = wizardState.name const initialSubteams = wizardState.subteams ?? ['', '', ''] diff --git a/shared/teams/new-team/wizard/make-big-team.tsx b/shared/teams/new-team/wizard/make-big-team.tsx index 9d9486456264..af23cfe9fbd6 100644 --- a/shared/teams/new-team/wizard/make-big-team.tsx +++ b/shared/teams/new-team/wizard/make-big-team.tsx @@ -14,7 +14,7 @@ type TeamWizard4TeamSizeParamList = { const MakeBigTeam = ({wizard: initialWizard}: Props) => { const navigation = - useNavigation>() + useNavigation() as NativeStackNavigationProp const navigateAppend = C.Router2.navigateAppend const onSubmit = (isBig: boolean) => { const wizard = {...initialWizard, isBig} diff --git a/shared/teams/new-team/wizard/new-team-info.tsx b/shared/teams/new-team/wizard/new-team-info.tsx index 4b95992c981b..f58a004a3611 100644 --- a/shared/teams/new-team/wizard/new-team-info.tsx +++ b/shared/teams/new-team/wizard/new-team-info.tsx @@ -37,7 +37,7 @@ type TeamWizard2TeamInfoParamList = { const NewTeamInfo = ({wizard: teamWizardState}: Props) => { const navigation = - useNavigation>() + useNavigation() as NativeStackNavigationProp const parentTeamID = teamWizardState.parentTeamID ?? T.Teams.noTeamID const { teamMeta: {teamname: loadedParentName}, diff --git a/shared/teams/new-team/wizard/team-purpose.tsx b/shared/teams/new-team/wizard/team-purpose.tsx index c3a8b6bcf459..e82d39c0db9f 100644 --- a/shared/teams/new-team/wizard/team-purpose.tsx +++ b/shared/teams/new-team/wizard/team-purpose.tsx @@ -15,7 +15,7 @@ type TeamWizard1TeamPurposeParamList = { const TeamPurpose = ({wizard: wizardParam}: Props) => { const navigation = - useNavigation>() + useNavigation() as NativeStackNavigationProp const navigateAppend = C.Router2.navigateAppend const wizard = wizardParam ?? makeNewTeamWizard() const onSubmit = (teamType: T.Teams.TeamWizardTeamType) => { diff --git a/shared/test/mocks/react-navigation-native.js b/shared/test/mocks/react-navigation-native.js new file mode 100644 index 000000000000..b460963e8d05 --- /dev/null +++ b/shared/test/mocks/react-navigation-native.js @@ -0,0 +1,9 @@ +/* global exports, require */ +const core = require('./react-navigation-core.js') + +Object.assign(exports, core) + +exports.useRoute = () => ({key: 'mock-route', name: 'mock', params: {}}) +exports.useNavigationState = selector => selector({index: 0, key: 'nav-state', routeNames: [], routes: [], stale: false, type: 'tab'}) +exports.NavigationContainer = core.useNavigationBuilder +exports.createStaticNavigation = () => () => null diff --git a/shared/yarn.lock b/shared/yarn.lock index b03cc4d184c5..32fad065cc68 100644 --- a/shared/yarn.lock +++ b/shared/yarn.lock @@ -2834,65 +2834,62 @@ invariant "^2.2.4" nullthrows "^1.1.1" -"@react-navigation/bottom-tabs@7.15.12": - version "7.15.12" - resolved "https://registry.yarnpkg.com/@react-navigation/bottom-tabs/-/bottom-tabs-7.15.12.tgz#2ff60a29ea54969fa90693cd31563a5726e3f013" - integrity sha512-Kp7oUEWgUB3NLBbgPkE8DGPtHU6jfhqPQGhFlUYYJ+PeoFcRX++Y1GMn90yYanCKpob8I7l6/YbzhN39owO06Q== +"@react-navigation/bottom-tabs@8.0.0-alpha.28": + version "8.0.0-alpha.28" + resolved "https://registry.yarnpkg.com/@react-navigation/bottom-tabs/-/bottom-tabs-8.0.0-alpha.28.tgz#0a38385f69f9cf1b8e4601e4768350afbd212842" + integrity sha512-3pFJCXf520hPyxGz1RDeEMRsyh/h60/0VW6V11OAZ22WqBLeDtINl0QVc0X1xybQQKdZuvcLM92AomiBcoi37Q== dependencies: - "@react-navigation/elements" "^2.9.16" - color "^4.2.3" - sf-symbols-typescript "^2.1.0" + "@react-navigation/elements" "^3.0.0-alpha.26" -"@react-navigation/core@7.17.3", "@react-navigation/core@^7.17.3": - version "7.17.3" - resolved "https://registry.yarnpkg.com/@react-navigation/core/-/core-7.17.3.tgz#59dd91fc6700f280d846ad08d1011fd198ccfa65" - integrity sha512-cFOzT4d6oOjdAWwk69onVQXhEN1CHmGau5zCP5DO9mLeO/N1Db0a/ZXP57fn0t/6lf7OPX8vl6tPcv3lBR4F/Q== +"@react-navigation/core@8.0.0-alpha.14", "@react-navigation/core@^8.0.0-alpha.14": + version "8.0.0-alpha.14" + resolved "https://registry.yarnpkg.com/@react-navigation/core/-/core-8.0.0-alpha.14.tgz#cbdb00a764f134e1010203a0250624343cbf0321" + integrity sha512-a8Sz+/LAMWzm/s+fvxqBirmRRXdNInhsITO2ATtPgnKgPia2LvAXRyfHabxei0g8BTUMWJ/HKZN1t+vDeHectQ== dependencies: - "@react-navigation/routers" "^7.5.4" - escape-string-regexp "^4.0.0" + "@react-navigation/routers" "^8.0.0-alpha.8" + escape-string-regexp "^5.0.0" fast-deep-equal "^3.1.3" - nanoid "^3.3.11" - query-string "^7.1.3" + nanoid "^5.1.7" + query-string "^9.3.1" react-is "^19.1.0" - use-latest-callback "^0.2.4" - use-sync-external-store "^1.5.0" + use-latest-callback "^0.3.3" + use-sync-external-store "^1.6.0" -"@react-navigation/elements@^2.9.16": - version "2.9.16" - resolved "https://registry.yarnpkg.com/@react-navigation/elements/-/elements-2.9.16.tgz#a18df588794290b1fb40d6722084e128aff82fd7" - integrity sha512-uScoLXOvQwdj7w9hn69kyubNYm7EZMAX9fAqbrTIA8mYUAv+9qfhJxOcO8VXcoT0Vm8EKNDXqg5n5WNxcdN0Ww== +"@react-navigation/elements@^3.0.0-alpha.26": + version "3.0.0-alpha.26" + resolved "https://registry.yarnpkg.com/@react-navigation/elements/-/elements-3.0.0-alpha.26.tgz#f4850d0d89419f0af8f49a934e93e16a3222534e" + integrity sha512-vWIsLRA8/054QjAW4uWdzyMIPGF6foiryB2os0WchTZEB1R/E4LMGRYzP8hN3BmyUV9Fq5LPIybeUfdzTahJ+w== dependencies: - color "^4.2.3" - use-latest-callback "^0.2.4" - use-sync-external-store "^1.5.0" + sf-symbols-typescript "^2.2.0" + use-latest-callback "^0.3.3" + use-sync-external-store "^1.6.0" -"@react-navigation/native-stack@7.14.13": - version "7.14.13" - resolved "https://registry.yarnpkg.com/@react-navigation/native-stack/-/native-stack-7.14.13.tgz#3f1921210784ad52ecb2ba0a9d9fd54bd2e0670b" - integrity sha512-o6hNgvwUiKZFIFQI+27YndmtSRxgJXFAJDwkBhmNeD8EEdJUxom2NDKzqFPjwsDYQIRYXJmIHR3Qz2cRsGwSYg== +"@react-navigation/native-stack@8.0.0-alpha.29": + version "8.0.0-alpha.29" + resolved "https://registry.yarnpkg.com/@react-navigation/native-stack/-/native-stack-8.0.0-alpha.29.tgz#e235e0f06247c718f9038cda6cb26c3ef3fe41da" + integrity sha512-Cen0Y1SHtq+cm0g8k8knMFulQbh8HcmpQxCvlWcWRth+rBpoHpfq3Y9AJXXqk+e328HOOF1LHXOHHQK8DRRUIg== dependencies: - "@react-navigation/elements" "^2.9.16" - color "^4.2.3" - sf-symbols-typescript "^2.1.0" + "@react-navigation/elements" "^3.0.0-alpha.26" warn-once "^0.1.1" -"@react-navigation/native@7.2.3": - version "7.2.3" - resolved "https://registry.yarnpkg.com/@react-navigation/native/-/native-7.2.3.tgz#2e99ce62f3163c4c3adc7941ef844ba587191d51" - integrity sha512-Q6vENZJnrRUmNzPa8m/SINzV0IQ2ndEQvVHQaJ0M1TvtyB8OWO/3hCl3ukWvnRUakroFNgwYokBXUaRhVvqU6g== +"@react-navigation/native@8.0.0-alpha.23": + version "8.0.0-alpha.23" + resolved "https://registry.yarnpkg.com/@react-navigation/native/-/native-8.0.0-alpha.23.tgz#74ab770f850cb56b84cc201ea127b1d35d4333d9" + integrity sha512-b4dgkRvT3fjyqT3KS+Ez98yLE2iZtTd9u/k6iufKxCvKRkydHtzd0wrqr93mObWTgKV7FXYpD1hngZePMnY37A== dependencies: - "@react-navigation/core" "^7.17.3" - escape-string-regexp "^4.0.0" + "@react-navigation/core" "^8.0.0-alpha.14" + escape-string-regexp "^5.0.0" fast-deep-equal "^3.1.3" - nanoid "^3.3.11" - use-latest-callback "^0.2.4" + nanoid "^5.1.7" + sf-symbols-typescript "^2.2.0" + use-latest-callback "^0.3.3" -"@react-navigation/routers@^7.5.4": - version "7.5.4" - resolved "https://registry.yarnpkg.com/@react-navigation/routers/-/routers-7.5.4.tgz#8428ee79ebf67c12b2a5391cab2214c94490b197" - integrity sha512-5ONLNA3hKwAo3n95ENaZvWHkLeC8+7dgy8U/D+mO0Tvrih21nfxGNRqizI+qN2gxryWvYRk/pq5NsnTw6TtZbg== +"@react-navigation/routers@^8.0.0-alpha.8": + version "8.0.0-alpha.8" + resolved "https://registry.yarnpkg.com/@react-navigation/routers/-/routers-8.0.0-alpha.8.tgz#8ba069a60d303f30243bc9a72975bd88684c3194" + integrity sha512-3mvxz+P94FpdN9tZCzpqe7tOdVAt3DHxSG3Tr/KDFJxzraDdvfi31KIDKWNUGtl9xzUQZK9516MA1bSa4WOKSw== dependencies: - nanoid "^3.3.11" + nanoid "^5.1.7" "@rollup/pluginutils@^5.1.3": version "5.3.0" @@ -4827,27 +4824,11 @@ color-name@1.1.3: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== -color-name@^1.0.0, color-name@~1.1.4: +color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -color-string@^1.9.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" - integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== - dependencies: - color-name "^1.0.0" - simple-swizzle "^0.2.2" - -color@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/color/-/color-4.2.3.tgz#d781ecb5e57224ee43ea9627560107c0e0c6463a" - integrity sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A== - dependencies: - color-convert "^2.0.1" - color-string "^1.9.0" - colorette@^1.0.7: version "1.4.0" resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40" @@ -5147,10 +5128,10 @@ decimal.js@^10.5.0: resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.6.0.tgz#e649a43e3ab953a72192ff5983865e509f37ed9a" integrity sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg== -decode-uri-component@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" - integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== +decode-uri-component@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.4.1.tgz#2ac4859663c704be22bf7db760a1494a49ab2cc5" + integrity sha512-+8VxcR21HhTy8nOt6jf20w0c9CADrw1O8d+VZ/YzzCt4bJ3uBjw+D1q2osAB8RnpwwaeYBxy0HyKQxD5JBMuuQ== dedent@^1.6.0: version "1.7.2" @@ -5634,6 +5615,11 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== +escape-string-regexp@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" + integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== + eslint-config-prettier@^8.5.0: version "8.10.2" resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.10.2.tgz#0642e53625ebc62c31c24726b0f050df6bd97a2e" @@ -6297,10 +6283,10 @@ fill-range@^7.1.1: dependencies: to-regex-range "^5.0.1" -filter-obj@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b" - integrity sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ== +filter-obj@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-5.1.0.tgz#5bd89676000a713d7db2e197f660274428e524ed" + integrity sha512-qWeTREPoT7I0bifpPUXtxkZJ1XJzxWtfoWWkdVGqa+eCr3SHW/Ocp89o8vLvbUuQnadybJpjOKu4V+RwO6sGng== finalhandler@1.1.2: version "1.1.2" @@ -7075,11 +7061,6 @@ is-arrayish@^0.2.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== -is-arrayish@^0.3.1: - version "0.3.4" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.4.tgz#1ee5553818511915685d33bb13d31bf854e5059d" - integrity sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA== - is-async-function@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.1.1.tgz#3e69018c8e04e73b738793d020bfe884b9fd3523" @@ -8725,6 +8706,11 @@ nanoid@^3.3.1, nanoid@^3.3.11, nanoid@^3.3.7: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== +nanoid@^5.1.7: + version "5.1.11" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-5.1.11.tgz#559dbdbc41737da341ac938c25514563d2dd94c7" + integrity sha512-v+KEsUv2ps74PaSKv0gHTxTCgMXOIfBEbaqa6w6ISIGC7ZsvHN4N9oJ8d4cmf0n5oTzQz2SLmThbQWhjd/8eKg== + napi-postinstall@^0.3.0: version "0.3.4" resolved "https://registry.yarnpkg.com/napi-postinstall/-/napi-postinstall-0.3.4.tgz#7af256d6588b5f8e952b9190965d6b019653bbb9" @@ -9552,15 +9538,14 @@ qs@~6.14.0: dependencies: side-channel "^1.1.0" -query-string@^7.1.3: - version "7.1.3" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-7.1.3.tgz#a1cf90e994abb113a325804a972d98276fe02328" - integrity sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg== +query-string@^9.3.1: + version "9.3.1" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-9.3.1.tgz#d0c93e6c7fb7c17bdf04aa09e382114580ede270" + integrity sha512-5fBfMOcDi5SA9qj5jZhWAcTtDfKF5WFdd2uD9nVNlbxVv1baq65aALy6qofpNEGELHvisjjasxQp7BlM9gvMzw== dependencies: - decode-uri-component "^0.2.2" - filter-obj "^1.1.0" - split-on-first "^1.0.0" - strict-uri-encode "^2.0.0" + decode-uri-component "^0.4.1" + filter-obj "^5.1.0" + split-on-first "^3.0.0" queue-microtask@^1.2.2: version "1.2.3" @@ -10284,7 +10269,7 @@ setprototypeof@1.2.0, setprototypeof@~1.2.0: resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== -sf-symbols-typescript@^2.1.0, sf-symbols-typescript@^2.2.0: +sf-symbols-typescript@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/sf-symbols-typescript/-/sf-symbols-typescript-2.2.0.tgz#926d6e0715e3d8784cadf7658431e36581254208" integrity sha512-TPbeg0b7ylrswdGCji8FRGFAKuqbpQlLbL8SOle3j1iHSs5Ob5mhvMAxWN2UItOjgALAB5Zp3fmMfj8mbWvXKw== @@ -10372,13 +10357,6 @@ simple-plist@^1.1.0: bplist-parser "0.3.1" plist "^3.0.5" -simple-swizzle@^0.2.2: - version "0.2.4" - resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.4.tgz#a8d11a45a11600d6a1ecdff6363329e3648c3667" - integrity sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw== - dependencies: - is-arrayish "^0.3.1" - sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" @@ -10481,10 +10459,10 @@ spdy@^4.0.2: select-hose "^2.0.0" spdy-transport "^3.0.0" -split-on-first@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" - integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw== +split-on-first@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-3.0.0.tgz#f04959c9ea8101b9b0bbf35a61b9ebea784a23e7" + integrity sha512-qxQJTx2ryR0Dw0ITYyekNQWpz6f8dGd7vffGNflQQ3Iqj9NJ6qiZ7ELpZsJ/QBhIVAiDfXdag3+Gp8RvWa62AA== sprintf-js@~1.0.2: version "1.0.3" @@ -10538,11 +10516,6 @@ stream-buffers@2.2.x: resolved "https://registry.yarnpkg.com/stream-buffers/-/stream-buffers-2.2.0.tgz#91d5f5130d1cef96dcfa7f726945188741d09ee4" integrity sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg== -strict-uri-encode@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" - integrity sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ== - strict-url-sanitise@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/strict-url-sanitise/-/strict-url-sanitise-0.0.1.tgz#10cfac63c9dfdd856d98ab9f76433dad5ce99e0c" @@ -11190,12 +11163,12 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -use-latest-callback@^0.2.4: - version "0.2.6" - resolved "https://registry.yarnpkg.com/use-latest-callback/-/use-latest-callback-0.2.6.tgz#e5ea752808c86219acc179ace0ae3c1203255e77" - integrity sha512-FvRG9i1HSo0wagmX63Vrm8SnlUU3LMM3WyZkQ76RnslpBrX694AdG4A0zQBx2B3ZifFA0yv/BaEHGBnEax5rZg== +use-latest-callback@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/use-latest-callback/-/use-latest-callback-0.3.3.tgz#62f3c2a949087605741624850e4be6429e8fe3f1" + integrity sha512-G9A/EL7okx4wzBfATt8bdGg0v1K0Gp0IClTzljffM63gtPisgDKCaLCLUb4g2M4CoXDg5yyHjOU+g3SUPbXwrA== -use-sync-external-store@^1.5.0: +use-sync-external-store@^1.5.0, use-sync-external-store@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz#b174bfa65cb2b526732d9f2ac0a408027876f32d" integrity sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==