26 lines
1.6 KiB
TypeScript
26 lines
1.6 KiB
TypeScript
import { EnvironmentSettingsWindow as SharedEnvironmentSettingsWindow } from "@nodedc/ui-react";
|
|
import { environmentSurfaceIds, type EnvironmentSettings, type EnvironmentSurfaceId, type UploadedEnvironmentMedia } from "../core/environment/environmentSettings";
|
|
import { roots, workspaces, workspacesForRoot } from "../productModel";
|
|
|
|
interface Props {
|
|
open: boolean;
|
|
settings: EnvironmentSettings;
|
|
state: "loading" | "ready" | "saving" | "error";
|
|
error: string | null;
|
|
onClose: () => void;
|
|
onSave: (settings: EnvironmentSettings) => Promise<EnvironmentSettings>;
|
|
onUpload: (surfaceId: EnvironmentSurfaceId, itemId: string, file: File) => Promise<UploadedEnvironmentMedia>;
|
|
}
|
|
const surfaces = environmentSurfaceIds.map(id => ({
|
|
id, home: id === "home", description: id === "home" ? "Главная страница продукта" : `Стартовая страница раздела «${roots.find(root => root.id === id)?.label}»`,
|
|
actions: id === "home" ? workspaces.filter(item => !item.internalOnly) : workspacesForRoot(id),
|
|
}));
|
|
export function EnvironmentSettingsWindow(props: Props) {
|
|
return <SharedEnvironmentSettingsWindow {...props} productName="Mission Core" surfaces={surfaces} initialSurfaceId="fleet"
|
|
onSave={draft => props.onSave({ ...draft, pages: Object.fromEntries(environmentSurfaceIds.map(id => [id, draft.pages[id]])) as EnvironmentSettings["pages"] })}
|
|
onUpload={(id, itemId, file) => {
|
|
if (!environmentSurfaceIds.includes(id as EnvironmentSurfaceId)) throw new Error("Страница окружения недоступна.");
|
|
return props.onUpload(id as EnvironmentSurfaceId, itemId, file);
|
|
}} />;
|
|
}
|