import "package:flutter/material.dart";
import "package:only_bible_app/gen/bible.gen.dart";
import "package:only_bible_app/theme.dart";
import "package:async_redux/async_redux.dart";
export "package:async_redux/async_redux.dart" show BuildContextExtensionForProviderAndConnector;
final List<Verse> selectedVerses;
final Map<String, int> highlights;
this.selectedVerses = const [],
this.highlights = const {},
List<Verse>? selectedVerses,
Map<String, int>? highlights,
engTitles: engTitles ?? this.engTitles,
fontWeight: fontWeight ?? this.fontWeight,
darkMode: darkMode ?? this.darkMode,
fontSize: fontSize ?? this.fontSize,
savedBook: savedBook ?? this.savedBook,
savedChapter: savedChapter ?? this.savedChapter,
selectedVerses: selectedVerses ?? this.selectedVerses,
highlights: highlights ?? this.highlights,
bible: bible ?? this.bible,
Map<String, dynamic> toJson() => {
"fontWeight": fontWeight,
"savedChapter": savedChapter,
"highlights": highlights,
factory AppState.fromJson(Map<String, dynamic> json, Bible bible) => AppState(
engTitles: json["engTitles"] as bool? ?? false,
fontWeight: json["fontWeight"] as int? ?? (json["boldFont"] == true ? 500 : 400),
darkMode: json["darkMode"] as bool? ?? false,
fontSize: (json["fontSize"] as num?)?.toDouble() ?? ((json["textScale"] as num?)?.toDouble() ?? 0.0) + 16.0,
savedBook: json["savedBook"] as int? ?? 0,
savedChapter: json["savedChapter"] as int? ?? 0,
highlights: (json["highlights"] as Map<String, dynamic>?)?.map((k, v) => MapEntry(k, v as int)) ?? const {},
Color? getHighlight(Verse v) {
final key = "${v.book}:${v.chapter}:${v.index}";
final index = highlights[key];
if (index == null) return null;
return darkMode ? darkHighlights[index] : lightHighlights[index];
bool isVerseSelected(Verse v) {
return selectedVerses.any(
(el) => el.book == v.book && el.chapter == v.chapter && el.index == v.index,
TextStyle getHighlightStyle(BuildContext context, Verse v) {
final isSelected = selectedVerses.any(
(el) => el.book == v.book && el.chapter == v.chapter && el.index == v.index,
backgroundColor: Theme.of(context).textSelectionTheme.selectionColor,
color: getHighlight(v) ?? Theme.of(context).colorScheme.onSurface,
backgroundColor: getHighlight(v) ?? Theme.of(context).colorScheme.surface,
extension AppStateExtension on BuildContext {
AppState get state => getState<AppState>();
AppState read() => getRead<AppState>();
R select<R>(R Function(AppState state) selector) => getSelect<AppState, R>(selector);