~repos /only-bible-app

#kotlin#android#ios

GIT_CONFIG_PARAMETERS="'http.version=HTTP/1.1'" git clone https://git.pyrossh.dev/only-bible-app.git
Discussions: https://groups.google.com/g/rust-embed-devs

The only bible app you will ever need. No ads. No in-app purchases. No distractions.



lib/store/actions_navigation.dart



import "package:async_redux/async_redux.dart";
import "package:flutter/material.dart";
import "package:flutter_soloud/flutter_soloud.dart";
import "package:go_router/go_router.dart";
import "package:only_bible_app/gen/bible.gen.dart";
import "package:only_bible_app/store/app_state.dart";
import "package:only_bible_app/utils.dart";
import "package:only_bible_app/widgets/book_select_sheet.dart";
import "package:only_bible_app/widgets/settings_sheet.dart";
import "package:share_plus/share_plus.dart";
class ShowSettingsAction extends ReduxAction<AppState> {
final BuildContext buildContext;
final Bible bible;
ShowSettingsAction(this.buildContext, this.bible);
@override
AppState? reduce() {
showModalBottomSheet(
context: buildContext,
isDismissible: true,
enableDrag: true,
showDragHandle: true,
useSafeArea: true,
builder: (context) {
final surface = Theme.of(context).colorScheme.surface;
return Theme(
data: Theme.of(context).copyWith(
bottomSheetTheme: BottomSheetThemeData(
backgroundColor: surface,
dragHandleColor: Theme.of(context).colorScheme.onSurfaceVariant,
),
),
child: SettingsSheet(bible: bible),
);
},
);
return null;
}
}
class ShowBookSelectAction extends ReduxAction<AppState> {
final BuildContext buildContext;
final GoRouter router;
final Bible bible;
ShowBookSelectAction(this.buildContext, this.router, this.bible);
@override
AppState? reduce() {
showModalBottomSheet(
context: buildContext,
isDismissible: true,
enableDrag: true,
showDragHandle: true,
useSafeArea: true,
builder: (_) {
return BookSelectSheet(
bible: bible,
parentContext: buildContext,
onChapterSelected: (int bookIndex, int chapterIndex) {
Navigator.of(buildContext).pop();
dispatch(GoToChapterAction(router, bookIndex, chapterIndex));
},
);
},
);
return null;
}
}
class ShowChapterSelectAction extends ReduxAction<AppState> {
final BuildContext buildContext;
final GoRouter router;
final Bible bible;
final Book book;
ShowChapterSelectAction(this.buildContext, this.router, this.bible, this.book);
@override
AppState? reduce() {
showModalBottomSheet(
context: buildContext,
isDismissible: true,
enableDrag: true,
showDragHandle: true,
useSafeArea: true,
builder: (_) {
return BookSelectSheet(
bible: bible,
parentContext: buildContext,
initialBook: book,
onChapterSelected: (int bookIndex, int chapterIndex) {
Navigator.of(buildContext).pop();
dispatch(GoToChapterAction(router, bookIndex, chapterIndex));
},
);
},
);
return null;
}
}
class GoToChapterAction extends ReduxAction<AppState> {
final GoRouter router;
final int book;
final int chapter;
final int? verse;
GoToChapterAction(this.router, this.book, this.chapter, {this.verse});
@override
AppState reduce() {
SoLoud.instance.disposeAllSources();
final navId = DateTime.now().millisecondsSinceEpoch;
if (book > state.savedBook || (book == state.savedBook && chapter > state.savedChapter)) {
router.push("/chapter/$book/$chapter", extra: (slideDir: TextDirection.ltr, scrollToVerse: verse, navId: navId));
} else if (book < state.savedBook || (book == state.savedBook && chapter < state.savedChapter)) {
router.push("/chapter/$book/$chapter", extra: (slideDir: TextDirection.rtl, scrollToVerse: verse, navId: navId));
} else {
router.push("/chapter/$book/$chapter",
extra: (slideDir: null as TextDirection?, scrollToVerse: verse, navId: navId));
}
return state.copy(
savedBook: book,
savedChapter: chapter,
selectedVerses: [],
);
}
}
class NextChapterAction extends ReduxAction<AppState> {
final GoRouter router;
final Bible bible;
final int book;
final int chapter;
NextChapterAction(this.router, this.bible, this.book, this.chapter);
@override
AppState? reduce() {
final selectedBook = bible.books![book];
int? newBook;
int? newChapter;
if (selectedBook.chapters!.length > chapter + 1) {
newBook = selectedBook.index;
newChapter = chapter + 1;
} else if (selectedBook.index + 1 < bible.books!.length) {
final nextBook = bible.books![selectedBook.index + 1];
newBook = nextBook.index;
newChapter = 0;
}
if (newBook == null) return null;
SoLoud.instance.disposeAllSources();
router.pushReplacement(
"/chapter/$newBook/$newChapter",
extra: (slideDir: TextDirection.ltr, scrollToVerse: null as int?, navId: DateTime.now().millisecondsSinceEpoch),
);
return state.copy(
savedBook: newBook,
savedChapter: newChapter,
selectedVerses: [],
);
}
}
class PreviousChapterAction extends ReduxAction<AppState> {
final GoRouter router;
final Bible bible;
final int book;
final int chapter;
PreviousChapterAction(this.router, this.bible, this.book, this.chapter);
@override
AppState? reduce() {
final selectedBook = bible.books![book];
int? newBook;
int? newChapter;
if (chapter - 1 >= 0) {
newBook = selectedBook.index;
newChapter = chapter - 1;
} else if (selectedBook.index - 1 >= 0) {
final prevBook = bible.books![selectedBook.index - 1];
newBook = prevBook.index;
newChapter = prevBook.chapters!.length - 1;
}
if (newBook == null) return null;
SoLoud.instance.disposeAllSources();
router.pushReplacement(
"/chapter/$newBook/$newChapter",
extra: (slideDir: TextDirection.rtl, scrollToVerse: null as int?, navId: DateTime.now().millisecondsSinceEpoch),
);
return state.copy(
savedBook: newBook,
savedChapter: newChapter,
selectedVerses: [],
);
}
}
class UpdateCurrentBibleAction extends ReduxAction<AppState> {
final String name;
final int book;
final int chapter;
UpdateCurrentBibleAction(this.name, this.book, this.chapter);
@override
Future<AppState> reduce() async {
final bible = await loadBible(name);
return state.copy(
bible: bible,
savedBook: book,
savedChapter: chapter,
selectedVerses: [],
);
}
}
class ShareVersesAction extends ReduxAction<AppState> {
final List<Verse> verses;
final String bookName;
ShareVersesAction(this.verses, this.bookName);
@override
Future<AppState?> reduce() async {
final chapter = verses.first.chapter + 1;
final items = verses.sortedBy((e) => e.index).map((e) => e.index + 1);
final versesThrough = items.length >= 3 ? "${items.first}-${items.last}" : items.join(",");
final version = state.bible.languageCode == "en" ? "KJV" : "";
final title = "$bookName $chapter:$versesThrough $version";
final text = verses.map((e) => e.text ?? "").join("\n");
await SharePlus.instance.share(
ShareParams(title: title, subject: title, text: "$title\n$text"),
);
return state.copy(selectedVerses: []);
}
}