b62db917de
Client UI for agent comment suggestions. - IComment gains suggestedText / suggestionAppliedAt / suggestionAppliedById. - comment-list-item shows a "было → стало" block (old selection struck/red, new suggestedText green) for a top-level comment with a suggestion, plus an Apply button — gated by canShowApply(comment, canEdit): edit permission AND a suggestion AND not applied AND not resolved AND top-level. Once applied, an "Applied" badge replaces the button. - canEdit comes from page.permissions.canEdit (real edit permission, NOT the looser canComment) and is threaded through CommentListItem and nested ChildComments; fail-closed when undefined. - useApplySuggestionMutation posts to /comments/apply-suggestion; on success it writes the applied + server auto-resolve fields into the react-query cache (UI flips to Applied + resolved without a refetch); on 409 it shows a specific message with the server's currentText, else a generic error. - i18n keys added in en-US + ru-RU. Tests (comment-list-item.test.tsx + canShowApply unit suite): Apply visibility across canEdit/applied/resolved/reply, click dispatches the mutation, diff rendering. 34 passed. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
50 lines
1.5 KiB
TypeScript
50 lines
1.5 KiB
TypeScript
import api from "@/lib/api-client";
|
|
import {
|
|
ICommentParams,
|
|
IComment,
|
|
IResolveComment,
|
|
} from "@/features/comment/types/comment.types";
|
|
import { IPagination } from "@/lib/types.ts";
|
|
|
|
export async function createComment(
|
|
data: Partial<IComment>,
|
|
): Promise<IComment> {
|
|
const req = await api.post<IComment>("/comments/create", data);
|
|
return req.data;
|
|
}
|
|
|
|
export async function resolveComment(data: IResolveComment): Promise<IComment> {
|
|
const req = await api.post<IComment>(`/comments/resolve`, data);
|
|
return req.data;
|
|
}
|
|
|
|
export async function applySuggestion(commentId: string): Promise<IComment> {
|
|
// Mirrors resolveComment: let axios reject on non-2xx so the mutation can read
|
|
// the 409 body (`{ message, currentText }`) off err.response.data.
|
|
const req = await api.post("/comments/apply-suggestion", { commentId });
|
|
return req.data.data ?? req.data;
|
|
}
|
|
|
|
export async function updateComment(
|
|
data: Partial<IComment>,
|
|
): Promise<IComment> {
|
|
const req = await api.post<IComment>(`/comments/update`, data);
|
|
return req.data;
|
|
}
|
|
|
|
export async function getCommentById(commentId: string): Promise<IComment> {
|
|
const req = await api.post<IComment>("/comments/info", { commentId });
|
|
return req.data;
|
|
}
|
|
|
|
export async function getPageComments(
|
|
data: ICommentParams,
|
|
): Promise<IPagination<IComment>> {
|
|
const req = await api.post("/comments", data);
|
|
return req.data;
|
|
}
|
|
|
|
export async function deleteComment(commentId: string): Promise<void> {
|
|
await api.post("/comments/delete", { commentId });
|
|
}
|