A framework for building convergent cross-platform Nextcloud clients using Flutter.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

99 lines
2.2 KiB

part of '../neon_notes.dart';
abstract interface class NotesNoteBlocEvents {
void updateContent(final String content);
void updateTitle(final String title);
void updateCategory(final String category);
}
abstract interface class NotesNoteBlocStates {
BehaviorSubject<String> get category;
}
class NotesNoteBloc extends InteractiveBloc implements NotesNoteBlocEvents, NotesNoteBlocStates {
NotesNoteBloc(
this._notesBloc,
final NotesNote note,
) {
_emitNote(note);
id = note.id;
initialContent = note.content;
initialTitle = note.title;
}
void _emitNote(final NotesNote note) {
category.add(note.category);
_etag = note.etag;
}
// ignore: avoid_void_async
void _wrapAction(final Future<NotesNote> Function(String etag) call) async {
await _updateQueue.add(() async {
try {
final data = await call(_etag);
_emitNote(data);
await _notesBloc.refresh();
} catch (e, s) {
debugPrint(e.toString());
debugPrint(s.toString());
addError(e);
}
});
}
late final NotesAppSpecificOptions options = _notesBloc.options;
final NotesBloc _notesBloc;
final _updateQueue = Queue();
late final int id;
late final String initialContent;
late final String initialTitle;
late String _etag;
@override
void dispose() {
unawaited(category.close());
super.dispose();
}
@override
BehaviorSubject<String> category = BehaviorSubject<String>();
@override
Future<void> refresh() async {}
@override
void updateCategory(final String category) {
_wrapAction(
(final etag) async => _notesBloc.account.client.notes.updateNote(
id: id,
category: category,
ifMatch: '"$etag"',
),
);
}
@override
void updateContent(final String content) {
_wrapAction(
(final etag) async => _notesBloc.account.client.notes.updateNote(
id: id,
content: content,
ifMatch: '"$etag"',
),
);
}
@override
void updateTitle(final String title) {
_wrapAction(
(final etag) async => _notesBloc.account.client.notes.updateNote(
id: id,
title: title,
ifMatch: '"$etag"',
),
);
}
}