diff --git a/lib/services/metadata/apis/localstorage.dart b/lib/services/metadata/apis/localstorage.dart index 3c354d69..3b76f169 100644 --- a/lib/services/metadata/apis/localstorage.dart +++ b/lib/services/metadata/apis/localstorage.dart @@ -13,7 +13,7 @@ class PluginLocalStorageApi { required this.pluginName, }) { runtime.onMessage("LocalStorage.getItem", (args) { - final key = args[0]; + final key = args[0]["key"]; final value = getItem(key); runtime.evaluate( """ diff --git a/lib/services/metadata/apis/set_interval.dart b/lib/services/metadata/apis/set_interval.dart index 349fbdeb..1b1aba97 100644 --- a/lib/services/metadata/apis/set_interval.dart +++ b/lib/services/metadata/apis/set_interval.dart @@ -70,4 +70,11 @@ class PluginSetIntervalApi { } }); } + + void dispose() { + for (var timer in _timers.values) { + timer.cancel(); + } + _timers.clear(); + } } diff --git a/lib/services/metadata/apis/totp.dart b/lib/services/metadata/apis/totp.dart index 7dad4f78..7a0bdb90 100644 --- a/lib/services/metadata/apis/totp.dart +++ b/lib/services/metadata/apis/totp.dart @@ -32,7 +32,7 @@ class PluginTotpGenerator { runtime.evaluate( """ - eventEmitter.emit('Totp.generate', '$otp'); + eventEmitter.emit('TotpGenerator.generate', '$otp'); """, ); }); diff --git a/lib/services/metadata/apis/webview.dart b/lib/services/metadata/apis/webview.dart index 630324a0..5ad74060 100644 --- a/lib/services/metadata/apis/webview.dart +++ b/lib/services/metadata/apis/webview.dart @@ -49,13 +49,17 @@ class PluginWebViewApi { } showWebView( url: args[0]["url"] as String, - initialSettings: WebviewInitialSettings.fromJson( - args[0]["initialSettings"], - ), + initialSettings: args[0]["initialSettings"] != null + ? WebviewInitialSettings.fromJson( + args[0]["initialSettings"], + ) + : null, ); }); } + Webview? webviewWindow; + Future showWebView({ required String url, WebviewInitialSettings? initialSettings, @@ -117,6 +121,8 @@ class PluginWebViewApi { ), ); + webviewWindow = webview; + runtime.onMessage("WebView.close", (args) { webview.close(); }); @@ -134,7 +140,7 @@ class PluginWebViewApi { "domain": e.domain, "path": e.path, }; - }); + }).toList(); runtime.evaluate( """ @@ -157,4 +163,9 @@ class PluginWebViewApi { } } } + + void dispose() { + webviewWindow?.close(); + webviewWindow = null; + } } diff --git a/lib/services/metadata/metadata.dart b/lib/services/metadata/metadata.dart index a24d49b1..7b151fa9 100644 --- a/lib/services/metadata/metadata.dart +++ b/lib/services/metadata/metadata.dart @@ -61,19 +61,6 @@ class MetadataApiSignature { }, ); - final res = runtime.evaluate( - """ - ;$libraryCode; - const metadataApi = new MetadataApi(); - """, - ); - - if (res.isError) { - AppLogger.reportError( - "Error evaluating code: $libraryCode\n${res.rawResult}", - ); - } - // Create all the PluginAPIs after library code is evaluated final localStorageApi = PluginLocalStorageApi( runtime: runtime, @@ -93,12 +80,26 @@ class MetadataApiSignature { setIntervalApi, ); + final res = runtime.evaluate( + """ + ;$libraryCode; + const metadataApi = new MetadataApi(); + """, + ); metadataApi._signatureFlags = await metadataApi._getSignatureFlags(); + if (res.isError) { + AppLogger.reportError( + "Error evaluating code: $libraryCode\n${res.rawResult}", + ); + } + return metadataApi; } void dispose() { + setIntervalApi.dispose(); + webViewApi.dispose(); runtime.dispose(); } @@ -119,7 +120,7 @@ class MetadataApiSignature { $method(...${args != null ? jsonEncode(args) : "[]"}) .then((res) => { try { - sendMessage("$method", JSON.stringify(res)); + sendMessage("$method", res ? JSON.stringify(res) : "[]"); } catch (e) { console.error("Failed to send message in $method.then: ", `\${e.toString()}\n\${e.stack.toString()}`); } @@ -497,6 +498,12 @@ class MetadataApiSignature { } // ----- User ------ + Future getMe() async { + final res = await invoke("metadataApi.getMe"); + + return SpotubeUserObject.fromJson(res); + } + Future followArtist(String userId, String artistId) async { await invoke("metadataApi.followArtist", [userId, artistId]); }