From 0dd3221a5670921c2b715c0ef982d89811e8b0fb Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Tue, 2 Sep 2025 00:36:06 +0800 Subject: [PATCH] :bug: Fix oidc on web close #175 --- lib/screens/account/me/account_settings.dart | 60 ++++----------- .../account/me/settings_connections.dart | 37 +++++---- lib/screens/auth/login.dart | 75 ++++++++++--------- pubspec.lock | 20 ++--- 4 files changed, 85 insertions(+), 107 deletions(-) diff --git a/lib/screens/account/me/account_settings.dart b/lib/screens/account/me/account_settings.dart index 1aa71651..c736188a 100644 --- a/lib/screens/account/me/account_settings.dart +++ b/lib/screens/account/me/account_settings.dart @@ -14,7 +14,6 @@ import 'package:island/screens/account/me/settings_connections.dart'; import 'package:island/screens/account/me/settings_contacts.dart'; import 'package:island/screens/auth/captcha.dart'; import 'package:island/screens/auth/login.dart'; -import 'package:island/services/responsive.dart'; import 'package:island/widgets/account/account_devices.dart'; import 'package:island/widgets/alert.dart'; import 'package:island/widgets/app_scaffold.dart'; @@ -57,7 +56,6 @@ class AccountSettingsScreen extends HookConsumerWidget { Widget build(BuildContext context, WidgetRef ref) { final isDesktop = !kIsWeb && (Platform.isWindows || Platform.isMacOS || Platform.isLinux); - final isWide = isWideScreen(context); Future requestAccountDeletion() async { final confirm = await showConfirmAlert( @@ -440,51 +438,19 @@ class AccountSettingsScreen extends HookConsumerWidget { // Create a responsive layout based on screen width Widget buildSettingsList() { - if (isWide) { - // Two-column layout for wide screens - return Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - _SettingsSection( - title: 'accountSecurityTitle', - children: securitySettings, - ), - ], - ), - ), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - _SettingsSection( - title: 'accountDangerZoneTitle', - children: dangerZoneSettings, - ), - ], - ), - ), - ], - ); - } else { - // Single column layout for narrow screens - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - _SettingsSection( - title: 'accountSecurityTitle', - children: securitySettings, - ), - _SettingsSection( - title: 'accountDangerZoneTitle', - children: dangerZoneSettings, - ), - ], - ); - } + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _SettingsSection( + title: 'accountSecurityTitle', + children: securitySettings, + ), + _SettingsSection( + title: 'accountDangerZoneTitle', + children: dangerZoneSettings, + ), + ], + ); } return AppScaffold( diff --git a/lib/screens/account/me/settings_connections.dart b/lib/screens/account/me/settings_connections.dart index 3865863f..383ac7e3 100644 --- a/lib/screens/account/me/settings_connections.dart +++ b/lib/screens/account/me/settings_connections.dart @@ -1,10 +1,12 @@ import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:gap/gap.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:island/models/auth.dart'; +import 'package:island/pods/config.dart'; import 'package:island/pods/network.dart'; import 'package:island/screens/account/me/account_settings.dart'; import 'package:island/screens/auth/oidc.native.dart'; @@ -16,6 +18,7 @@ import 'package:island/widgets/response.dart'; import 'package:material_symbols_icons/symbols.dart'; import 'package:sign_in_with_apple/sign_in_with_apple.dart'; import 'package:styled_widget/styled_widget.dart'; +import 'package:url_launcher/url_launcher_string.dart'; // Helper function to get provider icon and localized name Widget getProviderIcon(String provider, {double size = 24, Color? color}) { @@ -165,9 +168,7 @@ class AccountConnectionNewSheet extends HookConsumerWidget { scopes: [AppleIDAuthorizationScopes.email], webAuthenticationOptions: WebAuthenticationOptions( clientId: 'dev.solsynth.solarpass', - redirectUri: Uri.parse( - 'https://id.solian.app/auth/callback/apple', - ), + redirectUri: Uri.parse('https://id.solian.app/auth/callback'), ), ); @@ -195,17 +196,25 @@ class AccountConnectionNewSheet extends HookConsumerWidget { case 'github': case 'discord': case 'afdian': - await Navigator.of(context, rootNavigator: true).push( - MaterialPageRoute( - builder: - (context) => OidcScreen( - provider: selectedProvider.value.toLowerCase(), - title: - 'Connect with ${selectedProvider.value.capitalizeEachWord()}', - ), - ), - ); - if (context.mounted) Navigator.pop(context, true); + if (kIsWeb) { + final serverUrl = ref.watch(serverUrlProvider); + final accessToken = ref.watch(tokenProvider); + launchUrlString( + '$serverUrl/id/auth/login/${selectedProvider.value}?tk=${accessToken!.token}', + ); + } else { + await Navigator.of(context, rootNavigator: true).push( + MaterialPageRoute( + builder: + (context) => OidcScreen( + provider: selectedProvider.value.toLowerCase(), + title: + 'Connect with ${selectedProvider.value.capitalizeEachWord()}', + ), + ), + ); + if (context.mounted) Navigator.pop(context, true); + } break; default: showSnackBar('accountConnectionAddError'.tr()); diff --git a/lib/screens/auth/login.dart b/lib/screens/auth/login.dart index bb105fc4..1ad0b925 100644 --- a/lib/screens/auth/login.dart +++ b/lib/screens/auth/login.dart @@ -700,45 +700,48 @@ class _LoginLookupScreen extends HookConsumerWidget { onTapOutside: (_) => FocusManager.instance.primaryFocus?.unfocus(), onSubmitted: isBusy.value ? null : (_) => performNewTicket(), ).padding(horizontal: 7), - Row( - spacing: 6, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text("loginOr").tr().fontSize(11).opacity(0.85), - const Gap(8), - Spacer(), - IconButton.filledTonal( - onPressed: () => withOidc('github'), - padding: EdgeInsets.zero, - icon: getProviderIcon( - "github", - size: 16, - color: Theme.of(context).colorScheme.onPrimaryContainer, + if (!kIsWeb) + Row( + spacing: 6, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text("loginOr").tr().fontSize(11).opacity(0.85), + const Gap(8), + Spacer(), + IconButton.filledTonal( + onPressed: () => withOidc('github'), + padding: EdgeInsets.zero, + icon: getProviderIcon( + "github", + size: 16, + color: Theme.of(context).colorScheme.onPrimaryContainer, + ), + tooltip: 'GitHub', ), - tooltip: 'GitHub', - ), - IconButton.filledTonal( - onPressed: () => withOidc('google'), - padding: EdgeInsets.zero, - icon: getProviderIcon( - "google", - size: 16, - color: Theme.of(context).colorScheme.onPrimaryContainer, + IconButton.filledTonal( + onPressed: () => withOidc('google'), + padding: EdgeInsets.zero, + icon: getProviderIcon( + "google", + size: 16, + color: Theme.of(context).colorScheme.onPrimaryContainer, + ), + tooltip: 'Google', ), - tooltip: 'Google', - ), - IconButton.filledTonal( - onPressed: withApple, - padding: EdgeInsets.zero, - icon: getProviderIcon( - "apple", - size: 16, - color: Theme.of(context).colorScheme.onPrimaryContainer, + IconButton.filledTonal( + onPressed: withApple, + padding: EdgeInsets.zero, + icon: getProviderIcon( + "apple", + size: 16, + color: Theme.of(context).colorScheme.onPrimaryContainer, + ), + tooltip: 'Apple Account', ), - tooltip: 'Apple Account', - ), - ], - ).padding(horizontal: 8, vertical: 8), + ], + ).padding(horizontal: 8, vertical: 8) + else + const Gap(12), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ diff --git a/pubspec.lock b/pubspec.lock index 0f8af119..9a9e13f2 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1369,26 +1369,26 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "6bb818ecbdffe216e81182c2f0714a2e62b593f4a4f13098713ff1685dfb6ab0" + sha256: "8dcda04c3fc16c14f48a7bb586d4be1f0d1572731b6d81d51772ef47c02081e0" url: "https://pub.dev" source: hosted - version: "10.0.9" + version: "11.0.1" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 + sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" url: "https://pub.dev" source: hosted - version: "3.0.9" + version: "3.0.10" leak_tracker_testing: dependency: transitive description: name: leak_tracker_testing - sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.0.2" lint: dependency: transitive description: @@ -2406,10 +2406,10 @@ packages: dependency: transitive description: name: test_api - sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd + sha256: "522f00f556e73044315fa4585ec3270f1808a4b186c936e612cab0b565ff1e00" url: "https://pub.dev" source: hosted - version: "0.7.4" + version: "0.7.6" textfield_tags: dependency: "direct main" description: @@ -2592,10 +2592,10 @@ packages: dependency: transitive description: name: vector_math - sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b url: "https://pub.dev" source: hosted - version: "2.1.4" + version: "2.2.0" very_good_infinite_list: dependency: "direct main" description: