Skip to content

Commit f87f9b1

Browse files
committed
refactor: 바뀐 응답에 따라 수정 #10
1 parent b40adaa commit f87f9b1

1 file changed

Lines changed: 26 additions & 17 deletions

File tree

src/hooks/useJobs.ts

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,33 @@ export const useJobs = () => {
99
const [error, setError] = useState<string | null>(null);
1010
const [lastUpdated, setLastUpdated] = useState<string | null>(null);
1111

12+
const parseEnvelope = (res: any) => {
13+
const env = (res && typeof res === 'object' && 'data' in res) ? res.data : res;
14+
return env || null;
15+
};
16+
1217
// 직무 목록 로드
1318
const loadJobs = useCallback(async () => {
1419
try {
1520
setIsLoading(true);
1621
setError(null);
1722

18-
const response = await jobsApi.getAllJobs();
19-
setJobData(response.data);
20-
setLastUpdated(response.timeStamp);
23+
const res = await jobsApi.getAllJobs();
24+
const envelope = parseEnvelope(res);
25+
if (!envelope) throw new Error('Invalid jobs API response');
26+
27+
const payload = envelope.data ?? envelope;
28+
29+
setJobData(payload as JobListResponse);
30+
setLastUpdated(payload?.lastUpdated ?? envelope?.timeStamp ?? null);
2131

22-
console.log('직무 데이터 로드 완료:', response.data);
32+
console.log('직무 목록 조회 성공:', {
33+
categories: payload?.categories,
34+
totalJobs: payload?.totalJobs,
35+
lastUpdated: payload?.lastUpdated
36+
});
2337
} catch (err: any) {
24-
const errorMessage = err.message || '직무 목록을 불러오는데 실패했습니다.';
38+
const errorMessage = err?.message || '직무 목록을 불러오는데 실패했습니다.';
2539
setError(errorMessage);
2640
console.error('직무 데이터 로드 실패:', err);
2741
} finally {
@@ -37,31 +51,26 @@ export const useJobs = () => {
3751
// 특정 카테고리의 직무 가져오기
3852
const getJobsByCategory = useCallback((categoryName: string): JobResponse[] => {
3953
if (!jobData) return [];
40-
4154
const category = jobData.categories.find(cat => cat.name === categoryName);
4255
return category?.jobs || [];
4356
}, [jobData]);
4457

4558
// 모든 직무를 평면 배열로 가져오기
4659
const getAllJobsFlat = useCallback((): JobResponse[] => {
4760
if (!jobData) return [];
48-
4961
return jobData.categories.flatMap(category => category.jobs);
5062
}, [jobData]);
5163

5264
// 직무 검색
5365
const searchJobs = useCallback((keyword: string): JobResponse[] => {
5466
const allJobs = getAllJobsFlat();
67+
if (!keyword.trim()) return allJobs;
5568

56-
if (!keyword.trim()) {
57-
return allJobs;
58-
}
59-
60-
const searchTerm = keyword.toLowerCase();
69+
const q = keyword.toLowerCase();
6170
return allJobs.filter(job =>
62-
job.title.toLowerCase().includes(searchTerm) ||
63-
job.description.toLowerCase().includes(searchTerm) ||
64-
job.skills.some(skill => skill.toLowerCase().includes(searchTerm))
71+
job.title.toLowerCase().includes(q) ||
72+
job.description.toLowerCase().includes(q) ||
73+
job.skills.some(skill => skill.toLowerCase().includes(q))
6574
);
6675
}, [getAllJobsFlat]);
6776

@@ -91,10 +100,10 @@ export const useJobs = () => {
91100
refreshJobs,
92101
getJobsByCategory,
93102
getAllJobsFlat,
94-
searchJobs, // 클라이언트 사이드 검색 함수
103+
searchJobs,
95104

96105
// 편의 속성들
97106
hasData: !!jobData,
98-
isEmpty: jobData?.totalJobs === 0,
107+
isEmpty: (jobData?.totalJobs ?? 0) === 0,
99108
};
100109
};

0 commit comments

Comments
 (0)