feat: status editing and deleting

This commit is contained in:
2025-08-07 15:46:11 +04:00
parent 7e2dd9763b
commit e29664ecc5
12 changed files with 616 additions and 69 deletions

View 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,
};
};