feat(resume): implement resume locking feature

This commit is contained in:
Amruth Pillai
2023-11-06 13:57:12 +01:00
parent 9a0402d525
commit 015e284318
23 changed files with 288 additions and 83 deletions

View File

@ -0,0 +1,38 @@
import { ResumeDto } from "@reactive-resume/dto";
import { useMutation } from "@tanstack/react-query";
import { axios } from "@/client/libs/axios";
import { queryClient } from "@/client/libs/query-client";
type LockResumeArgs = {
id: string;
set: boolean;
};
export const lockResume = async ({ id, set }: LockResumeArgs) => {
const response = await axios.patch(`/resume/${id}/lock`, { set });
queryClient.setQueryData<ResumeDto>(["resume", { id: response.data.id }], response.data);
queryClient.setQueryData<ResumeDto[]>(["resumes"], (cache) => {
if (!cache) return [response.data];
return cache.map((resume) => {
if (resume.id === response.data.id) return response.data;
return resume;
});
});
return response.data;
};
export const useLockResume = () => {
const {
error,
isPending: loading,
mutateAsync: lockResumeFn,
} = useMutation({
mutationFn: lockResume,
});
return { lockResume: lockResumeFn, loading, error };
};

View File

@ -1,28 +1,41 @@
import { ResumeDto, UpdateResumeDto } from "@reactive-resume/dto";
import { useMutation } from "@tanstack/react-query";
import { AxiosResponse } from "axios";
import { AxiosError, AxiosResponse } from "axios";
import debounce from "lodash.debounce";
import { toast } from "@/client/hooks/use-toast";
import { axios } from "@/client/libs/axios";
import { queryClient } from "@/client/libs/query-client";
export const updateResume = async (data: UpdateResumeDto) => {
const response = await axios.patch<ResumeDto, AxiosResponse<ResumeDto>, UpdateResumeDto>(
`/resume/${data.id}`,
data,
);
try {
const response = await axios.patch<ResumeDto, AxiosResponse<ResumeDto>, UpdateResumeDto>(
`/resume/${data.id}`,
data,
);
queryClient.setQueryData<ResumeDto>(["resume", { id: response.data.id }], response.data);
queryClient.setQueryData<ResumeDto>(["resume", { id: response.data.id }], response.data);
queryClient.setQueryData<ResumeDto[]>(["resumes"], (cache) => {
if (!cache) return [response.data];
return cache.map((resume) => {
if (resume.id === response.data.id) return response.data;
return resume;
queryClient.setQueryData<ResumeDto[]>(["resumes"], (cache) => {
if (!cache) return [response.data];
return cache.map((resume) => {
if (resume.id === response.data.id) return response.data;
return resume;
});
});
});
return response.data;
return response.data;
} catch (error) {
if (error instanceof AxiosError) {
const message = error.response?.data.message ?? error.message;
toast({
variant: "error",
title: "There was an error while updating your resume.",
description: message,
});
}
}
};
export const debouncedUpdateResume = debounce(updateResume, 500);
@ -34,17 +47,6 @@ export const useUpdateResume = () => {
mutateAsync: updateResumeFn,
} = useMutation({
mutationFn: updateResume,
onSuccess: (data) => {
queryClient.setQueryData<ResumeDto>(["resume", { id: data.id }], data);
queryClient.setQueryData<ResumeDto[]>(["resumes"], (cache) => {
if (!cache) return [data];
return cache.map((resume) => {
if (resume.id === data.id) return data;
return resume;
});
});
},
});
return { updateResume: updateResumeFn, loading, error };