diff --git a/.vscode/settings.json b/.vscode/settings.json index 1aec0ae..2bb35ee 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,7 +1,7 @@ { "editor.codeActionsOnSave": { - "source.fixAll": true, - "source.fixAll.eslint": true + "source.fixAll": "explicit", + "source.fixAll.eslint": "explicit" }, "files.eol": "\n", "editor.defaultFormatter": "esbenp.prettier-vscode", diff --git a/App.tsx b/App.tsx index aabf3c9..27d017e 100644 --- a/App.tsx +++ b/App.tsx @@ -10,12 +10,10 @@ import * as SplashScreen from 'expo-splash-screen'; import { StatusBar } from 'expo-status-bar'; import * as React from 'react'; import { View } from 'react-native'; -import { ThemeProvider } from 'styled-components'; -import { initializeAppSettings } from '@/functions'; - -import { Routes } from './src/routes'; -import { themes } from './src/themes'; +import { initializeAppSettings } from '@/functions/initializeAppSettings'; +import { colors } from '@/helpers/themes'; +import { RootStack } from '@/routes/RootStack'; export default function App() { const [fontsLoaded] = useFonts({ @@ -50,12 +48,10 @@ export default function App() { } return ( - + - - - - + + ); diff --git a/README.md b/README.md index a0c5155..b143778 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ Create an .env file with the properties: [Create an account to have your key](https://docs.tatum.com/) ``` -EXPO_PUBLIC_TATUM_SDK_V1=YOUR-API-KEY +EXPO_PUBLIC_TATUM_SDK_V4=YOUR-API-KEY ``` 1. Install dependencies diff --git a/__test__/setup.ts b/__test__/setup.ts index 53b9b59..488a611 100644 --- a/__test__/setup.ts +++ b/__test__/setup.ts @@ -1,22 +1,24 @@ import i18n from 'i18next'; import { initReactI18next } from 'react-i18next'; +import mockSafeAreaContext from 'react-native-safe-area-context/jest/mock'; import DE_CH from '../src/translate/locales/de-ch.json'; import EN_US from '../src/translate/locales/en-us.json'; import ES_AR from '../src/translate/locales/es-ar.json'; import PT_BR from '../src/translate/locales/pt-br.json'; -jest.mock('react-native-safe-area-context', () => { - return { - useSafeAreaInsets: () => ({ bottom: 0 }), - }; -}); +jest.mock('react-native-safe-area-context', () => mockSafeAreaContext); jest.mock('react-native-reanimated', () => require('react-native-reanimated/mock')); -jest.mock('@/hooks', () => { +jest.mock('@/hooks/useFormatCurrency', () => { return { useFormatCurrency: () => '$100.00', + }; +}); + +jest.mock('@/hooks/useFormatDate', () => { + return { useFormatDate: () => ({ date: '12/12/2023', time: '12:00 PM', @@ -25,7 +27,7 @@ jest.mock('@/hooks', () => { }; }); -jest.mock('@/stores', () => { +jest.mock('@/stores/useBitcoinHistoricalPrice', () => { return { useBitcoinHistoricalPrice: () => ({ fetchBitcoinHistoricalPrice: jest.fn(), @@ -45,6 +47,11 @@ jest.mock('@/stores', () => { }, ], }), + }; +}); + +jest.mock('@/stores/useUserData', () => { + return { useUserData: () => ({ cleanUserData: jest.fn(), data: [ @@ -63,6 +70,11 @@ jest.mock('@/stores', () => { ], status: 'success', }), + }; +}); + +jest.mock('@/stores/useAppSettings', () => { + return { useAppSettings: Object.assign( () => { return { currency: 'usd' }; @@ -73,6 +85,11 @@ jest.mock('@/stores', () => { }, }, ), + }; +}); + +jest.mock('@/stores/useBitcoinDataPrices', () => { + return { useBitcoinDataPrices: () => ({ data: { current_price: { diff --git a/app.json b/app.json index 3422899..7830a11 100644 --- a/app.json +++ b/app.json @@ -3,7 +3,7 @@ "name": "Wallet you", "slug": "wallet-you", "owner": "cyberkaidev", - "version": "1.3.3", + "version": "1.4.3", "orientation": "portrait", "icon": "./assets/images/icon.png", "userInterfaceStyle": "dark", @@ -35,7 +35,7 @@ }, "permissions": ["android.permission.USE_BIOMETRIC", "android.permission.USE_FINGERPRINT"], "package": "com.cyberkaidev.walletyou", - "versionCode": "7" + "versionCode": "8" }, "web": { "favicon": "./assets/images/favicon.ico" diff --git a/package.json b/package.json index 1cde809..48cac33 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "wallet-you", - "version": "1.3.3", + "version": "1.4.3", "main": "node_modules/expo/AppEntry.js", "author": "cyberkaidev", "license": "MIT", @@ -24,12 +24,12 @@ }, "dependencies": { "@react-native-async-storage/async-storage": "1.18.2", - "@react-navigation/bottom-tabs": "^6.5.7", - "@react-navigation/native": "^6.1.6", - "@react-navigation/native-stack": "^6.9.12", - "@react-navigation/stack": "^6.3.16", - "@tatumio/tatum": "^3.0.14", - "axios": "^1.4.0", + "@react-navigation/bottom-tabs": "^6.5.11", + "@react-navigation/native": "^6.1.9", + "@react-navigation/native-stack": "^6.9.17", + "@react-navigation/stack": "^6.3.20", + "@tatumio/tatum": "^4.2.2", + "axios": "^1.6.5", "currency.js": "^2.0.4", "expo": "^49.0.0", "expo-checkbox": "~2.4.0", @@ -42,27 +42,26 @@ "expo-local-authentication": "~13.4.1", "expo-localization": "~14.3.0", "expo-network": "~5.4.0", - "expo-screen-orientation": "~6.0.5", + "expo-screen-orientation": "~6.0.6", "expo-secure-store": "~12.3.1", "expo-splash-screen": "~0.20.5", "expo-status-bar": "~1.6.0", - "i18next": "^22.5.0", + "i18next": "^23.7.16", "jest-expo": "^49.0.0", - "moment": "^2.29.4", - "moti": "^0.25.3", + "moment": "^2.30.1", + "moti": "^0.27.2", "react": "18.2.0", - "react-i18next": "^12.3.1", - "react-native": "0.72.4", + "react-i18next": "^14.0.0", + "react-native": "0.72.6", "react-native-gesture-handler": "~2.12.0", - "react-native-localize": "^3.0.0", + "react-native-localize": "^3.0.5", "react-native-reanimated": "~3.3.0", "react-native-responsive-screen": "^1.4.2", "react-native-safe-area-context": "4.6.3", "react-native-screens": "~3.22.0", "react-native-svg": "13.9.0", "react-native-svg-charts": "^5.4.0", - "styled-components": "^6.0.2", - "zustand": "^4.4.1" + "zustand": "^4.4.7" }, "devDependencies": { "@babel/core": "^7.20.0", @@ -82,6 +81,7 @@ "eslint-plugin-simple-import-sort": "^10.0.0", "jest": "^29.2.1", "metro-react-native-babel-preset": "^0.76.4", + "prettier": "3.2.2", "react-test-renderer": "^18.2.0", "typescript": "^5.1.3" }, diff --git a/src/assets/icons/icon-arrow-down.tsx b/src/assets/icons/IconArrowDown.tsx similarity index 83% rename from src/assets/icons/icon-arrow-down.tsx rename to src/assets/icons/IconArrowDown.tsx index 3a9069d..07a0c53 100644 --- a/src/assets/icons/icon-arrow-down.tsx +++ b/src/assets/icons/IconArrowDown.tsx @@ -1,11 +1,10 @@ import React from 'react'; import Svg, { Path } from 'react-native-svg'; -import { themes } from '@/themes'; +import { colors } from '@/helpers/themes'; +import { IconProps } from '@/types/IconType'; -import { IconProps } from './types'; - -export function IconArrowDown({ color = themes.colors.white, size = 25 }: IconProps) { +export function IconArrowDown({ color = colors.white, size = 25 }: IconProps) { return ( ) { return ( ); diff --git a/src/assets/icons/icon-cardano.tsx b/src/assets/icons/IconCardano.tsx similarity index 99% rename from src/assets/icons/icon-cardano.tsx rename to src/assets/icons/IconCardano.tsx index fbb212a..f2aa128 100644 --- a/src/assets/icons/icon-cardano.tsx +++ b/src/assets/icons/IconCardano.tsx @@ -1,22 +1,21 @@ import React from 'react'; import Svg, { Path } from 'react-native-svg'; -import { themes } from '@/themes'; - -import { IconProps } from './types'; +import { colors } from '@/helpers/themes'; +import { IconProps } from '@/types/IconType'; export function IconCardano({ size = 25 }: Omit) { return ( ); diff --git a/src/assets/icons/icon-chart.tsx b/src/assets/icons/IconChart.tsx similarity index 85% rename from src/assets/icons/icon-chart.tsx rename to src/assets/icons/IconChart.tsx index f2a8313..b35f445 100644 --- a/src/assets/icons/icon-chart.tsx +++ b/src/assets/icons/IconChart.tsx @@ -1,11 +1,10 @@ import React from 'react'; import Svg, { Path } from 'react-native-svg'; -import { themes } from '@/themes'; +import { colors } from '@/helpers/themes'; +import { IconProps } from '@/types/IconType'; -import { IconProps } from './types'; - -export function IconChart({ color = themes.colors.white, size = 25 }: IconProps) { +export function IconChart({ color = colors.white, size = 25 }: IconProps) { return ( diff --git a/src/assets/icons/icon-home.tsx b/src/assets/icons/IconHome.tsx similarity index 83% rename from src/assets/icons/icon-home.tsx rename to src/assets/icons/IconHome.tsx index 34ffe79..24c38d4 100644 --- a/src/assets/icons/icon-home.tsx +++ b/src/assets/icons/IconHome.tsx @@ -1,11 +1,10 @@ import React from 'react'; import Svg, { Path } from 'react-native-svg'; -import { themes } from '@/themes'; +import { colors } from '@/helpers/themes'; +import { IconProps } from '@/types/IconType'; -import { IconProps } from './types'; - -export function IconHome({ color = themes.colors.white, size = 25 }: IconProps) { +export function IconHome({ color = colors.white, size = 25 }: IconProps) { return ( diff --git a/src/assets/index.ts b/src/assets/index.ts index ad22e90..a1ca093 100644 --- a/src/assets/index.ts +++ b/src/assets/index.ts @@ -1,15 +1,15 @@ -import { IconArrowDown } from './icons/icon-arrow-down'; -import { IconArrowRight } from './icons/icon-arrow-right'; -import { IconArrowUp } from './icons/icon-arrow-up'; -import { IconBitcoin } from './icons/icon-bitcoin'; -import { IconCardano } from './icons/icon-cardano'; -import { IconChart } from './icons/icon-chart'; -import { IconGithub } from './icons/icon-github'; -import { IconHome } from './icons/icon-home'; -import { IconNoInternet } from './icons/icon-no-internet'; -import { IconSettings } from './icons/icon-settings'; -import { IconSuccess } from './icons/icon-success'; -import { IconTwitter } from './icons/icon-twitter'; +import { IconArrowDown } from './icons/IconArrowDown'; +import { IconArrowRight } from './icons/IconArrowRight'; +import { IconArrowUp } from './icons/IconArrowUp'; +import { IconBitcoin } from './icons/IconBitcoin'; +import { IconCardano } from './icons/IconCardano'; +import { IconChart } from './icons/IconChart'; +import { IconGithub } from './icons/IconGithub'; +import { IconHome } from './icons/IconHome'; +import { IconNoInternet } from './icons/IconNoInternet'; +import { IconSettings } from './icons/IconSettings'; +import { IconSuccess } from './icons/IconSuccess'; +import { IconTwitter } from './icons/IconTwitter'; export { IconArrowDown, diff --git a/src/components/ActionList.tsx b/src/components/ActionList.tsx new file mode 100644 index 0000000..9f5ce07 --- /dev/null +++ b/src/components/ActionList.tsx @@ -0,0 +1,80 @@ +import React from 'react'; +import { StyleSheet, TouchableOpacity, View } from 'react-native'; +import { heightPercentageToDP as hp } from 'react-native-responsive-screen'; + +import { IconArrowRight } from '@/assets'; +import { Text } from '@/components/Text'; +import { borderRadius, colors, spaces, width } from '@/helpers/themes'; +import { useAppSettings } from '@/stores/useAppSettings'; +import { ActionListProps } from '@/types/ActionListType'; + +export function ActionList({ list }: ActionListProps) { + const { isTablet } = useAppSettings(state => state); + + return ( + + {list.map((item, index) => ( + item.onAction()} + > + {item.prefixIcon && ( + + {item.prefixIcon} + + )} + + {item.title} + + + + {list.length !== index + 1 && } + + + ))} + + ); +} + +const styles = StyleSheet.create({ + container: { + width: '100%', + maxWidth: width.max_width, + alignSelf: 'center', + backgroundColor: colors.black_000, + borderRadius: borderRadius.radius_10, + borderStyle: 'solid', + borderWidth: 1, + borderColor: colors.dark_grey, + }, + button: { + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + }, + iconContainer: { + marginRight: spaces.space_15, + }, + iconAndTitle: { + flex: 1, + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', + position: 'relative', + }, + indicator: { + position: 'absolute', + bottom: 0, + right: 0, + height: 1, + width: '100%', + backgroundColor: colors.dark_grey, + }, +}); diff --git a/src/components/AlertModal.tsx b/src/components/AlertModal.tsx new file mode 100644 index 0000000..1c870de --- /dev/null +++ b/src/components/AlertModal.tsx @@ -0,0 +1,63 @@ +import React from 'react'; +import { useTranslation } from 'react-i18next'; +import { Modal, StyleSheet, View } from 'react-native'; + +import { ButtonTitleGhost } from '@/components/ButtonTitleGhost'; +import { Text } from '@/components/Text'; +import { borderRadius, colors, spaces, width } from '@/helpers/themes'; +import { AlertModalProps } from '@/types/AlertModalType'; + +export function AlertModal({ title, visible, onCancel, onConfirm }: AlertModalProps) { + const { t } = useTranslation(); + + return ( + + + + + {title} + + + + + + + + + ); +} + +const styles = StyleSheet.create({ + background: { + flex: 1, + backgroundColor: colors.black_100_50pct, + alignItems: 'center', + justifyContent: 'center', + paddingHorizontal: spaces.space_15, + }, + body: { + width: '100%', + maxWidth: width.max_width, + paddingHorizontal: spaces.space_20, + paddingVertical: spaces.space_30, + borderRadius: borderRadius.radius_15, + backgroundColor: colors.black_000, + }, + footer: { + width: '100%', + marginTop: spaces.space_30, + flexDirection: 'row', + justifyContent: 'flex-end', + }, +}); diff --git a/src/components/ButtonTitleGhost.tsx b/src/components/ButtonTitleGhost.tsx new file mode 100644 index 0000000..27a3ccd --- /dev/null +++ b/src/components/ButtonTitleGhost.tsx @@ -0,0 +1,75 @@ +import React from 'react'; +import { useTranslation } from 'react-i18next'; +import { ActivityIndicator, StyleSheet, TouchableOpacity } from 'react-native'; + +import { colors, spaces } from '@/helpers/themes'; +import { useAppSettings } from '@/stores/useAppSettings'; +import { ButtonTitleGhostProps } from '@/types/ButtonTitleGhostType'; + +import { Text } from './Text'; + +export function ButtonTitleGhost({ + testID = 'idButtonTitleGhost', + title, + disabled = false, + onPress, + size = 'large', + loading = false, + buttonsWeight = 'bold', + marginT = 0, + marginB = 0, + marginR = 0, + marginL = 0, +}: ButtonTitleGhostProps) { + const { t } = useTranslation(); + const { isTablet } = useAppSettings(state => state); + + return ( + { + if (!disabled || loading) onPress(); + }} + disabled={disabled || loading} + style={[ + styles.container, + { + marginTop: marginT, + marginBottom: marginB, + marginRight: marginR, + marginLeft: marginL, + opacity: disabled ? 0.5 : 1, + }, + ]} + > + {!loading && ( + + {title} + + )} + {loading && ( + + + + {t('loading')} + + + )} + + ); +} + +const styles = StyleSheet.create({ + container: { + alignSelf: 'center', + flexDirection: 'row', + padding: 10, + alignItems: 'center', + justifyContent: 'center', + }, +}); diff --git a/src/components/ButtonTitleShape.tsx b/src/components/ButtonTitleShape.tsx new file mode 100644 index 0000000..f7cb43f --- /dev/null +++ b/src/components/ButtonTitleShape.tsx @@ -0,0 +1,81 @@ +import React from 'react'; +import { useTranslation } from 'react-i18next'; +import { ActivityIndicator, StyleSheet, TouchableOpacity } from 'react-native'; + +import { borderRadius, colors, spaces } from '@/helpers/themes'; +import { useAppSettings } from '@/stores/useAppSettings'; +import { ButtonTitleShapeProps } from '@/types/ButtonTitleShapeType'; + +import { Text } from './Text'; + +export function ButtonTitleShape({ + title, + disabled = false, + onPress, + size = 'large', + loading = false, + marginT = 0, + marginB = 0, + marginR = 0, + marginL = 0, +}: ButtonTitleShapeProps) { + const { t } = useTranslation(); + const { isTablet } = useAppSettings.getState(); + + const LARGE_PADDING_V = isTablet ? spaces.space_20 : spaces.space_15; + const LARGE_PADDING_H = isTablet ? spaces.space_15 : spaces.space_10; + + return ( + { + if (!disabled || loading) onPress(); + }} + disabled={disabled || loading} + style={[ + styles.container, + { + width: size === 'large' ? '90%' : 'auto', + paddingHorizontal: size === 'large' ? 0 : spaces.space_25, + paddingVertical: size === 'large' ? LARGE_PADDING_V : LARGE_PADDING_H, + borderRadius: size === 'large' ? borderRadius.radius_15 : borderRadius.radius_10, + marginTop: marginT, + marginBottom: marginB, + marginRight: marginR, + marginLeft: marginL, + opacity: disabled ? 0.5 : 1, + }, + ]} + > + {!loading && ( + + {title} + + )} + {loading && ( + + + + {t('loading')} + + + )} + + ); +} + +const styles = StyleSheet.create({ + container: { + alignSelf: 'center', + flexDirection: 'row', + backgroundColor: colors.light_cyan, + marginBottom: spaces.space_15, + alignItems: 'center', + justifyContent: 'center', + }, +}); diff --git a/src/components/ChartBitcoin.tsx b/src/components/ChartBitcoin.tsx new file mode 100644 index 0000000..ecfe9c6 --- /dev/null +++ b/src/components/ChartBitcoin.tsx @@ -0,0 +1,58 @@ +import React from 'react'; +import { useTranslation } from 'react-i18next'; +import { StyleSheet, View } from 'react-native'; +import { + heightPercentageToDP as hp, + widthPercentageToDP as wp, +} from 'react-native-responsive-screen'; + +import { colors, spaces } from '@/helpers/themes'; +import { useAppSettings } from '@/stores/useAppSettings'; +import { useBitcoinHistoricalPrice } from '@/stores/useBitcoinHistoricalPrice'; + +import { ChartMain } from './fragments/ChartMain'; +import { SkeletonLoading } from './SkeletonLoading'; +import { Text } from './Text'; + +export function ChartBitcoin() { + const { t } = useTranslation(); + const { isTablet } = useAppSettings(state => state); + const { fetchBitcoinHistoricalPrice, status, data } = useBitcoinHistoricalPrice(state => state); + + React.useEffect(() => { + if (status === null) fetchBitcoinHistoricalPrice(); + }, []); + + return ( + + {(status === 'loading' || status === null) && ( + + )} + + {status === 'failed' && ( + + + {t('request-error-try-later')} + + + )} + + {status === 'success' && } + + ); +} + +const styles = StyleSheet.create({ + container: { + width: '100%', + }, + failed: { + height: wp('35%'), + width: wp('100%'), + justifyContent: 'center', + paddingHorizontal: spaces.space_15, + }, +}); diff --git a/src/components/CheckBoxMessage.tsx b/src/components/CheckBoxMessage.tsx new file mode 100644 index 0000000..bd136bb --- /dev/null +++ b/src/components/CheckBoxMessage.tsx @@ -0,0 +1,38 @@ +import Checkbox from 'expo-checkbox'; +import React from 'react'; +import { StyleSheet, View } from 'react-native'; + +import { colors, spaces } from '@/helpers/themes'; +import { CheckboxMessageProps } from '@/types/CheckboxMessageType'; + +import { Text } from './Text'; + +export function CheckBoxMessage({ isActivated, onAction, message }: CheckboxMessageProps) { + return ( + + + + {message} + + + ); +} + +const styles = StyleSheet.create({ + container: { + flexDirection: 'row', + alignItems: 'center', + marginTop: spaces.space_15, + }, + button: { + width: 18, + height: 18, + }, +}); diff --git a/src/components/HeaderSwiperOptions.tsx b/src/components/HeaderSwiperOptions.tsx new file mode 100644 index 0000000..f0d0a4b --- /dev/null +++ b/src/components/HeaderSwiperOptions.tsx @@ -0,0 +1,71 @@ +import { useNavigation } from '@react-navigation/native'; +import { setStatusBarBackgroundColor } from 'expo-status-bar'; +import React from 'react'; +import { useTranslation } from 'react-i18next'; +import { Platform, StyleSheet, View } from 'react-native'; + +import { colors, spaces } from '@/helpers/themes'; +import { HeaderSwiperOptionsProps } from '@/types/HeaderSwiperOptionsType'; + +import { ButtonTitleGhost } from './ButtonTitleGhost'; +import { Text } from './Text'; + +export function HeaderSwiperOptions({ + title, + onAction, + disableAction = false, +}: HeaderSwiperOptionsProps) { + const navigation = useNavigation(); + const { t } = useTranslation(); + + React.useEffect(() => { + if (Platform.OS === 'android') setStatusBarBackgroundColor('black', true); + return () => { + if (Platform.OS === 'android') setStatusBarBackgroundColor(colors.black_000, true); + }; + }, []); + + return ( + + + + {title} + + + navigation.goBack()} + marginL={spaces.space_10} + /> + + + ); +} + +const styles = StyleSheet.create({ + container: { + backgroundColor: colors.black_000, + paddingVertical: spaces.space_10, + width: '100%', + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + position: 'relative', + }, + title: { + position: 'absolute', + alignItems: 'center', + width: '100%', + }, +}); diff --git a/src/components/LimitedWidthContainer.tsx b/src/components/LimitedWidthContainer.tsx new file mode 100644 index 0000000..56cf839 --- /dev/null +++ b/src/components/LimitedWidthContainer.tsx @@ -0,0 +1,21 @@ +import React from 'react'; +import { StyleSheet, View } from 'react-native'; + +import { width } from '@/helpers/themes'; +import { LimitedWidthContainerProps } from '@/types/LimitedWidthContainerType'; + +export function LimitedWidthContainer({ children }: LimitedWidthContainerProps) { + return ( + + {children} + + ); +} + +const styles = StyleSheet.create({ + container: { + maxWidth: width.max_width, + width: '100%', + alignSelf: 'center', + }, +}); diff --git a/src/components/price-bitcoin/index.tsx b/src/components/PriceBitcoin.tsx similarity index 51% rename from src/components/price-bitcoin/index.tsx rename to src/components/PriceBitcoin.tsx index d562735..ff99a75 100644 --- a/src/components/price-bitcoin/index.tsx +++ b/src/components/PriceBitcoin.tsx @@ -1,12 +1,12 @@ import React from 'react'; import { useTranslation } from 'react-i18next'; +import { StyleSheet, View } from 'react-native'; -import { themes } from '@/themes'; +import { colors, spaces } from '@/helpers/themes'; +import { PriceBitcoinProps } from '@/types/PriceBitcoinType'; -import { SkeletonLoading } from '../skeleton-loading'; -import { Text } from '../text'; -import { PriceAndPorcent, PriceBitcoinContainer } from './styles'; -import { PriceBitcoinProps } from './types'; +import { SkeletonLoading } from './SkeletonLoading'; +import { Text } from './Text'; export function PriceBitcoin({ title, @@ -16,12 +16,11 @@ export function PriceBitcoin({ bitcoin, status, }: PriceBitcoinProps) { - const { colors, spaces } = themes; const { t } = useTranslation(); return ( - - + + {title} {(status === 'loading' || status === null) && ( @@ -33,21 +32,27 @@ export function PriceBitcoin({ )} {status === 'success' && ( - - + + {price.substring(0, price.length - 2)} - + {price.substring(price.length - 2, price.length)} - + {porcent} - + )} - + {bitcoin} BTC - + ); } + +const styles = StyleSheet.create({ + priceAndPorcent: { + flexDirection: 'row', + }, +}); diff --git a/src/components/scroll-view/index.tsx b/src/components/ScrollView.tsx similarity index 75% rename from src/components/scroll-view/index.tsx rename to src/components/ScrollView.tsx index 18b0eaf..3057fb0 100644 --- a/src/components/scroll-view/index.tsx +++ b/src/components/ScrollView.tsx @@ -1,12 +1,10 @@ import React from 'react'; -import { RefreshControl } from 'react-native-gesture-handler'; +import { RefreshControl, ScrollView as ScrollViewContainer } from 'react-native-gesture-handler'; import { heightPercentageToDP as hp } from 'react-native-responsive-screen'; import { useSafeAreaInsets } from 'react-native-safe-area-context'; -import { themes } from '@/themes'; - -import { ScrollViewContainer } from './styles'; -import { ScrollViewProps } from './types'; +import { colors } from '@/helpers/themes'; +import { ScrollViewProps } from '@/types/ScrollViewType'; export function ScrollView({ children, refreshControl }: ScrollViewProps) { const [refreshing, setRefreshing] = React.useState(false); @@ -25,8 +23,8 @@ export function ScrollView({ children, refreshControl }: ScrollViewProps) { testID="idRefreshControl" refreshing={refreshing} onRefresh={onRefresh} - progressBackgroundColor={themes.colors.dark_grey} - colors={[themes.colors.white]} + progressBackgroundColor={colors.dark_grey} + colors={[colors.white]} /> ); } @@ -42,7 +40,7 @@ export function ScrollView({ children, refreshControl }: ScrollViewProps) { paddingTop: 25, paddingHorizontal: 15, }} - endFillColor={themes.colors.transparent} + endFillColor={colors.transparent} refreshControl={refreshController()} showsVerticalScrollIndicator={false} > diff --git a/src/components/scroll-view-header/index.tsx b/src/components/ScrollViewHeader.tsx similarity index 73% rename from src/components/scroll-view-header/index.tsx rename to src/components/ScrollViewHeader.tsx index 0b3a243..8aff487 100644 --- a/src/components/scroll-view-header/index.tsx +++ b/src/components/ScrollViewHeader.tsx @@ -1,17 +1,16 @@ import Constants from 'expo-constants'; import React from 'react'; -import { Platform } from 'react-native'; +import { Platform, StyleSheet } from 'react-native'; import { RefreshControl } from 'react-native-gesture-handler'; -import { useAnimatedScrollHandler, useSharedValue } from 'react-native-reanimated'; +import Animated, { useAnimatedScrollHandler, useSharedValue } from 'react-native-reanimated'; import { heightPercentageToDP as hp } from 'react-native-responsive-screen'; import { useSafeAreaInsets } from 'react-native-safe-area-context'; -import { useAppSettings } from '@/stores'; -import { themes } from '@/themes'; +import { colors } from '@/helpers/themes'; +import { useAppSettings } from '@/stores/useAppSettings'; +import { ScrollViewHeaderProps } from '@/types/ScrollViewHeaderType'; -import { HeaderAnimated } from './components/header-animated'; -import { ScrollViewHeaderContainer } from './styles'; -import { ScrollViewHeaderProps } from './types'; +import { HeaderAnimated } from './fragments/HeaderAnimated'; export function ScrollViewHeader({ children, @@ -42,8 +41,8 @@ export function ScrollViewHeader({ testID="idRefreshControl" refreshing={refreshing} onRefresh={onRefresh} - progressBackgroundColor={themes.colors.dark_grey} - colors={[themes.colors.white]} + progressBackgroundColor={colors.dark_grey} + colors={[colors.white]} progressViewOffset={PADDING_TOP} /> ); @@ -60,22 +59,30 @@ export function ScrollViewHeader({ return ( - {children} - + ); } + +const styles = StyleSheet.create({ + scroll: { + flex: 1, + backgroundColor: colors.black_100, + }, +}); diff --git a/src/components/SelectList.tsx b/src/components/SelectList.tsx new file mode 100644 index 0000000..f757c08 --- /dev/null +++ b/src/components/SelectList.tsx @@ -0,0 +1,54 @@ +import React from 'react'; +import { StyleSheet, TouchableOpacity, View } from 'react-native'; +import { widthPercentageToDP as wp } from 'react-native-responsive-screen'; + +import { colors, spaces } from '@/helpers/themes'; +import { SelectListProps } from '@/types/SelectListType'; + +import { Text } from './Text'; + +export function SelectList({ data, selected, onSelected }: SelectListProps) { + return ( + + {data.map((item, index) => ( + onSelected(item.ref)} + > + + {selected === item.ref && } + + + {item.title} + + + ))} + + ); +} + +const styles = StyleSheet.create({ + button: { + paddingVertical: spaces.space_15, + flexDirection: 'row', + alignItems: 'center', + }, + border: { + width: wp('4%'), + height: wp('4%'), + alignItems: 'center', + justifyContent: 'center', + borderRadius: 40, + borderStyle: 'solid', + borderWidth: 2, + borderColor: colors.light_cyan, + }, + circle: { + width: wp('2%'), + height: wp('2%'), + borderRadius: 20, + backgroundColor: colors.light_cyan, + }, +}); diff --git a/src/components/skeleton-loading/index.tsx b/src/components/SkeletonLoading.tsx similarity index 52% rename from src/components/skeleton-loading/index.tsx rename to src/components/SkeletonLoading.tsx index cb1d089..b336a98 100644 --- a/src/components/skeleton-loading/index.tsx +++ b/src/components/SkeletonLoading.tsx @@ -1,36 +1,37 @@ import { Skeleton } from 'moti/skeleton'; import React from 'react'; +import { View } from 'react-native'; import { heightPercentageToDP as hp } from 'react-native-responsive-screen'; -import { themes } from '@/themes'; - -import { SkeletonLoadingContainer } from './styles'; -import { SkeletonLoadingProps } from './types'; +import { colors } from '@/helpers/themes'; +import { SkeletonLoadingProps } from '@/types/SkeletonLoadingType'; export function SkeletonLoading({ heightPorcent, radius, - marginT, - marginB, - marginR, - marginL, + marginT = 0, + marginB = 0, + marginR = 0, + marginL = 0, }: SkeletonLoadingProps) { return ( - - + ); } diff --git a/src/components/Text.tsx b/src/components/Text.tsx new file mode 100644 index 0000000..915b3dc --- /dev/null +++ b/src/components/Text.tsx @@ -0,0 +1,46 @@ +import React from 'react'; +import { Text as TextContainer } from 'react-native'; +import { widthPercentageToDP as wp } from 'react-native-responsive-screen'; + +import { schemeText } from '@/functions/schemeText'; +import { colors } from '@/helpers/themes'; +import { useAppSettings } from '@/stores/useAppSettings'; +import { TextProps } from '@/types/TextType'; + +export function Text({ + children, + weight, + size, + color = colors.white, + marginT = 0, + marginB = 0, + marginR = 0, + marginL = 0, +}: TextProps) { + const { isTablet } = useAppSettings(state => state); + + const { onFontFamily, onFontSize } = React.useMemo(() => { + return schemeText({ + weight: weight ?? 'regular', + size: size ?? 's', + isTablet: isTablet, + }); + }, [weight, size]); + + return ( + + {children} + + ); +} diff --git a/src/components/TextFieldArea.tsx b/src/components/TextFieldArea.tsx new file mode 100644 index 0000000..ae15d5e --- /dev/null +++ b/src/components/TextFieldArea.tsx @@ -0,0 +1,62 @@ +import React from 'react'; +import { useTranslation } from 'react-i18next'; +import { StyleSheet, TextInput } from 'react-native'; +import { + heightPercentageToDP as hp, + widthPercentageToDP as wp, +} from 'react-native-responsive-screen'; + +import { borderRadius, colors, fontSizes, spaces, width } from '@/helpers/themes'; +import { useAppSettings } from '@/stores/useAppSettings'; +import { TextFieldAreaProps } from '@/types/TextFieldAreaType'; + +export function TextFieldArea({ value, onChangeText }: TextFieldAreaProps) { + const { t } = useTranslation(); + const { isTablet } = useAppSettings(state => state); + + const [isFocused, setIsFocused] = React.useState(false); + + return ( + setIsFocused(true)} + onBlur={() => setIsFocused(false)} + autoCapitalize="none" + autoCorrect={false} + multiline + scrollEnabled + blurOnSubmit={true} + cursorColor={colors.white} + placeholderTextColor={colors.light_grey} + returnKeyType="done" + style={[ + styles.container, + { + textAlignVertical: 'top', + borderWidth: isTablet ? 3 : 1, + borderColor: isFocused ? colors.light_cyan : colors.transparent, + }, + ]} + maxLength={150} + /> + ); +} + +const styles = StyleSheet.create({ + container: { + width: '100%', + maxWidth: width.max_width, + alignSelf: 'center', + backgroundColor: colors.black_000, + borderRadius: borderRadius.radius_10, + color: colors.white, + fontSize: wp(fontSizes.m), + fontFamily: 'Inter-Regular', + height: hp('15%'), + padding: spaces.space_10, + borderStyle: 'solid', + }, +}); diff --git a/src/components/TitleSubtitle.tsx b/src/components/TitleSubtitle.tsx new file mode 100644 index 0000000..43bbc14 --- /dev/null +++ b/src/components/TitleSubtitle.tsx @@ -0,0 +1,40 @@ +import React from 'react'; +import { StyleSheet, View } from 'react-native'; + +import { colors } from '@/helpers/themes'; +import { TitleSubtitleProps } from '@/types/TitleSubtitleType'; + +import { SkeletonLoading } from './SkeletonLoading'; +import { Text } from './Text'; + +export function TitleSubtitle({ + title, + subTitle, + isLoading = false, + marginB = 0, + marginT = 0, +}: TitleSubtitleProps) { + return ( + + + {title} + + {isLoading && ( + + + + )} + {!isLoading && ( + + {subTitle} + + )} + + ); +} + +const styles = StyleSheet.create({ + loadingContainer: { + width: '50%', + }, +}); diff --git a/src/components/TransactionList.tsx b/src/components/TransactionList.tsx new file mode 100644 index 0000000..132b3a1 --- /dev/null +++ b/src/components/TransactionList.tsx @@ -0,0 +1,171 @@ +import { NavigationProp, useNavigation } from '@react-navigation/native'; +import React from 'react'; +import { useTranslation } from 'react-i18next'; +import { StyleSheet, TouchableOpacity, View } from 'react-native'; +import { heightPercentageToDP as hp } from 'react-native-responsive-screen'; + +import { IconArrowDown, IconArrowRight, IconArrowUp } from '@/assets'; +import { calculateBalance } from '@/functions/calculateBalance'; +import { borderRadius, colors, spaces, width } from '@/helpers/themes'; +import { useFormatCurrency } from '@/hooks/useFormatCurrency'; +import { useFormatDate } from '@/hooks/useFormatDate'; +import { useAppSettings } from '@/stores/useAppSettings'; +import { useBitcoinDataPrices } from '@/stores/useBitcoinDataPrices'; +import { useUserData } from '@/stores/useUserData'; +import { RootStackParamListProps } from '@/types/RoutesType'; + +import { SkeletonLoading } from './SkeletonLoading'; +import { Text } from './Text'; + +export function TransactionList() { + const { t } = useTranslation(); + const { isTablet } = useAppSettings(state => state); + const { data, status } = useUserData(state => state.transactions); + const currency = useAppSettings(state => state.currency); + const navigation = useNavigation>(); + const currentPrice = useBitcoinDataPrices(state => state.data?.current_price); + + const SIZE_ICON_STATUS = hp('2.5%'); + const SIZE_ICON_ARROW = hp('2%'); + const PADDING_ITEM_TABLET = hp('3.5%'); + const MARGIN_TOP_TRANSACTION = hp('5%'); + + return ( + + + {t('transactions')} + + + {(status === 'loading' || status === null) && ( + + )} + + {status === 'failed' && ( + + + {t('request-error-try-later')} + + + )} + + {data.length === 0 && status === 'success' && ( + + + {t('you-dont-have-transactions')} + + + )} + + + {data.length > 0 && + status === 'success' && + data.map((item, index) => { + if (item.transactionType === 'zero-transfer') return; + return ( + navigation.navigate('TransactionPage', { data: item })} + > + + {item.transactionType === 'incoming' && } + {item.transactionType === 'outgoing' && } + + + + + + {useFormatDate(new Date(item.timestamp * 1000)).date} + + + {item.transactionType === 'incoming' ? '+ ' : '- '} + {useFormatCurrency( + calculateBalance({ + balance: item.amount, + currentPrice: currentPrice?.[currency], + }), + )} + + + + + {useFormatDate(new Date(item.timestamp * 1000)).time} + + + {item.amount} BTC + + + + + + + ); + })} + + + ); +} + +const styles = StyleSheet.create({ + container: { + width: '100%', + maxWidth: width.max_width, + alignSelf: 'center', + }, + center: { + width: '100%', + justifyContent: 'center', + alignItems: 'center', + }, + transactionContainer: { + borderRadius: borderRadius.radius_10, + backgroundColor: colors.black_000, + }, + Button: { + flex: 1, + flexDirection: 'row', + }, + circle: { + width: 50, + justifyContent: 'center', + alignItems: 'center', + }, + item: { + flex: 1, + flexDirection: 'row', + alignItems: 'center', + borderBottomWidth: 1, + borderBottomStyle: 'solid', + }, + column: { + flex: 1, + marginRight: spaces.space_15, + }, + labels: { + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + }, +}); diff --git a/src/components/action-list/index.spec.tsx b/src/components/__test__/ActionList.spec.tsx similarity index 96% rename from src/components/action-list/index.spec.tsx rename to src/components/__test__/ActionList.spec.tsx index a2223a1..db04aec 100644 --- a/src/components/action-list/index.spec.tsx +++ b/src/components/__test__/ActionList.spec.tsx @@ -3,7 +3,8 @@ import React from 'react'; import { I18nextProvider, useTranslation } from 'react-i18next'; import { IconBitcoin } from '@/assets'; -import { ActionList } from '@/components'; + +import { ActionList } from '../ActionList'; describe('ActionList', () => { const t = renderHook(() => useTranslation()); diff --git a/src/components/alert-modal/index.spec.tsx b/src/components/__test__/AlertModal.spec.tsx similarity index 98% rename from src/components/alert-modal/index.spec.tsx rename to src/components/__test__/AlertModal.spec.tsx index 186f969..ee402e8 100644 --- a/src/components/alert-modal/index.spec.tsx +++ b/src/components/__test__/AlertModal.spec.tsx @@ -2,7 +2,7 @@ import { fireEvent, render, renderHook } from '@testing-library/react-native'; import React from 'react'; import { I18nextProvider, useTranslation } from 'react-i18next'; -import { AlertModal } from '@/components'; +import { AlertModal } from '../AlertModal'; describe('AlertModal', () => { const configTest = { diff --git a/src/components/button-title-ghost/index.spec.tsx b/src/components/__test__/ButtonTitleGhost.spec.tsx similarity index 97% rename from src/components/button-title-ghost/index.spec.tsx rename to src/components/__test__/ButtonTitleGhost.spec.tsx index 2f5e146..30a7cf1 100644 --- a/src/components/button-title-ghost/index.spec.tsx +++ b/src/components/__test__/ButtonTitleGhost.spec.tsx @@ -2,7 +2,7 @@ import { fireEvent, render, renderHook } from '@testing-library/react-native'; import React from 'react'; import { I18nextProvider, useTranslation } from 'react-i18next'; -import { ButtonTitleGhost } from '@/components'; +import { ButtonTitleGhost } from '../ButtonTitleGhost'; describe('ButtonTitleGhost', () => { const configTest = { diff --git a/src/components/button-title-shape/index.spec.tsx b/src/components/__test__/ButtonTitleShape.spec.tsx similarity index 97% rename from src/components/button-title-shape/index.spec.tsx rename to src/components/__test__/ButtonTitleShape.spec.tsx index 0b2404e..d2b0a8c 100644 --- a/src/components/button-title-shape/index.spec.tsx +++ b/src/components/__test__/ButtonTitleShape.spec.tsx @@ -2,7 +2,7 @@ import { fireEvent, render, renderHook } from '@testing-library/react-native'; import React from 'react'; import { I18nextProvider, useTranslation } from 'react-i18next'; -import { ButtonTitleShape } from '@/components'; +import { ButtonTitleShape } from '../ButtonTitleShape'; describe('ButtonTitleShape', () => { const configTest = { diff --git a/src/components/chart-bitcoin/index.spec.tsx b/src/components/__test__/ChartBitcoin.spec.tsx similarity index 88% rename from src/components/chart-bitcoin/index.spec.tsx rename to src/components/__test__/ChartBitcoin.spec.tsx index 1cc1aa4..0cc9a2e 100644 --- a/src/components/chart-bitcoin/index.spec.tsx +++ b/src/components/__test__/ChartBitcoin.spec.tsx @@ -1,7 +1,7 @@ import { render } from '@testing-library/react-native'; import React from 'react'; -import { ChartBitcoin } from '@/components'; +import { ChartBitcoin } from '../ChartBitcoin'; test('Render component with success', () => { const configTest = { diff --git a/src/components/check-box-message/index.spec.tsx b/src/components/__test__/CheckBoxMessage.spec.tsx similarity index 91% rename from src/components/check-box-message/index.spec.tsx rename to src/components/__test__/CheckBoxMessage.spec.tsx index a532757..97e4f12 100644 --- a/src/components/check-box-message/index.spec.tsx +++ b/src/components/__test__/CheckBoxMessage.spec.tsx @@ -1,7 +1,7 @@ import { fireEvent, render } from '@testing-library/react-native'; import React from 'react'; -import { CheckBoxMessage } from '@/components'; +import { CheckBoxMessage } from '../CheckBoxMessage'; test('Render component and onPress', () => { const configTest = { diff --git a/src/components/header-swiper-options/index.spec.tsx b/src/components/__test__/HeaderSwiperOptions.spec.tsx similarity index 95% rename from src/components/header-swiper-options/index.spec.tsx rename to src/components/__test__/HeaderSwiperOptions.spec.tsx index a092ceb..f5142c2 100644 --- a/src/components/header-swiper-options/index.spec.tsx +++ b/src/components/__test__/HeaderSwiperOptions.spec.tsx @@ -2,7 +2,7 @@ import { fireEvent, render, renderHook } from '@testing-library/react-native'; import React from 'react'; import { I18nextProvider, useTranslation } from 'react-i18next'; -import { HeaderSwiperOptions } from '@/components'; +import { HeaderSwiperOptions } from '../HeaderSwiperOptions'; describe('HeaderSwiperOptions', () => { const t = renderHook(() => useTranslation()); diff --git a/src/components/limited-width-container/index.spec.tsx b/src/components/__test__/LimitedWidthContainer.spec.tsx similarity index 81% rename from src/components/limited-width-container/index.spec.tsx rename to src/components/__test__/LimitedWidthContainer.spec.tsx index 2e93c3e..a3324bf 100644 --- a/src/components/limited-width-container/index.spec.tsx +++ b/src/components/__test__/LimitedWidthContainer.spec.tsx @@ -1,7 +1,8 @@ import { render } from '@testing-library/react-native'; import React from 'react'; -import { LimitedWidthContainer, Text } from '@/components'; +import { LimitedWidthContainer } from '../LimitedWidthContainer'; +import { Text } from '../Text'; test('Render component', () => { const configTest = { diff --git a/src/components/price-bitcoin/index.spec.tsx b/src/components/__test__/PriceBitcoin.spec.tsx similarity index 96% rename from src/components/price-bitcoin/index.spec.tsx rename to src/components/__test__/PriceBitcoin.spec.tsx index f9c5d3d..7c05b92 100644 --- a/src/components/price-bitcoin/index.spec.tsx +++ b/src/components/__test__/PriceBitcoin.spec.tsx @@ -1,7 +1,7 @@ import { render } from '@testing-library/react-native'; import React from 'react'; -import { PriceBitcoin } from '@/components'; +import { PriceBitcoin } from '../PriceBitcoin'; describe('PriceBitcoin', () => { const configTest = { diff --git a/src/components/scroll-view/index.spec.tsx b/src/components/__test__/ScrollView.spec.tsx similarity index 95% rename from src/components/scroll-view/index.spec.tsx rename to src/components/__test__/ScrollView.spec.tsx index 3c4c7a2..06328b2 100644 --- a/src/components/scroll-view/index.spec.tsx +++ b/src/components/__test__/ScrollView.spec.tsx @@ -2,7 +2,7 @@ import { act, render } from '@testing-library/react-native'; import React from 'react'; import { View } from 'react-native'; -import { ScrollView } from '@/components'; +import { ScrollView } from '../ScrollView'; describe('ScrollView', () => { const configTest = { diff --git a/src/components/scroll-view-header/index.spec.tsx b/src/components/__test__/ScrollViewHeader.spec.tsx similarity index 95% rename from src/components/scroll-view-header/index.spec.tsx rename to src/components/__test__/ScrollViewHeader.spec.tsx index 8662474..ec90788 100644 --- a/src/components/scroll-view-header/index.spec.tsx +++ b/src/components/__test__/ScrollViewHeader.spec.tsx @@ -2,7 +2,7 @@ import { act, render } from '@testing-library/react-native'; import React from 'react'; import { View } from 'react-native'; -import { ScrollViewHeader } from '@/components'; +import { ScrollViewHeader } from '../ScrollViewHeader'; describe('ScrollViewHeader', () => { const configTest = { diff --git a/src/components/select-list/index.spec.tsx b/src/components/__test__/SelectList.spec.tsx similarity index 94% rename from src/components/select-list/index.spec.tsx rename to src/components/__test__/SelectList.spec.tsx index 73c019e..e5ca1dd 100644 --- a/src/components/select-list/index.spec.tsx +++ b/src/components/__test__/SelectList.spec.tsx @@ -1,7 +1,7 @@ import { fireEvent, render } from '@testing-library/react-native'; import React from 'react'; -import { SelectList } from '@/components'; +import { SelectList } from '../SelectList'; test('Render component and action', () => { const configTest = { diff --git a/src/components/skeleton-loading/index.spec.tsx b/src/components/__test__/SkeletonLoading.spec.tsx similarity index 83% rename from src/components/skeleton-loading/index.spec.tsx rename to src/components/__test__/SkeletonLoading.spec.tsx index 212bddc..e5a4566 100644 --- a/src/components/skeleton-loading/index.spec.tsx +++ b/src/components/__test__/SkeletonLoading.spec.tsx @@ -1,7 +1,7 @@ import { render } from '@testing-library/react-native'; import React from 'react'; -import { SkeletonLoading } from '@/components'; +import { SkeletonLoading } from '../SkeletonLoading'; test('Render component', () => { const { getByTestId } = render(); diff --git a/src/components/text/index.spec.tsx b/src/components/__test__/Text.spec.tsx similarity index 90% rename from src/components/text/index.spec.tsx rename to src/components/__test__/Text.spec.tsx index db0086b..52af67d 100644 --- a/src/components/text/index.spec.tsx +++ b/src/components/__test__/Text.spec.tsx @@ -1,7 +1,7 @@ import { render } from '@testing-library/react-native'; import React from 'react'; -import { Text } from '@/components'; +import { Text } from '../Text'; test('Render component', () => { const configTest = { diff --git a/src/components/text-field-area/index.spec.tsx b/src/components/__test__/TextFieldArea.spec.tsx similarity index 88% rename from src/components/text-field-area/index.spec.tsx rename to src/components/__test__/TextFieldArea.spec.tsx index 8a8b3b5..83f6715 100644 --- a/src/components/text-field-area/index.spec.tsx +++ b/src/components/__test__/TextFieldArea.spec.tsx @@ -2,9 +2,9 @@ import { fireEvent, render, renderHook } from '@testing-library/react-native'; import React from 'react'; import { I18nextProvider, useTranslation } from 'react-i18next'; -import { TextFieldArea } from '@/components'; +import { TextFieldArea } from '../TextFieldArea'; -test('Render component and changeText', () => { +test('Render component', () => { const t = renderHook(() => useTranslation()); const configTest = { value: 'Hello World', diff --git a/src/components/title-subtitle/index.spec.tsx b/src/components/__test__/TitleSubtitle.spec.tsx similarity index 94% rename from src/components/title-subtitle/index.spec.tsx rename to src/components/__test__/TitleSubtitle.spec.tsx index 4c3c2f0..fe4c463 100644 --- a/src/components/title-subtitle/index.spec.tsx +++ b/src/components/__test__/TitleSubtitle.spec.tsx @@ -1,7 +1,7 @@ import { render } from '@testing-library/react-native'; import React from 'react'; -import { TitleSubtitle } from '@/components'; +import { TitleSubtitle } from '../TitleSubtitle'; describe('TitleSubtitle', () => { const configTest = { diff --git a/src/components/transaction-list/index.spec.tsx b/src/components/__test__/TransactionList.spec.tsx similarity index 92% rename from src/components/transaction-list/index.spec.tsx rename to src/components/__test__/TransactionList.spec.tsx index 6a174ab..8ed6412 100644 --- a/src/components/transaction-list/index.spec.tsx +++ b/src/components/__test__/TransactionList.spec.tsx @@ -1,7 +1,7 @@ import { act, render } from '@testing-library/react-native'; import React from 'react'; -import { TransactionList } from '@/components'; +import { TransactionList } from '../TransactionList'; test('Render component and action', () => { const configTest = { diff --git a/src/components/action-list/index.tsx b/src/components/action-list/index.tsx deleted file mode 100644 index 663632d..0000000 --- a/src/components/action-list/index.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import React from 'react'; -import { heightPercentageToDP as hp } from 'react-native-responsive-screen'; - -import { IconArrowRight } from '@/assets'; -import { themes } from '@/themes'; - -import { Text } from '../text'; -import { - ActionListContainer, - IconAndTitleContainer, - IconContainer, - Indicator, - ItemButton, -} from './styles'; -import { ActionListProps } from './types'; - -export function ActionList({ list }: ActionListProps) { - return ( - - {list.map((item, index) => ( - item.onAction()}> - {item.prefixIcon && ( - {item.prefixIcon} - )} - - {item.title} - - - - {list.length !== index + 1 && } - - - ))} - - ); -} diff --git a/src/components/action-list/styles.ts b/src/components/action-list/styles.ts deleted file mode 100644 index 03eacd5..0000000 --- a/src/components/action-list/styles.ts +++ /dev/null @@ -1,46 +0,0 @@ -import styled from 'styled-components/native'; - -import { useAppSettings } from '@/stores'; -import { themes } from '@/themes'; - -const { isTablet } = useAppSettings.getState(); - -const { colors, border_radius, spaces, width } = themes; - -export const ActionListContainer = styled.View` - width: 100%; - max-width: ${width.max_width}; - align-self: center; - background-color: ${colors.black_000}; - border-radius: ${border_radius.radius_10}; - border: 1px solid ${colors.dark_grey}; -`; - -export const ItemButton = styled.TouchableOpacity` - padding-left: ${isTablet ? spaces.space_20 : spaces.space_15}; - flex-direction: row; - justify-content: space-between; - align-items: center; -`; - -export const Indicator = styled.View` - position: absolute; - bottom: 0; - right: 0; - height: 1px; - width: 100%; - background-color: ${colors.dark_grey}; -`; - -export const IconAndTitleContainer = styled.View` - flex: 1; - padding: ${isTablet ? spaces.space_25 : spaces.space_20} 0; - flex-direction: row; - align-items: center; - justify-content: space-between; - position: relative; -`; - -export const IconContainer = styled.View` - margin-right: ${spaces.space_15}; -`; diff --git a/src/components/alert-modal/index.tsx b/src/components/alert-modal/index.tsx deleted file mode 100644 index d558678..0000000 --- a/src/components/alert-modal/index.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import React from 'react'; -import { useTranslation } from 'react-i18next'; - -import { themes } from '@/themes'; - -import { ButtonTitleGhost } from '../button-title-ghost'; -import { Text } from '../text'; -import { AlertContainer, BackgroundContainer, Footer, ModalContainer } from './styles'; -import { AlertModalProps } from './types'; - -export function AlertModal({ title, visible, onCancel, onConfirm }: AlertModalProps) { - const { t } = useTranslation(); - - return ( - - - - - {title} - -
- - -
-
-
-
- ); -} diff --git a/src/components/alert-modal/styles.ts b/src/components/alert-modal/styles.ts deleted file mode 100644 index 0500876..0000000 --- a/src/components/alert-modal/styles.ts +++ /dev/null @@ -1,28 +0,0 @@ -import styled from 'styled-components/native'; - -import { themes } from '@/themes'; - -export const ModalContainer = styled.Modal``; - -export const BackgroundContainer = styled.View` - flex: 1; - background-color: ${themes.colors.black_100_50pct}; - align-items: center; - justify-content: center; - padding: 0 ${themes.spaces.space_15}; -`; - -export const AlertContainer = styled.View` - width: 100%; - max-width: ${themes.width.max_width}; - padding: ${themes.spaces.space_30} ${themes.spaces.space_20}; - border-radius: ${themes.border_radius.radius_15}; - background-color: ${themes.colors.black_000}; -`; - -export const Footer = styled.View` - width: 100%; - margin-top: ${themes.spaces.space_30}; - flex-direction: row; - justify-content: flex-end; -`; diff --git a/src/components/button-title-ghost/index.tsx b/src/components/button-title-ghost/index.tsx deleted file mode 100644 index bac0bc8..0000000 --- a/src/components/button-title-ghost/index.tsx +++ /dev/null @@ -1,65 +0,0 @@ -import React from 'react'; -import { useTranslation } from 'react-i18next'; -import { ActivityIndicator } from 'react-native'; - -import { useAppSettings } from '@/stores'; -import { themes } from '@/themes'; - -import { Text } from '../text'; -import { ButtonTitleGhostContainer } from './styles'; -import { ButtonTitleGhostProps } from './types'; - -export function ButtonTitleGhost({ - testID = 'idButtonTitleGhost', - title, - disabled = false, - onPress, - size = 'large', - loading = false, - buttonsWeight = 'bold', - marginT, - marginB, - marginR, - marginL, -}: ButtonTitleGhostProps) { - const { t } = useTranslation(); - const { isTablet } = useAppSettings.getState(); - - return ( - { - if (!disabled || loading) onPress(); - }} - disabled={disabled || loading} - marginT={marginT ?? '0px'} - marginB={marginB ?? '0px'} - marginR={marginR ?? '0px'} - marginL={marginL ?? '0px'} - isOpacity={disabled} - > - {!loading && ( - - {title} - - )} - {loading && ( - - - - {t('loading')} - - - )} - - ); -} diff --git a/src/components/button-title-ghost/styles.ts b/src/components/button-title-ghost/styles.ts deleted file mode 100644 index 6fcae74..0000000 --- a/src/components/button-title-ghost/styles.ts +++ /dev/null @@ -1,19 +0,0 @@ -import styled from 'styled-components/native'; - -import { themes } from '@/themes'; - -import { ButtonTitleGhostContainerProps } from './types'; - -export const ButtonTitleGhostContainer = styled.TouchableOpacity` - align-self: center; - flex-direction: row; - padding: 10px; - background-color: ${themes.colors.transparent}; - align-items: center; - justify-content: center; - margin-top: ${({ marginT }) => marginT}; - margin-bottom: ${({ marginB }) => marginB}; - margin-right: ${({ marginR }) => marginR}; - margin-left: ${({ marginL }) => marginL}; - opacity: ${({ isOpacity }) => (isOpacity ? 0.5 : 1)}; -`; diff --git a/src/components/button-title-ghost/types.ts b/src/components/button-title-ghost/types.ts deleted file mode 100644 index b8a11b7..0000000 --- a/src/components/button-title-ghost/types.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { TextProps } from '../text/types'; - -export interface ButtonTitleGhostProps { - testID?: string; - title: string; - onPress: () => void; - disabled?: boolean; - size?: 'large' | 'small'; - buttonsWeight?: TextProps['weight']; - loading?: boolean; - marginT?: string; - marginB?: string; - marginR?: string; - marginL?: string; -} - -export interface ButtonTitleGhostContainerProps { - isOpacity: boolean; - marginT: string; - marginB: string; - marginR: string; - marginL: string; -} diff --git a/src/components/button-title-shape/index.tsx b/src/components/button-title-shape/index.tsx deleted file mode 100644 index 580e6ac..0000000 --- a/src/components/button-title-shape/index.tsx +++ /dev/null @@ -1,67 +0,0 @@ -import React from 'react'; -import { useTranslation } from 'react-i18next'; -import { ActivityIndicator } from 'react-native'; - -import { useAppSettings } from '@/stores'; -import { themes } from '@/themes'; - -import { Text } from '../text'; -import { ButtonTitleShapeContainer } from './styles'; -import { ButtonTitleShapeProps } from './types'; - -export function ButtonTitleShape({ - title, - disabled = false, - onPress, - size = 'large', - loading = false, - marginT, - marginB, - marginR, - marginL, -}: ButtonTitleShapeProps) { - const { t } = useTranslation(); - const { colors, spaces, border_radius } = themes; - const { isTablet } = useAppSettings.getState(); - - const LARGE_PADDING_V = isTablet ? spaces.space_20 : spaces.space_15; - const LARGE_PADDING_H = isTablet ? spaces.space_15 : spaces.space_10; - - return ( - { - if (!disabled || loading) onPress(); - }} - disabled={disabled || loading} - width={size === 'large' ? '90%' : 'auto'} - paddingH={size === 'large' ? '0px' : spaces.space_25} - paddingV={size === 'large' ? LARGE_PADDING_V : LARGE_PADDING_H} - borderR={size === 'large' ? border_radius.radius_15 : border_radius.radius_10} - marginT={marginT ?? '0px'} - marginB={marginB ?? '15px'} - marginR={marginR ?? '0px'} - marginL={marginL ?? '0px'} - isOpacity={disabled} - > - {!loading && ( - - {title} - - )} - {loading && ( - - - - {t('loading')} - - - )} - - ); -} diff --git a/src/components/button-title-shape/styles.ts b/src/components/button-title-shape/styles.ts deleted file mode 100644 index 62a69e7..0000000 --- a/src/components/button-title-shape/styles.ts +++ /dev/null @@ -1,22 +0,0 @@ -import styled from 'styled-components/native'; - -import { themes } from '@/themes'; - -import { ButtonTitleShapeContainerProps } from './types'; - -export const ButtonTitleShapeContainer = styled.TouchableOpacity` - align-self: center; - flex-direction: row; - padding: ${({ paddingV, paddingH }) => `${paddingV} ${paddingH}`}; - border-radius: ${({ borderR }) => borderR}; - background-color: ${themes.colors.light_cyan}; - margin-bottom: ${themes.spaces.space_15}; - align-items: center; - justify-content: center; - width: ${({ width }) => width}; - margin-top: ${({ marginT }) => marginT}; - margin-bottom: ${({ marginB }) => marginB}; - margin-right: ${({ marginR }) => marginR}; - margin-left: ${({ marginL }) => marginL}; - opacity: ${({ isOpacity }) => (isOpacity ? 0.5 : 1)}; -`; diff --git a/src/components/button-title-shape/types.ts b/src/components/button-title-shape/types.ts deleted file mode 100644 index 9b1655e..0000000 --- a/src/components/button-title-shape/types.ts +++ /dev/null @@ -1,23 +0,0 @@ -export interface ButtonTitleShapeProps { - title: string; - onPress: () => void; - disabled?: boolean; - size?: 'large' | 'small'; - loading?: boolean; - marginT?: string; - marginB?: string; - marginR?: string; - marginL?: string; -} - -export interface ButtonTitleShapeContainerProps { - isOpacity: boolean; - width: string; - paddingV: string; - paddingH: string; - borderR: string; - marginT: string; - marginB: string; - marginR: string; - marginL: string; -} diff --git a/src/components/chart-bitcoin/components/custom-line/index.tsx b/src/components/chart-bitcoin/components/custom-line/index.tsx deleted file mode 100644 index 016df8c..0000000 --- a/src/components/chart-bitcoin/components/custom-line/index.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import React from 'react'; -import { Path } from 'react-native-svg'; - -import { themes } from '@/themes'; - -import { apx } from '../../functions'; -import { CustomLineProps } from './types'; - -export function CustomLine({ line }: CustomLineProps) { - return ( - - ); -} diff --git a/src/components/chart-bitcoin/functions/index.ts b/src/components/chart-bitcoin/functions/index.ts deleted file mode 100644 index 8df3e8d..0000000 --- a/src/components/chart-bitcoin/functions/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { Dimensions } from 'react-native'; - -export const apx = (size = 0) => { - const width = Dimensions.get('window').width; - return (width / 750) * size; -}; diff --git a/src/components/chart-bitcoin/index.tsx b/src/components/chart-bitcoin/index.tsx deleted file mode 100644 index bb42a95..0000000 --- a/src/components/chart-bitcoin/index.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import React from 'react'; -import { useTranslation } from 'react-i18next'; - -import { useBitcoinHistoricalPrice } from '@/stores'; -import { themes } from '@/themes'; - -import { SkeletonLoading } from '../skeleton-loading'; -import { Text } from '../text'; -import { ChartMain } from './components/chart-main'; -import { ChartBitcoinContainer, FailedContainer } from './styles'; - -export function ChartBitcoin() { - const { t } = useTranslation(); - const { fetchBitcoinHistoricalPrice, status, data } = useBitcoinHistoricalPrice(state => state); - - React.useEffect(() => { - if (status === null) fetchBitcoinHistoricalPrice(); - }, []); - - return ( - - {(status === 'loading' || status === null) && ( - - )} - - {status === 'failed' && ( - - - {t('request-error-try-later')} - - - )} - - {status === 'success' && } - - ); -} diff --git a/src/components/chart-bitcoin/styles.ts b/src/components/chart-bitcoin/styles.ts deleted file mode 100644 index cc21ddb..0000000 --- a/src/components/chart-bitcoin/styles.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { - heightPercentageToDP as hp, - widthPercentageToDP as wp, -} from 'react-native-responsive-screen'; -import styled from 'styled-components/native'; - -import { useAppSettings } from '@/stores'; -import { themes } from '@/themes'; - -const { isTablet } = useAppSettings.getState(); - -const MARGIN_TOP_CHART = `${hp('5%')}px`; - -export const ChartBitcoinContainer = styled.View` - margin-top: ${isTablet ? MARGIN_TOP_CHART : themes.spaces.space_25}; - width: 100%; -`; - -export const FailedContainer = styled.View` - height: ${wp('35%')}px; - width: ${wp('100%')}px; - justify-content: center; - padding: 0 ${themes.spaces.space_15}; -`; diff --git a/src/components/check-box-message/index.tsx b/src/components/check-box-message/index.tsx deleted file mode 100644 index ea24889..0000000 --- a/src/components/check-box-message/index.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import React from 'react'; - -import { themes } from '@/themes'; - -import { Text } from '../text'; -import { Check, CheckBoxMessageContainer } from './styles'; -import { CheckboxMessageProps } from './types'; - -export function CheckBoxMessage({ isActivated, onAction, message }: CheckboxMessageProps) { - return ( - - - - {message} - - - ); -} diff --git a/src/components/check-box-message/styles.ts b/src/components/check-box-message/styles.ts deleted file mode 100644 index a3cc7fc..0000000 --- a/src/components/check-box-message/styles.ts +++ /dev/null @@ -1,15 +0,0 @@ -import Checkbox from 'expo-checkbox'; -import styled from 'styled-components/native'; - -import { themes } from '@/themes'; - -export const CheckBoxMessageContainer = styled.View` - flex-direction: row; - align-items: center; - margin-top: ${themes.spaces.space_15}; -`; - -export const Check = styled(Checkbox)` - width: 18px; - height: 18px; -`; diff --git a/src/components/chart-bitcoin/components/chart-main/index.tsx b/src/components/fragments/ChartMain.tsx similarity index 87% rename from src/components/chart-bitcoin/components/chart-main/index.tsx rename to src/components/fragments/ChartMain.tsx index 68b65a1..1815ea3 100644 --- a/src/components/chart-bitcoin/components/chart-main/index.tsx +++ b/src/components/fragments/ChartMain.tsx @@ -3,12 +3,12 @@ import React from 'react'; import { Dimensions, PanResponder, View } from 'react-native'; import { AreaChart } from 'react-native-svg-charts'; -import { useAppSettings } from '@/stores'; -import { themes } from '@/themes'; +import { colors } from '@/helpers/themes'; +import { useAppSettings } from '@/stores/useAppSettings'; +import { ChartMainProps } from '@/types/ChartMainType'; -import { CustomLine } from '../custom-line'; -import { CustomTooltip } from '../custom-tooltip'; -import { ChartMainProps } from './types'; +import { CustomLine } from './CustomLine'; +import { CustomTooltip } from './CustomTooltip'; export function ChartMain({ data }: ChartMainProps) { const { isTablet } = useAppSettings(state => state); @@ -71,7 +71,7 @@ export function ChartMain({ data }: ChartMainProps) { style={{ flex: 1 }} data={dataList.map(item => item.value)} contentInset={{ ...verticalContentInset }} - svg={{ fill: themes.colors.transparent }} + svg={{ fill: colors.transparent }} curve={shape.curveNatural} animate > diff --git a/src/components/fragments/CustomLine.tsx b/src/components/fragments/CustomLine.tsx new file mode 100644 index 0000000..244b097 --- /dev/null +++ b/src/components/fragments/CustomLine.tsx @@ -0,0 +1,15 @@ +import React from 'react'; +import { Dimensions } from 'react-native'; +import { Path } from 'react-native-svg'; + +import { colors } from '@/helpers/themes'; +import { CustomLineProps } from '@/types/CustomLineType'; + +export function CustomLine({ line }: CustomLineProps) { + const apx = (size = 0) => { + const width = Dimensions.get('window').width; + return (width / 750) * size; + }; + + return ; +} diff --git a/src/components/chart-bitcoin/components/custom-tooltip/index.tsx b/src/components/fragments/CustomTooltip.tsx similarity index 69% rename from src/components/chart-bitcoin/components/custom-tooltip/index.tsx rename to src/components/fragments/CustomTooltip.tsx index fd2ad69..eb58bbd 100644 --- a/src/components/chart-bitcoin/components/custom-tooltip/index.tsx +++ b/src/components/fragments/CustomTooltip.tsx @@ -1,14 +1,18 @@ import currencyJS from 'currency.js'; import React from 'react'; +import { Dimensions } from 'react-native'; import { Circle, G, Line, Rect, Text as SvgText } from 'react-native-svg'; -import { useFormatDate } from '@/hooks'; -import { themes } from '@/themes'; - -import { apx } from '../../functions'; -import { CustomTooltipProps } from './types'; +import { colors } from '@/helpers/themes'; +import { useFormatDate } from '@/hooks/useFormatDate'; +import { CustomTooltipProps } from '@/types/CustomTooltipType'; export function CustomTooltip({ x, y, ticks, positionX, size, dataList }: CustomTooltipProps) { + const apx = (size = 0) => { + const width = Dimensions.get('window').width; + return (width / 750) * size; + }; + if (positionX < 0) return null; const { dateAndTime } = useFormatDate(dataList[positionX].date); @@ -31,11 +35,11 @@ export function CustomTooltip({ x, y, ticks, positionX, size, dataList }: Custom ry={apx(12)} width={apx(300)} height={apx(96)} - stroke={themes.colors.transparent} - fill={themes.colors.transparent} + stroke={colors.transparent} + fill={colors.transparent} /> - + {dateAndTime} {currency} @@ -53,7 +57,7 @@ export function CustomTooltip({ x, y, ticks, positionX, size, dataList }: Custom @@ -61,9 +65,9 @@ export function CustomTooltip({ x, y, ticks, positionX, size, dataList }: Custom diff --git a/src/components/fragments/HeaderAnimated.tsx b/src/components/fragments/HeaderAnimated.tsx new file mode 100644 index 0000000..e7c07b1 --- /dev/null +++ b/src/components/fragments/HeaderAnimated.tsx @@ -0,0 +1,84 @@ +import Constants from 'expo-constants'; +import React from 'react'; +import { Platform, StyleSheet, View } from 'react-native'; +import Animated, { Extrapolate, interpolate, useAnimatedStyle } from 'react-native-reanimated'; +import { heightPercentageToDP as hp } from 'react-native-responsive-screen'; + +import { colors, spaces } from '@/helpers/themes'; +import { HeaderAnimatedProps } from '@/types/HeaderAnimatedType'; + +import { Text } from '../Text'; + +export function HeaderAnimated({ translationY, headerTitle }: HeaderAnimatedProps) { + const HEIGHT_ITEM_HEADER = hp('8%'); + const HEIGHT_STATUS_BAR = Platform.OS === 'ios' ? Constants.statusBarHeight : 0; + const HEIGHT_FIRST_ITEM = hp('8%') + HEIGHT_STATUS_BAR; + const HEIGHT_SECOND_ITEM = hp('8%') + HEIGHT_FIRST_ITEM; + + const translateY = useAnimatedStyle(() => ({ + transform: [ + { + translateY: interpolate( + translationY.value, + [20, HEIGHT_ITEM_HEADER], + [0, -HEIGHT_ITEM_HEADER], + Extrapolate.CLAMP, + ), + }, + ], + })); + + const topOpacity = useAnimatedStyle(() => ({ + opacity: interpolate( + translationY.value, + [-HEIGHT_ITEM_HEADER, 0, 50, HEIGHT_ITEM_HEADER], + [0, 0, 0, 1], + Extrapolate.CLAMP, + ), + })); + + return ( + + + + {headerTitle} + + + + + + + {headerTitle} + + + + + + ); +} + +const styles = StyleSheet.create({ + secondItem: { + position: 'absolute', + top: 0, + width: '100%', + zIndex: 1, + paddingHorizontal: spaces.space_15, + justifyContent: 'flex-end', + backgroundColor: colors.black_000, + }, + animatedContainer: { + position: 'absolute', + top: 0, + left: 0, + right: 0, + backgroundColor: colors.black_000, + zIndex: 99999999, + }, + firstItem: { + zIndex: 2, + paddingHorizontal: spaces.space_15, + justifyContent: 'flex-end', + backgroundColor: colors.black_000, + }, +}); diff --git a/src/components/header-swiper-options/index.tsx b/src/components/header-swiper-options/index.tsx deleted file mode 100644 index 246dc0a..0000000 --- a/src/components/header-swiper-options/index.tsx +++ /dev/null @@ -1,55 +0,0 @@ -import { useNavigation } from '@react-navigation/native'; -import { setStatusBarBackgroundColor } from 'expo-status-bar'; -import React from 'react'; -import { useTranslation } from 'react-i18next'; -import { Platform } from 'react-native'; - -import { themes } from '@/themes'; - -import { ButtonTitleGhost } from '../button-title-ghost'; -import { Text } from '../text'; -import { CenterTitle, HeaderSwiperOptionsContainer } from './styles'; -import { HeaderSwiperOptionsProps } from './types'; - -export function HeaderSwiperOptions({ - title, - onAction, - disableAction = false, -}: HeaderSwiperOptionsProps) { - const navigation = useNavigation(); - const { t } = useTranslation(); - - React.useEffect(() => { - if (Platform.OS === 'android') setStatusBarBackgroundColor('black', true); - return () => { - if (Platform.OS === 'android') setStatusBarBackgroundColor(themes.colors.black_000, true); - }; - }, []); - - return ( - - - - {title} - - - navigation.goBack()} - marginL={themes.spaces.space_10} - /> - - - ); -} diff --git a/src/components/header-swiper-options/styles.ts b/src/components/header-swiper-options/styles.ts deleted file mode 100644 index 462b6c6..0000000 --- a/src/components/header-swiper-options/styles.ts +++ /dev/null @@ -1,19 +0,0 @@ -import styled from 'styled-components/native'; - -import { themes } from '@/themes'; - -export const HeaderSwiperOptionsContainer = styled.View` - background-color: ${themes.colors.black_000}; - padding: ${themes.spaces.space_10} 0; - width: 100%; - flex-direction: row; - justify-content: space-between; - align-items: center; - position: relative; -`; - -export const CenterTitle = styled.View` - position: absolute; - align-items: center; - width: 100%; -`; diff --git a/src/components/index.ts b/src/components/index.ts deleted file mode 100644 index f3d37c0..0000000 --- a/src/components/index.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { ActionList } from './action-list'; -import { AlertModal } from './alert-modal'; -import { ButtonTitleGhost } from './button-title-ghost'; -import { ButtonTitleShape } from './button-title-shape'; -import { ChartBitcoin } from './chart-bitcoin'; -import { CheckBoxMessage } from './check-box-message'; -import { HeaderSwiperOptions } from './header-swiper-options'; -import { LimitedWidthContainer } from './limited-width-container'; -import { PriceBitcoin } from './price-bitcoin'; -import { ScrollView } from './scroll-view'; -import { ScrollViewHeader } from './scroll-view-header'; -import { SelectList } from './select-list'; -import { SkeletonLoading } from './skeleton-loading'; -import { SpaceFull } from './space-full'; -import { Text } from './text'; -import { TextFieldArea } from './text-field-area'; -import { TitleSubtitle } from './title-subtitle'; -import { TransactionList } from './transaction-list'; - -export { - ActionList, - AlertModal, - ButtonTitleGhost, - ButtonTitleShape, - ChartBitcoin, - CheckBoxMessage, - HeaderSwiperOptions, - LimitedWidthContainer, - PriceBitcoin, - ScrollView, - ScrollViewHeader, - SelectList, - SkeletonLoading, - SpaceFull, - Text, - TextFieldArea, - TitleSubtitle, - TransactionList, -}; diff --git a/src/components/limited-width-container/index.tsx b/src/components/limited-width-container/index.tsx deleted file mode 100644 index fc12702..0000000 --- a/src/components/limited-width-container/index.tsx +++ /dev/null @@ -1,8 +0,0 @@ -import React from 'react'; - -import { WidthContainer } from './styles'; -import { LimitedWidthContainerProps } from './types'; - -export function LimitedWidthContainer({ children }: LimitedWidthContainerProps) { - return {children}; -} diff --git a/src/components/limited-width-container/styles.ts b/src/components/limited-width-container/styles.ts deleted file mode 100644 index 6368d0f..0000000 --- a/src/components/limited-width-container/styles.ts +++ /dev/null @@ -1,9 +0,0 @@ -import styled from 'styled-components/native'; - -import { themes } from '@/themes'; - -export const WidthContainer = styled.View` - max-width: ${themes.width.max_width}; - width: 100%; - align-self: center; -`; diff --git a/src/components/price-bitcoin/styles.ts b/src/components/price-bitcoin/styles.ts deleted file mode 100644 index f8593e4..0000000 --- a/src/components/price-bitcoin/styles.ts +++ /dev/null @@ -1,7 +0,0 @@ -import styled from 'styled-components/native'; - -export const PriceBitcoinContainer = styled.View``; - -export const PriceAndPorcent = styled.View` - flex-direction: row; -`; diff --git a/src/components/scroll-view-header/components/header-animated/index.tsx b/src/components/scroll-view-header/components/header-animated/index.tsx deleted file mode 100644 index 87d627d..0000000 --- a/src/components/scroll-view-header/components/header-animated/index.tsx +++ /dev/null @@ -1,64 +0,0 @@ -import React from 'react'; -import { Extrapolate, interpolate, useAnimatedStyle } from 'react-native-reanimated'; -import { heightPercentageToDP as hp } from 'react-native-responsive-screen'; - -import { themes } from '@/themes'; - -import { Text } from '../../../text'; -import { - FirstItem, - HeaderAnimatedContainer, - OpacityAnimation, - SafeArea, - SecondtItem, -} from './styles'; -import { HeaderAnimatedProps } from './types'; - -export function HeaderAnimated({ translationY, headerTitle }: HeaderAnimatedProps) { - const { spaces } = themes; - - const HEIGHT_ITEM_HEADER = hp('8%'); - - const translateY = useAnimatedStyle(() => ({ - transform: [ - { - translateY: interpolate( - translationY.value, - [20, HEIGHT_ITEM_HEADER], - [0, -HEIGHT_ITEM_HEADER], - Extrapolate.CLAMP, - ), - }, - ], - })); - - const topOpacity = useAnimatedStyle(() => ({ - opacity: interpolate( - translationY.value, - [-HEIGHT_ITEM_HEADER, 0, 50, HEIGHT_ITEM_HEADER], - [0, 0, 0, 1], - Extrapolate.CLAMP, - ), - })); - - return ( - - - - {headerTitle} - - - - - - - - {headerTitle} - - - - - - - ); -} diff --git a/src/components/scroll-view-header/components/header-animated/styles.ts b/src/components/scroll-view-header/components/header-animated/styles.ts deleted file mode 100644 index 676da17..0000000 --- a/src/components/scroll-view-header/components/header-animated/styles.ts +++ /dev/null @@ -1,43 +0,0 @@ -import Constants from 'expo-constants'; -import { Platform } from 'react-native'; -import Animated from 'react-native-reanimated'; -import { heightPercentageToDP as hp } from 'react-native-responsive-screen'; -import styled from 'styled-components/native'; - -import { themes } from '@/themes'; - -const HEIGHT_STATUS_BAR = Platform.OS === 'ios' ? Constants.statusBarHeight : 0; -const HEIGHT_FIRST_ITEM = hp('8%'); -const HEIGHT_SECOND_ITEM = hp('8%') + HEIGHT_FIRST_ITEM + HEIGHT_STATUS_BAR; - -export const HeaderAnimatedContainer = styled.View` - position: absolute; - top: 0; - left: 0; - right: 0; - background-color: ${themes.colors.black_000}; - z-index: 99999999; -`; - -export const SafeArea = styled.SafeAreaView``; - -export const FirstItem = styled.View` - height: ${HEIGHT_FIRST_ITEM}px; - z-index: 2; - padding: 0 ${themes.spaces.space_15}; - justify-content: center; - background-color: ${themes.colors.black_000}; -`; - -export const SecondtItem = styled(Animated.View)` - position: absolute; - top: 0; - height: ${HEIGHT_SECOND_ITEM}px; - width: 100%; - z-index: 1; - padding: 0 ${themes.spaces.space_15}; - justify-content: flex-end; - background-color: ${themes.colors.black_000}; -`; - -export const OpacityAnimation = styled(Animated.View)``; diff --git a/src/components/scroll-view-header/styles.ts b/src/components/scroll-view-header/styles.ts deleted file mode 100644 index 882b5d5..0000000 --- a/src/components/scroll-view-header/styles.ts +++ /dev/null @@ -1,9 +0,0 @@ -import Animated from 'react-native-reanimated'; -import styled from 'styled-components/native'; - -import { themes } from '@/themes'; - -export const ScrollViewHeaderContainer = styled(Animated.ScrollView)` - flex: 1; - background-color: ${themes.colors.black_100}; -`; diff --git a/src/components/scroll-view/styles.ts b/src/components/scroll-view/styles.ts deleted file mode 100644 index 743a2c2..0000000 --- a/src/components/scroll-view/styles.ts +++ /dev/null @@ -1,8 +0,0 @@ -import styled from 'styled-components/native'; - -import { themes } from '@/themes'; - -export const ScrollViewContainer = styled.ScrollView` - flex: 1; - background-color: ${themes.colors.black_100}; -`; diff --git a/src/components/select-list/index.tsx b/src/components/select-list/index.tsx deleted file mode 100644 index aaa03aa..0000000 --- a/src/components/select-list/index.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import React from 'react'; - -import { themes } from '@/themes'; - -import { Text } from '../text'; -import { BorderSelect, ItemButton, Selected, SelectListContainer } from './styles'; -import { SelectListProps } from './types'; - -export function SelectList({ data, selected, onSelected }: SelectListProps) { - return ( - - {data.map((item, index) => ( - onSelected(item.ref)}> - {selected === item.ref && } - - {item.title} - - - ))} - - ); -} diff --git a/src/components/select-list/styles.ts b/src/components/select-list/styles.ts deleted file mode 100644 index 5554df8..0000000 --- a/src/components/select-list/styles.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { widthPercentageToDP as wp } from 'react-native-responsive-screen'; -import styled from 'styled-components/native'; - -import { themes } from '@/themes'; - -export const SelectListContainer = styled.View``; - -export const ItemButton = styled.TouchableOpacity` - padding: ${themes.spaces.space_15} 0; - flex-direction: row; - align-items: center; -`; - -export const BorderSelect = styled.View` - width: ${wp('4%')}px; - height: ${wp('4%')}px; - align-items: center; - justify-content: center; - border-radius: 40px; - border: 2px solid ${themes.colors.light_cyan}; -`; - -export const Selected = styled.View` - width: ${wp('2%')}px; - height: ${wp('2%')}px; - border-radius: 20px; - background-color: ${themes.colors.light_cyan}; -`; diff --git a/src/components/skeleton-loading/styles.ts b/src/components/skeleton-loading/styles.ts deleted file mode 100644 index f9ede29..0000000 --- a/src/components/skeleton-loading/styles.ts +++ /dev/null @@ -1,10 +0,0 @@ -import styled from 'styled-components/native'; - -import { SkeletonLoadingContainerProps } from './types'; - -export const SkeletonLoadingContainer = styled.View` - margin-top: ${({ marginT }) => marginT}; - margin-bottom: ${({ marginB }) => marginB}; - margin-right: ${({ marginR }) => marginR}; - margin-left: ${({ marginL }) => marginL}; -`; diff --git a/src/components/skeleton-loading/types.ts b/src/components/skeleton-loading/types.ts deleted file mode 100644 index ad7922d..0000000 --- a/src/components/skeleton-loading/types.ts +++ /dev/null @@ -1,15 +0,0 @@ -export interface SkeletonLoadingContainerProps { - marginT: string; - marginB: string; - marginR: string; - marginL: string; -} - -export interface SkeletonLoadingProps { - heightPorcent: string; - radius: number; - marginT?: string; - marginB?: string; - marginR?: string; - marginL?: string; -} diff --git a/src/components/space-full/index.spec.tsx b/src/components/space-full/index.spec.tsx deleted file mode 100644 index 8f7ff7a..0000000 --- a/src/components/space-full/index.spec.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import { render } from '@testing-library/react-native'; -import React from 'react'; - -import { SpaceFull } from '@/components'; - -test('Render component', () => { - const configTest = { - id: 'idSpaceFull', - }; - - const { getByTestId } = render(); - - expect(getByTestId(configTest.id)).toBeTruthy(); -}); diff --git a/src/components/space-full/index.tsx b/src/components/space-full/index.tsx deleted file mode 100644 index 56bf437..0000000 --- a/src/components/space-full/index.tsx +++ /dev/null @@ -1,7 +0,0 @@ -import React from 'react'; - -import { SpaceFullContainer } from './styles'; - -export function SpaceFull() { - return ; -} diff --git a/src/components/space-full/styles.ts b/src/components/space-full/styles.ts deleted file mode 100644 index fe185a8..0000000 --- a/src/components/space-full/styles.ts +++ /dev/null @@ -1,5 +0,0 @@ -import styled from 'styled-components/native'; - -export const SpaceFullContainer = styled.View` - flex: 1; -`; diff --git a/src/components/text-field-area/index.tsx b/src/components/text-field-area/index.tsx deleted file mode 100644 index edb2fdb..0000000 --- a/src/components/text-field-area/index.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import React from 'react'; -import { useTranslation } from 'react-i18next'; - -import { themes } from '@/themes'; - -import { FieldArea } from './styles'; -import { TextFieldAreaProps } from './types'; - -export function TextFieldArea({ value, onChangeText }: TextFieldAreaProps) { - const { t } = useTranslation(); - const [isFocused, setIsFocused] = React.useState(false); - - return ( - setIsFocused(true)} - onBlur={() => setIsFocused(false)} - autoCapitalize="none" - autoCorrect={false} - multiline - scrollEnabled - blurOnSubmit={true} - cursorColor={themes.colors.white} - placeholderTextColor={themes.colors.light_grey} - returnKeyType="done" - style={{ textAlignVertical: 'top' }} - maxLength={150} - /> - ); -} diff --git a/src/components/text-field-area/styles.ts b/src/components/text-field-area/styles.ts deleted file mode 100644 index 6479acc..0000000 --- a/src/components/text-field-area/styles.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { - heightPercentageToDP as hp, - widthPercentageToDP as wp, -} from 'react-native-responsive-screen'; -import styled from 'styled-components/native'; - -import { useAppSettings } from '@/stores'; -import { themes } from '@/themes'; - -import { FieldAreaProps } from './types'; - -const { colors, spaces, font_sizes, border_radius, width } = themes; - -const { isTablet } = useAppSettings.getState(); - -export const FieldArea = styled.TextInput` - width: 100%; - max-width: ${width.max_width}; - align-self: center; - background-color: ${colors.black_000}; - border-radius: ${border_radius.radius_10}; - color: ${colors.white}; - font-size: ${wp(font_sizes.M)}px; - font-family: 'Inter-Regular'; - height: ${hp('15%')}px; - padding: ${spaces.space_10}; - ${({ isFocused }) => - isFocused && `border: ${isTablet ? '3px' : '1px'} solid ${colors.light_cyan};`} -`; diff --git a/src/components/text/functions/index.ts b/src/components/text/functions/index.ts deleted file mode 100644 index 6a1085e..0000000 --- a/src/components/text/functions/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { schemeText } from './scheme-text'; - -export { schemeText }; diff --git a/src/components/text/index.tsx b/src/components/text/index.tsx deleted file mode 100644 index 2e555ce..0000000 --- a/src/components/text/index.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import React from 'react'; -import { widthPercentageToDP as wp } from 'react-native-responsive-screen'; - -import { useAppSettings } from '@/stores'; -import { themes } from '@/themes'; - -import { schemeText } from './functions'; -import { TextContainer } from './styles'; -import { TextProps } from './types'; - -export function Text({ - children, - weight, - size, - color, - marginT, - marginB, - marginR, - marginL, -}: TextProps) { - const { isTablet } = useAppSettings(state => state); - - const { onFontFamily, onFontSize } = schemeText({ - weight: weight ?? 'regular', - size: size ?? 'S', - isTablet: isTablet, - }); - - return ( - - {children} - - ); -} diff --git a/src/components/text/styles.ts b/src/components/text/styles.ts deleted file mode 100644 index c623f05..0000000 --- a/src/components/text/styles.ts +++ /dev/null @@ -1,13 +0,0 @@ -import styled from 'styled-components/native'; - -import { TextContainerProps } from './types'; - -export const TextContainer = styled.Text` - font-size: ${({ fontSize }) => fontSize}px; - font-family: ${({ fontFamily }) => fontFamily}; - color: ${({ color }) => color}; - margin-top: ${({ marginT }) => marginT}; - margin-bottom: ${({ marginB }) => marginB}; - margin-right: ${({ marginR }) => marginR}; - margin-left: ${({ marginL }) => marginL}; -`; diff --git a/src/components/text/types.ts b/src/components/text/types.ts deleted file mode 100644 index 8fd8fb6..0000000 --- a/src/components/text/types.ts +++ /dev/null @@ -1,22 +0,0 @@ -import React from 'react'; - -export interface TextProps { - children: React.ReactNode; - weight?: 'regular' | 'medium' | 'bold'; - size?: 'XS' | 'S' | 'M' | 'L' | 'XL' | 'XXL' | 'XXXL'; - color?: string; - marginT?: string; - marginB?: string; - marginR?: string; - marginL?: string; -} - -export interface TextContainerProps { - fontFamily: 'Inter-Regular' | 'Inter-Medium' | 'Inter-Bold'; - fontSize: number; - color: string; - marginT: string; - marginB: string; - marginR: string; - marginL: string; -} diff --git a/src/components/title-subtitle/index.tsx b/src/components/title-subtitle/index.tsx deleted file mode 100644 index c192bf3..0000000 --- a/src/components/title-subtitle/index.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import React from 'react'; - -import { themes } from '@/themes'; - -import { SkeletonLoading } from '../skeleton-loading'; -import { Text } from '../text'; -import { LoadingContainer, TitleSubtitleContainer } from './styles'; -import { TitleSubtitleProps } from './types'; - -export function TitleSubtitle({ - title, - subTitle, - isLoading = false, - marginB, - marginT, -}: TitleSubtitleProps) { - return ( - - - {title} - - {isLoading && ( - - - - )} - {!isLoading && ( - - {subTitle} - - )} - - ); -} diff --git a/src/components/title-subtitle/styles.ts b/src/components/title-subtitle/styles.ts deleted file mode 100644 index e985d2b..0000000 --- a/src/components/title-subtitle/styles.ts +++ /dev/null @@ -1,12 +0,0 @@ -import styled from 'styled-components/native'; - -import { TitleSubtitleContainerProps } from './types'; - -export const TitleSubtitleContainer = styled.View` - margin-top: ${({ marginT }) => marginT}; - margin-bottom: ${({ marginB }) => marginB}; -`; - -export const LoadingContainer = styled.View` - width: 50%; -`; diff --git a/src/components/title-subtitle/types.ts b/src/components/title-subtitle/types.ts deleted file mode 100644 index 225e42b..0000000 --- a/src/components/title-subtitle/types.ts +++ /dev/null @@ -1,12 +0,0 @@ -export interface TitleSubtitleProps { - title: string; - subTitle: string; - isLoading?: boolean; - marginT?: string; - marginB?: string; -} - -export interface TitleSubtitleContainerProps { - marginT: string; - marginB: string; -} diff --git a/src/components/transaction-list/index.tsx b/src/components/transaction-list/index.tsx deleted file mode 100644 index 8821efb..0000000 --- a/src/components/transaction-list/index.tsx +++ /dev/null @@ -1,110 +0,0 @@ -import { NavigationProp, useNavigation } from '@react-navigation/native'; -import React from 'react'; -import { useTranslation } from 'react-i18next'; -import { heightPercentageToDP as hp } from 'react-native-responsive-screen'; - -import { IconArrowDown, IconArrowRight, IconArrowUp } from '@/assets'; -import { calculateBalance } from '@/functions'; -import { useFormatCurrency, useFormatDate } from '@/hooks'; -import { RootStackParamListProps } from '@/routes/types'; -import { useAppSettings, useBitcoinDataPrices, useUserData } from '@/stores'; -import { themes } from '@/themes'; - -import { SkeletonLoading } from '../skeleton-loading'; -import { Text } from '../text'; -import { - Center, - Circle, - Column, - Items, - TextContainer, - TransactionContainer, - TransactionItemContainer, - TransactionListContainer, -} from './styles'; - -export function TransactionList() { - const { t } = useTranslation(); - const { data, status } = useUserData(state => state.transactions); - const currency = useAppSettings(state => state.currency); - const navigation = useNavigation>(); - const currentPrice = useBitcoinDataPrices(state => state.data?.current_price); - - const SIZE_ICON_STATUS = hp('2.5%'); - const SIZE_ICON_ARROW = hp('2%'); - - return ( - - - {t('transactions')} - - - {(status === 'loading' || status === null) && ( - - )} - - {status === 'failed' && ( -
- - {t('request-error-try-later')} - -
- )} - - {data.length === 0 && status === 'success' && ( -
- - {t('you-dont-have-transactions')} - -
- )} - - - {data.length > 0 && - status === 'success' && - data.map((item, index) => { - if (item.transactionType === 'zero-transfer') return; - return ( - navigation.navigate('TransactionPage', { data: item })} - > - - {item.transactionType === 'incoming' && } - {item.transactionType === 'outgoing' && } - - - - - - {useFormatDate(new Date(item.timestamp * 1000)).date} - - - {item.transactionType === 'incoming' ? '+ ' : '- '} - {useFormatCurrency( - calculateBalance({ - balance: item.amount, - currentPrice: currentPrice?.[currency], - }), - )} - - - - - {useFormatDate(new Date(item.timestamp * 1000)).time} - - - {item.amount} BTC - - - - - - - ); - })} - -
- ); -} diff --git a/src/components/transaction-list/styles.ts b/src/components/transaction-list/styles.ts deleted file mode 100644 index fb47002..0000000 --- a/src/components/transaction-list/styles.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { heightPercentageToDP as hp } from 'react-native-responsive-screen'; -import styled from 'styled-components/native'; - -import { useAppSettings } from '@/stores'; -import { themes } from '@/themes'; - -import { ItemsProps } from './types'; - -const { colors, border_radius, spaces, width } = themes; - -const { isTablet } = useAppSettings.getState(); - -const PADDING_ITEM_TABLET = `${hp('3.5%')}px`; -const MARGIN_TOP_TRANSACTION = `${hp('5%')}px`; - -export const TransactionListContainer = styled.View` - margin-top: ${isTablet ? MARGIN_TOP_TRANSACTION : spaces.space_25}; - width: 100%; - max-width: ${width.max_width}; - align-self: center; -`; - -export const TransactionContainer = styled.View` - border-radius: ${border_radius.radius_10}; - background-color: ${colors.black_000}; -`; - -export const TransactionItemContainer = styled.TouchableOpacity` - flex: 1; - flex-direction: row; - padding-left: ${isTablet ? spaces.space_20 : spaces.space_10}; -`; - -export const Items = styled.View` - flex: 1; - flex-direction: row; - align-items: center; - padding-top: ${isTablet ? PADDING_ITEM_TABLET : spaces.space_25}; - padding-bottom: ${isTablet ? PADDING_ITEM_TABLET : spaces.space_25}; - padding-right: ${isTablet ? spaces.space_20 : spaces.space_10}; - border-bottom-width: 1px; - border-bottom-color: ${({ borderVisible }) => - borderVisible ? colors.dark_grey : colors.transparent}; - border-bottom-style: solid; -`; - -export const TextContainer = styled.View` - flex-direction: row; - justify-content: space-between; - align-items: center; -`; - -export const Circle = styled.View` - width: 50px; - justify-content: center; - align-items: center; - margin-right: ${isTablet ? spaces.space_20 : spaces.space_10}; -`; - -export const Center = styled.View` - width: 100%; - justify-content: center; - align-items: center; -`; - -export const Column = styled.View` - flex: 1; - margin-right: ${spaces.space_15}; -`; diff --git a/src/components/transaction-list/types.ts b/src/components/transaction-list/types.ts deleted file mode 100644 index cae3602..0000000 --- a/src/components/transaction-list/types.ts +++ /dev/null @@ -1,3 +0,0 @@ -export interface ItemsProps { - borderVisible: boolean; -} diff --git a/src/functions/calculate-balance/index.ts b/src/functions/calculateBalance.ts similarity index 65% rename from src/functions/calculate-balance/index.ts rename to src/functions/calculateBalance.ts index 68b285e..252c10d 100644 --- a/src/functions/calculate-balance/index.ts +++ b/src/functions/calculateBalance.ts @@ -1,4 +1,4 @@ -import { CalculateBalanceProps } from './types'; +import { CalculateBalanceProps } from '@/types/CalculateBalanceType'; export function calculateBalance({ balance, currentPrice }: CalculateBalanceProps) { return Number(balance) * (currentPrice ?? 0); diff --git a/src/pages/bitcoin-data-page/functions/currencies-formatted/index.ts b/src/functions/currenciesFormatted.ts similarity index 82% rename from src/pages/bitcoin-data-page/functions/currencies-formatted/index.ts rename to src/functions/currenciesFormatted.ts index cc036d5..5842800 100644 --- a/src/pages/bitcoin-data-page/functions/currencies-formatted/index.ts +++ b/src/functions/currenciesFormatted.ts @@ -1,6 +1,5 @@ -import { useFormatCurrency } from '@/hooks'; - -import { CurrenciesFormattedProps } from './types'; +import { useFormatCurrency } from '@/hooks/useFormatCurrency'; +import { CurrenciesFormattedProps } from '@/types/CurrenciesFormattedType'; export function currenciesFormatted({ data, currency }: CurrenciesFormattedProps) { return { diff --git a/src/functions/index.ts b/src/functions/index.ts deleted file mode 100644 index 0d8b975..0000000 --- a/src/functions/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { calculateBalance } from './calculate-balance'; -import { initializeAppSettings } from './initialize-app-settings'; - -export { calculateBalance, initializeAppSettings }; diff --git a/src/functions/initialize-app-settings/index.ts b/src/functions/initializeAppSettings.ts similarity index 87% rename from src/functions/initialize-app-settings/index.ts rename to src/functions/initializeAppSettings.ts index b0d95dc..416ca96 100644 --- a/src/functions/initialize-app-settings/index.ts +++ b/src/functions/initializeAppSettings.ts @@ -1,9 +1,9 @@ import AsyncStorage from '@react-native-async-storage/async-storage'; import { getLocales } from 'expo-localization'; -import { storageKeys } from '@/helpers'; -import { useAppSettings } from '@/stores'; -import { UseAppSettingsProps } from '@/stores/use-app-settings/types'; +import { storageKeys } from '@/helpers/storageKeys'; +import { useAppSettings } from '@/stores/useAppSettings'; +import { UseAppSettingsProps } from '@/types/UseAppSettingsType'; export async function initializeAppSettings() { const { setCurrency, setLanguage, setIsTablet } = useAppSettings.getState(); diff --git a/src/components/text/functions/scheme-text/index.ts b/src/functions/schemeText.ts similarity index 83% rename from src/components/text/functions/scheme-text/index.ts rename to src/functions/schemeText.ts index 8f7e39b..e1771d8 100644 --- a/src/components/text/functions/scheme-text/index.ts +++ b/src/functions/schemeText.ts @@ -1,4 +1,4 @@ -import { SchemeTextProps } from './types'; +import { SchemeTextProps } from '@/types/SchemeTextType'; export function schemeText({ weight, size, isTablet }: SchemeTextProps) { function onFontFamily() { @@ -16,24 +16,24 @@ export function schemeText({ weight, size, isTablet }: SchemeTextProps) { function onFontSize() { switch (size) { - case 'XS': + case 'xs': return '2.5%'; - case 'S': + case 's': if (isTablet) return '2.5%'; return '3%'; - case 'M': + case 'm': if (isTablet) return '3%'; return '3.4%'; - case 'L': + case 'l': if (isTablet) return '3.4%'; return '4.5%'; - case 'XL': + case 'xl': if (isTablet) return '4.5%'; return '5.5%'; - case 'XXL': + case 'xxl': if (isTablet) return '5.5%'; return '6.5%'; - case 'XXXL': + case 'xxxl': if (isTablet) return '6.5%'; return '10%'; default: diff --git a/src/helpers/index.ts b/src/helpers/index.ts deleted file mode 100644 index 7f76f03..0000000 --- a/src/helpers/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { storageKeys } from './storage-keys'; - -export { storageKeys }; diff --git a/src/helpers/storage-keys/index.ts b/src/helpers/storageKeys.ts similarity index 100% rename from src/helpers/storage-keys/index.ts rename to src/helpers/storageKeys.ts diff --git a/src/helpers/themes.ts b/src/helpers/themes.ts new file mode 100644 index 0000000..a732665 --- /dev/null +++ b/src/helpers/themes.ts @@ -0,0 +1,42 @@ +export const width = { + max_width: 800, +}; + +export const borderRadius = { + radius_5: 5, + radius_10: 10, + radius_15: 15, +}; + +export const spaces = { + space_5: 5, + space_10: 10, + space_15: 15, + space_20: 20, + space_25: 25, + space_30: 30, +}; + +export const fontSizes = { + xs: '3%', + s: '3.6%', + m: '4%', + l: '4.5%', + xl: '5%', + xxl: '6.5%', + xxxl: '7.6%', +}; + +export const colors = { + white: '#FFFFFF', + green: '#ACD9A8', + red: '#E17C7C', + light_cyan: '#B4C9FF', + dark_cyan: '#3E4454', + black_100: '#191B1F', + black_000: '#222329', + light_grey: '#BFBFBF', + dark_grey: '#616670', + black_100_50pct: 'rgba(25, 27, 31, 0.50)', + transparent: 'transparent', +}; diff --git a/src/hooks/index.ts b/src/hooks/index.ts deleted file mode 100644 index 4d55809..0000000 --- a/src/hooks/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { useFormatCurrency } from './use-format-currency'; -import { useFormatDate } from './use-format-date'; -import { useFormatPercentage } from './use-format-percentage'; - -export { useFormatCurrency, useFormatDate, useFormatPercentage }; diff --git a/src/hooks/use-format-currency/index.ts b/src/hooks/useFormatCurrency.ts similarity index 91% rename from src/hooks/use-format-currency/index.ts rename to src/hooks/useFormatCurrency.ts index a637e37..3435f95 100644 --- a/src/hooks/use-format-currency/index.ts +++ b/src/hooks/useFormatCurrency.ts @@ -1,6 +1,6 @@ import currencyJS from 'currency.js'; -import { useAppSettings } from '@/stores'; +import { useAppSettings } from '@/stores/useAppSettings'; export function useFormatCurrency(value?: number) { const { currency } = useAppSettings.getState(); diff --git a/src/hooks/use-format-date/index.ts b/src/hooks/useFormatDate.ts similarity index 88% rename from src/hooks/use-format-date/index.ts rename to src/hooks/useFormatDate.ts index 0405e82..4d0f6ae 100644 --- a/src/hooks/use-format-date/index.ts +++ b/src/hooks/useFormatDate.ts @@ -5,7 +5,7 @@ import 'moment/locale/de'; import moment from 'moment'; -import { useAppSettings } from '@/stores'; +import { useAppSettings } from '@/stores/useAppSettings'; export function useFormatDate(date: Date) { const { language } = useAppSettings.getState(); diff --git a/src/hooks/use-format-percentage/index.ts b/src/hooks/useFormatPercentage.ts similarity index 100% rename from src/hooks/use-format-percentage/index.ts rename to src/hooks/useFormatPercentage.ts diff --git a/src/pages/bitcoin-data-page/index.tsx b/src/pages/BitcoinDataPage.tsx similarity index 68% rename from src/pages/bitcoin-data-page/index.tsx rename to src/pages/BitcoinDataPage.tsx index cb6c2b7..4247e9f 100644 --- a/src/pages/bitcoin-data-page/index.tsx +++ b/src/pages/BitcoinDataPage.tsx @@ -1,21 +1,24 @@ import React from 'react'; import { useTranslation } from 'react-i18next'; +import { StyleSheet, View } from 'react-native'; import { heightPercentageToDP as hp } from 'react-native-responsive-screen'; -import { ChartBitcoin, PriceBitcoin, ScrollViewHeader, TitleSubtitle } from '@/components'; -import { useFormatPercentage } from '@/hooks'; -import { useAppSettings, useBitcoinDataPrices } from '@/stores'; -import { themes } from '@/themes'; - -import { currenciesFormatted } from './functions'; -import { PaddingContainer } from './styles'; +import { ChartBitcoin } from '@/components/ChartBitcoin'; +import { PriceBitcoin } from '@/components/PriceBitcoin'; +import { ScrollViewHeader } from '@/components/ScrollViewHeader'; +import { TitleSubtitle } from '@/components/TitleSubtitle'; +import { currenciesFormatted } from '@/functions/currenciesFormatted'; +import { spaces, width } from '@/helpers/themes'; +import { useFormatPercentage } from '@/hooks/useFormatPercentage'; +import { useAppSettings } from '@/stores/useAppSettings'; +import { useBitcoinDataPrices } from '@/stores/useBitcoinDataPrices'; export function BitcoinDataPage() { const { t } = useTranslation(); const { data, status } = useBitcoinDataPrices(state => state); const { currency, isTablet } = useAppSettings(state => state); - const MARGIN_TOP = isTablet ? `${hp('3.5%')}px` : themes.spaces.space_25; + const MARGIN_TOP = isTablet ? hp('3.5%') : spaces.space_25; const isLoading = status === 'loading' || status === null; const { percent, isPositive } = useFormatPercentage( @@ -34,7 +37,7 @@ export function BitcoinDataPage() { return ( - + - + - + - + ); } + +const styles = StyleSheet.create({ + padding: { + paddingHorizontal: spaces.space_15, + maxWidth: width.max_width, + width: '100%', + alignSelf: 'center', + }, +}); diff --git a/src/pages/currency-page/index.tsx b/src/pages/CurrencyPage.tsx similarity index 74% rename from src/pages/currency-page/index.tsx rename to src/pages/CurrencyPage.tsx index f5a7cf4..e3214ec 100644 --- a/src/pages/currency-page/index.tsx +++ b/src/pages/CurrencyPage.tsx @@ -1,9 +1,11 @@ import React from 'react'; import { useTranslation } from 'react-i18next'; -import { HeaderSwiperOptions, ScrollView, SelectList } from '@/components'; -import { useAppSettings } from '@/stores'; -import { UseAppSettingsProps } from '@/stores/use-app-settings/types'; +import { HeaderSwiperOptions } from '@/components/HeaderSwiperOptions'; +import { ScrollView } from '@/components/ScrollView'; +import { SelectList } from '@/components/SelectList'; +import { useAppSettings } from '@/stores/useAppSettings'; +import { UseAppSettingsProps } from '@/types/UseAppSettingsType'; export function CurrencyPage() { const { t } = useTranslation(); diff --git a/src/pages/home-page/index.tsx b/src/pages/HomePage.tsx similarity index 58% rename from src/pages/home-page/index.tsx rename to src/pages/HomePage.tsx index f694e69..14a78f3 100644 --- a/src/pages/home-page/index.tsx +++ b/src/pages/HomePage.tsx @@ -1,13 +1,17 @@ import React from 'react'; import { useTranslation } from 'react-i18next'; -import { LimitedWidthContainer, ScrollViewHeader, TransactionList } from '@/components'; -import { calculateBalance } from '@/functions'; -import { useFormatCurrency } from '@/hooks'; -import { getBitcoinBalance } from '@/services'; -import { useAppSettings, useBitcoinDataPrices, useUserData } from '@/stores'; +import { LimitedWidthContainer } from '@/components/LimitedWidthContainer'; +import { ScrollViewHeader } from '@/components/ScrollViewHeader'; +import { TransactionList } from '@/components/TransactionList'; +import { calculateBalance } from '@/functions/calculateBalance'; +import { useFormatCurrency } from '@/hooks/useFormatCurrency'; +import { getBitcoinBalance } from '@/services/getBitcoinBalance'; +import { useAppSettings } from '@/stores/useAppSettings'; +import { useBitcoinDataPrices } from '@/stores/useBitcoinDataPrices'; +import { useUserData } from '@/stores/useUserData'; -import { CryptoCardLarge } from './components/crypto-card-large'; +import { CryptoCardLarge } from './fragments/CryptoCardLarge'; export function HomePage() { const { t } = useTranslation(); diff --git a/src/pages/language-page/index.tsx b/src/pages/LanguagePage.tsx similarity index 70% rename from src/pages/language-page/index.tsx rename to src/pages/LanguagePage.tsx index cf7ffd6..4c17c7d 100644 --- a/src/pages/language-page/index.tsx +++ b/src/pages/LanguagePage.tsx @@ -1,9 +1,12 @@ import React from 'react'; import { useTranslation } from 'react-i18next'; -import { HeaderSwiperOptions, LimitedWidthContainer, ScrollView, SelectList } from '@/components'; -import { useAppSettings } from '@/stores'; -import { UseAppSettingsProps } from '@/stores/use-app-settings/types'; +import { HeaderSwiperOptions } from '@/components/HeaderSwiperOptions'; +import { LimitedWidthContainer } from '@/components/LimitedWidthContainer'; +import { ScrollView } from '@/components/ScrollView'; +import { SelectList } from '@/components/SelectList'; +import { useAppSettings } from '@/stores/useAppSettings'; +import { UseAppSettingsProps } from '@/types/UseAppSettingsType'; export function LanguagePage() { const { t } = useTranslation(); diff --git a/src/pages/links-page/index.tsx b/src/pages/LinksPage.tsx similarity index 86% rename from src/pages/links-page/index.tsx rename to src/pages/LinksPage.tsx index 4b68d00..16704ae 100644 --- a/src/pages/links-page/index.tsx +++ b/src/pages/LinksPage.tsx @@ -3,7 +3,8 @@ import React from 'react'; import { heightPercentageToDP as hp } from 'react-native-responsive-screen'; import { IconGithub, IconTwitter } from '@/assets'; -import { ActionList, ScrollView } from '@/components'; +import { ActionList } from '@/components/ActionList'; +import { ScrollView } from '@/components/ScrollView'; export function LinksPage() { const list = [ diff --git a/src/pages/local-auth-page/index.tsx b/src/pages/LocalAuthPage.tsx similarity index 73% rename from src/pages/local-auth-page/index.tsx rename to src/pages/LocalAuthPage.tsx index 9ee68f9..1f0ea41 100644 --- a/src/pages/local-auth-page/index.tsx +++ b/src/pages/LocalAuthPage.tsx @@ -5,16 +5,15 @@ import * as SecureStore from 'expo-secure-store'; import { setStatusBarBackgroundColor } from 'expo-status-bar'; import React from 'react'; import { useTranslation } from 'react-i18next'; -import { Platform } from 'react-native'; +import { Platform, StyleSheet, View } from 'react-native'; -import { ButtonTitleShape } from '@/components'; -import { storageKeys } from '@/helpers'; -import { RootStackParamListProps } from '@/routes/types'; -import { getBitcoinBalance } from '@/services'; -import { useBitcoinDataPrices, useUserData } from '@/stores'; -import { themes } from '@/themes'; - -import { LocalAuthPageContainer } from './styles'; +import { ButtonTitleShape } from '@/components/ButtonTitleShape'; +import { storageKeys } from '@/helpers/storageKeys'; +import { colors } from '@/helpers/themes'; +import { getBitcoinBalance } from '@/services/getBitcoinBalance'; +import { useBitcoinDataPrices } from '@/stores/useBitcoinDataPrices'; +import { useUserData } from '@/stores/useUserData'; +import { RootStackParamListProps } from '@/types/RoutesType'; export function LocalAuthPage() { const navigation = useNavigation>(); @@ -78,15 +77,24 @@ export function LocalAuthPage() { }, []); React.useEffect(() => { - if (Platform.OS === 'android') setStatusBarBackgroundColor(themes.colors.black_100, true); + if (Platform.OS === 'android') setStatusBarBackgroundColor(colors.black_100, true); return () => { - if (Platform.OS === 'android') setStatusBarBackgroundColor(themes.colors.black_000, true); + if (Platform.OS === 'android') setStatusBarBackgroundColor(colors.black_000, true); }; }, []); return ( - + - + ); } + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: colors.black_100, + alignItems: 'center', + justifyContent: 'center', + }, +}); diff --git a/src/pages/public-key-page/index.tsx b/src/pages/PublicKeyPage.tsx similarity index 73% rename from src/pages/public-key-page/index.tsx rename to src/pages/PublicKeyPage.tsx index f52ae3f..c196a75 100644 --- a/src/pages/public-key-page/index.tsx +++ b/src/pages/PublicKeyPage.tsx @@ -2,12 +2,14 @@ import * as Clipboard from 'expo-clipboard'; import React from 'react'; import { useTranslation } from 'react-i18next'; -import { ButtonTitleGhost, LimitedWidthContainer, ScrollView, TitleSubtitle } from '@/components'; -import { useUserData } from '@/stores'; -import { themes } from '@/themes'; +import { ButtonTitleGhost } from '@/components/ButtonTitleGhost'; +import { LimitedWidthContainer } from '@/components/LimitedWidthContainer'; +import { ScrollView } from '@/components/ScrollView'; +import { TitleSubtitle } from '@/components/TitleSubtitle'; +import { spaces } from '@/helpers/themes'; +import { useUserData } from '@/stores/useUserData'; export function PublicKeyPage() { - const { spaces } = themes; const { t } = useTranslation(); const { key } = useUserData(state => state); const [copy, setCopy] = React.useState({ isLoading: false, isCopied: false }); diff --git a/src/pages/register-key-page/index.tsx b/src/pages/RegisterKeyPage.tsx similarity index 71% rename from src/pages/register-key-page/index.tsx rename to src/pages/RegisterKeyPage.tsx index 09ec84c..2c72b0a 100644 --- a/src/pages/register-key-page/index.tsx +++ b/src/pages/RegisterKeyPage.tsx @@ -4,22 +4,19 @@ import * as LocalAuthentication from 'expo-local-authentication'; import * as SecureStore from 'expo-secure-store'; import React from 'react'; import { useTranslation } from 'react-i18next'; +import { StyleSheet, View } from 'react-native'; -import { - ButtonTitleGhost, - CheckBoxMessage, - ScrollViewHeader, - SpaceFull, - Text, - TextFieldArea, -} from '@/components'; -import { storageKeys } from '@/helpers'; -import { RootStackParamListProps } from '@/routes/types'; -import { getBitcoinBalance } from '@/services'; -import { useBitcoinDataPrices, useUserData } from '@/stores'; -import { themes } from '@/themes'; - -import { TextErrorContainer } from './styles'; +import { ButtonTitleGhost } from '@/components/ButtonTitleGhost'; +import { CheckBoxMessage } from '@/components/CheckBoxMessage'; +import { ScrollViewHeader } from '@/components/ScrollViewHeader'; +import { Text } from '@/components/Text'; +import { TextFieldArea } from '@/components/TextFieldArea'; +import { storageKeys } from '@/helpers/storageKeys'; +import { colors, spaces, width } from '@/helpers/themes'; +import { getBitcoinBalance } from '@/services/getBitcoinBalance'; +import { useBitcoinDataPrices } from '@/stores/useBitcoinDataPrices'; +import { useUserData } from '@/stores/useUserData'; +import { RootStackParamListProps } from '@/types/RoutesType'; export function RegisterKeyPage() { const { t } = useTranslation(); @@ -74,11 +71,11 @@ export function RegisterKeyPage() { {error.visible && ( - - + + {error.message} - + )} {showBiometricOption && ( )} - + ); } + +const styles = StyleSheet.create({ + textErrorContainer: { + width: '100%', + maxWidth: width.max_width, + alignSelf: 'center', + }, + space: { + flex: 1, + }, +}); diff --git a/src/pages/settings-page/index.tsx b/src/pages/SettingsPage.tsx similarity index 77% rename from src/pages/settings-page/index.tsx rename to src/pages/SettingsPage.tsx index 59e9846..3b7b2e0 100644 --- a/src/pages/settings-page/index.tsx +++ b/src/pages/SettingsPage.tsx @@ -5,18 +5,16 @@ import * as SecureStore from 'expo-secure-store'; import React from 'react'; import { useTranslation } from 'react-i18next'; -import { - ActionList, - AlertModal, - LimitedWidthContainer, - ScrollViewHeader, - Text, -} from '@/components'; -import { initializeAppSettings } from '@/functions'; -import { storageKeys } from '@/helpers'; -import { RootStackParamListProps } from '@/routes/types'; -import { useUserData } from '@/stores'; -import { themes } from '@/themes'; +import { ActionList } from '@/components/ActionList'; +import { AlertModal } from '@/components/AlertModal'; +import { LimitedWidthContainer } from '@/components/LimitedWidthContainer'; +import { ScrollViewHeader } from '@/components/ScrollViewHeader'; +import { Text } from '@/components/Text'; +import { initializeAppSettings } from '@/functions/initializeAppSettings'; +import { storageKeys } from '@/helpers/storageKeys'; +import { spaces } from '@/helpers/themes'; +import { useUserData } from '@/stores/useUserData'; +import { RootStackParamListProps } from '@/types/RoutesType'; export function SettingsPage() { const { t } = useTranslation(); @@ -75,7 +73,7 @@ export function SettingsPage() { - + v {Constants.expoConfig?.version != null ? Constants.expoConfig.version : '-'} diff --git a/src/pages/support-us-page/index.tsx b/src/pages/SupportUsPage.tsx similarity index 75% rename from src/pages/support-us-page/index.tsx rename to src/pages/SupportUsPage.tsx index 4874251..b781012 100644 --- a/src/pages/support-us-page/index.tsx +++ b/src/pages/SupportUsPage.tsx @@ -2,17 +2,14 @@ import * as Clipboard from 'expo-clipboard'; import React from 'react'; import { useTranslation } from 'react-i18next'; -import { - ButtonTitleGhost, - LimitedWidthContainer, - ScrollView, - Text, - TitleSubtitle, -} from '@/components'; -import { themes } from '@/themes'; +import { ButtonTitleGhost } from '@/components/ButtonTitleGhost'; +import { LimitedWidthContainer } from '@/components/LimitedWidthContainer'; +import { ScrollView } from '@/components/ScrollView'; +import { Text } from '@/components/Text'; +import { TitleSubtitle } from '@/components/TitleSubtitle'; +import { spaces } from '@/helpers/themes'; export function SupportUsPage() { - const { spaces } = themes; const { t } = useTranslation(); const [copy, setCopy] = React.useState({ isLoading: false, isCopied: false }); diff --git a/src/pages/terms-page/index.tsx b/src/pages/TermsPage.tsx similarity index 60% rename from src/pages/terms-page/index.tsx rename to src/pages/TermsPage.tsx index c740dda..f2862da 100644 --- a/src/pages/terms-page/index.tsx +++ b/src/pages/TermsPage.tsx @@ -1,36 +1,36 @@ import React from 'react'; -import { LimitedWidthContainer, ScrollView, Text } from '@/components'; -import { themes } from '@/themes'; +import { LimitedWidthContainer } from '@/components/LimitedWidthContainer'; +import { ScrollView } from '@/components/ScrollView'; +import { Text } from '@/components/Text'; +import { colors, spaces } from '@/helpers/themes'; export function TermsPage() { - const { spaces, colors } = themes; - return ( - + 1 - Security - + 1.1 - We do not store your public keys in databases, they are encrypted and stored on your device; - + 1.2 - All information we collect is stored only on your device, we do not store it in databases. - + 2 - What we collect from you - + 2.1 - We only collect the country in which you are accessing so that we know precisely which language and currency to select. - + 3 - How we share your information - + 3.1 - We only share your public key with the {'"tatum.com"'} library so that we can collect your balance information and transactions on the blockchain. diff --git a/src/pages/transaction-page/index.tsx b/src/pages/TransactionPage.tsx similarity index 70% rename from src/pages/transaction-page/index.tsx rename to src/pages/TransactionPage.tsx index 5868ed6..0a081a3 100644 --- a/src/pages/transaction-page/index.tsx +++ b/src/pages/TransactionPage.tsx @@ -3,23 +3,24 @@ import React from 'react'; import { useTranslation } from 'react-i18next'; import { heightPercentageToDP as hp } from 'react-native-responsive-screen'; -import { LimitedWidthContainer, ScrollView, TitleSubtitle } from '@/components'; -import { useFormatDate } from '@/hooks'; -import { RootStackParamListProps } from '@/routes/types'; -import { useAppSettings } from '@/stores'; -import { themes } from '@/themes'; +import { LimitedWidthContainer } from '@/components/LimitedWidthContainer'; +import { ScrollView } from '@/components/ScrollView'; +import { TitleSubtitle } from '@/components/TitleSubtitle'; +import { spaces } from '@/helpers/themes'; +import { useFormatDate } from '@/hooks/useFormatDate'; +import { useAppSettings } from '@/stores/useAppSettings'; +import { RootStackParamListProps } from '@/types/RoutesType'; export function TransactionPage() { const { params: { data }, } = useRoute>(); - const { spaces } = themes; const { isTablet } = useAppSettings(state => state); const { t } = useTranslation(); const time = useFormatDate(new Date(data.timestamp * 1000)); - const MARGIN_BOTTOM = isTablet ? `${hp('3.5%')}px` : spaces.space_25; + const MARGIN_BOTTOM = isTablet ? hp('3.5%') : spaces.space_25; const transactionsData = [ { diff --git a/src/pages/bitcoin-data-page/functions/currencies-formatted/types.ts b/src/pages/bitcoin-data-page/functions/currencies-formatted/types.ts deleted file mode 100644 index 497128b..0000000 --- a/src/pages/bitcoin-data-page/functions/currencies-formatted/types.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { UseAppSettingsProps } from '@/stores/use-app-settings/types'; -import { UseBitcoinDataPricesProps } from '@/stores/use-bitcoin-data-prices/types'; - -export interface CurrenciesFormattedProps { - data: UseBitcoinDataPricesProps['data']; - currency: UseAppSettingsProps['currency']; -} diff --git a/src/pages/bitcoin-data-page/functions/index.ts b/src/pages/bitcoin-data-page/functions/index.ts deleted file mode 100644 index a5fd0fc..0000000 --- a/src/pages/bitcoin-data-page/functions/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { currenciesFormatted } from './currencies-formatted'; - -export { currenciesFormatted }; diff --git a/src/pages/bitcoin-data-page/styles.ts b/src/pages/bitcoin-data-page/styles.ts deleted file mode 100644 index 5167601..0000000 --- a/src/pages/bitcoin-data-page/styles.ts +++ /dev/null @@ -1,10 +0,0 @@ -import styled from 'styled-components/native'; - -import { themes } from '@/themes'; - -export const PaddingContainer = styled.View` - padding: 0 ${themes.spaces.space_15}; - max-width: ${themes.width.max_width}; - width: 100%; - align-self: center; -`; diff --git a/src/pages/fragments/CryptoCardLarge.tsx b/src/pages/fragments/CryptoCardLarge.tsx new file mode 100644 index 0000000..354c1fa --- /dev/null +++ b/src/pages/fragments/CryptoCardLarge.tsx @@ -0,0 +1,72 @@ +import React from 'react'; +import { useTranslation } from 'react-i18next'; +import { StyleSheet, View } from 'react-native'; +import { heightPercentageToDP as hp } from 'react-native-responsive-screen'; + +import { IconBitcoin, IconCardano } from '@/assets'; +import { SkeletonLoading } from '@/components/SkeletonLoading'; +import { Text } from '@/components/Text'; +import { borderRadius, colors, spaces } from '@/helpers/themes'; +import { useAppSettings } from '@/stores/useAppSettings'; +import { CryptoCardLargeProps } from '@/types/CryptoCardLargeType'; + +export function CryptoCardLarge({ type, price, balance, status }: CryptoCardLargeProps) { + const { t } = useTranslation(); + const { isTablet } = useAppSettings.getState(); + + return ( + + + {type === 'bitcoin' && } + {type === 'cardano' && } + + {type === 'bitcoin' && 'Bitcoin'} + {type === 'cardano' && 'Cardano'} + + + + {status === 'success' && ( + + {price.substring(0, price.length - 2)} + + {price.substring(price.length - 2, price.length)} + + + )} + {status === 'failed' && ( + + {t('request-error-try-later')} + + )} + {(status === 'loading' || status === null) && ( + + )} + + {balance} {type === 'bitcoin' ? 'BTC' : 'ADA'} + + + + ); +} + +const styles = StyleSheet.create({ + container: { + width: 'auto', + height: hp('28%'), + maxHeight: 450, + borderRadius: borderRadius.radius_10, + padding: spaces.space_15, + backgroundColor: colors.black_000, + position: 'relative', + }, + row: { + flexDirection: 'row', + alignItems: 'center', + }, + priceContainer: { + position: 'absolute', + paddingLeft: spaces.space_15, + justifyContent: 'center', + height: hp('28%'), + }, +}); diff --git a/src/pages/home-page/components/crypto-card-large/index.tsx b/src/pages/home-page/components/crypto-card-large/index.tsx deleted file mode 100644 index 2843c55..0000000 --- a/src/pages/home-page/components/crypto-card-large/index.tsx +++ /dev/null @@ -1,50 +0,0 @@ -import React from 'react'; -import { useTranslation } from 'react-i18next'; -import { heightPercentageToDP as hp } from 'react-native-responsive-screen'; - -import { IconBitcoin, IconCardano } from '@/assets'; -import { SkeletonLoading, Text } from '@/components'; -import { useAppSettings } from '@/stores'; -import { themes } from '@/themes'; - -import { CryptoCardLargeContainer, PriceContainer, Row } from './styles'; -import { CryptoCardLargeProps } from './types'; - -export function CryptoCardLarge({ type, price, balance, status }: CryptoCardLargeProps) { - const { t } = useTranslation(); - const { isTablet } = useAppSettings.getState(); - - return ( - - - {type === 'bitcoin' && } - {type === 'cardano' && } - - {type === 'bitcoin' && 'Bitcoin'} - {type === 'cardano' && 'Cardano'} - - - - {status === 'success' && ( - - {price.substring(0, price.length - 2)} - - {price.substring(price.length - 2, price.length)} - - - )} - {status === 'failed' && ( - - {t('request-error-try-later')} - - )} - {(status === 'loading' || status === null) && ( - - )} - - {balance} {type === 'bitcoin' ? 'BTC' : 'ADA'} - - - - ); -} diff --git a/src/pages/home-page/components/crypto-card-large/styles.ts b/src/pages/home-page/components/crypto-card-large/styles.ts deleted file mode 100644 index fdebbd2..0000000 --- a/src/pages/home-page/components/crypto-card-large/styles.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { heightPercentageToDP as hp } from 'react-native-responsive-screen'; -import styled from 'styled-components/native'; - -import { themes } from '@/themes'; - -const { colors, border_radius, spaces } = themes; - -export const CryptoCardLargeContainer = styled.View` - width: auto; - height: ${hp('28%')}px; - max-height: 450px; - border-radius: ${border_radius.radius_10}; - padding: ${spaces.space_15}; - background-color: ${colors.black_000}; - position: relative; -`; - -export const Row = styled.View` - flex-direction: row; - align-items: center; -`; - -export const PriceContainer = styled.View` - position: absolute; - padding-left: ${spaces.space_15}; - justify-content: center; - height: ${hp('28%')}px; -`; diff --git a/src/pages/local-auth-page/styles.ts b/src/pages/local-auth-page/styles.ts deleted file mode 100644 index 7b37d77..0000000 --- a/src/pages/local-auth-page/styles.ts +++ /dev/null @@ -1,10 +0,0 @@ -import styled from 'styled-components/native'; - -import { themes } from '@/themes'; - -export const LocalAuthPageContainer = styled.View` - flex: 1; - background-color: ${themes.colors.black_100}; - align-items: center; - justify-content: center; -`; diff --git a/src/pages/register-key-page/styles.ts b/src/pages/register-key-page/styles.ts deleted file mode 100644 index 2a60c56..0000000 --- a/src/pages/register-key-page/styles.ts +++ /dev/null @@ -1,9 +0,0 @@ -import styled from 'styled-components/native'; - -import { themes } from '@/themes'; - -export const TextErrorContainer = styled.View` - width: 100%; - max-width: ${themes.width.max_width}; - align-self: center; -`; diff --git a/src/pages/transaction-page/types.ts b/src/pages/transaction-page/types.ts deleted file mode 100644 index bd05894..0000000 --- a/src/pages/transaction-page/types.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { AddressTransaction } from '@tatumio/tatum'; - -export interface TransactionPageProps { - data: AddressTransaction; -} diff --git a/src/routes/index.tsx b/src/routes/RootStack.tsx similarity index 73% rename from src/routes/index.tsx rename to src/routes/RootStack.tsx index f5974c2..4e1f442 100644 --- a/src/routes/index.tsx +++ b/src/routes/RootStack.tsx @@ -4,22 +4,23 @@ import React from 'react'; import { useTranslation } from 'react-i18next'; import { Animated } from 'react-native'; -import { BitcoinDataPage } from '@/pages/bitcoin-data-page'; -import { CurrencyPage } from '@/pages/currency-page'; -import { HomePage } from '@/pages/home-page'; -import { LanguagePage } from '@/pages/language-page'; -import { LinksPage } from '@/pages/links-page'; -import { LocalAuthPage } from '@/pages/local-auth-page'; -import { PublicKeyPage } from '@/pages/public-key-page'; -import { RegisterKeyPage } from '@/pages/register-key-page'; -import { SettingsPage } from '@/pages/settings-page'; -import { SupportUsPage } from '@/pages/support-us-page'; -import { TermsPage } from '@/pages/terms-page'; -import { TransactionPage } from '@/pages/transaction-page'; -import { themes } from '@/themes'; +import { colors } from '@/helpers/themes'; +import { BitcoinDataPage } from '@/pages/BitcoinDataPage'; +import { CurrencyPage } from '@/pages/CurrencyPage'; +import { HomePage } from '@/pages/HomePage'; +import { LanguagePage } from '@/pages/LanguagePage'; +import { LinksPage } from '@/pages/LinksPage'; +import { LocalAuthPage } from '@/pages/LocalAuthPage'; +import { PublicKeyPage } from '@/pages/PublicKeyPage'; +import { RegisterKeyPage } from '@/pages/RegisterKeyPage'; +import { SettingsPage } from '@/pages/SettingsPage'; +import { SupportUsPage } from '@/pages/SupportUsPage'; +import { TermsPage } from '@/pages/TermsPage'; +import { TransactionPage } from '@/pages/TransactionPage'; +import { RootStackParamListProps } from '@/types/RoutesType'; -import { HeaderSwiperIndicator, TabBar } from './components'; -import { RootStackParamListProps } from './types'; +import { HeaderSwiperIndicator } from './fragments/HeaderSwiperIndicator'; +import { TabBar } from './fragments/TabBar'; const Stack = createStackNavigator(); const Tab = createBottomTabNavigator(); @@ -36,7 +37,7 @@ fixAnimateToIOS.addListener(() => { return; }); -export function Routes() { +export function RootStack() { const { t } = useTranslation(); return ( @@ -44,7 +45,7 @@ export function Routes() { initialRouteName="LocalAuthPage" screenOptions={{ headerShown: false, - cardStyle: { backgroundColor: themes.colors.black_100 }, + cardStyle: { backgroundColor: colors.black_100 }, }} > @@ -118,7 +119,7 @@ function TabsRoutes() { ( )} diff --git a/src/routes/components/header-swiper-indicator/index.spec.tsx b/src/routes/__test__/HeaderSwiperIndicator.spec.tsx similarity index 84% rename from src/routes/components/header-swiper-indicator/index.spec.tsx rename to src/routes/__test__/HeaderSwiperIndicator.spec.tsx index 4f72447..4553629 100644 --- a/src/routes/components/header-swiper-indicator/index.spec.tsx +++ b/src/routes/__test__/HeaderSwiperIndicator.spec.tsx @@ -1,7 +1,7 @@ import { render } from '@testing-library/react-native'; import React from 'react'; -import { HeaderSwiperIndicator } from '@/routes/components'; +import { HeaderSwiperIndicator } from '../fragments/HeaderSwiperIndicator'; test('Render component', () => { const configTest = { diff --git a/src/routes/components/tab-bar/index.spec.tsx b/src/routes/__test__/TabBar.spec.tsx similarity index 85% rename from src/routes/components/tab-bar/index.spec.tsx rename to src/routes/__test__/TabBar.spec.tsx index 6ee12fb..5347de7 100644 --- a/src/routes/components/tab-bar/index.spec.tsx +++ b/src/routes/__test__/TabBar.spec.tsx @@ -5,8 +5,9 @@ import { import { NavigationHelpers, ParamListBase, TabNavigationState } from '@react-navigation/native'; import { render } from '@testing-library/react-native'; import React from 'react'; +import { SafeAreaProvider } from 'react-native-safe-area-context'; -import { TabBar } from '@/routes/components'; +import { TabBar } from '../fragments/TabBar'; test('Render component', () => { const configTest = { @@ -49,11 +50,13 @@ test('Render component', () => { }; const { getByTestId } = render( - , + + + , ); expect(getByTestId(configTest.id)).toBeTruthy(); diff --git a/src/routes/components/header-swiper-indicator/index.tsx b/src/routes/components/header-swiper-indicator/index.tsx deleted file mode 100644 index 87bae1a..0000000 --- a/src/routes/components/header-swiper-indicator/index.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import { setStatusBarBackgroundColor } from 'expo-status-bar'; -import React from 'react'; -import { Platform } from 'react-native'; - -import { Text } from '@/components'; -import { themes } from '@/themes'; - -import { HeaderSwiperIndicatorContainer, Indicator } from './styles'; -import { HeaderSwiperIndicatorProps } from './types'; - -export function HeaderSwiperIndicator({ title }: HeaderSwiperIndicatorProps) { - React.useEffect(() => { - if (Platform.OS === 'android') setStatusBarBackgroundColor('black', true); - return () => { - if (Platform.OS === 'android') setStatusBarBackgroundColor(themes.colors.black_000, true); - }; - }, []); - - return ( - - - - {title} - - - ); -} diff --git a/src/routes/components/header-swiper-indicator/styles.ts b/src/routes/components/header-swiper-indicator/styles.ts deleted file mode 100644 index 233faae..0000000 --- a/src/routes/components/header-swiper-indicator/styles.ts +++ /dev/null @@ -1,18 +0,0 @@ -import styled from 'styled-components/native'; - -import { themes } from '@/themes'; - -export const HeaderSwiperIndicatorContainer = styled.View` - background-color: ${themes.colors.black_000}; - padding: ${themes.spaces.space_10} ${themes.spaces.space_15}; - justify-content: center; - align-items: center; -`; - -export const Indicator = styled.View` - width: 35px; - height: 5px; - border-radius: 10px; - margin-bottom: ${themes.spaces.space_5}; - background-color: ${themes.colors.dark_grey}; -`; diff --git a/src/routes/components/index.ts b/src/routes/components/index.ts deleted file mode 100644 index 18bde97..0000000 --- a/src/routes/components/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { HeaderSwiperIndicator } from './header-swiper-indicator'; -import { TabBar } from './tab-bar'; - -export { HeaderSwiperIndicator, TabBar }; diff --git a/src/routes/components/tab-bar/index.tsx b/src/routes/components/tab-bar/index.tsx deleted file mode 100644 index d8ae382..0000000 --- a/src/routes/components/tab-bar/index.tsx +++ /dev/null @@ -1,70 +0,0 @@ -import React from 'react'; -import { heightPercentageToDP as hp } from 'react-native-responsive-screen'; - -import { IconChart, IconHome, IconSettings } from '@/assets'; -import { themes } from '@/themes'; - -import { ButtonsContainer, Indicator, SafeArea, TabBarContainer, Touch } from './styles'; -import { TabBarProps } from './types'; - -export function TabBar({ state, descriptors, navigation }: TabBarProps) { - const { colors } = themes; - const SIZE_ICON = hp('2.5%'); - - return ( - - - - {state.routes.map((route, index) => { - const isFocused = state.index === index; - const { options } = descriptors[route.key]; - - const onPress = () => { - const event = navigation.emit({ - type: 'tabPress', - target: route.key, - canPreventDefault: true, - }); - - if (!isFocused && !event.defaultPrevented) { - navigation.navigate(route.name); - } - }; - - return ( - - - {route.name === 'HomePage' && ( - - )} - {route.name === 'BitcoinDataPage' && ( - - )} - {route.name === 'SettingsPage' && ( - - )} - - - ); - })} - - - - ); -} diff --git a/src/routes/components/tab-bar/styles.ts b/src/routes/components/tab-bar/styles.ts deleted file mode 100644 index 1b2562b..0000000 --- a/src/routes/components/tab-bar/styles.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { heightPercentageToDP as hp } from 'react-native-responsive-screen'; -import styled from 'styled-components/native'; - -import { themes } from '@/themes'; - -import { IndicatorProps } from './types'; - -const { colors } = themes; - -const HEIGHT_TAB_BAR = hp('8%'); - -export const TabBarContainer = styled.View` - background-color: ${colors.black_000}; -`; - -export const SafeArea = styled.SafeAreaView``; - -export const Touch = styled.TouchableOpacity` - flex: 1; - align-items: center; - justify-content: center; -`; - -export const Indicator = styled.View` - background-color: ${({ isFocused }) => (isFocused ? colors.dark_cyan : colors.transparent)}; - width: ${hp('8.5%')}px; - max-width: 120px; - height: ${hp('4.5%')}px; - align-items: center; - justify-content: center; - border-radius: 100px; -`; - -export const ButtonsContainer = styled.View` - height: ${HEIGHT_TAB_BAR}px; - width: 100%; - flex-direction: row; -`; diff --git a/src/routes/fragments/HeaderSwiperIndicator.tsx b/src/routes/fragments/HeaderSwiperIndicator.tsx new file mode 100644 index 0000000..e6b0496 --- /dev/null +++ b/src/routes/fragments/HeaderSwiperIndicator.tsx @@ -0,0 +1,42 @@ +import { setStatusBarBackgroundColor } from 'expo-status-bar'; +import React from 'react'; +import { Platform, StyleSheet, View } from 'react-native'; + +import { Text } from '@/components/Text'; +import { borderRadius, colors, spaces } from '@/helpers/themes'; +import { HeaderSwiperIndicatorProps } from '@/types/HeaderSwiperIndicatorType'; + +export function HeaderSwiperIndicator({ title }: HeaderSwiperIndicatorProps) { + React.useEffect(() => { + if (Platform.OS === 'android') setStatusBarBackgroundColor('black', true); + return () => { + if (Platform.OS === 'android') setStatusBarBackgroundColor(colors.black_000, true); + }; + }, []); + + return ( + + + + {title} + + + ); +} + +const styles = StyleSheet.create({ + container: { + backgroundColor: colors.black_000, + paddingHorizontal: spaces.space_15, + paddingVertical: spaces.space_10, + justifyContent: 'center', + alignItems: 'center', + }, + indicator: { + width: 35, + height: 5, + borderRadius: borderRadius.radius_10, + marginBottom: spaces.space_5, + backgroundColor: colors.dark_grey, + }, +}); diff --git a/src/routes/fragments/TabBar.tsx b/src/routes/fragments/TabBar.tsx new file mode 100644 index 0000000..ebfab43 --- /dev/null +++ b/src/routes/fragments/TabBar.tsx @@ -0,0 +1,96 @@ +import React from 'react'; +import { StyleSheet, TouchableOpacity, View } from 'react-native'; +import { heightPercentageToDP as hp } from 'react-native-responsive-screen'; +import { useSafeAreaInsets } from 'react-native-safe-area-context'; + +import { IconChart, IconHome, IconSettings } from '@/assets'; +import { colors } from '@/helpers/themes'; +import { TabBarProps } from '@/types/TabBarType'; + +export function TabBar({ state, descriptors, navigation }: TabBarProps) { + const SIZE_ICON = hp('2.5%'); + const insets = useSafeAreaInsets(); + const HEIGHT_TABBAR = hp('8%') + insets.bottom; + + return ( + + + {state.routes.map((route, index) => { + const isFocused = state.index === index; + const { options } = descriptors[route.key]; + + const onPress = () => { + const event = navigation.emit({ + type: 'tabPress', + target: route.key, + canPreventDefault: true, + }); + + if (!isFocused && !event.defaultPrevented) { + navigation.navigate(route.name); + } + }; + + return ( + + + {route.name === 'HomePage' && ( + + )} + {route.name === 'BitcoinDataPage' && ( + + )} + {route.name === 'SettingsPage' && ( + + )} + + + ); + })} + + + ); +} + +const styles = StyleSheet.create({ + container: { + backgroundColor: colors.black_000, + }, + button: { + flex: 1, + alignItems: 'center', + justifyContent: 'center', + }, + indicator: { + width: hp('8.5%'), + maxWidth: 120, + height: hp('4.5%'), + alignItems: 'center', + justifyContent: 'center', + borderRadius: 100, + }, + buttonContainer: { + flex: 1, + width: '100%', + flexDirection: 'row', + }, +}); diff --git a/src/services/get-bitcoin-balance/index.ts b/src/services/getBitcoinBalance.ts similarity index 86% rename from src/services/get-bitcoin-balance/index.ts rename to src/services/getBitcoinBalance.ts index 08646e9..52501e5 100644 --- a/src/services/get-bitcoin-balance/index.ts +++ b/src/services/getBitcoinBalance.ts @@ -1,6 +1,6 @@ import { AddressBalance, Bitcoin, Network, ResponseDto, TatumSDK } from '@tatumio/tatum'; -import { useUserData } from '@/stores/use-user-data'; +import { useUserData } from '@/stores/useUserData'; export async function getBitcoinBalance(address: string) { const { setBalance } = useUserData.getState(); @@ -9,7 +9,7 @@ export async function getBitcoinBalance(address: string) { const tatum = await TatumSDK.init({ network: Network.BITCOIN, apiKey: { - v1: process.env.EXPO_PUBLIC_TATUM_SDK_V1, + v4: process.env.EXPO_PUBLIC_TATUM_SDK_V4, }, }); diff --git a/src/services/get-bitcoin-data-prices/index.ts b/src/services/getBitcoinDataPrices.ts similarity index 92% rename from src/services/get-bitcoin-data-prices/index.ts rename to src/services/getBitcoinDataPrices.ts index 910cddf..6575858 100644 --- a/src/services/get-bitcoin-data-prices/index.ts +++ b/src/services/getBitcoinDataPrices.ts @@ -1,6 +1,6 @@ import axios from 'axios'; -import { ResponseData } from './types'; +import { ResponseData } from '@/types/GetBitcoinDataPricesType'; export async function getBitcoinDataPrices() { try { diff --git a/src/services/get-bitcoin-historical-price/index.ts b/src/services/getBitcoinHistoricalPrice.ts similarity index 88% rename from src/services/get-bitcoin-historical-price/index.ts rename to src/services/getBitcoinHistoricalPrice.ts index b88bae5..b8adcad 100644 --- a/src/services/get-bitcoin-historical-price/index.ts +++ b/src/services/getBitcoinHistoricalPrice.ts @@ -1,6 +1,6 @@ import axios from 'axios'; -import { ResponseData } from './types'; +import { ResponseData } from '@/types/GetBitcoinHistoricalPriceType'; export async function getBitcoinHistoricalPrice() { try { diff --git a/src/services/get-bitcoin-transactions/index.ts b/src/services/getBitcoinTransactions.ts similarity index 92% rename from src/services/get-bitcoin-transactions/index.ts rename to src/services/getBitcoinTransactions.ts index d6a1b74..1cff6fd 100644 --- a/src/services/get-bitcoin-transactions/index.ts +++ b/src/services/getBitcoinTransactions.ts @@ -5,7 +5,7 @@ export async function getBitcoinTransactions(address: string) { const tatum = await TatumSDK.init({ network: Network.BITCOIN, apiKey: { - v1: process.env.EXPO_PUBLIC_TATUM_SDK_V1, + v4: process.env.EXPO_PUBLIC_TATUM_SDK_V4, }, }); diff --git a/src/services/index.ts b/src/services/index.ts deleted file mode 100644 index 635360e..0000000 --- a/src/services/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { getBitcoinBalance } from './get-bitcoin-balance'; -import { getBitcoinDataPrices } from './get-bitcoin-data-prices'; -import { getBitcoinHistoricalPrice } from './get-bitcoin-historical-price'; -import { getBitcoinTransactions } from './get-bitcoin-transactions'; - -export { - getBitcoinBalance, - getBitcoinDataPrices, - getBitcoinHistoricalPrice, - getBitcoinTransactions, -}; diff --git a/src/stores/index.ts b/src/stores/index.ts deleted file mode 100644 index a831e65..0000000 --- a/src/stores/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { useAppSettings } from './use-app-settings'; -import { useBitcoinDataPrices } from './use-bitcoin-data-prices'; -import { useBitcoinHistoricalPrice } from './use-bitcoin-historical-price'; -import { useUserData } from './use-user-data'; - -export { useAppSettings, useBitcoinDataPrices, useBitcoinHistoricalPrice, useUserData }; diff --git a/src/stores/use-app-settings/index.ts b/src/stores/useAppSettings.ts similarity index 86% rename from src/stores/use-app-settings/index.ts rename to src/stores/useAppSettings.ts index 48ffc33..bf75ff0 100644 --- a/src/stores/use-app-settings/index.ts +++ b/src/stores/useAppSettings.ts @@ -3,9 +3,8 @@ import * as Device from 'expo-device'; import i18n from 'i18next'; import { create } from 'zustand'; -import { storageKeys } from '@/helpers'; - -import { UseAppSettingsProps } from './types'; +import { storageKeys } from '@/helpers/storageKeys'; +import { UseAppSettingsProps } from '@/types/UseAppSettingsType'; export const useAppSettings = create(set => ({ currency: 'usd', diff --git a/src/stores/use-bitcoin-data-prices/index.ts b/src/stores/useBitcoinDataPrices.ts similarity index 70% rename from src/stores/use-bitcoin-data-prices/index.ts rename to src/stores/useBitcoinDataPrices.ts index 93805bb..3c11906 100644 --- a/src/stores/use-bitcoin-data-prices/index.ts +++ b/src/stores/useBitcoinDataPrices.ts @@ -1,8 +1,7 @@ import { create } from 'zustand'; -import { getBitcoinDataPrices } from '@/services'; - -import { UseBitcoinDataPricesProps } from './types'; +import { getBitcoinDataPrices } from '@/services/getBitcoinDataPrices'; +import { UseBitcoinDataPricesProps } from '@/types/UseBitcoinDataPricesType'; export const useBitcoinDataPrices = create(set => ({ data: null, diff --git a/src/stores/use-bitcoin-historical-price/index.ts b/src/stores/useBitcoinHistoricalPrice.ts similarity index 68% rename from src/stores/use-bitcoin-historical-price/index.ts rename to src/stores/useBitcoinHistoricalPrice.ts index d667eee..ba50a4b 100644 --- a/src/stores/use-bitcoin-historical-price/index.ts +++ b/src/stores/useBitcoinHistoricalPrice.ts @@ -1,8 +1,7 @@ import { create } from 'zustand'; -import { getBitcoinHistoricalPrice } from '@/services'; - -import { UseBitcoinHistoricalPriceProps } from './types'; +import { getBitcoinHistoricalPrice } from '@/services/getBitcoinHistoricalPrice'; +import { UseBitcoinHistoricalPriceProps } from '@/types/UseBitcoinHistoricalPriceType'; export const useBitcoinHistoricalPrice = create(set => ({ data: [], diff --git a/src/stores/use-user-data/index.ts b/src/stores/useUserData.ts similarity index 81% rename from src/stores/use-user-data/index.ts rename to src/stores/useUserData.ts index 3b8f120..5e12f57 100644 --- a/src/stores/use-user-data/index.ts +++ b/src/stores/useUserData.ts @@ -1,8 +1,7 @@ import { create } from 'zustand'; -import { getBitcoinTransactions } from '@/services/get-bitcoin-transactions'; - -import { UseUserDataProps } from './types'; +import { getBitcoinTransactions } from '@/services/getBitcoinTransactions'; +import { UseUserDataProps } from '@/types/UseUserDataType'; export const useUserData = create(set => ({ key: '', diff --git a/src/themes/index.ts b/src/themes/index.ts deleted file mode 100644 index 80668d0..0000000 --- a/src/themes/index.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { DefaultTheme } from 'styled-components'; - -export const themes: DefaultTheme = { - width: { - max_width: '800px', - }, - border_radius: { - radius_5: '5px', - radius_10: '10px', - radius_15: '15px', - }, - spaces: { - space_5: '5px', - space_10: '10px', - space_15: '15px', - space_20: '20px', - space_25: '25px', - space_30: '30px', - }, - font_sizes: { - XS: '3%', - S: '3.6%', - M: '4%', - L: '4.5%', - XL: '5%', - XXL: '6.5%', - XXXL: '7.6%', - }, - colors: { - white: '#FFFFFF', - green: '#ACD9A8', - red: '#E17C7C', - light_cyan: '#B4C9FF', - dark_cyan: '#3E4454', - black_100: '#191B1F', - black_000: '#222329', - light_grey: '#BFBFBF', - dark_grey: '#616670', - black_100_50pct: 'rgba(25, 27, 31, 0.50)', - transparent: 'transparent', - }, -}; diff --git a/src/themes/styled.d.ts b/src/themes/styled.d.ts deleted file mode 100644 index 03ae9ce..0000000 --- a/src/themes/styled.d.ts +++ /dev/null @@ -1,44 +0,0 @@ -import 'styled-components'; - -declare module 'styled-components' { - export interface DefaultTheme { - width: { - max_width: string; - }; - border_radius: { - radius_5: string; - radius_10: string; - radius_15: string; - }; - spaces: { - space_5: string; - space_10: string; - space_15: string; - space_20: string; - space_25: string; - space_30: string; - }; - font_sizes: { - XS: string; - S: string; - M: string; - L: string; - XL: string; - XXL: string; - XXXL: string; - }; - colors: { - white: string; - green: string; - red: string; - light_cyan: string; - dark_cyan: string; - black_100: string; - black_000: string; - light_grey: string; - dark_grey: string; - black_100_50pct: string; - transparent: string; - }; - } -} diff --git a/src/components/action-list/types.ts b/src/types/ActionListType.ts similarity index 100% rename from src/components/action-list/types.ts rename to src/types/ActionListType.ts diff --git a/src/components/alert-modal/types.ts b/src/types/AlertModalType.ts similarity index 100% rename from src/components/alert-modal/types.ts rename to src/types/AlertModalType.ts diff --git a/src/types/ButtonTitleGhostType.ts b/src/types/ButtonTitleGhostType.ts new file mode 100644 index 0000000..d1ce8e0 --- /dev/null +++ b/src/types/ButtonTitleGhostType.ts @@ -0,0 +1,15 @@ +import { SchemeTextProps } from './SchemeTextType'; + +export interface ButtonTitleGhostProps { + testID?: string; + title: string; + onPress: () => void; + disabled?: boolean; + size?: 'large' | 'small'; + buttonsWeight?: SchemeTextProps['weight']; + loading?: boolean; + marginT?: number; + marginB?: number; + marginR?: number; + marginL?: number; +} diff --git a/src/types/ButtonTitleShapeType.ts b/src/types/ButtonTitleShapeType.ts new file mode 100644 index 0000000..1cd1da0 --- /dev/null +++ b/src/types/ButtonTitleShapeType.ts @@ -0,0 +1,11 @@ +export interface ButtonTitleShapeProps { + title: string; + onPress: () => void; + disabled?: boolean; + size?: 'large' | 'small'; + loading?: boolean; + marginT?: number; + marginB?: number; + marginR?: number; + marginL?: number; +} diff --git a/src/functions/calculate-balance/types.ts b/src/types/CalculateBalanceType.ts similarity index 100% rename from src/functions/calculate-balance/types.ts rename to src/types/CalculateBalanceType.ts diff --git a/src/components/chart-bitcoin/components/chart-main/types.ts b/src/types/ChartMainType.ts similarity index 100% rename from src/components/chart-bitcoin/components/chart-main/types.ts rename to src/types/ChartMainType.ts diff --git a/src/components/check-box-message/types.ts b/src/types/CheckboxMessageType.ts similarity index 100% rename from src/components/check-box-message/types.ts rename to src/types/CheckboxMessageType.ts diff --git a/src/pages/home-page/components/crypto-card-large/types.ts b/src/types/CryptoCardLargeType.ts similarity index 100% rename from src/pages/home-page/components/crypto-card-large/types.ts rename to src/types/CryptoCardLargeType.ts diff --git a/src/types/CurrenciesFormattedType.ts b/src/types/CurrenciesFormattedType.ts new file mode 100644 index 0000000..cc899cf --- /dev/null +++ b/src/types/CurrenciesFormattedType.ts @@ -0,0 +1,7 @@ +import { UseAppSettingsProps } from './UseAppSettingsType'; +import { UseBitcoinDataPricesProps } from './UseBitcoinDataPricesType'; + +export interface CurrenciesFormattedProps { + data: UseBitcoinDataPricesProps['data']; + currency: UseAppSettingsProps['currency']; +} diff --git a/src/components/chart-bitcoin/components/custom-line/types.ts b/src/types/CustomLineType.ts similarity index 100% rename from src/components/chart-bitcoin/components/custom-line/types.ts rename to src/types/CustomLineType.ts diff --git a/src/components/chart-bitcoin/components/custom-tooltip/types.ts b/src/types/CustomTooltipType.ts similarity index 100% rename from src/components/chart-bitcoin/components/custom-tooltip/types.ts rename to src/types/CustomTooltipType.ts diff --git a/src/services/get-bitcoin-data-prices/types.ts b/src/types/GetBitcoinDataPricesType.ts similarity index 100% rename from src/services/get-bitcoin-data-prices/types.ts rename to src/types/GetBitcoinDataPricesType.ts diff --git a/src/services/get-bitcoin-historical-price/types.ts b/src/types/GetBitcoinHistoricalPriceType.ts similarity index 100% rename from src/services/get-bitcoin-historical-price/types.ts rename to src/types/GetBitcoinHistoricalPriceType.ts diff --git a/src/components/scroll-view-header/components/header-animated/types.ts b/src/types/HeaderAnimatedType.ts similarity index 100% rename from src/components/scroll-view-header/components/header-animated/types.ts rename to src/types/HeaderAnimatedType.ts diff --git a/src/routes/components/header-swiper-indicator/types.ts b/src/types/HeaderSwiperIndicatorType.ts similarity index 100% rename from src/routes/components/header-swiper-indicator/types.ts rename to src/types/HeaderSwiperIndicatorType.ts diff --git a/src/components/header-swiper-options/types.ts b/src/types/HeaderSwiperOptionsType.ts similarity index 100% rename from src/components/header-swiper-options/types.ts rename to src/types/HeaderSwiperOptionsType.ts diff --git a/src/assets/icons/types.ts b/src/types/IconType.ts similarity index 100% rename from src/assets/icons/types.ts rename to src/types/IconType.ts diff --git a/src/components/limited-width-container/types.ts b/src/types/LimitedWidthContainerType.ts similarity index 100% rename from src/components/limited-width-container/types.ts rename to src/types/LimitedWidthContainerType.ts diff --git a/src/components/price-bitcoin/types.ts b/src/types/PriceBitcoinType.ts similarity index 100% rename from src/components/price-bitcoin/types.ts rename to src/types/PriceBitcoinType.ts diff --git a/src/routes/types.ts b/src/types/RoutesType.ts similarity index 76% rename from src/routes/types.ts rename to src/types/RoutesType.ts index a64fae9..963d412 100644 --- a/src/routes/types.ts +++ b/src/types/RoutesType.ts @@ -1,4 +1,4 @@ -import { TransactionPageProps } from '@/pages/transaction-page/types'; +import { AddressTransaction } from '@tatumio/tatum'; export type RootStackParamListProps = { RegisterKeyPage: undefined; @@ -6,7 +6,9 @@ export type RootStackParamListProps = { TabsRoutes: undefined; HomePage: undefined; BitcoinDataPage: undefined; - TransactionPage: TransactionPageProps; + TransactionPage: { + data: AddressTransaction; + }; SettingsPage: undefined; PublicKeyPage: undefined; LanguagePage: undefined; diff --git a/src/components/text/functions/scheme-text/types.ts b/src/types/SchemeTextType.ts similarity index 57% rename from src/components/text/functions/scheme-text/types.ts rename to src/types/SchemeTextType.ts index 0b0ff61..461ea1d 100644 --- a/src/components/text/functions/scheme-text/types.ts +++ b/src/types/SchemeTextType.ts @@ -1,5 +1,7 @@ +import { StylesProps } from './StylesType'; + export interface SchemeTextProps { weight: 'regular' | 'medium' | 'bold'; - size: 'XS' | 'S' | 'M' | 'L' | 'XL' | 'XXL' | 'XXXL'; + size: StylesProps['fontSize']; isTablet: boolean | null; } diff --git a/src/components/scroll-view-header/types.ts b/src/types/ScrollViewHeaderType.ts similarity index 100% rename from src/components/scroll-view-header/types.ts rename to src/types/ScrollViewHeaderType.ts diff --git a/src/components/scroll-view/types.ts b/src/types/ScrollViewType.ts similarity index 100% rename from src/components/scroll-view/types.ts rename to src/types/ScrollViewType.ts diff --git a/src/components/select-list/types.ts b/src/types/SelectListType.ts similarity index 100% rename from src/components/select-list/types.ts rename to src/types/SelectListType.ts diff --git a/src/types/SkeletonLoadingType.ts b/src/types/SkeletonLoadingType.ts new file mode 100644 index 0000000..db3f7eb --- /dev/null +++ b/src/types/SkeletonLoadingType.ts @@ -0,0 +1,8 @@ +export interface SkeletonLoadingProps { + heightPorcent: string; + radius: number; + marginT?: number; + marginB?: number; + marginR?: number; + marginL?: number; +} diff --git a/src/types/StylesType.ts b/src/types/StylesType.ts new file mode 100644 index 0000000..70b21af --- /dev/null +++ b/src/types/StylesType.ts @@ -0,0 +1,4 @@ +export interface StylesProps { + fontFamily: 'Inter-Regular' | 'Inter-Medium' | 'Inter-Bold'; + fontSize: 'xs' | 's' | 'm' | 'l' | 'xl' | 'xxl' | 'xxxl'; +} diff --git a/src/routes/components/tab-bar/types.ts b/src/types/TabBarType.ts similarity index 100% rename from src/routes/components/tab-bar/types.ts rename to src/types/TabBarType.ts diff --git a/src/components/text-field-area/types.ts b/src/types/TextFieldAreaType.ts similarity index 100% rename from src/components/text-field-area/types.ts rename to src/types/TextFieldAreaType.ts diff --git a/src/types/TextType.ts b/src/types/TextType.ts new file mode 100644 index 0000000..c0a38a0 --- /dev/null +++ b/src/types/TextType.ts @@ -0,0 +1,14 @@ +import React from 'react'; + +import { StylesProps } from './StylesType'; + +export interface TextProps { + children: React.ReactNode; + weight?: 'regular' | 'medium' | 'bold'; + size?: StylesProps['fontSize']; + color?: string; + marginT?: number; + marginB?: number; + marginR?: number; + marginL?: number; +} diff --git a/src/types/TitleSubtitleType.ts b/src/types/TitleSubtitleType.ts new file mode 100644 index 0000000..c25a040 --- /dev/null +++ b/src/types/TitleSubtitleType.ts @@ -0,0 +1,7 @@ +export interface TitleSubtitleProps { + title: string; + subTitle: string; + isLoading?: boolean; + marginT?: number; + marginB?: number; +} diff --git a/src/stores/use-app-settings/types.ts b/src/types/UseAppSettingsType.ts similarity index 100% rename from src/stores/use-app-settings/types.ts rename to src/types/UseAppSettingsType.ts diff --git a/src/stores/use-bitcoin-data-prices/types.ts b/src/types/UseBitcoinDataPricesType.ts similarity index 77% rename from src/stores/use-bitcoin-data-prices/types.ts rename to src/types/UseBitcoinDataPricesType.ts index bb2a2cd..6441937 100644 --- a/src/stores/use-bitcoin-data-prices/types.ts +++ b/src/types/UseBitcoinDataPricesType.ts @@ -1,4 +1,4 @@ -import { ResponseData } from '@/services/get-bitcoin-data-prices/types'; +import { ResponseData } from './GetBitcoinDataPricesType'; export interface DataProps { data: ResponseData['data']['market_data'] | null; diff --git a/src/stores/use-bitcoin-historical-price/types.ts b/src/types/UseBitcoinHistoricalPriceType.ts similarity index 100% rename from src/stores/use-bitcoin-historical-price/types.ts rename to src/types/UseBitcoinHistoricalPriceType.ts diff --git a/src/stores/use-user-data/types.ts b/src/types/UseUserDataType.ts similarity index 100% rename from src/stores/use-user-data/types.ts rename to src/types/UseUserDataType.ts diff --git a/yarn.lock b/yarn.lock index a15efd5..2cea777 100644 --- a/yarn.lock +++ b/yarn.lock @@ -20,22 +20,6 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@babel/cli@^7.21.0": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.22.10.tgz#25e4bbd8d0a0d8b4b389e1b5e2d7a238bd4c1b75" - integrity sha512-rM9ZMmaII630zGvtMtQ3P4GyHs28CHLYE9apLG7L8TgaSqcfoIGrlLSLsh4Q8kDTdZQQEXZm1M0nQtOvU/2heg== - dependencies: - "@jridgewell/trace-mapping" "^0.3.17" - commander "^4.0.1" - convert-source-map "^1.1.0" - fs-readdir-recursive "^1.1.0" - glob "^7.2.0" - make-dir "^2.1.0" - slash "^2.0.0" - optionalDependencies: - "@nicolo-ribaudo/chokidar-2" "2.1.8-no-fsevents.3" - chokidar "^3.4.0" - "@babel/code-frame@7.10.4", "@babel/code-frame@~7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" @@ -56,7 +40,7 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.9.tgz#71cdb00a1ce3a329ce4cbec3a44f9fef35669730" integrity sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ== -"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.13.16", "@babel/core@^7.20.0", "@babel/core@^7.21.0": +"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.13.16", "@babel/core@^7.20.0": version "7.22.11" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.11.tgz#8033acaa2aa24c3f814edaaa057f3ce0ba559c24" integrity sha512-lh7RJrtPdhibbxndr6/xx0w8+CVlY5FJZiaSz908Fpy+G0xkBFTvwLcKJFF4PJxVfGhVWNebikpWGnOoC71juQ== @@ -174,7 +158,7 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-module-imports@^7.18.6", "@babel/helper-module-imports@^7.22.5": +"@babel/helper-module-imports@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz#1a8f4c9f4027d23f520bd76b364d44434a72660c" integrity sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg== @@ -306,13 +290,6 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" "@babel/plugin-transform-optional-chaining" "^7.22.5" -"@babel/plugin-external-helpers@^7.18.6": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-external-helpers/-/plugin-external-helpers-7.22.5.tgz#92b0705b74756123f289388320e0e12c407fdf9a" - integrity sha512-ngnNEWxmykPk82mH4ajZT0qTztr3Je6hrMuKAslZVM8G1YZTENJSYwrIGtt6KOtznug3exmAtF4so/nPqJuA4A== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-proposal-async-generator-functions@^7.0.0": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz#bfb7276d2d573cb67ba379984a2334e262ba5326" @@ -323,7 +300,7 @@ "@babel/helper-remap-async-to-generator" "^7.18.9" "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-proposal-class-properties@^7.0.0", "@babel/plugin-proposal-class-properties@^7.13.0", "@babel/plugin-proposal-class-properties@^7.18.0", "@babel/plugin-proposal-class-properties@^7.18.6": +"@babel/plugin-proposal-class-properties@^7.0.0", "@babel/plugin-proposal-class-properties@^7.13.0", "@babel/plugin-proposal-class-properties@^7.18.0": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== @@ -374,7 +351,7 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.0.0", "@babel/plugin-proposal-object-rest-spread@^7.12.13", "@babel/plugin-proposal-object-rest-spread@^7.20.0", "@babel/plugin-proposal-object-rest-spread@^7.20.7": +"@babel/plugin-proposal-object-rest-spread@^7.0.0", "@babel/plugin-proposal-object-rest-spread@^7.12.13", "@babel/plugin-proposal-object-rest-spread@^7.20.0": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== @@ -897,20 +874,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-react-display-name@^7.0.0", "@babel/plugin-transform-react-display-name@^7.22.5": +"@babel/plugin-transform-react-display-name@^7.0.0": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.22.5.tgz#3c4326f9fce31c7968d6cb9debcaf32d9e279a2b" integrity sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-react-jsx-development@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz#e716b6edbef972a92165cd69d92f1255f7e73e87" - integrity sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A== - dependencies: - "@babel/plugin-transform-react-jsx" "^7.22.5" - "@babel/plugin-transform-react-jsx-self@^7.0.0": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.22.5.tgz#ca2fdc11bc20d4d46de01137318b13d04e481d8e" @@ -925,7 +895,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-react-jsx@^7.0.0", "@babel/plugin-transform-react-jsx@^7.12.17", "@babel/plugin-transform-react-jsx@^7.22.5": +"@babel/plugin-transform-react-jsx@^7.0.0", "@babel/plugin-transform-react-jsx@^7.12.17": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.5.tgz#932c291eb6dd1153359e2a90cb5e557dcf068416" integrity sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA== @@ -936,14 +906,6 @@ "@babel/plugin-syntax-jsx" "^7.22.5" "@babel/types" "^7.22.5" -"@babel/plugin-transform-react-pure-annotations@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.22.5.tgz#1f58363eef6626d6fa517b95ac66fe94685e32c0" - integrity sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-transform-regenerator@^7.22.10": version "7.22.10" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz#8ceef3bd7375c4db7652878b0241b2be5d0c3cca" @@ -1048,7 +1010,7 @@ "@babel/helper-create-regexp-features-plugin" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/preset-env@^7.20.0", "@babel/preset-env@^7.20.2": +"@babel/preset-env@^7.20.0": version "7.22.10" resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.22.10.tgz#3263b9fe2c8823d191d28e61eac60a79f9ce8a0f" integrity sha512-riHpLb1drNkpLlocmSyEg4oYJIQFeXAK/d7rI6mbD0XsvoTOOweXDmQPG/ErxsEhWk3rl3Q/3F6RFQlVFS8m0A== @@ -1152,19 +1114,7 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/preset-react@^7.18.6": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.22.5.tgz#c4d6058fbf80bccad02dd8c313a9aaa67e3c3dd6" - integrity sha512-M+Is3WikOpEJHgR385HbuCITPTaPRaNkibTEa9oiofmJvIsrceb4yp9RL9Kb+TE8LznmeyZqpP+Lopwcx59xPQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-validator-option" "^7.22.5" - "@babel/plugin-transform-react-display-name" "^7.22.5" - "@babel/plugin-transform-react-jsx" "^7.22.5" - "@babel/plugin-transform-react-jsx-development" "^7.22.5" - "@babel/plugin-transform-react-pure-annotations" "^7.22.5" - -"@babel/preset-typescript@^7.13.0", "@babel/preset-typescript@^7.16.7", "@babel/preset-typescript@^7.21.0", "@babel/preset-typescript@^7.21.5": +"@babel/preset-typescript@^7.13.0", "@babel/preset-typescript@^7.16.7", "@babel/preset-typescript@^7.21.5": version "7.22.11" resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.22.11.tgz#f218cd0345524ac888aa3dc32f029de5b064b575" integrity sha512-tWY5wyCZYBGY7IlalfKI1rLiGlIfnwsRHZqlky0HVv8qviwQ1Uo/05M6+s+TcTCVa6Bmoo2uJW5TMFX6Wa4qVg== @@ -1191,13 +1141,20 @@ resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== -"@babel/runtime@^7.0.0", "@babel/runtime@^7.20.0", "@babel/runtime@^7.20.6", "@babel/runtime@^7.8.4": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.20.0", "@babel/runtime@^7.8.4": version "7.22.11" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.11.tgz#7a9ba3bbe406ad6f9e8dd4da2ece453eb23a77a4" integrity sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA== dependencies: regenerator-runtime "^0.14.0" +"@babel/runtime@^7.22.5", "@babel/runtime@^7.23.2": + version "7.23.8" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.8.tgz#8ee6fe1ac47add7122902f257b8ddf55c898f650" + integrity sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw== + 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" @@ -1207,7 +1164,7 @@ "@babel/parser" "^7.22.5" "@babel/types" "^7.22.5" -"@babel/traverse@^7.20.0", "@babel/traverse@^7.21.2", "@babel/traverse@^7.22.11": +"@babel/traverse@^7.20.0", "@babel/traverse@^7.22.11": version "7.22.11" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.11.tgz#71ebb3af7a05ff97280b83f05f8865ac94b2027c" integrity sha512-mzAenteTfomcB7mfPtyi+4oe5BZ6MXxWcn4CX+h4IRJ+OOGXBrWU6jDQavkQI9Vuc5P+donFabBfFCcmWka9lQ== @@ -1251,28 +1208,11 @@ dependencies: "@emotion/memoize" "0.7.4" -"@emotion/is-prop-valid@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz#23116cf1ed18bfeac910ec6436561ecb1a3885cc" - integrity sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw== - dependencies: - "@emotion/memoize" "^0.8.1" - "@emotion/memoize@0.7.4": version "0.7.4" resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.4.tgz#19bf0f5af19149111c40d98bb0cf82119f5d9eeb" integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw== -"@emotion/memoize@^0.8.1": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.1.tgz#c1ddb040429c6d21d38cc945fe75c818cfb68e17" - integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA== - -"@emotion/unitless@^0.8.0": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.1.tgz#182b5a4704ef8ad91bde93f7a860a88fd92c79a3" - integrity sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ== - "@eslint-community/eslint-utils@^4.2.0": version "4.4.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" @@ -1998,11 +1938,6 @@ hey-listen "^1.0.8" tslib "^2.3.1" -"@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3": - version "2.1.8-no-fsevents.3" - resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz#323d72dd25103d0c4fbdce89dadf574a787b1f9b" - integrity sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ== - "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -2047,44 +1982,44 @@ dependencies: merge-options "^3.0.4" -"@react-native-community/cli-clean@11.3.6": - version "11.3.6" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-clean/-/cli-clean-11.3.6.tgz#43a06cbee1a5480da804debc4f94662a197720f2" - integrity sha512-jOOaeG5ebSXTHweq1NznVJVAFKtTFWL4lWgUXl845bCGX7t1lL8xQNWHKwT8Oh1pGR2CI3cKmRjY4hBg+pEI9g== +"@react-native-community/cli-clean@11.3.7": + version "11.3.7" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-clean/-/cli-clean-11.3.7.tgz#cb4c2f225f78593412c2d191b55b8570f409a48f" + integrity sha512-twtsv54ohcRyWVzPXL3F9VHGb4Qhn3slqqRs3wEuRzjR7cTmV2TIO2b1VhaqF4HlCgNd+cGuirvLtK2JJyaxMg== dependencies: - "@react-native-community/cli-tools" "11.3.6" + "@react-native-community/cli-tools" "11.3.7" chalk "^4.1.2" execa "^5.0.0" prompts "^2.4.0" -"@react-native-community/cli-config@11.3.6": - version "11.3.6" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-config/-/cli-config-11.3.6.tgz#6d3636a8a3c4542ebb123eaf61bbbc0c2a1d2a6b" - integrity sha512-edy7fwllSFLan/6BG6/rznOBCLPrjmJAE10FzkEqNLHowi0bckiAPg1+1jlgQ2qqAxV5kuk+c9eajVfQvPLYDA== +"@react-native-community/cli-config@11.3.7": + version "11.3.7" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-config/-/cli-config-11.3.7.tgz#4ce95548252ecb094b576369abebf9867c95d277" + integrity sha512-FDBLku9xskS+bx0YFJFLCmUJhEZ4/MMSC9qPYOGBollWYdgE7k/TWI0IeYFmMALAnbCdKQAYP5N29N55Tad8lg== dependencies: - "@react-native-community/cli-tools" "11.3.6" + "@react-native-community/cli-tools" "11.3.7" chalk "^4.1.2" cosmiconfig "^5.1.0" deepmerge "^4.3.0" glob "^7.1.3" joi "^17.2.1" -"@react-native-community/cli-debugger-ui@11.3.6": - version "11.3.6" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-11.3.6.tgz#1eb2276450f270a938686b49881fe232a08c01c4" - integrity sha512-jhMOSN/iOlid9jn/A2/uf7HbC3u7+lGktpeGSLnHNw21iahFBzcpuO71ekEdlmTZ4zC/WyxBXw9j2ka33T358w== +"@react-native-community/cli-debugger-ui@11.3.7": + version "11.3.7" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-11.3.7.tgz#2147b73313af8de3c9b396406d5d344b904cf2bb" + integrity sha512-aVmKuPKHZENR8SrflkMurZqeyLwbKieHdOvaZCh1Nn/0UC5CxWcyST2DB2XQboZwsvr3/WXKJkSUO+SZ1J9qTQ== dependencies: serve-static "^1.13.1" -"@react-native-community/cli-doctor@11.3.6": - version "11.3.6" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-doctor/-/cli-doctor-11.3.6.tgz#fa33ee00fe5120af516aa0f17fe3ad50270976e7" - integrity sha512-UT/Tt6omVPi1j6JEX+CObc85eVFghSZwy4GR9JFMsO7gNg2Tvcu1RGWlUkrbmWMAMHw127LUu6TGK66Ugu1NLA== +"@react-native-community/cli-doctor@11.3.7": + version "11.3.7" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-doctor/-/cli-doctor-11.3.7.tgz#7d5f5b1aea78134bba713fa97795986345ff1344" + integrity sha512-YEHUqWISOHnsl5+NM14KHelKh68Sr5/HeEZvvNdIcvcKtZic3FU7Xd1WcbNdo3gCq5JvzGFfufx02Tabh5zmrg== dependencies: - "@react-native-community/cli-config" "11.3.6" - "@react-native-community/cli-platform-android" "11.3.6" - "@react-native-community/cli-platform-ios" "11.3.6" - "@react-native-community/cli-tools" "11.3.6" + "@react-native-community/cli-config" "11.3.7" + "@react-native-community/cli-platform-android" "11.3.7" + "@react-native-community/cli-platform-ios" "11.3.7" + "@react-native-community/cli-tools" "11.3.7" chalk "^4.1.2" command-exists "^1.2.8" envinfo "^7.7.2" @@ -2100,64 +2035,64 @@ wcwidth "^1.0.1" yaml "^2.2.1" -"@react-native-community/cli-hermes@11.3.6": - version "11.3.6" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-hermes/-/cli-hermes-11.3.6.tgz#b1acc7feff66ab0859488e5812b3b3e8b8e9434c" - integrity sha512-O55YAYGZ3XynpUdePPVvNuUPGPY0IJdctLAOHme73OvS80gNwfntHDXfmY70TGHWIfkK2zBhA0B+2v8s5aTyTA== +"@react-native-community/cli-hermes@11.3.7": + version "11.3.7" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-hermes/-/cli-hermes-11.3.7.tgz#091e730a1f8bace6c3729e8744bad6141002e0e8" + integrity sha512-chkKd8n/xeZkinRvtH6QcYA8rjNOKU3S3Lw/3Psxgx+hAYV0Gyk95qJHTalx7iu+PwjOOqqvCkJo5jCkYLkoqw== dependencies: - "@react-native-community/cli-platform-android" "11.3.6" - "@react-native-community/cli-tools" "11.3.6" + "@react-native-community/cli-platform-android" "11.3.7" + "@react-native-community/cli-tools" "11.3.7" chalk "^4.1.2" hermes-profile-transformer "^0.0.6" ip "^1.1.5" -"@react-native-community/cli-platform-android@11.3.6": - version "11.3.6" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-android/-/cli-platform-android-11.3.6.tgz#6f3581ca4eed3deec7edba83c1bc467098c8167b" - integrity sha512-ZARrpLv5tn3rmhZc//IuDM1LSAdYnjUmjrp58RynlvjLDI4ZEjBAGCQmgysRgXAsK7ekMrfkZgemUczfn9td2A== +"@react-native-community/cli-platform-android@11.3.7": + version "11.3.7" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-android/-/cli-platform-android-11.3.7.tgz#7845bc48258b6bb55df208a23b3690647f113995" + integrity sha512-WGtXI/Rm178UQb8bu1TAeFC/RJvYGnbHpULXvE20GkmeJ1HIrMjkagyk6kkY3Ej25JAP2R878gv+TJ/XiRhaEg== dependencies: - "@react-native-community/cli-tools" "11.3.6" + "@react-native-community/cli-tools" "11.3.7" chalk "^4.1.2" execa "^5.0.0" glob "^7.1.3" logkitty "^0.7.1" -"@react-native-community/cli-platform-ios@11.3.6": - version "11.3.6" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-ios/-/cli-platform-ios-11.3.6.tgz#0fa58d01f55d85618c4218925509a4be77867dab" - integrity sha512-tZ9VbXWiRW+F+fbZzpLMZlj93g3Q96HpuMsS6DRhrTiG+vMQ3o6oPWSEEmMGOvJSYU7+y68Dc9ms2liC7VD6cw== +"@react-native-community/cli-platform-ios@11.3.7": + version "11.3.7" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-ios/-/cli-platform-ios-11.3.7.tgz#87478f907634713b7236c77870446a5ca1f35ff1" + integrity sha512-Z/8rseBput49EldX7MogvN6zJlWzZ/4M97s2P+zjS09ZoBU7I0eOKLi0N9wx+95FNBvGQQ/0P62bB9UaFQH2jw== dependencies: - "@react-native-community/cli-tools" "11.3.6" + "@react-native-community/cli-tools" "11.3.7" chalk "^4.1.2" execa "^5.0.0" fast-xml-parser "^4.0.12" glob "^7.1.3" ora "^5.4.1" -"@react-native-community/cli-plugin-metro@11.3.6": - version "11.3.6" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-11.3.6.tgz#2d632c304313435c9ea104086901fbbeba0f1882" - integrity sha512-D97racrPX3069ibyabJNKw9aJpVcaZrkYiEzsEnx50uauQtPDoQ1ELb/5c6CtMhAEGKoZ0B5MS23BbsSZcLs2g== +"@react-native-community/cli-plugin-metro@11.3.7": + version "11.3.7" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-11.3.7.tgz#2e8a9deb30b40495c5c1347a1837a824400fa00f" + integrity sha512-0WhgoBVGF1f9jXcuagQmtxpwpfP+2LbLZH4qMyo6OtYLWLG13n2uRep+8tdGzfNzl1bIuUTeE9yZSAdnf9LfYQ== dependencies: - "@react-native-community/cli-server-api" "11.3.6" - "@react-native-community/cli-tools" "11.3.6" + "@react-native-community/cli-server-api" "11.3.7" + "@react-native-community/cli-tools" "11.3.7" chalk "^4.1.2" execa "^5.0.0" - metro "0.76.7" - metro-config "0.76.7" - metro-core "0.76.7" - metro-react-native-babel-transformer "0.76.7" - metro-resolver "0.76.7" - metro-runtime "0.76.7" + metro "0.76.8" + metro-config "0.76.8" + metro-core "0.76.8" + metro-react-native-babel-transformer "0.76.8" + metro-resolver "0.76.8" + metro-runtime "0.76.8" readline "^1.3.0" -"@react-native-community/cli-server-api@11.3.6": - version "11.3.6" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-server-api/-/cli-server-api-11.3.6.tgz#3a16039518f7f3865f85f8f54b19174448bbcdbb" - integrity sha512-8GUKodPnURGtJ9JKg8yOHIRtWepPciI3ssXVw5jik7+dZ43yN8P5BqCoDaq8e1H1yRer27iiOfT7XVnwk8Dueg== +"@react-native-community/cli-server-api@11.3.7": + version "11.3.7" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-server-api/-/cli-server-api-11.3.7.tgz#2cce54b3331c9c51b9067129c297ab2e9a142216" + integrity sha512-yoFyGdvR3HxCnU6i9vFqKmmSqFzCbnFSnJ29a+5dppgPRetN+d//O8ard/YHqHzToFnXutAFf2neONn23qcJAg== dependencies: - "@react-native-community/cli-debugger-ui" "11.3.6" - "@react-native-community/cli-tools" "11.3.6" + "@react-native-community/cli-debugger-ui" "11.3.7" + "@react-native-community/cli-tools" "11.3.7" compression "^1.7.1" connect "^3.6.5" errorhandler "^1.5.1" @@ -2166,10 +2101,10 @@ serve-static "^1.13.1" ws "^7.5.1" -"@react-native-community/cli-tools@11.3.6": - version "11.3.6" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-tools/-/cli-tools-11.3.6.tgz#ec213b8409917a56e023595f148c84b9cb3ad871" - integrity sha512-JpmUTcDwAGiTzLsfMlIAYpCMSJ9w2Qlf7PU7mZIRyEu61UzEawyw83DkqfbzDPBuRwRnaeN44JX2CP/yTO3ThQ== +"@react-native-community/cli-tools@11.3.7": + version "11.3.7" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-tools/-/cli-tools-11.3.7.tgz#37aa7efc7b4a1b7077d541f1d7bb11a2ab7b6ff2" + integrity sha512-peyhP4TV6Ps1hk+MBHTFaIR1eI3u+OfGBvr5r0wPwo3FAJvldRinMgcB/TcCcOBXVORu7ba1XYjkubPeYcqAyA== dependencies: appdirsjs "^1.2.4" chalk "^4.1.2" @@ -2181,27 +2116,27 @@ semver "^7.5.2" shell-quote "^1.7.3" -"@react-native-community/cli-types@11.3.6": - version "11.3.6" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-types/-/cli-types-11.3.6.tgz#34012f1d0cb1c4039268828abc07c9c69f2e15be" - integrity sha512-6DxjrMKx5x68N/tCJYVYRKAtlRHbtUVBZrnAvkxbRWFD9v4vhNgsPM0RQm8i2vRugeksnao5mbnRGpS6c0awCw== +"@react-native-community/cli-types@11.3.7": + version "11.3.7" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-types/-/cli-types-11.3.7.tgz#12fe7cff3da08bd27e11116531b2e001939854b9" + integrity sha512-OhSr/TiDQkXjL5YOs8+hvGSB+HltLn5ZI0+A3DCiMsjUgTTsYh+Z63OtyMpNjrdCEFcg0MpfdU2uxstCS6Dc5g== dependencies: joi "^17.2.1" -"@react-native-community/cli@11.3.6": - version "11.3.6" - resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-11.3.6.tgz#d92618d75229eaf6c0391a6b075684eba5d9819f" - integrity sha512-bdwOIYTBVQ9VK34dsf6t3u6vOUU5lfdhKaAxiAVArjsr7Je88Bgs4sAbsOYsNK3tkE8G77U6wLpekknXcanlww== - dependencies: - "@react-native-community/cli-clean" "11.3.6" - "@react-native-community/cli-config" "11.3.6" - "@react-native-community/cli-debugger-ui" "11.3.6" - "@react-native-community/cli-doctor" "11.3.6" - "@react-native-community/cli-hermes" "11.3.6" - "@react-native-community/cli-plugin-metro" "11.3.6" - "@react-native-community/cli-server-api" "11.3.6" - "@react-native-community/cli-tools" "11.3.6" - "@react-native-community/cli-types" "11.3.6" +"@react-native-community/cli@11.3.7": + version "11.3.7" + resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-11.3.7.tgz#564c0054269d8385fa9d301750b2e56dbb5c0cc9" + integrity sha512-Ou8eDlF+yh2rzXeCTpMPYJ2fuqsusNOhmpYPYNQJQ2h6PvaF30kPomflgRILems+EBBuggRtcT+I+1YH4o/q6w== + dependencies: + "@react-native-community/cli-clean" "11.3.7" + "@react-native-community/cli-config" "11.3.7" + "@react-native-community/cli-debugger-ui" "11.3.7" + "@react-native-community/cli-doctor" "11.3.7" + "@react-native-community/cli-hermes" "11.3.7" + "@react-native-community/cli-plugin-metro" "11.3.7" + "@react-native-community/cli-server-api" "11.3.7" + "@react-native-community/cli-tools" "11.3.7" + "@react-native-community/cli-types" "11.3.7" chalk "^4.1.2" commander "^9.4.1" execa "^5.0.0" @@ -2216,14 +2151,17 @@ resolved "https://registry.yarnpkg.com/@react-native/assets-registry/-/assets-registry-0.72.0.tgz#c82a76a1d86ec0c3907be76f7faf97a32bbed05d" integrity sha512-Im93xRJuHHxb1wniGhBMsxLwcfzdYreSZVQGDoMJgkd6+Iky61LInGEHnQCTN0fKNYF1Dvcofb4uMmE1RQHXHQ== -"@react-native/codegen@^0.72.6": - version "0.72.6" - resolved "https://registry.yarnpkg.com/@react-native/codegen/-/codegen-0.72.6.tgz#029cf61f82f5c6872f0b2ce58f27c4239a5586c8" - integrity sha512-idTVI1es/oopN0jJT/0jB6nKdvTUKE3757zA5+NPXZTeB46CIRbmmos4XBiAec8ufu9/DigLPbHTYAaMNZJ6Ig== +"@react-native/codegen@^0.72.7": + version "0.72.8" + resolved "https://registry.yarnpkg.com/@react-native/codegen/-/codegen-0.72.8.tgz#0593f628e1310f430450a9479fbb4be35e7b63d6" + integrity sha512-jQCcBlXV7B7ap5VlHhwIPieYz89yiRgwd2FPUBu+unz+kcJ6pAiB2U8RdLDmyIs8fiWd+Vq1xxaWs4TR329/ng== dependencies: "@babel/parser" "^7.20.0" flow-parser "^0.206.0" + glob "^7.1.1" + invariant "^2.2.4" jscodeshift "^0.14.0" + mkdirp "^0.5.1" nullthrows "^1.1.1" "@react-native/gradle-plugin@^0.72.11": @@ -2259,46 +2197,46 @@ invariant "^2.2.4" nullthrows "^1.1.1" -"@react-navigation/bottom-tabs@^6.5.7": - version "6.5.8" - resolved "https://registry.yarnpkg.com/@react-navigation/bottom-tabs/-/bottom-tabs-6.5.8.tgz#9536c6e45154abc183c363d07c94991e10b14856" - integrity sha512-0aa/jXea+LyBgR5NoRNWGKw0aFhjHwCkusigMRXIrCA4kINauDcAO0w0iFbZeKfaTCVAix5kK5UxDJJ2aJpevg== +"@react-navigation/bottom-tabs@^6.5.11": + version "6.5.11" + resolved "https://registry.yarnpkg.com/@react-navigation/bottom-tabs/-/bottom-tabs-6.5.11.tgz#b6e67a3aa19e60ed9c1139fa0253586c479832d5" + integrity sha512-CBN/NOdxnMvmjw+AJQI1kltOYaClTZmGec5pQ3ZNTPX86ytbIOylDIITKMfTgHZcIEFQDymx1SHeS++PIL3Szw== dependencies: - "@react-navigation/elements" "^1.3.18" + "@react-navigation/elements" "^1.3.21" color "^4.2.3" warn-once "^0.1.0" -"@react-navigation/core@^6.4.9": - version "6.4.9" - resolved "https://registry.yarnpkg.com/@react-navigation/core/-/core-6.4.9.tgz#aa09ce534f5393427cb993cf242abdbd848fb2c7" - integrity sha512-G9GH7bP9x0qqupxZnkSftnkn4JoXancElTvFc8FVGfEvxnxP+gBo3wqcknyBi7M5Vad4qecsYjCOa9wqsftv9g== +"@react-navigation/core@^6.4.10": + version "6.4.10" + resolved "https://registry.yarnpkg.com/@react-navigation/core/-/core-6.4.10.tgz#0c52621968b35e3a75e189e823d3b9e3bad77aff" + integrity sha512-oYhqxETRHNHKsipm/BtGL0LI43Hs2VSFoWMbBdHK9OqgQPjTVUitslgLcPpo4zApCcmBWoOLX2qPxhsBda644A== dependencies: "@react-navigation/routers" "^6.1.9" escape-string-regexp "^4.0.0" nanoid "^3.1.23" query-string "^7.1.3" react-is "^16.13.0" - use-latest-callback "^0.1.5" + use-latest-callback "^0.1.7" -"@react-navigation/elements@^1.3.18": - version "1.3.18" - resolved "https://registry.yarnpkg.com/@react-navigation/elements/-/elements-1.3.18.tgz#d8364b40276f3efb9c229c39da3b8b465f18f0a2" - integrity sha512-/0hwnJkrr415yP0Hf4PjUKgGyfshrvNUKFXN85Mrt1gY49hy9IwxZgrrxlh0THXkPeq8q4VWw44eHDfAcQf20Q== +"@react-navigation/elements@^1.3.21": + version "1.3.21" + resolved "https://registry.yarnpkg.com/@react-navigation/elements/-/elements-1.3.21.tgz#debac6becc6b6692da09ec30e705e476a780dfe1" + integrity sha512-eyS2C6McNR8ihUoYfc166O1D8VYVh9KIl0UQPI8/ZJVsStlfSTgeEEh+WXge6+7SFPnZ4ewzEJdSAHH+jzcEfg== -"@react-navigation/native-stack@^6.9.12": - version "6.9.13" - resolved "https://registry.yarnpkg.com/@react-navigation/native-stack/-/native-stack-6.9.13.tgz#f308c398ee18fcd45de8ec7c04fe0641735feb31" - integrity sha512-ejlepMrvFneewL+XlXHHhn+6y3lwvavM4/R7XwBV0XJxCymujexK+7Vkg7UcvJ1lx4CRhOcyBSNfGmdNIHREyQ== +"@react-navigation/native-stack@^6.9.17": + version "6.9.17" + resolved "https://registry.yarnpkg.com/@react-navigation/native-stack/-/native-stack-6.9.17.tgz#4fc370b14be07296423ae8c00940fb002c6001b5" + integrity sha512-X8p8aS7JptQq7uZZNFEvfEcPf6tlK4PyVwYDdryRbG98B4bh2wFQYMThxvqa+FGEN7USEuHdv2mF0GhFKfX0ew== dependencies: - "@react-navigation/elements" "^1.3.18" + "@react-navigation/elements" "^1.3.21" warn-once "^0.1.0" -"@react-navigation/native@^6.1.6": - version "6.1.7" - resolved "https://registry.yarnpkg.com/@react-navigation/native/-/native-6.1.7.tgz#968ef85b76d35f63111890668836fe2f125bbf90" - integrity sha512-W6E3+AtTombMucCRo6q7vPmluq8hSjS+IxfazJ/SokOe7ChJX7eLvvralIsJkjFj3iWV1KgOSnHxa6hdiFasBw== +"@react-navigation/native@^6.1.9": + version "6.1.9" + resolved "https://registry.yarnpkg.com/@react-navigation/native/-/native-6.1.9.tgz#8ef87095cd9c2ed094308c726157c7f6fc28796e" + integrity sha512-AMuJDpwXE7UlfyhIXaUCCynXmv69Kb8NzKgKJO7v0k0L+u6xUTbt6xvshmJ79vsvaFyaEH9Jg5FMzek5/S5qNw== dependencies: - "@react-navigation/core" "^6.4.9" + "@react-navigation/core" "^6.4.10" escape-string-regexp "^4.0.0" fast-deep-equal "^3.1.3" nanoid "^3.1.23" @@ -2310,12 +2248,12 @@ dependencies: nanoid "^3.1.23" -"@react-navigation/stack@^6.3.16": - version "6.3.17" - resolved "https://registry.yarnpkg.com/@react-navigation/stack/-/stack-6.3.17.tgz#dd3375916a2adaa130659c0113fe05939bc19470" - integrity sha512-8/8ZvJROK3fp6PRmQ9MrXd9epBowA8NkfCaWW/N9H5arqwNX9lTXAkmcjicRhjpX+UNlMBR9dTLkWvPRe2vY9A== +"@react-navigation/stack@^6.3.20": + version "6.3.20" + resolved "https://registry.yarnpkg.com/@react-navigation/stack/-/stack-6.3.20.tgz#8eec944888f317bb1ba1ff30e7f513806bea16c2" + integrity sha512-vE6mgZzOgoa5Uy7ayT97Cj+ZIK7DK+JBYVuKUViILlWZy6IWK7HFDuqoChSbZ1ajTIfAxj/acVGg1jkbAKsToA== dependencies: - "@react-navigation/elements" "^1.3.18" + "@react-navigation/elements" "^1.3.21" color "^4.2.3" warn-once "^0.1.0" @@ -2363,12 +2301,13 @@ dependencies: "@sinonjs/commons" "^3.0.0" -"@tatumio/tatum@^3.0.14": - version "3.0.14" - resolved "https://registry.yarnpkg.com/@tatumio/tatum/-/tatum-3.0.14.tgz#2661cb898e44caf8d0508a5eda4b852eb0c0d36a" - integrity sha512-BLB7yW49kHTom/3FiVpQIhArOm0T7NwAM4d4wTOslt86ymvxmvUyjwrmfYV3wRK6GL/T1TAz3bLqxsw7R3nx5A== +"@tatumio/tatum@^4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@tatumio/tatum/-/tatum-4.2.2.tgz#ab7246a78d393e3ebb63b058d0b157fc4d91510b" + integrity sha512-ZJkEyHP9ACQcX4tGpjCx9qif/8/Dp7iCO5pjjbiZWV+DLiFDbTr4QqliUBDsK0p5+E8PfXeYT8e3otus2vjsFg== dependencies: bignumber.js "^9.1.1" + chalk "^4.1.2" reflect-metadata "^0.1.13" typedi "^0.10.0" @@ -2582,11 +2521,6 @@ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== -"@types/stylis@^4.0.2": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@types/stylis/-/stylis-4.2.0.tgz#199a3f473f0c3a6f6e4e1b17cdbc967f274bdc6b" - integrity sha512-n4sx2bqL0mW1tvDf/loQ+aMX7GQD3lc3fkCMC55VFNDu/vBOabO+LTIeXKM14xK0ppk5TUGcWRjiSpIlUpghKw== - "@types/tough-cookie@*": version "4.0.2" resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.2.tgz#6286b4c7228d58ab7866d19716f3696e03a09397" @@ -2871,7 +2805,7 @@ any-promise@^1.0.0: resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== -anymatch@^3.0.3, anymatch@~3.1.2: +anymatch@^3.0.3: version "3.1.3" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== @@ -3022,12 +2956,12 @@ available-typed-arrays@^1.0.5: resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== -axios@^1.4.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.5.0.tgz#f02e4af823e2e46a9768cfc74691fdd0517ea267" - integrity sha512-D4DdjDo5CY50Qms0qGQTTw6Q44jl7zRwY7bthds06pUGfChBCTcQs+N743eFWGEd6pRTMd6A+I87aWyFV5wiZQ== +axios@^1.6.5: + version "1.6.5" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.5.tgz#2c090da14aeeab3770ad30c3a1461bc970fb0cd8" + integrity sha512-Ii012v05KEVuUoFWmMW/UQv9aRIc3ZwkWDcM+h5Il8izZCtRVpDUfwpoFf7eOtajT3QiGR4yDUx7lPqHJULgbg== dependencies: - follow-redirects "^1.15.0" + follow-redirects "^1.15.4" form-data "^4.0.0" proxy-from-env "^1.1.0" @@ -3222,11 +3156,6 @@ bignumber.js@^9.1.1: resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.1.tgz#c4df7dc496bd849d4c9464344c1aa74228b4dac6" integrity sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig== -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - bl@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" @@ -3300,7 +3229,7 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" -braces@^3.0.2, braces@~3.0.2: +braces@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== @@ -3436,11 +3365,6 @@ camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -camelize@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.1.tgz#89b7e16884056331a35d6b5ad064332c91daa6c3" - integrity sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ== - caniuse-lite@^1.0.30001517: version "1.0.30001524" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001524.tgz#1e14bce4f43c41a7deaeb5ebfe86664fe8dadb80" @@ -3486,21 +3410,6 @@ charenc@0.0.2, charenc@~0.0.1: resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== -chokidar@^3.4.0: - version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - chownr@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" @@ -3662,7 +3571,7 @@ commander@^2.20.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -commander@^4.0.0, commander@^4.0.1: +commander@^4.0.0: version "4.1.1" resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== @@ -3737,7 +3646,7 @@ content-type@~1.0.5: resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== -convert-source-map@^1.1.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: +convert-source-map@^1.6.0, convert-source-map@^1.7.0: version "1.9.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== @@ -3811,11 +3720,6 @@ crypto-random-string@^2.0.0: resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== -css-color-keywords@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05" - integrity sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg== - css-select@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" @@ -3827,15 +3731,6 @@ css-select@^5.1.0: domutils "^3.0.1" nth-check "^2.0.1" -css-to-react-native@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-3.2.0.tgz#cdd8099f71024e149e4f6fe17a7d46ecd55f1e32" - integrity sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ== - dependencies: - camelize "^1.0.0" - css-color-keywords "^1.0.0" - postcss-value-parser "^4.0.2" - css-tree@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" @@ -3866,7 +3761,7 @@ cssstyle@^2.3.0: dependencies: cssom "~0.3.6" -csstype@^3.0.2, csstype@^3.1.2: +csstype@^3.0.2: version "3.1.2" resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== @@ -4686,10 +4581,10 @@ expo-network@~5.4.0: resolved "https://registry.yarnpkg.com/expo-network/-/expo-network-5.4.0.tgz#4eddde3e54a80b46c7cd2e4ce22a98e61aa97468" integrity sha512-6Hdm6CRmt7KpEYSTp9Q0fH1V63Y3tLlgkZfJBqJHksxEP/ooOjBLsK8M09q+FiWsStByI/PKj6NO86+uymz5ig== -expo-screen-orientation@~6.0.5: - version "6.0.5" - resolved "https://registry.yarnpkg.com/expo-screen-orientation/-/expo-screen-orientation-6.0.5.tgz#4fcac69c641522c7e658d4fb20b22de82d732aee" - integrity sha512-aOOuuQkxNHNxSzfEO037jnD0zYiwBVTvuXeFy/0KntFmuqWmZGaFmFks1uTA2+0wKlbA049kVjkBnA1peybmHQ== +expo-screen-orientation@~6.0.6: + version "6.0.6" + resolved "https://registry.yarnpkg.com/expo-screen-orientation/-/expo-screen-orientation-6.0.6.tgz#48b395bde2c4aa8d5236fc570bc36a7681895030" + integrity sha512-qiTGX1udJi6hj+8JUP9C27+TJDU7+42HcYcgmGd5hi/iXvIK1YwuCkXFdny+BkiapFb5jQnJCBZfdhMk1fjh+Q== expo-secure-store@~12.3.1: version "12.3.1" @@ -4919,10 +4814,10 @@ flow-parser@^0.206.0: resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.206.0.tgz#f4f794f8026535278393308e01ea72f31000bfef" integrity sha512-HVzoK3r6Vsg+lKvlIZzaWNBVai+FXTX1wdYhz/wVlH13tb/gOdLXmlTqy6odmTBhT5UoWUbq0k8263Qhr9d88w== -follow-redirects@^1.15.0: - version "1.15.2" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" - integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== +follow-redirects@^1.15.4: + version "1.15.5" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.5.tgz#54d4d6d062c0fa7d9d17feb008461550e3ba8020" + integrity sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw== fontfaceobserver@^2.1.0: version "2.3.0" @@ -5021,17 +4916,12 @@ fs-minipass@^2.0.0: dependencies: minipass "^3.0.0" -fs-readdir-recursive@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" - integrity sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA== - fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@^2.3.2, fsevents@~2.3.2: +fsevents@^2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== @@ -5111,7 +5001,7 @@ getenv@^1.0.0: resolved "https://registry.yarnpkg.com/getenv/-/getenv-1.0.0.tgz#874f2e7544fbca53c7a4738f37de8605c3fcfc31" integrity sha512-7yetJWqbS9sbn0vIfliPsFgoXMKn/YMF+Wuiog97x+urnSRRRZ7xB+uVkwGKzRgq9CDFfMQnE9ruL5DHv9c6Xg== -glob-parent@^5.1.2, glob-parent@~5.1.2: +glob-parent@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== @@ -5148,7 +5038,7 @@ glob@^6.0.1: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.2.0: +glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -5367,12 +5257,12 @@ human-signals@^2.1.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== -i18next@^22.5.0: - version "22.5.1" - resolved "https://registry.yarnpkg.com/i18next/-/i18next-22.5.1.tgz#99df0b318741a506000c243429a7352e5f44d424" - integrity sha512-8TGPgM3pAD+VRsMtUMNknRz3kzqwp/gPALrWMsDnmC1mKqJwpWyooQRLMcbTwq8z8YwSmuj+ZYvc+xCuEpkssA== +i18next@^23.7.16: + version "23.7.16" + resolved "https://registry.yarnpkg.com/i18next/-/i18next-23.7.16.tgz#7026d18b7a3ac9e2ecfeb78da5e4da5ca33312ef" + integrity sha512-SrqFkMn9W6Wb43ZJ9qrO6U2U4S80RsFMA7VYFSqp7oc7RllQOYDCdRfsse6A7Cq/V8MnpxKvJCYgM8++27n4Fw== dependencies: - "@babel/runtime" "^7.20.6" + "@babel/runtime" "^7.23.2" iconv-lite@0.4.24: version "0.4.24" @@ -5534,13 +5424,6 @@ is-bigint@^1.0.1: dependencies: has-bigints "^1.0.1" -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - is-boolean-object@^1.1.0: version "1.1.2" resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" @@ -5629,7 +5512,7 @@ is-glob@^2.0.0: dependencies: is-extglob "^1.0.0" -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== @@ -6773,53 +6656,53 @@ merge2@^1.3.0, merge2@^1.4.1: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -metro-babel-transformer@0.76.7: - version "0.76.7" - resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.76.7.tgz#ba620d64cbaf97d1aa14146d654a3e5d7477fc62" - integrity sha512-bgr2OFn0J4r0qoZcHrwEvccF7g9k3wdgTOgk6gmGHrtlZ1Jn3oCpklW/DfZ9PzHfjY2mQammKTc19g/EFGyOJw== +metro-babel-transformer@0.76.8: + version "0.76.8" + resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.76.8.tgz#5efd1027353b36b73706164ef09c290dceac096a" + integrity sha512-Hh6PW34Ug/nShlBGxkwQJSgPGAzSJ9FwQXhUImkzdsDgVu6zj5bx258J8cJVSandjNoQ8nbaHK6CaHlnbZKbyA== dependencies: "@babel/core" "^7.20.0" hermes-parser "0.12.0" nullthrows "^1.1.1" -metro-cache-key@0.76.7: - version "0.76.7" - resolved "https://registry.yarnpkg.com/metro-cache-key/-/metro-cache-key-0.76.7.tgz#70913f43b92b313096673c37532edd07438cb325" - integrity sha512-0pecoIzwsD/Whn/Qfa+SDMX2YyasV0ndbcgUFx7w1Ct2sLHClujdhQ4ik6mvQmsaOcnGkIyN0zcceMDjC2+BFQ== +metro-cache-key@0.76.8: + version "0.76.8" + resolved "https://registry.yarnpkg.com/metro-cache-key/-/metro-cache-key-0.76.8.tgz#8a0a5e991c06f56fcc584acadacb313c312bdc16" + integrity sha512-buKQ5xentPig9G6T37Ww/R/bC+/V1MA5xU/D8zjnhlelsrPG6w6LtHUS61ID3zZcMZqYaELWk5UIadIdDsaaLw== -metro-cache@0.76.7: - version "0.76.7" - resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.76.7.tgz#e49e51423fa960df4eeff9760d131f03e003a9eb" - integrity sha512-nWBMztrs5RuSxZRI7hgFgob5PhYDmxICh9FF8anm9/ito0u0vpPvRxt7sRu8fyeD2AHdXqE7kX32rWY0LiXgeg== +metro-cache@0.76.8: + version "0.76.8" + resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.76.8.tgz#296c1c189db2053b89735a8f33dbe82575f53661" + integrity sha512-QBJSJIVNH7Hc/Yo6br/U/qQDUpiUdRgZ2ZBJmvAbmAKp2XDzsapnMwK/3BGj8JNWJF7OLrqrYHsRsukSbUBpvQ== dependencies: - metro-core "0.76.7" + metro-core "0.76.8" rimraf "^3.0.2" -metro-config@0.76.7: - version "0.76.7" - resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.76.7.tgz#f0fc171707523aa7d3a9311550872136880558c0" - integrity sha512-CFDyNb9bqxZemiChC/gNdXZ7OQkIwmXzkrEXivcXGbgzlt/b2juCv555GWJHyZSlorwnwJfY3uzAFu4A9iRVfg== +metro-config@0.76.8: + version "0.76.8" + resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.76.8.tgz#20bd5397fcc6096f98d2a813a7cecb38b8af062d" + integrity sha512-SL1lfKB0qGHALcAk2zBqVgQZpazDYvYFGwCK1ikz0S6Y/CM2i2/HwuZN31kpX6z3mqjv/6KvlzaKoTb1otuSAA== dependencies: connect "^3.6.5" cosmiconfig "^5.0.5" jest-validate "^29.2.1" - metro "0.76.7" - metro-cache "0.76.7" - metro-core "0.76.7" - metro-runtime "0.76.7" + metro "0.76.8" + metro-cache "0.76.8" + metro-core "0.76.8" + metro-runtime "0.76.8" -metro-core@0.76.7: - version "0.76.7" - resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.76.7.tgz#5d2b8bac2cde801dc22666ad7be1336d1f021b61" - integrity sha512-0b8KfrwPmwCMW+1V7ZQPkTy2tsEKZjYG9Pu1PTsu463Z9fxX7WaR0fcHFshv+J1CnQSUTwIGGjbNvj1teKe+pw== +metro-core@0.76.8: + version "0.76.8" + resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.76.8.tgz#917c8157c63406cb223522835abb8e7c6291dcad" + integrity sha512-sl2QLFI3d1b1XUUGxwzw/KbaXXU/bvFYrSKz6Sg19AdYGWFyzsgZ1VISRIDf+HWm4R/TJXluhWMEkEtZuqi3qA== dependencies: lodash.throttle "^4.1.1" - metro-resolver "0.76.7" + metro-resolver "0.76.8" -metro-file-map@0.76.7: - version "0.76.7" - resolved "https://registry.yarnpkg.com/metro-file-map/-/metro-file-map-0.76.7.tgz#0f041a4f186ac672f0188180310609c8483ffe89" - integrity sha512-s+zEkTcJ4mOJTgEE2ht4jIo1DZfeWreQR3tpT3gDV/Y/0UQ8aJBTv62dE775z0GLsWZApiblAYZsj7ZE8P06nw== +metro-file-map@0.76.8: + version "0.76.8" + resolved "https://registry.yarnpkg.com/metro-file-map/-/metro-file-map-0.76.8.tgz#a1db1185b6c316904ba6b53d628e5d1323991d79" + integrity sha512-A/xP1YNEVwO1SUV9/YYo6/Y1MmzhL4ZnVgcJC3VmHp/BYVOXVStzgVbWv2wILe56IIMkfXU+jpXrGKKYhFyHVw== dependencies: anymatch "^3.0.3" debug "^2.2.0" @@ -6836,10 +6719,10 @@ metro-file-map@0.76.7: optionalDependencies: fsevents "^2.3.2" -metro-inspector-proxy@0.76.7: - version "0.76.7" - resolved "https://registry.yarnpkg.com/metro-inspector-proxy/-/metro-inspector-proxy-0.76.7.tgz#c067df25056e932002a72a4b45cf7b4b749f808e" - integrity sha512-rNZ/6edTl/1qUekAhAbaFjczMphM50/UjtxiKulo6vqvgn/Mjd9hVqDvVYfAMZXqPvlusD88n38UjVYPkruLSg== +metro-inspector-proxy@0.76.8: + version "0.76.8" + resolved "https://registry.yarnpkg.com/metro-inspector-proxy/-/metro-inspector-proxy-0.76.8.tgz#6b8678a7461b0b42f913a7881cc9319b4d3cddff" + integrity sha512-Us5o5UEd4Smgn1+TfHX4LvVPoWVo9VsVMn4Ldbk0g5CQx3Gu0ygc/ei2AKPGTwsOZmKxJeACj7yMH2kgxQP/iw== dependencies: connect "^3.6.5" debug "^2.2.0" @@ -6847,65 +6730,20 @@ metro-inspector-proxy@0.76.7: ws "^7.5.1" yargs "^17.6.2" -metro-minify-terser@0.76.7: - version "0.76.7" - resolved "https://registry.yarnpkg.com/metro-minify-terser/-/metro-minify-terser-0.76.7.tgz#aefac8bb8b6b3a0fcb5ea0238623cf3e100893ff" - integrity sha512-FQiZGhIxCzhDwK4LxyPMLlq0Tsmla10X7BfNGlYFK0A5IsaVKNJbETyTzhpIwc+YFRT4GkFFwgo0V2N5vxO5HA== +metro-minify-terser@0.76.8: + version "0.76.8" + resolved "https://registry.yarnpkg.com/metro-minify-terser/-/metro-minify-terser-0.76.8.tgz#915ab4d1419257fc6a0b9fa15827b83fe69814bf" + integrity sha512-Orbvg18qXHCrSj1KbaeSDVYRy/gkro2PC7Fy2tDSH1c9RB4aH8tuMOIXnKJE+1SXxBtjWmQ5Yirwkth2DyyEZA== dependencies: terser "^5.15.0" -metro-minify-uglify@0.76.7: - version "0.76.7" - resolved "https://registry.yarnpkg.com/metro-minify-uglify/-/metro-minify-uglify-0.76.7.tgz#3e0143786718dcaea4e28a724698d4f8ac199a43" - integrity sha512-FuXIU3j2uNcSvQtPrAJjYWHruPiQ+EpE++J9Z+VznQKEHcIxMMoQZAfIF2IpZSrZYfLOjVFyGMvj41jQMxV1Vw== +metro-minify-uglify@0.76.8: + version "0.76.8" + resolved "https://registry.yarnpkg.com/metro-minify-uglify/-/metro-minify-uglify-0.76.8.tgz#74745045ea2dd29f8783db483b2fce58385ba695" + integrity sha512-6l8/bEvtVaTSuhG1FqS0+Mc8lZ3Bl4RI8SeRIifVLC21eeSDp4CEBUWSGjpFyUDfi6R5dXzYaFnSgMNyfxADiQ== dependencies: uglify-es "^3.1.9" -metro-react-native-babel-preset@0.76.7: - version "0.76.7" - resolved "https://registry.yarnpkg.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.76.7.tgz#dfe15c040d0918147a8b0e9f530d558287acbb54" - integrity sha512-R25wq+VOSorAK3hc07NW0SmN8z9S/IR0Us0oGAsBcMZnsgkbOxu77Mduqf+f4is/wnWHc5+9bfiqdLnaMngiVw== - dependencies: - "@babel/core" "^7.20.0" - "@babel/plugin-proposal-async-generator-functions" "^7.0.0" - "@babel/plugin-proposal-class-properties" "^7.18.0" - "@babel/plugin-proposal-export-default-from" "^7.0.0" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.0" - "@babel/plugin-proposal-numeric-separator" "^7.0.0" - "@babel/plugin-proposal-object-rest-spread" "^7.20.0" - "@babel/plugin-proposal-optional-catch-binding" "^7.0.0" - "@babel/plugin-proposal-optional-chaining" "^7.20.0" - "@babel/plugin-syntax-dynamic-import" "^7.8.0" - "@babel/plugin-syntax-export-default-from" "^7.0.0" - "@babel/plugin-syntax-flow" "^7.18.0" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.0.0" - "@babel/plugin-syntax-optional-chaining" "^7.0.0" - "@babel/plugin-transform-arrow-functions" "^7.0.0" - "@babel/plugin-transform-async-to-generator" "^7.20.0" - "@babel/plugin-transform-block-scoping" "^7.0.0" - "@babel/plugin-transform-classes" "^7.0.0" - "@babel/plugin-transform-computed-properties" "^7.0.0" - "@babel/plugin-transform-destructuring" "^7.20.0" - "@babel/plugin-transform-flow-strip-types" "^7.20.0" - "@babel/plugin-transform-function-name" "^7.0.0" - "@babel/plugin-transform-literals" "^7.0.0" - "@babel/plugin-transform-modules-commonjs" "^7.0.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.0.0" - "@babel/plugin-transform-parameters" "^7.0.0" - "@babel/plugin-transform-react-display-name" "^7.0.0" - "@babel/plugin-transform-react-jsx" "^7.0.0" - "@babel/plugin-transform-react-jsx-self" "^7.0.0" - "@babel/plugin-transform-react-jsx-source" "^7.0.0" - "@babel/plugin-transform-runtime" "^7.0.0" - "@babel/plugin-transform-shorthand-properties" "^7.0.0" - "@babel/plugin-transform-spread" "^7.0.0" - "@babel/plugin-transform-sticky-regex" "^7.0.0" - "@babel/plugin-transform-typescript" "^7.5.0" - "@babel/plugin-transform-unicode-regex" "^7.0.0" - "@babel/template" "^7.0.0" - babel-plugin-transform-flow-enums "^0.0.2" - react-refresh "^0.4.0" - metro-react-native-babel-preset@0.76.8, metro-react-native-babel-preset@^0.76.4: version "0.76.8" resolved "https://registry.yarnpkg.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.76.8.tgz#7476efae14363cbdfeeec403b4f01d7348e6c048" @@ -6951,29 +6789,21 @@ metro-react-native-babel-preset@0.76.8, metro-react-native-babel-preset@^0.76.4: babel-plugin-transform-flow-enums "^0.0.2" react-refresh "^0.4.0" -metro-react-native-babel-transformer@0.76.7: - version "0.76.7" - resolved "https://registry.yarnpkg.com/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.76.7.tgz#ccc7c25b49ee8a1860aafdbf48bfa5441d206f8f" - integrity sha512-W6lW3J7y/05ph3c2p3KKJNhH0IdyxdOCbQ5it7aM2MAl0SM4wgKjaV6EYv9b3rHklpV6K3qMH37UKVcjMooWiA== +metro-react-native-babel-transformer@0.76.8: + version "0.76.8" + resolved "https://registry.yarnpkg.com/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.76.8.tgz#c3a98e1f4cd5faf1e21eba8e004b94a90c4db69b" + integrity sha512-3h+LfS1WG1PAzhq8QF0kfXjxuXetbY/lgz8vYMQhgrMMp17WM1DNJD0gjx8tOGYbpbBC1qesJ45KMS4o5TA73A== dependencies: "@babel/core" "^7.20.0" babel-preset-fbjs "^3.4.0" hermes-parser "0.12.0" - metro-react-native-babel-preset "0.76.7" + metro-react-native-babel-preset "0.76.8" nullthrows "^1.1.1" -metro-resolver@0.76.7: - version "0.76.7" - resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.76.7.tgz#f00ebead64e451c060f30926ecbf4f797588df52" - integrity sha512-pC0Wgq29HHIHrwz23xxiNgylhI8Rq1V01kQaJ9Kz11zWrIdlrH0ZdnJ7GC6qA0ErROG+cXmJ0rJb8/SW1Zp2IA== - -metro-runtime@0.76.7: - version "0.76.7" - resolved "https://registry.yarnpkg.com/metro-runtime/-/metro-runtime-0.76.7.tgz#4d75f2dbbcd19a4f01e0d89494e140b0ba8247e4" - integrity sha512-MuWHubQHymUWBpZLwuKZQgA/qbb35WnDAKPo83rk7JRLIFPvzXSvFaC18voPuzJBt1V98lKQIonh6MiC9gd8Ug== - dependencies: - "@babel/runtime" "^7.0.0" - react-refresh "^0.4.0" +metro-resolver@0.76.8: + version "0.76.8" + resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.76.8.tgz#0862755b9b84e26853978322464fb37c6fdad76d" + integrity sha512-KccOqc10vrzS7ZhG2NSnL2dh3uVydarB7nOhjreQ7C4zyWuiW9XpLC4h47KtGQv3Rnv/NDLJYeDqaJ4/+140HQ== metro-runtime@0.76.8: version "0.76.8" @@ -6983,20 +6813,6 @@ metro-runtime@0.76.8: "@babel/runtime" "^7.0.0" react-refresh "^0.4.0" -metro-source-map@0.76.7: - version "0.76.7" - resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.76.7.tgz#9a4aa3a35e1e8ffde9a74cd7ab5f49d9d4a4da14" - integrity sha512-Prhx7PeRV1LuogT0Kn5VjCuFu9fVD68eefntdWabrksmNY6mXK8pRqzvNJOhTojh6nek+RxBzZeD6MIOOyXS6w== - dependencies: - "@babel/traverse" "^7.20.0" - "@babel/types" "^7.20.0" - invariant "^2.2.4" - metro-symbolicate "0.76.7" - nullthrows "^1.1.1" - ob1 "0.76.7" - source-map "^0.5.6" - vlq "^1.0.0" - metro-source-map@0.76.8: version "0.76.8" resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.76.8.tgz#f085800152a6ba0b41ca26833874d31ec36c5a53" @@ -7011,18 +6827,6 @@ metro-source-map@0.76.8: source-map "^0.5.6" vlq "^1.0.0" -metro-symbolicate@0.76.7: - version "0.76.7" - resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.76.7.tgz#1720e6b4ce5676935d7a8a440f25d3f16638e87a" - integrity sha512-p0zWEME5qLSL1bJb93iq+zt5fz3sfVn9xFYzca1TJIpY5MommEaS64Va87lp56O0sfEIvh4307Oaf/ZzRjuLiQ== - dependencies: - invariant "^2.2.4" - metro-source-map "0.76.7" - nullthrows "^1.1.1" - source-map "^0.5.6" - through2 "^2.0.1" - vlq "^1.0.0" - metro-symbolicate@0.76.8: version "0.76.8" resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.76.8.tgz#f102ac1a306d51597ecc8fdf961c0a88bddbca03" @@ -7035,10 +6839,10 @@ metro-symbolicate@0.76.8: through2 "^2.0.1" vlq "^1.0.0" -metro-transform-plugins@0.76.7: - version "0.76.7" - resolved "https://registry.yarnpkg.com/metro-transform-plugins/-/metro-transform-plugins-0.76.7.tgz#5d5f75371706fbf5166288e43ffd36b5e5bd05bc" - integrity sha512-iSmnjVApbdivjuzb88Orb0JHvcEt5veVyFAzxiS5h0QB+zV79w6JCSqZlHCrbNOkOKBED//LqtKbFVakxllnNg== +metro-transform-plugins@0.76.8: + version "0.76.8" + resolved "https://registry.yarnpkg.com/metro-transform-plugins/-/metro-transform-plugins-0.76.8.tgz#d77c28a6547a8e3b72250f740fcfbd7f5408f8ba" + integrity sha512-PlkGTQNqS51Bx4vuufSQCdSn2R2rt7korzngo+b5GCkeX5pjinPjnO2kNhQ8l+5bO0iUD/WZ9nsM2PGGKIkWFA== dependencies: "@babel/core" "^7.20.0" "@babel/generator" "^7.20.0" @@ -7046,28 +6850,28 @@ metro-transform-plugins@0.76.7: "@babel/traverse" "^7.20.0" nullthrows "^1.1.1" -metro-transform-worker@0.76.7: - version "0.76.7" - resolved "https://registry.yarnpkg.com/metro-transform-worker/-/metro-transform-worker-0.76.7.tgz#b842d5a542f1806cca401633fc002559b3e3d668" - integrity sha512-cGvELqFMVk9XTC15CMVzrCzcO6sO1lURfcbgjuuPdzaWuD11eEyocvkTX0DPiRjsvgAmicz4XYxVzgYl3MykDw== +metro-transform-worker@0.76.8: + version "0.76.8" + resolved "https://registry.yarnpkg.com/metro-transform-worker/-/metro-transform-worker-0.76.8.tgz#b9012a196cee205170d0c899b8b175b9305acdea" + integrity sha512-mE1fxVAnJKmwwJyDtThildxxos9+DGs9+vTrx2ktSFMEVTtXS/bIv2W6hux1pqivqAfyJpTeACXHk5u2DgGvIQ== dependencies: "@babel/core" "^7.20.0" "@babel/generator" "^7.20.0" "@babel/parser" "^7.20.0" "@babel/types" "^7.20.0" babel-preset-fbjs "^3.4.0" - metro "0.76.7" - metro-babel-transformer "0.76.7" - metro-cache "0.76.7" - metro-cache-key "0.76.7" - metro-source-map "0.76.7" - metro-transform-plugins "0.76.7" + metro "0.76.8" + metro-babel-transformer "0.76.8" + metro-cache "0.76.8" + metro-cache-key "0.76.8" + metro-source-map "0.76.8" + metro-transform-plugins "0.76.8" nullthrows "^1.1.1" -metro@0.76.7: - version "0.76.7" - resolved "https://registry.yarnpkg.com/metro/-/metro-0.76.7.tgz#4885917ad28738c7d1e556630e0155f687336230" - integrity sha512-67ZGwDeumEPnrHI+pEDSKH2cx+C81Gx8Mn5qOtmGUPm/Up9Y4I1H2dJZ5n17MWzejNo0XAvPh0QL0CrlJEODVQ== +metro@0.76.8: + version "0.76.8" + resolved "https://registry.yarnpkg.com/metro/-/metro-0.76.8.tgz#ba526808b99977ca3f9ac5a7432fd02a340d13a6" + integrity sha512-oQA3gLzrrYv3qKtuWArMgHPbHu8odZOD9AoavrqSFllkPgOtmkBvNNDLCELqv5SjBfqjISNffypg+5UGG3y0pg== dependencies: "@babel/code-frame" "^7.0.0" "@babel/core" "^7.20.0" @@ -7091,22 +6895,22 @@ metro@0.76.7: jest-worker "^27.2.0" jsc-safe-url "^0.2.2" lodash.throttle "^4.1.1" - metro-babel-transformer "0.76.7" - metro-cache "0.76.7" - metro-cache-key "0.76.7" - metro-config "0.76.7" - metro-core "0.76.7" - metro-file-map "0.76.7" - metro-inspector-proxy "0.76.7" - metro-minify-terser "0.76.7" - metro-minify-uglify "0.76.7" - metro-react-native-babel-preset "0.76.7" - metro-resolver "0.76.7" - metro-runtime "0.76.7" - metro-source-map "0.76.7" - metro-symbolicate "0.76.7" - metro-transform-plugins "0.76.7" - metro-transform-worker "0.76.7" + metro-babel-transformer "0.76.8" + metro-cache "0.76.8" + metro-cache-key "0.76.8" + metro-config "0.76.8" + metro-core "0.76.8" + metro-file-map "0.76.8" + metro-inspector-proxy "0.76.8" + metro-minify-terser "0.76.8" + metro-minify-uglify "0.76.8" + metro-react-native-babel-preset "0.76.8" + metro-resolver "0.76.8" + metro-runtime "0.76.8" + metro-source-map "0.76.8" + metro-symbolicate "0.76.8" + metro-transform-plugins "0.76.8" + metro-transform-worker "0.76.8" mime-types "^2.1.27" node-fetch "^2.2.0" nullthrows "^1.1.1" @@ -7242,15 +7046,15 @@ mkdirp@^1.0.3, mkdirp@^1.0.4: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -moment@^2.29.4: - version "2.29.4" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108" - integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w== +moment@^2.30.1: + version "2.30.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.30.1.tgz#f8c91c07b7a786e30c59926df530b4eac96974ae" + integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how== -moti@^0.25.3: - version "0.25.4" - resolved "https://registry.yarnpkg.com/moti/-/moti-0.25.4.tgz#772f50eda85ee65d6a31bdc601d6c43d08a736b3" - integrity sha512-UiH0WcWzUYlUmo8Y1F+iyVW+qVVZ3YkXO3Q/gQUZzOhje6+Q0MdllYfqKW2m5IhFs+Vxt2i+osjvWBxXKK2yOw== +moti@^0.27.2: + version "0.27.2" + resolved "https://registry.yarnpkg.com/moti/-/moti-0.27.2.tgz#617217500a45f3eca93a26a8adb4d7a47cf82843" + integrity sha512-QYH9Id14Zdjx9L75iMPyvxUN+GvHZ4lk6QhUyA63kWgXyqPT2yMnEIbk7hIeQ0WQDW2eLAXEi2/6FJkS7TEwsw== dependencies: framer-motion "^6.5.1" @@ -7371,7 +7175,7 @@ node-stream-zip@^1.9.1: resolved "https://registry.yarnpkg.com/node-stream-zip/-/node-stream-zip-1.15.0.tgz#158adb88ed8004c6c49a396b50a6a5de3bca33ea" integrity sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw== -normalize-path@^3.0.0, normalize-path@~3.0.0: +normalize-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== @@ -7417,11 +7221,6 @@ nwsapi@^2.2.2: resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.7.tgz#738e0707d3128cb750dddcfe90e4610482df0f30" integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ== -ob1@0.76.7: - version "0.76.7" - resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.76.7.tgz#95b68fadafd47e7a6a0ad64cf80f3140dd6d1124" - integrity sha512-BQdRtxxoUNfSoZxqeBGOyuT9nEYSn18xZHwGMb0mMVpn2NBcYbnyKY4BK2LIHRgw33CBGlUmE+KMaNvyTpLLtQ== - ob1@0.76.8: version "0.76.8" resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.76.8.tgz#ac4c459465b1c0e2c29aaa527e09fc463d3ffec8" @@ -7754,7 +7553,7 @@ picocolors@^1.0.0: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: +picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== @@ -7814,12 +7613,7 @@ popmotion@11.0.3: style-value-types "5.0.0" tslib "^2.1.0" -postcss-value-parser@^4.0.2: - version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" - integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== - -postcss@^8.4.23, postcss@~8.4.21: +postcss@~8.4.21: version "8.4.28" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.28.tgz#c6cc681ed00109072816e1557f889ef51cf950a5" integrity sha512-Z7V5j0cq8oEKyejIKfpD8b4eBy9cwW2JWPk0+fB1HOAMsfHbnAXLLS+PfVWlzMSLQaWttKDt607I0XHmpE67Vw== @@ -7833,6 +7627,11 @@ prelude-ls@^1.2.1: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== +prettier@3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.2.tgz#96e580f7ca9c96090ad054616c0c4597e2844b65" + integrity sha512-HTByuKZzw7utPiDO523Tt2pLtEyK7OibUD9suEJQrPUCYQqrHr74GGX6VidMrovbf/I50mPqr8j/II6oBAuc5A== + pretty-bytes@5.6.0: version "5.6.0" resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" @@ -8015,12 +7814,12 @@ react-freeze@^1.0.0: resolved "https://registry.yarnpkg.com/react-freeze/-/react-freeze-1.0.3.tgz#5e3ca90e682fed1d73a7cb50c2c7402b3e85618d" integrity sha512-ZnXwLQnGzrDpHBHiC56TXFXvmolPeMjTn1UOm610M4EXGzbEDR7oOIyS2ZiItgbs6eZc4oU/a0hpk8PrcKvv5g== -react-i18next@^12.3.1: - version "12.3.1" - resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-12.3.1.tgz#30134a41a2a71c61dc69c6383504929aed1c99e7" - integrity sha512-5v8E2XjZDFzK7K87eSwC7AJcAkcLt5xYZ4+yTPDAW1i7C93oOY1dnr4BaQM7un4Hm+GmghuiPvevWwlca5PwDA== +react-i18next@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-14.0.0.tgz#eb39d2245fd1024237828c955f770e409a1ccb12" + integrity sha512-OCrS8rHNAmnr8ggGRDxjakzihrMW7HCbsplduTm3EuuQ6fyvWGT41ksZpqbduYoqJurBmEsEVZ1pILSUWkHZng== dependencies: - "@babel/runtime" "^7.20.6" + "@babel/runtime" "^7.22.5" html-parse-stringify "^3.0.1" "react-is@^16.12.0 || ^17.0.0 || ^18.0.0", react-is@^18.0.0, react-is@^18.2.0: @@ -8049,10 +7848,10 @@ react-native-gesture-handler@~2.12.0: lodash "^4.17.21" prop-types "^15.7.2" -react-native-localize@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/react-native-localize/-/react-native-localize-3.0.2.tgz#43fa75c0097dbdb24a54ff320b3c8ad732407365" - integrity sha512-/l/oE1LVNgIRRhLbhmfFMHiWV0xhUn0A0iz1ytLVRYywL7FTp8Rx2vkJS/q/RpExDvV7yLw2493XZBYIM1dnLQ== +react-native-localize@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/react-native-localize/-/react-native-localize-3.0.5.tgz#2065bc37fda4fc13a4eab0bfbff926c6333a05c0" + integrity sha512-tg3OzBY2654lgTrP2YYU4jMwk0ecWIoWLWCP6IAiiOgLiojo+A3NtroX84G3TpVHuCJ3mJkaTunVet5HVGS3AA== react-native-reanimated@~3.3.0: version "3.3.0" @@ -8110,17 +7909,17 @@ react-native-svg@^6.2.1: lodash "^4.16.6" pegjs "^0.10.0" -react-native@0.72.4: - version "0.72.4" - resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.72.4.tgz#97b57e22e4d7657eaf4d1f62a678511fcf9bdda7" - integrity sha512-+vrObi0wZR+NeqL09KihAAdVlQ9IdplwznJWtYrjnQ4UbCW6rkzZJebRsugwUneSOKNFaHFEo1uKU89HsgtYBg== +react-native@0.72.6: + version "0.72.6" + resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.72.6.tgz#9f8d090694907e2f83af22e115cc0e4a3d5fa626" + integrity sha512-RafPY2gM7mcrFySS8TL8x+TIO3q7oAlHpzEmC7Im6pmXni6n1AuufGaVh0Narbr1daxstw7yW7T9BKW5dpVc2A== dependencies: "@jest/create-cache-key-function" "^29.2.1" - "@react-native-community/cli" "11.3.6" - "@react-native-community/cli-platform-android" "11.3.6" - "@react-native-community/cli-platform-ios" "11.3.6" + "@react-native-community/cli" "11.3.7" + "@react-native-community/cli-platform-android" "11.3.7" + "@react-native-community/cli-platform-ios" "11.3.7" "@react-native/assets-registry" "^0.72.0" - "@react-native/codegen" "^0.72.6" + "@react-native/codegen" "^0.72.7" "@react-native/gradle-plugin" "^0.72.11" "@react-native/js-polyfills" "^0.72.1" "@react-native/normalize-colors" "^0.72.0" @@ -8203,13 +8002,6 @@ readable-stream@~2.3.6: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - readline@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/readline/-/readline-1.3.0.tgz#c580d77ef2cfc8752b132498060dc9793a7ac01c" @@ -8616,11 +8408,6 @@ shallow-clone@^3.0.0: dependencies: kind-of "^6.0.2" -shallowequal@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" - integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== - shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" @@ -8685,11 +8472,6 @@ sisteransi@^1.0.5: resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== -slash@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" - integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== - slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" @@ -8964,36 +8746,6 @@ style-value-types@5.0.0: hey-listen "^1.0.8" tslib "^2.1.0" -styled-components@^6.0.2: - version "6.0.7" - resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-6.0.7.tgz#1cf4a5e6b6181b29f941934df54af19b7ef05ab0" - integrity sha512-xIwWuiRMYR43mskVsW9MGTRjSo7ol4bcVjT595fGUp3OLBJOlOgaiKaxsHdC4a2HqWKqKnh0CmcRbk5ogyDjTg== - dependencies: - "@babel/cli" "^7.21.0" - "@babel/core" "^7.21.0" - "@babel/helper-module-imports" "^7.18.6" - "@babel/plugin-external-helpers" "^7.18.6" - "@babel/plugin-proposal-class-properties" "^7.18.6" - "@babel/plugin-proposal-object-rest-spread" "^7.20.7" - "@babel/preset-env" "^7.20.2" - "@babel/preset-react" "^7.18.6" - "@babel/preset-typescript" "^7.21.0" - "@babel/traverse" "^7.21.2" - "@emotion/is-prop-valid" "^1.2.1" - "@emotion/unitless" "^0.8.0" - "@types/stylis" "^4.0.2" - css-to-react-native "^3.2.0" - csstype "^3.1.2" - postcss "^8.4.23" - shallowequal "^1.1.0" - stylis "^4.3.0" - tslib "^2.5.0" - -stylis@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.3.0.tgz#abe305a669fc3d8777e10eefcfc73ad861c5588c" - integrity sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ== - sucrase@^3.20.0: version "3.34.0" resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.34.0.tgz#1e0e2d8fcf07f8b9c3569067d92fbd8690fb576f" @@ -9240,7 +8992,7 @@ tslib@^1.8.1: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.1, tslib@^2.1.0, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.5.0: +tslib@^2.0.1, tslib@^2.1.0, tslib@^2.3.1, tslib@^2.4.0: version "2.6.2" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== @@ -9488,10 +9240,10 @@ url-parse@^1.5.3, url-parse@^1.5.9: querystringify "^2.1.1" requires-port "^1.0.0" -use-latest-callback@^0.1.5: - version "0.1.6" - resolved "https://registry.yarnpkg.com/use-latest-callback/-/use-latest-callback-0.1.6.tgz#3fa6e7babbb5f9bfa24b5094b22939e1e92ebcf6" - integrity sha512-VO/P91A/PmKH9bcN9a7O3duSuxe6M14ZoYXgA6a8dab8doWNdhiIHzEkX/jFeTTRBsX0Ubk6nG4q2NIjNsj+bg== +use-latest-callback@^0.1.7: + version "0.1.9" + resolved "https://registry.yarnpkg.com/use-latest-callback/-/use-latest-callback-0.1.9.tgz#10191dc54257e65a8e52322127643a8940271e2a" + integrity sha512-CL/29uS74AwreI/f2oz2hLTW7ZqVeV5+gxFeGudzQrgkCytrHw33G4KbnQOrRlAEzzAFXi7dDLMC9zhWcVpzmw== use-sync-external-store@1.2.0, use-sync-external-store@^1.0.0: version "1.2.0" @@ -9883,9 +9635,9 @@ yocto-queue@^0.1.0: resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== -zustand@^4.4.1: - version "4.4.1" - resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.4.1.tgz#0cd3a3e4756f21811bd956418fdc686877e8b3b0" - integrity sha512-QCPfstAS4EBiTQzlaGP1gmorkh/UL1Leaj2tdj+zZCZ/9bm0WS7sI2wnfD5lpOszFqWJ1DcPnGoY8RDL61uokw== +zustand@^4.4.7: + version "4.4.7" + resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.4.7.tgz#355406be6b11ab335f59a66d2cf9815e8f24038c" + integrity sha512-QFJWJMdlETcI69paJwhSMJz7PPWjVP8Sjhclxmxmxv/RYI7ZOvR5BHX+ktH0we9gTWQMxcne8q1OY8xxz604gw== dependencies: use-sync-external-store "1.2.0"