feat: deal updating on the server

This commit is contained in:
2025-08-05 16:33:04 +04:00
parent c98a5cc811
commit 236c0dcf10
5 changed files with 163 additions and 22 deletions

View File

@ -3,11 +3,14 @@
import { useMutation } from "@tanstack/react-query"; import { useMutation } from "@tanstack/react-query";
import StatusColumnsDnd from "@/app/deals/components/StatusColumnsDnd/StatusColumnsDnd"; import StatusColumnsDnd from "@/app/deals/components/StatusColumnsDnd/StatusColumnsDnd";
import { useStatusesContext } from "@/app/deals/contexts/StatusesContext"; import { useStatusesContext } from "@/app/deals/contexts/StatusesContext";
import { updateStatusMutation } from "@/client/@tanstack/react-query.gen"; import {
updateDealMutation,
updateStatusMutation,
} from "@/client/@tanstack/react-query.gen";
import { notifications } from "@/lib/notifications"; import { notifications } from "@/lib/notifications";
const StatusColumns = () => { const StatusColumns = () => {
const { refetchStatuses } = useStatusesContext(); const { refetchStatuses, refetchDeals } = useStatusesContext();
const updateStatus = useMutation({ const updateStatus = useMutation({
...updateStatusMutation(), ...updateStatusMutation(),
@ -20,30 +23,36 @@ const StatusColumns = () => {
}, },
}); });
const updateDeals = useMutation({
...updateDealMutation(),
onError: error => {
console.error(error);
notifications.error({
message: error.response?.data?.detail as string | undefined,
});
refetchDeals();
},
});
const onDealDragEnd = ( const onDealDragEnd = (
dealId: number, dealId: number,
statusId: number, statusId: number,
lexorank?: string lexorank?: string
) => { ) => {
// Send request to server updateDeals.mutate({
console.log( path: {
"onDealDragEnd. dealId =", dealId,
dealId, },
", statusId =", body: {
statusId, deal: {
", lexorank =", statusId,
lexorank lexorank,
); },
},
});
}; };
const onStatusDragEnd = (statusId: number, lexorank: string) => { const onStatusDragEnd = (statusId: number, lexorank: string) => {
console.log(
"onStatusDragEnd, statusId:",
statusId,
", lexo:",
lexorank
);
updateStatus.mutate({ updateStatus.mutate({
path: { path: {
statusId, statusId,

View File

@ -12,6 +12,7 @@ type StatusesContextState = {
deals: DealSchema[]; deals: DealSchema[];
setDeals: React.Dispatch<React.SetStateAction<DealSchema[]>>; setDeals: React.Dispatch<React.SetStateAction<DealSchema[]>>;
refetchStatuses: () => void; refetchStatuses: () => void;
refetchDeals: () => void;
}; };
const StatusesContext = createContext<StatusesContextState | undefined>( const StatusesContext = createContext<StatusesContextState | undefined>(
@ -20,13 +21,22 @@ const StatusesContext = createContext<StatusesContextState | undefined>(
const useStatusesContextState = () => { const useStatusesContextState = () => {
const { selectedBoard } = useBoardsContext(); const { selectedBoard } = useBoardsContext();
const { statuses, setStatuses, refetch } = useStatusesList({ const {
statuses,
setStatuses,
refetch: refetchStatuses,
} = useStatusesList({
boardId: selectedBoard?.id, boardId: selectedBoard?.id,
}); });
const { deals, setDeals } = useDealsList({ boardId: selectedBoard?.id });
const {
deals,
setDeals,
refetch: refetchDeals,
} = useDealsList({ boardId: selectedBoard?.id });
useEffect(() => { useEffect(() => {
refetch(); refetchStatuses();
}, [selectedBoard]); }, [selectedBoard]);
return { return {
@ -34,7 +44,8 @@ const useStatusesContextState = () => {
setStatuses, setStatuses,
deals, deals,
setDeals, setDeals,
refetchStatuses: refetch, refetchStatuses,
refetchDeals,
}; };
}; };

View File

@ -9,6 +9,7 @@ import {
getProjects, getProjects,
getStatuses, getStatuses,
updateBoard, updateBoard,
updateDeal,
updateStatus, updateStatus,
type Options, type Options,
} from "../sdk.gen"; } from "../sdk.gen";
@ -20,6 +21,9 @@ import type {
UpdateBoardData, UpdateBoardData,
UpdateBoardError, UpdateBoardError,
UpdateBoardResponse2, UpdateBoardResponse2,
UpdateDealData,
UpdateDealError,
UpdateDealResponse2,
UpdateStatusData, UpdateStatusData,
UpdateStatusError, UpdateStatusError,
UpdateStatusResponse2, UpdateStatusResponse2,
@ -198,3 +202,30 @@ export const getDealsOptions = (options: Options<GetDealsData>) => {
queryKey: getDealsQueryKey(options), queryKey: getDealsQueryKey(options),
}); });
}; };
/**
* Update Deal
*/
export const updateDealMutation = (
options?: Partial<Options<UpdateDealData>>
): UseMutationOptions<
UpdateDealResponse2,
AxiosError<UpdateDealError>,
Options<UpdateDealData>
> => {
const mutationOptions: UseMutationOptions<
UpdateDealResponse2,
AxiosError<UpdateDealError>,
Options<UpdateDealData>
> = {
mutationFn: async localOptions => {
const { data } = await updateDeal({
...options,
...localOptions,
throwOnError: true,
});
return data;
},
};
return mutationOptions;
};

View File

@ -17,6 +17,9 @@ import type {
UpdateBoardData, UpdateBoardData,
UpdateBoardErrors, UpdateBoardErrors,
UpdateBoardResponses, UpdateBoardResponses,
UpdateDealData,
UpdateDealErrors,
UpdateDealResponses,
UpdateStatusData, UpdateStatusData,
UpdateStatusErrors, UpdateStatusErrors,
UpdateStatusResponses, UpdateStatusResponses,
@ -148,3 +151,24 @@ export const getDeals = <ThrowOnError extends boolean = false>(
...options, ...options,
}); });
}; };
/**
* Update Deal
*/
export const updateDeal = <ThrowOnError extends boolean = false>(
options: Options<UpdateDealData, ThrowOnError>
) => {
return (options.client ?? _heyApiClient).patch<
UpdateDealResponses,
UpdateDealErrors,
ThrowOnError
>({
responseType: "json",
url: "/deal/{dealId}",
...options,
headers: {
"Content-Type": "application/json",
...options.headers,
},
});
};

View File

@ -153,6 +153,41 @@ export type UpdateBoardSchema = {
lexorank?: string | null; lexorank?: string | null;
}; };
/**
* UpdateDealRequest
*/
export type UpdateDealRequest = {
deal: UpdateDealSchema;
};
/**
* UpdateDealResponse
*/
export type UpdateDealResponse = {
/**
* Message
*/
message: string;
};
/**
* UpdateDealSchema
*/
export type UpdateDealSchema = {
/**
* Name
*/
name?: string | null;
/**
* Lexorank
*/
lexorank?: string | null;
/**
* Statusid
*/
statusId?: number | null;
};
/** /**
* UpdateStatusRequest * UpdateStatusRequest
*/ */
@ -372,6 +407,37 @@ export type GetDealsResponses = {
export type GetDealsResponse2 = GetDealsResponses[keyof GetDealsResponses]; export type GetDealsResponse2 = GetDealsResponses[keyof GetDealsResponses];
export type UpdateDealData = {
body: UpdateDealRequest;
path: {
/**
* Dealid
*/
dealId: number;
};
query?: never;
url: "/deal/{dealId}";
};
export type UpdateDealErrors = {
/**
* Validation Error
*/
422: HttpValidationError;
};
export type UpdateDealError = UpdateDealErrors[keyof UpdateDealErrors];
export type UpdateDealResponses = {
/**
* Successful Response
*/
200: UpdateDealResponse;
};
export type UpdateDealResponse2 =
UpdateDealResponses[keyof UpdateDealResponses];
export type ClientOptions = { export type ClientOptions = {
baseURL: "http://localhost:8000" | (string & {}); baseURL: "http://localhost:8000" | (string & {});
}; };