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..b6c5996 100644 --- a/app/(application)/(user)/home.tsx +++ b/app/(application)/(user)/home.tsx @@ -1,66 +1,100 @@ /* 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 { apiJobGetAll } from "@/service/api-client/api-job"; 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, View } from "react-native"; export default function Application() { const { token, user, userData } = useAuth(); const [data, setData] = useState(); const [refreshing, setRefreshing] = useState(false); const { syncUnreadCount } = useNotificationStore(); + const [listData, setListData] = useState(null); useFocusEffect( useCallback(() => { onLoadData(); + onLoadDataJob(); 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 onLoadDataJob = async () => { + try { + const response = await apiJobGetAll({ + category: "beranda", + }); + const result = response.data + .sort( + (a: any, b: any) => + new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime() + ) + .slice(0, 2); + setListData(result); + } catch (error) { + console.log("[ERROR]", error); + } + }; + + useFocusEffect( + useCallback(() => { + onLoadData(); + }, []) + ); + 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(() => { setRefreshing(true); onLoadData(); + onLoadDataJob(); checkVersion(); 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"); + console.warn("User is not active"); return ( @@ -69,7 +103,7 @@ export default function Application() { } if (data && data?.Profile === null) { - console.log("Profile is null"); + console.warn("Profile is null"); return ( @@ -91,17 +125,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 ? ( - + + + + ) : ( (); const [dataToken, setDataToken] = useState(); const [listPortofolio, setListPortofolio] = useState(); + const [refreshing, setRefreshing] = useState(false); const { token, logout, isAdmin, user, userData } = useAuth(); @@ -43,7 +44,7 @@ export default function Profile() { onLoadUserByToken(); isUserCheck(); userData(token as string); - }, [id, token]) + }, [id, token]), ); const isUserCheck = () => { @@ -54,13 +55,21 @@ export default function Profile() { }; const onLoadData = async (id: string) => { - const response = await apiProfile({ id: id }); - setData(response.data); + try { + const response = await apiProfile({ id: id }); + setData(response.data); + } catch (error) { + console.log("[ERROR onLoadData]", error); + } }; const onLoadUserByToken = async () => { - const response = await apiUser(user?.id as string); - setDataToken(response?.data?.Profile); + try { + const response = await apiUser(user?.id as string); + setDataToken(response?.data?.Profile); + } catch (error) { + console.log("[ERROR onLoadUserByToken]", error); + } }; const onLoadPortofolio = async (id: string) => { @@ -69,15 +78,25 @@ 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); } catch (error) { - console.log("[ERROR]", error); + console.log("[ERROR onLoadPortofolio]", error); } }; + const onRefresh = useCallback(() => { + setRefreshing(true); + onLoadData(id as string); + onLoadPortofolio(id as string); + onLoadUserByToken(); + isUserCheck(); + userData(token as string); + setRefreshing(false); + }, [id, token]); + return ( <> {/* Main View */} - + + } + > {!data || !dataToken ? ( - + + + + ) : ( <> @@ -110,7 +141,7 @@ export default function Profile() { /> )} - + {/* Drawer Komponen Eksternal */} (null); const [loadList, setLoadList] = useState(false); @@ -72,74 +54,30 @@ export default function AdminMaps() { } }; + const markers: MapMarker[] = list?.map((item) => ({ + id: item.id, + coordinate: [item.longitude, item.latitude] as [number, number], + imageId: item.Portofolio?.logoId, + onSelected: () => { + 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, + }); + }, + })) || []; + 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"} > - + {selected.imageId && ( + + )} = ({ right: 0, height: 100, backgroundColor: MainColor.soft_darkblue, - borderRadius: 4, + borderRadius: 1, }} /> diff --git a/constants/constans-value.ts b/constants/constans-value.ts index da76671..d92897f 100644 --- a/constants/constans-value.ts +++ b/constants/constans-value.ts @@ -24,7 +24,7 @@ export { // OS Height const OS_ANDROID_HEIGHT = 115 -const OS_IOS_HEIGHT = 90 +const OS_IOS_HEIGHT = 80 const OS_HEIGHT = Platform.OS === "ios" ? OS_IOS_HEIGHT : OS_ANDROID_HEIGHT // Text Size diff --git a/ios/HIPMIBadungConnect.xcodeproj/project.pbxproj b/ios/HIPMIBadungConnect.xcodeproj/project.pbxproj index 18e7185..8450924 100644 --- a/ios/HIPMIBadungConnect.xcodeproj/project.pbxproj +++ b/ios/HIPMIBadungConnect.xcodeproj/project.pbxproj @@ -171,6 +171,13 @@ 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) */, + 211F6E22A1B24524B67693F8 /* Remove signature files (Xcode workaround) */, + 469F2CAA8928481CA86EB0F4 /* Remove signature files (Xcode workaround) */, ); buildRules = ( ); @@ -779,6 +786,125 @@ 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\"; + "; + }; + 211F6E22A1B24524B67693F8 /* 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\"; + "; + }; + 469F2CAA8928481CA86EB0F4 /* 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..2295263 100644 --- a/screens/Home/bottomFeatureSection.tsx +++ b/screens/Home/bottomFeatureSection.tsx @@ -1,45 +1,15 @@ import { ClickableCustom, TextCustom } from "@/components"; import Spacing from "@/components/_ShareComponent/Spacing"; -import React, { useCallback, useState } from "react"; +import { router } from "expo-router"; import { View } from "react-native"; import Icon from "react-native-vector-icons/FontAwesome"; import { stylesHome } from "./homeViewStyle"; -import { router, useFocusEffect } from "expo-router"; -import { apiJobGetAll } from "@/service/api-client/api-job"; -import CustomSkeleton from "@/components/_ShareComponent/SkeletonCustom"; - -export default function Home_BottomFeatureSection() { - const [listData, setListData] = useState(null); - - const onLoadData = async () => { - try { - const response = await apiJobGetAll({ - category: "beranda", - }); - - console.log("[DATA JOB]", JSON.stringify(response.data, null, 2)); - const result = response.data - .sort( - (a: any, b: any) => - new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime() - ) - .slice(0, 2); - setListData(result); - } catch (error) { - console.log("[ERROR]", error); - } - }; - - useFocusEffect( - useCallback(() => { - onLoadData(); - }, []) - ); - - if (listData === null) { - return - } +export default function Home_BottomFeatureSection({ + listData, +}: { + listData: any[] | null; +}) { return ( <> router.push("/job")}> diff --git a/screens/UserSeach/MainView_V2.tsx b/screens/UserSeach/MainView_V2.tsx index 0be71d8..9632072 100644 --- a/screens/UserSeach/MainView_V2.tsx +++ b/screens/UserSeach/MainView_V2.tsx @@ -139,8 +139,8 @@ export default function UserSearchMainView_V2() { searchQuery: search, emptyMessage: "Tidak ada pengguna ditemukan", emptySearchMessage: "Tidak ada hasil pencarian", - skeletonCount: 5, - skeletonHeight: 150, + skeletonCount: PAGINATION_DEFAULT_TAKE, + skeletonHeight: 100, loadingFooterText: "Memuat lebih banyak pengguna...", isInitialLoad, }); 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; } }