diff --git a/lib/pages/getting_started/sections/support.dart b/lib/pages/getting_started/sections/support.dart index b449def5..3f669557 100644 --- a/lib/pages/getting_started/sections/support.dart +++ b/lib/pages/getting_started/sections/support.dart @@ -6,7 +6,7 @@ import 'package:spotube/collections/spotube_icons.dart'; import 'package:spotube/modules/getting_started/blur_card.dart'; import 'package:spotube/extensions/context.dart'; import 'package:spotube/pages/home/home.dart'; -import 'package:spotube/pages/mobile_login/mobile_login.dart'; +import 'package:spotube/pages/mobile_login/hooks/login_callback.dart'; import 'package:spotube/services/kv_store/kv_store.dart'; import 'package:url_launcher/url_launcher_string.dart'; @@ -16,6 +16,7 @@ class GettingStartedScreenSupportSection extends HookConsumerWidget { @override Widget build(BuildContext context, ref) { final ThemeData(:textTheme, :colorScheme) = Theme.of(context); + final onLogin = useLoginCallback(ref); return Center( child: Column( @@ -121,9 +122,7 @@ class GettingStartedScreenSupportSection extends HookConsumerWidget { ), onPressed: () async { await KVStoreService.setDoneGettingStarted(true); - if (context.mounted) { - context.pushNamed(WebViewLogin.name); - } + await onLogin(); }, ), ], diff --git a/lib/pages/mobile_login/hooks/login_callback.dart b/lib/pages/mobile_login/hooks/login_callback.dart new file mode 100644 index 00000000..815e81d0 --- /dev/null +++ b/lib/pages/mobile_login/hooks/login_callback.dart @@ -0,0 +1,64 @@ +import 'dart:io'; + +import 'package:desktop_webview_window/desktop_webview_window.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:go_router/go_router.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:path/path.dart'; +import 'package:path_provider/path_provider.dart'; +import 'package:spotube/pages/mobile_login/mobile_login.dart'; +import 'package:spotube/provider/authentication/authentication.dart'; +import 'package:spotube/utils/platform.dart'; + +Future Function() useLoginCallback(WidgetRef ref) { + final context = useContext(); + final theme = Theme.of(context); + final authNotifier = ref.read(authenticationProvider.notifier); + + return useCallback(() async { + if (kIsMobile) { + context.pushNamed(WebViewLogin.name); + return; + } + + final exp = RegExp(r"https:\/\/accounts.spotify.com\/.+\/status"); + final applicationSupportDir = await getApplicationSupportDirectory(); + final userDataFolder = + Directory(join(applicationSupportDir.path, "webview_window_Webview2")); + + if (!await userDataFolder.exists()) { + await userDataFolder.create(); + } + + final webview = await WebviewWindow.create( + configuration: CreateConfiguration( + title: "Spotify Login", + titleBarTopPadding: kIsMacOS ? 20 : 0, + windowHeight: 720, + windowWidth: 1280, + userDataFolderWindows: userDataFolder.path, + ), + ); + webview + ..setBrightness(theme.colorScheme.brightness) + ..launch("https://accounts.spotify.com/") + ..setOnUrlRequestCallback((url) { + if (exp.hasMatch(url)) { + webview.getAllCookies().then((cookies) async { + final cookieHeader = + "sp_dc=${cookies.firstWhere((element) => element.name.contains("sp_dc")).value.replaceAll("\u0000", "")}"; + + await authNotifier.login(cookieHeader); + + webview.close(); + if (context.mounted) { + context.go("/"); + } + }); + } + + return true; + }); + }, [authNotifier, theme, context.go, context.pushNamed]); +} diff --git a/lib/pages/settings/sections/accounts.dart b/lib/pages/settings/sections/accounts.dart index c670e96d..b9a26147 100644 --- a/lib/pages/settings/sections/accounts.dart +++ b/lib/pages/settings/sections/accounts.dart @@ -1,24 +1,18 @@ -import 'dart:io'; - import 'package:auto_size_text/auto_size_text.dart'; -import 'package:desktop_webview_window/desktop_webview_window.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:path/path.dart'; -import 'package:path_provider/path_provider.dart'; import 'package:spotube/collections/spotube_icons.dart'; import 'package:spotube/modules/settings/section_card_with_heading.dart'; import 'package:spotube/components/image/universal_image.dart'; import 'package:spotube/extensions/constrains.dart'; import 'package:spotube/extensions/context.dart'; import 'package:spotube/extensions/image.dart'; -import 'package:spotube/pages/mobile_login/mobile_login.dart'; import 'package:spotube/pages/profile/profile.dart'; +import 'package:spotube/pages/mobile_login/hooks/login_callback.dart'; import 'package:spotube/provider/authentication/authentication.dart'; import 'package:spotube/provider/scrobbler/scrobbler.dart'; import 'package:spotube/provider/spotify/spotify.dart'; -import 'package:spotube/utils/platform.dart'; import 'package:spotube/utils/service_utils.dart'; class SettingsAccountSection extends HookConsumerWidget { @@ -30,7 +24,6 @@ class SettingsAccountSection extends HookConsumerWidget { final router = GoRouter.of(context); final auth = ref.watch(authenticationProvider); - final authNotifier = ref.watch(authenticationProvider.notifier); final scrobbler = ref.watch(scrobblerProvider); final me = ref.watch(meProvider); final meData = me.asData?.value; @@ -40,51 +33,7 @@ class SettingsAccountSection extends HookConsumerWidget { foregroundColor: Colors.white, ); - void onLogin() async { - if (kIsMobile) { - router.pushNamed(WebViewLogin.name); - return; - } - - final exp = RegExp(r"https:\/\/accounts.spotify.com\/.+\/status"); - final applicationSupportDir = await getApplicationSupportDirectory(); - final userDataFolder = Directory( - join(applicationSupportDir.path, "webview_window_Webview2")); - - if (!await userDataFolder.exists()) { - await userDataFolder.create(); - } - - final webview = await WebviewWindow.create( - configuration: CreateConfiguration( - title: "Spotify Login", - titleBarTopPadding: kIsMacOS ? 20 : 0, - windowHeight: 720, - windowWidth: 1280, - userDataFolderWindows: userDataFolder.path, - ), - ); - webview - ..setBrightness(theme.colorScheme.brightness) - ..launch("https://accounts.spotify.com/") - ..setOnUrlRequestCallback((url) { - if (exp.hasMatch(url)) { - webview.getAllCookies().then((cookies) async { - final cookieHeader = - "sp_dc=${cookies.firstWhere((element) => element.name.contains("sp_dc")).value.replaceAll("\u0000", "")}"; - - await authNotifier.login(cookieHeader); - - webview.close(); - if (context.mounted) { - context.go("/"); - } - }); - } - - return true; - }); - } + final onLogin = useLoginCallback(ref); return SectionCardWithHeading( heading: context.l10n.account,