diff --git a/.yarn/cache/turbo-npm-2.5.4-7c0ade5845-81af22a24c.zip b/.yarn/cache/turbo-npm-2.5.4-7c0ade5845-81af22a24c.zip deleted file mode 100644 index 8bd9f35d..00000000 Binary files a/.yarn/cache/turbo-npm-2.5.4-7c0ade5845-81af22a24c.zip and /dev/null differ diff --git a/.yarn/cache/turbo-windows-64-npm-2.5.4-5f270924d2-10c0.zip b/.yarn/cache/turbo-windows-64-npm-2.5.4-5f270924d2-10c0.zip deleted file mode 100644 index df85ce32..00000000 Binary files a/.yarn/cache/turbo-windows-64-npm-2.5.4-5f270924d2-10c0.zip and /dev/null differ diff --git a/apps/nowait-admin/src/hooks/Reservation/useGetCompletedList.tsx b/apps/nowait-admin/src/hooks/Reservation/useGetCompletedList.tsx new file mode 100644 index 00000000..d0a06cbb --- /dev/null +++ b/apps/nowait-admin/src/hooks/Reservation/useGetCompletedList.tsx @@ -0,0 +1,37 @@ +import { useQuery } from "@tanstack/react-query"; +import AdminApi from "../../utils/AdminApi"; + +export interface Reservation { + id: number; + storeId: number; + userName: string; + requestedAt: string; + status: "WAITING" | "CALLING" | "CONFIRMED" | "CANCELLED"; + partySize: number; +} + +interface ReservationResponse { + waitingCount: number; + confirmedCount: number; + cancelledCount: number; + callingCount: number; + reservationList: Reservation[]; +} + +const fetchReservations = async ( + storeId: number +): Promise => { + const res = await AdminApi.get(`/reservations/admin/${storeId}/completed`); + return res.data; +}; + +export const useGetCompletedList = (storeId: number | null) => { + return useQuery({ + queryKey: ["completed", storeId], + queryFn: () => { + if (storeId === null) throw new Error("storeId is null"); + return fetchReservations(storeId); + }, + enabled: storeId !== null, // storeId 없으면 실행 안 함 + }); +}; diff --git a/apps/nowait-admin/src/hooks/useGetReservationList.tsx b/apps/nowait-admin/src/hooks/Reservation/useGetReservationList.tsx similarity index 78% rename from apps/nowait-admin/src/hooks/useGetReservationList.tsx rename to apps/nowait-admin/src/hooks/Reservation/useGetReservationList.tsx index 3c6f248a..5dc3dc17 100644 --- a/apps/nowait-admin/src/hooks/useGetReservationList.tsx +++ b/apps/nowait-admin/src/hooks/Reservation/useGetReservationList.tsx @@ -1,5 +1,5 @@ import { useQuery } from "@tanstack/react-query"; -import AdminApi from "../utils/AdminApi"; +import AdminApi from "../../utils/AdminApi"; export interface Reservation { id: number; @@ -18,16 +18,13 @@ interface ReservationResponse { reservationList: Reservation[]; } -interface ApiResponse { - success: boolean; - response: ReservationResponse; -} - const fetchReservations = async ( storeId: number ): Promise => { - const res = await AdminApi.get(`/reservations/admin/${storeId}`); - return res.data.response; + const res = await AdminApi.get( + `/reservations/admin/${storeId}/waiting/users` + ); + return res.data; }; export const useGetReservationList = (storeId: number | null) => { diff --git a/apps/nowait-admin/src/hooks/useUpdateReservationStatus.tsx b/apps/nowait-admin/src/hooks/Reservation/useUpdateReservationStatus.tsx similarity index 91% rename from apps/nowait-admin/src/hooks/useUpdateReservationStatus.tsx rename to apps/nowait-admin/src/hooks/Reservation/useUpdateReservationStatus.tsx index dda139e8..742452e0 100644 --- a/apps/nowait-admin/src/hooks/useUpdateReservationStatus.tsx +++ b/apps/nowait-admin/src/hooks/Reservation/useUpdateReservationStatus.tsx @@ -1,5 +1,5 @@ import { useMutation } from "@tanstack/react-query"; -import AdminApi from "../utils/AdminApi"; +import AdminApi from "../../utils/AdminApi"; export const useUpdateReservationStatus = () => { return useMutation({ diff --git a/apps/nowait-admin/src/pages/AdminHome/AdminHome.tsx b/apps/nowait-admin/src/pages/AdminHome/AdminHome.tsx index 9ea6bff0..eae8aebd 100644 --- a/apps/nowait-admin/src/pages/AdminHome/AdminHome.tsx +++ b/apps/nowait-admin/src/pages/AdminHome/AdminHome.tsx @@ -2,12 +2,13 @@ import { useEffect, useMemo, useState } from "react"; import RoundTabButton from "./components/RoundTabButton"; import refreshIcon from "../../assets/refresh.svg"; import { WaitingCard } from "./components/WaitingCard"; -import { useGetReservationList } from "../../hooks/useGetReservationList"; +import { useGetReservationList } from "../../hooks/Reservation/useGetReservationList"; import on from "../../assets/on.svg"; import off from "../../assets/off.svg"; -import { useUpdateReservationStatus } from "../../hooks/useUpdateReservationStatus"; +import { useUpdateReservationStatus } from "../../hooks/Reservation/useUpdateReservationStatus"; import ConfirmRemoveModal from "../../components/ConfirmRemoveModal"; import ToggleSwitch from "./components/ToggleSwitch"; +import { useGetCompletedList } from "../../hooks/Reservation/useGetCompletedList"; type WaitingStatus = "WAITING" | "CALLING" | "CONFIRMED" | "CANCELLED"; interface Reservation { @@ -31,7 +32,10 @@ const AdminHome = () => { const storeId = 1; //현재는 임시로 mockdata씀 const [isOn, setIsOn] = useState(true); const [reservations, setReservations] = useState([]); - const { data, isLoading, isError } = useGetReservationList(storeId); + const { data: waitingList } = useGetReservationList(storeId); //calling, wating + const { data: completedList } = useGetCompletedList(storeId); //canceled, conformed + + console.log(waitingList); const toggle = () => setIsOn((prev) => !prev); //대기 중 카드 개수 @@ -142,33 +146,33 @@ const AdminHome = () => { }); }; useEffect(() => { - if (!data?.reservationList) return; + if (!Array.isArray(waitingList) || !Array.isArray(completedList)) return; const now = Date.now(); - setReservations( - data.reservationList.map((res, idx) => { - const requested = new Date(res.requestedAt); - return { - id: res.id, - requestedAt: res.requestedAt, //서버 데이터 문자열 그대로 사용("2025-06-24T12:33:26") - time: requested.toLocaleTimeString("ko-KR", { - hour: "2-digit", - minute: "2-digit", - hour12: true, - }), - waitMinutes: Math.floor((now - requested.getTime()) / 60000), - peopleCount: res.partySize, - name: res.userName, - phone: "010-****-****", - status: res.status, - calledAt: - res.status === "CALLING" ? requested.toISOString() : undefined, - }; - }) - ); - }, [data]); + const normalize = (res: any): Reservation => { + const requested = new Date(res.createdAt ?? ""); + const called = new Date(res.calledAt ?? ""); + return { + id: Number(res.id), + requestedAt: res.createdAt, + time: requested.toLocaleTimeString("ko-KR", { + hour: "2-digit", + minute: "2-digit", + hour12: true, + }), + waitMinutes: Math.floor((now - requested.getTime()) / 60000), + peopleCount: res.partySize, + name: res.userName, + phone: "010-****-****", + status: res.status, + calledAt: res.status === "CALLING" ? called.toISOString() : undefined, + }; + }; + const merged = [...waitingList, ...completedList].map(normalize); + setReservations(merged); + }, [waitingList, completedList]); return (
{ - const token = localStorage.getItem("accessToken"); + const token = localStorage.getItem("adminToken"); console.log(token, "토큰 알려줘"); if (token) { config.headers.Authorization = `Bearer ${token}`;