From 676b8a38be467a15ae70291a667a45968e45241b Mon Sep 17 00:00:00 2001 From: bagasbanuna Date: Thu, 20 Nov 2025 15:42:37 +0800 Subject: [PATCH 01/21] Fix apple rejected: - app/(application)/(user)/delete-account.tsx - screens/Profile/menuDrawerSection.tsx ### No Issue --- app/(application)/(user)/delete-account.tsx | 34 ++++++++++++++++++--- screens/Profile/menuDrawerSection.tsx | 2 +- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/app/(application)/(user)/delete-account.tsx b/app/(application)/(user)/delete-account.tsx index 9c15def..56623da 100644 --- a/app/(application)/(user)/delete-account.tsx +++ b/app/(application)/(user)/delete-account.tsx @@ -19,6 +19,7 @@ export default function DeleteAccount() { const { token, logout, user } = useAuth(); const { phone } = useLocalSearchParams(); const [text, setText] = useState(""); + const [isLoading, setLoading] = useState(false); const deleteAccount = async () => { if (text !== "Delete Account") { @@ -29,15 +30,38 @@ export default function DeleteAccount() { } AlertDefaultSystem({ - title: "Apakah anda yakin ingin menghapus akun ini?", + title: "Anda yakin akan menghapus akun ini?", message: "Semua data yang pernah anda buat akan terhapus secara permanen !", textLeft: "Batal", textRight: "Ya", onPressRight: async () => { - const response = await apiDeleteUser({ id: user?.id as string }); - console.log("RESPONSE >> ", response); - logout(); + try { + setLoading(true); + const response = await apiDeleteUser({ id: user?.id as string }); + + if (response.success) { + console.log("RESPONSE >> ", response); + Toast.show({ + type: "success", + text1: "Akun berhasil dihapus", + }); + + setTimeout(() => { + logout(); + setLoading(false); + }, 2000); + } else { + Toast.show({ + type: "error", + text1: "Gagal menghapus akun", + }); + setLoading(false); + } + } catch (error) { + console.log("ERROR >> ", error); + setLoading(false); + } }, }); }; @@ -73,6 +97,8 @@ export default function DeleteAccount() { backgroundColor="red" textColor="white" onPress={deleteAccount} + isLoading={isLoading} + disabled={isLoading} > Submit diff --git a/screens/Profile/menuDrawerSection.tsx b/screens/Profile/menuDrawerSection.tsx index ac85368..f16389d 100644 --- a/screens/Profile/menuDrawerSection.tsx +++ b/screens/Profile/menuDrawerSection.tsx @@ -39,7 +39,7 @@ export default function Profile_MenuDrawerSection({ AlertDefaultSystem({ title: "Apakah anda yakin ingin menghapus akun ini?", message: - "Semua data yang pernah anda buat akan terhapus secara permanen!", + "Pilih 'Ya' untuk masuk ke halaman penghapusan akun", textLeft: "Batal", textRight: "Ya", onPressRight: async () => { From 0c4deac6e2022a5d12214d6f8810fcb4ee8e1f87 Mon Sep 17 00:00:00 2001 From: bagasbanuna Date: Fri, 21 Nov 2025 17:43:58 +0800 Subject: [PATCH 02/21] Fix map android : Add: - screens/Maps/ Fix: - android/app/src/main/AndroidManifest.xml - app.config.js - app/(application)/(user)/maps/index.tsx - bun.lock - ios/HIPMIBadungConnect.xcodeproj/project.pbxproj - ios/HIPMIBadungConnect/Info.plist - ios/Podfile.lock - package.json ### No Issue --- android/app/src/main/AndroidManifest.xml | 2 + app.config.js | 4 +- app/(application)/(user)/maps/index.tsx | 225 +---------------- bun.lock | 44 ++++ .../project.pbxproj | 12 +- ios/HIPMIBadungConnect/Info.plist | 2 +- ios/Podfile.lock | 56 ++++- package.json | 2 + screens/Maps/MapsView.tsx | 226 ++++++++++++++++++ screens/Maps/MapsView2.tsx | 28 +++ 10 files changed, 377 insertions(+), 224 deletions(-) create mode 100644 screens/Maps/MapsView.tsx create mode 100644 screens/Maps/MapsView2.tsx diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 2963264..97806ba 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,4 +1,6 @@ + + diff --git a/app.config.js b/app.config.js index 0c6f37e..799b203 100644 --- a/app.config.js +++ b/app.config.js @@ -16,9 +16,10 @@ export default { bundleIdentifier: "com.anonymous.hipmi-mobile", infoPlist: { ITSAppUsesNonExemptEncryption: false, + "NSLocationWhenInUseUsageDescription": "Aplikasi membutuhkan akses lokasi untuk menampilkan peta.", }, associatedDomains: ["applinks:cld-dkr-staging-hipmi.wibudev.com"], - buildNumber: "7", + buildNumber: "8", }, android: { @@ -75,6 +76,7 @@ export default { }, ], "expo-font", + "@rnmapbox/maps", ], experiments: { diff --git a/app/(application)/(user)/maps/index.tsx b/app/(application)/(user)/maps/index.tsx index 90ba6eb..96907e9 100644 --- a/app/(application)/(user)/maps/index.tsx +++ b/app/(application)/(user)/maps/index.tsx @@ -1,32 +1,6 @@ -import { - ButtonCustom, - DrawerCustom, - DummyLandscapeImage, - Grid, - Spacing, - StackCustom, - TextCustom, - ViewWrapper, -} from "@/components"; -import GridTwoView from "@/components/_ShareComponent/GridTwoView"; -import API_IMAGE from "@/constants/api-storage"; -import { ICON_SIZE_SMALL } from "@/constants/constans-value"; -import { apiMapsGetAll } from "@/service/api-client/api-maps"; -import { openInDeviceMaps } from "@/utils/openInDeviceMaps"; -import { FontAwesome, Ionicons } from "@expo/vector-icons"; -import { Image } from "expo-image"; -import { router, useFocusEffect } from "expo-router"; -import { useCallback, useState } from "react"; -import { View } from "react-native"; -import MapView, { Marker } from "react-native-maps"; - -const defaultRegion = { - latitude: -8.737109, - longitude: 115.1756897, - latitudeDelta: 0.1, - longitudeDelta: 0.1, - height: 300, -}; +import MapsView from "@/screens/Maps/MapsView"; +import MapsView2 from "@/screens/Maps/MapsView2"; +import { Text, View } from "react-native"; export interface LocationItem { id: string | number; @@ -37,198 +11,11 @@ export interface LocationItem { } export default function Maps() { - const [list, setList] = useState(null); - const [loadList, setLoadList] = useState(false); - const [openDrawer, setOpenDrawer] = useState(false); - const [selected, setSelected] = useState({ - id: "", - bidangBisnis: "", - nomorTelepon: "", - alamatBisnis: "", - namePin: "", - imageId: "", - portofolioId: "", - latitude: 0, - longitude: 0, - }); - - useFocusEffect( - useCallback(() => { - handlerLoadList(); - }, []) - ); - - const handlerLoadList = async () => { - try { - setLoadList(true); - const response = await apiMapsGetAll(); - - if (response.success) { - setList(response.data); - } - } catch (error) { - console.log("[ERROR]", error); - } finally { - setLoadList(false); - } - }; - return ( <> - - {/* */} - - {loadList ? ( - - ) : ( - - {list?.map((item: any, index: number) => { - return ( - { - setOpenDrawer(true); - setSelected({ - id: item?.id, - bidangBisnis: - item?.Portofolio?.MasterBidangBisnis?.name, - nomorTelepon: item?.Portofolio?.tlpn, - alamatBisnis: item?.Portofolio?.alamatKantor, - namePin: item?.namePin, - imageId: item?.imageId, - portofolioId: item?.Portofolio?.id, - latitude: item?.latitude, - longitude: item?.longitude, - }); - }} - // Gunakan gambar kustom jika tersedia - > - - - - - ); - })} - - )} - - - - setOpenDrawer(false)} - height={"auto"} - > - - - - - } - rightIcon={{selected.namePin}} - /> - - - } - rightIcon={{selected.bidangBisnis}} - /> - - - } - rightIcon={{selected.nomorTelepon}} - /> - - } - rightIcon={{selected.alamatBisnis}} - /> - - - - { - setOpenDrawer(false); - router.push(`/portofolio/${selected.portofolioId}`); - }} - > - Detail - - - - { - openInDeviceMaps({ - latitude: selected.latitude, - longitude: selected.longitude, - title: selected.namePin, - }); - }} - > - Buka Maps - - - - - + + {/* , */} + {/* Map disabled */} ); } diff --git a/bun.lock b/bun.lock index c15cfc7..4419dcc 100644 --- a/bun.lock +++ b/bun.lock @@ -12,6 +12,7 @@ "@react-navigation/elements": "^2.3.8", "@react-navigation/native": "^7.1.6", "@react-navigation/native-stack": "^7.3.10", + "@rnmapbox/maps": "^10.2.7", "@types/lodash": "^4.17.20", "@types/react-native-vector-icons": "^6.4.18", "axios": "^1.11.0", @@ -29,6 +30,7 @@ "expo-image": "~3.0.8", "expo-image-picker": "~17.0.8", "expo-linking": "~8.0.8", + "expo-location": "~19.0.7", "expo-notifications": "^0.32.13", "expo-router": "~6.0.1", "expo-splash-screen": "~31.0.9", @@ -574,6 +576,8 @@ "@react-navigation/routers": ["@react-navigation/routers@7.4.1", "", { "dependencies": { "nanoid": "^3.3.11" } }, "sha512-42mZrMzQ0LfKxUb5OHIurYrPYyRsXFLolucILrvm21f0O40Sw0Ufh1bnn/jRqnxZZu7wvpUGIGYM8nS9zVE1Aw=="], + "@rnmapbox/maps": ["@rnmapbox/maps@10.2.7", "", { "dependencies": { "@turf/along": "6.5.0", "@turf/distance": "6.5.0", "@turf/helpers": "6.5.0", "@turf/length": "6.5.0", "@turf/nearest-point-on-line": "6.5.0", "@types/geojson": "^7946.0.7", "debounce": "^2.2.0" }, "peerDependencies": { "expo": ">=47.0.0", "mapbox-gl": "^2.9.0", "react": ">=17.0.0", "react-dom": ">= 17.0.0", "react-native": ">=0.69" }, "optionalPeers": ["expo", "mapbox-gl", "react-dom"] }, "sha512-CJZuBKz2EiHjpJsyPz0jZOcm0jniDJdkeboeuyrcCIGe53Cw8gCFM6hxWOTJTL04o7idbNxD54jD4BQKxs6b1A=="], + "@rtsao/scc": ["@rtsao/scc@1.1.0", "", {}, "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g=="], "@sinclair/typebox": ["@sinclair/typebox@0.27.8", "", {}, "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA=="], @@ -588,6 +592,30 @@ "@tsconfig/node18": ["@tsconfig/node18@18.2.4", "", {}, "sha512-5xxU8vVs9/FNcvm3gE07fPbn9tl6tqGGWA9tSlwsUEkBxtRnTsNmwrV8gasZ9F/EobaSv9+nu8AxUKccw77JpQ=="], + "@turf/along": ["@turf/along@6.5.0", "", { "dependencies": { "@turf/bearing": "^6.5.0", "@turf/destination": "^6.5.0", "@turf/distance": "^6.5.0", "@turf/helpers": "^6.5.0", "@turf/invariant": "^6.5.0" } }, "sha512-LLyWQ0AARqJCmMcIEAXF4GEu8usmd4Kbz3qk1Oy5HoRNpZX47+i5exQtmIWKdqJ1MMhW26fCTXgpsEs5zgJ5gw=="], + + "@turf/bbox": ["@turf/bbox@7.3.0", "", { "dependencies": { "@turf/helpers": "7.3.0", "@turf/meta": "7.3.0", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-EC5GSUJlhXSiCVCEmgCSheZYm0s1ouKzUNqeEOsEYlqTbMAZ19RWgsg/xH2tjnuUw2JP9eGAUzQnCFX6JEV53w=="], + + "@turf/bearing": ["@turf/bearing@6.5.0", "", { "dependencies": { "@turf/helpers": "^6.5.0", "@turf/invariant": "^6.5.0" } }, "sha512-dxINYhIEMzgDOztyMZc20I7ssYVNEpSv04VbMo5YPQsqa80KO3TFvbuCahMsCAW5z8Tncc8dwBlEFrmRjJG33A=="], + + "@turf/destination": ["@turf/destination@6.5.0", "", { "dependencies": { "@turf/helpers": "^6.5.0", "@turf/invariant": "^6.5.0" } }, "sha512-4cnWQlNC8d1tItOz9B4pmJdWpXqS0vEvv65bI/Pj/genJnsL7evI0/Xw42RvEGROS481MPiU80xzvwxEvhQiMQ=="], + + "@turf/distance": ["@turf/distance@6.5.0", "", { "dependencies": { "@turf/helpers": "^6.5.0", "@turf/invariant": "^6.5.0" } }, "sha512-xzykSLfoURec5qvQJcfifw/1mJa+5UwByZZ5TZ8iaqjGYN0vomhV9aiSLeYdUGtYRESZ+DYC/OzY+4RclZYgMg=="], + + "@turf/helpers": ["@turf/helpers@6.5.0", "", {}, "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw=="], + + "@turf/invariant": ["@turf/invariant@6.5.0", "", { "dependencies": { "@turf/helpers": "^6.5.0" } }, "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg=="], + + "@turf/length": ["@turf/length@6.5.0", "", { "dependencies": { "@turf/distance": "^6.5.0", "@turf/helpers": "^6.5.0", "@turf/meta": "^6.5.0" } }, "sha512-5pL5/pnw52fck3oRsHDcSGrj9HibvtlrZ0QNy2OcW8qBFDNgZ4jtl6U7eATVoyWPKBHszW3dWETW+iLV7UARig=="], + + "@turf/line-intersect": ["@turf/line-intersect@6.5.0", "", { "dependencies": { "@turf/helpers": "^6.5.0", "@turf/invariant": "^6.5.0", "@turf/line-segment": "^6.5.0", "@turf/meta": "^6.5.0", "geojson-rbush": "3.x" } }, "sha512-CS6R1tZvVQD390G9Ea4pmpM6mJGPWoL82jD46y0q1KSor9s6HupMIo1kY4Ny+AEYQl9jd21V3Scz20eldpbTVA=="], + + "@turf/line-segment": ["@turf/line-segment@6.5.0", "", { "dependencies": { "@turf/helpers": "^6.5.0", "@turf/invariant": "^6.5.0", "@turf/meta": "^6.5.0" } }, "sha512-jI625Ho4jSuJESNq66Mmi290ZJ5pPZiQZruPVpmHkUw257Pew0alMmb6YrqYNnLUuiVVONxAAKXUVeeUGtycfw=="], + + "@turf/meta": ["@turf/meta@6.5.0", "", { "dependencies": { "@turf/helpers": "^6.5.0" } }, "sha512-RrArvtsV0vdsCBegoBtOalgdSOfkBrTJ07VkpiCnq/491W67hnMWmDu7e6Ztw0C3WldRYTXkg3SumfdzZxLBHA=="], + + "@turf/nearest-point-on-line": ["@turf/nearest-point-on-line@6.5.0", "", { "dependencies": { "@turf/bearing": "^6.5.0", "@turf/destination": "^6.5.0", "@turf/distance": "^6.5.0", "@turf/helpers": "^6.5.0", "@turf/invariant": "^6.5.0", "@turf/line-intersect": "^6.5.0", "@turf/meta": "^6.5.0" } }, "sha512-WthrvddddvmymnC+Vf7BrkHGbDOUu6Z3/6bFYUGv1kxw8tiZ6n83/VG6kHz4poHOfS0RaNflzXSkmCi64fLBlg=="], + "@tybys/wasm-util": ["@tybys/wasm-util@0.9.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw=="], "@types/babel__core": ["@types/babel__core@7.20.5", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="], @@ -984,6 +1012,8 @@ "dayjs": ["dayjs@1.11.13", "", {}, "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg=="], + "debounce": ["debounce@2.2.0", "", {}, "sha512-Xks6RUDLZFdz8LIdR6q0MTH44k7FikOmnh5xkSjMig6ch45afc8sjTjRQf3P6ax8dMgcQrYO/AR2RGWURrruqw=="], + "debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="], "decamelize": ["decamelize@1.2.0", "", {}, "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA=="], @@ -1198,6 +1228,8 @@ "expo-linking": ["expo-linking@8.0.8", "", { "dependencies": { "expo-constants": "~18.0.8", "invariant": "^2.2.4" }, "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-MyeMcbFDKhXh4sDD1EHwd0uxFQNAc6VCrwBkNvvvufUsTYFq3glTA9Y8a+x78CPpjNqwNAamu74yIaIz7IEJyg=="], + "expo-location": ["expo-location@19.0.7", "", { "peerDependencies": { "expo": "*" } }, "sha512-YNkh4r9E6ECbPkBCAMG5A5yHDgS0pw+Rzyd0l2ZQlCtjkhlODB55nMCKr5CZnUI0mXTkaSm8CwfoCO8n2MpYfg=="], + "expo-manifests": ["expo-manifests@1.0.8", "", { "dependencies": { "@expo/config": "~12.0.8", "expo-json-utils": "~0.15.0" }, "peerDependencies": { "expo": "*" } }, "sha512-nA5PwU2uiUd+2nkDWf9e71AuFAtbrb330g/ecvuu52bmaXtN8J8oiilc9BDvAX0gg2fbtOaZdEdjBYopt1jdlQ=="], "expo-module-scripts": ["expo-module-scripts@4.1.10", "", { "dependencies": { "@babel/cli": "^7.23.4", "@babel/plugin-transform-export-namespace-from": "^7.23.4", "@babel/preset-env": "^7.23.8", "@babel/preset-typescript": "^7.23.3", "@expo/npm-proofread": "^1.0.1", "@testing-library/react-native": "^13.1.0", "@tsconfig/node18": "^18.2.2", "@types/jest": "^29.2.1", "babel-plugin-dynamic-import-node": "^2.3.3", "babel-preset-expo": "~13.2.3", "commander": "^12.1.0", "eslint-config-universe": "^15.0.3", "glob": "^10.4.2", "jest-expo": "~53.0.9", "jest-snapshot-prettier": "npm:prettier@^2", "jest-watch-typeahead": "2.2.1", "resolve-workspace-root": "^2.0.0", "ts-jest": "~29.0.4", "typescript": "^5.8.3" }, "bin": { "expo-module": "bin/expo-module.js" } }, "sha512-fQVXVgxqUOz1cnnNumNLm0eI+Y8IhYNa056ad0vxEhcMui6FjS1+beZNHiaClGwd/NQb5RjlT48ABL3XSGHwxQ=="], @@ -1290,6 +1322,8 @@ "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], + "geojson-rbush": ["geojson-rbush@3.2.0", "", { "dependencies": { "@turf/bbox": "*", "@turf/helpers": "6.x", "@turf/meta": "6.x", "@types/geojson": "7946.0.8", "rbush": "^3.0.1" } }, "sha512-oVltQTXolxvsz1sZnutlSuLDEcQAKYC/uXt9zDzJJ6bu0W+baTI8LZBaTup5afzibEH4N3jlq2p+a152wlBJ7w=="], + "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], @@ -1862,10 +1896,14 @@ "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], + "quickselect": ["quickselect@2.0.0", "", {}, "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw=="], + "randombytes": ["randombytes@2.1.0", "", { "dependencies": { "safe-buffer": "^5.1.0" } }, "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ=="], "range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="], + "rbush": ["rbush@3.0.1", "", { "dependencies": { "quickselect": "^2.0.0" } }, "sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w=="], + "rc": ["rc@1.2.8", "", { "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" }, "bin": "cli.js" }, "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw=="], "react": ["react@19.1.0", "", {}, "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg=="], @@ -2500,6 +2538,10 @@ "@testing-library/react-native/pretty-format": ["pretty-format@30.0.5", "", { "dependencies": { "@jest/schemas": "30.0.5", "ansi-styles": "^5.2.0", "react-is": "^18.3.1" } }, "sha512-D1tKtYvByrBkFLe2wHJl2bwMJIiT8rW+XA+TiataH79/FszLQMrpGEvzUVkzPau7OCO0Qnrhpe87PqtOAIB8Yw=="], + "@turf/bbox/@turf/helpers": ["@turf/helpers@7.3.0", "", { "dependencies": { "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-5kWdgwI6e2vGbkt2qOD+Z2BiKQ7dfKN/PtWRLCpvzyOO59rk19R53CHi8nUT/Y1vQLgWmT6eNpiKwsWwPZGIdg=="], + + "@turf/bbox/@turf/meta": ["@turf/meta@7.3.0", "", { "dependencies": { "@turf/helpers": "7.3.0", "@types/geojson": "^7946.0.10" } }, "sha512-fTLqdQqRm8qA2zHHUbBMY++YT9LDQejLG7OD70XF2dwg9nPiF9mUxO7nrsDp2IY8vNmH9OTAiMtlIjb0ssYccg=="], + "@types/react-native/@types/react": ["@types/react@19.0.14", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-ixLZ7zG7j1fM0DijL9hDArwhwcCb4vqmePgwtV0GfnkHRSCUEv4LvzarcTdhoqgyMznUx/EhoTUv31CKZzkQlw=="], "@types/react-native-vector-icons/@types/react": ["@types/react@19.0.14", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-ixLZ7zG7j1fM0DijL9hDArwhwcCb4vqmePgwtV0GfnkHRSCUEv4LvzarcTdhoqgyMznUx/EhoTUv31CKZzkQlw=="], @@ -2618,6 +2660,8 @@ "finalhandler/statuses": ["statuses@1.5.0", "", {}, "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA=="], + "geojson-rbush/@types/geojson": ["@types/geojson@7946.0.8", "", {}, "sha512-1rkryxURpr6aWP7R786/UQOkJ3PcpQiWkAXBmdWc7ryFWqN6a4xfK7BtjXvFBKO9LjQ+MWQSWxYeZX1OApnArA=="], + "glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], "hoist-non-react-statics/react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="], diff --git a/ios/HIPMIBadungConnect.xcodeproj/project.pbxproj b/ios/HIPMIBadungConnect.xcodeproj/project.pbxproj index 88b92e1..f4b773c 100644 --- a/ios/HIPMIBadungConnect.xcodeproj/project.pbxproj +++ b/ios/HIPMIBadungConnect.xcodeproj/project.pbxproj @@ -272,14 +272,22 @@ ); inputPaths = ( "${PODS_ROOT}/Target Support Files/Pods-HIPMIBadungConnect/Pods-HIPMIBadungConnect-frameworks.sh", + "${BUILT_PRODUCTS_DIR}/MapboxMaps/MapboxMaps.framework", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/MapboxCommon/MapboxCommon.framework/MapboxCommon", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/MapboxCoreMaps/MapboxCoreMaps.framework/MapboxCoreMaps", "${PODS_XCFRAMEWORKS_BUILD_DIR}/React-Core-prebuilt/React.framework/React", "${PODS_XCFRAMEWORKS_BUILD_DIR}/ReactNativeDependencies/ReactNativeDependencies.framework/ReactNativeDependencies", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/Turf/Turf.framework/Turf", "${PODS_XCFRAMEWORKS_BUILD_DIR}/hermes-engine/Pre-built/hermes.framework/hermes", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MapboxMaps.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MapboxCommon.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MapboxCoreMaps.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/React.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ReactNativeDependencies.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Turf.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hermes.framework", ); runOnlyForDeploymentPostprocessing = 0; @@ -414,7 +422,7 @@ ); OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG"; PRODUCT_BUNDLE_IDENTIFIER = "com.anonymous.hipmi-mobile"; - PRODUCT_NAME = "HIPMIBadungConnect"; + PRODUCT_NAME = HIPMIBadungConnect; SWIFT_OBJC_BRIDGING_HEADER = "HIPMIBadungConnect/HIPMIBadungConnect-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; @@ -446,7 +454,7 @@ ); OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = "com.anonymous.hipmi-mobile"; - PRODUCT_NAME = "HIPMIBadungConnect"; + PRODUCT_NAME = HIPMIBadungConnect; SWIFT_OBJC_BRIDGING_HEADER = "HIPMIBadungConnect/HIPMIBadungConnect-Bridging-Header.h"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; diff --git a/ios/HIPMIBadungConnect/Info.plist b/ios/HIPMIBadungConnect/Info.plist index 216ee66..4e8209f 100644 --- a/ios/HIPMIBadungConnect/Info.plist +++ b/ios/HIPMIBadungConnect/Info.plist @@ -39,7 +39,7 @@ CFBundleVersion - 7 + 8 ITSAppUsesNonExemptEncryption LSMinimumSystemVersion diff --git a/ios/Podfile.lock b/ios/Podfile.lock index be278fd..aa9a724 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -241,6 +241,8 @@ PODS: - ExpoModulesCore - ExpoLinking (8.0.8): - ExpoModulesCore + - ExpoLocation (19.0.7): + - ExpoModulesCore - ExpoModulesCore (3.0.15): - hermes-engine - RCTRequired @@ -295,6 +297,14 @@ PODS: - libwebp/sharpyuv (1.5.0) - libwebp/webp (1.5.0): - libwebp/sharpyuv + - MapboxCommon (24.15.4): + - Turf (= 4.0.0) + - MapboxCoreMaps (11.15.4): + - MapboxCommon (= 24.15.4) + - MapboxMaps (11.15.4): + - MapboxCommon (= 24.15.4) + - MapboxCoreMaps (= 11.15.4) + - Turf (= 4.0.0) - RCTDeprecation (0.81.4) - RCTRequired (0.81.4) - RCTTypeSafety (0.81.4): @@ -2150,6 +2160,33 @@ PODS: - ReactCommon/turbomodule/core - ReactNativeDependencies - Yoga + - rnmapbox-maps (10.2.7): + - MapboxMaps (~> 11.15.2) + - React + - React-Core + - rnmapbox-maps/DynamicLibrary (= 10.2.7) + - Turf + - rnmapbox-maps/DynamicLibrary (10.2.7): + - hermes-engine + - MapboxMaps (~> 11.15.2) + - RCTRequired + - RCTTypeSafety + - React + - React-Core + - React-Core-prebuilt + - React-featureflags + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - Turf + - Yoga - RNReanimated (4.1.0): - hermes-engine - RCTRequired @@ -2420,6 +2457,7 @@ PODS: - SDWebImageWebPCoder (0.14.6): - libwebp (~> 1.0) - SDWebImage/Core (~> 5.17) + - Turf (4.0.0) - Yoga (0.0.0) - ZXingObjC/Core (3.6.9) - ZXingObjC/OneD (3.6.9): @@ -2452,6 +2490,7 @@ DEPENDENCIES: - ExpoImagePicker (from `../node_modules/expo-image-picker/ios`) - ExpoKeepAwake (from `../node_modules/expo-keep-awake/ios`) - ExpoLinking (from `../node_modules/expo-linking/ios`) + - ExpoLocation (from `../node_modules/expo-location/ios`) - ExpoModulesCore (from `../node_modules/expo-modules-core`) - ExpoSplashScreen (from `../node_modules/expo-splash-screen/ios`) - ExpoSymbols (from `../node_modules/expo-symbols/ios`) @@ -2533,6 +2572,7 @@ DEPENDENCIES: - "RNCAsyncStorage (from `../node_modules/@react-native-async-storage/async-storage`)" - "RNDateTimePicker (from `../node_modules/@react-native-community/datetimepicker`)" - RNGestureHandler (from `../node_modules/react-native-gesture-handler`) + - "rnmapbox-maps (from `../node_modules/@rnmapbox/maps`)" - RNReanimated (from `../node_modules/react-native-reanimated`) - RNScreens (from `../node_modules/react-native-screens`) - RNSVG (from `../node_modules/react-native-svg`) @@ -2545,10 +2585,14 @@ SPEC REPOS: - libavif - libdav1d - libwebp + - MapboxCommon + - MapboxCoreMaps + - MapboxMaps - SDWebImage - SDWebImageAVIFCoder - SDWebImageSVGCoder - SDWebImageWebPCoder + - Turf - ZXingObjC EXTERNAL SOURCES: @@ -2600,6 +2644,8 @@ EXTERNAL SOURCES: :path: "../node_modules/expo-keep-awake/ios" ExpoLinking: :path: "../node_modules/expo-linking/ios" + ExpoLocation: + :path: "../node_modules/expo-location/ios" ExpoModulesCore: :path: "../node_modules/expo-modules-core" ExpoSplashScreen: @@ -2761,6 +2807,8 @@ EXTERNAL SOURCES: :path: "../node_modules/@react-native-community/datetimepicker" RNGestureHandler: :path: "../node_modules/react-native-gesture-handler" + rnmapbox-maps: + :path: "../node_modules/@rnmapbox/maps" RNReanimated: :path: "../node_modules/react-native-reanimated" RNScreens: @@ -2799,6 +2847,7 @@ SPEC CHECKSUMS: ExpoImagePicker: d251aab45a1b1857e4156fed88511b278b4eee1c ExpoKeepAwake: 1a2e820692e933c94a565ec3fbbe38ac31658ffe ExpoLinking: f051f28e50ea9269ff539317c166adec81d9342d + ExpoLocation: 93d7faa0c2adbd5a04686af0c1a61bc6ed3ee2f7 ExpoModulesCore: 9281d8f1cda9d0c37dbce34c26014212b22eb8c0 ExpoSplashScreen: 0634b705953e6934a5156397162eefc1ee5d6a7c ExpoSymbols: 1ae04ce686de719b9720453b988d8bc5bf776c68 @@ -2810,6 +2859,9 @@ SPEC CHECKSUMS: libavif: 84bbb62fb232c3018d6f1bab79beea87e35de7b7 libdav1d: 23581a4d8ec811ff171ed5e2e05cd27bad64c39f libwebp: 02b23773aedb6ff1fd38cec7a77b81414c6842a8 + MapboxCommon: 975faa94b893bb64a1d28b09d9d6d820e1030a26 + MapboxCoreMaps: 105af9894d850290fbb466e9f9a133f5d175abf1 + MapboxMaps: e97e59d6ba48bb6f695a4c1dc2f174cb24743cd4 RCTDeprecation: 7487d6dda857ccd4cb3dd6ecfccdc3170e85dcbc RCTRequired: 54128b7df8be566881d48c7234724a78cb9b6157 RCTTypeSafety: d2b07797a79e45d7b19e1cd2f53c79ab419fe217 @@ -2882,6 +2934,7 @@ SPEC CHECKSUMS: RNCAsyncStorage: 3a4f5e2777dae1688b781a487923a08569e27fe4 RNDateTimePicker: be0e44bcb9ed0607c7c5f47dbedd88cf091f6791 RNGestureHandler: 2914750df066d89bf9d8f48a10ad5f0051108ac3 + rnmapbox-maps: 3c20ce786a7991498445c32de4fe4244e32aa0ee RNReanimated: 8d3a14606ad49f022c17d9e12a2d339e9e5ad9b0 RNScreens: d8d6f1792f6e7ac12b0190d33d8d390efc0c1845 RNSVG: 31d6639663c249b7d5abc9728dde2041eb2a3c34 @@ -2891,9 +2944,10 @@ SPEC CHECKSUMS: SDWebImageAVIFCoder: 00310d246aab3232ce77f1d8f0076f8c4b021d90 SDWebImageSVGCoder: 15a300a97ec1c8ac958f009c02220ac0402e936c SDWebImageWebPCoder: e38c0a70396191361d60c092933e22c20d5b1380 + Turf: c9eb11a65d96af58cac523460fd40fec5061b081 Yoga: 051f086b5ccf465ff2ed38a2cf5a558ae01aaaa1 ZXingObjC: 8898711ab495761b2dbbdec76d90164a6d7e14c5 -PODFILE CHECKSUM: 08ec3cea5bbb38596b0b014c2569f7bd48b51230 +PODFILE CHECKSUM: 961e5122c387eef49538723a9e3e7a469ca4144f COCOAPODS: 1.16.2 diff --git a/package.json b/package.json index d75d616..4d0106a 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "@react-navigation/elements": "^2.3.8", "@react-navigation/native": "^7.1.6", "@react-navigation/native-stack": "^7.3.10", + "@rnmapbox/maps": "^10.2.7", "@types/lodash": "^4.17.20", "@types/react-native-vector-icons": "^6.4.18", "axios": "^1.11.0", @@ -36,6 +37,7 @@ "expo-image": "~3.0.8", "expo-image-picker": "~17.0.8", "expo-linking": "~8.0.8", + "expo-location": "~19.0.7", "expo-notifications": "^0.32.13", "expo-router": "~6.0.1", "expo-splash-screen": "~31.0.9", diff --git a/screens/Maps/MapsView.tsx b/screens/Maps/MapsView.tsx new file mode 100644 index 0000000..282d30c --- /dev/null +++ b/screens/Maps/MapsView.tsx @@ -0,0 +1,226 @@ +import { + ViewWrapper, + DrawerCustom, + DummyLandscapeImage, + Spacing, + StackCustom, + TextCustom, + Grid, + ButtonCustom, +} from "@/components"; +import GridTwoView from "@/components/_ShareComponent/GridTwoView"; +import API_IMAGE from "@/constants/api-storage"; +import { ICON_SIZE_SMALL } from "@/constants/constans-value"; +import { apiMapsGetAll } from "@/service/api-client/api-maps"; +import { openInDeviceMaps } from "@/utils/openInDeviceMaps"; +import { FontAwesome, Ionicons } from "@expo/vector-icons"; +import { Image } from "expo-image"; +import { useFocusEffect, router } from "expo-router"; +import { useState, useCallback } from "react"; +import { View } from "react-native"; +import MapView, { Marker } from "react-native-maps"; + +const defaultRegion = { + latitude: -8.737109, + longitude: 115.1756897, + latitudeDelta: 0.1, + longitudeDelta: 0.1, + height: 300, +}; + +export default function MapsView() { + const [list, setList] = useState(null); + const [loadList, setLoadList] = useState(false); + const [openDrawer, setOpenDrawer] = useState(false); + const [selected, setSelected] = useState({ + id: "", + bidangBisnis: "", + nomorTelepon: "", + alamatBisnis: "", + namePin: "", + imageId: "", + portofolioId: "", + latitude: 0, + longitude: 0, + }); + + useFocusEffect( + useCallback(() => { + handlerLoadList(); + }, []) + ); + + const handlerLoadList = async () => { + try { + setLoadList(true); + const response = await apiMapsGetAll(); + + if (response.success) { + setList(response.data); + } + } catch (error) { + console.log("[ERROR]", error); + } finally { + setLoadList(false); + } + }; + + return ( + <> + + {/* */} + + {loadList ? ( + + ) : ( + + {list?.map((item: any, index: number) => { + return ( + { + setOpenDrawer(true); + setSelected({ + id: item?.id, + bidangBisnis: + item?.Portofolio?.MasterBidangBisnis?.name, + nomorTelepon: item?.Portofolio?.tlpn, + alamatBisnis: item?.Portofolio?.alamatKantor, + namePin: item?.namePin, + imageId: item?.imageId, + portofolioId: item?.Portofolio?.id, + latitude: item?.latitude, + longitude: item?.longitude, + }); + }} + // Gunakan gambar kustom jika tersedia + > + + + + + ); + })} + + )} + + + + setOpenDrawer(false)} + height={"auto"} + > + + + + + } + rightIcon={{selected.namePin}} + /> + + + } + rightIcon={{selected.bidangBisnis}} + /> + + + } + rightIcon={{selected.nomorTelepon}} + /> + + } + rightIcon={{selected.alamatBisnis}} + /> + + + + { + setOpenDrawer(false); + router.push(`/portofolio/${selected.portofolioId}`); + }} + > + Detail + + + + { + openInDeviceMaps({ + latitude: selected.latitude, + longitude: selected.longitude, + title: selected.namePin, + }); + }} + > + Buka Maps + + + + + + + ); +} diff --git a/screens/Maps/MapsView2.tsx b/screens/Maps/MapsView2.tsx new file mode 100644 index 0000000..3bd9e9a --- /dev/null +++ b/screens/Maps/MapsView2.tsx @@ -0,0 +1,28 @@ +import { TextCustom, ViewWrapper } from "@/components"; +import Mapbox from "@rnmapbox/maps"; +import { View } from "react-native"; + +// Nonaktifkan telemetry (opsional, untuk privasi) +Mapbox.setTelemetryEnabled(false); + +// Gunakan style OSM gratis +const MAP_STYLE_URL = "https://tiles.stadiamaps.com/styles/osm_bright.json"; + +// Atau gunakan MapLibre default: +// const MAP_STYLE_URL = 'https://demotiles.maplibre.org/style.json'; +export default function MapsView2() { + return ( + <> + + + + + + + + + ); +} From 41e648d8f3d4fe7ba29ea421987b818964a61a60 Mon Sep 17 00:00:00 2001 From: bagasbanuna Date: Mon, 24 Nov 2025 17:09:52 +0800 Subject: [PATCH 03/21] Fix rejected Apple : Submission ID: 1efcd8eb-7d68-4348-9925-43a8e1bd7d1e Add: - app/(application)/terms-agreement.tsx Fix: - app/(application)/(user)/home.tsx - app/(application)/_layout.tsx - context/AuthContext.tsx - ios/HIPMIBadungConnect/Info.plist - screens/Authentication/LoginView.tsx - screens/Authentication/RegisterView.tsx - service/api-config.ts - types/User.ts ### NO Issue --- app/(application)/(user)/home.tsx | 21 +++-- app/(application)/_layout.tsx | 1 + app/(application)/terms-agreement.tsx | 115 ++++++++++++++++++++++++ context/AuthContext.tsx | 3 + ios/HIPMIBadungConnect/Info.plist | 13 +-- screens/Authentication/LoginView.tsx | 6 +- screens/Authentication/RegisterView.tsx | 41 ++++++++- service/api-config.ts | 14 ++- types/User.ts | 1 + 9 files changed, 199 insertions(+), 16 deletions(-) create mode 100644 app/(application)/terms-agreement.tsx diff --git a/app/(application)/(user)/home.tsx b/app/(application)/(user)/home.tsx index 75ef4fb..f79038d 100644 --- a/app/(application)/(user)/home.tsx +++ b/app/(application)/(user)/home.tsx @@ -16,25 +16,32 @@ import { useEffect, useState } from "react"; export default function Application() { const { token, user } = useAuth(); - const [data, setData] = useState(); - + useEffect(() => { onLoadData(); checkVersion(); }, []); - + async function onLoadData() { const response = await apiUser(user?.id as string); - console.log("Response profile >>", JSON.stringify(response?.data?.Profile, null, 2)); - + console.log( + "[Profile ID]>>", + JSON.stringify(response?.data?.Profile.id, null, 2) + ); + setData(response.data); } - + const checkVersion = async () => { const response = await apiVersion(); - console.log("Version >>", JSON.stringify(response.data, null, 2)); + console.log("[Version] >>", JSON.stringify(response.data, null, 2)); }; + + if (user && user?.termsOfServiceAccepted === false) { + console.log("User is not accept term service"); + return ; + } if (data && data?.active === false) { console.log("User is not active"); diff --git a/app/(application)/_layout.tsx b/app/(application)/_layout.tsx index 952f811..57e4922 100644 --- a/app/(application)/_layout.tsx +++ b/app/(application)/_layout.tsx @@ -9,6 +9,7 @@ export default function ApplicationLayout() { + {/* Take Picture */} { + try { + setIsLoading(true); + const response = await apiAcceptTermService({ + data: { + id: user?.id as string, + termsOfServiceAccepted: term, + }, + }); + + if (!response.success) { + Toast.show({ + type: "error", + text1: "Gagal", + text2: response.message, + }); + + return; + } + + Toast.show({ + type: "success", + text1: "Anda berhasil menerima syarat & ketentuan", + text2: "Silahkan login kembali", + }); + + setTimeout(() => { + logout(); + }, 2000); + } catch (error) { + console.log("error", error); + } finally { + setIsLoading(false); + } + }; + + const footerComponent = ( + + + Setuju + + + ); + + return ( + <> + + + + + + + setTerm(!term)} /> + + + Saya setuju dengan{" "} + { + const toUrl = `${url}/terms-of-service.html`; + openBrowser(toUrl); + }} + > + Syarat & Ketentuan + {" "} + yang melarang konten tidak pantas dan perilaku merugikan. + + + + + + ); +} diff --git a/context/AuthContext.tsx b/context/AuthContext.tsx index 153e485..2d92e7d 100644 --- a/context/AuthContext.tsx +++ b/context/AuthContext.tsx @@ -24,6 +24,7 @@ type AuthContextType = { registerUser: (userData: { username: string; nomor: string; + termsOfServiceAccepted: boolean; }) => Promise; userData: (token: string) => Promise; }; @@ -154,10 +155,12 @@ export const AuthProvider = ({ children }: { children: React.ReactNode }) => { const registerUser = async (userData: { username: string; nomor: string; + termsOfServiceAccepted: boolean; }) => { setIsLoading(true); try { const response = await apiRegister({ data: userData }); + console.log("response", response); const { token } = response; if (!response.success) { diff --git a/ios/HIPMIBadungConnect/Info.plist b/ios/HIPMIBadungConnect/Info.plist index 4e8209f..dedab2d 100644 --- a/ios/HIPMIBadungConnect/Info.plist +++ b/ios/HIPMIBadungConnect/Info.plist @@ -53,12 +53,15 @@ NSAllowsLocalNetworking - NSCameraUsageDescription - Allow $(PRODUCT_NAME) to access your camera - NSMicrophoneUsageDescription - Allow $(PRODUCT_NAME) to access your microphone + + NSPhotoLibraryUsageDescription - Allow $(PRODUCT_NAME) to access your photos + Untuk mengunggah dokumen dan media bisnis seperti foto profil, logo usaha, poster lowongan, atau bukti transaksi di berbagai fitur aplikasi: Profile, Portofolio, Job Vacancy, Investasi, dan Donasi. + + + NSCameraUsageDescription + Untuk mengambil foto langsung saat mengunggah dokumen bisnis seperti foto profil, logo usaha, poster, atau bukti pembayaran di fitur Profile, Portofolio, Job Vacancy, Investasi, dan Donasi. + NSUserActivityTypes $(PRODUCT_BUNDLE_IDENTIFIER).expo.index_route diff --git a/screens/Authentication/LoginView.tsx b/screens/Authentication/LoginView.tsx index d3f444c..52b628f 100644 --- a/screens/Authentication/LoginView.tsx +++ b/screens/Authentication/LoginView.tsx @@ -102,7 +102,11 @@ export default function LoginView() { } if (token && token !== "" && isAdmin) { - return ; + // Akan di aktifkan jika sudah losos review + // return ; + + // Sementara gunakan ini + return ; } return ( diff --git a/screens/Authentication/RegisterView.tsx b/screens/Authentication/RegisterView.tsx index bba60ee..214a63b 100644 --- a/screens/Authentication/RegisterView.tsx +++ b/screens/Authentication/RegisterView.tsx @@ -1,10 +1,13 @@ +import { CheckboxCustom } from "@/components"; import Spacing from "@/components/_ShareComponent/Spacing"; import ViewWrapper from "@/components/_ShareComponent/ViewWrapper"; import ButtonCustom from "@/components/Button/ButtonCustom"; import TextInputCustom from "@/components/TextInput/TextInputCustom"; import { MainColor } from "@/constants/color-palet"; import { useAuth } from "@/hooks/use-auth"; +import { BASE_URL } from "@/service/api-config"; import { GStyles } from "@/styles/global-styles"; +import { openBrowser } from "@/utils/openBrower"; import { MaterialCommunityIcons } from "@expo/vector-icons"; import { useLocalSearchParams } from "expo-router"; import { useState } from "react"; @@ -14,7 +17,8 @@ import Toast from "react-native-toast-message"; export default function RegisterView() { const { nomor } = useLocalSearchParams(); const [username, setUsername] = useState(""); - + const [term, setTerm] = useState(false); + const url = BASE_URL; const { registerUser, isLoading } = useAuth(); const validasiData = () => { @@ -61,6 +65,7 @@ export default function RegisterView() { await registerUser({ nomor: nomor as string, username: usernameLower, + termsOfServiceAccepted: term, }); } @@ -96,7 +101,39 @@ export default function RegisterView() { } /> - + + setTerm(!term)} /> + + + Saya setuju dengan{" "} + { + const toUrl = `${url}/terms-of-service.html`; + openBrowser(toUrl); + }} + > + Syarat & Ketentuan + {" "} + yang melarang konten tidak pantas dan perilaku merugikan. + + + + Daftar diff --git a/service/api-config.ts b/service/api-config.ts index d185862..ffbc201 100644 --- a/service/api-config.ts +++ b/service/api-config.ts @@ -56,10 +56,22 @@ export async function apiValidationCode({ nomor }: { nomor: string }) { export async function apiRegister({ data, }: { - data: { nomor: string; username: string }; + data: { nomor: string; username: string; termsOfServiceAccepted: boolean }; }) { const response = await apiConfig.post(`/auth/register`, { data: data, }); return response.data; } + +export async function apiAcceptTermService({ + data, +}: { + data: { id: string; termsOfServiceAccepted: boolean }; +}) { + const response = await apiConfig.post(`/auth/term-service`, { + data: data, + }); + return response.data; +} + diff --git a/types/User.ts b/types/User.ts index 46fee52..a6ca6cb 100644 --- a/types/User.ts +++ b/types/User.ts @@ -14,4 +14,5 @@ export interface IUser { updatedAt?: string | null; masterUserRoleId?: string; MasterUserRole?: IMasterUserRole; + termsOfServiceAccepted?: boolean; } From 00eea712482fe731ba202b353ecc348e53a0025f Mon Sep 17 00:00:00 2001 From: bagasbanuna Date: Tue, 25 Nov 2025 11:04:12 +0800 Subject: [PATCH 04/21] Penambahan fitur block user: 50% Fix: - app/(application)/(user)/forum/[id]/index.tsx - app/(application)/(user)/home.tsx - screens/Forum/ListPage.tsx - screens/Forum/MenuDrawerSection.tsx/MenuBeranda.tsx - service/api-client/api-master.ts - service/api-client/api-user.ts ### No Issue --- app/(application)/(user)/forum/[id]/index.tsx | 1 + app/(application)/(user)/home.tsx | 2 + screens/Forum/ListPage.tsx | 17 ++++++- .../MenuDrawerSection.tsx/MenuBeranda.tsx | 50 ++++++++++++++++--- service/api-client/api-master.ts | 14 +++++- service/api-client/api-user.ts | 22 ++++++++ 6 files changed, 98 insertions(+), 8 deletions(-) diff --git a/app/(application)/(user)/forum/[id]/index.tsx b/app/(application)/(user)/forum/[id]/index.tsx index 5882cfa..1759e6d 100644 --- a/app/(application)/(user)/forum/[id]/index.tsx +++ b/app/(application)/(user)/forum/[id]/index.tsx @@ -223,6 +223,7 @@ export default function ForumDetail() { > { setOpenDrawer(false); diff --git a/app/(application)/(user)/home.tsx b/app/(application)/(user)/home.tsx index f79038d..28c45f7 100644 --- a/app/(application)/(user)/home.tsx +++ b/app/(application)/(user)/home.tsx @@ -17,6 +17,8 @@ import { useEffect, useState } from "react"; export default function Application() { const { token, user } = useAuth(); const [data, setData] = useState(); + + console.log("[User] >>", JSON.stringify(user?.id, null, 2)); useEffect(() => { onLoadData(); diff --git a/screens/Forum/ListPage.tsx b/screens/Forum/ListPage.tsx index 004da43..5b03e2d 100644 --- a/screens/Forum/ListPage.tsx +++ b/screens/Forum/ListPage.tsx @@ -22,6 +22,7 @@ const drawerItemsForumBerandaForAuthor = ({ ), label: "Edit posting", path: `/forum/${id}/edit`, + values: "edit" }, { icon: @@ -34,6 +35,7 @@ const drawerItemsForumBerandaForAuthor = ({ label: status === "Open" ? "Tutup forum" : "Buka forum", path: "", color: status === "Open" ? MainColor.orange : MainColor.green, + value: "status" }, { icon: ( @@ -42,10 +44,11 @@ const drawerItemsForumBerandaForAuthor = ({ label: "Hapus", path: "", color: MainColor.red, + value: "delete" }, ]; -const drawerItemsForumBerandaForNonAuthor = ({ id }: { id: string }) => [ +const drawerItemsForumBerandaForNonAuthor = ({ id, username }: { id: string; username: string }) => [ { icon: ( @@ -53,6 +56,16 @@ const drawerItemsForumBerandaForNonAuthor = ({ id }: { id: string }) => [ label: "Laporkan diskusi", // color: MainColor.white, path: `/forum/${id}/report-posting`, + value: "report" + }, + { + icon: ( + + ), + label: `Blockir @${username}`, + color: MainColor.red, + path: `/forum/${id}/report-posting`, + value: "block" }, ]; @@ -64,6 +77,7 @@ const drawerItemsForumComentarForAuthor = ({ id }: { id: string }) => [ label: "Hapus", color: MainColor.red, path: "", + value: "delete" }, ]; @@ -75,5 +89,6 @@ const drawerItemsForumComentarForNonAuthor = ({ id }: { id: string }) => [ label: "Laporkan", // color: MainColor.white, path: `/forum/${id}/report-commentar`, + value: "report" }, ]; diff --git a/screens/Forum/MenuDrawerSection.tsx/MenuBeranda.tsx b/screens/Forum/MenuDrawerSection.tsx/MenuBeranda.tsx index 3b59b58..64cb3b1 100644 --- a/screens/Forum/MenuDrawerSection.tsx/MenuBeranda.tsx +++ b/screens/Forum/MenuDrawerSection.tsx/MenuBeranda.tsx @@ -9,15 +9,18 @@ import { import { useAuth } from "@/hooks/use-auth"; import { apiForumDelete } from "@/service/api-client/api-forum"; import Toast from "react-native-toast-message"; +import { apiForumBlockUser } from "@/service/api-client/api-user"; export default function Forum_MenuDrawerBerandaSection({ id, + authorUsername, status, setIsDrawerOpen, authorId, handlerUpdateStatus, }: { id: string; + authorUsername: string; status: string; setIsDrawerOpen: (value: boolean) => void; authorId: string; @@ -25,7 +28,7 @@ export default function Forum_MenuDrawerBerandaSection({ }) { const { user } = useAuth(); const handlePress = (item: IMenuDrawerItem) => { - if (item.label === "Hapus") { + if (item.value === "delete") { AlertDefaultSystem({ title: "Hapus diskusi", message: "Apakah Anda yakin ingin menghapus diskusi ini?", @@ -34,7 +37,7 @@ export default function Forum_MenuDrawerBerandaSection({ onPressRight: async () => { try { const response = await apiForumDelete({ id }); - + if (response.success) { Toast.show({ type: "success", @@ -52,14 +55,46 @@ export default function Forum_MenuDrawerBerandaSection({ } }, }); - } else if (item.label === "Buka forum" || item.label === "Tutup forum") { + } else if (item.value === "status") { AlertDefaultSystem({ title: "Ubah Status", message: "Apakah Anda yakin ingin mengubah status forum ini?", textLeft: "Batal", textRight: "Ubah", onPressRight: () => { - handlerUpdateStatus?.(item.label === "Buka forum" ? "Open" : "Closed"); + handlerUpdateStatus?.( + item.label === "Buka forum" ? "Open" : "Closed" + ); + }, + }); + } else if (item.value === "block") { + AlertDefaultSystem({ + title: "Blockir user", + message: `Apakah anda yakin ingin blockir user @${authorUsername}?`, + textLeft: "Batal", + textRight: "Blockir", + onPressRight: async () => { + console.log("Blockir"); + const response = await apiForumBlockUser({ + data: { + menuFeature: "Forum", + blockedId: authorId, + blockerId: user?.id || "", + }, + }); + + if (response.success) { + Toast.show({ + type: "success", + text1: "Berhasil blokir", + }); + router.back(); + } else { + Toast.show({ + type: "error", + text1: response.message, + }); + } }, }); } else { @@ -76,9 +111,12 @@ export default function Forum_MenuDrawerBerandaSection({ data={ authorId === user?.id ? drawerItemsForumBerandaForAuthor({ id, status }) - : drawerItemsForumBerandaForNonAuthor({ id }) + : drawerItemsForumBerandaForNonAuthor({ + id, + username: authorUsername, + }) } - columns={4} // Ubah ke 2 jika ingin 2 kolom per baris + columns={authorId === user?.id ? 4 : 2} // Ubah ke 2 jika ingin 2 kolom per baris onPressItem={handlePress as any} /> diff --git a/service/api-client/api-master.ts b/service/api-client/api-master.ts index 69210d7..c3b8689 100644 --- a/service/api-client/api-master.ts +++ b/service/api-client/api-master.ts @@ -1,5 +1,17 @@ import { apiConfig } from "../api-config"; +// ================== START MASTER ================== // +export async function apiMasterAppCategory() { + try { + const response = await apiConfig.get(`/mobile/master/app-category`); + return response.data; + } catch (error) { + throw error; + } +} + +// ================== END MASTER ================== // + // ================== START MASTER PORTFOLIO ================== // export async function apiMasterBidangBisnis() { try { @@ -167,4 +179,4 @@ export async function apiMasterTransaction() { } catch (error) { throw error; } -} \ No newline at end of file +} diff --git a/service/api-client/api-user.ts b/service/api-client/api-user.ts index 0e4d854..8c2a4b9 100644 --- a/service/api-client/api-user.ts +++ b/service/api-client/api-user.ts @@ -14,3 +14,25 @@ export async function apiDeleteUser({id}:{id: string}) { const response = await apiConfig.delete(`/mobile/user/${id}`); return response.data; } + +export async function apiForumBlockUser({ + data, +}: { + data: { + // Id yang di blokir + blockedId: string; + // Id yang melakukan blokir + blockerId: string; + menuFeature: "Event" | "Forum"; + }; +}) { + console.log("[FETCH API]", data); + try { + const response = await apiConfig.post(`/mobile/block-user`, { + data: data, + }); + return response.data; + } catch (error) { + throw error; + } +} From d471682ae7846b5c3a4c640f0ed84c0edb60c6ed Mon Sep 17 00:00:00 2001 From: bagasbanuna Date: Wed, 26 Nov 2025 16:13:05 +0800 Subject: [PATCH 05/21] Refresh control dan Blockir user di forum ### No Issue --- .../(user)/forum/[id]/forumku.tsx | 138 +---------- app/(application)/(user)/forum/index.tsx | 125 +--------- bun.lock | 32 +++ components/_ShareComponent/NewWrapper.tsx | 188 +++++++++++++++ components/_ShareComponent/SkeletonCustom.tsx | 59 +++++ components/_ShareComponent/ViewWrapper.tsx | 4 + package.json | 2 + screens/Forum/ViewBeranda.tsx | 108 +++++++++ screens/Forum/ViewBeranda2.tsx | 215 ++++++++++++++++++ screens/Forum/ViewForumku.tsx | 144 ++++++++++++ screens/Forum/ViewForumku2.tsx | 215 ++++++++++++++++++ screens/Home/homeViewStyle.tsx | 19 ++ screens/Home/topFeatureSection.tsx | 11 +- service/api-client/api-forum.ts | 17 +- 14 files changed, 1015 insertions(+), 262 deletions(-) create mode 100644 components/_ShareComponent/NewWrapper.tsx create mode 100644 components/_ShareComponent/SkeletonCustom.tsx create mode 100644 screens/Forum/ViewBeranda.tsx create mode 100644 screens/Forum/ViewBeranda2.tsx create mode 100644 screens/Forum/ViewForumku.tsx create mode 100644 screens/Forum/ViewForumku2.tsx diff --git a/app/(application)/(user)/forum/[id]/forumku.tsx b/app/(application)/(user)/forum/[id]/forumku.tsx index c51d8ed..d82962f 100644 --- a/app/(application)/(user)/forum/[id]/forumku.tsx +++ b/app/(application)/(user)/forum/[id]/forumku.tsx @@ -1,142 +1,12 @@ /* eslint-disable react-hooks/exhaustive-deps */ -import { - AvatarComp, - ButtonCustom, - CenterCustom, - DrawerCustom, - FloatingButton, - Grid, - LoaderCustom, - StackCustom, - TextCustom, - ViewWrapper, -} from "@/components"; -import { useAuth } from "@/hooks/use-auth"; -import Forum_BoxDetailSection from "@/screens/Forum/DiscussionBoxSection"; -import Forum_MenuDrawerBerandaSection from "@/screens/Forum/MenuDrawerSection.tsx/MenuBeranda"; -import { apiForumGetAll } from "@/service/api-client/api-forum"; -import { apiUser } from "@/service/api-client/api-user"; -import { router, useFocusEffect, useLocalSearchParams } from "expo-router"; -import _ from "lodash"; -import { useCallback, useState } from "react"; +import View_Forumku from "@/screens/Forum/ViewForumku"; +import View_Forumku2 from "@/screens/Forum/ViewForumku2"; export default function Forumku() { - const { id } = useLocalSearchParams(); - const { user } = useAuth(); - const [openDrawer, setOpenDrawer] = useState(false); - const [status, setStatus] = useState(""); - const [listData, setListData] = useState(null); - const [dataUser, setDataUser] = useState(null); - const [loadingGetList, setLoadingGetList] = useState(false); - - useFocusEffect( - useCallback(() => { - onLoadData(); - onLoadDataProfile(id as string); - }, [id]) - ); - - const onLoadDataProfile = async (id: string) => { - try { - const response = await apiUser(id); - - setDataUser(response.data); - } catch (error) { - console.log("[ERROR]", error); - } finally { - } - }; - - const onLoadData = async () => { - try { - setLoadingGetList(true); - const response = await apiForumGetAll({ - search: "", - authorId: id as string, - }); - - setListData(response.data); - } catch (error) { - console.log("[ERROR]", error); - } finally { - setLoadingGetList(false); - } - }; - return ( <> - - router.navigate("/(application)/(user)/forum/create") - } - /> - ) - } - > - - - - - - - - - @{dataUser?.username || "-"} - - {listData?.length || "0"} postingan - - - - Kunjungi Profile - - - - {loadingGetList ? ( - - ) : _.isEmpty(listData) ? ( - Tidak ada diskusi - ) : ( - <> - {listData?.map((item: any, index: number) => ( - { - setOpenDrawer(value.setOpenDrawer); - setStatus(value.setStatus); - }} - /> - ))} - - )} - - - - {/* Drawer Komponen Eksternal */} - setOpenDrawer(false)} - > - { - setOpenDrawer(false); - }} - authorId={id as string} - /> - + {/* */} + ); } diff --git a/app/(application)/(user)/forum/index.tsx b/app/(application)/(user)/forum/index.tsx index e006a53..a4fe51e 100644 --- a/app/(application)/(user)/forum/index.tsx +++ b/app/(application)/(user)/forum/index.tsx @@ -1,129 +1,12 @@ /* eslint-disable react-hooks/exhaustive-deps */ -import { - AvatarComp, - BackButton, - DrawerCustom, - LoaderCustom, - SearchInput, - TextCustom, - ViewWrapper, -} from "@/components"; -import FloatingButton from "@/components/Button/FloatingButton"; -import { useAuth } from "@/hooks/use-auth"; -import Forum_BoxDetailSection from "@/screens/Forum/DiscussionBoxSection"; -import Forum_MenuDrawerBerandaSection from "@/screens/Forum/MenuDrawerSection.tsx/MenuBeranda"; -import { apiForumGetAll } from "@/service/api-client/api-forum"; -import { apiUser } from "@/service/api-client/api-user"; -import { router, Stack, useFocusEffect } from "expo-router"; -import _ from "lodash"; -import { useCallback, useState } from "react"; +import Forum_ViewBeranda from "@/screens/Forum/ViewBeranda"; +import Forum_ViewBeranda2 from "@/screens/Forum/ViewBeranda2"; export default function Forum() { - const [openDrawer, setOpenDrawer] = useState(false); - const [status, setStatus] = useState(""); - const { user } = useAuth(); - const [dataUser, setDataUser] = useState(); - const [listData, setListData] = useState(); - const [loadingGetList, setLoadingGetList] = useState(false); - const [search, setSearch] = useState(""); - const [dataId, setDataId] = useState(""); - const [authorId, setAuthorId] = useState(""); - - useFocusEffect( - useCallback(() => { - onLoadData(); - onLoadDataProfile(user?.id as string); - }, [user?.id, search]) - ); - - const onLoadDataProfile = async (id: string) => { - const response = await apiUser(id); - setDataUser(response.data); - }; - - const onLoadData = async () => { - try { - setLoadingGetList(true); - const response = await apiForumGetAll({ search: search }); - - setListData(response.data); - } catch (error) { - console.log("[ERROR]", error); - } finally { - setLoadingGetList(false); - } - }; - return ( <> - , - headerRight: () => ( - - ), - }} - /> - - setSearch(e)} - /> - } - floatingButton={ - - router.navigate("/(application)/(user)/forum/create") - } - /> - } - > - {loadingGetList ? ( - - ) : _.isEmpty(listData) ? ( - - Tidak ada diskusi - - ) : ( - listData?.map((e: any, i: number) => ( - { - setDataId(e.id); - setOpenDrawer(true); - setStatus(e.ForumMaster_StatusPosting?.status); - setAuthorId(e.Author?.id); - }} - isTruncate={true} - href={`/forum/${e.id}`} - isRightComponent={false} - /> - )) - )} - - - setOpenDrawer(false)} - > - { - setOpenDrawer(false); - }} - /> - + {/* */} + ); } diff --git a/bun.lock b/bun.lock index 4419dcc..ff0b3c3 100644 --- a/bun.lock +++ b/bun.lock @@ -29,6 +29,7 @@ "expo-haptics": "~15.0.7", "expo-image": "~3.0.8", "expo-image-picker": "~17.0.8", + "expo-linear-gradient": "~15.0.7", "expo-linking": "~8.0.8", "expo-location": "~19.0.7", "expo-notifications": "^0.32.13", @@ -39,6 +40,7 @@ "expo-system-ui": "~6.0.7", "expo-web-browser": "~15.0.9", "lodash": "^4.17.21", + "moti": "^0.30.0", "react": "19.1.0", "react-dom": "19.1.0", "react-native": "0.81.4", @@ -340,6 +342,10 @@ "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.0.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA=="], + "@emotion/is-prop-valid": ["@emotion/is-prop-valid@0.8.8", "", { "dependencies": { "@emotion/memoize": "0.7.4" } }, "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA=="], + + "@emotion/memoize": ["@emotion/memoize@0.7.4", "", {}, "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw=="], + "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.7.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw=="], "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.1", "", {}, "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ=="], @@ -478,6 +484,18 @@ "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="], + "@motionone/animation": ["@motionone/animation@10.18.0", "", { "dependencies": { "@motionone/easing": "^10.18.0", "@motionone/types": "^10.17.1", "@motionone/utils": "^10.18.0", "tslib": "^2.3.1" } }, "sha512-9z2p5GFGCm0gBsZbi8rVMOAJCtw1WqBTIPw3ozk06gDvZInBPIsQcHgYogEJ4yuHJ+akuW8g1SEIOpTOvYs8hw=="], + + "@motionone/dom": ["@motionone/dom@10.12.0", "", { "dependencies": { "@motionone/animation": "^10.12.0", "@motionone/generators": "^10.12.0", "@motionone/types": "^10.12.0", "@motionone/utils": "^10.12.0", "hey-listen": "^1.0.8", "tslib": "^2.3.1" } }, "sha512-UdPTtLMAktHiqV0atOczNYyDd/d8Cf5fFsd1tua03PqTwwCe/6lwhLSQ8a7TbnQ5SN0gm44N1slBfj+ORIhrqw=="], + + "@motionone/easing": ["@motionone/easing@10.18.0", "", { "dependencies": { "@motionone/utils": "^10.18.0", "tslib": "^2.3.1" } }, "sha512-VcjByo7XpdLS4o9T8t99JtgxkdMcNWD3yHU/n6CLEz3bkmKDRZyYQ/wmSf6daum8ZXqfUAgFeCZSpJZIMxaCzg=="], + + "@motionone/generators": ["@motionone/generators@10.18.0", "", { "dependencies": { "@motionone/types": "^10.17.1", "@motionone/utils": "^10.18.0", "tslib": "^2.3.1" } }, "sha512-+qfkC2DtkDj4tHPu+AFKVfR/C30O1vYdvsGYaR13W/1cczPrrcjdvYCj0VLFuRMN+lP1xvpNZHCRNM4fBzn1jg=="], + + "@motionone/types": ["@motionone/types@10.17.1", "", {}, "sha512-KaC4kgiODDz8hswCrS0btrVrzyU2CSQKO7Ps90ibBVSQmjkrt2teqta6/sOG59v7+dPnKMAg13jyqtMKV2yJ7A=="], + + "@motionone/utils": ["@motionone/utils@10.18.0", "", { "dependencies": { "@motionone/types": "^10.17.1", "hey-listen": "^1.0.8", "tslib": "^2.3.1" } }, "sha512-3XVF7sgyTSI2KWvTf6uLlBJ5iAgRgmvp3bpuOiQJvInd4nZ19ET8lX5unn30SlmRH7hXbBbH+Gxd0m0klJ3Xtw=="], + "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.11", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@tybys/wasm-util": "^0.9.0" } }, "sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA=="], "@nicolo-ribaudo/chokidar-2": ["@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3", "", {}, "sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ=="], @@ -1226,6 +1244,8 @@ "expo-keep-awake": ["expo-keep-awake@15.0.7", "", { "peerDependencies": { "expo": "*", "react": "*" } }, "sha512-CgBNcWVPnrIVII5G54QDqoE125l+zmqR4HR8q+MQaCfHet+dYpS5vX5zii/RMayzGN4jPgA4XYIQ28ePKFjHoA=="], + "expo-linear-gradient": ["expo-linear-gradient@15.0.7", "", { "peerDependencies": { "expo": "*", "react": "*", "react-native": "*" } }, "sha512-yF+y+9Shpr/OQFfy/wglB/0bykFMbwHBTuMRa5Of/r2P1wbkcacx8rg0JsUWkXH/rn2i2iWdubyqlxSJa3ggZA=="], + "expo-linking": ["expo-linking@8.0.8", "", { "dependencies": { "expo-constants": "~18.0.8", "invariant": "^2.2.4" }, "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-MyeMcbFDKhXh4sDD1EHwd0uxFQNAc6VCrwBkNvvvufUsTYFq3glTA9Y8a+x78CPpjNqwNAamu74yIaIz7IEJyg=="], "expo-location": ["expo-location@19.0.7", "", { "peerDependencies": { "expo": "*" } }, "sha512-YNkh4r9E6ECbPkBCAMG5A5yHDgS0pw+Rzyd0l2ZQlCtjkhlODB55nMCKr5CZnUI0mXTkaSm8CwfoCO8n2MpYfg=="], @@ -1304,6 +1324,10 @@ "form-data": ["form-data@4.0.4", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow=="], + "framer-motion": ["framer-motion@6.5.1", "", { "dependencies": { "@motionone/dom": "10.12.0", "framesync": "6.0.1", "hey-listen": "^1.0.8", "popmotion": "11.0.3", "style-value-types": "5.0.0", "tslib": "^2.1.0" }, "optionalDependencies": { "@emotion/is-prop-valid": "^0.8.2" }, "peerDependencies": { "react": ">=16.8 || ^17.0.0 || ^18.0.0", "react-dom": ">=16.8 || ^17.0.0 || ^18.0.0" } }, "sha512-o1BGqqposwi7cgDrtg0dNONhkmPsUFDaLcKXigzuTFC5x58mE8iyTazxSudFzmT6MEyJKfjjU8ItoMe3W+3fiw=="], + + "framesync": ["framesync@6.0.1", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-fUY88kXvGiIItgNC7wcTOl0SNRCVXMKSWW2Yzfmn7EKNc+MpCzcz9DhdHcdjbrtN3c6R4H5dTY2jiCpPdysEjA=="], + "freeport-async": ["freeport-async@2.0.0", "", {}, "sha512-K7od3Uw45AJg00XUmy15+Hae2hOcgKcmN3/EF6Y7i01O0gaqiRx8sUSpsb9+BRNL8RPBrhzPsVfy8q9ADlJuWQ=="], "fresh": ["fresh@0.5.2", "", {}, "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="], @@ -1380,6 +1404,8 @@ "hermes-parser": ["hermes-parser@0.29.1", "", { "dependencies": { "hermes-estree": "0.29.1" } }, "sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA=="], + "hey-listen": ["hey-listen@1.0.8", "", {}, "sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q=="], + "hoist-non-react-statics": ["hoist-non-react-statics@3.3.2", "", { "dependencies": { "react-is": "^16.7.0" } }, "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw=="], "hosted-git-info": ["hosted-git-info@7.0.2", "", { "dependencies": { "lru-cache": "^10.0.1" } }, "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w=="], @@ -1734,6 +1760,8 @@ "mkdirp": ["mkdirp@3.0.1", "", { "bin": "dist/cjs/src/bin.js" }, "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg=="], + "moti": ["moti@0.30.0", "", { "dependencies": { "framer-motion": "^6.5.1" }, "peerDependencies": { "react-native-reanimated": "*" } }, "sha512-YN78mcefo8kvJaL+TZNyusq6YA2aMFvBPl8WiLPy4eb4wqgOFggJOjP9bUr2YO8PrAt0uusmRG8K4RPL4OhCsA=="], + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], "mz": ["mz@2.7.0", "", { "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", "thenify-all": "^1.0.0" } }, "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q=="], @@ -1850,6 +1878,8 @@ "pngjs": ["pngjs@5.0.0", "", {}, "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw=="], + "popmotion": ["popmotion@11.0.3", "", { "dependencies": { "framesync": "6.0.1", "hey-listen": "^1.0.8", "style-value-types": "5.0.0", "tslib": "^2.1.0" } }, "sha512-Y55FLdj3UxkR7Vl3s7Qr4e9m0onSnP8W7d/xQLsoJM40vs6UKHFdygs6SWryasTZYqugMjm3BepCF4CWXDiHgA=="], + "possible-typed-array-names": ["possible-typed-array-names@1.1.0", "", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="], "postcss": ["postcss@8.4.49", "", { "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA=="], @@ -2162,6 +2192,8 @@ "structured-headers": ["structured-headers@0.4.1", "", {}, "sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg=="], + "style-value-types": ["style-value-types@5.0.0", "", { "dependencies": { "hey-listen": "^1.0.8", "tslib": "^2.1.0" } }, "sha512-08yq36Ikn4kx4YU6RD7jWEv27v4V+PUsOGa4n/as8Et3CuODMJQ00ENeAVXAeydX4Z2j1XHZF1K2sX4mGl18fA=="], + "styleq": ["styleq@0.1.3", "", {}, "sha512-3ZUifmCDCQanjeej1f6kyl/BeP/Vae5EYkQ9iJfUm/QwZvlgnZzyflqAsAWYURdtea8Vkvswu2GrC57h3qffcA=="], "sucrase": ["sucrase@3.35.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", "glob": "^10.3.10", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", "ts-interface-checker": "^0.1.9" }, "bin": { "sucrase": "bin/sucrase", "sucrase-node": "bin/sucrase-node" } }, "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA=="], diff --git a/components/_ShareComponent/NewWrapper.tsx b/components/_ShareComponent/NewWrapper.tsx new file mode 100644 index 0000000..9f0586d --- /dev/null +++ b/components/_ShareComponent/NewWrapper.tsx @@ -0,0 +1,188 @@ +// @/components/NewWrapper.tsx +import { MainColor } from "@/constants/color-palet"; +import { OS_HEIGHT } from "@/constants/constans-value"; +import { GStyles } from "@/styles/global-styles"; +import { + ImageBackground, + Keyboard, + KeyboardAvoidingView, + Platform, + ScrollView, + FlatList, + TouchableWithoutFeedback, + View, + StyleProp, + ViewStyle, +} from "react-native"; +import { + NativeSafeAreaViewProps, + SafeAreaView, +} from "react-native-safe-area-context"; +import type { ScrollViewProps, FlatListProps } from "react-native"; + +// --- ✅ Tambahkan refreshControl ke BaseProps --- +interface BaseProps { + withBackground?: boolean; + headerComponent?: React.ReactNode; + footerComponent?: React.ReactNode; + floatingButton?: React.ReactNode; + hideFooter?: boolean; + edgesFooter?: NativeSafeAreaViewProps["edges"]; + style?: StyleProp; + refreshControl?: ScrollViewProps["refreshControl"]; // ✅ dipakai di kedua mode +} + +interface StaticModeProps extends BaseProps { + children: React.ReactNode; + listData?: never; + renderItem?: never; +} + +interface ListModeProps extends BaseProps { + children?: never; + listData: any[]; + renderItem: FlatListProps["renderItem"]; + onEndReached?: () => void; + // ✅ Gunakan tipe yang kompatibel dengan FlatList + ListHeaderComponent?: React.ReactElement | null; + ListFooterComponent?: React.ReactElement | null; + ListEmptyComponent?: React.ReactElement | null; + keyExtractor?: FlatListProps["keyExtractor"]; +} + +type NewWrapperProps = StaticModeProps | ListModeProps; + +const NewWrapper = (props: NewWrapperProps) => { + const { + withBackground = false, + headerComponent, + footerComponent, + floatingButton, + hideFooter = false, + edgesFooter = [], + style, + refreshControl, // ✅ sekarang ada di BaseProps + } = props; + + const assetBackground = require("../../assets/images/main-background.png"); + + const renderContainer = (content: React.ReactNode) => { + if (withBackground) { + return ( + + + {content} + + + ); + } + return {content}; + }; + + // 🔹 Mode Dinamis + if ("listData" in props) { + const listProps = props as ListModeProps; + + return ( + + {headerComponent && ( + {headerComponent} + )} + + { + if (item.id == null) { + console.warn("Item tanpa 'id':", item); + return `fallback-${JSON.stringify(item)}`; + } + return String(item.id); + }) + } + + refreshControl={refreshControl} // ✅ dari BaseProps + onEndReached={listProps.onEndReached} + onEndReachedThreshold={0.5} + ListHeaderComponent={listProps.ListHeaderComponent} + ListFooterComponent={listProps.ListFooterComponent} + ListEmptyComponent={listProps.ListEmptyComponent} + contentContainerStyle={{ flexGrow: 1 }} + keyboardShouldPersistTaps="handled" + /> + + + {footerComponent ? ( + + {footerComponent} + + ) : hideFooter ? null : ( + + )} + + {floatingButton && ( + {floatingButton} + )} + + ); + } + + // 🔹 Mode Statis + const staticProps = props as StaticModeProps; + + return ( + + {headerComponent && ( + {headerComponent} + )} + + + + {renderContainer(staticProps.children)} + + + + {footerComponent ? ( + + {footerComponent} + + ) : hideFooter ? null : ( + + )} + + {floatingButton && ( + {floatingButton} + )} + + ); +}; + +export default NewWrapper; diff --git a/components/_ShareComponent/SkeletonCustom.tsx b/components/_ShareComponent/SkeletonCustom.tsx new file mode 100644 index 0000000..89b8ee3 --- /dev/null +++ b/components/_ShareComponent/SkeletonCustom.tsx @@ -0,0 +1,59 @@ +// components/CustomSkeleton.tsx +import React from "react"; +import { View, StyleProp, ViewStyle, DimensionValue } from "react-native"; +import { MotiView } from "moti"; +import { AccentColor, MainColor } from "@/constants/color-palet"; + +interface CustomSkeletonProps { + isLoading?: boolean; + style?: StyleProp; + width?: DimensionValue; + height?: DimensionValue; + radius?: number; +} + +const CustomSkeleton: React.FC = ({ + isLoading = true, + style, + width = "100%", + height = 16, + radius = 8, +}) => { + if (!isLoading) return null; + + return ( + + + + ); +}; + +export default CustomSkeleton; diff --git a/components/_ShareComponent/ViewWrapper.tsx b/components/_ShareComponent/ViewWrapper.tsx index afd2d1d..1c189e7 100644 --- a/components/_ShareComponent/ViewWrapper.tsx +++ b/components/_ShareComponent/ViewWrapper.tsx @@ -11,6 +11,7 @@ import { View, StyleProp, ViewStyle, + ScrollViewProps, } from "react-native"; import { NativeSafeAreaViewProps, SafeAreaView } from "react-native-safe-area-context"; @@ -23,6 +24,7 @@ interface ViewWrapperProps { hideFooter?: boolean; edgesFooter?: NativeSafeAreaViewProps["edges"]; style?: StyleProp; + refreshControl?: ScrollViewProps["refreshControl"]; } /** @@ -40,6 +42,7 @@ const ViewWrapper = ({ hideFooter = false, edgesFooter =[], style, + refreshControl, }: ViewWrapperProps) => { const assetBackground = require("../../assets/images/main-background.png"); @@ -57,6 +60,7 @@ const ViewWrapper = ({ diff --git a/package.json b/package.json index 4d0106a..549397c 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "expo-haptics": "~15.0.7", "expo-image": "~3.0.8", "expo-image-picker": "~17.0.8", + "expo-linear-gradient": "~15.0.7", "expo-linking": "~8.0.8", "expo-location": "~19.0.7", "expo-notifications": "^0.32.13", @@ -46,6 +47,7 @@ "expo-system-ui": "~6.0.7", "expo-web-browser": "~15.0.9", "lodash": "^4.17.21", + "moti": "^0.30.0", "react": "19.1.0", "react-dom": "19.1.0", "react-native": "0.81.4", diff --git a/screens/Forum/ViewBeranda.tsx b/screens/Forum/ViewBeranda.tsx new file mode 100644 index 0000000..85bcb36 --- /dev/null +++ b/screens/Forum/ViewBeranda.tsx @@ -0,0 +1,108 @@ +import { + BackButton, + AvatarComp, + ViewWrapper, + SearchInput, + FloatingButton, + LoaderCustom, + TextCustom, +} from "@/components"; +import { useAuth } from "@/hooks/use-auth"; +import { apiForumGetAll } from "@/service/api-client/api-forum"; +import { apiUser } from "@/service/api-client/api-user"; +import { Stack, router } from "expo-router"; +import _ from "lodash"; +import { useState, useEffect } from "react"; +import { RefreshControl } from "react-native"; +import Forum_BoxDetailSection from "./DiscussionBoxSection"; + +export default function Forum_ViewBeranda() { + const { user } = useAuth(); + const [dataUser, setDataUser] = useState(); + const [listData, setListData] = useState(); + const [loadingGetList, setLoadingGetList] = useState(false); + const [search, setSearch] = useState(""); + + useEffect(() => { + onLoadData(); + onLoadDataProfile(user?.id as string); + }, [user?.id, search]); + + const onLoadDataProfile = async (id: string) => { + const response = await apiUser(id); + setDataUser(response.data); + }; + + const onLoadData = async () => { + try { + setLoadingGetList(true); + const response = await apiForumGetAll({ + category: "beranda", + search: search, + userLoginId: user?.id, + }); + + setListData(response.data); + } catch (error) { + console.log("[ERROR]", error); + } finally { + setLoadingGetList(false); + } + }; + + return ( + <> + , + headerRight: () => ( + + ), + }} + /> + + setSearch(e)} + /> + } + floatingButton={ + + router.navigate("/(application)/(user)/forum/create") + } + /> + } + refreshControl={ + + } + > + {loadingGetList ? ( + + ) : _.isEmpty(listData) ? ( + + Tidak ada diskusi + + ) : ( + listData?.map((e: any, i: number) => ( + {}} + isTruncate={true} + href={`/forum/${e.id}`} + isRightComponent={false} + /> + )) + )} + + + ); +} diff --git a/screens/Forum/ViewBeranda2.tsx b/screens/Forum/ViewBeranda2.tsx new file mode 100644 index 0000000..3a76141 --- /dev/null +++ b/screens/Forum/ViewBeranda2.tsx @@ -0,0 +1,215 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import { + AvatarComp, + BackButton, + FloatingButton, + LoaderCustom, + SearchInput, + StackCustom, + TextCustom, // ← gunakan NewWrapper yang sudah diperbaiki +} from "@/components"; +import SkeletonCustom from "@/components/_ShareComponent/SkeletonCustom"; +import NewWrapper from "@/components/_ShareComponent/NewWrapper"; +import { useAuth } from "@/hooks/use-auth"; +import Forum_BoxDetailSection from "@/screens/Forum/DiscussionBoxSection"; +import { apiForumGetAll } from "@/service/api-client/api-forum"; +import { apiUser } from "@/service/api-client/api-user"; +import { router, Stack } from "expo-router"; +import _ from "lodash"; +import { useCallback, useEffect, useState } from "react"; +import { RefreshControl, View } from "react-native"; +import { MainColor } from "@/constants/color-palet"; + +// Sesuai dengan `takeData = 5` di API-mu +const PAGE_SIZE = 5; + +export default function Forum_ViewBeranda2() { + const { user } = useAuth(); + const [dataUser, setDataUser] = useState(null); + const [listData, setListData] = useState([]); + const [loading, setLoading] = useState(false); + const [refreshing, setRefreshing] = useState(false); + const [hasMore, setHasMore] = useState(true); + const [page, setPage] = useState(1); + const [search, setSearch] = useState(""); + + // 🔹 Load data profil user sekali + useEffect(() => { + if (user?.id) { + apiUser(user.id).then((res) => setDataUser(res.data)); + } + }, [user?.id]); + + // 🔹 Reset dan muat ulang saat search atau user berubah + useEffect(() => { + setPage(1); + setListData([]); + setHasMore(true); + fetchData(1, true); + }, [search, user?.id]); + + // 🔹 Fungsi fetch data + const fetchData = async (pageNumber: number, clear: boolean) => { + if (!user?.id) return; + + // Cegah multiple call + if (!clear && (loading || refreshing)) return; + + const isRefresh = clear; + if (isRefresh) setRefreshing(true); + if (!isRefresh) setLoading(true); + + try { + const response = await apiForumGetAll({ + category: "beranda", + search: search || "", + userLoginId: user.id, + page: String(pageNumber), // API terima string + }); + + const newData = response.data || []; + setListData((prev) => { + const current = Array.isArray(prev) ? prev : []; + return clear ? newData : [...current, ...newData]; + }); + setHasMore(newData.length === PAGE_SIZE); + setPage(pageNumber); + } catch (error) { + console.error("[ERROR] Fetch forum:", error); + setHasMore(false); + } finally { + setRefreshing(false); + setLoading(false); + } + }; + + // 🔹 Pull-to-refresh + const onRefresh = useCallback(() => { + fetchData(1, true); + }, [search, user?.id]); + + // 🔹 Infinite scroll + const loadMore = useCallback(() => { + if (hasMore && !loading && !refreshing) { + fetchData(page + 1, false); + } + }, [hasMore, loading, refreshing, page, search, user?.id]); + + // 🔹 Render item forum + const renderForumItem = ({ item }: { item: any }) => ( + {}} + isTruncate={true} + href={`/forum/${item.id}`} + isRightComponent={false} + /> + ); + + // 🔹 Komponen Header List (di dalam FlatList) + const ListHeaderComponent = ( + + Diskusi Terbaru + + ); + + // 🔹 Komponen Footer List (loading indicator) + const ListFooterComponent = + loading && !refreshing && listData.length > 0 ? ( + + {/* Memuat diskusi... */} + + + ) : null; + + // Skeleton List (untuk initial load) + const SkeletonListComponent = () => ( + + + {Array.from({ length: 5 }).map((_, i) => ( + + ))} + + + ); + + // Komponen Empty + const EmptyComponent = () => ( + + + {search ? "Tidak ada hasil pencarian" : "Tidak ada diskusi"} + + + ); + + return ( + <> + {/* 🔹 Header Navigation */} + , + headerRight: () => ( + + ), + }} + /> + + {/* 🔹 NewWrapper dalam mode list */} + + setSearch(text), 500)} + // value={search} + /> + + } + // Floating action button + floatingButton={ + + router.navigate("/(application)/(user)/forum/create") + } + /> + } + // --- Mode List Props --- + listData={listData} + renderItem={renderForumItem} + refreshControl={ + + } + onEndReached={loadMore} + // ListHeaderComponent={ListHeaderComponent} + ListFooterComponent={ListFooterComponent} + ListEmptyComponent={ + _.isEmpty(listData) ? : + } + // ------------------------ + /> + + ); +} diff --git a/screens/Forum/ViewForumku.tsx b/screens/Forum/ViewForumku.tsx new file mode 100644 index 0000000..db35228 --- /dev/null +++ b/screens/Forum/ViewForumku.tsx @@ -0,0 +1,144 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import { + AvatarComp, + ButtonCustom, + CenterCustom, + DrawerCustom, + FloatingButton, + Grid, + LoaderCustom, + StackCustom, + TextCustom, + ViewWrapper, +} from "@/components"; +import { useAuth } from "@/hooks/use-auth"; +import Forum_BoxDetailSection from "@/screens/Forum/DiscussionBoxSection"; +import Forum_MenuDrawerBerandaSection from "@/screens/Forum/MenuDrawerSection.tsx/MenuBeranda"; +import { apiForumGetAll } from "@/service/api-client/api-forum"; +import { apiUser } from "@/service/api-client/api-user"; +import { router, useFocusEffect, useLocalSearchParams } from "expo-router"; +import _ from "lodash"; +import { useCallback, useState } from "react"; + +export default function View_Forumku() { + const { id } = useLocalSearchParams(); + const { user } = useAuth(); + const [openDrawer, setOpenDrawer] = useState(false); + const [status, setStatus] = useState(""); + const [listData, setListData] = useState(null); + const [dataUser, setDataUser] = useState(null); + const [loadingGetList, setLoadingGetList] = useState(false); + + useFocusEffect( + useCallback(() => { + onLoadData(); + onLoadDataProfile(id as string); + }, [id]) + ); + + const onLoadDataProfile = async (id: string) => { + try { + const response = await apiUser(id); + + setDataUser(response.data); + } catch (error) { + console.log("[ERROR]", error); + } finally { + } + }; + + const onLoadData = async () => { + try { + setLoadingGetList(true); + const response = await apiForumGetAll({ + search: "", + authorId: id as string, + category: "forumku", + }); + + setListData(response.data); + } catch (error) { + console.log("[ERROR]", error); + } finally { + setLoadingGetList(false); + } + }; + + return ( + <> + + router.navigate("/(application)/(user)/forum/create") + } + /> + ) + } + > + + + + + + + + + @{dataUser?.username || "-"} + + {listData?.length || "0"} postingan + + + + Kunjungi Profile + + + + {loadingGetList ? ( + + ) : _.isEmpty(listData) ? ( + Tidak ada diskusi + ) : ( + <> + {listData?.map((item: any, index: number) => ( + { + setOpenDrawer(value.setOpenDrawer); + setStatus(value.setStatus); + }} + /> + ))} + + )} + + + + {/* Drawer Komponen Eksternal */} + setOpenDrawer(false)} + > + { + setOpenDrawer(false); + }} + authorId={id as string} + authorUsername={dataUser?.username} + /> + + + ); +} diff --git a/screens/Forum/ViewForumku2.tsx b/screens/Forum/ViewForumku2.tsx new file mode 100644 index 0000000..5c758e2 --- /dev/null +++ b/screens/Forum/ViewForumku2.tsx @@ -0,0 +1,215 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import { + AvatarComp, + ButtonCustom, + CenterCustom, + FloatingButton, + Grid, + LoaderCustom, + Spacing, + StackCustom, + TextCustom, +} from "@/components"; +import NewWrapper from "@/components/_ShareComponent/NewWrapper"; +import NoDataText from "@/components/_ShareComponent/NoDataText"; +import CustomSkeleton from "@/components/_ShareComponent/SkeletonCustom"; +import { MainColor } from "@/constants/color-palet"; +import { useAuth } from "@/hooks/use-auth"; +import Forum_BoxDetailSection from "@/screens/Forum/DiscussionBoxSection"; +import { apiForumGetAll } from "@/service/api-client/api-forum"; +import { apiUser } from "@/service/api-client/api-user"; +import { router, useLocalSearchParams } from "expo-router"; +import _ from "lodash"; +import { useCallback, useEffect, useState } from "react"; +import { RefreshControl, View } from "react-native"; + +const PAGE_SIZE = 5; + +export default function View_Forumku2() { + const { id } = useLocalSearchParams(); + const { user } = useAuth(); + const [listData, setListData] = useState([]); + const [dataUser, setDataUser] = useState(null); + const [loading, setLoading] = useState(false); + const [refreshing, setRefreshing] = useState(false); + const [hasMore, setHasMore] = useState(true); + const [page, setPage] = useState(1); + const [count, setCount] = useState(0); + + useEffect(() => { + onLoadDataProfile(id as string); + }, [id]); + + useEffect(() => { + setPage(1); + setListData([]); + setHasMore(true); + fetchData(1, true); + }, [user?.id]); + + const onLoadDataProfile = async (id: string) => { + try { + const response = await apiUser(id); + + setDataUser(response.data); + } catch (error) { + console.log("[ERROR]", error); + } finally { + } + }; + + // 🔹 Fungsi fetch data + const fetchData = async (pageNumber: number, clear: boolean) => { + if (!user?.id) return; + + // Cegah multiple call + if (!clear && (loading || refreshing)) return; + + const isRefresh = clear; + if (isRefresh) setRefreshing(true); + if (!isRefresh) setLoading(true); + + try { + const response = await apiForumGetAll({ + category: "forumku", + authorId: id as string, + userLoginId: user.id, + page: String(pageNumber), // API terima string + }); + + const newData = response.data.data || []; + setListData((prev) => { + const current = Array.isArray(prev) ? prev : []; + return clear ? newData : [...current, ...newData]; + }); + setHasMore(newData.length === PAGE_SIZE); + setPage(pageNumber); + setCount(response.data.count); + } catch (error) { + console.error("[ERROR] Fetch forum:", error); + setHasMore(false); + } finally { + setRefreshing(false); + setLoading(false); + } + }; + + // 🔹 Pull-to-refresh + const onRefresh = useCallback(() => { + fetchData(1, true); + }, [user?.id]); + + // 🔹 Infinite scroll + const loadMore = useCallback(() => { + if (hasMore && !loading && !refreshing) { + fetchData(page + 1, false); + } + }, [hasMore, loading, refreshing, page, user?.id]); + + const randerHeaderComponent = () => ( + <> + + + + + + + + @{dataUser?.username || "-"} + + {count || "0"} postingan + + + + Kunjungi Profile + + + + + + ); + + const renderList = ({ item }: { item: any }) => ( + {}} + isTruncate={true} + href={`/forum/${item.id}`} + isRightComponent={false} + /> + ); + + // Skeleton List (untuk initial load) + const SkeletonListComponent = () => ( + + + {Array.from({ length: 5 }).map((_, i) => ( + + ))} + + + ); + + // Komponen Empty + const EmptyComponent = () => ( + + + + ); + + // 🔹 Komponen Footer List (loading indicator) + const ListFooterComponent = + loading && !refreshing && listData.length > 0 ? ( + + {/* Memuat diskusi... */} + + + ) : null; + + return ( + <> + + router.navigate("/(application)/(user)/forum/create") + } + /> + ) + } + listData={listData} + renderItem={renderList} + refreshControl={ + + } + onEndReached={loadMore} + ListHeaderComponent={randerHeaderComponent()} + ListFooterComponent={ListFooterComponent} + ListEmptyComponent={ + _.isEmpty(listData) ? : + } + /> + + ); +} diff --git a/screens/Home/homeViewStyle.tsx b/screens/Home/homeViewStyle.tsx index 9732a74..dac67ff 100644 --- a/screens/Home/homeViewStyle.tsx +++ b/screens/Home/homeViewStyle.tsx @@ -59,11 +59,30 @@ export const stylesHome = StyleSheet.create({ borderWidth: 2, borderColor: AccentColor.blue, }, + gridItemInactive: { + width: "46%", + height: "100%", + aspectRatio: 1, + backgroundColor: MainColor.darkblue, + borderRadius: 8, + padding: 16, + alignItems: "center", + justifyContent: "center", + marginVertical: 8, + borderWidth: 2, + borderColor: AccentColor.blue, + opacity: 0.7, + }, gridLabel: { marginTop: 8, color: "white", fontWeight: "bold", }, + gridLabelInactive: { + marginTop: 8, + color: "gray", + fontWeight: "bold", + }, jobVacancyContainer: { backgroundColor: MainColor.darkblue, borderRadius: 8, diff --git a/screens/Home/topFeatureSection.tsx b/screens/Home/topFeatureSection.tsx index 8d265b0..8befc82 100644 --- a/screens/Home/topFeatureSection.tsx +++ b/screens/Home/topFeatureSection.tsx @@ -9,21 +9,25 @@ export default function Home_FeatureSection() { name: "Event", icon: , onPress: () => router.push("/(application)/(user)/event/(tabs)"), + status: "active", }, { name: "Collaboration", - icon: , + icon: , onPress: () => router.push("/(application)/(user)/collaboration/(tabs)"), + status: "inactive", }, { name: "Voting", icon: , onPress: () => router.push("/(application)/(user)/voting/(tabs)"), + status: "active", }, { name: "Crowdfunding", icon: , onPress: () => router.push("/(application)/(user)/crowdfunding"), + status: "active", }, ]; @@ -33,11 +37,12 @@ export default function Home_FeatureSection() { {listFeature.map((item, index) => ( {item.icon} - {item.name} + {item.name} ))} diff --git a/service/api-client/api-forum.ts b/service/api-client/api-forum.ts index fc1eb9c..9e3c4e3 100644 --- a/service/api-client/api-forum.ts +++ b/service/api-client/api-forum.ts @@ -14,13 +14,22 @@ export async function apiForumCreate({ data }: { data: any }) { export async function apiForumGetAll({ search, authorId, + userLoginId, + category, + page, }: { - search: string; + search?: string; authorId?: string; + userLoginId?: string; + category: "beranda" | "forumku"; + page?: string; }) { - const authorQuery = authorId ? `?authorId=${authorId}` : ""; - const searchQuery = search ? `?search=${search}` : ""; - const query = search ? searchQuery : authorQuery; + const categoryQuery = `?category=${category}`; + const authorQuery = authorId ? `&authorId=${authorId}` : ""; + const userLoginQuery = userLoginId ? `&userLoginId=${userLoginId}` : ""; + const searchQuery = search ? `&search=${search}` : ""; + const pageQuery = page ? `&page=${page}` : ""; + const query = `${categoryQuery}${authorQuery}${userLoginQuery}${searchQuery}${pageQuery}`; try { const response = await apiConfig.get(`/mobile/forum${query}`); From 8a900e9469ef9e9125b2b5a4ff4196fd3914ce76 Mon Sep 17 00:00:00 2001 From: bagasbanuna Date: Fri, 28 Nov 2025 13:55:48 +0800 Subject: [PATCH 06/21] Halaman unblock user Add: - app/(application)/(user)/profile/[id]/blocked-list.tsx app/(application)/(user)/profile/[id]/detail-blocked.tsx components/_ShareComponent/ListEmptyComponent.tsx components/_ShareComponent/ListLoaderFooterComponent.tsx components/_ShareComponent/ListSkeletonComponent.tsx hooks/use-paginated-api.ts service/api-client/api-blocked.ts Fix: modified: app/(application)/(user)/profile/_layout.tsx modified: components/_ShareComponent/NewWrapper.tsx modified: components/index.ts modified: screens/Profile/ListPage.tsx modified: styles/global-styles.ts ### No Issue --- .../(user)/profile/[id]/blocked-list.tsx | 148 ++++++++++++++++++ .../(user)/profile/[id]/detail-blocked.tsx | 93 +++++++++++ app/(application)/(user)/profile/_layout.tsx | 10 ++ .../_ShareComponent/ListEmptyComponent.tsx | 20 +++ .../ListLoaderFooterComponent.tsx | 11 ++ .../_ShareComponent/ListSkeletonComponent.tsx | 21 +++ components/_ShareComponent/NewWrapper.tsx | 4 +- components/index.ts | 2 + hooks/use-paginated-api.ts | 97 ++++++++++++ screens/Profile/ListPage.tsx | 24 +++ service/api-client/api-blocked.ts | 45 ++++++ styles/global-styles.ts | 2 +- 12 files changed, 474 insertions(+), 3 deletions(-) create mode 100644 app/(application)/(user)/profile/[id]/blocked-list.tsx create mode 100644 app/(application)/(user)/profile/[id]/detail-blocked.tsx create mode 100644 components/_ShareComponent/ListEmptyComponent.tsx create mode 100644 components/_ShareComponent/ListLoaderFooterComponent.tsx create mode 100644 components/_ShareComponent/ListSkeletonComponent.tsx create mode 100644 hooks/use-paginated-api.ts create mode 100644 service/api-client/api-blocked.ts diff --git a/app/(application)/(user)/profile/[id]/blocked-list.tsx b/app/(application)/(user)/profile/[id]/blocked-list.tsx new file mode 100644 index 0000000..2582ebd --- /dev/null +++ b/app/(application)/(user)/profile/[id]/blocked-list.tsx @@ -0,0 +1,148 @@ +import { + AvatarUsernameAndOtherComponent, + BadgeCustom, + ClickableCustom, + Divider, + SelectCustom, + TextCustom, +} from "@/components"; +import ListEmptyComponent from "@/components/_ShareComponent/ListEmptyComponent"; +import ListLoaderFooterComponent from "@/components/_ShareComponent/ListLoaderFooterComponent"; +import ListSkeletonComponent from "@/components/_ShareComponent/ListSkeletonComponent"; +import NewWrapper from "@/components/_ShareComponent/NewWrapper"; +import { MainColor } from "@/constants/color-palet"; +import { useAuth } from "@/hooks/use-auth"; +import { usePaginatedApi } from "@/hooks/use-paginated-api"; +import { apiGetBlocked } from "@/service/api-client/api-blocked"; +import { apiMasterAppCategory } from "@/service/api-client/api-master"; +import { router, useFocusEffect } from "expo-router"; +import _ from "lodash"; +import { useCallback, useEffect, useRef, useState } from "react"; +import { RefreshControl, View } from "react-native"; + +const PAGE_SIZE = 10; +export default function ProfileBlockedList() { + const { user } = useAuth(); + const [masterApp, setMasterApp] = useState([]); + const isInitialMount = useRef(true); + + const { + data: listData, + loading, + refreshing, + hasMore, + search, + setSearch, + onRefresh, + loadMore, + } = usePaginatedApi({ + fetcher: async (params: { page: number; search?: string }) => { + const response = await apiGetBlocked({ + id: user?.id as any, + search: search, + page: String(params.page) as any, + }); + + return response.data; + }, + initialSearch: "", + pageSize: PAGE_SIZE, + dependencies: [user?.id], + }); + + useEffect(() => { + fetchMasterApp(); + }, []); + + // 🔁 Refresh otomatis saat kembali ke halaman ini + useFocusEffect( + useCallback(() => { + if (isInitialMount.current) { + // Skip saat pertama kali mount + isInitialMount.current = false; + return; + } + // Hanya refresh saat kembali dari screen lain + onRefresh(); + }, [onRefresh]) + ); + + const fetchMasterApp = async () => { + const response = await apiMasterAppCategory(); + setMasterApp(response.data); + }; + + const renderHeader = () => ( + ({ + label: item.name, + value: item.id, + }))} + value={search === "" ? undefined : search} + onChange={(value) => { + setSearch(value as any); + }} + /> + ); + + const renderItem = ({ item }: { item: any }) => ( + <> + { + router.push(`/profile/${item.id}/detail-blocked`); + }} + > + + + + + {item?.menuFeature?.name} + + + + } + /> + + + + + ); + + return ( + <> + + } + ListFooterComponent={ + hasMore && !refreshing ? : null + } + ListEmptyComponent={ + !loading && _.isEmpty(listData) ? ( + + ) : ( + + ) + } + /> + + ); +} diff --git a/app/(application)/(user)/profile/[id]/detail-blocked.tsx b/app/(application)/(user)/profile/[id]/detail-blocked.tsx new file mode 100644 index 0000000..920cb25 --- /dev/null +++ b/app/(application)/(user)/profile/[id]/detail-blocked.tsx @@ -0,0 +1,93 @@ +import { + AlertDefaultSystem, + AvatarUsernameAndOtherComponent, + BaseBox, + BoxButtonOnFooter, + BoxWithHeaderSection, + ButtonCustom, + NewWrapper, + StackCustom, + TextCustom, +} from "@/components"; +import AvatarAndBackground from "@/screens/Profile/AvatarAndBackground"; +import { + apiGetBlockedById, + apiUnblock, +} from "@/service/api-client/api-blocked"; +import { router, useLocalSearchParams } from "expo-router"; +import _ from "lodash"; +import { useEffect, useState } from "react"; + +export default function ProfileDetailBlocked() { + const { id } = useLocalSearchParams(); + const [data, setData] = useState(null); + const [isLoading, setIsLoading] = useState(false); + + useEffect(() => { + fetchData(); + }, [id]); + + const fetchData = async () => { + const response = await apiGetBlockedById({ id: String(id) }); + // console.log("[RESPONSE >>]", JSON.stringify(response, null, 2)); + setData(response.data); + }; + + const handleSubmit = async () => { + try { + setIsLoading(true); + await apiUnblock({ id: String(id) }); + router.back(); + } catch (error) { + console.log("[ERROR >>]", JSON.stringify(error, null, 2)); + } finally { + setIsLoading(false); + } + }; + + return ( + <> + + { + AlertDefaultSystem({ + title: "Buka Blokir", + message: "Apakah anda yakin ingin membuka blokir ini?", + textLeft: "Tidak", + textRight: "Ya", + onPressRight: () => { + handleSubmit(); + }, + }); + }} + > + Buka Blokir + + + } + > + + + + + + Jika anda membuka blokir ini maka semua postingan terkait user ini + akan muncul kembali di beranda + + {" "} + {_.upperCase(data?.menuFeature?.name)} + + + + + + + ); +} diff --git a/app/(application)/(user)/profile/_layout.tsx b/app/(application)/(user)/profile/_layout.tsx index 5e5b856..d9e8701 100644 --- a/app/(application)/(user)/profile/_layout.tsx +++ b/app/(application)/(user)/profile/_layout.tsx @@ -33,6 +33,16 @@ export default function ProfileLayout() { name="create" options={{ title: "Buat Profile", headerBackVisible: false }} /> + + }} + /> + + }} + /> ); diff --git a/components/_ShareComponent/ListEmptyComponent.tsx b/components/_ShareComponent/ListEmptyComponent.tsx new file mode 100644 index 0000000..5e35bc1 --- /dev/null +++ b/components/_ShareComponent/ListEmptyComponent.tsx @@ -0,0 +1,20 @@ +import { View } from "react-native"; +import TextCustom from "../Text/TextCustom"; + +// Komponen Empty +const ListEmptyComponent = ({ search }: { search?: string }) => ( + + + {search ? "Tidak ada hasil pencarian" : "Tidak ada data"} + + +); + +export default ListEmptyComponent; diff --git a/components/_ShareComponent/ListLoaderFooterComponent.tsx b/components/_ShareComponent/ListLoaderFooterComponent.tsx new file mode 100644 index 0000000..dbc2619 --- /dev/null +++ b/components/_ShareComponent/ListLoaderFooterComponent.tsx @@ -0,0 +1,11 @@ +import { View } from "react-native"; +import LoaderCustom from "../Loader/LoaderCustom"; + +const ListLoaderFooterComponent = () =>( + + + +) + + +export default ListLoaderFooterComponent; diff --git a/components/_ShareComponent/ListSkeletonComponent.tsx b/components/_ShareComponent/ListSkeletonComponent.tsx new file mode 100644 index 0000000..c7adf93 --- /dev/null +++ b/components/_ShareComponent/ListSkeletonComponent.tsx @@ -0,0 +1,21 @@ +import { View } from "react-native"; +import StackCustom from "../Stack/StackCustom"; +import SkeletonCustom from "./SkeletonCustom"; + +const ListSkeletonComponent = ({ + length = 5, + height = 100, +}: { + length?: number; + height?: number; +}) => ( + + + {Array.from({ length }).map((_, i) => ( + + ))} + + +); + +export default ListSkeletonComponent; diff --git a/components/_ShareComponent/NewWrapper.tsx b/components/_ShareComponent/NewWrapper.tsx index 9f0586d..c59245e 100644 --- a/components/_ShareComponent/NewWrapper.tsx +++ b/components/_ShareComponent/NewWrapper.tsx @@ -40,8 +40,8 @@ interface StaticModeProps extends BaseProps { interface ListModeProps extends BaseProps { children?: never; - listData: any[]; - renderItem: FlatListProps["renderItem"]; + listData?: any[]; + renderItem?: FlatListProps["renderItem"]; onEndReached?: () => void; // ✅ Gunakan tipe yang kompatibel dengan FlatList ListHeaderComponent?: React.ReactElement | null; diff --git a/components/index.ts b/components/index.ts index 9c05846..f53c40f 100644 --- a/components/index.ts +++ b/components/index.ts @@ -59,6 +59,7 @@ import ViewWrapper from "./_ShareComponent/ViewWrapper"; import SearchInput from "./_ShareComponent/SearchInput"; import DummyLandscapeImage from "./_ShareComponent/DummyLandscapeImage"; import GridComponentView from "./_ShareComponent/GridSectionView"; +import NewWrapper from "./_ShareComponent/NewWrapper"; // Progress import ProgressCustom from "./Progress/ProgressCustom"; // Loader @@ -119,6 +120,7 @@ export { DummyLandscapeImage, GridComponentView, Spacing, + NewWrapper, // Stack StackCustom, TabBarBackground, diff --git a/hooks/use-paginated-api.ts b/hooks/use-paginated-api.ts new file mode 100644 index 0000000..b106973 --- /dev/null +++ b/hooks/use-paginated-api.ts @@ -0,0 +1,97 @@ +// @/hooks/use-paginated-api.ts +import { useCallback, useState, useEffect, useRef } from "react"; + +interface UsePaginatedApiProps { + fetcher: (params: { page: number; search?: string }) => Promise; + initialSearch?: string; // mengatur nilai awal dari state + pageSize?: number; + dependencies?: any[]; // untuk refresh saat deps berubah (misal: user.id) +} + +export const usePaginatedApi = ({ + fetcher, + initialSearch = "", + pageSize = 5, + dependencies = [], +}: UsePaginatedApiProps) => { + const [data, setData] = useState([]); + const [loading, setLoading] = useState(true); + const [refreshing, setRefreshing] = useState(false); + const [hasMore, setHasMore] = useState(true); + const [page, setPage] = useState(1); + const [search, setSearch] = useState(initialSearch); + const refreshingRef = useRef(false); + const loadingRef = useRef(false); + const fetchRef = useRef(false); + + const fetchData = useCallback( + async (pageNumber: number, clear: boolean) => { + const isRefresh = clear; + + // 🔒 Proteksi: jangan jalankan jika sedang refreshing (untuk refresh) + if (isRefresh && refreshingRef.current) return; + // 🔒 Proteksi: jangan jalankan loadMore jika sedang loading + if (!isRefresh && loadingRef.current) return; + + const setLoadingState = (isLoading: boolean) => { + if (isRefresh) { + setRefreshing(isLoading); + refreshingRef.current = isLoading; + } else { + setLoading(isLoading); + loadingRef.current = isLoading; + } + }; + + setLoadingState(true); + + try { + const newData = await fetcher({ page: pageNumber, search }); + setData((prev) => { + const current = Array.isArray(prev) ? prev : []; + return clear ? newData : [...current, ...newData]; + }); + setHasMore(newData.length === pageSize); + setPage(pageNumber); + } catch (error) { + console.error("[usePaginatedApi] Error:", error); + setHasMore(false); + } finally { + setLoadingState(false); + } + }, + [search, hasMore, pageSize, ...dependencies] +); + + const onRefresh = useCallback(() => { + fetchData(1, true); + }, [fetchData]); + + const loadMore = useCallback(() => { + if (hasMore && !loading && !refreshing) { + fetchData(page + 1, false); + } + }, [hasMore, loading, refreshing, page, fetchData]); + + // Reset & fetch ulang saat search atau deps berubah + useEffect(() => { + if (fetchRef.current) return; // hindari double initial + fetchRef.current = true; + + setPage(1); + setData([]); + setHasMore(true); + fetchData(1, true); + }, [search, ...dependencies]); + + return { + data, + loading, + refreshing, + hasMore, + search, + setSearch, + onRefresh, + loadMore, + }; +}; diff --git a/screens/Profile/ListPage.tsx b/screens/Profile/ListPage.tsx index 628accd..2a0eb0a 100644 --- a/screens/Profile/ListPage.tsx +++ b/screens/Profile/ListPage.tsx @@ -62,6 +62,18 @@ export const drawerItemsProfile = ({ path: `/(application)/portofolio/${id}/create`, value: "create-portofolio", }, + { + icon: ( + + ), + label: "Blocked List", + path: `/(application)/profile/${id}/blocked-list`, + value: "blocked-list", + }, { icon: ( + ), + label: "Blocked List", + path: `/(application)/profile/${id}/blocked-list`, + value: "blocked-list", }, { icon: ( diff --git a/service/api-client/api-blocked.ts b/service/api-client/api-blocked.ts new file mode 100644 index 0000000..43e5f2a --- /dev/null +++ b/service/api-client/api-blocked.ts @@ -0,0 +1,45 @@ +import { apiConfig } from "../api-config"; + +/** + * @param id | Profile ID + * @param search | Search Query + * @param page | Page Number + */ +export async function apiGetBlocked({ + id, + search, + page, +}: { + id: string; + search?: string; + page?: string; +}) { + const pageQuery = page ? `&page=${page}` : ""; + const searchQuery = search ? `&search=${search}` : ""; + try { + const response = await apiConfig.get( + `/mobile/block-user?id=${id}${pageQuery}${searchQuery}` + ); + return response.data; + } catch (error) { + throw error; + } +} + +export async function apiGetBlockedById({ id }: { id: string }) { + try { + const response = await apiConfig.get(`/mobile/block-user/${id}`); + return response.data; + } catch (error) { + throw error; + } +} + +export async function apiUnblock({ id }: { id: string }) { + try { + const response = await apiConfig.delete(`/mobile/block-user/${id}`); + return response.data; + } catch (error) { + throw error; + } +} \ No newline at end of file diff --git a/styles/global-styles.ts b/styles/global-styles.ts index 553339c..1d6a538 100644 --- a/styles/global-styles.ts +++ b/styles/global-styles.ts @@ -16,7 +16,7 @@ export const GStyles = StyleSheet.create({ // =============== Main Styles =============== // container: { flex: 1, - paddingInline: PADDING_LARGE, + paddingInline: PADDING_MEDIUM, paddingBlock: PADDING_EXTRA_SMALL, backgroundColor: MainColor.darkblue, }, From 33ec892ec8b65bf3dcb994eed93cf401e8bb5857 Mon Sep 17 00:00:00 2001 From: bagasbanuna Date: Fri, 28 Nov 2025 16:35:18 +0800 Subject: [PATCH 07/21] Prebuild : untuk Maps box ### No issue --- android/app/build.gradle | 8 +++++++ android/build.gradle | 22 +++++++++++++++++++ app.config.js | 2 +- .../project.pbxproj | 4 ++-- ios/HIPMIBadungConnect/Info.plist | 19 +++++++++------- ios/Podfile | 10 +++++++++ 6 files changed, 54 insertions(+), 11 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 32e09c1..f672a69 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -82,6 +82,14 @@ def enableMinifyInReleaseBuilds = (findProperty('android.enableMinifyInReleaseBu def jscFlavor = 'io.github.react-native-community:jsc-android:2026004.+' android { +// @generated begin @rnmapbox/maps-libcpp - expo prebuild (DO NOT MODIFY) sync-e24830a5a3e854b398227dfe9630aabfaa1cadd1 +packagingOptions { + pickFirst 'lib/x86/libc++_shared.so' + pickFirst 'lib/x86_64/libc++_shared.so' + pickFirst 'lib/arm64-v8a/libc++_shared.so' + pickFirst 'lib/armeabi-v7a/libc++_shared.so' + } +// @generated end @rnmapbox/maps-libcpp ndkVersion rootProject.ext.ndkVersion buildToolsVersion rootProject.ext.buildToolsVersion diff --git a/android/build.gradle b/android/build.gradle index e39704a..3461bfd 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -23,3 +23,25 @@ allprojects { apply plugin: "expo-root-project" apply plugin: "com.facebook.react.rootproject" +// @generated begin @rnmapbox/maps-v2-maven - expo prebuild (DO NOT MODIFY) sync-d4ccbfdff48fdba3138b02a8ba41b9722af001d8 + +allprojects { + repositories { + maven { + url 'https://api.mapbox.com/downloads/v2/releases/maven' + // Authentication is no longer required as per Mapbox's removal of download token requirement + // See: https://github.com/mapbox/mapbox-maps-flutter/issues/775 + // Keeping this as optional for backward compatibility + def token = project.properties['MAPBOX_DOWNLOADS_TOKEN'] ?: System.getenv('RNMAPBOX_MAPS_DOWNLOAD_TOKEN') + if (token) { + authentication { basic(BasicAuthentication) } + credentials { + username = 'mapbox' + password = token + } + } + } + } +} + +// @generated end @rnmapbox/maps-v2-maven \ No newline at end of file diff --git a/app.config.js b/app.config.js index 799b203..7d324e2 100644 --- a/app.config.js +++ b/app.config.js @@ -19,7 +19,7 @@ export default { "NSLocationWhenInUseUsageDescription": "Aplikasi membutuhkan akses lokasi untuk menampilkan peta.", }, associatedDomains: ["applinks:cld-dkr-staging-hipmi.wibudev.com"], - buildNumber: "8", + buildNumber: "9", }, android: { diff --git a/ios/HIPMIBadungConnect.xcodeproj/project.pbxproj b/ios/HIPMIBadungConnect.xcodeproj/project.pbxproj index f4b773c..94f5563 100644 --- a/ios/HIPMIBadungConnect.xcodeproj/project.pbxproj +++ b/ios/HIPMIBadungConnect.xcodeproj/project.pbxproj @@ -401,7 +401,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = HIPMIBadungConnect/HIPMIBadungConnect.entitlements; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; DEVELOPMENT_TEAM = BMY6GT6W3D; ENABLE_BITCODE = NO; GCC_PREPROCESSOR_DEFINITIONS = ( @@ -438,7 +438,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = HIPMIBadungConnect/HIPMIBadungConnect.entitlements; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; DEVELOPMENT_TEAM = BMY6GT6W3D; INFOPLIST_FILE = HIPMIBadungConnect/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 15.1; diff --git a/ios/HIPMIBadungConnect/Info.plist b/ios/HIPMIBadungConnect/Info.plist index dedab2d..dab20b7 100644 --- a/ios/HIPMIBadungConnect/Info.plist +++ b/ios/HIPMIBadungConnect/Info.plist @@ -39,7 +39,7 @@ CFBundleVersion - 8 + 9 ITSAppUsesNonExemptEncryption LSMinimumSystemVersion @@ -53,15 +53,18 @@ NSAllowsLocalNetworking - - + NSCameraUsageDescription + Allow $(PRODUCT_NAME) to access your camera + NSLocationAlwaysAndWhenInUseUsageDescription + Allow $(PRODUCT_NAME) to access your location + NSLocationAlwaysUsageDescription + Allow $(PRODUCT_NAME) to access your location + NSLocationWhenInUseUsageDescription + Aplikasi membutuhkan akses lokasi untuk menampilkan peta. + NSMicrophoneUsageDescription + Allow $(PRODUCT_NAME) to access your microphone NSPhotoLibraryUsageDescription Untuk mengunggah dokumen dan media bisnis seperti foto profil, logo usaha, poster lowongan, atau bukti transaksi di berbagai fitur aplikasi: Profile, Portofolio, Job Vacancy, Investasi, dan Donasi. - - - NSCameraUsageDescription - Untuk mengambil foto langsung saat mengunggah dokumen bisnis seperti foto profil, logo usaha, poster, atau bukti pembayaran di fitur Profile, Portofolio, Job Vacancy, Investasi, dan Donasi. - NSUserActivityTypes $(PRODUCT_BUNDLE_IDENTIFIER).expo.index_route diff --git a/ios/Podfile b/ios/Podfile index e5d0bff..3156718 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -33,6 +33,13 @@ target 'HIPMIBadungConnect' do use_frameworks! :linkage => podfile_properties['ios.useFrameworks'].to_sym if podfile_properties['ios.useFrameworks'] use_frameworks! :linkage => ENV['USE_FRAMEWORKS'].to_sym if ENV['USE_FRAMEWORKS'] +# @generated begin pre_installer - expo prebuild (DO NOT MODIFY) sync-c8812095000d6054b846ce74840f0ffb540c2757 + pre_install do |installer| +# @generated begin @rnmapbox/maps-pre_installer - expo prebuild (DO NOT MODIFY) sync-ea4905840bf9fcea0acc62e92aa2e784f9d760f8 + $RNMapboxMaps.pre_install(installer) +# @generated end @rnmapbox/maps-pre_installer + end +# @generated end pre_installer use_react_native!( :path => config[:reactNativePath], :hermes_enabled => podfile_properties['expo.jsEngine'] == nil || podfile_properties['expo.jsEngine'] == 'hermes', @@ -42,6 +49,9 @@ target 'HIPMIBadungConnect' do ) post_install do |installer| +# @generated begin @rnmapbox/maps-post_installer - expo prebuild (DO NOT MODIFY) sync-c4e8f90e96f6b6c6ea9241dd7b52ab5f57f7bf36 + $RNMapboxMaps.post_install(installer) +# @generated end @rnmapbox/maps-post_installer react_native_post_install( installer, config[:reactNativePath], From 69452ff4e7031b57e39497da16001bd23629d697 Mon Sep 17 00:00:00 2001 From: bagasbanuna Date: Fri, 28 Nov 2025 17:27:59 +0800 Subject: [PATCH 08/21] Fix loader fetch data di Forum dan Forumku ### No Issue --- context/AuthContext.tsx | 2 +- screens/Forum/ViewBeranda2.tsx | 3 +-- screens/Forum/ViewForumku2.tsx | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/context/AuthContext.tsx b/context/AuthContext.tsx index 2d92e7d..4e14f7b 100644 --- a/context/AuthContext.tsx +++ b/context/AuthContext.tsx @@ -145,7 +145,7 @@ export const AuthProvider = ({ children }: { children: React.ReactNode }) => { await AsyncStorage.setItem("userData", JSON.stringify(dataUser)); return dataUser; } catch (error: any) { - console.log(error.response?.data?.message + "user" || "Gagal mengambil data user"); + console.log("[LOAD USER DATA]",error.response?.data?.message + "user" || "Gagal mengambil data user"); } finally { setIsLoading(false); } diff --git a/screens/Forum/ViewBeranda2.tsx b/screens/Forum/ViewBeranda2.tsx index 3a76141..5e88267 100644 --- a/screens/Forum/ViewBeranda2.tsx +++ b/screens/Forum/ViewBeranda2.tsx @@ -203,10 +203,9 @@ export default function Forum_ViewBeranda2() { /> } onEndReached={loadMore} - // ListHeaderComponent={ListHeaderComponent} ListFooterComponent={ListFooterComponent} ListEmptyComponent={ - _.isEmpty(listData) ? : + loading && _.isEmpty(listData) ? : } // ------------------------ /> diff --git a/screens/Forum/ViewForumku2.tsx b/screens/Forum/ViewForumku2.tsx index 5c758e2..535b3b1 100644 --- a/screens/Forum/ViewForumku2.tsx +++ b/screens/Forum/ViewForumku2.tsx @@ -207,7 +207,7 @@ export default function View_Forumku2() { ListHeaderComponent={randerHeaderComponent()} ListFooterComponent={ListFooterComponent} ListEmptyComponent={ - _.isEmpty(listData) ? : + loading && _.isEmpty(listData) ? : } /> From 98aaa126a1e61ca5ff82fcdd03ee683be1a1a2a9 Mon Sep 17 00:00:00 2001 From: bagasbanuna Date: Mon, 1 Dec 2025 17:43:20 +0800 Subject: [PATCH 09/21] QC: Inno dan Pak Jun Fix: - app/(application)/(user)/collaboration/create.tsx - app/(application)/(user)/event/[id]/edit.tsx - app/(application)/(user)/event/create.tsx - app/(application)/(user)/profile/[id]/blocked-list.tsx - app/(application)/(user)/profile/[id]/index.tsx - app/(application)/(user)/voting/[id]/[status]/detail.tsx - components/Button/FloatingButton.tsx - components/TextArea/TextAreaCustom.tsx - components/TextInput/TextInputCustom.tsx - constants/color-palet.ts - screens/Authentication/LoginView.tsx - screens/Home/topFeatureSection.tsx - screens/Portofolio/SocialMediaSection.tsx - screens/Voting/BoxDetailHasilVotingSection.tsx - styles/global-styles.ts ### No Issue --- .../(user)/collaboration/create.tsx | 2 +- app/(application)/(user)/event/[id]/edit.tsx | 6 +++--- app/(application)/(user)/event/create.tsx | 5 +++-- .../(user)/profile/[id]/blocked-list.tsx | 2 +- .../(user)/profile/[id]/index.tsx | 20 +++++++++++-------- .../(user)/voting/[id]/[status]/detail.tsx | 2 +- components/Button/FloatingButton.tsx | 5 +++-- components/TextArea/TextAreaCustom.tsx | 9 ++++++++- components/TextInput/TextInputCustom.tsx | 8 ++++++++ constants/color-palet.ts | 20 +++++++++++++++++++ screens/Authentication/LoginView.tsx | 7 ++++++- screens/Home/topFeatureSection.tsx | 2 +- screens/Portofolio/SocialMediaSection.tsx | 20 +++++++++---------- .../Voting/BoxDetailHasilVotingSection.tsx | 6 ++++-- 14 files changed, 81 insertions(+), 33 deletions(-) diff --git a/app/(application)/(user)/collaboration/create.tsx b/app/(application)/(user)/collaboration/create.tsx index 06736ee..155dea7 100644 --- a/app/(application)/(user)/collaboration/create.tsx +++ b/app/(application)/(user)/collaboration/create.tsx @@ -155,7 +155,7 @@ export default function CollaborationCreate() { { setSelectedDate(date as any); }} @@ -254,7 +255,6 @@ export default function EventEdit() { placeholder="Masukkan deskripsi event" required showCount - maxLength={100} value={data?.deskripsi} onChangeText={(value) => setData({ ...data, deskripsi: value })} /> diff --git a/app/(application)/(user)/event/create.tsx b/app/(application)/(user)/event/create.tsx index f80831a..1d3e4dd 100644 --- a/app/(application)/(user)/event/create.tsx +++ b/app/(application)/(user)/event/create.tsx @@ -110,13 +110,14 @@ export default function EventCreate() { const response = await apiEventCreate(newData); console.log("Response", JSON.stringify(response, null, 2)); - router.navigate("/event/status"); + router.replace("/event/status"); } catch (error) { console.log(error); } finally { setIsLoading(false); } }; + const buttonSubmit = ( setData({ ...data, deskripsi: value }) } diff --git a/app/(application)/(user)/profile/[id]/blocked-list.tsx b/app/(application)/(user)/profile/[id]/blocked-list.tsx index 2582ebd..b1c0658 100644 --- a/app/(application)/(user)/profile/[id]/blocked-list.tsx +++ b/app/(application)/(user)/profile/[id]/blocked-list.tsx @@ -121,7 +121,7 @@ export default function ProfileBlockedList() { return ( <> { - const response = await apiGetPortofolio({ id: id }); - const lastTwoByDate = response.data - .sort( - (a: any, b: any) => - new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime() - ) // urut desc - .slice(0, 2); - setListPortofolio(lastTwoByDate); + try { + const response = await apiGetPortofolio({ id: id }); + const lastTwoByDate = response.data + .sort( + (a: any, b: any) => + new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime() + ) // urut desc + .slice(0, 2); + setListPortofolio(lastTwoByDate); + } catch (error) { + console.log("[ERROR]", error); + } }; return ( diff --git a/app/(application)/(user)/voting/[id]/[status]/detail.tsx b/app/(application)/(user)/voting/[id]/[status]/detail.tsx index 76ef4c8..69c5f21 100644 --- a/app/(application)/(user)/voting/[id]/[status]/detail.tsx +++ b/app/(application)/(user)/voting/[id]/[status]/detail.tsx @@ -134,7 +134,7 @@ export default function VotingDetailStatus() { {data && data?.catatan && - (status === "draft" || status === "rejected") && ( + (status === "draft" || status === "reject") && ( )} diff --git a/components/Button/FloatingButton.tsx b/components/Button/FloatingButton.tsx index 646a0ca..d63f189 100644 --- a/components/Button/FloatingButton.tsx +++ b/components/Button/FloatingButton.tsx @@ -32,9 +32,10 @@ const FloatingButton: React.FC = ({ const styles = StyleSheet.create({ fab: { position: "absolute", - margin: 16, + margin: "auto", right: 0, - bottom: 0, + // bottom: 10, + top: -20, backgroundColor: AccentColor.softblue, // Warna Twitter biru borderRadius: 50, borderColor: AccentColor.blue, diff --git a/components/TextArea/TextAreaCustom.tsx b/components/TextArea/TextAreaCustom.tsx index 848e8cb..1487e14 100644 --- a/components/TextArea/TextAreaCustom.tsx +++ b/components/TextArea/TextAreaCustom.tsx @@ -1,3 +1,4 @@ +import { AccentColor, MainColor } from "@/constants/color-palet"; import { GStyles } from "@/styles/global-styles"; import React, { useEffect, useState } from "react"; import { @@ -6,7 +7,9 @@ import { Text, View, ViewStyle, + useColorScheme, } from "react-native"; +import { PlaceholderColor } from "@/constants/color-palet"; type IconType = React.ReactNode | string; @@ -48,7 +51,7 @@ const TextAreaCustom: React.FC = ({ minRows = 4, maxRows = 6, showCount = false, - maxLength, + maxLength = 1000, value, onChangeText, height = 100, @@ -78,6 +81,9 @@ const TextAreaCustom: React.FC = ({ ); }; + const colorScheme = useColorScheme(); + const theme = PlaceholderColor[colorScheme || "light"]; + return ( {label && ( @@ -109,6 +115,7 @@ const TextAreaCustom: React.FC = ({ GStyles.textAreaInput, { color: fontColor }, ]} + placeholderTextColor={theme.placeholder} editable={!disabled} value={value as string} onChangeText={onChangeText} diff --git a/components/TextInput/TextInputCustom.tsx b/components/TextInput/TextInputCustom.tsx index 3a0fca1..7c7ca4b 100644 --- a/components/TextInput/TextInputCustom.tsx +++ b/components/TextInput/TextInputCustom.tsx @@ -1,3 +1,4 @@ +import { PlaceholderColor } from "@/constants/color-palet"; import { GStyles } from "@/styles/global-styles"; import Ionicons from "@expo/vector-icons/Ionicons"; import React, { useState } from "react"; @@ -8,8 +9,10 @@ import { TouchableOpacity, View, ViewStyle, + useColorScheme } from "react-native"; + type IconType = React.ReactNode | string; type Props = { @@ -74,6 +77,9 @@ const TextInputCustom = ({ } }; + const colorScheme = useColorScheme(); + const theme = PlaceholderColor[colorScheme || "light"]; + return ( {label && ( @@ -100,12 +106,14 @@ const TextInputCustom = ({ { color: fontColor }, disabled && GStyles.inputPlaceholderDisabled, // <-- placeholder saat disabled ]} + placeholderTextColor={theme.placeholder} editable={!disabled} secureTextEntry={secureTextEntry && !isPasswordVisible} keyboardType={keyboardType} onChangeText={handleTextChange} maxLength={maxLength} {...rest} + /> {secureTextEntry && ( , onPress: () => router.push("/(application)/(user)/collaboration/(tabs)"), - status: "inactive", + status: "active", }, { name: "Voting", diff --git a/screens/Portofolio/SocialMediaSection.tsx b/screens/Portofolio/SocialMediaSection.tsx index c4fc141..19aa34b 100644 --- a/screens/Portofolio/SocialMediaSection.tsx +++ b/screens/Portofolio/SocialMediaSection.tsx @@ -5,16 +5,6 @@ import { Ionicons } from "@expo/vector-icons"; export default function Portofolio_SocialMediaSection({ data }: { data: any }) { const listData = [ - { - label: data && data?.facebook ? data.facebook : "-", - icon: ( - - ), - }, { label: data && data?.tiktok ? data.tiktok : "-", icon: ( @@ -35,6 +25,16 @@ export default function Portofolio_SocialMediaSection({ data }: { data: any }) { /> ), }, + { + label: data && data?.facebook ? data.facebook : "-", + icon: ( + + ), + }, { label: data && data?.twitter ? data.twitter : "-", icon: ( diff --git a/screens/Voting/BoxDetailHasilVotingSection.tsx b/screens/Voting/BoxDetailHasilVotingSection.tsx index 790e052..ee11056 100644 --- a/screens/Voting/BoxDetailHasilVotingSection.tsx +++ b/screens/Voting/BoxDetailHasilVotingSection.tsx @@ -22,9 +22,11 @@ export default function Voting_BoxDetailHasilVotingSection({ {listData?.map((item: any, i: number) => ( - + - {item?.value} + {item?.value} ))} From 858b441a8cdeca26247882e13d71a7d24c0b23ac Mon Sep 17 00:00:00 2001 From: bagasbanuna Date: Tue, 2 Dec 2025 17:48:24 +0800 Subject: [PATCH 10/21] Clearing apple rejected QC: Inno Fix: - app.config.js - app/(application)/(user)/investment/[id]/index.tsx - app/(application)/(user)/voting/(tabs)/index.tsx - app/(application)/(user)/waiting-room.tsx - app/(application)/terms-agreement.tsx - context/AuthContext.tsx - ios/HIPMIBadungConnect.xcodeproj/project.pbxproj - ios/HIPMIBadungConnect/Info.plist - screens/Authentication/LoginView.tsx - screens/Authentication/VerificationView.tsx - screens/Home/topFeatureSection.tsx - screens/Invesment/BoxBerandaSection.tsx - screens/Invesment/ButtonInvestasiSection.tsx - screens/Invesment/DetailDataPublishSection.tsx - service/api-client/api-voting.ts - service/api-config.ts ### No Issue --- app.config.js | 2 +- .../(user)/investment/[id]/index.tsx | 30 ++++- .../(user)/voting/(tabs)/index.tsx | 3 + app/(application)/(user)/waiting-room.tsx | 22 +++- app/(application)/terms-agreement.tsx | 3 +- context/AuthContext.tsx | 105 +++++++++++++++--- .../project.pbxproj | 4 +- ios/HIPMIBadungConnect/Info.plist | 2 +- screens/Authentication/LoginView.tsx | 39 +++++-- screens/Authentication/VerificationView.tsx | 17 +-- screens/Home/topFeatureSection.tsx | 2 +- screens/Invesment/BoxBerandaSection.tsx | 25 +++-- screens/Invesment/ButtonInvestasiSection.tsx | 5 +- .../Invesment/DetailDataPublishSection.tsx | 2 +- service/api-client/api-voting.ts | 6 +- service/api-config.ts | 8 +- 16 files changed, 203 insertions(+), 72 deletions(-) diff --git a/app.config.js b/app.config.js index 7d324e2..daa473e 100644 --- a/app.config.js +++ b/app.config.js @@ -19,7 +19,7 @@ export default { "NSLocationWhenInUseUsageDescription": "Aplikasi membutuhkan akses lokasi untuk menampilkan peta.", }, associatedDomains: ["applinks:cld-dkr-staging-hipmi.wibudev.com"], - buildNumber: "9", + buildNumber: "10", }, android: { diff --git a/app/(application)/(user)/investment/[id]/index.tsx b/app/(application)/(user)/investment/[id]/index.tsx index 7be9c64..2158182 100644 --- a/app/(application)/(user)/investment/[id]/index.tsx +++ b/app/(application)/(user)/investment/[id]/index.tsx @@ -15,6 +15,7 @@ import Investment_ButtonInvestasiSection from "@/screens/Invesment/ButtonInvesta import Invesment_ComponentBoxOnBottomDetail from "@/screens/Invesment/ComponentBoxOnBottomDetail"; import Invesment_DetailDataPublishSection from "@/screens/Invesment/DetailDataPublishSection"; import { apiInvestmentGetOne } from "@/service/api-client/api-investment"; +import { countDownAndCondition } from "@/utils/countDownAndCondition"; import { AntDesign, MaterialIcons } from "@expo/vector-icons"; import { router, @@ -23,7 +24,7 @@ import { useLocalSearchParams, } from "expo-router"; import _ from "lodash"; -import { useCallback, useState } from "react"; +import { useCallback, useEffect, useState } from "react"; export default function InvestmentDetail() { const { user } = useAuth(); @@ -62,6 +63,31 @@ export default function InvestmentDetail() { setOpenDrawerPublish(false); }; + const [value, setValue] = useState({ + sisa: 0, + reminder: false, + }); + + useEffect(() => { + updateCountDown(); + }, [data]); + + console.log("[DATA DETAIL]", JSON.stringify(data, null, 2)); + + const updateCountDown = () => { + const countDown = countDownAndCondition({ + duration: data?.MasterPencarianInvestor.name, + publishTime: data?.countDown, + }); + + setValue({ + sisa: countDown.durationDay, + reminder: countDown.reminder, + }); + }; + + + const bottomSection = ( + ); return ( diff --git a/app/(application)/(user)/voting/(tabs)/index.tsx b/app/(application)/(user)/voting/(tabs)/index.tsx index f6beef4..0e42863 100644 --- a/app/(application)/(user)/voting/(tabs)/index.tsx +++ b/app/(application)/(user)/voting/(tabs)/index.tsx @@ -6,6 +6,7 @@ import { TextCustom, ViewWrapper, } from "@/components"; +import { useAuth } from "@/hooks/use-auth"; import Voting_BoxPublishSection from "@/screens/Voting/BoxPublishSection"; import { apiVotingGetAll } from "@/service/api-client/api-voting"; import { router, useFocusEffect } from "expo-router"; @@ -13,6 +14,7 @@ import _ from "lodash"; import { useCallback, useState } from "react"; export default function VotingBeranda() { + const { user } = useAuth(); const [listData, setListData] = useState([]); const [loadingGetData, setLoadingGetData] = useState(false); const [search, setSearch] = useState(""); @@ -29,6 +31,7 @@ export default function VotingBeranda() { const response = await apiVotingGetAll({ search, category: "beranda", + userLoginId: user?.id, }); if (response.success) { setListData(response.data); diff --git a/app/(application)/(user)/waiting-room.tsx b/app/(application)/(user)/waiting-room.tsx index 3d2cf16..000020f 100644 --- a/app/(application)/(user)/waiting-room.tsx +++ b/app/(application)/(user)/waiting-room.tsx @@ -4,6 +4,7 @@ import { ButtonCenteredOnly, ButtonCustom, InformationBox, + NewWrapper, StackCustom, ViewWrapper, } from "@/components"; @@ -12,6 +13,7 @@ import { useAuth } from "@/hooks/use-auth"; import { apiUser } from "@/service/api-client/api-user"; import { Ionicons } from "@expo/vector-icons"; import { router } from "expo-router"; +import { RefreshControl } from "react-native"; import Toast from "react-native-toast-message"; export default function WaitingRoom() { @@ -33,7 +35,7 @@ export default function WaitingRoom() { } else { Toast.show({ type: "success", - text1: "Akun anda telah aktif", // text2: "Anda berhasil login", + text1: "Selamat ! Akun anda telah aktif", // text2: "Anda berhasil login", }); router.replace(`/(application)/(user)/profile/create`); } @@ -82,10 +84,18 @@ export default function WaitingRoom() { return ( <> - + + } + > - - + {/* { handleCheck(); @@ -93,9 +103,9 @@ export default function WaitingRoom() { icon="refresh-ccw" > Check - + */} - + ); } diff --git a/app/(application)/terms-agreement.tsx b/app/(application)/terms-agreement.tsx index d07c701..fd869b9 100644 --- a/app/(application)/terms-agreement.tsx +++ b/app/(application)/terms-agreement.tsx @@ -74,7 +74,7 @@ export default function TermsAgreement() { <> @@ -87,6 +87,7 @@ export default function TermsAgreement() { alignItems: "center", marginTop: 16, marginBottom: 16, + paddingInline: 10, }} > setTerm(!term)} /> diff --git a/context/AuthContext.tsx b/context/AuthContext.tsx index 4e14f7b..f2ffd82 100644 --- a/context/AuthContext.tsx +++ b/context/AuthContext.tsx @@ -73,7 +73,22 @@ export const AuthProvider = ({ children }: { children: React.ReactNode }) => { setIsLoading(true); try { const response = await apiLogin({ nomor: nomor }); - await AsyncStorage.setItem("kode_otp", response.kodeId); + console.log("[RESPONSE AUTH]", JSON.stringify(response)); + + if (response.success) { + Toast.show({ + type: "success", + text1: "Sukses", + text2: "Kode OTP berhasil dikirim", + }); + + await AsyncStorage.setItem("kode_otp", response.kodeId); + router.replace(`/verification?nomor=${nomor}`); + return; + } else { + router.replace(`/register?nomor=${nomor}`); + return; + } } catch (error: any) { throw new Error(error.response?.data?.message || "Gagal kirim OTP"); } finally { @@ -81,13 +96,26 @@ export const AuthProvider = ({ children }: { children: React.ReactNode }) => { } }; + // const loginWithNomor = async (nomor: string) => { + // setIsLoading(true); + // try { + // const response = await apiLogin({ nomor: nomor }); + // await AsyncStorage.setItem("kode_otp", response.kodeId); + // } catch (error: any) { + // throw new Error(error.response?.data?.message || "Gagal kirim OTP"); + // } finally { + // setIsLoading(false); + // } + // }; + // --- 2. Validasi OTP & cek user --- const validateOtp = async (nomor: string) => { try { setIsLoading(true); const response = await apiValidationCode({ nomor: nomor }); - const { token } = response; + console.log("[RESPONSE VALIDASI OTP]", JSON.stringify(response, null, 2)); + if (response.success) { setToken(token); await AsyncStorage.setItem("authToken", token); @@ -104,20 +132,23 @@ export const AuthProvider = ({ children }: { children: React.ReactNode }) => { if (response.active) { if (response.roleId === "1") { - return "/(application)/(user)/home"; + router.replace("/(application)/(user)/home"); + return; } else { - return "/(application)/admin/dashboard"; + router.replace("/(application)/admin/dashboard"); + return; } } else { - return "/(application)/(user)/waiting-room"; + router.replace("/(application)/(user)/waiting-room"); + return; } } else { Toast.show({ type: "info", - text1: "Anda belum terdaftar", - text2: "Silahkan daftar terlebih dahulu", + text1: "Terjadi kesalahan", + text2: "Silahkan coba lagi", }); - return `/register?nomor=${nomor}`; + return; } } catch (error: any) { console.log("Error validasi otp >>", (error as Error).message || error); @@ -132,6 +163,10 @@ export const AuthProvider = ({ children }: { children: React.ReactNode }) => { // --- 3. Ambil data user --- const userData = async (token: string) => { try { + if (!token) { + throw new Error("Token tidak ditemukan"); + } + setIsLoading(true); const response = await apiConfig.get(`/mobile?token=${token}`, { headers: { @@ -145,7 +180,10 @@ export const AuthProvider = ({ children }: { children: React.ReactNode }) => { await AsyncStorage.setItem("userData", JSON.stringify(dataUser)); return dataUser; } catch (error: any) { - console.log("[LOAD USER DATA]",error.response?.data?.message + "user" || "Gagal mengambil data user"); + console.log( + "[LOAD USER DATA]", + error.response?.data?.message + "user" || "Gagal mengambil data user" + ); } finally { setIsLoading(false); } @@ -160,9 +198,8 @@ export const AuthProvider = ({ children }: { children: React.ReactNode }) => { setIsLoading(true); try { const response = await apiRegister({ data: userData }); - console.log("response", response); + console.log("[REGISTER FETCH]", JSON.stringify(response, null, 2)); - const { token } = response; if (!response.success) { Toast.show({ type: "info", @@ -173,23 +210,63 @@ export const AuthProvider = ({ children }: { children: React.ReactNode }) => { return; } - setToken(token); - await AsyncStorage.setItem("authToken", token); Toast.show({ type: "success", text1: "Sukses", text2: "Anda berhasil terdaftar", }); - router.replace("/(application)/(user)/waiting-room"); + router.replace(`/verification?nomor=${userData.nomor}`); return; } catch (error: any) { + Toast.show({ + type: "error", + text1: "Error", + text2: error.response?.data?.message || "Gagal mendaftar", + }); console.log("Error register", error); } finally { setIsLoading(false); } }; + // const registerUser = async (userData: { + // username: string; + // nomor: string; + // termsOfServiceAccepted: boolean; + // }) => { + // setIsLoading(true); + // try { + // const response = await apiRegister({ data: userData }); + // console.log("response", response); + + // const { token } = response; + // if (!response.success) { + // Toast.show({ + // type: "info", + // text1: "Info", + // text2: response.message, + // }); + + // return; + // } + + // setToken(token); + // await AsyncStorage.setItem("authToken", token); + // Toast.show({ + // type: "success", + // text1: "Sukses", + // text2: "Anda berhasil terdaftar", + // }); + // router.replace("/(application)/(user)/waiting-room"); + // return; + // } catch (error: any) { + // console.log("Error register", error); + // } finally { + // setIsLoading(false); + // } + // }; // --- 5. Logout --- + const logout = async () => { try { setIsLoading(true); diff --git a/ios/HIPMIBadungConnect.xcodeproj/project.pbxproj b/ios/HIPMIBadungConnect.xcodeproj/project.pbxproj index 94f5563..c7e28a8 100644 --- a/ios/HIPMIBadungConnect.xcodeproj/project.pbxproj +++ b/ios/HIPMIBadungConnect.xcodeproj/project.pbxproj @@ -422,7 +422,7 @@ ); OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG"; PRODUCT_BUNDLE_IDENTIFIER = "com.anonymous.hipmi-mobile"; - PRODUCT_NAME = HIPMIBadungConnect; + PRODUCT_NAME = "HIPMIBadungConnect"; SWIFT_OBJC_BRIDGING_HEADER = "HIPMIBadungConnect/HIPMIBadungConnect-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; @@ -454,7 +454,7 @@ ); OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = "com.anonymous.hipmi-mobile"; - PRODUCT_NAME = HIPMIBadungConnect; + PRODUCT_NAME = "HIPMIBadungConnect"; SWIFT_OBJC_BRIDGING_HEADER = "HIPMIBadungConnect/HIPMIBadungConnect-Bridging-Header.h"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; diff --git a/ios/HIPMIBadungConnect/Info.plist b/ios/HIPMIBadungConnect/Info.plist index dab20b7..715a448 100644 --- a/ios/HIPMIBadungConnect/Info.plist +++ b/ios/HIPMIBadungConnect/Info.plist @@ -39,7 +39,7 @@ CFBundleVersion - 9 + 10 ITSAppUsesNonExemptEncryption LSMinimumSystemVersion diff --git a/screens/Authentication/LoginView.tsx b/screens/Authentication/LoginView.tsx index 0dfe2ec..7238cd1 100644 --- a/screens/Authentication/LoginView.tsx +++ b/screens/Authentication/LoginView.tsx @@ -72,20 +72,11 @@ export default function LoginView() { const realNumber = callingCode + fixNumber; - console.log("[REALNUMBER]", realNumber); - try { setLoading(true); - // const response = await apiLogin({ nomor: realNumber }); - await loginWithNomor(realNumber); - - Toast.show({ - type: "success", - text1: "Sukses", - text2: "Kode OTP berhasil dikirim", - }); - - router.navigate(`/verification?nomor=${realNumber}`); + const response = await loginWithNomor(realNumber); + console.log("[RESPONSE UI]", response); + } catch (error) { console.log("Error login", error); Toast.show({ @@ -96,6 +87,30 @@ export default function LoginView() { } finally { setLoading(false); } + + // try { + // setLoading(true); + // // const response = await apiLogin({ nomor: realNumber }); + // const response = await loginWithNomor(realNumber); + // console.log("[RESPONSE]", response); + + // Toast.show({ + // type: "success", + // text1: "Sukses", + // text2: "Kode OTP berhasil dikirim", + // }); + + // // router.navigate(`/verification?nomor=${realNumber}`); + // } catch (error) { + // console.log("Error login", error); + // Toast.show({ + // type: "error", + // text1: "Error", + // text2: error as string, + // }); + // } finally { + // setLoading(false); + // } } if (token && token !== "" && !isUserActive) { diff --git a/screens/Authentication/VerificationView.tsx b/screens/Authentication/VerificationView.tsx index 0be0100..37a39e6 100644 --- a/screens/Authentication/VerificationView.tsx +++ b/screens/Authentication/VerificationView.tsx @@ -89,8 +89,9 @@ export default function VerificationView() { // ✅ VERIFIKASI OTOMATIS UNTUK APPLE REVIEW if (inputOtp === "1234") { try { - const response = await validateOtp(nomor as string); - router.replace(response); + await validateOtp(nomor as string); + + return; } catch (error) { console.log("Error verification", error); Toast.show({ type: "error", text1: "Gagal verifikasi" }); @@ -103,16 +104,8 @@ export default function VerificationView() { // 🔁 VERIFIKASI NORMAL (untuk pengguna sungguhan) try { - const response = await validateOtp(nomor as string); - // registerForPushNotificationsAsync().then((token) => { - // if (token) { - // console.log("Expo Push Token:", token); - // // TODO: Kirim token ke backend kamu - // } else { - // console.log("Failed to get Expo Push Token"); - // } - // }); - router.replace(response); + await validateOtp(nomor as string); + return } catch (error) { console.log("Error verification", error); Toast.show({ type: "error", text1: "Gagal verifikasi" }); diff --git a/screens/Home/topFeatureSection.tsx b/screens/Home/topFeatureSection.tsx index 90664c1..8befc82 100644 --- a/screens/Home/topFeatureSection.tsx +++ b/screens/Home/topFeatureSection.tsx @@ -15,7 +15,7 @@ export default function Home_FeatureSection() { name: "Collaboration", icon: , onPress: () => router.push("/(application)/(user)/collaboration/(tabs)"), - status: "active", + status: "inactive", }, { name: "Voting", diff --git a/screens/Invesment/BoxBerandaSection.tsx b/screens/Invesment/BoxBerandaSection.tsx index 0d2bd2d..5e6292a 100644 --- a/screens/Invesment/BoxBerandaSection.tsx +++ b/screens/Invesment/BoxBerandaSection.tsx @@ -1,12 +1,13 @@ /* eslint-disable react-hooks/exhaustive-deps */ import { - BaseBox, - Grid, - ProgressCustom, - StackCustom, - TextCustom, + BaseBox, + Grid, + ProgressCustom, + StackCustom, + TextCustom, } from "@/components"; import API_STRORAGE from "@/constants/base-url-api-strorage"; +import { MainColor } from "@/constants/color-palet"; import DUMMY_IMAGE from "@/constants/dummy-image-value"; import { countDownAndCondition } from "@/utils/countDownAndCondition"; import { Ionicons } from "@expo/vector-icons"; @@ -21,7 +22,7 @@ export default function Investment_BoxBerandaSection({ id: string; data: any; }) { -// console.log("[DATA By one]", JSON.stringify(data, null, 2)); + // console.log("[DATA By one]", JSON.stringify(data, null, 2)); const [value, setValue] = useState({ sisa: 0, @@ -32,6 +33,8 @@ export default function Investment_BoxBerandaSection({ updateCountDown(); }, [data]); + console.log("[DATA BERANDA]", JSON.stringify(data, null, 2)); + const updateCountDown = () => { const countDown = countDownAndCondition({ duration: data?.pencarianInvestor, @@ -66,8 +69,10 @@ export default function Investment_BoxBerandaSection({ {data.title} {value.reminder ? ( - Periode Investasi Berakhir + Periode Berakhir ) : ( - - Sisa waktu: {value.sisa} hari - + Sisa waktu: {value.sisa} hari )} diff --git a/screens/Invesment/ButtonInvestasiSection.tsx b/screens/Invesment/ButtonInvestasiSection.tsx index 355fb5d..7af270f 100644 --- a/screens/Invesment/ButtonInvestasiSection.tsx +++ b/screens/Invesment/ButtonInvestasiSection.tsx @@ -4,9 +4,11 @@ import { router } from "expo-router"; export default function Investment_ButtonInvestasiSection({ id, isMine, + reminder, }: { id: string; isMine: boolean; + reminder: boolean; }) { return ( <> @@ -14,11 +16,12 @@ export default function Investment_ButtonInvestasiSection({ Investasi ini milik Anda ) : ( { router.navigate(`/investment/${id}/(transaction-flow)`); }} > - Beli Saham + {reminder ? "Periode Investasi Berakhir" : "Beli Saham"} )} diff --git a/screens/Invesment/DetailDataPublishSection.tsx b/screens/Invesment/DetailDataPublishSection.tsx index d67b93f..63b12f5 100644 --- a/screens/Invesment/DetailDataPublishSection.tsx +++ b/screens/Invesment/DetailDataPublishSection.tsx @@ -52,7 +52,7 @@ export default function Invesment_DetailDataPublishSection({ )} { @@ -29,16 +28,15 @@ apiConfig.interceptors.request.use( ); export async function apiVersion() { - // console.log("API_BASE_URL", API_BASE_URL); const response = await apiConfig.get("/version"); return response.data; } export async function apiLogin({ nomor }: { nomor: string }) { - const response = await apiConfig.post("/auth/login", { + const response = await apiConfig.post("/mobile/auth/login", { nomor: nomor, }); - return response.data; + return response.data;; } export async function apiCheckCodeOtp({ kodeId }: { kodeId: string }) { @@ -58,7 +56,7 @@ export async function apiRegister({ }: { data: { nomor: string; username: string; termsOfServiceAccepted: boolean }; }) { - const response = await apiConfig.post(`/auth/register`, { + const response = await apiConfig.post(`/mobile/auth/register`, { data: data, }); return response.data; From a93f97ed6aa54eb44b7ab160668fd19f0a1838de Mon Sep 17 00:00:00 2001 From: bagasbanuna Date: Wed, 3 Dec 2025 17:23:12 +0800 Subject: [PATCH 11/21] Fix rejected Apple Add: - utils/viersionBadge.ts Fix: - app.config.js - context/AuthContext.tsx - ios/HIPMIBadungConnect/Info.plist - screens/Authentication/LoginView.tsx - screens/Authentication/VerificationView.tsx - service/api-config.ts ### No Issue --- app.config.js | 2 +- context/AuthContext.tsx | 12 +++++-- ios/HIPMIBadungConnect/Info.plist | 2 +- screens/Authentication/LoginView.tsx | 36 +++++++++++++++------ screens/Authentication/VerificationView.tsx | 4 ++- service/api-config.ts | 7 ++-- utils/viersionBadge.ts | 18 +++++++++++ 7 files changed, 63 insertions(+), 18 deletions(-) create mode 100644 utils/viersionBadge.ts diff --git a/app.config.js b/app.config.js index daa473e..f8becda 100644 --- a/app.config.js +++ b/app.config.js @@ -19,7 +19,7 @@ export default { "NSLocationWhenInUseUsageDescription": "Aplikasi membutuhkan akses lokasi untuk menampilkan peta.", }, associatedDomains: ["applinks:cld-dkr-staging-hipmi.wibudev.com"], - buildNumber: "10", + buildNumber: "12", }, android: { diff --git a/context/AuthContext.tsx b/context/AuthContext.tsx index f2ffd82..53da0d5 100644 --- a/context/AuthContext.tsx +++ b/context/AuthContext.tsx @@ -72,10 +72,13 @@ export const AuthProvider = ({ children }: { children: React.ReactNode }) => { const loginWithNomor = async (nomor: string) => { setIsLoading(true); try { + console.log("[Masuk provider]", nomor); const response = await apiLogin({ nomor: nomor }); console.log("[RESPONSE AUTH]", JSON.stringify(response)); + if (response.success) { + console.log("[Keluar provider]", nomor); Toast.show({ type: "success", text1: "Sukses", @@ -83,10 +86,15 @@ export const AuthProvider = ({ children }: { children: React.ReactNode }) => { }); await AsyncStorage.setItem("kode_otp", response.kodeId); - router.replace(`/verification?nomor=${nomor}`); + router.push(`/verification?nomor=${nomor}`); return; } else { - router.replace(`/register?nomor=${nomor}`); + router.push(`/register?nomor=${nomor}`); + Toast.show({ + type: "info", + text1: "Info", + text2: "Silahkan mendaftar", + }); return; } } catch (error: any) { diff --git a/ios/HIPMIBadungConnect/Info.plist b/ios/HIPMIBadungConnect/Info.plist index 715a448..fa0d347 100644 --- a/ios/HIPMIBadungConnect/Info.plist +++ b/ios/HIPMIBadungConnect/Info.plist @@ -39,7 +39,7 @@ CFBundleVersion - 10 + 12 ITSAppUsesNonExemptEncryption LSMinimumSystemVersion diff --git a/screens/Authentication/LoginView.tsx b/screens/Authentication/LoginView.tsx index 7238cd1..c80833d 100644 --- a/screens/Authentication/LoginView.tsx +++ b/screens/Authentication/LoginView.tsx @@ -1,3 +1,4 @@ +import { NewWrapper } from "@/components"; import ButtonCustom from "@/components/Button/ButtonCustom"; import Spacing from "@/components/_ShareComponent/Spacing"; import ViewWrapper from "@/components/_ShareComponent/ViewWrapper"; @@ -5,9 +6,11 @@ import { MainColor } from "@/constants/color-palet"; import { useAuth } from "@/hooks/use-auth"; import { apiVersion } from "@/service/api-config"; import { GStyles } from "@/styles/global-styles"; -import { Redirect, router } from "expo-router"; +import versionBadge from "@/utils/viersionBadge"; +import VersionBadge from "@/utils/viersionBadge"; +import { Redirect } from "expo-router"; import { useEffect, useState } from "react"; -import { Text, View } from "react-native"; +import { RefreshControl, Text, View } from "react-native"; import PhoneInput, { ICountry } from "react-native-international-phone-number"; import Toast from "react-native-toast-message"; @@ -16,6 +19,7 @@ export default function LoginView() { const [selectedCountry, setSelectedCountry] = useState(null); const [inputValue, setInputValue] = useState(""); const [loading, setLoading] = useState(false); + const [refreshing, setRefreshing] = useState(false); const { loginWithNomor, token, isAdmin, isUserActive } = useAuth(); @@ -25,7 +29,18 @@ export default function LoginView() { async function onLoadVersion() { const res = await apiVersion(); - setVersion(res.data); + + if (res.success) { + setVersion(versionBadge()); + } + } + + async function handleRefresh() { + setRefreshing(true); + await onLoadVersion(); + setInputValue(""); + setLoading(false); + setRefreshing(false); } function handleInputValue(phoneNumber: string) { @@ -65,8 +80,6 @@ export default function LoginView() { const isValid = await validateData(); if (!isValid) return; - // const callingCode = selectedCountry?.callingCode.replace(/^\+/, "") || ""; - // const fixNumber = inputValue.replace(/\s+/g, ""); const callingCode = selectedCountry?.callingCode.replace(/^\+/, "") || ""; let fixNumber = inputValue.replace(/\s+/g, "").replace(/^0+/, ""); @@ -74,9 +87,7 @@ export default function LoginView() { try { setLoading(true); - const response = await loginWithNomor(realNumber); - console.log("[RESPONSE UI]", response); - + await loginWithNomor(realNumber); } catch (error) { console.log("Error login", error); Toast.show({ @@ -130,7 +141,12 @@ export default function LoginView() { } return ( - + + } + > @@ -174,6 +190,6 @@ export default function LoginView() { Coba */} - + ); } diff --git a/screens/Authentication/VerificationView.tsx b/screens/Authentication/VerificationView.tsx index 37a39e6..7ed8add 100644 --- a/screens/Authentication/VerificationView.tsx +++ b/screens/Authentication/VerificationView.tsx @@ -17,6 +17,8 @@ import Toast from "react-native-toast-message"; export default function VerificationView() { const { nomor } = useLocalSearchParams<{ nomor: string }>(); + console.log("[NOMOR]", nomor); + const [inputOtp, setInputOtp] = useState(""); const [userNumber, setUserNumber] = useState(""); const [loading, setLoading] = useState(false); @@ -52,7 +54,7 @@ export default function VerificationView() { try { const response = await apiCheckCodeOtp({ kodeId }); console.log( - "Response check code otp >>", + "[OTP] >>", JSON.stringify(response.otp, null, 2) ); // Kita tidak perlu simpan codeOtp di state karena verifikasi dilakukan di backend diff --git a/service/api-config.ts b/service/api-config.ts index 276cba7..c0518fe 100644 --- a/service/api-config.ts +++ b/service/api-config.ts @@ -14,6 +14,7 @@ apiConfig.interceptors.request.use( async (config) => { console.log("API_BASE_URL >>", API_BASE_URL); const token = await AsyncStorage.getItem("authToken"); + // console.log("[TOKEN] >>", token); if (token) { // config.timeout = 10000; config.headers["Content-Type"] = "application/json"; @@ -33,7 +34,7 @@ export async function apiVersion() { } export async function apiLogin({ nomor }: { nomor: string }) { - const response = await apiConfig.post("/mobile/auth/login", { + const response = await apiConfig.post("/auth/mobile-login", { nomor: nomor, }); return response.data;; @@ -45,7 +46,7 @@ export async function apiCheckCodeOtp({ kodeId }: { kodeId: string }) { } export async function apiValidationCode({ nomor }: { nomor: string }) { - const response = await apiConfig.post(`/auth/validasi`, { + const response = await apiConfig.post(`/auth/mobile-validasi`, { nomor: nomor, }); return response.data; @@ -56,7 +57,7 @@ export async function apiRegister({ }: { data: { nomor: string; username: string; termsOfServiceAccepted: boolean }; }) { - const response = await apiConfig.post(`/mobile/auth/register`, { + const response = await apiConfig.post(`/auth/mobile-register`, { data: data, }); return response.data; diff --git a/utils/viersionBadge.ts b/utils/viersionBadge.ts new file mode 100644 index 0000000..0a0c659 --- /dev/null +++ b/utils/viersionBadge.ts @@ -0,0 +1,18 @@ +// VersionBadge.tsx +import Constants from "expo-constants"; +import { Platform } from "react-native"; + +export default function versionBadge() { + const expoConfig = Constants.expoConfig; + + const version = expoConfig?.version; // "1.0.1" + const iosBuild = expoConfig?.ios?.buildNumber; // "10" + const androidBuild = expoConfig?.android?.versionCode; // 2 + + const build = + Platform.OS === "ios" ? iosBuild : androidBuild; + + const result = `${version} ( ${build} )`; + + return result +} From f5e30087edf27bede51bccfd69b477f2d7fadb91 Mon Sep 17 00:00:00 2001 From: bagasbanuna Date: Thu, 4 Dec 2025 16:59:39 +0800 Subject: [PATCH 12/21] Fix QC Inno Fix: - app/(application)/admin/donation/category-create.tsx - app/(application)/admin/donation/category-update.tsx - app/(application)/admin/donation/category.tsx - components/_ShareComponent/Admin/TableValue.tsx - screens/Authentication/LoginView.tsx - service/api-admin/api-master-admin.ts ### No Issue --- .../admin/donation/category-create.tsx | 59 ++++++- .../admin/donation/category-update.tsx | 83 ++++++++- app/(application)/admin/donation/category.tsx | 163 ++++++++++-------- .../_ShareComponent/Admin/TableValue.tsx | 13 +- screens/Authentication/LoginView.tsx | 4 +- service/api-admin/api-master-admin.ts | 53 ++++++ 6 files changed, 290 insertions(+), 85 deletions(-) diff --git a/app/(application)/admin/donation/category-create.tsx b/app/(application)/admin/donation/category-create.tsx index 587ea69..73aba91 100644 --- a/app/(application)/admin/donation/category-create.tsx +++ b/app/(application)/admin/donation/category-create.tsx @@ -1,17 +1,56 @@ import { BoxButtonOnFooter, ButtonCustom, + StackCustom, + TextCustom, TextInputCustom, ViewWrapper, } from "@/components"; import AdminBackButtonAntTitle from "@/components/_ShareComponent/Admin/BackButtonAntTitle"; +import { MainColor } from "@/constants/color-palet"; +import { apiAdminMasterDonationCategoryCreate } from "@/service/api-admin/api-master-admin"; import { useRouter } from "expo-router"; +import { useState } from "react"; +import { Switch } from "react-native-paper"; +import Toast from "react-native-toast-message"; export default function AdminDonationCategoryCreate() { const router = useRouter(); + const [loading, setLoading] = useState(false); + const [data, setData] = useState({ + name: "", + active: false, + }); + + const onSubmit = async () => { + try { + setLoading(true); + const response = await apiAdminMasterDonationCategoryCreate({ data }); + if (response.success) { + Toast.show({ + type: "success", + text2: "Data berhasil disimpan", + }); + router.back(); + return; + } + + Toast.show({ + type: "error", + text1: "Gagal menyimpan data", + }); + } catch (error) { + console.log("[Error]", error); + } finally { + setLoading(false); + } + }; + const buttonSubmit = ( - router.back()}>Simpan + + Simpan + ); return ( @@ -20,7 +59,23 @@ export default function AdminDonationCategoryCreate() { headerComponent={} footerComponent={buttonSubmit} > - + setData({ ...data, name: text })} + /> + + Status + setData({ ...data, active: value })} + /> + ); diff --git a/app/(application)/admin/donation/category-update.tsx b/app/(application)/admin/donation/category-update.tsx index 91c1241..640dd5a 100644 --- a/app/(application)/admin/donation/category-update.tsx +++ b/app/(application)/admin/donation/category-update.tsx @@ -1,21 +1,76 @@ import { + AlertDefaultSystem, BoxButtonOnFooter, ButtonCustom, + StackCustom, + TextCustom, TextInputCustom, ViewWrapper, } from "@/components"; import AdminBackButtonAntTitle from "@/components/_ShareComponent/Admin/BackButtonAntTitle"; +import { MainColor } from "@/constants/color-palet"; +import { + apiAdminMasterDonationCategoryById, + apiAdminMasterDonationCategoryUpdate, +} from "@/service/api-admin/api-master-admin"; import { useLocalSearchParams, useRouter } from "expo-router"; -import { useState } from "react"; +import { useCallback, useEffect, useState } from "react"; +import { Switch } from "react-native-paper"; export default function AdminDonationCategoryUpdate() { + const router = useRouter(); const { id } = useLocalSearchParams(); const [value, setValue] = useState(id); - const router = useRouter(); + const [data, setData] = useState(null); + const [isLoading, setIsLoading] = useState(false); + + useEffect(() => { + const fetchData = async () => { + const response = await apiAdminMasterDonationCategoryById({ + id: id as any, + }); + console.log(JSON.stringify(response.data, null, 2)); + + setData(response.data); + }; + fetchData(); + }, [id]); + + const handlerSubmit = async () => { + try { + setIsLoading(true); + const response = await apiAdminMasterDonationCategoryUpdate({ + id: id as any, + data: data, + }); + console.log(JSON.stringify(response.data, null, 2)); + router.back(); + } catch (error) { + console.log(error); + } finally { + setIsLoading(false); + } + }; + const buttonSubmit = ( - router.back()}>Update + { + AlertDefaultSystem({ + title: "Update Data", + message: "Apakah anda yakin ingin mengupdate data ini?", + textLeft: "Batal", + textRight: "Ya", + onPressLeft: () => {}, + onPressRight: () => handlerSubmit(), + }); + }} + > + Update + ); return ( @@ -25,10 +80,28 @@ export default function AdminDonationCategoryUpdate() { footerComponent={buttonSubmit} > setData({ ...data, name: value })} /> + + Status + + setData({ ...data, active: value })} + /> + ); diff --git a/app/(application)/admin/donation/category.tsx b/app/(application)/admin/donation/category.tsx index 20f7cf4..b9237f9 100644 --- a/app/(application)/admin/donation/category.tsx +++ b/app/(application)/admin/donation/category.tsx @@ -1,11 +1,15 @@ import { - ActionIcon, - BaseBox, - CenterCustom, - Spacing, - StackCustom, - TextCustom, - ViewWrapper, + ActionIcon, + BadgeCustom, + BaseBox, + CenterCustom, + ClickableCustom, + DividerCustom, + Grid, + Spacing, + StackCustom, + TextCustom, + ViewWrapper, } from "@/components"; import { IconEdit } from "@/components/_Icon"; import AdminActionIconPlus from "@/components/_ShareComponent/Admin/ActionIconPlus"; @@ -14,14 +18,56 @@ import AdminTitlePage from "@/components/_ShareComponent/Admin/TitlePage"; import { GridView_3_3_6 } from "@/components/_ShareComponent/GridView_3_3_6"; import { MainColor } from "@/constants/color-palet"; import { ICON_SIZE_BUTTON } from "@/constants/constans-value"; -import { View } from "react-native"; +import { RefreshControl, View } from "react-native"; import { Divider, Switch } from "react-native-paper"; -import { router } from "expo-router"; +import { router, useFocusEffect } from "expo-router"; +import { useCallback, useEffect, useState } from "react"; +import { apiAdminMasterDonationCategory } from "@/service/api-admin/api-master-admin"; +import { GridDetail_4_8 } from "@/components/_ShareComponent/GridDetail_4_8"; +import GridTwoView from "@/components/_ShareComponent/GridTwoView"; export default function AdminDonationCategory() { + const [listData, setListData] = useState([]); + const [refreshing, setRefreshing] = useState(false); + const [loading, setLoading] = useState(false); + + useFocusEffect( + useCallback(() => { + fetchMaster(); + }, []) + ); + + const fetchMaster = async () => { + try { + setLoading(true); + const response = await apiAdminMasterDonationCategory(); + if (response.success) { + console.log(JSON.stringify(response.data, null, 2)); + setListData(response.data); + } else { + setListData([]); + } + } catch (error) { + console.log("[Error]", error); + } finally { + setLoading(false); + } + }; + + const onRefresh = async () => { + setRefreshing(true); + await fetchMaster(); + setRefreshing(false); + }; + return ( <> - }> + + } + headerComponent={} + > - - - Aksi - - } - component2={Status} - component3={Kategori} - /> + + + + Status + + + Kategori + + + {listData.map((item, index) => ( - - { + router.push(`/admin/donation/category-update?id=${item.id}`); + }} + key={index} + > + + - - } - onPress={() => { - router.push(`/admin/donation/category-update?id=${index}`); - }} - /> + + {item.active ? "Aktif" : "Tidak Aktif"} + - } - component2={ - { - console.log(item); - }} - color={MainColor.yellow} - - /> - } - component3={{item.label}} - /> - + + + {item.name} + + - + ))} - + ); } - -const listData = [ - { - label: "Kegiatan Sosial", - value: "kegiatan_sosial", - }, - { - label: "Pendidikan", - value: "pendidikan", - }, - { - label: "Kesehatan", - value: "kesehatan", - }, - { - label: "Kebudayaan", - value: "kebudayaan", - }, - { - label: "Bencana Alami", - value: "bencana_alami", - }, - { - label: "Lainnya", - value: "lainnya", - }, -]; diff --git a/components/_ShareComponent/Admin/TableValue.tsx b/components/_ShareComponent/Admin/TableValue.tsx index e16851b..d71c764 100644 --- a/components/_ShareComponent/Admin/TableValue.tsx +++ b/components/_ShareComponent/Admin/TableValue.tsx @@ -1,17 +1,23 @@ import Grid from "@/components/Grid/GridCustom"; import React from "react"; -import { View } from "react-native"; +import { StyleProp, View, ViewStyle } from "react-native"; import { Divider } from "react-native-paper"; export default function AdminTableValue({ value1, value2, value3, + style1, + style2, + style3, bottomLine = false, }: { value1: React.ReactNode; value2: React.ReactNode; value3: React.ReactNode; + style1?: ViewStyle; + style2?: ViewStyle; + style3?: ViewStyle; bottomLine?: boolean; }) { return ( @@ -25,6 +31,7 @@ export default function AdminTableValue({ justifyContent: "center", paddingLeft: 10, paddingRight: 10, + ...style1, }} > {value1} @@ -36,6 +43,7 @@ export default function AdminTableValue({ justifyContent: "center", paddingLeft: 10, paddingRight: 10, + ...style2, }} > {value2} @@ -44,9 +52,10 @@ export default function AdminTableValue({ span={6} style={{ justifyContent: "center", - alignItems: "center", + alignItems: "flex-start", paddingLeft: 10, paddingRight: 10, + ...style3, }} > {value3} diff --git a/screens/Authentication/LoginView.tsx b/screens/Authentication/LoginView.tsx index c80833d..3aa2fff 100644 --- a/screens/Authentication/LoginView.tsx +++ b/screens/Authentication/LoginView.tsx @@ -134,10 +134,10 @@ export default function LoginView() { if (token && token !== "" && isAdmin) { // Akan di aktifkan jika sudah losos review - // return ; + return ; // Sementara gunakan ini - return ; + // return ; } return ( diff --git a/service/api-admin/api-master-admin.ts b/service/api-admin/api-master-admin.ts index 5d3e312..4932dbf 100644 --- a/service/api-admin/api-master-admin.ts +++ b/service/api-admin/api-master-admin.ts @@ -167,3 +167,56 @@ export async function apiAdminMasterTypeOfEventUpdate({ } // ================== END EVENT ================== // + +// ================== START DONATION ================== // + +export async function apiAdminMasterDonationCategory() { + try { + const response = await apiConfig.get(`/mobile/admin/master/donation`); + return response.data; + } catch (error) { + throw error; + } +} + +export async function apiAdminMasterDonationCategoryById({ id }: { id: string }) { + try { + const response = await apiConfig.get(`/mobile/admin/master/donation/${id}`); + return response.data; + } catch (error) { + throw error; + } +} + +export async function apiAdminMasterDonationCategoryUpdate({ + id, + data, +}: { + id: string; + data: any; +}) { + try { + const response = await apiConfig.put( + `/mobile/admin/master/donation/${id}`, + { + data: data, + } + ); + return response.data; + } catch (error) { + throw error; + } +} + +export async function apiAdminMasterDonationCategoryCreate({ data }: { data: any }) { + try { + const response = await apiConfig.post(`/mobile/admin/master/donation`, { + data: data, + }); + return response.data; + } catch (error) { + throw error; + } +} + +// ================== END DONATION ================== // \ No newline at end of file From ab5733f336eb4a8d7cf0f4eaea2e8cf1c6e40c39 Mon Sep 17 00:00:00 2001 From: bagasbanuna Date: Thu, 4 Dec 2025 17:41:19 +0800 Subject: [PATCH 13/21] Fix redirect admin --- screens/Authentication/LoginView.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/screens/Authentication/LoginView.tsx b/screens/Authentication/LoginView.tsx index 3aa2fff..c80833d 100644 --- a/screens/Authentication/LoginView.tsx +++ b/screens/Authentication/LoginView.tsx @@ -134,10 +134,10 @@ export default function LoginView() { if (token && token !== "" && isAdmin) { // Akan di aktifkan jika sudah losos review - return ; + // return ; // Sementara gunakan ini - // return ; + return ; } return ( From 2446e9d51ad7f869a11b32b916874a57ff7cb978 Mon Sep 17 00:00:00 2001 From: bagasbanuna Date: Fri, 5 Dec 2025 11:46:36 +0800 Subject: [PATCH 14/21] Fix apple reject EULA Add: components/Alert/AlertWarning.ts utils/badWordsIndonesia.ts Fix: - app.config.js - app/(application)/(user)/forum/[id]/edit.tsx - app/(application)/(user)/forum/[id]/index.tsx - app/(application)/(user)/forum/create.tsx - ios/HIPMIBadungConnect/Info.plist ### No Issue --- app.config.js | 2 +- app/(application)/(user)/forum/[id]/edit.tsx | 9 ++ app/(application)/(user)/forum/[id]/index.tsx | 9 +- app/(application)/(user)/forum/create.tsx | 12 +- components/Alert/AlertWarning.ts | 16 +++ ios/HIPMIBadungConnect/Info.plist | 2 +- utils/badWordsIndonesia.ts | 108 ++++++++++++++++++ 7 files changed, 153 insertions(+), 5 deletions(-) create mode 100644 components/Alert/AlertWarning.ts create mode 100644 utils/badWordsIndonesia.ts diff --git a/app.config.js b/app.config.js index f8becda..765e4b3 100644 --- a/app.config.js +++ b/app.config.js @@ -19,7 +19,7 @@ export default { "NSLocationWhenInUseUsageDescription": "Aplikasi membutuhkan akses lokasi untuk menampilkan peta.", }, associatedDomains: ["applinks:cld-dkr-staging-hipmi.wibudev.com"], - buildNumber: "12", + buildNumber: "13", }, android: { diff --git a/app/(application)/(user)/forum/[id]/edit.tsx b/app/(application)/(user)/forum/[id]/edit.tsx index 096ab5c..50da5f5 100644 --- a/app/(application)/(user)/forum/[id]/edit.tsx +++ b/app/(application)/(user)/forum/[id]/edit.tsx @@ -5,9 +5,12 @@ import { TextAreaCustom, ViewWrapper, } from "@/components"; +import AlertWarning from "@/components/Alert/AlertWarning"; import { apiForumGetOne, apiForumUpdate } from "@/service/api-client/api-forum"; +import { isBadContent } from "@/utils/badWordsIndonesia"; import { router, useFocusEffect, useLocalSearchParams } from "expo-router"; import { useCallback, useState } from "react"; +import { Alert } from "react-native"; import Toast from "react-native-toast-message"; export default function ForumEdit() { @@ -43,6 +46,12 @@ export default function ForumEdit() { }); return; } + + if (isBadContent(text)) { + AlertWarning({}); + return; + } + try { setIsLoading(true); const response = await apiForumUpdate({ diff --git a/app/(application)/(user)/forum/[id]/index.tsx b/app/(application)/(user)/forum/[id]/index.tsx index 1759e6d..3b10343 100644 --- a/app/(application)/(user)/forum/[id]/index.tsx +++ b/app/(application)/(user)/forum/[id]/index.tsx @@ -7,6 +7,7 @@ import { TextCustom, ViewWrapper, } from "@/components"; +import AlertWarning from "@/components/Alert/AlertWarning"; import { useAuth } from "@/hooks/use-auth"; import Forum_CommentarBoxSection from "@/screens/Forum/CommentarBoxSection"; import Forum_BoxDetailSection from "@/screens/Forum/DiscussionBoxSection"; @@ -18,9 +19,11 @@ import { apiForumGetOne, apiForumUpdateStatus, } from "@/service/api-client/api-forum"; +import { isBadContent } from "@/utils/badWordsIndonesia"; import { useFocusEffect, useLocalSearchParams } from "expo-router"; import _ from "lodash"; import { useCallback, useEffect, useState } from "react"; +import { Alert } from "react-native"; interface CommentProps { id: string; @@ -110,11 +113,15 @@ export default function ForumDetail() { // Create Commentar const handlerCreateCommentar = async () => { + if (isBadContent(text)) { + AlertWarning({}); + return; + } + const newData = { comment: text, authorId: user?.id, }; - try { setLoadingComment(true); const response = await apiForumCreateComment({ diff --git a/app/(application)/(user)/forum/create.tsx b/app/(application)/(user)/forum/create.tsx index 07396e1..8599bbf 100644 --- a/app/(application)/(user)/forum/create.tsx +++ b/app/(application)/(user)/forum/create.tsx @@ -2,12 +2,15 @@ import { BoxButtonOnFooter, ButtonCustom, TextAreaCustom, - ViewWrapper, + ViewWrapper } from "@/components"; +import AlertWarning from "@/components/Alert/AlertWarning"; import { useAuth } from "@/hooks/use-auth"; import { apiForumCreate } from "@/service/api-client/api-forum"; +import { isBadContent } from "@/utils/badWordsIndonesia"; import { router } from "expo-router"; import { useState } from "react"; +import { Alert } from "react-native"; import Toast from "react-native-toast-message"; export default function ForumCreate() { @@ -16,11 +19,16 @@ export default function ForumCreate() { const [isLoading, setIsLoading] = useState(false); const handlerSubmit = async () => { + + if (isBadContent(text)) { + AlertWarning({}) + return; + } + const newData = { diskusi: text, authorId: user?.id, }; - try { setIsLoading(true); const response = await apiForumCreate({ data: newData }); diff --git a/components/Alert/AlertWarning.ts b/components/Alert/AlertWarning.ts new file mode 100644 index 0000000..f619aa7 --- /dev/null +++ b/components/Alert/AlertWarning.ts @@ -0,0 +1,16 @@ +import { Alert } from "react-native"; + +export default function AlertWarning({ + title = "Peringatan Bagi Pengguna !", + description = "Konten yang Anda masukkan mengandung kata-kata yang tidak sesuai dengan pedoman komunitas kami. Mohon gunakan bahasa yang sopan dan menghargai sesama pengguna. Jika kata tersebut sebenarnya lumrah, mohon maaf—kemungkinan sistem kami belum mengenalnya sebagai wajar.", +}: { + title?: string + description?: string; +}) { + return Alert.alert(title, description, [ + { + text: "Tutup", + onPress: () => {}, + }, + ]); +} diff --git a/ios/HIPMIBadungConnect/Info.plist b/ios/HIPMIBadungConnect/Info.plist index fa0d347..c092a48 100644 --- a/ios/HIPMIBadungConnect/Info.plist +++ b/ios/HIPMIBadungConnect/Info.plist @@ -39,7 +39,7 @@ CFBundleVersion - 12 + 13 ITSAppUsesNonExemptEncryption LSMinimumSystemVersion diff --git a/utils/badWordsIndonesia.ts b/utils/badWordsIndonesia.ts new file mode 100644 index 0000000..82b60c1 --- /dev/null +++ b/utils/badWordsIndonesia.ts @@ -0,0 +1,108 @@ +// badWordsIndonesia.js (Versi Lengkap) + +const badWordsIndonesia = [ + // 🐶 Kata Kasar & Vulgar + 'anjing', 'babi', 'bangsat', 'bodoh', 'goblok', 'idiot', 'jancok', 'jembut', 'kampret', + 'kontol', 'memek', 'ngentot', 'peler', 'puki', 'sialan', 'tai', 'tolol', 'wibu', + 'anjingg', 'babbii', 'bangsaat', 'gobllokk', 'jancokk', 'kontoll', 'memekk', 'ngentott', + 'pelerr', 'puuki', 'sialann', 'taii', 'tololl', 'wibuu', + + // 🔥 Kata Sindiran & Penghinaan + 'bego', 'dungu', 'edan', 'gila', 'goblog', 'kampang', 'kampret', 'keparat', 'lonte', + 'main mata', 'monyet', 'najis', 'ngeyel', 'ngibul', 'ngomong seenaknya', 'ngurangin', + 'ngutang', 'ngurusin urusan orang', 'pemalas', 'pengecut', 'penipu', 'sinting', + 'begoo', 'dunguu', 'goblogg', 'kampangg', 'keparatt', 'lontee', 'monyyet', 'najiss', + 'ngeyell', 'ngibull', 'ngomongg seenaknya', 'nguranginn', 'ngutangg', 'pemalass', + 'pengecutt', 'penipuu', 'sintting', + + // ⚖️ Kata SARA & Diskriminasi + 'cina', 'kafir', 'kampungan', 'kacung', 'mampus', 'menghina', 'racist', 'sara', + 'setan', 'syiah', 'waria', 'wong jowo', 'wong sunda', 'wong madura', + 'chinna', 'kafiir', 'kampungann', 'kacungg', 'mampuss', 'menghinna', 'racisst', + 'saraa', 'setann', 'syiahh', 'wariia', 'wong jowoo', 'wong sundaa', 'wong maduraa', + + // 💸 Kata Spam / Promosi Ilegal + 'judi', 'togel', 'slot', 'casino', 'poker', 'qq', 'bandar', 'agen', 'link', 'wa', + 'whatsapp', 'telepon', 'nomor', 'hp', 'sms', 'grup', 'join', 'daftar', 'bonus', + 'deposit', 'withdraw', 'uang', 'duit', 'rp', 'ratusan', 'juta', 'milyar', + 'judii', 'togell', 'slotss', 'casinoo', 'pokerr', 'qqq', 'bandarr', 'agenn', 'linkk', + 'waa', 'whatsappp', 'teleponn', 'nomorr', 'hpp', 'smss', 'grupp', 'jooin', 'daftarr', + 'bonuss', 'depositt', 'withdraww', 'uangs', 'duitt', 'rpp', 'ratusann', 'jutaa', 'milyarr', + + // 🧩 Variasi Penulisan (Bypass Filter) + 'a*njing', 'b*b*i', 'b*ngsat', 'g*blok', 'k*nt*l', 'm*m*k', 'n*g*nt*t', 'p*l*r', + 't*i', 't*l*l', 'j*n*c*k', 'j*m*b*t', 'k*m*p*r*t', 's*i*l*a*n', 'w*b*u', + 'a.n.j.i.n.g', 'b.a.b.i', 'b.a.n.g.s.a.t', 'g.o.b.l.o.k', 'k.o.n.t.o.l', 'm.e.m.e.k', + 'n.g.e.n.t.o.t', 'p.e.l.e.r', 't.a.i', 't.o.l.o.l', 'j.a.n.c.o.k', 'j.e.m.b.u.t', + 'k.a.m.p.r.e.t', 's.i.a.l.a.n', 'w.i.b.u', + + // 📱 Variasi dengan Angka & Simbol + '4nj1ng', 'b4b1', 'b4ngs4t', 'g0bl0k', 'k0nt0l', 'm3m3k', 'ng3nt0t', 'p3l3r', + 't4i', 't0l0l', 'j4nc0k', 'j3mbut', 'k4mpr3t', 's14l4n', 'w1bu', + '4nj1ngg', 'b4b11', 'b4ngs4tt', 'g0bl0kk', 'k0nt0ll', 'm3m3kk', 'ng3nt0tt', + 'p3l3rr', 't4ii', 't0l0ll', 'j4nc0kk', 'j3mbutt', 'k4mpr3tt', 's14l4nn', 'w1buu', + + // 🗣️ Kata yang Sering Digunakan dalam Konteks Negatif + 'dasar', 'kamu', 'kau', 'lu', 'lo', 'gue', 'gua', 'kita', 'kami', 'mereka', + 'dasarr', 'kamuu', 'kauu', 'luu', 'loo', 'guee', 'guua', 'kitaa', 'kamii', 'merekaa', + 'dasar bodoh', 'dasar goblok', 'dasar bangsat', 'dasar idiot', 'dasar sialan', + 'dasar bego', 'dasar dungu', 'dasar edan', 'dasar gila', 'dasar sinting', + 'dasar pemalas', 'dasar pengecut', 'dasar penipu', 'dasar najis', 'dasar kampret', + + // 🚫 Kata yang Mengandung Unsur Seksual + 'porno', 'seks', 'mesum', 'bugil', 'telanjang', 'payudara', 'pantat', 'vagina', 'penis', + 'pornoo', 'sekss', 'mesumm', 'bugill', 'telanjangg', 'payudaraa', 'pantatt', 'vaginna', + 'peniss', 'pornoografi', 'pornografi', 'porno graf i', 'seksual', 'seksualitas', + 'pornoograffii', 'pornografffii', 'porno graf ii', 'seksuall', 'seksualitass', + + // 🤬 Kata Kasar dari Bahasa Daerah (Sunda, Jawa, dll) + 'kampret', 'kacung', 'mampus', 'sialan', 'bangsat', 'goblok', 'bodoh', 'tolol', + 'kamprett', 'kacungg', 'mampuss', 'sialann', 'bangsaatt', 'gobllokk', 'bodooh', 'tololl', + 'kampret sunda', 'kacung jawa', 'mampus batak', 'sialan minang', 'bangsat lampung', + 'goblok palembang', 'bodoh medan', 'tolol makassar', + + // 📉 Kata yang Sering Digunakan untuk Menjelekkan Orang +// 'jelek', 'buruk', 'tidak pantas', 'tidak sopan', 'tidak beretika', 'tidak beradab', +// 'jelekk', 'burukk', 'tidak pantass', 'tidak sopann', 'tidak beretikaa', 'tidak beradabb', +// 'jelek banget', 'buruk banget', 'tidak pantas banget', 'tidak sopan banget', +// 'tidak beretika banget', 'tidak beradab banget', + + // 🛑 Kata yang Sering Digunakan untuk Menyebarkan Hoax +// 'hoax', 'bohong', 'palsu', 'tipu', 'menipu', 'menyesatkan', 'menjerumuskan', +// 'hoaxx', 'bohongg', 'palsuu', 'tipuu', 'menipuu', 'menyesatkanng', 'menjerumuskanng', +// 'hoax besar', 'bohong besar', 'palsu besar', 'tipu besar', 'menipu besar', +// 'menyesatkan besar', 'menjerumuskan besar' +]; + +// Normalisasi teks +const normalizeText = (text: string) => { + return text.toLowerCase().replace(/\s+/g, ' ').trim(); +}; + +// Cek apakah teks mengandung kata buruk +const isBadContent = (text: string) => { + const normalized = normalizeText(text); + for (let word of badWordsIndonesia) { + if (normalized.includes(word)) { + return true; + } + } + return false; +}; + +// Saring teks (ganti dengan asterisk) +const censorText = (text: string) => { + let result = text; + for (let word of badWordsIndonesia) { + const regex = new RegExp(word.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'gi'); + result = result.replace(regex, '*'.repeat(word.length)); + } + return result; +}; + +export { + badWordsIndonesia, + isBadContent, + censorText, + normalizeText +}; \ No newline at end of file From 624bd49f694d71c56acfdd67a6a38b6f09d4a00c Mon Sep 17 00:00:00 2001 From: bagasbanuna Date: Fri, 5 Dec 2025 17:20:39 +0800 Subject: [PATCH 15/21] QC Admin ( Inno ) Fix: modified: android/app/build.gradle modified: app.config.js modified: app/(application)/admin/donation/[id]/[status]/index.tsx modified: app/(application)/admin/donation/[id]/[status]/transaction-detail.tsx modified: app/(application)/admin/donation/[id]/detail-disbursement-of-funds.tsx modified: app/(application)/admin/donation/category.tsx modified: app/(application)/admin/event/[id]/[status]/index.tsx modified: app/(application)/admin/event/[id]/list-of-participants.tsx modified: app/(application)/admin/event/[status]/status.tsx modified: app/(application)/admin/forum/[id]/index.tsx modified: app/(application)/admin/forum/[id]/list-report-comment.tsx modified: app/(application)/admin/forum/[id]/list-report-posting.tsx modified: app/(application)/admin/investment/[id]/[status]/index.tsx modified: app/(application)/admin/investment/[id]/[status]/transaction-detail.tsx modified: app/(application)/admin/voting/[id]/[status]/index.tsx modified: components/DateInput/DateTimeIOS.tsx modified: components/_ShareComponent/Admin/ButtonReject.tsx deleted: components/_ShareComponent/GridDetail_4_8.tsx Add:/ components/_ShareComponent/GridSpan_4_8.tsx ### No Issue --- android/app/build.gradle | 2 +- app.config.js | 2 +- .../admin/donation/[id]/[status]/index.tsx | 10 +-- .../[id]/[status]/transaction-detail.tsx | 4 +- .../[id]/detail-disbursement-of-funds.tsx | 4 +- app/(application)/admin/donation/category.tsx | 55 ++++++++------ .../admin/event/[id]/[status]/index.tsx | 35 +++++---- .../admin/event/[id]/list-of-participants.tsx | 39 ++++++++-- .../admin/event/[status]/status.tsx | 73 +++++++++++-------- app/(application)/admin/forum/[id]/index.tsx | 4 +- .../admin/forum/[id]/list-report-comment.tsx | 14 ++-- .../admin/forum/[id]/list-report-posting.tsx | 16 ++-- .../admin/investment/[id]/[status]/index.tsx | 12 +-- .../[id]/[status]/transaction-detail.tsx | 4 +- .../admin/voting/[id]/[status]/index.tsx | 22 +++--- components/DateInput/DateTimeIOS.tsx | 50 +++++++++++-- .../_ShareComponent/Admin/ButtonReject.tsx | 2 +- components/_ShareComponent/GridDetail_4_8.tsx | 20 ----- components/_ShareComponent/GridSpan_4_8.tsx | 27 +++++++ 19 files changed, 245 insertions(+), 150 deletions(-) delete mode 100644 components/_ShareComponent/GridDetail_4_8.tsx create mode 100644 components/_ShareComponent/GridSpan_4_8.tsx diff --git a/android/app/build.gradle b/android/app/build.gradle index f672a69..0874adf 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -100,7 +100,7 @@ packagingOptions { applicationId 'com.bip.hipmimobileapp' minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 2 + versionCode 3 versionName "1.0.1" buildConfigField "String", "REACT_NATIVE_RELEASE_LEVEL", "\"${findProperty('reactNativeReleaseLevel') ?: 'stable'}\"" diff --git a/app.config.js b/app.config.js index 765e4b3..65702a1 100644 --- a/app.config.js +++ b/app.config.js @@ -30,7 +30,7 @@ export default { }, edgeToEdgeEnabled: true, package: "com.bip.hipmimobileapp", - versionCode: 2, + versionCode: 3, // softwareKeyboardLayoutMode: 'resize', // option: untuk mengatur keyboard pada room chst collaboration intentFilters: [ { diff --git a/app/(application)/admin/donation/[id]/[status]/index.tsx b/app/(application)/admin/donation/[id]/[status]/index.tsx index 86e4ef0..d866f9b 100644 --- a/app/(application)/admin/donation/[id]/[status]/index.tsx +++ b/app/(application)/admin/donation/[id]/[status]/index.tsx @@ -18,7 +18,7 @@ import { IconDot, IconList } from "@/components/_Icon/IconComponent"; import AdminBackButtonAntTitle from "@/components/_ShareComponent/Admin/BackButtonAntTitle"; import AdminButtonReject from "@/components/_ShareComponent/Admin/ButtonReject"; import AdminButtonReview from "@/components/_ShareComponent/Admin/ButtonReview"; -import { GridDetail_4_8 } from "@/components/_ShareComponent/GridDetail_4_8"; +import { GridSpan_4_8 } from "@/components/_ShareComponent/GridSpan_4_8"; import ReportBox from "@/components/Box/ReportBox"; import { ICON_SIZE_BUTTON, TEXT_SIZE_LARGE } from "@/constants/constans-value"; import AdminDonation_BoxOfDonationStory from "@/screens/Admin/Donation/BoxOfDonationStory"; @@ -195,7 +195,7 @@ export default function AdminDonationDetail() { {listPencarianDana.map((item, i) => ( - {item.label}} value={{item.value}} @@ -236,7 +236,7 @@ export default function AdminDonationDetail() { - Jumlah Donatur} value={ @@ -244,7 +244,7 @@ export default function AdminDonationDetail() { } /> - Dana Terkumpul} value={ @@ -261,7 +261,7 @@ export default function AdminDonationDetail() { {listData.map((item, i) => ( - {item.label}} value={{item.value}} diff --git a/app/(application)/admin/donation/[id]/[status]/transaction-detail.tsx b/app/(application)/admin/donation/[id]/[status]/transaction-detail.tsx index 91e0e46..bf9f3cc 100644 --- a/app/(application)/admin/donation/[id]/[status]/transaction-detail.tsx +++ b/app/(application)/admin/donation/[id]/[status]/transaction-detail.tsx @@ -8,7 +8,7 @@ import { ViewWrapper, } from "@/components"; import AdminBackButtonAntTitle from "@/components/_ShareComponent/Admin/BackButtonAntTitle"; -import { GridDetail_4_8 } from "@/components/_ShareComponent/GridDetail_4_8"; +import { GridSpan_4_8 } from "@/components/_ShareComponent/GridSpan_4_8"; import { apiAdminDonationInvoiceDetailById, apiAdminDonationInvoiceUpdateById, @@ -177,7 +177,7 @@ export default function AdminDonasiTransactionDetail() { {listData.map((item, index) => ( - {item.label}} value={{item.value}} diff --git a/app/(application)/admin/donation/[id]/detail-disbursement-of-funds.tsx b/app/(application)/admin/donation/[id]/detail-disbursement-of-funds.tsx index 4399dfd..10bdd96 100644 --- a/app/(application)/admin/donation/[id]/detail-disbursement-of-funds.tsx +++ b/app/(application)/admin/donation/[id]/detail-disbursement-of-funds.tsx @@ -7,7 +7,7 @@ import { ViewWrapper, } from "@/components"; import AdminBackButtonAntTitle from "@/components/_ShareComponent/Admin/BackButtonAntTitle"; -import { GridDetail_4_8 } from "@/components/_ShareComponent/GridDetail_4_8"; +import { GridSpan_4_8 } from "@/components/_ShareComponent/GridSpan_4_8"; import { apiAdminDonationDisbursementOfFundsListById } from "@/service/api-admin/api-admin-donation"; import { dateTimeView } from "@/utils/dateTimeView"; import { formatCurrencyDisplay } from "@/utils/formatCurrencyDisplay"; @@ -67,7 +67,7 @@ export default function AdminDonationDetailDisbursementOfFunds() { {listData?.map((item, index) => ( - {item.label}} value={{item.value}} diff --git a/app/(application)/admin/donation/category.tsx b/app/(application)/admin/donation/category.tsx index b9237f9..ec2e69f 100644 --- a/app/(application)/admin/donation/category.tsx +++ b/app/(application)/admin/donation/category.tsx @@ -1,30 +1,22 @@ import { - ActionIcon, BadgeCustom, - BaseBox, CenterCustom, ClickableCustom, - DividerCustom, - Grid, Spacing, StackCustom, TextCustom, - ViewWrapper, + ViewWrapper } from "@/components"; -import { IconEdit } from "@/components/_Icon"; import AdminActionIconPlus from "@/components/_ShareComponent/Admin/ActionIconPlus"; import AdminComp_BoxTitle from "@/components/_ShareComponent/Admin/BoxTitlePage"; import AdminTitlePage from "@/components/_ShareComponent/Admin/TitlePage"; -import { GridView_3_3_6 } from "@/components/_ShareComponent/GridView_3_3_6"; -import { MainColor } from "@/constants/color-palet"; -import { ICON_SIZE_BUTTON } from "@/constants/constans-value"; -import { RefreshControl, View } from "react-native"; -import { Divider, Switch } from "react-native-paper"; -import { router, useFocusEffect } from "expo-router"; -import { useCallback, useEffect, useState } from "react"; +import { GridSpan_4_8 } from "@/components/_ShareComponent/GridSpan_4_8"; import { apiAdminMasterDonationCategory } from "@/service/api-admin/api-master-admin"; -import { GridDetail_4_8 } from "@/components/_ShareComponent/GridDetail_4_8"; -import GridTwoView from "@/components/_ShareComponent/GridTwoView"; +import { colorActivationForBadge } from "@/utils/colorActivationForBadge"; +import { router, useFocusEffect } from "expo-router"; +import { useCallback, useState } from "react"; +import { RefreshControl, View } from "react-native"; +import { Divider } from "react-native-paper"; export default function AdminDonationCategory() { const [listData, setListData] = useState([]); @@ -80,14 +72,18 @@ export default function AdminDonationCategory() { /> - - + Status} + value={Kategori} + /> + {/* + Status Kategori - + */} @@ -100,11 +96,22 @@ export default function AdminDonationCategory() { }} key={index} > - - + + + {item.active ? "Aktif" : "Tidak Aktif"} + + + } + value={{item.name}} + /> + {/* + {item.name} - + */} ))} diff --git a/app/(application)/admin/event/[id]/[status]/index.tsx b/app/(application)/admin/event/[id]/[status]/index.tsx index 0025e0f..a0d0c49 100644 --- a/app/(application)/admin/event/[id]/[status]/index.tsx +++ b/app/(application)/admin/event/[id]/[status]/index.tsx @@ -1,22 +1,22 @@ /* eslint-disable react-hooks/exhaustive-deps */ import { - ActionIcon, - AlertDefaultSystem, - BadgeCustom, - BaseBox, - DrawerCustom, - LoaderCustom, - MenuDrawerDynamicGrid, - Spacing, - StackCustom, - TextCustom, - ViewWrapper, + ActionIcon, + AlertDefaultSystem, + BadgeCustom, + BaseBox, + DrawerCustom, + LoaderCustom, + MenuDrawerDynamicGrid, + Spacing, + StackCustom, + TextCustom, + ViewWrapper, } from "@/components"; import { IconDot, IconList } from "@/components/_Icon/IconComponent"; import AdminBackButtonAntTitle from "@/components/_ShareComponent/Admin/BackButtonAntTitle"; import AdminButtonReject from "@/components/_ShareComponent/Admin/ButtonReject"; import AdminButtonReview from "@/components/_ShareComponent/Admin/ButtonReview"; -import { GridDetail_4_8 } from "@/components/_ShareComponent/GridDetail_4_8"; +import { GridSpan_4_8 } from "@/components/_ShareComponent/GridSpan_4_8"; import ReportBox from "@/components/Box/ReportBox"; import { ICON_SIZE_BUTTON } from "@/constants/constans-value"; import { useAuth } from "@/hooks/use-auth"; @@ -39,6 +39,11 @@ export default function AdminEventDetail() { const [data, setData] = React.useState(null); const [loadData, setLoadData] = React.useState(false); const deepLinkURL = `${DEEP_LINK_URL}/event/${id}/confirmation?userId=${user?.id}`; + const deepLinkURLDEV = `${DEEP_LINK_URL}/--/event/${id}/confirmation?userId=${user?.id}`; + + const isDevLink = process.env.NODE_ENV === "development" ? deepLinkURLDEV : deepLinkURL; + + useFocusEffect( useCallback(() => { onLoadData(); @@ -156,7 +161,7 @@ export default function AdminEventDetail() { {listData.map((item, i) => ( - {item.label}} value={{item.value}} @@ -181,7 +186,7 @@ export default function AdminEventDetail() { ) : ( )} - {deepLinkURL} + {isDevLink} )} diff --git a/app/(application)/admin/event/[id]/list-of-participants.tsx b/app/(application)/admin/event/[id]/list-of-participants.tsx index 7e284bd..f8bb439 100644 --- a/app/(application)/admin/event/[id]/list-of-participants.tsx +++ b/app/(application)/admin/event/[id]/list-of-participants.tsx @@ -10,14 +10,17 @@ import { } from "@/components"; import AdminBackButtonAntTitle from "@/components/_ShareComponent/Admin/BackButtonAntTitle"; import { apiAdminEventListOfParticipants } from "@/service/api-admin/api-admin-event"; +import dayjs, { Dayjs } from "dayjs"; import { useFocusEffect, useLocalSearchParams } from "expo-router"; import _ from "lodash"; +import { View } from "moti"; import { useCallback, useState } from "react"; export default function AdminEventListOfParticipants() { const { id } = useLocalSearchParams(); const [listData, setListData] = useState(null); const [loadData, setLoadData] = useState(false); + const [startDate, setStartDate] = useState(); useFocusEffect( useCallback(() => { @@ -32,8 +35,11 @@ export default function AdminEventListOfParticipants() { id: id as string, }); + console.log("[DATA]", JSON.stringify(response, null, 2)); + if (response.success) { setListData(response.data); + setStartDate(dayjs(response.data.Event.tanggal)); } } catch (error) { console.log("[ERROR]", error); @@ -42,7 +48,6 @@ export default function AdminEventListOfParticipants() { } }; - return ( <> - {item?.User?.username} + + {item?.User?.username} + +{item?.User?.nomor} - - {item?.isPresent ? "Hadir" : "Tidak Hadir"} - + {startDate && + startDate.subtract(1, "hour").diff(dayjs()) < 0 ? ( + + {item?.isPresent ? "Hadir" : "Tidak Hadir"} + + ) : ( + + + - + + + )} diff --git a/app/(application)/admin/event/[status]/status.tsx b/app/(application)/admin/event/[status]/status.tsx index 738f91c..74cfe6e 100644 --- a/app/(application)/admin/event/[status]/status.tsx +++ b/app/(application)/admin/event/[status]/status.tsx @@ -1,11 +1,12 @@ /* eslint-disable react-hooks/exhaustive-deps */ import { ActionIcon, + ClickableCustom, LoaderCustom, SearchInput, StackCustom, TextCustom, - ViewWrapper + ViewWrapper, } from "@/components"; import AdminComp_BoxTitle from "@/components/_ShareComponent/Admin/BoxTitlePage"; import AdminTitleTable from "@/components/_ShareComponent/Admin/TableTitle"; @@ -13,6 +14,7 @@ import AdminTableValue from "@/components/_ShareComponent/Admin/TableValue"; import AdminTitlePage from "@/components/_ShareComponent/Admin/TitlePage"; import { ICON_SIZE_BUTTON } from "@/constants/constans-value"; import { apiAdminEvent } from "@/service/api-admin/api-admin-event"; +import { dateTimeView } from "@/utils/dateTimeView"; import { Octicons } from "@expo/vector-icons"; import { router, useFocusEffect, useLocalSearchParams } from "expo-router"; import _ from "lodash"; @@ -74,8 +76,8 @@ export default function AdminEventStatus() { @@ -83,36 +85,47 @@ export default function AdminEventStatus() { {loadData ? ( ) : _.isEmpty(listData) ? ( - Belum ada data + + Belum ada data + ) : ( listData?.map((item, index) => ( - - } - onPress={() => { - router.push(`/admin/event/${item.id}/${status}`); - }} - /> - } - value2={ - - {item?.Author?.username || "-"} - - } - value3={ - - {item?.title || "-"} - - } - /> + onPress={() => { + router.push(`/admin/event/${item.id}/${status}`); + }} + > + + {item?.Author?.username || "-"} + + // + // } + // onPress={() => { + // router.push(`/admin/event/${item.id}/${status}`); + // }} + // /> + } + value2={ + + {dateTimeView({ date: item?.tanggal })} + + } + value3={ + {item?.title || "-"} + } + /> + + )) )} diff --git a/app/(application)/admin/forum/[id]/index.tsx b/app/(application)/admin/forum/[id]/index.tsx index f92388c..d63007a 100644 --- a/app/(application)/admin/forum/[id]/index.tsx +++ b/app/(application)/admin/forum/[id]/index.tsx @@ -11,7 +11,7 @@ import { } from "@/components"; import { IconDot } from "@/components/_Icon/IconComponent"; import AdminBackButtonAntTitle from "@/components/_ShareComponent/Admin/BackButtonAntTitle"; -import { GridDetail_4_8 } from "@/components/_ShareComponent/GridDetail_4_8"; +import { GridSpan_4_8 } from "@/components/_ShareComponent/GridSpan_4_8"; import { MainColor } from "@/constants/color-palet"; import { ICON_SIZE_XLARGE } from "@/constants/constans-value"; import { apiAdminForumPostingById } from "@/service/api-admin/api-admin-forum"; @@ -103,7 +103,7 @@ export default function AdminForumDetailPosting() { {listDataAction.map((item, i) => ( - {item.label}} value={{item.value}} diff --git a/app/(application)/admin/forum/[id]/list-report-comment.tsx b/app/(application)/admin/forum/[id]/list-report-comment.tsx index 1103411..4a4cb30 100644 --- a/app/(application)/admin/forum/[id]/list-report-comment.tsx +++ b/app/(application)/admin/forum/[id]/list-report-comment.tsx @@ -16,7 +16,7 @@ import AdminBackButtonAntTitle from "@/components/_ShareComponent/Admin/BackButt import AdminComp_BoxTitle from "@/components/_ShareComponent/Admin/BoxTitlePage"; import AdminTitleTable from "@/components/_ShareComponent/Admin/TableTitle"; import AdminTableValue from "@/components/_ShareComponent/Admin/TableValue"; -import { GridDetail_4_8 } from "@/components/_ShareComponent/GridDetail_4_8"; +import { GridSpan_4_8 } from "@/components/_ShareComponent/GridSpan_4_8"; import { MainColor } from "@/constants/color-palet"; import { ICON_SIZE_BUTTON } from "@/constants/constans-value"; import { @@ -95,11 +95,11 @@ export default function AdminForumReportComment() { > - Username} value={{data?.Author?.username || "-"}} /> - Komentar} value={{data?.komentar || "-"}} /> @@ -208,20 +208,20 @@ export default function AdminForumReportComment() { height={"auto"} > - Pelapor} value={{selectedReport?.username || "-"}} /> {selectedReport?.kategori && ( <> - Kategori Report} value={ {selectedReport?.kategori || "-"} } /> - Keterangan} value={ {selectedReport?.keterangan || "-"} @@ -231,7 +231,7 @@ export default function AdminForumReportComment() { )} {selectedReport?.deskripsi && ( - Deskripsi} value={ {selectedReport?.deskripsi || "-"} diff --git a/app/(application)/admin/forum/[id]/list-report-posting.tsx b/app/(application)/admin/forum/[id]/list-report-posting.tsx index c806ce3..1d82976 100644 --- a/app/(application)/admin/forum/[id]/list-report-posting.tsx +++ b/app/(application)/admin/forum/[id]/list-report-posting.tsx @@ -17,7 +17,7 @@ import AdminBackButtonAntTitle from "@/components/_ShareComponent/Admin/BackButt import AdminComp_BoxTitle from "@/components/_ShareComponent/Admin/BoxTitlePage"; import AdminTitleTable from "@/components/_ShareComponent/Admin/TableTitle"; import AdminTableValue from "@/components/_ShareComponent/Admin/TableValue"; -import { GridDetail_4_8 } from "@/components/_ShareComponent/GridDetail_4_8"; +import { GridSpan_4_8 } from "@/components/_ShareComponent/GridSpan_4_8"; import { MainColor } from "@/constants/color-palet"; import { ICON_SIZE_BUTTON } from "@/constants/constans-value"; import { @@ -95,12 +95,12 @@ export default function AdminForumReportPosting() { > - Username} value={{data?.Author?.username || "-"}} /> - Status} value={ data && data?.ForumMaster_StatusPosting?.status ? ( @@ -121,7 +121,7 @@ export default function AdminForumReportPosting() { } /> - Postingan} value={{data?.diskusi || "-"}} /> @@ -229,20 +229,20 @@ export default function AdminForumReportPosting() { height={"auto"} > - Pelapor} value={{selectedReport?.username || "-"}} /> {selectedReport?.kategori && ( <> - Kategori Report} value={ {selectedReport?.kategori || "-"} } /> - Keterangan} value={ {selectedReport?.keterangan || "-"} @@ -252,7 +252,7 @@ export default function AdminForumReportPosting() { )} {selectedReport?.deskripsi && ( - Deskripsi} value={ {selectedReport?.deskripsi || "-"} diff --git a/app/(application)/admin/investment/[id]/[status]/index.tsx b/app/(application)/admin/investment/[id]/[status]/index.tsx index f265b28..a3dff44 100644 --- a/app/(application)/admin/investment/[id]/[status]/index.tsx +++ b/app/(application)/admin/investment/[id]/[status]/index.tsx @@ -19,7 +19,7 @@ import { IconDot, IconList } from "@/components/_Icon/IconComponent"; import AdminBackButtonAntTitle from "@/components/_ShareComponent/Admin/BackButtonAntTitle"; import AdminButtonReject from "@/components/_ShareComponent/Admin/ButtonReject"; import AdminButtonReview from "@/components/_ShareComponent/Admin/ButtonReview"; -import { GridDetail_4_8 } from "@/components/_ShareComponent/GridDetail_4_8"; +import { GridSpan_4_8 } from "@/components/_ShareComponent/GridSpan_4_8"; import ReportBox from "@/components/Box/ReportBox"; import { MainColor } from "@/constants/color-palet"; import { ICON_SIZE_BUTTON } from "@/constants/constans-value"; @@ -183,7 +183,7 @@ export default function AdminInvestmentDetail() { /> - Sisa Saham} value={ @@ -191,7 +191,7 @@ export default function AdminInvestmentDetail() { } /> - Validasi Transaksi} value={ @@ -207,7 +207,7 @@ export default function AdminInvestmentDetail() { {listData.map((item, i) => ( - {item.label}} value={{item.value}} @@ -218,7 +218,7 @@ export default function AdminInvestmentDetail() { - File Prospektus} value={ } /> - File Dokumen} value={ diff --git a/app/(application)/admin/investment/[id]/[status]/transaction-detail.tsx b/app/(application)/admin/investment/[id]/[status]/transaction-detail.tsx index f8cb183..6bab71c 100644 --- a/app/(application)/admin/investment/[id]/[status]/transaction-detail.tsx +++ b/app/(application)/admin/investment/[id]/[status]/transaction-detail.tsx @@ -10,7 +10,7 @@ import { ViewWrapper, } from "@/components"; import AdminBackButtonAntTitle from "@/components/_ShareComponent/Admin/BackButtonAntTitle"; -import { GridDetail_4_8 } from "@/components/_ShareComponent/GridDetail_4_8"; +import { GridSpan_4_8 } from "@/components/_ShareComponent/GridSpan_4_8"; import GridTwoView from "@/components/_ShareComponent/GridTwoView"; import { MainColor } from "@/constants/color-palet"; import { @@ -225,7 +225,7 @@ export default function AdminInvestmentTransactionDetail() { {listData.map((item, index) => ( - {item.label}} value={{item.value}} diff --git a/app/(application)/admin/voting/[id]/[status]/index.tsx b/app/(application)/admin/voting/[id]/[status]/index.tsx index 97dd581..ae99746 100644 --- a/app/(application)/admin/voting/[id]/[status]/index.tsx +++ b/app/(application)/admin/voting/[id]/[status]/index.tsx @@ -1,19 +1,19 @@ /* eslint-disable react-hooks/exhaustive-deps */ import { - AlertDefaultSystem, - BadgeCustom, - BaseBox, - CircleContainer, - Grid, - Spacing, - StackCustom, - TextCustom, - ViewWrapper, + AlertDefaultSystem, + BadgeCustom, + BaseBox, + CircleContainer, + Grid, + Spacing, + StackCustom, + TextCustom, + ViewWrapper, } from "@/components"; import AdminBackButtonAntTitle from "@/components/_ShareComponent/Admin/BackButtonAntTitle"; import AdminButtonReject from "@/components/_ShareComponent/Admin/ButtonReject"; import AdminButtonReview from "@/components/_ShareComponent/Admin/ButtonReview"; -import { GridDetail_4_8 } from "@/components/_ShareComponent/GridDetail_4_8"; +import { GridSpan_4_8 } from "@/components/_ShareComponent/GridSpan_4_8"; import ReportBox from "@/components/Box/ReportBox"; import { MainColor } from "@/constants/color-palet"; import funUpdateStatusVoting from "@/screens/Admin/Voting/funUpdateStatus"; @@ -169,7 +169,7 @@ export default function AdminVotingDetail() { {listData.map((item, i) => ( - {item.label}} value={{item.value}} diff --git a/components/DateInput/DateTimeIOS.tsx b/components/DateInput/DateTimeIOS.tsx index 3fb4c96..54c06d7 100644 --- a/components/DateInput/DateTimeIOS.tsx +++ b/components/DateInput/DateTimeIOS.tsx @@ -7,7 +7,7 @@ import DateTimePicker, { } from "@react-native-community/datetimepicker"; import dayjs from "dayjs"; import React, { useState } from "react"; -import { StyleProp, Text, View, ViewStyle } from "react-native"; +import { Button, StyleProp, Text, View, ViewStyle } from "react-native"; import ClickableCustom from "../Clickable/ClickableCustom"; import TextCustom from "../Text/TextCustom"; @@ -129,24 +129,64 @@ const DateTimeInput_IOS: React.FC = ({ borderWidth: 1, }} > - + {/* setShow(false)} + onPress={() => { + setShow(false); + setSelectedDate(undefined); + }} /> - + */} + + { + setShow(false) + setSelectedDate(undefined) + }} + style={{ + alignItems: "center", + justifyContent: "center", + padding: 12, + borderRadius: 10, + backgroundColor: MainColor.placeholder, + marginTop: 10, + width: "48%", + }} + > + Batal + + + { + setShow(false) + onChange(selectedDate as any) + }} + style={{ + alignItems: "center", + justifyContent: "center", + padding: 12, + borderRadius: 10, + backgroundColor: MainColor.darkblue, + marginTop: 10, + width: "48%", + }} + > + OK + + )} diff --git a/components/_ShareComponent/Admin/ButtonReject.tsx b/components/_ShareComponent/Admin/ButtonReject.tsx index c56e1fd..72dd91e 100644 --- a/components/_ShareComponent/Admin/ButtonReject.tsx +++ b/components/_ShareComponent/Admin/ButtonReject.tsx @@ -15,7 +15,7 @@ export default function AdminButtonReject({ <> } - backgroundColor={MainColor.red} + backgroundColor={MainColor.orange} textColor="white" onPress={onReject} isLoading={isLoading} diff --git a/components/_ShareComponent/GridDetail_4_8.tsx b/components/_ShareComponent/GridDetail_4_8.tsx deleted file mode 100644 index 2ce5b1e..0000000 --- a/components/_ShareComponent/GridDetail_4_8.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import { Grid } from "@/components"; - -export const GridDetail_4_8 = ({ - label, - value, -}: { - label: React.ReactNode; - value: React.ReactNode; -}) => { - return ( - - - {label} - - - {value} - - - ); -}; \ No newline at end of file diff --git a/components/_ShareComponent/GridSpan_4_8.tsx b/components/_ShareComponent/GridSpan_4_8.tsx new file mode 100644 index 0000000..d2721e6 --- /dev/null +++ b/components/_ShareComponent/GridSpan_4_8.tsx @@ -0,0 +1,27 @@ +import { Grid } from "@/components"; + +export const GridSpan_4_8 = ({ + label, + value, +}: { + label: React.ReactNode; + value: React.ReactNode; +}) => { + return ( + + + {label} + + + {value} + + + ); +}; From 0f5862ce701c10b0180ea255c3900c62335ae877 Mon Sep 17 00:00:00 2001 From: bagasbanuna Date: Mon, 8 Dec 2025 16:34:33 +0800 Subject: [PATCH 16/21] Fix Apple Reject: Add: - app/(application)/(user)/forum/terms.tsx Fix: - app/(application)/(user)/_layout.tsx - app/(application)/(user)/home.tsx - screens/Home/tabsList.ts - service/api-client/api-user.ts ### No Issue --- app/(application)/(user)/_layout.tsx | 7 + app/(application)/(user)/forum/terms.tsx | 202 +++++++++++++++++++++++ app/(application)/(user)/home.tsx | 53 ++++-- screens/Home/tabsList.ts | 4 +- service/api-client/api-user.ts | 10 ++ 5 files changed, 256 insertions(+), 20 deletions(-) create mode 100644 app/(application)/(user)/forum/terms.tsx diff --git a/app/(application)/(user)/_layout.tsx b/app/(application)/(user)/_layout.tsx index b55638e..d567847 100644 --- a/app/(application)/(user)/_layout.tsx +++ b/app/(application)/(user)/_layout.tsx @@ -595,6 +595,13 @@ export default function UserLayout() { headerLeft: () => , }} /> + , + }} + /> {/* ========== Maps Section ========= */} { + try { + setLoading(true); + const respone = await apiAcceptForumTerms({ + category: "Forum", + userId: user?.id as any, + }); + + if (respone.success) { + Toast.show({ + type: "success", + text1: "Berhasil", + text2: "Terima kasih telah menerima syarat & ketentuan forum ini", + }); + + router.replace("/(application)/forum"); + + return; + } + + Toast.show({ + type: "error", + text1: "Gagal", + text2: "Terjadi kesalahan, silahkan coba lagi", + }); + } catch (error) { + console.log("[ERROR]", error); + } finally { + setLoading(false); + } + }; + + return ( + + {/* HIPMI Badung Connect . */} + + + + + Dengan mengakses dan menggunakan Forum HIPMI Badung Connect, Anda + secara sadar menyetujui ketentuan berikut: + + + + 1. Dilarang keras memposting konten yang mengandung: + + + {forumTerms1.map((term, index) => ( + + + {term.text} + + ))} + + + + 2. Setiap pengguna bertanggung jawab penuh atas konten yang + diunggah. Konten yang melanggar ketentuan ini dapat dihapus kapan + saja tanpa pemberitahuan. + + + + 3. Jika Anda menemukan konten tidak pantas, segera: + + + {forumTerms2.map((term, index) => ( + + + {term.text} + + ))} + + + + 4. Gunakan fitur “Blokir Pengguna” di profil pengguna terkait + + + {forumTerms3.map((term, index) => ( + + + {term.text} + + ))} + + + + Pelanggaran terhadap ketentuan ini berakibat{" "} + pencabutan akses ke Forum dan/atau{" "} + pemblokiran akun secara permanen tanpa + pemberitahuan lebih lanjut. + + + + setTerm(!term)} /> + + + Saya telah membaca dan menyetujui Syarat & Ketentuan Forum ini + + + + { + handleSubmit(); + }} + > + Lanjut + + + + + ); +} + +// Data dalam format JSON (bisa juga diimpor dari file terpisah) +interface Term { + text: string; +} + +const forumTerms1: Term[] = [ + { + text: "Ujaran kebencian, diskriminasi, atau konten SARA (Suku, Agama, Ras, Antar-golongan)", + }, + { text: "Kata kasar, pelecehan, ancaman, atau bullying" }, + { text: "Pornografi, hoaks, spam, atau informasi menyesatkan" }, + { text: "Promosi aktivitas ilegal seperti perjudian atau narkoba" }, +]; + +const forumTerms2: Term[] = [ + { + text: "Gunakan tombol “Laporkan” di setiap postingan, atau", + }, + { + text: "Gunakan fitur “Blokir Pengguna” di profil pengguna terkait.", + }, +]; + +const forumTerms3: Term[] = [ + { + text: "Meninjau setiap laporan dalam waktu 24 jam", + }, + { + text: "Menghapus konten yang melanggar", + }, + { + text: "Memblokir akun pelanggar sesuai tingkat pelanggaran", + }, +]; diff --git a/app/(application)/(user)/home.tsx b/app/(application)/(user)/home.tsx index 28c45f7..645280a 100644 --- a/app/(application)/(user)/home.tsx +++ b/app/(application)/(user)/home.tsx @@ -11,35 +11,44 @@ import Home_FeatureSection from "@/screens/Home/topFeatureSection"; import { apiUser } from "@/service/api-client/api-user"; import { apiVersion } from "@/service/api-config"; import { Ionicons } from "@expo/vector-icons"; -import { Redirect, router, Stack } from "expo-router"; -import { useEffect, useState } from "react"; +import { Redirect, router, Stack, useFocusEffect } from "expo-router"; +import { useCallback, useEffect, useState } from "react"; +import { RefreshControl } from "react-native"; export default function Application() { - const { token, user } = useAuth(); + const { token, user, userData } = useAuth(); const [data, setData] = useState(); + const [refreshing, setRefreshing] = useState(false); + console.log("[User] >>", JSON.stringify(user?.id, null, 2)) + + // ‼️ Untuk cek apakah: 1. user ada, 2. user punya profile, 3. accept temrs of forum nya ada atau tidak + useFocusEffect( + useCallback(() => { + onLoadData(); + checkVersion(); + userData(token as string); + }, [user?.id, token]) + ); - console.log("[User] >>", JSON.stringify(user?.id, null, 2)); - - useEffect(() => { - onLoadData(); - checkVersion(); - }, []); - async function onLoadData() { const response = await apiUser(user?.id as string); - console.log( - "[Profile ID]>>", - JSON.stringify(response?.data?.Profile.id, null, 2) - ); - + console.log("[Profile ID]>>", JSON.stringify(response?.data?.Profile?.id, null, 2)); + setData(response.data); } - + const checkVersion = async () => { const response = await apiVersion(); console.log("[Version] >>", JSON.stringify(response.data, null, 2)); }; - + + const onRefresh = useCallback(() => { + setRefreshing(true); + onLoadData(); + checkVersion(); + setRefreshing(false); + }, []); + if (user && user?.termsOfServiceAccepted === false) { console.log("User is not accept term service"); return ; @@ -83,8 +92,16 @@ export default function Application() { }} /> + } footerComponent={ - + } > diff --git a/screens/Home/tabsList.ts b/screens/Home/tabsList.ts index f5fc139..2c01424 100644 --- a/screens/Home/tabsList.ts +++ b/screens/Home/tabsList.ts @@ -1,12 +1,12 @@ import { ITabs } from "@/components/_Interface/types"; -export const tabsHome: any = (profileId: string) => [ +export const tabsHome: any = ({acceptedForumTermsAt, profileId}: {acceptedForumTermsAt: Date, profileId: string}) => [ { id: "forum", icon: "chatbubble-ellipses-outline", activeIcon: "chatbubble-ellipses", label: "Forum", - path: "/forum", + path: acceptedForumTermsAt ? "/forum" : "/forum/terms", isActive: true, disabled: false, }, diff --git a/service/api-client/api-user.ts b/service/api-client/api-user.ts index 8c2a4b9..4775486 100644 --- a/service/api-client/api-user.ts +++ b/service/api-client/api-user.ts @@ -36,3 +36,13 @@ export async function apiForumBlockUser({ throw error; } } + +export async function apiAcceptForumTerms({category, userId}:{category:"Forum" | "Event", userId: string}) { + try { + const response = await apiConfig.post(`/mobile/user/${userId}/terms-of-app?category=${category}`); + return response.data; + } catch (error) { + throw error; + } +} + From cccb44a835ab80091fa1800a2b23767c4d19e4e2 Mon Sep 17 00:00:00 2001 From: bagasbanuna Date: Tue, 9 Dec 2025 17:36:36 +0800 Subject: [PATCH 17/21] Fix QC Ayu Fix: - modified: app/(application)/(user)/event/[id]/publish.tsx - modified: app/(application)/(user)/event/create.tsx - modified: app/(application)/(user)/portofolio/[id]/create.tsx - modified: app/(application)/(user)/portofolio/[id]/edit.tsx - modified: app/(application)/admin/collaboration/[id]/group.tsx - modified: app/(application)/admin/collaboration/group.tsx - modified: app/(application)/admin/collaboration/publish.tsx - modified: app/(application)/admin/forum/[id]/list-report-comment.tsx - modified: app/(application)/admin/forum/[id]/list-report-posting.tsx - modified: app/(application)/admin/forum/posting.tsx - modified: app/(application)/admin/forum/report-comment.tsx - modified: app/(application)/admin/forum/report-posting.tsx - modified: app/(application)/admin/voting/[status]/status.tsx - modified: app/(application)/admin/voting/history.tsx - modified: components/Select/SelectCustom.tsx - modified: components/_ShareComponent/GridSpan_4_8.tsx - modified: screens/Authentication/LoginView.tsx - modified: screens/Collaboration/BoxPublishSection.tsx - modified: screens/Event/BoxDetailPublishSection.tsx - modified: screens/Home/topFeatureSection.tsx - modified: screens/Portofolio/ButtonCreatePortofolio.tsx Add: - components/_ShareComponent/GridSpan_NewComponent.tsx ### No Issue --- .../(user)/event/[id]/publish.tsx | 4 +- app/(application)/(user)/event/create.tsx | 2 +- .../(user)/portofolio/[id]/create.tsx | 2 +- .../(user)/portofolio/[id]/edit.tsx | 2 +- .../admin/collaboration/[id]/group.tsx | 53 +++++----- .../admin/collaboration/group.tsx | 72 +++++++------- .../admin/collaboration/publish.tsx | 55 +++++------ .../admin/forum/[id]/list-report-comment.tsx | 86 +++++++++-------- .../admin/forum/[id]/list-report-posting.tsx | 96 +++++++++++-------- app/(application)/admin/forum/posting.tsx | 77 +++++++++------ .../admin/forum/report-comment.tsx | 84 +++++++++------- .../admin/forum/report-posting.tsx | 72 +++++++------- .../admin/voting/[status]/status.tsx | 2 +- app/(application)/admin/voting/history.tsx | 2 +- components/Select/SelectCustom.tsx | 2 +- components/_ShareComponent/GridSpan_4_8.tsx | 8 +- .../_ShareComponent/GridSpan_NewComponent.tsx | 54 +++++++++++ screens/Authentication/LoginView.tsx | 4 +- screens/Collaboration/BoxPublishSection.tsx | 2 +- screens/Event/BoxDetailPublishSection.tsx | 2 +- screens/Home/topFeatureSection.tsx | 2 +- screens/Portofolio/ButtonCreatePortofolio.tsx | 4 - 22 files changed, 399 insertions(+), 288 deletions(-) create mode 100644 components/_ShareComponent/GridSpan_NewComponent.tsx diff --git a/app/(application)/(user)/event/[id]/publish.tsx b/app/(application)/(user)/event/[id]/publish.tsx index 88efb59..103c4e4 100644 --- a/app/(application)/(user)/event/[id]/publish.tsx +++ b/app/(application)/(user)/event/[id]/publish.tsx @@ -71,8 +71,6 @@ export default function EventDetailPublish() { } } - console.log("[participans]", isParticipant); - const handlePress = (item: IMenuDrawerItem) => { console.log("PATH ", item.path); router.navigate(item.path as any); @@ -139,7 +137,7 @@ export default function EventDetailPublish() { <> , headerRight: () => setOpenDrawer(true)} />, }} diff --git a/app/(application)/(user)/event/create.tsx b/app/(application)/(user)/event/create.tsx index 1d3e4dd..dffebc9 100644 --- a/app/(application)/(user)/event/create.tsx +++ b/app/(application)/(user)/event/create.tsx @@ -145,7 +145,7 @@ export default function EventCreate() { label: item.name, value: item.id, }))} - value={data?.eventMaster_TipeAcaraId || ""} + value={data?.eventMaster_TipeAcaraId || null} onChange={(value: any) => setData({ ...data, eventMaster_TipeAcaraId: value }) } diff --git a/app/(application)/(user)/portofolio/[id]/create.tsx b/app/(application)/(user)/portofolio/[id]/create.tsx index 550484c..d1c0a7a 100644 --- a/app/(application)/(user)/portofolio/[id]/create.tsx +++ b/app/(application)/(user)/portofolio/[id]/create.tsx @@ -76,7 +76,7 @@ export default function PortofolioCreate() { function handleInputValue(phoneNumber: string) { setInputValue(phoneNumber); const callingCode = selectedCountry?.callingCode.replace(/^\+/, "") || ""; - const fixNumber = inputValue.replace(/\s+/g, ""); + let fixNumber = inputValue.replace(/\s+/g, "").replace(/^0+/, ""); const realNumber = callingCode + fixNumber; setData({ ...data, tlpn: realNumber }); } diff --git a/app/(application)/(user)/portofolio/[id]/edit.tsx b/app/(application)/(user)/portofolio/[id]/edit.tsx index 8be839b..bf4b147 100644 --- a/app/(application)/(user)/portofolio/[id]/edit.tsx +++ b/app/(application)/(user)/portofolio/[id]/edit.tsx @@ -244,7 +244,7 @@ export default function PortofolioEdit() { const handleSubmitUpdate = async () => { const callingCode = selectedCountry?.callingCode.replace(/^\+/, "") || ""; - const fixNumber = data.tlpn.replace(/\s+/g, ""); + let fixNumber = data.tlpn.replace(/\s+/g, "").replace(/^0+/, ""); const realNumber = callingCode + fixNumber; const newData: IFormData = { diff --git a/app/(application)/admin/collaboration/[id]/group.tsx b/app/(application)/admin/collaboration/[id]/group.tsx index 32fc944..d6cb76f 100644 --- a/app/(application)/admin/collaboration/[id]/group.tsx +++ b/app/(application)/admin/collaboration/[id]/group.tsx @@ -2,11 +2,13 @@ import { BaseBox, Grid, + Spacing, StackCustom, TextCustom, ViewWrapper, } from "@/components"; import AdminBackButtonAntTitle from "@/components/_ShareComponent/Admin/BackButtonAntTitle"; +import { GridSpan_4_8 } from "@/components/_ShareComponent/GridSpan_4_8"; import { apiAdminCollaborationGetById } from "@/service/api-admin/api-admin-collaboration"; import { useFocusEffect, useLocalSearchParams } from "expo-router"; import { useCallback, useState } from "react"; @@ -28,6 +30,8 @@ export default function AdminCollaborationGroup() { category: "group", }); + console.log("[DATA]", JSON.stringify(response.data, null, 2)); + if (response.success) { setData(response.data); } @@ -59,38 +63,33 @@ export default function AdminCollaborationGroup() { ))} + + Anggota + - Anggota + + + + Nomor + + + Username + + {data?.ProjectCollaboration_AnggotaRoomChat?.map( (item: any, index: number) => ( - - - - Nama - - - - {item?.User?.Profile?.name || "-"} - - - - - - Username - - - {item?.User?.username || "-"} - - - + + + +{item?.User?.nomor || "-"} + + + + {item?.User?.username || "-"} + + + ) )} diff --git a/app/(application)/admin/collaboration/group.tsx b/app/(application)/admin/collaboration/group.tsx index 3a05763..f58098a 100644 --- a/app/(application)/admin/collaboration/group.tsx +++ b/app/(application)/admin/collaboration/group.tsx @@ -1,17 +1,14 @@ import { - ActionIcon, + ClickableCustom, LoaderCustom, StackCustom, TextCustom, ViewWrapper } from "@/components"; import AdminComp_BoxTitle from "@/components/_ShareComponent/Admin/BoxTitlePage"; -import AdminTitleTable from "@/components/_ShareComponent/Admin/TableTitle"; -import AdminTableValue from "@/components/_ShareComponent/Admin/TableValue"; import AdminTitlePage from "@/components/_ShareComponent/Admin/TitlePage"; -import { ICON_SIZE_BUTTON } from "@/constants/constans-value"; +import { GridSpan_NewComponent } from "@/components/_ShareComponent/GridSpan_NewComponent"; import { apiAdminCollaboration } from "@/service/api-admin/api-admin-collaboration"; -import { Octicons } from "@expo/vector-icons"; import { router, useFocusEffect } from "expo-router"; import _ from "lodash"; import { useCallback, useState } from "react"; @@ -34,7 +31,7 @@ export default function AdminCollaborationGroup() { const response = await apiAdminCollaboration({ category: "group", }); - + if (response.success) { setList(response.data); } @@ -51,10 +48,19 @@ export default function AdminCollaborationGroup() { <> - + Jumlah Anggota + + } + text2={ + + Nama Group + + } /> @@ -67,31 +73,27 @@ export default function AdminCollaborationGroup() { ) : ( list?.map((item: any, index: number) => ( - - } - onPress={() => { - router.push(`/admin/collaboration/${item.id}/group`); - }} - /> - } - value2={ - - {item?.ProjectCollaboration_AnggotaRoomChat?.length || - "-"} - - } - value3={ - {item?.name || "-"} - } - /> + { + router.push(`/admin/collaboration/${item.id}/group`); + }} + > + + {item?.ProjectCollaboration_AnggotaRoomChat?.length || + "-"} + + } + text2={ + + {item?.name || "-"} + + } + /> + )) )} diff --git a/app/(application)/admin/collaboration/publish.tsx b/app/(application)/admin/collaboration/publish.tsx index 777296f..c6168b7 100644 --- a/app/(application)/admin/collaboration/publish.tsx +++ b/app/(application)/admin/collaboration/publish.tsx @@ -1,6 +1,8 @@ import { ActionIcon, + ClickableCustom, LoaderCustom, + Spacing, StackCustom, TextCustom, ViewWrapper, @@ -9,6 +11,7 @@ import AdminComp_BoxTitle from "@/components/_ShareComponent/Admin/BoxTitlePage" import AdminTitleTable from "@/components/_ShareComponent/Admin/TableTitle"; import AdminTableValue from "@/components/_ShareComponent/Admin/TableValue"; import AdminTitlePage from "@/components/_ShareComponent/Admin/TitlePage"; +import { GridSpan_NewComponent } from "@/components/_ShareComponent/GridSpan_NewComponent"; import { ICON_SIZE_BUTTON } from "@/constants/constans-value"; import { apiAdminCollaboration } from "@/service/api-admin/api-admin-collaboration"; import { Octicons } from "@expo/vector-icons"; @@ -51,11 +54,7 @@ export default function AdminCollaborationPublish() { - + Username} text2={Judul Proyek} /> {/* */} @@ -68,32 +67,26 @@ export default function AdminCollaborationPublish() { ) : ( list?.map((item: any, index: number) => ( - - } - onPress={() => { - router.push(`/admin/collaboration/${item?.id}/publish`); - }} - /> - } - value2={ - - {item?.Author?.username || "-"}{" "} - - } - value3={ - - {item?.title || "-"} - - } - /> + { + router.push(`/admin/collaboration/${item?.id}/publish`); + }} + > + + {item?.Author?.username || "-"}{" "} + + } + text2={ + + {item?.title || "-"} + + } + /> + + + )) )} diff --git a/app/(application)/admin/forum/[id]/list-report-comment.tsx b/app/(application)/admin/forum/[id]/list-report-comment.tsx index 4a4cb30..935c707 100644 --- a/app/(application)/admin/forum/[id]/list-report-comment.tsx +++ b/app/(application)/admin/forum/[id]/list-report-comment.tsx @@ -3,6 +3,7 @@ import { ActionIcon, AlertDefaultSystem, BaseBox, + CenterCustom, DrawerCustom, LoaderCustom, MenuDrawerDynamicGrid, @@ -17,6 +18,7 @@ import AdminComp_BoxTitle from "@/components/_ShareComponent/Admin/BoxTitlePage" import AdminTitleTable from "@/components/_ShareComponent/Admin/TableTitle"; import AdminTableValue from "@/components/_ShareComponent/Admin/TableValue"; import { GridSpan_4_8 } from "@/components/_ShareComponent/GridSpan_4_8"; +import { GridSpan_NewComponent } from "@/components/_ShareComponent/GridSpan_NewComponent"; import { MainColor } from "@/constants/color-palet"; import { ICON_SIZE_BUTTON } from "@/constants/constans-value"; import { @@ -27,6 +29,7 @@ import { import { router, useFocusEffect, useLocalSearchParams } from "expo-router"; import _ from "lodash"; import { useCallback, useState } from "react"; +import { View } from "react-native"; import { Divider } from "react-native-paper"; import Toast from "react-native-toast-message"; @@ -95,24 +98,24 @@ export default function AdminForumReportComment() { > - Username} - value={{data?.Author?.username || "-"}} + Username} + text2={{data?.Author?.username || "-"}} /> - Komentar} - value={{data?.komentar || "-"}} + Komentar} + text2={{data?.komentar || "-"}} /> - - + Aksi} + text2={Pelapor} + text3={Kategori Report} /> {loadList ? ( @@ -123,34 +126,39 @@ export default function AdminForumReportComment() { ) : ( listReport?.map((item: any, index: number) => ( - } - onPress={() => { - setOpenDrawerAction(true); - setSelectedReport({ - id: item.id, - username: item.User?.username, - kategori: item.ForumMaster_KategoriReport?.title, - keterangan: item.ForumMaster_KategoriReport?.deskripsi, - deskripsi: item.deskripsi, - }); - }} - /> - } - value2={ - - {item?.User?.username || "-"} - - } - value3={ - - {item?.ForumMaster_KategoriReport?.title || "-"} - - } - /> + + + } + onPress={() => { + setOpenDrawerAction(true); + setSelectedReport({ + id: item.id, + username: item.User?.username, + kategori: item.ForumMaster_KategoriReport?.title, + keterangan: + item.ForumMaster_KategoriReport?.deskripsi, + deskripsi: item.deskripsi, + }); + }} + /> + + } + text2={ + + {item?.User?.username || "-"} + + } + text3={ + + {item?.ForumMaster_KategoriReport?.title || "-"} + + } + /> + + )) )} diff --git a/app/(application)/admin/forum/[id]/list-report-posting.tsx b/app/(application)/admin/forum/[id]/list-report-posting.tsx index 1d82976..faedf07 100644 --- a/app/(application)/admin/forum/[id]/list-report-posting.tsx +++ b/app/(application)/admin/forum/[id]/list-report-posting.tsx @@ -4,6 +4,7 @@ import { AlertDefaultSystem, BadgeCustom, BaseBox, + CenterCustom, DrawerCustom, LoaderCustom, MenuDrawerDynamicGrid, @@ -18,6 +19,7 @@ import AdminComp_BoxTitle from "@/components/_ShareComponent/Admin/BoxTitlePage" import AdminTitleTable from "@/components/_ShareComponent/Admin/TableTitle"; import AdminTableValue from "@/components/_ShareComponent/Admin/TableValue"; import { GridSpan_4_8 } from "@/components/_ShareComponent/GridSpan_4_8"; +import { GridSpan_NewComponent } from "@/components/_ShareComponent/GridSpan_NewComponent"; import { MainColor } from "@/constants/color-palet"; import { ICON_SIZE_BUTTON } from "@/constants/constans-value"; import { @@ -28,6 +30,7 @@ import { import { router, useFocusEffect, useLocalSearchParams } from "expo-router"; import _ from "lodash"; import { useCallback, useState } from "react"; +import { View } from "react-native"; import { Divider } from "react-native-paper"; import Toast from "react-native-toast-message"; @@ -95,14 +98,14 @@ export default function AdminForumReportPosting() { > - Username} - value={{data?.Author?.username || "-"}} + Username} + text2={{data?.Author?.username || "-"}} /> - Status} - value={ + Status} + text2={ data && data?.ForumMaster_StatusPosting?.status ? ( - Postingan} - value={{data?.diskusi || "-"}} + Postingan} + text2={{data?.diskusi || "-"}} /> - + Aksi + + } + text2={Pelapor} + text3={Kategori Report} /> {loadListReport ? ( @@ -144,34 +151,41 @@ export default function AdminForumReportPosting() { ) : ( listReport?.map((item: any, index: number) => ( - } - onPress={() => { - setOpenDrawerAction(true); - setSelectedReport({ - id: item?.id, - username: item?.User?.username, - kategori: item?.ForumMaster_KategoriReport?.title, - keterangan: item?.ForumMaster_KategoriReport?.deskripsi, - deskripsi: item?.deskripsi, - }); - }} - /> - } - value2={ - - {item?.User?.username || "-"} - - } - value3={ - - {item?.ForumMaster_KategoriReport?.title || "-"} - - } - /> + + + + } + onPress={() => { + setOpenDrawerAction(true); + setSelectedReport({ + id: item?.id, + username: item?.User?.username, + kategori: item?.ForumMaster_KategoriReport?.title, + keterangan: + item?.ForumMaster_KategoriReport?.deskripsi, + deskripsi: item?.deskripsi, + }); + }} + /> + + } + text2={ + + {item?.User?.username || "-"} + + } + text3={ + + {item?.ForumMaster_KategoriReport?.title || "-"} + + } + /> + + )) )} diff --git a/app/(application)/admin/forum/posting.tsx b/app/(application)/admin/forum/posting.tsx index 4f9c3c0..dd7ad70 100644 --- a/app/(application)/admin/forum/posting.tsx +++ b/app/(application)/admin/forum/posting.tsx @@ -1,22 +1,22 @@ /* eslint-disable react-hooks/exhaustive-deps */ import { - ActionIcon, + ClickableCustom, LoaderCustom, SearchInput, + Spacing, StackCustom, TextCustom, ViewWrapper, } from "@/components"; -import { IconView } from "@/components/_Icon/IconComponent"; import AdminComp_BoxTitle from "@/components/_ShareComponent/Admin/BoxTitlePage"; -import AdminTitleTable from "@/components/_ShareComponent/Admin/TableTitle"; -import AdminTableValue from "@/components/_ShareComponent/Admin/TableValue"; import AdminTitlePage from "@/components/_ShareComponent/Admin/TitlePage"; -import { ICON_SIZE_BUTTON } from "@/constants/constans-value"; +import { GridSpan_4_8 } from "@/components/_ShareComponent/GridSpan_4_8"; +import { GridSpan_NewComponent } from "@/components/_ShareComponent/GridSpan_NewComponent"; import { apiAdminForum } from "@/service/api-admin/api-admin-forum"; import { router, useFocusEffect } from "expo-router"; import _ from "lodash"; -import React, { useCallback, useState } from "react"; +import { useCallback, useState } from "react"; +import { View } from "react-native"; import { Divider } from "react-native-paper"; export default function AdminForumPosting() { @@ -37,7 +37,9 @@ export default function AdminForumPosting() { category: "posting", search: search, }); - + + console.log("DATA", JSON.stringify(response, null, 2)); + if (response.success) { setList(response.data); } @@ -51,7 +53,7 @@ export default function AdminForumPosting() { const rightComponent = ( @@ -61,9 +63,15 @@ export default function AdminForumPosting() { <> }> + Username} + text2={ Postingan} + text3={ Report Posting} + text4={ Komentar} + /> + + - - {loadList ? ( ) : _.isEmpty(list) ? ( @@ -72,25 +80,38 @@ export default function AdminForumPosting() { ) : ( list?.map((item: any, index: number) => ( - } - onPress={() => { - router.push(`/admin/forum/${item?.id}`); - }} + + { + router.push(`/admin/forum/${item.id}`); + }} + > + + {item?.Author?.username || "-"} + + } + text2={ + + {item?.diskusi || "-"} + + } + text3={ + + {item?.reportPosting || "-"} + + } + text4={ + + {item?.komentar || "-"} + + } /> - } - value2={ - - {item?.Author?.username || "-"} - - } - value3={ - {item?.diskusi || "-"} - } - /> + + + + )) )} diff --git a/app/(application)/admin/forum/report-comment.tsx b/app/(application)/admin/forum/report-comment.tsx index 654d635..b9fa90f 100644 --- a/app/(application)/admin/forum/report-comment.tsx +++ b/app/(application)/admin/forum/report-comment.tsx @@ -1,8 +1,10 @@ /* eslint-disable react-hooks/exhaustive-deps */ import { ActionIcon, + ClickableCustom, LoaderCustom, SearchInput, + Spacing, StackCustom, TextCustom, ViewWrapper, @@ -12,12 +14,14 @@ import AdminComp_BoxTitle from "@/components/_ShareComponent/Admin/BoxTitlePage" import AdminTitleTable from "@/components/_ShareComponent/Admin/TableTitle"; import AdminTableValue from "@/components/_ShareComponent/Admin/TableValue"; import AdminTitlePage from "@/components/_ShareComponent/Admin/TitlePage"; +import { GridSpan_NewComponent } from "@/components/_ShareComponent/GridSpan_NewComponent"; import { MainColor } from "@/constants/color-palet"; import { ICON_SIZE_BUTTON } from "@/constants/constans-value"; import { apiAdminForum } from "@/service/api-admin/api-admin-forum"; import { router, useFocusEffect } from "expo-router"; import _ from "lodash"; import { useCallback, useState } from "react"; +import { View } from "react-native"; import { Divider } from "react-native-paper"; export default function AdminForumReportComment() { @@ -67,13 +71,26 @@ export default function AdminForumReportComment() { rightComponent={rightComponent} /> - - - + + Pelapor + + } + text2={ + + Komentar + + } + text3={ + + Jenis Laporan + + } + /> + + + {loadList ? ( ) : _.isEmpty(listData) ? ( @@ -82,34 +99,35 @@ export default function AdminForumReportComment() { ) : ( listData?.map((item: any, index: number) => ( - + + { + router.push( + `/admin/forum/${item?.Forum_Komentar?.id}/list-report-comment` + ); + }} + > + + {item?.User?.username || "-"} + + } + text2={ + + {item?.Forum_Komentar?.komentar || "-"} + + } + text3={ + + {item?.ForumMaster_KategoriReport?.title || "-"} + } - onPress={() => { - router.push( - `/admin/forum/${item?.Forum_Komentar?.id}/list-report-comment` - ); - }} /> - } - value2={ - - {item?.User?.username || "-"} - - } - value3={ - - {item?.ForumMaster_KategoriReport?.title || "-"} - - } - /> + + + + )) )} diff --git a/app/(application)/admin/forum/report-posting.tsx b/app/(application)/admin/forum/report-posting.tsx index 3e373e0..6d5ff57 100644 --- a/app/(application)/admin/forum/report-posting.tsx +++ b/app/(application)/admin/forum/report-posting.tsx @@ -1,24 +1,27 @@ /* eslint-disable react-hooks/exhaustive-deps */ import { ActionIcon, + ClickableCustom, Divider, LoaderCustom, SearchInput, StackCustom, TextCustom, - ViewWrapper + ViewWrapper, } from "@/components"; import { IconView } from "@/components/_Icon/IconComponent"; import AdminComp_BoxTitle from "@/components/_ShareComponent/Admin/BoxTitlePage"; import AdminTitleTable from "@/components/_ShareComponent/Admin/TableTitle"; import AdminTableValue from "@/components/_ShareComponent/Admin/TableValue"; import AdminTitlePage from "@/components/_ShareComponent/Admin/TitlePage"; +import { GridSpan_NewComponent } from "@/components/_ShareComponent/GridSpan_NewComponent"; import { MainColor } from "@/constants/color-palet"; import { ICON_SIZE_BUTTON } from "@/constants/constans-value"; import { apiAdminForum } from "@/service/api-admin/api-admin-forum"; import { router, useFocusEffect } from "expo-router"; import _ from "lodash"; import { useCallback, useState } from "react"; +import { View } from "react-native"; export default function AdminForumReportPosting() { const [listData, setListData] = useState(null); @@ -67,46 +70,51 @@ export default function AdminForumReportPosting() { rightComponent={rightComponent} /> - - - - + + Username + + } + text2={ + + Postingan + + } + /> + + {loadList ? ( ) : _.isEmpty(listData) ? ( - + Belum ada data ) : ( listData?.map((item: any, index: number) => ( - + + { + router.push( + `/admin/forum/${item?.Forum_Posting?.id}/list-report-posting` + ); + }} + > + + {item?.User?.username || "-"} + + } + text2={ + + {item?.Forum_Posting?.diskusi || "-"} + } - onPress={() => { - router.push( - `/admin/forum/${item?.Forum_Posting?.id}/list-report-posting` - ); - }} /> - } - value2={ - - {item?.User?.username || "-"} - - } - value3={ - - {item?.Forum_Posting?.diskusi || "-"} - - } - /> + + + )) )} diff --git a/app/(application)/admin/voting/[status]/status.tsx b/app/(application)/admin/voting/[status]/status.tsx index cf3bc34..5c89295 100644 --- a/app/(application)/admin/voting/[status]/status.tsx +++ b/app/(application)/admin/voting/[status]/status.tsx @@ -103,7 +103,7 @@ export default function AdminVotingStatus() { } value3={ - + {item?.title || "-"} } diff --git a/app/(application)/admin/voting/history.tsx b/app/(application)/admin/voting/history.tsx index 8a7286b..1930004 100644 --- a/app/(application)/admin/voting/history.tsx +++ b/app/(application)/admin/voting/history.tsx @@ -91,7 +91,7 @@ export default function AdminVotingHistory() { } value2={{item?.Author?.username || "-"}} value3={ - + {item?.title || "-"} } diff --git a/components/Select/SelectCustom.tsx b/components/Select/SelectCustom.tsx index 0de3c84..7d9db20 100644 --- a/components/Select/SelectCustom.tsx +++ b/components/Select/SelectCustom.tsx @@ -87,7 +87,7 @@ const SelectCustom: React.FC = ({ borderRadius, flexDirection: "row", alignItems: "center", - paddingHorizontal: 10, + // paddingHorizontal: 0, height: 50, }, diff --git a/components/_ShareComponent/GridSpan_4_8.tsx b/components/_ShareComponent/GridSpan_4_8.tsx index d2721e6..5dbcfb5 100644 --- a/components/_ShareComponent/GridSpan_4_8.tsx +++ b/components/_ShareComponent/GridSpan_4_8.tsx @@ -1,8 +1,8 @@ import { Grid } from "@/components"; export const GridSpan_4_8 = ({ - label, - value, + label: text1, + value: text2, }: { label: React.ReactNode; value: React.ReactNode; @@ -17,10 +17,10 @@ export const GridSpan_4_8 = ({ paddingLeft: 8, }} > - {label} + {text1} - {value} + {text2} ); diff --git a/components/_ShareComponent/GridSpan_NewComponent.tsx b/components/_ShareComponent/GridSpan_NewComponent.tsx new file mode 100644 index 0000000..c17fd81 --- /dev/null +++ b/components/_ShareComponent/GridSpan_NewComponent.tsx @@ -0,0 +1,54 @@ +import { Grid } from "@/components"; + +export const GridSpan_NewComponent = ({ + text1, + text2, + text3, + text4, + span1, + span2, +}: { + text1: React.ReactNode; + text2: React.ReactNode; + text3?: React.ReactNode; + text4?: React.ReactNode; + span1?: number; + span2?: number; +}) => { + return ( + + + {text1} + + + {text2} + + {text3 && ( + + {text3} + + )} + {text4 && ( + + {text4} + + )} + + ); +}; diff --git a/screens/Authentication/LoginView.tsx b/screens/Authentication/LoginView.tsx index c80833d..3aa2fff 100644 --- a/screens/Authentication/LoginView.tsx +++ b/screens/Authentication/LoginView.tsx @@ -134,10 +134,10 @@ export default function LoginView() { if (token && token !== "" && isAdmin) { // Akan di aktifkan jika sudah losos review - // return ; + return ; // Sementara gunakan ini - return ; + // return ; } return ( diff --git a/screens/Collaboration/BoxPublishSection.tsx b/screens/Collaboration/BoxPublishSection.tsx index b169671..8b2e859 100644 --- a/screens/Collaboration/BoxPublishSection.tsx +++ b/screens/Collaboration/BoxPublishSection.tsx @@ -25,7 +25,7 @@ function Collaboration_BoxPublishSection({ name={data?.Author?.username || "Username"} rightComponent={rightComponentAvatar} avatar={data?.Author?.Profile?.imageId} - withBottomLine + // withBottomLine /> diff --git a/screens/Event/BoxDetailPublishSection.tsx b/screens/Event/BoxDetailPublishSection.tsx index 4e14ea3..c7599b1 100644 --- a/screens/Event/BoxDetailPublishSection.tsx +++ b/screens/Event/BoxDetailPublishSection.tsx @@ -50,7 +50,7 @@ export default function Event_BoxDetailPublishSection({ {item.title} - + {item.value} diff --git a/screens/Home/topFeatureSection.tsx b/screens/Home/topFeatureSection.tsx index 8befc82..90664c1 100644 --- a/screens/Home/topFeatureSection.tsx +++ b/screens/Home/topFeatureSection.tsx @@ -15,7 +15,7 @@ export default function Home_FeatureSection() { name: "Collaboration", icon: , onPress: () => router.push("/(application)/(user)/collaboration/(tabs)"), - status: "inactive", + status: "active", }, { name: "Voting", diff --git a/screens/Portofolio/ButtonCreatePortofolio.tsx b/screens/Portofolio/ButtonCreatePortofolio.tsx index bb1a341..9bda043 100644 --- a/screens/Portofolio/ButtonCreatePortofolio.tsx +++ b/screens/Portofolio/ButtonCreatePortofolio.tsx @@ -55,10 +55,6 @@ export default function Portofolio_ButtonCreate({ }; const handleCreatePortofolio = async () => { - console.log( - "Data sub bidang >>", - JSON.stringify(subBidangSelected, null, 2) - ); if (!validaasiData()) { Toast.show({ type: "info", From 6f9481c7c90662f17cd3345d12e93e0a7891027a Mon Sep 17 00:00:00 2001 From: bagasbanuna Date: Wed, 10 Dec 2025 17:35:15 +0800 Subject: [PATCH 18/21] Fix QC ( Ayu ) Fix: - modified: app/(application)/(user)/event/[id]/publish.tsx - modified: app/(application)/(user)/event/create.tsx - modified: app/(application)/(user)/portofolio/[id]/create.tsx - modified: app/(application)/(user)/portofolio/[id]/edit.tsx - modified: app/(application)/admin/collaboration/[id]/group.tsx - modified: app/(application)/admin/collaboration/group.tsx - modified: app/(application)/admin/collaboration/publish.tsx - modified: app/(application)/admin/forum/[id]/list-report-comment.tsx - modified: app/(application)/admin/forum/[id]/list-report-posting.tsx - modified: app/(application)/admin/forum/posting.tsx - modified: app/(application)/admin/forum/report-comment.tsx - modified: app/(application)/admin/forum/report-posting.tsx - modified: app/(application)/admin/voting/[status]/status.tsx - modified: app/(application)/admin/voting/history.tsx - modified: components/Select/SelectCustom.tsx - modified: components/_ShareComponent/GridSpan_4_8.tsx - modified: screens/Authentication/LoginView.tsx - modified: screens/Collaboration/BoxPublishSection.tsx - modified: screens/Event/BoxDetailPublishSection.tsx - modified: screens/Home/topFeatureSection.tsx - modified: screens/Portofolio/ButtonCreatePortofolio.tsx Add: - app/(application)/admin/app-information/business-field/[id]/bidang-update.tsx - app/(application)/admin/app-information/business-field/[id]/sub-bidang-update.tsx ### No Issue --- app.config.js | 2 +- app/(application)/(user)/home.tsx | 8 +- .../(user)/portofolio/[id]/create.tsx | 14 +- .../business-field/[id]/bidang-update.tsx | 129 ++++++++++++++ .../business-field/[id]/index.tsx | 161 ++++++++++-------- .../business-field/[id]/sub-bidang-update.tsx | 135 +++++++++++++++ .../app-information/business-field/create.tsx | 122 +++++++++++-- .../admin/app-information/index.tsx | 2 +- app/(application)/admin/super-admin/index.tsx | 2 +- app/(application)/admin/user-access/index.tsx | 6 +- .../_ShareComponent/GridSpan_NewComponent.tsx | 2 +- ios/HIPMIBadungConnect/Info.plist | 2 +- screens/Authentication/LoginView.tsx | 4 +- screens/Home/topFeatureSection.tsx | 2 +- service/api-admin/api-master-admin.ts | 32 +++- 15 files changed, 512 insertions(+), 111 deletions(-) create mode 100644 app/(application)/admin/app-information/business-field/[id]/bidang-update.tsx create mode 100644 app/(application)/admin/app-information/business-field/[id]/sub-bidang-update.tsx diff --git a/app.config.js b/app.config.js index 65702a1..3d7d71c 100644 --- a/app.config.js +++ b/app.config.js @@ -19,7 +19,7 @@ export default { "NSLocationWhenInUseUsageDescription": "Aplikasi membutuhkan akses lokasi untuk menampilkan peta.", }, associatedDomains: ["applinks:cld-dkr-staging-hipmi.wibudev.com"], - buildNumber: "13", + buildNumber: "14", }, android: { diff --git a/app/(application)/(user)/home.tsx b/app/(application)/(user)/home.tsx index 645280a..de34524 100644 --- a/app/(application)/(user)/home.tsx +++ b/app/(application)/(user)/home.tsx @@ -19,7 +19,7 @@ export default function Application() { const { token, user, userData } = useAuth(); const [data, setData] = useState(); const [refreshing, setRefreshing] = useState(false); - console.log("[User] >>", JSON.stringify(user?.id, null, 2)) + console.log("[User] >>", JSON.stringify(user?.id, null, 2)); // ‼️ Untuk cek apakah: 1. user ada, 2. user punya profile, 3. accept temrs of forum nya ada atau tidak useFocusEffect( @@ -32,7 +32,10 @@ export default function Application() { async function onLoadData() { const response = await apiUser(user?.id as string); - console.log("[Profile ID]>>", JSON.stringify(response?.data?.Profile?.id, null, 2)); + console.log( + "[Profile ID]>>", + JSON.stringify(response?.data?.Profile?.id, null, 2) + ); setData(response.data); } @@ -81,6 +84,7 @@ export default function Application() { ), headerRight: () => ( { - onLoadMaster(); - onLoadMasterSubBidangBisnis(); - }, []); + useFocusEffect( + useCallback(() => { + onLoadMaster(); + onLoadMasterSubBidangBisnis(); + }, []) + ); const onLoadMaster = async () => { try { diff --git a/app/(application)/admin/app-information/business-field/[id]/bidang-update.tsx b/app/(application)/admin/app-information/business-field/[id]/bidang-update.tsx new file mode 100644 index 0000000..7ba25d4 --- /dev/null +++ b/app/(application)/admin/app-information/business-field/[id]/bidang-update.tsx @@ -0,0 +1,129 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import { + BoxButtonOnFooter, + ButtonCustom, + StackCustom, + TextCustom, + TextInputCustom, + ViewWrapper, +} from "@/components"; +import AdminBackButtonAntTitle from "@/components/_ShareComponent/Admin/BackButtonAntTitle"; +import { MainColor } from "@/constants/color-palet"; +import { + apiAdminMasterBusinessFieldById, + apiAdminMasterBusinessFieldUpdate, +} from "@/service/api-admin/api-master-admin"; +import { router, useFocusEffect, useLocalSearchParams } from "expo-router"; +import { useCallback, useState } from "react"; +import { Switch } from "react-native-paper"; +import Toast from "react-native-toast-message"; + +export default function AdminAppInformation_BusinessFieldDetail() { + const { id } = useLocalSearchParams(); + const [data, setData] = useState(null); + const [isLoading, setIsLoading] = useState(false); + + useFocusEffect( + useCallback(() => { + onLoadDetail(); + }, [id]) + ); + + const onLoadDetail = async () => { + try { + const response = await apiAdminMasterBusinessFieldById({ + id: id as string, + category: "bidang" + }); + + setData(response.data); + } catch (error) { + console.log("[ERROR]", error); + setData(null); + } + }; + + const handlerSubmit = async () => { + if (!data.name) { + Toast.show({ + type: "error", + text1: "Lengkapi Data", + }); + return; + } + + try { + setIsLoading(true); + const response = await apiAdminMasterBusinessFieldUpdate({ + id: id as string, + data: data, + category: "bidang", + }); + + if (!response.success) { + Toast.show({ + type: "error", + text1: "Gagal update data", + }); + return; + } + + Toast.show({ + type: "success", + text1: "Data berhasil di update", + }); + router.back(); + } catch (error) { + console.log(error); + } finally { + setIsLoading(false); + } + }; + + const buttonSubmit = ( + + handlerSubmit()} + > + Update + + + ); + return ( + <> + + + + + setData({ ...data, name: value })} + /> + + + Status + + setData({ ...data, active: value })} + /> + + + + + ); +} diff --git a/app/(application)/admin/app-information/business-field/[id]/index.tsx b/app/(application)/admin/app-information/business-field/[id]/index.tsx index 4a36a61..968167a 100644 --- a/app/(application)/admin/app-information/business-field/[id]/index.tsx +++ b/app/(application)/admin/app-information/business-field/[id]/index.tsx @@ -1,22 +1,22 @@ /* eslint-disable react-hooks/exhaustive-deps */ import { - BoxButtonOnFooter, - ButtonCustom, + ActionIcon, + BaseBox, + CenterCustom, + LoaderCustom, + Spacing, StackCustom, TextCustom, - TextInputCustom, ViewWrapper, } from "@/components"; +import { IconEdit } from "@/components/_Icon"; import AdminBackButtonAntTitle from "@/components/_ShareComponent/Admin/BackButtonAntTitle"; +import { GridSpan_NewComponent } from "@/components/_ShareComponent/GridSpan_NewComponent"; import { MainColor } from "@/constants/color-palet"; -import { - apiAdminMasterBusinessFieldById, - apiAdminMasterBusinessFieldUpdate, -} from "@/service/api-admin/api-master-admin"; +import { apiAdminMasterBusinessFieldById } from "@/service/api-admin/api-master-admin"; import { router, useFocusEffect, useLocalSearchParams } from "expo-router"; import { useCallback, useState } from "react"; -import { Switch } from "react-native-paper"; -import Toast from "react-native-toast-message"; +import { Divider } from "react-native-paper"; export default function AdminAppInformation_BusinessFieldDetail() { const { id } = useLocalSearchParams(); @@ -33,8 +33,11 @@ export default function AdminAppInformation_BusinessFieldDetail() { try { const response = await apiAdminMasterBusinessFieldById({ id: id as string, + category: "all", }); + console.log("Response >>", JSON.stringify(response, null, 2)); + setData(response.data); } catch (error) { console.log("[ERROR]", error); @@ -42,73 +45,89 @@ export default function AdminAppInformation_BusinessFieldDetail() { } }; - const handlerSubmit = async () => { - if (!data.name) { - Toast.show({ - type: "error", - text1: "Lengkapi Data", - }); - return; - } - - try { - setIsLoading(true); - const response = await apiAdminMasterBusinessFieldUpdate({ - id: id as string, - data: data, - }); - - if (!response.success) { - Toast.show({ - type: "error", - text1: "Gagal update data", - }); - return; - } - - Toast.show({ - type: "success", - text1: "Data berhasil di update", - }); - router.back(); - } catch (error) { - console.log(error); - } finally { - setIsLoading(false); - } - }; - - const buttonSubmit = ( - - handlerSubmit()} - > - Update - - - ); return ( <> - + - + - setData({ ...data, name: value })} - /> + {!data ? ( + + ) : ( + + Nama Bidang + + + + + Status: {data?.bidang?.active ? "Aktif" : "Tidak Aktif"} + + + {data?.bidang?.name} + + } + text2={ + + } + onPress={() => + router.push( + `/admin/app-information/business-field/${id}/bidang-update` + ) + } + /> + + } + /> + + + {/* */} + - Status Aktivasi - setData({ ...data, active: value })} - /> + Sub Bidang Bisnis + + + {data?.subBidang?.map((item: any, index: number) => ( + + + + Status: {item?.isActive ? "Aktif" : "Tidak Aktif"} + + + + {item.name} + + } + text2={ + + + } + onPress={() => + router.push( + `/admin/app-information/business-field/${item?.id}/sub-bidang-update` + ) + } + /> + + } + /> + + + ))} + + )} + + {/* {JSON.stringify(data, null, 2)} */} diff --git a/app/(application)/admin/app-information/business-field/[id]/sub-bidang-update.tsx b/app/(application)/admin/app-information/business-field/[id]/sub-bidang-update.tsx new file mode 100644 index 0000000..9710891 --- /dev/null +++ b/app/(application)/admin/app-information/business-field/[id]/sub-bidang-update.tsx @@ -0,0 +1,135 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import { + BoxButtonOnFooter, + ButtonCustom, + StackCustom, + TextCustom, + TextInputCustom, + ViewWrapper, +} from "@/components"; +import AdminBackButtonAntTitle from "@/components/_ShareComponent/Admin/BackButtonAntTitle"; +import { MainColor } from "@/constants/color-palet"; +import { + apiAdminMasterBusinessFieldById, + apiAdminMasterBusinessFieldUpdate, +} from "@/service/api-admin/api-master-admin"; +import { router, useFocusEffect, useLocalSearchParams } from "expo-router"; +import { useCallback, useState } from "react"; +import { Switch } from "react-native-paper"; +import Toast from "react-native-toast-message"; + +export default function AdminAppInformation_BusinessFieldDetail() { + const { id } = useLocalSearchParams(); + const [data, setData] = useState(null); + const [isLoading, setIsLoading] = useState(false); + + useFocusEffect( + useCallback(() => { + onLoadDetail(); + }, [id]) + ); + + const onLoadDetail = async () => { + try { + const response = await apiAdminMasterBusinessFieldById({ + id: id as string, + category: "sub-bidang", + subBidangId: id as string, + }); + + console.log("Response >>", JSON.stringify(response, null, 2)); + + + + + setData(response.data); + } catch (error) { + console.log("[ERROR]", error); + setData(null); + } + }; + + const handlerSubmit = async () => { + if (!data.name) { + Toast.show({ + type: "error", + text1: "Lengkapi Data", + }); + return; + } + + try { + setIsLoading(true); + const response = await apiAdminMasterBusinessFieldUpdate({ + id: id as string, + data: data, + category: "sub-bidang", + }); + + if (!response.success) { + Toast.show({ + type: "error", + text1: "Gagal update data", + }); + return; + } + + Toast.show({ + type: "success", + text1: "Data berhasil di update", + }); + router.back(); + } catch (error) { + console.log(error); + } finally { + setIsLoading(false); + } + }; + + const buttonSubmit = ( + + handlerSubmit()} + > + Update + + + ); + return ( + <> + + + + + setData({ ...data, name: value })} + /> + + + Status + + setData({ ...data, isActive: value })} + /> + + + + + ); +} diff --git a/app/(application)/admin/app-information/business-field/create.tsx b/app/(application)/admin/app-information/business-field/create.tsx index 9a77a91..5c8f487 100644 --- a/app/(application)/admin/app-information/business-field/create.tsx +++ b/app/(application)/admin/app-information/business-field/create.tsx @@ -1,40 +1,81 @@ import { - BoxButtonOnFooter, - ButtonCustom, - StackCustom, - TextInputCustom, - ViewWrapper, + ActionIcon, + BoxButtonOnFooter, + ButtonCustom, + CenterCustom, + Grid, + Spacing, + StackCustom, + TextInputCustom, + ViewWrapper, } from "@/components"; import AdminBackButtonAntTitle from "@/components/_ShareComponent/Admin/BackButtonAntTitle"; +import { MainColor } from "@/constants/color-palet"; +import { ICON_SIZE_XLARGE } from "@/constants/constans-value"; import { apiAdminMasterBusinessFieldCreate } from "@/service/api-admin/api-master-admin"; +import { Ionicons } from "@expo/vector-icons"; import { router } from "expo-router"; +import _ from "lodash"; import { useState } from "react"; +import { View } from "react-native"; +import { Divider } from "react-native-paper"; import Toast from "react-native-toast-message"; export default function AdminAppInformation_BusinessFieldCreate() { - const [data, setData] = useState({ + const [isLoading, setIsLoading] = useState(false); + const [bidang, setBidang] = useState({ name: "", }); - const [isLoading, setIsLoading] = useState(false); + const [subBidang, setSubBidang] = useState([ + { + name: "", + }, + ]); const handlerSubmit = async () => { - if (!data.name) { + if (!bidang.name) { Toast.show({ type: "error", text1: "Lengkapi Data", }); return; } + + if (subBidang[0].name === "") { + Toast.show({ + type: "error", + text1: "Lengkapi Sub Bidang", + }); + return; + } + try { setIsLoading(true); - const response = await apiAdminMasterBusinessFieldCreate({ data: data }); + + const newData = { + bidang: bidang, + subBidang: subBidang, + }; + + console.log("[DATA]", newData); + + const response = await apiAdminMasterBusinessFieldCreate({ + data: newData, + }); + + console.log("[RESPONSE]", response); if (response.success) { Toast.show({ type: "success", text1: "Data berhasil di tambah", }); - router.back(); + // router.back(); + } else { + Toast.show({ + type: "error", + text1: "Gagal tambah data", + }); } } catch (error) { console.log("[ERROR]", error); @@ -50,6 +91,7 @@ export default function AdminAppInformation_BusinessFieldCreate() { const buttonSubmit = ( handlerSubmit()} isLoading={isLoading} > @@ -60,16 +102,70 @@ export default function AdminAppInformation_BusinessFieldCreate() { return ( <> - + setData({ ...data, name: value })} + value={bidang.name} + onChangeText={(value) => setBidang({ ...bidang, name: value })} /> + + + + + {subBidang.map((item, index) => ( + { + const list = _.clone(subBidang); + list[index].name = value; + setSubBidang(list); + }} + /> + ))} + + + + { + setSubBidang([...subBidang, { name: "" }]); + }} + icon={ + + } + size="xl" + /> + { + const list = _.clone(subBidang); + list.pop(); + setSubBidang(list); + }} + icon={ + + } + size="xl" + /> + + diff --git a/app/(application)/admin/app-information/index.tsx b/app/(application)/admin/app-information/index.tsx index 66212ff..7bc697e 100644 --- a/app/(application)/admin/app-information/index.tsx +++ b/app/(application)/admin/app-information/index.tsx @@ -75,7 +75,7 @@ const listPage = [ }, { id: "2", - label: "Bidang Bisnis", + label: "Bidang & Sub Bidang", value: "business", }, { diff --git a/app/(application)/admin/super-admin/index.tsx b/app/(application)/admin/super-admin/index.tsx index bea4a71..6dde028 100644 --- a/app/(application)/admin/super-admin/index.tsx +++ b/app/(application)/admin/super-admin/index.tsx @@ -76,7 +76,7 @@ export default function SuperAdmin_ListUser() { } component2={ - + Username } diff --git a/app/(application)/admin/user-access/index.tsx b/app/(application)/admin/user-access/index.tsx index 8a7f877..cc837d9 100644 --- a/app/(application)/admin/user-access/index.tsx +++ b/app/(application)/admin/user-access/index.tsx @@ -73,11 +73,7 @@ export default function AdminUserAccess() { Aksi } - component2={ - - Username - - } + component2={Username} component3={ Status Akses diff --git a/components/_ShareComponent/GridSpan_NewComponent.tsx b/components/_ShareComponent/GridSpan_NewComponent.tsx index c17fd81..b294933 100644 --- a/components/_ShareComponent/GridSpan_NewComponent.tsx +++ b/components/_ShareComponent/GridSpan_NewComponent.tsx @@ -22,7 +22,7 @@ export const GridSpan_NewComponent = ({ style={{ justifyContent: "flex-start", paddingRight: 5, - paddingLeft: 5, + paddingLeft: 3, }} > {text1} diff --git a/ios/HIPMIBadungConnect/Info.plist b/ios/HIPMIBadungConnect/Info.plist index c092a48..a51442f 100644 --- a/ios/HIPMIBadungConnect/Info.plist +++ b/ios/HIPMIBadungConnect/Info.plist @@ -39,7 +39,7 @@ CFBundleVersion - 13 + 14 ITSAppUsesNonExemptEncryption LSMinimumSystemVersion diff --git a/screens/Authentication/LoginView.tsx b/screens/Authentication/LoginView.tsx index 3aa2fff..c80833d 100644 --- a/screens/Authentication/LoginView.tsx +++ b/screens/Authentication/LoginView.tsx @@ -134,10 +134,10 @@ export default function LoginView() { if (token && token !== "" && isAdmin) { // Akan di aktifkan jika sudah losos review - return ; + // return ; // Sementara gunakan ini - // return ; + return ; } return ( diff --git a/screens/Home/topFeatureSection.tsx b/screens/Home/topFeatureSection.tsx index 90664c1..8befc82 100644 --- a/screens/Home/topFeatureSection.tsx +++ b/screens/Home/topFeatureSection.tsx @@ -15,7 +15,7 @@ export default function Home_FeatureSection() { name: "Collaboration", icon: , onPress: () => router.push("/(application)/(user)/collaboration/(tabs)"), - status: "active", + status: "inactive", }, { name: "Voting", diff --git a/service/api-admin/api-master-admin.ts b/service/api-admin/api-master-admin.ts index 4932dbf..cc668bc 100644 --- a/service/api-admin/api-master-admin.ts +++ b/service/api-admin/api-master-admin.ts @@ -60,10 +60,20 @@ export async function apiAdminMasterBusinessField() { } } -export async function apiAdminMasterBusinessFieldById({ id }: { id: string }) { +export async function apiAdminMasterBusinessFieldById({ + id, + subBidangId, + category, +}: { + id: string; + subBidangId?: string | null; + category: "bidang" | "sub-bidang" | "all"; +}) { + const queryCategory = category ? `?category=${category}` : ""; + const querySubBidang = subBidangId ? `&subBidangId=${subBidangId}` : ""; try { const response = await apiConfig.get( - `/mobile/admin/master/business-field/${id}` + `/mobile/admin/master/business-field/${id}${queryCategory}${querySubBidang}` ); return response.data; } catch (error) { @@ -74,13 +84,15 @@ export async function apiAdminMasterBusinessFieldById({ id }: { id: string }) { export async function apiAdminMasterBusinessFieldUpdate({ id, data, + category, }: { id: string; data: any; + category: "bidang" | "sub-bidang"; }) { try { const response = await apiConfig.put( - `/mobile/admin/master/business-field/${id}`, + `/mobile/admin/master/business-field/${id}?category=${category}`, { data: data, } @@ -179,7 +191,11 @@ export async function apiAdminMasterDonationCategory() { } } -export async function apiAdminMasterDonationCategoryById({ id }: { id: string }) { +export async function apiAdminMasterDonationCategoryById({ + id, +}: { + id: string; +}) { try { const response = await apiConfig.get(`/mobile/admin/master/donation/${id}`); return response.data; @@ -208,7 +224,11 @@ export async function apiAdminMasterDonationCategoryUpdate({ } } -export async function apiAdminMasterDonationCategoryCreate({ data }: { data: any }) { +export async function apiAdminMasterDonationCategoryCreate({ + data, +}: { + data: any; +}) { try { const response = await apiConfig.post(`/mobile/admin/master/donation`, { data: data, @@ -219,4 +239,4 @@ export async function apiAdminMasterDonationCategoryCreate({ data }: { data: any } } -// ================== END DONATION ================== // \ No newline at end of file +// ================== END DONATION ================== // From 573b52535278cf99841fa24e3863b578a96d8375 Mon Sep 17 00:00:00 2001 From: bagasbanuna Date: Thu, 11 Dec 2025 14:01:05 +0800 Subject: [PATCH 19/21] Fix QC ( Keano ) Fix: - modified: app/(application)/(user)/home.tsx - modified: app/(application)/(user)/voting/create.tsx - modified: components/DateInput/DataTimeAndroid.tsx - modified: components/DateInput/DateTimePickerCustom.tsx - modified: screens/Event/BoxPublishSection.tsx ### No Issue --- app/(application)/(user)/home.tsx | 2 +- app/(application)/(user)/voting/create.tsx | 2 +- components/DateInput/DataTimeAndroid.tsx | 2 ++ components/DateInput/DateTimePickerCustom.tsx | 6 ++++++ screens/Event/BoxPublishSection.tsx | 2 +- 5 files changed, 11 insertions(+), 3 deletions(-) diff --git a/app/(application)/(user)/home.tsx b/app/(application)/(user)/home.tsx index de34524..8591107 100644 --- a/app/(application)/(user)/home.tsx +++ b/app/(application)/(user)/home.tsx @@ -87,7 +87,7 @@ export default function Application() { disabled={true} name="notifications" size={20} - color={MainColor.yellow} + color={MainColor.placeholder} onPress={() => { router.push("/notifications"); }} diff --git a/app/(application)/(user)/voting/create.tsx b/app/(application)/(user)/voting/create.tsx index 9fe2eed..d7a0c8f 100644 --- a/app/(application)/(user)/voting/create.tsx +++ b/app/(application)/(user)/voting/create.tsx @@ -110,7 +110,7 @@ export default function VotingCreate() { setData({ ...data, title: value })} diff --git a/components/DateInput/DataTimeAndroid.tsx b/components/DateInput/DataTimeAndroid.tsx index fd54f97..66a2d5c 100644 --- a/components/DateInput/DataTimeAndroid.tsx +++ b/components/DateInput/DataTimeAndroid.tsx @@ -53,6 +53,8 @@ const DateTimeInput_Android: React.FC = ({ const [selectedDate, setSelectedDate] = useState(value as any); const [selectedTime, setSelectedTime] = useState(value as any); + console.log("Date Android", value) + // Fungsi untuk menggabungkan tanggal dan waktu const combineDateAndTime = useCallback((date: Date, time: Date): Date => { const combined = new Date(date); diff --git a/components/DateInput/DateTimePickerCustom.tsx b/components/DateInput/DateTimePickerCustom.tsx index f1c5cc0..9877bde 100644 --- a/components/DateInput/DateTimePickerCustom.tsx +++ b/components/DateInput/DateTimePickerCustom.tsx @@ -23,6 +23,9 @@ const DateTimePickerCustom: React.FC = ({ minimumDate, disabled = false, }) => { + + console.log("Date Android Comp", value) + return ( <> {Platform.OS === "ios" ? ( @@ -47,6 +50,9 @@ const DateTimePickerCustom: React.FC = ({ maximumDate={maximumDate} minimumDate={minimumDate} disabled={disabled} + value={value as DateTimePickerEvent | Date | null | any} + + /> )} diff --git a/screens/Event/BoxPublishSection.tsx b/screens/Event/BoxPublishSection.tsx index 0794555..79cbc12 100644 --- a/screens/Event/BoxPublishSection.tsx +++ b/screens/Event/BoxPublishSection.tsx @@ -28,7 +28,7 @@ export default function Event_BoxPublishSection({ From 2c0198b1b78e30e6d9e5b21fbffcfa4b9d8bae1b Mon Sep 17 00:00:00 2001 From: bagasbanuna Date: Fri, 12 Dec 2025 14:55:30 +0800 Subject: [PATCH 20/21] Checkpoint QC Done Cooming soon: Notification feature ### No Issue --- android/app/src/main/AndroidManifest.xml | 4 + .../res/drawable-hdpi/notification_icon.png | Bin 0 -> 2288 bytes .../res/drawable-mdpi/notification_icon.png | Bin 0 -> 1283 bytes .../res/drawable-xhdpi/notification_icon.png | Bin 0 -> 3531 bytes .../res/drawable-xxhdpi/notification_icon.png | Bin 0 -> 6349 bytes .../drawable-xxxhdpi/notification_icon.png | Bin 0 -> 9845 bytes android/app/src/main/res/values/colors.xml | 1 + app.config.js | 16 +- bun.lock | 459 +++++++++++++++--- .../project.pbxproj | 94 ++-- ios/HIPMIBadungConnect/AppDelegate.swift | 4 + .../GoogleService-Info.plist | 30 ++ ios/HIPMIBadungConnect/Info.plist | 2 +- ios/HIPMIBadungConnect/PrivacyInfo.xcprivacy | 2 + ios/Podfile | 40 +- ios/Podfile.lock | 97 +++- package.json | 3 + 17 files changed, 634 insertions(+), 118 deletions(-) create mode 100644 android/app/src/main/res/drawable-hdpi/notification_icon.png create mode 100644 android/app/src/main/res/drawable-mdpi/notification_icon.png create mode 100644 android/app/src/main/res/drawable-xhdpi/notification_icon.png create mode 100644 android/app/src/main/res/drawable-xxhdpi/notification_icon.png create mode 100644 android/app/src/main/res/drawable-xxxhdpi/notification_icon.png create mode 100644 ios/HIPMIBadungConnect/GoogleService-Info.plist diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 97806ba..6b0bac0 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -16,6 +16,10 @@ + + + + diff --git a/android/app/src/main/res/drawable-hdpi/notification_icon.png b/android/app/src/main/res/drawable-hdpi/notification_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c6fa35c593d02ac0b59c9c13b5d303396353336b GIT binary patch literal 2288 zcmV$1dB4|BxVd)C0g->A%uuV6SYl92zq5=LQJ?I zUYM8|Zj4t{FGx(}MuQqbv`Up!1RGjtVx>(R3l!REJKZz;|G&dp%RRF@?X;n_a;4AX z|C;c<*nG!pwQ`GAZl>L!wId>kd`?V{ zs!Jl1Iw^Nr9kqEyo$sUGflrvew(AuL|C7zPWvzW!bRU&Bj+1DWT4)swLFz4zMB(2eTMc~tsT=EnoA;+I)np3&Z6r@3at#Z8O;ksLwME}@d5edo$BL{dXenK zu6_TFv^%wOOslkpN<(B)=QXcB=3PH}+Us9;t!FN*?F|jHRwr6>pwSS`B@qO|MLpiD zd)23u?>y}a;Yz1|Bb$eRHtn4;ttkU#qRiAnTDa+^Q$F{Xe_(ri(?z?xdw%kLzvF=i zAJgW6T4*!1(h9Ai((G#vGza2t%{xu^70*hploubCx-%jZiAY2u5)o+L`*UY(Z*RJ6 zXJ^ZMZhe#1Dv^jpBqE4J1cE>W5kw*q5obhv*cCdLo&N0|)9_JcB4tvhCL$3*1e)a{ zxvaIO)~d^m;N3s*R&ROZjmB|s=RbbQJ@-C{K%!L#ngijI6d#R^xBN+4-?M99=d!f8 zU7n9inbeUIk%>YiBGH=5T5C$J$~-Hj`uSVm<_~}GgQjsbjHCCx=N*3igCFztht3ie ziPjLF6M;D1B5udW?Mp6OEN_!CsUu~gBNCB_L?ndPnp&&56!SD0r%9>B554)6VZF9m zudP-q<2d@ko30`3OGFTf2qK6?Bq9;%HqS~fddKg-R?4TPOvGRx8sqNh#_3Ubk2f*@24Y zd4V8;2*l0ybuQ`_H<$)eCS_7b%0x%X)I=mA%w;wVgK-=U!(bQ&^E?~p*))#2uG9Cu zzVCJ2f=DijpjFQc1Yutgaf5xGi#9fo7}ums>PVT?kvdW)WojXkG8gOh+As`;VK5AX zX)ao0xm@b|Uf=hYeXr{}A`xf}frjv$2n6AXeVu)=y`zn5#x*IEGAWZYwIj`>Oe>~& zwpy(W!(bQ&(>Q9aSuU40H#hZtZ`t?y zI&w$pNF9-hOl0$1tX3=IFqo!E&RN$jES5`~o12z>Z@FArE|+rdh=f2zL-Ru6l8AHm zbuQ}rM;tlAu*bM&9w{BEBXy*XRA|{W&(^DzQi{c5q3?TDSS))Ro12!)rR8FwTP)<9 ziR^g|4b3GD5e~#7_9gpTPWRf{5=XD%&<@>_+>tv{N9stK$mUYiTJ?Qzb92+)YVh}W zKVZ>s+UR?I-&-!1mWzdF&hL>Dk%&YD5l9FkA&4O2Ui&)xqP5SUj+f z;YuO?sUckUTmNvcT2IGnPka2^JnyFTfTC`SamDbSEXbyz?Jo&ks?Mp5z^$xYsEyd1JwvV#hAa|sW)R8i& zBRZ`$=7H8o$zB}uRJzeqalL2K_1fk&qy>?*l!zb_5kw$}AOdlRXJwbY^;fIv`ti62m>wX2UU?QAVvd-bN{#|}AhWT{Wp8?N7W(d%BbAsfB^ z#^a72O5SklY8TF5uo{ZzgneP(S^S#SL!*7!Wncc}7&rgYTB$#yG+MZ%%-;F^hrRK- zYH#=W{^l2iwuzSuoA3yJgYfswfJI|aS?5+xtJg*_{7CvP4 zVDqf-V(}_r=U47M#V~4jLKXS;EPoGB<_BFf0&pP|JU-cs4rQG_* zXVmg(rJPU;)5vh13s13rhVcUPAQ0PEX@_5P(%f<%wwZJ?-(o zx!ZS4`YH2tMwzcui|5ptI@4xqp%sxAbQ?s_Dy>p0t@<7T97r@4Cl# zf*vE(JwgBtY`Sm%UjFgd7kTEXgDfmA^Tn4dpe?9!jsgNAAXr2m#7-Zj{ie@|;XEH7 z#`sB$17kr9o1S>&UUu*L8M}8~!(+d{3nk#a$9V_FfEW+~5fB4nCJ}R(EsjmMJ-?4K zo5gxC4#a|3kOpf61=_YHgqFwV_VdR-%#o%;p8wM;y!G}coTUmVARsbJa>qXM4^J32 z`Q#ARf%RY<7z@UL7*v&}t|`lss;asBt{cg-jH1Z7^Y)z}0%AZ6hy`OnEQmYAh+~tF z4p4cp9;^rBKpaS*X&Q>Mq$~=`vZQST8-oFPo)ba~Vu1iCXNiCq5OaVL$NjHPQDie% z57vW?zd@`>7#|xWP7lNTkRKw!%e zMl74&|J$i*$XBv2KK?Jsy#fV97@6nvv6mRJY>^x1-qpH!l2&8HFj!k*>C0tKoleP%8t)9BeqEDSft7D_ zvf+@dXesN!Mp{!f3MioKh&)98d7lx>c^@C`^Yh<+L{rTXf=!zaYo}{A(u#Cg5jjsh zxt*%B4QvP38K(&j?<4ZEp{Z*?E08%({rf$(ST6M0KNpyJ-~*cSK|&jYK-)lFG909& z>5x=o(jw5`$Vk&6=^&%2YfxPmm}BjYc`jhN*y0-tT)qD&Re3$y?g4?efu?}E#25=v z4^U_u2n}eMNA)3AUw@B_2tVc47xvLshp37J t2;ov)`{)$q#x!k(#FMLf^6z~v!FQmiE47WjBLn~d002ovPDHLkV1i4JJM#bl literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-xhdpi/notification_icon.png b/android/app/src/main/res/drawable-xhdpi/notification_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5e47654321b85b2a94962e3d7023865b2352514e GIT binary patch literal 3531 zcmXw62UHX38r_GiWFv-vi1-ZBB`CrMl->yn7)r7{ktRMvc|4j#AR2@$B}?cvAYg(5 z2`EAqLXi?!K@mj6fC8Zk(jl}^q~;B~`_9b&&pGp-xpTjJ@Bhu2cn7=dC&B*&|M0^P zC#|iJ7~uNz(EuF>W+$PYIN*MUHPX!S!9RGf{XUfVP@!KJ@#8&w;`qba&lp1C&!#yS zFNYk9rN7De9Uhn?=C15~Ge#aE&k0IMM{*y(;##3@qR4x`w)?+}kET)lv!)%csw1BN zW7IO~iEwR5*RyJ>YJd-ee^{_rzfur1ORa7Dggd-D8M;Gs|L#1zL&}`$)?~gzN0a%5 zhDwY*w^!T2CKeMVp&Q*!UBPur_|D)GSc&w+Su@GI5_IoX(-|DInP{JKh~^QA1NQR! z#VO765cIf3lY5E`Hcci5r4$WEo(`1|$6eWNh9$#X*Tq)Ncqamr$AsKUM#}Sz|97=BbcgY@fDL6Sa$v(X<+=gL6 z!dOZwz`(-dM`eU6V74q%D5x`*gloD`+UXK9zI0#=Yls^Xb2yOGXj;7aC}B-u-c&&b zY(sZcfYQWCn(@9;^bStPHAt~ftPknfgr-V7@KEH32UFFvXrt6uYs@jSedn4&u9apd zQh{vq9B!o~o~5v$#yA_}HZ>;=>al56Hq(Ww-_LsG%3f}3SDZDBTXnNz-|x>csR~^A ze1?F1ne_2ir&*zYsX^rOw9c*waodSX=nPfbHd&Qv*&LP)7St7_6?KLdRAx{S9cB=m zT)L-z7L5YxWw*Mj6$Di{80D0C@Ke2-6YU_Hh&1*0A!tVxyQQ7a?*#P*w~6^@#zUw_ z!)ZK>)kxeq8M(cE_^J1JQRch@!7d6EClqB04NkB+n6R%m52m{wZUwyGH>OLF;K-+P zP$V>JBN5*`baH_G2PLp+%_V4;l#@vXDUju&k0zn0duTvkCm5tyQZ)Od+tO{*bK#77-G_Gv;=eW8C<*;&CM+}&{-aRTW6Pai zFQL@8`9uL^aaWr|HkT}P06UY-MHQeBdRH{)-_m zWxUBHcU&EeCY!5f0sNpOU=2b?%38=;thjqP1-K`pnCt^D7r$(;O0`5@m|vsX%<~7_ z=Vx>!k)R_e1tY2-9ESM-N|>Hjj6 z2aEr=vs72rU|?M~uRpA@#$Bp7Q30wM4L1jw38VisAq+Xf%b4_~kI|1f!Lw`}ZR7!x za$q5O`dDKPezD=di!W-teY-n8@BQvyS36wJ`x~#JLRf)pE-WOk=qU`2hQpC&@{{U0 zDB8^hY9Sz+!$mZlf>xy<{t|!6iV2`*dP3Mz!QfEeR4P9*Bg)k$jS|>AnHBu1@7w1Dw^m?s5Z@QEahc zuS$2R0B0p_zQ2#pbyX5T2Wln>L<}qrcn1b6+vy!LG9f4$rX)XE902-@ALcA&4p>Hz z)AXuCYib$gW&L?a2jVy52Cv4Nt%|I>G@ty3+C3~d1r8EEE-~StE2*AfstZ*JY!^H+ z^kUVI&HbOCjpLDmM{r5$fQd(FwQ7K${Tt~7d%qQiOE=$t%>M)5U#rJP6;zlO0|#~+ z9F+5uf*X!~Eb~}pBmPRb4;KS)1Eb+244m@PQ{@CW0rA^kFxCClUK|&#cBuHw5ur!N=oQ4O=b6A*2!%tqMQY1oPMUB-MZI zd6u~&5V&i~`e?F^s8QUJfsD(E{dvZ}xs+iN^=-q#!hq^%K77Oc8Lpvip=9Ax-7Kr( zl`}N)DBYDmrd0Ve^5Lr4-*C>i&P6C6MFikhgwc2IxSLe%Uzgqgvixi=!?!Behki3O z&;S2uS8^HF)C=MyI7m`7E;>X`2HXP@X^o15J%*8=kK|NZze};KF86oszsAh6d5#2t zGbqwX&b!~;rTqMmgCAHAS%@Cii9OqL7PY(mO3#e1rfsIaEyD%q?;Yl%lA7tU$D)*E zK&{H@tq~AOk#>>s{Z|rVgQL@f!71mlEDI`}f>EVl01<7TIbw_Z^Wbm2S(Pjn)`zvm z6OrBGY8aJ%G|4hq=dTSj`dD?82oFFNRmzi&*VQ*1b5&=I>cgocjSx%qy~6_{ zyNCFFij8xZzEo87o^Y}c2{{{ODlZa+)Xfssw5t7HdgDdO!S?uQ>OjllztV40L6*9o z3?k@EPnAp*@IB11E|f&9By^ugcbZA+$@mz*eiS_~+$Ubx0C$(9NvVTHfP^CDpn{J@ zf*lK>>TZ?2S>R8sF~^a~4+z$Mr^qbc(n$ z8b%5p&AG1S;m73pQhHXNY1S(*yUTTW4F}4Z!?%OWJ$Bx@E(P4&o0Y};GaEKf4}?#0 z;@Ha+9m2t7Cp}Dl&d9x98K!QbC;z@ieS7x+Nh|fyyGudMX0`V#^tGMU4JVSB5zm=p z+fT2St(*oz`91c!pf9NY!;}rX#feac@Ww((-Qp=QY=8~>YtHii{gkC;{rfZ3WvQn< zc6QsUV8Of-_Pgyd_OBe8r=0}rKP}eBjo|t&H$M~%$mF+es@N~=wb|;p@jC3jZw%OX z5s({i+e&)49*NN2C{z73kV5{(ZKu+Tje6pqRnx-21#FYEEKXF@dg@-2dh=S1#@^6D zYAGjTnNM8Ec4``Ve#ZUV#=O?y{-r?Nf~CePWlwga<|ES4>Z-4?K$FpgcGP|ni=8QKVXuv zeC2o%OFR3-l9d(PO4E@|6KR2{Ep=%t_sx%PeULfxiP4z zW4-67J5w<=SN66-yqGlW>K{*kvJ(R~# zePYzIIftDMsO#QQsoM(kE)vW2)pDBsxY7v!>5NfQoj$*l8Ge2uZihZz|7EV=O1r9_ zG_|=`s&;nJq-zVt6N8XB%BPro?;f1bS-EDI4PByH>k3wd| zD~(=SR~I8LEk=?Tt_KTLK0fSp71UHRID+W0GMHyZho|T@6$3r#7!>+qsNzDbTqder zPDHOmDHC@2fyo%}S*r2!b!em;Q_wx^Dfsn6UFYk$LJeH~AGnlh!^Q081W+aS+u&8) zcCp&22)fR$Il$bbbMq8|$P5x3o;i?iwO_c}5*f!CS9~{|++3tH^kcS)uYFbES&Prs zFg^M0+kbf5U$}-1*zhW267N)t?Xtuo+U@1`vnKyVTv>p93oII^Yv5gSei_Pq=KfSi z^KFx2ikouk6I5uVoYu;hVI#s`Df93n{y?&|XQ=CN#(ELQ+HBqI=b^F63p;~)yADgV krl65+=J{=b(V{@e-Jz_{I7(0h{G|P0ZE1(BFuxQ1KdGSIUH||9 literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-xxhdpi/notification_icon.png b/android/app/src/main/res/drawable-xxhdpi/notification_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..37df632184506d8eddfe58cbf6e548c505c4b8b8 GIT binary patch literal 6349 zcmYjW2|Uzm_wRkLA}y9eNf;(+5(!!3HQBqCVFt-ksVg%fWH;tsOBjviQf{(k2@}dP zBQd;1DeDc5E!${J)``JbX3YN??tA}t&gc2f_8k)Hr*KJImxmd9kx8)nD)HO-)VOauRK=IR3h!Gka$@ zh`EGo{)&g)(p>E~N*_1eYH%3#d$W!kpGz_3Aau7RdQht*G$nfD0$mrWd|KEaWpTMM z$nr(&R(p5@X-gNwo_@2^&E8ZL&9h-N&jvR-R`@vt#k(jIOXKKO@MyES-&N1`+mk#O z`lb6hw^1)kqFNURqQ*-sBlWVm)tP8+(8|DdhqwYsR6iUMw=Cp+r&g)rinP_2>nE#% z(bh*%rN3!UY%N4BoHTq-bC~(j(-<3>M`ojk3WH){XoRVRBucqN*x14%oq8%K|GA4f zS{9KGw$Fy0Zns5@dpFKGVezdc@1Cf=$)Al_TDaABvD$n@lvr9IoCG^ccMfxgXVqHw zqLTWNm=dZO=9Q8#-9)0jg}5(j&-m@eIm5i7^;35;+RbcP9 zg7&fiSdpb3C0z+WTozVDP1Y)l3m}#T5Dm)PtMr$g2qD~ZTR1!M%@2Cl_5$uHN8b0j z=xOoZQv}V{78+9KKy<3vn_8Q>->(z1(1*~^63nf#@$sji+KB_Rb$|M8Xj4b&NB+br z_(pDAoy|*aE+ZmjAp}iJMQfR)HY*DYMK_m{Aa6nj@vU@!5kBLHKPo%n1ud=jqtn!3 z?&G}L#jy>YAi0-Mo2P$iOl-7zw? z_ZFjHJs>6q5EC#o=WINNR<-VwSetN1OK*|iinX{3%Hd0qq%i%)nUte6qP&2=ifo(4(oHTk@71EJ zT+4Ks#g?k~%QQ1d32_({nT>CQy?g7S-8z~KMmpi zsD2P%d7GkA9kC2gI?~Q&uc=IugQ>2>OUQU!Gs80>g?<$`^P+so5i`(r67y;w#y*`? zYHAHg2_ei|js#8-yeN}$JU5T^jUIOB*!BVD@;TgU#Mh8BL`jxKm+?9D4TR~rqbTGJ zfGj=$RsY=JH%s@K?@m$F^zXTyfxO|pjaR>Psi2>g!Vz>6T}N36#O)o9J&GG0Xr8@d zkTzm8C&}p6^y3bN=hM{6@XX(7M56Dz_PR{U)z?Ynr1M^*!B)#78VwlMPmhwEksLbS*fW&i72$z;My`J z*Mw!_zP_NAw!P2`9TUDWI%ch0hiq)|xJJvl=HaH8EC4(pCj3q)V<*oX-&rc_uG;@`gkZoy#&Yu z^#@fWLxdai!G}fI++yB3sz1#EL@G9xZ=JZffEZ%`FeZD0Hgd^|b*F;jI1FHpjnxD` zKp@~b@X)~7av16Hu4t9$mgt_Q>Gp6AGJ52sJ&*CFA!qd12VXC3u+v6g5AI^nanoq| z*aWbRg@ve-iO?f?=+kc`+2XL;6~FXUGq|*OQJR^wG^htc`}aqSIz1xVW3FPZf@n^= zOlR+`>{trrmxnj_G9MiLk1blOW^VYaBv_g3ek_pD@=&2=AKBviu}tiEAn7Zx9vE*S z%69-5a2fohwSw68yHKJLY|eGhup)tqPMG3}OHWUexj<0Rkcq9EpBiuoHm`13(y> z49&LlK>dF*2Kmtc(*Y2X5>#BOybwHE-exbLA0L9Y=+wvxp!`Zi+%EP6egOD!;1eDq zdl5vo7Q}W(+RjgFemMU@9`R4$L5LsTNQMlO7m>hYkfzb{d~j1!^C8eXFYo1at-3@! zk=P9@1Ohp9h@c`4D|%Kc-&zHzGhMq&o?X)!njik-T6LmDrsa=5{>pZ!C?-8;SF#DQ z0t6M2v#m!GjwCu5CwThL->&R4_-3>&=a*^_4>0*Fv^((y7XXYb0Ap9{j?p`ad)6r; zB>uwtp?ar!zl#f#>{GL_Fho8i1~FFT^Je!WswplW8~aUHHFD!n<*)&CA*@${A7Flp z?LY+Ky8#uF5V+m#-Q`^guDgtW6!N7xoHi74yR(xt!EB&5Ugp81N(;kQ- z72^sFtXz+P)&mYF(TvHQWFOhyt(q?i5Kv|QDps1k9~FT9SmFINJfM9EpZx0l1OOof zYhU6!z!%*LQjr!VO(o9263$K^<5QDQ&go;j>%*}G*oR|8D~$E{#lQ7a8+=AYL3w~@ z!`f&|aj#*rk982fL0_gJ5fR!h>EuE!M?Q0Q_yfwerb=wAaAG`wS+`4Q0Me2r$M z#{6{EVIlb8$r?}+_{p?$HIu$tlm9aI;@RPQqMGh7R}qL>5%E71xV z^0(=LDK@C$Iwb|~HS+&szN?-&O4U~==q)w1OK_m;71NvzK<&lAU4sGgf)R4JKP}o3 zP6oEg)P6vN>ITOk`2+?0IeLa@aYh~F>t8N_bOc ziRZDvtiUW!XN)B#oJk%djfuI`)cI_ZXDB1#10Vo95Ywj|%*guc&Be^g$ei!t!UJf zTCpRIOI=0`a~>P_qT9%0GuLNih40tSBJureRomY3C|t125~m>{HmEcmln_0QrsqGu zP+3#&KFi4P`yw52LNNZq18IO|y4KZna4aUEcX(%!R{eA-1;-&|DekWbqWBGyhq{)p zG_ScgZ|k#(C*1Sbd<*!A56~o0SNOYux+G%o<5%9K-1e(k2Gq@N=jcjzhJe$xqXCrT zTK`L6PKLIFP(@8$&*bsrm%H9(m%q*GFOdH7S1C4qTy@cCExq|;W5VxL61OH``rm?# zFWVKf8iwYi%hU`_>k~ce^`9=}d`Tnz*h&z%!-oa%rO>kYKQb)xC+rEOVZj&j0D-CQZ|1?~s zWHqc5&!BVq`iGu=36`|(di(m@^{-RM1?8rfFZCaFI*M9s;1!5qzbT9m=0}T$n~sof zJ+en4;^2s6@SY=qWS7HM8(xp}daQLCG!`b3LA^|u5ALLCWjWja4)_1^;Z zW4Hg9;_uelC22Y#pTVW0Q>Q;34;hR2t*Qzf>XWp}4rKemPDq0{RHOwWc`qG_7Z!#T zyNc1(-I<7sDZitP>}Mn1IhyubMw_xbO8SZf~bb5q5W1?JM zAc?7#B$XE6VMm4ImM!QeSu2;w*iFNkqi94DEaNnau5NFi;NY)f69+R%#wxrydv6L}JrASn(*J!u~X+F3mg2}mD3;`V@wSb1K?`B8HbWLsKHLsmK zK37tHQxbKwcW`ac=-b4>t@yiJE7m`cvpgE#{T6X)!F6Mi8TyF1-r=$MJ`YRv*qF|g z&Rq2Wg<0K$-S%3i`f+Y*FBpA)E5fa8ULvTiM3*oldpvkIBc=*FuQW|w@nc`Yu_WA= z%WJAt!&c93*YbYQdxFjz-D+M88BF0+G;@U6<19g6N?F)sjbCl%7Pjw&`%N_wyBHlw z(C?8#G-uJasP_2r<-;kSEE6=ggg#ehErH7LwBF1e*1wJel>J1n_UX#w;u*RTYuUNQ z`pdsF#%be}shlxxlgRH~8ycgG$hC^7$;>fDue|B+JWiMgo36Hu zMDs?}kguq9u`(1{ucRD(;bTZRc)u!@+YD?*cgdZX3RIWG)ED%A-$4z-_OfwgAnKD>hn~Vxi_w}SZ^mOi zz{kxI!)MB`Y}|xu;9@OxsQXop7qfAtrj`(#Km0%*y!vP9h#5_^_-&(X^TRF#Vl#D_ zno^hxQW)JdvvE)6uiVRPhgW=hnj={~TTgJS9h>A5c2~m~wnS~Cpl5Y&-j<5Ta$L`< zZXPzNCFYXHQnl2Zsj$4s6HUveV{5GD?y<1u^=ooLlN?>`T%#f%)jHPp%!%b7Rpu)j$eFf{ChyrD4u8G?p%P1j#?%QcBSxIx9O zq1vyZR*5&yp{pc4&#MM*7>7;7@lV%e?aW0&hr6^>7r7y$ zULp5~l5!)SMld7(%iMlTfsMv#jAEq(7xtWbkx?KVS0Hn?P04-cvft)aTZLSF^ZFEz zKx8_aN|2nBw2sI4Lo=BST6}$Entv;O>v(3VsRS#b-htjPEgo>srrXf^ITA zCV@dDk?f#o{fQsHeELoAO@fWlt$F8|`Oo_>)k=E%FQSr7O-Nn!C-SS)PCY4J6xDnw)tG{ z5~iY#xLQnfPI4)K?^6DD(Eom7VUmp7Ew+3^N9RdQ8^7wia~i!ur!{hY6X#Fry}p+o zb&py+#MvHYN4(8@^I7gI7a_O#@uytu$X>ZOj40cNdlQ_YOU;}U&5WygVKLY8g1g@* zWx6&+e%s!X>p#JpUT8KxM=U*sLYBcYJpBsYXJY&szn@7+Y18KX=%R+daKV}JF@{lZ z*-R&oo=TSe_FbXj%0pmJAh2ih-OwfWXb8e3opSlG-$dsjG*hPH1x!05HnyIi-UTVk$mkt7iG}YpV=i_N7k)hTih&D%=>lm$m)onN=VZT!+`aO=Th;~ zaZU-S0@nDK3j;X7Pdtn$;9nl(okO10{B|;3csZg_jQ3mv6c%DM>=gB*>vU&yMxmtoIn8tux1$Y-En2brF?Re?y zlDHoaLbjmqOM0bvqnV|vSfYCc9*k+zb^kDb*iqe3{^8U#IA~-kTMi!nHX$RZUCOOl z!8#$&QEwfhf{u9Inp&hpin8iru0$AZzc4hV^-Uhwp35Yz>XF}3N5P1&7` zlbmDfJ!RE_3XR}$<8$KP5drrea1YE*$YAp{QAvD8;fADN)=j5`GDWyew(0AI%LUBP zN>YOWVJ1Zj!wy1cLtf=gs;0c=TS2KbasF@8Nn4x zFjDQ=z(`epIDlTveH6BFF)+ll%Rm3QXJ#KcWmuonGM~rG88(Wvr7&>y19|I5c+D){ azZf$2yM-byz6SrM*kfsGV^Rsf9{qpCQOe8! literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-xxxhdpi/notification_icon.png b/android/app/src/main/res/drawable-xxxhdpi/notification_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..709f318eaa0891069249fcfa9f273990119e861d GIT binary patch literal 9845 zcmYj%2|Seh_y4`$RFrC(lr`%hDu%Ijvs_~v*|JP3gltJ@D*JY`6B%S3p==r3jWA*O z#~`v~iR?9F$vTaFpa194z2Dz=KI0i@6)OACh6UTUt{r1~$Cv-8I zCg9Zu`e8i+j?`2yrQd!NQ`Xf~H}n2|;e*R(Dc@TH)AL@;thLe;gpj{@&0yEfI6fST zY|egquQevBfS8v2B?5t=*qf}14VXXy2)p-{}Pd_iUc6Mt+l7dGvL_uq`|r8n1wZ^`yq+bGA` z9%+(m8S>5*L|ib*MF^daF>s$gLY`3Vn{eN*O%w2<%~YwO89GxEWj??Ah}38JWO6$q zJ8V)vAQvAfn_#ZzVsy_&DWxe?7);==qz`o<7bh1xCYrrSjFpDDxIcGo{g$2TEC&Yl z0@yr$W^?DuK_Y9LHn)EG13)<;yWbQk}>Uun}O%dGwsPkmxNl z-Du=(U&4FaZHz#g;}O~e%XFN=5|TD~$NweGg85WUka6_;l2K58n!Dmko+GjgeeTNj zqq;&ZZA#pZsUK`oaU+6VXyIFC#-eQDL-}#5C;D{qp$k=gK)P{z@w6CBgp_&u&tLV& zUlw@a71UDnv&s9cMh4{;CSEw6<60=`vKt!??xc>v#EWA4g++rM6)HL($hG7tMO|&S zJI=;{GdN59_RRz6BLT3>0{TXK9c6GPtlNH6LP|9EdICD5IZx@C1v-O8NIf2Nx%^E+ zD6&tMFmx~GDn%E3MiS+>!WYm^45&1e(gU8IN|*}yu5pKVP;J@bW3|ouCRnv-E+$G? zCQ2!)LWvEhhrz($ZLgzmC*ZTwI^`;4xKgN9-l?!^iruG1&f6QxLp3uIYvjO&N|;7Sr*R0IOL5{nQ( zAykPCjYdOTBEn?!Q3Pi@BtMo~1rx`e3nmHkTigksvFP4c4JbQBS$^u<-WqVcejsL~ zMI`oWSSUvn0>KJE*2REy`IvCqOgBu)88xDhie=!Hj^nV(h|)+soEEg5%v}1OkicJ4 zhw!JE)H3))qYalh?E#YCf)ymER|%Rzb8Na)<&iMzUT)LoLPiY1zCe}=h#1xT=5LN&9IIdlRs-` zNP5Gz+b6ujc9R*nSG}7fuyu<`wI-XEV=_*lxT?cK)sg&;8HYpgw%}YRnn?x=t(Ro# zPjHdmyP_DlRItZSp*OEEsi?L6neEN^X^gvXAHmrX)ydwc4-TjfrQ^5y)gK|FTn5{% zcfu9DX(>#fh^FOxZlg-u7C}3Hoq!{_WYT4+!#KFtG3wjHK7VX+?I<$+jIR5< zR-LGcrQ_%fib!Q8HHxbvCe8Q*pA0Ko zFxYNO9!Z$>F7*mf6@t@ypaMLv>9B}s5;1ltCyXT)wuFX1oM zu~{$R_>?nK_L5TO_riJsylfJ1UHwKDT!A1LO9-jYTbX9x0$n=CspB0%dz54G@tqaj z{blo@_>{WMu$CWg2LA}Jv7Nw_NXC0E(gYwnx{=wbn>KLQs!rV9a&va)F zFh7b1?jG-aN3MnzZ9MbIV3_por6QvPu^Yu9+c zJ?Lki@9iT+Wbh8^bD z@L@My(|!aL7Cf|$fx`j2op2KB%9+4g{>T%8+gOQ{e)agsDoJA4ynbmy4z)fGEnj!P zf7XuolhG0Jz{Y3(jjaJJZX^zIb^S=vWx#0gfFU9Y!op&P)X6``f5^PhS(#;SC2T*E z0LjTA0T1N>vJT8fLOkmV_9m$VL{;n@S7VkG#%e~E2F85TL$7S-rue@YANjR#?g#c% z`Oia6AGo{Qs*-i(F3bs-73_l2Ofd4O)~Fm{DBl0Qc*7$fj;S6*S-i3lXfU8$0~!v4 z5}68^4Xf@XIU@nCfI4F(wQDg;1Ag;vwIi!aE?!m*j`WiMgLcDnbObVc@M6`Vgyf}} zP%lO5vYe*aJ&TOg)u&zpWkETvt|jL}9I;*>cn{eFX#`~#Fh;$^!iI*WfEW_oPG-*~k~=~5rsRS8B^N~qj)WepwvC7`U_+3V z;lQuulUlc3rt^gp#sY;AgAvMwg@!`ELqT<7WJBc9_L}GJE2;IU9=Grs8S|_jD=8S` zSO7K;u>2QKuz>?~<8;8T#N61Zz)QDu3PMaKitUV;3>z>AdJ7>8Ui#ri5!JT6Nq-sM zwgRCF9`TT~@q&n4Ad{d`pkP5huExv`jMYFUYb*eu1AZd_Vz|jK9zFLPY0aUH|MT+e zZ=Q;5XsSst>4nlWonzE0K^9;WKs)6_73H7)_T8i`>A=V9xln_Ui-~tUKp|Ki6sI(q zG2fPsA8x=+D3*{#SFd?~mbV~m(67KWdC|=e01l$v8AD6}JyWVsstqPpUAa^#Y6R%q zEtu>_7sg8Ig;VA}m5?;P`sEl5BqfA)FleWTkSJe}ie!)KF>v``aRbM-@ft!XW&D69 zAa4IK6^iQGc*jlbz-?l?tB`tRBIyMl4*&w&2Fe<&bTL#(V)Dy@YgyWf5JM5H61}WI z;ly%3BB7-GAjmEon$`p8a*+SEz|cW0YCKg4>IgpyM(VW{_@qAiGE=uDk-!N$5Fj{EWdq)Ugan*{G$5ndU<^bG z;)p99tY5hO^3#oqSO@XCy5uSlcMvvUvWRl~lkMgChYxS+5l1<|j^V$k2hk50UB+`f>_4^x`01b0T!njV{atg{zNo!x#dzQ3CP|hmV4R}Mz@BgP!Vp&aeBuDBC1JK z--!J>dLp3T0@(V`I&NzJlr4nbl@f9NHJX9a50I;4w><&Z#ej3Um!M~#lu6HuvZzI@aitJ2K@fCu%- z{0WQHNG*kACPx|Grb@Y6NL>LLqnqw zj?wJFB)JbTh%At-9V7$bKVbiXrCMDWq~fR?;sIgG2g-^4w+C(mRQ0g1P#ZL|i~7Lw zblhdiSq7fseLa&F9a1##ox5h}pjaFvVZ2zFcD!(B=!-NV+h9h}4RfLkpit1c}JV2Bi;j%n!(j@*$*75O#Vd_ ztR%P&@*@%_(L`~j^)%-^i?RSs+N7H~pJlwupj5tMtB9X5;UtJ(v>b?GF8~uM)XW~G z3ljsGul)p+^#gv49JmSP+ks&Z#i+>JpP+R>$6Nmf5QI;%kn}>3C4~JN{2VFNWN*2n=2o@qf02h2 zzv`^VKQI9j3jKhCZoF8t92*)mY%mrOL&iNw*Z$8okkSzYtQPuiiNpDmP!RvY^MI%z zIV5#s5<_i(+-OjHNe-ju&cq4x!>hqf$nswoPnOnrl8meq18koIqvKB!!Mz+0=s40t zIh=vv)W%c}ZWi^_|LPb-pnn3o7K6BvL`1Vj{Ew?3Ga!SN$wU*ZiI(u)P@9ayv`dCZ zY?bRt!b`wSRS?X|lk_JgLxT9UOg3aR}2Wk54Y9>ZH99G zpe8zMV+$pV+KF2Dn-Tx`3B?oOi**2>VDpG(!GeemJhDqx9|>;JK7qT&DsZnc`4WiQ z{gR1qJmjIlAsukTH1DQZ0*ML`>mtpV zoAWj$Kwbc4p&)`(B(@V1B(b7V1Tl41M+}z}ZbS)CXp?#p2d~}@2e{r|^E@|L`nGx@ zXNW)^A`CylfVN#Y_P|wkQ+s4CC6x^wtw~=b{ma@K3pnJ;ftC@Wa8CXGD>Z=M*MN(a z$=A%1%yf^bW4KsQ2&qm%DF;|e%Nb5_oW=N3bja07*BdfNrKG-EtoJO4`1KL)13wLd zg*DPSxPkI~*2i>!Se|}c3%ZB{%~8pLgFyYOEHwm@U?Ngsg&$Q-0|z|lqyZuY3i zG(j;)cs#3@6i@)QUokt#i7D5HUC+5cfl&{oH^4`LuUQgcj$}LtCtMfCf{OsDDXX6m zTS3yO6TnIEH2jEuq}8w`PmkXc#qyntaItK_KbyC-e7MLHamdA3D;jjJQ0W507SL(w zM~AZX93*DPO(++k6%o<|WOU&BH}BEFZ#sd)e3|;^LHYQ#AbyoYdw>pRL$z9e$a+iQl+{Kgpj+0LIstQ=XldFdZt5%S@32sof3PEgUlgQV# zO~tf#;J<=e4N~QwtQ@!v)MS+YfC?}9Q0N07vL{0LD2;(TTttsoR zlw6FEeJU)bg8d9TIwMB!4Bg!Fw7440_9Xvo!N++-G4&60^M@iTALsZ5|~8|GeKKJ)-pyuPv3i|k9x;Jfj_X0)lIr)mV_`7 zjq<8ru?n1Q4I1u8AspaGxW!m#m%5;VrGv5zuGz>ZHAE*>;IV{QJeIE%_ZB4c_=17E zFRD|{)czp&U;yK6!X=iFdWreXFR-7vdPq%p<*(4(+-q}!F7Z?26Ta2V8S|h%OXb9Z zpqTgGVpks0RH1AG7+?!EiDtrp2NVP5kRrJ)fPPVG>2|Z{T~vl{`FC1Mnd(5z(t7&`6 zT~Xbk;PLY%bLbY zejFf5&8(OKB*AbKE|U(tx~+cj-C+ZiefSXASD$PMOkC#LfXCy(3Z+qliEP4v!+ZR>z{Z7Sot1{Yv9^m1ySHS5{s5Bv<#QAJ z*eVj7+Cg#!11cm}%ViNTqB4~nq6+F@~om;V47QB5~lU-`cSv=qGF&A7T zc+`ZSLu2$@Fc_19N-1Fo?sY(u!5X}qGS1LYTQGjnibPGw(3DWUBB&N!^yQO-lfxdR zRx{K;2BmHezBz<7gXA6(B+zn3fnMH{N54;J8{?kV0vhSmP!8}3bb|zR3Pu4MW0|f5 z-4Yzkb66OGe2nw_P0Kg;XD9rsQyTX3HZ@xexSde!VjajPITY{-8m!0KB10UtV~#o; zq2(iT?JpM|a(R0)VJg2PyQkyhyL*lqCusJmEs-CTcw@L?BG}tLvg6lOpWOu;&m@0M1Xl9N4Y!N9&})~nxD=iYa(j?O5L=_t?4c6fLD1*WjzEJn|P z9!jv3%m4jG{oNG;UQNuG1uo9`e)*)@uNbtKve_ROlx*a~P}%Qo*pqBvxG)<78urQp*5=hLI``_A zic|-mWd&7R`_D6H^8|dx2KT~@uypd^#CDuot5e;k^COz-_V3K48FGi|sfPJl=CiV& zjeaM~C-f$MhD-Z~rPTd&zO$#>%|L9tFIqAWXz2Fq6!&f73`)1&&$E6}-#u9Oy~3*B zZ_I-MEG3gQmuua(RM&UTyPS9PQg)+E)J0EyrYnW2!AuNYn!v zaeRGx7?gt=w!D%DKHpyEOPR$kY~0jZ3s9wZ`*W6See_AMnT!&>(6c-P&3debx4v>)$RpR@BrV+MMy~dYtK%W^0a9Kk6ly zo%34$#>maH@3Q65_X+Rh^Lu>l9y|!)iQw_x=X| zV!pHIW>YM;LtMzqqTLA!j|Z#+2Lu|Jm%~SkhL6$IkDglCn917DK&g61yVa#An7dAo zHSCK8Z62jFdQR1kJbSJ(oHXK|>nnfD@oR@YD$!t7&rC-VqnJm?epCKx_kn}e`-ve> z>vx^qGK}l**4c18J~e_u|K0R3hSynSFS};^gyI;rdw$FwR8X1={^3Iu! zJeO}`de*I$=4O$(^I)X3{;Z0x#q%q}CDn_MCchIFt-iafGCc$WCM@zw@K?qt23I#o zt9~Q91BDH_vWYSEyGib(NsEzO>qj5+4;R$0X%Y(vy(bdh#7M@@6+TVJ3>ImMnrPj% zI?Hy9@fZ4nSEP|Q>mR4oy8>pU>~3(!*toI|VUfW21%QFMl-ZNv&O_s|=x@4|n)CIPuGPY`2wp zG8zJ{*A6ual@7lh#40YVRw=sW#rA84cS`Mdd3Jjbf4{REJcBnLG|~_MV9zyL8|0|^ z{0=jnX6ATKyt8(^3M(tDz=0jeJ*M^E$mj268;37C3-$L>BCp(*nr+^6&VdwwZb7GE|{4a$Pj?6Mw{j9xx|dgyVDZBMLMhrMrPQ7QQgseG{N zqC1jjwA@cD(V%{#sp!%P+*Z<{-wLnMYI;el&*DHzjl+zQ^O@G4Ah z_@k1Os$Ko-lMC35@s|CucbMoQ^4vF-UdJDA*w|dPwM|UUJKL9Pu7#w#-Nm7r#M1bM z6Geyh&+oFW?3qdL$;#U*zqzqwtNbUg>yKRD`QZ#)nB0?IBV%G`Gm+=b^H9w&vwP|f zSaDf5Jy2D{9^c(g8PmU$c8~9n7gqH|8^mWt!Px8_G~jI~rhmTtS^D~+u@`|)1Jl~z zd%}By^2YKQ#W!x*NA%4UjmQ4el)$6#=?N-PYx{7G#NK}r9kxYl4%e{Bzp~D@ehpS` zR886ycdHJ0cw*I8-togIUY?Du<`tBOMM#E!tH9v>-<=@ zSG)IKj>t)?<;Kf8BNg;)1A<~&n$qq^k~Cs4gQBKUA1-J zL+$tiCd(~6#~0u02+ZYMc=@#@7i`t8NO^4Qmc82xf4N=CSEIa^BQPGGJ@RBVG_5O%$7{R1i^p{-+0{2L{I(L(aZ0v}%jw+} zfLY0%pwX}4F2a$=yS0fTD#1ETK_*zZ>%>ny@ zne*oB^{&%&ubDyZI5fSdW;(e4xZxG+;e>bA$=VPhdB8UzH&gJi+;}ifx@%P&EswoG z{DWw2Wi)7f{#ukr6uS6Yu^zO*^<80~9+~E10 zbqj=h$|@X+9(Yh{py@aaJ`cVYHGWGpI}2S<#Y*QaR)JD;^X%Cobn&sbl9X;(JMpIZ zK=B2EM?2{nGN=M zfW5xhK@5lvh_b5R)d16Eu*q_<8)Nz}=cl1|S{>D1gZs z@7*uwn~yH+_NJ}hshpr?Z+H*m+7!C?E4wjQ&6Xv5buq9cLDtt`I*$2_0q3a~OYnkg z<$&k0JW4nW!Kxk%+lV@9Pq9wy8{IaVSW}WT!uzhJwd$xwd0|a-VM&F=)4VsI^_MpC0vPAs@4JerufXQ7d1MT~GE_w!j-h zcoJ}PM2L2Hcr&iIem1>A$LRI)vq{pal*y?CMLoZe81ehG#ffffff #023c69 #ffffff + #ffffff \ No newline at end of file diff --git a/app.config.js b/app.config.js index 3d7d71c..5b031bc 100644 --- a/app.config.js +++ b/app.config.js @@ -14,12 +14,14 @@ export default { ios: { supportsTablet: true, bundleIdentifier: "com.anonymous.hipmi-mobile", + googleServicesFile: "./ios/HIPMIBadungConnect/GoogleService-Info.plist", infoPlist: { ITSAppUsesNonExemptEncryption: false, - "NSLocationWhenInUseUsageDescription": "Aplikasi membutuhkan akses lokasi untuk menampilkan peta.", + NSLocationWhenInUseUsageDescription: + "Aplikasi membutuhkan akses lokasi untuk menampilkan peta.", }, associatedDomains: ["applinks:cld-dkr-staging-hipmi.wibudev.com"], - buildNumber: "14", + buildNumber: "15", }, android: { @@ -56,7 +58,6 @@ export default { plugins: [ "expo-router", - "expo-notifications", "expo-web-browser", [ "expo-splash-screen", @@ -77,6 +78,15 @@ export default { ], "expo-font", "@rnmapbox/maps", + "@react-native-firebase/app", + [ + "expo-notifications", + { + icon: "./assets/images/icon.png", + color: "#ffffff", + iosDisplayInForeground: true, + }, + ], ], experiments: { diff --git a/bun.lock b/bun.lock index ff0b3c3..6ae806a 100644 --- a/bun.lock +++ b/bun.lock @@ -7,6 +7,8 @@ "@expo/vector-icons": "^15.0.2", "@react-native-async-storage/async-storage": "2.2.0", "@react-native-community/datetimepicker": "8.4.4", + "@react-native-firebase/app": "^23.7.0", + "@react-native-firebase/messaging": "^23.7.0", "@react-navigation/bottom-tabs": "^7.3.10", "@react-navigation/drawer": "^7.3.9", "@react-navigation/elements": "^2.3.8", @@ -65,6 +67,7 @@ }, "devDependencies": { "@babel/core": "^7.25.2", + "@react-native-community/cli": "^20.0.2", "@types/react": "~19.1.10", "eslint": "^9.25.0", "eslint-config-expo": "~10.0.0", @@ -418,6 +421,102 @@ "@expo/xcpretty": ["@expo/xcpretty@4.3.2", "", { "dependencies": { "@babel/code-frame": "7.10.4", "chalk": "^4.1.0", "find-up": "^5.0.0", "js-yaml": "^4.1.0" }, "bin": { "excpretty": "build/cli.js" } }, "sha512-ReZxZ8pdnoI3tP/dNnJdnmAk7uLT4FjsKDGW7YeDdvdOMz2XCQSmSCM9IWlrXuWtMF9zeSB6WJtEhCQ41gQOfw=="], + "@firebase/ai": ["@firebase/ai@2.6.0", "", { "dependencies": { "@firebase/app-check-interop-types": "0.3.3", "@firebase/component": "0.7.0", "@firebase/logger": "0.5.0", "@firebase/util": "1.13.0", "tslib": "^2.1.0" }, "peerDependencies": { "@firebase/app": "0.x", "@firebase/app-types": "0.x" } }, "sha512-NGyE7NQDFznOv683Xk4+WoUv39iipa9lEfrwvvPz33ChzVbCCiB69FJQTK2BI/11pRtzYGbHo1/xMz7gxWWhJw=="], + + "@firebase/analytics": ["@firebase/analytics@0.10.19", "", { "dependencies": { "@firebase/component": "0.7.0", "@firebase/installations": "0.6.19", "@firebase/logger": "0.5.0", "@firebase/util": "1.13.0", "tslib": "^2.1.0" }, "peerDependencies": { "@firebase/app": "0.x" } }, "sha512-3wU676fh60gaiVYQEEXsbGS4HbF2XsiBphyvvqDbtC1U4/dO4coshbYktcCHq+HFaGIK07iHOh4pME0hEq1fcg=="], + + "@firebase/analytics-compat": ["@firebase/analytics-compat@0.2.25", "", { "dependencies": { "@firebase/analytics": "0.10.19", "@firebase/analytics-types": "0.8.3", "@firebase/component": "0.7.0", "@firebase/util": "1.13.0", "tslib": "^2.1.0" }, "peerDependencies": { "@firebase/app-compat": "0.x" } }, "sha512-fdzoaG0BEKbqksRDhmf4JoyZf16Wosrl0Y7tbZtJyVDOOwziE0vrFjmZuTdviL0yhak+Nco6rMsUUbkbD+qb6Q=="], + + "@firebase/analytics-types": ["@firebase/analytics-types@0.8.3", "", {}, "sha512-VrIp/d8iq2g501qO46uGz3hjbDb8xzYMrbu8Tp0ovzIzrvJZ2fvmj649gTjge/b7cCCcjT0H37g1gVtlNhnkbg=="], + + "@firebase/app": ["@firebase/app@0.14.6", "", { "dependencies": { "@firebase/component": "0.7.0", "@firebase/logger": "0.5.0", "@firebase/util": "1.13.0", "idb": "7.1.1", "tslib": "^2.1.0" } }, "sha512-4uyt8BOrBsSq6i4yiOV/gG6BnnrvTeyymlNcaN/dKvyU1GoolxAafvIvaNP1RCGPlNab3OuE4MKUQuv2lH+PLQ=="], + + "@firebase/app-check": ["@firebase/app-check@0.11.0", "", { "dependencies": { "@firebase/component": "0.7.0", "@firebase/logger": "0.5.0", "@firebase/util": "1.13.0", "tslib": "^2.1.0" }, "peerDependencies": { "@firebase/app": "0.x" } }, "sha512-XAvALQayUMBJo58U/rxW02IhsesaxxfWVmVkauZvGEz3vOAjMEQnzFlyblqkc2iAaO82uJ2ZVyZv9XzPfxjJ6w=="], + + "@firebase/app-check-compat": ["@firebase/app-check-compat@0.4.0", "", { "dependencies": { "@firebase/app-check": "0.11.0", "@firebase/app-check-types": "0.5.3", "@firebase/component": "0.7.0", "@firebase/logger": "0.5.0", "@firebase/util": "1.13.0", "tslib": "^2.1.0" }, "peerDependencies": { "@firebase/app-compat": "0.x" } }, "sha512-UfK2Q8RJNjYM/8MFORltZRG9lJj11k0nW84rrffiKvcJxLf1jf6IEjCIkCamykHE73C6BwqhVfhIBs69GXQV0g=="], + + "@firebase/app-check-interop-types": ["@firebase/app-check-interop-types@0.3.3", "", {}, "sha512-gAlxfPLT2j8bTI/qfe3ahl2I2YcBQ8cFIBdhAQA4I2f3TndcO+22YizyGYuttLHPQEpWkhmpFW60VCFEPg4g5A=="], + + "@firebase/app-check-types": ["@firebase/app-check-types@0.5.3", "", {}, "sha512-hyl5rKSj0QmwPdsAxrI5x1otDlByQ7bvNvVt8G/XPO2CSwE++rmSVf3VEhaeOR4J8ZFaF0Z0NDSmLejPweZ3ng=="], + + "@firebase/app-compat": ["@firebase/app-compat@0.5.6", "", { "dependencies": { "@firebase/app": "0.14.6", "@firebase/component": "0.7.0", "@firebase/logger": "0.5.0", "@firebase/util": "1.13.0", "tslib": "^2.1.0" } }, "sha512-YYGARbutghQY4zZUWMYia0ib0Y/rb52y72/N0z3vglRHL7ii/AaK9SA7S/dzScVOlCdnbHXz+sc5Dq+r8fwFAg=="], + + "@firebase/app-types": ["@firebase/app-types@0.9.3", "", {}, "sha512-kRVpIl4vVGJ4baogMDINbyrIOtOxqhkZQg4jTq3l8Lw6WSk0xfpEYzezFu+Kl4ve4fbPl79dvwRtaFqAC/ucCw=="], + + "@firebase/auth": ["@firebase/auth@1.11.1", "", { "dependencies": { "@firebase/component": "0.7.0", "@firebase/logger": "0.5.0", "@firebase/util": "1.13.0", "tslib": "^2.1.0" }, "peerDependencies": { "@firebase/app": "0.x", "@react-native-async-storage/async-storage": "^1.18.1" }, "optionalPeers": ["@react-native-async-storage/async-storage"] }, "sha512-Mea0G/BwC1D0voSG+60Ylu3KZchXAFilXQ/hJXWCw3gebAu+RDINZA0dJMNeym7HFxBaBaByX8jSa7ys5+F2VA=="], + + "@firebase/auth-compat": ["@firebase/auth-compat@0.6.1", "", { "dependencies": { "@firebase/auth": "1.11.1", "@firebase/auth-types": "0.13.0", "@firebase/component": "0.7.0", "@firebase/util": "1.13.0", "tslib": "^2.1.0" }, "peerDependencies": { "@firebase/app-compat": "0.x" } }, "sha512-I0o2ZiZMnMTOQfqT22ur+zcGDVSAfdNZBHo26/Tfi8EllfR1BO7aTVo2rt/ts8o/FWsK8pOALLeVBGhZt8w/vg=="], + + "@firebase/auth-interop-types": ["@firebase/auth-interop-types@0.2.4", "", {}, "sha512-JPgcXKCuO+CWqGDnigBtvo09HeBs5u/Ktc2GaFj2m01hLarbxthLNm7Fk8iOP1aqAtXV+fnnGj7U28xmk7IwVA=="], + + "@firebase/auth-types": ["@firebase/auth-types@0.13.0", "", { "peerDependencies": { "@firebase/app-types": "0.x", "@firebase/util": "1.x" } }, "sha512-S/PuIjni0AQRLF+l9ck0YpsMOdE8GO2KU6ubmBB7P+7TJUCQDa3R1dlgYm9UzGbbePMZsp0xzB93f2b/CgxMOg=="], + + "@firebase/component": ["@firebase/component@0.7.0", "", { "dependencies": { "@firebase/util": "1.13.0", "tslib": "^2.1.0" } }, "sha512-wR9En2A+WESUHexjmRHkqtaVH94WLNKt6rmeqZhSLBybg4Wyf0Umk04SZsS6sBq4102ZsDBFwoqMqJYj2IoDSg=="], + + "@firebase/data-connect": ["@firebase/data-connect@0.3.12", "", { "dependencies": { "@firebase/auth-interop-types": "0.2.4", "@firebase/component": "0.7.0", "@firebase/logger": "0.5.0", "@firebase/util": "1.13.0", "tslib": "^2.1.0" }, "peerDependencies": { "@firebase/app": "0.x" } }, "sha512-baPddcoNLj/+vYo+HSJidJUdr5W4OkhT109c5qhR8T1dJoZcyJpkv/dFpYlw/VJ3dV66vI8GHQFrmAZw/xUS4g=="], + + "@firebase/database": ["@firebase/database@1.1.0", "", { "dependencies": { "@firebase/app-check-interop-types": "0.3.3", "@firebase/auth-interop-types": "0.2.4", "@firebase/component": "0.7.0", "@firebase/logger": "0.5.0", "@firebase/util": "1.13.0", "faye-websocket": "0.11.4", "tslib": "^2.1.0" } }, "sha512-gM6MJFae3pTyNLoc9VcJNuaUDej0ctdjn3cVtILo3D5lpp0dmUHHLFN/pUKe7ImyeB1KAvRlEYxvIHNF04Filg=="], + + "@firebase/database-compat": ["@firebase/database-compat@2.1.0", "", { "dependencies": { "@firebase/component": "0.7.0", "@firebase/database": "1.1.0", "@firebase/database-types": "1.0.16", "@firebase/logger": "0.5.0", "@firebase/util": "1.13.0", "tslib": "^2.1.0" } }, "sha512-8nYc43RqxScsePVd1qe1xxvWNf0OBnbwHxmXJ7MHSuuTVYFO3eLyLW3PiCKJ9fHnmIz4p4LbieXwz+qtr9PZDg=="], + + "@firebase/database-types": ["@firebase/database-types@1.0.16", "", { "dependencies": { "@firebase/app-types": "0.9.3", "@firebase/util": "1.13.0" } }, "sha512-xkQLQfU5De7+SPhEGAXFBnDryUWhhlFXelEg2YeZOQMCdoe7dL64DDAd77SQsR+6uoXIZY5MB4y/inCs4GTfcw=="], + + "@firebase/firestore": ["@firebase/firestore@4.9.2", "", { "dependencies": { "@firebase/component": "0.7.0", "@firebase/logger": "0.5.0", "@firebase/util": "1.13.0", "@firebase/webchannel-wrapper": "1.0.5", "@grpc/grpc-js": "~1.9.0", "@grpc/proto-loader": "^0.7.8", "tslib": "^2.1.0" }, "peerDependencies": { "@firebase/app": "0.x" } }, "sha512-iuA5+nVr/IV/Thm0Luoqf2mERUvK9g791FZpUJV1ZGXO6RL2/i/WFJUj5ZTVXy5pRjpWYO+ZzPcReNrlilmztA=="], + + "@firebase/firestore-compat": ["@firebase/firestore-compat@0.4.2", "", { "dependencies": { "@firebase/component": "0.7.0", "@firebase/firestore": "4.9.2", "@firebase/firestore-types": "3.0.3", "@firebase/util": "1.13.0", "tslib": "^2.1.0" }, "peerDependencies": { "@firebase/app-compat": "0.x" } }, "sha512-cy7ov6SpFBx+PHwFdOOjbI7kH00uNKmIFurAn560WiPCZXy9EMnil1SOG7VF4hHZKdenC+AHtL4r3fNpirpm0w=="], + + "@firebase/firestore-types": ["@firebase/firestore-types@3.0.3", "", { "peerDependencies": { "@firebase/app-types": "0.x", "@firebase/util": "1.x" } }, "sha512-hD2jGdiWRxB/eZWF89xcK9gF8wvENDJkzpVFb4aGkzfEaKxVRD1kjz1t1Wj8VZEp2LCB53Yx1zD8mrhQu87R6Q=="], + + "@firebase/functions": ["@firebase/functions@0.13.1", "", { "dependencies": { "@firebase/app-check-interop-types": "0.3.3", "@firebase/auth-interop-types": "0.2.4", "@firebase/component": "0.7.0", "@firebase/messaging-interop-types": "0.2.3", "@firebase/util": "1.13.0", "tslib": "^2.1.0" }, "peerDependencies": { "@firebase/app": "0.x" } }, "sha512-sUeWSb0rw5T+6wuV2o9XNmh9yHxjFI9zVGFnjFi+n7drTEWpl7ZTz1nROgGrSu472r+LAaj+2YaSicD4R8wfbw=="], + + "@firebase/functions-compat": ["@firebase/functions-compat@0.4.1", "", { "dependencies": { "@firebase/component": "0.7.0", "@firebase/functions": "0.13.1", "@firebase/functions-types": "0.6.3", "@firebase/util": "1.13.0", "tslib": "^2.1.0" }, "peerDependencies": { "@firebase/app-compat": "0.x" } }, "sha512-AxxUBXKuPrWaVNQ8o1cG1GaCAtXT8a0eaTDfqgS5VsRYLAR0ALcfqDLwo/QyijZj1w8Qf8n3Qrfy/+Im245hOQ=="], + + "@firebase/functions-types": ["@firebase/functions-types@0.6.3", "", {}, "sha512-EZoDKQLUHFKNx6VLipQwrSMh01A1SaL3Wg6Hpi//x6/fJ6Ee4hrAeswK99I5Ht8roiniKHw4iO0B1Oxj5I4plg=="], + + "@firebase/installations": ["@firebase/installations@0.6.19", "", { "dependencies": { "@firebase/component": "0.7.0", "@firebase/util": "1.13.0", "idb": "7.1.1", "tslib": "^2.1.0" }, "peerDependencies": { "@firebase/app": "0.x" } }, "sha512-nGDmiwKLI1lerhwfwSHvMR9RZuIH5/8E3kgUWnVRqqL7kGVSktjLTWEMva7oh5yxQ3zXfIlIwJwMcaM5bK5j8Q=="], + + "@firebase/installations-compat": ["@firebase/installations-compat@0.2.19", "", { "dependencies": { "@firebase/component": "0.7.0", "@firebase/installations": "0.6.19", "@firebase/installations-types": "0.5.3", "@firebase/util": "1.13.0", "tslib": "^2.1.0" }, "peerDependencies": { "@firebase/app-compat": "0.x" } }, "sha512-khfzIY3EI5LePePo7vT19/VEIH1E3iYsHknI/6ek9T8QCozAZshWT9CjlwOzZrKvTHMeNcbpo/VSOSIWDSjWdQ=="], + + "@firebase/installations-types": ["@firebase/installations-types@0.5.3", "", { "peerDependencies": { "@firebase/app-types": "0.x" } }, "sha512-2FJI7gkLqIE0iYsNQ1P751lO3hER+Umykel+TkLwHj6plzWVxqvfclPUZhcKFVQObqloEBTmpi2Ozn7EkCABAA=="], + + "@firebase/logger": ["@firebase/logger@0.5.0", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-cGskaAvkrnh42b3BA3doDWeBmuHFO/Mx5A83rbRDYakPjO9bJtRL3dX7javzc2Rr/JHZf4HlterTW2lUkfeN4g=="], + + "@firebase/messaging": ["@firebase/messaging@0.12.23", "", { "dependencies": { "@firebase/component": "0.7.0", "@firebase/installations": "0.6.19", "@firebase/messaging-interop-types": "0.2.3", "@firebase/util": "1.13.0", "idb": "7.1.1", "tslib": "^2.1.0" }, "peerDependencies": { "@firebase/app": "0.x" } }, "sha512-cfuzv47XxqW4HH/OcR5rM+AlQd1xL/VhuaeW/wzMW1LFrsFcTn0GND/hak1vkQc2th8UisBcrkVcQAnOnKwYxg=="], + + "@firebase/messaging-compat": ["@firebase/messaging-compat@0.2.23", "", { "dependencies": { "@firebase/component": "0.7.0", "@firebase/messaging": "0.12.23", "@firebase/util": "1.13.0", "tslib": "^2.1.0" }, "peerDependencies": { "@firebase/app-compat": "0.x" } }, "sha512-SN857v/kBUvlQ9X/UjAqBoQ2FEaL1ZozpnmL1ByTe57iXkmnVVFm9KqAsTfmf+OEwWI4kJJe9NObtN/w22lUgg=="], + + "@firebase/messaging-interop-types": ["@firebase/messaging-interop-types@0.2.3", "", {}, "sha512-xfzFaJpzcmtDjycpDeCUj0Ge10ATFi/VHVIvEEjDNc3hodVBQADZ7BWQU7CuFpjSHE+eLuBI13z5F/9xOoGX8Q=="], + + "@firebase/performance": ["@firebase/performance@0.7.9", "", { "dependencies": { "@firebase/component": "0.7.0", "@firebase/installations": "0.6.19", "@firebase/logger": "0.5.0", "@firebase/util": "1.13.0", "tslib": "^2.1.0", "web-vitals": "^4.2.4" }, "peerDependencies": { "@firebase/app": "0.x" } }, "sha512-UzybENl1EdM2I1sjYm74xGt/0JzRnU/0VmfMAKo2LSpHJzaj77FCLZXmYQ4oOuE+Pxtt8Wy2BVJEENiZkaZAzQ=="], + + "@firebase/performance-compat": ["@firebase/performance-compat@0.2.22", "", { "dependencies": { "@firebase/component": "0.7.0", "@firebase/logger": "0.5.0", "@firebase/performance": "0.7.9", "@firebase/performance-types": "0.2.3", "@firebase/util": "1.13.0", "tslib": "^2.1.0" }, "peerDependencies": { "@firebase/app-compat": "0.x" } }, "sha512-xLKxaSAl/FVi10wDX/CHIYEUP13jXUjinL+UaNXT9ByIvxII5Ne5150mx6IgM8G6Q3V+sPiw9C8/kygkyHUVxg=="], + + "@firebase/performance-types": ["@firebase/performance-types@0.2.3", "", {}, "sha512-IgkyTz6QZVPAq8GSkLYJvwSLr3LS9+V6vNPQr0x4YozZJiLF5jYixj0amDtATf1X0EtYHqoPO48a9ija8GocxQ=="], + + "@firebase/remote-config": ["@firebase/remote-config@0.7.0", "", { "dependencies": { "@firebase/component": "0.7.0", "@firebase/installations": "0.6.19", "@firebase/logger": "0.5.0", "@firebase/util": "1.13.0", "tslib": "^2.1.0" }, "peerDependencies": { "@firebase/app": "0.x" } }, "sha512-dX95X6WlW7QlgNd7aaGdjAIZUiQkgWgNS+aKNu4Wv92H1T8Ue/NDUjZHd9xb8fHxLXIHNZeco9/qbZzr500MjQ=="], + + "@firebase/remote-config-compat": ["@firebase/remote-config-compat@0.2.20", "", { "dependencies": { "@firebase/component": "0.7.0", "@firebase/logger": "0.5.0", "@firebase/remote-config": "0.7.0", "@firebase/remote-config-types": "0.5.0", "@firebase/util": "1.13.0", "tslib": "^2.1.0" }, "peerDependencies": { "@firebase/app-compat": "0.x" } }, "sha512-P/ULS9vU35EL9maG7xp66uljkZgcPMQOxLj3Zx2F289baTKSInE6+YIkgHEi1TwHoddC/AFePXPpshPlEFkbgg=="], + + "@firebase/remote-config-types": ["@firebase/remote-config-types@0.5.0", "", {}, "sha512-vI3bqLoF14L/GchtgayMiFpZJF+Ao3uR8WCde0XpYNkSokDpAKca2DxvcfeZv7lZUqkUwQPL2wD83d3vQ4vvrg=="], + + "@firebase/storage": ["@firebase/storage@0.14.0", "", { "dependencies": { "@firebase/component": "0.7.0", "@firebase/util": "1.13.0", "tslib": "^2.1.0" }, "peerDependencies": { "@firebase/app": "0.x" } }, "sha512-xWWbb15o6/pWEw8H01UQ1dC5U3rf8QTAzOChYyCpafV6Xki7KVp3Yaw2nSklUwHEziSWE9KoZJS7iYeyqWnYFA=="], + + "@firebase/storage-compat": ["@firebase/storage-compat@0.4.0", "", { "dependencies": { "@firebase/component": "0.7.0", "@firebase/storage": "0.14.0", "@firebase/storage-types": "0.8.3", "@firebase/util": "1.13.0", "tslib": "^2.1.0" }, "peerDependencies": { "@firebase/app-compat": "0.x" } }, "sha512-vDzhgGczr1OfcOy285YAPur5pWDEvD67w4thyeCUh6Ys0izN9fNYtA1MJERmNBfqjqu0lg0FM5GLbw0Il21M+g=="], + + "@firebase/storage-types": ["@firebase/storage-types@0.8.3", "", { "peerDependencies": { "@firebase/app-types": "0.x", "@firebase/util": "1.x" } }, "sha512-+Muk7g9uwngTpd8xn9OdF/D48uiQ7I1Fae7ULsWPuKoCH3HU7bfFPhxtJYzyhjdniowhuDpQcfPmuNRAqZEfvg=="], + + "@firebase/util": ["@firebase/util@1.13.0", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-0AZUyYUfpMNcztR5l09izHwXkZpghLgCUaAGjtMwXnCg3bj4ml5VgiwqOMOxJ+Nw4qN/zJAaOQBcJ7KGkWStqQ=="], + + "@firebase/webchannel-wrapper": ["@firebase/webchannel-wrapper@1.0.5", "", {}, "sha512-+uGNN7rkfn41HLO0vekTFhTxk61eKa8mTpRGLO0QSqlQdKvIoGAvLp3ppdVIWbTGYJWM6Kp0iN+PjMIOcnVqTw=="], + + "@grpc/grpc-js": ["@grpc/grpc-js@1.9.15", "", { "dependencies": { "@grpc/proto-loader": "^0.7.8", "@types/node": ">=12.12.47" } }, "sha512-nqE7Hc0AzI+euzUwDAy0aY5hCp10r734gMGRdU+qOPX0XSceI2ULrcXB5U2xSc5VkWwalCj4M7GzCAygZl2KoQ=="], + + "@grpc/proto-loader": ["@grpc/proto-loader@0.7.15", "", { "dependencies": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", "protobufjs": "^7.2.5", "yargs": "^17.7.2" }, "bin": { "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" } }, "sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ=="], + + "@hapi/hoek": ["@hapi/hoek@9.3.0", "", {}, "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ=="], + + "@hapi/topo": ["@hapi/topo@5.1.0", "", { "dependencies": { "@hapi/hoek": "^9.0.0" } }, "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg=="], + "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="], "@humanfs/node": ["@humanfs/node@0.16.6", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.3.0" } }, "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw=="], @@ -512,6 +611,26 @@ "@pkgr/core": ["@pkgr/core@0.2.9", "", {}, "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA=="], + "@protobufjs/aspromise": ["@protobufjs/aspromise@1.1.2", "", {}, "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="], + + "@protobufjs/base64": ["@protobufjs/base64@1.1.2", "", {}, "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="], + + "@protobufjs/codegen": ["@protobufjs/codegen@2.0.4", "", {}, "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg=="], + + "@protobufjs/eventemitter": ["@protobufjs/eventemitter@1.1.0", "", {}, "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q=="], + + "@protobufjs/fetch": ["@protobufjs/fetch@1.1.0", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.1", "@protobufjs/inquire": "^1.1.0" } }, "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ=="], + + "@protobufjs/float": ["@protobufjs/float@1.0.2", "", {}, "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ=="], + + "@protobufjs/inquire": ["@protobufjs/inquire@1.1.0", "", {}, "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q=="], + + "@protobufjs/path": ["@protobufjs/path@1.1.2", "", {}, "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA=="], + + "@protobufjs/pool": ["@protobufjs/pool@1.1.0", "", {}, "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw=="], + + "@protobufjs/utf8": ["@protobufjs/utf8@1.1.0", "", {}, "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="], + "@radix-ui/primitive": ["@radix-ui/primitive@1.1.3", "", {}, "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg=="], "@radix-ui/react-collection": ["@radix-ui/react-collection@1.1.7", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw=="], @@ -556,8 +675,36 @@ "@react-native-async-storage/async-storage": ["@react-native-async-storage/async-storage@2.2.0", "", { "dependencies": { "merge-options": "^3.0.4" }, "peerDependencies": { "react-native": "^0.0.0-0 || >=0.65 <1.0" } }, "sha512-gvRvjR5JAaUZF8tv2Kcq/Gbt3JHwbKFYfmb445rhOj6NUMx3qPLixmDx5pZAyb9at1bYvJ4/eTUipU5aki45xw=="], + "@react-native-community/cli": ["@react-native-community/cli@20.0.2", "", { "dependencies": { "@react-native-community/cli-clean": "20.0.2", "@react-native-community/cli-config": "20.0.2", "@react-native-community/cli-doctor": "20.0.2", "@react-native-community/cli-server-api": "20.0.2", "@react-native-community/cli-tools": "20.0.2", "@react-native-community/cli-types": "20.0.2", "chalk": "^4.1.2", "commander": "^9.4.1", "deepmerge": "^4.3.0", "execa": "^5.0.0", "find-up": "^5.0.0", "fs-extra": "^8.1.0", "graceful-fs": "^4.1.3", "prompts": "^2.4.2", "semver": "^7.5.2" }, "bin": { "rnc-cli": "build/bin.js" } }, "sha512-ocgRFKRLX8b5rEK38SJfpr0AMl6SqseWljk6c5LxCG/zpCfPPNQdXq1OsDvmEwsqO4OEQ6tmOaSm9OgTm6FhbQ=="], + + "@react-native-community/cli-clean": ["@react-native-community/cli-clean@20.0.2", "", { "dependencies": { "@react-native-community/cli-tools": "20.0.2", "chalk": "^4.1.2", "execa": "^5.0.0", "fast-glob": "^3.3.2" } }, "sha512-hfbC69fTD0fqZCCep8aqnVztBXUhAckNhi76lEV7USENtgBRwNq2s1wATgKAzOhxKuAL9TEkf5TZ/Dhp/YLhCQ=="], + + "@react-native-community/cli-config": ["@react-native-community/cli-config@20.0.2", "", { "dependencies": { "@react-native-community/cli-tools": "20.0.2", "chalk": "^4.1.2", "cosmiconfig": "^9.0.0", "deepmerge": "^4.3.0", "fast-glob": "^3.3.2", "joi": "^17.2.1" } }, "sha512-OuSAyqTv0MBbRqSyO+80IKasHnwLESydZBTrLjIGwGhDokMH07mZo8Io2H8X300WWa57LC2L8vQf73TzGS3ikQ=="], + + "@react-native-community/cli-config-android": ["@react-native-community/cli-config-android@20.0.2", "", { "dependencies": { "@react-native-community/cli-tools": "20.0.2", "chalk": "^4.1.2", "fast-glob": "^3.3.2", "fast-xml-parser": "^4.4.1" } }, "sha512-5yZ2Grr89omnMptV36ilV4EIrRLrIYQAsTTVU/hNI2vL7lz6WB8rPhP5QuovXk3TIjl1Wz2r9A6ZNO2SNJ8nig=="], + + "@react-native-community/cli-config-apple": ["@react-native-community/cli-config-apple@20.0.2", "", { "dependencies": { "@react-native-community/cli-tools": "20.0.2", "chalk": "^4.1.2", "execa": "^5.0.0", "fast-glob": "^3.3.2" } }, "sha512-6MLL9Duu/JytqI6XfYuc78LSkRGfJoCqTSfqTJzBNSnz6S7XJps9spGBlgvrGh/j0howBpQlFH0J8Ws4N4mCxA=="], + + "@react-native-community/cli-doctor": ["@react-native-community/cli-doctor@20.0.2", "", { "dependencies": { "@react-native-community/cli-config": "20.0.2", "@react-native-community/cli-platform-android": "20.0.2", "@react-native-community/cli-platform-apple": "20.0.2", "@react-native-community/cli-platform-ios": "20.0.2", "@react-native-community/cli-tools": "20.0.2", "chalk": "^4.1.2", "command-exists": "^1.2.8", "deepmerge": "^4.3.0", "envinfo": "^7.13.0", "execa": "^5.0.0", "node-stream-zip": "^1.9.1", "ora": "^5.4.1", "semver": "^7.5.2", "wcwidth": "^1.0.1", "yaml": "^2.2.1" } }, "sha512-PQ8BdoNDE2OaMGLH66HZE7FV4qj0iWBHi0lkPUTb8eJJ+vlvzUtBf0N9QSv2TAzFjA59a2FElk6jBWnDC/ql1A=="], + + "@react-native-community/cli-platform-android": ["@react-native-community/cli-platform-android@20.0.2", "", { "dependencies": { "@react-native-community/cli-config-android": "20.0.2", "@react-native-community/cli-tools": "20.0.2", "chalk": "^4.1.2", "execa": "^5.0.0", "logkitty": "^0.7.1" } }, "sha512-Wo2AIkdv3PMEMT4k7QiNm3smNpWK6rd+glVH4Nm6Hco1EgLQ4I9x+gwcS1yN53UHYtq9YnguDCXk2L8duUESDQ=="], + + "@react-native-community/cli-platform-apple": ["@react-native-community/cli-platform-apple@20.0.2", "", { "dependencies": { "@react-native-community/cli-config-apple": "20.0.2", "@react-native-community/cli-tools": "20.0.2", "chalk": "^4.1.2", "execa": "^5.0.0", "fast-xml-parser": "^4.4.1" } }, "sha512-PdsQVFLY+wGnAN1kZ38XzzWiUlqaG1cXdpkQ1rYaiiNu3PVTc2/KtteLcPG/wbApbfoPggQ/ffh+JGg7NL+HNw=="], + + "@react-native-community/cli-platform-ios": ["@react-native-community/cli-platform-ios@20.0.2", "", { "dependencies": { "@react-native-community/cli-platform-apple": "20.0.2" } }, "sha512-bVOqLsBztT+xVV65uztJ7R/dtjj4vaPXJU1RLi35zLtr1APAxzf+2ydiixxtBjNFylM3AZlF8iL5WXjeWVqrmA=="], + + "@react-native-community/cli-server-api": ["@react-native-community/cli-server-api@20.0.2", "", { "dependencies": { "@react-native-community/cli-tools": "20.0.2", "body-parser": "^1.20.3", "compression": "^1.7.1", "connect": "^3.6.5", "errorhandler": "^1.5.1", "nocache": "^3.0.1", "open": "^6.2.0", "pretty-format": "^29.7.0", "serve-static": "^1.13.1", "ws": "^6.2.3" } }, "sha512-u4tUzWnc+qthaDvd1NxdCqCNMY7Px6dAH1ODAXMtt+N27llGMJOl0J3slMx03dScftOWbGM61KA5cCpaxphYVQ=="], + + "@react-native-community/cli-tools": ["@react-native-community/cli-tools@20.0.2", "", { "dependencies": { "@vscode/sudo-prompt": "^9.0.0", "appdirsjs": "^1.2.4", "chalk": "^4.1.2", "execa": "^5.0.0", "find-up": "^5.0.0", "launch-editor": "^2.9.1", "mime": "^2.4.1", "ora": "^5.4.1", "prompts": "^2.4.2", "semver": "^7.5.2" } }, "sha512-bPYhRYggW9IIM8pvrZF/0r6HaxCyEWDn6zfPQPMWlkQUwkzFZ8GBY/M7yiHgDzozWKPT4DqZPumrq806Vcksow=="], + + "@react-native-community/cli-types": ["@react-native-community/cli-types@20.0.2", "", { "dependencies": { "joi": "^17.2.1" } }, "sha512-OZzy6U4M8Szg8iiF459OoTjRKggxLrdhZVHKfRhrAUfojhjRiWbJNkkPxJtOIPeNSgsB0heizgpE4QwCgnYeuQ=="], + "@react-native-community/datetimepicker": ["@react-native-community/datetimepicker@8.4.4", "", { "dependencies": { "invariant": "^2.2.4" }, "peerDependencies": { "expo": ">=52.0.0", "react": "*", "react-native": "*", "react-native-windows": "*" }, "optionalPeers": ["expo", "react-native-windows"] }, "sha512-bc4ZixEHxZC9/qf5gbdYvIJiLZ5CLmEsC3j+Yhe1D1KC/3QhaIfGDVdUcid0PdlSoGOSEq4VlB93AWyetEyBSQ=="], + "@react-native-firebase/app": ["@react-native-firebase/app@23.7.0", "", { "dependencies": { "firebase": "12.6.0" }, "peerDependencies": { "expo": ">=47.0.0", "react": "*", "react-native": "*" }, "optionalPeers": ["expo"] }, "sha512-sYVDkDxlOyQaDO/A0yVqbTha32dVapHlzS054RPY+RM5m0vARMsevJ9d543kH+Cdbp1RKMHIgDjhlB+APaNdhw=="], + + "@react-native-firebase/messaging": ["@react-native-firebase/messaging@23.7.0", "", { "peerDependencies": { "@react-native-firebase/app": "23.7.0", "expo": ">=47.0.0" }, "optionalPeers": ["expo"] }, "sha512-MFrV2WMnKzsmfkFNY8XLqBlV0FS1VCJC1HAMbXEBjJblVlVLOM+kap08SyHh1qqoXdfaf0mtzGQtpya/kHaAqg=="], + "@react-native/assets-registry": ["@react-native/assets-registry@0.81.4", "", {}, "sha512-AMcDadefBIjD10BRqkWw+W/VdvXEomR6aEZ0fhQRAv7igrBzb4PTn4vHKYg+sUK0e3wa74kcMy2DLc/HtnGcMA=="], "@react-native/babel-plugin-codegen": ["@react-native/babel-plugin-codegen@0.79.5", "", { "dependencies": { "@babel/traverse": "^7.25.3", "@react-native/codegen": "0.79.5" } }, "sha512-Rt/imdfqXihD/sn0xnV4flxxb1aLLjPtMF1QleQjEhJsTUPpH4TFlfOpoCvsrXoDl4OIcB1k4FVM24Ez92zf5w=="], @@ -598,6 +745,12 @@ "@rtsao/scc": ["@rtsao/scc@1.1.0", "", {}, "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g=="], + "@sideway/address": ["@sideway/address@4.1.5", "", { "dependencies": { "@hapi/hoek": "^9.0.0" } }, "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q=="], + + "@sideway/formula": ["@sideway/formula@3.0.1", "", {}, "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg=="], + + "@sideway/pinpoint": ["@sideway/pinpoint@2.0.0", "", {}, "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ=="], + "@sinclair/typebox": ["@sinclair/typebox@0.27.8", "", {}, "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA=="], "@sinonjs/commons": ["@sinonjs/commons@3.0.1", "", { "dependencies": { "type-detect": "4.0.8" } }, "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ=="], @@ -752,6 +905,8 @@ "@urql/exchange-retry": ["@urql/exchange-retry@1.3.1", "", { "dependencies": { "@urql/core": "^5.1.1", "wonka": "^6.3.2" }, "peerDependencies": { "@urql/core": "^5.0.0" } }, "sha512-EEmtFu8JTuwsInqMakhLq+U3qN8ZMd5V3pX44q0EqD2imqTDsa8ikZqJ1schVrN8HljOdN+C08cwZ1/r5uIgLw=="], + "@vscode/sudo-prompt": ["@vscode/sudo-prompt@9.3.1", "", {}, "sha512-9ORTwwS74VaTn38tNbQhsA5U44zkJfcb0BdTSyyG6frP4e8KMtHuTXYmwefe5dpL8XB1aGSIVTaLjD3BbWb5iA=="], + "@webassemblyjs/ast": ["@webassemblyjs/ast@1.14.1", "", { "dependencies": { "@webassemblyjs/helper-numbers": "1.13.2", "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ=="], "@webassemblyjs/floating-point-hex-parser": ["@webassemblyjs/floating-point-hex-parser@1.13.2", "", {}, "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA=="], @@ -818,6 +973,8 @@ "ansi-escapes": ["ansi-escapes@6.2.1", "", {}, "sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig=="], + "ansi-fragments": ["ansi-fragments@0.2.1", "", { "dependencies": { "colorette": "^1.0.7", "slice-ansi": "^2.0.0", "strip-ansi": "^5.0.0" } }, "sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w=="], + "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], @@ -826,6 +983,8 @@ "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], + "appdirsjs": ["appdirsjs@1.2.7", "", {}, "sha512-Quji6+8kLBC3NnBeo14nPDq0+2jUs5s3/xEye+udFHumHhRk4M7aAMXp/PBJqkKYGuuyR9M/6Dq7d2AViiGmhw=="], + "arg": ["arg@5.0.2", "", {}, "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg=="], "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], @@ -852,6 +1011,8 @@ "assert": ["assert@2.1.0", "", { "dependencies": { "call-bind": "^1.0.2", "is-nan": "^1.3.2", "object-is": "^1.1.5", "object.assign": "^4.1.4", "util": "^0.12.5" } }, "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw=="], + "astral-regex": ["astral-regex@1.0.0", "", {}, "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg=="], + "async-function": ["async-function@1.0.0", "", {}, "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA=="], "async-limiter": ["async-limiter@1.0.1", "", {}, "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ=="], @@ -902,6 +1063,10 @@ "binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="], + "bl": ["bl@4.1.0", "", { "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w=="], + + "body-parser": ["body-parser@1.20.4", "", { "dependencies": { "bytes": "~3.1.2", "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", "destroy": "~1.2.0", "http-errors": "~2.0.1", "iconv-lite": "~0.4.24", "on-finished": "~2.4.1", "qs": "~6.14.0", "raw-body": "~2.5.3", "type-is": "~1.6.18", "unpipe": "~1.0.0" } }, "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA=="], + "boolbase": ["boolbase@1.0.0", "", {}, "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="], "bplist-creator": ["bplist-creator@0.1.0", "", { "dependencies": { "stream-buffers": "2.2.x" } }, "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg=="], @@ -958,7 +1123,7 @@ "cjs-module-lexer": ["cjs-module-lexer@1.4.3", "", {}, "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q=="], - "cli-cursor": ["cli-cursor@2.1.0", "", { "dependencies": { "restore-cursor": "^2.0.0" } }, "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw=="], + "cli-cursor": ["cli-cursor@3.1.0", "", { "dependencies": { "restore-cursor": "^3.1.0" } }, "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw=="], "cli-spinners": ["cli-spinners@2.9.2", "", {}, "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg=="], @@ -980,9 +1145,13 @@ "color-string": ["color-string@1.9.1", "", { "dependencies": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" } }, "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg=="], + "colorette": ["colorette@1.4.0", "", {}, "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g=="], + "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="], - "commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="], + "command-exists": ["command-exists@1.2.9", "", {}, "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w=="], + + "commander": ["commander@9.5.0", "", {}, "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ=="], "compressible": ["compressible@2.0.18", "", { "dependencies": { "mime-db": ">= 1.43.0 < 2" } }, "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg=="], @@ -992,11 +1161,13 @@ "connect": ["connect@3.7.0", "", { "dependencies": { "debug": "2.6.9", "finalhandler": "1.1.2", "parseurl": "~1.3.3", "utils-merge": "1.0.1" } }, "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ=="], + "content-type": ["content-type@1.0.5", "", {}, "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="], + "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], "core-js-compat": ["core-js-compat@3.43.0", "", { "dependencies": { "browserslist": "^4.25.0" } }, "sha512-2GML2ZsCc5LR7hZYz4AXmjQw8zuy2T//2QntwdnpuYI7jteT6GVYJL7F6C2C57R7gSYrcqVW3lAALefdbhBLDA=="], - "cosmiconfig": ["cosmiconfig@5.2.1", "", { "dependencies": { "import-fresh": "^2.0.0", "is-directory": "^0.3.1", "js-yaml": "^3.13.1", "parse-json": "^4.0.0" } }, "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA=="], + "cosmiconfig": ["cosmiconfig@9.0.0", "", { "dependencies": { "env-paths": "^2.2.1", "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", "parse-json": "^5.2.0" }, "peerDependencies": { "typescript": ">=4.9.5" }, "optionalPeers": ["typescript"] }, "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg=="], "create-jest": ["create-jest@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", "jest-config": "^29.7.0", "jest-util": "^29.7.0", "prompts": "^2.0.1" }, "bin": { "create-jest": "bin/create-jest.js" } }, "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q=="], @@ -1108,10 +1279,16 @@ "env-editor": ["env-editor@0.4.2", "", {}, "sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA=="], + "env-paths": ["env-paths@2.2.1", "", {}, "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A=="], + + "envinfo": ["envinfo@7.21.0", "", { "bin": { "envinfo": "dist/cli.js" } }, "sha512-Lw7I8Zp5YKHFCXL7+Dz95g4CcbMEpgvqZNNq3AmlT5XAV6CgAAk6gyAMqn2zjw08K9BHfcNuKrMiCPLByGafow=="], + "error-ex": ["error-ex@1.3.2", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g=="], "error-stack-parser": ["error-stack-parser@2.1.4", "", { "dependencies": { "stackframe": "^1.3.4" } }, "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ=="], + "errorhandler": ["errorhandler@1.5.1", "", { "dependencies": { "accepts": "~1.3.7", "escape-html": "~1.0.3" } }, "sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A=="], + "es-abstract": ["es-abstract@1.24.0", "", { "dependencies": { "array-buffer-byte-length": "^1.0.2", "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "data-view-buffer": "^1.0.2", "data-view-byte-length": "^1.0.2", "data-view-byte-offset": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "es-set-tostringtag": "^2.1.0", "es-to-primitive": "^1.3.0", "function.prototype.name": "^1.1.8", "get-intrinsic": "^1.3.0", "get-proto": "^1.0.1", "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "internal-slot": "^1.1.0", "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", "is-data-view": "^1.0.2", "is-negative-zero": "^2.0.3", "is-regex": "^1.2.1", "is-set": "^2.0.3", "is-shared-array-buffer": "^1.0.4", "is-string": "^1.1.1", "is-typed-array": "^1.1.15", "is-weakref": "^1.1.1", "math-intrinsics": "^1.1.0", "object-inspect": "^1.13.4", "object-keys": "^1.1.1", "object.assign": "^4.1.7", "own-keys": "^1.0.1", "regexp.prototype.flags": "^1.5.4", "safe-array-concat": "^1.1.3", "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", "set-proto": "^1.0.0", "stop-iteration-iterator": "^1.1.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", "typed-array-buffer": "^1.0.3", "typed-array-byte-length": "^1.0.3", "typed-array-byte-offset": "^1.0.4", "typed-array-length": "^1.0.7", "unbox-primitive": "^1.1.0", "which-typed-array": "^1.1.19" } }, "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg=="], "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], @@ -1288,8 +1465,12 @@ "fast-uri": ["fast-uri@3.0.6", "", {}, "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw=="], + "fast-xml-parser": ["fast-xml-parser@4.5.3", "", { "dependencies": { "strnum": "^1.1.1" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig=="], + "fastq": ["fastq@1.19.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ=="], + "faye-websocket": ["faye-websocket@0.11.4", "", { "dependencies": { "websocket-driver": ">=0.5.1" } }, "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g=="], + "fb-watchman": ["fb-watchman@2.0.2", "", { "dependencies": { "bser": "2.1.1" } }, "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA=="], "fbjs": ["fbjs@3.0.5", "", { "dependencies": { "cross-fetch": "^3.1.5", "fbjs-css-vars": "^1.0.0", "loose-envify": "^1.0.0", "object-assign": "^4.1.0", "promise": "^7.1.1", "setimmediate": "^1.0.5", "ua-parser-js": "^1.0.35" } }, "sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg=="], @@ -1308,6 +1489,8 @@ "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], + "firebase": ["firebase@12.6.0", "", { "dependencies": { "@firebase/ai": "2.6.0", "@firebase/analytics": "0.10.19", "@firebase/analytics-compat": "0.2.25", "@firebase/app": "0.14.6", "@firebase/app-check": "0.11.0", "@firebase/app-check-compat": "0.4.0", "@firebase/app-compat": "0.5.6", "@firebase/app-types": "0.9.3", "@firebase/auth": "1.11.1", "@firebase/auth-compat": "0.6.1", "@firebase/data-connect": "0.3.12", "@firebase/database": "1.1.0", "@firebase/database-compat": "2.1.0", "@firebase/firestore": "4.9.2", "@firebase/firestore-compat": "0.4.2", "@firebase/functions": "0.13.1", "@firebase/functions-compat": "0.4.1", "@firebase/installations": "0.6.19", "@firebase/installations-compat": "0.2.19", "@firebase/messaging": "0.12.23", "@firebase/messaging-compat": "0.2.23", "@firebase/performance": "0.7.9", "@firebase/performance-compat": "0.2.22", "@firebase/remote-config": "0.7.0", "@firebase/remote-config-compat": "0.2.20", "@firebase/storage": "0.14.0", "@firebase/storage-compat": "0.4.0", "@firebase/util": "1.13.0" } }, "sha512-8ZD1Gcv916Qp8/nsFH2+QMIrfX/76ti6cJwxQUENLXXnKlOX/IJZaU2Y3bdYf5r1mbownrQKfnWtrt+MVgdwLA=="], + "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="], "flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="], @@ -1332,6 +1515,8 @@ "fresh": ["fresh@0.5.2", "", {}, "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="], + "fs-extra": ["fs-extra@8.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g=="], + "fs-readdir-recursive": ["fs-readdir-recursive@1.1.0", "", {}, "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA=="], "fs.realpath": ["fs.realpath@1.0.0", "", {}, "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="], @@ -1414,7 +1599,9 @@ "html-escaper": ["html-escaper@2.0.2", "", {}, "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg=="], - "http-errors": ["http-errors@2.0.0", "", { "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": "2.0.1", "toidentifier": "1.0.1" } }, "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ=="], + "http-errors": ["http-errors@2.0.1", "", { "dependencies": { "depd": "~2.0.0", "inherits": "~2.0.4", "setprototypeof": "~1.2.0", "statuses": "~2.0.2", "toidentifier": "~1.0.1" } }, "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ=="], + + "http-parser-js": ["http-parser-js@0.5.10", "", {}, "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA=="], "http-proxy-agent": ["http-proxy-agent@5.0.0", "", { "dependencies": { "@tootallnate/once": "2", "agent-base": "6", "debug": "4" } }, "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w=="], @@ -1424,7 +1611,9 @@ "hyphenate-style-name": ["hyphenate-style-name@1.1.0", "", {}, "sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw=="], - "iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="], + "iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="], + + "idb": ["idb@7.1.1", "", {}, "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ=="], "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], @@ -1492,6 +1681,8 @@ "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], + "is-interactive": ["is-interactive@1.0.0", "", {}, "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w=="], + "is-map": ["is-map@2.0.3", "", {}, "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw=="], "is-nan": ["is-nan@1.3.2", "", { "dependencies": { "call-bind": "^1.0.0", "define-properties": "^1.1.3" } }, "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w=="], @@ -1520,13 +1711,15 @@ "is-typed-array": ["is-typed-array@1.1.15", "", { "dependencies": { "which-typed-array": "^1.1.16" } }, "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ=="], + "is-unicode-supported": ["is-unicode-supported@0.1.0", "", {}, "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw=="], + "is-weakmap": ["is-weakmap@2.0.2", "", {}, "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w=="], "is-weakref": ["is-weakref@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew=="], "is-weakset": ["is-weakset@2.0.4", "", { "dependencies": { "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ=="], - "is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], + "is-wsl": ["is-wsl@1.1.0", "", {}, "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw=="], "isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], @@ -1610,6 +1803,8 @@ "jimp-compact": ["jimp-compact@0.16.1", "", {}, "sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww=="], + "joi": ["joi@17.13.3", "", { "dependencies": { "@hapi/hoek": "^9.3.0", "@hapi/topo": "^5.1.0", "@sideway/address": "^4.1.5", "@sideway/formula": "^3.0.1", "@sideway/pinpoint": "^2.0.0" } }, "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA=="], + "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], "js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": "bin/js-yaml.js" }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], @@ -1632,6 +1827,8 @@ "json5": ["json5@2.2.3", "", { "bin": "lib/cli.js" }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], + "jsonfile": ["jsonfile@4.0.0", "", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg=="], + "jsx-ast-utils": ["jsx-ast-utils@3.3.5", "", { "dependencies": { "array-includes": "^3.1.6", "array.prototype.flat": "^1.3.1", "object.assign": "^4.1.4", "object.values": "^1.1.6" } }, "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ=="], "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], @@ -1640,6 +1837,8 @@ "lan-network": ["lan-network@0.1.7", "", { "bin": "dist/lan-network-cli.js" }, "sha512-mnIlAEMu4OyEvUNdzco9xpuB9YVcPkQec+QsgycBCtPZvEqWPCDPfbAE4OJMdBBWpZWtpCn1xw9jJYlwjWI5zQ=="], + "launch-editor": ["launch-editor@2.12.0", "", { "dependencies": { "picocolors": "^1.1.1", "shell-quote": "^1.8.3" } }, "sha512-giOHXoOtifjdHqUamwKq6c49GzBdLjvxrd2D+Q4V6uOHopJv7p9VJxikDsQ/CBXZbEITgUqSVHXLTG3VhPP1Dg=="], + "leven": ["leven@3.1.0", "", {}, "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A=="], "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], @@ -1676,6 +1875,8 @@ "lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="], + "lodash.camelcase": ["lodash.camelcase@4.3.0", "", {}, "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="], + "lodash.debounce": ["lodash.debounce@4.0.8", "", {}, "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="], "lodash.memoize": ["lodash.memoize@4.1.2", "", {}, "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag=="], @@ -1684,7 +1885,11 @@ "lodash.throttle": ["lodash.throttle@4.1.1", "", {}, "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ=="], - "log-symbols": ["log-symbols@2.2.0", "", { "dependencies": { "chalk": "^2.0.1" } }, "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg=="], + "log-symbols": ["log-symbols@4.1.0", "", { "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" } }, "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg=="], + + "logkitty": ["logkitty@0.7.1", "", { "dependencies": { "ansi-fragments": "^0.2.1", "dayjs": "^1.8.15", "yargs": "^15.1.0" }, "bin": { "logkitty": "bin/logkitty.js" } }, "sha512-/3ER20CTTbahrCrpYfPn7Xavv9diBROZpoXGVZDWMw4b/X4uuUwAC0ki85tgsdMRONURyIJbcOvS94QsUBYPbQ=="], + + "long": ["long@5.3.2", "", {}, "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA=="], "loose-envify": ["loose-envify@1.4.0", "", { "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": "cli.js" }, "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="], @@ -1702,6 +1907,8 @@ "mdn-data": ["mdn-data@2.0.14", "", {}, "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow=="], + "media-typer": ["media-typer@0.3.0", "", {}, "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="], + "memoize-one": ["memoize-one@5.2.1", "", {}, "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q=="], "merge-options": ["merge-options@3.0.4", "", { "dependencies": { "is-plain-obj": "^2.1.0" } }, "sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ=="], @@ -1740,13 +1947,13 @@ "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], - "mime": ["mime@1.6.0", "", { "bin": "cli.js" }, "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="], + "mime": ["mime@2.6.0", "", { "bin": { "mime": "cli.js" } }, "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg=="], "mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], "mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], - "mimic-fn": ["mimic-fn@1.2.0", "", {}, "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ=="], + "mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="], "min-indent": ["min-indent@1.0.1", "", {}, "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg=="], @@ -1772,12 +1979,14 @@ "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], - "negotiator": ["negotiator@0.6.3", "", {}, "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="], + "negotiator": ["negotiator@0.6.4", "", {}, "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w=="], "neo-async": ["neo-async@2.6.2", "", {}, "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="], "nested-error-stacks": ["nested-error-stacks@2.0.1", "", {}, "sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A=="], + "nocache": ["nocache@3.0.4", "", {}, "sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw=="], + "node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], "node-forge": ["node-forge@1.3.1", "", {}, "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA=="], @@ -1786,6 +1995,8 @@ "node-releases": ["node-releases@2.0.19", "", {}, "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw=="], + "node-stream-zip": ["node-stream-zip@1.15.0", "", {}, "sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw=="], + "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], "npm-package-arg": ["npm-package-arg@11.0.3", "", { "dependencies": { "hosted-git-info": "^7.0.0", "proc-log": "^4.0.0", "semver": "^7.3.5", "validate-npm-package-name": "^5.0.0" } }, "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw=="], @@ -1824,13 +2035,13 @@ "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], - "onetime": ["onetime@2.0.1", "", { "dependencies": { "mimic-fn": "^1.0.0" } }, "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ=="], + "onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], - "open": ["open@7.4.2", "", { "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" } }, "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q=="], + "open": ["open@6.4.0", "", { "dependencies": { "is-wsl": "^1.1.0" } }, "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg=="], "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], - "ora": ["ora@3.4.0", "", { "dependencies": { "chalk": "^2.4.2", "cli-cursor": "^2.1.0", "cli-spinners": "^2.0.0", "log-symbols": "^2.2.0", "strip-ansi": "^5.2.0", "wcwidth": "^1.0.1" } }, "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg=="], + "ora": ["ora@5.4.1", "", { "dependencies": { "bl": "^4.1.0", "chalk": "^4.1.0", "cli-cursor": "^3.1.0", "cli-spinners": "^2.5.0", "is-interactive": "^1.0.0", "is-unicode-supported": "^0.1.0", "log-symbols": "^4.1.0", "strip-ansi": "^6.0.0", "wcwidth": "^1.0.1" } }, "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ=="], "own-keys": ["own-keys@1.0.1", "", { "dependencies": { "get-intrinsic": "^1.2.6", "object-keys": "^1.1.1", "safe-push-apply": "^1.0.0" } }, "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg=="], @@ -1844,7 +2055,7 @@ "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], - "parse-json": ["parse-json@4.0.0", "", { "dependencies": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" } }, "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw=="], + "parse-json": ["parse-json@5.2.0", "", { "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="], "parse-png": ["parse-png@2.1.0", "", { "dependencies": { "pngjs": "^3.3.0" } }, "sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ=="], @@ -1906,6 +2117,8 @@ "prop-types": ["prop-types@15.8.1", "", { "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" } }, "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg=="], + "protobufjs": ["protobufjs@7.5.4", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", "@protobufjs/codegen": "^2.0.4", "@protobufjs/eventemitter": "^1.1.0", "@protobufjs/fetch": "^1.1.0", "@protobufjs/float": "^1.0.2", "@protobufjs/inquire": "^1.1.0", "@protobufjs/path": "^1.1.2", "@protobufjs/pool": "^1.1.0", "@protobufjs/utf8": "^1.1.0", "@types/node": ">=13.7.0", "long": "^5.0.0" } }, "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg=="], + "proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="], "psl": ["psl@1.15.0", "", { "dependencies": { "punycode": "^2.3.1" } }, "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w=="], @@ -1918,6 +2131,8 @@ "qrcode-terminal": ["qrcode-terminal@0.11.0", "", { "bin": "bin/qrcode-terminal.js" }, "sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ=="], + "qs": ["qs@6.14.0", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w=="], + "query-string": ["query-string@7.1.3", "", { "dependencies": { "decode-uri-component": "^0.2.2", "filter-obj": "^1.1.0", "split-on-first": "^1.0.0", "strict-uri-encode": "^2.0.0" } }, "sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg=="], "querystringify": ["querystringify@2.2.0", "", {}, "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ=="], @@ -1932,6 +2147,8 @@ "range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="], + "raw-body": ["raw-body@2.5.3", "", { "dependencies": { "bytes": "~3.1.2", "http-errors": "~2.0.1", "iconv-lite": "~0.4.24", "unpipe": "~1.0.0" } }, "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA=="], + "rbush": ["rbush@3.0.1", "", { "dependencies": { "quickselect": "^2.0.0" } }, "sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w=="], "rc": ["rc@1.2.8", "", { "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" }, "bin": "cli.js" }, "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw=="], @@ -2004,6 +2221,8 @@ "react-test-renderer": ["react-test-renderer@19.0.0", "", { "dependencies": { "react-is": "^19.0.0", "scheduler": "^0.25.0" }, "peerDependencies": { "react": "^19.0.0" } }, "sha512-oX5u9rOQlHzqrE/64CNr0HB0uWxkCQmZNSfozlYvwE71TLVgeZxVf0IjouGEr1v7r1kcDifdAJBeOhdhxsG/DA=="], + "readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], + "readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], "redent": ["redent@3.0.0", "", { "dependencies": { "indent-string": "^4.0.0", "strip-indent": "^3.0.0" } }, "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg=="], @@ -2050,7 +2269,7 @@ "resolve.exports": ["resolve.exports@2.0.3", "", {}, "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A=="], - "restore-cursor": ["restore-cursor@2.0.0", "", { "dependencies": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" } }, "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q=="], + "restore-cursor": ["restore-cursor@3.1.0", "", { "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" } }, "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA=="], "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], @@ -2118,7 +2337,7 @@ "side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="], - "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + "signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], "simple-plist": ["simple-plist@1.3.1", "", { "dependencies": { "bplist-creator": "0.1.0", "bplist-parser": "0.3.1", "plist": "^3.0.5" } }, "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw=="], @@ -2128,6 +2347,8 @@ "slash": ["slash@2.0.0", "", {}, "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A=="], + "slice-ansi": ["slice-ansi@2.1.0", "", { "dependencies": { "ansi-styles": "^3.2.0", "astral-regex": "^1.0.0", "is-fullwidth-code-point": "^2.0.0" } }, "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ=="], + "slugify": ["slugify@1.6.6", "", {}, "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw=="], "source-map": ["source-map@0.5.7", "", {}, "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="], @@ -2178,6 +2399,8 @@ "string.prototype.trimstart": ["string.prototype.trimstart@1.0.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg=="], + "string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], + "strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="], "strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], @@ -2190,6 +2413,8 @@ "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], + "strnum": ["strnum@1.1.2", "", {}, "sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA=="], + "structured-headers": ["structured-headers@0.4.1", "", {}, "sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg=="], "style-value-types": ["style-value-types@5.0.0", "", { "dependencies": { "hey-listen": "^1.0.8", "tslib": "^2.1.0" } }, "sha512-08yq36Ikn4kx4YU6RD7jWEv27v4V+PUsOGa4n/as8Et3CuODMJQ00ENeAVXAeydX4Z2j1XHZF1K2sX4mGl18fA=="], @@ -2260,6 +2485,8 @@ "type-fest": ["type-fest@0.7.1", "", {}, "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg=="], + "type-is": ["type-is@1.6.18", "", { "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" } }, "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g=="], + "typed-array-buffer": ["typed-array-buffer@1.0.3", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-typed-array": "^1.1.14" } }, "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw=="], "typed-array-byte-length": ["typed-array-byte-length@1.0.3", "", { "dependencies": { "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.14" } }, "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg=="], @@ -2288,7 +2515,7 @@ "unique-string": ["unique-string@2.0.0", "", { "dependencies": { "crypto-random-string": "^2.0.0" } }, "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg=="], - "universalify": ["universalify@0.2.0", "", {}, "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg=="], + "universalify": ["universalify@0.1.2", "", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="], "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="], @@ -2310,6 +2537,8 @@ "util": ["util@0.12.5", "", { "dependencies": { "inherits": "^2.0.3", "is-arguments": "^1.0.4", "is-generator-function": "^1.0.7", "is-typed-array": "^1.1.3", "which-typed-array": "^1.1.2" } }, "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA=="], + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], + "utils-merge": ["utils-merge@1.0.1", "", {}, "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="], "uuid": ["uuid@7.0.3", "", { "bin": "dist/bin/uuid" }, "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg=="], @@ -2334,12 +2563,18 @@ "wcwidth": ["wcwidth@1.0.1", "", { "dependencies": { "defaults": "^1.0.3" } }, "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg=="], + "web-vitals": ["web-vitals@4.2.4", "", {}, "sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw=="], + "webidl-conversions": ["webidl-conversions@5.0.0", "", {}, "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA=="], "webpack": ["webpack@5.101.3", "", { "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", "@types/json-schema": "^7.0.15", "@webassemblyjs/ast": "^1.14.1", "@webassemblyjs/wasm-edit": "^1.14.1", "@webassemblyjs/wasm-parser": "^1.14.1", "acorn": "^8.15.0", "acorn-import-phases": "^1.0.3", "browserslist": "^4.24.0", "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^5.17.3", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", "schema-utils": "^4.3.2", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.3.11", "watchpack": "^2.4.1", "webpack-sources": "^3.3.3" }, "bin": { "webpack": "bin/webpack.js" } }, "sha512-7b0dTKR3Ed//AD/6kkx/o7duS8H3f1a4w3BYpIriX4BzIhjkn4teo05cptsxvLesHFKK5KObnadmCHBwGc+51A=="], "webpack-sources": ["webpack-sources@3.3.3", "", {}, "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg=="], + "websocket-driver": ["websocket-driver@0.7.4", "", { "dependencies": { "http-parser-js": ">=0.5.1", "safe-buffer": ">=5.1.0", "websocket-extensions": ">=0.1.1" } }, "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg=="], + + "websocket-extensions": ["websocket-extensions@0.1.4", "", {}, "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg=="], + "whatwg-encoding": ["whatwg-encoding@2.0.0", "", { "dependencies": { "iconv-lite": "0.6.3" } }, "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg=="], "whatwg-fetch": ["whatwg-fetch@3.6.20", "", {}, "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg=="], @@ -2390,6 +2625,8 @@ "yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], + "yaml": ["yaml@2.8.2", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A=="], + "yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], @@ -2450,6 +2687,8 @@ "@expo/cli/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + "@expo/cli/ora": ["ora@3.4.0", "", { "dependencies": { "chalk": "^2.4.2", "cli-cursor": "^2.1.0", "cli-spinners": "^2.0.0", "log-symbols": "^2.2.0", "strip-ansi": "^5.2.0", "wcwidth": "^1.0.1" } }, "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg=="], + "@expo/cli/resolve": ["resolve@1.22.10", "", { "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": "bin/resolve" }, "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w=="], "@expo/cli/semver": ["semver@7.7.2", "", { "bin": "bin/semver.js" }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], @@ -2488,6 +2727,8 @@ "@expo/package-manager/@expo/json-file": ["@expo/json-file@10.0.7", "", { "dependencies": { "@babel/code-frame": "~7.10.4", "json5": "^2.2.3" } }, "sha512-z2OTC0XNO6riZu98EjdNHC05l51ySeTto6GP7oSQrCvQgG9ARBwD1YvMQaVZ9wU7p/4LzSf1O7tckL3B45fPpw=="], + "@expo/package-manager/ora": ["ora@3.4.0", "", { "dependencies": { "chalk": "^2.4.2", "cli-cursor": "^2.1.0", "cli-spinners": "^2.0.0", "log-symbols": "^2.2.0", "strip-ansi": "^5.2.0", "wcwidth": "^1.0.1" } }, "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg=="], + "@expo/prebuild-config/@expo/json-file": ["@expo/json-file@10.0.7", "", { "dependencies": { "@babel/code-frame": "~7.10.4", "json5": "^2.2.3" } }, "sha512-z2OTC0XNO6riZu98EjdNHC05l51ySeTto6GP7oSQrCvQgG9ARBwD1YvMQaVZ9wU7p/4LzSf1O7tckL3B45fPpw=="], "@expo/prebuild-config/semver": ["semver@7.7.2", "", { "bin": "bin/semver.js" }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], @@ -2538,6 +2779,12 @@ "@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], + "@react-native-community/cli/semver": ["semver@7.7.2", "", { "bin": "bin/semver.js" }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], + + "@react-native-community/cli-doctor/semver": ["semver@7.7.2", "", { "bin": "bin/semver.js" }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], + + "@react-native-community/cli-tools/semver": ["semver@7.7.2", "", { "bin": "bin/semver.js" }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], + "@react-native/babel-plugin-codegen/@react-native/codegen": ["@react-native/codegen@0.79.5", "", { "dependencies": { "glob": "^7.1.1", "hermes-parser": "0.25.1", "invariant": "^2.2.4", "nullthrows": "^1.1.1", "yargs": "^17.6.2" }, "peerDependencies": { "@babel/core": "*" } }, "sha512-FO5U1R525A1IFpJjy+KVznEinAgcs3u7IbnbRJUG9IH/MBXi2lEU2LtN+JarJ81MCfW4V2p0pg6t/3RGHFRrlQ=="], "@react-native/babel-preset/@babel/plugin-transform-async-generator-functions": ["@babel/plugin-transform-async-generator-functions@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-remap-async-to-generator": "^7.27.1", "@babel/traverse": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-eST9RrwlpaoJBDHShc+DS2SG4ATTi2MYNb4OxYkf3n+7eb49LWpnS+HSpVfW4x927qQwgk8A2hGNVaajAEw0EA=="], @@ -2562,6 +2809,8 @@ "@react-native/community-cli-plugin/semver": ["semver@7.7.2", "", { "bin": "bin/semver.js" }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], + "@react-native/dev-middleware/open": ["open@7.4.2", "", { "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" } }, "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q=="], + "@react-navigation/bottom-tabs/@react-navigation/elements": ["@react-navigation/elements@2.5.2", "", { "dependencies": { "color": "^4.2.3", "use-latest-callback": "^0.2.4", "use-sync-external-store": "^1.5.0" }, "peerDependencies": { "@react-native-masked-view/masked-view": ">= 0.2.0", "@react-navigation/native": "^7.1.14", "react": ">= 18.2.0", "react-native": "*", "react-native-safe-area-context": ">= 4.0.0" }, "optionalPeers": ["@react-native-masked-view/masked-view"] }, "sha512-aGC3ukF5+lXuiF5bK7bJyRuWCE+Tk4MZ3GoQpAb7u7+m0KmsquliDhj4UCWEUU5kUoCeoRAUvv+1lKcYKf+WTQ=="], "@react-navigation/drawer/@react-navigation/elements": ["@react-navigation/elements@2.5.2", "", { "dependencies": { "color": "^4.2.3", "use-latest-callback": "^0.2.4", "use-sync-external-store": "^1.5.0" }, "peerDependencies": { "@react-native-masked-view/masked-view": ">= 0.2.0", "@react-navigation/native": "^7.1.14", "react": ">= 18.2.0", "react-native": "*", "react-native-safe-area-context": ">= 4.0.0" }, "optionalPeers": ["@react-native-masked-view/masked-view"] }, "sha512-aGC3ukF5+lXuiF5bK7bJyRuWCE+Tk4MZ3GoQpAb7u7+m0KmsquliDhj4UCWEUU5kUoCeoRAUvv+1lKcYKf+WTQ=="], @@ -2584,10 +2833,14 @@ "@typescript-eslint/typescript-estree/semver": ["semver@7.7.2", "", { "bin": "bin/semver.js" }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], + "accepts/negotiator": ["negotiator@0.6.3", "", {}, "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="], + "ajv-formats/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], "ajv-keywords/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], + "ansi-fragments/strip-ansi": ["strip-ansi@5.2.0", "", { "dependencies": { "ansi-regex": "^4.1.0" } }, "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA=="], + "anymatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], "babel-jest/slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="], @@ -2604,10 +2857,16 @@ "better-opn/open": ["open@8.4.2", "", { "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", "is-wsl": "^2.2.0" } }, "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ=="], + "body-parser/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + "caller-callsite/callsites": ["callsites@2.0.0", "", {}, "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ=="], "chokidar/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + "chrome-launcher/is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], + + "chromium-edge-launcher/is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], + "chromium-edge-launcher/mkdirp": ["mkdirp@1.0.4", "", { "bin": "bin/cmd.js" }, "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="], "cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], @@ -2616,14 +2875,8 @@ "compression/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], - "compression/negotiator": ["negotiator@0.6.4", "", {}, "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w=="], - "connect/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], - "cosmiconfig/import-fresh": ["import-fresh@2.0.0", "", { "dependencies": { "caller-path": "^2.0.0", "resolve-from": "^3.0.0" } }, "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg=="], - - "cosmiconfig/js-yaml": ["js-yaml@3.14.1", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": "bin/js-yaml.js" }, "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g=="], - "css-tree/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], "cssstyle/cssom": ["cssom@0.3.8", "", {}, "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg=="], @@ -2652,10 +2905,6 @@ "eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@1.3.0", "", {}, "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ=="], - "execa/onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], - - "execa/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], - "expect/jest-matcher-utils": ["jest-matcher-utils@29.7.0", "", { "dependencies": { "chalk": "^4.0.0", "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", "pretty-format": "^29.7.0" } }, "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g=="], "expo/babel-preset-expo": ["babel-preset-expo@54.0.0", "", { "dependencies": { "@babel/helper-module-imports": "^7.25.9", "@babel/plugin-proposal-decorators": "^7.12.9", "@babel/plugin-proposal-export-default-from": "^7.24.7", "@babel/plugin-syntax-export-default-from": "^7.24.7", "@babel/plugin-transform-class-static-block": "^7.27.1", "@babel/plugin-transform-export-namespace-from": "^7.25.9", "@babel/plugin-transform-flow-strip-types": "^7.25.2", "@babel/plugin-transform-modules-commonjs": "^7.24.8", "@babel/plugin-transform-object-rest-spread": "^7.24.7", "@babel/plugin-transform-parameters": "^7.24.7", "@babel/plugin-transform-private-methods": "^7.24.7", "@babel/plugin-transform-private-property-in-object": "^7.24.7", "@babel/plugin-transform-runtime": "^7.24.7", "@babel/preset-react": "^7.22.15", "@babel/preset-typescript": "^7.23.0", "@react-native/babel-preset": "0.81.4", "babel-plugin-react-compiler": "^19.1.0-rc.2", "babel-plugin-react-native-web": "~0.21.0", "babel-plugin-syntax-hermes-parser": "^0.25.1", "babel-plugin-transform-flow-enums": "^0.0.2", "debug": "^4.3.4", "resolve-from": "^5.0.0" }, "peerDependencies": { "@babel/runtime": "^7.20.0", "expo": "*", "react-refresh": ">=0.14.0 <1.0.0" }, "optionalPeers": ["@babel/runtime", "expo"] }, "sha512-a0Ej4ik6xzvtrA4Ivblov3XVvfntIoqnXOy2jG2k/3hzWqzrJxKyY2gUW9ZCMAicGevj2ju28q+TsK29uTe0eQ=="], @@ -2670,6 +2919,8 @@ "expo-linking/expo-constants": ["expo-constants@18.0.8", "", { "dependencies": { "@expo/config": "~12.0.8", "@expo/env": "~2.0.7" }, "peerDependencies": { "expo": "*", "react-native": "*" } }, "sha512-Tetphsx6RVImCTZeBAclRQMy0WOODY3y6qrUoc88YGUBVm8fAKkErCSWxLTCc6nFcJxdoOMYi62LgNIUFjZCLA=="], + "expo-module-scripts/commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="], + "expo-module-scripts/typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="], "expo-modules-autolinking/commander": ["commander@7.2.0", "", {}, "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw=="], @@ -2692,6 +2943,8 @@ "finalhandler/statuses": ["statuses@1.5.0", "", {}, "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA=="], + "foreground-child/signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + "geojson-rbush/@types/geojson": ["@types/geojson@7946.0.8", "", {}, "sha512-1rkryxURpr6aWP7R786/UQOkJ3PcpQiWkAXBmdWc7ryFWqN6a4xfK7BtjXvFBKO9LjQ+MWQSWxYeZX1OApnArA=="], "glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], @@ -2700,6 +2953,8 @@ "hosted-git-info/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], + "http-errors/statuses": ["statuses@2.0.2", "", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="], + "http-proxy-agent/agent-base": ["agent-base@6.0.2", "", { "dependencies": { "debug": "4" } }, "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ=="], "import-fresh/resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], @@ -2716,8 +2971,6 @@ "jest-config/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], - "jest-config/parse-json": ["parse-json@5.2.0", "", { "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="], - "jest-config/slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="], "jest-diff/pretty-format": ["pretty-format@30.0.5", "", { "dependencies": { "@jest/schemas": "30.0.5", "ansi-styles": "^5.2.0", "react-is": "^18.3.1" } }, "sha512-D1tKtYvByrBkFLe2wHJl2bwMJIiT8rW+XA+TiataH79/FszLQMrpGEvzUVkzPau7OCO0Qnrhpe87PqtOAIB8Yw=="], @@ -2772,7 +3025,7 @@ "lighthouse-logger/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], - "log-symbols/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], + "logkitty/yargs": ["yargs@15.4.1", "", { "dependencies": { "cliui": "^6.0.0", "decamelize": "^1.2.0", "find-up": "^4.1.0", "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", "string-width": "^4.2.0", "which-module": "^2.0.0", "y18n": "^4.0.0", "yargs-parser": "^18.1.2" } }, "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A=="], "make-dir/semver": ["semver@5.7.2", "", { "bin": { "semver": "bin/semver" } }, "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="], @@ -2788,6 +3041,8 @@ "metro/ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="], + "metro-config/cosmiconfig": ["cosmiconfig@5.2.1", "", { "dependencies": { "import-fresh": "^2.0.0", "is-directory": "^0.3.1", "js-yaml": "^3.13.1", "parse-json": "^4.0.0" } }, "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA=="], + "metro-source-map/@babel/traverse": ["@babel/traverse@7.28.3", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.28.3", "@babel/template": "^7.27.2", "@babel/types": "^7.28.2", "debug": "^4.3.1" } }, "sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ=="], "metro-source-map/@babel/types": ["@babel/types@7.28.2", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ=="], @@ -2808,9 +3063,7 @@ "npm-package-arg/semver": ["semver@7.7.2", "", { "bin": "bin/semver.js" }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], - "ora/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], - - "ora/strip-ansi": ["strip-ansi@5.2.0", "", { "dependencies": { "ansi-regex": "^4.1.0" } }, "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA=="], + "ora/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], "parse-png/pngjs": ["pngjs@3.4.0", "", {}, "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w=="], @@ -2832,6 +3085,8 @@ "react-devtools-core/ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="], + "react-native/commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="], + "react-native/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], "react-native/semver": ["semver@7.7.2", "", { "bin": "bin/semver.js" }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], @@ -2856,18 +3111,24 @@ "requireg/resolve": ["resolve@1.7.1", "", { "dependencies": { "path-parse": "^1.0.5" } }, "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw=="], - "restore-cursor/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], - "rimraf/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], "schema-utils/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], "send/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + "send/http-errors": ["http-errors@2.0.0", "", { "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": "2.0.1", "toidentifier": "1.0.1" } }, "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ=="], + + "send/mime": ["mime@1.6.0", "", { "bin": "cli.js" }, "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="], + "serve-static/send": ["send@0.19.0", "", { "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", "http-errors": "2.0.0", "mime": "1.6.0", "ms": "2.1.3", "on-finished": "2.4.1", "range-parser": "~1.2.1", "statuses": "2.0.1" } }, "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw=="], "simple-plist/bplist-parser": ["bplist-parser@0.3.1", "", { "dependencies": { "big-integer": "1.6.x" } }, "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA=="], + "slice-ansi/ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], + + "slice-ansi/is-fullwidth-code-point": ["is-fullwidth-code-point@2.0.0", "", {}, "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w=="], + "source-map-support/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], "stack-utils/escape-string-regexp": ["escape-string-regexp@2.0.0", "", {}, "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w=="], @@ -2896,6 +3157,8 @@ "tinyglobby/picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="], + "tough-cookie/universalify": ["universalify@0.2.0", "", {}, "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg=="], + "ts-declaration-location/picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="], "ts-jest/semver": ["semver@7.7.2", "", { "bin": "bin/semver.js" }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], @@ -2906,14 +3169,14 @@ "webpack/eslint-scope": ["eslint-scope@5.1.1", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw=="], + "whatwg-encoding/iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="], + "whatwg-url/webidl-conversions": ["webidl-conversions@7.0.0", "", {}, "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g=="], "wrap-ansi/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], "wrap-ansi-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "write-file-atomic/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], - "xml2js/xmlbuilder": ["xmlbuilder@11.0.1", "", {}, "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA=="], "@babel/highlight/chalk/ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], @@ -2980,6 +3243,14 @@ "@expo/cli/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + "@expo/cli/ora/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], + + "@expo/cli/ora/cli-cursor": ["cli-cursor@2.1.0", "", { "dependencies": { "restore-cursor": "^2.0.0" } }, "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw=="], + + "@expo/cli/ora/log-symbols": ["log-symbols@2.2.0", "", { "dependencies": { "chalk": "^2.0.1" } }, "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg=="], + + "@expo/cli/ora/strip-ansi": ["strip-ansi@5.2.0", "", { "dependencies": { "ansi-regex": "^4.1.0" } }, "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA=="], + "@expo/config-plugins/@expo/json-file/@babel/code-frame": ["@babel/code-frame@7.10.4", "", { "dependencies": { "@babel/highlight": "^7.10.4" } }, "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg=="], "@expo/fingerprint/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], @@ -2998,6 +3269,14 @@ "@expo/package-manager/@expo/json-file/@babel/code-frame": ["@babel/code-frame@7.10.4", "", { "dependencies": { "@babel/highlight": "^7.10.4" } }, "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg=="], + "@expo/package-manager/ora/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], + + "@expo/package-manager/ora/cli-cursor": ["cli-cursor@2.1.0", "", { "dependencies": { "restore-cursor": "^2.0.0" } }, "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw=="], + + "@expo/package-manager/ora/log-symbols": ["log-symbols@2.2.0", "", { "dependencies": { "chalk": "^2.0.1" } }, "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg=="], + + "@expo/package-manager/ora/strip-ansi": ["strip-ansi@5.2.0", "", { "dependencies": { "ansi-regex": "^4.1.0" } }, "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA=="], + "@expo/prebuild-config/@expo/json-file/@babel/code-frame": ["@babel/code-frame@7.10.4", "", { "dependencies": { "@babel/highlight": "^7.10.4" } }, "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg=="], "@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], @@ -3026,6 +3305,8 @@ "@react-native/codegen/@babel/parser/@babel/types": ["@babel/types@7.28.2", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ=="], + "@react-native/dev-middleware/open/is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], + "@testing-library/react-native/pretty-format/@jest/schemas": ["@jest/schemas@30.0.5", "", { "dependencies": { "@sinclair/typebox": "^0.34.0" } }, "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA=="], "@testing-library/react-native/pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], @@ -3038,20 +3319,20 @@ "ajv-keywords/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + "ansi-fragments/strip-ansi/ansi-regex": ["ansi-regex@4.1.1", "", {}, "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g=="], + "babel-preset-expo/@babel/plugin-transform-object-rest-spread/@babel/plugin-transform-destructuring": ["@babel/plugin-transform-destructuring@7.27.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-s4Jrok82JpiaIprtY2nHsYmrThKvvwgHwjgd7UMiYhZaN0asdXNLr0y+NjTfkA7SyQE5i2Fb7eawUOZmLvyqOA=="], "babel-preset-expo/babel-plugin-syntax-hermes-parser/hermes-parser": ["hermes-parser@0.25.1", "", { "dependencies": { "hermes-estree": "0.25.1" } }, "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA=="], + "better-opn/open/is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], + + "body-parser/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + "compression/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], "connect/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], - "cosmiconfig/import-fresh/resolve-from": ["resolve-from@3.0.0", "", {}, "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw=="], - - "cosmiconfig/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], - - "execa/onetime/mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="], - "expect/jest-matcher-utils/jest-diff": ["jest-diff@29.7.0", "", { "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", "jest-get-type": "^29.6.3", "pretty-format": "^29.7.0" } }, "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw=="], "expo-constants/@expo/config/@babel/code-frame": ["@babel/code-frame@7.10.4", "", { "dependencies": { "@babel/highlight": "^7.10.4" } }, "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg=="], @@ -3116,11 +3397,19 @@ "lighthouse-logger/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], - "log-symbols/chalk/ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], + "logkitty/yargs/cliui": ["cliui@6.0.0", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^6.2.0" } }, "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ=="], - "log-symbols/chalk/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + "logkitty/yargs/find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="], - "log-symbols/chalk/supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="], + "logkitty/yargs/y18n": ["y18n@4.0.3", "", {}, "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ=="], + + "logkitty/yargs/yargs-parser": ["yargs-parser@18.1.3", "", { "dependencies": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" } }, "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ=="], + + "metro-config/cosmiconfig/import-fresh": ["import-fresh@2.0.0", "", { "dependencies": { "caller-path": "^2.0.0", "resolve-from": "^3.0.0" } }, "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg=="], + + "metro-config/cosmiconfig/js-yaml": ["js-yaml@3.14.1", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": "bin/js-yaml.js" }, "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g=="], + + "metro-config/cosmiconfig/parse-json": ["parse-json@4.0.0", "", { "dependencies": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" } }, "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw=="], "metro-source-map/@babel/traverse/@babel/generator": ["@babel/generator@7.28.3", "", { "dependencies": { "@babel/parser": "^7.28.3", "@babel/types": "^7.28.2", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw=="], @@ -3150,14 +3439,6 @@ "node-fetch/whatwg-url/webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], - "ora/chalk/ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], - - "ora/chalk/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], - - "ora/chalk/supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="], - - "ora/strip-ansi/ansi-regex": ["ansi-regex@4.1.1", "", {}, "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g=="], - "pkg-dir/find-up/locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], "qrcode/yargs/cliui": ["cliui@6.0.0", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^6.2.0" } }, "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ=="], @@ -3182,6 +3463,12 @@ "serve-static/send/encodeurl": ["encodeurl@1.0.2", "", {}, "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="], + "serve-static/send/http-errors": ["http-errors@2.0.0", "", { "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": "2.0.1", "toidentifier": "1.0.1" } }, "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ=="], + + "serve-static/send/mime": ["mime@1.6.0", "", { "bin": "cli.js" }, "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="], + + "slice-ansi/ansi-styles/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], + "terminal-link/ansi-escapes/type-fest": ["type-fest@0.21.3", "", {}, "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w=="], "terser-webpack-plugin/jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], @@ -3232,6 +3519,26 @@ "@babel/plugin-transform-runtime/babel-plugin-polyfill-regenerator/@babel/helper-define-polyfill-provider/resolve": ["resolve@1.22.10", "", { "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": "bin/resolve" }, "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w=="], + "@expo/cli/ora/chalk/ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], + + "@expo/cli/ora/chalk/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + + "@expo/cli/ora/chalk/supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="], + + "@expo/cli/ora/cli-cursor/restore-cursor": ["restore-cursor@2.0.0", "", { "dependencies": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" } }, "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q=="], + + "@expo/cli/ora/strip-ansi/ansi-regex": ["ansi-regex@4.1.1", "", {}, "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g=="], + + "@expo/package-manager/ora/chalk/ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], + + "@expo/package-manager/ora/chalk/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + + "@expo/package-manager/ora/chalk/supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="], + + "@expo/package-manager/ora/cli-cursor/restore-cursor": ["restore-cursor@2.0.0", "", { "dependencies": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" } }, "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q=="], + + "@expo/package-manager/ora/strip-ansi/ansi-regex": ["ansi-regex@4.1.1", "", {}, "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g=="], + "@istanbuljs/load-nyc-config/find-up/locate-path/p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], "@jest/reporters/istanbul-lib-instrument/@babel/parser/@babel/types": ["@babel/types@7.28.2", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ=="], @@ -3260,18 +3567,22 @@ "jest-matcher-utils/pretty-format/@jest/schemas/@sinclair/typebox": ["@sinclair/typebox@0.34.40", "", {}, "sha512-gwBNIP8ZAYev/ORDWW0QvxdwPXwxBtLsdsJgSc7eDIRt8ubP+rxUBzPsrwnu16fgEF8Bx4lh/+mvQvJzcTM6Kw=="], - "log-symbols/chalk/ansi-styles/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], + "logkitty/yargs/cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "log-symbols/chalk/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], + "logkitty/yargs/cliui/wrap-ansi": ["wrap-ansi@6.2.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA=="], + + "logkitty/yargs/find-up/locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], + + "logkitty/yargs/yargs-parser/camelcase": ["camelcase@5.3.1", "", {}, "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="], + + "metro-config/cosmiconfig/import-fresh/resolve-from": ["resolve-from@3.0.0", "", {}, "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw=="], + + "metro-config/cosmiconfig/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], "metro-source-map/@babel/traverse/@babel/generator/@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], "metro-source-map/@babel/traverse/@babel/generator/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.30", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q=="], - "ora/chalk/ansi-styles/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], - - "ora/chalk/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], - "pkg-dir/find-up/locate-path/p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], "qrcode/yargs/cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], @@ -3288,32 +3599,54 @@ "serve-static/send/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + "slice-ansi/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], + "@babel/highlight/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], "@babel/plugin-transform-class-static-block/@babel/helper-create-class-features-plugin/@babel/traverse/@babel/generator/@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], "@babel/plugin-transform-class-static-block/@babel/helper-create-class-features-plugin/@babel/traverse/@babel/generator/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.30", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q=="], + "@expo/cli/ora/chalk/ansi-styles/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], + + "@expo/cli/ora/chalk/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], + + "@expo/cli/ora/cli-cursor/restore-cursor/onetime": ["onetime@2.0.1", "", { "dependencies": { "mimic-fn": "^1.0.0" } }, "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ=="], + + "@expo/package-manager/ora/chalk/ansi-styles/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], + + "@expo/package-manager/ora/chalk/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], + + "@expo/package-manager/ora/cli-cursor/restore-cursor/onetime": ["onetime@2.0.1", "", { "dependencies": { "mimic-fn": "^1.0.0" } }, "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ=="], + "@istanbuljs/load-nyc-config/find-up/locate-path/p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], "expo/babel-preset-expo/@react-native/babel-preset/@react-native/babel-plugin-codegen/@babel/traverse": ["@babel/traverse@7.28.3", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.28.3", "@babel/template": "^7.27.2", "@babel/types": "^7.28.2", "debug": "^4.3.1" } }, "sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ=="], "expo/babel-preset-expo/babel-plugin-syntax-hermes-parser/hermes-parser/hermes-estree": ["hermes-estree@0.25.1", "", {}, "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw=="], - "log-symbols/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], - - "ora/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], + "logkitty/yargs/find-up/locate-path/p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], "pkg-dir/find-up/locate-path/p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], "qrcode/yargs/find-up/locate-path/p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], + "@expo/cli/ora/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], + + "@expo/cli/ora/cli-cursor/restore-cursor/onetime/mimic-fn": ["mimic-fn@1.2.0", "", {}, "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ=="], + + "@expo/package-manager/ora/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], + + "@expo/package-manager/ora/cli-cursor/restore-cursor/onetime/mimic-fn": ["mimic-fn@1.2.0", "", {}, "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ=="], + "expo/babel-preset-expo/@react-native/babel-preset/@react-native/babel-plugin-codegen/@babel/traverse/@babel/generator": ["@babel/generator@7.28.3", "", { "dependencies": { "@babel/parser": "^7.28.3", "@babel/types": "^7.28.2", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw=="], "expo/babel-preset-expo/@react-native/babel-preset/@react-native/babel-plugin-codegen/@babel/traverse/@babel/parser": ["@babel/parser@7.28.3", "", { "dependencies": { "@babel/types": "^7.28.2" }, "bin": "./bin/babel-parser.js" }, "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA=="], "expo/babel-preset-expo/@react-native/babel-preset/@react-native/babel-plugin-codegen/@babel/traverse/@babel/types": ["@babel/types@7.28.2", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ=="], + "logkitty/yargs/find-up/locate-path/p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], + "qrcode/yargs/find-up/locate-path/p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], "expo/babel-preset-expo/@react-native/babel-preset/@react-native/babel-plugin-codegen/@babel/traverse/@babel/generator/@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], diff --git a/ios/HIPMIBadungConnect.xcodeproj/project.pbxproj b/ios/HIPMIBadungConnect.xcodeproj/project.pbxproj index c7e28a8..d5a6dc7 100644 --- a/ios/HIPMIBadungConnect.xcodeproj/project.pbxproj +++ b/ios/HIPMIBadungConnect.xcodeproj/project.pbxproj @@ -10,7 +10,8 @@ 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; 241CFEB1CBB2124E18A09822 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 51B6792712498367CD1EEA5D /* PrivacyInfo.xcprivacy */; }; 3E461D99554A48A4959DE609 /* SplashScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */; }; - 7833AA2741E7B2CCBEBEB1C7 /* libPods-HIPMIBadungConnect.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 9B3A38F3F981E3720B61AC51 /* libPods-HIPMIBadungConnect.a */; }; + 5FFACD268BA648EFA3A59CDC /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = E8EB1D2D7338425899CD9FA1 /* GoogleService-Info.plist */; }; + 74742C163A8F5202D2925B40 /* libPods-HIPMIBadungConnect.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BE614D12468C9A25709B0317 /* libPods-HIPMIBadungConnect.a */; }; BB2F792D24A3F905000567C9 /* Expo.plist in Resources */ = {isa = PBXBuildFile; fileRef = BB2F792C24A3F905000567C9 /* Expo.plist */; }; D138B3E4BC618ADDE62DCDCC /* ExpoModulesProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8F39CC335B3942749573F05 /* ExpoModulesProvider.swift */; }; F11748422D0307B40044C1D9 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = F11748412D0307B40044C1D9 /* AppDelegate.swift */; }; @@ -20,12 +21,13 @@ 13B07F961A680F5B00A75B9A /* HIPMIBadungConnect.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = HIPMIBadungConnect.app; sourceTree = BUILT_PRODUCTS_DIR; }; 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = HIPMIBadungConnect/Images.xcassets; sourceTree = ""; }; 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = HIPMIBadungConnect/Info.plist; sourceTree = ""; }; - 1E94102500A8768C71C74AF6 /* Pods-HIPMIBadungConnect.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-HIPMIBadungConnect.debug.xcconfig"; path = "Target Support Files/Pods-HIPMIBadungConnect/Pods-HIPMIBadungConnect.debug.xcconfig"; sourceTree = ""; }; + 40E847A832DE042BE51AD9E9 /* Pods-HIPMIBadungConnect.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-HIPMIBadungConnect.release.xcconfig"; path = "Target Support Files/Pods-HIPMIBadungConnect/Pods-HIPMIBadungConnect.release.xcconfig"; sourceTree = ""; }; 51B6792712498367CD1EEA5D /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xml; name = PrivacyInfo.xcprivacy; path = HIPMIBadungConnect/PrivacyInfo.xcprivacy; sourceTree = ""; }; - 9B3A38F3F981E3720B61AC51 /* libPods-HIPMIBadungConnect.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-HIPMIBadungConnect.a"; sourceTree = BUILT_PRODUCTS_DIR; }; AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = SplashScreen.storyboard; path = HIPMIBadungConnect/SplashScreen.storyboard; sourceTree = ""; }; BB2F792C24A3F905000567C9 /* Expo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Expo.plist; sourceTree = ""; }; - C19B4954908DD0D4CD2965DF /* Pods-HIPMIBadungConnect.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-HIPMIBadungConnect.release.xcconfig"; path = "Target Support Files/Pods-HIPMIBadungConnect/Pods-HIPMIBadungConnect.release.xcconfig"; sourceTree = ""; }; + BE614D12468C9A25709B0317 /* libPods-HIPMIBadungConnect.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-HIPMIBadungConnect.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + C273E4769DE3DC0FEF6A377C /* Pods-HIPMIBadungConnect.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-HIPMIBadungConnect.debug.xcconfig"; path = "Target Support Files/Pods-HIPMIBadungConnect/Pods-HIPMIBadungConnect.debug.xcconfig"; sourceTree = ""; }; + E8EB1D2D7338425899CD9FA1 /* GoogleService-Info.plist */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = text.plist.xml; name = "GoogleService-Info.plist"; path = "HIPMIBadungConnect/GoogleService-Info.plist"; sourceTree = ""; }; ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; F11748412D0307B40044C1D9 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = AppDelegate.swift; path = HIPMIBadungConnect/AppDelegate.swift; sourceTree = ""; }; F11748442D0722820044C1D9 /* HIPMIBadungConnect-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "HIPMIBadungConnect-Bridging-Header.h"; path = "HIPMIBadungConnect/HIPMIBadungConnect-Bridging-Header.h"; sourceTree = ""; }; @@ -37,7 +39,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 7833AA2741E7B2CCBEBEB1C7 /* libPods-HIPMIBadungConnect.a in Frameworks */, + 74742C163A8F5202D2925B40 /* libPods-HIPMIBadungConnect.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -54,6 +56,7 @@ 13B07FB61A68108700A75B9A /* Info.plist */, AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */, 51B6792712498367CD1EEA5D /* PrivacyInfo.xcprivacy */, + E8EB1D2D7338425899CD9FA1 /* GoogleService-Info.plist */, ); name = HIPMIBadungConnect; sourceTree = ""; @@ -62,7 +65,7 @@ isa = PBXGroup; children = ( ED297162215061F000B7C4FE /* JavaScriptCore.framework */, - 9B3A38F3F981E3720B61AC51 /* libPods-HIPMIBadungConnect.a */, + BE614D12468C9A25709B0317 /* libPods-HIPMIBadungConnect.a */, ); name = Frameworks; sourceTree = ""; @@ -108,8 +111,8 @@ A30E580F1E4E26A6BD0E3B24 /* Pods */ = { isa = PBXGroup; children = ( - 1E94102500A8768C71C74AF6 /* Pods-HIPMIBadungConnect.debug.xcconfig */, - C19B4954908DD0D4CD2965DF /* Pods-HIPMIBadungConnect.release.xcconfig */, + C273E4769DE3DC0FEF6A377C /* Pods-HIPMIBadungConnect.debug.xcconfig */, + 40E847A832DE042BE51AD9E9 /* Pods-HIPMIBadungConnect.release.xcconfig */, ); path = Pods; sourceTree = ""; @@ -138,14 +141,14 @@ isa = PBXNativeTarget; buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "HIPMIBadungConnect" */; buildPhases = ( - 08A4A3CD28434E44B6B9DE2E /* [CP] Check Pods Manifest.lock */, + AA173A81855B88A7082A949D /* [CP] Check Pods Manifest.lock */, 0B90913696EEE0E819CAF510 /* [Expo] Configure project */, 13B07F871A680F5B00A75B9A /* Sources */, 13B07F8C1A680F5B00A75B9A /* Frameworks */, 13B07F8E1A680F5B00A75B9A /* Resources */, 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, - 800E24972A6A228C8D4807E9 /* [CP] Copy Pods Resources */, - 2DA25245F64078F29C0B38E4 /* [CP] Embed Pods Frameworks */, + 1A2B5C8B77E56B3325ADC6E7 /* [CP] Embed Pods Frameworks */, + AECA4AD2A3DFA75F552CA1F1 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -196,6 +199,7 @@ 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, 3E461D99554A48A4959DE609 /* SplashScreen.storyboard in Resources */, 241CFEB1CBB2124E18A09822 /* PrivacyInfo.xcprivacy in Resources */, + 5FFACD268BA648EFA3A59CDC /* GoogleService-Info.plist in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -219,28 +223,6 @@ shellPath = /bin/sh; shellScript = "if [[ -f \"$PODS_ROOT/../.xcode.env\" ]]; then\n source \"$PODS_ROOT/../.xcode.env\"\nfi\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.local\"\nfi\n\n# The project root by default is one level up from the ios directory\nexport PROJECT_ROOT=\"$PROJECT_DIR\"/..\n\nif [[ \"$CONFIGURATION\" = *Debug* ]]; then\n export SKIP_BUNDLING=1\nfi\nif [[ -z \"$ENTRY_FILE\" ]]; then\n # Set the entry JS file using the bundler's entry resolution.\n export ENTRY_FILE=\"$(\"$NODE_BINARY\" -e \"require('expo/scripts/resolveAppEntry')\" \"$PROJECT_ROOT\" ios absolute | tail -n 1)\"\nfi\n\nif [[ -z \"$CLI_PATH\" ]]; then\n # Use Expo CLI\n export CLI_PATH=\"$(\"$NODE_BINARY\" --print \"require.resolve('@expo/cli', { paths: [require.resolve('expo/package.json')] })\")\"\nfi\nif [[ -z \"$BUNDLE_COMMAND\" ]]; then\n # Default Expo CLI command for bundling\n export BUNDLE_COMMAND=\"export:embed\"\nfi\n\n# Source .xcode.env.updates if it exists to allow\n# SKIP_BUNDLING to be unset if needed\nif [[ -f \"$PODS_ROOT/../.xcode.env.updates\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.updates\"\nfi\n# Source local changes to allow overrides\n# if needed\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.local\"\nfi\n\n`\"$NODE_BINARY\" --print \"require('path').dirname(require.resolve('react-native/package.json')) + '/scripts/react-native-xcode.sh'\"`\n\n"; }; - 08A4A3CD28434E44B6B9DE2E /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-HIPMIBadungConnect-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; 0B90913696EEE0E819CAF510 /* [Expo] Configure project */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; @@ -265,7 +247,7 @@ shellPath = /bin/sh; shellScript = "# This script configures Expo modules and generates the modules provider file.\nbash -l -c \"./Pods/Target\\ Support\\ Files/Pods-HIPMIBadungConnect/expo-configure-project.sh\"\n"; }; - 2DA25245F64078F29C0B38E4 /* [CP] Embed Pods Frameworks */ = { + 1A2B5C8B77E56B3325ADC6E7 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -295,7 +277,29 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-HIPMIBadungConnect/Pods-HIPMIBadungConnect-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 800E24972A6A228C8D4807E9 /* [CP] Copy Pods Resources */ = { + AA173A81855B88A7082A949D /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-HIPMIBadungConnect-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + AECA4AD2A3DFA75F552CA1F1 /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -309,6 +313,13 @@ "${PODS_CONFIGURATION_BUILD_DIR}/ExpoDevice/ExpoDevice_privacy.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/ExpoFileSystem/ExpoFileSystem_privacy.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/ExpoSystemUI/ExpoSystemUI_privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCore/FirebaseCore_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreInternal/FirebaseCoreInternal_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseInstallations/FirebaseInstallations_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseMessaging/FirebaseMessaging_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/GoogleDataTransport/GoogleDataTransport_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities/GoogleUtilities_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/PromisesObjC/FBLPromises_Privacy.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/RNCAsyncStorage/RNCAsyncStorage_resources.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/RNSVG/RNSVGFilters.bundle", "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/AntDesign.ttf", @@ -335,6 +346,7 @@ "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/expo-dev-launcher/EXDevLauncher.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/expo-dev-menu/EXDevMenu.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/nanopb/nanopb_Privacy.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/react-native-maps/ReactNativeMapsPrivacy.bundle", ); name = "[CP] Copy Pods Resources"; @@ -346,6 +358,13 @@ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoDevice_privacy.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoFileSystem_privacy.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoSystemUI_privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseCore_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseCoreInternal_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseInstallations_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseMessaging_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleDataTransport_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleUtilities_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FBLPromises_Privacy.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RNCAsyncStorage_resources.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RNSVGFilters.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AntDesign.ttf", @@ -372,6 +391,7 @@ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/SDWebImage.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EXDevLauncher.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EXDevMenu.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/nanopb_Privacy.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ReactNativeMapsPrivacy.bundle", ); runOnlyForDeploymentPostprocessing = 0; @@ -396,7 +416,7 @@ /* Begin XCBuildConfiguration section */ 13B07F941A680F5B00A75B9A /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 1E94102500A8768C71C74AF6 /* Pods-HIPMIBadungConnect.debug.xcconfig */; + baseConfigurationReference = C273E4769DE3DC0FEF6A377C /* Pods-HIPMIBadungConnect.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; @@ -433,7 +453,7 @@ }; 13B07F951A680F5B00A75B9A /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C19B4954908DD0D4CD2965DF /* Pods-HIPMIBadungConnect.release.xcconfig */; + baseConfigurationReference = 40E847A832DE042BE51AD9E9 /* Pods-HIPMIBadungConnect.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; diff --git a/ios/HIPMIBadungConnect/AppDelegate.swift b/ios/HIPMIBadungConnect/AppDelegate.swift index a7887e1..135cfa9 100644 --- a/ios/HIPMIBadungConnect/AppDelegate.swift +++ b/ios/HIPMIBadungConnect/AppDelegate.swift @@ -1,4 +1,5 @@ import Expo +import FirebaseCore import React import ReactAppDependencyProvider @@ -23,6 +24,9 @@ public class AppDelegate: ExpoAppDelegate { #if os(iOS) || os(tvOS) window = UIWindow(frame: UIScreen.main.bounds) +// @generated begin @react-native-firebase/app-didFinishLaunchingWithOptions - expo prebuild (DO NOT MODIFY) sync-10e8520570672fd76b2403b7e1e27f5198a6349a +FirebaseApp.configure() +// @generated end @react-native-firebase/app-didFinishLaunchingWithOptions factory.startReactNative( withModuleName: "main", in: window, diff --git a/ios/HIPMIBadungConnect/GoogleService-Info.plist b/ios/HIPMIBadungConnect/GoogleService-Info.plist new file mode 100644 index 0000000..1b95398 --- /dev/null +++ b/ios/HIPMIBadungConnect/GoogleService-Info.plist @@ -0,0 +1,30 @@ + + + + + API_KEY + AIzaSyAAvM0yBp5kCXa0hLAaNFZNqwkpBGYAWYs + GCM_SENDER_ID + 608461535079 + PLIST_VERSION + 1 + BUNDLE_ID + com.anonymous.hipmi-mobile + PROJECT_ID + hipmi-badung-connect + STORAGE_BUCKET + hipmi-badung-connect.firebasestorage.app + IS_ADS_ENABLED + + IS_ANALYTICS_ENABLED + + IS_APPINVITE_ENABLED + + IS_GCM_ENABLED + + IS_SIGNIN_ENABLED + + GOOGLE_APP_ID + 1:608461535079:ios:589f31b2b6b1068b6761c2 + + \ No newline at end of file diff --git a/ios/HIPMIBadungConnect/Info.plist b/ios/HIPMIBadungConnect/Info.plist index a51442f..bd0a77f 100644 --- a/ios/HIPMIBadungConnect/Info.plist +++ b/ios/HIPMIBadungConnect/Info.plist @@ -39,7 +39,7 @@ CFBundleVersion - 14 + 15 ITSAppUsesNonExemptEncryption LSMinimumSystemVersion diff --git a/ios/HIPMIBadungConnect/PrivacyInfo.xcprivacy b/ios/HIPMIBadungConnect/PrivacyInfo.xcprivacy index c6b452e..bb8d0b6 100644 --- a/ios/HIPMIBadungConnect/PrivacyInfo.xcprivacy +++ b/ios/HIPMIBadungConnect/PrivacyInfo.xcprivacy @@ -20,6 +20,8 @@ NSPrivacyAccessedAPITypeReasons CA92.1 + 1C8F.1 + C56D.1 diff --git a/ios/Podfile b/ios/Podfile index 3156718..1c3dcf7 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -1,3 +1,5 @@ +use_modular_headers! + require File.join(File.dirname(`node --print "require.resolve('expo/package.json')"`), "scripts/autolinking") require File.join(File.dirname(`node --print "require.resolve('react-native/package.json')"`), "scripts/react_native_pods") @@ -33,13 +35,14 @@ target 'HIPMIBadungConnect' do use_frameworks! :linkage => podfile_properties['ios.useFrameworks'].to_sym if podfile_properties['ios.useFrameworks'] use_frameworks! :linkage => ENV['USE_FRAMEWORKS'].to_sym if ENV['USE_FRAMEWORKS'] -# @generated begin pre_installer - expo prebuild (DO NOT MODIFY) sync-c8812095000d6054b846ce74840f0ffb540c2757 + # @generated begin pre_installer - expo prebuild (DO NOT MODIFY) sync-c8812095000d6054b846ce74840f0ffb540c2757 pre_install do |installer| -# @generated begin @rnmapbox/maps-pre_installer - expo prebuild (DO NOT MODIFY) sync-ea4905840bf9fcea0acc62e92aa2e784f9d760f8 + # @generated begin @rnmapbox/maps-pre_installer - expo prebuild (DO NOT MODIFY) sync-ea4905840bf9fcea0acc62e92aa2e784f9d760f8 $RNMapboxMaps.pre_install(installer) -# @generated end @rnmapbox/maps-pre_installer + # @generated end @rnmapbox/maps-pre_installer end -# @generated end pre_installer + # @generated end pre_installer + use_react_native!( :path => config[:reactNativePath], :hermes_enabled => podfile_properties['expo.jsEngine'] == nil || podfile_properties['expo.jsEngine'] == 'hermes', @@ -48,10 +51,31 @@ target 'HIPMIBadungConnect' do :privacy_file_aggregation_enabled => podfile_properties['apple.privacyManifestAggregationEnabled'] != 'false', ) + pod 'Firebase/Messaging' + + # @generated begin post_installer - expo prebuild (DO NOT MODIFY) sync-4092f82b887b5b9edb84642c2a56984d69b9a403 post_install do |installer| -# @generated begin @rnmapbox/maps-post_installer - expo prebuild (DO NOT MODIFY) sync-c4e8f90e96f6b6c6ea9241dd7b52ab5f57f7bf36 + # @generated begin @rnmapbox/maps-post_installer - expo prebuild (DO NOT MODIFY) sync-c4e8f90e96f6b6c6ea9241dd7b52ab5f57f7bf36 $RNMapboxMaps.post_install(installer) -# @generated end @rnmapbox/maps-post_installer + # @generated end @rnmapbox/maps-post_installer + + # Fix all script phases with incorrect paths + installer.pods_project.targets.each do |target| + target.build_phases.each do |phase| + next unless phase.respond_to?(:shell_script) + + # Fix duplicated path issue + if phase.shell_script.include?('with-environment.sh') + # Remove any existing path and use proper relative path + phase.shell_script = phase.shell_script.gsub( + %r{(/.*?/node_modules/react-native)+/scripts/xcode/with-environment.sh}, + '${PODS_ROOT}/../../node_modules/react-native/scripts/xcode/with-environment.sh' + ) + end + end + end + + # Standard React Native post install react_native_post_install( installer, config[:reactNativePath], @@ -59,4 +83,6 @@ target 'HIPMIBadungConnect' do :ccache_enabled => podfile_properties['apple.ccacheEnabled'] == 'true', ) end -end + # @generated end post_installer + +end \ No newline at end of file diff --git a/ios/Podfile.lock b/ios/Podfile.lock index aa9a724..6646f0b 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -239,6 +239,8 @@ PODS: - ExpoModulesCore - ExpoKeepAwake (15.0.7): - ExpoModulesCore + - ExpoLinearGradient (15.0.7): + - ExpoModulesCore - ExpoLinking (8.0.8): - ExpoModulesCore - ExpoLocation (19.0.7): @@ -277,6 +279,58 @@ PODS: - EXUpdatesInterface (2.0.0): - ExpoModulesCore - FBLazyVector (0.81.4) + - Firebase/CoreOnly (12.7.0): + - FirebaseCore (~> 12.7.0) + - Firebase/Messaging (12.7.0): + - Firebase/CoreOnly + - FirebaseMessaging (~> 12.7.0) + - FirebaseCore (12.7.0): + - FirebaseCoreInternal (~> 12.7.0) + - GoogleUtilities/Environment (~> 8.1) + - GoogleUtilities/Logger (~> 8.1) + - FirebaseCoreInternal (12.7.0): + - "GoogleUtilities/NSData+zlib (~> 8.1)" + - FirebaseInstallations (12.7.0): + - FirebaseCore (~> 12.7.0) + - GoogleUtilities/Environment (~> 8.1) + - GoogleUtilities/UserDefaults (~> 8.1) + - PromisesObjC (~> 2.4) + - FirebaseMessaging (12.7.0): + - FirebaseCore (~> 12.7.0) + - FirebaseInstallations (~> 12.7.0) + - GoogleDataTransport (~> 10.1) + - GoogleUtilities/AppDelegateSwizzler (~> 8.1) + - GoogleUtilities/Environment (~> 8.1) + - GoogleUtilities/Reachability (~> 8.1) + - GoogleUtilities/UserDefaults (~> 8.1) + - nanopb (~> 3.30910.0) + - GoogleDataTransport (10.1.0): + - nanopb (~> 3.30910.0) + - PromisesObjC (~> 2.4) + - GoogleUtilities/AppDelegateSwizzler (8.1.0): + - GoogleUtilities/Environment + - GoogleUtilities/Logger + - GoogleUtilities/Network + - GoogleUtilities/Privacy + - GoogleUtilities/Environment (8.1.0): + - GoogleUtilities/Privacy + - GoogleUtilities/Logger (8.1.0): + - GoogleUtilities/Environment + - GoogleUtilities/Privacy + - GoogleUtilities/Network (8.1.0): + - GoogleUtilities/Logger + - "GoogleUtilities/NSData+zlib" + - GoogleUtilities/Privacy + - GoogleUtilities/Reachability + - "GoogleUtilities/NSData+zlib (8.1.0)": + - GoogleUtilities/Privacy + - GoogleUtilities/Privacy (8.1.0) + - GoogleUtilities/Reachability (8.1.0): + - GoogleUtilities/Logger + - GoogleUtilities/Privacy + - GoogleUtilities/UserDefaults (8.1.0): + - GoogleUtilities/Logger + - GoogleUtilities/Privacy - hermes-engine (0.81.4): - hermes-engine/Pre-built (= 0.81.4) - hermes-engine/Pre-built (0.81.4) @@ -305,6 +359,12 @@ PODS: - MapboxCommon (= 24.15.4) - MapboxCoreMaps (= 11.15.4) - Turf (= 4.0.0) + - nanopb (3.30910.0): + - nanopb/decode (= 3.30910.0) + - nanopb/encode (= 3.30910.0) + - nanopb/decode (3.30910.0) + - nanopb/encode (3.30910.0) + - PromisesObjC (2.4.0) - RCTDeprecation (0.81.4) - RCTRequired (0.81.4) - RCTTypeSafety (0.81.4): @@ -2446,10 +2506,10 @@ PODS: - ReactCommon/turbomodule/core - ReactNativeDependencies - Yoga - - SDWebImage (5.21.1): - - SDWebImage/Core (= 5.21.1) - - SDWebImage/Core (5.21.1) - - SDWebImageAVIFCoder (0.11.0): + - SDWebImage (5.21.3): + - SDWebImage/Core (= 5.21.3) + - SDWebImage/Core (5.21.3) + - SDWebImageAVIFCoder (0.11.1): - libavif/core (>= 0.11.0) - SDWebImage (~> 5.10) - SDWebImageSVGCoder (1.7.0): @@ -2489,6 +2549,7 @@ DEPENDENCIES: - ExpoImage (from `../node_modules/expo-image/ios`) - ExpoImagePicker (from `../node_modules/expo-image-picker/ios`) - ExpoKeepAwake (from `../node_modules/expo-keep-awake/ios`) + - ExpoLinearGradient (from `../node_modules/expo-linear-gradient/ios`) - ExpoLinking (from `../node_modules/expo-linking/ios`) - ExpoLocation (from `../node_modules/expo-location/ios`) - ExpoModulesCore (from `../node_modules/expo-modules-core`) @@ -2498,6 +2559,7 @@ DEPENDENCIES: - ExpoWebBrowser (from `../node_modules/expo-web-browser/ios`) - EXUpdatesInterface (from `../node_modules/expo-updates-interface/ios`) - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`) + - Firebase/Messaging - hermes-engine (from `../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec`) - RCTDeprecation (from `../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation`) - RCTRequired (from `../node_modules/react-native/Libraries/Required`) @@ -2582,12 +2644,21 @@ DEPENDENCIES: SPEC REPOS: trunk: + - Firebase + - FirebaseCore + - FirebaseCoreInternal + - FirebaseInstallations + - FirebaseMessaging + - GoogleDataTransport + - GoogleUtilities - libavif - libdav1d - libwebp - MapboxCommon - MapboxCoreMaps - MapboxMaps + - nanopb + - PromisesObjC - SDWebImage - SDWebImageAVIFCoder - SDWebImageSVGCoder @@ -2642,6 +2713,8 @@ EXTERNAL SOURCES: :path: "../node_modules/expo-image-picker/ios" ExpoKeepAwake: :path: "../node_modules/expo-keep-awake/ios" + ExpoLinearGradient: + :path: "../node_modules/expo-linear-gradient/ios" ExpoLinking: :path: "../node_modules/expo-linking/ios" ExpoLocation: @@ -2846,6 +2919,7 @@ SPEC CHECKSUMS: ExpoImage: e88f500585913969b930e13a4be47277eb7c6de8 ExpoImagePicker: d251aab45a1b1857e4156fed88511b278b4eee1c ExpoKeepAwake: 1a2e820692e933c94a565ec3fbbe38ac31658ffe + ExpoLinearGradient: a464898cb95153125e3b81894fd479bcb1c7dd27 ExpoLinking: f051f28e50ea9269ff539317c166adec81d9342d ExpoLocation: 93d7faa0c2adbd5a04686af0c1a61bc6ed3ee2f7 ExpoModulesCore: 9281d8f1cda9d0c37dbce34c26014212b22eb8c0 @@ -2855,6 +2929,13 @@ SPEC CHECKSUMS: ExpoWebBrowser: b973e1351fdcf5fec0c400997b1851f5a8219ec3 EXUpdatesInterface: 5adf50cb41e079c861da6d9b4b954c3db9a50734 FBLazyVector: 9e0cd874afd81d9a4d36679daca991b58b260d42 + Firebase: 2d19a10c9a2e48ac532a4303115d3fc9b2798396 + FirebaseCore: c7b57863ce0859281a66d16ca36d665c45d332b5 + FirebaseCoreInternal: 571a2dd8c975410966199623351db3a3265c874d + FirebaseInstallations: 6d05424a046b68ca146b4de4376f05b4e9262fc3 + FirebaseMessaging: b5f7bdc62b91b6102015991fb7bc6fa75f643908 + GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7 + GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1 hermes-engine: 35c763d57c9832d0eef764316ca1c4d043581394 libavif: 84bbb62fb232c3018d6f1bab79beea87e35de7b7 libdav1d: 23581a4d8ec811ff171ed5e2e05cd27bad64c39f @@ -2862,6 +2943,8 @@ SPEC CHECKSUMS: MapboxCommon: 975faa94b893bb64a1d28b09d9d6d820e1030a26 MapboxCoreMaps: 105af9894d850290fbb466e9f9a133f5d175abf1 MapboxMaps: e97e59d6ba48bb6f695a4c1dc2f174cb24743cd4 + nanopb: fad817b59e0457d11a5dfbde799381cd727c1275 + PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 RCTDeprecation: 7487d6dda857ccd4cb3dd6ecfccdc3170e85dcbc RCTRequired: 54128b7df8be566881d48c7234724a78cb9b6157 RCTTypeSafety: d2b07797a79e45d7b19e1cd2f53c79ab419fe217 @@ -2940,14 +3023,14 @@ SPEC CHECKSUMS: RNSVG: 31d6639663c249b7d5abc9728dde2041eb2a3c34 RNVectorIcons: 704d89d2f11886824e3bd5cbea34dd00aeade200 RNWorklets: 76fce72926e28e304afb44f0da23b2d24f2c1fa0 - SDWebImage: f29024626962457f3470184232766516dee8dfea - SDWebImageAVIFCoder: 00310d246aab3232ce77f1d8f0076f8c4b021d90 + SDWebImage: 16309af6d214ba3f77a7c6f6fdda888cb313a50a + SDWebImageAVIFCoder: afe194a084e851f70228e4be35ef651df0fc5c57 SDWebImageSVGCoder: 15a300a97ec1c8ac958f009c02220ac0402e936c SDWebImageWebPCoder: e38c0a70396191361d60c092933e22c20d5b1380 Turf: c9eb11a65d96af58cac523460fd40fec5061b081 Yoga: 051f086b5ccf465ff2ed38a2cf5a558ae01aaaa1 ZXingObjC: 8898711ab495761b2dbbdec76d90164a6d7e14c5 -PODFILE CHECKSUM: 961e5122c387eef49538723a9e3e7a469ca4144f +PODFILE CHECKSUM: 61c4a9d35618e5f2a420f47e5a24c89e86706f00 COCOAPODS: 1.16.2 diff --git a/package.json b/package.json index 549397c..bcef28a 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,8 @@ "@expo/vector-icons": "^15.0.2", "@react-native-async-storage/async-storage": "2.2.0", "@react-native-community/datetimepicker": "8.4.4", + "@react-native-firebase/app": "^23.7.0", + "@react-native-firebase/messaging": "^23.7.0", "@react-navigation/bottom-tabs": "^7.3.10", "@react-navigation/drawer": "^7.3.9", "@react-navigation/elements": "^2.3.8", @@ -72,6 +74,7 @@ }, "devDependencies": { "@babel/core": "^7.25.2", + "@react-native-community/cli": "^20.0.2", "@types/react": "~19.1.10", "eslint": "^9.25.0", "eslint-config-expo": "~10.0.0", From 43c8c105cf393eb68217f07c0688411b3e2cd109 Mon Sep 17 00:00:00 2001 From: bagasbanuna Date: Fri, 12 Dec 2025 17:50:49 +0800 Subject: [PATCH 21/21] Notification firts commit ### No Issue --- app/_layout.tsx | 22 ++++ .../project.pbxproj | 20 ++- ios/Podfile | 1 + ios/Podfile.lock | 116 +++++++++++++++--- 4 files changed, 139 insertions(+), 20 deletions(-) diff --git a/app/_layout.tsx b/app/_layout.tsx index 51bdd8b..7018632 100644 --- a/app/_layout.tsx +++ b/app/_layout.tsx @@ -1,10 +1,32 @@ import { AuthProvider } from "@/context/AuthContext"; import AppRoot from "@/screens/RootLayout/AppRoot"; +import { useEffect } from "react"; import "react-native-gesture-handler"; import { SafeAreaProvider } from "react-native-safe-area-context"; import Toast from "react-native-toast-message"; +import messaging from "@react-native-firebase/messaging"; export default function RootLayout() { + useEffect(() => { + const testFCM = async () => { + if (!messaging().isSupported()) { + console.warn("Firebase Messaging not supported (e.g. Expo Go)"); + return; + } + + const authStatus = await messaging().requestPermission(); + if (authStatus !== messaging.AuthorizationStatus.AUTHORIZED) { + console.warn("Permission not granted"); + return; + } + + const token = await messaging().getToken(); + console.log("✅ FCM Token:", token); + }; + + testFCM(); + }, []); + return ( <> diff --git a/ios/HIPMIBadungConnect.xcodeproj/project.pbxproj b/ios/HIPMIBadungConnect.xcodeproj/project.pbxproj index d5a6dc7..fb1ba31 100644 --- a/ios/HIPMIBadungConnect.xcodeproj/project.pbxproj +++ b/ios/HIPMIBadungConnect.xcodeproj/project.pbxproj @@ -149,6 +149,7 @@ 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, 1A2B5C8B77E56B3325ADC6E7 /* [CP] Embed Pods Frameworks */, AECA4AD2A3DFA75F552CA1F1 /* [CP] Copy Pods Resources */, + 58D7AF30081BAAEFD090045C /* [CP-User] [RNFB] Core Configuration */, ); buildRules = ( ); @@ -277,6 +278,19 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-HIPMIBadungConnect/Pods-HIPMIBadungConnect-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; + 58D7AF30081BAAEFD090045C /* [CP-User] [RNFB] Core Configuration */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH)", + ); + name = "[CP-User] [RNFB] Core Configuration"; + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "#!/usr/bin/env bash\n#\n# Copyright (c) 2016-present Invertase Limited & Contributors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this library except in compliance with the License.\n# You may obtain a copy of the License at\n#\n# http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n\n##########################################################################\n##########################################################################\n#\n# NOTE THAT IF YOU CHANGE THIS FILE YOU MUST RUN pod install AFTERWARDS\n#\n# This file is installed as an Xcode build script in the project file\n# by cocoapods, and you will not see your changes until you pod install\n#\n##########################################################################\n##########################################################################\n\nset -e\n\n_MAX_LOOKUPS=2;\n_SEARCH_RESULT=''\n_RN_ROOT_EXISTS=''\n_CURRENT_LOOKUPS=1\n_JSON_ROOT=\"'react-native'\"\n_JSON_FILE_NAME='firebase.json'\n_JSON_OUTPUT_BASE64='e30=' # { }\n_CURRENT_SEARCH_DIR=${PROJECT_DIR}\n_PLIST_BUDDY=/usr/libexec/PlistBuddy\n_TARGET_PLIST=\"${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}\"\n_DSYM_PLIST=\"${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Info.plist\"\n\n# plist arrays\n_PLIST_ENTRY_KEYS=()\n_PLIST_ENTRY_TYPES=()\n_PLIST_ENTRY_VALUES=()\n\nfunction setPlistValue {\n echo \"note: setting plist entry '$1' of type '$2' in file '$4'\"\n ${_PLIST_BUDDY} -c \"Add :$1 $2 '$3'\" $4 || echo \"note: '$1' already exists\"\n}\n\nfunction getFirebaseJsonKeyValue () {\n if [[ ${_RN_ROOT_EXISTS} ]]; then\n ruby -Ku -e \"require 'rubygems';require 'json'; output=JSON.parse('$1'); puts output[$_JSON_ROOT]['$2']\"\n else\n echo \"\"\n fi;\n}\n\nfunction jsonBoolToYesNo () {\n if [[ $1 == \"false\" ]]; then\n echo \"NO\"\n elif [[ $1 == \"true\" ]]; then\n echo \"YES\"\n else echo \"NO\"\n fi\n}\n\necho \"note: -> RNFB build script started\"\necho \"note: 1) Locating ${_JSON_FILE_NAME} file:\"\n\nif [[ -z ${_CURRENT_SEARCH_DIR} ]]; then\n _CURRENT_SEARCH_DIR=$(pwd)\nfi;\n\nwhile true; do\n _CURRENT_SEARCH_DIR=$(dirname \"$_CURRENT_SEARCH_DIR\")\n if [[ \"$_CURRENT_SEARCH_DIR\" == \"/\" ]] || [[ ${_CURRENT_LOOKUPS} -gt ${_MAX_LOOKUPS} ]]; then break; fi;\n echo \"note: ($_CURRENT_LOOKUPS of $_MAX_LOOKUPS) Searching in '$_CURRENT_SEARCH_DIR' for a ${_JSON_FILE_NAME} file.\"\n _SEARCH_RESULT=$(find \"$_CURRENT_SEARCH_DIR\" -maxdepth 2 -name ${_JSON_FILE_NAME} -print | /usr/bin/head -n 1)\n if [[ ${_SEARCH_RESULT} ]]; then\n echo \"note: ${_JSON_FILE_NAME} found at $_SEARCH_RESULT\"\n break;\n fi;\n _CURRENT_LOOKUPS=$((_CURRENT_LOOKUPS+1))\ndone\n\nif [[ ${_SEARCH_RESULT} ]]; then\n _JSON_OUTPUT_RAW=$(cat \"${_SEARCH_RESULT}\")\n if ! _RN_ROOT_EXISTS=$(ruby -Ku -e \"require 'json'; output=JSON.parse('$_JSON_OUTPUT_RAW'); puts output[$_JSON_ROOT]\"); then\n echo \"error: Failed to parse firebase.json, check for syntax errors.\"\n exit 1\n fi\n\n if [[ ${_RN_ROOT_EXISTS} ]]; then\n if ! python3 --version >/dev/null 2>&1; then echo \"error: python3 not found, firebase.json file processing error.\" && exit 1; fi\n _JSON_OUTPUT_BASE64=$(python3 -c 'import json,sys,base64;print(base64.b64encode(bytes(json.dumps(json.loads(open('\"'${_SEARCH_RESULT}'\"', '\"'rb'\"').read())['${_JSON_ROOT}']), '\"'utf-8'\"')).decode())' || echo \"e30=\")\n fi\n\n _PLIST_ENTRY_KEYS+=(\"firebase_json_raw\")\n _PLIST_ENTRY_TYPES+=(\"string\")\n _PLIST_ENTRY_VALUES+=(\"$_JSON_OUTPUT_BASE64\")\n\n # config.app_data_collection_default_enabled\n _APP_DATA_COLLECTION_ENABLED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"app_data_collection_default_enabled\")\n if [[ $_APP_DATA_COLLECTION_ENABLED ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseDataCollectionDefaultEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_APP_DATA_COLLECTION_ENABLED\")\")\n fi\n\n # config.analytics_auto_collection_enabled\n _ANALYTICS_AUTO_COLLECTION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_auto_collection_enabled\")\n if [[ $_ANALYTICS_AUTO_COLLECTION ]]; then\n _PLIST_ENTRY_KEYS+=(\"FIREBASE_ANALYTICS_COLLECTION_ENABLED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_AUTO_COLLECTION\")\")\n fi\n\n # config.analytics_collection_deactivated\n _ANALYTICS_DEACTIVATED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_collection_deactivated\")\n if [[ $_ANALYTICS_DEACTIVATED ]]; then\n _PLIST_ENTRY_KEYS+=(\"FIREBASE_ANALYTICS_COLLECTION_DEACTIVATED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_DEACTIVATED\")\")\n fi\n\n # config.analytics_idfv_collection_enabled\n _ANALYTICS_IDFV_COLLECTION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_idfv_collection_enabled\")\n if [[ $_ANALYTICS_IDFV_COLLECTION ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_IDFV_COLLECTION_ENABLED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_IDFV_COLLECTION\")\")\n fi\n\n # config.analytics_default_allow_analytics_storage\n _ANALYTICS_STORAGE=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_default_allow_analytics_storage\")\n if [[ $_ANALYTICS_STORAGE ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_DEFAULT_ALLOW_ANALYTICS_STORAGE\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_STORAGE\")\")\n fi\n\n # config.analytics_default_allow_ad_storage\n _ANALYTICS_AD_STORAGE=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_default_allow_ad_storage\")\n if [[ $_ANALYTICS_AD_STORAGE ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_STORAGE\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_AD_STORAGE\")\")\n fi\n\n # config.analytics_default_allow_ad_user_data\n _ANALYTICS_AD_USER_DATA=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_default_allow_ad_user_data\")\n if [[ $_ANALYTICS_AD_USER_DATA ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_USER_DATA\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_AD_USER_DATA\")\")\n fi\n\n # config.analytics_default_allow_ad_personalization_signals\n _ANALYTICS_PERSONALIZATION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_default_allow_ad_personalization_signals\")\n if [[ $_ANALYTICS_PERSONALIZATION ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_PERSONALIZATION_SIGNALS\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_PERSONALIZATION\")\")\n fi\n\n # config.analytics_registration_with_ad_network_enabled\n _ANALYTICS_REGISTRATION_WITH_AD_NETWORK=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"google_analytics_registration_with_ad_network_enabled\")\n if [[ $_ANALYTICS_REGISTRATION_WITH_AD_NETWORK ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_REGISTRATION_WITH_AD_NETWORK_ENABLED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_REGISTRATION_WITH_AD_NETWORK\")\")\n fi\n\n # config.google_analytics_automatic_screen_reporting_enabled\n _ANALYTICS_AUTO_SCREEN_REPORTING=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"google_analytics_automatic_screen_reporting_enabled\")\n if [[ $_ANALYTICS_AUTO_SCREEN_REPORTING ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseAutomaticScreenReportingEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_AUTO_SCREEN_REPORTING\")\")\n fi\n\n # config.perf_auto_collection_enabled\n _PERF_AUTO_COLLECTION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"perf_auto_collection_enabled\")\n if [[ $_PERF_AUTO_COLLECTION ]]; then\n _PLIST_ENTRY_KEYS+=(\"firebase_performance_collection_enabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_PERF_AUTO_COLLECTION\")\")\n fi\n\n # config.perf_collection_deactivated\n _PERF_DEACTIVATED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"perf_collection_deactivated\")\n if [[ $_PERF_DEACTIVATED ]]; then\n _PLIST_ENTRY_KEYS+=(\"firebase_performance_collection_deactivated\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_PERF_DEACTIVATED\")\")\n fi\n\n # config.messaging_auto_init_enabled\n _MESSAGING_AUTO_INIT=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"messaging_auto_init_enabled\")\n if [[ $_MESSAGING_AUTO_INIT ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseMessagingAutoInitEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_MESSAGING_AUTO_INIT\")\")\n fi\n\n # config.in_app_messaging_auto_colllection_enabled\n _FIAM_AUTO_INIT=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"in_app_messaging_auto_collection_enabled\")\n if [[ $_FIAM_AUTO_INIT ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseInAppMessagingAutomaticDataCollectionEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_FIAM_AUTO_INIT\")\")\n fi\n\n # config.app_check_token_auto_refresh\n _APP_CHECK_TOKEN_AUTO_REFRESH=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"app_check_token_auto_refresh\")\n if [[ $_APP_CHECK_TOKEN_AUTO_REFRESH ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseAppCheckTokenAutoRefreshEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_APP_CHECK_TOKEN_AUTO_REFRESH\")\")\n fi\n\n # config.crashlytics_disable_auto_disabler - undocumented for now - mainly for debugging, document if becomes useful\n _CRASHLYTICS_AUTO_DISABLE_ENABLED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"crashlytics_disable_auto_disabler\")\n if [[ $_CRASHLYTICS_AUTO_DISABLE_ENABLED == \"true\" ]]; then\n echo \"Disabled Crashlytics auto disabler.\" # do nothing\n else\n _PLIST_ENTRY_KEYS+=(\"FirebaseCrashlyticsCollectionEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"NO\")\n fi\nelse\n _PLIST_ENTRY_KEYS+=(\"firebase_json_raw\")\n _PLIST_ENTRY_TYPES+=(\"string\")\n _PLIST_ENTRY_VALUES+=(\"$_JSON_OUTPUT_BASE64\")\n echo \"warning: A firebase.json file was not found, whilst this file is optional it is recommended to include it to configure firebase services in React Native Firebase.\"\nfi;\n\necho \"note: 2) Injecting Info.plist entries: \"\n\n# Log out the keys we're adding\nfor i in \"${!_PLIST_ENTRY_KEYS[@]}\"; do\n echo \" -> $i) ${_PLIST_ENTRY_KEYS[$i]}\" \"${_PLIST_ENTRY_TYPES[$i]}\" \"${_PLIST_ENTRY_VALUES[$i]}\"\ndone\n\nfor plist in \"${_TARGET_PLIST}\" \"${_DSYM_PLIST}\" ; do\n if [[ -f \"${plist}\" ]]; then\n\n # paths with spaces break the call to setPlistValue. temporarily modify\n # the shell internal field separator variable (IFS), which normally\n # includes spaces, to consist only of line breaks\n oldifs=$IFS\n IFS=\"\n\"\n\n for i in \"${!_PLIST_ENTRY_KEYS[@]}\"; do\n setPlistValue \"${_PLIST_ENTRY_KEYS[$i]}\" \"${_PLIST_ENTRY_TYPES[$i]}\" \"${_PLIST_ENTRY_VALUES[$i]}\" \"${plist}\"\n done\n\n # restore the original internal field separator value\n IFS=$oldifs\n else\n echo \"warning: A Info.plist build output file was not found (${plist})\"\n fi\ndone\n\necho \"note: <- RNFB build script finished\"\n"; + }; AA173A81855B88A7082A949D /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -314,6 +328,7 @@ "${PODS_CONFIGURATION_BUILD_DIR}/ExpoFileSystem/ExpoFileSystem_privacy.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/ExpoSystemUI/ExpoSystemUI_privacy.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCore/FirebaseCore_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreExtension/FirebaseCoreExtension_Privacy.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreInternal/FirebaseCoreInternal_Privacy.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseInstallations/FirebaseInstallations_Privacy.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseMessaging/FirebaseMessaging_Privacy.bundle", @@ -359,6 +374,7 @@ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoFileSystem_privacy.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoSystemUI_privacy.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseCore_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseCoreExtension_Privacy.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseCoreInternal_Privacy.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseInstallations_Privacy.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseMessaging_Privacy.bundle", @@ -442,7 +458,7 @@ ); OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG"; PRODUCT_BUNDLE_IDENTIFIER = "com.anonymous.hipmi-mobile"; - PRODUCT_NAME = "HIPMIBadungConnect"; + PRODUCT_NAME = HIPMIBadungConnect; SWIFT_OBJC_BRIDGING_HEADER = "HIPMIBadungConnect/HIPMIBadungConnect-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; @@ -474,7 +490,7 @@ ); OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = "com.anonymous.hipmi-mobile"; - PRODUCT_NAME = "HIPMIBadungConnect"; + PRODUCT_NAME = HIPMIBadungConnect; SWIFT_OBJC_BRIDGING_HEADER = "HIPMIBadungConnect/HIPMIBadungConnect-Bridging-Header.h"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; diff --git a/ios/Podfile b/ios/Podfile index 1c3dcf7..25c17cf 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -51,6 +51,7 @@ target 'HIPMIBadungConnect' do :privacy_file_aggregation_enabled => podfile_properties['apple.privacyManifestAggregationEnabled'] != 'false', ) + pod 'Firebase' pod 'Firebase/Messaging' # @generated begin post_installer - expo prebuild (DO NOT MODIFY) sync-4092f82b887b5b9edb84642c2a56984d69b9a403 diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 6646f0b..a29aba4 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -279,31 +279,83 @@ PODS: - EXUpdatesInterface (2.0.0): - ExpoModulesCore - FBLazyVector (0.81.4) - - Firebase/CoreOnly (12.7.0): - - FirebaseCore (~> 12.7.0) - - Firebase/Messaging (12.7.0): + - Firebase (12.6.0): + - Firebase/Core (= 12.6.0) + - Firebase/Core (12.6.0): - Firebase/CoreOnly - - FirebaseMessaging (~> 12.7.0) - - FirebaseCore (12.7.0): - - FirebaseCoreInternal (~> 12.7.0) + - FirebaseAnalytics (~> 12.6.0) + - Firebase/CoreOnly (12.6.0): + - FirebaseCore (~> 12.6.0) + - Firebase/Messaging (12.6.0): + - Firebase/CoreOnly + - FirebaseMessaging (~> 12.6.0) + - FirebaseAnalytics (12.6.0): + - FirebaseAnalytics/Default (= 12.6.0) + - FirebaseCore (~> 12.6.0) + - FirebaseInstallations (~> 12.6.0) + - GoogleUtilities/AppDelegateSwizzler (~> 8.1) + - GoogleUtilities/MethodSwizzler (~> 8.1) + - GoogleUtilities/Network (~> 8.1) + - "GoogleUtilities/NSData+zlib (~> 8.1)" + - nanopb (~> 3.30910.0) + - FirebaseAnalytics/Default (12.6.0): + - FirebaseCore (~> 12.6.0) + - FirebaseInstallations (~> 12.6.0) + - GoogleAppMeasurement/Default (= 12.6.0) + - GoogleUtilities/AppDelegateSwizzler (~> 8.1) + - GoogleUtilities/MethodSwizzler (~> 8.1) + - GoogleUtilities/Network (~> 8.1) + - "GoogleUtilities/NSData+zlib (~> 8.1)" + - nanopb (~> 3.30910.0) + - FirebaseCore (12.6.0): + - FirebaseCoreInternal (~> 12.6.0) - GoogleUtilities/Environment (~> 8.1) - GoogleUtilities/Logger (~> 8.1) - - FirebaseCoreInternal (12.7.0): + - FirebaseCoreExtension (12.6.0): + - FirebaseCore (~> 12.6.0) + - FirebaseCoreInternal (12.6.0): - "GoogleUtilities/NSData+zlib (~> 8.1)" - - FirebaseInstallations (12.7.0): - - FirebaseCore (~> 12.7.0) + - FirebaseInstallations (12.6.0): + - FirebaseCore (~> 12.6.0) - GoogleUtilities/Environment (~> 8.1) - GoogleUtilities/UserDefaults (~> 8.1) - PromisesObjC (~> 2.4) - - FirebaseMessaging (12.7.0): - - FirebaseCore (~> 12.7.0) - - FirebaseInstallations (~> 12.7.0) + - FirebaseMessaging (12.6.0): + - FirebaseCore (~> 12.6.0) + - FirebaseInstallations (~> 12.6.0) - GoogleDataTransport (~> 10.1) - GoogleUtilities/AppDelegateSwizzler (~> 8.1) - GoogleUtilities/Environment (~> 8.1) - GoogleUtilities/Reachability (~> 8.1) - GoogleUtilities/UserDefaults (~> 8.1) - nanopb (~> 3.30910.0) + - GoogleAdsOnDeviceConversion (3.2.0): + - GoogleUtilities/Environment (~> 8.1) + - GoogleUtilities/Logger (~> 8.1) + - GoogleUtilities/Network (~> 8.1) + - nanopb (~> 3.30910.0) + - GoogleAppMeasurement/Core (12.6.0): + - GoogleUtilities/AppDelegateSwizzler (~> 8.1) + - GoogleUtilities/MethodSwizzler (~> 8.1) + - GoogleUtilities/Network (~> 8.1) + - "GoogleUtilities/NSData+zlib (~> 8.1)" + - nanopb (~> 3.30910.0) + - GoogleAppMeasurement/Default (12.6.0): + - GoogleAdsOnDeviceConversion (~> 3.2.0) + - GoogleAppMeasurement/Core (= 12.6.0) + - GoogleAppMeasurement/IdentitySupport (= 12.6.0) + - GoogleUtilities/AppDelegateSwizzler (~> 8.1) + - GoogleUtilities/MethodSwizzler (~> 8.1) + - GoogleUtilities/Network (~> 8.1) + - "GoogleUtilities/NSData+zlib (~> 8.1)" + - nanopb (~> 3.30910.0) + - GoogleAppMeasurement/IdentitySupport (12.6.0): + - GoogleAppMeasurement/Core (= 12.6.0) + - GoogleUtilities/AppDelegateSwizzler (~> 8.1) + - GoogleUtilities/MethodSwizzler (~> 8.1) + - GoogleUtilities/Network (~> 8.1) + - "GoogleUtilities/NSData+zlib (~> 8.1)" + - nanopb (~> 3.30910.0) - GoogleDataTransport (10.1.0): - nanopb (~> 3.30910.0) - PromisesObjC (~> 2.4) @@ -317,6 +369,9 @@ PODS: - GoogleUtilities/Logger (8.1.0): - GoogleUtilities/Environment - GoogleUtilities/Privacy + - GoogleUtilities/MethodSwizzler (8.1.0): + - GoogleUtilities/Logger + - GoogleUtilities/Privacy - GoogleUtilities/Network (8.1.0): - GoogleUtilities/Logger - "GoogleUtilities/NSData+zlib" @@ -2198,6 +2253,14 @@ PODS: - ReactCommon/turbomodule/core - ReactNativeDependencies - Yoga + - RNFBApp (23.7.0): + - Firebase/CoreOnly (= 12.6.0) + - React-Core + - RNFBMessaging (23.7.0): + - Firebase/Messaging (= 12.6.0) + - FirebaseCoreExtension + - React-Core + - RNFBApp - RNGestureHandler (2.28.0): - hermes-engine - RCTRequired @@ -2559,6 +2622,7 @@ DEPENDENCIES: - ExpoWebBrowser (from `../node_modules/expo-web-browser/ios`) - EXUpdatesInterface (from `../node_modules/expo-updates-interface/ios`) - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`) + - Firebase - Firebase/Messaging - hermes-engine (from `../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec`) - RCTDeprecation (from `../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation`) @@ -2633,6 +2697,8 @@ DEPENDENCIES: - ReactNativeDependencies (from `../node_modules/react-native/third-party-podspecs/ReactNativeDependencies.podspec`) - "RNCAsyncStorage (from `../node_modules/@react-native-async-storage/async-storage`)" - "RNDateTimePicker (from `../node_modules/@react-native-community/datetimepicker`)" + - "RNFBApp (from `../node_modules/@react-native-firebase/app`)" + - "RNFBMessaging (from `../node_modules/@react-native-firebase/messaging`)" - RNGestureHandler (from `../node_modules/react-native-gesture-handler`) - "rnmapbox-maps (from `../node_modules/@rnmapbox/maps`)" - RNReanimated (from `../node_modules/react-native-reanimated`) @@ -2645,10 +2711,14 @@ DEPENDENCIES: SPEC REPOS: trunk: - Firebase + - FirebaseAnalytics - FirebaseCore + - FirebaseCoreExtension - FirebaseCoreInternal - FirebaseInstallations - FirebaseMessaging + - GoogleAdsOnDeviceConversion + - GoogleAppMeasurement - GoogleDataTransport - GoogleUtilities - libavif @@ -2878,6 +2948,10 @@ EXTERNAL SOURCES: :path: "../node_modules/@react-native-async-storage/async-storage" RNDateTimePicker: :path: "../node_modules/@react-native-community/datetimepicker" + RNFBApp: + :path: "../node_modules/@react-native-firebase/app" + RNFBMessaging: + :path: "../node_modules/@react-native-firebase/messaging" RNGestureHandler: :path: "../node_modules/react-native-gesture-handler" rnmapbox-maps: @@ -2929,11 +3003,15 @@ SPEC CHECKSUMS: ExpoWebBrowser: b973e1351fdcf5fec0c400997b1851f5a8219ec3 EXUpdatesInterface: 5adf50cb41e079c861da6d9b4b954c3db9a50734 FBLazyVector: 9e0cd874afd81d9a4d36679daca991b58b260d42 - Firebase: 2d19a10c9a2e48ac532a4303115d3fc9b2798396 - FirebaseCore: c7b57863ce0859281a66d16ca36d665c45d332b5 - FirebaseCoreInternal: 571a2dd8c975410966199623351db3a3265c874d - FirebaseInstallations: 6d05424a046b68ca146b4de4376f05b4e9262fc3 - FirebaseMessaging: b5f7bdc62b91b6102015991fb7bc6fa75f643908 + Firebase: a451a7b61536298fd5cbfe3a746fd40443a50679 + FirebaseAnalytics: d0a97a0db6425e5a5d966340b87f92ca7b13a557 + FirebaseCore: 0e38ad5d62d980a47a64b8e9301ffa311457be04 + FirebaseCoreExtension: 032fd6f8509e591fda8cb76f6651f20d926b121f + FirebaseCoreInternal: 69bf1306a05b8ac43004f6cc1f804bb7b05b229e + FirebaseInstallations: 631b38da2e11a83daa4bfb482f79d286a5dfa7ad + FirebaseMessaging: a61bc42dcab3f7a346d94bbb54dab2c9435b18b2 + GoogleAdsOnDeviceConversion: d68c69dd9581a0f5da02617b6f377e5be483970f + GoogleAppMeasurement: 3bf40aff49a601af5da1c3345702fcb4991d35ee GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7 GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1 hermes-engine: 35c763d57c9832d0eef764316ca1c4d043581394 @@ -3016,6 +3094,8 @@ SPEC CHECKSUMS: ReactNativeDependencies: ed6d1e64802b150399f04f1d5728ec16b437251e RNCAsyncStorage: 3a4f5e2777dae1688b781a487923a08569e27fe4 RNDateTimePicker: be0e44bcb9ed0607c7c5f47dbedd88cf091f6791 + RNFBApp: 0c4cadae3900893d4631ea9a9effd14f853cd8e0 + RNFBMessaging: 873220424f6f6aa5c787baf5c7099e1e2ba087c9 RNGestureHandler: 2914750df066d89bf9d8f48a10ad5f0051108ac3 rnmapbox-maps: 3c20ce786a7991498445c32de4fe4244e32aa0ee RNReanimated: 8d3a14606ad49f022c17d9e12a2d339e9e5ad9b0 @@ -3031,6 +3111,6 @@ SPEC CHECKSUMS: Yoga: 051f086b5ccf465ff2ed38a2cf5a558ae01aaaa1 ZXingObjC: 8898711ab495761b2dbbdec76d90164a6d7e14c5 -PODFILE CHECKSUM: 61c4a9d35618e5f2a420f47e5a24c89e86706f00 +PODFILE CHECKSUM: 9c1ecbc7e57ca21dc7c93635b18e66f8f6d7bdd9 COCOAPODS: 1.16.2