Skip to content

Commit 80b2755

Browse files
committed
Better error handling
1 parent bb5bb91 commit 80b2755

8 files changed

Lines changed: 56 additions & 22 deletions

File tree

android/app/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ plugins {
88
android {
99
namespace = "info.zverev.ilya.sonamobi"
1010
compileSdk = flutter.compileSdkVersion
11-
ndkVersion = flutter.ndkVersion
11+
ndkVersion = '27.0.12077973'
1212

1313
compileOptions {
1414
sourceCompatibility = JavaVersion.VERSION_21

lib/empty.dart

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ class EmptyWordView extends ConsumerWidget {
1717
final history = ref.watch(historyProvider);
1818
final isDark = ref.read(nightModeProvider.notifier).isDark(context);
1919
return Column(
20+
crossAxisAlignment: CrossAxisAlignment.stretch,
2021
children: [
2122
SizedBox(height: 10.0),
2223
ListTile(
@@ -39,11 +40,28 @@ class EmptyWordView extends ConsumerWidget {
3940
),
4041
SwitchListTile(
4142
value: ref.watch(linksProvider),
42-
title: Text('Keeleõppijale'),
43+
title: Text('Keeleõppija sõnavara'),
4344
onChanged: (value) {
4445
ref.read(linksProvider.notifier).toggle();
4546
},
4647
),
48+
if (history.history.length > 3)
49+
GestureDetector(
50+
child: Container(
51+
padding: EdgeInsets.symmetric(horizontal: 16.0, vertical: 5.0),
52+
color: isDark ? Colors.blue.shade900 : Colors.blue.shade100,
53+
child: Text(
54+
'Ava sõnaveebi veebileht',
55+
style: TextStyle(
56+
color: isDark ? Colors.blue.shade100 : Colors.blue.shade900,
57+
fontSize: 18,
58+
),
59+
),
60+
),
61+
onTap: () {
62+
launchUrl(Uri.https('sonaveeb.ee'));
63+
},
64+
),
4765
if (history.history.length <= 3)
4866
Padding(
4967
padding: const EdgeInsets.all(16.0),

lib/forms.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ class _WordFormsPageState extends ConsumerState<WordFormsPage> {
5555
}
5656
} on FetchError catch (e) {
5757
_logger.severe('Failed to load word forms', e);
58+
_webController.loadHtmlString('Failed to load word forms',
59+
baseUrl: kBaseUrl);
5860
}
5961
}
6062

lib/panel.dart

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,16 +70,17 @@ class _WordPageState extends ConsumerState<WordPage>
7070

7171
_lookingFor = value;
7272
Map<String, dynamic> data;
73+
final pages = ref.read(pageProvider);
74+
final path = ref.read(linksProvider.notifier).autocomplete(value);
7375
try {
74-
final body = await ref
75-
.read(pageProvider)
76-
.fetchPage(ref.read(linksProvider.notifier).autocomplete(value));
76+
final body = await pages.fetchPage(path);
7777
data = json.decode(body);
7878
} on FetchError catch (e) {
7979
_logger.severe('Fetch error', e);
8080
return;
8181
} on FormatException catch (e) {
8282
_logger.severe('Json decoding error', e);
83+
pages.forgetPage(path);
8384
return;
8485
}
8586
if (_lookingFor != value) return;

lib/providers/fetcher.dart

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,18 @@ final pageProvider = Provider((ref) => PageProvider(ref));
1212

1313
class FetchError implements Exception {
1414
final String message;
15+
final String path;
1516
final int code;
1617
final String body;
1718
final String? url;
1819

19-
FetchError(this.message, http.Response? response)
20+
FetchError(this.message, this.path, [http.Response? response])
2021
: code = response?.statusCode ?? 0,
2122
body = response?.body ?? '',
2223
url = response?.request?.url.toString();
2324

2425
@override
25-
String toString() => '$message: $code $body';
26+
String toString() => '$message for $path: $code $body';
2627
}
2728

2829
class PageProvider {
@@ -40,7 +41,7 @@ class PageProvider {
4041
final url = Uri.https(kBaseUrl);
4142
final response = await http.get(url);
4243
if (response.statusCode != 200) {
43-
throw FetchError('Failed to get a cookie', response);
44+
throw FetchError('Failed to get a cookie', '/', response);
4445
}
4546
final data =
4647
response.headers['set-cookie'] ?? response.headers['Set-Cookie'];
@@ -68,6 +69,15 @@ class PageProvider {
6869
);
6970
}
7071

72+
Future forgetPage(String path) async {
73+
final db = await _ref.read(databaseProvider).database;
74+
await db.delete(
75+
CachedPage.kTableName,
76+
where: 'url = ?',
77+
whereArgs: [path],
78+
);
79+
}
80+
7181
Future<String> fetchPage(String path) async {
7282
if (_cookie == null) await _updateCookie();
7383

@@ -92,13 +102,16 @@ class PageProvider {
92102

93103
if (response.statusCode != 200) {
94104
if (cached != null) return cached.content;
95-
throw FetchError('Error on $path', response);
105+
throw FetchError('Error', path, response);
96106
}
97107

98108
body = utf8.decode(response.bodyBytes);
99109
} on TimeoutException {
100110
if (cached != null) return cached.content;
101-
throw FetchError('Timeout for $path', null);
111+
throw FetchError('Timeout', path);
112+
}
113+
if (body.length < 2) {
114+
throw FetchError('Empty page', path);
102115
}
103116

104117
_saveToCache(path, body);

lib/word.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,10 +99,9 @@ class _WordViewState extends ConsumerState<WordView> {
9999
_updateMainPage() async {
100100
_error = null;
101101
_homonyms = const [];
102+
final path = ref.read(linksProvider.notifier).search(widget.word.word);
102103
try {
103-
final body = await ref
104-
.read(pageProvider)
105-
.fetchPage(ref.read(linksProvider.notifier).search(widget.word.word));
104+
final body = await ref.read(pageProvider).fetchPage(path);
106105
_homonyms = SonaveebParsers.extractHomonyms(body);
107106
} on FetchError catch (e) {
108107
_logger.severe('Failed to fetch the word page', e);
@@ -113,6 +112,7 @@ class _WordViewState extends ConsumerState<WordView> {
113112
}
114113

115114
if (_homonyms.isEmpty) {
115+
ref.read(pageProvider).forgetPage(path);
116116
return;
117117
}
118118

pubspec.lock

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,10 @@ packages:
6161
dependency: transitive
6262
description:
6363
name: cli_util
64-
sha256: c05b7406fdabc7a49a3929d4af76bcaccbbffcbcdcf185b082e1ae07da323d19
64+
sha256: ff6785f7e9e3c38ac98b2fb035701789de90154024a75b6cb926445e83197d1c
6565
url: "https://pub.dev"
6666
source: hosted
67-
version: "0.4.1"
67+
version: "0.4.2"
6868
clock:
6969
dependency: transitive
7070
description:
@@ -93,10 +93,10 @@ packages:
9393
dependency: transitive
9494
description:
9595
name: csslib
96-
sha256: "706b5707578e0c1b4b7550f64078f0a0f19dec3f50a178ffae7006b0a9ca58fb"
96+
sha256: "09bad715f418841f976c77db72d5398dc1253c21fb9c0c7f0b0b985860b2d58e"
9797
url: "https://pub.dev"
9898
source: hosted
99-
version: "1.0.0"
99+
version: "1.0.2"
100100
fake_async:
101101
dependency: transitive
102102
description:
@@ -164,10 +164,10 @@ packages:
164164
dependency: "direct main"
165165
description:
166166
name: html
167-
sha256: "3a7812d5bcd2894edf53dfaf8cd640876cf6cef50a8f238745c8b8120ea74d3a"
167+
sha256: "1fc58edeaec4307368c60d59b7e15b9d658b57d7f3125098b6294153c75337ec"
168168
url: "https://pub.dev"
169169
source: hosted
170-
version: "0.15.4"
170+
version: "0.15.5"
171171
http:
172172
dependency: "direct main"
173173
description:
@@ -521,10 +521,10 @@ packages:
521521
dependency: transitive
522522
description:
523523
name: url_launcher_android
524-
sha256: "0dea215895a4d254401730ca0ba8204b29109a34a99fb06ae559a2b60988d2de"
524+
sha256: "6fc2f56536ee873eeb867ad176ae15f304ccccc357848b351f6f0d8d4a40d193"
525525
url: "https://pub.dev"
526526
source: hosted
527-
version: "6.3.13"
527+
version: "6.3.14"
528528
url_launcher_ios:
529529
dependency: transitive
530530
description:

pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name: sonamobi
22
description: Mobile interface to Sonaveeb
33
publish_to: 'none'
4-
version: 0.1.1+2
4+
version: 0.2.0+3
55

66
environment:
77
sdk: ^3.5.3

0 commit comments

Comments
 (0)