~repos /only-bible-app

#kotlin#android#ios

git clone https://pyrossh.dev/repos/only-bible-app.git

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


80e2cdaf pyrossh

2 years ago
use email for error reporting
android/app/google-services.json DELETED
@@ -1,46 +0,0 @@
1
- {
2
- "project_info": {
3
- "project_number": "584350822569",
4
- "project_id": "only-bible-app",
5
- "storage_bucket": "only-bible-app.appspot.com"
6
- },
7
- "client": [
8
- {
9
- "client_info": {
10
- "mobilesdk_app_id": "1:584350822569:android:f03003ffd2d3d9d6fdf9b8",
11
- "android_client_info": {
12
- "package_name": "sh.pyros.only_bible_app"
13
- }
14
- },
15
- "oauth_client": [
16
- {
17
- "client_id": "584350822569-ug7h7pfasn1q7vgvasd6jhcv1v3i0s0l.apps.googleusercontent.com",
18
- "client_type": 3
19
- }
20
- ],
21
- "api_key": [
22
- {
23
- "current_key": "AIzaSyA0XlcB1JwkUbYX6CUnf9TkW4UtNxFq2ag"
24
- }
25
- ],
26
- "services": {
27
- "appinvite_service": {
28
- "other_platform_oauth_client": [
29
- {
30
- "client_id": "584350822569-ug7h7pfasn1q7vgvasd6jhcv1v3i0s0l.apps.googleusercontent.com",
31
- "client_type": 3
32
- },
33
- {
34
- "client_id": "584350822569-93bboqrirsb1q4mm697qm6ja58mnnakg.apps.googleusercontent.com",
35
- "client_type": 2,
36
- "ios_info": {
37
- "bundle_id": "sh.pyros.onlyBibleApp"
38
- }
39
- }
40
- ]
41
- }
42
- }
43
- }
44
- ],
45
- "configuration_version": "1"
46
- }
ios/Runner/GoogleService-Info.plist DELETED
@@ -1,34 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
- <plist version="1.0">
4
- <dict>
5
- <key>CLIENT_ID</key>
6
- <string>584350822569-93bboqrirsb1q4mm697qm6ja58mnnakg.apps.googleusercontent.com</string>
7
- <key>REVERSED_CLIENT_ID</key>
8
- <string>com.googleusercontent.apps.584350822569-93bboqrirsb1q4mm697qm6ja58mnnakg</string>
9
- <key>API_KEY</key>
10
- <string>AIzaSyAqRrBRa3fVmoZby_b4submR2hjQkImgZc</string>
11
- <key>GCM_SENDER_ID</key>
12
- <string>584350822569</string>
13
- <key>PLIST_VERSION</key>
14
- <string>1</string>
15
- <key>BUNDLE_ID</key>
16
- <string>sh.pyros.onlyBibleApp</string>
17
- <key>PROJECT_ID</key>
18
- <string>only-bible-app</string>
19
- <key>STORAGE_BUCKET</key>
20
- <string>only-bible-app.appspot.com</string>
21
- <key>IS_ADS_ENABLED</key>
22
- <false></false>
23
- <key>IS_ANALYTICS_ENABLED</key>
24
- <false></false>
25
- <key>IS_APPINVITE_ENABLED</key>
26
- <true></true>
27
- <key>IS_GCM_ENABLED</key>
28
- <true></true>
29
- <key>IS_SIGNIN_ENABLED</key>
30
- <true></true>
31
- <key>GOOGLE_APP_ID</key>
32
- <string>1:584350822569:ios:73b8443b3dd48f40fdf9b8</string>
33
- </dict>
34
- </plist>
lib/firebase_options.dart DELETED
@@ -1,82 +0,0 @@
1
- // File generated by FlutterFire CLI.
2
- // ignore_for_file: lines_longer_than_80_chars, avoid_classes_with_only_static_members
3
- import 'package:firebase_core/firebase_core.dart' show FirebaseOptions;
4
- import 'package:flutter/foundation.dart'
5
- show defaultTargetPlatform, kIsWeb, TargetPlatform;
6
-
7
- /// Default [FirebaseOptions] for use with your Firebase apps.
8
- ///
9
- /// Example:
10
- /// ```dart
11
- /// import 'firebase_options.dart';
12
- /// // ...
13
- /// await Firebase.initializeApp(
14
- /// options: DefaultFirebaseOptions.currentPlatform,
15
- /// );
16
- /// ```
17
- class DefaultFirebaseOptions {
18
- static FirebaseOptions get currentPlatform {
19
- if (kIsWeb) {
20
- return web;
21
- }
22
- switch (defaultTargetPlatform) {
23
- case TargetPlatform.android:
24
- return android;
25
- case TargetPlatform.iOS:
26
- return ios;
27
- case TargetPlatform.macOS:
28
- return macos;
29
- case TargetPlatform.windows:
30
- throw UnsupportedError(
31
- 'DefaultFirebaseOptions have not been configured for windows - '
32
- 'you can reconfigure this by running the FlutterFire CLI again.',
33
- );
34
- case TargetPlatform.linux:
35
- throw UnsupportedError(
36
- 'DefaultFirebaseOptions have not been configured for linux - '
37
- 'you can reconfigure this by running the FlutterFire CLI again.',
38
- );
39
- default:
40
- throw UnsupportedError(
41
- 'DefaultFirebaseOptions are not supported for this platform.',
42
- );
43
- }
44
- }
45
-
46
- static const FirebaseOptions web = FirebaseOptions(
47
- apiKey: 'AIzaSyAa9-kLU9yy9g8cRJG7jh5kOA8Z77uI_Pg',
48
- appId: '1:584350822569:web:b4c020f0a7e40f7cfdf9b8',
49
- messagingSenderId: '584350822569',
50
- projectId: 'only-bible-app',
51
- authDomain: 'only-bible-app.firebaseapp.com',
52
- storageBucket: 'only-bible-app.appspot.com',
53
- );
54
-
55
- static const FirebaseOptions android = FirebaseOptions(
56
- apiKey: 'AIzaSyA0XlcB1JwkUbYX6CUnf9TkW4UtNxFq2ag',
57
- appId: '1:584350822569:android:f03003ffd2d3d9d6fdf9b8',
58
- messagingSenderId: '584350822569',
59
- projectId: 'only-bible-app',
60
- storageBucket: 'only-bible-app.appspot.com',
61
- );
62
-
63
- static const FirebaseOptions ios = FirebaseOptions(
64
- apiKey: 'AIzaSyAqRrBRa3fVmoZby_b4submR2hjQkImgZc',
65
- appId: '1:584350822569:ios:73b8443b3dd48f40fdf9b8',
66
- messagingSenderId: '584350822569',
67
- projectId: 'only-bible-app',
68
- storageBucket: 'only-bible-app.appspot.com',
69
- iosClientId: '584350822569-93bboqrirsb1q4mm697qm6ja58mnnakg.apps.googleusercontent.com',
70
- iosBundleId: 'sh.pyros.onlyBibleApp',
71
- );
72
-
73
- static const FirebaseOptions macos = FirebaseOptions(
74
- apiKey: 'AIzaSyAqRrBRa3fVmoZby_b4submR2hjQkImgZc',
75
- appId: '1:584350822569:ios:5d85f3e76fa02286fdf9b8',
76
- messagingSenderId: '584350822569',
77
- projectId: 'only-bible-app',
78
- storageBucket: 'only-bible-app.appspot.com',
79
- iosClientId: '584350822569-s9t1p0bb1gqj8fothe4s5lstvu9k7244.apps.googleusercontent.com',
80
- iosBundleId: 'sh.pyros.onlyBibleApp.RunnerTests',
81
- );
82
- }
lib/main.dart CHANGED
@@ -3,28 +3,24 @@ import "package:flutter/foundation.dart";
3
3
  import "package:flutter_azure_tts/flutter_azure_tts.dart";
