♻️ Refactor post draft with drift db

This commit is contained in:
2025-06-24 23:39:09 +08:00
parent 2287995cb4
commit 568d70fffb
11 changed files with 2263 additions and 639 deletions

View File

@ -11,7 +11,7 @@ import 'package:island/models/post.dart';
import 'package:island/pods/config.dart';
import 'package:island/pods/network.dart';
import 'package:island/services/file.dart';
import 'package:island/services/compose_storage.dart';
import 'package:island/services/compose_storage_db.dart';
import 'package:island/widgets/alert.dart';
import 'package:pasteboard/pasteboard.dart';
import 'dart:async';
@ -96,7 +96,7 @@ class ComposeLogic {
);
}
static ComposeState createStateFromDraft(ComposeDraft draft) {
static ComposeState createStateFromDraft(ComposeDraftModel draft) {
return ComposeState(
attachments: ValueNotifier<List<UniversalFile>>([]),
titleController: TextEditingController(text: draft.title),
@ -150,8 +150,8 @@ class ComposeLogic {
if (state._autoSaveTimer == null) {
return; // Widget has been disposed, don't save
}
final draft = ComposeDraft(
final draft = ComposeDraftModel(
id: state.draftId,
title: state.titleController.text,
description: state.descriptionController.text,
@ -182,7 +182,7 @@ class ComposeLogic {
}
}
static Future<ComposeDraft?> loadDraft(WidgetRef ref, String draftId) async {
static Future<ComposeDraftModel?> loadDraft(WidgetRef ref, String draftId) async {
try {
return ref
.read(composeStorageNotifierProvider.notifier)
@ -410,11 +410,14 @@ class ComposeLogic {
if (event is! RawKeyDownEvent) return;
final isPaste = event.logicalKey == LogicalKeyboardKey.keyV;
final isSave = event.logicalKey == LogicalKeyboardKey.keyS;
final isModifierPressed = event.isMetaPressed || event.isControlPressed;
final isSubmit = event.logicalKey == LogicalKeyboardKey.enter;
if (isPaste && isModifierPressed) {
handlePaste(state);
} else if (isSave && isModifierPressed) {
saveDraft(ref, state);
} else if (isSubmit && isModifierPressed && !state.submitting.value) {
performAction(
ref,

View File

@ -3,7 +3,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:gap/gap.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:island/services/compose_storage.dart';
import 'package:island/services/compose_storage_db.dart';
import 'package:material_symbols_icons/symbols.dart';
class DraftManagerSheet extends HookConsumerWidget {
@ -28,11 +28,11 @@ class DraftManagerSheet extends HookConsumerWidget {
final sortedDrafts = useMemoized(() {
if (isArticle) {
final draftList = drafts.values.cast<ArticleDraft>().toList();
final draftList = drafts.values.cast<ArticleDraftModel>().toList();
draftList.sort((a, b) => b.lastModified.compareTo(a.lastModified));
return draftList;
} else {
final draftList = drafts.values.cast<ComposeDraft>().toList();
final draftList = drafts.values.cast<ComposeDraftModel>().toList();
draftList.sort((a, b) => b.lastModified.compareTo(a.lastModified));
return draftList;
}
@ -79,15 +79,15 @@ class DraftManagerSheet extends HookConsumerWidget {
Navigator.of(context).pop();
final draftId =
isArticle
? (draft as ArticleDraft).id
: (draft as ComposeDraft).id;
? (draft as ArticleDraftModel).id
: (draft as ComposeDraftModel).id;
onDraftSelected?.call(draftId);
},
onDelete: () async {
final draftId =
isArticle
? (draft as ArticleDraft).id
: (draft as ComposeDraft).id;
? (draft as ArticleDraftModel).id
: (draft as ComposeDraftModel).id;
if (isArticle) {
await ref
.read(articleStorageNotifierProvider.notifier)
@ -182,7 +182,7 @@ class _DraftItem extends StatelessWidget {
final String visibility;
if (isArticle) {
final articleDraft = draft as ArticleDraft;
final articleDraft = draft as ArticleDraftModel;
title =
articleDraft.title.isNotEmpty ? articleDraft.title : 'untitled'.tr();
content =
@ -194,7 +194,7 @@ class _DraftItem extends StatelessWidget {
lastModified = articleDraft.lastModified;
visibility = _parseArticleVisibility(articleDraft.visibility);
} else {
final postDraft = draft as ComposeDraft;
final postDraft = draft as ComposeDraftModel;
title = postDraft.title.isNotEmpty ? postDraft.title : 'untitled'.tr();
content =
postDraft.content.isNotEmpty