feat: status editing and deleting
This commit is contained in:
110
src/hooks/useStatusesOperations.ts
Normal file
110
src/hooks/useStatusesOperations.ts
Normal file
@ -0,0 +1,110 @@
|
||||
import React from "react";
|
||||
import { useMutation } from "@tanstack/react-query";
|
||||
import { AxiosError } from "axios";
|
||||
import { LexoRank } from "lexorank";
|
||||
import {
|
||||
HttpValidationError,
|
||||
StatusSchema,
|
||||
UpdateStatusSchema,
|
||||
} from "@/lib/client";
|
||||
import {
|
||||
createStatusMutation,
|
||||
deleteStatusMutation,
|
||||
updateStatusMutation,
|
||||
} from "@/lib/client/@tanstack/react-query.gen";
|
||||
import { notifications } from "@/lib/notifications";
|
||||
import { getMaxByLexorank, getNewLexorank } from "@/utils/lexorank";
|
||||
|
||||
type Props = {
|
||||
statuses: StatusSchema[];
|
||||
setStatuses: React.Dispatch<React.SetStateAction<StatusSchema[]>>;
|
||||
refetchStatuses: () => void;
|
||||
boardId?: number;
|
||||
};
|
||||
|
||||
export const useStatusesOperations = ({
|
||||
statuses,
|
||||
setStatuses,
|
||||
refetchStatuses,
|
||||
boardId,
|
||||
}: Props) => {
|
||||
const onError = (error: AxiosError<HttpValidationError>) => {
|
||||
console.error(error);
|
||||
notifications.error({
|
||||
message: error.response?.data?.detail as string | undefined,
|
||||
});
|
||||
refetchStatuses();
|
||||
};
|
||||
|
||||
const createStatus = useMutation({
|
||||
...createStatusMutation(),
|
||||
onError,
|
||||
onSuccess: res => {
|
||||
setStatuses([...statuses, res.status]);
|
||||
},
|
||||
});
|
||||
|
||||
const updateStatus = useMutation({
|
||||
...updateStatusMutation(),
|
||||
onError,
|
||||
});
|
||||
|
||||
const deleteStatus = useMutation({
|
||||
...deleteStatusMutation(),
|
||||
onError,
|
||||
});
|
||||
|
||||
const onCreateStatus = (name: string) => {
|
||||
if (!boardId) return;
|
||||
const lastStatus = getMaxByLexorank(statuses);
|
||||
const newLexorank = getNewLexorank(
|
||||
lastStatus ? LexoRank.parse(lastStatus.lexorank) : null
|
||||
);
|
||||
|
||||
createStatus.mutate({
|
||||
body: {
|
||||
status: {
|
||||
name,
|
||||
boardId,
|
||||
lexorank: newLexorank.toString(),
|
||||
},
|
||||
},
|
||||
});
|
||||
};
|
||||
|
||||
const onUpdateStatus = (statusId: number, status: UpdateStatusSchema) => {
|
||||
updateStatus.mutate({
|
||||
path: { statusId },
|
||||
body: { status },
|
||||
});
|
||||
|
||||
setStatuses(statuses =>
|
||||
statuses.map(oldStatus =>
|
||||
oldStatus.id !== statusId
|
||||
? oldStatus
|
||||
: {
|
||||
id: oldStatus.id,
|
||||
name: status.name ? status.name : oldStatus.name,
|
||||
lexorank: status.lexorank
|
||||
? status.lexorank
|
||||
: oldStatus.lexorank,
|
||||
}
|
||||
)
|
||||
);
|
||||
};
|
||||
|
||||
const onDeleteStatus = (statusId: number) => {
|
||||
deleteStatus.mutate({
|
||||
path: { statusId },
|
||||
});
|
||||
setStatuses(statuses =>
|
||||
statuses.filter(status => status.id !== statusId)
|
||||
);
|
||||
};
|
||||
|
||||
return {
|
||||
onCreateStatus,
|
||||
onUpdateStatus,
|
||||
onDeleteStatus,
|
||||
};
|
||||
};
|
||||
Reference in New Issue
Block a user