feat: expand launcher admin mock controls

This commit is contained in:
DCCONSTRUCTIONS
2026-05-01 21:56:58 +03:00
parent db0eabe7d7
commit 85aa322990
6 changed files with 1397 additions and 154 deletions
+129
View File
@@ -1,8 +1,10 @@
import { useEffect, useMemo, useState } from "react";
import type { ServiceAccessException, ServiceGrant } from "../entities/access/types";
import type { Client } from "../entities/client/types";
import type { Invite } from "../entities/invite/types";
import type { LauncherServiceView, Service } from "../entities/service/types";
import type { SyncStatus } from "../entities/sync/types";
import type { ClientGroup, ClientMembership, LauncherUser } from "../entities/user/types";
import {
buildLauncherServices,
buildMe,
@@ -169,6 +171,21 @@ export function LauncherApp() {
}));
}
function handleUpdateInvite(inviteId: string, patch: Partial<Invite>) {
setData((current) => ({
...current,
invites: current.invites.map((invite) =>
invite.id === inviteId
? {
...invite,
...patch,
updatedAt: new Date().toISOString(),
}
: invite
),
}));
}
function handleRetrySync(syncId: string) {
setData((current) => ({
...current,
@@ -200,6 +217,111 @@ export function LauncherApp() {
}));
}
function handleCreateClient() {
const createdAt = new Date().toISOString();
const index = data.clients.length + 1;
setData((current) => ({
...current,
clients: [
...current.clients,
{
id: `client_mock_${Date.now()}`,
type: "company",
name: `Новый клиент ${index}`,
legalName: `Новый клиент ${index}`,
status: "demo",
demoEndsAt: new Date(Date.now() + 14 * 24 * 60 * 60 * 1000).toISOString(),
contactName: "",
contactEmail: "",
notes: "",
createdAt,
updatedAt: createdAt,
},
],
}));
}
function handleUpdateClient(clientId: string, patch: Partial<Client>) {
setData((current) => ({
...current,
clients: current.clients.map((client) =>
client.id === clientId
? {
...client,
...patch,
updatedAt: new Date().toISOString(),
}
: client
),
}));
}
function handleUpdateUser(userId: string, patch: Partial<LauncherUser>) {
setData((current) => ({
...current,
users: current.users.map((user) =>
user.id === userId
? {
...user,
...patch,
updatedAt: new Date().toISOString(),
}
: user
),
}));
}
function handleUpdateMembership(membershipId: string, patch: Partial<ClientMembership>) {
setData((current) => ({
...current,
memberships: current.memberships.map((membership) =>
membership.id === membershipId
? {
...membership,
...patch,
updatedAt: new Date().toISOString(),
}
: membership
),
}));
}
function handleCreateGroup(clientId: string) {
const createdAt = new Date().toISOString();
setData((current) => ({
...current,
groups: [
...current.groups,
{
id: `group_mock_${Date.now()}`,
clientId,
name: "Новая группа",
description: "Описание группы",
memberIds: [],
createdAt,
updatedAt: createdAt,
},
],
}));
}
function handleUpdateGroup(groupId: string, patch: Partial<ClientGroup>) {
setData((current) => ({
...current,
groups: current.groups.map((group) =>
group.id === groupId
? {
...group,
...patch,
updatedAt: new Date().toISOString(),
}
: group
),
}));
}
function handleReorderServices(orderedServiceIds: string[]) {
setData((current) => {
const orderById = new Map(orderedServiceIds.map((serviceId, index) => [serviceId, (index + 1) * 10]));
@@ -304,7 +426,14 @@ export function LauncherApp() {
onCreateDenyException={handleCreateDenyException}
onRemoveException={handleRemoveException}
onCreateInvite={handleCreateInvite}
onUpdateInvite={handleUpdateInvite}
onRetrySync={handleRetrySync}
onCreateClient={handleCreateClient}
onUpdateClient={handleUpdateClient}
onUpdateUser={handleUpdateUser}
onUpdateMembership={handleUpdateMembership}
onCreateGroup={handleCreateGroup}
onUpdateGroup={handleUpdateGroup}
onUpdateService={handleUpdateService}
onReorderServices={handleReorderServices}
onCreateService={handleCreateService}