4
4
  import "package:flutter_dotenv/flutter_dotenv.dart";
5
5
  import "package:flutter_web_plugins/url_strategy.dart";
6
- import "package:firebase_core/firebase_core.dart";
7
- import "package:firebase_crashlytics/firebase_crashlytics.dart";
8
- import "package:only_bible_app/firebase_options.dart";
9
6
  import "package:flutter_native_splash/flutter_native_splash.dart";
10
7
  import "package:only_bible_app/app.dart";
11
8
  import "package:only_bible_app/navigation.dart";
12
9
  import "package:only_bible_app/store/state.dart";
10
+ import "package:only_bible_app/utils.dart";
13
11
 
14
12
  void main() async {
15
- WidgetsBinding widgetsBinding = WidgetsFlutterBinding.ensureInitialized();
16
- await Firebase.initializeApp(
17
- options: DefaultFirebaseOptions.currentPlatform,
18
- );
19
13
  FlutterError.onError = (errorDetails) {
20
14
  FlutterError.presentError(errorDetails);
21
- FirebaseCrashlytics.instance.recordFlutterError(errorDetails);
15
+ recordError(errorDetails.exception.toString(), errorDetails.stack);
22
16
  };
23
17
  PlatformDispatcher.instance.onError = (error, stack) {
24
- FirebaseCrashlytics.instance.recordError(error, stack);
18
+ recordError(error.toString(), stack);
25
19
  return true;
26
20
  };
27
- FlutterNativeSplash.preserve(widgetsBinding: widgetsBinding);
21
+ FlutterNativeSplash.preserve(
22
+ widgetsBinding: WidgetsFlutterBinding.ensureInitialized(),
23
+ );
28
24
  usePathUrlStrategy();
29
25
  await dotenv.load(fileName: ".env");
30
26
  AzureTts.init(
lib/store/state.dart CHANGED
@@ -1,5 +1,4 @@
1
1
  import "dart:developer";
2
- import "package:firebase_crashlytics/firebase_crashlytics.dart";
3
2
  import "package:flutter/material.dart";
4
3
  import "package:flutter/services.dart";
5
4
  import "package:get_storage/get_storage.dart";
@@ -281,7 +280,7 @@ onPlay(BuildContext context, Bible bible) async {
281
280
  await player.stop();
282
281
  } catch (err) {
283
282
  log("Could not play audio", name: "play", error: (err.toString(), pathname));
284
- FirebaseCrashlytics.instance.recordFlutterError(FlutterErrorDetails(exception: (err.toString(), pathname)));
283
+ recordError((err.toString(), pathname).toString(), null);
285
284
  if (context.mounted) {
286
285
  showError(context, context.l.audioError);
287
286
  }
lib/utils.dart CHANGED
@@ -1,10 +1,12 @@
1
1
  import "dart:convert";
2
+ import "package:flutter_dotenv/flutter_dotenv.dart";
3
+ import "package:http/http.dart" as http;
2
4
  import "package:flutter/services.dart";
3
5
  import "package:only_bible_app/dialog.dart";
4
6
  import "package:only_bible_app/models.dart";
5
7
  import "package:only_bible_app/store/state.dart";
6
8
  import "package:url_launcher/url_launcher.dart";
7
- import "package:flutter/foundation.dart" show defaultTargetPlatform, TargetPlatform;
9
+ import "package:flutter/foundation.dart" show TargetPlatform, defaultTargetPlatform, kDebugMode;
8
10
  import "package:flutter/material.dart";
9
11
  import "package:flutter_gen/gen_l10n/app_localizations.dart";
10
12
  import "package:flutter_azure_tts/flutter_azure_tts.dart";
@@ -40,7 +42,8 @@ extension AppContext on BuildContext {
40
42
  ? lookupAppLocalizations(const Locale("en"))
41
43
  : AppLocalizations.of(this)!;
42
44
 
45
+ AppLocalizations get currentLang =>
43
- AppLocalizations get currentLang => supportedLocalizations.firstWhere((el) => el.languageCode == languageCodeAtom.value);
46
+ supportedLocalizations.firstWhere((el) => el.languageCode == languageCodeAtom.value);
44
47
 
45
48
  double get actionsHeight {
46
49
  if (isIOS()) {
@@ -194,3 +197,31 @@ Future<Bible> loadBible(String name) async {
194
197
  );
195
198
  }
196
199
 
200
+ recordError(String message, StackTrace? stack) async {
201
+ if (kDebugMode) {
202
+ print("ERROR: $message");
203
+ print("ERROR STACK: ${stack.toString()}");
204
+ return;
205
+ }
206
+ await Future.delayed(Duration(seconds: 2));
207
+ final apiKey = dotenv.get("RESEND_API_KEY");
208
+ final url = Uri.https("api.resend.com", "/emails");
209
+ final response = await http.post(
210
+ url,
211
+ headers: {
212
+ "Authorization": "Bearer $apiKey",
213
+ "Content-Type": "application/json",
214
+ },
215
+ body: jsonEncode({
216
+ "from": "onboarding@resend.dev",
217
+ "to": "peter.john@sent.com",
218
+ "subject": "Error Stack trace",
219
+ "html":
220
+ "<div><p><strong>Error:</strong>$message</p><p><strong>StackTrace:</strong>${stack?.toString()}</p></div>",
221
+ }),
222
+ );
223
+ if (response.statusCode == 200) {
224
+ print("Response status: ${response.statusCode}");
225
+ print("Response body: ${response.body}");
226
+ }
227
+ }
macos/Runner/GoogleService-Info.plist DELETED
@@ -1,34 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
- <plist version="1.0">
4
- <dict>
5
- <key>CLIENT_ID</key>
6
- <string>584350822569-s9t1p0bb1gqj8fothe4s5lstvu9k7244.apps.googleusercontent.com</string>
7
- <key>REVERSED_CLIENT_ID</key>
8
- <string>com.googleusercontent.apps.584350822569-s9t1p0bb1gqj8fothe4s5lstvu9k7244</string>
9
- <key>API_KEY</key>
10
- <string>AIzaSyAqRrBRa3fVmoZby_b4submR2hjQkImgZc</string>
11
- <key>GCM_SENDER_ID</key>
12
- <string>584350822569</string>
13
- <key>PLIST_VERSION</key>
14
- <string>1</string>
15
- <key>BUNDLE_ID</key>
16
- <string>sh.pyros.onlyBibleApp.RunnerTests</string>
17
- <key>PROJECT_ID</key>
18
- <string>only-bible-app</string>
19
- <key>STORAGE_BUCKET</key>
20
- <string>only-bible-app.appspot.com</string>
21
- <key>IS_ADS_ENABLED</key>
22
- <false></false>
23
- <key>IS_ANALYTICS_ENABLED</key>
24
- <false></false>
25
- <key>IS_APPINVITE_ENABLED</key>
26
- <true></true>
27
- <key>IS_GCM_ENABLED</key>
28
- <true></true>
29
- <key>IS_SIGNIN_ENABLED</key>
30
- <true></true>
31
- <key>GOOGLE_APP_ID</key>
32
- <string>1:584350822569:ios:5d85f3e76fa02286fdf9b8</string>
33
- </dict>
34
- </plist>
pubspec.lock CHANGED
@@ -9,14 +9,6 @@ packages:
9
9
  url: "https://pub.dev"
10
10
  source: hosted
11
11
  version: "61.0.0"
12
- _flutterfire_internals:
13
- dependency: transitive
14
- description:
15
- name: _flutterfire_internals
16
- sha256: "5dce45a06d386358334eb1689108db6455d90ceb0d75848d5f4819283d4ee2b8"
17
- url: "https://pub.dev"
18
- source: hosted
19
- version: "1.3.4"
20
12
  analyzer:
21
13
  dependency: transitive
22
14
  description:
@@ -273,70 +265,6 @@ packages:
273
265
  url: "https://pub.dev"
274
266
  source: hosted
275
267
  version: "6.1.4"
276
- firebase_core:
277
- dependency: "direct main"
278
- description:
279
- name: firebase_core
280
- sha256: "2e9324f719e90200dc7d3c4f5d2abc26052f9f2b995d3b6626c47a0dfe1c8192"
281
- url: "https://pub.dev"
282
- source: hosted
283
- version: "2.15.0"
284
- firebase_core_platform_interface:
285
- dependency: transitive
286
- description:
287
- name: firebase_core_platform_interface
288
- sha256: b63e3be6c96ef5c33bdec1aab23c91eb00696f6452f0519401d640938c94cba2
289
- url: "https://pub.dev"
290
- source: hosted
291
- version: "4.8.0"
292
- firebase_core_web:
293
- dependency: transitive
294
- description:
295
- name: firebase_core_web
296
- sha256: "0fd5c4b228de29b55fac38aed0d9e42514b3d3bd47675de52bf7f8fccaf922fa"
297
- url: "https://pub.dev"
298
- source: hosted
299
- version: "2.6.0"
300
- firebase_crashlytics:
301
- dependency: "direct main"
302
- description:
303
- name: firebase_crashlytics
304
- sha256: "3607b46342537f98df18b130b6f5ab25cee6981a3a782e1a7b121d04dfea3caa"
305
- url: "https://pub.dev"
306
- source: hosted
307
- version: "3.3.4"
308
- firebase_crashlytics_platform_interface:
309
- dependency: transitive
310
- description:
311
- name: firebase_crashlytics_platform_interface
312
- sha256: c63abeb87b18f6e6d4bf6bb3977f15d2d9281a049d93fe098e83e56dcbf7da06
313
- url: "https://pub.dev"
314
- source: hosted
315
- version: "3.6.4"
316
- firebase_performance:
317
- dependency: "direct main"
318
- description:
319
- name: firebase_performance
320
- sha256: "86272e47beded7128bc2b8285670e78387728b20bd668a3c433bcb682e963e8f"
321
- url: "https://pub.dev"
322
- source: hosted
323
- version: "0.9.2+4"
324
- firebase_performance_platform_interface:
325
- dependency: transitive
326
- description:
327
- name: firebase_performance_platform_interface
328
- sha256: a296dba20e508ab8b8d1f424015a361e2129228e0335d67230c8fdb446637d19
329
- url: "https://pub.dev"
330
- source: hosted
331
- version: "0.1.4+4"
332
- firebase_performance_web:
333
- dependency: transitive
334
- description:
335
- name: firebase_performance_web
336
- sha256: "8eae9e19fd067ca30b66ebf8ea0b47bd70a9fce66cbb288620418fe01d58e1af"
337
- url: "https://pub.dev"
338
- source: hosted
339
- version: "0.1.4+4"
340
268
  fixnum:
341
269
  dependency: transitive
342
270
  description:
@@ -480,7 +408,7 @@ packages:
480
408
  source: hosted
481
409
  version: "0.15.4"
482
410
  http:
483
- dependency: transitive
411
+ dependency: "direct main"
484
412
  description:
485
413
  name: http
486
414
  sha256: "5895291c13fa8a3bd82e76d5627f69e0d85ca6a30dcac95c4ea19a5d555879c2"
pubspec.yaml CHANGED
@@ -22,9 +22,6 @@ dependencies:
22
22
  flutter_native_splash: ^2.3.1
23
23
  flutter_swipe_detector: ^2.0.0
24
24
  cupertino_icons: ^1.0.5
25
- firebase_core: ^2.15.0
26
- firebase_crashlytics: ^3.3.4
27
- firebase_performance: ^0.9.2+4
28
25
  settings_ui: ^2.0.2
29
26
  get_storage: ^2.1.1
30
27
  share_plus: ^7.1.0
@@ -33,6 +30,7 @@ dependencies:
33
30
  package_info_plus: ^4.1.0
34
31
  flutter_azure_tts: ^0.1.6
35
32
  flutter_dotenv: ^5.1.0
33
+ http: ^0.13.6
36
34
 
37
35
  dev_dependencies:
38
36
  flutter_test: