xworkmate-app/lib/app/workspace_page_registry.dart

71 lines
2.2 KiB
Dart

import 'package:flutter/material.dart';
import '../features/assistant/assistant_page.dart';
import '../features/settings/settings_page.dart';
import '../models/app_models.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> workspacePageSpecsInternal =
<WorkspaceDestination, WorkspacePageSpec>{
WorkspaceDestination.assistant: WorkspacePageSpec(
destination: WorkspaceDestination.assistant,
desktopBuilder: (controller, onOpenDetail) => AssistantPage(
controller: controller,
onOpenDetail: onOpenDetail,
showStandaloneTaskRail: false,
),
mobileBuilder: (controller, onOpenDetail) => AssistantPage(
controller: controller,
onOpenDetail: onOpenDetail,
showStandaloneTaskRail: false,
),
),
WorkspaceDestination.settings: WorkspacePageSpec(
destination: WorkspaceDestination.settings,
desktopBuilder: (controller, onOpenDetail) => SettingsPage(
controller: controller,
initialTab: controller.settingsTab,
),
mobileBuilder: (controller, onOpenDetail) => SettingsPage(
controller: controller,
initialTab: controller.settingsTab,
),
),
};
Widget buildWorkspacePage({
required WorkspaceDestination destination,
required AppController controller,
required ValueChanged<DetailPanelData> onOpenDetail,
required WorkspacePageSurface surface,
}) {
final spec = workspacePageSpecsInternal[destination]!;
return switch (surface) {
WorkspacePageSurface.desktop => spec.desktopBuilder(
controller,
onOpenDetail,
),
WorkspacePageSurface.mobile => spec.mobileBuilder(controller, onOpenDetail),
};
}