Skip to content

Commit 1118bb9

Browse files
authored
[UNI-140] feat : 제보 Form API 연결 (#65)
* [UNI-130] feat : 제보 페이지 연결 및 관련 Type 수정 * [UNI-140] 제보 페이지 API 연결 * [UNI-140] feat : query cache 지우기
1 parent fc4bb91 commit 1118bb9

File tree

15 files changed

+231
-71
lines changed

15 files changed

+231
-71
lines changed

uniro_frontend/src/api/route.ts

+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import { IssueTypeKey } from "../constant/enum/reportEnum";
2+
import { CautionIssueType, DangerIssueType } from "../data/types/enum";
3+
import { NodeId } from "../data/types/node";
4+
5+
import { CoreRoutesList, NavigationRouteList, RouteId } from "../data/types/route";
6+
import { getFetch, postFetch } from "../utils/fetch/fetch";
7+
import { transformAllRoutes } from "./transformer/route";
8+
import { GetAllRouteRepsonse } from "./type/response/route";
9+
10+
export const getNavigationResult = (
11+
univId: number,
12+
startNodeId: NodeId,
13+
endNodeId: NodeId,
14+
): Promise<NavigationRouteList> => {
15+
return getFetch<NavigationRouteList>(`/${univId}/routes/fastest`, {
16+
"start-node-id": startNodeId,
17+
"end-node-id": endNodeId,
18+
});
19+
};
20+
21+
export const getAllRoutes = (univId: number): Promise<CoreRoutesList> => {
22+
return getFetch<GetAllRouteRepsonse>(`/${univId}/routes`).then((data) => transformAllRoutes(data));
23+
};
24+
25+
export const getSingleRouteRisk = (
26+
univId: number,
27+
routeId: RouteId,
28+
): Promise<{
29+
routeId: NodeId;
30+
dangerTypes: IssueTypeKey[];
31+
cautionTypes: IssueTypeKey[];
32+
}> => {
33+
return getFetch<{
34+
routeId: NodeId;
35+
dangerTypes: IssueTypeKey[];
36+
cautionTypes: IssueTypeKey[];
37+
}>(`/${univId}/routes/${routeId}/risk`);
38+
};
39+
40+
export const postReport = (
41+
univId: number,
42+
routeId: RouteId,
43+
body: { dangerTypes: DangerIssueType[]; cautionTypes: CautionIssueType[] },
44+
): Promise<boolean> => {
45+
return postFetch<void, string>(`/${univId}/route/risk/${routeId}`, body);
46+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import { DangerIssueType } from "../../constant/enum/reportEnum";
2+
import { CoreRoutesList } from "../../data/types/route";
3+
import { GetAllRouteRepsonse, GetSingleRouteRiskResponse } from "../type/response/route";
4+
5+
export const transformAllRoutes = (data: GetAllRouteRepsonse): CoreRoutesList => {
6+
const { nodeInfos, coreRoutes } = data;
7+
const nodeInfoMap = new Map(nodeInfos.map((node) => [node.nodeId, node]));
8+
9+
return coreRoutes.map((coreRoute) => {
10+
return {
11+
...coreRoute,
12+
routes: coreRoute.routes.map((route) => {
13+
const node1 = nodeInfoMap.get(route.startNodeId);
14+
const node2 = nodeInfoMap.get(route.endNodeId);
15+
16+
if (!node1) {
17+
throw new Error(`Node not found: ${route.startNodeId}`);
18+
}
19+
if (!node2) {
20+
throw new Error(`Node not found: ${route.endNodeId}`);
21+
}
22+
23+
return {
24+
routeId: route.routeId,
25+
node1,
26+
node2,
27+
};
28+
}),
29+
};
30+
});
31+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export type getAllRouteRequest = {
2+
univId: number;
3+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { IssueTypeKey } from "../../../constant/enum/reportEnum";
2+
import { Node, NodeId } from "../../../data/types/node";
3+
4+
type CoreRoutesResponse = {
5+
coreNode1Id: NodeId;
6+
coreNode2Id: NodeId;
7+
routes: {
8+
routeId: NodeId;
9+
startNodeId: NodeId;
10+
endNodeId: NodeId;
11+
}[];
12+
};
13+
14+
export type GetAllRouteRepsonse = {
15+
nodeInfos: Node[];
16+
coreRoutes: CoreRoutesResponse[];
17+
};
18+
19+
export type GetSingleRouteRiskResponse = {
20+
routeId: NodeId;
21+
dangerTypes?: IssueTypeKey[];
22+
cautionTypes?: IssueTypeKey[];
23+
};
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,27 @@
11
import React from "react";
22
import { getThemeByPassableStatus } from "../../utils/report/getThemeByPassableStatus";
3-
import { CautionIssue, DangerIssue, PassableStatus } from "../../constant/enum/reportEnum";
3+
import { CautionIssue, DangerIssue, IssueTypeKey, PassableStatus } from "../../constant/enum/reportEnum";
4+
import { CautionIssueType, DangerIssueType } from "../../data/types/enum";
45

56
export const SecondaryFormButton = ({
67
onClick,
78
formPassableStatus,
8-
content,
99
isSelected,
10+
contentKey,
1011
}: {
11-
onClick: (answer: DangerIssue | CautionIssue) => void;
12+
onClick: (answer: IssueTypeKey) => void;
1213
formPassableStatus: PassableStatus;
13-
content: DangerIssue | CautionIssue;
1414
isSelected: boolean;
15+
contentKey: IssueTypeKey;
1516
}) => {
1617
return (
1718
<button
18-
onClick={() => onClick(content)}
19+
onClick={() => onClick(contentKey)}
1920
className={`mb-3 mr-3 py-[18px] px-[22px] border-[1px] rounded-[20px] w-fit text-kor-body2 border-gray-400 ${isSelected && getThemeByPassableStatus(formPassableStatus)}`}
2021
>
21-
{content}
22+
{formPassableStatus === PassableStatus.CAUTION
23+
? CautionIssue[contentKey as CautionIssueType]
24+
: DangerIssue[contentKey as DangerIssueType]}
2225
</button>
2326
);
2427
};

uniro_frontend/src/components/report/secondaryForm.tsx

+6-13
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,18 @@
1-
import { CautionIssue, DangerIssue, PassableStatus } from "../../constant/enum/reportEnum";
1+
import { IssueTypeKey, PassableStatus } from "../../constant/enum/reportEnum";
22
import { IssueQuestionButtons, ReportFormData, ReportModeType } from "../../data/types/report";
33

44
import { FormTitle } from "./formTitle";
55
import { SecondaryFormButton } from "./secondaryButton";
66

77
const buttonConfig = {
8-
danger: [DangerIssue.CURB, DangerIssue.CRACK, DangerIssue.SLOPE, DangerIssue.ETC],
9-
caution: [
10-
CautionIssue.CURB,
11-
CautionIssue.STAIRS,
12-
CautionIssue.SLOPE,
13-
CautionIssue.ETC,
14-
],
8+
danger: [IssueTypeKey.CURB, IssueTypeKey.STAIRS, IssueTypeKey.SLOPE, IssueTypeKey.ETC],
9+
caution: [IssueTypeKey.CURB, IssueTypeKey.CRACK, IssueTypeKey.SLOPE, IssueTypeKey.ETC],
1510
} as IssueQuestionButtons;
1611

1712
type SecondaryFormProps = {
1813
reportMode: ReportModeType;
1914
formData: ReportFormData;
20-
handleSecondarySelect: (answer: DangerIssue | CautionIssue) => void;
15+
handleSecondarySelect: (answer: IssueTypeKey) => void;
2116
};
2217

2318
export const SecondaryForm = ({ formData, handleSecondarySelect, reportMode }: SecondaryFormProps) => {
@@ -35,8 +30,7 @@ export const SecondaryForm = ({ formData, handleSecondarySelect, reportMode }: S
3530
onClick={handleSecondarySelect}
3631
formPassableStatus={formData.passableStatus}
3732
isSelected={formData.cautionIssues.includes(button)}
38-
content={button}
39-
key={index}
33+
contentKey={button}
4034
/>
4135
);
4236
})}
@@ -47,8 +41,7 @@ export const SecondaryForm = ({ formData, handleSecondarySelect, reportMode }: S
4741
onClick={handleSecondarySelect}
4842
formPassableStatus={formData.passableStatus}
4943
isSelected={formData.dangerIssues.includes(button)}
50-
content={button}
51-
key={index}
44+
contentKey={button}
5245
/>
5346
);
5447
})}

