mirror of
https://github.com/yangshun/tech-interview-handbook.git
synced 2025-07-29 05:02:52 +08:00
[resumes][feat] add useDebounceValue hook
This commit is contained in:
@ -33,6 +33,7 @@ import ResumeListItems from '~/components/resumes/browse/ResumeListItems';
|
|||||||
import ResumeReviewsTitle from '~/components/resumes/ResumeReviewsTitle';
|
import ResumeReviewsTitle from '~/components/resumes/ResumeReviewsTitle';
|
||||||
import ResumeSignInButton from '~/components/resumes/shared/ResumeSignInButton';
|
import ResumeSignInButton from '~/components/resumes/shared/ResumeSignInButton';
|
||||||
|
|
||||||
|
import useDebounceValue from '~/utils/resumes/useDebounceValue';
|
||||||
import { trpc } from '~/utils/trpc';
|
import { trpc } from '~/utils/trpc';
|
||||||
|
|
||||||
const filters: Array<Filter> = [
|
const filters: Array<Filter> = [
|
||||||
@ -80,6 +81,7 @@ export default function ResumeHomePage() {
|
|||||||
locationFilters: userFilters.location,
|
locationFilters: userFilters.location,
|
||||||
numComments: userFilters.numComments,
|
numComments: userFilters.numComments,
|
||||||
roleFilters: userFilters.role,
|
roleFilters: userFilters.role,
|
||||||
|
searchValue: useDebounceValue(searchValue, 800),
|
||||||
skip,
|
skip,
|
||||||
sortOrder,
|
sortOrder,
|
||||||
},
|
},
|
||||||
@ -100,6 +102,7 @@ export default function ResumeHomePage() {
|
|||||||
locationFilters: userFilters.location,
|
locationFilters: userFilters.location,
|
||||||
numComments: userFilters.numComments,
|
numComments: userFilters.numComments,
|
||||||
roleFilters: userFilters.role,
|
roleFilters: userFilters.role,
|
||||||
|
searchValue: useDebounceValue(searchValue, 800),
|
||||||
skip,
|
skip,
|
||||||
sortOrder,
|
sortOrder,
|
||||||
},
|
},
|
||||||
@ -122,6 +125,7 @@ export default function ResumeHomePage() {
|
|||||||
locationFilters: userFilters.location,
|
locationFilters: userFilters.location,
|
||||||
numComments: userFilters.numComments,
|
numComments: userFilters.numComments,
|
||||||
roleFilters: userFilters.role,
|
roleFilters: userFilters.role,
|
||||||
|
searchValue: useDebounceValue(searchValue, 800),
|
||||||
skip,
|
skip,
|
||||||
sortOrder,
|
sortOrder,
|
||||||
},
|
},
|
||||||
|
@ -11,6 +11,7 @@ export const resumesRouter = createRouter()
|
|||||||
locationFilters: z.string().array(),
|
locationFilters: z.string().array(),
|
||||||
numComments: z.number().optional(),
|
numComments: z.number().optional(),
|
||||||
roleFilters: z.string().array(),
|
roleFilters: z.string().array(),
|
||||||
|
searchValue: z.string(),
|
||||||
skip: z.number(),
|
skip: z.number(),
|
||||||
sortOrder: z.string(),
|
sortOrder: z.string(),
|
||||||
}),
|
}),
|
||||||
@ -22,6 +23,7 @@ export const resumesRouter = createRouter()
|
|||||||
sortOrder,
|
sortOrder,
|
||||||
numComments,
|
numComments,
|
||||||
skip,
|
skip,
|
||||||
|
searchValue,
|
||||||
} = input;
|
} = input;
|
||||||
const userId = ctx.session?.user?.id;
|
const userId = ctx.session?.user?.id;
|
||||||
const totalRecords = await ctx.prisma.resumesResume.count({
|
const totalRecords = await ctx.prisma.resumesResume.count({
|
||||||
@ -81,6 +83,7 @@ export const resumesRouter = createRouter()
|
|||||||
experience: { in: experienceFilters },
|
experience: { in: experienceFilters },
|
||||||
location: { in: locationFilters },
|
location: { in: locationFilters },
|
||||||
role: { in: roleFilters },
|
role: { in: roleFilters },
|
||||||
|
title: { contains: searchValue, mode: 'insensitive' },
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
const mappedResumeData = resumesData.map((r) => {
|
const mappedResumeData = resumesData.map((r) => {
|
||||||
|
@ -50,6 +50,7 @@ export const resumesResumeUserRouter = createProtectedRouter()
|
|||||||
locationFilters: z.string().array(),
|
locationFilters: z.string().array(),
|
||||||
numComments: z.number().optional(),
|
numComments: z.number().optional(),
|
||||||
roleFilters: z.string().array(),
|
roleFilters: z.string().array(),
|
||||||
|
searchValue: z.string(),
|
||||||
skip: z.number(),
|
skip: z.number(),
|
||||||
sortOrder: z.string(),
|
sortOrder: z.string(),
|
||||||
}),
|
}),
|
||||||
@ -59,6 +60,7 @@ export const resumesResumeUserRouter = createProtectedRouter()
|
|||||||
roleFilters,
|
roleFilters,
|
||||||
locationFilters,
|
locationFilters,
|
||||||
experienceFilters,
|
experienceFilters,
|
||||||
|
searchValue,
|
||||||
sortOrder,
|
sortOrder,
|
||||||
numComments,
|
numComments,
|
||||||
skip,
|
skip,
|
||||||
@ -130,6 +132,7 @@ export const resumesResumeUserRouter = createProtectedRouter()
|
|||||||
experience: { in: experienceFilters },
|
experience: { in: experienceFilters },
|
||||||
location: { in: locationFilters },
|
location: { in: locationFilters },
|
||||||
role: { in: roleFilters },
|
role: { in: roleFilters },
|
||||||
|
title: { contains: searchValue, mode: 'insensitive' },
|
||||||
},
|
},
|
||||||
userId,
|
userId,
|
||||||
},
|
},
|
||||||
@ -161,6 +164,7 @@ export const resumesResumeUserRouter = createProtectedRouter()
|
|||||||
locationFilters: z.string().array(),
|
locationFilters: z.string().array(),
|
||||||
numComments: z.number().optional(),
|
numComments: z.number().optional(),
|
||||||
roleFilters: z.string().array(),
|
roleFilters: z.string().array(),
|
||||||
|
searchValue: z.string(),
|
||||||
skip: z.number(),
|
skip: z.number(),
|
||||||
sortOrder: z.string(),
|
sortOrder: z.string(),
|
||||||
}),
|
}),
|
||||||
@ -171,6 +175,7 @@ export const resumesResumeUserRouter = createProtectedRouter()
|
|||||||
locationFilters,
|
locationFilters,
|
||||||
experienceFilters,
|
experienceFilters,
|
||||||
sortOrder,
|
sortOrder,
|
||||||
|
searchValue,
|
||||||
numComments,
|
numComments,
|
||||||
skip,
|
skip,
|
||||||
} = input;
|
} = input;
|
||||||
@ -229,6 +234,7 @@ export const resumesResumeUserRouter = createProtectedRouter()
|
|||||||
experience: { in: experienceFilters },
|
experience: { in: experienceFilters },
|
||||||
location: { in: locationFilters },
|
location: { in: locationFilters },
|
||||||
role: { in: roleFilters },
|
role: { in: roleFilters },
|
||||||
|
title: { contains: searchValue, mode: 'insensitive' },
|
||||||
userId,
|
userId,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
15
apps/portal/src/utils/resumes/useDebounceValue.ts
Normal file
15
apps/portal/src/utils/resumes/useDebounceValue.ts
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
import { useEffect, useState } from 'react';
|
||||||
|
|
||||||
|
export default function useDebounceValue(value: string, delay: number) {
|
||||||
|
const [debouncedValue, setDebouncedValue] = useState(value);
|
||||||
|
useEffect(() => {
|
||||||
|
const handler = setTimeout(() => {
|
||||||
|
setDebouncedValue(value);
|
||||||
|
}, delay);
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
clearTimeout(handler);
|
||||||
|
};
|
||||||
|
}, [value, delay]);
|
||||||
|
return debouncedValue;
|
||||||
|
}
|
Reference in New Issue
Block a user