c3e6d66f43
- Added ReaderTtsPlaybackStore to manage TTS start requests with a maximum of 4 pending requests. - Updated app configuration to use a production API URL. - Enhanced BookmarkModel to infer type when not provided by the API for backward compatibility. - Introduced methods in LocalStore for saving, loading, and clearing the last route path. - Implemented syncProgress method in BookshelfNotifier to update reading progress and bookmarks from the server. - Modified ReaderScreen to handle chapter navigation and TTS playback more effectively, including auto-start logic. - Updated TtsPlayerWidget to accept additional parameters for chapter navigation. - Enhanced TtsNotifier to handle new parameters for TTS requests and manage playback state. - Improved SplashScreen to restore the last visited route after splash screen display.
72 lines
2.1 KiB
Dart
72 lines
2.1 KiB
Dart
import 'package:equatable/equatable.dart';
|
|
|
|
import 'novel_model.dart';
|
|
|
|
enum BookmarkType {
|
|
reading('reading'),
|
|
bookmarked('bookmarked');
|
|
|
|
const BookmarkType(this.value);
|
|
final String value;
|
|
|
|
static BookmarkType fromString(String? str) {
|
|
return values.firstWhere(
|
|
(e) => e.value == str,
|
|
orElse: () => BookmarkType.bookmarked,
|
|
);
|
|
}
|
|
}
|
|
|
|
class BookmarkModel extends Equatable {
|
|
const BookmarkModel({
|
|
required this.id,
|
|
required this.novelId,
|
|
this.type = BookmarkType.bookmarked,
|
|
this.lastChapterId,
|
|
this.lastChapterNumber,
|
|
this.readChapters = const [],
|
|
this.novel,
|
|
});
|
|
|
|
final String id;
|
|
final String novelId;
|
|
final BookmarkType type;
|
|
final String? lastChapterId;
|
|
final int? lastChapterNumber;
|
|
final List<int> readChapters;
|
|
final NovelModel? novel;
|
|
|
|
factory BookmarkModel.fromJson(Map<String, dynamic> json) => BookmarkModel(
|
|
id: json['id'] as String,
|
|
novelId: json['novelId'] as String,
|
|
lastChapterId: json['lastChapterId'] as String?,
|
|
lastChapterNumber: json['lastChapterNumber'] as int?,
|
|
readChapters: (json['readChapters'] as List<dynamic>?)
|
|
?.map((e) => (e as num).toInt())
|
|
.toList() ??
|
|
[],
|
|
type: () {
|
|
final explicitType = BookmarkType.fromString(json['type'] as String?);
|
|
if ((json['type'] as String?) != null) {
|
|
return explicitType;
|
|
}
|
|
|
|
// Backward-compatible inference when API does not return `type`.
|
|
final inferredLastChapter = json['lastChapterNumber'] as int?;
|
|
final inferredReadChapters = (json['readChapters'] as List<dynamic>?)
|
|
?.map((e) => (e as num).toInt())
|
|
.toList() ??
|
|
const <int>[];
|
|
return (inferredLastChapter != null || inferredReadChapters.isNotEmpty)
|
|
? BookmarkType.reading
|
|
: BookmarkType.bookmarked;
|
|
}(),
|
|
novel: json['novel'] != null
|
|
? NovelModel.fromJson(json['novel'] as Map<String, dynamic>)
|
|
: null,
|
|
);
|
|
|
|
@override
|
|
List<Object?> get props => [id, novelId, type];
|
|
}
|