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 340b7ce..4a36a61 100644 --- a/app/(application)/admin/app-information/business-field/[id]/index.tsx +++ b/app/(application)/admin/app-information/business-field/[id]/index.tsx @@ -1,18 +1,89 @@ +/* eslint-disable react-hooks/exhaustive-deps */ import { BoxButtonOnFooter, ButtonCustom, StackCustom, + TextCustom, TextInputCustom, ViewWrapper, } from "@/components"; import AdminBackButtonAntTitle from "@/components/_ShareComponent/Admin/BackButtonAntTitle"; -import { router } from "expo-router"; +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, + }); + + 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, + }); + + 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 = ( router.back()} + disabled={!data?.name} + isLoading={isLoading} + onPress={() => handlerSubmit()} > Update @@ -28,6 +99,15 @@ export default function AdminAppInformation_BusinessFieldDetail() { label="Nama Bidang Bisnis" placeholder="Masukan Nama Bidang Bisnis" required + value={data?.name} + onChangeText={(value) => setData({ ...data, name: value })} + /> + + Status Aktivasi + setData({ ...data, active: value })} /> diff --git a/app/(application)/admin/app-information/business-field/create.tsx b/app/(application)/admin/app-information/business-field/create.tsx index 205542c..9a77a91 100644 --- a/app/(application)/admin/app-information/business-field/create.tsx +++ b/app/(application)/admin/app-information/business-field/create.tsx @@ -6,13 +6,52 @@ import { ViewWrapper, } from "@/components"; import AdminBackButtonAntTitle from "@/components/_ShareComponent/Admin/BackButtonAntTitle"; +import { apiAdminMasterBusinessFieldCreate } from "@/service/api-admin/api-master-admin"; import { router } from "expo-router"; +import { useState } from "react"; +import Toast from "react-native-toast-message"; export default function AdminAppInformation_BusinessFieldCreate() { + const [data, setData] = useState({ + name: "", + }); + const [isLoading, setIsLoading] = useState(false); + + const handlerSubmit = async () => { + if (!data.name) { + Toast.show({ + type: "error", + text1: "Lengkapi Data", + }); + return; + } + try { + setIsLoading(true); + const response = await apiAdminMasterBusinessFieldCreate({ data: data }); + + if (response.success) { + Toast.show({ + type: "success", + text1: "Data berhasil di tambah", + }); + router.back(); + } + } catch (error) { + console.log("[ERROR]", error); + Toast.show({ + type: "error", + text1: "Gagal tambah data", + }); + } finally { + setIsLoading(false); + } + }; + const buttonSubmit = ( router.back()} + onPress={() => handlerSubmit()} + isLoading={isLoading} > Tambah @@ -28,6 +67,8 @@ export default function AdminAppInformation_BusinessFieldCreate() { label="Nama Bidang Bisnis" placeholder="Masukan Nama Bidang Bisnis" required + value={data.name} + onChangeText={(value) => setData({ ...data, name: value })} /> diff --git a/app/(application)/admin/app-information/index.tsx b/app/(application)/admin/app-information/index.tsx index 2913ec5..66212ff 100644 --- a/app/(application)/admin/app-information/index.tsx +++ b/app/(application)/admin/app-information/index.tsx @@ -1,8 +1,4 @@ -import { - ScrollableCustom, - StackCustom, - ViewWrapper -} from "@/components"; +import { ScrollableCustom, StackCustom, ViewWrapper } from "@/components"; import AdminActionIconPlus from "@/components/_ShareComponent/Admin/ActionIconPlus"; import AdminComp_BoxTitle from "@/components/_ShareComponent/Admin/BoxTitlePage"; import AdminAppInformation_BusinessFieldSection from "@/screens/Admin/App-Information/BusinessFieldSection"; @@ -10,6 +6,7 @@ import AdminAppInformation_Bank from "@/screens/Admin/App-Information/Informatio import AdminAppInformation_StickerSection from "@/screens/Admin/App-Information/StickerSection"; import { router } from "expo-router"; import { useState } from "react"; +import { Alert } from "react-native"; export default function AdminInformation() { const [activeCategory, setActiveCategory] = useState("bank"); @@ -57,7 +54,8 @@ export default function AdminInformation() { } else if (activeCategory === "business") { router.push("/admin/app-information/business-field/create"); } else if (activeCategory === "sticker") { - router.push("/admin/app-information/sticker/create"); + Alert.alert("Coming Soon", "Next Update"); + // router.push("/admin/app-information/sticker/create"); } }} /> diff --git a/app/(application)/admin/app-information/information-bank/[id]/index.tsx b/app/(application)/admin/app-information/information-bank/[id]/index.tsx index b4033ff..0c8d2fb 100644 --- a/app/(application)/admin/app-information/information-bank/[id]/index.tsx +++ b/app/(application)/admin/app-information/information-bank/[id]/index.tsx @@ -1,18 +1,90 @@ +/* eslint-disable react-hooks/exhaustive-deps */ import { - BoxButtonOnFooter, - ButtonCustom, - StackCustom, - TextInputCustom, - ViewWrapper, + BoxButtonOnFooter, + ButtonCustom, + CenterCustom, + Grid, + StackCustom, + TextCustom, + TextInputCustom, + ViewWrapper, } from "@/components"; import AdminBackButtonAntTitle from "@/components/_ShareComponent/Admin/BackButtonAntTitle"; -import { router } from "expo-router"; +import { MainColor } from "@/constants/color-palet"; +import { + apiAdminMasterBankById, + apiAdminMasterBankUpdate, +} 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_BankDetail() { + const { id } = useLocalSearchParams(); + const [data, setData] = useState(null); + const [isLoading, setLoading] = useState(false); + + useFocusEffect( + useCallback(() => { + onLoadList(); + }, [id]) + ); + + const onLoadList = async () => { + try { + const response = await apiAdminMasterBankById({ id: id as string }); + + if (response.success) { + setData(response.data); + } + } catch (error) { + console.log("[ERROR]", error); + } + }; + + const handlerUpdate = async () => { + if (!data.namaBank || !data.namaAkun || !data.norek) { + Toast.show({ + type: "error", + text1: "Lengkapi Data", + }); + return; + } + + try { + setLoading(true); + const response = await apiAdminMasterBankUpdate({ + id: id as string, + data: data, + }); + + if (!response.success) { + Toast.show({ + type: "error", + text1: "Gagal update data", + }); + } else { + Toast.show({ + type: "success", + text1: "Success", + text2: "Data berhasil di update", + }); + router.back(); + } + } catch (error) { + console.log("[ERROR]", error); + } finally { + setLoading(false); + } + }; + const buttonSubmit = ( router.back()} + disabled={!data?.namaBank || !data?.namaAkun || !data?.norek} + isLoading={isLoading} + onPress={() => handlerUpdate()} > Update @@ -25,22 +97,46 @@ export default function AdminAppInformation_BankDetail() { - + + + + setData({ ...data, namaBank: value }) + } + /> + + + Status Aktivasi + + + setData({ ...data, isActive: value }) + } + color={MainColor.yellow} + value={data?.isActive} + /> + + + setData({ ...data, namaAkun: value })} /> setData({ ...data, norek: value })} /> diff --git a/app/(application)/admin/app-information/information-bank/create.tsx b/app/(application)/admin/app-information/information-bank/create.tsx index 1e6609b..837c2ef 100644 --- a/app/(application)/admin/app-information/information-bank/create.tsx +++ b/app/(application)/admin/app-information/information-bank/create.tsx @@ -1,19 +1,51 @@ import { - BoxButtonOnFooter, - ButtonCustom, - StackCustom, - TextInputCustom, - ViewWrapper + BoxButtonOnFooter, + ButtonCustom, + StackCustom, + TextInputCustom, + ViewWrapper, } from "@/components"; import AdminBackButtonAntTitle from "@/components/_ShareComponent/Admin/BackButtonAntTitle"; +import { apiAdminMasterBankCreate } from "@/service/api-admin/api-master-admin"; import { router } from "expo-router"; +import { useState } from "react"; +import Toast from "react-native-toast-message"; export default function AdminAppInformation_BankCreate() { + const [data, setData] = useState({ + namaBank: "", + namaAkun: "", + norek: "", + }); + + const [isLoading, setLoading] = useState(false); + + const handlerSubmit = async () => { + try { + setLoading(true); + const response = await apiAdminMasterBankCreate({ data: data }); + + if (response.success) { + Toast.show({ + type: "success", + text1: "Data berhasil di tambah", + }); + router.back(); + } + } catch (error) { + console.log("[ERROR]", error); + Toast.show({ + type: "error", + text1: "Gagal tambah data", + }); + } finally { + setLoading(false); + } + }; + const buttonSubmit = ( - router.back()} - > + Tambah @@ -29,18 +61,25 @@ export default function AdminAppInformation_BankCreate() { label="Nama Bank" placeholder="Masukan Nama Bank" required + value={data.namaBank} + onChangeText={(value) => setData({ ...data, namaBank: value })} /> setData({ ...data, namaAkun: value })} /> setData({ ...data, norek: value })} /> diff --git a/app/(application)/admin/maps.tsx b/app/(application)/admin/maps.tsx index f27ac3d..a02ad58 100644 --- a/app/(application)/admin/maps.tsx +++ b/app/(application)/admin/maps.tsx @@ -1,11 +1,224 @@ -import { MapCustom, ViewWrapper } from "@/components"; +import { ButtonCustom, DrawerCustom, DummyLandscapeImage, Grid, MapCustom, 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 { 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 interface LocationItem { + id: string | number; + latitude: number; + longitude: number; + name: string; + imageId?: string; +} export default function AdminMaps() { + 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/Admin/App-Information/BusinessFieldSection.tsx b/screens/Admin/App-Information/BusinessFieldSection.tsx index 52e0e97..3928723 100644 --- a/screens/Admin/App-Information/BusinessFieldSection.tsx +++ b/screens/Admin/App-Information/BusinessFieldSection.tsx @@ -1,29 +1,57 @@ import { ActionIcon, + BadgeCustom, + CenterCustom, Grid, + LoaderCustom, StackCustom, - TextCustom + TextCustom, } from "@/components"; -import { MainColor } from "@/constants/color-palet"; +import { AccentColor } from "@/constants/color-palet"; import { ICON_SIZE_BUTTON } from "@/constants/constans-value"; -import dummyMasterBidangBisnis from "@/lib/dummy-data/master-bidang-bisnis"; +import { apiAdminMasterBusinessField } from "@/service/api-admin/api-master-admin"; import { FontAwesome5 } from "@expo/vector-icons"; -import { router } from "expo-router"; -import { useState } from "react"; +import { router, useFocusEffect } from "expo-router"; +import _ from "lodash"; +import { useCallback, useState } from "react"; import { View } from "react-native"; -import { Divider, Switch } from "react-native-paper"; +import { Divider } from "react-native-paper"; export default function AdminAppInformation_BusinessFieldSection() { - const [value, setValue] = useState(false); - const [selectedBusinessField, setSelectedBusinessField] = useState(null); + const [listData, setListData] = useState(null); + const [loadData, setLoadData] = useState(false); + + useFocusEffect( + useCallback(() => { + onLoadList(); + }, []) + ); + + const onLoadList = async () => { + try { + setLoadData(true); + const response = await apiAdminMasterBusinessField(); + + + if (response.success) { + setListData(response.data); + } + } catch (error) { + console.log("[ERROR LIST BUSINESS FIELD]", error); + setListData([]); + } finally { + setLoadData(false); + } + }; + return ( <> - <> + - + Aksi - + Status @@ -33,51 +61,54 @@ export default function AdminAppInformation_BusinessFieldSection() { - - - {dummyMasterBidangBisnis.map((e, i) => ( - - - - - } - onPress={() => { - router.push(`/admin/app-information/business-field/${i}`); - }} - /> - - - { - setValue(!value); - setSelectedBusinessField(i); - }} - theme={{ - colors: { - primary: MainColor.yellow, - }, - }} - /> - - - {e.name} - - - - - ))} - - + {loadData ? ( + + ) : _.isEmpty(listData) ? ( + Tidak ada data + ) : ( + + {listData?.map((item: any, index: number) => ( + + + + + } + onPress={() => { + router.push( + `/admin/app-information/business-field/${item.id}` + ); + }} + /> + + + + + {item.active ? "Aktif" : "Tidak Aktif"} + + + + + {item.name} + + + + ))} + + )} + ); } diff --git a/screens/Admin/App-Information/InformationBankSection.tsx b/screens/Admin/App-Information/InformationBankSection.tsx index 2289c86..b78fc1f 100644 --- a/screens/Admin/App-Information/InformationBankSection.tsx +++ b/screens/Admin/App-Information/InformationBankSection.tsx @@ -1,77 +1,119 @@ -import { ActionIcon, Grid, StackCustom, TextCustom } from "@/components"; -import { MainColor } from "@/constants/color-palet"; +import { + ActionIcon, + BadgeCustom, + CenterCustom, + Grid, + LoaderCustom, + StackCustom, + TextCustom, +} from "@/components"; +import { AccentColor } from "@/constants/color-palet"; import { ICON_SIZE_BUTTON } from "@/constants/constans-value"; -import { dummyMasterBank } from "@/lib/dummy-data/_master/bank"; +import { apiAdminMasterBank } from "@/service/api-admin/api-master-admin"; import { FontAwesome5 } from "@expo/vector-icons"; -import { router } from "expo-router"; -import { useState } from "react"; +import { router, useFocusEffect } from "expo-router"; +import _ from "lodash"; +import { useCallback, useState } from "react"; import { View } from "react-native"; -import { Divider, Switch } from "react-native-paper"; +import { Divider } from "react-native-paper"; export default function AdminAppInformation_Bank() { - const [value, setValue] = useState(false); + const [listData, setListData] = useState(null); + const [loadData, setLoadData] = useState(false); + + useFocusEffect( + useCallback(() => { + loadMasterBank(); + }, []) + ); + + const loadMasterBank = async () => { + try { + setLoadData(true); + const response = await apiAdminMasterBank(); + + setListData(response.data); + } catch (error) { + console.log("[ERROR LIST BANK]", error); + setListData([]); + } finally { + setLoadData(false); + } + }; + return ( <> - <> + - - Aksi + + + Aksi + - - Status + + + Status + - Nama Bank + + Nama Bank + - - {dummyMasterBank.map((e, i) => ( - - - - - } - onPress={() => { - router.push( - `/admin/app-information/information-bank/${i}` - ); - }} - /> - - - { - setValue(!value); - }} - theme={{ - colors: { - primary: MainColor.yellow, - }, - }} - /> - - - {e.code} - - - - - ))} - - + {loadData ? ( + + ) : _.isEmpty(listData) ? ( + Tidak ada data + ) : ( + + {listData?.map((item: any, index: number) => ( + + + + + } + onPress={() => { + router.push( + `/admin/app-information/information-bank/${item.id}` + ); + }} + /> + + + + + {item.isActive ? "Aktif" : "Tidak Aktif"} + + + + + {item.namaBank} + + + + ))} + + )} + ); } diff --git a/screens/Admin/App-Information/StickerSection.tsx b/screens/Admin/App-Information/StickerSection.tsx index f3383c7..40c82d1 100644 --- a/screens/Admin/App-Information/StickerSection.tsx +++ b/screens/Admin/App-Information/StickerSection.tsx @@ -10,69 +10,77 @@ import { Divider, Switch } from "react-native-paper"; export default function AdminAppInformation_StickerSection() { const [value, setValue] = useState(false); + return ( <> - - - Aksi - - - Status - - - Stiker - - - - - - - {listSticker.map((e, i) => ( - - - - - } - onPress={() => { - router.push(`/admin/app-information/sticker/${i}`); - }} - /> - - - { - setValue(!value); - }} - theme={{ - colors: { - primary: MainColor.yellow, - }, - }} - /> - - - - - - - - ))} - + + Cooming Soon, Next Update !! + ); + // return ( + // <> + // + // + // Aksi + // + // + // Status + // + // + // Stiker + // + // + + // + + // + // {listSticker.map((e, i) => ( + // + // + // + // + // } + // onPress={() => { + // router.push(`/admin/app-information/sticker/${i}`); + // }} + // /> + // + // + // { + // setValue(!value); + // }} + // theme={{ + // colors: { + // primary: MainColor.yellow, + // }, + // }} + // /> + // + // + // + // + // + // + // + // ))} + // + // + // ); } const listSticker = [ diff --git a/screens/Authentication/LoginView.tsx b/screens/Authentication/LoginView.tsx index 7534c6c..d3f444c 100644 --- a/screens/Authentication/LoginView.tsx +++ b/screens/Authentication/LoginView.tsx @@ -93,15 +93,15 @@ export default function LoginView() { } } - if (token && !isUserActive) { + if (token && token !== "" && !isUserActive) { return ; } - if (token && !isAdmin) { + if (token && token !== "" && !isAdmin) { return ; } - if (token && isAdmin) { + if (token && token !== "" && isAdmin) { return ; } diff --git a/service/api-admin/api-master-admin.ts b/service/api-admin/api-master-admin.ts new file mode 100644 index 0000000..bc06b97 --- /dev/null +++ b/service/api-admin/api-master-admin.ts @@ -0,0 +1,102 @@ +import { apiConfig } from "../api-config"; + +// ================== START MASTER BANK ================== // +export async function apiAdminMasterBank() { + try { + const response = await apiConfig.get(`/mobile/admin/master/bank`); + return response.data; + } catch (error) { + throw error; + } +} + +export async function apiAdminMasterBankById({ id }: { id: string }) { + try { + const response = await apiConfig.get(`/mobile/admin/master/bank/${id}`); + return response.data; + } catch (error) { + throw error; + } +} + +export async function apiAdminMasterBankUpdate({ + id, + data, +}: { + id: string; + data: any; +}) { + try { + const response = await apiConfig.put(`/mobile/admin/master/bank/${id}`, { + data: data, + }); + return response.data; + } catch (error) { + throw error; + } +} + +export async function apiAdminMasterBankCreate({ data }: { data: any }) { + try { + const response = await apiConfig.post(`/mobile/admin/master/bank`, { + data: data, + }); + return response.data; + } catch (error) { + throw error; + } +} + +// ================== END MASTER BANK ================== // + +// ================== START BUSINNES FIELD ================== // + +export async function apiAdminMasterBusinessField() { + try { + const response = await apiConfig.get(`/mobile/admin/master/business-field`); + return response.data; + } catch (error) { + throw error; + } +} + +export async function apiAdminMasterBusinessFieldById({ id }: { id: string }) { + try { + const response = await apiConfig.get(`/mobile/admin/master/business-field/${id}`); + return response.data; + } catch (error) { + throw error; + } +} + +export async function apiAdminMasterBusinessFieldUpdate({ + id, + data, +}: { + id: string; + data: any; +}) { + try { + const response = await apiConfig.put(`/mobile/admin/master/business-field/${id}`, { + data: data, + }); + return response.data; + } catch (error) { + throw error; + } +} + +export async function apiAdminMasterBusinessFieldCreate({ data }: { data: any }) { + try { + const response = await apiConfig.post(`/mobile/admin/master/business-field`, { + data: data, + }); + return response.data; + } catch (error) { + throw error; + } +} + + + +// ================== END BUSINNES FIELD ================== // diff --git a/service/api-client/api-master.ts b/service/api-client/api-master.ts index 5f42d69..2088d38 100644 --- a/service/api-client/api-master.ts +++ b/service/api-client/api-master.ts @@ -127,6 +127,10 @@ export async function apiMasterInvestment({ } } +// ================== END MASTER INVESTMENT ================== // + +// ================== START MASTER BANK ================== // + export async function apiMasterBank() { try { const response = await apiConfig.get(`/mobile/master/bank`); @@ -136,6 +140,8 @@ export async function apiMasterBank() { } } +// ================== END MASTER BANK ================== // + export async function apiMasterDonation({ category, }: {