this repo has no description
0
fork

Configure Feed

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

fix refresh issue!

+97 -336
+1
apps/expo/package.json
··· 16 16 "@atproto/api": "^0.2.8", 17 17 "@expo/metro-config": "^0.7.1", 18 18 "@react-native-async-storage/async-storage": "1.17.11", 19 + "@react-native-community/netinfo": "9.3.7", 19 20 "@shopify/flash-list": "1.4.0", 20 21 "@tanstack/react-query": "^4.29.3", 21 22 "@trpc/client": "^10.21.1",
+7 -4
apps/expo/src/app/(tabs)/notifications.tsx
··· 24 24 import { queryClient } from "../../lib/query-client"; 25 25 import { assert } from "../../lib/utils/assert"; 26 26 import { cx } from "../../lib/utils/cx"; 27 + import { useRefreshOnFocus, useUserRefresh } from "../../lib/utils/query"; 27 28 import { timeSince } from "../../lib/utils/time"; 28 29 29 30 type NotificationGroup = { ··· 60 61 }, 61 62 getNextPageParam: (lastPage) => lastPage.cursor, 62 63 }); 64 + 65 + useRefreshOnFocus(notifications.refetch); 66 + 67 + const { refreshing, handleRefresh } = useUserRefresh(notifications.refetch); 63 68 64 69 const data = useMemo(() => { 65 70 if (!notifications.data) return []; ··· 126 131 estimatedItemSize={105} 127 132 onEndReachedThreshold={0.5} 128 133 onEndReached={() => void notifications.fetchNextPage()} 129 - onRefresh={() => { 130 - if (!notifications.isRefetching) void notifications.refetch(); 131 - }} 132 - refreshing={notifications.isRefetching} 134 + onRefresh={handleRefresh} 135 + refreshing={refreshing} 133 136 ListFooterComponent={ 134 137 notifications.isFetching ? ( 135 138 <View className="w-full items-center py-4">
+5 -4
apps/expo/src/app/(tabs)/timeline.tsx
··· 10 10 import { Tab, Tabs } from "../../components/tabs"; 11 11 import { useAuthedAgent } from "../../lib/agent"; 12 12 import { assert } from "../../lib/utils/assert"; 13 + import { useUserRefresh } from "../../lib/utils/query"; 13 14 14 15 const actorFromPost = (item: AppBskyFeedDefs.FeedViewPost) => { 15 16 if (AppBskyFeedDefs.isReasonRepost(item.reason)) { ··· 66 67 }, 67 68 getNextPageParam: (lastPage) => lastPage.cursor, 68 69 }); 70 + 71 + const { refreshing, handleRefresh } = useUserRefresh(timeline.refetch); 69 72 70 73 const data = useMemo(() => { 71 74 if (timeline.status !== "success") return []; ··· 162 165 )} 163 166 onEndReachedThreshold={0.5} 164 167 onEndReached={() => void timeline.fetchNextPage()} 165 - onRefresh={() => { 166 - if (!timeline.isRefetching) void timeline.refetch(); 167 - }} 168 - refreshing={timeline.isRefetching} 168 + onRefresh={handleRefresh} 169 + refreshing={refreshing} 169 170 estimatedItemSize={91} 170 171 ListFooterComponent={ 171 172 timeline.isFetching ? (
+5 -4
apps/expo/src/app/profile/[handle]/post/[id].tsx
··· 9 9 import { Post } from "../../../../components/post"; 10 10 import { useAuthedAgent } from "../../../../lib/agent"; 11 11 import { assert } from "../../../../lib/utils/assert"; 12 + import { useUserRefresh } from "../../../../lib/utils/query"; 12 13 13 14 type Posts = { 14 15 post: AppBskyFeedDefs.PostView; ··· 107 108 return { posts, index }; 108 109 }); 109 110 111 + const { refreshing, handleRefresh } = useUserRefresh(thread.refetch); 112 + 110 113 // hacky but needed until https://github.com/Shopify/flash-list/issues/671 is fixed 111 114 useEffect(() => { 112 115 if (thread.data && !hasScrolled.current) { ··· 146 149 ref={ref} 147 150 data={thread.data.posts} 148 151 estimatedItemSize={91} 149 - refreshing={thread.isRefetching} 150 - onRefresh={() => { 151 - if (!thread.isRefetching) thread.refetch(); 152 - }} 152 + onRefresh={handleRefresh} 153 + refreshing={refreshing} 153 154 ListFooterComponent={<View className="h-20" />} 154 155 getItemType={(item) => (item.primary ? "big" : "small")} 155 156 renderItem={({ item, index }) =>
+1 -1
apps/expo/src/components/embed.tsx
··· 171 171 172 172 useEffect(() => { 173 173 queryClient.setQueryData(["images", uri], content.images); 174 - }, [content.images]); 174 + }, [content.images, uri]); 175 175 176 176 switch (content.images.length) { 177 177 case 0:
+5 -4
apps/expo/src/components/profile-view.tsx
··· 8 8 9 9 import { useAuthedAgent } from "../lib/agent"; 10 10 import { assert } from "../lib/utils/assert"; 11 + import { useUserRefresh } from "../lib/utils/query"; 11 12 import { FeedPost } from "./feed-post"; 12 13 import { ProfileInfo } from "./profile-info"; 13 14 import { Tab, Tabs } from "./tabs"; ··· 99 100 }, 100 101 getNextPageParam: (lastPage) => lastPage.cursor, 101 102 }); 103 + 104 + const { refreshing, handleRefresh } = useUserRefresh(timeline.refetch); 102 105 103 106 const data = useMemo(() => { 104 107 if (timeline.status !== "success") return []; ··· 229 232 stickyHeaderIndices={[0]} 230 233 onEndReachedThreshold={0.5} 231 234 onEndReached={() => void timeline.fetchNextPage()} 232 - onRefresh={() => { 233 - if (!timeline.isRefetching) void timeline.refetch(); 234 - }} 235 - refreshing={timeline.isRefetching} 235 + onRefresh={handleRefresh} 236 + refreshing={refreshing} 236 237 estimatedItemSize={91} 237 238 onScroll={(evt) => { 238 239 const { contentOffset } = evt.nativeEvent;
+8 -1
apps/expo/src/lib/query-client.ts
··· 1 - import { QueryClient } from "@tanstack/react-query"; 1 + import NetInfo from "@react-native-community/netinfo"; 2 + import { QueryClient, onlineManager } from "@tanstack/react-query"; 3 + 4 + onlineManager.setEventListener((setOnline) => { 5 + return NetInfo.addEventListener((state) => { 6 + setOnline(!!state.isConnected); 7 + }); 8 + }); 2 9 3 10 export const queryClient = new QueryClient();
+26
apps/expo/src/lib/utils/query.ts
··· 1 + import { useCallback, useRef, useState } from "react"; 2 + import { useFocusEffect } from "@react-navigation/native"; 3 + 4 + export function useRefreshOnFocus<T>(refetch: () => Promise<T>) { 5 + const firstTimeRef = useRef(true); 6 + 7 + useFocusEffect( 8 + useCallback(() => { 9 + if (firstTimeRef.current) { 10 + firstTimeRef.current = false; 11 + return; 12 + } 13 + 14 + refetch(); 15 + }, [refetch]), 16 + ); 17 + } 18 + 19 + export function useUserRefresh<T>(refetch: () => Promise<T>) { 20 + const [refreshing, setRefreshing] = useState(false); 21 + const handleRefresh = useCallback(() => { 22 + setRefreshing(true); 23 + refetch().then(() => setRefreshing(false)); 24 + }, []); 25 + return { refreshing, handleRefresh }; 26 + }
+39 -318
pnpm-lock.yaml
··· 43 43 '@react-native-async-storage/async-storage': 44 44 specifier: 1.17.11 45 45 version: 1.17.11(react-native@0.71.6) 46 + '@react-native-community/netinfo': 47 + specifier: 9.3.7 48 + version: 9.3.7(react-native@0.71.6) 46 49 '@shopify/flash-list': 47 50 specifier: 1.4.0 48 51 version: 1.4.0(@babel/runtime@7.21.0)(react-native@0.71.6)(react@18.2.0) ··· 75 78 version: 4.0.1(expo@48.0.11) 76 79 expo-router: 77 80 specifier: ^1.5.3 78 - version: 1.5.3(expo-constants@14.2.1)(expo-linking@4.0.1)(expo-modules-autolinking@1.2.0)(expo-status-bar@1.4.4)(expo@48.0.11)(metro@0.76.2)(react-dom@18.2.0)(react-native-gesture-handler@2.9.0)(react-native-reanimated@2.14.4)(react-native-safe-area-context@4.5.0)(react-native-screens@3.20.0)(react-native@0.71.6)(react@18.2.0) 81 + version: 1.5.3(expo-constants@14.2.1)(expo-linking@4.0.1)(expo-status-bar@1.4.4)(expo@48.0.11)(react-dom@18.2.0)(react-native-gesture-handler@2.9.0)(react-native-reanimated@2.14.4)(react-native-safe-area-context@4.5.0)(react-native-screens@3.20.0)(react-native@0.71.6)(react@18.2.0) 79 82 expo-splash-screen: 80 83 specifier: ~0.18.1 81 - version: 0.18.1(expo-modules-autolinking@1.2.0)(expo@48.0.11) 84 + version: 0.18.1(expo@48.0.11) 82 85 expo-status-bar: 83 86 specifier: ~1.4.4 84 87 version: 1.4.4 ··· 93 96 version: 1.4.0 94 97 lucide-react-native: 95 98 specifier: ^0.172.0 96 - version: 0.172.0(prop-types@15.8.1)(react-native-svg@13.4.0)(react-native@0.71.6)(react@18.2.0) 99 + version: 0.172.0(react-native-svg@13.4.0)(react-native@0.71.6)(react@18.2.0) 97 100 nativewind: 98 101 specifier: ^2.0.11 99 102 version: 2.0.11(react@18.2.0)(tailwindcss@3.3.1) ··· 1992 1995 base64-js: 1.5.1 1993 1996 xmlbuilder: 14.0.0 1994 1997 1998 + /@expo/prebuild-config@6.0.0: 1999 + resolution: {integrity: sha512-UW0QKAoRelsalVMhAG1tmegwS+2tbefvUi6/0QiKPlMLg8GFDQ5ZnzsSmuljD0SzT5yGg8oSpKYhnrXJ6pRmIQ==} 2000 + peerDependencies: 2001 + expo-modules-autolinking: '>=0.8.1' 2002 + dependencies: 2003 + '@expo/config': 8.0.2 2004 + '@expo/config-plugins': 6.0.1 2005 + '@expo/config-types': 48.0.0 2006 + '@expo/image-utils': 0.3.22 2007 + '@expo/json-file': 8.2.37 2008 + debug: 4.3.4 2009 + fs-extra: 9.1.0 2010 + resolve-from: 5.0.0 2011 + semver: 7.3.2 2012 + xml2js: 0.4.23 2013 + transitivePeerDependencies: 2014 + - encoding 2015 + - supports-color 2016 + dev: false 2017 + 1995 2018 /@expo/prebuild-config@6.0.0(expo-modules-autolinking@1.2.0): 1996 2019 resolution: {integrity: sha512-UW0QKAoRelsalVMhAG1tmegwS+2tbefvUi6/0QiKPlMLg8GFDQ5ZnzsSmuljD0SzT5yGg8oSpKYhnrXJ6pRmIQ==} 1997 2020 peerDependencies: ··· 2614 2637 - encoding 2615 2638 - supports-color 2616 2639 - utf-8-validate 2640 + dev: false 2641 + 2642 + /@react-native-community/netinfo@9.3.7(react-native@0.71.6): 2643 + resolution: {integrity: sha512-+taWmE5WpBp0uS6kf+bouCx/sn89G9EpR4s2M/ReLvctVIFL2Qh8WnWfBxqK9qwgmFha/uqjSr2Gq03OOtiDcw==} 2644 + peerDependencies: 2645 + react-native: '>=0.59' 2646 + dependencies: 2647 + react-native: 0.71.6(@babel/core@7.21.4)(@babel/preset-env@7.21.4)(react@18.2.0) 2617 2648 dev: false 2618 2649 2619 2650 /@react-native/assets@1.0.0: ··· 3548 3579 3549 3580 /babel-plugin-syntax-trailing-function-commas@7.0.0-beta.0: 3550 3581 resolution: {integrity: sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==} 3551 - dev: false 3552 - 3553 - /babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.21.4): 3554 - resolution: {integrity: sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==} 3555 - dependencies: 3556 - '@babel/plugin-syntax-flow': 7.21.4(@babel/core@7.21.4) 3557 - transitivePeerDependencies: 3558 - - '@babel/core' 3559 3582 dev: false 3560 3583 3561 3584 /babel-preset-expo@9.3.2(@babel/core@7.21.4): ··· 5262 5285 invariant: 2.2.4 5263 5286 dev: false 5264 5287 5265 - /expo-router@1.5.3(expo-constants@14.2.1)(expo-linking@4.0.1)(expo-modules-autolinking@1.2.0)(expo-status-bar@1.4.4)(expo@48.0.11)(metro@0.76.2)(react-dom@18.2.0)(react-native-gesture-handler@2.9.0)(react-native-reanimated@2.14.4)(react-native-safe-area-context@4.5.0)(react-native-screens@3.20.0)(react-native@0.71.6)(react@18.2.0): 5288 + /expo-router@1.5.3(expo-constants@14.2.1)(expo-linking@4.0.1)(expo-status-bar@1.4.4)(expo@48.0.11)(react-dom@18.2.0)(react-native-gesture-handler@2.9.0)(react-native-reanimated@2.14.4)(react-native-safe-area-context@4.5.0)(react-native-screens@3.20.0)(react-native@0.71.6)(react@18.2.0): 5266 5289 resolution: {integrity: sha512-rZEoRpXjXpfcx549/MI7YRitaBGFOHpIGLO+cb18ecsShl3PzGPIDaBGMnTo0m1h7ip0sAIQg1EFrSAtM4LXLA==} 5267 5290 peerDependencies: 5268 5291 '@react-navigation/drawer': ^6.5.8 ··· 5290 5313 expo: 48.0.11(@babel/core@7.21.4) 5291 5314 expo-constants: 14.2.1(expo@48.0.11) 5292 5315 expo-linking: 4.0.1(expo@48.0.11) 5293 - expo-splash-screen: 0.18.1(expo-modules-autolinking@1.2.0)(expo@48.0.11) 5316 + expo-splash-screen: 0.18.1(expo@48.0.11) 5294 5317 expo-status-bar: 1.4.4 5295 - metro: 0.76.2 5296 5318 query-string: 7.1.3 5297 5319 react-helmet-async: 1.3.0(react-dom@18.2.0)(react@18.2.0) 5298 5320 react-native-gesture-handler: 2.9.0(react-native@0.71.6)(react@18.2.0) ··· 5309 5331 - supports-color 5310 5332 dev: false 5311 5333 5312 - /expo-splash-screen@0.18.1(expo-modules-autolinking@1.2.0)(expo@48.0.11): 5334 + /expo-splash-screen@0.18.1(expo@48.0.11): 5313 5335 resolution: {integrity: sha512-1di1kuh14likGUs3fyVZWAqEMxhmdAjpmf9T8Qk5OzUa5oPEMEDYB2e2VprddWnJNBVVe/ojBDSCY8w56/LS0Q==} 5314 5336 peerDependencies: 5315 5337 expo: '*' 5316 5338 dependencies: 5317 5339 '@expo/configure-splash-screen': 0.6.0 5318 - '@expo/prebuild-config': 6.0.0(expo-modules-autolinking@1.2.0) 5340 + '@expo/prebuild-config': 6.0.0 5319 5341 expo: 48.0.11(@babel/core@7.21.4) 5320 5342 transitivePeerDependencies: 5321 5343 - encoding ··· 6944 6966 dependencies: 6945 6967 yallist: 4.0.0 6946 6968 6947 - /lucide-react-native@0.172.0(prop-types@15.8.1)(react-native-svg@13.4.0)(react-native@0.71.6)(react@18.2.0): 6969 + /lucide-react-native@0.172.0(react-native-svg@13.4.0)(react-native@0.71.6)(react@18.2.0): 6948 6970 resolution: {integrity: sha512-M5J2Eyx+PhfJZaiJwPNgOGQhBlMAR9/WL9hqB7cISSVXzqqXBDiiYpBaoYEbwn95g/Fluwp174hE+41mFkBM1w==} 6949 6971 peerDependencies: 6950 6972 prop-types: ^15.7.2 ··· 6952 6974 react-native: '*' 6953 6975 react-native-svg: ^12.0.0 || ^13.0.0 6954 6976 dependencies: 6955 - prop-types: 15.8.1 6956 6977 react: 18.2.0 6957 6978 react-native: 0.71.6(@babel/core@7.21.4)(@babel/preset-env@7.21.4)(react@18.2.0) 6958 6979 react-native-svg: 13.4.0(react-native@0.71.6)(react@18.2.0) ··· 7055 7076 - supports-color 7056 7077 dev: false 7057 7078 7058 - /metro-babel-transformer@0.76.2: 7059 - resolution: {integrity: sha512-NRNjVYDs5174K3oS54W67XQ9oUJDDVNJsqz45cJycbxfAx0GKVpvhjvoRQ2LmU0I0IbLL8HQtO/6aQ9No4Udwg==} 7060 - engines: {node: '>=16'} 7061 - dependencies: 7062 - '@babel/core': 7.21.4 7063 - hermes-parser: 0.8.0 7064 - metro-source-map: 0.76.2 7065 - nullthrows: 1.1.1 7066 - transitivePeerDependencies: 7067 - - supports-color 7068 - dev: false 7069 - 7070 7079 /metro-cache-key@0.73.9: 7071 7080 resolution: {integrity: sha512-uJg+6Al7UoGIuGfoxqPBy6y1Ewq7Y8/YapGYIDh6sohInwt/kYKnPZgLDYHIPvY2deORnQ/2CYo4tOeBTnhCXQ==} 7072 - dev: false 7073 - 7074 - /metro-cache-key@0.76.2: 7075 - resolution: {integrity: sha512-30kvupiiDVvglywBn8lpNtpcedHXgI7M9Nsh5HRJDq6GF3+4/nrip0UGaa2XRfD1GyHD8B1TpMskvF3+zLKzmw==} 7076 - engines: {node: '>=16'} 7077 7081 dev: false 7078 7082 7079 7083 /metro-cache@0.73.9: ··· 7083 7087 rimraf: 3.0.2 7084 7088 dev: false 7085 7089 7086 - /metro-cache@0.76.2: 7087 - resolution: {integrity: sha512-gSSfVBNvgqbveWChmC1Om/Ri61JvjOYzmFU1XgW98cNzMtxGHC5WFi3n7u9/kkIR9quiTfyOyxHpkovqJhOixw==} 7088 - engines: {node: '>=16'} 7089 - dependencies: 7090 - metro-core: 0.76.2 7091 - rimraf: 3.0.2 7092 - dev: false 7093 - 7094 7090 /metro-config@0.73.9: 7095 7091 resolution: {integrity: sha512-NiWl1nkYtjqecDmw77tbRbXnzIAwdO6DXGZTuKSkH+H/c1NKq1eizO8Fe+NQyFtwR9YLqn8Q0WN1nmkwM1j8CA==} 7096 7092 dependencies: ··· 7107 7103 - utf-8-validate 7108 7104 dev: false 7109 7105 7110 - /metro-config@0.76.2: 7111 - resolution: {integrity: sha512-BxbmEUlglCK4GJK8beGCXm3C38ri/E0/lFV563YPuyE9OvtG1HeslvYbNAuGt3NzdFEzH4JjaQ7xeKQw5tYYvg==} 7112 - engines: {node: '>=16'} 7113 - dependencies: 7114 - cosmiconfig: 5.2.1 7115 - jest-validate: 26.6.2 7116 - metro: 0.76.2 7117 - metro-cache: 0.76.2 7118 - metro-core: 0.76.2 7119 - metro-runtime: 0.76.2 7120 - transitivePeerDependencies: 7121 - - bufferutil 7122 - - encoding 7123 - - supports-color 7124 - - utf-8-validate 7125 - dev: false 7126 - 7127 7106 /metro-core@0.73.9: 7128 7107 resolution: {integrity: sha512-1NTs0IErlKcFTfYyRT3ljdgrISWpl1nys+gaHkXapzTSpvtX9F1NQNn5cgAuE+XIuTJhbsCdfIJiM2JXbrJQaQ==} 7129 7108 dependencies: ··· 7131 7110 metro-resolver: 0.73.9 7132 7111 dev: false 7133 7112 7134 - /metro-core@0.76.2: 7135 - resolution: {integrity: sha512-LXUTPqJLp6J5Ro7IWryd0Q/Lj7AX00fgoJhFfwdOr5RDEkHyzQNeHgObCSOBSqUqDHeEY8hEWD0ugFTA7iIyaA==} 7136 - engines: {node: '>=16'} 7137 - dependencies: 7138 - lodash.throttle: 4.1.1 7139 - metro-resolver: 0.76.2 7140 - dev: false 7141 - 7142 7113 /metro-file-map@0.73.9: 7143 7114 resolution: {integrity: sha512-R/Wg3HYeQhYY3ehWtfedw8V0ne4lpufG7a21L3GWer8tafnC9pmjoCKEbJz9XZkVj9i1FtxE7UTbrtZNeIILxQ==} 7144 7115 dependencies: ··· 7161 7132 - supports-color 7162 7133 dev: false 7163 7134 7164 - /metro-file-map@0.76.2: 7165 - resolution: {integrity: sha512-thDwa/rAePaXBsW62wuRGQbi2/2BoYbRHhfXPmI8MK3TavPfjnX/tPV57+Gx4yy2MFq4AR4mI1VyMsj8vnsTBg==} 7166 - engines: {node: '>=16'} 7167 - dependencies: 7168 - anymatch: 3.1.3 7169 - debug: 2.6.9 7170 - fb-watchman: 2.0.2 7171 - graceful-fs: 4.2.11 7172 - invariant: 2.2.4 7173 - jest-regex-util: 27.5.1 7174 - jest-util: 27.5.1 7175 - jest-worker: 27.5.1 7176 - micromatch: 4.0.5 7177 - node-abort-controller: 3.1.1 7178 - nullthrows: 1.1.1 7179 - walker: 1.0.8 7180 - optionalDependencies: 7181 - fsevents: 2.3.2 7182 - transitivePeerDependencies: 7183 - - supports-color 7184 - dev: false 7185 - 7186 7135 /metro-hermes-compiler@0.73.9: 7187 7136 resolution: {integrity: sha512-5B3vXIwQkZMSh3DQQY23XpTCpX9kPLqZbA3rDuAcbGW0tzC3f8dCenkyBb0GcCzyTDncJeot/A7oVCVK6zapwg==} 7188 7137 dev: false ··· 7201 7150 - utf-8-validate 7202 7151 dev: false 7203 7152 7204 - /metro-inspector-proxy@0.76.2: 7205 - resolution: {integrity: sha512-K7ThshkczlHbFJhBDdx1Bxrls3LlQ1rnQINqXzBG2sDkOrPx2seV8s1ApaiUqDCdt803Qo9eoTYTI/vOHFmJxQ==} 7206 - engines: {node: '>=16'} 7207 - hasBin: true 7208 - dependencies: 7209 - connect: 3.7.0 7210 - debug: 2.6.9 7211 - node-fetch: 2.6.9 7212 - ws: 7.5.9 7213 - yargs: 17.7.1 7214 - transitivePeerDependencies: 7215 - - bufferutil 7216 - - encoding 7217 - - supports-color 7218 - - utf-8-validate 7219 - dev: false 7220 - 7221 7153 /metro-minify-terser@0.73.9: 7222 7154 resolution: {integrity: sha512-MTGPu2qV5qtzPJ2SqH6s58awHDtZ4jd7lmmLR+7TXDwtZDjIBA0YVfI0Zak2Haby2SqoNKrhhUns/b4dPAQAVg==} 7223 7155 dependencies: 7224 7156 terser: 5.17.1 7225 7157 dev: false 7226 7158 7227 - /metro-minify-terser@0.76.2: 7228 - resolution: {integrity: sha512-JaJ0qlNXtzPlv8JxlfuDRWmNWFZBJ3w5+vQ4tqAIA68ComTpm9DJ7pbde3DUpOts/zM4swsDAPhtu3HuhRTQhA==} 7229 - engines: {node: '>=16'} 7230 - dependencies: 7231 - terser: 5.17.1 7232 - dev: false 7233 - 7234 7159 /metro-minify-uglify@0.73.9: 7235 7160 resolution: {integrity: sha512-gzxD/7WjYcnCNGiFJaA26z34rjOp+c/Ft++194Wg91lYep3TeWQ0CnH8t2HRS7AYDHU81SGWgvD3U7WV0g4LGA==} 7236 7161 dependencies: 7237 7162 uglify-es: 3.3.9 7238 7163 dev: false 7239 7164 7240 - /metro-minify-uglify@0.76.2: 7241 - resolution: {integrity: sha512-eye94ZTWhiF3eG6+MDdvn6WSVMeQed1gB/QqXZCFrBxk6GAfeosMahwpgygc9hFIXdgc7Qv8z7F2T+hWfh+aAQ==} 7242 - engines: {node: '>=16'} 7243 - dependencies: 7244 - uglify-es: 3.3.9 7245 - dev: false 7246 - 7247 7165 /metro-react-native-babel-preset@0.73.9(@babel/core@7.21.4): 7248 7166 resolution: {integrity: sha512-AoD7v132iYDV4K78yN2OLgTPwtAKn0XlD2pOhzyBxiI8PeXzozhbKyPV7zUOJUPETj+pcEVfuYj5ZN/8+bhbCw==} 7249 7167 peerDependencies: ··· 7291 7209 - supports-color 7292 7210 dev: false 7293 7211 7294 - /metro-react-native-babel-preset@0.76.2(@babel/core@7.21.4): 7295 - resolution: {integrity: sha512-Kzi4JhEzwrPOuv3OHjDZvvlPTjInNoIV8QKBRyLTzx7TJuA5a2xReo0lz4sG4x9Bcv1XjKkKRmYUgS9V1I820w==} 7296 - engines: {node: '>=16'} 7297 - peerDependencies: 7298 - '@babel/core': '*' 7299 - dependencies: 7300 - '@babel/core': 7.21.4 7301 - '@babel/plugin-proposal-async-generator-functions': 7.20.7(@babel/core@7.21.4) 7302 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.21.4) 7303 - '@babel/plugin-proposal-export-default-from': 7.18.10(@babel/core@7.21.4) 7304 - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.21.4) 7305 - '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.21.4) 7306 - '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.21.4) 7307 - '@babel/plugin-proposal-optional-catch-binding': 7.18.6(@babel/core@7.21.4) 7308 - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.21.4) 7309 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.21.4) 7310 - '@babel/plugin-syntax-export-default-from': 7.18.6(@babel/core@7.21.4) 7311 - '@babel/plugin-syntax-flow': 7.21.4(@babel/core@7.21.4) 7312 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.21.4) 7313 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.21.4) 7314 - '@babel/plugin-transform-arrow-functions': 7.20.7(@babel/core@7.21.4) 7315 - '@babel/plugin-transform-async-to-generator': 7.20.7(@babel/core@7.21.4) 7316 - '@babel/plugin-transform-block-scoping': 7.21.0(@babel/core@7.21.4) 7317 - '@babel/plugin-transform-classes': 7.21.0(@babel/core@7.21.4) 7318 - '@babel/plugin-transform-computed-properties': 7.20.7(@babel/core@7.21.4) 7319 - '@babel/plugin-transform-destructuring': 7.21.3(@babel/core@7.21.4) 7320 - '@babel/plugin-transform-flow-strip-types': 7.21.0(@babel/core@7.21.4) 7321 - '@babel/plugin-transform-function-name': 7.18.9(@babel/core@7.21.4) 7322 - '@babel/plugin-transform-literals': 7.18.9(@babel/core@7.21.4) 7323 - '@babel/plugin-transform-modules-commonjs': 7.21.2(@babel/core@7.21.4) 7324 - '@babel/plugin-transform-named-capturing-groups-regex': 7.20.5(@babel/core@7.21.4) 7325 - '@babel/plugin-transform-parameters': 7.21.3(@babel/core@7.21.4) 7326 - '@babel/plugin-transform-react-display-name': 7.18.6(@babel/core@7.21.4) 7327 - '@babel/plugin-transform-react-jsx': 7.21.0(@babel/core@7.21.4) 7328 - '@babel/plugin-transform-react-jsx-self': 7.21.0(@babel/core@7.21.4) 7329 - '@babel/plugin-transform-react-jsx-source': 7.19.6(@babel/core@7.21.4) 7330 - '@babel/plugin-transform-runtime': 7.21.4(@babel/core@7.21.4) 7331 - '@babel/plugin-transform-shorthand-properties': 7.18.6(@babel/core@7.21.4) 7332 - '@babel/plugin-transform-spread': 7.20.7(@babel/core@7.21.4) 7333 - '@babel/plugin-transform-sticky-regex': 7.18.6(@babel/core@7.21.4) 7334 - '@babel/plugin-transform-typescript': 7.21.3(@babel/core@7.21.4) 7335 - '@babel/plugin-transform-unicode-regex': 7.18.6(@babel/core@7.21.4) 7336 - '@babel/template': 7.20.7 7337 - babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.21.4) 7338 - react-refresh: 0.4.3 7339 - transitivePeerDependencies: 7340 - - supports-color 7341 - dev: false 7342 - 7343 7212 /metro-react-native-babel-transformer@0.73.9(@babel/core@7.21.4): 7344 7213 resolution: {integrity: sha512-DSdrEHuQ22ixY7DyipyKkIcqhOJrt5s6h6X7BYJCP9AMUfXOwLe2biY3BcgJz5GOXv8/Akry4vTCvQscVS1otQ==} 7345 7214 peerDependencies: ··· 7362 7231 absolute-path: 0.0.0 7363 7232 dev: false 7364 7233 7365 - /metro-resolver@0.76.2: 7366 - resolution: {integrity: sha512-sLLwhxd31fYVxaOSzhJ8Mumi211qHOkurC2Gh+4QSDFNKDZecovMgV/W5/oIQWJBCX/mi/YkbmnpwLCUvXEoWw==} 7367 - engines: {node: '>=16'} 7368 - dev: false 7369 - 7370 7234 /metro-runtime@0.73.9: 7371 7235 resolution: {integrity: sha512-d5Hs83FpKB9r8q8Vb95+fa6ESpwysmPr4lL1I2rM2qXAFiO7OAPT9Bc23WmXgidkBtD0uUFdB2lG+H1ATz8rZg==} 7372 - dependencies: 7373 - '@babel/runtime': 7.21.0 7374 - react-refresh: 0.4.3 7375 - dev: false 7376 - 7377 - /metro-runtime@0.76.2: 7378 - resolution: {integrity: sha512-247IYGyA8tS2wkDjq0Ju3vm6Tz79nb7+DPHgMpl71nsh0/kQvgc43bEJLhMwOqouRUcJihN0MgPWUb1xNI1rUg==} 7379 - engines: {node: '>=16'} 7380 7236 dependencies: 7381 7237 '@babel/runtime': 7.21.0 7382 7238 react-refresh: 0.4.3 ··· 7397 7253 - supports-color 7398 7254 dev: false 7399 7255 7400 - /metro-source-map@0.76.2: 7401 - resolution: {integrity: sha512-fr8mSpn7Z0oYhTdcFCJsrtOX0qgOoDBw9I5mOTZBacMyItiiFYrb+2zyVacBQwrxyo/DqAJaFd3NbdbIInIyvw==} 7402 - engines: {node: '>=16'} 7403 - dependencies: 7404 - '@babel/traverse': 7.21.4 7405 - '@babel/types': 7.21.4 7406 - invariant: 2.2.4 7407 - metro-symbolicate: 0.76.2 7408 - nullthrows: 1.1.1 7409 - ob1: 0.76.2 7410 - source-map: 0.5.7 7411 - vlq: 1.0.1 7412 - transitivePeerDependencies: 7413 - - supports-color 7414 - dev: false 7415 - 7416 7256 /metro-symbolicate@0.73.9: 7417 7257 resolution: {integrity: sha512-4TUOwxRHHqbEHxRqRJ3wZY5TA8xq7AHMtXrXcjegMH9FscgYztsrIG9aNBUBS+VLB6g1qc6BYbfIgoAnLjCDyw==} 7418 7258 engines: {node: '>=8.3'} ··· 7428 7268 - supports-color 7429 7269 dev: false 7430 7270 7431 - /metro-symbolicate@0.76.2: 7432 - resolution: {integrity: sha512-yI0eBJK+FeAwNYnyoZve5hq8RplpLTUDqShnmtHmflMw1WWRyjqrxtGg6ctjgV6qQqytnodFAWd31uQQ4ag0Pw==} 7433 - engines: {node: '>=16'} 7434 - hasBin: true 7435 - dependencies: 7436 - invariant: 2.2.4 7437 - metro-source-map: 0.76.2 7438 - nullthrows: 1.1.1 7439 - source-map: 0.5.7 7440 - through2: 2.0.5 7441 - vlq: 1.0.1 7442 - transitivePeerDependencies: 7443 - - supports-color 7444 - dev: false 7445 - 7446 7271 /metro-transform-plugins@0.73.9: 7447 7272 resolution: {integrity: sha512-r9NeiqMngmooX2VOKLJVQrMuV7PAydbqst5bFhdVBPcFpZkxxqyzjzo+kzrszGy2UpSQBZr2P1L6OMjLHwQwfQ==} 7448 - dependencies: 7449 - '@babel/core': 7.21.4 7450 - '@babel/generator': 7.21.4 7451 - '@babel/template': 7.20.7 7452 - '@babel/traverse': 7.21.4 7453 - nullthrows: 1.1.1 7454 - transitivePeerDependencies: 7455 - - supports-color 7456 - dev: false 7457 - 7458 - /metro-transform-plugins@0.76.2: 7459 - resolution: {integrity: sha512-kpqOemOzxxrP1Fah3163a/7vOgzfsgmJ2RYceEt1KGg/JGYyB17CBzADiiT7H+K6fJRtZAiuKy9ru08gXnqUpA==} 7460 - engines: {node: '>=16'} 7461 7273 dependencies: 7462 7274 '@babel/core': 7.21.4 7463 7275 '@babel/generator': 7.21.4 ··· 7491 7303 - utf-8-validate 7492 7304 dev: false 7493 7305 7494 - /metro-transform-worker@0.76.2: 7495 - resolution: {integrity: sha512-BlGDrA+Vp4PkR9IVYi1Zspcqw0NXLyqMlmazFw6WzEON90v9J3rHcIyjrK2lieJ4tdovxFhmHm8YrlCT9S0Bfw==} 7496 - engines: {node: '>=16'} 7497 - dependencies: 7498 - '@babel/core': 7.21.4 7499 - '@babel/generator': 7.21.4 7500 - '@babel/parser': 7.21.4 7501 - '@babel/types': 7.21.4 7502 - babel-preset-fbjs: 3.4.0(@babel/core@7.21.4) 7503 - metro: 0.76.2 7504 - metro-babel-transformer: 0.76.2 7505 - metro-cache: 0.76.2 7506 - metro-cache-key: 0.76.2 7507 - metro-source-map: 0.76.2 7508 - metro-transform-plugins: 0.76.2 7509 - nullthrows: 1.1.1 7510 - transitivePeerDependencies: 7511 - - bufferutil 7512 - - encoding 7513 - - supports-color 7514 - - utf-8-validate 7515 - dev: false 7516 - 7517 7306 /metro@0.73.9: 7518 7307 resolution: {integrity: sha512-BlYbPmTF60hpetyNdKhdvi57dSqutb+/oK0u3ni4emIh78PiI0axGo7RfdsZ/mn3saASXc94tDbpC5yn7+NpEg==} 7519 7308 hasBin: true ··· 7565 7354 source-map: 0.5.7 7566 7355 strip-ansi: 6.0.1 7567 7356 temp: 0.8.3 7568 - throat: 5.0.0 7569 - ws: 7.5.9 7570 - yargs: 17.7.1 7571 - transitivePeerDependencies: 7572 - - bufferutil 7573 - - encoding 7574 - - supports-color 7575 - - utf-8-validate 7576 - dev: false 7577 - 7578 - /metro@0.76.2: 7579 - resolution: {integrity: sha512-pF3zWPgdlaFIUDuI6TrouRofgM9Xz5ZrzvxaJGjWen+tvDFhhQ1bah/OZre2ldMvVh800atiSx7uMLITyE+s8A==} 7580 - engines: {node: '>=16'} 7581 - hasBin: true 7582 - dependencies: 7583 - '@babel/code-frame': 7.21.4 7584 - '@babel/core': 7.21.4 7585 - '@babel/generator': 7.21.4 7586 - '@babel/parser': 7.21.4 7587 - '@babel/template': 7.20.7 7588 - '@babel/traverse': 7.21.4 7589 - '@babel/types': 7.21.4 7590 - accepts: 1.3.8 7591 - async: 3.2.4 7592 - chalk: 4.1.2 7593 - ci-info: 2.0.0 7594 - connect: 3.7.0 7595 - debug: 2.6.9 7596 - denodeify: 1.2.1 7597 - error-stack-parser: 2.1.4 7598 - graceful-fs: 4.2.11 7599 - hermes-parser: 0.8.0 7600 - image-size: 0.6.3 7601 - invariant: 2.2.4 7602 - jest-worker: 27.5.1 7603 - lodash.throttle: 4.1.1 7604 - metro-babel-transformer: 0.76.2 7605 - metro-cache: 0.76.2 7606 - metro-cache-key: 0.76.2 7607 - metro-config: 0.76.2 7608 - metro-core: 0.76.2 7609 - metro-file-map: 0.76.2 7610 - metro-inspector-proxy: 0.76.2 7611 - metro-minify-terser: 0.76.2 7612 - metro-minify-uglify: 0.76.2 7613 - metro-react-native-babel-preset: 0.76.2(@babel/core@7.21.4) 7614 - metro-resolver: 0.76.2 7615 - metro-runtime: 0.76.2 7616 - metro-source-map: 0.76.2 7617 - metro-symbolicate: 0.76.2 7618 - metro-transform-plugins: 0.76.2 7619 - metro-transform-worker: 0.76.2 7620 - mime-types: 2.1.35 7621 - node-fetch: 2.6.9 7622 - nullthrows: 1.1.1 7623 - rimraf: 3.0.2 7624 - serialize-error: 2.1.0 7625 - source-map: 0.5.7 7626 - strip-ansi: 6.0.1 7627 7357 throat: 5.0.0 7628 7358 ws: 7.5.9 7629 7359 yargs: 17.7.1 ··· 7937 7667 engines: {node: '>=12.0.0'} 7938 7668 dev: false 7939 7669 7940 - /node-abort-controller@3.1.1: 7941 - resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} 7942 - dev: false 7943 - 7944 7670 /node-dir@0.1.17: 7945 7671 resolution: {integrity: sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==} 7946 7672 engines: {node: '>= 0.10.5'} ··· 8037 7763 8038 7764 /ob1@0.73.9: 8039 7765 resolution: {integrity: sha512-kHOzCOFXmAM26fy7V/YuXNKne2TyRiXbFAvPBIbuedJCZZWQZHLdPzMeXJI4Egt6IcfDttRzN3jQ90wOwq1iNw==} 8040 - dev: false 8041 - 8042 - /ob1@0.76.2: 8043 - resolution: {integrity: sha512-4Nazxd75vdXgFwq1braZ+u3QerxT1WVgltU43eByw4MaAdvSeuJt6wKwey7Ts5hfVOZrpfVAkHmmw0nDEg4KMg==} 8044 - engines: {node: '>=16'} 8045 7766 dev: false 8046 7767 8047 7768 /object-assign@4.1.1: