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"