"use client"; import { useState } from "react"; import useSWR from 'swr'; import { Button, Input, Label, Select, SelectTrigger, SelectContent, SelectItem, SelectValue } from "@common/components"; import { useAlertStore } from "@/shared/lib"; import { type SearchFormProps, type SearchFormValues, defaultSearchFormProps } from "../type/SearchForm.type"; import { statisticsAPi } from "@/entities/statistics/api/statistics-service"; import type { ApiResponse, Sido, Sgg } from "@/entities/statistics/model/statistics-interface"; const getSidoListFetcher = async (): Promise> => { return statisticsAPi.getSidoList(); }; const getSggListFetcher = async (key: [string, string]): Promise> => { return statisticsAPi.getSggList(key[1]); }; const SearchForm = (props: SearchFormProps = {}) => { const { setMessage: alert } = useAlertStore((state) => state); const mergedProps = { ...defaultSearchFormProps, ...props }; const currentYear = new Date().getFullYear(); const defaultYear = currentYear - 1; const startYear = currentYear - 10; const yearOptions = Array.from({ length: currentYear - startYear + 1 }, (_, i) => currentYear - i); const [values, setValues] = useState({ sido: props.defaultValues?.sido || "", gugun: props.defaultValues?.gugun || "", year: props.defaultValues?.year || String(defaultYear), order: props.defaultValues?.order || "", fctName: props.defaultValues?.fctName || "", }); const { data: sidoList } = useSWR>( "sido-list", getSidoListFetcher, { revalidateOnFocus: false, revalidateOnReconnect: false, revalidateIfStale: false, dedupingInterval: 2000, shouldRetryOnError: false, onSuccess: (data) => { if (data.status !== 'success') { alert(`시도 목록을 불러오는데 실패했습니다. 새로고침 후 다시 시도해주세요.`); } }, onError: () => { alert(`시도 목록을 불러오는데 실패했습니다. 새로고침 후 다시 시도해주세요.`); }, } ); const { data: sggList } = useSWR>( values.sido && values.sido !== "ALL" ? ["sgg-list", values.sido] : null, getSggListFetcher, { revalidateOnFocus: false, revalidateOnReconnect: false, revalidateIfStale: false, dedupingInterval: 2000, shouldRetryOnError: false, onSuccess: (data) => { if (data.status !== 'success') { alert(`시군구 목록을 불러오는데 실패했습니다. 새로고침 후 다시 시도해주세요.`); } }, onError: () => { alert(`시군구 목록을 불러오는데 실패했습니다. 새로고침 후 다시 시도해주세요.`); }, } ); const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); props.onSubmit?.(values); }; const handleReset = () => { const resetValues: SearchFormValues = { sido: "", gugun: "", year: String(defaultYear), order: "", fctName: "", }; setValues(resetValues); props.onReset?.(); }; return (
{mergedProps.sido &&
} {mergedProps.gugun &&
} {mergedProps.year &&
} {mergedProps.order &&
}
{(mergedProps.fctName || mergedProps.userMenual) &&
{mergedProps.fctName &&
setValues({ ...values, fctName: e.target.value })} autoComplete="off" />
} {mergedProps.userMenual &&
}
}
); }; export default SearchForm;