Implement offline mode

This commit is contained in:
2026-02-06 16:41:58 +01:00
parent 58157a2e6e
commit d0fd96a2f5
7 changed files with 556 additions and 31 deletions

View File

@@ -4,7 +4,7 @@ import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:sheetless/core/models/change.dart';
import 'package:sheetless/core/models/sheet.dart';
import 'package:sheetless/core/services/storage_service.dart';
import 'package:sheetless/core/services/sync_service.dart';
import '../../../shared/widgets/edit_sheet_bottom_sheet.dart';
import 'sheet_list_item.dart';
@@ -19,11 +19,13 @@ import 'sheet_search_bar.dart';
class SheetsList extends StatefulWidget {
final List<Sheet> sheets;
final ValueSetter<Sheet> onSheetSelected;
final SyncService syncService;
const SheetsList({
super.key,
required this.sheets,
required this.onSheetSelected,
required this.syncService,
});
@override
@@ -33,7 +35,6 @@ class SheetsList extends StatefulWidget {
class _SheetsListState extends State<SheetsList> {
static const _searchDebounceMs = 500;
final _storageService = StorageService();
final _searchController = TextEditingController();
Timer? _debounceTimer;
late List<Sheet> _filteredSheets;
@@ -111,9 +112,9 @@ class _SheetsListState extends State<SheetsList> {
}
void _handleSheetEdit(Sheet sheet, String newName, String newComposer) {
// Queue changes for server sync
// Queue changes for server sync (with timestamp for conflict resolution)
if (newName != sheet.name) {
_storageService.writeChange(
widget.syncService.queueChange(
Change(
type: ChangeType.sheetNameChange,
sheetUuid: sheet.uuid,
@@ -122,7 +123,7 @@ class _SheetsListState extends State<SheetsList> {
);
}
if (newComposer != sheet.composerName) {
_storageService.writeChange(
widget.syncService.queueChange(
Change(
type: ChangeType.composerNameChange,
sheetUuid: sheet.uuid,
@@ -136,6 +137,9 @@ class _SheetsListState extends State<SheetsList> {
sheet.name = newName;
sheet.composerName = newComposer;
});
// Update cached sheets
widget.syncService.updateCachedSheets(widget.sheets);
}
// ---------------------------------------------------------------------------