xworkmate-app/lib/app/workspace_page_registry.dart
2026-03-22 17:40:34 +08:00

171 lines
6.6 KiB
Dart

import 'package:flutter/material.dart';
import '../features/account/account_page.dart';
import '../features/assistant/assistant_page.dart';
import '../features/claw_hub/claw_hub_page.dart';
import '../features/mcp_server/mcp_server_page.dart';
import '../features/modules/modules_page.dart';
import '../features/settings/settings_page.dart';
import '../features/skills/skills_page.dart';
import '../features/tasks/tasks_page.dart';
import '../models/app_models.dart';
import '../widgets/assistant_focus_panel.dart';
import 'app_controller.dart';
enum WorkspacePageSurface { desktop, mobile }
typedef WorkspacePageBuilder =
Widget Function(
AppController controller,
ValueChanged<DetailPanelData> onOpenDetail,
);
class WorkspacePageSpec {
const WorkspacePageSpec({
required this.destination,
required this.desktopBuilder,
required this.mobileBuilder,
});
final WorkspaceDestination destination;
final WorkspacePageBuilder desktopBuilder;
final WorkspacePageBuilder mobileBuilder;
}
final Map<WorkspaceDestination, WorkspacePageSpec> _workspacePageSpecs =
<WorkspaceDestination, WorkspacePageSpec>{
WorkspaceDestination.assistant: WorkspacePageSpec(
destination: WorkspaceDestination.assistant,
desktopBuilder: (controller, onOpenDetail) => AssistantPage(
controller: controller,
onOpenDetail: onOpenDetail,
navigationPanelBuilder:
controller.sidebarState == AppSidebarState.hidden
? null
: (_) => AssistantFocusPanel(controller: controller),
showStandaloneTaskRail: false,
unifiedPaneStartsCollapsed:
controller.sidebarState == AppSidebarState.collapsed,
),
mobileBuilder: (controller, onOpenDetail) => AssistantPage(
controller: controller,
onOpenDetail: onOpenDetail,
showStandaloneTaskRail: false,
),
),
WorkspaceDestination.tasks: WorkspacePageSpec(
destination: WorkspaceDestination.tasks,
desktopBuilder: (controller, onOpenDetail) =>
TasksPage(controller: controller, onOpenDetail: onOpenDetail),
mobileBuilder: (controller, onOpenDetail) =>
TasksPage(controller: controller, onOpenDetail: onOpenDetail),
),
WorkspaceDestination.skills: WorkspacePageSpec(
destination: WorkspaceDestination.skills,
desktopBuilder: (controller, onOpenDetail) =>
SkillsPage(controller: controller, onOpenDetail: onOpenDetail),
mobileBuilder: (controller, onOpenDetail) =>
SkillsPage(controller: controller, onOpenDetail: onOpenDetail),
),
WorkspaceDestination.nodes: WorkspacePageSpec(
destination: WorkspaceDestination.nodes,
desktopBuilder: (controller, onOpenDetail) => ModulesPage(
controller: controller,
onOpenDetail: onOpenDetail,
initialTab: controller.modulesTab,
),
mobileBuilder: (controller, onOpenDetail) => ModulesPage(
controller: controller,
onOpenDetail: onOpenDetail,
initialTab: controller.modulesTab,
),
),
WorkspaceDestination.agents: WorkspacePageSpec(
destination: WorkspaceDestination.agents,
desktopBuilder: (controller, onOpenDetail) => ModulesPage(
controller: controller,
onOpenDetail: onOpenDetail,
initialTab: controller.modulesTab,
),
mobileBuilder: (controller, onOpenDetail) => ModulesPage(
controller: controller,
onOpenDetail: onOpenDetail,
initialTab: controller.modulesTab,
),
),
WorkspaceDestination.mcpServer: WorkspacePageSpec(
destination: WorkspaceDestination.mcpServer,
desktopBuilder: (controller, onOpenDetail) =>
McpServerPage(controller: controller, onOpenDetail: onOpenDetail),
mobileBuilder: (controller, onOpenDetail) =>
McpServerPage(controller: controller, onOpenDetail: onOpenDetail),
),
WorkspaceDestination.clawHub: WorkspacePageSpec(
destination: WorkspaceDestination.clawHub,
desktopBuilder: (controller, onOpenDetail) =>
ClawHubPage(controller: controller, onOpenDetail: onOpenDetail),
mobileBuilder: (controller, onOpenDetail) =>
ClawHubPage(controller: controller, onOpenDetail: onOpenDetail),
),
WorkspaceDestination.secrets: WorkspacePageSpec(
destination: WorkspaceDestination.secrets,
desktopBuilder: (controller, onOpenDetail) => SettingsPage(
controller: controller,
initialTab: SettingsTab.gateway,
),
mobileBuilder: (controller, onOpenDetail) => SettingsPage(
controller: controller,
initialTab: SettingsTab.gateway,
),
),
WorkspaceDestination.aiGateway: WorkspacePageSpec(
destination: WorkspaceDestination.aiGateway,
desktopBuilder: (controller, onOpenDetail) => SettingsPage(
controller: controller,
initialTab: SettingsTab.gateway,
),
mobileBuilder: (controller, onOpenDetail) => SettingsPage(
controller: controller,
initialTab: SettingsTab.gateway,
),
),
WorkspaceDestination.settings: WorkspacePageSpec(
destination: WorkspaceDestination.settings,
desktopBuilder: (controller, onOpenDetail) => SettingsPage(
controller: controller,
initialTab: controller.settingsTab,
initialDetail: controller.settingsDetail,
navigationContext: controller.settingsNavigationContext,
),
mobileBuilder: (controller, onOpenDetail) => SettingsPage(
controller: controller,
initialTab: controller.settingsTab,
initialDetail: controller.settingsDetail,
navigationContext: controller.settingsNavigationContext,
),
),
WorkspaceDestination.account: WorkspacePageSpec(
destination: WorkspaceDestination.account,
desktopBuilder: (controller, onOpenDetail) =>
AccountPage(controller: controller),
mobileBuilder: (controller, onOpenDetail) =>
AccountPage(controller: controller),
),
};
Widget buildWorkspacePage({
required WorkspaceDestination destination,
required AppController controller,
required ValueChanged<DetailPanelData> onOpenDetail,
required WorkspacePageSurface surface,
}) {
final spec = _workspacePageSpecs[destination]!;
return switch (surface) {
WorkspacePageSurface.desktop => spec.desktopBuilder(
controller,
onOpenDetail,
),
WorkspacePageSurface.mobile => spec.mobileBuilder(controller, onOpenDetail),
};
}