🐛 Fix oidc on web close #175

This commit is contained in:
2025-09-02 00:36:06 +08:00
parent 66918521f8
commit 0dd3221a56
4 changed files with 85 additions and 107 deletions

View File

@@ -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/account/me/settings_contacts.dart';
import 'package:island/screens/auth/captcha.dart'; import 'package:island/screens/auth/captcha.dart';
import 'package:island/screens/auth/login.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/account/account_devices.dart';
import 'package:island/widgets/alert.dart'; import 'package:island/widgets/alert.dart';
import 'package:island/widgets/app_scaffold.dart'; import 'package:island/widgets/app_scaffold.dart';
@@ -57,7 +56,6 @@ class AccountSettingsScreen extends HookConsumerWidget {
Widget build(BuildContext context, WidgetRef ref) { Widget build(BuildContext context, WidgetRef ref) {
final isDesktop = final isDesktop =
!kIsWeb && (Platform.isWindows || Platform.isMacOS || Platform.isLinux); !kIsWeb && (Platform.isWindows || Platform.isMacOS || Platform.isLinux);
final isWide = isWideScreen(context);
Future<void> requestAccountDeletion() async { Future<void> requestAccountDeletion() async {
final confirm = await showConfirmAlert( final confirm = await showConfirmAlert(
@@ -440,51 +438,19 @@ class AccountSettingsScreen extends HookConsumerWidget {
// Create a responsive layout based on screen width // Create a responsive layout based on screen width
Widget buildSettingsList() { Widget buildSettingsList() {
if (isWide) { return Column(
// Two-column layout for wide screens crossAxisAlignment: CrossAxisAlignment.start,
return Row( children: [
crossAxisAlignment: CrossAxisAlignment.start, _SettingsSection(
children: [ title: 'accountSecurityTitle',
Expanded( children: securitySettings,
child: Column( ),
crossAxisAlignment: CrossAxisAlignment.start, _SettingsSection(
children: [ title: 'accountDangerZoneTitle',
_SettingsSection( children: dangerZoneSettings,
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 AppScaffold( return AppScaffold(

View File

@@ -1,10 +1,12 @@
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_svg/flutter_svg.dart';
import 'package:gap/gap.dart'; import 'package:gap/gap.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:island/models/auth.dart'; import 'package:island/models/auth.dart';
import 'package:island/pods/config.dart';
import 'package:island/pods/network.dart'; import 'package:island/pods/network.dart';
import 'package:island/screens/account/me/account_settings.dart'; import 'package:island/screens/account/me/account_settings.dart';
import 'package:island/screens/auth/oidc.native.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:material_symbols_icons/symbols.dart';
import 'package:sign_in_with_apple/sign_in_with_apple.dart'; import 'package:sign_in_with_apple/sign_in_with_apple.dart';
import 'package:styled_widget/styled_widget.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 // Helper function to get provider icon and localized name
Widget getProviderIcon(String provider, {double size = 24, Color? color}) { Widget getProviderIcon(String provider, {double size = 24, Color? color}) {
@@ -165,9 +168,7 @@ class AccountConnectionNewSheet extends HookConsumerWidget {
scopes: [AppleIDAuthorizationScopes.email], scopes: [AppleIDAuthorizationScopes.email],
webAuthenticationOptions: WebAuthenticationOptions( webAuthenticationOptions: WebAuthenticationOptions(
clientId: 'dev.solsynth.solarpass', clientId: 'dev.solsynth.solarpass',
redirectUri: Uri.parse( redirectUri: Uri.parse('https://id.solian.app/auth/callback'),
'https://id.solian.app/auth/callback/apple',
),
), ),
); );
@@ -195,17 +196,25 @@ class AccountConnectionNewSheet extends HookConsumerWidget {
case 'github': case 'github':
case 'discord': case 'discord':
case 'afdian': case 'afdian':
await Navigator.of(context, rootNavigator: true).push( if (kIsWeb) {
MaterialPageRoute( final serverUrl = ref.watch(serverUrlProvider);
builder: final accessToken = ref.watch(tokenProvider);
(context) => OidcScreen( launchUrlString(
provider: selectedProvider.value.toLowerCase(), '$serverUrl/id/auth/login/${selectedProvider.value}?tk=${accessToken!.token}',
title: );
'Connect with ${selectedProvider.value.capitalizeEachWord()}', } else {
), await Navigator.of(context, rootNavigator: true).push(
), MaterialPageRoute(
); builder:
if (context.mounted) Navigator.pop(context, true); (context) => OidcScreen(
provider: selectedProvider.value.toLowerCase(),
title:
'Connect with ${selectedProvider.value.capitalizeEachWord()}',
),
),
);
if (context.mounted) Navigator.pop(context, true);
}
break; break;
default: default:
showSnackBar('accountConnectionAddError'.tr()); showSnackBar('accountConnectionAddError'.tr());

View File

@@ -700,45 +700,48 @@ class _LoginLookupScreen extends HookConsumerWidget {
onTapOutside: (_) => FocusManager.instance.primaryFocus?.unfocus(), onTapOutside: (_) => FocusManager.instance.primaryFocus?.unfocus(),
onSubmitted: isBusy.value ? null : (_) => performNewTicket(), onSubmitted: isBusy.value ? null : (_) => performNewTicket(),
).padding(horizontal: 7), ).padding(horizontal: 7),
Row( if (!kIsWeb)
spacing: 6, Row(
crossAxisAlignment: CrossAxisAlignment.center, spacing: 6,
children: <Widget>[ crossAxisAlignment: CrossAxisAlignment.center,
Text("loginOr").tr().fontSize(11).opacity(0.85), children: <Widget>[
const Gap(8), Text("loginOr").tr().fontSize(11).opacity(0.85),
Spacer(), const Gap(8),
IconButton.filledTonal( Spacer(),
onPressed: () => withOidc('github'), IconButton.filledTonal(
padding: EdgeInsets.zero, onPressed: () => withOidc('github'),
icon: getProviderIcon( padding: EdgeInsets.zero,
"github", icon: getProviderIcon(
size: 16, "github",
color: Theme.of(context).colorScheme.onPrimaryContainer, size: 16,
color: Theme.of(context).colorScheme.onPrimaryContainer,
),
tooltip: 'GitHub',
), ),
tooltip: 'GitHub', IconButton.filledTonal(
), onPressed: () => withOidc('google'),
IconButton.filledTonal( padding: EdgeInsets.zero,
onPressed: () => withOidc('google'), icon: getProviderIcon(
padding: EdgeInsets.zero, "google",
icon: getProviderIcon( size: 16,
"google", color: Theme.of(context).colorScheme.onPrimaryContainer,
size: 16, ),
color: Theme.of(context).colorScheme.onPrimaryContainer, tooltip: 'Google',
), ),
tooltip: 'Google', IconButton.filledTonal(
), onPressed: withApple,
IconButton.filledTonal( padding: EdgeInsets.zero,
onPressed: withApple, icon: getProviderIcon(
padding: EdgeInsets.zero, "apple",
icon: getProviderIcon( size: 16,
"apple", color: Theme.of(context).colorScheme.onPrimaryContainer,
size: 16, ),
color: Theme.of(context).colorScheme.onPrimaryContainer, tooltip: 'Apple Account',
), ),
tooltip: 'Apple Account', ],
), ).padding(horizontal: 8, vertical: 8)
], else
).padding(horizontal: 8, vertical: 8), const Gap(12),
Row( Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [

View File

@@ -1369,26 +1369,26 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: leak_tracker name: leak_tracker
sha256: "6bb818ecbdffe216e81182c2f0714a2e62b593f4a4f13098713ff1685dfb6ab0" sha256: "8dcda04c3fc16c14f48a7bb586d4be1f0d1572731b6d81d51772ef47c02081e0"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "10.0.9" version: "11.0.1"
leak_tracker_flutter_testing: leak_tracker_flutter_testing:
dependency: transitive dependency: transitive
description: description:
name: leak_tracker_flutter_testing name: leak_tracker_flutter_testing
sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.0.9" version: "3.0.10"
leak_tracker_testing: leak_tracker_testing:
dependency: transitive dependency: transitive
description: description:
name: leak_tracker_testing name: leak_tracker_testing
sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.0.1" version: "3.0.2"
lint: lint:
dependency: transitive dependency: transitive
description: description:
@@ -2406,10 +2406,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: test_api name: test_api
sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd sha256: "522f00f556e73044315fa4585ec3270f1808a4b186c936e612cab0b565ff1e00"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.7.4" version: "0.7.6"
textfield_tags: textfield_tags:
dependency: "direct main" dependency: "direct main"
description: description:
@@ -2592,10 +2592,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: vector_math name: vector_math
sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.1.4" version: "2.2.0"
very_good_infinite_list: very_good_infinite_list:
dependency: "direct main" dependency: "direct main"
description: description: