diff --git a/App.tsx b/App.tsx index 120f0e1..01c532b 100644 --- a/App.tsx +++ b/App.tsx @@ -114,7 +114,7 @@ async function onDisplayNotification(remoteMessage: any) { 'Matn yo‘q', android: { channelId, - smallIcon: 'ic_launcher_foreground', + largeIcon: 'ic_launcher_foreground', sound: 'default', pressAction: { id: 'default', @@ -285,7 +285,9 @@ export default function App() { - + {Platform.OS === 'android' && ( + + )} diff --git a/android/app/build.gradle b/android/app/build.gradle index f0c82c4..02cce0d 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -1,7 +1,6 @@ apply plugin: "com.android.application" apply plugin: "org.jetbrains.kotlin.android" apply plugin: "com.facebook.react" -apply from: "../../node_modules/react-native-vector-icons/fonts.gradle" /** * This is the configuration block to customize your React Native Android app. @@ -86,8 +85,8 @@ android { applicationId "uz.felix.cpost" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 3 - versionName "0.3" + versionCode 4 + versionName "0.4" multiDexEnabled true vectorDrawables.useSupportLibrary = true diff --git a/android/app/src/main/assets/fonts/GolosText-Black.ttf b/android/app/src/main/assets/fonts/GolosText-Black.ttf new file mode 100644 index 0000000..299e76a Binary files /dev/null and b/android/app/src/main/assets/fonts/GolosText-Black.ttf differ diff --git a/android/app/src/main/assets/fonts/GolosText-Bold.ttf b/android/app/src/main/assets/fonts/GolosText-Bold.ttf new file mode 100644 index 0000000..e203ff5 Binary files /dev/null and b/android/app/src/main/assets/fonts/GolosText-Bold.ttf differ diff --git a/android/app/src/main/assets/fonts/GolosText-ExtraBold.ttf b/android/app/src/main/assets/fonts/GolosText-ExtraBold.ttf new file mode 100644 index 0000000..b67847d Binary files /dev/null and b/android/app/src/main/assets/fonts/GolosText-ExtraBold.ttf differ diff --git a/android/app/src/main/assets/fonts/GolosText-Medium.ttf b/android/app/src/main/assets/fonts/GolosText-Medium.ttf new file mode 100644 index 0000000..c8daaa6 Binary files /dev/null and b/android/app/src/main/assets/fonts/GolosText-Medium.ttf differ diff --git a/android/app/src/main/assets/fonts/GolosText-Regular.ttf b/android/app/src/main/assets/fonts/GolosText-Regular.ttf new file mode 100644 index 0000000..f2f0a9a Binary files /dev/null and b/android/app/src/main/assets/fonts/GolosText-Regular.ttf differ diff --git a/android/app/src/main/assets/fonts/GolosText-SemiBold.ttf b/android/app/src/main/assets/fonts/GolosText-SemiBold.ttf new file mode 100644 index 0000000..60f05d3 Binary files /dev/null and b/android/app/src/main/assets/fonts/GolosText-SemiBold.ttf differ diff --git a/android/link-assets-manifest.json b/android/link-assets-manifest.json new file mode 100644 index 0000000..9f6f7af --- /dev/null +++ b/android/link-assets-manifest.json @@ -0,0 +1,29 @@ +{ + "migIndex": 1, + "data": [ + { + "path": "assets/fonts/GolosText-Black.ttf", + "sha1": "e6722eaddeeabed103be8b1118c6f95df427fa8b" + }, + { + "path": "assets/fonts/GolosText-Bold.ttf", + "sha1": "551718ded281a8d4183a6177ae49c3253721a430" + }, + { + "path": "assets/fonts/GolosText-ExtraBold.ttf", + "sha1": "f2f3712a3f91ebe32524efa14df5d832b65c3409" + }, + { + "path": "assets/fonts/GolosText-Medium.ttf", + "sha1": "f984e30c8b0362809380a6c36a11dd219fa4e4ca" + }, + { + "path": "assets/fonts/GolosText-Regular.ttf", + "sha1": "48870644b5ac1f213fe5422ade65f3e3163b1ae0" + }, + { + "path": "assets/fonts/GolosText-SemiBold.ttf", + "sha1": "f9c8af5f76e6fdf4ce77eac72ea5fadf296ecefc" + } + ] +} diff --git a/assets/fonts/GolosText-Black.ttf b/assets/fonts/GolosText-Black.ttf new file mode 100644 index 0000000..299e76a Binary files /dev/null and b/assets/fonts/GolosText-Black.ttf differ diff --git a/assets/fonts/GolosText-Bold.ttf b/assets/fonts/GolosText-Bold.ttf new file mode 100644 index 0000000..e203ff5 Binary files /dev/null and b/assets/fonts/GolosText-Bold.ttf differ diff --git a/assets/fonts/GolosText-ExtraBold.ttf b/assets/fonts/GolosText-ExtraBold.ttf new file mode 100644 index 0000000..b67847d Binary files /dev/null and b/assets/fonts/GolosText-ExtraBold.ttf differ diff --git a/assets/fonts/GolosText-Medium.ttf b/assets/fonts/GolosText-Medium.ttf new file mode 100644 index 0000000..c8daaa6 Binary files /dev/null and b/assets/fonts/GolosText-Medium.ttf differ diff --git a/assets/fonts/GolosText-Regular.ttf b/assets/fonts/GolosText-Regular.ttf new file mode 100644 index 0000000..f2f0a9a Binary files /dev/null and b/assets/fonts/GolosText-Regular.ttf differ diff --git a/assets/fonts/GolosText-SemiBold.ttf b/assets/fonts/GolosText-SemiBold.ttf new file mode 100644 index 0000000..60f05d3 Binary files /dev/null and b/assets/fonts/GolosText-SemiBold.ttf differ diff --git a/index.js b/index.js index e601e59..943d304 100644 --- a/index.js +++ b/index.js @@ -29,7 +29,7 @@ messaging().setBackgroundMessageHandler(async remoteMessage => { 'Matn yo‘q', android: { channelId, - smallIcon: 'ic_launcher', + largeIcon: 'ic_launcher_foreground', sound: 'default', pressAction: { id: 'default', diff --git a/ios/first.xcodeproj/project.pbxproj b/ios/first.xcodeproj/project.pbxproj index d336448..81b4417 100644 --- a/ios/first.xcodeproj/project.pbxproj +++ b/ios/first.xcodeproj/project.pbxproj @@ -12,6 +12,12 @@ 761780ED2CA45674006654EE /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 761780EC2CA45674006654EE /* AppDelegate.swift */; }; 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */; }; CEF180279D89A214CE1D1A56 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB81A68108700A75B9A /* PrivacyInfo.xcprivacy */; }; + C4FA443D7B874C5591EE5A24 /* GolosText-Black.ttf in Resources */ = {isa = PBXBuildFile; fileRef = DBA376D1D07543FDBD9DEA11 /* GolosText-Black.ttf */; }; + D2E5D175A94F48ED90CA2608 /* GolosText-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = A1684FE1A56840B488CFA0E8 /* GolosText-Bold.ttf */; }; + 9AD72184E50F42369259E4EC /* GolosText-ExtraBold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 72C2AFC5B4934788BD5C73B3 /* GolosText-ExtraBold.ttf */; }; + 5C74F28B61464A939C6BC8E9 /* GolosText-Medium.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 860701A2063545D18EB20379 /* GolosText-Medium.ttf */; }; + 2DF5B129960A483591501792 /* GolosText-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 3015B60A17ED4B2F81A772B6 /* GolosText-Regular.ttf */; }; + E6BDDBE6D26D47ADACA19701 /* GolosText-SemiBold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 7FEFB3AFCAB24FA39CAF6EE3 /* GolosText-SemiBold.ttf */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -25,6 +31,12 @@ 761780EC2CA45674006654EE /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = AppDelegate.swift; path = first/AppDelegate.swift; sourceTree = ""; }; 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = first/LaunchScreen.storyboard; sourceTree = ""; }; ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; + DBA376D1D07543FDBD9DEA11 /* GolosText-Black.ttf */ = {isa = PBXFileReference; name = "GolosText-Black.ttf"; path = "../assets/fonts/GolosText-Black.ttf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; + A1684FE1A56840B488CFA0E8 /* GolosText-Bold.ttf */ = {isa = PBXFileReference; name = "GolosText-Bold.ttf"; path = "../assets/fonts/GolosText-Bold.ttf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; + 72C2AFC5B4934788BD5C73B3 /* GolosText-ExtraBold.ttf */ = {isa = PBXFileReference; name = "GolosText-ExtraBold.ttf"; path = "../assets/fonts/GolosText-ExtraBold.ttf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; + 860701A2063545D18EB20379 /* GolosText-Medium.ttf */ = {isa = PBXFileReference; name = "GolosText-Medium.ttf"; path = "../assets/fonts/GolosText-Medium.ttf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; + 3015B60A17ED4B2F81A772B6 /* GolosText-Regular.ttf */ = {isa = PBXFileReference; name = "GolosText-Regular.ttf"; path = "../assets/fonts/GolosText-Regular.ttf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; + 7FEFB3AFCAB24FA39CAF6EE3 /* GolosText-SemiBold.ttf */ = {isa = PBXFileReference; name = "GolosText-SemiBold.ttf"; path = "../assets/fonts/GolosText-SemiBold.ttf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -75,6 +87,7 @@ 83CBBA001A601CBA00E9B192 /* Products */, 2D16E6871FA4F8E400B85C8A /* Frameworks */, BBD78D7AC51CEA395F1C20DB /* Pods */, + 9B5408F660B24B4A8E6C28A9 /* Resources */, ); indentWidth = 2; sourceTree = ""; @@ -98,6 +111,20 @@ path = Pods; sourceTree = ""; }; + 9B5408F660B24B4A8E6C28A9 /* Resources */ = { + isa = "PBXGroup"; + children = ( + DBA376D1D07543FDBD9DEA11 /* GolosText-Black.ttf */, + A1684FE1A56840B488CFA0E8 /* GolosText-Bold.ttf */, + 72C2AFC5B4934788BD5C73B3 /* GolosText-ExtraBold.ttf */, + 860701A2063545D18EB20379 /* GolosText-Medium.ttf */, + 3015B60A17ED4B2F81A772B6 /* GolosText-Regular.ttf */, + 7FEFB3AFCAB24FA39CAF6EE3 /* GolosText-SemiBold.ttf */, + ); + name = Resources; + sourceTree = ""; + path = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -161,6 +188,12 @@ 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */, 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, CEF180279D89A214CE1D1A56 /* PrivacyInfo.xcprivacy in Resources */, + C4FA443D7B874C5591EE5A24 /* GolosText-Black.ttf in Resources */, + D2E5D175A94F48ED90CA2608 /* GolosText-Bold.ttf in Resources */, + 9AD72184E50F42369259E4EC /* GolosText-ExtraBold.ttf in Resources */, + 5C74F28B61464A939C6BC8E9 /* GolosText-Medium.ttf in Resources */, + 2DF5B129960A483591501792 /* GolosText-Regular.ttf in Resources */, + E6BDDBE6D26D47ADACA19701 /* GolosText-SemiBold.ttf in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/ios/first/Info.plist b/ios/first/Info.plist index 6b49341..060433a 100644 --- a/ios/first/Info.plist +++ b/ios/first/Info.plist @@ -59,5 +59,14 @@ UIViewControllerBasedStatusBarAppearance + UIAppFonts + + GolosText-Black.ttf + GolosText-Bold.ttf + GolosText-ExtraBold.ttf + GolosText-Medium.ttf + GolosText-Regular.ttf + GolosText-SemiBold.ttf + diff --git a/ios/link-assets-manifest.json b/ios/link-assets-manifest.json new file mode 100644 index 0000000..9f6f7af --- /dev/null +++ b/ios/link-assets-manifest.json @@ -0,0 +1,29 @@ +{ + "migIndex": 1, + "data": [ + { + "path": "assets/fonts/GolosText-Black.ttf", + "sha1": "e6722eaddeeabed103be8b1118c6f95df427fa8b" + }, + { + "path": "assets/fonts/GolosText-Bold.ttf", + "sha1": "551718ded281a8d4183a6177ae49c3253721a430" + }, + { + "path": "assets/fonts/GolosText-ExtraBold.ttf", + "sha1": "f2f3712a3f91ebe32524efa14df5d832b65c3409" + }, + { + "path": "assets/fonts/GolosText-Medium.ttf", + "sha1": "f984e30c8b0362809380a6c36a11dd219fa4e4ca" + }, + { + "path": "assets/fonts/GolosText-Regular.ttf", + "sha1": "48870644b5ac1f213fe5422ade65f3e3163b1ae0" + }, + { + "path": "assets/fonts/GolosText-SemiBold.ttf", + "sha1": "f9c8af5f76e6fdf4ce77eac72ea5fadf296ecefc" + } + ] +} diff --git a/package-lock.json b/package-lock.json index b85691c..fd2174f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,66 +13,42 @@ "@react-native-async-storage/async-storage": "^2.2.0", "@react-native-clipboard/clipboard": "^1.16.3", "@react-native-community/datetimepicker": "^8.4.2", - "@react-native-community/geolocation": "^3.4.0", - "@react-native-community/image-editor": "^4.3.0", - "@react-native-community/push-notification-ios": "^1.11.0", "@react-native-firebase/app": "^23.2.0", "@react-native-firebase/messaging": "^23.2.0", - "@react-native-picker/picker": "^2.11.1", - "@react-native/new-app-screen": "0.80.1", "@react-navigation/native": "^7.1.17", "@react-navigation/native-stack": "^7.3.25", - "@shopify/react-native-skia": "^2.2.2", "@tanstack/react-query": "^5.84.2", "axios": "^1.11.0", - "date-fns": "^4.1.0", "i18next": "^25.3.2", - "i18next-browser-languagedetector": "^8.2.0", - "i18next-http-backend": "^3.0.2", - "link": "^2.1.1", "lottie-react-native": "^7.3.0", "react": "19.1.0", "react-hook-form": "^7.61.1", "react-i18next": "^15.6.1", "react-native": "^0.80.1", "react-native-app-link": "^1.0.1", + "react-native-asset": "^2.1.1", "react-native-biometrics": "^3.0.1", "react-native-config": "^1.5.6", "react-native-confirmation-code-field": "^8.0.1", "react-native-device-info": "^14.0.4", "react-native-dotenv": "^3.4.11", - "react-native-fs": "^2.20.0", - "react-native-geolocation-service": "^5.3.1", - "react-native-gesture-handler": "^2.28.0", "react-native-gesture-password": "^0.4.0", - "react-native-haptic-feedback": "^2.3.3", "react-native-image-crop-picker": "^0.50.1", "react-native-image-picker": "^8.2.1", - "react-native-keychain": "^10.0.0", "react-native-linear-gradient": "^2.8.3", "react-native-localize": "^3.5.1", - "react-native-maps": "^1.25.0", "react-native-mask-input": "^1.2.3", - "react-native-mask-text": "^0.15.0", "react-native-modal": "^14.0.0-rc.1", - "react-native-modal-datetime-picker": "^18.0.0", - "react-native-permissions": "^5.4.2", - "react-native-photo-manipulator": "^1.9.2", "react-native-push-notification": "^8.1.1", "react-native-reanimated": "^4.0.2", - "react-native-reanimated-carousel": "^4.0.2", "react-native-safe-area-context": "^5.6.0", - "react-native-screens": "^4.14.1", + "react-native-screens": "^4.15.4", "react-native-send-intent": "^1.3.0", - "react-native-share": "^12.2.0", - "react-native-skia": "^0.0.1", "react-native-smooth-pincode-input": "^1.0.9", - "react-native-splash-screen": "^3.3.0", "react-native-svg": "^15.12.1", "react-native-toast-message": "^2.3.3", - "react-native-vector-icons": "^10.3.0", "react-native-webview": "^13.15.0", - "react-native-worklets": "^0.4.1", + "react-native-worklets": "0.4.1", "zod": "^4.0.10", "zustand": "^5.0.6" }, @@ -2287,18 +2263,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@egjs/hammerjs": { - "version": "2.0.17", - "resolved": "https://registry.npmjs.org/@egjs/hammerjs/-/hammerjs-2.0.17.tgz", - "integrity": "sha512-XQsZgjm2EcVUiZQf11UBJQfmZeEmOW8DpI1gsFeln6w0ae0ii4dMQEQ0kjl6DspdWX1aGY1/loyXnP0JS06e/A==", - "license": "MIT", - "dependencies": { - "@types/hammerjs": "^2.0.36" - }, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/@eslint-community/eslint-utils": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", @@ -4219,38 +4183,12 @@ } } }, - "node_modules/@react-native-community/geolocation": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@react-native-community/geolocation/-/geolocation-3.4.0.tgz", - "integrity": "sha512-bzZH89/cwmpkPMKKveoC72C4JH0yF4St5Ceg/ZM9pA1SqX9MlRIrIrrOGZ/+yi++xAvFDiYfihtn9TvXWU9/rA==", - "license": "MIT", - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, - "node_modules/@react-native-community/image-editor": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@react-native-community/image-editor/-/image-editor-4.3.0.tgz", - "integrity": "sha512-JMHE+6D1hHhLwboEcbxdqk47FQ9nDrSGTlHrxDgmwUnE6wA1bQh0Ver7EyDcKxfxLqBNnHUx54mbtWVuP182vA==", - "license": "MIT", - "peerDependencies": { - "react-native": ">=0.57.0" - }, - "peerDependenciesMeta": { - "react-native": { - "optional": true - } - } - }, "node_modules/@react-native-community/push-notification-ios": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/@react-native-community/push-notification-ios/-/push-notification-ios-1.11.0.tgz", "integrity": "sha512-nfkUs8P2FeydOCR4r7BNmtGxAxI22YuGP6RmqWt6c8EEMUpqvIhNKWkRSFF3pHjkgJk2tpRb9wQhbezsqTyBvA==", "license": "MIT", + "peer": true, "dependencies": { "invariant": "^2.2.4" }, @@ -4293,19 +4231,6 @@ } } }, - "node_modules/@react-native-picker/picker": { - "version": "2.11.1", - "resolved": "https://registry.npmjs.org/@react-native-picker/picker/-/picker-2.11.1.tgz", - "integrity": "sha512-ThklnkK4fV3yynnIIRBkxxjxR4IFbdMNJVF6tlLdOJ/zEFUEFUEdXY0KmH0iYzMwY8W4/InWsLiA7AkpAbnexA==", - "license": "MIT", - "workspaces": [ - "example" - ], - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, "node_modules/@react-native/assets-registry": { "version": "0.80.2", "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.80.2.tgz", @@ -4899,25 +4824,6 @@ "node": ">=18" } }, - "node_modules/@react-native/new-app-screen": { - "version": "0.80.1", - "resolved": "https://registry.npmjs.org/@react-native/new-app-screen/-/new-app-screen-0.80.1.tgz", - "integrity": "sha512-i1dqF76zBBoyg9D2+8nN+eD4ikSnEFd0HKCTfmG6LO+NAuCBdxWzPhe2HJytlSsfV+3uNP+P/JfduBnY/+/Tcw==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/react": "^19.0.0", - "react": "*", - "react-native": "*" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, "node_modules/@react-native/normalize-colors": { "version": "0.80.2", "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.80.2.tgz", @@ -5015,32 +4921,6 @@ "nanoid": "^3.3.11" } }, - "node_modules/@shopify/react-native-skia": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@shopify/react-native-skia/-/react-native-skia-2.2.3.tgz", - "integrity": "sha512-B2g/V5HVbsGblUDjETDh+Vo91PQoZnqufYcXBFA3zD6GkNG+BNyU4SiDnXye27hpJ+ZvcJopXGwDCc4b2m8dqQ==", - "license": "MIT", - "dependencies": { - "canvaskit-wasm": "0.40.0", - "react-reconciler": "0.31.0" - }, - "bin": { - "setup-skia-web": "scripts/setup-canvaskit.js" - }, - "peerDependencies": { - "react": ">=19.0", - "react-native": ">=0.78", - "react-native-reanimated": "^3.0" - }, - "peerDependenciesMeta": { - "react-native": { - "optional": true - }, - "react-native-reanimated": { - "optional": true - } - } - }, "node_modules/@sideway/address": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", @@ -5169,12 +5049,6 @@ "@babel/types": "^7.28.2" } }, - "node_modules/@types/geojson": { - "version": "7946.0.16", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", - "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", - "license": "MIT" - }, "node_modules/@types/graceful-fs": { "version": "4.1.9", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", @@ -5184,12 +5058,6 @@ "@types/node": "*" } }, - "node_modules/@types/hammerjs": { - "version": "2.0.46", - "resolved": "https://registry.npmjs.org/@types/hammerjs/-/hammerjs-2.0.46.tgz", - "integrity": "sha512-ynRvcq6wvqexJ9brDMS4BnBLzmr0e14d6ZJTEShTBWKymQiHwlAyGu0ZPEFI2Fh1U53F7tN9ufClWM5KvqkKOw==", - "license": "MIT" - }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", @@ -5608,11 +5476,14 @@ "devOptional": true, "license": "MIT" }, - "node_modules/@webgpu/types": { - "version": "0.1.21", - "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.21.tgz", - "integrity": "sha512-pUrWq3V5PiSGFLeLxoGqReTZmiiXwY3jRkIG5sLLKjyqNxrwm/04b4nw7LSmGWJcKk59XOM/YRTUwOzo4MMlow==", - "license": "BSD-3-Clause" + "node_modules/@xmldom/xmldom": { + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz", + "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } }, "node_modules/abort-controller": { "version": "3.0.0", @@ -5810,6 +5681,59 @@ "devOptional": true, "license": "MIT" }, + "node_modules/aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "license": "ISC" + }, + "node_modules/are-we-there-yet": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", + "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "node_modules/are-we-there-yet/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/are-we-there-yet/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/are-we-there-yet/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/are-we-there-yet/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -6286,11 +6210,6 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "license": "MIT" }, - "node_modules/base-64": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/base-64/-/base-64-0.1.0.tgz", - "integrity": "sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA==" - }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -6311,13 +6230,13 @@ ], "license": "MIT" }, - "node_modules/bignumber.js": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", - "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", - "license": "MIT", + "node_modules/big-integer": { + "version": "1.6.52", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", + "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", + "license": "Unlicense", "engines": { - "node": "*" + "node": ">=0.6" } }, "node_modules/bl": { @@ -6380,6 +6299,27 @@ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "license": "ISC" }, + "node_modules/bplist-creator": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.0.tgz", + "integrity": "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==", + "license": "MIT", + "dependencies": { + "stream-buffers": "2.2.x" + } + }, + "node_modules/bplist-parser": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.1.tgz", + "integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==", + "license": "MIT", + "dependencies": { + "big-integer": "1.6.x" + }, + "engines": { + "node": ">= 5.10.0" + } + }, "node_modules/brace-expansion": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", @@ -6605,15 +6545,6 @@ ], "license": "CC-BY-4.0" }, - "node_modules/canvaskit-wasm": { - "version": "0.40.0", - "resolved": "https://registry.npmjs.org/canvaskit-wasm/-/canvaskit-wasm-0.40.0.tgz", - "integrity": "sha512-Od2o+ZmoEw9PBdN/yCGvzfu0WVqlufBPEWNG452wY7E9aT8RBE+ChpZF526doOlg7zumO4iCS+RAeht4P0Gbpw==", - "license": "BSD-3-Clause", - "dependencies": { - "@webgpu/types": "0.1.21" - } - }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -6794,6 +6725,15 @@ "node": ">= 0.12.0" } }, + "node_modules/code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/collect-v8-coverage": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", @@ -6832,40 +6772,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, - "node_modules/color-parse": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/color-parse/-/color-parse-2.0.2.tgz", - "integrity": "sha512-eCtOz5w5ttWIUcaKLiktF+DxZO1R9KLNY/xhbV6CkhM7sR3GhVghmt6X6yOnzeaM24po+Z9/S1apbXMwA3Iepw==", - "license": "MIT", - "dependencies": { - "color-name": "^2.0.0" - } - }, - "node_modules/color-parse/node_modules/color-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.0.0.tgz", - "integrity": "sha512-SbtvAMWvASO5TE2QP07jHBMXKafgdZz8Vrsrn96fiL+O92/FN/PLARzUW5sKt013fjAprK2d2iCn2hk2Xb5oow==", - "license": "MIT", - "engines": { - "node": ">=12.20" - } - }, - "node_modules/color-rgba": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/color-rgba/-/color-rgba-3.0.0.tgz", - "integrity": "sha512-PPwZYkEY3M2THEHHV6Y95sGUie77S7X8v+h1r6LSAPF3/LL2xJ8duUXSrkic31Nzc4odPwHgUbiX/XuTYzQHQg==", - "license": "MIT", - "dependencies": { - "color-parse": "^2.0.0", - "color-space": "^2.0.0" - } - }, - "node_modules/color-space": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/color-space/-/color-space-2.3.2.tgz", - "integrity": "sha512-BcKnbOEsOarCwyoLstcoEztwT0IJxqqQkNwDuA3a65sICvvHL2yoeV13psoDFh5IuiOMnIOKdQDwB4Mk3BypiA==", - "license": "Unlicense" - }, "node_modules/color-string": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", @@ -7004,6 +6910,12 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "license": "ISC" + }, "node_modules/content-type": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", @@ -7034,6 +6946,12 @@ "url": "https://opencollective.com/core-js" } }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, "node_modules/cosmiconfig": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", @@ -7083,15 +7001,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/cross-fetch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", - "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", - "license": "MIT", - "dependencies": { - "node-fetch": "^2.6.12" - } - }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -7209,16 +7118,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/date-fns": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz", - "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/kossnocorp" - } - }, "node_modules/dayjs": { "version": "1.11.13", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", @@ -7352,6 +7251,12 @@ "node": ">=0.4.0" } }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "license": "MIT" + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -7538,31 +7443,6 @@ "node": ">= 0.8" } }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", @@ -9055,6 +8935,70 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "dependencies": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "node_modules/gauge/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gauge/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "license": "MIT", + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gauge/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "license": "MIT", + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gauge/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -9363,6 +9307,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "license": "ISC" + }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -9390,21 +9340,6 @@ "hermes-estree": "0.28.1" } }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "license": "BSD-3-Clause", - "dependencies": { - "react-is": "^16.7.0" - } - }, - "node_modules/hoist-non-react-statics/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "license": "MIT" - }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -9506,24 +9441,6 @@ } } }, - "node_modules/i18next-browser-languagedetector": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-8.2.0.tgz", - "integrity": "sha512-P+3zEKLnOF0qmiesW383vsLdtQVyKtCNA9cjSoKCppTKPQVfKd2W8hbVo5ZhNJKDqeM7BOcvNoKJOjpHh4Js9g==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.2" - } - }, - "node_modules/i18next-http-backend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-3.0.2.tgz", - "integrity": "sha512-PdlvPnvIp4E1sYi46Ik4tBYh/v/NbYfFFgTjkwFl0is8A18s7/bx9aXqsrOax9WUbeNS6mD2oix7Z0yGGf6m5g==", - "license": "MIT", - "dependencies": { - "cross-fetch": "4.0.0" - } - }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -11360,7 +11277,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "devOptional": true, "license": "MIT", "optionalDependencies": { "graceful-fs": "^4.1.6" @@ -11478,18 +11394,6 @@ "devOptional": true, "license": "MIT" }, - "node_modules/link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/link/-/link-2.1.1.tgz", - "integrity": "sha512-NV3AUVYBovJ6eVQcTeRoPnZSxzt2LOijNd+ugEZKRy/XeQlpTRhVRkuDv5kOlXwMAUx30vfUc7asRFb9RT65yg==", - "license": "MIT", - "bin": { - "link": "dist/cli.js" - }, - "funding": { - "url": "https://github.com/privatenumber/link?sponsor=1" - } - }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -11510,7 +11414,6 @@ "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true, "license": "MIT" }, "node_modules/lodash.camelcase": { @@ -12971,26 +12874,6 @@ "node": "*" } }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -13039,6 +12922,19 @@ "node": ">=8" } }, + "node_modules/npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "dependencies": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, "node_modules/nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", @@ -13057,6 +12953,15 @@ "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", "license": "MIT" }, + "node_modules/number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ob1": { "version": "0.83.1", "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.83.1.tgz", @@ -13643,6 +13548,20 @@ "node": ">=4" } }, + "node_modules/plist": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", + "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", + "license": "MIT", + "dependencies": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + }, + "engines": { + "node": ">=10.4.0" + } + }, "node_modules/possible-typed-array-names": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", @@ -13729,6 +13648,12 @@ "devOptional": true, "license": "MIT" }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, "node_modules/promise": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", @@ -14092,6 +14017,40 @@ "react-native": ">=0.20.0" } }, + "node_modules/react-native-asset": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/react-native-asset/-/react-native-asset-2.1.1.tgz", + "integrity": "sha512-fBtQkyuaVEHClfNFO2bep7yhbURz+Vft4eyjA1Gb4+eQ9DI5kQRFtKRoGBjr4QqXpgEELAC1Y5IDmHthGvBJ8Q==", + "license": "ISC", + "dependencies": { + "fs-extra": "^7.0.1", + "lodash": "4.17.21", + "npmlog": "^4.1.2", + "plist": "^3.0.1", + "sha1-file": "^1.0.4", + "xcode": "^2.0.0" + }, + "bin": { + "react-native-asset": "lib/cli.js" + }, + "peerDependencies": { + "react-native": ">=0.60.0" + } + }, + "node_modules/react-native-asset/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, "node_modules/react-native-biometrics": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/react-native-biometrics/-/react-native-biometrics-3.0.1.tgz", @@ -14167,46 +14126,6 @@ "@babel/runtime": "^7.20.6" } }, - "node_modules/react-native-fs": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/react-native-fs/-/react-native-fs-2.20.0.tgz", - "integrity": "sha512-VkTBzs7fIDUiy/XajOSNk0XazFE9l+QlMAce7lGuebZcag5CnjszB+u4BdqzwaQOdcYb5wsJIsqq4kxInIRpJQ==", - "license": "MIT", - "dependencies": { - "base-64": "^0.1.0", - "utf8": "^3.0.0" - }, - "peerDependencies": { - "react-native": "*", - "react-native-windows": "*" - }, - "peerDependenciesMeta": { - "react-native-windows": { - "optional": true - } - } - }, - "node_modules/react-native-geolocation-service": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/react-native-geolocation-service/-/react-native-geolocation-service-5.3.1.tgz", - "integrity": "sha512-LTXPtPNmrdhx+yeWG47sAaCgQc3nG1z+HLLHlhK/5YfOgfLcAb9HAkhREPjQKPZOUx8pKZMIpdGFUGfJYtimXQ==", - "license": "MIT" - }, - "node_modules/react-native-gesture-handler": { - "version": "2.28.0", - "resolved": "https://registry.npmjs.org/react-native-gesture-handler/-/react-native-gesture-handler-2.28.0.tgz", - "integrity": "sha512-0msfJ1vRxXKVgTgvL+1ZOoYw3/0z1R+Ked0+udoJhyplC2jbVKIJ8Z1bzWdpQRCV3QcQ87Op0zJVE5DhKK2A0A==", - "license": "MIT", - "dependencies": { - "@egjs/hammerjs": "^2.0.17", - "hoist-non-react-statics": "^3.3.0", - "invariant": "^2.2.4" - }, - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, "node_modules/react-native-gesture-password": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/react-native-gesture-password/-/react-native-gesture-password-0.4.0.tgz", @@ -14219,18 +14138,6 @@ "react-native": ">=15.5" } }, - "node_modules/react-native-haptic-feedback": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/react-native-haptic-feedback/-/react-native-haptic-feedback-2.3.3.tgz", - "integrity": "sha512-svS4D5PxfNv8o68m9ahWfwje5NqukM3qLS48+WTdhbDkNUkOhP9rDfDSRHzlhk4zq+ISjyw95EhLeh8NkKX5vQ==", - "license": "MIT", - "workspaces": [ - "example" - ], - "peerDependencies": { - "react-native": ">=0.60.0" - } - }, "node_modules/react-native-image-crop-picker": { "version": "0.50.1", "resolved": "https://registry.npmjs.org/react-native-image-crop-picker/-/react-native-image-crop-picker-0.50.1.tgz", @@ -14261,19 +14168,6 @@ "react-native": "*" } }, - "node_modules/react-native-keychain": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/react-native-keychain/-/react-native-keychain-10.0.0.tgz", - "integrity": "sha512-YzPKSAnSzGEJ12IK6CctNLU79T1W15WDrElRQ+1/FsOazGX9ucFPTQwgYe8Dy8jiSEDJKM4wkVa3g4lD2Z+Pnw==", - "license": "MIT", - "workspaces": [ - "KeychainExample", - "website" - ], - "engines": { - "node": ">=16" - } - }, "node_modules/react-native-linear-gradient": { "version": "2.8.3", "resolved": "https://registry.npmjs.org/react-native-linear-gradient/-/react-native-linear-gradient-2.8.3.tgz", @@ -14304,28 +14198,6 @@ } } }, - "node_modules/react-native-maps": { - "version": "1.25.3", - "resolved": "https://registry.npmjs.org/react-native-maps/-/react-native-maps-1.25.3.tgz", - "integrity": "sha512-Mi/uPvBBWqEJYj/wNIM40bIf7tnVWm8dM52X6LWiiN7cajozXtydKoVeuShHpK07cvi565maY+3QiB5yTxmb0w==", - "license": "MIT", - "dependencies": { - "@types/geojson": "^7946.0.13" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "react": ">= 18.3.1", - "react-native": ">= 0.76.0", - "react-native-web": ">= 0.11" - }, - "peerDependenciesMeta": { - "react-native-web": { - "optional": true - } - } - }, "node_modules/react-native-mask-input": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/react-native-mask-input/-/react-native-mask-input-1.2.3.tgz", @@ -14336,19 +14208,6 @@ "react-native": "*" } }, - "node_modules/react-native-mask-text": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/react-native-mask-text/-/react-native-mask-text-0.15.0.tgz", - "integrity": "sha512-KtE/DKFtf6/Glyt3uFRMa+8/RpgTDJVV9rrkZYbwMiGO3AzvDPsRxp5FoLNJk0NXhRCRn8Frs8Z2S6a+uB2ZdQ==", - "license": "MIT", - "dependencies": { - "bignumber.js": "^9.0.1" - }, - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, "node_modules/react-native-modal": { "version": "14.0.0-rc.1", "resolved": "https://registry.npmjs.org/react-native-modal/-/react-native-modal-14.0.0-rc.1.tgz", @@ -14362,51 +14221,6 @@ "react-native": ">=0.70.0" } }, - "node_modules/react-native-modal-datetime-picker": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/react-native-modal-datetime-picker/-/react-native-modal-datetime-picker-18.0.0.tgz", - "integrity": "sha512-0jdvhhraZQlRACwr7pM6vmZ2kxgzJ4CpnmV6J3TVA6MrXMXK6Zo/upRBKkRp0+fTOiKuNblzesA2U59rYo6SGA==", - "license": "MIT", - "dependencies": { - "prop-types": "^15.7.2" - }, - "peerDependencies": { - "@react-native-community/datetimepicker": ">=6.7.0", - "react-native": ">=0.65.0" - } - }, - "node_modules/react-native-permissions": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/react-native-permissions/-/react-native-permissions-5.4.2.tgz", - "integrity": "sha512-XNMoG1fxrB9q73MLn/ZfTaP7pS8qPu0KWypbeFKVTvoR+JJ3O7uedMOTH/mts9bTG+GKhShOoZ+k0CR63q9jwA==", - "license": "MIT", - "peerDependencies": { - "react": ">=18.1.0", - "react-native": ">=0.70.0", - "react-native-windows": ">=0.70.0" - }, - "peerDependenciesMeta": { - "react-native-windows": { - "optional": true - } - } - }, - "node_modules/react-native-photo-manipulator": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/react-native-photo-manipulator/-/react-native-photo-manipulator-1.9.2.tgz", - "integrity": "sha512-Q3Y3mGAIYTk0QhXYvCb1/m6amkFZ2ieUvkOkHaOa/zWECyGP5Pi+z0Z0PvtM2acdb2oBv7SZyeVg9W4g3ZggQw==", - "license": "MIT", - "workspaces": [ - "example" - ], - "dependencies": { - "color-rgba": "^3.0.0" - }, - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, "node_modules/react-native-push-notification": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/react-native-push-notification/-/react-native-push-notification-8.1.1.tgz", @@ -14433,18 +14247,6 @@ "react-native-worklets": ">=0.4.0" } }, - "node_modules/react-native-reanimated-carousel": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/react-native-reanimated-carousel/-/react-native-reanimated-carousel-4.0.3.tgz", - "integrity": "sha512-YZXlvZNghR5shFcI9hTA7h7bEhh97pfUSLZvLBAshpbkuYwJDKmQXejO/199T6hqGq0wCRwR0CWf2P4Vs6A4Fw==", - "license": "MIT", - "peerDependencies": { - "react": ">=18.0.0", - "react-native": ">=0.70.3", - "react-native-gesture-handler": ">=2.9.0", - "react-native-reanimated": ">=3.0.0" - } - }, "node_modules/react-native-reanimated/node_modules/semver": { "version": "7.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", @@ -14468,9 +14270,9 @@ } }, "node_modules/react-native-screens": { - "version": "4.14.1", - "resolved": "https://registry.npmjs.org/react-native-screens/-/react-native-screens-4.14.1.tgz", - "integrity": "sha512-/7zxVdk2H4BH/dvqpQQh45VCA05UeC+LCE8TPtGfjn5A+9/UJfKPB8LHhAcWxciLYfMCyW8J2u5dGLGQJH/Ecg==", + "version": "4.15.4", + "resolved": "https://registry.npmjs.org/react-native-screens/-/react-native-screens-4.15.4.tgz", + "integrity": "sha512-aKHPDScUbpQiZEG9eZssHdG5jEQs4yiJ8eMx6g81Ex/xU7DZkv3911enzdCb+v4eJE79X8waizY0ZhauZJQmrw==", "license": "MIT", "dependencies": { "react-freeze": "^1.0.0", @@ -14491,21 +14293,6 @@ "react-native": "*" } }, - "node_modules/react-native-share": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/react-native-share/-/react-native-share-12.2.0.tgz", - "integrity": "sha512-f6MB9BsKa9xVvu0DKbxq5jw4IyYHqQeqUlCNkD8eAFoJx6SD31ObPAn7SQ6NG9AOuhCy6aYuSJYJvx25DaoMZQ==", - "license": "MIT", - "engines": { - "node": ">=16" - } - }, - "node_modules/react-native-skia": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/react-native-skia/-/react-native-skia-0.0.1.tgz", - "integrity": "sha512-etuNQDOiDBmncaw17aij6ygh9rb7P3v6Hz+moU5QcmznoeD2tXRepOJO2wSN0PzibVhMNZrBqTyA8Yg5OkHwuA==", - "license": "MIT" - }, "node_modules/react-native-smooth-pincode-input": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/react-native-smooth-pincode-input/-/react-native-smooth-pincode-input-1.0.9.tgz", @@ -14519,15 +14306,6 @@ "react-native": "*" } }, - "node_modules/react-native-splash-screen": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/react-native-splash-screen/-/react-native-splash-screen-3.3.0.tgz", - "integrity": "sha512-rGjt6HkoSXxMqH4SQUJ1gnPQlPJV8+J47+4yhgTIan4bVvAwJhEeJH7wWt9hXSdH4+VfwTS0GTaflj1Tw83IhA==", - "license": "MIT", - "peerDependencies": { - "react-native": ">=0.57.0" - } - }, "node_modules/react-native-svg": { "version": "15.12.1", "resolved": "https://registry.npmjs.org/react-native-svg/-/react-native-svg-15.12.1.tgz", @@ -14553,61 +14331,6 @@ "react-native": "*" } }, - "node_modules/react-native-vector-icons": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/react-native-vector-icons/-/react-native-vector-icons-10.3.0.tgz", - "integrity": "sha512-IFQ0RE57819hOUdFvgK4FowM5aMXg7C7XKsuGLevqXkkIJatc3QopN0wYrb2IrzUgmdpfP+QVIbI3S6h7M0btw==", - "deprecated": "react-native-vector-icons package has moved to a new model of per-icon-family packages. See the https://github.com/oblador/react-native-vector-icons/blob/master/MIGRATION.md on how to migrate", - "license": "MIT", - "dependencies": { - "prop-types": "^15.7.2", - "yargs": "^16.1.1" - }, - "bin": { - "fa-upgrade.sh": "bin/fa-upgrade.sh", - "fa5-upgrade": "bin/fa5-upgrade.sh", - "fa6-upgrade": "bin/fa6-upgrade.sh", - "generate-icon": "bin/generate-icon.js" - } - }, - "node_modules/react-native-vector-icons/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/react-native-vector-icons/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "license": "MIT", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/react-native-vector-icons/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, "node_modules/react-native-webview": { "version": "13.15.0", "resolved": "https://registry.npmjs.org/react-native-webview/-/react-native-webview-13.15.0.tgz", @@ -14811,27 +14534,6 @@ "node": ">=0.10.0" } }, - "node_modules/react-reconciler": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.31.0.tgz", - "integrity": "sha512-7Ob7Z+URmesIsIVRjnLoDGwBEG/tVitidU0nMsqX/eeJaLY89RISO/10ERe0MqmzuKUUB1rmY+h1itMbUHg9BQ==", - "license": "MIT", - "dependencies": { - "scheduler": "^0.25.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "react": "^19.0.0" - } - }, - "node_modules/react-reconciler/node_modules/scheduler": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0.tgz", - "integrity": "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==", - "license": "MIT" - }, "node_modules/react-refresh": { "version": "0.14.2", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", @@ -15354,7 +15056,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "devOptional": true, "license": "ISC" }, "node_modules/set-function-length": { @@ -15412,6 +15113,13 @@ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "license": "ISC" }, + "node_modules/sha1-file": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/sha1-file/-/sha1-file-1.0.4.tgz", + "integrity": "sha512-IgcUYjTck/UAx0wdtBoTwiy4/yiIZX6do4uaqUtryJY/pBOQC1w3Cb/bZMyC2H3QYnodL5vbX0lY69xlWqeBnA==", + "deprecated": "Version 1.x or earlier is no longer supported.", + "license": "MIT" + }, "node_modules/shallow-clone": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", @@ -15542,6 +15250,17 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "license": "ISC" }, + "node_modules/simple-plist": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.3.1.tgz", + "integrity": "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==", + "license": "MIT", + "dependencies": { + "bplist-creator": "0.1.0", + "bplist-parser": "0.3.1", + "plist": "^3.0.5" + } + }, "node_modules/simple-swizzle": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", @@ -15724,6 +15443,15 @@ "node": ">= 0.4" } }, + "node_modules/stream-buffers": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", + "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==", + "license": "Unlicense", + "engines": { + "node": ">= 0.10.0" + } + }, "node_modules/strict-uri-encode": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", @@ -16105,12 +15833,6 @@ "node": ">=0.6" } }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" - }, "node_modules/ts-api-utils": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", @@ -16357,7 +16079,6 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "devOptional": true, "license": "MIT", "engines": { "node": ">= 4.0.0" @@ -16430,17 +16151,10 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, - "node_modules/utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", - "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==", - "license": "MIT" - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "devOptional": true, "license": "MIT" }, "node_modules/utils-merge": { @@ -16452,6 +16166,16 @@ "node": ">= 0.4.0" } }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "license": "MIT", + "bin": { + "uuid": "bin/uuid" + } + }, "node_modules/v8-to-istanbul": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", @@ -16523,12 +16247,6 @@ "integrity": "sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw==", "license": "Apache-2.0" }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "license": "BSD-2-Clause" - }, "node_modules/websocket-driver": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", @@ -16558,16 +16276,6 @@ "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", "license": "MIT" }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -16680,6 +16388,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "license": "ISC", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", @@ -16735,6 +16452,28 @@ "async-limiter": "~1.0.0" } }, + "node_modules/xcode": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/xcode/-/xcode-2.1.0.tgz", + "integrity": "sha512-uCrmPITrqTEzhn0TtT57fJaNaw8YJs1aCzs+P/QqxsDbvPZSv7XMPPwXrKvHtD6pLjBM/NaVwraWJm8q83Y4iQ==", + "license": "Apache-2.0", + "dependencies": { + "simple-plist": "^1.0.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "license": "MIT", + "engines": { + "node": ">=8.0" + } + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", diff --git a/package.json b/package.json index 293e4ed..dadc0f6 100644 --- a/package.json +++ b/package.json @@ -18,66 +18,42 @@ "@react-native-async-storage/async-storage": "^2.2.0", "@react-native-clipboard/clipboard": "^1.16.3", "@react-native-community/datetimepicker": "^8.4.2", - "@react-native-community/geolocation": "^3.4.0", - "@react-native-community/image-editor": "^4.3.0", - "@react-native-community/push-notification-ios": "^1.11.0", "@react-native-firebase/app": "^23.2.0", "@react-native-firebase/messaging": "^23.2.0", - "@react-native-picker/picker": "^2.11.1", - "@react-native/new-app-screen": "0.80.1", "@react-navigation/native": "^7.1.17", "@react-navigation/native-stack": "^7.3.25", - "@shopify/react-native-skia": "^2.2.2", "@tanstack/react-query": "^5.84.2", "axios": "^1.11.0", - "date-fns": "^4.1.0", "i18next": "^25.3.2", - "i18next-browser-languagedetector": "^8.2.0", - "i18next-http-backend": "^3.0.2", - "link": "^2.1.1", "lottie-react-native": "^7.3.0", "react": "19.1.0", "react-hook-form": "^7.61.1", "react-i18next": "^15.6.1", "react-native": "^0.80.1", "react-native-app-link": "^1.0.1", + "react-native-asset": "^2.1.1", "react-native-biometrics": "^3.0.1", "react-native-config": "^1.5.6", "react-native-confirmation-code-field": "^8.0.1", "react-native-device-info": "^14.0.4", "react-native-dotenv": "^3.4.11", - "react-native-fs": "^2.20.0", - "react-native-geolocation-service": "^5.3.1", - "react-native-gesture-handler": "^2.28.0", "react-native-gesture-password": "^0.4.0", - "react-native-haptic-feedback": "^2.3.3", "react-native-image-crop-picker": "^0.50.1", "react-native-image-picker": "^8.2.1", - "react-native-keychain": "^10.0.0", "react-native-linear-gradient": "^2.8.3", "react-native-localize": "^3.5.1", - "react-native-maps": "^1.25.0", "react-native-mask-input": "^1.2.3", - "react-native-mask-text": "^0.15.0", "react-native-modal": "^14.0.0-rc.1", - "react-native-modal-datetime-picker": "^18.0.0", - "react-native-permissions": "^5.4.2", - "react-native-photo-manipulator": "^1.9.2", "react-native-push-notification": "^8.1.1", "react-native-reanimated": "^4.0.2", - "react-native-reanimated-carousel": "^4.0.2", "react-native-safe-area-context": "^5.6.0", - "react-native-screens": "^4.14.1", + "react-native-screens": "^4.15.4", "react-native-send-intent": "^1.3.0", - "react-native-share": "^12.2.0", - "react-native-skia": "^0.0.1", "react-native-smooth-pincode-input": "^1.0.9", - "react-native-splash-screen": "^3.3.0", "react-native-svg": "^15.12.1", "react-native-toast-message": "^2.3.3", - "react-native-vector-icons": "^10.3.0", "react-native-webview": "^13.15.0", - "react-native-worklets": "^0.4.1", + "react-native-worklets": "0.4.1", "zod": "^4.0.10", "zustand": "^5.0.6" }, diff --git a/react-native.config.js b/react-native.config.js new file mode 100644 index 0000000..aa0f26c --- /dev/null +++ b/react-native.config.js @@ -0,0 +1,12 @@ +module.exports = { + project: { + ios: {}, + android: {}, + }, + dependencies: { + ...(process.env.NO_FLIPPER + ? { 'react-native-flipper': { platforms: { ios: null } } } + : {}), + }, + assets: ['./assets/fonts'], +}; diff --git a/src/components/AnimatedDots.tsx b/src/components/AnimatedDots.tsx index 1f0d078..c74df06 100644 --- a/src/components/AnimatedDots.tsx +++ b/src/components/AnimatedDots.tsx @@ -1,66 +1,72 @@ -"use client" +'use client'; -import React, { useEffect, useRef, useMemo, useCallback } from "react" -import { View, Animated, StyleSheet } from "react-native" +import React, { useCallback, useEffect, useMemo, useRef } from 'react'; +import { Animated, StyleSheet, View } from 'react-native'; const AnimatedDots = () => { - const dot1 = useRef(new Animated.Value(0)).current - const dot2 = useRef(new Animated.Value(0)).current - const dot3 = useRef(new Animated.Value(0)).current + const dot1 = useRef(new Animated.Value(0)).current; + const dot2 = useRef(new Animated.Value(0)).current; + const dot3 = useRef(new Animated.Value(0)).current; - const animationConfig = useMemo(() => ({ - duration: 300, - useNativeDriver: true, - }), []); + const animationConfig = useMemo( + () => ({ + duration: 300, + useNativeDriver: true, + }), + [], + ); - const createTimingAnimation = useCallback((value: Animated.Value, toValue: number) => { - return Animated.timing(value, { - toValue, - ...animationConfig, - }); - }, [animationConfig]); + const createTimingAnimation = useCallback( + (value: Animated.Value, toValue: number) => { + return Animated.timing(value, { + toValue, + ...animationConfig, + }); + }, + [animationConfig], + ); - const animationSequence = useMemo(() => { - return Animated.sequence([ - createTimingAnimation(dot1, 1), - createTimingAnimation(dot2, 1), - createTimingAnimation(dot3, 1), - createTimingAnimation(dot1, 0), - createTimingAnimation(dot2, 0), - createTimingAnimation(dot3, 0), - ]); - }, [dot1, dot2, dot3, createTimingAnimation]); + const animationSequence = useMemo(() => { + return Animated.sequence([ + createTimingAnimation(dot1, 1), + createTimingAnimation(dot2, 1), + createTimingAnimation(dot3, 1), + createTimingAnimation(dot1, 0), + createTimingAnimation(dot2, 0), + createTimingAnimation(dot3, 0), + ]); + }, [dot1, dot2, dot3, createTimingAnimation]); - useEffect(() => { - const animateDots = () => { - Animated.loop(animationSequence).start(); - }; + useEffect(() => { + const animateDots = () => { + Animated.loop(animationSequence).start(); + }; - animateDots(); - }, [animationSequence]); + animateDots(); + }, [animationSequence]); - return ( - - - - - - ) -} + return ( + + + + + + ); +}; const styles = StyleSheet.create({ - container: { - flexDirection: 'row', - justifyContent: 'center', - alignItems: 'center', - gap: 8, - }, - dot: { - width: 8, - height: 8, - borderRadius: 4, - backgroundColor: '#28A7E8', - }, + container: { + flexDirection: 'row', + justifyContent: 'center', + alignItems: 'center', + gap: 8, + }, + dot: { + width: 8, + height: 8, + borderRadius: 4, + backgroundColor: '#28A7E8', + }, }); export default AnimatedDots; diff --git a/src/components/AnimatedScreen.tsx b/src/components/AnimatedScreen.tsx index 24fd191..9e45cfe 100644 --- a/src/components/AnimatedScreen.tsx +++ b/src/components/AnimatedScreen.tsx @@ -1,71 +1,86 @@ -"use client" +'use client'; -import React, { useEffect, useRef, useMemo, useCallback } from 'react' -import { Animated, Easing, StyleSheet } from 'react-native' +import React, { useCallback, useEffect, useMemo } from 'react'; +import { Animated, Easing, StyleSheet } from 'react-native'; interface AnimatedScreenProps { - children: React.ReactNode - keyIndex: number + children: React.ReactNode; + keyIndex: number; } -const AnimatedScreen: React.FC = ({ children, keyIndex }) => { - const opacityAnim = React.useRef(new Animated.Value(1)).current // Start with opacity 1 - const slideAnim = React.useRef(new Animated.Value(0)).current // Start with no slide +const AnimatedScreen: React.FC = ({ + children, + keyIndex, +}) => { + const opacityAnim = React.useRef(new Animated.Value(1)).current; // Start with opacity 1 + const slideAnim = React.useRef(new Animated.Value(0)).current; // Start with no slide - const animationConfig = useMemo(() => ({ + const animationConfig = useMemo( + () => ({ + duration: 150, // Further reduced + useNativeDriver: true, + }), + [], + ); + + const opacityAnimation = useMemo( + () => + Animated.timing(opacityAnim, { + toValue: 1, duration: 150, // Further reduced + easing: Easing.out(Easing.ease), useNativeDriver: true, - }), []); + }), + [opacityAnim], + ); - const opacityAnimation = useMemo(() => - Animated.timing(opacityAnim, { - toValue: 1, - duration: 150, // Further reduced - easing: Easing.out(Easing.ease), - useNativeDriver: true, - }), [opacityAnim]); + const slideAnimation = useMemo( + () => + Animated.timing(slideAnim, { + toValue: 0, + duration: 150, // Further reduced + easing: Easing.out(Easing.ease), + useNativeDriver: true, + }), + [slideAnim], + ); - const slideAnimation = useMemo(() => - Animated.timing(slideAnim, { - toValue: 0, - duration: 150, // Further reduced - easing: Easing.out(Easing.ease), - useNativeDriver: true, - }), [slideAnim]); + const resetAnimations = useCallback(() => { + opacityAnim.setValue(1); // Start with full opacity + slideAnim.setValue(0); // Start with no slide + }, [opacityAnim, slideAnim]); - const resetAnimations = useCallback(() => { - opacityAnim.setValue(1); // Start with full opacity - slideAnim.setValue(0); // Start with no slide - }, [opacityAnim, slideAnim]); + const startAnimations = useCallback(() => { + // Skip animations for better performance + // Animated.parallel([opacityAnimation, slideAnimation]).start(); + }, [opacityAnimation, slideAnimation]); - const startAnimations = useCallback(() => { - // Skip animations for better performance - // Animated.parallel([opacityAnimation, slideAnimation]).start(); - }, [opacityAnimation, slideAnimation]); + useEffect(() => { + resetAnimations(); + startAnimations(); + }, [keyIndex, resetAnimations, startAnimations]); - useEffect(() => { - resetAnimations(); - startAnimations(); - }, [keyIndex, resetAnimations, startAnimations]); + const animatedStyle = useMemo( + () => ({ + opacity: 1, // Always full opacity + transform: [ + { translateX: 0 }, // No slide + ], + }), + [], + ); - const animatedStyle = useMemo(() => ({ - opacity: 1, // Always full opacity - transform: [ - { translateX: 0 }, // No slide - ], - }), []); - - return ( - - {children} - - ) -} + return ( + + {children} + + ); +}; const styles = StyleSheet.create({ - container: { - flex: 1, - }, -}) + container: { + flex: 1, + }, +}); export default AnimatedScreen; diff --git a/src/components/AppText.tsx b/src/components/AppText.tsx new file mode 100644 index 0000000..52d6b16 --- /dev/null +++ b/src/components/AppText.tsx @@ -0,0 +1,8 @@ +import React from 'react'; +import { Text, TextProps } from 'react-native'; + +export default function AppText({ style, ...props }: TextProps) { + return ( + + ); +} diff --git a/src/components/BottomModal.tsx b/src/components/BottomModal.tsx index 19744df..3f07b3a 100644 --- a/src/components/BottomModal.tsx +++ b/src/components/BottomModal.tsx @@ -6,7 +6,6 @@ import { Modal, ScrollView, StyleSheet, - Text, TouchableOpacity, View, } from 'react-native'; @@ -16,6 +15,7 @@ import Clock from 'svg/Clock'; import CloseIcon from 'svg/Close'; import Location from 'svg/Location'; import Phone from 'svg/Phone'; +import AppText from './AppText'; type BottomModalProps = { visible: boolean; @@ -59,8 +59,8 @@ const BottomModal: React.FC = ({ - {t('Manzil')} - {branch?.address} + {t('Manzil')} + {branch?.address} @@ -68,8 +68,8 @@ const BottomModal: React.FC = ({ - {t('Ish vaqti')} - {branch?.workingHours} + {t('Ish vaqti')} + {branch?.workingHours} @@ -77,8 +77,8 @@ const BottomModal: React.FC = ({ - {t('Telefon')} - {branch?.phone} + {t('Telefon')} + {branch?.phone} @@ -86,8 +86,10 @@ const BottomModal: React.FC = ({ - {t('Telegram admin')} - {branch?.telegramAdmin} + {t('Telegram admin')} + + {branch?.telegramAdmin} + @@ -95,8 +97,10 @@ const BottomModal: React.FC = ({ - {t('Telegram kanal')} - {branch?.telegramChannel} + {t('Telegram kanal')} + + {branch?.telegramChannel} + @@ -154,7 +158,7 @@ const styles = StyleSheet.create({ }, label: { fontSize: 16, - fontWeight: '600', + fontFamily: 'GolosText-Bold', color: '#000000', }, value: { diff --git a/src/components/CustomAlertModal.tsx b/src/components/CustomAlertModal.tsx index d3bf138..f13a37b 100644 --- a/src/components/CustomAlertModal.tsx +++ b/src/components/CustomAlertModal.tsx @@ -1,34 +1,35 @@ -import React, { useMemo, useCallback } from 'react'; -import { StyleSheet, Text, useWindowDimensions, View } from 'react-native'; +import React, { useCallback, useMemo } from 'react'; +import { StyleSheet, useWindowDimensions, View } from 'react-native'; +import AppText from './AppText'; export const toastConfig = { success: ({ text1, text2 }: { text1?: string; text2?: string }) => { const { width: screenWidth } = useWindowDimensions(); - const scale = useMemo(() => screenWidth < 360 ? 0.85 : 1, [screenWidth]); + const scale = useMemo(() => (screenWidth < 360 ? 0.85 : 1), [screenWidth]); - const containerStyle = useMemo(() => [ - styles.toastContainer, - { padding: 10 * scale } - ], [scale]); + const containerStyle = useMemo( + () => [styles.toastContainer, { padding: 10 * scale }], + [scale], + ); - const text1Style = useMemo(() => [ - styles.text1, - { fontSize: 16 * scale } - ], [scale]); + const text1Style = useMemo( + () => [styles.text1, { fontSize: 16 * scale }], + [scale], + ); - const text2Style = useMemo(() => [ - styles.text2, - { fontSize: 14 * scale } - ], [scale]); + const text2Style = useMemo( + () => [styles.text2, { fontSize: 14 * scale }], + [scale], + ); const renderText2 = useCallback(() => { if (!text2) return null; - return {text2}; + return {text2}; }, [text2, text2Style]); return ( - {text1} + {text1} {renderText2()} ); diff --git a/src/components/DatePicker.tsx b/src/components/DatePicker.tsx index a70db80..dc9214e 100644 --- a/src/components/DatePicker.tsx +++ b/src/components/DatePicker.tsx @@ -4,10 +4,10 @@ import { Modal, Platform, StyleSheet, - Text, TouchableOpacity, View, } from 'react-native'; +import AppText from './AppText'; type Props = { value: Date; @@ -55,7 +55,7 @@ const DatePickerInput = ({ onPress={handleClosePicker} style={styles.doneButton} > - Done + Done @@ -113,7 +113,7 @@ const styles = StyleSheet.create({ color: '#555', }, boldText: { - fontWeight: '600', + fontFamily: 'GolosText-Bold', }, modalContainer: { flex: 1, @@ -133,7 +133,7 @@ const styles = StyleSheet.create({ }, doneText: { color: '#007AFF', - fontWeight: '600', + fontFamily: 'GolosText-Bold', fontSize: 16, }, }); diff --git a/src/components/FileDrop.tsx b/src/components/FileDrop.tsx index 6deb64b..b724b16 100644 --- a/src/components/FileDrop.tsx +++ b/src/components/FileDrop.tsx @@ -1,13 +1,6 @@ import React, { useCallback, useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; -import { - Alert, - Image, - StyleSheet, - Text, - TouchableOpacity, - View, -} from 'react-native'; +import { Alert, Image, StyleSheet, TouchableOpacity, View } from 'react-native'; import { Asset, ImagePickerResponse, @@ -15,6 +8,7 @@ import { MediaType, } from 'react-native-image-picker'; import Download from 'svg/Download'; +import AppText from './AppText'; export interface FileData { uri: string; @@ -107,17 +101,19 @@ const SingleFileDrop: React.FC = ({ - {title} + {title} - OR + OR - {t('Faylni yuklang')} + + {t('Faylni yuklang')} + @@ -158,6 +154,7 @@ const styles = StyleSheet.create({ fontSize: 16, fontWeight: '500', color: '#333', + textAlign: 'center', marginBottom: 10, }, browseButton: { @@ -169,6 +166,7 @@ const styles = StyleSheet.create({ browseButtonText: { color: '#28A7E8', fontSize: 14, + textAlign: 'center', fontWeight: '500', }, previewImage: { diff --git a/src/components/GlobalModal.tsx b/src/components/GlobalModal.tsx index 711bf50..47b1992 100644 --- a/src/components/GlobalModal.tsx +++ b/src/components/GlobalModal.tsx @@ -1,89 +1,88 @@ // components/GlobalModal.tsx import React from 'react'; -import { Modal, View, Text, StyleSheet, TouchableOpacity } from 'react-native'; +import { Modal, StyleSheet, TouchableOpacity, View } from 'react-native'; import { useModalStore } from 'screens/auth/registeration/lib/modalStore'; +import AppText from './AppText'; const GlobalModal = () => { - const { - isVisible, - title, - message, - type, - onConfirm, - onCancel, - closeModal, - } = useModalStore(); + const { isVisible, title, message, type, onConfirm, onCancel, closeModal } = + useModalStore(); - return ( - - - - {title} - {message} + return ( + + + + {title} + {message} - - {onCancel && ( - { onCancel(); closeModal(); }}> - Bekor qilish - - )} - { - onConfirm?.(); - closeModal(); - }} - > - Ok - - - - - - ); + + {onCancel && ( + { + onCancel(); + closeModal(); + }} + > + Bekor qilish + + )} + { + onConfirm?.(); + closeModal(); + }} + > + Ok + + + + + + ); }; const styles = StyleSheet.create({ - overlay: { - flex: 1, - backgroundColor: 'rgba(0,0,0,0.4)', - justifyContent: 'center', - alignItems: 'center', - }, - modal: { - width: '80%', - padding: 20, - backgroundColor: '#fff', - borderRadius: 10, - elevation: 5, - }, - title: { - fontSize: 18, - fontWeight: 'bold', - marginBottom: 10, - }, - message: { - fontSize: 15, - marginBottom: 20, - }, - buttons: { - flexDirection: 'row', - justifyContent: 'flex-end', - gap: 10, - }, - cancel: { - color: 'red', - fontWeight: 'bold', - marginRight: 15, - }, - confirm: { - color: '#007bff', - fontWeight: 'bold', - }, + overlay: { + flex: 1, + backgroundColor: 'rgba(0,0,0,0.4)', + justifyContent: 'center', + alignItems: 'center', + }, + modal: { + width: '80%', + padding: 20, + backgroundColor: '#fff', + borderRadius: 10, + elevation: 5, + }, + title: { + fontSize: 18, + fontWeight: 'bold', + marginBottom: 10, + }, + message: { + fontSize: 15, + marginBottom: 20, + }, + buttons: { + flexDirection: 'row', + justifyContent: 'flex-end', + gap: 10, + }, + cancel: { + color: 'red', + fontWeight: 'bold', + marginRight: 15, + }, + confirm: { + color: '#007bff', + fontWeight: 'bold', + }, }); export default GlobalModal; diff --git a/src/components/InAppBrowser.tsx b/src/components/InAppBrowser.tsx index dbc5794..4ee109d 100644 --- a/src/components/InAppBrowser.tsx +++ b/src/components/InAppBrowser.tsx @@ -1,43 +1,44 @@ -import React, { useMemo, useCallback } from 'react'; -import { Modal, StyleSheet, View, TouchableOpacity, Text } from 'react-native'; +import React, { useCallback, useMemo } from 'react'; +import { Modal, StyleSheet, TouchableOpacity, View } from 'react-native'; import { WebView } from 'react-native-webview'; +import AppText from './AppText'; type Props = { - visible: boolean; - url: string; - onClose: () => void; + visible: boolean; + url: string; + onClose: () => void; }; const InAppBrowser = ({ visible, url, onClose }: Props) => { - const webViewSource = useMemo(() => ({ uri: url }), [url]); - - const handleClose = useCallback(() => { - onClose(); - }, [onClose]); + const webViewSource = useMemo(() => ({ uri: url }), [url]); - return ( - - - - Yopish - - - - - ); + const handleClose = useCallback(() => { + onClose(); + }, [onClose]); + + return ( + + + + Yopish + + + + + ); }; const styles = StyleSheet.create({ - container: { flex: 1 }, - closeButton: { - padding: 10, - backgroundColor: '#28A7E8', - alignItems: 'center', - }, - closeText: { - color: 'white', - fontSize: 16, - }, + container: { flex: 1 }, + closeButton: { + padding: 10, + backgroundColor: '#28A7E8', + alignItems: 'center', + }, + closeText: { + color: 'white', + fontSize: 16, + }, }); export default InAppBrowser; diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx index 4b1bd53..650d03d 100644 --- a/src/components/Navbar.tsx +++ b/src/components/Navbar.tsx @@ -5,8 +5,8 @@ import { Dimensions, Image, Linking, + Platform, StyleSheet, - Text, TouchableOpacity, View, } from 'react-native'; @@ -16,6 +16,7 @@ import Logo from 'screens/../../assets/bootsplash/logo.png'; import Bell from 'svg/Bell'; import Instagram from 'svg/Instagram'; import Telegram from 'svg/Telegram'; +import AppText from './AppText'; import InAppBrowser from './InAppBrowser'; const { width } = Dimensions.get('window'); @@ -77,7 +78,7 @@ const Navbar = () => { - CPOST + CPOST @@ -96,13 +97,14 @@ const Navbar = () => { size={iconSizes.facebook} /> */} - - navigation.navigate('Notifications')} - > - - {/* */} - + {Platform.OS === 'android' && ( + navigation.navigate('Notifications')} + > + + {/* */} + + )} diff --git a/src/components/NavbarBack.tsx b/src/components/NavbarBack.tsx index 30af8cf..0491c50 100644 --- a/src/components/NavbarBack.tsx +++ b/src/components/NavbarBack.tsx @@ -1,9 +1,10 @@ import { useNavigation } from '@react-navigation/native'; import { NativeStackNavigationProp } from '@react-navigation/native-stack'; import * as React from 'react'; -import { StyleSheet, Text, TouchableOpacity, View } from 'react-native'; +import { StyleSheet, TouchableOpacity, View } from 'react-native'; import { useSafeAreaInsets } from 'react-native-safe-area-context'; import ArrowLeft from 'svg/ArrowLeft'; +import AppText from './AppText'; interface NavbarBackProps { title: string; @@ -17,7 +18,7 @@ const NavbarBack = ({ title }: NavbarBackProps) => { navigation.goBack()}> - {title} + {title} ); }; @@ -36,7 +37,7 @@ const styles = StyleSheet.create({ headerTitle: { color: '#fff', fontSize: 20, - fontWeight: '600', + fontFamily: 'GolosText-Bold', marginLeft: 8, }, }); diff --git a/src/components/Navigation.tsx b/src/components/Navigation.tsx index 29c613b..c2ff538 100644 --- a/src/components/Navigation.tsx +++ b/src/components/Navigation.tsx @@ -2,13 +2,7 @@ import { useNavigation, useRoute } from '@react-navigation/native'; import type { NativeStackNavigationProp } from '@react-navigation/native-stack'; import React, { useCallback, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; -import { - Dimensions, - StyleSheet, - Text, - TouchableOpacity, - View, -} from 'react-native'; +import { Dimensions, StyleSheet, TouchableOpacity, View } from 'react-native'; import { useSafeAreaInsets } from 'react-native-safe-area-context'; import HomeIcon from 'svg/HomeIcon'; @@ -16,6 +10,7 @@ import Passport from 'svg/Passport'; import StatusIcon from 'svg/StatusIcon'; import User from 'svg/User'; import Wallet from 'svg/Wallet'; +import AppText from './AppText'; const { width } = Dimensions.get('window'); const isSmallScreen = width < 360; @@ -65,7 +60,7 @@ const Navigation = () => { activeOpacity={0.7} > - { }} > {t(label)} - + ); }, diff --git a/src/components/NoResult.tsx b/src/components/NoResult.tsx index f5896f9..ed29a98 100644 --- a/src/components/NoResult.tsx +++ b/src/components/NoResult.tsx @@ -1,14 +1,9 @@ import LottieView from 'lottie-react-native'; import React, { useEffect, useRef } from 'react'; import { useTranslation } from 'react-i18next'; -import { - Animated, - StyleSheet, - Text, - useWindowDimensions, - View, -} from 'react-native'; +import { Animated, StyleSheet, useWindowDimensions, View } from 'react-native'; import ProgressBar from 'screens/../../assets/lottie/Empty box.json'; +import AppText from './AppText'; interface Props { message?: string; @@ -58,7 +53,7 @@ const NoResult: React.FC = ({ resizeMode="cover" style={{ width: 250 * scale, height: 250 * scale }} /> - {t(message)} + {t(message)} ); }; diff --git a/src/components/Pagination.tsx b/src/components/Pagination.tsx index fd6e787..96f695e 100644 --- a/src/components/Pagination.tsx +++ b/src/components/Pagination.tsx @@ -1,8 +1,9 @@ // components/Pagination.tsx import React from 'react'; -import { Text, TouchableOpacity, View } from 'react-native'; +import { TouchableOpacity, View } from 'react-native'; import ArrowLeft from 'svg/ArrowLeft'; import ArrowRightUnderline from 'svg/ArrowRightUnderline'; +import AppText from './AppText'; interface PaginationProps { page: number; // current page (0-based) @@ -52,9 +53,9 @@ const Pagination: React.FC = ({ return pages.map((p, index) => { if (p === '...') { return ( - + ... - + ); } return ( @@ -71,9 +72,9 @@ const Pagination: React.FC = ({ marginHorizontal: 5, }} > - + {(p as number) + 1} - + ); }); diff --git a/src/components/SplashScreen.tsx b/src/components/SplashScreen.tsx index 3d7abc9..b4011b4 100644 --- a/src/components/SplashScreen.tsx +++ b/src/components/SplashScreen.tsx @@ -3,11 +3,11 @@ import { Animated, Image, StyleSheet, - Text, useWindowDimensions, View, } from 'react-native'; import Logo from 'screens/../../assets/bootsplash/logo.png'; +import AppText from './AppText'; const SplashScreen = ({ onFinish }: { onFinish: () => void }) => { const { width: screenWidth, height: screenHeight } = useWindowDimensions(); @@ -136,9 +136,9 @@ const SplashScreen = ({ onFinish }: { onFinish: () => void }) => { resizeMode="contain" /> - + CPOST - + diff --git a/src/i18n/locales/ru.json b/src/i18n/locales/ru.json index 5f5f531..6c8cba9 100644 --- a/src/i18n/locales/ru.json +++ b/src/i18n/locales/ru.json @@ -172,6 +172,9 @@ "Yopish": "Закрыть", "Manzilingizni kiriting": "Введите свой адрес", "Toshkent Shahri, Mirzo Ulug'bek tumani...": "г. Ташкент, Мирзо-Улугбекский район...", + "Hurmatli mijoz, ushbu berilgan ID manzil, ma'lumotlarni siz shu namunadagidek 1- va 4- qatorlarga oʻz ID kodingizni yozing! Aks holda sizning kargoingiz bilan muammo chiqishi mumkin.": "Уважаемый клиент, пожалуйста, введите свой ID-код в строки 1 и 4, как показано в этом примере, с данным ID-адресом и информацией! В противном случае может возникнуть проблема с вашим грузом.", + "Ilovaga kirib huddi shunday to’ldirganingizdan keyin ekranni rasmga(skrinshot) olib, sizga bot tomonidan berilgan ID kod vamanzilni ushbu": "После того, как вы вошли в приложение и заполнили его таким же образом, сделайте снимок экрана и запишите код удостоверения личности и адрес, предоставленные вам ботом, в", + "admindan tasdiqlatib olishingiz kerak bo’ladi.": "вам нужно будет получить подтверждение от администратора.", "Passportlarim": "Мои паспорта", "Hali pasport qo'shilmagan": "Паспорт еще не добавлен", "Yangi pasport qo'shish uchun tugmani bosing": "Нажмите кнопку, чтобы добавить новый паспорт", diff --git a/src/i18n/locales/uz.json b/src/i18n/locales/uz.json index 1f48be5..faebc8f 100644 --- a/src/i18n/locales/uz.json +++ b/src/i18n/locales/uz.json @@ -18,7 +18,10 @@ "Ro'yxatdan o'tish": "Ro'yxatdan o'tish", "Manzilingizni kiriting": "Manzilingizni kiriting", "Toshkent Shahri, Mirzo Ulug'bek tumani...": "Toshkent Shahri, Mirzo Ulug'bek tumani...", + "Hurmatli mijoz, ushbu berilgan ID manzil, ma'lumotlarni siz shu namunadagidek 1- va 4- qatorlarga oʻz ID kodingizni yozing! Aks holda sizning kargoingiz bilan muammo chiqishi mumkin.": "Hurmatli mijoz, ushbu berilgan ID manzil, ma'lumotlarni siz shu namunadagidek 1- va 4- qatorlarga oʻz ID kodingizni yozing! Aks holda sizning kargoingiz bilan muammo chiqishi mumkin.", + "Ilovaga kirib huddi shunday to’ldirganingizdan keyin ekranni rasmga(skrinshot) olib, sizga bot tomonidan berilgan ID kod vamanzilni ushbu": "Ilovaga kirib huddi shunday to’ldirganingizdan keyin ekranni rasmga(skrinshot) olib, sizga bot tomonidan berilgan ID kod vamanzilni ushbu", "Ism": "Ism", + "admindan tasdiqlatib olishingiz kerak bo’ladi.": "admindan tasdiqlatib olishingiz kerak bo’ladi.", "Ismingiz": "Ismingiz", "Familiya": "Familiya", "Familiyangiz": "Familiyangiz", diff --git a/src/screens/auth/login/ui/Confirm.tsx b/src/screens/auth/login/ui/Confirm.tsx index fd31210..c4575ad 100644 --- a/src/screens/auth/login/ui/Confirm.tsx +++ b/src/screens/auth/login/ui/Confirm.tsx @@ -6,6 +6,8 @@ import { NativeStackNavigationProp } from '@react-navigation/native-stack'; import { useMutation } from '@tanstack/react-query'; import { authApi } from 'api/auth'; import { otpPayload, resendPayload } from 'api/auth/type'; +import AppText from 'components/AppText'; +import formatPhone from 'helpers/formatPhone'; import React, { useEffect, useRef, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { @@ -14,7 +16,6 @@ import { KeyboardAvoidingView, Platform, StyleSheet, - Text, TextInput, TouchableOpacity, View, @@ -156,10 +157,10 @@ const Confirm = () => { style={Loginstyle.background} resizeMode="contain" imageStyle={{ - opacity: 0.3, + opacity: 0.1, height: '100%', width: '100%', - transform: [{ scale: 1.5 }], + transform: [{ scale: 1 }], }} > @@ -174,11 +175,13 @@ const Confirm = () => { behavior={Platform.OS === 'ios' ? 'padding' : 'height'} > - {t('Tasdiqlash kodini kiriting')} - - {phoneNumber} {t('raqamiga yuborilgan')} {OTP_LENGTH}{' '} + + {t('Tasdiqlash kodini kiriting')} + + + {formatPhone(phoneNumber)} {t('raqamiga yuborilgan')} {OTP_LENGTH}{' '} {t('xonali kodni kiriting.')}{' '} - + {code.map((digit, index) => ( { ))} {errorConfirm && ( - {errorConfirm} + {errorConfirm} )} {canResend ? ( @@ -203,14 +206,14 @@ const Confirm = () => { onPress={handleResendCode} style={styles.resendButton} > - + {t('Kodni qayta yuborish')} - + ) : ( - + {t('Kodni qayta yuborish vaqti')} ({timer}s) - + )} { {isPending ? ( ) : ( - {t('Tasdiqlash')} - + )} diff --git a/src/screens/auth/login/ui/index.tsx b/src/screens/auth/login/ui/index.tsx index 6e2b373..25d22c4 100644 --- a/src/screens/auth/login/ui/index.tsx +++ b/src/screens/auth/login/ui/index.tsx @@ -7,6 +7,7 @@ import { useMutation, useQuery } from '@tanstack/react-query'; import { authApi } from 'api/auth'; import { loginPayload } from 'api/auth/type'; import { Branch, branchApi } from 'api/branch'; +import AppText from 'components/AppText'; import formatPhone from 'helpers/formatPhone'; import React, { useCallback, @@ -23,7 +24,6 @@ import { KeyboardAvoidingView, Platform, ScrollView, - Text, TextInput, TouchableOpacity, View, @@ -156,10 +156,10 @@ const Login = () => { style={Loginstyle.background} resizeMode="contain" imageStyle={{ - opacity: 0.3, + opacity: 0.1, height: '100%', width: '100%', - transform: [{ scale: 1.5 }], + transform: [{ scale: 1 }], }} > @@ -176,7 +176,9 @@ const Login = () => { - {t('Tizimga kirish')} + + {t('Tizimga kirish')} + { const formatted = formatPhone(rawPhone); return ( - + {t('Telefon raqami')} - + { maxLength={19} // +998 90 123-45-67 bo'lishi uchun /> {errors.phone && ( - + {t(errors.phone.message || '')} - + )} ); }} /> - + {t('Passport seriya raqami')} - + { /> {(errors.passportSeriya || errors.passportNumber) && ( - + {t(errors.passportSeriya?.message || '') || t(errors.passportNumber?.message || '')} - + )} @@ -263,7 +265,7 @@ const Login = () => { name="branchId" render={({ field: { value } }) => ( - {t('Filial')} + {t('Filial')} { setFilialDropdownVisible(prev => !prev) } > - { > {branchList?.find(e => e.id === value)?.name || t('Filialni tanlang...')} - + {filialDropdownVisible ? ( ) : ( @@ -301,21 +303,23 @@ const Login = () => { setFilialDropdownVisible(false); }} > - + {item.name} - + ))} )} {errors.branchId && ( - + {t(errors.branchId.message || '')} - + )} {error && ( - {t(error)} + + {t(error)} + )} )} @@ -328,9 +332,9 @@ const Login = () => { {isPending ? ( ) : ( - + {t('Tizimga kirish')} - + )} { alignItems: 'center', }} > - + {t('ID va kabinet yo’qmi?')} - + navigation.navigate('Register')} > - { }} > {t('Ro’yxatdan o’tish')} - + diff --git a/src/screens/auth/login/ui/styled.ts b/src/screens/auth/login/ui/styled.ts index db5a7fd..3b700e8 100644 --- a/src/screens/auth/login/ui/styled.ts +++ b/src/screens/auth/login/ui/styled.ts @@ -36,16 +36,16 @@ export const Loginstyle = StyleSheet.create({ position: 'relative', }, label: { - fontSize: 12, + fontSize: 14, fontWeight: '500', - color: '#28A7E8', + color: '#252525ff', marginBottom: 5, }, title: { fontSize: 24, - fontWeight: '600', + fontFamily: 'GolosText-Bold', textAlign: 'center', - color: '#28A7E8', + color: '#000', marginBottom: 20, }, input: { diff --git a/src/screens/auth/registeration/ui/Confirm.tsx b/src/screens/auth/registeration/ui/Confirm.tsx index cb63e6d..754ee69 100644 --- a/src/screens/auth/registeration/ui/Confirm.tsx +++ b/src/screens/auth/registeration/ui/Confirm.tsx @@ -6,6 +6,8 @@ import { NativeStackNavigationProp } from '@react-navigation/native-stack'; import { useMutation } from '@tanstack/react-query'; import { authApi } from 'api/auth'; import { otpPayload, resendPayload } from 'api/auth/type'; +import AppText from 'components/AppText'; +import formatPhone from 'helpers/formatPhone'; import React, { useEffect, useRef, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { @@ -14,7 +16,6 @@ import { KeyboardAvoidingView, Platform, StyleSheet, - Text, TextInput, TouchableOpacity, View, @@ -166,10 +167,10 @@ const Confirm = ({ style={RegisterStyle.background} resizeMode="contain" imageStyle={{ - opacity: 0.3, + opacity: 0.1, height: '100%', width: '100%', - transform: [{ scale: 1.5 }], + transform: [{ scale: 1 }], }} > @@ -184,11 +185,13 @@ const Confirm = ({ behavior={Platform.OS === 'ios' ? 'padding' : 'height'} > - {t('Tasdiqlash kodini kiriting')} - - {phoneNumber} {t('raqamiga yuborilgan')} {OTP_LENGTH}{' '} + + {t('Tasdiqlash kodini kiriting')} + + + {formatPhone(phoneNumber)} {t('raqamiga yuborilgan')} {OTP_LENGTH}{' '} {t('xonali kodni kiriting.')} - + {code.map((digit, index) => ( {errorConfirm !== null && ( - {errorConfirm} + {errorConfirm} )} {canResend ? ( @@ -215,14 +218,14 @@ const Confirm = ({ onPress={handleResendCode} style={styles.resendButton} > - + {t('Kodni qayta yuborish')} - + ) : ( - + {t('Kodni qayta yuborish vaqti')} ({timer}s) - + )} ) : ( - {t('Tasdiqlash')} - + )} @@ -350,7 +353,7 @@ const styles = StyleSheet.create({ verifyButtonText: { color: '#fff', fontSize: 18, - fontWeight: '600', + fontFamily: 'GolosText-Bold', }, }); diff --git a/src/screens/auth/registeration/ui/FirstStep.tsx b/src/screens/auth/registeration/ui/FirstStep.tsx index 0082335..9698ba9 100644 --- a/src/screens/auth/registeration/ui/FirstStep.tsx +++ b/src/screens/auth/registeration/ui/FirstStep.tsx @@ -13,6 +13,7 @@ import { useMutation, useQuery } from '@tanstack/react-query'; import { authApi } from 'api/auth'; import { registerPayload } from 'api/auth/type'; import { Branch, branchApi } from 'api/branch'; +import AppText from 'components/AppText'; import formatPhone from 'helpers/formatPhone'; import { useEffect, useState } from 'react'; import { Controller, useForm } from 'react-hook-form'; @@ -24,7 +25,6 @@ import { KeyboardAvoidingView, Platform, ScrollView, - Text, TextInput, TouchableOpacity, View, @@ -194,10 +194,10 @@ const FirstStep = ({ onNext }: { onNext: () => void }) => { style={RegisterStyle.background} resizeMode="contain" imageStyle={{ - opacity: 0.3, + opacity: 0.1, height: '100%', width: '100%', - transform: [{ scale: 1.5 }], + transform: [{ scale: 1 }], }} > @@ -217,16 +217,16 @@ const FirstStep = ({ onNext }: { onNext: () => void }) => { > - + {t("Ro'yxatdan o'tish")} - + ( - {t('Ism')} + {t('Ism')} void }) => { placeholderTextColor={'#D8DADC'} /> {errors.firstName && ( - + {t(errors.firstName.message || '')} - + )} )} @@ -247,7 +247,9 @@ const FirstStep = ({ onNext }: { onNext: () => void }) => { name="lastName" render={({ field: { onChange, value } }) => ( - {t('Familiya')} + + {t('Familiya')}{' '} + void }) => { value={value} /> {errors.lastName && ( - + {t(errors.lastName.message || '')} - + )} )} @@ -270,9 +272,9 @@ const FirstStep = ({ onNext }: { onNext: () => void }) => { const formatted = formatPhone(rawPhone); return ( - + {t('Telefon raqami')} - + void }) => { maxLength={17} /> {errors.phoneNumber && ( - + {t(errors.phoneNumber.message || '')} - + )} ); @@ -303,7 +305,9 @@ const FirstStep = ({ onNext }: { onNext: () => void }) => { name="branchId" render={({ field: { value } }) => ( - {t('Filial')} + + {t('Filial')}{' '} + void }) => { setFilialDropdownVisible(prev => !prev) } > - void }) => { > {branchList?.find(e => e.id === value)?.name || t('Filialni tanlang...')} - + {filialDropdownVisible ? ( ) : ( @@ -343,18 +347,20 @@ const FirstStep = ({ onNext }: { onNext: () => void }) => { setFilialDropdownVisible(false); }} > - + {item.name} - + ))} )} {errors.branchId && ( - + {t(errors.branchId.message || '')} - + )} )} @@ -364,9 +370,9 @@ const FirstStep = ({ onNext }: { onNext: () => void }) => { name="address" render={({ field: { onChange, value } }) => ( - + {t('Manzilingizni kiriting')} - + void }) => { value={value} /> {errors.lastName && ( - + {t(errors.lastName.message || '')} - + )} )} @@ -389,9 +395,9 @@ const FirstStep = ({ onNext }: { onNext: () => void }) => { name="recommend" render={({ field: { value } }) => ( - + {t('Bizni qaerdan topdingiz?')} - + void }) => { setRecommendedDropdownVisible(prev => !prev) } > - void }) => { recommended.find(e => e.value === value)?.label || 'Bizni kim tavsiya qildi...', )} - + {recommendedDropdownVisible ? ( ) : ( @@ -432,23 +438,23 @@ const FirstStep = ({ onNext }: { onNext: () => void }) => { setRecommendedDropdownVisible(false); }} > - + {t(item.label)} - + ))} )} {errors.recommend && ( - + {t(errors.recommend.message || '')} - + )} {error && ( - + {t(error)} - + )} )} @@ -491,10 +497,10 @@ const FirstStep = ({ onNext }: { onNext: () => void }) => { )} - - {t('Foydalanish shartlari')} - {t('bilan tanishib chiqdim!')} - + + {t('Foydalanish shartlari')} + {t('bilan tanishib chiqdim!')} + @@ -511,7 +517,7 @@ const FirstStep = ({ onNext }: { onNext: () => void }) => { {isPending ? ( ) : ( - void }) => { ]} > {t('Davom etish')} - + )} diff --git a/src/screens/auth/registeration/ui/SecondStep.tsx b/src/screens/auth/registeration/ui/SecondStep.tsx index 1803a2a..768cd9f 100644 --- a/src/screens/auth/registeration/ui/SecondStep.tsx +++ b/src/screens/auth/registeration/ui/SecondStep.tsx @@ -9,6 +9,7 @@ import { import type { NativeStackNavigationProp } from '@react-navigation/native-stack'; import { useMutation } from '@tanstack/react-query'; import passportApi, { sendPassportPayload } from 'api/passport'; +import AppText from 'components/AppText'; import DatePickerInput from 'components/DatePicker'; import SingleFileDrop from 'components/FileDrop'; import { useEffect, useRef, useState } from 'react'; @@ -23,7 +24,6 @@ import { KeyboardAvoidingView, Platform, ScrollView, - Text, TextInput, TouchableOpacity, View, @@ -130,10 +130,10 @@ const SecondStep = () => { style={RegisterStyle.background} resizeMode="contain" imageStyle={{ - opacity: 0.3, + opacity: 0.1, height: '100%', width: '100%', - transform: [{ scale: 1.5 }], + transform: [{ scale: 1 }], }} > @@ -151,9 +151,9 @@ const SecondStep = () => { - + {t('Shaxsiy maʼlumotlar')} - + { /> {/* PASSPORT */} - + {t('Passport seriya raqami')} - + { /> {(errors.passportSeriya || errors.passportNumber) && ( - + {t(errors.passportSeriya?.message || '') || t(errors.passportNumber?.message || '')} - + )} {/* JSHSHIR */} @@ -223,7 +223,9 @@ const SecondStep = () => { name="jshshir" render={({ field: { onChange, value } }) => ( - {t('JSHSHIR')} + + {t('JSHSHIR')}{' '} + { } /> {errors.jshshir && ( - + {t(errors.jshshir.message || '')} - + )} )} @@ -250,9 +252,9 @@ const SecondStep = () => { name="birthDate" render={({ field: { onChange, value } }) => ( - + {t("Tug'ilgan sana")} - + { {errors.birthDate && ( - + {t(errors.birthDate?.message || '')} - + )} )} @@ -358,9 +360,9 @@ const SecondStep = () => { /> {/* FILE UPLOAD */} - + {t('Passport/ID karta rasmi yoki faylni yuklang')} - + { {isPending ? ( ) : ( - {t('Tasdiqlash')} - + )} diff --git a/src/screens/auth/registeration/ui/TermsAndConditions.tsx b/src/screens/auth/registeration/ui/TermsAndConditions.tsx index 9e29400..c6e93f3 100644 --- a/src/screens/auth/registeration/ui/TermsAndConditions.tsx +++ b/src/screens/auth/registeration/ui/TermsAndConditions.tsx @@ -1,14 +1,9 @@ import { useNavigation } from '@react-navigation/native'; import { NativeStackNavigationProp } from '@react-navigation/native-stack'; +import AppText from 'components/AppText'; import React from 'react'; import { useTranslation } from 'react-i18next'; -import { - ScrollView, - StyleSheet, - Text, - TouchableOpacity, - View, -} from 'react-native'; +import { ScrollView, StyleSheet, TouchableOpacity, View } from 'react-native'; import { SafeAreaView } from 'react-native-safe-area-context'; import ArrowLeft from 'svg/ArrowLeft'; import { RootStackParamList } from 'types/types'; @@ -32,47 +27,53 @@ const TermsAndConditions = () => { navigation.goBack()}> - {t('Foydalanish shartlari')} + + {t('Foydalanish shartlari')} + - + {t('foydalanish_shartlari_va_qoidalari')} - + - {t('umumiy_qoidalar')} - {t('umumiy_qoidalar_text')} + {t('umumiy_qoidalar')} + {t('umumiy_qoidalar_text')} - + {t('foydalanuvchi_majburiyatlari')} - - + + {t('foydalanuvchi_majburiyatlari_text')} - + - {t('maxfiylik_siyosati')} - {t('maxfiylik_siyosati_text')} + {t('maxfiylik_siyosati')} + {t('maxfiylik_siyosati_text')} - {t('javobgarlik')} - {t('javobgarlik_text')} + {t('javobgarlik')} + {t('javobgarlik_text')} - {t('shartlarni_ozgartirish')} - {t('shartlarni_ozgartirish_text')} + + {t('shartlarni_ozgartirish')} + + + {t('shartlarni_ozgartirish_text')} + - {t('aloqa')} - {t('aloqa_text')} + {t('aloqa')} + {t('aloqa_text')} - + {t('oxirgi_yangilanish')} {new Date().toLocaleDateString('uz-UZ')} - + - {t('roziman')} + {t('roziman')} @@ -95,7 +96,7 @@ const styles = StyleSheet.create({ }, headerTitle: { fontSize: 18, - fontWeight: '600', + fontFamily: 'GolosText-Bold', color: '#000', }, content: { @@ -111,7 +112,7 @@ const styles = StyleSheet.create({ }, sectionTitle: { fontSize: 18, - fontWeight: '600', + fontFamily: 'GolosText-Bold', color: '#000', marginTop: 20, marginBottom: 10, @@ -148,7 +149,7 @@ const styles = StyleSheet.create({ agreeButtonText: { color: '#fff', fontSize: 16, - fontWeight: '600', + fontFamily: 'GolosText-Bold', }, }); diff --git a/src/screens/auth/registeration/ui/styled.ts b/src/screens/auth/registeration/ui/styled.ts index e19188b..be37738 100644 --- a/src/screens/auth/registeration/ui/styled.ts +++ b/src/screens/auth/registeration/ui/styled.ts @@ -39,20 +39,20 @@ export const RegisterStyle = StyleSheet.create({ mainTitle: { fontSize: 16, fontWeight: '500', - color: '#28A7E8', + color: '#252525ff', marginBottom: 10, }, label: { - fontSize: 12, + fontSize: 14, fontWeight: '500', - color: '#28A7E8', + color: '#252525ff', marginBottom: 5, }, title: { fontSize: 24, - fontWeight: '600', + fontFamily: 'GolosText-Bold', textAlign: 'center', - color: '#28A7E8', + color: '#000', marginBottom: 20, }, errorText: { @@ -168,7 +168,7 @@ export const RegisterStyle = StyleSheet.create({ }, termsLink: { color: '#28A7E8', - fontWeight: '600', + fontFamily: 'GolosText-Bold', textDecorationLine: 'underline', fontSize: 15, }, diff --git a/src/screens/auth/select-auth/SelectAuth.tsx b/src/screens/auth/select-auth/SelectAuth.tsx index 684df7f..f68b6e6 100644 --- a/src/screens/auth/select-auth/SelectAuth.tsx +++ b/src/screens/auth/select-auth/SelectAuth.tsx @@ -1,17 +1,18 @@ import { useNavigation } from '@react-navigation/native'; import { NativeStackNavigationProp } from '@react-navigation/native-stack'; +import AppText from 'components/AppText'; import { useTranslation } from 'react-i18next'; import { Image, ScrollView, StyleSheet, - Text, TouchableOpacity, View, useWindowDimensions, } from 'react-native'; import { SafeAreaView } from 'react-native-safe-area-context'; import Logo from 'screens/../../assets/bootsplash/logo_512.png'; +import InfoIcon from 'svg/Info'; import { RootStackParamList } from 'types/types'; type LoginScreenNavigationProp = NativeStackNavigationProp< @@ -44,36 +45,66 @@ const SelectAuth = () => { }, ]} /> - CPOST + {/* CPOST */} - + {t('Ro’yxatdan o’tganmisz')} - + - - - {t("Botdan ro'yxatdan o’tganmisiz")} - + navigation.navigate('Login')} - style={styles.button} + style={[ + styles.button, + { + backgroundColor: 'none', + borderWidth: 1, + borderColor: '#28A7E8', + }, + ]} > - {t('Tizimga kirish')} + + {t('Tizimga kirish')} + + + + + {t("Botdan ro'yxatdan o’tganmisiz")}? + + - - - - {t("Yangi ro’yxatdan o'tmoqchimisiz")} - + navigation.navigate('Register')} style={styles.button} > - {t('Ro’yxatdan o’tish')} + + {t('Ro’yxatdan o’tish')} + + + + + {t("Yangi ro’yxatdan o'tmoqchimisiz")}? + + @@ -110,18 +141,17 @@ const styles = StyleSheet.create({ }, logoText: { fontWeight: '500', - marginTop: 4, color: '#28A7E8', }, title: { - fontWeight: '500', + fontFamily: 'GolosText-Bold', textAlign: 'center', - color: '#28A7E8', + color: '#000', marginBottom: 20, }, helperText: { - color: '#28A7E8', - fontSize: 16, + color: '#252525ff', + fontSize: 12, }, button: { backgroundColor: '#28A7E8', diff --git a/src/screens/auth/select-language/SelectLang.tsx b/src/screens/auth/select-language/SelectLang.tsx index 896332e..33a4ca8 100644 --- a/src/screens/auth/select-language/SelectLang.tsx +++ b/src/screens/auth/select-language/SelectLang.tsx @@ -1,6 +1,7 @@ +import AppText from 'components/AppText'; import React, { useState } from 'react'; import { useTranslation } from 'react-i18next'; -import { Image, StyleSheet, Text, TouchableOpacity, View } from 'react-native'; +import { Image, StyleSheet, TouchableOpacity, View } from 'react-native'; import RU from 'screens/../../assets/bootsplash/RU.png'; import UZ from 'screens/../../assets/bootsplash/UZ.png'; import ArrowDown from 'svg/ArrowDown'; @@ -42,7 +43,7 @@ const LanguageSelector = () => { source={selectedLang?.Icon} style={{ width: 20, height: 20, objectFit: 'contain' }} /> - {selectedLang?.label} + {selectedLang?.label} {dropdownVisible ? ( @@ -63,7 +64,7 @@ const LanguageSelector = () => { source={item.Icon} style={{ width: 25, height: 25, objectFit: 'contain' }} /> - {item.label} + {item.label} ))} diff --git a/src/screens/auth/select-language/SelectLangPage.tsx b/src/screens/auth/select-language/SelectLangPage.tsx index d0814c5..dfc9951 100644 --- a/src/screens/auth/select-language/SelectLangPage.tsx +++ b/src/screens/auth/select-language/SelectLangPage.tsx @@ -1,11 +1,11 @@ import { useNavigation } from '@react-navigation/native'; import { NativeStackNavigationProp } from '@react-navigation/native-stack'; +import AppText from 'components/AppText'; import React from 'react'; import { Image, ScrollView, StyleSheet, - Text, TouchableOpacity, View, } from 'react-native'; @@ -46,15 +46,17 @@ const SelectLangPage = () => { }, ]} /> - CPOST + + CPOST + - + Tilni tanlang{' '} - + (Выберите язык) - - + + { style={styles.button} > - O'zbek tili + O'zbek tili { style={styles.button} > - Русский язык + Русский язык diff --git a/src/screens/authGate/ui/AuthGate.tsx b/src/screens/authGate/ui/AuthGate.tsx index f795efc..8dcbb4b 100644 --- a/src/screens/authGate/ui/AuthGate.tsx +++ b/src/screens/authGate/ui/AuthGate.tsx @@ -1,6 +1,7 @@ import AsyncStorage from '@react-native-async-storage/async-storage'; +import AppText from 'components/AppText'; import React, { useEffect, useState } from 'react'; -import { Alert, StyleSheet, Text, TouchableOpacity, View } from 'react-native'; +import { Alert, StyleSheet, TouchableOpacity, View } from 'react-native'; import ReactNativeBiometrics from 'react-native-biometrics'; import GesturePassword from 'react-native-gesture-password'; @@ -79,7 +80,7 @@ const LockScreen = ({ onAuthenticated }: Props) => { return ( - Unlock + Unlock {lockType === 'pattern' ? ( { style={styles.button} onPress={() => handleUnlockPasswordOrPin(password)} > - + Unlock with {lockType.toUpperCase()} - + )} @@ -113,7 +114,7 @@ const LockScreen = ({ onAuthenticated }: Props) => { } catch (e) {} }} > - Unlock with Biometrics + Unlock with Biometrics )} diff --git a/src/screens/home/branches/ui/Branches.tsx b/src/screens/home/branches/ui/Branches.tsx index d5d62da..9328399 100644 --- a/src/screens/home/branches/ui/Branches.tsx +++ b/src/screens/home/branches/ui/Branches.tsx @@ -2,18 +2,13 @@ import { useNavigation } from '@react-navigation/native'; import { NativeStackNavigationProp } from '@react-navigation/native-stack'; import { useQuery } from '@tanstack/react-query'; import { branchApi } from 'api/branch'; +import AppText from 'components/AppText'; import LayoutTwo from 'components/LayoutTwo'; import NavbarBack from 'components/NavbarBack'; import NoResult from 'components/NoResult'; import * as React from 'react'; import { useTranslation } from 'react-i18next'; -import { - ScrollView, - StyleSheet, - Text, - TouchableOpacity, - View, -} from 'react-native'; +import { ScrollView, StyleSheet, TouchableOpacity, View } from 'react-native'; import { SafeAreaView } from 'react-native-safe-area-context'; import ArrowRightUnderline from 'svg/ArrowRightUnderline'; @@ -67,8 +62,8 @@ const Branches = (props: BranchesProps) => { alignItems: 'flex-start', }} > - {e.name} - {e.address} + {e.name} + {e.address} @@ -107,7 +102,7 @@ const styles = StyleSheet.create({ title: { fontSize: 16, paddingHorizontal: 5, - fontWeight: '600', + fontFamily: 'GolosText-Bold', color: '#000', marginBottom: 6, }, diff --git a/src/screens/home/branches/ui/ListBranches.tsx b/src/screens/home/branches/ui/ListBranches.tsx index 795fb09..ae75b7c 100644 --- a/src/screens/home/branches/ui/ListBranches.tsx +++ b/src/screens/home/branches/ui/ListBranches.tsx @@ -2,12 +2,13 @@ import { RouteProp, useNavigation, useRoute } from '@react-navigation/native'; import { NativeStackNavigationProp } from '@react-navigation/native-stack'; import { useQuery } from '@tanstack/react-query'; import { Branch, branchApi } from 'api/branch'; +import AppText from 'components/AppText'; import BottomModal from 'components/BottomModal'; import LayoutTwo from 'components/LayoutTwo'; import LoadingScreen from 'components/LoadingScreen'; import React, { useEffect, useRef, useState } from 'react'; import { useTranslation } from 'react-i18next'; -import { StyleSheet, Text, TouchableOpacity, View } from 'react-native'; +import { StyleSheet, TouchableOpacity, View } from 'react-native'; import WebView from 'react-native-webview'; import Minus from 'svg/Minus'; import Plus from 'svg/Plus'; @@ -174,25 +175,27 @@ const ListBranches = () => { style={styles.zoomButton} onPress={() => handleZoom('in')} > - + - + handleZoom('out')} > - + - + navigation.navigate('Branches')} > - {t('Manzilni tekshirish')} + + {t('Manzilni tekshirish')} + )} @@ -242,7 +245,7 @@ const styles = StyleSheet.create({ }, buttonText: { color: '#fff', - fontWeight: '600', + fontFamily: 'GolosText-Bold', fontSize: 16, textAlign: 'center', }, diff --git a/src/screens/home/cargoPrices/ui/CargoPrices.tsx b/src/screens/home/cargoPrices/ui/CargoPrices.tsx index de1665a..c2e5dbe 100644 --- a/src/screens/home/cargoPrices/ui/CargoPrices.tsx +++ b/src/screens/home/cargoPrices/ui/CargoPrices.tsx @@ -2,16 +2,11 @@ import { useNavigation } from '@react-navigation/native'; import { NativeStackNavigationProp } from '@react-navigation/native-stack'; import { useQuery } from '@tanstack/react-query'; import reference_api from 'api/reference'; +import AppText from 'components/AppText'; import LayoutTwo from 'components/LayoutTwo'; import * as React from 'react'; import { useTranslation } from 'react-i18next'; -import { - ScrollView, - StyleSheet, - Text, - TouchableOpacity, - View, -} from 'react-native'; +import { ScrollView, StyleSheet, TouchableOpacity, View } from 'react-native'; import Tabs from '../../home/ui/Tabs'; interface CargoPricesProps {} @@ -41,90 +36,92 @@ const CargoPrices = (props: CargoPricesProps) => { data.map(ref => ( - {ref.title} - + {ref.title} + {ref.price}$/{ref.unitValue} {ref.unit} - + - {ref.shortDescription} + + {ref.shortDescription} + ))} - + {t( 'Avia pochtada bir maxsulotdan seriyalab olish mumkin emas', )} - + - + {t( '(Bu kargo narxini o’sishiga olib keladi. Seriyali buyularni avto kargo orqali olib kelish arzonga tushadi)', )} - + - + {t('Yetib kelish vaqti')} - - + 7-10 {t('kun')} - + - + {t( 'Yuklarni yetib elish vaqti oxirgi qadoqlash kunidan boshlab xisoblanadi', )} - + - + {t('Minimal miqdor talab qilinmaydi.')} - + - + {t( "ya'ni, qancha gramm mahsulot olsangiz, shuncha og'irligi (gramm) uchun to'lov qilasiz.", )} - + - + {t('Muhim!')} - + - + {t('Filiallargacha yetkazib berish - bepul.')} - + - + {t('Batafsil')}: @CPcargo_admin - + - + {t( "Agar siz yashayotgan hududda bizning filialimiz mavjud bo'lmasa, o'zingizga eng yaqin bo'lgan filialni tanlab, ro'yhatdan o'tishingiz mumkin.", )} - + navigation.navigate('ListBranches')} > - + {t("Filiallarimiz ro'yhati ilovada mavjud")} - + )} @@ -134,83 +131,85 @@ const CargoPrices = (props: CargoPricesProps) => { data.map(ref => ( - {ref.title} - + {ref.title} + {ref.price}$/{ref.unitValue} {ref.unit} - + - {ref.shortDescription} + + {ref.shortDescription} + ))} - + {t( 'Avto kargoda bir maxsulotdan seriyalab istalgan katta miqdorda olish mumkin. Doimiyko’p yuk oluvchi ijozlar uchun maxsus arzonlashtrilgan narxlarimiz bor', )} - + - + {t('Yetib kelish vaqti')} - - + 10-20 {t('kun')} - + - + {t( 'Yuklarni yetib elish vaqti oxirgi qadoqlash kunidan boshlab xisoblanadi', )} - + - + {t('Minimal miqdor talab qilinmaydi.')} - + - + {t( "ya'ni, qancha gramm mahsulot olsangiz, shuncha og'irligi (gramm) uchun to'lov qilasiz.", )} - + - + {t('Muhim!')} - + - + {t('Filiallargacha yetkazib berish - bepul.')} - + - + {t('Batafsil')}: @CPcargo_admin - + - + {t( "Agar siz yashayotgan hududda bizning filialimiz mavjud bo'lmasa, o'zingizga eng yaqin bo'lgan filialni tanlab, ro'yhatdan o'tishingiz mumkin.", )} - + navigation.navigate('ListBranches')} > - + {t("Filiallarimiz ro'yhati ilovada mavjud")} - + )} diff --git a/src/screens/home/home/ui/Pages.tsx b/src/screens/home/home/ui/Pages.tsx index 7a9e629..bceda03 100644 --- a/src/screens/home/home/ui/Pages.tsx +++ b/src/screens/home/home/ui/Pages.tsx @@ -1,8 +1,9 @@ import { useNavigation } from '@react-navigation/native'; import { NativeStackNavigationProp } from '@react-navigation/native-stack'; +import AppText from 'components/AppText'; import React from 'react'; import { useTranslation } from 'react-i18next'; -import { StyleSheet, Text, TouchableOpacity, View } from 'react-native'; +import { StyleSheet, TouchableOpacity, View } from 'react-native'; import ArrowRightUnderline from 'svg/ArrowRightUnderline'; import Usd from 'svg/Dollar'; import InfoIcon from 'svg/Info'; @@ -21,7 +22,7 @@ const Pages = () => { > - {t('Kargo narxlari')} + {t('Kargo narxlari')} @@ -32,7 +33,7 @@ const Pages = () => { > - {t('Taqiqlangan buyumlar')} + {t('Taqiqlangan buyumlar')} @@ -45,7 +46,7 @@ const Pages = () => { height={28 * scale} view="-4" /> - Shaxar bo’ylab yetkazish + Shaxar bo’ylab yetkazish { > - {t('Filiallar ro’yxati')} + {t('Filiallar ro’yxati')} @@ -71,7 +72,7 @@ const Pages = () => { > - {t('Kodsiz tovarlar')} + {t('Kodsiz tovarlar')} }, title: { fontSize: 16, - fontWeight: '600', + fontFamily: 'GolosText-Bold', }, }); diff --git a/src/screens/home/home/ui/PartyCarousel.tsx b/src/screens/home/home/ui/PartyCarousel.tsx index 0292b78..2ed7d05 100644 --- a/src/screens/home/home/ui/PartyCarousel.tsx +++ b/src/screens/home/home/ui/PartyCarousel.tsx @@ -1,4 +1,5 @@ import AnimatedIcon from 'components/AnimatedIcon'; +import AppText from 'components/AppText'; import React, { useMemo, useRef, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { @@ -6,7 +7,6 @@ import { Modal, Pressable, StyleSheet, - Text, useWindowDimensions, View, } from 'react-native'; @@ -152,12 +152,12 @@ const PartyCarousel = ({ }, ]} > - + {day.date.slice(-2)} - - + + {t(day.weekday)} - + ); }} @@ -167,7 +167,9 @@ const PartyCarousel = ({ - {item.cargo.toUpperCase()} + + {item.cargo.toUpperCase()} + @@ -208,20 +210,25 @@ const PartyCarousel = ({ > - + {t('Yetkazish tafsilotlari')} - + {selectedItem && selectedItem.start.map((day: any, idx: number) => ( - + {day.date} - {t(day.weekday)} - {t(day.status)} - + ))} setModalVisible(false)} style={modalStyles.closeButton} > - {t('Yopish')} + + {t('Yopish')} + @@ -248,13 +255,15 @@ const modalStyles = StyleSheet.create({ }, modalTitle: { fontSize: 18, - fontWeight: '600', + fontFamily: 'GolosText-Bold', marginBottom: 12, }, closeButton: { marginTop: 20, backgroundColor: '#28A7E8', paddingVertical: 8, + width: '100%', + textAlign: 'center', paddingHorizontal: 20, borderRadius: 8, }, diff --git a/src/screens/home/home/ui/Tabs.tsx b/src/screens/home/home/ui/Tabs.tsx index 89d99cd..454d4f8 100644 --- a/src/screens/home/home/ui/Tabs.tsx +++ b/src/screens/home/home/ui/Tabs.tsx @@ -1,6 +1,7 @@ +import AppText from 'components/AppText'; import { Dispatch, SetStateAction, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; -import { Image, Text, TouchableOpacity, View } from 'react-native'; +import { Image, TouchableOpacity, View } from 'react-native'; import LinearGradient from 'react-native-linear-gradient'; import AviaLogo from 'screens/../../assets/bootsplash/Avia.png'; import AutoLogo from 'screens/../../assets/bootsplash/auto.png'; @@ -63,11 +64,11 @@ const Tabs = ({ activeTab, setActiveTab }: Props) => { style={gradientStyle} > - {item.label} - + ); diff --git a/src/screens/home/home/ui/TabsAuto.tsx b/src/screens/home/home/ui/TabsAuto.tsx index 58b5381..f6786e6 100644 --- a/src/screens/home/home/ui/TabsAuto.tsx +++ b/src/screens/home/home/ui/TabsAuto.tsx @@ -2,12 +2,12 @@ import Clipboard from '@react-native-clipboard/clipboard'; import { useQuery } from '@tanstack/react-query'; import { authApi } from 'api/auth'; import warhouses_api from 'api/warhouses'; +import AppText from 'components/AppText'; import React from 'react'; import { useTranslation } from 'react-i18next'; import { FlatList, StyleSheet, - Text, TouchableOpacity, useWindowDimensions, View, @@ -86,11 +86,11 @@ const TabsAuto = () => { - China (Auto) + China (Auto) - {item} + {item} handleCopy([item])}> @@ -124,7 +124,7 @@ const makeStyles = (scale: number, cardWidth: number, screenWidth: number) => }, title: { fontSize: 20 * scale, - fontWeight: '600', + fontFamily: 'GolosText-Bold', color: '#101623CC', }, infoId: { diff --git a/src/screens/home/home/ui/TabsAvia.tsx b/src/screens/home/home/ui/TabsAvia.tsx index 5f425fa..b4bec09 100644 --- a/src/screens/home/home/ui/TabsAvia.tsx +++ b/src/screens/home/home/ui/TabsAvia.tsx @@ -2,12 +2,12 @@ import Clipboard from '@react-native-clipboard/clipboard'; import { useQuery } from '@tanstack/react-query'; import { authApi } from 'api/auth'; import warhouses_api from 'api/warhouses'; +import AppText from 'components/AppText'; import React from 'react'; import { useTranslation } from 'react-i18next'; import { FlatList, StyleSheet, - Text, TouchableOpacity, useWindowDimensions, View, @@ -87,11 +87,11 @@ const TabsAvia = () => { - China (AVIA) + China (AVIA) - {item} + {item} handleCopy([item])}> @@ -139,7 +139,7 @@ const makeStyles = (scale: number, cardWidth: number, screenWidth: number) => }, title: { fontSize: 20, - fontWeight: '600', + fontFamily: 'GolosText-Bold', color: '#101623CC', }, infoId: { diff --git a/src/screens/home/home/ui/styled.ts b/src/screens/home/home/ui/styled.ts index 5d90c43..c5c5cea 100644 --- a/src/screens/home/home/ui/styled.ts +++ b/src/screens/home/home/ui/styled.ts @@ -46,7 +46,7 @@ export const HomeStyle = () => reysTitle: { fontSize: 20, color: '#28A7E8', - fontWeight: '600', + fontFamily: 'GolosText-Bold', }, text: { fontWeight: '500', @@ -171,6 +171,6 @@ export const HomeStyle = () => width: '60%', color: '#FFFFFF', fontSize: 14, - fontWeight: '600', + fontFamily: 'GolosText-Bold', }, }); diff --git a/src/screens/home/restrictedProduct/ui/RestrictedProduct.tsx b/src/screens/home/restrictedProduct/ui/RestrictedProduct.tsx index b97cb06..87af38c 100644 --- a/src/screens/home/restrictedProduct/ui/RestrictedProduct.tsx +++ b/src/screens/home/restrictedProduct/ui/RestrictedProduct.tsx @@ -1,7 +1,8 @@ +import AppText from 'components/AppText'; import LayoutTwo from 'components/LayoutTwo'; import * as React from 'react'; import { useTranslation } from 'react-i18next'; -import { ScrollView, StyleSheet, Text, View } from 'react-native'; +import { ScrollView, StyleSheet, View } from 'react-native'; import Battery from 'svg/Battery'; import Blade from 'svg/Blade'; import Book from 'svg/Book'; @@ -17,16 +18,16 @@ import Tabs from '../../home/ui/Tabs'; interface RestrictedProductProps {} const RestrictedProduct = (props: RestrictedProductProps) => { - const [activeTab, setActiveTab] = React.useState<'avia' | 'auto'>('avia'); + const [activeTab, setActiveTab] = React.useState<'AVIA' | 'AUTO'>('AVIA'); const { t } = useTranslation(); return ( - {activeTab === 'avia' && ( + {activeTab === 'AVIA' && ( - { }} > {t('Aviada taqiqlangan buyumlar')} - + - + - - + + {t('Ichida suyuqligi bor narsalar')} - + - + - + - + {t('Batareykasi va magnit bo’lgan istalgan narsa')} - - + + {t( '(Telifon, sensitive buyumlar, airpods, naushnik, qo’l soati, tagi yonadigan krasovkalar...)', )} - + - + - + - + {t('Kukunli buyumlar')} - - {t('(Pudra, ten...)')} + + + {t('(Pudra, ten...)')} + - + - + - + {t('Parfumeriya')} - - + + {t( '(Barcha Parfumeriya va kosmetika, yuvinish maxsulotlari)', )} - + - + - + - + {t('O’tkir tig’li va sovuq qirollar')} - - + + {t('(Pichoq, qaychi, miltiq...)')} - + - + - + - + {t('Zargarklik buyumlari')} - - + + {t('(Tilla, kumush, olmos, braslit...)')} - + - + - + - + {t('Dori darmon va med texnika')} - + - + - + - + {t('Oziq ovqat')} - + - + {t( "Agar sizda g'ayrioddiy yoki noaniq mahsulot bo'lsa, albatta buyurtma qilishdan oldin so'rashingiz tavsiya etiladi.", )} - + - + {t('Muhim!')} - + - + {t( "Avia pochta manzili orqali yuborilishi taqiqlangan mahsulot buyurtma qilgan bo'lsangiz, u avtomatik ravishda avtokargo yukiga (avto) o'tkaziladi. Shunday qilib, yukingiz Xitoy omborida qolib ketmaydi.", )} - + - + {t( `Shu bilan birga, Aviada ham, Avtoda ham taqiqlangan mahsulot yuborilgan bo'lsa bunday holatda mahsulot O'zbekistonga yuborilmaydi va bu uchun javobgarlik mijozga yuklanadi.`, )} - + )} - {activeTab === 'auto' && ( + {activeTab === 'AUTO' && ( - + - + - + {t('Zargarklik buyumlari')} - - + + {t('(Tilla, kumush, olmos, braslit...)')} - + - + - + - + {t('Dori darmon va med texnika')} - + - + - + - + {t('Oziq ovqat')} - + - + - + - + {t('Diniy kitob va diniy buyumlar')} - + - + - + - + {t('Dron, avtomat qurollar')} - + - + {t( "Agar sizda g'ayrioddiy yoki noaniq mahsulot bo'lsa, albatta buyurtma qilishdan oldin so'rashingiz tavsiya etiladi.", )} - + - + {t('Muhim!')} - + - + {t( "Avia pochta manzili orqali yuborilishi taqiqlangan mahsulot buyurtma qilgan bo'lsangiz, u avtomatik ravishda avtokargo yukiga (avto) o'tkaziladi. Shunday qilib, yukingiz Xitoy omborida qolib ketmaydi.", )} - + - + {t( "Shu bilan birga, Aviada ham, Avtoda ham taqiqlangan mahsulot yuborilgan bo'lsa bunday holatda mahsulot O'zbekistonga yuborilmaydi va bu uchun javobgarlik mijozga yuklanadi.", )} - + )} diff --git a/src/screens/home/uncodified/ui/Uncodified.tsx b/src/screens/home/uncodified/ui/Uncodified.tsx index 95e4345..435d9c9 100644 --- a/src/screens/home/uncodified/ui/Uncodified.tsx +++ b/src/screens/home/uncodified/ui/Uncodified.tsx @@ -1,8 +1,9 @@ +import AppText from 'components/AppText'; import Navbar from 'components/Navbar'; import Navigation from 'components/Navigation'; import React from 'react'; import { useTranslation } from 'react-i18next'; -import { Image, ScrollView, StyleSheet, Text, View } from 'react-native'; +import { Image, ScrollView, StyleSheet, View } from 'react-native'; import { SafeAreaView } from 'react-native-safe-area-context'; const Uncodified = () => { @@ -20,8 +21,8 @@ const Uncodified = () => { style={styles.image} /> - {t('Trek ID')}: - YT12345678 + {t('Trek ID')}: + YT12345678 diff --git a/src/screens/passport/createPassport/ui/CreateModal.tsx b/src/screens/passport/createPassport/ui/CreateModal.tsx index aa9f6ae..5daa5d6 100644 --- a/src/screens/passport/createPassport/ui/CreateModal.tsx +++ b/src/screens/passport/createPassport/ui/CreateModal.tsx @@ -1,12 +1,12 @@ import { useNavigation } from '@react-navigation/native'; import { NativeStackNavigationProp } from '@react-navigation/native-stack'; +import AppText from 'components/AppText'; import LottieView from 'lottie-react-native'; import React, { useEffect, useRef, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { Animated, StyleSheet, - Text, TouchableOpacity, useWindowDimensions, View, @@ -83,11 +83,11 @@ const CreateModal = ({ visible, setVisible, error }: ModalSuccessViewProps) => { ]} > - + {error ? t("Passport qo'shishda xatolik yuz berdi") : t("Passport muvaffaqqiyatli qo'shildi")} - + { style={styles.btn} onPress={() => setVisible(false)} > - {t('Yaxshi')} + {t('Yaxshi')} ) : ( - {t('Yaxshi')} + {t('Yaxshi')} )} diff --git a/src/screens/passport/createPassport/ui/CreatePassword.tsx b/src/screens/passport/createPassport/ui/CreatePassword.tsx index e83e16e..9a126b9 100644 --- a/src/screens/passport/createPassport/ui/CreatePassword.tsx +++ b/src/screens/passport/createPassport/ui/CreatePassword.tsx @@ -1,6 +1,7 @@ import { zodResolver } from '@hookform/resolvers/zod'; import { useMutation } from '@tanstack/react-query'; import passportApi, { AddPassportPayload } from 'api/passport'; +import AppText from 'components/AppText'; import DatePickerInput from 'components/DatePicker'; import SingleFileDrop from 'components/FileDrop'; import LayoutTwo from 'components/LayoutTwo'; @@ -13,7 +14,6 @@ import { KeyboardAvoidingView, Platform, ScrollView, - Text, TextInput, TouchableOpacity, View, @@ -121,7 +121,7 @@ const CreatePassword = () => { name="firstName" render={({ field: { onChange, value } }) => ( - {t('Ism')} + {t('Ism')} { placeholderTextColor={'#D8DADC'} /> {errors.firstName && ( - + {t(errors.firstName.message || '')} - + )} )} @@ -142,7 +142,9 @@ const CreatePassword = () => { name="lastName" render={({ field: { onChange, value } }) => ( - {t('Familiya')} + + {t('Familiya')} + { value={value} /> {errors.lastName && ( - + {t(errors.lastName.message || '')} - + )} )} /> - + {t('Passport seriya raqami')} - + { /> {(errors.passportSeriya || errors.passportNumber) && ( - + {t(errors.passportSeriya?.message || '') || t(errors.passportNumber?.message || '')} - + )} - {t('JSHSHIR')} + {t('JSHSHIR')} { )} /> {errors.jshshir && ( - + {t(errors.jshshir.message || '')} - + )} @@ -242,9 +244,9 @@ const CreatePassword = () => { name="birthDate" render={({ field: { onChange, value } }) => ( - + {t("Tug'ilgan sana")} - + { {errors.birthDate && ( - + {t(errors.birthDate?.message || '')} - + )} )} @@ -339,9 +341,9 @@ const CreatePassword = () => { /> - + {t('Passport/ID karta rasmi yoki faylni yuklang')} - + { {isPending ? ( ) : ( - {t("Qo'shish")} + + {t("Qo'shish")} + )} diff --git a/src/screens/passport/myPassport/ui/MyPassport.tsx b/src/screens/passport/myPassport/ui/MyPassport.tsx index d1563c2..cf4c7b0 100644 --- a/src/screens/passport/myPassport/ui/MyPassport.tsx +++ b/src/screens/passport/myPassport/ui/MyPassport.tsx @@ -1,16 +1,11 @@ import Clipboard from '@react-native-clipboard/clipboard'; import { getMeData } from 'api/auth/type'; import { myPassport } from 'api/passport'; +import AppText from 'components/AppText'; import formatDate from 'helpers/formatData'; import React from 'react'; import { useTranslation } from 'react-i18next'; -import { - Dimensions, - StyleSheet, - Text, - TouchableOpacity, - View, -} from 'react-native'; +import { Dimensions, StyleSheet, TouchableOpacity, View } from 'react-native'; import Toast from 'react-native-toast-message'; import Copy from 'svg/Copy'; @@ -64,7 +59,9 @@ const MyPassport = ({ getMe, myPassport }: Props) => { alignItems: 'center', }} > - {t('Passport ma’lumotlarim')} + + {t('Passport ma’lumotlarim')}{' '} + {getMe?.status && ( { { backgroundColor: getStatusMeta(getMe.status).bg }, ]} > - {getStatusMeta(getMe.status).label} - + )} @@ -93,7 +90,7 @@ const MyPassport = ({ getMe, myPassport }: Props) => { ]} > - {t('Tez ID')} + {t('Tez ID')} handleCopy((getMe && getMe?.aviaCargoId) || '') @@ -102,7 +99,7 @@ const MyPassport = ({ getMe, myPassport }: Props) => { - {getMe?.aviaCargoId} + {getMe?.aviaCargoId} { : { flexBasis: '65%', alignItems: 'flex-end' }, ]} > - {t('JSHSHIR')} - {data.passportPin} + {t('JSHSHIR')} + {data.passportPin} { { flexBasis: '100%', alignItems: 'flex-start' }, ]} > - {t('To’liq ismi')} - {data.fullName} + {t('To’liq ismi')} + {data.fullName} { : { flexBasis: '48%', alignItems: 'flex-start' }, ]} > - {t('Passport seriya')} - {data.passportSeries} + + {t('Passport seriya')}{' '} + + + {data.passportSeries}{' '} + { : { flexBasis: '48%', alignItems: 'flex-end' }, ]} > - {t('Tug’ilgan kun')} - + + {t('Tug’ilgan kun')}{' '} + + {formatDate(data.birthDate)} - + { : { flexBasis: '48%', alignItems: 'flex-start' }, ]} > - {t('Telefon raqami')} - +{data.phone} + + {t('Telefon raqami')}{' '} + + +{data.phone} { : { flexBasis: '48%', alignItems: 'flex-end' }, ]} > - {t('Limit')} - {data.availableLimit}$ + {t('Limit')} + + {data.availableLimit}${' '} + @@ -191,7 +198,7 @@ const styles = StyleSheet.create({ }, statusText: { fontSize: 13, - fontWeight: '600', + fontFamily: 'GolosText-Bold', }, card: { backgroundColor: '#FFFFFF', @@ -226,11 +233,6 @@ const styles = StyleSheet.create({ paddingHorizontal: 14, paddingVertical: 4, borderRadius: 20, - shadowColor: '#000', - shadowOffset: { width: 0, height: 2 }, - shadowOpacity: 0.15, - shadowRadius: 3, - elevation: 3, // Android uchun chiroyli ko‘rinishi }, infoTitle: { color: '#979797', diff --git a/src/screens/passport/myPassport/ui/Passport.tsx b/src/screens/passport/myPassport/ui/Passport.tsx index 083c1ad..f30c468 100644 --- a/src/screens/passport/myPassport/ui/Passport.tsx +++ b/src/screens/passport/myPassport/ui/Passport.tsx @@ -3,6 +3,7 @@ import type { NativeStackNavigationProp } from '@react-navigation/native-stack'; import { useQuery } from '@tanstack/react-query'; import { authApi } from 'api/auth'; import passportApi from 'api/passport'; +import AppText from 'components/AppText'; import Layout from 'components/Layout'; import LoadingScreen from 'components/LoadingScreen'; import Navbar from 'components/Navbar'; @@ -14,7 +15,6 @@ import { RefreshControl, ScrollView, StyleSheet, - Text, TouchableOpacity, View, } from 'react-native'; @@ -91,18 +91,18 @@ const Passport = () => { keyboardShouldPersistTaps="handled" > - {t('Passportlarim')} + {t('Passportlarim')} {myPassport && myPassport.length === 0 ? ( - + {t("Hali pasport qo'shilmagan")} - - + + {t("Yangi pasport qo'shish uchun tugmani bosing")} - + ) : ( @@ -115,7 +115,9 @@ const Passport = () => { activeOpacity={0.7} > - {t("Yangi pasport qo'shish")} + + {t("Yangi pasport qo'shish")} + ); @@ -126,7 +128,7 @@ const styles = StyleSheet.create({ flex: 1, }, header: { - paddingHorizontal: 20, + paddingHorizontal: 10, paddingTop: 5, }, title: { diff --git a/src/screens/passport/myPassport/ui/styled.ts b/src/screens/passport/myPassport/ui/styled.ts index 85244ce..55e1bff 100644 --- a/src/screens/passport/myPassport/ui/styled.ts +++ b/src/screens/passport/myPassport/ui/styled.ts @@ -37,7 +37,7 @@ export const PassportStyle = StyleSheet.create({ }, title: { fontSize: 24, - fontWeight: '600', + fontFamily: 'GolosText-Bold', textAlign: 'center', color: '#28A7E8', marginBottom: 20, @@ -155,7 +155,7 @@ export const PassportStyle = StyleSheet.create({ }, termsLink: { color: '#28A7E8', - fontWeight: '600', + fontFamily: 'GolosText-Bold', textDecorationLine: 'underline', fontSize: 15, }, diff --git a/src/screens/profile/myProfile/ui/Profile.tsx b/src/screens/profile/myProfile/ui/Profile.tsx index c2b120d..a40e4b0 100644 --- a/src/screens/profile/myProfile/ui/Profile.tsx +++ b/src/screens/profile/myProfile/ui/Profile.tsx @@ -82,7 +82,7 @@ const styles = StyleSheet.create({ btnText: { color: '#FFFFFF', fontSize: 18, - fontWeight: '600', + fontFamily: 'GolosText-Bold', }, }); diff --git a/src/screens/profile/myProfile/ui/ProfileHeader.tsx b/src/screens/profile/myProfile/ui/ProfileHeader.tsx index 67e03c7..31defb8 100644 --- a/src/screens/profile/myProfile/ui/ProfileHeader.tsx +++ b/src/screens/profile/myProfile/ui/ProfileHeader.tsx @@ -1,5 +1,6 @@ import { useQuery } from '@tanstack/react-query'; import { authApi } from 'api/auth'; +import AppText from 'components/AppText'; import React, { useState } from 'react'; import { useTranslation } from 'react-i18next'; import { @@ -7,7 +8,6 @@ import { Image, Linking, StyleSheet, - Text, TouchableOpacity, View, } from 'react-native'; @@ -157,9 +157,9 @@ const ProfileHeader = ({ userName = 'Samandar' }: { userName?: string }) => { {imageError ? ( - + {getMe?.fullName.charAt(0).toUpperCase()} - + ) : ( { - + {capitalizeWords(getMe?.fullName || '')} - + {getMe?.status && ( { { backgroundColor: getStatusMeta(getMe.status).bg }, ]} > - {getStatusMeta(getMe.status).label} - + )} - ID: {getMe?.aviaCargoId} - + ID: {getMe?.aviaCargoId} + {getMe?.phone ? formatPhone(getMe.phone) : ''} - + @@ -225,13 +225,15 @@ const ProfileHeader = ({ userName = 'Samandar' }: { userName?: string }) => { - {t("Rasmni o'zgartirish")} + + {t("Rasmni o'zgartirish")} + - + {t("Rasmni o'chirish")} - + @@ -281,15 +283,10 @@ const styles = StyleSheet.create({ paddingHorizontal: 14, paddingVertical: 4, borderRadius: 20, - shadowColor: '#000', - shadowOffset: { width: 0, height: 2 }, - shadowOpacity: 0.15, - shadowRadius: 3, - elevation: 3, // Android uchun chiroyli ko‘rinishi }, statusText: { fontSize: 13, - fontWeight: '600', + fontFamily: 'GolosText-Bold', }, infoUser: { marginTop: 10, @@ -300,7 +297,7 @@ const styles = StyleSheet.create({ }, userId: { textAlign: 'center', - fontWeight: '600', + fontFamily: 'GolosText-Bold', fontSize: 30, color: '#28A7E8', }, diff --git a/src/screens/profile/myProfile/ui/ProfilePages.tsx b/src/screens/profile/myProfile/ui/ProfilePages.tsx index 42549d6..e2f6612 100644 --- a/src/screens/profile/myProfile/ui/ProfilePages.tsx +++ b/src/screens/profile/myProfile/ui/ProfilePages.tsx @@ -1,13 +1,14 @@ import AsyncStorage from '@react-native-async-storage/async-storage'; import { useNavigation } from '@react-navigation/native'; import { NativeStackNavigationProp } from '@react-navigation/native-stack'; +import AppText from 'components/AppText'; import * as React from 'react'; import { useTranslation } from 'react-i18next'; import { Alert, Linking, + Platform, StyleSheet, - Text, TouchableOpacity, View, } from 'react-native'; @@ -75,23 +76,25 @@ const ProfilePages = (props: componentNameProps) => { > - {t('Sozlamalar')} - - - - navigation.navigate('Notifications')} - > - - - {t('Bildirishnomalar')} + {t('Sozlamalar')} + {Platform.OS === 'android' && ( + navigation.navigate('Notifications')} + > + + + {t('Bildirishnomalar')} + + + + )} { > - {t('Xitoy omborlari manzili')} + {t('Xitoy omborlari manzili')} @@ -114,7 +117,7 @@ const ProfilePages = (props: componentNameProps) => { > - {t('Yordam markazi')} + {t('Yordam markazi')} @@ -124,9 +127,9 @@ const ProfilePages = (props: componentNameProps) => { onPress={handleLogout} > - + {t('Chiqish')} - + { > - + {t('Hisobingizni o‘chirish')} - + diff --git a/src/screens/profile/notifications/ui/Notifications.tsx b/src/screens/profile/notifications/ui/Notifications.tsx index 0642592..abab6af 100644 --- a/src/screens/profile/notifications/ui/Notifications.tsx +++ b/src/screens/profile/notifications/ui/Notifications.tsx @@ -1,4 +1,5 @@ import AsyncStorage from '@react-native-async-storage/async-storage'; +import AppText from 'components/AppText'; import LayoutTwo from 'components/LayoutTwo'; import NoResult from 'components/NoResult'; import * as React from 'react'; @@ -7,7 +8,6 @@ import { RefreshControl, ScrollView, StyleSheet, - Text, TouchableOpacity, } from 'react-native'; import Clock from 'svg/Clock'; @@ -68,7 +68,7 @@ const Notifications = () => { style={styles.card} key={item.id} > - {item.message} + {item.message} )) diff --git a/src/screens/profile/notifications/ui/NotificationsModal.tsx b/src/screens/profile/notifications/ui/NotificationsModal.tsx index 49c6dc2..1611a16 100644 --- a/src/screens/profile/notifications/ui/NotificationsModal.tsx +++ b/src/screens/profile/notifications/ui/NotificationsModal.tsx @@ -1,12 +1,7 @@ +import AppText from 'components/AppText'; import React, { useEffect, useRef } from 'react'; import { useTranslation } from 'react-i18next'; -import { - Animated, - StyleSheet, - Text, - TouchableOpacity, - View, -} from 'react-native'; +import { Animated, StyleSheet, TouchableOpacity, View } from 'react-native'; import CloseIcon from 'svg/Close'; import { NotificationsData } from '../lib/data'; @@ -58,7 +53,7 @@ const NotificationsModal = ({ visible, setVisible, selectedOrder }: Props) => { ]} > - {selectedOrder.title} + {selectedOrder.title} @@ -66,9 +61,9 @@ const NotificationsModal = ({ visible, setVisible, selectedOrder }: Props) => { - {selectedOrder.message} + {selectedOrder.message} - {t('Yopish')} + {t('Yopish')} @@ -105,7 +100,7 @@ const styles = StyleSheet.create({ }, title: { fontSize: 18, - fontWeight: '600', + fontFamily: 'GolosText-Bold', }, closeBtn: { padding: 5, @@ -123,7 +118,7 @@ const styles = StyleSheet.create({ }, sectionTitle: { fontSize: 16, - fontWeight: '600', + fontFamily: 'GolosText-Bold', paddingHorizontal: 20, marginBottom: 8, }, @@ -159,11 +154,11 @@ const styles = StyleSheet.create({ }, totalLabel: { fontSize: 16, - fontWeight: '600', + fontFamily: 'GolosText-Bold', }, totalValue: { fontSize: 16, - fontWeight: '600', + fontFamily: 'GolosText-Bold', color: '#28A7E8', }, btn: { @@ -179,7 +174,7 @@ const styles = StyleSheet.create({ textAlign: 'center', color: '#fff', fontSize: 16, - fontWeight: '600', + fontFamily: 'GolosText-Bold', }, }); diff --git a/src/screens/profile/settings/ui/AddedLock.tsx b/src/screens/profile/settings/ui/AddedLock.tsx index a75baa1..46735ef 100644 --- a/src/screens/profile/settings/ui/AddedLock.tsx +++ b/src/screens/profile/settings/ui/AddedLock.tsx @@ -1,442 +1,13 @@ -import AsyncStorage from '@react-native-async-storage/async-storage'; -import { useNavigation, useRoute } from '@react-navigation/native'; -import { NativeStackNavigationProp } from '@react-navigation/native-stack'; -import React, { useEffect, useRef, useState } from 'react'; -import { - Alert, - Dimensions, - PanResponder, - StyleSheet, - Text, - TextInput, - TouchableOpacity, - UIManager, - View, - findNodeHandle, -} from 'react-native'; -import { CodeField, Cursor } from 'react-native-confirmation-code-field'; -import { SafeAreaView } from 'react-native-safe-area-context'; -import Svg, { Line } from 'react-native-svg'; - -const LOCK_ENABLED = 'LOCK_ENABLED'; -const LOCK_TYPE = 'LOCK_TYPE'; -const LOCK_PASSWORD = 'LOCK_PASSWORD'; -const LOCK_PATTERN = 'LOCK_PATTERN'; - -type LockType = 'pin' | 'password' | 'pattern'; - -type PatternLockProps = { - path: number[]; - setPath: React.Dispatch>; - onPatternComplete: (pattern: string | null) => void; - patternError?: boolean; -}; - -const PatternLock = ({ - path, - setPath, - onPatternComplete, - patternError, -}: PatternLockProps) => { - const { width } = Dimensions.get('window'); - const size = width * 0.8; - const cellSize = size / 3; - const containerRef = useRef(null); - const [layout, setLayout] = useState({ pageX: 0, pageY: 0 }); - const [currentPos, setCurrentPos] = useState<{ x: number; y: number } | null>( - null, - ); - - const points = Array.from({ length: 9 }, (_, i) => ({ - id: i + 1, - x: (i % 3) * cellSize + cellSize / 2, - y: Math.floor(i / 3) * cellSize + cellSize / 2, - })); - - const panResponder = PanResponder.create({ - onStartShouldSetPanResponder: () => true, - onMoveShouldSetPanResponder: () => true, - onPanResponderGrant: () => { - setPath([]); // yangi chizma - setCurrentPos(null); - }, - onPanResponderMove: (_e, gestureState) => { - const x = gestureState.moveX - layout.pageX; - const y = gestureState.moveY - layout.pageY; - setCurrentPos({ x, y }); - - const point = points.find( - p => - Math.abs(p.x - x) < cellSize / 3 && Math.abs(p.y - y) < cellSize / 3, - ); - - if (point && !path.includes(point.id)) { - setPath(prev => { - const newPath = [...prev, point.id]; - return newPath; - }); - } - }, - onPanResponderRelease: () => { - setCurrentPos(null); - onPatternComplete(path.length > 0 ? path.join('') : null); - }, - }); - - useEffect(() => { - if (containerRef.current) { - const handle = findNodeHandle(containerRef.current); - if (handle) { - UIManager.measure(handle, (_x, _y, _w, _h, pageX, pageY) => { - setLayout({ pageX, pageY }); - }); - } - } - }, []); +import AppText from 'components/AppText'; +import React from 'react'; +import { View } from 'react-native'; +const AddedLock = () => { return ( - - - {path.map((id, idx) => { - if (idx === 0) return null; - const from = points.find(p => p.id === path[idx - 1]); - const to = points.find(p => p.id === id); - if (!from || !to) return null; - return ( - - ); - })} - - {currentPos && path.length > 0 && ( - p.id === path[path.length - 1])?.x} - y1={points.find(p => p.id === path[path.length - 1])?.y} - x2={currentPos.x} - y2={currentPos.y} - stroke="#28A7E8" - strokeWidth={2} - strokeDasharray="4" - /> - )} - - - {points.map(point => ( - - ))} + + AddedLock ); }; -const AddedLock = () => { - const [step, setStep] = useState<1 | 2>(1); - - const [password, setPassword] = useState(''); - const [confirmPassword, setConfirmPassword] = useState(''); - - // Pattern states - const [patternPath, setPatternPath] = useState([]); - const [patternTemp, setPatternTemp] = useState(null); - const [patternConfirmed, setPatternConfirmed] = useState(false); - const [patternError, setPatternError] = useState(false); - - const route = useRoute(); - const navigation = useNavigation>(); - const paramLockType = route.params?.lockType; - const validLockTypes: LockType[] = ['pin', 'password', 'pattern']; - const initialLockType: LockType = validLockTypes.includes(paramLockType) - ? paramLockType - : 'pin'; - - const [lockType] = useState(initialLockType); - - const onContinue = async () => { - if (step === 1) { - if (lockType === 'pattern') { - if (!patternTemp) { - return Alert.alert('Error', 'Please draw your pattern first'); - } - setPatternPath([]); // clear for second step - } else { - if (!password) { - return Alert.alert('Error', 'Please enter your PIN/Password'); - } - } - setStep(2); - return; - } - - if (lockType === 'pattern') { - if (!patternConfirmed) { - return Alert.alert('Error', 'Please confirm your pattern'); - } - await AsyncStorage.setItem(LOCK_PATTERN, patternTemp!); - } else { - if (!confirmPassword) { - return Alert.alert('Error', 'Please confirm your PIN/Password'); - } - if (password !== confirmPassword) { - return Alert.alert('Error', 'Values do not match'); - } - await AsyncStorage.setItem(LOCK_PASSWORD, password); - } - - await AsyncStorage.setItem(LOCK_ENABLED, 'true'); - await AsyncStorage.setItem(LOCK_TYPE, lockType); - Alert.alert('Success', 'Lock settings saved'); - - resetForm(); - navigation.goBack(); - }; - - const resetForm = () => { - setStep(1); - setPassword(''); - setConfirmPassword(''); - setPatternPath([]); - setPatternTemp(null); - setPatternConfirmed(false); - }; - - const handlePatternComplete = (inputPattern: string | null) => { - if (!inputPattern || inputPattern.length < 4) { - setPatternError(true); - setTimeout(() => { - setPatternError(false); - setPatternPath([]); - }, 800); - return; - } - - if (step === 1) { - setPatternTemp(inputPattern); - } else { - if (patternTemp && inputPattern === patternTemp) { - setPatternConfirmed(true); - Alert.alert('Success', 'Pattern confirmed'); - } else { - setPatternError(true); - setTimeout(() => { - setPatternError(false); - setStep(1); - setPatternPath([]); - }, 800); - } - } - }; - - return ( - - - - {lockType === 'pattern' ? ( - - {step === 1 ? ( - <> - - Draw your pattern - - - - ) : ( - <> - - Confirm your pattern - - - - )} - - ) : lockType === 'pin' ? ( - <> - {step === 1 ? ( - <> - - Enter PIN - - ( - - - {symbol || (isFocused ? : null)} - - - )} - /> - - ) : ( - <> - - Confirm PIN - - ( - - - {symbol || (isFocused ? : null)} - - - )} - /> - - )} - - ) : ( - <> - {step === 1 ? ( - - ) : ( - - )} - - )} - - - - { - resetForm(); - navigation.goBack(); - }} - > - Bekor qilish - - - - - {step === 1 ? 'Davom etish' : 'Saqlash'} - - - - - - ); -}; - -const styles = StyleSheet.create({ - container: { flex: 1 }, - btnCard: { - position: 'absolute', - flexDirection: 'row', - bottom: 5, - width: '100%', - justifyContent: 'center', - gap: 10, - }, - patternContainer: { - borderRadius: 10, - justifyContent: 'center', - alignItems: 'center', - }, - patternPoint: { - width: 30, - height: 30, - borderRadius: 15, - backgroundColor: '#ddd', - position: 'absolute', - }, - patternPointActive: { backgroundColor: '#28A7E8' }, - pinCell: { - borderWidth: 1, - borderColor: '#ccc', - borderRadius: 8, - width: 50, - height: 50, - justifyContent: 'center', - alignItems: 'center', - margin: 5, - }, - pinCellFocused: { borderColor: '#28A7E8' }, - input: { - borderWidth: 1, - borderColor: '#ccc', - borderRadius: 8, - padding: 15, - marginBottom: 15, - fontSize: 16, - }, - button: { - backgroundColor: '#28A7E8', - padding: 15, - borderRadius: 8, - alignItems: 'center', - width: '48%', - }, - removeButton: { backgroundColor: '#ccc' }, - buttonText: { color: '#fff', fontSize: 16, fontWeight: 'bold' }, - lockCard: { - height: '100%', - justifyContent: 'center', - width: '95%', - margin: 'auto', - }, - patternPointError: { backgroundColor: 'red' }, -}); - export default AddedLock; diff --git a/src/screens/profile/settings/ui/Settings.tsx b/src/screens/profile/settings/ui/Settings.tsx index 8cfe357..4da8a5b 100644 --- a/src/screens/profile/settings/ui/Settings.tsx +++ b/src/screens/profile/settings/ui/Settings.tsx @@ -1,3 +1,4 @@ +import AppText from 'components/AppText'; import LayoutTwo from 'components/LayoutTwo'; import * as React from 'react'; import { useTranslation } from 'react-i18next'; @@ -7,7 +8,6 @@ import { RefreshControl, ScrollView, StyleSheet, - Text, TouchableOpacity, View, } from 'react-native'; @@ -53,9 +53,9 @@ const Settings = () => { contentContainerStyle={{ paddingBottom: 10 }} > - + {t('select_language')} - + {languages.map(item => { const isSelected = selectedLang?.code === item.code; const isLoading = loadingLang === item.code; @@ -85,14 +85,14 @@ const Settings = () => { source={item.Icon} style={{ width: 30, height: 30, resizeMode: 'contain' }} /> - {item.label} - + { - Parol turini tanlang + Parol turini tanlang navigation.navigate('AddLock', { lockType: 'pin' }) } > - Pin-kod + Pin-kod @@ -36,7 +31,7 @@ const SettingsLock = () => { navigation.navigate('AddLock', { lockType: 'password' }) } > - Parol + Parol @@ -46,7 +41,7 @@ const SettingsLock = () => { navigation.navigate('AddLock', { lockType: 'pattern' }) } > - Chizma + Chizma diff --git a/src/screens/profile/support/ui/Support.tsx b/src/screens/profile/support/ui/Support.tsx index 6dbc698..e92c452 100644 --- a/src/screens/profile/support/ui/Support.tsx +++ b/src/screens/profile/support/ui/Support.tsx @@ -1,3 +1,4 @@ +import AppText from 'components/AppText'; import NavbarBack from 'components/NavbarBack'; import * as React from 'react'; import { useTranslation } from 'react-i18next'; @@ -7,7 +8,6 @@ import { RefreshControl, ScrollView, StyleSheet, - Text, TextInput, TouchableOpacity, View, @@ -85,11 +85,11 @@ const Support = (props: SupportProps) => { msg.fromUser ? styles.userBubble : styles.supportBubble, ]} > - {msg.text} - + ))} @@ -102,7 +102,7 @@ const Support = (props: SupportProps) => { placeholderTextColor="#999" /> - {t('Yuborish')} + {t('Yuborish')} @@ -176,6 +176,6 @@ const styles = StyleSheet.create({ sendButtonText: { color: '#fff', fontSize: 14, - fontWeight: '600', + fontFamily: 'GolosText-Bold', }, }); diff --git a/src/screens/profile/warehouses/ui/TabsAutoWarehouses.tsx b/src/screens/profile/warehouses/ui/TabsAutoWarehouses.tsx index 41f2c8c..217ac14 100644 --- a/src/screens/profile/warehouses/ui/TabsAutoWarehouses.tsx +++ b/src/screens/profile/warehouses/ui/TabsAutoWarehouses.tsx @@ -2,12 +2,12 @@ import Clipboard from '@react-native-clipboard/clipboard'; import { useQuery } from '@tanstack/react-query'; import { authApi } from 'api/auth'; import warhouses_api from 'api/warhouses'; +import AppText from 'components/AppText'; import React from 'react'; import { useTranslation } from 'react-i18next'; import { FlatList, StyleSheet, - Text, TouchableOpacity, useWindowDimensions, View, @@ -108,11 +108,11 @@ const TabsAutoWarehouses = () => { - China (Auto) + China (Auto) - {item} + {item} handleCopy(item.addressInfo)}> @@ -141,7 +141,7 @@ const makeStyles = (scale: number, cardWidth: number, screenWidth: number) => }, title: { fontSize: 20 * scale, - fontWeight: '600', + fontFamily: 'GolosText-Bold', color: '#101623CC', }, infoId: { diff --git a/src/screens/profile/warehouses/ui/TabsAviaWarehouses.tsx b/src/screens/profile/warehouses/ui/TabsAviaWarehouses.tsx index 3e1eb56..8616666 100644 --- a/src/screens/profile/warehouses/ui/TabsAviaWarehouses.tsx +++ b/src/screens/profile/warehouses/ui/TabsAviaWarehouses.tsx @@ -2,12 +2,12 @@ import Clipboard from '@react-native-clipboard/clipboard'; import { useQuery } from '@tanstack/react-query'; import { authApi } from 'api/auth'; import warhouses_api from 'api/warhouses'; +import AppText from 'components/AppText'; import React from 'react'; import { useTranslation } from 'react-i18next'; import { FlatList, StyleSheet, - Text, TouchableOpacity, useWindowDimensions, View, @@ -108,11 +108,11 @@ const TabsAviaWarehouses = () => { - China (Auto) + China (Auto) - {item} + {item} handleCopy(item.addressInfo)}> @@ -141,7 +141,7 @@ const makeStyles = (scale: number, cardWidth: number, screenWidth: number) => }, title: { fontSize: 20 * scale, - fontWeight: '600', + fontFamily: 'GolosText-Bold', color: '#101623CC', }, infoId: { diff --git a/src/screens/profile/warehouses/ui/Warehouses.tsx b/src/screens/profile/warehouses/ui/Warehouses.tsx index 7ac4131..c476f5a 100644 --- a/src/screens/profile/warehouses/ui/Warehouses.tsx +++ b/src/screens/profile/warehouses/ui/Warehouses.tsx @@ -1,5 +1,6 @@ import { useQuery } from '@tanstack/react-query'; import { authApi } from 'api/auth'; +import AppText from 'components/AppText'; import SingleFileDrop from 'components/FileDrop'; import LayoutTwo from 'components/LayoutTwo'; import * as React from 'react'; @@ -7,13 +8,14 @@ import { useTranslation } from 'react-i18next'; import { ActivityIndicator, Image, + Linking, RefreshControl, ScrollView, StyleSheet, - Text, TouchableOpacity, View, } from 'react-native'; +import AppLink from 'react-native-app-link'; import Toast from 'react-native-toast-message'; import Shablon from 'screens/../../assets/bootsplash/shablon.jpg'; import TabsAutoWarehouses from './TabsAutoWarehouses'; @@ -96,6 +98,19 @@ Cargo Idsi: ${getMe?.aviaCargoId} () => ({ paddingBottom: 10 }), [], ); + const openTelegram = React.useCallback(async () => { + try { + await AppLink.maybeOpenURL('tg://resolve?domain=cpostuz', { + appName: 'Telegram', + appStoreId: 686449807, + appStoreLocale: 'us', + playStoreId: 'org.telegram.messenger', + }); + } catch (err) { + // Agar ilovani ham, store’ni ham ochib bo‘lmasa, fallback URL + Linking.openURL('https://t.me/cpostuz'); + } + }, []); return ( - {t('Bizning Xitoy manzilimiz')} - + + {t('Bizning Xitoy manzilimiz')} + + {t( 'Taobao, pinduoduo, 1688 ,alibaba va Xitoyning istalgan platformasiga kiritish uchun', )} - + - + {t('Xitoy omborlarimiz manzilini programmaga kiriting')} - + - + {t( "Diqqat! Iltimos, Xitoy omborimiz manzilini Xitoy programmalariga kiritganingizdan so'ng, kiritilgan holatdagi skrenshotni bizga yuborib, tekshirtiring", )} - - + + {t( "Xitoy ombori manzilini to'g'ri kiritish, mahsulotingiz yo'qolib qolish oldini oladi.", )} - - + + {t( "Agar sizda savol tug'ilsa yoki biron narsaga tushunmasangiz bizga murojaat qiling", )} - + - {t('Skrenshot rasmini yuklang')} + + {t('Skrenshot rasmini yuklang')} + + + + {t( + "Hurmatli mijoz, ushbu berilgan ID manzil, ma'lumotlarni siz shu namunadagidek 1- va 4- qatorlarga oʻz ID kodingizni yozing! Aks holda sizning kargoingiz bilan muammo chiqishi mumkin.", + )} + + + + + {t( + 'Ilovaga kirib huddi shunday to’ldirganingizdan keyin ekranni rasmga(skrinshot) olib, sizga bot tomonidan berilgan ID kod vamanzilni ushbu', + )}{' '} + + @cpost_admin + {' '} + {t('admindan tasdiqlatib olishingiz kerak bo’ladi.')} + + ) : ( - {t('Manzilni tekshirish')} + + {t('Manzilni tekshirish')} + )} diff --git a/src/screens/status/ui/Filter.tsx b/src/screens/status/ui/Filter.tsx index 57919d0..1df4981 100644 --- a/src/screens/status/ui/Filter.tsx +++ b/src/screens/status/ui/Filter.tsx @@ -1,10 +1,10 @@ import { PacketsData } from 'api/packets'; +import AppText from 'components/AppText'; import React from 'react'; import { useTranslation } from 'react-i18next'; import { FlatList, StyleSheet, - Text, TouchableOpacity, View, useWindowDimensions, @@ -50,14 +50,14 @@ const Filter = ({ onPress={() => setOpen(prev => !prev)} > - {t('Filter')} + {t('Filter')} {open && ( {/* Header */} - {t('Transport')} + {t('Transport')} setOpen(false)}> @@ -82,19 +82,19 @@ const Filter = ({ setOpen(false); }} > - {type === 'AUTO' ? t('Avto') : t('Avia')} - + )} /> - {t('Reys raqami')} + {t('Reys raqami')} item.id?.toString() || 'all'} @@ -113,7 +113,7 @@ const Filter = ({ setOpen(false); }} > - {item.packetName === 'all' ? t('Barchasi') : item.packetName} - + )} /> @@ -176,7 +176,7 @@ const makeStyles = () => marginBottom: 10, }, sectionTitle: { - fontWeight: '600', + fontFamily: 'GolosText-Bold', marginBottom: 6, color: '#333', fontSize: 16, diff --git a/src/screens/status/ui/Order.tsx b/src/screens/status/ui/Order.tsx index 4954e73..811b43b 100644 --- a/src/screens/status/ui/Order.tsx +++ b/src/screens/status/ui/Order.tsx @@ -1,13 +1,8 @@ import { PacketsData } from 'api/packets'; +import AppText from 'components/AppText'; import React, { useCallback, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; -import { - FlatList, - StyleSheet, - Text, - TouchableOpacity, - View, -} from 'react-native'; +import { FlatList, StyleSheet, TouchableOpacity, View } from 'react-native'; import Auto from 'svg/Auto'; import Avia from 'svg/Avia'; import BagIcon from 'svg/BagIcon'; @@ -147,7 +142,7 @@ const Order = ({ data, openModal, selectedData }: Props) => { }, ]} > - { tabList.find(tab => tab.value === item.deliveryStatus) ?.label || '', )} - + {/* Info */} - {t('Reys raqami')} - {t('Reys raqami')} + {item.packetName} - + - {t('Mahsulotlar og’irligi')} - {item.weight} + + {t('Mahsulotlar og’irligi')} + + {item.weight} - {t('Umumiy narxi')} - {item.totalPrice} + {t('Umumiy narxi')} + {item.totalPrice} @@ -192,10 +189,10 @@ const Order = ({ data, openModal, selectedData }: Props) => { return ( - {t('Buyurtmalar soni')} - + {t('Buyurtmalar soni')} + {selectedData ? '1' : data.data.length} - + marginBottom: 12, }, statusText: { - fontWeight: '600', + fontFamily: 'GolosText-Bold', fontSize: 16, }, infoCard: { diff --git a/src/screens/status/ui/OrderDetailModal.tsx b/src/screens/status/ui/OrderDetailModal.tsx index 5ef07cd..e315030 100644 --- a/src/screens/status/ui/OrderDetailModal.tsx +++ b/src/screens/status/ui/OrderDetailModal.tsx @@ -1,10 +1,10 @@ +import AppText from 'components/AppText'; import React, { useEffect, useRef } from 'react'; import { useTranslation } from 'react-i18next'; import { Animated, ScrollView, StyleSheet, - Text, TouchableOpacity, View, } from 'react-native'; @@ -68,7 +68,7 @@ const OrderDetailModal = ({ visible, setVisible, selectedOrder }: Props) => { ]} > - {selectedOrder.packetName} + {selectedOrder.packetName} @@ -76,7 +76,7 @@ const OrderDetailModal = ({ visible, setVisible, selectedOrder }: Props) => { - {t('Mahsulotlar')}: + {t('Mahsulotlar')}: { return ( - {product.name} - {t('Trek ID')}: + {product.name} + + {t('Trek ID')}: + - {product.trekId} + {product.trekId} - + {t('Og’irligi')}: {product.weight} - - + + {t('Narxi')}: 1kg * {pricePerKg.toLocaleString('uz-UZ')}{' '} {t("so'm")} - + - + {t('Umumiy narxi')}: {product.totalPrice} {t('so‘m')} - + ); @@ -113,12 +115,14 @@ const OrderDetailModal = ({ visible, setVisible, selectedOrder }: Props) => { - {t('Umumiy narx')}: - {selectedOrder.totalPrice} + {t('Umumiy narx')}: + + {selectedOrder.totalPrice} + - {t('Yopish')} + {t('Yopish')} @@ -144,7 +148,7 @@ const styles = StyleSheet.create({ }, total: { fontSize: 14, - fontWeight: '600', + fontFamily: 'GolosText-Bold', color: '#1D1D1D', }, modalContent: { @@ -165,7 +169,7 @@ const styles = StyleSheet.create({ }, title: { fontSize: 18, - fontWeight: '600', + fontFamily: 'GolosText-Bold', }, closeBtn: { padding: 5, @@ -183,7 +187,7 @@ const styles = StyleSheet.create({ }, sectionTitle: { fontSize: 16, - fontWeight: '600', + fontFamily: 'GolosText-Bold', paddingHorizontal: 20, marginBottom: 8, }, @@ -220,11 +224,11 @@ const styles = StyleSheet.create({ }, totalLabel: { fontSize: 16, - fontWeight: '600', + fontFamily: 'GolosText-Bold', }, totalValue: { fontSize: 16, - fontWeight: '600', + fontFamily: 'GolosText-Bold', color: '#28A7E8', }, btn: { @@ -240,7 +244,7 @@ const styles = StyleSheet.create({ textAlign: 'center', color: '#fff', fontSize: 16, - fontWeight: '600', + fontFamily: 'GolosText-Bold', }, }); diff --git a/src/screens/status/ui/Tabs.tsx b/src/screens/status/ui/Tabs.tsx index 42bfb8b..c179c06 100644 --- a/src/screens/status/ui/Tabs.tsx +++ b/src/screens/status/ui/Tabs.tsx @@ -1,3 +1,4 @@ +import AppText from 'components/AppText'; import React, { Dispatch, SetStateAction, useRef, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { @@ -5,7 +6,6 @@ import { NativeScrollEvent, NativeSyntheticEvent, StyleSheet, - Text, TouchableOpacity, View, useWindowDimensions, @@ -79,11 +79,11 @@ const Tabs = ({ filter, setFilter }: Props) => { style={[styles.card, filter === item.value && styles.activeCard]} onPress={() => setFilter(item.value)} > - {t(item.label)} - + )} contentContainerStyle={styles.scrollContent} diff --git a/src/screens/wallet/enterCard/ui/EnterCard.tsx b/src/screens/wallet/enterCard/ui/EnterCard.tsx index 4c460ed..91b513b 100644 --- a/src/screens/wallet/enterCard/ui/EnterCard.tsx +++ b/src/screens/wallet/enterCard/ui/EnterCard.tsx @@ -1,5 +1,6 @@ import { zodResolver } from '@hookform/resolvers/zod'; import { RouteProp, useRoute } from '@react-navigation/native'; +import AppText from 'components/AppText'; import NavbarBack from 'components/NavbarBack'; import Navigation from 'components/Navigation'; import * as React from 'react'; @@ -11,7 +12,6 @@ import { Linking, Platform, ScrollView, - Text, TextInput, TouchableOpacity, View, @@ -110,7 +110,9 @@ const EnterCard = (props: EnterCardProps) => { name="card_name" render={({ field: { onChange, value } }) => ( - {t('Karta nomi')} + + {t('Karta nomi')} + { value={value} /> {errors.card_name && ( - + {t(errors.card_name.message || '')} - + )} )} @@ -137,12 +139,12 @@ const EnterCard = (props: EnterCardProps) => { return ( - + {t('Karta raqami')} - + {/* Ghost text with value + remaining */} - { }, ]} > - + {formattedValue} - - {ghostRemaining} - + + {ghostRemaining} + { @@ -206,9 +208,9 @@ const EnterCard = (props: EnterCardProps) => { /> {errors.card_number && ( - + {t(errors.card_number.message || '')} - + )} ); @@ -235,7 +237,9 @@ const EnterCard = (props: EnterCardProps) => { return ( - {t('Muddati')} + + {t('Muddati')} + { maxLength={5} /> {errors.duration && ( - + {t(errors.duration.message || '')} - + )} ); @@ -264,9 +268,9 @@ const EnterCard = (props: EnterCardProps) => { marginTop: 20, }} > - + {selectedId?.toUpperCase()} {t("ilovasi orqali to'lash")} - + @@ -294,7 +298,7 @@ const EnterCard = (props: EnterCardProps) => { {load ? ( ) : ( - {t("To'lash")} + {t("To'lash")} )} diff --git a/src/screens/wallet/payment/ui/Payment.tsx b/src/screens/wallet/payment/ui/Payment.tsx index e63a35e..f98c967 100644 --- a/src/screens/wallet/payment/ui/Payment.tsx +++ b/src/screens/wallet/payment/ui/Payment.tsx @@ -1,9 +1,10 @@ import { useNavigation } from '@react-navigation/native'; import { NativeStackNavigationProp } from '@react-navigation/native-stack'; import { PacketsData } from 'api/packets'; +import AppText from 'components/AppText'; import React, { useCallback, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; -import { Text, TouchableOpacity, View } from 'react-native'; +import { TouchableOpacity, View } from 'react-native'; import { PaymentStyle } from './style'; type WalletStackParamList = { @@ -66,39 +67,43 @@ const Payment = ({ packets }: Props) => { - {item.packetName} + {item.packetName} {isPaid ? ( - {t("To'langan")} + {t("To'langan")} ) : ( - {t("To'lanmagan")} + {t("To'lanmagan")} )} - {t('Reys raqami')} - + {t('Reys raqami')} + + {item.packetName} - + - + {t("Mahsulotlar og'irligi")} - - {item.weight} + + {item.weight} - + {t('Mahsulotlar soni')} - - {item.items.length} + + {item.items.length} - {t('Umumiy narxi')} - {item.totalPrice} + + {t('Umumiy narxi')} + + {item.totalPrice} diff --git a/src/screens/wallet/payment/ui/Wallet.tsx b/src/screens/wallet/payment/ui/Wallet.tsx index 5ee3a74..9b4aa1c 100644 --- a/src/screens/wallet/payment/ui/Wallet.tsx +++ b/src/screens/wallet/payment/ui/Wallet.tsx @@ -1,5 +1,6 @@ import { useQuery } from '@tanstack/react-query'; import packetsApi from 'api/packets'; +import AppText from 'components/AppText'; import Layout from 'components/Layout'; import LoadingScreen from 'components/LoadingScreen'; import NoResult from 'components/NoResult'; @@ -10,7 +11,6 @@ import { RefreshControl, ScrollView, StyleSheet, - Text, TouchableOpacity, View, } from 'react-native'; @@ -74,14 +74,17 @@ const Wallet = () => { loadInitialData(); }, []); + useEffect(() => { + setPageAvia(0); + }, [selectedType]); + const onRefresh = useCallback(async () => { try { - setRefreshing(true); await refetch(); + await refetchAvia(); } catch (error) { console.error('Refresh error:', error); } finally { - setRefreshing(false); } }, [refetch]); @@ -126,7 +129,7 @@ const Wallet = () => { > - {t("To'lov")} + {t("To'lov")} { }} onPress={() => setSelectedType('AVIA')} > - AVIA - + { }} onPress={() => setSelectedType('AUTO')} > - { }} > AUTO - + @@ -191,7 +194,7 @@ const Wallet = () => { > - {t("To'lov")} + {t("To'lov")} { }} onPress={() => setSelectedType('AVIA')} > - AVIA - + { }} onPress={() => setSelectedType('AUTO')} > - { }} > AUTO - + @@ -253,7 +256,7 @@ const Wallet = () => { - {t("To'lov")} + {t("To'lov")} { }} onPress={() => setSelectedType('AVIA')} > - AVIA - + { }} onPress={() => setSelectedType('AUTO')} > - { }} > AUTO - + diff --git a/src/screens/wallet/payment/ui/style.ts b/src/screens/wallet/payment/ui/style.ts index a971ac9..0679ca3 100644 --- a/src/screens/wallet/payment/ui/style.ts +++ b/src/screens/wallet/payment/ui/style.ts @@ -23,7 +23,7 @@ export const PaymentStyle = StyleSheet.create({ title: { width: '60%', fontSize: 18, - fontWeight: '600', + fontFamily: 'GolosText-Bold', }, badge: { backgroundColor: '#4CAF50', @@ -141,7 +141,7 @@ export const PaymentStyle = StyleSheet.create({ itemName: { fontSize: 17, - fontWeight: '600', + fontFamily: 'GolosText-Bold', color: '#333', }, @@ -153,6 +153,8 @@ export const PaymentStyle = StyleSheet.create({ track: { fontSize: 15, color: '#666', + textAlign: 'right', + marginTop: 2, }, price: { @@ -163,7 +165,7 @@ export const PaymentStyle = StyleSheet.create({ total: { fontSize: 16, - fontWeight: '600', + fontFamily: 'GolosText-Bold', color: '#1D1D1D', }, diff --git a/src/screens/wallet/paymentMethod/ui/ModalCard.tsx b/src/screens/wallet/paymentMethod/ui/ModalCard.tsx index 64bd418..148c9ed 100644 --- a/src/screens/wallet/paymentMethod/ui/ModalCard.tsx +++ b/src/screens/wallet/paymentMethod/ui/ModalCard.tsx @@ -1,6 +1,7 @@ import { NativeStackNavigationProp } from '@react-navigation/native-stack'; import { useMutation } from '@tanstack/react-query'; import packetsApi from 'api/packets'; +import AppText from 'components/AppText'; import React, { useEffect, useRef, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { @@ -9,7 +10,6 @@ import { Dimensions, Linking, StyleSheet, - Text, TouchableOpacity, TouchableWithoutFeedback, View, @@ -195,7 +195,7 @@ const ModalCard = ({ {load || isPending ? ( ) : ( - {t("To'lash")} - + )} diff --git a/src/screens/wallet/paymentMethod/ui/ModalPay.tsx b/src/screens/wallet/paymentMethod/ui/ModalPay.tsx index 751d107..1704a6a 100644 --- a/src/screens/wallet/paymentMethod/ui/ModalPay.tsx +++ b/src/screens/wallet/paymentMethod/ui/ModalPay.tsx @@ -1,5 +1,6 @@ import { useMutation } from '@tanstack/react-query'; import packetsApi from 'api/packets'; +import AppText from 'components/AppText'; import React, { useEffect, useRef } from 'react'; import { useTranslation } from 'react-i18next'; import { @@ -7,7 +8,6 @@ import { Animated, Dimensions, StyleSheet, - Text, TouchableOpacity, TouchableWithoutFeedback, View, @@ -152,14 +152,14 @@ const ModalPay = ({ width={28} height={28} /> - {t('Bank kartasi')} - + - {t('Naqt pul')} - + ) : ( - {t("To'lash")} - + )} diff --git a/src/screens/wallet/paymentMethod/ui/ModalSuccess.tsx b/src/screens/wallet/paymentMethod/ui/ModalSuccess.tsx index 02d0de6..68f0c6a 100644 --- a/src/screens/wallet/paymentMethod/ui/ModalSuccess.tsx +++ b/src/screens/wallet/paymentMethod/ui/ModalSuccess.tsx @@ -1,12 +1,12 @@ import { useNavigation } from '@react-navigation/native'; import { NativeStackNavigationProp } from '@react-navigation/native-stack'; +import AppText from 'components/AppText'; import LottieView from 'lottie-react-native'; import React, { useEffect, useRef, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { Animated, StyleSheet, - Text, TouchableOpacity, useWindowDimensions, View, @@ -89,11 +89,11 @@ const ModalSuccess = ({ ]} > - + {successMet ? t('To’lov muvaffaqqiyatli o’tdi') : t('Chop etilmoqda')} - + )} - + {successMet ? t('Toʻlovingiz tasdiqlandi!') : t('Iltimos ozroq kutib turing!')} - + {successMet && ( @@ -149,11 +149,11 @@ const ModalSuccess = ({ style={styles.btn} onPress={() => setPayModal(false)} > - {t('Yaxshi')} + {t('Yaxshi')} ) : ( - {t('Yaxshi')} + {t('Yaxshi')} )} diff --git a/src/screens/wallet/paymentMethod/ui/PaymentMethod.tsx b/src/screens/wallet/paymentMethod/ui/PaymentMethod.tsx index c6378ed..d5bf022 100644 --- a/src/screens/wallet/paymentMethod/ui/PaymentMethod.tsx +++ b/src/screens/wallet/paymentMethod/ui/PaymentMethod.tsx @@ -1,8 +1,9 @@ import { RouteProp, useRoute } from '@react-navigation/native'; +import AppText from 'components/AppText'; import LayoutTwo from 'components/LayoutTwo'; import * as React from 'react'; import { useTranslation } from 'react-i18next'; -import { Text, TouchableOpacity } from 'react-native'; +import { TouchableOpacity } from 'react-native'; import { useSafeAreaInsets } from 'react-native-safe-area-context'; import { PaymentStyle } from '../../payment/ui/style'; import ModalCard from './ModalCard'; @@ -74,7 +75,7 @@ const PaymentMethod = () => { style={[PaymentStyle.button, { bottom: bottom + 80 }]} onPress={toggleModal} > - {t("To'lash")} + {t("To'lash")} ); diff --git a/src/screens/wallet/paymentMethod/ui/PaymentProduct.tsx b/src/screens/wallet/paymentMethod/ui/PaymentProduct.tsx index 2c54ae6..19a15fb 100644 --- a/src/screens/wallet/paymentMethod/ui/PaymentProduct.tsx +++ b/src/screens/wallet/paymentMethod/ui/PaymentProduct.tsx @@ -1,8 +1,9 @@ import { useQuery } from '@tanstack/react-query'; import exchanges_api from 'api/exchanges'; +import AppText from 'components/AppText'; import * as React from 'react'; import { useTranslation } from 'react-i18next'; -import { Dimensions, ScrollView, Text, View } from 'react-native'; +import { Dimensions, ScrollView, View } from 'react-native'; import Svg, { Circle, Path } from 'react-native-svg'; import Plane from 'svg/Plane'; import { PaymentStyle } from '../../payment/ui/style'; @@ -61,8 +62,12 @@ const PaymentProduct = ({ packet }: PaymentProductProps) => { > {data && ( <> - {data[0].code} - {data[0].rate} UZS + + {data[0].code} + + + {data[0].rate} UZS + )} @@ -75,8 +80,8 @@ const PaymentProduct = ({ packet }: PaymentProductProps) => { : { flexBasis: '48%', alignItems: 'flex-end' }, ]} > - Cargo - 12.267 UZS/ kg + Cargo + 12.267 UZS/ kg {/* { : { flexBasis: '48%', alignItems: 'flex-start' }, ]} > - {t('Yetkazish vaqti')} - 08.25.2025 + {t('Yetkazish vaqti')} + 08.25.2025 */} { : { flexBasis: '48%', alignItems: 'flex-start' }, ]} > - Reys - + Reys + {packet.packetName} - + { - {item.name} - + {item.name} + {t('Trek ID')}: {item.trackId} - + - + {t('Og’irligi')}: {weight} kg - - + + 1kg * {formattedPrice} {t('so‘m')} - + - + {t('Umumiy narxi')}: {formattedTotal} {t('so‘m')} - + @@ -186,7 +191,9 @@ const PaymentProduct = ({ packet }: PaymentProductProps) => { : { flexBasis: '48%', alignItems: 'flex-start' }, ]} > - {t('Umumiy narxi')} + + {t('Umumiy narxi')} + { : { flexBasis: '48%', alignItems: 'flex-end' }, ]} > - {packet.totalPrice} + + {packet.totalPrice} + diff --git a/src/screens/wallet/successPayment/ui/PaymentQrCode.tsx b/src/screens/wallet/successPayment/ui/PaymentQrCode.tsx index 5d08287..be577c6 100644 --- a/src/screens/wallet/successPayment/ui/PaymentQrCode.tsx +++ b/src/screens/wallet/successPayment/ui/PaymentQrCode.tsx @@ -1,6 +1,7 @@ import { RouteProp, useRoute } from '@react-navigation/native'; import { useQuery } from '@tanstack/react-query'; import exchanges_api from 'api/exchanges'; +import AppText from 'components/AppText'; import LayoutTwo from 'components/LayoutTwo'; import * as React from 'react'; import { useTranslation } from 'react-i18next'; @@ -9,7 +10,6 @@ import { Image, ScrollView, StyleSheet, - Text, TouchableOpacity, View, } from 'react-native'; @@ -92,10 +92,12 @@ const PaymentQrCode = () => { > {data && ( <> - {data[0].code} - + + {data[0].code} + + {data[0].rate} UZS - + )} @@ -108,8 +110,8 @@ const PaymentQrCode = () => { : { flexBasis: '48%', alignItems: 'flex-end' }, ]} > - Cargo - 12.267 UZS/ kg + Cargo + 12.267 UZS/ kg {/* { : { flexBasis: '48%', alignItems: 'flex-start' }, ]} > - + {t('Yetkazish vaqti')} - - {} + + {} */} { : { flexBasis: '48%', alignItems: 'flex-start' }, ]} > - Reys - + Reys + {packets.packetName} - + { - {item.name} - - {t('Trek ID')}: {item.trackId} - + + {item.name} + + {t('Trek ID')}: {item.trekId} + + - + {t('Og’irligi')}: {item.weight} - - 1kg * {item.unitPrice} + + + 1kg * {item.price} + - - {t('Umumiy narxi')}: {item.total} {t('so‘m')} - + + {t('Umumiy narxi')}: {item.totalPrice} {t('so‘m')} + @@ -219,7 +225,9 @@ const PaymentQrCode = () => { : { flexBasis: '48%', alignItems: 'flex-start' }, ]} > - {t('Umumiy narxi')} + + {t('Umumiy narxi')} + { : { flexBasis: '48%', alignItems: 'flex-end' }, ]} > - 100.000.000 + + {packets.totalPrice} + { style={[PaymentStyle.button, { bottom: bottom + 80 }]} onPress={toggleModal} > - {t("To'lash")} + {t("To'lash")} )} diff --git a/src/screens/welcome/FirstStep.tsx b/src/screens/welcome/FirstStep.tsx index 54dce9e..6a0fffc 100644 --- a/src/screens/welcome/FirstStep.tsx +++ b/src/screens/welcome/FirstStep.tsx @@ -1,8 +1,8 @@ +import AppText from 'components/AppText'; import React from 'react'; import { Image, StyleSheet, - Text, TouchableOpacity, View, useWindowDimensions, @@ -69,10 +69,12 @@ const FirstStep = ({ }, ]} > - + {texts[lang].title} - - + {texts[lang].description} - + - + {texts[lang].title} - - + {texts[lang].description} - + - CPOST + + CPOST + - + Tilni tanlang{' '} - + (Выберите язык) - - + + - O'zbek tili + O'zbek tili - Русский язык + Русский язык diff --git a/src/screens/welcome/ThirdStep.tsx b/src/screens/welcome/ThirdStep.tsx index 189d6df..3ae73b6 100644 --- a/src/screens/welcome/ThirdStep.tsx +++ b/src/screens/welcome/ThirdStep.tsx @@ -1,8 +1,8 @@ +import AppText from 'components/AppText'; import React from 'react'; import { Image, StyleSheet, - Text, TouchableOpacity, View, useWindowDimensions, @@ -70,17 +70,19 @@ const ThirdStep = ({ }, ]} > - + {texts[lang].title} - - + {texts[lang].description} - +