diff --git a/CHANGELOG.md b/CHANGELOG.md index ba9af205a5..fccae4fc43 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -58,6 +58,11 @@ - Adds symbol files upload script ([#1137](https://github.com/Instabug/Instabug-React-Native/pull/1137)) - Support enabling NDK crash capturing on Android ([#1132](https://github.com/Instabug/Instabug-React-Native/pull/1132)). +- Add support for App Flows APIs `APM.startFlow`, `APM.setFlowAttribute` and `APM.endFlow` ([#1138](https://github.com/Instabug/Instabug-React-Native/pull/1138)). + +### Deprecated + +- Deprecate execution traces APIs `APM.startExecutionTrace`, `Trace.end` and `Trace.setFlowAttribute` in favor of the new app flow APIs ([#1138](https://github.com/Instabug/Instabug-React-Native/pull/1138)). ### Deprecated @@ -84,6 +89,10 @@ - Bump Instabug Android SDK to v12.8.0 ([#1149](https://github.com/Instabug/Instabug-React-Native/pull/1149)). [See release notes](https://github.com/Instabug/android/releases/tag/v12.8.0). +### Deprecated + +- Deprecate Execution Traces APIs `APM.startExecutionTrace`, `Trace.end` and `Trace.setAttribute` in favor of the new App Flows APIs ([#1138](https://github.com/Instabug/Instabug-React-Native/pull/1138)). + ## [12.7.1](https://github.com/Instabug/Instabug-React-Native/compare/v12.7.0...v12.7.1) (February 15, 2024) ### Changed diff --git a/examples/default/ios/Podfile.lock b/examples/default/ios/Podfile.lock index ee026b369c..dcaa1c6971 100644 --- a/examples/default/ios/Podfile.lock +++ b/examples/default/ios/Podfile.lock @@ -404,6 +404,8 @@ PODS: - React-jsinspector (0.72.3) - React-logger (0.72.3): - glog + - react-native-background-timer (2.4.1): + - React-Core - react-native-config (1.5.1): - react-native-config/App (= 1.5.1) - react-native-config/App (1.5.1): @@ -528,6 +530,8 @@ PODS: - React-jsi (= 0.72.3) - React-logger (= 0.72.3) - React-perflogger (= 0.72.3) + - RNCClipboard (1.5.1): + - React-Core - RNGestureHandler (2.13.4): - RCT-Folly (= 2021.07.22.00) - React-Core @@ -623,6 +627,7 @@ DEPENDENCIES: - React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`) - React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector`) - React-logger (from `../node_modules/react-native/ReactCommon/logger`) + - react-native-background-timer (from `../node_modules/react-native-background-timer`) - react-native-config (from `../node_modules/react-native-config`) - react-native-google-maps (from `../node_modules/react-native-maps`) - react-native-maps (from `../node_modules/react-native-maps`) @@ -645,6 +650,7 @@ DEPENDENCIES: - React-runtimescheduler (from `../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler`) - React-utils (from `../node_modules/react-native/ReactCommon/react/utils`) - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) + - "RNCClipboard (from `../node_modules/@react-native-community/clipboard`)" - RNGestureHandler (from `../node_modules/react-native-gesture-handler`) - RNInstabug (from `../node_modules/instabug-reactnative`) - RNReanimated (from `../node_modules/react-native-reanimated`) @@ -720,6 +726,8 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon/jsinspector" React-logger: :path: "../node_modules/react-native/ReactCommon/logger" + react-native-background-timer: + :path: "../node_modules/react-native-background-timer" react-native-config: :path: "../node_modules/react-native-config" react-native-google-maps: @@ -764,6 +772,8 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon/react/utils" ReactCommon: :path: "../node_modules/react-native/ReactCommon" + RNCClipboard: + :path: "../node_modules/@react-native-community/clipboard" RNGestureHandler: :path: "../node_modules/react-native-gesture-handler" RNInstabug: @@ -818,6 +828,7 @@ SPEC CHECKSUMS: React-jsiexecutor: 59d1eb03af7d30b7d66589c410f13151271e8006 React-jsinspector: b511447170f561157547bc0bef3f169663860be7 React-logger: c5b527272d5f22eaa09bb3c3a690fee8f237ae95 + react-native-background-timer: 17ea5e06803401a379ebf1f20505b793ac44d0fe react-native-config: 86038147314e2e6d10ea9972022aa171e6b1d4d8 react-native-google-maps: 1bcc1f9f13f798fcf230db7fe476f3566d0bc0a3 react-native-maps: 72a8a903f8a1b53e2c777ba79102078ab502e0bf @@ -840,6 +851,7 @@ SPEC CHECKSUMS: React-runtimescheduler: 837c1bebd2f84572db17698cd702ceaf585b0d9a React-utils: bcb57da67eec2711f8b353f6e3d33bd8e4b2efa3 ReactCommon: 3ccb8fb14e6b3277e38c73b0ff5e4a1b8db017a9 + RNCClipboard: 41d8d918092ae8e676f18adada19104fa3e68495 RNGestureHandler: 6e46dde1f87e5f018a54fe5d40cd0e0b942b49ee RNInstabug: 6fa68cd181533f83154df2ebba000d0c47ca7ba3 RNReanimated: ab2e96c6d5591c3dfbb38a464f54c8d17fb34a87 diff --git a/examples/default/package.json b/examples/default/package.json index 5c6b173c17..529521802d 100644 --- a/examples/default/package.json +++ b/examples/default/package.json @@ -10,14 +10,19 @@ "postinstall": "patch-package" }, "dependencies": { + "@react-native-community/clipboard": "^1.5.1", "@react-native-community/slider": "^4.4.3", "@react-navigation/bottom-tabs": "^6.5.7", "@react-navigation/native": "^6.1.6", "@react-navigation/native-stack": "^6.9.12", + "graphql": "^16.8.1", + "graphql-request": "^6.1.0", "instabug-reactnative": "link:../..", + "instabug-reactnative-ndk": "github:https://github.com/Instabug/Instabug-React-Native-NDK", "native-base": "^3.4.28", "react": "18.2.0", "react-native": "0.72.3", + "react-native-background-timer": "^2.4.1", "react-native-config": "^1.5.1", "react-native-gesture-handler": "^2.13.4", "react-native-maps": "^1.10.3", @@ -26,7 +31,7 @@ "react-native-screens": "^3.20.0", "react-native-svg": "^13.9.0", "react-native-vector-icons": "^10.0.0", - "instabug-reactnative-ndk": "github:https://github.com/Instabug/Instabug-React-Native-NDK" + "react-query": "^3.39.3" }, "devDependencies": { "@babel/core": "^7.20.0", @@ -35,6 +40,7 @@ "@react-native/metro-config": "^0.73.1", "@types/jest": "^29.2.1", "@types/react": "^18.0.24", + "@types/react-native-background-timer": "^2.0.2", "@types/react-native-vector-icons": "^6.4.13", "@types/react-test-renderer": "^18.0.0", "babel-jest": "^29.2.1", diff --git a/examples/default/src/App.tsx b/examples/default/src/App.tsx index 4bc1447056..d92db633c1 100644 --- a/examples/default/src/App.tsx +++ b/examples/default/src/App.tsx @@ -15,6 +15,10 @@ import { RootTabNavigator } from './navigation/RootTab'; import { nativeBaseTheme } from './theme/nativeBaseTheme'; import { navigationTheme } from './theme/navigationTheme'; +import { QueryClient, QueryClientProvider } from 'react-query'; + +const queryClient = new QueryClient(); + export const App: React.FC = () => { useEffect(() => { Instabug.init({ @@ -32,9 +36,11 @@ export const App: React.FC = () => { return ( - - - + + + + + ); diff --git a/examples/default/src/components/ClipboardTextInput.tsx b/examples/default/src/components/ClipboardTextInput.tsx new file mode 100644 index 0000000000..05d9c35ec6 --- /dev/null +++ b/examples/default/src/components/ClipboardTextInput.tsx @@ -0,0 +1,36 @@ +import React, { PropsWithChildren } from 'react'; +import { StyleProp, StyleSheet, TextStyle } from 'react-native'; +import PasteFromClipboardButton from './PasteFromClipboardButton'; +import { HStack } from 'native-base'; +import { InputField } from './InputField'; + +interface ClipboardTextInputProps extends PropsWithChildren { + placeholder?: string; + onChangeText?: (text: string) => void; + value?: string; + selectTextOnFocus?: boolean; + style?: StyleProp; +} + +export const ClipboardTextInput: React.FC = ({ + onChangeText, + style, + ...restProps +}) => { + return ( + + + + + ); + + function handleClipboardPress(text: string) { + onChangeText?.call(undefined, text); + } +}; + +export const styles = StyleSheet.create({ + inputField: { + flex: 1, + }, +}); diff --git a/examples/default/src/components/CustomButton.tsx b/examples/default/src/components/CustomButton.tsx new file mode 100644 index 0000000000..07bcf9798c --- /dev/null +++ b/examples/default/src/components/CustomButton.tsx @@ -0,0 +1,31 @@ +import React, { PropsWithChildren } from 'react'; +import type { StyleProp, TextStyle } from 'react-native'; +import { Button } from 'native-base'; +import { CustomText } from './CustomText'; +import { StyleSheet } from 'react-native'; + +interface CustomButtonProps extends PropsWithChildren { + title?: string; + onPress?: () => void; + style?: StyleProp; +} + +export const CustomButton: React.FC = ({ + style, + title, + children, + ...restProps +}) => { + return ( + + ); +}; + +export const styles = StyleSheet.create({ + text: { + color: '#fff', + }, +}); diff --git a/examples/default/src/components/CustomImage.tsx b/examples/default/src/components/CustomImage.tsx new file mode 100644 index 0000000000..5c5d051ebe --- /dev/null +++ b/examples/default/src/components/CustomImage.tsx @@ -0,0 +1,17 @@ +import React, { PropsWithChildren } from 'react'; +import { StyleProp, StyleSheet, TextStyle, Text } from 'react-native'; + +interface CustomTextProps extends PropsWithChildren { + style?: StyleProp; +} + +export const CustomImage: React.FC = ({ style, children }) => { + return {children}; +}; + +export const styles = StyleSheet.create({ + text: { + fontSize: 16, + lineHeight: 24, + }, +}); diff --git a/examples/default/src/components/CustomText.tsx b/examples/default/src/components/CustomText.tsx new file mode 100644 index 0000000000..5e36221280 --- /dev/null +++ b/examples/default/src/components/CustomText.tsx @@ -0,0 +1,17 @@ +import React, { PropsWithChildren } from 'react'; +import { StyleProp, StyleSheet, TextStyle, Text } from 'react-native'; + +interface CustomTextProps extends PropsWithChildren { + style?: StyleProp; +} + +export const CustomText: React.FC = ({ style, children }) => { + return {children}; +}; + +export const styles = StyleSheet.create({ + text: { + fontSize: 16, + lineHeight: 24, + }, +}); diff --git a/examples/default/src/components/InputField.tsx b/examples/default/src/components/InputField.tsx index 1a5700c27c..feef8fd7b5 100644 --- a/examples/default/src/components/InputField.tsx +++ b/examples/default/src/components/InputField.tsx @@ -1,13 +1,22 @@ import React, { forwardRef } from 'react'; -import { KeyboardTypeOptions, StyleSheet, TextInput, View } from 'react-native'; +import { + KeyboardTypeOptions, + StyleProp, + StyleSheet, + TextInput, + ViewStyle, + View, +} from 'react-native'; import { Text } from 'native-base'; interface InputFieldProps { placeholder?: string; value?: string; + style?: StyleProp; onChangeText?: (text: string) => void; keyboardType?: KeyboardTypeOptions; + selectTextOnFocus?: boolean | undefined; errorText?: string; maxLength?: number; accessibilityLabel?: string; @@ -19,6 +28,7 @@ export const InputField = forwardRef( { placeholder, value, + style, onChangeText, accessibilityLabel, maxLength, @@ -33,7 +43,7 @@ export const InputField = forwardRef( void; + style?: StyleProp; +} + +const PasteFromClipboardButton: React.FC = ({ onPress, style }) => { + const handlePress = async () => { + const text = await Clipboard.getString(); + onPress?.call(undefined, text); // Using call to pass the text to the callback + }; + + return ( + + + + ); +}; + +export default PasteFromClipboardButton; diff --git a/examples/default/src/navigation/HomeStack.tsx b/examples/default/src/navigation/HomeStack.tsx index 184e36f03d..b4a8ca3e69 100644 --- a/examples/default/src/navigation/HomeStack.tsx +++ b/examples/default/src/navigation/HomeStack.tsx @@ -21,6 +21,10 @@ import { } from '../screens/user-steps/BackAndForthScreen'; import { GoogleMapsScreen } from '../screens/user-steps/GoogleMapsScreen'; import { LargeImageListScreen } from '../screens/user-steps/LargeImageListScreen'; +import { APMScreen } from '../screens/apm/APMScreen'; +import { TracesScreen } from '../screens/apm/TracesScreen'; +import { NetworkScreen } from '../screens/apm/NetworkScreen'; +import { FlowsScreen } from '../screens/apm/FlowsScreen'; import { SessionReplayScreen } from '../screens/SessionReplayScreen'; export type HomeStackParamList = { @@ -41,6 +45,12 @@ export type HomeStackParamList = { LargeImageList: undefined; SessionReplay: undefined; BackAndForthScreen: BackAndForthScreenProp; + + // APM // + APM: undefined; + NetworkTraces: undefined; + ExecutionTraces: undefined; + AppFlows: undefined; }; const HomeStack = createNativeStackNavigator(); @@ -65,7 +75,6 @@ export const HomeStackNavigator: React.FC = () => { options={{ title: 'Feature Requests' }} /> - { options={{ title: 'Large Image List' }} /> + + + + ); }; diff --git a/examples/default/src/screens/HomeScreen.tsx b/examples/default/src/screens/HomeScreen.tsx index 086dc0650f..690d41cc2d 100644 --- a/examples/default/src/screens/HomeScreen.tsx +++ b/examples/default/src/screens/HomeScreen.tsx @@ -17,6 +17,7 @@ export const HomeScreen: React.FC navigation.navigate('Replies')} /> navigation.navigate('Surveys')} /> navigation.navigate('UserSteps')} /> + navigation.navigate('APM')} /> navigation.navigate('SessionReplay')} /> ); diff --git a/examples/default/src/screens/apm/APMScreen.tsx b/examples/default/src/screens/apm/APMScreen.tsx new file mode 100644 index 0000000000..2bc4dbca0d --- /dev/null +++ b/examples/default/src/screens/apm/APMScreen.tsx @@ -0,0 +1,17 @@ +import type { NativeStackScreenProps } from '@react-navigation/native-stack'; +import type { HomeStackParamList } from '../../navigation/HomeStack'; +import React from 'react'; +import { ListTile } from '../../components/ListTile'; +import { Screen } from '../../components/Screen'; + +export const APMScreen: React.FC> = ({ + navigation, +}) => { + return ( + + navigation.navigate('NetworkTraces')} /> + navigation.navigate('ExecutionTraces')} /> + navigation.navigate('AppFlows')} /> + + ); +}; diff --git a/examples/default/src/screens/apm/FlowsScreen.tsx b/examples/default/src/screens/apm/FlowsScreen.tsx new file mode 100644 index 0000000000..be9b0fec70 --- /dev/null +++ b/examples/default/src/screens/apm/FlowsScreen.tsx @@ -0,0 +1,63 @@ +import React, { useState } from 'react'; +import { APM } from 'instabug-reactnative'; +import { ScrollView } from 'react-native'; +import { Section } from '../../components/Section'; +import { Screen } from '../../components/Screen'; +import { VStack } from 'native-base'; +import { InputField } from '../../components/InputField'; +import { CustomButton } from '../../components/CustomButton'; +import BackgroundTimer from 'react-native-background-timer'; + +export const FlowsScreen: React.FC = () => { + const [flowName, setFlowName] = useState(''); + const [flowAttributeKey, setFlowAttributeKey] = useState(''); + const [flowAttributeValue, setFlowAttributeValue] = useState(''); + + async function startFlow() { + return APM.startFlow(flowName); + } + + async function startDelayedFlow() { + return BackgroundTimer.setTimeout(() => { + APM.startFlow(flowName); + }, 5000); + } + + function setFlowAttribute() { + return APM.setFlowAttribute(flowName, flowAttributeKey, flowAttributeValue); + } + + function endFlow() { + APM.endFlow(flowName); + } + + return ( + + +
+ + setFlowName(text)} + value={flowName} + /> + + + setFlowAttributeKey(text)} + value={flowAttributeKey} + /> + setFlowAttributeValue(text)} + value={flowAttributeValue} + /> + + + +
+
+
+ ); +}; diff --git a/examples/default/src/screens/apm/NetworkScreen.tsx b/examples/default/src/screens/apm/NetworkScreen.tsx new file mode 100644 index 0000000000..467a621f21 --- /dev/null +++ b/examples/default/src/screens/apm/NetworkScreen.tsx @@ -0,0 +1,110 @@ +import React, { useState } from 'react'; +import { Image, ScrollView, StyleSheet, Text, useWindowDimensions, View } from 'react-native'; +import { Section } from '../../components/Section'; +import { Screen } from '../../components/Screen'; +import { ClipboardTextInput } from '../../components/ClipboardTextInput'; +import { useQuery } from 'react-query'; +import { HStack, VStack } from 'native-base'; +import { gql, request } from 'graphql-request'; +import { CustomButton } from '../../components/CustomButton'; + +export const NetworkScreen: React.FC = () => { + const [endpointUrl, setEndpointUrl] = useState(''); + const { width, height } = useWindowDimensions(); + const defaultRequestUrl = 'https://jsonplaceholder.typicode.com/posts/1'; + const imageUrls = [ + 'https://fastly.picsum.photos/id/57/200/300.jpg?hmac=l908G1qVr4r7dP947-tak2mY8Vvic_vEYzCXUCKKskY', + 'https://fastly.picsum.photos/id/619/200/300.jpg?hmac=WqBGwlGjuY9RCdpzRaG9G-rc9Fi7TGUINX_-klAL2kA', + ]; + + async function sendRequestToUrl() { + let urlToSend = ''; + + if (endpointUrl.trim() !== '') { + urlToSend = endpointUrl; + console.log('Sending request to: ', endpointUrl); + } else { + // Use json placeholder URL as a default if endpointUrl is empty + console.log('sending request to default json placeholder'); + urlToSend = defaultRequestUrl; + } + + try { + // Perform the request using the urlToSend + const response = await fetch(urlToSend); + const data = await response.json(); + + // Format the JSON response for better logging + const formattedData = JSON.stringify(data, null, 2); + + // Log the formatted response + console.log('Response:', formattedData); + } catch (error) { + // Handle errors appropriately + console.error('Error:', error); + } + } + + const fetchGraphQlData = async () => { + const document = gql` + query { + country(code: "EG") { + emoji + name + } + } + `; + + return request<{ country: { emoji: string; name: string } }>( + 'https://countries.trevorblades.com/graphql', + document, + ); + }; + + const { data, isError, isSuccess, isLoading, refetch } = useQuery('helloQuery', fetchGraphQlData); + + return ( + + +
+ + setEndpointUrl(text)} + selectTextOnFocus={true} + value={endpointUrl} + /> + + refetch} title="Reload GraphQL" /> + + {isLoading && Loading...} + {isSuccess && GraphQL Data: {data.country.emoji}} + {isError && Error!} + + +
+
+ + {imageUrls.map((imageUrl) => ( + + ))} + +
+
+
+ ); +}; +const styles = StyleSheet.create({ + image: { + resizeMode: 'contain', + }, + // Todo: Text Component + // Todo: Button Component + // Todo: Image Component +}); diff --git a/examples/default/src/screens/apm/TracesScreen.tsx b/examples/default/src/screens/apm/TracesScreen.tsx new file mode 100644 index 0000000000..bd3e41838a --- /dev/null +++ b/examples/default/src/screens/apm/TracesScreen.tsx @@ -0,0 +1,70 @@ +import React, { useState } from 'react'; +import { APM, Trace } from 'instabug-reactnative'; +import { ScrollView } from 'react-native'; +import { Section } from '../../components/Section'; +import { Screen } from '../../components/Screen'; +import { VStack } from 'native-base'; +import { InputField } from '../../components/InputField'; +import { CustomButton } from '../../components/CustomButton'; +import BackgroundTimer from 'react-native-background-timer'; + +export const TracesScreen: React.FC = () => { + const [traceName, setTraceName] = useState(''); + const [traceAttributeKey, setTraceAttributeKey] = useState(''); + const [traceAttributeValue, setTraceAttributeValue] = useState(''); + let executionTrace: Trace; + + async function startTrace() { + executionTrace = await APM.startExecutionTrace(traceName ?? ''); + } + + async function startDelayedTrace() { + return BackgroundTimer.setTimeout(async () => { + executionTrace = await APM.startExecutionTrace(traceName ?? ''); + }, 5000); + } + + function setTraceAttribute() { + if (!executionTrace) { + console.log('Please, start a trace before setting attributes.'); + } + return executionTrace.setAttribute(traceAttributeKey ?? '', traceAttributeValue ?? ''); + } + + function endExecutionTrace() { + if (!executionTrace) { + console.log('Please, start a trace before ending it.'); + } + return executionTrace.end(); + } + + return ( + + +
+ + setTraceName(text)} + value={traceName} + /> + + + setTraceAttributeKey(text)} + value={traceAttributeKey} + /> + setTraceAttributeValue(text)} + value={traceAttributeValue} + /> + + + +
+
+
+ ); +}; diff --git a/examples/default/yarn.lock b/examples/default/yarn.lock index e388f66821..74f7ce0e3b 100644 --- a/examples/default/yarn.lock +++ b/examples/default/yarn.lock @@ -1279,6 +1279,13 @@ dependencies: regenerator-runtime "^0.13.11" +"@babel/runtime@^7.23.8", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2": + version "7.23.9" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz#47791a15e4603bb5f905bc0753801cf21d6345f7" + integrity sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw== + 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" @@ -1391,6 +1398,11 @@ dependencies: tslib "^2.4.0" +"@graphql-typed-document-node/core@^3.2.0": + version "3.2.0" + resolved "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz#5f3d96ec6b2354ad6d8a28bf216a1d97b5426861" + integrity sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ== + "@hapi/hoek@^9.0.0": version "9.3.0" resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" @@ -2313,6 +2325,11 @@ prompts "^2.4.0" semver "^6.3.0" +"@react-native-community/clipboard@^1.5.1": + version "1.5.1" + resolved "https://registry.npmjs.org/@react-native-community/clipboard/-/clipboard-1.5.1.tgz#32abb3ea2eb91ee3f9c5fb1d32d5783253c9fabe" + integrity sha512-AHAmrkLEH5UtPaDiRqoULERHh3oNv7Dgs0bTC0hO5Z2GdNokAMPT5w8ci8aMcRemcwbtdHjxChgtjbeA38GBdA== + "@react-native-community/slider@^4.4.3": version "4.4.3" resolved "https://registry.yarnpkg.com/@react-native-community/slider/-/slider-4.4.3.tgz#9b9dc639b88f5bfda72bd72a9dff55cbf9f777ed" @@ -3018,6 +3035,11 @@ resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== +"@types/react-native-background-timer@^2.0.2": + version "2.0.2" + resolved "https://registry.npmjs.org/@types/react-native-background-timer/-/react-native-background-timer-2.0.2.tgz#22f9126124068a0ee6a812e16f98e270c2b9b2c7" + integrity sha512-cMAep0M5yqUHjiiRPvGiviqiJYdI45KSjbI5ufsIFSQGFwHwrHJC/8yawNhy0G3Gix6fufWLsEj6jC5niUNHiQ== + "@types/react-native-vector-icons@^6.4.13": version "6.4.13" resolved "https://registry.yarnpkg.com/@types/react-native-vector-icons/-/react-native-vector-icons-6.4.13.tgz#28b34d15094e040718beefb67cb3eff0c4994cb6" @@ -3366,6 +3388,11 @@ base64-js@^1.1.2, base64-js@^1.3.1: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== +big-integer@^1.6.16: + version "1.6.52" + resolved "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz#60a887f3047614a8e1bffe5d7173490a97dc8c85" + integrity sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg== + bl@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" @@ -3407,6 +3434,20 @@ braces@^3.0.2: dependencies: fill-range "^7.0.1" +broadcast-channel@^3.4.1: + version "3.7.0" + resolved "https://registry.npmjs.org/broadcast-channel/-/broadcast-channel-3.7.0.tgz#2dfa5c7b4289547ac3f6705f9c00af8723889937" + integrity sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg== + dependencies: + "@babel/runtime" "^7.7.2" + detect-node "^2.1.0" + js-sha3 "0.8.0" + microseconds "0.2.0" + nano-time "1.0.0" + oblivious-set "1.0.0" + rimraf "3.0.2" + unload "2.2.0" + browser-process-hrtime@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" @@ -3780,6 +3821,13 @@ cosmiconfig@^5.0.5, cosmiconfig@^5.1.0: js-yaml "^3.13.1" parse-json "^4.0.0" +cross-fetch@^3.1.5: + version "3.1.8" + resolved "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz#0327eba65fd68a7d119f8fb2bf9334a1a7956f82" + integrity sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg== + dependencies: + node-fetch "^2.6.12" + cross-spawn@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41" @@ -3922,6 +3970,11 @@ detect-newline@^3.0.0: resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== +detect-node@^2.0.4, detect-node@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" + integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== + detox@^20.9.0: version "20.11.2" resolved "https://registry.yarnpkg.com/detox/-/detox-20.11.2.tgz#7628ad7909b343069e164fbada428ac12464eb67" @@ -4415,6 +4468,19 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.2.0, resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== +graphql-request@^6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/graphql-request/-/graphql-request-6.1.0.tgz#f4eb2107967af3c7a5907eb3131c671eac89be4f" + integrity sha512-p+XPfS4q7aIpKVcgmnZKhMNqhltk20hfXtkaIkTfjjmiKMJ5xrt5c743cL03y/K7y1rg3WrIC49xGiEQ4mxdNw== + dependencies: + "@graphql-typed-document-node/core" "^3.2.0" + cross-fetch "^3.1.5" + +graphql@^16.8.1: + version "16.8.1" + resolved "https://registry.npmjs.org/graphql/-/graphql-16.8.1.tgz#1930a965bef1170603702acdb68aedd3f3cf6f07" + integrity sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw== + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -5180,6 +5246,11 @@ js-queue@2.0.2: dependencies: easy-stack "^1.0.1" +js-sha3@0.8.0: + version "0.8.0" + resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" + integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== + "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -5496,6 +5567,14 @@ makeerror@1.0.12: dependencies: tmpl "1.0.5" +match-sorter@^6.0.2: + version "6.3.4" + resolved "https://registry.npmjs.org/match-sorter/-/match-sorter-6.3.4.tgz#afa779d8e922c81971fbcb4781c7003ace781be7" + integrity sha512-jfZW7cWS5y/1xswZo8VBOdudUiSd9nifYRWphc9M5D/ee4w4AoXLgBEdRbgVaxbMuagBPeUC5y2Hi8DO6o9aDg== + dependencies: + "@babel/runtime" "^7.23.8" + remove-accents "0.5.0" + mdn-data@2.0.14: version "2.0.14" resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" @@ -6016,6 +6095,11 @@ micromatch@^4.0.2, micromatch@^4.0.4: braces "^3.0.2" picomatch "^2.3.1" +microseconds@0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/microseconds/-/microseconds-0.2.0.tgz#233b25f50c62a65d861f978a4a4f8ec18797dc39" + integrity sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA== + mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": version "1.52.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" @@ -6116,6 +6200,13 @@ nan@^2.14.0: resolved "https://registry.yarnpkg.com/nan/-/nan-2.17.0.tgz#c0150a2368a182f033e9aa5195ec76ea41a199cb" integrity sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ== +nano-time@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/nano-time/-/nano-time-1.0.0.tgz#b0554f69ad89e22d0907f7a12b0993a5d96137ef" + integrity sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA== + dependencies: + big-integer "^1.6.16" + nanoid@^3.1.23: version "3.3.6" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" @@ -6206,6 +6297,13 @@ node-fetch@^2.2.0, node-fetch@^2.6.0: dependencies: whatwg-url "^5.0.0" +node-fetch@^2.6.12: + version "2.7.0" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" + node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" @@ -6279,6 +6377,11 @@ object-keys@^1.1.1: resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== +oblivious-set@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/oblivious-set/-/oblivious-set-1.0.0.tgz#c8316f2c2fb6ff7b11b6158db3234c49f733c566" + integrity sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw== + on-finished@2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" @@ -6626,6 +6729,11 @@ react-is@^17.0.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== +react-native-background-timer@^2.4.1: + version "2.4.1" + resolved "https://registry.npmjs.org/react-native-background-timer/-/react-native-background-timer-2.4.1.tgz#a3bc1cafa8c1e3aeefd0611de120298b67978a0f" + integrity sha512-TE4Kiy7jUyv+hugxDxitzu38sW1NqjCk4uE5IgU2WevLv7sZacaBc6PZKOShNRPGirLl1NWkaG3LDEkdb9Um5g== + react-native-config@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/react-native-config/-/react-native-config-1.5.1.tgz#73c94f511493e9b7ff9350cdf351d203a1b05acc" @@ -6730,6 +6838,15 @@ react-native@0.72.3: ws "^6.2.2" yargs "^17.6.2" +react-query@^3.39.3: + version "3.39.3" + resolved "https://registry.npmjs.org/react-query/-/react-query-3.39.3.tgz#4cea7127c6c26bdea2de5fb63e51044330b03f35" + integrity sha512-nLfLz7GiohKTJDuT4us4X3h/8unOh+00MLb2yJoGTPjxKs2bc1iDhkNx2bd5MKklXnOD3NrVZ+J2UXujA5In4g== + dependencies: + "@babel/runtime" "^7.5.5" + broadcast-channel "^3.4.1" + match-sorter "^6.0.2" + react-refresh@^0.14.0: version "0.14.0" resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.0.tgz#4e02825378a5f227079554d4284889354e5f553e" @@ -6818,6 +6935,11 @@ regenerator-runtime@^0.13.11, regenerator-runtime@^0.13.2: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + regenerator-transform@^0.15.1: version "0.15.1" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56" @@ -6844,6 +6966,11 @@ regjsparser@^0.9.1: dependencies: jsesc "~0.5.0" +remove-accents@0.5.0: + version "0.5.0" + resolved "https://registry.npmjs.org/remove-accents/-/remove-accents-0.5.0.tgz#77991f37ba212afba162e375b627631315bed687" + integrity sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A== + require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -6903,6 +7030,13 @@ retry@^0.12.0: resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== +rimraf@3.0.2, rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + rimraf@^2.6.3: version "2.7.1" resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" @@ -6910,13 +7044,6 @@ rimraf@^2.6.3: dependencies: glob "^7.1.3" -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - rimraf@~2.4.0: version "2.4.5" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.4.5.tgz#ee710ce5d93a8fdb856fb5ea8ff0e2d75934b2da" @@ -7490,6 +7617,14 @@ universalify@^2.0.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== +unload@2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/unload/-/unload-2.2.0.tgz#ccc88fdcad345faa06a92039ec0f80b488880ef7" + integrity sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA== + dependencies: + "@babel/runtime" "^7.6.2" + detect-node "^2.0.4" + unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"