100 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			100 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
import 'dart:convert';
 | 
						|
import 'package:drift/drift.dart';
 | 
						|
import 'package:island/database/drift_db.dart';
 | 
						|
import 'package:island/models/post.dart';
 | 
						|
import 'package:island/pods/database.dart';
 | 
						|
import 'package:riverpod_annotation/riverpod_annotation.dart';
 | 
						|
 | 
						|
part 'compose_storage_db.g.dart';
 | 
						|
 | 
						|
@riverpod
 | 
						|
class ComposeStorageNotifier extends _$ComposeStorageNotifier {
 | 
						|
  @override
 | 
						|
  Map<String, SnPost> build() {
 | 
						|
    _loadDrafts();
 | 
						|
    return {};
 | 
						|
  }
 | 
						|
 | 
						|
  void _loadDrafts() async {
 | 
						|
    try {
 | 
						|
      final database = ref.read(databaseProvider);
 | 
						|
      final dbDrafts = await database.getAllPostDrafts();
 | 
						|
      final drafts = <String, SnPost>{};
 | 
						|
      for (final draft in dbDrafts) {
 | 
						|
        drafts[draft.id] = draft;
 | 
						|
      }
 | 
						|
      state = drafts;
 | 
						|
    } catch (e) {
 | 
						|
      // If there's an error loading drafts, start with empty state
 | 
						|
      state = {};
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  Future<void> saveDraft(SnPost draft) async {
 | 
						|
    final updatedDraft = draft.copyWith(updatedAt: DateTime.now());
 | 
						|
 | 
						|
    try {
 | 
						|
      final database = ref.read(databaseProvider);
 | 
						|
      await database.addPostDraft(
 | 
						|
        PostDraftsCompanion(
 | 
						|
          id: Value(updatedDraft.id),
 | 
						|
          title: Value(updatedDraft.title),
 | 
						|
          description: Value(updatedDraft.description),
 | 
						|
          content: Value(updatedDraft.content),
 | 
						|
          visibility: Value(updatedDraft.visibility),
 | 
						|
          type: Value(updatedDraft.type),
 | 
						|
          lastModified: Value(updatedDraft.updatedAt ?? DateTime.now()),
 | 
						|
          postData: Value(jsonEncode(updatedDraft.toJson())),
 | 
						|
        ),
 | 
						|
      );
 | 
						|
      // Update state after successful database operation, delayed to avoid widget building issues
 | 
						|
      Future(() {
 | 
						|
        state = {...state, updatedDraft.id: updatedDraft};
 | 
						|
      });
 | 
						|
    } catch (e) {
 | 
						|
      rethrow;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  Future<void> deleteDraft(String id) async {
 | 
						|
    final oldDraft = state[id];
 | 
						|
    final newState = Map<String, SnPost>.from(state);
 | 
						|
    newState.remove(id);
 | 
						|
    state = newState;
 | 
						|
 | 
						|
    try {
 | 
						|
      final database = ref.read(databaseProvider);
 | 
						|
      await database.deletePostDraft(id);
 | 
						|
    } catch (e) {
 | 
						|
      // Revert state on error
 | 
						|
      if (oldDraft != null) {
 | 
						|
        state = {...state, id: oldDraft};
 | 
						|
      }
 | 
						|
      rethrow;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  SnPost? getDraft(String id) {
 | 
						|
    return state[id];
 | 
						|
  }
 | 
						|
 | 
						|
  List<SnPost> getAllDrafts() {
 | 
						|
    final drafts = state.values.toList();
 | 
						|
    drafts.sort((a, b) => b.updatedAt!.compareTo(a.updatedAt!));
 | 
						|
    return drafts;
 | 
						|
  }
 | 
						|
 | 
						|
  Future<void> clearAllDrafts() async {
 | 
						|
    state = {};
 | 
						|
 | 
						|
    try {
 | 
						|
      final database = ref.read(databaseProvider);
 | 
						|
      await database.clearAllPostDrafts();
 | 
						|
    } catch (e) {
 | 
						|
      // If clearing fails, we might want to reload from database
 | 
						|
      _loadDrafts();
 | 
						|
      rethrow;
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 |