diff --git a/app/(application)/admin/voting/[id]/[status]/index.tsx b/app/(application)/admin/voting/[id]/[status]/index.tsx index 1e64ab7..35274ba 100644 --- a/app/(application)/admin/voting/[id]/[status]/index.tsx +++ b/app/(application)/admin/voting/[id]/[status]/index.tsx @@ -1,3 +1,4 @@ +/* eslint-disable react-hooks/exhaustive-deps */ import { AlertDefaultSystem, BadgeCustom, @@ -14,14 +15,42 @@ 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 { MainColor } from "@/constants/color-palet"; +import { apiAdminVotingById } from "@/service/api-admin/api-admin-voting"; +import { dateTimeView } from "@/utils/dateTimeView"; +import { Entypo } from "@expo/vector-icons"; import dayjs from "dayjs"; -import { router, useLocalSearchParams } from "expo-router"; +import { router, useFocusEffect, useLocalSearchParams } from "expo-router"; import _ from "lodash"; +import { useCallback, useState } from "react"; import { List } from "react-native-paper"; export default function AdminVotingDetail() { const { id, status } = useLocalSearchParams(); + const [data, setData] = useState(null); + + useFocusEffect( + useCallback(() => { + onLoadData(); + }, [id]) + ); + + const onLoadData = async () => { + try { + const response = await apiAdminVotingById({ + id: id as string, + }); + + console.log("[DATA BY ID]", JSON.stringify(response, null, 2)); + + if (response.success) { + setData(response.data); + } + } catch (error) { + console.log("[ERROR]", error); + } + }; + const colorBadge = () => { if (status === "publish") { return MainColor.green; @@ -37,63 +66,53 @@ export default function AdminVotingDetail() { const listData = [ { label: "Username", - value: "Bagas Banuna", + value: (data && data?.Author?.username) || "-", }, { label: "Judul", - value: `Judul Proyek: ${id}Lorem ipsum dolor sit amet consectetur adipisicing elit.`, + value: (data && data?.title) || "-", }, { label: "Status", - value: ( - - {_.startCase(status as string)} - - ), + value: + data && data?.Voting_Status?.name ? ( + + {_.startCase(data?.Voting_Status?.name)} + + ) : ( + "-" + ), }, { label: "Mulai Voting", - value: dayjs().format("DD/MM/YYYY"), + value: + (data && data?.awalVote && dateTimeView({ date: data?.awalVote })) || + "-", }, { label: "Voting Berakhir", - value: dayjs().format("DD/MM/YYYY"), + value: + (data && data?.akhirVote && dateTimeView({ date: data?.akhirVote })) || + "-", }, - { label: "Deskripsi", - value: "Lorem ipsum dolor sit amet consectetur adipisicing elit.", + value: (data && data?.deskripsi) || "-", }, { - label: "Daftar Pilhan", - value: ( - <> - Pilihan 1} - left={(props) => ( - - )} - /> - Pilihan 2} - left={(props) => ( - - )} - /> - Pilihan 3} - left={(props) => ( - - )} - /> - Pilihan 4} - left={(props) => ( - - )} - /> - - ), + label: "Daftar Pilihan", + value: + data && data?.Voting_DaftarNamaVote + ? data?.Voting_DaftarNamaVote?.map((item: any, i: number) => ( + {item?.value}} + left={(props) => ( + + )} + /> + )) + : "-", }, ]; @@ -121,17 +140,23 @@ export default function AdminVotingDetail() { - - {Array.from({length: 4}).map((_, index) => ( - - - - - Pilihan {index + 1} - - - - ))} + {Array.from({ length: 4 }).map((_, index) => ( + + + + + Pilihan {index + 1} + + + + ))} )} diff --git a/app/(application)/admin/voting/[status]/status.tsx b/app/(application)/admin/voting/[status]/status.tsx index 7f82a65..dd01ee8 100644 --- a/app/(application)/admin/voting/[status]/status.tsx +++ b/app/(application)/admin/voting/[status]/status.tsx @@ -1,27 +1,66 @@ +/* eslint-disable react-hooks/exhaustive-deps */ import { - ActionIcon, - BaseBox, - SearchInput, - Spacing, - TextCustom, - ViewWrapper, + ActionIcon, + BaseBox, + LoaderCustom, + SearchInput, + Spacing, + 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 { apiAdminVoting } from "@/service/api-admin/api-admin-voting"; import { Octicons } from "@expo/vector-icons"; -import { router, useLocalSearchParams } from "expo-router"; +import { router, useFocusEffect, useLocalSearchParams } from "expo-router"; import _ from "lodash"; +import { useState, useCallback } from "react"; import { Divider } from "react-native-paper"; export default function AdminVotingStatus() { const { status } = useLocalSearchParams(); + console.log("[STATUS]", status); + + const [list, setList] = useState(null); + const [loadList, setLoadList] = useState(false); + const [search, setSearch] = useState(""); + + useFocusEffect( + useCallback(() => { + onLoadData(); + }, [status, search]) + ); + + const onLoadData = async () => { + try { + setLoadList(true); + const response = await apiAdminVoting({ + category: status as "publish" | "review" | "reject" as any, + search, + }); + + // console.log("[LIST BY STATUS]", JSON.stringify(response, null, 2)); + + if (response.success) { + setList(response.data); + } + } catch (error) { + console.log("[ERROR]", error); + } finally { + setLoadList(false); + } + }; + const rightComponent = ( ); return ( @@ -32,18 +71,17 @@ export default function AdminVotingStatus() { rightComponent={rightComponent} /> - + - - {Array.from({ length: 10 }).map((_, index) => ( + {loadList ? : _.isEmpty(list) ? Belum ada data : list.map((item: any, i: number) => ( } onPress={() => { - router.push(`/admin/voting/${index}/${status}`); + router.push(`/admin/voting/${item.id}/${status}`); }} /> } - value2={Username username} + value2={{item?.Author?.username || "-"}} value3={ - - Lorem ipsum dolor sit amet consectetur adipisicing elit. - Blanditiis asperiores quidem deleniti architecto eaque et - nostrum, ad consequuntur eveniet quisquam quae voluptatum - ducimus! Dolorem nobis modi officia debitis, beatae mollitia. + + {item?.title || "-"} } /> ))} - + ); diff --git a/app/(application)/admin/voting/index.tsx b/app/(application)/admin/voting/index.tsx index 210f03f..bfb89cf 100644 --- a/app/(application)/admin/voting/index.tsx +++ b/app/(application)/admin/voting/index.tsx @@ -8,8 +8,56 @@ import { import AdminComp_BoxDashboard from "@/components/_ShareComponent/Admin/BoxDashboard"; import AdminTitlePage from "@/components/_ShareComponent/Admin/TitlePage"; import { MainColor } from "@/constants/color-palet"; +import { apiAdminVoting } from "@/service/api-admin/api-admin-voting"; +import { useFocusEffect } from "expo-router"; +import { useCallback, useState } from "react"; export default function AdminVoting() { + const [data, setData] = useState(null); + + useFocusEffect( + useCallback(() => { + onLoadData(); + }, []) + ); + + const onLoadData = async () => { + try { + const response = await apiAdminVoting({ + category: "dashboard", + }); + + if (response.success) { + setData(response.data); + } + } catch (error) { + console.log("[ERROR]", error); + } + }; + + const listData = [ + { + label: "Publish", + value: (data && data?.publish) || 0, + icon: , + }, + { + label: "Review", + value: (data && data?.review) || 0, + icon: , + }, + { + label: "Reject", + value: (data && data?.reject) || 0, + icon: , + }, + { + label: "Riwayat", + value: (data && data?.history) || 0, + icon: , + }, + ]; + return ( <> @@ -24,26 +72,3 @@ export default function AdminVoting() { ); } - -const listData = [ - { - label: "Publish", - value: 4, - icon: , - }, - { - label: "Review", - value: 7, - icon: , - }, - { - label: "Reject", - value: 5, - icon: , - }, - { - label: "Riwayat", - value: 5, - icon: , - }, -]; diff --git a/service/api-admin/api-admin-voting.ts b/service/api-admin/api-admin-voting.ts new file mode 100644 index 0000000..758e102 --- /dev/null +++ b/service/api-admin/api-admin-voting.ts @@ -0,0 +1,31 @@ +import { apiConfig } from "../api-config"; + +export async function apiAdminVoting({ + category, + search, +}: { + category: "dashboard" | "history" | "publish" | "review" | "report"; + search?: string; +}) { + try { + const response = await apiConfig.get( + `/mobile/admin/voting?category=${category}&search=${search}` + ); + return response.data; + } catch (error) { + throw error; + } +} + +export async function apiAdminVotingById({ + id, +}: { + id: string; +}) { + try { + const response = await apiConfig.get(`/mobile/admin/voting/${id}`); + return response.data; + } catch (error) { + throw error; + } +}