Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Additional reading dates #436

Merged
merged 7 commits into from
Jan 29, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion assets/translations/en-US.json
Original file line number Diff line number Diff line change
Expand Up @@ -276,5 +276,7 @@
"download_missing_covers_explanation": "Download missing covers for books that have ISBN set",
"downloaded_covers": "Downloaded covers:",
"try_downloading_covers": "Do you want to try downloading missing covers for imported books?",
"filter_out_selected_tags": "Filter out selected tags"
"filter_out_selected_tags": "Filter out selected tags",
"add_additional_reading_time": "Add additional reading time",
"additional_reading": "Additional reading:"
}
68 changes: 47 additions & 21 deletions lib/database/database_provider.dart
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ class DatabaseProvider {

return await openDatabase(
path,
version: 6,
version: 7,
onCreate: (Database db, int version) async {
await db.execute("CREATE TABLE booksTable ("
"id INTEGER PRIMARY KEY AUTOINCREMENT, "
Expand All @@ -55,7 +55,8 @@ class DatabaseProvider {
"has_cover INTEGER, "
"cover BLOB, "
"blur_hash TEXT, "
"reading_time INTEGER"
"reading_time INTEGER, "
"additional_readings TEXT"
")");
},
onUpgrade: (Database db, int oldVersion, int newVersion) async {
Expand All @@ -64,19 +65,22 @@ class DatabaseProvider {

switch (oldVersion) {
case 1:
_updateBookDatabaseV1toV6(batch);
_updateBookDatabaseV1toV7(batch);
break;
case 2:
_updateBookDatabaseV2toV6(batch);
_updateBookDatabaseV2toV7(batch);
break;
case 3:
_updateBookDatabaseV3toV6(batch);
_updateBookDatabaseV3toV7(batch);
break;
case 4:
_updateBookDatabaseV4toV6(batch);
_updateBookDatabaseV4toV7(batch);
break;
case 5:
_updateBookDatabaseV5toV6(batch);
_updateBookDatabaseV5toV7(batch);
break;
case 6:
_updateBookDatabaseV6toV7(batch);
break;
}

Expand Down Expand Up @@ -112,39 +116,61 @@ class DatabaseProvider {
"ALTER TABLE booksTable ADD reading_time INTEGER",
];

void _updateBookDatabaseV1toV6(Batch batch) {
final migrationScriptsV7 = [
"ALTER TABLE booksTable ADD additional_readings TEXT",
];

void _updateBookDatabaseV1toV7(Batch batch) {
_executeBatch(
batch,
migrationScriptsV2 +
migrationScriptsV3 +
migrationScriptsV4 +
migrationScriptsV5 +
migrationScriptsV6,
migrationScriptsV6 +
migrationScriptsV7,
);
}

void _updateBookDatabaseV2toV7(Batch batch) {
_executeBatch(
batch,
migrationScriptsV3 +
migrationScriptsV4 +
migrationScriptsV5 +
migrationScriptsV6 +
migrationScriptsV7,
);
}

void _updateBookDatabaseV2toV6(Batch batch) {
void _updateBookDatabaseV3toV7(Batch batch) {
_executeBatch(
batch,
migrationScriptsV3 +
migrationScriptsV4 +
migrationScriptsV5 +
migrationScriptsV6);
batch,
migrationScriptsV4 +
migrationScriptsV5 +
migrationScriptsV6 +
migrationScriptsV7,
);
}

void _updateBookDatabaseV3toV6(Batch batch) {
void _updateBookDatabaseV4toV7(Batch batch) {
_executeBatch(
batch, migrationScriptsV4 + migrationScriptsV5 + migrationScriptsV6);
batch,
migrationScriptsV5 + migrationScriptsV6 + migrationScriptsV7,
);
}

void _updateBookDatabaseV4toV6(Batch batch) {
_executeBatch(batch, migrationScriptsV5 + migrationScriptsV6);
void _updateBookDatabaseV5toV7(Batch batch) {
_executeBatch(
batch,
migrationScriptsV6 + migrationScriptsV7,
);
}

void _updateBookDatabaseV5toV6(Batch batch) {
void _updateBookDatabaseV6toV7(Batch batch) {
_executeBatch(
batch,
migrationScriptsV6,
migrationScriptsV7,
);
}
}
2 changes: 2 additions & 0 deletions lib/generated/locale_keys.g.dart
Original file line number Diff line number Diff line change
Expand Up @@ -273,4 +273,6 @@ abstract class LocaleKeys {
static const downloaded_covers = 'downloaded_covers';
static const try_downloading_covers = 'try_downloading_covers';
static const filter_out_selected_tags = 'filter_out_selected_tags';
static const add_additional_reading_time = 'add_additional_reading_time';
static const additional_reading = 'additional_reading';
}
56 changes: 56 additions & 0 deletions lib/logic/cubit/edit_book_cubit.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:openreads/core/constants/enums.dart';
import 'package:openreads/main.dart';
import 'package:openreads/model/additional_reading.dart';
import 'package:openreads/model/book.dart';
import 'package:openreads/model/reading_time.dart';

Expand Down Expand Up @@ -171,6 +172,61 @@ class EditBookCubit extends Cubit<Book> {

emit(book);
}

void addNewAdditionalReading(AdditionalReading additionalReading) {
List<AdditionalReading> additionalReadings = state.additionalReadings ?? [];

additionalReadings.add(additionalReading);

final book = state.copyWith();
book.additionalReadings = additionalReadings;

emit(book);
}

void removeAdditionalReading(int index) {
List<AdditionalReading> additionalReadings = state.additionalReadings ?? [];

additionalReadings.removeAt(index);

final book = state.copyWith();
book.additionalReadings = additionalReadings;

emit(book);
}

void setAdditionalStartDate(DateTime? startDate, int index) {
List<AdditionalReading> additionalReadings = state.additionalReadings ?? [];

additionalReadings[index].startDate = startDate;

final book = state.copyWith();
book.additionalReadings = additionalReadings;

emit(book);
}

setAdditionalFinishDate(DateTime? finishDate, int index) {
List<AdditionalReading> additionalReadings = state.additionalReadings ?? [];

additionalReadings[index].finishDate = finishDate;

final book = state.copyWith();
book.additionalReadings = additionalReadings;

emit(book);
}

setAdditionalReadingTime(ReadingTime? readingTime, int index) {
List<AdditionalReading> additionalReadings = state.additionalReadings ?? [];

additionalReadings[index].customReadingTime = readingTime;

final book = state.copyWith();
book.additionalReadings = additionalReadings;

emit(book);
}
}

class EditBookCoverCubit extends Cubit<File?> {
Expand Down
46 changes: 46 additions & 0 deletions lib/model/additional_reading.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import 'package:openreads/model/reading_time.dart';

class AdditionalReading {
DateTime? startDate;
DateTime? finishDate;
ReadingTime? customReadingTime;

AdditionalReading({
this.startDate,
this.finishDate,
this.customReadingTime,
});

factory AdditionalReading.fromString(String input) {
List<String> dateAndValue = input.split('|');

DateTime? startDate =
dateAndValue[0] != '' ? DateTime.parse(dateAndValue[0]) : null;
DateTime? finishDate =
dateAndValue[1] != '' ? DateTime.parse(dateAndValue[1]) : null;
final customReadingTime = dateAndValue[2] != ''
? ReadingTime.fromMilliSeconds(
int.parse(dateAndValue[2]),
)
: null;

return AdditionalReading(
startDate: startDate,
finishDate: finishDate,
customReadingTime: customReadingTime,
);
}

@override
String toString() {
final startDate =
this.startDate != null ? this.startDate!.toIso8601String() : '';
final finishDate =
this.finishDate != null ? this.finishDate!.toIso8601String() : '';
final customReadingTime = this.customReadingTime != null
? this.customReadingTime!.milliSeconds.toString()
: '';

return '$startDate|$finishDate|$customReadingTime';
}
}
62 changes: 38 additions & 24 deletions lib/model/book.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:openreads/core/constants/enums.dart';
import 'package:openreads/main.dart';
import 'package:openreads/model/additional_reading.dart';
import 'package:openreads/model/book_from_backup_v3.dart';
import 'package:openreads/model/reading_time.dart';

Expand Down Expand Up @@ -31,6 +32,7 @@ class Book {
BookFormat bookFormat;
bool hasCover;
ReadingTime? readingTime;
List<AdditionalReading>? additionalReadings;

Book({
this.id,
Expand All @@ -56,6 +58,7 @@ class Book {
this.bookFormat = BookFormat.paperback,
this.hasCover = false,
this.readingTime,
this.additionalReadings,
});

factory Book.empty() {
Expand Down Expand Up @@ -112,33 +115,39 @@ class Book {
readingTime: json['reading_time'] != null
? ReadingTime.fromMilliSeconds(json['reading_time'])
: null,
additionalReadings: json['additional_readings'] != null
? jsonDecode(json['additional_readings'])
.map<AdditionalReading>((e) => AdditionalReading.fromString(e))
.toList()
: null,
);
}

Book copyWith({
String? title,
String? author,
int? status,
String? subtitle,
String? description,
bool? favourite,
bool? deleted,
int? rating,
DateTime? startDate,
DateTime? finishDate,
int? pages,
int? publicationYear,
String? isbn,
String? olid,
String? tags,
String? myReview,
String? notes,
Uint8List? cover,
String? blurHash,
BookFormat? bookFormat,
bool? hasCover,
ReadingTime? readingTime,
}) {
Book copyWith(
{String? title,
String? author,
int? status,
String? subtitle,
String? description,
bool? favourite,
bool? deleted,
int? rating,
DateTime? startDate,
DateTime? finishDate,
int? pages,
int? publicationYear,
String? isbn,
String? olid,
String? tags,
String? myReview,
String? notes,
Uint8List? cover,
String? blurHash,
BookFormat? bookFormat,
bool? hasCover,
ReadingTime? readingTime,
List<AdditionalReading>? additionalReadings,
x}) {
return Book(
id: id,
title: title ?? this.title,
Expand All @@ -163,6 +172,7 @@ class Book {
bookFormat: bookFormat ?? this.bookFormat,
hasCover: hasCover ?? this.hasCover,
readingTime: readingTime ?? this.readingTime,
additionalReadings: additionalReadings ?? this.additionalReadings,
);
}

Expand Down Expand Up @@ -191,6 +201,7 @@ class Book {
bookFormat: bookFormat,
hasCover: hasCover,
readingTime: readingTime,
additionalReadings: additionalReadings,
);
}

Expand Down Expand Up @@ -271,6 +282,9 @@ class Book {
? 'paperback'
: 'paperback',
'reading_time': readingTime?.milliSeconds,
'additional_readings': additionalReadings != null
? jsonEncode(additionalReadings!.map((e) => e.toString()).toList())
: null,
};
}

Expand Down
Loading
Loading