EAS build config + Collaboration UI + i18n updates

- eas.json for Android APK/AAB + iOS builds
- Collaboration page: assign, transfer, claim, subtasks
- Task detail: assignee avatars, subtask progress
- Updated translations (cs,he,ru,ua)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-29 15:31:19 +00:00
parent 606fb047f8
commit 4e4bf34393
9 changed files with 934 additions and 5 deletions

View File

@@ -245,3 +245,61 @@ export function deleteProject(token: string, id: string) {
export function inviteToProject(token: string, id: string, userId: string) {
return apiFetch<{ data: Project; status: string }>("/api/v1/projects/" + id + "/invite", { method: "POST", body: { user_id: userId }, token });
}
// Subtasks
export interface Subtask {
id: string;
parent_task_id: string;
title: string;
description: string;
status: "pending" | "in_progress" | "done" | "completed";
assigned_to: string | null;
assignee_name: string | null;
order_index: number;
completed_at: string | null;
created_at: string;
updated_at: string;
}
export interface CollabRequest {
id: string;
task_id: string;
from_user_id: string | null;
to_user_id: string;
type: "assign" | "transfer" | "collaborate" | "claim";
status: "pending" | "accepted" | "rejected";
message: string;
from_name: string | null;
to_name: string | null;
task_title?: string;
created_at: string;
responded_at: string | null;
}
export function getSubtasks(token: string, taskId: string) {
return apiFetch<{ data: Subtask[] }>(`/api/v1/tasks/${taskId}/subtasks`, { token });
}
export function createSubtask(token: string, taskId: string, data: { title: string; description?: string; assigned_to?: string }) {
return apiFetch<{ data: Subtask }>(`/api/v1/tasks/${taskId}/subtasks`, { method: "POST", body: data, token });
}
export function updateSubtask(token: string, taskId: string, subtaskId: string, data: Partial<Subtask>) {
return apiFetch<{ data: Subtask }>(`/api/v1/tasks/${taskId}/subtasks/${subtaskId}`, { method: "PUT", body: data, token });
}
export function deleteSubtask(token: string, taskId: string, subtaskId: string) {
return apiFetch<void>(`/api/v1/tasks/${taskId}/subtasks/${subtaskId}`, { method: "DELETE", token });
}
export function getCollaborationHistory(token: string, taskId: string) {
return apiFetch<{ data: CollabRequest[] }>(`/api/v1/tasks/${taskId}/collaboration`, { token });
}
export function sendCollabRequest(token: string, taskId: string, data: { to_user_id?: string; from_user_id?: string; type: string; message?: string }) {
return apiFetch<{ data?: CollabRequest; status: string }>(`/api/v1/tasks/${taskId}/collaborate`, { method: "POST", body: data, token });
}
export function searchUsers(token: string, query: string) {
return apiFetch<{ data: { id: string; name: string; email: string; avatar_url: string | null }[] }>(`/api/v1/auth/users/search?q=${encodeURIComponent(query)}`, { token });
}