Skip to content

Commit

Permalink
feat: 전화번호 검색 로직 구현
Browse files Browse the repository at this point in the history
  • Loading branch information
jhj2713 committed Aug 11, 2024
1 parent f8be524 commit 4532a44
Show file tree
Hide file tree
Showing 5 changed files with 49 additions and 38 deletions.
5 changes: 3 additions & 2 deletions admin/src/apis/lotteryAPI.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ export const LotteryAPI = {
id,
size,
page,
phoneNumber,
}: GetLotteryWinnerParams): Promise<GetLotteryWinnerResponse> {
try {
return new Promise((resolve) =>
Expand Down Expand Up @@ -82,11 +83,11 @@ export const LotteryAPI = {
appliedCount: 3,
},
],
isLastPage: true,
isLastPage: false,
})
);
const response = await fetchWithTimeout(
`${baseURL}/${id}/winner?size=${size}&page=${page}`,
`${baseURL}/${id}/winner?size=${size}&page=${page}&number=${phoneNumber}`,
{
method: "GET",
headers: headers,
Expand Down
21 changes: 2 additions & 19 deletions admin/src/components/Input/index.tsx
Original file line number Diff line number Diff line change
@@ -1,32 +1,15 @@
import { ComponentProps } from "react";
import { cva } from "class-variance-authority";

interface InputProps extends ComponentProps<"input"> {
label?: string;
inputSize?: "lg" | "sm";
}

const InputVariants = cva(`border border-neutral-950 rounded-lg text-neutral-950 h-body-1-medium`, {
variants: {
inputSize: {
lg: "p-[16px] w-[360px]",
sm: "p-[8px] w-[240px]",
},
},
});

export default function Input({
label,
value,
onChange,
inputSize = "lg",
...restProps
}: InputProps) {
export default function Input({ label, value, onChange, ...restProps }: InputProps) {
return (
<div className="flex items-center">
{label && <p className="text-neutral-950 h-body-1-bold mx-[20px]">{label}</p>}
<input
className={InputVariants({ inputSize })}
className="p-[16px] border border-neutral-950 rounded-lg text-neutral-950 w-[360px] h-body-1-medium"
value={value}
onChange={onChange}
{...restProps}
Expand Down
43 changes: 34 additions & 9 deletions admin/src/pages/LotteryWinnerList/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -28,14 +28,22 @@ export default function LotteryWinnerList() {

const { handleOpenModal, ModalComponent } = useModal();
const [selectedWinner, setSelectedWinner] = useState<LotteryExpectationsType[]>([]);
const phoneNumberRef = useRef<string>("");
const phoneNumberInputRef = useRef<HTMLInputElement>(null);

const {
data: winnerInfo,
isSuccess: isSuccessGetLotteryWinner,
fetchNextPage: getWinnerInfo,
refetch: refetchWinnerInfo,
} = useInfiniteFetch({
fetch: (pageParam: number) =>
LotteryAPI.getLotteryWinner({ id: lotteryId, size: 10, page: pageParam }),
LotteryAPI.getLotteryWinner({
id: lotteryId,
size: 10,
page: pageParam,
phoneNumber: phoneNumberRef.current,
}),
initialPageParam: 1,
getNextPageParam: (currentPageParam: number, lastPage: GetLotteryWinnerResponse) => {
return lastPage.isLastPage ? undefined : currentPageParam + 1;
Expand All @@ -48,6 +56,11 @@ export default function LotteryWinnerList() {
enabled: isSuccessGetLotteryWinner,
});

const handleRefetch = () => {
phoneNumberRef.current = phoneNumberInputRef.current?.value || "";
refetchWinnerInfo();
};

const handleLottery = () => {
navigate("/lottery/winner");
};
Expand Down Expand Up @@ -90,14 +103,26 @@ export default function LotteryWinnerList() {
<TabHeader />

<div className="w-[1560px] flex flex-col items-center justify-center gap-8 mt-10">
<div className="flex items-center gap-2 self-start">
<img
alt="뒤로 가기 버튼"
src="/assets/icons/left-arrow.svg"
className="cursor-pointer"
onClick={() => navigate(-1)}
/>
<p className="h-body-1-medium">당첨자 추첨</p>
<div className="flex w-full justify-between">
<div className="flex items-center gap-2">
<img
alt="뒤로 가기 버튼"
src="/assets/icons/left-arrow.svg"
className="cursor-pointer"
onClick={() => navigate(-1)}
/>
<p className="h-body-1-medium">당첨자 추첨</p>
</div>

<div className="flex gap-2">
<input
ref={phoneNumberInputRef}
className="border border-neutral-950 rounded-lg text-neutral-950 h-body-1-medium"
/>
<Button buttonSize="sm" onClick={handleRefetch}>
검색
</Button>
</div>
</div>

<Table
Expand Down
17 changes: 9 additions & 8 deletions admin/src/pages/RushWinnerList/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import { useLocation, useNavigate } from "react-router-dom";
import { RushAPI } from "@/apis/rushAPI";
import Button from "@/components/Button";
import Dropdown from "@/components/Dropdown";
import Input from "@/components/Input";
import TabHeader from "@/components/TabHeader";
import Table from "@/components/Table";
import useFetch from "@/hooks/useFetch";
Expand All @@ -22,7 +21,8 @@ export default function RushWinnerList() {
const [options, setOptions] = useState<RushOptionType[]>([]);
const [selectedOptionIdx, setSelectedOptionIdx] = useState<number>(0);

const [phoneNumber, setPhoneNumber] = useState<string>("");
const phoneNumberRef = useRef<string>("");
const phoneNumberInputRef = useRef<HTMLInputElement>(null);

const {
data: participants,
Expand All @@ -36,7 +36,7 @@ export default function RushWinnerList() {
size: 10,
page: pageParam,
option: options[selectedOptionIdx].rushOptionId,
phoneNumber,
phoneNumber: phoneNumberRef.current,
}),
initialPageParam: 1,
getNextPageParam: (currentPageParam: number, lastPage: GetRushParticipantListResponse) => {
Expand All @@ -55,7 +55,7 @@ export default function RushWinnerList() {
id: rushId,
size: 10,
page: pageParam,
phoneNumber,
phoneNumber: phoneNumberRef.current,
}),
initialPageParam: 1,
getNextPageParam: (currentPageParam: number, lastPage: GetRushParticipantListResponse) => {
Expand Down Expand Up @@ -95,6 +95,8 @@ export default function RushWinnerList() {
}, [selectedOptionIdx]);

const handleSearchPhoneNumber = () => {
phoneNumberRef.current = phoneNumberInputRef.current?.value || "";

if (isWinnerToggle) {
refetchRushWinnerList();
} else {
Expand Down Expand Up @@ -176,10 +178,9 @@ export default function RushWinnerList() {
</div>

<div className="flex gap-2">
<Input
inputSize="sm"
value={phoneNumber}
onChange={(e) => setPhoneNumber(e.target.value)}
<input
ref={phoneNumberInputRef}
className="border border-neutral-950 rounded-lg text-neutral-950 h-body-1-medium"
/>
<Button buttonSize="sm" onClick={handleSearchPhoneNumber}>
검색
Expand Down
1 change: 1 addition & 0 deletions admin/src/types/lotteryApi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ export interface GetLotteryWinnerParams {
id: number;
size: number;
page: number;
phoneNumber?: string;
}

export interface GetLotteryExpectationsParams {
Expand Down

0 comments on commit 4532a44

Please sign in to comment.