From 3e1e1ba00e60c7d4fe93f2e8e2d94cfc1385815f Mon Sep 17 00:00:00 2001 From: Alex Benzer Date: Mon, 29 Dec 2025 01:38:04 -0800 Subject: [PATCH 01/15] Better copy for "must be signed in" message (#9602) --- bskyweb/templates/post.html | 8 ++++---- .../components/ThreadItemAnchorNoUnauthenticated.tsx | 5 ++++- .../components/ThreadItemPostNoUnauthenticated.tsx | 5 ++++- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/bskyweb/templates/post.html b/bskyweb/templates/post.html index 5c7c844e6..6b6516288 100644 --- a/bskyweb/templates/post.html +++ b/bskyweb/templates/post.html @@ -108,9 +108,9 @@ {% else %} {% endif -%} - - - + + + {% endif -%} {%- endblock %} @@ -129,7 +129,7 @@

Post

{{ profileHandle }}

-

This post requires authentication to view.

+

This author has chosen to make their posts visible only to people who are signed in.

{% endif -%} {%- endblock %} diff --git a/src/screens/PostThread/components/ThreadItemAnchorNoUnauthenticated.tsx b/src/screens/PostThread/components/ThreadItemAnchorNoUnauthenticated.tsx index c8477e211..ad91eee53 100644 --- a/src/screens/PostThread/components/ThreadItemAnchorNoUnauthenticated.tsx +++ b/src/screens/PostThread/components/ThreadItemAnchorNoUnauthenticated.tsx @@ -24,7 +24,10 @@ export function ThreadItemAnchorNoUnauthenticated() { - You must sign in to view this post. + + This author has chosen to make their posts visible only to people + who are signed in. + diff --git a/src/screens/PostThread/components/ThreadItemPostNoUnauthenticated.tsx b/src/screens/PostThread/components/ThreadItemPostNoUnauthenticated.tsx index 552d8f813..aa70048b6 100644 --- a/src/screens/PostThread/components/ThreadItemPostNoUnauthenticated.tsx +++ b/src/screens/PostThread/components/ThreadItemPostNoUnauthenticated.tsx @@ -44,7 +44,10 @@ export function ThreadItemPostNoUnauthenticated({ - You must sign in to view this post. + + This author has chosen to make their posts visible only to people + who are signed in. + Date: Mon, 29 Dec 2025 09:38:40 +0000 Subject: [PATCH 02/15] Temporarily use English for Esperanto `intl-displaynames` polyfill (#9574) * use English for Esperanto `intl-displaynames` until bug is fixed * Update src/locale/i18n.ts Co-authored-by: Samuel Newman --------- Co-authored-by: Samuel Newman --- src/locale/i18n.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/locale/i18n.ts b/src/locale/i18n.ts index 39b6e231a..6e5a5d0de 100644 --- a/src/locale/i18n.ts +++ b/src/locale/i18n.ts @@ -138,7 +138,8 @@ export async function dynamicActivate(locale: AppLanguage) { await Promise.all([ import('@formatjs/intl-pluralrules/locale-data/eo'), import('@formatjs/intl-numberformat/locale-data/eo'), - import('@formatjs/intl-displaynames/locale-data/eo'), + // borked, see https://github.com/bluesky-social/social-app/pull/9574 + // import('@formatjs/intl-displaynames/locale-data/eo'), ]) break } -- 2.51.2 From f390167f6655c973f206bf2edb57496cf8a8ed30 Mon Sep 17 00:00:00 2001 From: Alex Benzer Date: Mon, 29 Dec 2025 02:00:29 -0800 Subject: [PATCH 03/15] Remove unwanted drop shadow on "see more" card on Android (#9584) --- src/components/FeedInterstitials.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/components/FeedInterstitials.tsx b/src/components/FeedInterstitials.tsx index 267d303be..6db4b858c 100644 --- a/src/components/FeedInterstitials.tsx +++ b/src/components/FeedInterstitials.tsx @@ -770,7 +770,6 @@ export function ProfileGrid({ } function SeeMoreSuggestedProfilesCard({onPress}: {onPress: () => void}) { - const t = useTheme() const {_} = useLingui() return ( @@ -784,7 +783,6 @@ function SeeMoreSuggestedProfilesCard({onPress}: {onPress: () => void}) { a.gap_sm, a.p_md, a.rounded_lg, - t.atoms.shadow_sm, {width: FINAL_CARD_WIDTH}, ]}> -- 2.51.2 From caa02db87b2a0620a5406da8da1ba8ae03460034 Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Mon, 29 Dec 2025 20:16:49 +0200 Subject: [PATCH 04/15] Update react native screens, remove patch (#9210) * update react native screens * bump rns * see if nightly works * update nightly * yay it's out * update react-nav * update drawer layout and remove patch * Update createNativeStackNavigatorWithAuth.tsx * render drawer as "layout" component * rm react-nav/drawer (unused) * restore drawer layout patch --- package.json | 11 +- ...=> react-native-drawer-layout+4.2.1.patch} | 4 +- patches/react-native-screens+4.16.0.patch | 326 ------------------ src/Navigation.tsx | 6 +- .../createNativeStackNavigatorWithAuth.tsx | 6 +- src/view/shell/index.tsx | 11 +- yarn.lock | 107 +++--- 7 files changed, 78 insertions(+), 393 deletions(-) rename patches/{react-native-drawer-layout+4.1.10.patch => react-native-drawer-layout+4.2.1.patch} (94%) delete mode 100644 patches/react-native-screens+4.16.0.patch diff --git a/package.json b/package.json index c1a3bb47b..1772d619f 100644 --- a/package.json +++ b/package.json @@ -98,10 +98,9 @@ "@miblanchard/react-native-slider": "^2.6.0", "@mozzius/expo-dynamic-app-icon": "^1.8.0", "@react-native-async-storage/async-storage": "2.2.0", - "@react-navigation/bottom-tabs": "^7.3.13", - "@react-navigation/drawer": "^7.3.12", - "@react-navigation/native": "^7.1.9", - "@react-navigation/native-stack": "^7.3.13", + "@react-navigation/bottom-tabs": "^7.9.0", + "@react-navigation/native": "^7.1.26", + "@react-navigation/native-stack": "^7.9.0", "@sentry/react-native": "~6.20.0", "@tanstack/query-async-storage-persister": "^5.25.0", "@tanstack/react-query": "5.25.0", @@ -194,7 +193,7 @@ "react-native-compressor": "^1.13.0", "react-native-date-picker": "^5.0.13", "react-native-device-attest": "^0.1.6", - "react-native-drawer-layout": "^4.1.8", + "react-native-drawer-layout": "^4.2.1", "react-native-edge-to-edge": "^1.6.0", "react-native-gesture-handler": "~2.28.0", "react-native-get-random-values": "~1.11.0", @@ -204,7 +203,7 @@ "react-native-qrcode-styled": "^0.3.3", "react-native-reanimated": "^3.19.1", "react-native-safe-area-context": "~5.6.0", - "react-native-screens": "~4.16.0", + "react-native-screens": "^4.19.0", "react-native-svg": "15.12.1", "react-native-uitextview": "^1.4.0", "react-native-url-polyfill": "^1.3.0", diff --git a/patches/react-native-drawer-layout+4.1.10.patch b/patches/react-native-drawer-layout+4.2.1.patch similarity index 94% rename from patches/react-native-drawer-layout+4.1.10.patch rename to patches/react-native-drawer-layout+4.2.1.patch index d4c0731f5..ffa36db10 100644 --- a/patches/react-native-drawer-layout+4.1.10.patch +++ b/patches/react-native-drawer-layout+4.2.1.patch @@ -1,5 +1,5 @@ diff --git a/node_modules/react-native-drawer-layout/lib/module/views/Drawer.native.js b/node_modules/react-native-drawer-layout/lib/module/views/Drawer.native.js -index efa71f9..a23c624 100644 +index 40fdcdb..770fd67 100644 --- a/node_modules/react-native-drawer-layout/lib/module/views/Drawer.native.js +++ b/node_modules/react-native-drawer-layout/lib/module/views/Drawer.native.js @@ -124,15 +124,21 @@ export function Drawer({ @@ -31,7 +31,7 @@ index efa71f9..a23c624 100644 - }, finished => runOnJS(onAnimationEnd)(open, finished)); + }, finished => { + animatingTo.value = null; -+ runOnJS(onAnimationEnd)(open, finished) ++ runOnJS(onAnimationEnd)(open, finished); + }); if (open) { runOnJS(onOpen)(); diff --git a/patches/react-native-screens+4.16.0.patch b/patches/react-native-screens+4.16.0.patch deleted file mode 100644 index 8be75c770..000000000 --- a/patches/react-native-screens+4.16.0.patch +++ /dev/null @@ -1,326 +0,0 @@ -diff --git a/node_modules/react-native-screens/ios/RNSScreen.mm b/node_modules/react-native-screens/ios/RNSScreen.mm -index b62a2e2..cb469db 100644 ---- a/node_modules/react-native-screens/ios/RNSScreen.mm -+++ b/node_modules/react-native-screens/ios/RNSScreen.mm -@@ -729,9 +729,26 @@ - (void)notifyTransitionProgress:(double)progress closing:(BOOL)closing goingFor - #endif - } - --#if !RCT_NEW_ARCH_ENABLED -+- (void)willMoveToWindow:(UIWindow *)newWindow -+{ -+ if (@available(iOS 26, *)) { -+ // In iOS 26, as soon as another screen appears in transition, it is interactable -+ // To avoid glitches resulting from clicking buttons mid transition, we temporarily disable all interactions -+ // Disabling interactions for parent navigation controller won't be enough in case of nested stack -+ // Furthermore, a stack put inside a modal will exist in an entirely different hierarchy -+ // To be sure, we block interactions on the whole window. -+ // Note that newWindows is nil when moving from instead of moving to, and Obj-C handles nil correctly -+ newWindow.userInteractionEnabled = false; -+ } -+} -+ - - (void)presentationControllerWillDismiss:(UIPresentationController *)presentationController - { -+ if (@available(iOS 26, *)) { -+ // Disable interactions to disallow multiple modals dismissed at once; see willMoveToWindow -+ presentationController.containerView.window.userInteractionEnabled = false; -+ } -+#if !RCT_NEW_ARCH_ENABLED - // On Paper, we need to call both "cancel" and "reset" here because RN's gesture - // recognizer does not handle the scenario when it gets cancelled by other top - // level gesture recognizer. In this case by the modal dismiss gesture. -@@ -744,8 +761,8 @@ - (void)presentationControllerWillDismiss:(UIPresentationController *)presentati - // down. - [_touchHandler cancel]; - [_touchHandler reset]; --} - #endif // !RCT_NEW_ARCH_ENABLED -+} - - - (BOOL)presentationControllerShouldDismiss:(UIPresentationController *)presentationController - { -@@ -757,6 +774,10 @@ - (BOOL)presentationControllerShouldDismiss:(UIPresentationController *)presenta - - - (void)presentationControllerDidAttemptToDismiss:(UIPresentationController *)presentationController - { -+ if (@available(iOS 26, *)) { -+ // Reenable interactions; see presentationControllerWillDismiss -+ presentationController.containerView.window.userInteractionEnabled = true; -+ } - // NOTE(kkafar): We should consider depracating the use of gesture cancel here & align - // with usePreventRemove API of react-navigation v7. - [self notifyGestureCancel]; -@@ -767,6 +788,11 @@ - (void)presentationControllerDidAttemptToDismiss:(UIPresentationController *)pr - - - (void)presentationControllerDidDismiss:(UIPresentationController *)presentationController - { -+ if (@available(iOS 26, *)) { -+ // Reenable interactions; see presentationControllerWillDismiss -+ // Dismissed screen doesn't hold a reference to window, but presentingViewController.view does -+ presentationController.presentingViewController.view.window.userInteractionEnabled = true; -+ } - if ([_reactSuperview respondsToSelector:@selector(presentationControllerDidDismiss:)]) { - [_reactSuperview performSelector:@selector(presentationControllerDidDismiss:) withObject:presentationController]; - } -@@ -1518,6 +1544,10 @@ - (void)viewWillDisappear:(BOOL)animated - - - (void)viewDidAppear:(BOOL)animated - { -+ if (@available(iOS 26, *)) { -+ // Reenable interactions, see willMoveToWindow -+ self.view.window.userInteractionEnabled = true; -+ } - [super viewDidAppear:animated]; - if (!_isSwiping || _shouldNotify) { - // we are going forward or dismissing without swipe -diff --git a/node_modules/react-native-screens/ios/RNSScreenStack.mm b/node_modules/react-native-screens/ios/RNSScreenStack.mm -index 229dc58..10b365b 100644 ---- a/node_modules/react-native-screens/ios/RNSScreenStack.mm -+++ b/node_modules/react-native-screens/ios/RNSScreenStack.mm -@@ -62,26 +62,6 @@ @interface RNSScreenStackView () < - - @implementation RNSNavigationController - --#if RNS_IPHONE_OS_VERSION_AVAILABLE(26_0) --- (void)viewDidLoad --{ -- // iOS 26 introduces new gesture recognizer which replaces our RNSPanGestureRecognizer. -- // The problem is that we are not able to handle it here for various reasons: -- // - the new recognizer comes with its own delegate and our current approach is to wire -- // all recognizers to RNSScreenStackView; to be 100% sure we don't break the logic, -- // we would have to decorate its delegate and call it after our code, which would -- // break other recognizers that the stack view is the delegate for -- // - when RNSScreenStackView.setupGestureHandler method is called, the recognizer hasn't been -- // loaded yet and there is no other place to configure in a not "hacky" way -- // - the official docs warn us to not use it for anything other than "setting up failure requirements with it" -- // - we expose fullScreenGestureEnabled prop to enable/disable the feature, -- // so we need control over the delegate -- if (@available(iOS 26.0, *)) { -- self.interactiveContentPopGestureRecognizer.enabled = NO; -- } --} --#endif // iOS 26 -- - #if !TARGET_OS_TV - - (UIViewController *)childViewControllerForStatusBarStyle - { -@@ -219,50 +199,6 @@ - (bool)onRepeatedTabSelectionOfTabScreenController:(RNSTabsScreenViewController - return false; - } - --#pragma mark - UINavigationBarDelegate -- --#if RNS_IPHONE_OS_VERSION_AVAILABLE(26_0) --- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item --{ -- if (@available(iOS 26, *)) { -- // To prevent popping multiple screens when back button is pressed repeatedly, -- // We allow for pop operation to proceed only if no transition is in progress, -- // which we check indirectly by checking if transitionCoordinator is set. -- // If it's not, we are safe to proceed. -- if (self.transitionCoordinator == nil) { -- // We still need to disable interactions for back button so click effects are not applied, -- // and there is unfortunately no better place for it currently -- UIView *button = [navigationBar rnscreens_findBackButtonWrapperView]; -- if (button != nil) { -- button.userInteractionEnabled = false; -- } -- -- return true; -- } -- -- return false; -- } -- -- return true; --} -- --- (void)navigationBar:(UINavigationBar *)navigationBar didPopItem:(UINavigationItem *)item --{ -- if (@available(iOS 26, *)) { -- // Reset interactions on back button -> see navigationBar:shouldPopItem -- // IMPORTANT: This reset won't execute when preventNativeDismiss is on. -- // However, on iOS 26, unlike in previous versions, the back button instance changes -- // when handling preventNativeDismiss and userIteractionEnabled is reset. -- // The instance also changes when regular screen pop happens, but in that case -- // the value of userInteractionEnabled is carried on, and we reset it here. -- UIView *button = [navigationBar rnscreens_findBackButtonWrapperView]; -- if (button != nil) { -- button.userInteractionEnabled = true; -- } -- } --} --#endif // Check for iOS >= 26 -- - #pragma mark - RNSFrameCorrectionProvider - - #ifdef RNS_GAMMA_ENABLED -@@ -327,7 +263,7 @@ @implementation RNSScreenStackView { - UINavigationController *_controller; - NSMutableArray *_reactSubviews; - BOOL _invalidated; -- BOOL _isFullWidthSwiping; -+ BOOL _isFullWidthSwipingWithPanGesture; // used only for content swipe with RNSPanGestureRecognizer - RNSPercentDrivenInteractiveTransition *_interactionController; - __weak RNSScreenStackManager *_manager; - BOOL _updateScheduled; -@@ -522,6 +458,11 @@ - (void)reactAddControllerToClosestParent:(UIViewController *)controller - [self addSubview:controller.view]; - #if !TARGET_OS_TV - _controller.interactivePopGestureRecognizer.delegate = self; -+ #if RNS_IPHONE_OS_VERSION_AVAILABLE(26_0) -+ if (@available(iOS 26, *)) { -+ _controller.interactiveContentPopGestureRecognizer.delegate = self; -+ } -+#endif // Check for iOS >= 26.0 - #endif - [controller didMoveToParentViewController:parentView.reactViewController]; - // On iOS pre 12 we observed that `willShowViewController` delegate method does not always -@@ -943,7 +884,7 @@ - (void)dismissOnReload - // when preventing the native dismiss with back button, we have to return the animator. - // Also, we need to return the animator when full width swiping even if the animation is not custom, - // otherwise the screen will be just popped immediately due to no animation -- ((operation == UINavigationControllerOperationPop && shouldCancelDismiss) || _isFullWidthSwiping || -+ ((operation == UINavigationControllerOperationPop && shouldCancelDismiss) || _isFullWidthSwipingWithPanGesture || - [RNSScreenStackAnimator isCustomAnimation:screen.stackAnimation] || _customAnimation)) { - return [[RNSScreenStackAnimator alloc] initWithOperation:operation]; - } -@@ -967,23 +908,39 @@ - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer - } - RNSScreenView *topScreen = _reactSubviews.lastObject; - -+ BOOL customAnimationOnSwipePropSetAndSelectedAnimationIsCustom = -+ topScreen.customAnimationOnSwipe && [RNSScreenStackAnimator isCustomAnimation:topScreen.stackAnimation]; -+ - #if TARGET_OS_TV || TARGET_OS_VISION - [self cancelTouchesInParent]; - return YES; - #else -- // RNSPanGestureRecognizer will receive events iff topScreen.fullScreenSwipeEnabled == YES; -- // Events are filtered in gestureRecognizer:shouldReceivePressOrTouchEvent: method - if ([gestureRecognizer isKindOfClass:[RNSPanGestureRecognizer class]]) { -- if ([self isInGestureResponseDistance:gestureRecognizer topScreen:topScreen]) { -- _isFullWidthSwiping = YES; -- [self cancelTouchesInParent]; -- return YES; -+ // On iOS < 26, we have a custom full screen swipe recognizer that functions similarily -+ // to interactiveContentPopGestureRecognizer introduced in iOS 26. -+ // On iOS >= 26, we want to use the native one, but we are unable to handle custom animations -+ // with native interactiveContentPopGestureRecognizer, so we have to fallback to the old implementation. -+ // In this case, the old one should behave as close as the new native one, having only the difference -+ // in animation, and without any customization that is exclusive for it (e.g. gestureResponseDistance). -+ if (@available(iOS 26, *)) { -+ if (customAnimationOnSwipePropSetAndSelectedAnimationIsCustom) { -+ _isFullWidthSwipingWithPanGesture = YES; -+ [self cancelTouchesInParent]; -+ return YES; -+ } -+ return NO; -+ } else { -+ if ([self isInGestureResponseDistance:gestureRecognizer topScreen:topScreen]) { -+ _isFullWidthSwipingWithPanGesture = YES; -+ [self cancelTouchesInParent]; -+ return YES; -+ } -+ return NO; - } -- return NO; - } - - // Now we're dealing with RNSScreenEdgeGestureRecognizer (or _UIParallaxTransitionPanGestureRecognizer) -- if (topScreen.customAnimationOnSwipe && [RNSScreenStackAnimator isCustomAnimation:topScreen.stackAnimation]) { -+ if (customAnimationOnSwipePropSetAndSelectedAnimationIsCustom) { - if ([gestureRecognizer isKindOfClass:[RNSScreenEdgeGestureRecognizer class]]) { - UIRectEdge edges = ((RNSScreenEdgeGestureRecognizer *)gestureRecognizer).edges; - BOOL isRTL = _controller.view.semanticContentAttribute == UISemanticContentAttributeForceRightToLeft; -@@ -1028,7 +985,9 @@ - (void)setupGestureHandlers - rightEdgeSwipeGestureRecognizer.delegate = self; - [self addGestureRecognizer:rightEdgeSwipeGestureRecognizer]; - -- // gesture recognizer for full width swipe gesture -+ // Starting from iOS 26, RNSPanGestureRecognizer has been mostly replaced by native -+ // interactiveContentPopGestureRecognizer. It still needs to handle custom dismiss animations, -+ // which we are not able to handle with the latter. - RNSPanGestureRecognizer *panRecognizer = [[RNSPanGestureRecognizer alloc] initWithTarget:self - action:@selector(handleSwipe:)]; - panRecognizer.delegate = self; -@@ -1091,7 +1050,7 @@ - (void)handleSwipe:(UIPanGestureRecognizer *)gestureRecognizer - [_interactionController cancelInteractiveTransition]; - } - _interactionController = nil; -- _isFullWidthSwiping = NO; -+ _isFullWidthSwipingWithPanGesture = NO; - } - default: { - break; -@@ -1225,14 +1184,6 @@ - (BOOL)isScrollViewPanGestureRecognizer:(UIGestureRecognizer *)gestureRecognize - // Be careful when adding another type of gesture recognizer. - - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceivePressOrTouchEvent:(NSObject *)event - { -- if (@available(iOS 26, *)) { -- // in iOS 26, you can swipe to pop screen before the previous one finished transitioning; -- // this prevents from registering the second gesture -- if ([self isTransitionInProgress]) { -- return NO; -- } -- } -- - RNSScreenView *topScreen = _reactSubviews.lastObject; - - for (RNSScreenView *s in _reactSubviews.reverseObjectEnumerator) { -@@ -1249,10 +1200,30 @@ - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceive - return NO; - } - -+ BOOL customAnimationOnSwipePropSetAndSelectedAnimationIsCustom = -+ topScreen.customAnimationOnSwipe && [RNSScreenStackAnimator isCustomAnimation:topScreen.stackAnimation]; -+#if RNS_IPHONE_OS_VERSION_AVAILABLE(26_0) -+ if (@available(iOS 26, *)) { -+ // On iOS 26, fullScreenSwipeEnabled takes no effect, and depending on whether custom animations are on, -+ // we select either interactiveContentPopGestureRecognizer or RNSPanGestureRecognizer -+ if (([gestureRecognizer isKindOfClass:[RNSPanGestureRecognizer class]] && -+ !customAnimationOnSwipePropSetAndSelectedAnimationIsCustom) || -+ (gestureRecognizer == _controller.interactiveContentPopGestureRecognizer && -+ customAnimationOnSwipePropSetAndSelectedAnimationIsCustom)) { -+ return NO; -+ } -+ } else { -+ // We want to pass events to RNSPanGestureRecognizer iff full screen swipe is enabled. -+ if ([gestureRecognizer isKindOfClass:[RNSPanGestureRecognizer class]]) { -+ return topScreen.fullScreenSwipeEnabled; -+ } -+ } -+#else // check for iOS >= 26 - // We want to pass events to RNSPanGestureRecognizer iff full screen swipe is enabled. - if ([gestureRecognizer isKindOfClass:[RNSPanGestureRecognizer class]]) { - return topScreen.fullScreenSwipeEnabled; - } -+#endif // check for iOS >= 26 - - // RNSScreenEdgeGestureRecognizer || _UIParallaxTransitionPanGestureRecognizer - return YES; -@@ -1268,15 +1239,6 @@ - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceive - return [self gestureRecognizer:gestureRecognizer shouldReceivePressOrTouchEvent:touch]; - } - --- (BOOL)isTransitionInProgress --{ -- if (_controller.transitionCoordinator != nil) { -- return YES; -- } -- -- return NO; --} -- - - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer - shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer - { -@@ -1289,7 +1251,6 @@ - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer - if (gestureRecognizer.state == UIGestureRecognizerStateBegan || isBackGesture) { - return NO; - } -- - return YES; - } - return NO; diff --git a/src/Navigation.tsx b/src/Navigation.tsx index 3e68bd07d..fda4f4152 100644 --- a/src/Navigation.tsx +++ b/src/Navigation.tsx @@ -5,6 +5,7 @@ import {i18n, type MessageDescriptor} from '@lingui/core' import {msg} from '@lingui/macro' import { type BottomTabBarProps, + type BottomTabNavigatorProps, createBottomTabNavigator, } from '@react-navigation/bottom-tabs' import { @@ -636,7 +637,7 @@ function commonScreens(Stack: typeof Flat, unreadCountLabel?: string) { * The TabsNavigator is used by native mobile to represent the routes * in 3 distinct tab-stacks with a different root screen on each. */ -function TabsNavigator() { +function TabsNavigator({layout}: {layout: BottomTabNavigatorProps['layout']}) { const tabBar = useCallback( (props: JSX.IntrinsicAttributes & BottomTabBarProps) => ( @@ -649,7 +650,8 @@ function TabsNavigator() { initialRouteName="HomeTab" backBehavior="initialRoute" screenOptions={{headerShown: false, lazy: true}} - tabBar={tabBar}> + tabBar={tabBar} + layout={layout}> HomeTabNavigator} /> SearchTabNavigator} /> (StackRouter, { id, initialRouteName, + UNSTABLE_routeNamesChangeBehavior, children, layout, screenListeners, screenOptions, screenLayout, + UNSTABLE_router, }) React.useEffect( @@ -169,7 +173,7 @@ function NativeStackNavigator({ export function createNativeStackNavigatorWithAuth< const ParamList extends ParamListBase, - const NavigatorID extends string | undefined = undefined, + const NavigatorID extends string | undefined = string | undefined, const TypeBag extends NavigatorTypeBagBase = { ParamList: ParamList NavigatorID: NavigatorID diff --git a/src/view/shell/index.tsx b/src/view/shell/index.tsx index 7f53755fc..e316537bc 100644 --- a/src/view/shell/index.tsx +++ b/src/view/shell/index.tsx @@ -91,14 +91,19 @@ function ShellInner() { } }, [dedupe, navigation]) + const drawerLayout = useCallback( + ({children}: {children: React.ReactNode}) => ( + {children} + ), + [], + ) + return ( <> - - - + diff --git a/yarn.lock b/yarn.lock index 1d0533bca..f38ca739e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6549,67 +6549,63 @@ invariant "^2.2.4" nullthrows "^1.1.1" -"@react-navigation/bottom-tabs@^7.3.13": - version "7.3.14" - resolved "https://registry.yarnpkg.com/@react-navigation/bottom-tabs/-/bottom-tabs-7.3.14.tgz#9ee02baea86ab24abe267726665bc69c6df0bf4c" - integrity sha512-s2qinJggS2HYZdCOey9A+fN+bNpWeEKwiL/FjAVOTcv+uofxPWN6CtEZUZGPEjfRjis/srURBmCmpNZSI6sQ9Q== +"@react-navigation/bottom-tabs@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@react-navigation/bottom-tabs/-/bottom-tabs-7.9.0.tgz#b546adb0cedd72a1f0179e00b74039b3c8abb6bd" + integrity sha512-024FWdHp3ZsE5rP8tmGI4vh+1z3wg8u8E9Frep8eeGoYo1h9rQhvgofQDGxknmrKsb7t8o8Dim+IZSvl57cPFQ== dependencies: - "@react-navigation/elements" "^2.4.3" + "@react-navigation/elements" "^2.9.3" color "^4.2.3" + sf-symbols-typescript "^2.1.0" -"@react-navigation/core@^7.10.0": - version "7.10.0" - resolved "https://registry.yarnpkg.com/@react-navigation/core/-/core-7.10.0.tgz#8205ea6b84ce34b2fc2c196701b4cd9b434211b9" - integrity sha512-qZBA5gGm+9liT4+EHk+kl9apwvqh7HqhLF1XeX6SQRmC/n2QI0u1B8OevKc+EPUDEM9Od15IuwT/GRbSs7/Umw== +"@react-navigation/core@^7.13.7": + version "7.13.7" + resolved "https://registry.yarnpkg.com/@react-navigation/core/-/core-7.13.7.tgz#1263903a703b5f183a08c22dfc5c3735ac4ef91c" + integrity sha512-k2ABo3250vq1ovOh/iVwXS6Hwr5PVRGXoPh/ewVFOOuEKTvOx9i//OBzt8EF+HokBxS2HBRlR2b+aCOmscRqBw== dependencies: - "@react-navigation/routers" "^7.4.0" + "@react-navigation/routers" "^7.5.3" escape-string-regexp "^4.0.0" + fast-deep-equal "^3.1.3" nanoid "^3.3.11" query-string "^7.1.3" react-is "^19.1.0" - use-latest-callback "^0.2.3" + use-latest-callback "^0.2.4" use-sync-external-store "^1.5.0" -"@react-navigation/drawer@^7.3.12": - version "7.4.1" - resolved "https://registry.yarnpkg.com/@react-navigation/drawer/-/drawer-7.4.1.tgz#50517d8c57f09cdbfc20a485c47016066b918e76" - integrity sha512-kj5wL31smDLw/6l+0KPR5cjaOZg6oHJCl3RPQonFPuYolUPZBVnuS++uvlifWcD/mqdGmhl3rgLTircRH4vQ7Q== +"@react-navigation/elements@^2.9.3": + version "2.9.3" + resolved "https://registry.yarnpkg.com/@react-navigation/elements/-/elements-2.9.3.tgz#505ae38af347a0bc5326155318a3d9a54e2071e3" + integrity sha512-3+eyvWiVPIEf6tN9UdduhOEHcTuNe3R5WovgiVkfH9+jApHMTZDc2loePTpY/i2HDJhObhhChpJzO6BVjrpdYQ== dependencies: - "@react-navigation/elements" "^2.4.3" color "^4.2.3" - react-native-drawer-layout "^4.1.10" - use-latest-callback "^0.2.3" + use-latest-callback "^0.2.4" + use-sync-external-store "^1.5.0" -"@react-navigation/elements@^2.4.3": - version "2.4.3" - resolved "https://registry.yarnpkg.com/@react-navigation/elements/-/elements-2.4.3.tgz#cc1dde4c98739d35a0c9c23872316063962cfaee" - integrity sha512-psoNmnZ0DQIt9nxxPITVLtYW04PGCAfnmd/Pcd3yhiBs93aj+HYKH+SDZDpUnXMf3BN7Wvo4+jPI+/Xjqb+m9w== +"@react-navigation/native-stack@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@react-navigation/native-stack/-/native-stack-7.9.0.tgz#4fcd08a403ff86c465a908f3b49f86ab3f66d06a" + integrity sha512-C/mNPhI0Pnerl7C2cB+6fAkdgSmfKECMERrbyfjx3P6JmEuTC54o+GV1c62FUmlRaRUassVHbtw4EeaY2uLh0g== dependencies: + "@react-navigation/elements" "^2.9.3" color "^4.2.3" - -"@react-navigation/native-stack@^7.3.13": - version "7.3.14" - resolved "https://registry.yarnpkg.com/@react-navigation/native-stack/-/native-stack-7.3.14.tgz#d1c90f2e50cd13bbced923991cf2faee8083f725" - integrity sha512-45Sf7ReqSCIySXS5nrKtLGmNlFXm5x+u32YQMwKDONCqVGOBCfo4ryKqeQq1EMJ7Py6IDyOwHMhA+jhNOxnfPw== - dependencies: - "@react-navigation/elements" "^2.4.3" + sf-symbols-typescript "^2.1.0" warn-once "^0.1.1" -"@react-navigation/native@^7.1.9": - version "7.1.10" - resolved "https://registry.yarnpkg.com/@react-navigation/native/-/native-7.1.10.tgz#768f674f7c09b6a57215762052aa62a7dc107402" - integrity sha512-Ug4IML0DkAxZTMF/E7lyyLXSclkGAYElY2cxZWITwfBjtlVeda0NjsdnTWY5EGjnd7bwvhTIUC+CO6qSlrDn5A== +"@react-navigation/native@^7.1.26": + version "7.1.26" + resolved "https://registry.yarnpkg.com/@react-navigation/native/-/native-7.1.26.tgz#220672e115f39014b95ca3ce8f2c37076a0e74f4" + integrity sha512-RhKmeD0E2ejzKS6z8elAfdfwShpcdkYY8zJzvHYLq+wv183BBcElTeyMLcIX6wIn7QutXeI92Yi21t7aUWfqNQ== dependencies: - "@react-navigation/core" "^7.10.0" + "@react-navigation/core" "^7.13.7" escape-string-regexp "^4.0.0" fast-deep-equal "^3.1.3" nanoid "^3.3.11" - use-latest-callback "^0.2.3" + use-latest-callback "^0.2.4" -"@react-navigation/routers@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@react-navigation/routers/-/routers-7.4.0.tgz#5bace799713ac163310c18711b98dfbe418c6b36" - integrity sha512-th5THnuWKJlmr7GGHiicy979di11ycDWub9iIXbEDvQwmwmsRzppmVbfs2nD8bC/MgyMgqWu/gxfys+HqN+kcw== +"@react-navigation/routers@^7.5.3": + version "7.5.3" + resolved "https://registry.yarnpkg.com/@react-navigation/routers/-/routers-7.5.3.tgz#8002930ef5f62351be2475d0dffde3ffaee174d7" + integrity sha512-1tJHg4KKRJuQ1/EvJxatrMef3NZXEPzwUIUZ3n1yJ2t7Q97siwRtbynRpQG9/69ebbtiZ8W3ScOZF/OmhvM4Rg== dependencies: nanoid "^3.3.11" @@ -17055,12 +17051,13 @@ react-native-dotenv@^3.4.11: dependencies: dotenv "^16.4.5" -react-native-drawer-layout@^4.1.10, react-native-drawer-layout@^4.1.8: - version "4.1.10" - resolved "https://registry.yarnpkg.com/react-native-drawer-layout/-/react-native-drawer-layout-4.1.10.tgz#9007cb747767ca8e1c9c3337671ad35ed95ad4d9" - integrity sha512-wejQo0F+EffCkOkRh+DP6ENWMB+aWEHkXV8Pd564PmtoySZLUsV/ksYrh/mrufh7T7EuvGT8+fNHz7mMRYftWg== +react-native-drawer-layout@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/react-native-drawer-layout/-/react-native-drawer-layout-4.2.1.tgz#5c89425662c9b5216a227dbc87bc7f38c4ec8719" + integrity sha512-liwRJ7ynRU/ogRlUdiK1Yoi1VzUSq2Vu/RU+UgqlMB3XduslZ1DZg/mTX0f1uCEV2dJ4ec+1fRa3OlIierfyZg== dependencies: - use-latest-callback "^0.2.3" + color "^4.2.3" + use-latest-callback "^0.2.4" react-native-edge-to-edge@^1.6.0: version "1.6.0" @@ -17149,13 +17146,12 @@ react-native-safe-area-context@~5.6.0: resolved "https://registry.yarnpkg.com/react-native-safe-area-context/-/react-native-safe-area-context-5.6.1.tgz#cb4d249ef1a6f7e8fd0cfdfa9764838dffda26b6" integrity sha512-/wJE58HLEAkATzhhX1xSr+fostLsK8Q97EfpfMDKo8jlOc1QKESSX/FQrhk7HhQH/2uSaox4Y86sNaI02kteiA== -react-native-screens@~4.16.0: - version "4.16.0" - resolved "https://registry.yarnpkg.com/react-native-screens/-/react-native-screens-4.16.0.tgz#efa42e77a092aa0b5277c9ae41391ea0240e0870" - integrity sha512-yIAyh7F/9uWkOzCi1/2FqvNvK6Wb9Y1+Kzn16SuGfN9YFJDTbwlzGRvePCNTOX0recpLQF3kc2FmvMUhyTCH1Q== +react-native-screens@^4.19.0: + version "4.19.0" + resolved "https://registry.yarnpkg.com/react-native-screens/-/react-native-screens-4.19.0.tgz#d00f2ec070d7426204eaf34ef6c64396a6871e1d" + integrity sha512-qSDAO3AL5bti0Ri7KZRSVmWlhDr8MV86N5GruiKVQfEL7Zx2nUi3Dl62lqHUAD/LnDvOPuDDsMHCfIpYSv3hPQ== dependencies: react-freeze "^1.0.0" - react-native-is-edge-to-edge "^1.2.1" warn-once "^0.1.0" react-native-svg@15.12.1: @@ -18129,6 +18125,11 @@ 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: + version "2.2.0" + resolved "https://registry.yarnpkg.com/sf-symbols-typescript/-/sf-symbols-typescript-2.2.0.tgz#926d6e0715e3d8784cadf7658431e36581254208" + integrity sha512-TPbeg0b7ylrswdGCji8FRGFAKuqbpQlLbL8SOle3j1iHSs5Ob5mhvMAxWN2UItOjgALAB5Zp3fmMfj8mbWvXKw== + shallow-equal@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/shallow-equal/-/shallow-equal-3.1.0.tgz#e7a54bac629c7f248eff6c2f5b63122ba4320bec" @@ -19630,10 +19631,10 @@ 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" integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA== -use-latest-callback@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/use-latest-callback/-/use-latest-callback-0.2.3.tgz#2d644d3063040b9bc2d4c55bb525a13ae3de9e16" - integrity sha512-7vI3fBuyRcP91pazVboc4qu+6ZqM8izPWX9k7cRnT8hbD5svslcknsh3S9BUhaK11OmgTV4oWZZVSeQAiV53SQ== +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@^1.2.1: version "1.2.1" -- 2.51.2 From aa1395542f8f41ff839ce9082246c484dde98fc8 Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Mon, 29 Dec 2025 20:19:08 +0200 Subject: [PATCH 05/15] tweak styles of composer prompt (#9524) --- src/view/com/feeds/ComposerPrompt.tsx | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/view/com/feeds/ComposerPrompt.tsx b/src/view/com/feeds/ComposerPrompt.tsx index dac623ce9..be88ee2dc 100644 --- a/src/view/com/feeds/ComposerPrompt.tsx +++ b/src/view/com/feeds/ComposerPrompt.tsx @@ -1,6 +1,6 @@ import {useCallback, useState} from 'react' import {Keyboard, Pressable, View} from 'react-native' -import {msg} from '@lingui/macro' +import {msg, Trans} from '@lingui/macro' import {useLingui} from '@lingui/react' import {useOpenComposer} from '#/lib/hooks/useOpenComposer' @@ -168,7 +168,7 @@ export function ComposerPrompt() { - {_(msg`What's up?`)} + What's up? {isNative && ( -- 2.51.2 From b38013a12ff22a3ebd3075baa0d98bc96302a316 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Mon, 29 Dec 2025 12:21:09 -0600 Subject: [PATCH 06/15] Small copy tweaks (#9557) --- src/screens/Settings/FindContactsSettings.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/screens/Settings/FindContactsSettings.tsx b/src/screens/Settings/FindContactsSettings.tsx index da0a4a4d1..fa998579b 100644 --- a/src/screens/Settings/FindContactsSettings.tsx +++ b/src/screens/Settings/FindContactsSettings.tsx @@ -99,7 +99,7 @@ export function FindContactsSettingsScreen({}: Props) { ) : ( )} @@ -429,7 +429,7 @@ function StatusHeader({ @@ -495,7 +495,7 @@ function StatusFooter({syncedAt}: {syncedAt: string}) { - Contacts uploaded + Contacts imported - Uploaded on{' '} + Imported on{' '} {i18n.date(new Date(syncedAt), { dateStyle: 'long', })} -- 2.51.2 From 893dd78a00d82e4901b9ea8d66e28de35cffe9bd Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Tue, 30 Dec 2025 11:23:48 +0200 Subject: [PATCH 07/15] remove unused dep (#9606) --- package.json | 1 - yarn.lock | 420 +++++---------------------------------------------- 2 files changed, 39 insertions(+), 382 deletions(-) diff --git a/package.json b/package.json index 1772d619f..61c7772c1 100644 --- a/package.json +++ b/package.json @@ -270,7 +270,6 @@ "jest-junit": "^16.0.0", "lint-staged": "^13.2.3", "lockfile-lint": "^4.14.0", - "metro-react-native-babel-preset": "^0.77.0", "prettier": "^3.6.0", "react-native-dotenv": "^3.4.11", "react-refresh": "^0.14.0", diff --git a/yarn.lock b/yarn.lock index f38ca739e..a6d4eb513 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1483,7 +1483,7 @@ js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/compat-data@^7.20.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9": +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9": version "7.22.9" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.9.tgz#71cdb00a1ce3a329ce4cbec3a44f9fef35669730" integrity sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ== @@ -1719,7 +1719,7 @@ "@babel/traverse" "^7.25.9" "@babel/types" "^7.25.9" -"@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.22.10", "@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6": +"@babel/helper-compilation-targets@^7.22.10", "@babel/helper-compilation-targets@^7.22.6": version "7.22.10" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz#01d648bbc25dd88f513d862ee0df27b7d4e67024" integrity sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q== @@ -1830,7 +1830,7 @@ "@babel/traverse" "^7.28.3" semver "^6.3.1" -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.5": +"@babel/helper-create-regexp-features-plugin@^7.18.6": version "7.22.9" resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz#9d8e61a8d9366fe66198f57c40565663de0825f6" integrity sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw== @@ -1848,17 +1848,6 @@ regexpu-core "^6.1.1" semver "^6.3.1" -"@babel/helper-define-polyfill-provider@^0.4.2": - version "0.4.2" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz#82c825cadeeeee7aad237618ebbe8fa1710015d7" - integrity sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw== - dependencies: - "@babel/helper-compilation-targets" "^7.22.6" - "@babel/helper-plugin-utils" "^7.22.5" - debug "^4.1.1" - lodash.debounce "^4.0.8" - resolve "^1.14.2" - "@babel/helper-define-polyfill-provider@^0.6.2", "@babel/helper-define-polyfill-provider@^0.6.3": version "0.6.3" resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz#f4f2792fae2ef382074bc2d713522cf24e6ddb21" @@ -1870,16 +1859,16 @@ lodash.debounce "^4.0.8" resolve "^1.14.2" -"@babel/helper-environment-visitor@^7.18.9", "@babel/helper-environment-visitor@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz#f06dd41b7c1f44e1f8da6c4055b41ab3a09a7e98" - integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q== - "@babel/helper-environment-visitor@^7.22.20": version "7.22.20" resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== +"@babel/helper-environment-visitor@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz#f06dd41b7c1f44e1f8da6c4055b41ab3a09a7e98" + integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q== + "@babel/helper-environment-visitor@^7.24.6": version "7.24.6" resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.6.tgz#ac7ad5517821641550f6698dd5468f8cef78620d" @@ -2060,7 +2049,7 @@ dependencies: "@babel/types" "^7.27.1" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0": +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== @@ -2080,15 +2069,6 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz#ddb2f876534ff8013e6c2b299bf4d39b3c51d44c" integrity sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw== -"@babel/helper-remap-async-to-generator@^7.18.9", "@babel/helper-remap-async-to-generator@^7.22.5": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz#53a25b7484e722d7efb9c350c75c032d4628de82" - integrity sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-wrap-function" "^7.22.9" - "@babel/helper-remap-async-to-generator@^7.25.9": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz#e53956ab3d5b9fb88be04b3e2f31b523afd34b92" @@ -2098,7 +2078,7 @@ "@babel/helper-wrap-function" "^7.25.9" "@babel/traverse" "^7.25.9" -"@babel/helper-replace-supers@^7.22.5", "@babel/helper-replace-supers@^7.22.9": +"@babel/helper-replace-supers@^7.22.9": version "7.22.9" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz#cbdc27d6d8d18cd22c81ae4293765a5d9afd0779" integrity sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg== @@ -2163,7 +2143,7 @@ "@babel/traverse" "^7.25.9" "@babel/types" "^7.25.9" -"@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@babel/helper-skip-transparent-expression-wrappers@^7.22.5": +"@babel/helper-skip-transparent-expression-wrappers@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== @@ -2287,15 +2267,6 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz#86e45bd8a49ab7e03f276577f96179653d41da72" integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw== -"@babel/helper-wrap-function@^7.22.9": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.10.tgz#d845e043880ed0b8c18bd194a12005cb16d2f614" - integrity sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ== - dependencies: - "@babel/helper-function-name" "^7.22.5" - "@babel/template" "^7.22.5" - "@babel/types" "^7.22.10" - "@babel/helper-wrap-function@^7.25.9": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz#d99dfd595312e6c894bd7d237470025c85eea9d0" @@ -2451,24 +2422,6 @@ "@babel/helper-plugin-utils" "^7.25.9" "@babel/traverse" "^7.25.9" -"@babel/plugin-proposal-async-generator-functions@^7.0.0": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz#bfb7276d2d573cb67ba379984a2334e262ba5326" - integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-remap-async-to-generator" "^7.18.9" - "@babel/plugin-syntax-async-generators" "^7.8.4" - -"@babel/plugin-proposal-class-properties@^7.18.0": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" - integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-proposal-decorators@^7.12.9": version "7.22.10" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.22.10.tgz#d6a8c3a9018e1b13e6647f869c5ea56ff2b585d4" @@ -2480,14 +2433,6 @@ "@babel/helper-split-export-declaration" "^7.22.6" "@babel/plugin-syntax-decorators" "^7.22.10" -"@babel/plugin-proposal-export-default-from@^7.0.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.22.5.tgz#825924eda1fad382c3de4db6fe1711b6fa03362f" - integrity sha512-UCe1X/hplyv6A5g2WnQ90tnHRvYL29dabCWww92lO7VdfMVTVReBTRrhiMrKQejHD9oVkdnRdwYuzUZkBVQisg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-export-default-from" "^7.22.5" - "@babel/plugin-proposal-export-default-from@^7.24.7": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.25.9.tgz#52702be6ef8367fc8f18b8438278332beeb8f87c" @@ -2495,50 +2440,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.18.0": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" - integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - -"@babel/plugin-proposal-numeric-separator@^7.0.0": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz#899b14fbafe87f053d2c5ff05b36029c62e13c75" - integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - -"@babel/plugin-proposal-object-rest-spread@^7.20.0": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" - integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== - dependencies: - "@babel/compat-data" "^7.20.5" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.20.7" - -"@babel/plugin-proposal-optional-catch-binding@^7.0.0": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz#f9400d0e6a3ea93ba9ef70b09e72dd6da638a2cb" - integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - -"@babel/plugin-proposal-optional-chaining@^7.20.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz#886f5c8978deb7d30f678b2e24346b287234d3ea" - integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-proposal-private-methods@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz#5209de7d213457548a98436fa2882f52f4be6bea" @@ -2580,20 +2481,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-syntax-dynamic-import@^7.8.0", "@babel/plugin-syntax-dynamic-import@^7.8.3": +"@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-export-default-from@^7.0.0", "@babel/plugin-syntax-export-default-from@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.22.5.tgz#ac3a24b362a04415a017ab96b9b4483d0e2a6e44" - integrity sha512-ODAqWWXB/yReh/jVQDag/3/tl6lgBueQkk/TcfW/59Oykm4c8a55XloX0CTk2k2VJiFWMgHby9xNX29IbCv9dQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-export-default-from@^7.24.7": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.25.9.tgz#86614767a9ff140366f0c3766ef218beb32a730a" @@ -2601,7 +2495,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-syntax-flow@^7.12.1", "@babel/plugin-syntax-flow@^7.18.0", "@babel/plugin-syntax-flow@^7.22.5": +"@babel/plugin-syntax-flow@^7.12.1": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.22.5.tgz#163b820b9e7696ce134df3ee716d9c0c98035859" integrity sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ== @@ -2678,14 +2572,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-nullish-coalescing-operator@^7.0.0", "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.3": +"@babel/plugin-syntax-numeric-separator@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== @@ -2706,7 +2600,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-optional-chaining@^7.0.0", "@babel/plugin-syntax-optional-chaining@^7.8.3": +"@babel/plugin-syntax-optional-chaining@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== @@ -2749,13 +2643,6 @@ "@babel/helper-create-regexp-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-arrow-functions@^7.0.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz#e5ba566d0c58a5b2ba2a8b795450641950b71958" - integrity sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-transform-arrow-functions@^7.0.0-0": version "7.24.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz#2bf263617060c9cc45bcdbf492b8cc805082bf27" @@ -2779,15 +2666,6 @@ "@babel/helper-remap-async-to-generator" "^7.25.9" "@babel/traverse" "^7.25.9" -"@babel/plugin-transform-async-to-generator@^7.20.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz#c7a85f44e46f8952f6d27fe57c2ed3cc084c3775" - integrity sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ== - dependencies: - "@babel/helper-module-imports" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-remap-async-to-generator" "^7.22.5" - "@babel/plugin-transform-async-to-generator@^7.24.7", "@babel/plugin-transform-async-to-generator@^7.25.9": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz#c80008dacae51482793e5a9c08b39a5be7e12d71" @@ -2804,13 +2682,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-block-scoping@^7.0.0": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.10.tgz#88a1dccc3383899eb5e660534a76a22ecee64faa" - integrity sha512-1+kVpGAOOI1Albt6Vse7c8pHzcZQdQKW+wJH+g8mCaszOdDVwRXa/slHPqIw+oJAJANTKDMuM2cBdV0Dg618Vg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-transform-block-scoping@^7.25.0", "@babel/plugin-transform-block-scoping@^7.25.9": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz#c33665e46b06759c93687ca0f84395b80c0473a1" @@ -2842,21 +2713,6 @@ "@babel/helper-create-class-features-plugin" "^7.28.3" "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-classes@^7.0.0": - version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz#e04d7d804ed5b8501311293d1a0e6d43e94c3363" - integrity sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-compilation-targets" "^7.22.6" - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-function-name" "^7.22.5" - "@babel/helper-optimise-call-expression" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-replace-supers" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - globals "^11.1.0" - "@babel/plugin-transform-classes@^7.0.0-0", "@babel/plugin-transform-classes@^7.25.4", "@babel/plugin-transform-classes@^7.25.9": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz#7152457f7880b593a63ade8a861e6e26a4469f52" @@ -2869,14 +2725,6 @@ "@babel/traverse" "^7.25.9" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.0.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz#cd1e994bf9f316bd1c2dafcd02063ec261bb3869" - integrity sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/template" "^7.22.5" - "@babel/plugin-transform-computed-properties@^7.24.7", "@babel/plugin-transform-computed-properties@^7.25.9": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz#db36492c78460e534b8852b1d5befe3c923ef10b" @@ -2885,13 +2733,6 @@ "@babel/helper-plugin-utils" "^7.25.9" "@babel/template" "^7.25.9" -"@babel/plugin-transform-destructuring@^7.20.0": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.10.tgz#38e2273814a58c810b6c34ea293be4973c4eb5e2" - integrity sha512-dPJrL0VOyxqLM9sritNbMSGx/teueHF/htMKrPT7DNxccXxRDPYqlgPFFdr8u+F+qUZOkZoXue/6rL5O5GduEw== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-transform-destructuring@^7.24.8", "@babel/plugin-transform-destructuring@^7.25.9": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz#966ea2595c498224340883602d3cfd7a0c79cea1" @@ -2944,14 +2785,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-flow-strip-types@^7.20.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.22.5.tgz#0bb17110c7bf5b35a60754b2f00c58302381dee2" - integrity sha512-tujNbZdxdG0/54g/oua8ISToaXTFBf8EnSb5PgQSciIXWOWKX3S4+JR7ZE9ol8FZwf9kxitzkGQ+QWeov/mCiA== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-flow" "^7.22.5" - "@babel/plugin-transform-flow-strip-types@^7.25.2": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.25.9.tgz#85879b42a8f5948fd6317069978e98f23ef8aec1" @@ -2968,15 +2801,6 @@ "@babel/helper-plugin-utils" "^7.25.9" "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" -"@babel/plugin-transform-function-name@^7.0.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz#935189af68b01898e0d6d99658db6b164205c143" - integrity sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg== - dependencies: - "@babel/helper-compilation-targets" "^7.22.5" - "@babel/helper-function-name" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-transform-function-name@^7.25.1", "@babel/plugin-transform-function-name@^7.25.9": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz#939d956e68a606661005bfd550c4fc2ef95f7b97" @@ -2993,13 +2817,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-literals@^7.0.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz#e9341f4b5a167952576e23db8d435849b1dd7920" - integrity sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-transform-literals@^7.25.2", "@babel/plugin-transform-literals@^7.25.9": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz#1a1c6b4d4aa59bc4cad5b6b3a223a0abd685c9de" @@ -3029,7 +2846,7 @@ "@babel/helper-module-transforms" "^7.25.9" "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-modules-commonjs@^7.0.0", "@babel/plugin-transform-modules-commonjs@^7.22.5": +"@babel/plugin-transform-modules-commonjs@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz#7d9875908d19b8c0536085af7b053fd5bd651bfa" integrity sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA== @@ -3074,14 +2891,6 @@ "@babel/helper-module-transforms" "^7.25.9" "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-named-capturing-groups-regex@^7.0.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz#67fe18ee8ce02d57c855185e27e3dc959b2e991f" - integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-transform-named-capturing-groups-regex@^7.24.7", "@babel/plugin-transform-named-capturing-groups-regex@^7.25.9": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz#454990ae6cc22fd2a0fa60b3a2c6f63a38064e6a" @@ -3160,13 +2969,6 @@ "@babel/helper-plugin-utils" "^7.25.9" "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" -"@babel/plugin-transform-parameters@^7.0.0", "@babel/plugin-transform-parameters@^7.20.7": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz#c3542dd3c39b42c8069936e48717a8d179d63a18" - integrity sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-transform-parameters@^7.24.7", "@babel/plugin-transform-parameters@^7.25.9": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz#b856842205b3e77e18b7a7a1b94958069c7ba257" @@ -3198,13 +3000,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-react-display-name@^7.0.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.22.5.tgz#3c4326f9fce31c7968d6cb9debcaf32d9e279a2b" - integrity sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-transform-react-display-name@^7.23.3": version "7.23.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.23.3.tgz#70529f034dd1e561045ad3c8152a267f0d7b6200" @@ -3226,13 +3021,6 @@ dependencies: "@babel/plugin-transform-react-jsx" "^7.22.5" -"@babel/plugin-transform-react-jsx-self@^7.0.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.22.5.tgz#ca2fdc11bc20d4d46de01137318b13d04e481d8e" - integrity sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-transform-react-jsx-self@^7.24.7": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz#c0b6cae9c1b73967f7f9eb2fca9536ba2fad2858" @@ -3240,13 +3028,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-react-jsx-source@^7.0.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.22.5.tgz#49af1615bfdf6ed9d3e9e43e425e0b2b65d15b6c" - integrity sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-transform-react-jsx-source@^7.24.7": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz#4c6b8daa520b5f155b5fb55547d7c9fa91417503" @@ -3254,17 +3035,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-react-jsx@^7.0.0", "@babel/plugin-transform-react-jsx@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.5.tgz#932c291eb6dd1153359e2a90cb5e557dcf068416" - integrity sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-module-imports" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-jsx" "^7.22.5" - "@babel/types" "^7.22.5" - "@babel/plugin-transform-react-jsx@^7.22.15": version "7.23.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz#393f99185110cea87184ea47bcb4a7b0c2e39312" @@ -3276,6 +3046,17 @@ "@babel/plugin-syntax-jsx" "^7.23.3" "@babel/types" "^7.23.4" +"@babel/plugin-transform-react-jsx@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.5.tgz#932c291eb6dd1153359e2a90cb5e557dcf068416" + integrity sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-jsx" "^7.22.5" + "@babel/types" "^7.22.5" + "@babel/plugin-transform-react-jsx@^7.25.2": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz#06367940d8325b36edff5e2b9cbe782947ca4166" @@ -3318,18 +3099,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-runtime@^7.0.0": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.10.tgz#89eda6daf1d3af6f36fb368766553054c8d7cd46" - integrity sha512-RchI7HePu1eu0CYNKHHHQdfenZcM4nz8rew5B1VWqeRKdcwW5aQ5HeG9eTUbWiAS1UrmHVLmoxTWHt3iLD/NhA== - dependencies: - "@babel/helper-module-imports" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - babel-plugin-polyfill-corejs2 "^0.4.5" - babel-plugin-polyfill-corejs3 "^0.8.3" - babel-plugin-polyfill-regenerator "^0.5.2" - semver "^6.3.1" - "@babel/plugin-transform-runtime@^7.24.7": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.9.tgz#62723ea3f5b31ffbe676da9d6dae17138ae580ea" @@ -3342,13 +3111,6 @@ babel-plugin-polyfill-regenerator "^0.6.1" semver "^6.3.1" -"@babel/plugin-transform-shorthand-properties@^7.0.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz#6e277654be82b5559fc4b9f58088507c24f0c624" - integrity sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-transform-shorthand-properties@^7.0.0-0": version "7.24.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz#ba9a09144cf55d35ec6b93a32253becad8ee5b55" @@ -3363,14 +3125,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-spread@^7.0.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz#6487fd29f229c95e284ba6c98d65eafb893fea6b" - integrity sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - "@babel/plugin-transform-spread@^7.24.7", "@babel/plugin-transform-spread@^7.25.9": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz#24a35153931b4ba3d13cec4a7748c21ab5514ef9" @@ -3379,13 +3133,6 @@ "@babel/helper-plugin-utils" "^7.25.9" "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" -"@babel/plugin-transform-sticky-regex@^7.0.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz#295aba1595bfc8197abd02eae5fc288c0deb26aa" - integrity sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-transform-sticky-regex@^7.24.7", "@babel/plugin-transform-sticky-regex@^7.25.9": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz#c7f02b944e986a417817b20ba2c504dfc1453d32" @@ -3414,7 +3161,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-typescript@^7.22.5", "@babel/plugin-transform-typescript@^7.5.0": +"@babel/plugin-transform-typescript@^7.22.5": version "7.22.10" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.10.tgz#aadd98fab871f0bb5717bcc24c31aaaa455af923" integrity sha512-7++c8I/ymsDo4QQBAgbraXLzIM6jmfao11KgIBEYZRReWzNWH9NtNgJcyrZiXsOPh523FQm6LfpLyy/U5fn46A== @@ -3460,14 +3207,6 @@ "@babel/helper-create-regexp-features-plugin" "^7.25.9" "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-unicode-regex@^7.0.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz#ce7e7bb3ef208c4ff67e02a22816656256d7a183" - integrity sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-transform-unicode-regex@^7.0.0-0", "@babel/plugin-transform-unicode-regex@^7.24.7", "@babel/plugin-transform-unicode-regex@^7.25.9": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz#5eae747fe39eacf13a8bd006a4fb0b5d1fa5e9b1" @@ -3628,15 +3367,6 @@ dependencies: regenerator-runtime "^0.14.0" -"@babel/template@^7.0.0", "@babel/template@^7.22.5", "@babel/template@^7.3.3": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.5.tgz#0c8c4d944509875849bd0344ff0050756eefc6ec" - integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw== - dependencies: - "@babel/code-frame" "^7.22.5" - "@babel/parser" "^7.22.5" - "@babel/types" "^7.22.5" - "@babel/template@^7.22.15": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" @@ -3646,6 +3376,15 @@ "@babel/parser" "^7.22.15" "@babel/types" "^7.22.15" +"@babel/template@^7.22.5", "@babel/template@^7.3.3": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.5.tgz#0c8c4d944509875849bd0344ff0050756eefc6ec" + integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw== + dependencies: + "@babel/code-frame" "^7.22.5" + "@babel/parser" "^7.22.5" + "@babel/types" "^7.22.5" + "@babel/template@^7.24.0": version "7.24.0" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.0.tgz#c6a524aa93a4a05d66aaf31654258fae69d87d50" @@ -8871,15 +8610,6 @@ babel-plugin-polyfill-corejs2@^0.4.10: "@babel/helper-define-polyfill-provider" "^0.6.3" semver "^6.3.1" -babel-plugin-polyfill-corejs2@^0.4.5: - version "0.4.5" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz#8097b4cb4af5b64a1d11332b6fb72ef5e64a054c" - integrity sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg== - dependencies: - "@babel/compat-data" "^7.22.6" - "@babel/helper-define-polyfill-provider" "^0.4.2" - semver "^6.3.1" - babel-plugin-polyfill-corejs3@^0.10.6: version "0.10.6" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz#2deda57caef50f59c525aeb4964d3b2f867710c7" @@ -8888,21 +8618,6 @@ babel-plugin-polyfill-corejs3@^0.10.6: "@babel/helper-define-polyfill-provider" "^0.6.2" core-js-compat "^3.38.0" -babel-plugin-polyfill-corejs3@^0.8.3: - version "0.8.3" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz#b4f719d0ad9bb8e0c23e3e630c0c8ec6dd7a1c52" - integrity sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.2" - core-js-compat "^3.31.0" - -babel-plugin-polyfill-regenerator@^0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz#80d0f3e1098c080c8b5a65f41e9427af692dc326" - integrity sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.2" - babel-plugin-polyfill-regenerator@^0.6.1: version "0.6.3" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.3.tgz#abeb1f3f1c762eace37587f42548b08b57789bc8" @@ -9221,7 +8936,7 @@ brorand@^1.1.0: resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== -browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.21.10, browserslist@^4.21.4, browserslist@^4.21.9: +browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.21.4, browserslist@^4.21.9: version "4.21.10" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.10.tgz#dbbac576628c13d3b2231332cb2ec5a46e015bb0" integrity sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ== @@ -9826,13 +9541,6 @@ copy-webpack-plugin@^10.2.0: schema-utils "^4.0.0" serialize-javascript "^6.0.0" -core-js-compat@^3.31.0: - version "3.32.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.32.1.tgz#55f9a7d297c0761a8eb1d31b593e0f5b6ffae964" - integrity sha512-GSvKDv4wE0bPnQtjklV101juQ85g6H3rm5PDP20mqlS5j0kXF3pP97YvAu5hl+uFHqMictp3b2VxOHljWMAtuA== - dependencies: - browserslist "^4.21.10" - core-js-compat@^3.38.0, core-js-compat@^3.38.1: version "3.39.0" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.39.0.tgz#b12dccb495f2601dc860bdbe7b4e3ffa8ba63f61" @@ -14886,51 +14594,6 @@ metro-minify-terser@0.83.2: flow-enums-runtime "^0.0.6" terser "^5.15.0" -metro-react-native-babel-preset@^0.77.0: - version "0.77.0" - resolved "https://registry.yarnpkg.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.77.0.tgz#47457eca8e36b77156afbe790247a70dbb40faaa" - integrity sha512-HPPD+bTxADtoE4y/4t1txgTQ1LVR6imOBy7RMHUsqMVTbekoi8Ph5YI9vKX2VMPtVWeFt0w9YnCSLPa76GcXsA== - dependencies: - "@babel/core" "^7.20.0" - "@babel/plugin-proposal-async-generator-functions" "^7.0.0" - "@babel/plugin-proposal-class-properties" "^7.18.0" - "@babel/plugin-proposal-export-default-from" "^7.0.0" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.0" - "@babel/plugin-proposal-numeric-separator" "^7.0.0" - "@babel/plugin-proposal-object-rest-spread" "^7.20.0" - "@babel/plugin-proposal-optional-catch-binding" "^7.0.0" - "@babel/plugin-proposal-optional-chaining" "^7.20.0" - "@babel/plugin-syntax-dynamic-import" "^7.8.0" - "@babel/plugin-syntax-export-default-from" "^7.0.0" - "@babel/plugin-syntax-flow" "^7.18.0" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.0.0" - "@babel/plugin-syntax-optional-chaining" "^7.0.0" - "@babel/plugin-transform-arrow-functions" "^7.0.0" - "@babel/plugin-transform-async-to-generator" "^7.20.0" - "@babel/plugin-transform-block-scoping" "^7.0.0" - "@babel/plugin-transform-classes" "^7.0.0" - "@babel/plugin-transform-computed-properties" "^7.0.0" - "@babel/plugin-transform-destructuring" "^7.20.0" - "@babel/plugin-transform-flow-strip-types" "^7.20.0" - "@babel/plugin-transform-function-name" "^7.0.0" - "@babel/plugin-transform-literals" "^7.0.0" - "@babel/plugin-transform-modules-commonjs" "^7.0.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.0.0" - "@babel/plugin-transform-parameters" "^7.0.0" - "@babel/plugin-transform-react-display-name" "^7.0.0" - "@babel/plugin-transform-react-jsx" "^7.0.0" - "@babel/plugin-transform-react-jsx-self" "^7.0.0" - "@babel/plugin-transform-react-jsx-source" "^7.0.0" - "@babel/plugin-transform-runtime" "^7.0.0" - "@babel/plugin-transform-shorthand-properties" "^7.0.0" - "@babel/plugin-transform-spread" "^7.0.0" - "@babel/plugin-transform-sticky-regex" "^7.0.0" - "@babel/plugin-transform-typescript" "^7.5.0" - "@babel/plugin-transform-unicode-regex" "^7.0.0" - "@babel/template" "^7.0.0" - babel-plugin-transform-flow-enums "^0.0.2" - react-refresh "^0.4.0" - metro-resolver@0.83.2: version "0.83.2" resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.83.2.tgz#d4a40a602615baacfb94d8a773e8b93eaac70d0f" @@ -17266,11 +16929,6 @@ react-refresh@^0.14.2: resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.2.tgz#3833da01ce32da470f1f936b9d477da5c7028bf9" integrity sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA== -react-refresh@^0.4.0: - version "0.4.3" - resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.4.3.tgz#966f1750c191672e76e16c2efa569150cc73ab53" - integrity sha512-Hwln1VNuGl/6bVwnd0Xdn1e84gT/8T9aYNL+HAKDArLCS7LWjwr7StE30IEYbIkx0Vi3vs+coQxe+SQDbGbbpA== - react-remove-scroll-bar@^2.3.7, react-remove-scroll-bar@^2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz#99c20f908ee467b385b68a3469b4a3e750012223" -- 2.51.2 From afe5db8b575e0119077cdedf9a836e825f11772c Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Tue, 30 Dec 2025 11:30:49 +0200 Subject: [PATCH 08/15] clamp gif size (#9610) --- src/components/Post/Embed/ExternalEmbed/Gif.tsx | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/components/Post/Embed/ExternalEmbed/Gif.tsx b/src/components/Post/Embed/ExternalEmbed/Gif.tsx index 8e8499731..1e5e8975e 100644 --- a/src/components/Post/Embed/ExternalEmbed/Gif.tsx +++ b/src/components/Post/Embed/ExternalEmbed/Gif.tsx @@ -11,6 +11,7 @@ import {msg, Trans} from '@lingui/macro' import {useLingui} from '@lingui/react' import {HITSLOP_20} from '#/lib/constants' +import {clamp} from '#/lib/numbers' import {type EmbedPlayerParams} from '#/lib/strings/embed-player' import {isWeb} from '#/platform/detection' import {useAutoplayDisabled} from '#/state/preferences' @@ -111,6 +112,15 @@ export function GifEmbed({ playerRef.current?.toggleAsync() }, []) + let aspectRatio = 1 + if (params.dimensions) { + aspectRatio = clamp( + params.dimensions.width / params.dimensions.height, + 0.75, + 4, + ) + } + return ( Date: Tue, 30 Dec 2025 11:31:09 +0200 Subject: [PATCH 09/15] add pressed state to quote embed (#9592) --- src/components/Post/Embed/index.tsx | 42 ++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/src/components/Post/Embed/index.tsx b/src/components/Post/Embed/index.tsx index 6382412b5..732d10815 100644 --- a/src/components/Post/Embed/index.tsx +++ b/src/components/Post/Embed/index.tsx @@ -1,4 +1,4 @@ -import React from 'react' +import {useCallback, useMemo} from 'react' import {View} from 'react-native' import { type $Typed, @@ -11,7 +11,6 @@ import { import {Trans} from '@lingui/macro' import {useQueryClient} from '@tanstack/react-query' -import {usePalette} from '#/lib/hooks/usePalette' import {makeProfileLink} from '#/lib/routes/links' import {useModerationOpts} from '#/state/preferences/moderation-opts' import {unstableCacheProfileView} from '#/state/queries/profile' @@ -19,6 +18,7 @@ import {useSession} from '#/state/session' import {Link} from '#/view/com/util/Link' import {PostMeta} from '#/view/com/util/PostMeta' import {atoms as a, useTheme} from '#/alf' +import {useInteractionState} from '#/components/hooks/useInteractionState' import {ContentHider} from '#/components/moderation/ContentHider' import {PostAlerts} from '#/components/moderation/PostAlerts' import {RichText} from '#/components/RichText' @@ -232,7 +232,7 @@ export function QuoteEmbed({ viewContext?: QuoteEmbedViewContext }) { const moderationOpts = useModerationOpts() - const quote = React.useMemo<$Typed>( + const quote = useMemo<$Typed>( () => ({ ...embed.view, $type: 'app.bsky.feed.defs#postView', @@ -241,18 +241,17 @@ export function QuoteEmbed({ }), [embed], ) - const moderation = React.useMemo(() => { + const moderation = useMemo(() => { return moderationOpts ? moderatePost(quote, moderationOpts) : undefined }, [quote, moderationOpts]) const t = useTheme() const queryClient = useQueryClient() - const pal = usePalette('default') const itemUrip = new AtUri(quote.uri) const itemHref = makeProfileLink(quote.author, 'post', itemUrip.rkey) const itemTitle = `Post by ${quote.author.handle}` - const richText = React.useMemo(() => { + const richText = useMemo(() => { if ( !bsky.dangerousIsType( quote.record, @@ -266,17 +265,26 @@ export function QuoteEmbed({ : undefined }, [quote.record]) - const onBeforePress = React.useCallback(() => { + const onBeforePress = useCallback(() => { unstableCacheProfileView(queryClient, quote.author) onOpen?.() }, [queryClient, quote.author, onOpen]) - const [hover, setHover] = React.useState(false) + const { + state: hover, + onIn: onPointerEnter, + onOut: onPointerLeave, + } = useInteractionState() + const { + state: pressed, + onIn: onPressIn, + onOut: onPressOut, + } = useInteractionState() return ( setHover(true)} - onPointerLeave={() => setHover(false)}> + onPointerEnter={onPointerEnter} + onPointerLeave={onPointerLeave}> {({active}) => ( <> - {!active && } + {!active && ( + + )} + onBeforePress={onBeforePress} + onPressIn={onPressIn} + onPressOut={onPressOut}> Date: Tue, 30 Dec 2025 11:35:24 +0200 Subject: [PATCH 10/15] fix long handles in account switch (#8373) --- src/screens/Settings/Settings.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/screens/Settings/Settings.tsx b/src/screens/Settings/Settings.tsx index 2fa5aa7de..e0adc0c38 100644 --- a/src/screens/Settings/Settings.tsx +++ b/src/screens/Settings/Settings.tsx @@ -634,7 +634,9 @@ function AccountRow({ ) : ( )} - + {sanitizeHandle(account.handle, '@')} {pendingDid === account.did && } -- 2.51.2 From 12dc38c5fc7ef33e17096633bc1a8acaed1311fc Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Tue, 30 Dec 2025 11:47:29 +0200 Subject: [PATCH 11/15] replace lodash.isequal with fast-deep-equal (#9529) --- package.json | 3 +-- src/screens/ModerationInteractionSettings/index.tsx | 2 +- src/view/com/composer/threadgate/ThreadgateBtn.tsx | 2 +- yarn.lock | 12 ------------ 4 files changed, 3 insertions(+), 16 deletions(-) diff --git a/package.json b/package.json index 61c7772c1..3d97e6d28 100644 --- a/package.json +++ b/package.json @@ -173,7 +173,7 @@ "libphonenumber-js": "^1.12.31", "lodash.chunk": "^4.2.0", "lodash.debounce": "^4.0.8", - "lodash.isequal": "^4.5.0", + "fast-deep-equal": "^3.1.3", "lodash.shuffle": "^4.2.0", "lodash.throttle": "^4.1.1", "multiformats": "9.9.0", @@ -241,7 +241,6 @@ "@types/jest": "29.5.14", "@types/lodash.chunk": "^4.2.7", "@types/lodash.debounce": "^4.0.7", - "@types/lodash.isequal": "^4.5.6", "@types/lodash.shuffle": "^4.2.7", "@types/psl": "^1.1.1", "@types/react": "^19.1.12", diff --git a/src/screens/ModerationInteractionSettings/index.tsx b/src/screens/ModerationInteractionSettings/index.tsx index 0cdce2efb..376639649 100644 --- a/src/screens/ModerationInteractionSettings/index.tsx +++ b/src/screens/ModerationInteractionSettings/index.tsx @@ -2,7 +2,7 @@ import React from 'react' import {View} from 'react-native' import {msg, Trans} from '@lingui/macro' import {useLingui} from '@lingui/react' -import deepEqual from 'lodash.isequal' +import deepEqual from 'fast-deep-equal' import {logger} from '#/logger' import {usePostInteractionSettingsMutation} from '#/state/queries/post-interaction-settings' diff --git a/src/view/com/composer/threadgate/ThreadgateBtn.tsx b/src/view/com/composer/threadgate/ThreadgateBtn.tsx index 572e35607..c993b5e7e 100644 --- a/src/view/com/composer/threadgate/ThreadgateBtn.tsx +++ b/src/view/com/composer/threadgate/ThreadgateBtn.tsx @@ -4,7 +4,7 @@ import {type AnimatedStyle} from 'react-native-reanimated' import {type AppBskyFeedPostgate} from '@atproto/api' import {msg, Trans} from '@lingui/macro' import {useLingui} from '@lingui/react' -import deepEqual from 'lodash.isequal' +import deepEqual from 'fast-deep-equal' import {isNetworkError} from '#/lib/strings/errors' import {logger} from '#/logger' diff --git a/yarn.lock b/yarn.lock index a6d4eb513..0204e500c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7538,13 +7538,6 @@ dependencies: "@types/lodash" "*" -"@types/lodash.isequal@^4.5.6": - version "4.5.6" - resolved "https://registry.yarnpkg.com/@types/lodash.isequal/-/lodash.isequal-4.5.6.tgz#ff42a1b8e20caa59a97e446a77dc57db923bc02b" - integrity sha512-Ww4UGSe3DmtvLLJm2F16hDwEQSv7U0Rr8SujLUA2wHI2D2dm8kPu6Et+/y303LfjTIwSBKXB/YTUcAKpem/XEg== - dependencies: - "@types/lodash" "*" - "@types/lodash.shuffle@^4.2.7": version "4.2.7" resolved "https://registry.yarnpkg.com/@types/lodash.shuffle/-/lodash.shuffle-4.2.7.tgz#b714d829af948a266b0df1477d629c70de2f4c72" @@ -14276,11 +14269,6 @@ lodash.isarguments@^3.1.0: resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" integrity sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg== -lodash.isequal@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" - integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== - lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" -- 2.51.2 From 82877a096d49deb143fab5048b5e372308820a40 Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Tue, 30 Dec 2025 12:08:26 +0200 Subject: [PATCH 12/15] Manually update source languages (#9611) * manually update source langs * add `intl:push-sources` script --- package.json | 1 + src/locale/locales/en/messages.po | 241 +++++++++++++++--------------- 2 files changed, 123 insertions(+), 119 deletions(-) diff --git a/package.json b/package.json index 3d97e6d28..70bc94580 100644 --- a/package.json +++ b/package.json @@ -62,6 +62,7 @@ "intl:compile-if-needed": "is-ci || [ -f src/locale/locales/en/messages.js ] || yarn intl:compile", "intl:pull": "crowdin download translations --verbose -b main", "intl:push": "crowdin push translations --verbose -b main", + "intl:push-sources": "crowdin push sources --verbose -b main", "nuke": "rm -rf ./node_modules && rm -rf ./ios && rm -rf ./android", "update-extensions": "bash scripts/updateExtensions.sh", "export": "npx expo export --dump-sourcemap && yarn upload-native-sourcemaps", diff --git a/src/locale/locales/en/messages.po b/src/locale/locales/en/messages.po index a30f62432..3a4e9bec3 100644 --- a/src/locale/locales/en/messages.po +++ b/src/locale/locales/en/messages.po @@ -436,7 +436,7 @@ msgid "{notificationCount, plural, one {# unread item} other {# unread items}}" msgstr "" #: src/screens/Settings/FindContactsSettings.tsx:430 -msgid "{numMatches, plural, one {1 contact found} other {# contacts found}}" +msgid "{numMatches, plural, one {# contact found} other {# contacts found}}" msgstr "" #: src/components/NewskieDialog.tsx:113 @@ -574,7 +574,7 @@ msgstr "" msgid "A screenshot of a profile page with a bell icon next to the follow button, indicating the new activity notifications feature." msgstr "" -#: src/Navigation.tsx:534 +#: src/Navigation.tsx:535 #: src/screens/Settings/AboutSettings.tsx:75 #: src/screens/Settings/Settings.tsx:262 #: src/screens/Settings/Settings.tsx:265 @@ -609,11 +609,11 @@ msgstr "" msgid "Accessibility" msgstr "" -#: src/Navigation.tsx:385 +#: src/Navigation.tsx:386 msgid "Accessibility Settings" msgstr "" -#: src/Navigation.tsx:401 +#: src/Navigation.tsx:402 #: src/screens/Login/LoginForm.tsx:194 #: src/screens/Settings/AccountSettings.tsx:51 #: src/screens/Settings/Settings.tsx:180 @@ -648,7 +648,7 @@ msgstr "" msgid "Account Muted by List" msgstr "" -#: src/screens/Settings/Settings.tsx:644 +#: src/screens/Settings/Settings.tsx:646 msgid "Account options" msgstr "" @@ -656,7 +656,7 @@ msgstr "" msgid "Account provider" msgstr "" -#: src/screens/Settings/Settings.tsx:680 +#: src/screens/Settings/Settings.tsx:682 msgid "Account removed from quick access" msgstr "" @@ -688,7 +688,7 @@ msgstr "" msgid "Activity from others" msgstr "" -#: src/Navigation.tsx:502 +#: src/Navigation.tsx:503 msgid "Activity notifications" msgstr "" @@ -770,7 +770,7 @@ msgstr "" msgid "Add emoji reaction" msgstr "" -#: src/view/com/feeds/ComposerPrompt.tsx:224 +#: src/view/com/feeds/ComposerPrompt.tsx:222 msgid "Add image" msgstr "" @@ -1011,7 +1011,7 @@ msgstr "" msgid "Already signed in as @{0}" msgstr "" -#: src/components/Post/Embed/ExternalEmbed/Gif.tsx:186 +#: src/components/Post/Embed/ExternalEmbed/Gif.tsx:197 #: src/view/com/composer/GifAltText.tsx:100 #: src/view/com/composer/photos/Gallery.tsx:188 msgid "ALT" @@ -1027,7 +1027,7 @@ msgstr "" msgid "Alt text" msgstr "" -#: src/components/Post/Embed/ExternalEmbed/Gif.tsx:191 +#: src/components/Post/Embed/ExternalEmbed/Gif.tsx:202 msgid "Alt Text" msgstr "" @@ -1167,7 +1167,7 @@ msgstr "" msgid "Animals" msgstr "" -#: src/components/Post/Embed/ExternalEmbed/Gif.tsx:149 +#: src/components/Post/Embed/ExternalEmbed/Gif.tsx:160 msgid "Animated GIF" msgstr "" @@ -1193,7 +1193,7 @@ msgstr "" msgid "Anyone who follows me" msgstr "" -#: src/Navigation.tsx:542 +#: src/Navigation.tsx:543 #: src/screens/Settings/AppIconSettings/index.tsx:67 #: src/screens/Settings/AppIconSettings/SettingsListItem.tsx:18 #: src/screens/Settings/AppIconSettings/SettingsListItem.tsx:23 @@ -1234,7 +1234,7 @@ msgstr "" msgid "App passwords" msgstr "" -#: src/Navigation.tsx:353 +#: src/Navigation.tsx:354 #: src/screens/Settings/AppPasswords.tsx:50 msgid "App Passwords" msgstr "" @@ -1270,7 +1270,7 @@ msgstr "" msgid "Appeal this decision" msgstr "" -#: src/Navigation.tsx:393 +#: src/Navigation.tsx:394 #: src/screens/Settings/AppearanceSettings.tsx:73 #: src/screens/Settings/Settings.tsx:230 #: src/screens/Settings/Settings.tsx:233 @@ -1520,7 +1520,7 @@ msgstr "" msgid "Blocked accounts" msgstr "" -#: src/Navigation.tsx:194 +#: src/Navigation.tsx:195 #: src/view/screens/ModerationBlockedAccounts.tsx:104 msgid "Blocked Accounts" msgstr "" @@ -1642,20 +1642,20 @@ msgstr "" msgid "Browse custom feeds" msgstr "" -#: src/components/FeedInterstitials.tsx:778 +#: src/components/FeedInterstitials.tsx:777 msgid "Browse more accounts" msgstr "" -#: src/components/FeedInterstitials.tsx:907 +#: src/components/FeedInterstitials.tsx:905 msgid "Browse more feeds on the Explore page" msgstr "" -#: src/components/FeedInterstitials.tsx:888 -#: src/components/FeedInterstitials.tsx:891 +#: src/components/FeedInterstitials.tsx:886 +#: src/components/FeedInterstitials.tsx:889 msgid "Browse more suggestions" msgstr "" -#: src/components/FeedInterstitials.tsx:916 +#: src/components/FeedInterstitials.tsx:914 msgid "Browse more suggestions on the Explore page" msgstr "" @@ -1872,7 +1872,7 @@ msgid "Changes saved" msgstr "" #: src/lib/hooks/useNotificationHandler.ts:99 -#: src/Navigation.tsx:559 +#: src/Navigation.tsx:560 #: src/view/shell/bottom-bar/BottomBar.tsx:221 #: src/view/shell/desktop/LeftNav.tsx:608 #: src/view/shell/Drawer.tsx:466 @@ -1898,7 +1898,7 @@ msgctxt "toast" msgid "Chat muted" msgstr "" -#: src/Navigation.tsx:569 +#: src/Navigation.tsx:570 #: src/screens/Messages/components/InboxPreview.tsx:22 msgid "Chat request inbox" msgstr "" @@ -1910,7 +1910,7 @@ msgid "Chat requests" msgstr "" #: src/components/dms/ConvoMenu.tsx:78 -#: src/Navigation.tsx:564 +#: src/Navigation.tsx:565 #: src/screens/Messages/ChatList.tsx:81 #: src/screens/Messages/ChatList.tsx:85 #: src/screens/Messages/ChatList.tsx:380 @@ -2081,7 +2081,7 @@ msgstr "" #: src/components/live/EditLiveDialog.tsx:235 #: src/components/NewskieDialog.tsx:167 #: src/components/NewskieDialog.tsx:173 -#: src/components/Post/Embed/ExternalEmbed/Gif.tsx:197 +#: src/components/Post/Embed/ExternalEmbed/Gif.tsx:208 #: src/components/ProgressGuide/FollowDialog.tsx:440 #: src/components/StarterPack/Wizard/WizardEditListDialog.tsx:118 #: src/components/StarterPack/Wizard/WizardEditListDialog.tsx:124 @@ -2199,7 +2199,7 @@ msgid "Comics" msgstr "" #: src/components/PolicyUpdateOverlay/updates/202508/index.tsx:45 -#: src/Navigation.tsx:343 +#: src/Navigation.tsx:344 #: src/view/screens/CommunityGuidelines.tsx:37 msgid "Community Guidelines" msgstr "" @@ -2300,12 +2300,12 @@ msgstr "" msgid "Contact us" msgstr "" -#: src/screens/Settings/FindContactsSettings.tsx:471 -msgid "Contacts removed" +#: src/screens/Settings/FindContactsSettings.tsx:498 +msgid "Contacts imported" msgstr "" -#: src/screens/Settings/FindContactsSettings.tsx:498 -msgid "Contacts uploaded" +#: src/screens/Settings/FindContactsSettings.tsx:471 +msgid "Contacts removed" msgstr "" #: src/screens/Settings/ContentAndMediaSettings.tsx:51 @@ -2317,7 +2317,7 @@ msgstr "" msgid "Content and media" msgstr "" -#: src/Navigation.tsx:518 +#: src/Navigation.tsx:519 msgid "Content and Media" msgstr "" @@ -2515,7 +2515,7 @@ msgstr "" #: src/components/PolicyUpdateOverlay/updates/202508/index.tsx:40 #: src/components/PolicyUpdateOverlay/updates/202508/index.tsx:107 -#: src/Navigation.tsx:348 +#: src/Navigation.tsx:349 #: src/view/screens/CopyrightPolicy.tsx:34 msgid "Copyright Policy" msgstr "" @@ -2604,7 +2604,7 @@ msgstr "" #: src/components/StarterPack/ProfileStarterPacks.tsx:206 #: src/components/StarterPack/ProfileStarterPacks.tsx:315 -#: src/Navigation.tsx:599 +#: src/Navigation.tsx:600 msgid "Create a starter pack" msgstr "" @@ -3230,7 +3230,7 @@ msgstr "" msgid "Edit moderation list" msgstr "" -#: src/Navigation.tsx:358 +#: src/Navigation.tsx:359 #: src/view/screens/Feeds.tsx:518 msgid "Edit My Feeds" msgstr "" @@ -3272,7 +3272,7 @@ msgstr "" msgid "Edit who can reply" msgstr "" -#: src/Navigation.tsx:604 +#: src/Navigation.tsx:605 msgid "Edit your starter pack" msgstr "" @@ -3601,7 +3601,7 @@ msgstr "" msgid "Explicit sexual images." msgstr "" -#: src/Navigation.tsx:778 +#: src/Navigation.tsx:780 #: src/screens/Search/Shell.tsx:327 #: src/view/shell/desktop/LeftNav.tsx:690 #: src/view/shell/Drawer.tsx:414 @@ -3637,7 +3637,7 @@ msgstr "" msgid "External media may allow websites to collect information about you and your device. No information is sent or requested until you press the \"play\" button." msgstr "" -#: src/Navigation.tsx:377 +#: src/Navigation.tsx:378 #: src/screens/Settings/ExternalMediaPreferences.tsx:34 msgid "External Media Preferences" msgstr "" @@ -3874,7 +3874,7 @@ msgstr "" msgid "False information about elections" msgstr "" -#: src/Navigation.tsx:293 +#: src/Navigation.tsx:294 msgid "Feed" msgstr "" @@ -3915,7 +3915,7 @@ msgctxt "toast" msgid "Feedback sent to feed operator" msgstr "" -#: src/Navigation.tsx:584 +#: src/Navigation.tsx:585 #: src/screens/SavedFeeds.tsx:108 #: src/screens/Search/SearchResults.tsx:78 #: src/screens/StarterPack/StarterPackScreen.tsx:190 @@ -3986,8 +3986,8 @@ msgstr "" msgid "Find accounts to follow" msgstr "" -#: src/Navigation.tsx:425 -#: src/Navigation.tsx:626 +#: src/Navigation.tsx:426 +#: src/Navigation.tsx:627 msgid "Find Contacts" msgstr "" @@ -4141,7 +4141,7 @@ msgstr "" msgid "Followed by <0>{0}, <1>{1}, and {2, plural, one {# other} other {# others}}" msgstr "" -#: src/Navigation.tsx:247 +#: src/Navigation.tsx:248 msgid "Followers of @{0} that you know" msgstr "" @@ -4184,7 +4184,7 @@ msgstr "" msgid "Following feed preferences" msgstr "" -#: src/Navigation.tsx:364 +#: src/Navigation.tsx:365 #: src/screens/Settings/FollowingFeedPreferences.tsx:56 msgid "Following Feed Preferences" msgstr "" @@ -4510,7 +4510,7 @@ msgstr "" msgid "Harming or endangering minors" msgstr "" -#: src/Navigation.tsx:549 +#: src/Navigation.tsx:550 msgid "Hashtag" msgstr "" @@ -4696,8 +4696,8 @@ msgstr "" msgid "Hold up! We’re gradually giving access to video, and you’re still waiting in line. Check back soon!" msgstr "" -#: src/Navigation.tsx:773 -#: src/Navigation.tsx:793 +#: src/Navigation.tsx:775 +#: src/Navigation.tsx:795 #: src/view/shell/bottom-bar/BottomBar.tsx:178 #: src/view/shell/desktop/LeftNav.tsx:672 #: src/view/shell/Drawer.tsx:440 @@ -4853,6 +4853,10 @@ msgstr "" msgid "Import contacts to find your friends" msgstr "" +#: src/screens/Settings/FindContactsSettings.tsx:507 +msgid "Imported on {0}" +msgstr "" + #: src/ageAssurance/components/NoAccessScreen.tsx:204 msgid "In order to provide an age-appropriate experience, we need to know your birthdate. This is a one-time thing, and your data will be kept private." msgstr "" @@ -5081,7 +5085,7 @@ msgstr "" msgid "Labels on your content" msgstr "" -#: src/Navigation.tsx:220 +#: src/Navigation.tsx:221 msgid "Language Settings" msgstr "" @@ -5258,7 +5262,7 @@ msgstr "" msgid "Like 10 posts to train the Discover feed" msgstr "" -#: src/Navigation.tsx:462 +#: src/Navigation.tsx:463 msgid "Like notifications" msgstr "" @@ -5270,8 +5274,8 @@ msgstr "" msgid "Like this labeler" msgstr "" -#: src/Navigation.tsx:298 -#: src/Navigation.tsx:303 +#: src/Navigation.tsx:299 +#: src/Navigation.tsx:304 msgid "Liked by" msgstr "" @@ -5306,7 +5310,7 @@ msgstr "" msgid "Likes of your reposts" msgstr "" -#: src/Navigation.tsx:486 +#: src/Navigation.tsx:487 msgid "Likes of your reposts notifications" msgstr "" @@ -5319,7 +5323,7 @@ msgstr "" msgid "Linear" msgstr "" -#: src/Navigation.tsx:253 +#: src/Navigation.tsx:254 msgid "List" msgstr "" @@ -5399,7 +5403,7 @@ msgctxt "toast" msgid "List unmuted" msgstr "" -#: src/Navigation.tsx:174 +#: src/Navigation.tsx:175 #: src/view/screens/Lists.tsx:67 #: src/view/screens/Profile.tsx:233 #: src/view/screens/Profile.tsx:241 @@ -5464,7 +5468,7 @@ msgstr "" msgid "Loading..." msgstr "" -#: src/Navigation.tsx:323 +#: src/Navigation.tsx:324 msgid "Log" msgstr "" @@ -5559,7 +5563,7 @@ msgstr "" msgid "Media that may be disturbing or inappropriate for some audiences." msgstr "" -#: src/Navigation.tsx:446 +#: src/Navigation.tsx:447 msgid "Mention notifications" msgstr "" @@ -5612,7 +5616,7 @@ msgstr "" msgid "Message options" msgstr "" -#: src/Navigation.tsx:788 +#: src/Navigation.tsx:790 msgid "Messages" msgstr "" @@ -5625,7 +5629,7 @@ msgstr "" msgid "Minor harassment or bullying" msgstr "" -#: src/Navigation.tsx:510 +#: src/Navigation.tsx:511 msgid "Miscellaneous notifications" msgstr "" @@ -5633,7 +5637,7 @@ msgstr "" msgid "Misleading" msgstr "" -#: src/Navigation.tsx:179 +#: src/Navigation.tsx:180 #: src/screens/Moderation/index.tsx:99 #: src/screens/Settings/Settings.tsx:194 #: src/screens/Settings/Settings.tsx:197 @@ -5672,7 +5676,7 @@ msgstr "" msgid "Moderation lists" msgstr "" -#: src/Navigation.tsx:184 +#: src/Navigation.tsx:185 #: src/view/screens/ModerationModlists.tsx:67 msgid "Moderation Lists" msgstr "" @@ -5681,7 +5685,7 @@ msgstr "" msgid "moderation settings" msgstr "" -#: src/Navigation.tsx:313 +#: src/Navigation.tsx:314 msgid "Moderation states" msgstr "" @@ -5804,7 +5808,7 @@ msgstr "" msgid "Muted accounts" msgstr "" -#: src/Navigation.tsx:189 +#: src/Navigation.tsx:190 #: src/view/screens/ModerationMutedAccounts.tsx:116 msgid "Muted Accounts" msgstr "" @@ -5903,7 +5907,7 @@ msgstr "" msgid "New Feature" msgstr "" -#: src/Navigation.tsx:478 +#: src/Navigation.tsx:479 msgid "New follower notifications" msgstr "" @@ -6209,7 +6213,7 @@ msgstr "" msgid "Not followed by anyone you're following" msgstr "" -#: src/Navigation.tsx:169 +#: src/Navigation.tsx:170 #: src/view/screens/Profile.tsx:132 msgid "Not Found" msgstr "" @@ -6235,8 +6239,8 @@ msgstr "" msgid "Nothing saved yet" msgstr "" -#: src/Navigation.tsx:432 -#: src/Navigation.tsx:579 +#: src/Navigation.tsx:433 +#: src/Navigation.tsx:580 #: src/view/screens/Notifications.tsx:136 msgid "Notification settings" msgstr "" @@ -6249,8 +6253,8 @@ msgstr "" msgid "Notification Sounds" msgstr "" -#: src/Navigation.tsx:574 -#: src/Navigation.tsx:783 +#: src/Navigation.tsx:575 +#: src/Navigation.tsx:785 #: src/screens/Notifications/ActivityList.tsx:30 #: src/screens/Settings/NotificationSettings/ActivityNotificationSettings.tsx:90 #: src/screens/Settings/NotificationSettings/index.tsx:92 @@ -6392,7 +6396,7 @@ msgstr "" msgid "Open avatar creator" msgstr "" -#: src/view/com/feeds/ComposerPrompt.tsx:202 +#: src/view/com/feeds/ComposerPrompt.tsx:200 msgid "Open camera" msgstr "" @@ -6501,7 +6505,7 @@ msgstr "" msgid "Opens composer" msgstr "" -#: src/view/com/feeds/ComposerPrompt.tsx:203 +#: src/view/com/feeds/ComposerPrompt.tsx:201 msgid "Opens device camera" msgstr "" @@ -6532,7 +6536,7 @@ msgstr "" msgid "Opens helpdesk in browser" msgstr "" -#: src/view/com/feeds/ComposerPrompt.tsx:225 +#: src/view/com/feeds/ComposerPrompt.tsx:223 msgid "Opens image picker" msgstr "" @@ -6675,7 +6679,7 @@ msgstr "" msgid "Password updated!" msgstr "" -#: src/components/Post/Embed/ExternalEmbed/Gif.tsx:43 +#: src/components/Post/Embed/ExternalEmbed/Gif.tsx:44 #: src/components/Post/Embed/VideoEmbed/VideoEmbedInner/VideoEmbedInnerNative.tsx:137 #: src/components/Post/Embed/VideoEmbed/VideoEmbedInner/web-controls/VideoControls.tsx:369 msgid "Pause" @@ -6691,11 +6695,11 @@ msgstr "" msgid "People" msgstr "" -#: src/Navigation.tsx:240 +#: src/Navigation.tsx:241 msgid "People followed by @{0}" msgstr "" -#: src/Navigation.tsx:233 +#: src/Navigation.tsx:234 msgid "People following @{0}" msgstr "" @@ -6786,7 +6790,7 @@ msgstr "" msgid "Pinned to your feeds" msgstr "" -#: src/components/Post/Embed/ExternalEmbed/Gif.tsx:43 +#: src/components/Post/Embed/ExternalEmbed/Gif.tsx:44 #: src/components/Post/Embed/VideoEmbed/VideoEmbedInner/VideoEmbedInnerNative.tsx:137 #: src/components/Post/Embed/VideoEmbed/VideoEmbedInner/web-controls/VideoControls.tsx:370 msgid "Play" @@ -6805,7 +6809,7 @@ msgstr "" msgid "Play Video" msgstr "" -#: src/components/Post/Embed/ExternalEmbed/Gif.tsx:42 +#: src/components/Post/Embed/ExternalEmbed/Gif.tsx:43 msgid "Plays or pauses the GIF" msgstr "" @@ -6953,8 +6957,11 @@ msgstr "" msgid "Please sign in as @{0}" msgstr "" -#: src/screens/FindContactsFlowScreen.tsx:71 #: src/screens/Settings/FindContactsSettings.tsx:102 +msgid "Please use the native app to import your contacts." +msgstr "" + +#: src/screens/FindContactsFlowScreen.tsx:71 msgid "Please use the native app to sync your contacts." msgstr "" @@ -7004,10 +7011,10 @@ msgstr "" msgid "Post blocked" msgstr "" -#: src/Navigation.tsx:266 -#: src/Navigation.tsx:273 -#: src/Navigation.tsx:280 -#: src/Navigation.tsx:287 +#: src/Navigation.tsx:267 +#: src/Navigation.tsx:274 +#: src/Navigation.tsx:281 +#: src/Navigation.tsx:288 msgid "Post by @{0}" msgstr "" @@ -7041,7 +7048,7 @@ msgstr "" msgid "Post interaction settings" msgstr "" -#: src/Navigation.tsx:200 +#: src/Navigation.tsx:201 #: src/screens/ModerationInteractionSettings/index.tsx:34 msgid "Post Interaction Settings" msgstr "" @@ -7140,8 +7147,8 @@ msgstr "" msgid "Privacy and security" msgstr "" -#: src/Navigation.tsx:409 -#: src/Navigation.tsx:417 +#: src/Navigation.tsx:410 +#: src/Navigation.tsx:418 #: src/screens/Settings/ActivityPrivacySettings.tsx:40 #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:44 msgid "Privacy and Security" @@ -7154,7 +7161,7 @@ msgstr "" #: src/components/PolicyUpdateOverlay/updates/202508/index.tsx:35 #: src/components/PolicyUpdateOverlay/updates/202508/index.tsx:102 -#: src/Navigation.tsx:333 +#: src/Navigation.tsx:334 #: src/screens/Settings/AboutSettings.tsx:92 #: src/screens/Settings/AboutSettings.tsx:95 #: src/view/screens/PrivacyPolicy.tsx:34 @@ -7253,7 +7260,7 @@ msgstr "" msgid "QR code saved to your camera roll!" msgstr "" -#: src/Navigation.tsx:454 +#: src/Navigation.tsx:455 msgid "Quote notifications" msgstr "" @@ -7414,7 +7421,7 @@ msgstr "" #: src/components/StarterPack/Wizard/WizardListCard.tsx:105 #: src/components/StarterPack/Wizard/WizardListCard.tsx:112 #: src/screens/Bookmarks/index.tsx:266 -#: src/screens/Settings/Settings.tsx:682 +#: src/screens/Settings/Settings.tsx:684 #: src/view/com/modals/UserAddRemoveLists.tsx:235 #: src/view/com/posts/PostFeedErrorMessage.tsx:220 msgid "Remove" @@ -7428,8 +7435,8 @@ msgstr "" msgid "Remove {historyItem}" msgstr "" -#: src/screens/Settings/Settings.tsx:661 -#: src/screens/Settings/Settings.tsx:664 +#: src/screens/Settings/Settings.tsx:663 +#: src/screens/Settings/Settings.tsx:666 msgid "Remove account" msgstr "" @@ -7474,7 +7481,7 @@ msgstr "" msgid "Remove from my feeds" msgstr "" -#: src/screens/Settings/Settings.tsx:674 +#: src/screens/Settings/Settings.tsx:676 msgid "Remove from quick access?" msgstr "" @@ -7641,7 +7648,7 @@ msgstr "" msgid "Reply Hidden by You" msgstr "" -#: src/Navigation.tsx:438 +#: src/Navigation.tsx:439 msgid "Reply notifications" msgstr "" @@ -7756,7 +7763,7 @@ msgstr "" msgid "Repost ({0, plural, one {# repost} other {# reposts}})" msgstr "" -#: src/Navigation.tsx:470 +#: src/Navigation.tsx:471 msgid "Repost notifications" msgstr "" @@ -7797,7 +7804,7 @@ msgstr "" msgid "Reposts of your reposts" msgstr "" -#: src/Navigation.tsx:494 +#: src/Navigation.tsx:495 msgid "Reposts of your reposts notifications" msgstr "" @@ -8006,7 +8013,7 @@ msgid "Saved Feeds" msgstr "" #: src/components/dialogs/nuxs/BookmarksAnnouncement.tsx:143 -#: src/Navigation.tsx:618 +#: src/Navigation.tsx:619 #: src/screens/Bookmarks/index.tsx:60 msgid "Saved Posts" msgstr "" @@ -8052,7 +8059,7 @@ msgstr "" msgid "Search" msgstr "" -#: src/Navigation.tsx:259 +#: src/Navigation.tsx:260 #: src/screens/Profile/ProfileSearch.tsx:37 msgid "Search @{0}'s posts" msgstr "" @@ -8169,7 +8176,7 @@ msgid "See jobs at Bluesky" msgstr "" #: src/components/FeedInterstitials.tsx:730 -#: src/components/FeedInterstitials.tsx:793 +#: src/components/FeedInterstitials.tsx:791 msgid "See more" msgstr "" @@ -8448,7 +8455,7 @@ msgstr "" msgid "Sets email for password reset" msgstr "" -#: src/Navigation.tsx:215 +#: src/Navigation.tsx:216 #: src/screens/Settings/Settings.tsx:105 #: src/view/shell/desktop/LeftNav.tsx:805 #: src/view/shell/Drawer.tsx:609 @@ -8593,7 +8600,7 @@ msgstr "" msgid "Share your favorite feed!" msgstr "" -#: src/Navigation.tsx:318 +#: src/Navigation.tsx:319 msgid "Shared Preferences Tester" msgstr "" @@ -8603,7 +8610,7 @@ msgstr "" msgid "Show" msgstr "" -#: src/components/Post/Embed/ExternalEmbed/Gif.tsx:178 +#: src/components/Post/Embed/ExternalEmbed/Gif.tsx:189 msgid "Show alt text" msgstr "" @@ -8842,7 +8849,7 @@ msgstr "" msgid "Some of your verifications are invalid." msgstr "" -#: src/components/FeedInterstitials.tsx:870 +#: src/components/FeedInterstitials.tsx:868 msgid "Some other feeds you might like" msgstr "" @@ -8956,8 +8963,8 @@ msgstr "" msgid "Start chat with {displayName}" msgstr "" -#: src/Navigation.tsx:589 -#: src/Navigation.tsx:594 +#: src/Navigation.tsx:590 +#: src/Navigation.tsx:595 #: src/screens/StarterPack/Wizard/index.tsx:209 msgid "Starter Pack" msgstr "" @@ -9010,7 +9017,7 @@ msgstr "" msgid "Stored as part of a secure code for matching with others" msgstr "" -#: src/Navigation.tsx:308 +#: src/Navigation.tsx:309 #: src/screens/Settings/Settings.tsx:466 msgid "Storybook" msgstr "" @@ -9101,7 +9108,7 @@ msgctxt "Name of app icon variant" msgid "Sunset" msgstr "" -#: src/Navigation.tsx:328 +#: src/Navigation.tsx:329 #: src/view/screens/Support.tsx:34 #: src/view/screens/Support.tsx:37 msgid "Support" @@ -9215,7 +9222,7 @@ msgstr "" #: src/components/dialogs/BirthDateSettings.tsx:182 #: src/components/PolicyUpdateOverlay/updates/202508/index.tsx:30 #: src/components/PolicyUpdateOverlay/updates/202508/index.tsx:97 -#: src/Navigation.tsx:338 +#: src/Navigation.tsx:339 #: src/screens/Settings/AboutSettings.tsx:84 #: src/screens/Settings/AboutSettings.tsx:87 #: src/view/screens/TermsOfService.tsx:34 @@ -9528,6 +9535,11 @@ msgstr "" msgid "This appeal will be sent to Bluesky's moderation service." msgstr "" +#: src/screens/PostThread/components/ThreadItemAnchorNoUnauthenticated.tsx:27 +#: src/screens/PostThread/components/ThreadItemPostNoUnauthenticated.tsx:47 +msgid "This author has chosen to make their posts visible only to people who are signed in." +msgstr "" + #: src/screens/Messages/components/MessageListError.tsx:18 msgid "This chat was disconnected" msgstr "" @@ -9737,7 +9749,7 @@ msgstr "" msgid "This will delete \"{0}\" from your muted words. You can always add it back later." msgstr "" -#: src/screens/Settings/Settings.tsx:676 +#: src/screens/Settings/Settings.tsx:678 msgid "This will remove @{0} from the quick access list." msgstr "" @@ -9764,7 +9776,7 @@ msgstr "" msgid "Threaded" msgstr "" -#: src/Navigation.tsx:371 +#: src/Navigation.tsx:372 msgid "Threads Preferences" msgstr "" @@ -9830,7 +9842,7 @@ msgstr "" msgid "Top replies first" msgstr "" -#: src/Navigation.tsx:554 +#: src/Navigation.tsx:555 msgid "Topic" msgstr "" @@ -10200,10 +10212,6 @@ msgstr "" msgid "Upload from Library" msgstr "" -#: src/screens/Settings/FindContactsSettings.tsx:507 -msgid "Uploaded on {0}" -msgstr "" - #: src/lib/api/index.ts:302 msgid "Uploading images..." msgstr "" @@ -10341,7 +10349,7 @@ msgstr "" msgid "Verification settings" msgstr "" -#: src/Navigation.tsx:208 +#: src/Navigation.tsx:209 #: src/screens/Moderation/VerificationSettings.tsx:32 msgid "Verification Settings" msgstr "" @@ -10447,7 +10455,7 @@ msgstr "" msgid "Video failed to process" msgstr "" -#: src/Navigation.tsx:610 +#: src/Navigation.tsx:611 msgid "Video Feed" msgstr "" @@ -10858,7 +10866,7 @@ msgstr "" #: src/view/com/auth/SplashScreen.tsx:51 #: src/view/com/auth/SplashScreen.web.tsx:103 #: src/view/com/composer/Composer.tsx:857 -#: src/view/com/feeds/ComposerPrompt.tsx:193 +#: src/view/com/feeds/ComposerPrompt.tsx:191 msgid "What's up?" msgstr "" @@ -11278,11 +11286,6 @@ msgstr "" msgid "You must grant access to your photo library to save a QR code" msgstr "" -#: src/screens/PostThread/components/ThreadItemAnchorNoUnauthenticated.tsx:27 -#: src/screens/PostThread/components/ThreadItemPostNoUnauthenticated.tsx:47 -msgid "You must sign in to view this post." -msgstr "" - #: src/view/com/composer/SelectMediaButton.tsx:442 msgid "You need to allow access to your media library." msgstr "" @@ -11524,7 +11527,7 @@ msgstr "" msgid "Your full handle will be <0>@{0}" msgstr "" -#: src/Navigation.tsx:526 +#: src/Navigation.tsx:527 #: src/screens/Search/modules/ExploreInterestsCard.tsx:67 #: src/screens/Settings/ContentAndMediaSettings.tsx:92 #: src/screens/Settings/ContentAndMediaSettings.tsx:95 -- 2.51.2 From 9743149c26862c59a065086a2de39e2586179dcb Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Tue, 30 Dec 2025 13:39:09 +0200 Subject: [PATCH 13/15] Replace `graphemer` with `unicode-segmenter` (#9526) * replace graphemer with unicode-segmenter * use grapheme entrypoint * force resolution of unicode-segmenter --- package.json | 4 ++- .../dialogs/lists/CreateOrEditListDialog.tsx | 6 ++-- src/lib/strings/helpers.ts | 34 ++++-------------- .../Messages/components/MessageInput.tsx | 4 +-- .../Messages/components/MessageInput.web.tsx | 4 +-- .../Profile/Header/EditProfileDialog.tsx | 6 ++-- src/screens/Takendown.tsx | 23 +++++------- .../com/composer/text-input/TextInput.web.tsx | 4 +-- .../composer/text-input/hooks/useGrapheme.tsx | 36 ------------------- .../com/composer/videos/SubtitleDialog.tsx | 27 +++++++++++--- yarn.lock | 8 ++--- 11 files changed, 57 insertions(+), 99 deletions(-) delete mode 100644 src/view/com/composer/text-input/hooks/useGrapheme.tsx diff --git a/package.json b/package.json index 70bc94580..4eed6de06 100644 --- a/package.json +++ b/package.json @@ -222,6 +222,7 @@ "tippy.js": "^6.3.7", "tlds": "^1.234.0", "tldts": "^6.1.46", + "unicode-segmenter": "^0.14.5", "zod": "^3.20.2" }, "devDependencies": { @@ -286,7 +287,8 @@ "**/expo-constants": "18.0.8", "**/expo-device": "7.1.4", "**/zod": "3.23.8", - "**/multiformats": "9.9.0" + "**/multiformats": "9.9.0", + "unicode-segmenter": "0.14.5" }, "jest": { "preset": "jest-expo/ios", diff --git a/src/components/dialogs/lists/CreateOrEditListDialog.tsx b/src/components/dialogs/lists/CreateOrEditListDialog.tsx index 203882d80..e71a28168 100644 --- a/src/components/dialogs/lists/CreateOrEditListDialog.tsx +++ b/src/components/dialogs/lists/CreateOrEditListDialog.tsx @@ -5,7 +5,7 @@ import {msg, Plural, Trans} from '@lingui/macro' import {useLingui} from '@lingui/react' import {cleanError} from '#/lib/strings/errors' -import {useWarnMaxGraphemeCount} from '#/lib/strings/helpers' +import {isOverMaxGraphemeCount} from '#/lib/strings/helpers' import {richTextToString} from '#/lib/strings/rich-text-helpers' import {shortenLinks, stripInvalidMentions} from '#/lib/strings/rich-text-manip' import {logger} from '#/logger' @@ -259,11 +259,11 @@ function DialogInner({ _, ]) - const displayNameTooLong = useWarnMaxGraphemeCount({ + const displayNameTooLong = isOverMaxGraphemeCount({ text: displayName, maxCount: DISPLAY_NAME_MAX_GRAPHEMES, }) - const descriptionTooLong = useWarnMaxGraphemeCount({ + const descriptionTooLong = isOverMaxGraphemeCount({ text: descriptionRt, maxCount: DESCRIPTION_MAX_GRAPHEMES, }) diff --git a/src/lib/strings/helpers.ts b/src/lib/strings/helpers.ts index 9ecbfd38d..b654721ea 100644 --- a/src/lib/strings/helpers.ts +++ b/src/lib/strings/helpers.ts @@ -1,6 +1,5 @@ -import {useCallback, useMemo} from 'react' import {type RichText} from '@atproto/api' -import Graphemer from 'graphemer' +import {countGraphemes} from 'unicode-segmenter/grapheme' import {shortenLinks} from './rich-text-manip' @@ -29,37 +28,18 @@ export function enforceLen( return str } -export function useEnforceMaxGraphemeCount() { - const splitter = useMemo(() => new Graphemer(), []) - - return useCallback( - (text: string, maxCount: number) => { - if (splitter.countGraphemes(text) > maxCount) { - return splitter.splitGraphemes(text).slice(0, maxCount).join('') - } else { - return text - } - }, - [splitter], - ) -} - -export function useWarnMaxGraphemeCount({ +export function isOverMaxGraphemeCount({ text, maxCount, }: { text: string | RichText maxCount: number }) { - const splitter = useMemo(() => new Graphemer(), []) - - return useMemo(() => { - if (typeof text === 'string') { - return splitter.countGraphemes(text) > maxCount - } else { - return shortenLinks(text).graphemeLength > maxCount - } - }, [splitter, maxCount, text]) + if (typeof text === 'string') { + return countGraphemes(text) > maxCount + } else { + return shortenLinks(text).graphemeLength > maxCount + } } export function countLines(str: string | undefined): number { diff --git a/src/screens/Messages/components/MessageInput.tsx b/src/screens/Messages/components/MessageInput.tsx index 87f22b232..9f58d9595 100644 --- a/src/screens/Messages/components/MessageInput.tsx +++ b/src/screens/Messages/components/MessageInput.tsx @@ -14,7 +14,7 @@ import Animated, { import {useSafeAreaInsets} from 'react-native-safe-area-context' import {msg} from '@lingui/macro' import {useLingui} from '@lingui/react' -import Graphemer from 'graphemer' +import {countGraphemes} from 'unicode-segmenter/grapheme' import {HITSLOP_10, MAX_DM_GRAPHEME_LENGTH} from '#/lib/constants' import {useHaptics} from '#/lib/haptics' @@ -75,7 +75,7 @@ export function MessageInput({ if (!hasEmbed && message.trim() === '') { return } - if (new Graphemer().countGraphemes(message) > MAX_DM_GRAPHEME_LENGTH) { + if (countGraphemes(message) > MAX_DM_GRAPHEME_LENGTH) { Toast.show(_(msg`Message is too long`), 'xmark') return } diff --git a/src/screens/Messages/components/MessageInput.web.tsx b/src/screens/Messages/components/MessageInput.web.tsx index 089347916..deb77b51d 100644 --- a/src/screens/Messages/components/MessageInput.web.tsx +++ b/src/screens/Messages/components/MessageInput.web.tsx @@ -2,9 +2,9 @@ import React from 'react' import {Pressable, View} from 'react-native' import {msg} from '@lingui/macro' import {useLingui} from '@lingui/react' -import Graphemer from 'graphemer' import {flushSync} from 'react-dom' import TextareaAutosize from 'react-textarea-autosize' +import {countGraphemes} from 'unicode-segmenter/grapheme' import {isSafari, isTouchDevice} from '#/lib/browser' import {MAX_DM_GRAPHEME_LENGTH} from '#/lib/constants' @@ -56,7 +56,7 @@ export function MessageInput({ if (!hasEmbed && message.trim() === '') { return } - if (new Graphemer().countGraphemes(message) > MAX_DM_GRAPHEME_LENGTH) { + if (countGraphemes(message) > MAX_DM_GRAPHEME_LENGTH) { Toast.show(_(msg`Message is too long`), 'xmark') return } diff --git a/src/screens/Profile/Header/EditProfileDialog.tsx b/src/screens/Profile/Header/EditProfileDialog.tsx index 6fcd3a488..68b7777bc 100644 --- a/src/screens/Profile/Header/EditProfileDialog.tsx +++ b/src/screens/Profile/Header/EditProfileDialog.tsx @@ -6,7 +6,7 @@ import {useLingui} from '@lingui/react' import {urls} from '#/lib/constants' import {cleanError} from '#/lib/strings/errors' -import {useWarnMaxGraphemeCount} from '#/lib/strings/helpers' +import {isOverMaxGraphemeCount} from '#/lib/strings/helpers' import {logger} from '#/logger' import {type ImageMeta} from '#/state/gallery' import {useProfileUpdateMutation} from '#/state/queries/profile' @@ -203,11 +203,11 @@ function DialogInner({ _, ]) - const displayNameTooLong = useWarnMaxGraphemeCount({ + const displayNameTooLong = isOverMaxGraphemeCount({ text: displayName, maxCount: DISPLAY_NAME_MAX_GRAPHEMES, }) - const descriptionTooLong = useWarnMaxGraphemeCount({ + const descriptionTooLong = isOverMaxGraphemeCount({ text: description, maxCount: DESCRIPTION_MAX_GRAPHEMES, }) diff --git a/src/screens/Takendown.tsx b/src/screens/Takendown.tsx index 77f219e55..0f40897a1 100644 --- a/src/screens/Takendown.tsx +++ b/src/screens/Takendown.tsx @@ -1,4 +1,4 @@ -import {useMemo, useState} from 'react' +import {useState} from 'react' import {View} from 'react-native' import {KeyboardAwareScrollView} from 'react-native-keyboard-controller' import {useSafeAreaInsets} from 'react-native-safe-area-context' @@ -6,7 +6,7 @@ import {type ComAtprotoAdminDefs, ToolsOzoneReportDefs} from '@atproto/api' import {msg, Trans} from '@lingui/macro' import {useLingui} from '@lingui/react' import {useMutation} from '@tanstack/react-query' -import Graphemer from 'graphemer' +import {countGraphemes} from 'unicode-segmenter/grapheme' import { BLUESKY_MOD_SERVICE_HEADERS, @@ -37,11 +37,10 @@ export function Takendown() { const agent = useAgent() const [isAppealling, setIsAppealling] = useState(false) const [reason, setReason] = useState('') - const graphemer = useMemo(() => new Graphemer(), []) - const reasonGraphemeLength = useMemo(() => { - return graphemer.countGraphemes(reason) - }, [graphemer, reason]) + const reasonGraphemeLength = countGraphemes(reason) + const isOverMaxLength = + reasonGraphemeLength > MAX_REPORT_REASON_GRAPHEME_LENGTH const { mutate: submitAppeal, @@ -72,14 +71,11 @@ export function Takendown() { const primaryBtn = isAppealling && !isSuccess ? ( ) : (