Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[#66] 헤더 Select 상태 API 연결 #72

Merged
merged 9 commits into from
Jan 21, 2024
1 change: 1 addition & 0 deletions src/api/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@ export { default as postRefreshToken } from './lib/postRefreshToken';
export { default as getTotalReport } from './lib/getTotalReport';
export { default as getYearReport } from './lib/getYearReport';
export { default as getCouponList } from './lib/getCouponList';
export { default as getHeaderAccommodation } from './lib/getHeaderAccommodation';
13 changes: 13 additions & 0 deletions src/api/lib/getHeaderAccommodation.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { AxiosResponse } from 'axios';

import { instance } from '..';
import { HeaderAccommodationResult } from '@/types/layout';

const getHeaderAccommodation = async (): Promise<HeaderAccommodationResult> => {
const response: AxiosResponse<HeaderAccommodationResult, Error> =
await instance.get(`/v1/accommodation`);

return response.data;
};

export default getHeaderAccommodation;
4 changes: 3 additions & 1 deletion src/api/lib/getTotalReport.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
import { AxiosResponse } from 'axios';

import { instance } from '..';
import { TotalReportResult } from '@/types/report';

const getTotalReport = async (
accommodation_id: number
): Promise<TotalReportResult> => {
const response = await instance.get(
const response: AxiosResponse<TotalReportResult, Error> = await instance.get(
`/v1/dashboards/${accommodation_id}/reports/total`
);

Expand Down
6 changes: 1 addition & 5 deletions src/components/Report/LeftSection/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,8 @@ import Graph from './Graph';

const LeftSection = () => {
const headerSelectState = useRecoilValue(headerAccommodationState);
// HACK: recoil로 쿼리 정보 가져오기, 이슈 #67 에서 작업중
const { data: yearReportData } = useGetYearReport(
headerSelectState.accommodationId
);
const { data: yearReportData } = useGetYearReport(headerSelectState.id);
const { coupon_sales_list: graphProps, ...yearReportProps } = yearReportData;
// HACK: 배열 순서 변경 필요, 이슈 #67 에서 작업중
const yearReport = Object.entries(yearReportProps);

return (
Expand Down
4 changes: 1 addition & 3 deletions src/components/Report/RightSection/TotalReport/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,7 @@ import { AmountStyleProps } from '@/types/report';

const TotalReport = () => {
const headerSelectState = useRecoilValue(headerAccommodationState);
const { data: TotalReportResult } = useGetTotalReport(
headerSelectState.accommodationId
);
const { data: TotalReportResult } = useGetTotalReport(headerSelectState.id);
const TotalReportArray = Object.entries(TotalReportResult);

return (
Expand Down
50 changes: 17 additions & 33 deletions src/components/common/Layout/Header/Select/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,59 +3,43 @@ import theme from '@styles/theme';

import { useRecoilState } from 'recoil';
import { headerAccommodationState } from '@recoil/index';
import useGetHeaderAccommodation from '@hooks/queries/useGetHeaderAccommodation';
import { useEffect } from 'react';

const Select = () => {
/* HACK: 예시 데이터, 리액트 쿼리를 활용하여 넘겨 selectList 배열을 받음

const { data: selectList } = useFetchAccommodation();

*/

const selectList = [
{
accommodationId: 1,
accommodationName: '영덕 아이스 풀빌라'
},
{
accommodationId: 2,
accommodationName: '영덕 아이스 풀빌라2'
},
{
accommodationId: 3,
accommodationName: '영덕 아이스 풀빌라3'
},
{
accommodationId: 4,
accommodationName: '영덕 아이스 풀빌라4'
}
];
const { data: selectList } = useGetHeaderAccommodation();

const [headerAccommodation, setHeaderAccommodation] = useRecoilState(
headerAccommodationState
);

useEffect(() => {
setHeaderAccommodation(selectList[0]);
}, []);

const handleSelect = (e: React.ChangeEvent<HTMLSelectElement>) => {
const accommodationId = Number(e.target.value);
const selectId = Number(e.target.value);

const selectAccommodation = selectList.find(
select => select.id === selectId
);

setHeaderAccommodation({
accommodationId,
accommodationName: `${e.target.children[accommodationId - 1].textContent}`
});
selectAccommodation ? setHeaderAccommodation(selectAccommodation) : null;
};

return (
<Container>
<Accommodations
name="Accommodations"
onChange={handleSelect}
value={headerAccommodation.accommodationId}
value={headerAccommodation.id}
>
{selectList.map(item => (
<Accommodation
value={item.accommodationId}
key={item.accommodationId}
value={item.id}
key={item.id}
>
{item.accommodationName}
{item.name}
</Accommodation>
))}
</Accommodations>
Expand Down
12 changes: 12 additions & 0 deletions src/hooks/queries/useGetHeaderAccommodation.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { useSuspenseQuery } from '@tanstack/react-query';

import { getHeaderAccommodation } from 'src/api';
import { HeaderAccommodationResult } from '@/types/layout';

const useGetHeaderAccommodation = () =>
useSuspenseQuery<HeaderAccommodationResult, Error>({
queryKey: ['Accommodation'],
queryFn: () => getHeaderAccommodation()
});

export default useGetHeaderAccommodation;
4 changes: 3 additions & 1 deletion src/hooks/queries/useGetTotalReport.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
import { useSuspenseQuery } from '@tanstack/react-query';

import { getTotalReport } from 'src/api';
import { TotalReportResult } from '@/types/report';

const useGetTotalReport = (accommodation_id: number) =>
useSuspenseQuery({
useSuspenseQuery<TotalReportResult, Error>({
queryKey: ['TotalReport', accommodation_id],
queryFn: () => getTotalReport(accommodation_id)
});
Expand Down
4 changes: 3 additions & 1 deletion src/hooks/queries/useGetYearReport.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
import { useSuspenseQuery } from '@tanstack/react-query';

import { getYearReport } from 'src/api';
import { YearReportResult } from '@/types/report';

// recoil로 쿼리 정보 가져오기
const useGetYearReport = (accommodation_id: number) =>
useSuspenseQuery({
useSuspenseQuery<YearReportResult, Error>({
queryKey: ['YearReport', accommodation_id],
queryFn: () => getYearReport(accommodation_id)
});
Expand Down
20 changes: 10 additions & 10 deletions src/recoil/atoms/headerAccommodationState.ts
Original file line number Diff line number Diff line change
@@ -1,22 +1,22 @@
import { atom } from 'recoil';
import { recoilPersist } from 'recoil-persist';

import { headerAccommodationAtom } from '@/types/header';
import { HeaderAccommodation } from '@/types/layout';

const { persistAtom } = recoilPersist();

const headerAccommodationState = atom<headerAccommodationAtom>({
const headerAccommodationState = atom<HeaderAccommodation>({
key: 'headerAccommodationState',
default: {
/* HACK: 로그인 구현 완료 후 리코일 초기값 설정 방법

1. React Query에서 API 요청을 성공하면,
2. recoil 상태를 체크하여 비어있는 경우에만 setRecoilState로 업데이트

*/
accommodationId: 1,
accommodationName: '영덕 아이스 풀빌라'
id: 0,
name: '',
sido_id: 0,
sido: '',
sigungu_id: 0,
sigungu: '',
address: ''
},

effects_UNSTABLE: [persistAtom]
});

Expand Down
4 changes: 0 additions & 4 deletions src/types/header.ts

This file was deleted.

14 changes: 14 additions & 0 deletions src/types/layout.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,20 @@
// Layout
export type LayoutStyleProps = { $pathname: string };

// Header

export type HeaderAccommodation = {
id: number;
name: string;
sido_id: number;
sido: string;
sigungu_id: number;
sigungu: string;
address: string;
};

export type HeaderAccommodationResult = HeaderAccommodation[];

// Sidebar
export type SidebarHeader = {
isSidebarOpen: boolean;
Expand Down
Loading