mirror of
https://github.com/GitJournal/GitJournal.git
synced 2025-06-27 09:06:43 +08:00
Add an explicit serializer from Note -> NoteData
This is so that we can start configuring what the yaml metadata keys should be called, and not have them hardcoded. This also allows the note.created to be null. Earlier we were always setting it to some value. That's doesn't seem right.
This commit is contained in:
@ -3,9 +3,8 @@ import 'dart:io';
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:path/path.dart' as p;
|
import 'package:path/path.dart' as p;
|
||||||
|
|
||||||
import 'package:gitjournal/utils/datetime.dart';
|
|
||||||
|
|
||||||
import 'note_fileName.dart';
|
import 'note_fileName.dart';
|
||||||
|
import 'note_serializer.dart';
|
||||||
import 'notes_folder.dart';
|
import 'notes_folder.dart';
|
||||||
import 'serializers.dart';
|
import 'serializers.dart';
|
||||||
|
|
||||||
@ -30,13 +29,10 @@ class Note with ChangeNotifier implements Comparable<Note> {
|
|||||||
var _loadState = NoteLoadState.None;
|
var _loadState = NoteLoadState.None;
|
||||||
var _serializer = MarkdownYAMLSerializer();
|
var _serializer = MarkdownYAMLSerializer();
|
||||||
|
|
||||||
Note(this.parent, this._filePath) {
|
Note(this.parent, this._filePath);
|
||||||
_created = DateTime(0, 0, 0, 0, 0, 0, 0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
Note.newNote(this.parent) {
|
Note.newNote(this.parent) {
|
||||||
_created = DateTime.now();
|
_created = DateTime.now();
|
||||||
_data.props['created'] = toIso8601WithTimezone(created);
|
|
||||||
_filePath = p.join(parent.folderPath, getFileName(this));
|
_filePath = p.join(parent.folderPath, getFileName(this));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -54,12 +50,6 @@ class Note with ChangeNotifier implements Comparable<Note> {
|
|||||||
|
|
||||||
set created(DateTime dt) {
|
set created(DateTime dt) {
|
||||||
_created = dt;
|
_created = dt;
|
||||||
|
|
||||||
if (hasValidDate()) {
|
|
||||||
_data.props['created'] = toIso8601WithTimezone(created);
|
|
||||||
} else {
|
|
||||||
_data.props.remove('created');
|
|
||||||
}
|
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -69,25 +59,20 @@ class Note with ChangeNotifier implements Comparable<Note> {
|
|||||||
|
|
||||||
set modified(DateTime dt) {
|
set modified(DateTime dt) {
|
||||||
_modified = dt;
|
_modified = dt;
|
||||||
|
|
||||||
if (hasValidDate()) {
|
|
||||||
_data.props['modified'] = toIso8601WithTimezone(_modified);
|
|
||||||
} else {
|
|
||||||
_data.props.remove('modified');
|
|
||||||
}
|
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
void updateModified() {
|
void updateModified() {
|
||||||
modified = DateTime.now();
|
modified = DateTime.now();
|
||||||
|
notifyListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
String get body {
|
String get body {
|
||||||
return data.body;
|
return _data.body;
|
||||||
}
|
}
|
||||||
|
|
||||||
set body(String newBody) {
|
set body(String newBody) {
|
||||||
data.body = newBody;
|
_data.body = newBody;
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -97,41 +82,26 @@ class Note with ChangeNotifier implements Comparable<Note> {
|
|||||||
|
|
||||||
set title(String title) {
|
set title(String title) {
|
||||||
_title = title;
|
_title = title;
|
||||||
|
|
||||||
if (_title.isEmpty) {
|
|
||||||
_data.props.remove('title');
|
|
||||||
} else {
|
|
||||||
_data.props['title'] = title;
|
|
||||||
}
|
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
NoteData get data {
|
NoteData get data {
|
||||||
|
var serializer = NoteSerializer();
|
||||||
|
serializer.encode(this, _data);
|
||||||
|
|
||||||
return _data;
|
return _data;
|
||||||
}
|
}
|
||||||
|
|
||||||
set data(NoteData data) {
|
set data(NoteData data) {
|
||||||
_data = data;
|
_data = data;
|
||||||
|
|
||||||
if (data.props.containsKey("created")) {
|
// Fill the note's attributes from the data
|
||||||
_created = parseDateTime(data.props['created'].toString());
|
var serializer = NoteSerializer();
|
||||||
}
|
serializer.decode(_data, this);
|
||||||
if (data.props.containsKey("modified")) {
|
|
||||||
_modified = parseDateTime(data.props['modified'].toString());
|
|
||||||
}
|
|
||||||
if (data.props.containsKey("title")) {
|
|
||||||
_title = data.props['title'].toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
_created ??= DateTime(0, 0, 0, 0, 0, 0, 0, 0);
|
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool hasValidDate() {
|
|
||||||
// Arbitrary number, when we set the year = 0, it becomes 1, somehow
|
|
||||||
return created.year > 10;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool isEmpty() {
|
bool isEmpty() {
|
||||||
return body.isEmpty;
|
return body.isEmpty;
|
||||||
}
|
}
|
||||||
@ -183,9 +153,8 @@ class Note with ChangeNotifier implements Comparable<Note> {
|
|||||||
await file.delete();
|
await file.delete();
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME: Can't this part be auto-generated?
|
|
||||||
@override
|
@override
|
||||||
int get hashCode => filePath.hashCode ^ created.hashCode ^ data.hashCode;
|
int get hashCode => filePath.hashCode;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
bool operator ==(Object other) =>
|
bool operator ==(Object other) =>
|
||||||
@ -193,11 +162,11 @@ class Note with ChangeNotifier implements Comparable<Note> {
|
|||||||
other is Note &&
|
other is Note &&
|
||||||
runtimeType == other.runtimeType &&
|
runtimeType == other.runtimeType &&
|
||||||
filePath == other.filePath &&
|
filePath == other.filePath &&
|
||||||
data == other.data;
|
_data == other._data;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String toString() {
|
String toString() {
|
||||||
return 'Note{filePath: $filePath, created: $created, modified: $modified, data: $data}';
|
return 'Note{filePath: $filePath, created: $created, modified: $modified, data: $_data}';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
45
lib/core/note_serializer.dart
Normal file
45
lib/core/note_serializer.dart
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
import 'package:gitjournal/utils/datetime.dart';
|
||||||
|
|
||||||
|
import 'note.dart';
|
||||||
|
import 'serializers.dart';
|
||||||
|
|
||||||
|
abstract class NoteSerializerInterface {
|
||||||
|
void encode(Note note, NoteData data);
|
||||||
|
void decode(NoteData data, Note note);
|
||||||
|
}
|
||||||
|
|
||||||
|
class NoteSerializationSettings {
|
||||||
|
String modifiedKey = "modified";
|
||||||
|
String createdKey = "created";
|
||||||
|
String titleKey = "title";
|
||||||
|
}
|
||||||
|
|
||||||
|
class NoteSerializer implements NoteSerializerInterface {
|
||||||
|
var settings = NoteSerializationSettings();
|
||||||
|
|
||||||
|
@override
|
||||||
|
void encode(Note note, NoteData data) {
|
||||||
|
if (note.created != null)
|
||||||
|
data.props[settings.createdKey] = toIso8601WithTimezone(note.created);
|
||||||
|
else
|
||||||
|
data.props.remove(settings.createdKey);
|
||||||
|
|
||||||
|
if (note.modified != null)
|
||||||
|
data.props[settings.modifiedKey] = toIso8601WithTimezone(note.modified);
|
||||||
|
else
|
||||||
|
data.props.remove(settings.modifiedKey);
|
||||||
|
|
||||||
|
if (note.title != null && note.title.isNotEmpty)
|
||||||
|
data.props[settings.titleKey] = note.title;
|
||||||
|
|
||||||
|
data.body = note.body;
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void decode(NoteData data, Note note) {
|
||||||
|
note.body = data.body;
|
||||||
|
note.created = parseDateTime(data.props[settings.createdKey]?.toString());
|
||||||
|
note.modified = parseDateTime(data.props[settings.modifiedKey]?.toString());
|
||||||
|
note.title = data.props[settings.titleKey]?.toString();
|
||||||
|
}
|
||||||
|
}
|
@ -146,7 +146,7 @@ class NoteViewer extends StatelessWidget {
|
|||||||
var view = SingleChildScrollView(
|
var view = SingleChildScrollView(
|
||||||
child: Column(
|
child: Column(
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
if (note.hasValidDate() && showJournalHeader)
|
if (note.created != null && showJournalHeader)
|
||||||
JournalEditorHeader(note),
|
JournalEditorHeader(note),
|
||||||
if (showTitle && note.title.isNotEmpty)
|
if (showTitle && note.title.isNotEmpty)
|
||||||
NoteTitleHeader(note.title),
|
NoteTitleHeader(note.title),
|
||||||
|
@ -37,6 +37,8 @@ String toIso8601WithTimezone(DateTime dt, [Duration offset]) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
DateTime parseDateTime(String str) {
|
DateTime parseDateTime(String str) {
|
||||||
|
if (str == null) return null;
|
||||||
|
|
||||||
DateTime dt;
|
DateTime dt;
|
||||||
try {
|
try {
|
||||||
dt = DateTime.parse(str).toLocal();
|
dt = DateTime.parse(str).toLocal();
|
||||||
|
Reference in New Issue
Block a user