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;
}
}