2022-01-25 20:44:00 +01:00
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
|
|
|
|
import '../../components/common/loading.dart';
|
|
|
|
import '../../components/kanji/kanji_result_body.dart';
|
2023-02-24 09:55:55 +01:00
|
|
|
import '../../components/library/add_to_library_dialog.dart';
|
2022-01-25 20:44:00 +01:00
|
|
|
import '../../components/search/search_result_body.dart';
|
2022-06-05 02:41:11 +02:00
|
|
|
import '../../models/history/history_entry.dart';
|
2023-02-24 09:55:55 +01:00
|
|
|
import '../../models/library/library_list.dart';
|
2022-01-25 20:44:00 +01:00
|
|
|
import '../../services/jisho_api/jisho_search.dart';
|
|
|
|
import '../../services/jisho_api/kanji_search.dart';
|
|
|
|
|
|
|
|
class ResultPage extends StatefulWidget {
|
|
|
|
final String searchTerm;
|
|
|
|
final bool isKanji;
|
|
|
|
|
|
|
|
const ResultPage({
|
|
|
|
Key? key,
|
|
|
|
required this.searchTerm,
|
|
|
|
required this.isKanji,
|
|
|
|
}) : super(key: key);
|
|
|
|
|
|
|
|
@override
|
|
|
|
_ResultPageState createState() => _ResultPageState();
|
|
|
|
}
|
|
|
|
|
|
|
|
class _ResultPageState extends State<ResultPage> {
|
|
|
|
bool addedToDatabase = false;
|
2023-02-24 09:55:55 +01:00
|
|
|
bool isFavourite = false;
|
|
|
|
|
|
|
|
@override
|
|
|
|
void initState() {
|
|
|
|
super.initState();
|
|
|
|
if (!widget.isKanji) return;
|
|
|
|
LibraryList.favourites
|
|
|
|
.containsKanji(widget.searchTerm)
|
|
|
|
.then((b) => setState(() => isFavourite = b));
|
|
|
|
}
|
2022-01-25 20:44:00 +01:00
|
|
|
|
|
|
|
@override
|
|
|
|
Widget build(BuildContext context) {
|
|
|
|
return Scaffold(
|
2023-02-24 09:55:55 +01:00
|
|
|
appBar: AppBar(
|
|
|
|
actions: !widget.isKanji
|
|
|
|
? []
|
|
|
|
: [
|
|
|
|
IconButton(
|
|
|
|
onPressed: () async {
|
|
|
|
await showAddToLibraryDialog(
|
|
|
|
context: context,
|
|
|
|
entryText: widget.searchTerm,
|
|
|
|
isKanji: true,
|
|
|
|
);
|
|
|
|
final updatedFavouriteStatus = await LibraryList.favourites
|
|
|
|
.containsKanji(widget.searchTerm);
|
|
|
|
setState(() => isFavourite = updatedFavouriteStatus);
|
|
|
|
},
|
|
|
|
icon: const Icon(Icons.bookmark),
|
|
|
|
),
|
|
|
|
IconButton(
|
|
|
|
onPressed: () async {
|
|
|
|
await LibraryList.favourites.toggleEntry(
|
|
|
|
entryText: widget.searchTerm,
|
|
|
|
isKanji: true,
|
|
|
|
overrideToggleOn: !isFavourite,
|
|
|
|
);
|
|
|
|
setState(() => isFavourite = !isFavourite);
|
|
|
|
},
|
|
|
|
icon: isFavourite
|
|
|
|
? const Icon(Icons.star, color: Colors.yellow)
|
|
|
|
: const Icon(Icons.star_border),
|
|
|
|
)
|
|
|
|
],
|
|
|
|
),
|
2022-01-25 20:44:00 +01:00
|
|
|
body: FutureBuilder(
|
|
|
|
future: widget.isKanji
|
|
|
|
? fetchKanji(widget.searchTerm)
|
|
|
|
: fetchJishoResults(widget.searchTerm),
|
|
|
|
builder: (context, snapshot) {
|
2022-06-05 02:41:11 +02:00
|
|
|
// TODO: provide proper error handling
|
2022-01-25 20:44:00 +01:00
|
|
|
if (snapshot.hasError) return ErrorWidget(snapshot.error!);
|
2022-06-05 02:41:11 +02:00
|
|
|
if (!snapshot.hasData) return const LoadingScreen();
|
2022-01-25 20:44:00 +01:00
|
|
|
|
|
|
|
if (!addedToDatabase) {
|
2022-06-05 02:41:11 +02:00
|
|
|
if (widget.isKanji) {
|
|
|
|
HistoryEntry.insertKanji(kanji: widget.searchTerm);
|
|
|
|
} else {
|
|
|
|
HistoryEntry.insertWord(word: widget.searchTerm);
|
|
|
|
}
|
2022-01-25 20:44:00 +01:00
|
|
|
addedToDatabase = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return widget.isKanji
|
|
|
|
? KanjiResultBody(result: snapshot.data! as KanjiResult)
|
|
|
|
: SearchResultsBody(
|
|
|
|
results: (snapshot.data! as JishoAPIResult).data!,
|
|
|
|
);
|
|
|
|
},
|
|
|
|
),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|