From ad7dbaf16261289af654d6346691e4c5723a3edf Mon Sep 17 00:00:00 2001 From: bagasbanuna Date: Tue, 3 Mar 2026 16:44:45 +0800 Subject: [PATCH] Fix Bug DB User Pages - app/(application)/(user)/home.tsx - app/(application)/(user)/portofolio/[id]/index.tsx - app/(application)/(user)/profile/[id]/index.tsx Home - screens/Home/bottomFeatureSection.tsx Components - components/Notification/NotificationInitializer.tsx - components/_ShareComponent/SkeletonCustom.tsx Service - service/api-device-token.ts Config & iOS - app.config.js - ios/HIPMIBadungConnect.xcodeproj/project.pbxproj - ios/HIPMIBadungConnect/Info.plist ### No Issue --- app.config.js | 2 +- app/(application)/(user)/home.tsx | 121 ++++++++++++------ .../(user)/portofolio/[id]/index.tsx | 8 +- .../(user)/profile/[id]/index.tsx | 12 +- .../Notification/NotificationInitializer.tsx | 8 +- components/_ShareComponent/SkeletonCustom.tsx | 2 +- .../project.pbxproj | 90 +++++++++++++ ios/HIPMIBadungConnect/Info.plist | 2 +- screens/Home/bottomFeatureSection.tsx | 4 - service/api-device-token.ts | 9 +- 10 files changed, 200 insertions(+), 58 deletions(-) diff --git a/app.config.js b/app.config.js index 2403739..6dedc3d 100644 --- a/app.config.js +++ b/app.config.js @@ -21,7 +21,7 @@ export default { "Aplikasi membutuhkan akses lokasi untuk menampilkan peta.", }, associatedDomains: ["applinks:cld-dkr-staging-hipmi.wibudev.com"], - buildNumber: "1", + buildNumber: "2", }, android: { diff --git a/app/(application)/(user)/home.tsx b/app/(application)/(user)/home.tsx index c0a1987..9d29187 100644 --- a/app/(application)/(user)/home.tsx +++ b/app/(application)/(user)/home.tsx @@ -1,21 +1,24 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ /* eslint-disable react-hooks/exhaustive-deps */ import { BasicWrapper, StackCustom, ViewWrapper } from "@/components"; +import CustomSkeleton from "@/components/_ShareComponent/SkeletonCustom"; import { MainColor } from "@/constants/color-palet"; import { useAuth } from "@/hooks/use-auth"; import { useNotificationStore } from "@/hooks/use-notification-store"; import Home_BottomFeatureSection from "@/screens/Home/bottomFeatureSection"; import HeaderBell from "@/screens/Home/HeaderBell"; +import { stylesHome } from "@/screens/Home/homeViewStyle"; import Home_ImageSection from "@/screens/Home/imageSection"; import TabSection from "@/screens/Home/tabSection"; import { tabsHome } from "@/screens/Home/tabsList"; import Home_FeatureSection from "@/screens/Home/topFeatureSection"; import { apiUser } from "@/service/api-client/api-user"; import { apiVersion } from "@/service/api-config"; +import { GStyles } from "@/styles/global-styles"; import { Ionicons } from "@expo/vector-icons"; import { Redirect, router, Stack, useFocusEffect } from "expo-router"; import { useCallback, useState } from "react"; -import { RefreshControl } from "react-native"; +import { RefreshControl, TouchableOpacity, View } from "react-native"; export default function Application() { const { token, user, userData } = useAuth(); @@ -27,24 +30,33 @@ export default function Application() { useCallback(() => { onLoadData(); checkVersion(); - userData(token as string); + userData(token as string).catch((error) => { + console.log("[ERROR userData]", error?.message); + console.log("[ERROR userData Response]", error?.response?.data); + }); syncUnreadCount(); }, [user?.id, token]), ); async function onLoadData() { - const response = await apiUser(user?.id as string); - console.log( - "[Profile ID]>>", - JSON.stringify(response?.data?.Profile?.id, null, 2), - ); - - setData(response.data); + try { + const response = await apiUser(user?.id as string); + setData(response.data); + } catch (error: any) { + console.log("[ERROR onLoadData]", error?.message); + console.log("[ERROR Response]", error?.response?.data); + // Set data tetap agar UI tidak stuck di loading + setData(null); + } } const checkVersion = async () => { - const response = await apiVersion(); - console.log("[Version] >>", JSON.stringify(response.data, null, 2)); + try { + const response = await apiVersion(); + console.log("[Version] >>", JSON.stringify(response.data, null, 2)); + } catch (error: any) { + console.log("[ERROR checkVersion]", error?.message); + } }; const onRefresh = useCallback(() => { @@ -54,11 +66,6 @@ export default function Application() { setRefreshing(false); }, []); - // 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"); return ( @@ -91,17 +98,25 @@ export default function Application() { ( - { - router.push("/user-search"); - }} - /> - ), - headerRight: () => , + headerLeft: () => + data ? ( + { + router.push("/user-search"); + }} + /> + ) : ( + + ), + headerRight: () => + data ? ( + + ) : ( + + ), }} /> } footerComponent={ - + data && data ? ( + + ) : ( + + + {Array.from({ length: 4 }).map((e, index) => ( + + ))} + + + ) } > - {/* router.push("./test-notifications")}> - Test Notif - */} - - + {data && data ? ( + + ) : ( + + {Array.from({ length: 4 }).map((item, index) => ( + + ))} + + )} - + {data ? ( + + ) : ( + + )} diff --git a/app/(application)/(user)/portofolio/[id]/index.tsx b/app/(application)/(user)/portofolio/[id]/index.tsx index 0d51e2d..5169bf9 100644 --- a/app/(application)/(user)/portofolio/[id]/index.tsx +++ b/app/(application)/(user)/portofolio/[id]/index.tsx @@ -10,6 +10,7 @@ import { } from "@/components"; import LeftButtonCustom from "@/components/Button/BackButton"; import GridTwoView from "@/components/_ShareComponent/GridTwoView"; +import CustomSkeleton from "@/components/_ShareComponent/SkeletonCustom"; import ViewWrapper from "@/components/_ShareComponent/ViewWrapper"; import { MainColor } from "@/constants/color-palet"; import { ICON_SIZE_SMALL } from "@/constants/constans-value"; @@ -64,6 +65,8 @@ export default function Portofolio() { setProfileId(response?.data?.Profile?.id); }; + + return ( <> {/* Header */} @@ -87,7 +90,10 @@ export default function Portofolio() { /> {!data || !profileId ? ( - + + + + ) : ( { @@ -69,7 +70,7 @@ export default function Profile() { const lastTwoByDate = response.data .sort( (a: any, b: any) => - new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime() + new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime(), ) // urut desc .slice(0, 2); setListPortofolio(lastTwoByDate); @@ -99,7 +100,10 @@ export default function Profile() { {/* Main View */} {!data || !dataToken ? ( - + + + + ) : ( <> diff --git a/components/Notification/NotificationInitializer.tsx b/components/Notification/NotificationInitializer.tsx index deb415e..f20bc13 100644 --- a/components/Notification/NotificationInitializer.tsx +++ b/components/Notification/NotificationInitializer.tsx @@ -77,8 +77,12 @@ export default function NotificationInitializer() { }); console.log("✅ Device token berhasil didaftarkan ke backend"); - } catch (error) { - console.error("❌ Gagal mendaftarkan device token:", error); + } catch (error: any) { + // Log error detail tapi jangan crash aplikasi + console.error("❌ Gagal mendaftarkan device token:", error?.message); + console.error("Response status:", error?.response?.status); + console.error("Response data:", error?.response?.data); + // Skip logout - biarkan user tetap bisa pakai app meski notif gagal } }; diff --git a/components/_ShareComponent/SkeletonCustom.tsx b/components/_ShareComponent/SkeletonCustom.tsx index 89b8ee3..a00b1e9 100644 --- a/components/_ShareComponent/SkeletonCustom.tsx +++ b/components/_ShareComponent/SkeletonCustom.tsx @@ -49,7 +49,7 @@ const CustomSkeleton: React.FC = ({ right: 0, height: 100, backgroundColor: MainColor.soft_darkblue, - borderRadius: 4, + borderRadius: 1, }} /> diff --git a/ios/HIPMIBadungConnect.xcodeproj/project.pbxproj b/ios/HIPMIBadungConnect.xcodeproj/project.pbxproj index 18e7185..7f01abc 100644 --- a/ios/HIPMIBadungConnect.xcodeproj/project.pbxproj +++ b/ios/HIPMIBadungConnect.xcodeproj/project.pbxproj @@ -171,6 +171,11 @@ EEC6AC8AF9C04E91AA81C190 /* Remove signature files (Xcode workaround) */, D2BED766D85C4781B154BD69 /* Remove signature files (Xcode workaround) */, E01278D305D540D5B29ED50A /* Remove signature files (Xcode workaround) */, + 72EDC26CA2144B90BEFE947F /* Remove signature files (Xcode workaround) */, + 0A09E19272A94BEBAAF5A27A /* Remove signature files (Xcode workaround) */, + 9B007D2599C64C7F8F525B86 /* Remove signature files (Xcode workaround) */, + 1393AE9C86924FA8B1F8D11E /* Remove signature files (Xcode workaround) */, + E1F9AE3DCABE4A088A05E180 /* Remove signature files (Xcode workaround) */, ); buildRules = ( ); @@ -779,6 +784,91 @@ rm -rf \"$CONFIGURATION_BUILD_DIR/MapLibre.xcframework-ios.signature\"; "; }; + 72EDC26CA2144B90BEFE947F /* Remove signature files (Xcode workaround) */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + name = "Remove signature files (Xcode workaround)"; + inputPaths = ( + ); + outputPaths = ( + ); + shellPath = /bin/sh; + shellScript = " + echo \"Remove signature files (Xcode workaround)\"; + rm -rf \"$CONFIGURATION_BUILD_DIR/MapLibre.xcframework-ios.signature\"; + "; + }; + 0A09E19272A94BEBAAF5A27A /* Remove signature files (Xcode workaround) */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + name = "Remove signature files (Xcode workaround)"; + inputPaths = ( + ); + outputPaths = ( + ); + shellPath = /bin/sh; + shellScript = " + echo \"Remove signature files (Xcode workaround)\"; + rm -rf \"$CONFIGURATION_BUILD_DIR/MapLibre.xcframework-ios.signature\"; + "; + }; + 9B007D2599C64C7F8F525B86 /* Remove signature files (Xcode workaround) */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + name = "Remove signature files (Xcode workaround)"; + inputPaths = ( + ); + outputPaths = ( + ); + shellPath = /bin/sh; + shellScript = " + echo \"Remove signature files (Xcode workaround)\"; + rm -rf \"$CONFIGURATION_BUILD_DIR/MapLibre.xcframework-ios.signature\"; + "; + }; + 1393AE9C86924FA8B1F8D11E /* Remove signature files (Xcode workaround) */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + name = "Remove signature files (Xcode workaround)"; + inputPaths = ( + ); + outputPaths = ( + ); + shellPath = /bin/sh; + shellScript = " + echo \"Remove signature files (Xcode workaround)\"; + rm -rf \"$CONFIGURATION_BUILD_DIR/MapLibre.xcframework-ios.signature\"; + "; + }; + E1F9AE3DCABE4A088A05E180 /* Remove signature files (Xcode workaround) */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + name = "Remove signature files (Xcode workaround)"; + inputPaths = ( + ); + outputPaths = ( + ); + shellPath = /bin/sh; + shellScript = " + echo \"Remove signature files (Xcode workaround)\"; + rm -rf \"$CONFIGURATION_BUILD_DIR/MapLibre.xcframework-ios.signature\"; + "; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ diff --git a/ios/HIPMIBadungConnect/Info.plist b/ios/HIPMIBadungConnect/Info.plist index a743c17..cc5cc95 100644 --- a/ios/HIPMIBadungConnect/Info.plist +++ b/ios/HIPMIBadungConnect/Info.plist @@ -39,7 +39,7 @@ CFBundleVersion - 1 + 2 ITSAppUsesNonExemptEncryption LSMinimumSystemVersion diff --git a/screens/Home/bottomFeatureSection.tsx b/screens/Home/bottomFeatureSection.tsx index 23bde4b..85b60b3 100644 --- a/screens/Home/bottomFeatureSection.tsx +++ b/screens/Home/bottomFeatureSection.tsx @@ -36,10 +36,6 @@ export default function Home_BottomFeatureSection() { }, []) ); - if (listData === null) { - return - } - return ( <> router.push("/job")}> diff --git a/service/api-device-token.ts b/service/api-device-token.ts index ff42c82..31c1562 100644 --- a/service/api-device-token.ts +++ b/service/api-device-token.ts @@ -15,13 +15,14 @@ export async function apiDeviceRegisterToken({ data: DeviceTokenData; }) { try { - const response = await apiConfig.post(`/mobile/auth/device-tokens`, { - data: data, - }); + const response = await apiConfig.post(`/mobile/auth/device-tokens`, data); return response.data; - } catch (error) { + } catch (error: any) { console.error("Failed to register device token:", error); + console.error("Response data:", error?.response?.data); + console.error("Response status:", error?.response?.status); + console.error("Request payload:", data); throw error; } }