add comment drafts

This commit is contained in:
Filip Krawczyk 2022-08-27 02:16:53 +02:00
parent eacbda0b5d
commit 5f23176e6e
5 changed files with 80 additions and 2 deletions

View File

@ -1,6 +1,7 @@
import 'dart:async'; import 'dart:async';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:hive_flutter/adapters.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences/shared_preferences.dart';
@ -19,6 +20,7 @@ Future<void> mainCommon(AppConfig appConfig) async {
final logConsoleStore = LogConsolePageStore(); final logConsoleStore = LogConsolePageStore();
final sharedPrefs = await SharedPreferences.getInstance(); final sharedPrefs = await SharedPreferences.getInstance();
await Hive.initFlutter();
_setupLogger(appConfig, logConsoleStore); _setupLogger(appConfig, logConsoleStore);
_setupTimeago(); _setupTimeago();

View File

@ -0,0 +1,24 @@
import 'package:hive/hive.dart';
class CommentDraftStore {
static const _boxKey = 'comment_drafts';
static Future<String?> loadDraft(String apId) async {
final box = await Hive.openBox<String>(_boxKey);
final text = box.get(apId);
await box.close();
return text;
}
static Future<void> saveDraft(String apId, String text) async {
final box = await Hive.openBox<String>(_boxKey);
await box.put(apId, text);
await box.close();
}
static Future<void> removeDraft(String apId) async {
final box = await Hive.openBox<String>(_boxKey);
await box.delete(apId);
await box.close();
}
}

View File

@ -5,6 +5,7 @@ import 'package:lemmy_api_client/v3.dart';
import '../hooks/delayed_loading.dart'; import '../hooks/delayed_loading.dart';
import '../hooks/logged_in_action.dart'; import '../hooks/logged_in_action.dart';
import '../l10n/l10n.dart'; import '../l10n/l10n.dart';
import '../stores/comment_drafts_store.dart';
import 'editor/editor.dart'; import 'editor/editor.dart';
import 'markdown_mode_icon.dart'; import 'markdown_mode_icon.dart';
import 'markdown_text.dart'; import 'markdown_text.dart';
@ -40,6 +41,20 @@ class WriteComment extends HookWidget {
text: _isEdit ? comment?.content : null, text: _isEdit ? comment?.content : null,
); );
// load draft if exists
useEffect(() {
() async {
if (_isEdit) return;
final previousDraft =
await CommentDraftStore.loadDraft(comment?.apId ?? post.apId);
if (previousDraft != null) {
editorController.textEditingController.text = previousDraft;
}
}();
return null;
}, []);
final preview = () { final preview = () {
final body = () { final body = () {
final text = comment?.content ?? post.body; final text = comment?.content ?? post.body;
@ -84,6 +99,10 @@ class WriteComment extends HookWidget {
)); ));
} }
}(); }();
// remove draft because it's not needed anymore
await CommentDraftStore.removeDraft(comment?.apId ?? post.apId);
Navigator.of(context).pop(res.commentView); Navigator.of(context).pop(res.commentView);
} catch (e) { } catch (e) {
ScaffoldMessenger.of(context).showSnackBar( ScaffoldMessenger.of(context).showSnackBar(
@ -94,7 +113,17 @@ class WriteComment extends HookWidget {
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
leading: const CloseButton(), leading: CloseButton(
onPressed: () async {
// save draft before closing
if (!_isEdit &&
editorController.textEditingController.text.trim().isNotEmpty) {
await CommentDraftStore.saveDraft(comment?.apId ?? post.apId,
editorController.textEditingController.text);
}
Navigator.of(context).pop();
},
),
actions: [ actions: [
IconButton( IconButton(
icon: markdownModeIcon(fancy: showFancy.value), icon: markdownModeIcon(fancy: showFancy.value),

View File

@ -350,6 +350,27 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.0" version: "2.1.0"
hive:
dependency: "direct main"
description:
name: hive
url: "https://pub.dartlang.org"
source: hosted
version: "2.2.3"
hive_flutter:
dependency: "direct main"
description:
name: hive_flutter
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.0"
hive_generator:
dependency: "direct dev"
description:
name: hive_generator
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.3"
http: http:
dependency: transitive dependency: transitive
description: description:

View File

@ -43,7 +43,8 @@ dependencies:
provider: ^6.0.0 provider: ^6.0.0
mobx: ^2.0.4 mobx: ^2.0.4
flutter_mobx: ^2.0.2 flutter_mobx: ^2.0.2
hive: ^2.2.3
hive_flutter: ^1.1.0
# utils # utils
timeago: ^3.0.2 timeago: ^3.0.2
fuzzy: ^0.4.0-nullsafety.0 fuzzy: ^0.4.0-nullsafety.0
@ -71,6 +72,7 @@ dev_dependencies:
build_runner: ^2.1.2 build_runner: ^2.1.2
mobx_codegen: ^2.0.2 mobx_codegen: ^2.0.2
freezed: ^2.0.2 freezed: ^2.0.2
hive_generator: ^1.1.3
flutter_icons: flutter_icons:
android: true android: true