diff --git a/lib/providers/account.dart b/lib/providers/account.dart index 6801811..6a8cab2 100644 --- a/lib/providers/account.dart +++ b/lib/providers/account.dart @@ -43,7 +43,7 @@ class AccountProvider extends GetxController { } final AuthProvider auth = Get.find(); - if (!await auth.isAuthorized) throw Exception('unauthorized'); + auth.ensureCredentials(); if (auth.credentials == null) await auth.loadCredentials(); @@ -91,11 +91,11 @@ class AccountProvider extends GetxController { }, onDone: () { isConnected.value = false; - Future.delayed(const Duration(milliseconds: 1000), () => connect()); + Future.delayed(const Duration(seconds: 3), () => connect()); }, onError: (err) { isConnected.value = false; - Future.delayed(const Duration(milliseconds: 1000), () => connect()); + Future.delayed(const Duration(seconds: 3), () => connect()); }, ); } @@ -153,9 +153,7 @@ class AccountProvider extends GetxController { final AuthProvider auth = Get.find(); if (!await auth.isAuthorized) return; - final client = GetConnect(maxAuthRetries: 3); - client.httpClient.baseUrl = ServiceFinder.services['passport']; - client.httpClient.addAuthenticator(auth.requestAuthenticator); + final client = auth.configureClient(service: 'passport'); final resp = await client.get('/api/notifications?skip=0&take=100'); if (resp.statusCode == 200) { diff --git a/lib/providers/auth.dart b/lib/providers/auth.dart index d4da95d..192cd92 100644 --- a/lib/providers/auth.dart +++ b/lib/providers/auth.dart @@ -1,5 +1,6 @@ import 'dart:async'; import 'dart:convert'; +import 'dart:developer'; import 'package:flutter/material.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; @@ -49,17 +50,42 @@ class AuthProvider extends GetConnect { } Future> requestAuthenticator(Request request) async { - if (credentials != null && credentials!.isExpired) { - refreshCredentials(); - } - - if (credentials != null) { + try { + await ensureCredentials(); request.headers['Authorization'] = 'Bearer ${credentials!.accessToken}'; - } + } catch (_) {} return request; } + GetConnect configureClient({ + String? service, + timeout = const Duration(seconds: 5), + }) { + final client = GetConnect( + maxAuthRetries: 3, + timeout: timeout, + allowAutoSignedCert: true, + ); + client.httpClient.addAuthenticator(requestAuthenticator); + + if (service != null) { + client.httpClient.baseUrl = ServiceFinder.services[service]; + } + + return client; + } + + Future ensureCredentials() async { + if (!await isAuthorized) throw Exception('unauthorized'); + if (credentials == null) await loadCredentials(); + + if (credentials!.isExpired) { + await refreshCredentials(); + log("Refreshed credentials at ${DateTime.now()}"); + } + } + Future loadCredentials() async { if (await isAuthorized) { final content = await storage.read(key: 'auth_credentials'); @@ -124,9 +150,7 @@ class AuthProvider extends GetConnect { return _cachedUserProfileResponse!; } - final client = GetConnect(maxAuthRetries: 3); - client.httpClient.baseUrl = ServiceFinder.services['passport']; - client.httpClient.addAuthenticator(requestAuthenticator); + final client = configureClient(service: 'passport'); final resp = await client.get('/api/users/me'); if (resp.statusCode != 200) { diff --git a/lib/providers/chat.dart b/lib/providers/chat.dart index 5bea7f3..a5c1e96 100644 --- a/lib/providers/chat.dart +++ b/lib/providers/chat.dart @@ -24,9 +24,7 @@ class ChatProvider extends GetxController { } final AuthProvider auth = Get.find(); - if (!await auth.isAuthorized) throw Exception('unauthorized'); - - if (auth.credentials == null) await auth.loadCredentials(); + auth.ensureCredentials(); final uri = Uri.parse( '${ServiceFinder.services['messaging']}/api/ws?tk=${auth.credentials!.accessToken}' @@ -65,11 +63,11 @@ class ChatProvider extends GetxController { }, onDone: () { isConnected.value = false; - Future.delayed(const Duration(milliseconds: 1000), () => connect()); + Future.delayed(const Duration(seconds: 3), () => connect()); }, onError: (err) { isConnected.value = false; - Future.delayed(const Duration(milliseconds: 1000), () => connect()); + Future.delayed(const Duration(seconds: 3), () => connect()); }, ); } diff --git a/lib/providers/content/attachment.dart b/lib/providers/content/attachment.dart index 558dd97..372972b 100644 --- a/lib/providers/content/attachment.dart +++ b/lib/providers/content/attachment.dart @@ -50,12 +50,10 @@ class AttachmentProvider extends GetConnect { final AuthProvider auth = Get.find(); if (!await auth.isAuthorized) throw Exception('unauthorized'); - final client = GetConnect( - maxAuthRetries: 3, + final client = auth.configureClient( + service: 'paperclip', timeout: const Duration(minutes: 3), ); - client.httpClient.baseUrl = ServiceFinder.services['paperclip']; - client.httpClient.addAuthenticator(auth.requestAuthenticator); final filePayload = MultipartFile(await file.readAsBytes(), filename: basename(file.path)); @@ -99,9 +97,7 @@ class AttachmentProvider extends GetConnect { final AuthProvider auth = Get.find(); if (!await auth.isAuthorized) throw Exception('unauthorized'); - final client = GetConnect(maxAuthRetries: 3); - client.httpClient.baseUrl = ServiceFinder.services['paperclip']; - client.httpClient.addAuthenticator(auth.requestAuthenticator); + final client = auth.configureClient(service: 'paperclip'); var resp = await client.put('/api/attachments/$id', { 'metadata': { @@ -123,9 +119,7 @@ class AttachmentProvider extends GetConnect { final AuthProvider auth = Get.find(); if (!await auth.isAuthorized) throw Exception('unauthorized'); - final client = GetConnect(maxAuthRetries: 3); - client.httpClient.baseUrl = ServiceFinder.services['paperclip']; - client.httpClient.addAuthenticator(auth.requestAuthenticator); + final client = auth.configureClient(service: 'paperclip'); var resp = await client.delete('/api/attachments/$id'); if (resp.statusCode != 200) { diff --git a/lib/providers/content/call.dart b/lib/providers/content/call.dart index 48545be..42e4f0b 100644 --- a/lib/providers/content/call.dart +++ b/lib/providers/content/call.dart @@ -9,7 +9,6 @@ import 'package:solian/models/call.dart'; import 'package:solian/models/channel.dart'; import 'package:solian/providers/auth.dart'; import 'package:solian/screens/channel/call/call.dart'; -import 'package:solian/services.dart'; import 'package:wakelock_plus/wakelock_plus.dart'; class ChatCallProvider extends GetxController { @@ -64,9 +63,7 @@ class ChatCallProvider extends GetxController { final AuthProvider auth = Get.find(); if (!await auth.isAuthorized) throw Exception('unauthorized'); - final client = GetConnect(maxAuthRetries: 3); - client.httpClient.baseUrl = ServiceFinder.services['messaging']; - client.httpClient.addAuthenticator(auth.requestAuthenticator); + final client = auth.configureClient(service: 'messaging'); final resp = await client.post( '/api/channels/global/${channel.value!.alias}/calls/ongoing/token', diff --git a/lib/providers/content/channel.dart b/lib/providers/content/channel.dart index b54e522..ce96d77 100644 --- a/lib/providers/content/channel.dart +++ b/lib/providers/content/channel.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:solian/providers/auth.dart'; -import 'package:solian/services.dart'; import 'package:solian/widgets/account/friend_select.dart'; import 'package:uuid/uuid.dart'; @@ -10,8 +9,7 @@ class ChannelProvider extends GetxController { final AuthProvider auth = Get.find(); if (!await auth.isAuthorized) throw Exception('unauthorized'); - final client = GetConnect(maxAuthRetries: 3); - client.httpClient.baseUrl = ServiceFinder.services['messaging']; + final client = auth.configureClient(service: 'messaging'); final resp = await client.get('/api/channels/$realm/$alias'); if (resp.statusCode != 200) { @@ -26,8 +24,7 @@ class ChannelProvider extends GetxController { final AuthProvider auth = Get.find(); if (!await auth.isAuthorized) throw Exception('unauthorized'); - final client = GetConnect(maxAuthRetries: 3); - client.httpClient.baseUrl = ServiceFinder.services['messaging']; + final client = auth.configureClient(service: 'messaging'); final resp = await client.get('/api/channels/$realm/$alias/calls/ongoing'); if (resp.statusCode == 404) { @@ -43,9 +40,7 @@ class ChannelProvider extends GetxController { final AuthProvider auth = Get.find(); if (!await auth.isAuthorized) throw Exception('unauthorized'); - final client = GetConnect(maxAuthRetries: 3); - client.httpClient.baseUrl = ServiceFinder.services['messaging']; - client.httpClient.addAuthenticator(auth.requestAuthenticator); + final client = auth.configureClient(service: 'messaging'); final resp = await client.get('/api/channels/$scope'); if (resp.statusCode != 200) { @@ -59,9 +54,7 @@ class ChannelProvider extends GetxController { final AuthProvider auth = Get.find(); if (!await auth.isAuthorized) throw Exception('unauthorized'); - final client = GetConnect(maxAuthRetries: 3); - client.httpClient.baseUrl = ServiceFinder.services['messaging']; - client.httpClient.addAuthenticator(auth.requestAuthenticator); + final client = auth.configureClient(service: 'messaging'); final resp = await client.get('/api/channels/$realm/me/available'); if (resp.statusCode != 200) { @@ -75,9 +68,7 @@ class ChannelProvider extends GetxController { final AuthProvider auth = Get.find(); if (!await auth.isAuthorized) throw Exception('unauthorized'); - final client = GetConnect(maxAuthRetries: 3); - client.httpClient.baseUrl = ServiceFinder.services['messaging']; - client.httpClient.addAuthenticator(auth.requestAuthenticator); + final client = auth.configureClient(service: 'messaging'); final resp = await client.post('/api/channels/$scope', payload); if (resp.statusCode != 200) { @@ -102,9 +93,7 @@ class ChannelProvider extends GetxController { if (related == null) return null; final prof = await auth.getProfile(); - final client = GetConnect(maxAuthRetries: 3); - client.httpClient.baseUrl = ServiceFinder.services['messaging']; - client.httpClient.addAuthenticator(auth.requestAuthenticator); + final client = auth.configureClient(service: 'messaging'); final resp = await client.post('/api/channels/$scope/dm', { 'alias': const Uuid().v4().replaceAll('-', '').substring(0, 12), @@ -125,9 +114,7 @@ class ChannelProvider extends GetxController { final AuthProvider auth = Get.find(); if (!await auth.isAuthorized) throw Exception('unauthorized'); - final client = GetConnect(maxAuthRetries: 3); - client.httpClient.baseUrl = ServiceFinder.services['messaging']; - client.httpClient.addAuthenticator(auth.requestAuthenticator); + final client = auth.configureClient(service: 'messaging'); final resp = await client.put('/api/channels/$scope/$id', payload); if (resp.statusCode != 200) { diff --git a/lib/providers/content/realm.dart b/lib/providers/content/realm.dart index f0a30e4..b140f68 100644 --- a/lib/providers/content/realm.dart +++ b/lib/providers/content/realm.dart @@ -1,14 +1,12 @@ import 'package:get/get.dart'; import 'package:solian/providers/auth.dart'; -import 'package:solian/services.dart'; class RealmProvider extends GetxController { Future getRealm(String alias) async { final AuthProvider auth = Get.find(); if (!await auth.isAuthorized) throw Exception('unauthorized'); - final client = GetConnect(maxAuthRetries: 3); - client.httpClient.baseUrl = ServiceFinder.services['passport']; + final client = auth.configureClient(service: 'passport'); final resp = await client.get('/api/realms/$alias'); if (resp.statusCode != 200) { @@ -22,9 +20,7 @@ class RealmProvider extends GetxController { final AuthProvider auth = Get.find(); if (!await auth.isAuthorized) throw Exception('unauthorized'); - final client = GetConnect(maxAuthRetries: 3); - client.httpClient.baseUrl = ServiceFinder.services['passport']; - client.httpClient.addAuthenticator(auth.requestAuthenticator); + final client = auth.configureClient(service: 'passport'); final resp = await client.get('/api/realms/me/available'); if (resp.statusCode != 200) { diff --git a/lib/screens/account/notification.dart b/lib/screens/account/notification.dart index 1e10f20..30b3d83 100644 --- a/lib/screens/account/notification.dart +++ b/lib/screens/account/notification.dart @@ -3,7 +3,6 @@ import 'package:flutter_animate/flutter_animate.dart'; import 'package:get/get.dart'; import 'package:solian/providers/account.dart'; import 'package:solian/providers/auth.dart'; -import 'package:solian/services.dart'; import 'package:solian/models/notification.dart' as notify; import 'package:url_launcher/url_launcher_string.dart'; import 'package:uuid/uuid.dart'; @@ -33,9 +32,7 @@ class _NotificationScreenState extends State { } if (markList.isNotEmpty) { - final client = GetConnect(maxAuthRetries: 3); - client.httpClient.baseUrl = ServiceFinder.services['passport']; - client.httpClient.addAuthenticator(auth.requestAuthenticator); + final client = auth.configureClient(service: 'passport'); await client.put('/api/notifications/batch/read', {'messages': markList}); } @@ -58,9 +55,7 @@ class _NotificationScreenState extends State { setState(() => _isBusy = true); - final client = GetConnect(maxAuthRetries: 3); - client.httpClient.baseUrl = ServiceFinder.services['passport']; - client.httpClient.addAuthenticator(auth.requestAuthenticator); + final client = auth.configureClient(service: 'passport'); await client.put('/api/notifications/${element.id}/read', {}); diff --git a/lib/screens/account/personalize.dart b/lib/screens/account/personalize.dart index 7048540..e9e5512 100644 --- a/lib/screens/account/personalize.dart +++ b/lib/screens/account/personalize.dart @@ -98,9 +98,7 @@ class _PersonalizeScreenState extends State { context.showErrorDialog(e); } - final client = GetConnect(maxAuthRetries: 3); - client.httpClient.baseUrl = ServiceFinder.services['passport']; - client.httpClient.addAuthenticator(auth.requestAuthenticator); + final client = auth.configureClient(service: 'passport'); final resp = await client.put( '/api/users/me/$position', @@ -122,9 +120,7 @@ class _PersonalizeScreenState extends State { setState(() => _isBusy = true); - final client = GetConnect(maxAuthRetries: 3); - client.httpClient.baseUrl = ServiceFinder.services['passport']; - client.httpClient.addAuthenticator(auth.requestAuthenticator); + final client = auth.configureClient(service: 'passport'); _birthday?.toIso8601String(); final resp = await client.put( diff --git a/lib/screens/auth/signup.dart b/lib/screens/auth/signup.dart index fd6326a..062d355 100644 --- a/lib/screens/auth/signup.dart +++ b/lib/screens/auth/signup.dart @@ -27,8 +27,8 @@ class _SignUpPopupState extends State { nickname.isEmpty || password.isEmpty) return; - final client = GetConnect(maxAuthRetries: 3); - client.httpClient.baseUrl = ServiceFinder.services['passport']; + final client = ServiceFinder.configureClient('passport'); + final resp = await client.post('/api/users', { 'name': username, 'nick': nickname, diff --git a/lib/screens/channel/channel_chat.dart b/lib/screens/channel/channel_chat.dart index 53e8f61..71a8ec1 100644 --- a/lib/screens/channel/channel_chat.dart +++ b/lib/screens/channel/channel_chat.dart @@ -15,7 +15,6 @@ import 'package:solian/providers/chat.dart'; import 'package:solian/providers/content/call.dart'; import 'package:solian/providers/content/channel.dart'; import 'package:solian/router.dart'; -import 'package:solian/services.dart'; import 'package:solian/theme.dart'; import 'package:solian/widgets/chat/call/call_prejoin.dart'; import 'package:solian/widgets/chat/call/chat_call_action.dart'; @@ -103,9 +102,7 @@ class _ChannelChatScreenState extends State { final AuthProvider auth = Get.find(); if (!await auth.isAuthorized) return; - final client = GetConnect(maxAuthRetries: 3); - client.httpClient.baseUrl = ServiceFinder.services['messaging']; - client.httpClient.addAuthenticator(auth.requestAuthenticator); + final client = auth.configureClient(service: 'messaging'); final resp = await client.get( '/api/channels/${widget.realm}/${widget.alias}/messages?take=10&offset=$pageKey'); diff --git a/lib/screens/channel/channel_organize.dart b/lib/screens/channel/channel_organize.dart index de00bf8..cd7e873 100644 --- a/lib/screens/channel/channel_organize.dart +++ b/lib/screens/channel/channel_organize.dart @@ -7,7 +7,6 @@ import 'package:solian/models/realm.dart'; import 'package:solian/providers/auth.dart'; import 'package:solian/providers/content/channel.dart'; import 'package:solian/router.dart'; -import 'package:solian/services.dart'; import 'package:solian/widgets/prev_page.dart'; import 'package:uuid/uuid.dart'; @@ -47,10 +46,6 @@ class _ChannelOrganizeScreenState extends State { final ChannelProvider provider = Get.find(); - final client = GetConnect(maxAuthRetries: 3); - client.httpClient.baseUrl = ServiceFinder.services['messaging']; - client.httpClient.addAuthenticator(auth.requestAuthenticator); - final scope = widget.realm != null ? widget.realm!.alias : 'global'; final payload = { 'alias': _aliasController.value.text.toLowerCase(), diff --git a/lib/screens/posts/post_publish.dart b/lib/screens/posts/post_publish.dart index 8b87621..df3b73e 100644 --- a/lib/screens/posts/post_publish.dart +++ b/lib/screens/posts/post_publish.dart @@ -7,7 +7,6 @@ import 'package:solian/models/post.dart'; import 'package:solian/models/realm.dart'; import 'package:solian/providers/auth.dart'; import 'package:solian/router.dart'; -import 'package:solian/services.dart'; import 'package:solian/widgets/account/account_avatar.dart'; import 'package:solian/widgets/attachments/attachment_publish.dart'; import 'package:solian/widgets/posts/post_item.dart'; @@ -65,9 +64,7 @@ class _PostPublishingScreenState extends State { setState(() => _isBusy = true); - final client = GetConnect(maxAuthRetries: 3); - client.httpClient.baseUrl = ServiceFinder.services['interactive']; - client.httpClient.addAuthenticator(auth.requestAuthenticator); + final client = auth.configureClient(service: 'interactive'); final payload = { 'content': _contentController.value.text, diff --git a/lib/screens/realms/realm_organize.dart b/lib/screens/realms/realm_organize.dart index a622745..c7f1d42 100644 --- a/lib/screens/realms/realm_organize.dart +++ b/lib/screens/realms/realm_organize.dart @@ -5,7 +5,6 @@ import 'package:solian/exts.dart'; import 'package:solian/models/realm.dart'; import 'package:solian/providers/auth.dart'; import 'package:solian/router.dart'; -import 'package:solian/services.dart'; import 'package:solian/widgets/prev_page.dart'; import 'package:uuid/uuid.dart'; @@ -42,9 +41,7 @@ class _RealmOrganizeScreenState extends State { setState(() => _isBusy = true); - final client = GetConnect(maxAuthRetries: 3); - client.httpClient.baseUrl = ServiceFinder.services['passport']; - client.httpClient.addAuthenticator(auth.requestAuthenticator); + final client = auth.configureClient(service: 'passport'); final payload = { 'alias': _aliasController.value.text.toLowerCase(), diff --git a/lib/services.dart b/lib/services.dart index 2211ecc..3579500 100644 --- a/lib/services.dart +++ b/lib/services.dart @@ -1,3 +1,5 @@ +import 'package:get/get.dart'; + abstract class ServiceFinder { static const bool devFlag = false; @@ -9,4 +11,12 @@ abstract class ServiceFinder { devFlag ? 'http://localhost:8445' : 'https://co.solsynth.dev', 'messaging': devFlag ? 'http://localhost:8447' : 'https://im.solsynth.dev', }; + + static GetConnect configureClient(String service, + {timeout = const Duration(seconds: 5)}) { + final client = GetConnect(timeout: timeout, allowAutoSignedCert: true); + client.httpClient.baseUrl = ServiceFinder.services[service]; + + return client; + } } diff --git a/lib/widgets/account/account_profile_popup.dart b/lib/widgets/account/account_profile_popup.dart index ec0d1fa..6da8135 100644 --- a/lib/widgets/account/account_profile_popup.dart +++ b/lib/widgets/account/account_profile_popup.dart @@ -22,7 +22,7 @@ class _AccountProfilePopupState extends State { void getUserinfo() async { setState(() => _isBusy = true); - final client = GetConnect(maxAuthRetries: 3); + final client = GetConnect(); client.httpClient.baseUrl = ServiceFinder.services['passport']; final resp = await client.get('/api/users/${widget.account.name}'); diff --git a/lib/widgets/channel/channel_deletion.dart b/lib/widgets/channel/channel_deletion.dart index 7f956a5..2617325 100644 --- a/lib/widgets/channel/channel_deletion.dart +++ b/lib/widgets/channel/channel_deletion.dart @@ -3,7 +3,6 @@ import 'package:get/get.dart'; import 'package:solian/exts.dart'; import 'package:solian/models/channel.dart'; import 'package:solian/providers/auth.dart'; -import 'package:solian/services.dart'; class ChannelDeletionDialog extends StatefulWidget { final Channel channel; @@ -30,9 +29,7 @@ class _ChannelDeletionDialogState extends State { setState(() => _isBusy = true); - final client = GetConnect(maxAuthRetries: 3); - client.httpClient.baseUrl = ServiceFinder.services['messaging']; - client.httpClient.addAuthenticator(auth.requestAuthenticator); + final client = auth.configureClient(service: 'messaging'); final resp = await client .delete('/api/channels/${widget.realm}/${widget.channel.id}'); @@ -51,9 +48,7 @@ class _ChannelDeletionDialogState extends State { setState(() => _isBusy = true); - final client = GetConnect(maxAuthRetries: 3); - client.httpClient.baseUrl = ServiceFinder.services['messaging']; - client.httpClient.addAuthenticator(auth.requestAuthenticator); + final client = auth.configureClient(service: 'messaging'); final resp = await client.delete( '/api/channels/${widget.realm}/${widget.channel.alias}/members/me', diff --git a/lib/widgets/channel/channel_member.dart b/lib/widgets/channel/channel_member.dart index 1fbc31e..970c45a 100644 --- a/lib/widgets/channel/channel_member.dart +++ b/lib/widgets/channel/channel_member.dart @@ -39,8 +39,7 @@ class _ChannelMemberListPopupState extends State { void getMembers() async { setState(() => _isBusy = true); - final client = GetConnect(maxAuthRetries: 3); - client.httpClient.baseUrl = ServiceFinder.services['messaging']; + final client = ServiceFinder.configureClient('messaging'); final resp = await client .get('/api/channels/${widget.realm}/${widget.channel.alias}/members'); @@ -76,9 +75,7 @@ class _ChannelMemberListPopupState extends State { setState(() => _isBusy = true); - final client = GetConnect(maxAuthRetries: 3); - client.httpClient.baseUrl = ServiceFinder.services['messaging']; - client.httpClient.addAuthenticator(auth.requestAuthenticator); + final client = auth.configureClient(service: 'messaging'); final resp = await client.post( '/api/channels/${widget.realm}/${widget.channel.alias}/members', @@ -99,9 +96,7 @@ class _ChannelMemberListPopupState extends State { setState(() => _isBusy = true); - final client = GetConnect(maxAuthRetries: 3); - client.httpClient.baseUrl = ServiceFinder.services['messaging']; - client.httpClient.addAuthenticator(auth.requestAuthenticator); + final client = auth.configureClient(service: 'messaging'); final resp = await client.request( '/api/channels/${widget.realm}/${widget.channel.alias}/members', diff --git a/lib/widgets/chat/call/chat_call_action.dart b/lib/widgets/chat/call/chat_call_action.dart index 591a91f..8f28f39 100644 --- a/lib/widgets/chat/call/chat_call_action.dart +++ b/lib/widgets/chat/call/chat_call_action.dart @@ -5,7 +5,6 @@ import 'package:solian/models/call.dart'; import 'package:solian/models/channel.dart'; import 'package:solian/models/realm.dart'; import 'package:solian/providers/auth.dart'; -import 'package:solian/services.dart'; class ChatCallButton extends StatefulWidget { final Realm? realm; @@ -34,9 +33,7 @@ class _ChatCallButtonState extends State { final AuthProvider auth = Get.find(); if (!await auth.isAuthorized) return; - final client = GetConnect(maxAuthRetries: 3); - client.httpClient.baseUrl = ServiceFinder.services['messaging']; - client.httpClient.addAuthenticator(auth.requestAuthenticator); + final client = auth.configureClient(service: 'messaging'); setState(() => _isBusy = true); @@ -60,9 +57,7 @@ class _ChatCallButtonState extends State { final AuthProvider auth = Get.find(); if (!await auth.isAuthorized) return; - final client = GetConnect(maxAuthRetries: 3); - client.httpClient.baseUrl = ServiceFinder.services['messaging']; - client.httpClient.addAuthenticator(auth.requestAuthenticator); + final client = auth.configureClient(service: 'messaging'); setState(() => _isBusy = true); diff --git a/lib/widgets/chat/chat_message_deletion.dart b/lib/widgets/chat/chat_message_deletion.dart index 958f39d..19cd12f 100644 --- a/lib/widgets/chat/chat_message_deletion.dart +++ b/lib/widgets/chat/chat_message_deletion.dart @@ -5,7 +5,6 @@ import 'package:solian/models/channel.dart'; import 'package:solian/models/message.dart'; import 'package:solian/models/realm.dart'; import 'package:solian/providers/auth.dart'; -import 'package:solian/services.dart'; class ChatMessageDeletionDialog extends StatefulWidget { final Channel channel; @@ -31,9 +30,7 @@ class _ChatMessageDeletionDialogState extends State { final AuthProvider auth = Get.find(); if (!await auth.isAuthorized) return; - final client = GetConnect(maxAuthRetries: 3); - client.httpClient.baseUrl = ServiceFinder.services['messaging']; - client.httpClient.addAuthenticator(auth.requestAuthenticator); + final client = auth.configureClient(service: 'messaging'); setState(() => _isBusy = true); diff --git a/lib/widgets/chat/chat_message_input.dart b/lib/widgets/chat/chat_message_input.dart index 847fc4d..0f1718a 100644 --- a/lib/widgets/chat/chat_message_input.dart +++ b/lib/widgets/chat/chat_message_input.dart @@ -6,7 +6,6 @@ import 'package:solian/models/account.dart'; import 'package:solian/models/channel.dart'; import 'package:solian/models/message.dart'; import 'package:solian/providers/auth.dart'; -import 'package:solian/services.dart'; import 'package:solian/widgets/attachments/attachment_publish.dart'; import 'package:solian/widgets/chat/chat_message.dart'; import 'package:uuid/uuid.dart'; @@ -70,9 +69,7 @@ class _ChatMessageInputState extends State { final prof = await auth.getProfile(); if (!await auth.isAuthorized) return; - final client = GetConnect(maxAuthRetries: 3); - client.httpClient.baseUrl = ServiceFinder.services['messaging']; - client.httpClient.addAuthenticator(auth.requestAuthenticator); + final client = auth.configureClient(service: 'messaging'); final payload = { 'uuid': const Uuid().v4(), diff --git a/lib/widgets/current_state_action.dart b/lib/widgets/current_state_action.dart index 8dc5978..2252510 100644 --- a/lib/widgets/current_state_action.dart +++ b/lib/widgets/current_state_action.dart @@ -29,9 +29,9 @@ class BackgroundStateWidget extends StatelessWidget { ].join('\n'), icon: const Icon(Icons.wifi_off) .animate(onPlay: (c) => c.repeat()) - .fadeIn(duration: 500.ms) + .fadeIn(duration: 800.ms) .then() - .fadeOut(duration: 500.ms), + .fadeOut(duration: 800.ms), onPressed: () { if (account.isConnected.isFalse) account.connect(); if (chat.isConnected.isFalse) chat.connect(); diff --git a/lib/widgets/posts/post_action.dart b/lib/widgets/posts/post_action.dart index dbb1bee..ebba45b 100644 --- a/lib/widgets/posts/post_action.dart +++ b/lib/widgets/posts/post_action.dart @@ -9,7 +9,6 @@ import 'package:solian/models/post.dart'; import 'package:solian/providers/auth.dart'; import 'package:solian/router.dart'; import 'package:solian/screens/posts/post_publish.dart'; -import 'package:solian/services.dart'; class PostAction extends StatefulWidget { final Post item; @@ -154,9 +153,7 @@ class _PostDeletionDialogState extends State { final AuthProvider auth = Get.find(); if (!await auth.isAuthorized) return; - final client = GetConnect(maxAuthRetries: 3); - client.httpClient.baseUrl = ServiceFinder.services['interactive']; - client.httpClient.addAuthenticator(auth.requestAuthenticator); + final client = auth.configureClient(service: 'interactive'); setState(() => _isBusy = true); final resp = await client.delete('/api/posts/${widget.item.id}'); diff --git a/lib/widgets/posts/post_quick_action.dart b/lib/widgets/posts/post_quick_action.dart index 43031da..bfa88be 100644 --- a/lib/widgets/posts/post_quick_action.dart +++ b/lib/widgets/posts/post_quick_action.dart @@ -4,7 +4,6 @@ import 'package:solian/exts.dart'; import 'package:solian/models/post.dart'; import 'package:solian/models/reaction.dart'; import 'package:solian/providers/auth.dart'; -import 'package:solian/services.dart'; import 'package:solian/widgets/posts/post_reaction.dart'; import 'package:solian/widgets/posts/post_replies.dart'; @@ -51,9 +50,7 @@ class _PostQuickActionState extends State { if (_isSubmitting) return; if (!await auth.isAuthorized) return; - final client = GetConnect(maxAuthRetries: 3); - client.httpClient.baseUrl = ServiceFinder.services['interactive']; - client.httpClient.addAuthenticator(auth.requestAuthenticator); + final client = auth.configureClient(service: 'interactive'); setState(() => _isSubmitting = true); diff --git a/lib/widgets/realms/realm_deletion.dart b/lib/widgets/realms/realm_deletion.dart index 5e7db46..13016f2 100644 --- a/lib/widgets/realms/realm_deletion.dart +++ b/lib/widgets/realms/realm_deletion.dart @@ -3,7 +3,6 @@ import 'package:get/get.dart'; import 'package:solian/exts.dart'; import 'package:solian/models/realm.dart'; import 'package:solian/providers/auth.dart'; -import 'package:solian/services.dart'; class RealmDeletionDialog extends StatefulWidget { final Realm realm; @@ -22,15 +21,13 @@ class RealmDeletionDialog extends StatefulWidget { class _RealmDeletionDialogState extends State { bool _isBusy = false; - Future deleteChannel() async { + Future deleteRealm() async { final AuthProvider auth = Get.find(); if (!await auth.isAuthorized) return; setState(() => _isBusy = true); - final client = GetConnect(maxAuthRetries: 3); - client.httpClient.baseUrl = ServiceFinder.services['passport']; - client.httpClient.addAuthenticator(auth.requestAuthenticator); + final client = auth.configureClient(service: 'passport'); final resp = await client.delete('/api/realms/${widget.realm.id}'); if (resp.statusCode != 200) { @@ -42,15 +39,13 @@ class _RealmDeletionDialogState extends State { setState(() => _isBusy = false); } - Future leaveChannel() async { + Future leaveRealm() async { final AuthProvider auth = Get.find(); if (!await auth.isAuthorized) return; setState(() => _isBusy = true); - final client = GetConnect(maxAuthRetries: 3); - client.httpClient.baseUrl = ServiceFinder.services['passport']; - client.httpClient.addAuthenticator(auth.requestAuthenticator); + final client = auth.configureClient(service: 'passport'); final resp = await client.delete('/api/realms/${widget.realm.id}/members/me'); @@ -80,8 +75,8 @@ class _RealmDeletionDialogState extends State { onPressed: _isBusy ? null : widget.isOwned - ? deleteChannel - : leaveChannel, + ? deleteRealm + : leaveRealm, child: Text('confirm'.tr), ), ], diff --git a/lib/widgets/realms/realm_member.dart b/lib/widgets/realms/realm_member.dart index 3d8d386..21c3d10 100644 --- a/lib/widgets/realms/realm_member.dart +++ b/lib/widgets/realms/realm_member.dart @@ -37,8 +37,7 @@ class _RealmMemberListPopupState extends State { void getMembers() async { setState(() => _isBusy = true); - final client = GetConnect(maxAuthRetries: 3); - client.httpClient.baseUrl = ServiceFinder.services['passport']; + final client = ServiceFinder.configureClient('passport'); final resp = await client.get('/api/realms/${widget.realm.alias}/members'); if (resp.statusCode == 200) { @@ -73,9 +72,7 @@ class _RealmMemberListPopupState extends State { setState(() => _isBusy = true); - final client = GetConnect(maxAuthRetries: 3); - client.httpClient.baseUrl = ServiceFinder.services['passport']; - client.httpClient.addAuthenticator(auth.requestAuthenticator); + final client = auth.configureClient(service: 'passport'); final resp = await client.post( '/api/realms/${widget.realm.alias}/members', @@ -96,9 +93,7 @@ class _RealmMemberListPopupState extends State { setState(() => _isBusy = true); - final client = GetConnect(maxAuthRetries: 3); - client.httpClient.baseUrl = ServiceFinder.services['passport']; - client.httpClient.addAuthenticator(auth.requestAuthenticator); + final client = auth.configureClient(service: 'passport'); final resp = await client.request( '/api/realms/${widget.realm.alias}/members',