uniro_frontend/src/constant/enum/reportEnum.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,14 @@ export enum PassableStatus {
55
INITIAL = "INITIAL",
66
}
77

8-
export enum DangerIssue {
8+
export enum CautionIssue {
99
CURB = "낮은 턱이 있어요",
1010
CRACK = "도로에 균열이 있어요",
1111
SLOPE = "낮은 비탈길이 있어요",
1212
ETC = "그 외 요소",
1313
}
1414

15-
export enum CautionIssue {
15+
export enum DangerIssue {
1616
CURB = "높은 턱이 있어요",
1717
STAIRS = "계단이 있어요",
1818
SLOPE = "경사가 매우 높아요",

uniro_frontend/src/data/types/enum.d.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1+
import { CautionIssue, DangerIssue } from "../../constant/enum/reportEnum";
12
import { Markers } from "../../constant/enum/markerEnum";
2-
import { DangerIssue, CautionIssue } from "../../constant/enum/reportEnum";
33

44
export type DangerIssueType = keyof typeof DangerIssue;
55
export type CautionIssueType = keyof typeof CautionIssue;

uniro_frontend/src/data/types/report.d.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ export interface IssueQuestionButtons {
1414
}
1515
export interface ReportFormData {
1616
passableStatus: PassableStatus;
17-
dangerIssues: DangerIssue[];
18-
cautionIssues: CautionIssue[];
17+
dangerIssues: IssueTypeKey[];
18+
cautionIssues: IssueTypeKey[];
19+
1920
}

uniro_frontend/src/data/types/route.d.ts

+14
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,20 @@ export interface NavigationRoute extends Route {
2626
cautionTypes: CautionIssueType[];
2727
}
2828

29+
export interface CoreRoute {
30+
routeId: RouteId;
31+
node1: Node;
32+
node2: Node;
33+
}
34+
35+
export interface CoreRoutes {
36+
coreNode1Id: NodeId;
37+
coreNode2Id: NodeId;
38+
routes: CoreRoute[];
39+
}
40+
41+
export type CoreRoutesList = CoreRoutes[];
42+
2943
export type RoutePointType = RoutePoint.ORIGIN | RoutePoint.DESTINATION;
3044

3145
export type RouteDetail = {

uniro_frontend/src/hooks/useDynamicSuspense.tsx

+1-2
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,7 @@ export const useDynamicSuspense = () => {
1010
useEffect(() => {
1111
const newFallback = fallbackConfig[location.pathname] || fallbackConfig["/"];
1212
setFallback(newFallback);
13-
console.log("fallback", newFallback);
1413
}, [location.pathname, setFallback]);
1514

16-
return { location, fallback }
15+
return { location, fallback };
1716
};

uniro_frontend/src/hooks/useModal.tsx

+6-1
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,18 @@
11
import React, { ReactNode, useCallback, useState } from "react";
22

3-
export default function useModal(): [React.FC<{ children: ReactNode }>, boolean, () => void, () => void] {
3+
export default function useModal(
4+
onClose?: () => void,
5+
): [React.FC<{ children: ReactNode }>, boolean, () => void, () => void] {
46
const [isOpen, setIsOpen] = useState<boolean>(false);
57

68
const open = useCallback(() => {
79
setIsOpen(true);
810
}, []);
911

1012
const close = useCallback(() => {
13+
if (onClose) {
14+
onClose();
15+
}
1116
setIsOpen(false);
1217
}, []);
1318

uniro_frontend/src/hooks/useUniversityInfo.tsx

-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ interface UniversityInfoStore {
77
setUniversity: (university: University) => void;
88
resetUniversity: () => void;
99
}
10-
1110
const useUniversityInfo = create(
1211
persist<UniversityInfoStore>(
1312
(set) => ({
@@ -24,5 +23,4 @@ const useUniversityInfo = create(
2423
},
2524
),
2625
);
27-
2826
export default useUniversityInfo;

0 commit comments

Comments
 (0)