@@ -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