mirror of https://git.lenooby09.tech/LeNooby09/social-app.git
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Remove new_user_guided_tour and tour code (#5023)

authored by danabra.mov and committed by

GitHub faf66f31 69053b1b

+43 -567
-1
package.json
··· 199 199 "react-responsive": "^9.0.2", 200 200 "react-textarea-autosize": "^8.5.3", 201 201 "rn-fetch-blob": "^0.12.0", 202 - "rn-tourguide": "bluesky-social/rn-tourguide", 203 202 "sentry-expo": "~7.0.1", 204 203 "statsig-react-native-expo": "^4.6.1", 205 204 "tippy.js": "^6.3.7",
+7 -10
src/App.native.tsx
··· 60 60 import {useStarterPackEntry} from '#/components/hooks/useStarterPackEntry' 61 61 import {Provider as PortalProvider} from '#/components/Portal' 62 62 import {Splash} from '#/Splash' 63 - import {Provider as TourProvider} from '#/tours' 64 63 import {BackgroundNotificationPreferencesProvider} from '../modules/expo-background-notification-handler/src/BackgroundNotificationHandlerProvider' 65 64 import {AudioCategory, PlatformInfo} from '../modules/expo-bluesky-swiss-army' 66 65 ··· 127 126 <UnreadNotifsProvider> 128 127 <BackgroundNotificationPreferencesProvider> 129 128 <MutedThreadsProvider> 130 - <TourProvider> 131 - <ProgressGuideProvider> 132 - <GestureHandlerRootView 133 - style={s.h100pct}> 134 - <TestCtrls /> 135 - <Shell /> 136 - </GestureHandlerRootView> 137 - </ProgressGuideProvider> 138 - </TourProvider> 129 + <ProgressGuideProvider> 130 + <GestureHandlerRootView 131 + style={s.h100pct}> 132 + <TestCtrls /> 133 + <Shell /> 134 + </GestureHandlerRootView> 135 + </ProgressGuideProvider> 139 136 </MutedThreadsProvider> 140 137 </BackgroundNotificationPreferencesProvider> 141 138 </UnreadNotifsProvider>
+3 -6
src/App.web.tsx
··· 48 48 import {useColorModeTheme} from '#/alf/util/useColorModeTheme' 49 49 import {useStarterPackEntry} from '#/components/hooks/useStarterPackEntry' 50 50 import {Provider as PortalProvider} from '#/components/Portal' 51 - import {Provider as TourProvider} from '#/tours' 52 51 import {BackgroundNotificationPreferencesProvider} from '../modules/expo-background-notification-handler/src/BackgroundNotificationHandlerProvider' 53 52 54 53 function InnerApp() { ··· 111 110 <BackgroundNotificationPreferencesProvider> 112 111 <MutedThreadsProvider> 113 112 <SafeAreaProvider> 114 - <TourProvider> 115 - <ProgressGuideProvider> 116 - <Shell /> 117 - </ProgressGuideProvider> 118 - </TourProvider> 113 + <ProgressGuideProvider> 114 + <Shell /> 115 + </ProgressGuideProvider> 119 116 </SafeAreaProvider> 120 117 </MutedThreadsProvider> 121 118 </BackgroundNotificationPreferencesProvider>
-1
src/lib/statsig/gates.ts
··· 2 2 // Keep this alphabetic please. 3 3 | 'debug_show_feedcontext' 4 4 | 'fixed_bottom_bar' 5 - | 'new_user_guided_tour' 6 5 | 'onboarding_minimum_interests' 7 6 | 'show_follow_back_label_v2' 8 7 | 'suggested_feeds_interstitial'
-4
src/screens/Onboarding/StepFinished.tsx
··· 44 44 import {Trending2_Stroke2_Corner2_Rounded as Trending} from '#/components/icons/Trending2' 45 45 import {Loader} from '#/components/Loader' 46 46 import {Text} from '#/components/Typography' 47 - import {TOURS, useSetQueuedTour} from '#/tours' 48 47 49 48 export function StepFinished() { 50 49 const {_} = useLingui() ··· 59 58 const activeStarterPack = useActiveStarterPack() 60 59 const setActiveStarterPack = useSetActiveStarterPack() 61 60 const setHasCheckedForStarterPack = useSetHasCheckedForStarterPack() 62 - const setQueuedTour = useSetQueuedTour() 63 61 const {startProgressGuide} = useProgressGuideControls() 64 62 65 63 const finishOnboarding = React.useCallback(async () => { ··· 189 187 setSaving(false) 190 188 setActiveStarterPack(undefined) 191 189 setHasCheckedForStarterPack(true) 192 - setQueuedTour(TOURS.HOME) 193 190 startProgressGuide('like-10-and-follow-7') 194 191 dispatch({type: 'finish'}) 195 192 onboardDispatch({type: 'finish'}) ··· 223 220 requestNotificationsPermission, 224 221 setActiveStarterPack, 225 222 setHasCheckedForStarterPack, 226 - setQueuedTour, 227 223 startProgressGuide, 228 224 ]) 229 225
-18
src/tours/Debug.tsx
··· 1 - import React from 'react' 2 - import {useTourGuideController} from 'rn-tourguide' 3 - 4 - import {Button} from '#/components/Button' 5 - import {Text} from '#/components/Typography' 6 - 7 - export function TourDebugButton() { 8 - const {start} = useTourGuideController('home') 9 - return ( 10 - <Button 11 - label="Start tour" 12 - onPress={() => { 13 - start() 14 - }}> 15 - {() => <Text>t</Text>} 16 - </Button> 17 - ) 18 - }
-93
src/tours/HomeTour.tsx
··· 1 - import React from 'react' 2 - import {msg} from '@lingui/macro' 3 - import {useLingui} from '@lingui/react' 4 - import { 5 - IStep, 6 - TourGuideZone, 7 - TourGuideZoneByPosition, 8 - useTourGuideController, 9 - } from 'rn-tourguide' 10 - 11 - import {DISCOVER_FEED_URI} from '#/lib/constants' 12 - import {isWeb} from '#/platform/detection' 13 - import {useSetSelectedFeed} from '#/state/shell/selected-feed' 14 - import {TOURS} from '.' 15 - import {useHeaderPosition} from './positioning' 16 - 17 - export function HomeTour() { 18 - const {_} = useLingui() 19 - const {tourKey, eventEmitter} = useTourGuideController(TOURS.HOME) 20 - const setSelectedFeed = useSetSelectedFeed() 21 - const headerPosition = useHeaderPosition() 22 - 23 - React.useEffect(() => { 24 - const handleOnStepChange = (step?: IStep) => { 25 - if (step?.order === 2) { 26 - setSelectedFeed('following') 27 - } else if (step?.order === 3) { 28 - setSelectedFeed(`feedgen|${DISCOVER_FEED_URI}`) 29 - } 30 - } 31 - eventEmitter?.on('stepChange', handleOnStepChange) 32 - return () => { 33 - eventEmitter?.off('stepChange', handleOnStepChange) 34 - } 35 - }, [eventEmitter, setSelectedFeed]) 36 - 37 - return ( 38 - <> 39 - <TourGuideZoneByPosition 40 - isTourGuide 41 - tourKey={tourKey} 42 - zone={1} 43 - top={headerPosition.top} 44 - left={headerPosition.left} 45 - width={headerPosition.width} 46 - height={headerPosition.height} 47 - borderRadiusObject={headerPosition.borderRadiusObject} 48 - text={_(msg`Switch between feeds to control your experience.`)} 49 - /> 50 - <TourGuideZoneByPosition 51 - isTourGuide 52 - tourKey={tourKey} 53 - zone={2} 54 - top={headerPosition.top} 55 - left={headerPosition.left} 56 - width={headerPosition.width} 57 - height={headerPosition.height} 58 - borderRadiusObject={headerPosition.borderRadiusObject} 59 - text={_(msg`Following shows the latest posts from people you follow.`)} 60 - /> 61 - <TourGuideZoneByPosition 62 - isTourGuide 63 - tourKey={tourKey} 64 - zone={3} 65 - top={headerPosition.top} 66 - left={headerPosition.left} 67 - width={headerPosition.width} 68 - height={headerPosition.height} 69 - borderRadiusObject={headerPosition.borderRadiusObject} 70 - text={_(msg`Discover learns which posts you like as you browse.`)} 71 - /> 72 - </> 73 - ) 74 - } 75 - 76 - export function HomeTourExploreWrapper({ 77 - children, 78 - }: React.PropsWithChildren<{}>) { 79 - const {_} = useLingui() 80 - const {tourKey} = useTourGuideController(TOURS.HOME) 81 - return ( 82 - <TourGuideZone 83 - tourKey={tourKey} 84 - zone={4} 85 - tooltipBottomOffset={50} 86 - shape={isWeb ? 'rectangle' : 'circle'} 87 - text={_( 88 - msg`Find more feeds and accounts to follow in the Explore page.`, 89 - )}> 90 - {children} 91 - </TourGuideZone> 92 - ) 93 - }
-168
src/tours/Tooltip.tsx
··· 1 - import * as React from 'react' 2 - import { 3 - AccessibilityInfo, 4 - findNodeHandle, 5 - Pressable, 6 - Text as RNText, 7 - View, 8 - } from 'react-native' 9 - import {msg, Trans} from '@lingui/macro' 10 - import {useLingui} from '@lingui/react' 11 - import {FocusScope} from '@tamagui/focus-scope' 12 - import {IStep, Labels} from 'rn-tourguide' 13 - 14 - import {useWebBodyScrollLock} from '#/lib/hooks/useWebBodyScrollLock' 15 - import {useA11y} from '#/state/a11y' 16 - import {Logo} from '#/view/icons/Logo' 17 - import {atoms as a, useTheme} from '#/alf' 18 - import {Button, ButtonText} from '#/components/Button' 19 - import {leading, Text} from '#/components/Typography' 20 - 21 - const stopPropagation = (e: any) => e.stopPropagation() 22 - 23 - export interface TooltipComponentProps { 24 - isFirstStep?: boolean 25 - isLastStep?: boolean 26 - currentStep: IStep 27 - labels?: Labels 28 - handleNext?: () => void 29 - handlePrev?: () => void 30 - handleStop?: () => void 31 - } 32 - 33 - export function TooltipComponent({ 34 - isLastStep, 35 - handleNext, 36 - handleStop, 37 - currentStep, 38 - labels, 39 - }: TooltipComponentProps) { 40 - const t = useTheme() 41 - const {_} = useLingui() 42 - const btnRef = React.useRef<View>(null) 43 - const textRef = React.useRef<RNText>(null) 44 - const {screenReaderEnabled} = useA11y() 45 - useWebBodyScrollLock(true) 46 - 47 - const focusTextNode = () => { 48 - const node = textRef.current ? findNodeHandle(textRef.current) : undefined 49 - if (node) { 50 - AccessibilityInfo.setAccessibilityFocus(node) 51 - } 52 - } 53 - 54 - // handle initial focus immediately on mount 55 - React.useLayoutEffect(() => { 56 - focusTextNode() 57 - }, []) 58 - 59 - // handle focus between steps 60 - const innerHandleNext = () => { 61 - handleNext?.() 62 - setTimeout(() => focusTextNode(), 200) 63 - } 64 - 65 - return ( 66 - <FocusScope loop enabled trapped> 67 - <View 68 - role="alert" 69 - aria-role="alert" 70 - aria-label={_(msg`A help tooltip`)} 71 - accessibilityLiveRegion="polite" 72 - // iOS 73 - accessibilityViewIsModal 74 - // Android 75 - importantForAccessibility="yes" 76 - // @ts-ignore web only 77 - onClick={stopPropagation} 78 - onStartShouldSetResponder={_ => true} 79 - onTouchEnd={stopPropagation} 80 - style={[ 81 - t.atoms.bg, 82 - a.px_lg, 83 - a.py_lg, 84 - a.flex_col, 85 - a.gap_md, 86 - a.rounded_sm, 87 - a.shadow_md, 88 - {maxWidth: 300}, 89 - ]}> 90 - {screenReaderEnabled && ( 91 - <Pressable 92 - style={[ 93 - a.absolute, 94 - a.inset_0, 95 - a.z_10, 96 - {height: 10, bottom: 'auto'}, 97 - ]} 98 - accessibilityLabel={_( 99 - msg`Start of onboarding tour window. Do not move backward. Instead, go forward for more options, or press to skip.`, 100 - )} 101 - accessibilityHint={undefined} 102 - onPress={handleStop} 103 - /> 104 - )} 105 - 106 - <View style={[a.flex_row, a.align_center, a.gap_sm]}> 107 - <Logo width={16} style={{position: 'relative', top: 0}} /> 108 - <Text 109 - accessible={false} 110 - style={[a.text_sm, a.font_semibold, t.atoms.text_contrast_medium]}> 111 - <Trans>Quick tip</Trans> 112 - </Text> 113 - </View> 114 - <RNText 115 - ref={textRef} 116 - testID="stepDescription" 117 - accessibilityLabel={_( 118 - msg`Onboarding tour step ${currentStep.name}: ${currentStep.text}`, 119 - )} 120 - accessibilityHint={undefined} 121 - style={[ 122 - a.text_md, 123 - t.atoms.text, 124 - a.pb_sm, 125 - { 126 - lineHeight: leading(a.text_md, a.leading_snug), 127 - }, 128 - ]}> 129 - {currentStep.text} 130 - </RNText> 131 - {!isLastStep ? ( 132 - <Button 133 - ref={btnRef} 134 - variant="gradient" 135 - color="gradient_sky" 136 - size="medium" 137 - onPress={innerHandleNext} 138 - label={labels?.next || _(msg`Go to the next step of the tour`)}> 139 - <ButtonText>{labels?.next || _(msg`Next`)}</ButtonText> 140 - </Button> 141 - ) : ( 142 - <Button 143 - variant="gradient" 144 - color="gradient_sky" 145 - size="medium" 146 - onPress={handleStop} 147 - label={ 148 - labels?.finish || 149 - _(msg`Finish tour and begin using the application`) 150 - }> 151 - <ButtonText>{labels?.finish || _(msg`Let's go!`)}</ButtonText> 152 - </Button> 153 - )} 154 - 155 - {screenReaderEnabled && ( 156 - <Pressable 157 - style={[a.absolute, a.inset_0, a.z_10, {height: 10, top: 'auto'}]} 158 - accessibilityLabel={_( 159 - msg`End of onboarding tour window. Do not move forward. Instead, go backward for more options, or press to skip.`, 160 - )} 161 - accessibilityHint={undefined} 162 - onPress={handleStop} 163 - /> 164 - )} 165 - </View> 166 - </FocusScope> 167 - ) 168 - }
-62
src/tours/index.tsx
··· 1 - import React from 'react' 2 - import {InteractionManager} from 'react-native' 3 - import {TourGuideProvider, useTourGuideController} from 'rn-tourguide' 4 - 5 - import {useGate} from '#/lib/statsig/statsig' 6 - import {useColorModeTheme} from '#/alf/util/useColorModeTheme' 7 - import {HomeTour} from './HomeTour' 8 - import {TooltipComponent} from './Tooltip' 9 - 10 - export enum TOURS { 11 - HOME = 'home', 12 - } 13 - 14 - type StateContext = TOURS | null 15 - type SetContext = (v: TOURS | null) => void 16 - 17 - const stateContext = React.createContext<StateContext>(null) 18 - const setContext = React.createContext<SetContext>((_: TOURS | null) => {}) 19 - 20 - export function Provider({children}: React.PropsWithChildren<{}>) { 21 - const theme = useColorModeTheme() 22 - const [state, setState] = React.useState<TOURS | null>(() => null) 23 - 24 - return ( 25 - <TourGuideProvider 26 - androidStatusBarVisible 27 - tooltipComponent={TooltipComponent} 28 - backdropColor={ 29 - theme === 'light' ? 'rgba(0, 0, 0, 0.15)' : 'rgba(0, 0, 0, 0.8)' 30 - } 31 - preventOutsideInteraction> 32 - <stateContext.Provider value={state}> 33 - <setContext.Provider value={setState}> 34 - <HomeTour /> 35 - {children} 36 - </setContext.Provider> 37 - </stateContext.Provider> 38 - </TourGuideProvider> 39 - ) 40 - } 41 - 42 - export function useTriggerTourIfQueued(tour: TOURS) { 43 - const {start} = useTourGuideController(tour) 44 - const setQueuedTour = React.useContext(setContext) 45 - const queuedTour = React.useContext(stateContext) 46 - const gate = useGate() 47 - 48 - return React.useCallback(() => { 49 - if (queuedTour === tour) { 50 - setQueuedTour(null) 51 - InteractionManager.runAfterInteractions(() => { 52 - if (gate('new_user_guided_tour')) { 53 - start() 54 - } 55 - }) 56 - } 57 - }, [tour, queuedTour, setQueuedTour, start, gate]) 58 - } 59 - 60 - export function useSetQueuedTour() { 61 - return React.useContext(setContext) 62 - }
-23
src/tours/positioning.ts
··· 1 - import {useWindowDimensions} from 'react-native' 2 - import {useSafeAreaInsets} from 'react-native-safe-area-context' 3 - 4 - import {useShellLayout} from '#/state/shell/shell-layout' 5 - 6 - export function useHeaderPosition() { 7 - const {headerHeight} = useShellLayout() 8 - const {width} = useWindowDimensions() 9 - const insets = useSafeAreaInsets() 10 - 11 - return { 12 - top: insets.top, 13 - left: 10, 14 - width: width - 20, 15 - height: headerHeight.value, 16 - borderRadiusObject: { 17 - topLeft: 4, 18 - topRight: 4, 19 - bottomLeft: 4, 20 - bottomRight: 4, 21 - }, 22 - } 23 - }
-27
src/tours/positioning.web.ts
··· 1 - import {useWindowDimensions} from 'react-native' 2 - 3 - import {useWebMediaQueries} from '#/lib/hooks/useWebMediaQueries' 4 - import {useShellLayout} from '#/state/shell/shell-layout' 5 - 6 - export function useHeaderPosition() { 7 - const {headerHeight} = useShellLayout() 8 - const winDim = useWindowDimensions() 9 - const {isMobile} = useWebMediaQueries() 10 - 11 - let left = 0 12 - let width = winDim.width 13 - if (width > 590 && !isMobile) { 14 - left = winDim.width / 2 - 295 15 - width = 590 16 - } 17 - 18 - let offset = isMobile ? 45 : 0 19 - 20 - return { 21 - top: headerHeight.value - offset, 22 - left, 23 - width, 24 - height: 45, 25 - borderRadiusObject: undefined, 26 - } 27 - }
+1 -9
src/view/screens/Home.tsx
··· 29 29 import {FollowingEmptyState} from 'view/com/posts/FollowingEmptyState' 30 30 import {FollowingEndOfFeed} from 'view/com/posts/FollowingEndOfFeed' 31 31 import {NoFeedsPinned} from '#/screens/Home/NoFeedsPinned' 32 - import {TOURS, useTriggerTourIfQueued} from '#/tours' 33 32 import {HomeHeader} from '../com/home/HomeHeader' 34 33 35 34 type Props = NativeStackScreenProps<HomeTabNavigatorParams, 'Home' | 'Start'> ··· 88 87 const selectedIndex = Math.max(0, maybeFoundIndex) 89 88 const selectedFeed = allFeeds[selectedIndex] 90 89 const requestNotificationsPermission = useRequestNotificationsPermission() 91 - const triggerTourIfQueued = useTriggerTourIfQueued(TOURS.HOME) 92 90 const gate = useGate() 93 91 94 92 useSetTitle(pinnedFeedInfos[selectedIndex]?.displayName) ··· 141 139 React.useCallback(() => { 142 140 setMinimalShellMode(false) 143 141 setDrawerSwipeDisabled(selectedIndex > 0) 144 - triggerTourIfQueued() 145 142 return () => { 146 143 setDrawerSwipeDisabled(false) 147 144 } 148 - }, [ 149 - setDrawerSwipeDisabled, 150 - selectedIndex, 151 - setMinimalShellMode, 152 - triggerTourIfQueued, 153 - ]), 145 + }, [setDrawerSwipeDisabled, selectedIndex, setMinimalShellMode]), 154 146 ) 155 147 156 148 useFocusEffect(
+11 -14
src/view/shell/bottom-bar/BottomBar.tsx
··· 45 45 Message_Stroke2_Corner0_Rounded as Message, 46 46 Message_Stroke2_Corner0_Rounded_Filled as MessageFilled, 47 47 } from '#/components/icons/Message' 48 - import {HomeTourExploreWrapper} from '#/tours/HomeTour' 49 48 import {styles} from './BottomBarStyles' 50 49 51 50 type TabOptions = ··· 163 162 <Btn 164 163 testID="bottomBarSearchBtn" 165 164 icon={ 166 - <HomeTourExploreWrapper> 167 - {isAtSearch ? ( 168 - <MagnifyingGlassFilled 169 - width={iconWidth + 2} 170 - style={[styles.ctrlIcon, pal.text, styles.searchIcon]} 171 - /> 172 - ) : ( 173 - <MagnifyingGlass 174 - width={iconWidth + 2} 175 - style={[styles.ctrlIcon, pal.text, styles.searchIcon]} 176 - /> 177 - )} 178 - </HomeTourExploreWrapper> 165 + isAtSearch ? ( 166 + <MagnifyingGlassFilled 167 + width={iconWidth + 2} 168 + style={[styles.ctrlIcon, pal.text, styles.searchIcon]} 169 + /> 170 + ) : ( 171 + <MagnifyingGlass 172 + width={iconWidth + 2} 173 + style={[styles.ctrlIcon, pal.text, styles.searchIcon]} 174 + /> 175 + ) 179 176 } 180 177 onPress={onPressSearch} 181 178 accessibilityRole="search"
+4 -7
src/view/shell/bottom-bar/BottomBarWeb.tsx
··· 41 41 UserCircle_Filled_Corner0_Rounded as UserCircleFilled, 42 42 UserCircle_Stroke2_Corner0_Rounded as UserCircle, 43 43 } from '#/components/icons/UserCircle' 44 - import {HomeTourExploreWrapper} from '#/tours/HomeTour' 45 44 import {styles} from './BottomBarStyles' 46 45 47 46 export function BottomBarWeb() { ··· 95 94 {({isActive}) => { 96 95 const Icon = isActive ? MagnifyingGlassFilled : MagnifyingGlass 97 96 return ( 98 - <HomeTourExploreWrapper> 99 - <Icon 100 - width={iconWidth + 2} 101 - style={[styles.ctrlIcon, pal.text, styles.searchIcon]} 102 - /> 103 - </HomeTourExploreWrapper> 97 + <Icon 98 + width={iconWidth + 2} 99 + style={[styles.ctrlIcon, pal.text, styles.searchIcon]} 100 + /> 104 101 ) 105 102 }} 106 103 </NavItem>
+8 -14
src/view/shell/desktop/LeftNav.tsx
··· 63 63 UserCircle_Filled_Corner0_Rounded as UserCircleFilled, 64 64 UserCircle_Stroke2_Corner0_Rounded as UserCircle, 65 65 } from '#/components/icons/UserCircle' 66 - import {HomeTourExploreWrapper} from '#/tours/HomeTour' 67 66 import {router} from '../../../routes' 68 67 69 68 const NAV_ICON_WIDTH = 28 ··· 341 340 iconFilled={<HomeFilled width={NAV_ICON_WIDTH} style={pal.text} />} 342 341 label={_(msg`Home`)} 343 342 /> 344 - <HomeTourExploreWrapper> 345 - <NavItem 346 - href="/search" 347 - icon={<MagnifyingGlass style={pal.text} width={NAV_ICON_WIDTH} />} 348 - iconFilled={ 349 - <MagnifyingGlassFilled 350 - style={pal.text} 351 - width={NAV_ICON_WIDTH} 352 - /> 353 - } 354 - label={_(msg`Search`)} 355 - /> 356 - </HomeTourExploreWrapper> 343 + <NavItem 344 + href="/search" 345 + icon={<MagnifyingGlass style={pal.text} width={NAV_ICON_WIDTH} />} 346 + iconFilled={ 347 + <MagnifyingGlassFilled style={pal.text} width={NAV_ICON_WIDTH} /> 348 + } 349 + label={_(msg`Search`)} 350 + /> 357 351 <NavItem 358 352 href="/notifications" 359 353 count={numUnreadNotifications}
+9 -110
yarn.lock
··· 10300 10300 resolved "https://registry.yarnpkg.com/commander/-/commander-11.0.0.tgz#43e19c25dbedc8256203538e8d7e9346877a6f67" 10301 10301 integrity sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ== 10302 10302 10303 - commander@2, commander@^2.20.0: 10304 - version "2.20.3" 10305 - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" 10306 - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== 10307 - 10308 10303 commander@2.20.0: 10309 10304 version "2.20.0" 10310 10305 resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" ··· 10314 10309 version "10.0.1" 10315 10310 resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" 10316 10311 integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== 10312 + 10313 + commander@^2.20.0: 10314 + version "2.20.3" 10315 + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" 10316 + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== 10317 10317 10318 10318 commander@^4.0.0: 10319 10319 version "4.1.1" ··· 10811 10811 resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" 10812 10812 integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== 10813 10813 10814 - d3-array@^1.2.0: 10815 - version "1.2.4" 10816 - resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-1.2.4.tgz#635ce4d5eea759f6f605863dbcfc30edc737f71f" 10817 - integrity sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw== 10818 - 10819 - d3-polygon@^1.0.3: 10820 - version "1.0.6" 10821 - resolved "https://registry.yarnpkg.com/d3-polygon/-/d3-polygon-1.0.6.tgz#0bf8cb8180a6dc107f518ddf7975e12abbfbd38e" 10822 - integrity sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ== 10823 - 10824 10814 dag-map@~1.0.0: 10825 10815 version "1.0.2" 10826 10816 resolved "https://registry.yarnpkg.com/dag-map/-/dag-map-1.0.2.tgz#e8379f041000ed561fc515475c1ed2c85eece8d7" ··· 11301 11291 version "0.1.2" 11302 11292 resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" 11303 11293 integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== 11304 - 11305 - earcut@^2.1.1: 11306 - version "2.2.4" 11307 - resolved "https://registry.yarnpkg.com/earcut/-/earcut-2.2.4.tgz#6d02fd4d68160c114825d06890a92ecaae60343a" 11308 - integrity sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ== 11309 11294 11310 11295 eastasianwidth@^0.2.0: 11311 11296 version "0.2.0" ··· 12865 12850 resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.215.0.tgz#9b153fa27ab238bcc0bb1ff73b63bdb15d3f277d" 12866 12851 integrity sha512-8bjwzy8vi+fNDy8YoTBNtQUSZa53i7UWJJTunJojOtjab9cMNhOCwohionuMgDQUU0y21QTTtPOX6OQEOQT72A== 12867 12852 12868 - flubber@~0.4.2: 12869 - version "0.4.2" 12870 - resolved "https://registry.yarnpkg.com/flubber/-/flubber-0.4.2.tgz#14452d4a838cc3b9f2fb6175da94e35acd55fbaa" 12871 - integrity sha512-79RkJe3rA4nvRCVc2uXjj7U/BAUq84TS3KHn6c0Hr9K64vhj83ZNLUziNx4pJoBumSPhOl5VjH+Z0uhi+eE8Uw== 12872 - dependencies: 12873 - d3-array "^1.2.0" 12874 - d3-polygon "^1.0.3" 12875 - earcut "^2.1.1" 12876 - svg-path-properties "^0.2.1" 12877 - svgpath "^2.2.1" 12878 - topojson-client "^3.0.0" 12879 - 12880 12853 follow-redirects@^1.0.0, follow-redirects@^1.14.9, follow-redirects@^1.15.0: 12881 12854 version "1.15.2" 12882 12855 resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" ··· 13497 13470 integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== 13498 13471 dependencies: 13499 13472 react-is "^16.7.0" 13500 - 13501 - hoist-non-react-statics@~3.0.1: 13502 - version "3.0.1" 13503 - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.0.1.tgz#fba3e7df0210eb9447757ca1a7cb607162f0a364" 13504 - integrity sha512-1kXwPsOi0OGQIZNVMPvgWJ9tSnGMiMfJdihqEzrPEXlHOBh9AAHXX/QYmAJTXztnz/K+PQ8ryCb4eGaN6HlGbQ== 13505 - dependencies: 13506 - react-is "^16.3.2" 13507 13473 13508 13474 hoopy@^0.1.4: 13509 13475 version "0.1.4" ··· 16005 15971 resolved "https://registry.yarnpkg.com/lodash.chunk/-/lodash.chunk-4.2.0.tgz#66e5ce1f76ed27b4303d8c6512e8d1216e8106bc" 16006 15972 integrity sha512-ZzydJKfUHJwHa+hF5X66zLFCBrWn5GeF28OHEr4WVWtNDXlQ/IjWKPBiikqKo2ne0+v6JgCgJ0GzJp8k8bHC7w== 16007 15973 16008 - lodash.clamp@~4.0.3: 16009 - version "4.0.3" 16010 - resolved "https://registry.yarnpkg.com/lodash.clamp/-/lodash.clamp-4.0.3.tgz#5c24bedeeeef0753560dc2b4cb4671f90a6ddfaa" 16011 - integrity sha512-HvzRFWjtcguTW7yd8NJBshuNaCa8aqNFtnswdT7f/cMd/1YKy5Zzoq4W/Oxvnx9l7aeY258uSdDfM793+eLsVg== 16012 - 16013 15974 lodash.debounce@^4.0.8: 16014 15975 version "4.0.8" 16015 15976 resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" ··· 16293 16254 integrity sha512-EGowvkkgbMcIChjMTMkESFDbZeSh8xZ7kNSF0hAiAN4Jh6jgHCRS0Ga/+C8y6Au+oqpezRHCfPsmJ2+DwAgiwQ== 16294 16255 dependencies: 16295 16256 fs-monkey "^1.0.4" 16296 - 16297 - memoize-one@5.1.1: 16298 - version "5.1.1" 16299 - resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.1.1.tgz#047b6e3199b508eaec03504de71229b8eb1d75c0" 16300 - integrity sha512-HKeeBpWvqiVJD57ZUAsJNm71eHTykffzcLZVYWiVfQeI1rJtuEaS7hQiEpWfVVk18donPwJEcFKIkCmPJNOhHA== 16301 16257 16302 16258 memoize-one@^5.0.0: 16303 16259 version "5.2.1" ··· 16725 16681 dependencies: 16726 16682 minipass "^3.0.0" 16727 16683 yallist "^4.0.0" 16728 - 16729 - mitt@~1.1.3: 16730 - version "1.1.3" 16731 - resolved "https://registry.yarnpkg.com/mitt/-/mitt-1.1.3.tgz#528c506238a05dce11cd914a741ea2cc332da9b8" 16732 - integrity sha512-mUDCnVNsAi+eD6qA0HkRkwYczbLHJ49z17BGe2PYRhZL4wpZUFZGJHU7/5tmvohoma+Hdn0Vh/oJTiPEmgSruA== 16733 16684 16734 16685 mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: 16735 16686 version "0.5.3" ··· 19011 18962 resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" 19012 18963 integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== 19013 18964 19014 - react-is@^16.13.0, react-is@^16.13.1, react-is@^16.3.2, react-is@^16.7.0, react-is@^16.8.4: 18965 + react-is@^16.13.0, react-is@^16.13.1, react-is@^16.7.0, react-is@^16.8.4: 19015 18966 version "16.13.1" 19016 18967 resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" 19017 18968 integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== ··· 19820 19771 dependencies: 19821 19772 base-64 "0.1.0" 19822 19773 glob "7.0.6" 19823 - 19824 - rn-tourguide@bluesky-social/rn-tourguide: 19825 - version "3.3.0" 19826 - resolved "https://codeload.github.com/bluesky-social/rn-tourguide/tar.gz/a14bb85536b317b94d82801900df4cf57f81aef7" 19827 - dependencies: 19828 - flubber "~0.4.2" 19829 - hoist-non-react-statics "~3.0.1" 19830 - lodash.clamp "~4.0.3" 19831 - memoize-one "5.1.1" 19832 - mitt "~1.1.3" 19833 19774 19834 19775 roarr@^7.0.4: 19835 19776 version "7.15.1" ··· 20689 20630 resolved "https://registry.yarnpkg.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4" 20690 20631 integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== 20691 20632 20692 - "string-width-cjs@npm:string-width@^4.2.0": 20693 - version "4.2.3" 20694 - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" 20695 - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 20696 - dependencies: 20697 - emoji-regex "^8.0.0" 20698 - is-fullwidth-code-point "^3.0.0" 20699 - strip-ansi "^6.0.1" 20700 - 20701 - string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: 20633 + "string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: 20702 20634 version "4.2.3" 20703 20635 resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" 20704 20636 integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== ··· 20807 20739 is-obj "^1.0.1" 20808 20740 is-regexp "^1.0.0" 20809 20741 20810 - "strip-ansi-cjs@npm:strip-ansi@^6.0.1": 20742 + "strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: 20811 20743 version "6.0.1" 20812 20744 resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 20813 20745 integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== ··· 20821 20753 dependencies: 20822 20754 ansi-regex "^4.1.0" 20823 20755 20824 - strip-ansi@^6.0.0, strip-ansi@^6.0.1: 20825 - version "6.0.1" 20826 - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 20827 - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 20828 - dependencies: 20829 - ansi-regex "^5.0.1" 20830 - 20831 20756 strip-ansi@^7.0.1: 20832 20757 version "7.1.0" 20833 20758 resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" ··· 20990 20915 resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" 20991 20916 integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== 20992 20917 20993 - svg-path-properties@^0.2.1: 20994 - version "0.2.2" 20995 - resolved "https://registry.yarnpkg.com/svg-path-properties/-/svg-path-properties-0.2.2.tgz#b073d81be7292eae0e233ab8a83f58dc27113296" 20996 - integrity sha512-GmrB+b6woz6CCdQe6w1GHs/1lt25l7SR5hmhF8jRdarpv/OgjLyuQygLu1makJapixeb1aQhP/Oa1iKi93o/aQ== 20997 - 20998 20918 svgo@^1.2.2: 20999 20919 version "1.3.2" 21000 20920 resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" ··· 21026 20946 csso "^4.2.0" 21027 20947 picocolors "^1.0.0" 21028 20948 stable "^0.1.8" 21029 - 21030 - svgpath@^2.2.1: 21031 - version "2.6.0" 21032 - resolved "https://registry.yarnpkg.com/svgpath/-/svgpath-2.6.0.tgz#5b160ef3d742b7dfd2d721bf90588d3450d7a90d" 21033 - integrity sha512-OIWR6bKzXvdXYyO4DK/UWa1VA1JeKq8E+0ug2DG98Y/vOmMpfZNj+TIG988HjfYSqtcy/hFOtZq/n/j5GSESNg== 21034 20949 21035 20950 symbol-tree@^3.2.4: 21036 20951 version "3.2.4" ··· 21349 21264 dependencies: 21350 21265 "@tokenizer/token" "^0.3.0" 21351 21266 ieee754 "^1.2.1" 21352 - 21353 - topojson-client@^3.0.0: 21354 - version "3.1.0" 21355 - resolved "https://registry.yarnpkg.com/topojson-client/-/topojson-client-3.1.0.tgz#22e8b1ed08a2b922feeb4af6f53b6ef09a467b99" 21356 - integrity sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw== 21357 - dependencies: 21358 - commander "2" 21359 21267 21360 21268 totalist@^3.0.0: 21361 21269 version "3.0.1" ··· 22560 22468 "@types/trusted-types" "^2.0.2" 22561 22469 workbox-core "6.6.1" 22562 22470 22563 - "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": 22471 + "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: 22564 22472 version "7.0.0" 22565 22473 resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" 22566 22474 integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== ··· 22573 22481 version "6.2.0" 22574 22482 resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" 22575 22483 integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== 22576 - dependencies: 22577 - ansi-styles "^4.0.0" 22578 - string-width "^4.1.0" 22579 - strip-ansi "^6.0.0" 22580 - 22581 - wrap-ansi@^7.0.0: 22582 - version "7.0.0" 22583 - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" 22584 - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 22585 22484 dependencies: 22586 22485 ansi-styles "^4.0.0" 22587 22486 string-width "^4.1.0"