Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions lib/const/settings.dart
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,16 @@ class Settings {
static const Color sideBarColor = Color(0xFF141114);
static const Color highlightColor = Color(0xff27272a);

static const Color tempCopyAccent = Color(0xFFF59E0B);
static const Color tempCopyAccentMuted = Color(0x14F59E0B);
static const Color tempCopyAccentSubtle = Color(0x33F59E0B);
static const Color tempCopyAccentForeground = Color(0xFFFEF3C7);

static const Color quickBoardAccent = Color(0xFF06B6D4);
static const Color quickBoardAccentMuted = Color(0x1406B6D4);
static const Color quickBoardAccentSubtle = Color(0x3306B6D4);
static const Color quickBoardAccentForeground = Color(0xFFCFFAFE);

static List<ColorOption> penColors = [
ColorOption(color: Colors.white, isSelected: true),
ColorOption(color: Colors.red, isSelected: false),
Expand Down
2 changes: 2 additions & 0 deletions lib/strategy_view.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import 'package:icarus/sidebar.dart';
import 'package:icarus/widgets/delete_capture.dart';
import 'package:icarus/widgets/demo_tag.dart';
import 'package:icarus/widgets/strategy_quick_switcher.dart';
import 'package:icarus/widgets/temporary_session_bar.dart';
import 'package:icarus/widgets/map_selector.dart';
import 'package:icarus/widgets/pages_bar.dart';
import 'package:icarus/widgets/save_and_load_button.dart';
Expand Down Expand Up @@ -144,6 +145,7 @@ class _StrategyViewState extends ConsumerState<StrategyView>
],
),
),
const TemporarySessionBar(),
const Expanded(
child: Stack(
clipBehavior: Clip.none,
Expand Down
57 changes: 44 additions & 13 deletions lib/widgets/dialogs/strategy/temporary_session_flow.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:icarus/const/settings.dart';
import 'package:icarus/providers/strategy_provider.dart';
import 'package:icarus/widgets/dialogs/strategy/save_strategy_details_dialog.dart';
import 'package:shadcn_ui/shadcn_ui.dart';
Expand All @@ -15,34 +16,49 @@ Future<TemporarySaveIntent?> _showTemporaryCopyDialog(
BuildContext context, {
required bool includeDiscard,
}) {
const accent = Settings.tempCopyAccent;

return showShadDialog<TemporarySaveIntent>(
context: context,
builder: (context) => ShadDialog(
title: const Text('Save Temporary Changes?'),
title: const Row(
mainAxisSize: MainAxisSize.min,
children: [
Icon(LucideIcons.penLine, size: 18, color: accent),
SizedBox(width: 8),
Text('Save Draft Changes?'),
],
),
description: const Text(
'Choose where to apply this temporary copy before leaving.',
'You have unsaved changes in your draft. Choose how to save before continuing.',
),
actions: [
ShadButton.secondary(
ShadButton.outline(
onPressed: () =>
Navigator.of(context).pop(TemporarySaveIntent.cancel),
child: const Text('Cancel'),
),
if (includeDiscard)
ShadButton.secondary(
ShadButton.destructive(
onPressed: () =>
Navigator.of(context).pop(TemporarySaveIntent.discard),
leading: const Icon(LucideIcons.trash2, size: 14),
child: const Text('Discard'),
),
ShadButton.secondary(
onPressed: () =>
Navigator.of(context).pop(TemporarySaveIntent.saveAsNew),
leading: const Icon(LucideIcons.filePlus, size: 14),
child: const Text('Save as New'),
),
ShadButton(
backgroundColor: accent,
foregroundColor: const Color(0xFF1C1917),
hoverBackgroundColor: accent.withValues(alpha: 0.85),
onPressed: () =>
Navigator.of(context).pop(TemporarySaveIntent.overwriteOriginal),
child: const Text('Overwrite Original'),
leading: const Icon(LucideIcons.save, size: 14),
child: const Text('Save to Original'),
),
],
),
Expand All @@ -53,28 +69,43 @@ Future<TemporarySaveIntent?> _showQuickBoardDialog(
BuildContext context, {
required bool includeDiscard,
}) {
const accent = Settings.quickBoardAccent;

return showShadDialog<TemporarySaveIntent>(
context: context,
builder: (context) => ShadDialog(
title: const Text('Save Quick Board?'),
title: const Row(
mainAxisSize: MainAxisSize.min,
children: [
Icon(LucideIcons.zap, size: 18, color: accent),
SizedBox(width: 8),
Text('Save Quick Board?'),
],
),
description: const Text(
'Quick Boards are temporary. Save now or discard this session.',
'Quick Boards are temporary workspaces. Save now to keep your work.',
),
actions: [
ShadButton.secondary(
ShadButton.outline(
onPressed: () =>
Navigator.of(context).pop(TemporarySaveIntent.cancel),
child: const Text('Cancel'),
),
if (includeDiscard)
ShadButton.secondary(
ShadButton.destructive(
onPressed: () =>
Navigator.of(context).pop(TemporarySaveIntent.discard),
leading: const Icon(LucideIcons.trash2, size: 14),
child: const Text('Discard'),
),
ShadButton(
onPressed: () => Navigator.of(context).pop(TemporarySaveIntent.saveAsNew),
child: const Text('Save'),
backgroundColor: accent,
foregroundColor: const Color(0xFF1C1917),
hoverBackgroundColor: accent.withValues(alpha: 0.85),
onPressed: () =>
Navigator.of(context).pop(TemporarySaveIntent.saveAsNew),
leading: const Icon(LucideIcons.save, size: 14),
child: const Text('Save Board'),
),
],
),
Expand Down Expand Up @@ -107,7 +138,7 @@ Future<bool> resolveTemporarySessionForNavigation({
final sourceStrategy = strategyNotifier.currentStrategyData();
final details = await showStrategySaveDetailsDialog(
context: context,
title: strategyState.isQuickBoard ? 'Save Quick Board' : 'Save as New',
title: strategyState.isQuickBoard ? 'Save Quick Board' : 'Save as New Strategy',
confirmLabel: 'Save',
initialName: strategyState.isQuickBoard ? sourceName : '$sourceName (Copy)',
initialFolderId: sourceStrategy?.folderID,
Expand Down Expand Up @@ -147,7 +178,7 @@ Future<bool> resolveTemporarySessionForManualSave({
final sourceStrategy = strategyNotifier.currentStrategyData();
final details = await showStrategySaveDetailsDialog(
context: context,
title: strategyState.isQuickBoard ? 'Save Quick Board' : 'Save as New',
title: strategyState.isQuickBoard ? 'Save Quick Board' : 'Save as New Strategy',
confirmLabel: 'Save',
initialName: strategyState.isQuickBoard ? sourceName : '$sourceName (Copy)',
initialFolderId: sourceStrategy?.folderID,
Expand Down
23 changes: 14 additions & 9 deletions lib/widgets/folder_navigator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -96,12 +96,14 @@ class _FolderNavigatorState extends ConsumerState<FolderNavigator> {
? ref.read(folderProvider.notifier).findFolderByID(currentFolderId)
: null;
Future<void> navigateWithLoading(
BuildContext context, String strategyId) async {
// Show loading overlay
// showLoadingOverlay(context);

BuildContext context,
String strategyId, {
bool skipLoad = false,
}) async {
try {
await ref.read(strategyProvider.notifier).loadFromHive(strategyId);
if (!skipLoad) {
await ref.read(strategyProvider.notifier).loadFromHive(strategyId);
}

if (!context.mounted) return;

Expand All @@ -110,7 +112,7 @@ class _FolderNavigatorState extends ConsumerState<FolderNavigator> {
PageRouteBuilder(
transitionDuration: const Duration(milliseconds: 200),
reverseTransitionDuration:
const Duration(milliseconds: 200), // pop duration
const Duration(milliseconds: 200),
pageBuilder: (context, animation, secondaryAnimation) =>
const StrategyView(),
transitionsBuilder:
Expand All @@ -129,7 +131,6 @@ class _FolderNavigatorState extends ConsumerState<FolderNavigator> {
);
} catch (e) {
// Handle errors
// Show error message
}
}

Expand Down Expand Up @@ -209,9 +210,13 @@ class _FolderNavigatorState extends ConsumerState<FolderNavigator> {
.read(strategyProvider.notifier)
.createQuickBoard();
if (!context.mounted) return;
await navigateWithLoading(context, strategyId);
await navigateWithLoading(context, strategyId, skipLoad: true);
},
leading: const Icon(Icons.bolt),
leading: const Icon(
LucideIcons.zap,
size: 16,
color: Settings.quickBoardAccent,
),
child: const Text('Quick Board'),
),
],
Expand Down
Loading