Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 | import { api } from './client';
import type {
CollabProjectResponse,
ChapterTaskResponse,
ProjectMemberResponse,
CommentResponse,
CreateCollabProjectRequest,
AssignChapterRequest,
SubmitChapterRequest,
ReviewChapterRequest,
InviteMemberRequest,
CreateCommentRequest,
PaginatedList,
} from './types';
export const collabApi = {
// Projects
listProjects: (params?: { page?: number; pageSize?: number }) => {
const qs = new URLSearchParams();
if (params?.page) qs.set('page', String(params.page));
if (params?.pageSize) qs.set('pageSize', String(params.pageSize));
const query = qs.toString();
return api.get<PaginatedList<CollabProjectResponse>>(`/v1/collab/projects${query ? `?${query}` : ''}`);
},
createProject: (data: CreateCollabProjectRequest) =>
api.post<CollabProjectResponse>('/v1/collab/projects', data),
getProject: (projectId: number) =>
api.get<CollabProjectResponse>(`/v1/collab/projects/${projectId}`),
updateProject: (projectId: number, data: CreateCollabProjectRequest) =>
api.put<CollabProjectResponse>(`/v1/collab/projects/${projectId}`, data),
deleteProject: (projectId: number) =>
api.delete<null>(`/v1/collab/projects/${projectId}`),
changeProjectStatus: (projectId: number, targetStatus: string) =>
api.post<null>(`/v1/collab/projects/${projectId}/status?targetStatus=${targetStatus}`),
// Chapters
listChapters: (projectId: number, params?: { page?: number; pageSize?: number }) => {
const qs = new URLSearchParams();
if (params?.page) qs.set('page', String(params.page));
if (params?.pageSize) qs.set('pageSize', String(params.pageSize));
const query = qs.toString();
return api.get<PaginatedList<ChapterTaskResponse>>(`/v1/collab/projects/${projectId}/chapters${query ? `?${query}` : ''}`);
},
createChapter: (projectId: number, chapterNumber: number, title?: string, sourceText?: string) => {
const qs = new URLSearchParams();
qs.set('chapterNumber', String(chapterNumber));
if (title) qs.set('title', title);
if (sourceText) qs.set('sourceText', sourceText);
return api.post<ChapterTaskResponse>(`/v1/collab/projects/${projectId}/chapters?${qs}`, {});
},
getChapter: (chapterId: number) =>
api.get<ChapterTaskResponse>(`/v1/collab/chapters/${chapterId}`),
listMyChapters: (params?: { page?: number; pageSize?: number }) => {
const qs = new URLSearchParams();
if (params?.page) qs.set('page', String(params.page));
if (params?.pageSize) qs.set('pageSize', String(params.pageSize));
const query = qs.toString();
return api.get<PaginatedList<ChapterTaskResponse>>(`/v1/collab/chapters/my${query ? `?${query}` : ''}`);
},
// Chapter workflow
assignChapter: (chapterId: number, data: AssignChapterRequest) =>
api.put<ChapterTaskResponse>(`/v1/collab/chapters/${chapterId}/assign`, data),
submitChapter: (chapterId: number, data: SubmitChapterRequest) =>
api.put<ChapterTaskResponse>(`/v1/collab/chapters/${chapterId}/submit`, data),
reviewChapter: (chapterId: number, data: ReviewChapterRequest) =>
api.put<ChapterTaskResponse>(`/v1/collab/chapters/${chapterId}/review`, data),
// Members
listMembers: (projectId: number, params?: { page?: number; pageSize?: number }) => {
const qs = new URLSearchParams();
if (params?.page) qs.set('page', String(params.page));
if (params?.pageSize) qs.set('pageSize', String(params.pageSize));
const query = qs.toString();
return api.get<PaginatedList<ProjectMemberResponse>>(`/v1/collab/projects/${projectId}/members${query ? `?${query}` : ''}`);
},
inviteMember: (projectId: number, data: InviteMemberRequest) =>
api.post<ProjectMemberResponse>(`/v1/collab/projects/${projectId}/invite`, data),
generateInviteCode: (projectId: number) =>
api.post<{ code: string; expiresAt: string }>(`/v1/collab/projects/${projectId}/invite-code`),
joinByCode: (inviteCode: string) =>
api.post<ProjectMemberResponse>(`/v1/collab/join?inviteCode=${inviteCode}`),
removeMember: (projectId: number, memberId: number) =>
api.delete<null>(`/v1/collab/projects/${projectId}/members/${memberId}`),
// Comments
listComments: (chapterTaskId: number, page = 1, size = 12) =>
api.get<PaginatedList<CommentResponse>>(`/v1/collab/chapters/${chapterTaskId}/comments?page=${page}&size=${size}`),
createComment: (chapterTaskId: number, data: CreateCommentRequest) =>
api.post<CommentResponse>(`/v1/collab/chapters/${chapterTaskId}/comments`, data),
resolveComment: (commentId: number) =>
api.put<null>(`/v1/collab/comments/${commentId}/resolve`),
deleteComment: (commentId: number) =>
api.delete<null>(`/v1/collab/comments/${commentId}`),
// Upload novel to collab project
uploadNovel: (projectId: number, file: File, sourceLang: string, targetLang: string) => {
const formData = new FormData();
formData.append('file', file);
formData.append('sourceLang', sourceLang);
formData.append('targetLang', targetLang);
formData.append('mode', 'team');
formData.append('projectId', String(projectId));
return api.upload<{ projectId: number; chapterCount: number; documentId: number; documentName: string; message: string }>(
`/user/documents/upload?projectId=${projectId}`,
formData,
);
},
};
|