feat: ui updates

This commit is contained in:
ivannoskov
2026-01-07 17:54:58 +03:00
parent 646e97df3e
commit 52a4425751
11 changed files with 950 additions and 442 deletions

View File

@@ -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

View File

@@ -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);
},
};
// ============================================================================

View File

@@ -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",
},
];