feat: ui updates
This commit is contained in:
@@ -5,15 +5,46 @@
|
||||
import { api } from "./client";
|
||||
import type { Project, PaginatedResponse, PaginationParams } from "@/lib/types/api";
|
||||
|
||||
export interface UpdateProjectInviteLinkTypeRequest {
|
||||
purchase_invite_type_default: "public" | "approval";
|
||||
}
|
||||
|
||||
export const projectsApi = {
|
||||
/**
|
||||
* Get list of projects for workspace
|
||||
* Projects are created via Telegram bot (add/remove channel)
|
||||
*/
|
||||
list: (workspaceId: string, params?: PaginationParams) =>
|
||||
list: (workspaceId: string, params?: PaginationParams & { include_archived?: boolean }) =>
|
||||
api.get<PaginatedResponse<Project>>(
|
||||
`/workspaces/${workspaceId}/projects`,
|
||||
{ params }
|
||||
),
|
||||
|
||||
/**
|
||||
* Update project invite link type default
|
||||
*/
|
||||
updateInviteLinkType: (
|
||||
workspaceId: string,
|
||||
projectId: string,
|
||||
data: UpdateProjectInviteLinkTypeRequest
|
||||
) =>
|
||||
api.patch<Project>(
|
||||
`/workspaces/${workspaceId}/projects/${projectId}/invite-link-type`,
|
||||
data
|
||||
),
|
||||
|
||||
/**
|
||||
* Archive project
|
||||
*/
|
||||
archive: (workspaceId: string, projectId: string) =>
|
||||
api.post<Project>(
|
||||
`/workspaces/${workspaceId}/projects/${projectId}/archive`
|
||||
),
|
||||
|
||||
/**
|
||||
* Delete project (soft delete)
|
||||
*/
|
||||
delete: (workspaceId: string, projectId: string) =>
|
||||
api.delete(`/workspaces/${workspaceId}/projects/${projectId}`),
|
||||
};
|
||||
|
||||
|
||||
@@ -15,6 +15,8 @@ export const DEMO_USER = {
|
||||
id: "demo-user-0000-0000-000000000000",
|
||||
telegram_id: 123456789,
|
||||
username: "demo_user",
|
||||
first_name: "Демо",
|
||||
last_name: "Пользователь",
|
||||
};
|
||||
|
||||
// Demo workspace
|
||||
|
||||
@@ -83,13 +83,55 @@ export const demoAwareWorkspacesApi = {
|
||||
export const demoAwareProjectsApi = {
|
||||
list: async (
|
||||
workspaceId: string,
|
||||
params?: { page?: number; size?: number }
|
||||
params?: { page?: number; size?: number; include_archived?: boolean }
|
||||
): Promise<PaginatedResponse<Project>> => {
|
||||
if (isDemoWorkspace(workspaceId)) {
|
||||
return paginate(demoProjects, params?.page, params?.size);
|
||||
let items = demoProjects;
|
||||
if (!params?.include_archived) {
|
||||
items = items.filter(p => p.status !== "archived");
|
||||
}
|
||||
return paginate(items, params?.page, params?.size);
|
||||
}
|
||||
return projectsApi.list(workspaceId, params);
|
||||
},
|
||||
updateInviteLinkType: async (
|
||||
workspaceId: string,
|
||||
projectId: string,
|
||||
data: { purchase_invite_type_default: "public" | "approval" }
|
||||
): Promise<Project> => {
|
||||
if (isDemoWorkspace(workspaceId)) {
|
||||
// In demo mode, just return the project (mock update)
|
||||
const project = demoProjects.find(p => p.id === projectId);
|
||||
if (!project) throw new Error("Project not found");
|
||||
return { ...project, purchase_invite_type_default: data.purchase_invite_type_default };
|
||||
}
|
||||
return projectsApi.updateInviteLinkType(workspaceId, projectId, data);
|
||||
},
|
||||
archive: async (
|
||||
workspaceId: string,
|
||||
projectId: string
|
||||
): Promise<Project> => {
|
||||
if (isDemoWorkspace(workspaceId)) {
|
||||
const project = demoProjects.find(p => p.id === projectId);
|
||||
if (!project) throw new Error("Project not found");
|
||||
return { ...project, status: "archived" };
|
||||
}
|
||||
return projectsApi.archive(workspaceId, projectId);
|
||||
},
|
||||
delete: async (
|
||||
workspaceId: string,
|
||||
projectId: string
|
||||
): Promise<void> => {
|
||||
if (isDemoWorkspace(workspaceId)) {
|
||||
// In demo mode, just mark as archived (soft delete)
|
||||
const project = demoProjects.find(p => p.id === projectId);
|
||||
if (project) {
|
||||
project.status = "archived";
|
||||
}
|
||||
return;
|
||||
}
|
||||
return projectsApi.delete(workspaceId, projectId);
|
||||
},
|
||||
};
|
||||
|
||||
// ============================================================================
|
||||
|
||||
@@ -33,6 +33,8 @@ export const demoMember: WorkspaceMember = {
|
||||
id: DEMO_USER.id,
|
||||
telegram_id: DEMO_USER.telegram_id,
|
||||
username: DEMO_USER.username,
|
||||
first_name: DEMO_USER.first_name,
|
||||
last_name: DEMO_USER.last_name,
|
||||
},
|
||||
status: "active",
|
||||
permissions: [{ key: "admin_full" }],
|
||||
@@ -49,6 +51,8 @@ export const demoProjects: Project[] = [
|
||||
title: "Крипто Новости",
|
||||
username: "crypto_news_demo",
|
||||
status: "active",
|
||||
subscribers_count: 125000,
|
||||
purchase_invite_type_default: "public",
|
||||
},
|
||||
{
|
||||
id: "proj-0002-0000-0000-000000000002",
|
||||
@@ -56,6 +60,8 @@ export const demoProjects: Project[] = [
|
||||
title: "IT Вакансии",
|
||||
username: "it_jobs_demo",
|
||||
status: "active",
|
||||
subscribers_count: 89000,
|
||||
purchase_invite_type_default: "approval",
|
||||
},
|
||||
{
|
||||
id: "proj-0003-0000-0000-000000000003",
|
||||
@@ -63,6 +69,8 @@ export const demoProjects: Project[] = [
|
||||
title: "Стартапы и Бизнес",
|
||||
username: "startups_demo",
|
||||
status: "active",
|
||||
subscribers_count: 67000,
|
||||
purchase_invite_type_default: "public",
|
||||
},
|
||||
];
|
||||
|
||||
|
||||
@@ -10,6 +10,8 @@ export interface User {
|
||||
id: string; // UUID
|
||||
telegram_id: number;
|
||||
username: string | null;
|
||||
first_name: string | null;
|
||||
last_name: string | null;
|
||||
}
|
||||
|
||||
export interface AuthCompleteResponse {
|
||||
@@ -80,6 +82,8 @@ export interface WorkspaceMemberUser {
|
||||
id: string; // user_id
|
||||
telegram_id: number;
|
||||
username: string | null;
|
||||
first_name: string | null;
|
||||
last_name: string | null;
|
||||
}
|
||||
|
||||
export interface WorkspaceMember {
|
||||
@@ -122,6 +126,8 @@ export interface Project {
|
||||
title: string;
|
||||
username: string | null;
|
||||
status: ProjectStatus;
|
||||
subscribers_count?: number;
|
||||
purchase_invite_type_default?: "public" | "approval";
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user