import 'dart:typed_data'; import 'package:auto_route/auto_route.dart'; import 'package:hetu_otp_util/hetu_otp_util.dart'; import 'package:hetu_script/hetu_script.dart'; import 'package:hetu_spotube_plugin/hetu_spotube_plugin.dart'; import 'package:hetu_std/hetu_std.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:spotube/collections/routes.dart'; import 'package:spotube/components/titlebar/titlebar.dart'; import 'package:spotube/models/metadata/metadata.dart'; import 'package:spotube/services/metadata/apis/localstorage.dart'; import 'package:spotube/services/metadata/endpoints/auth.dart'; import 'package:spotube/services/metadata/endpoints/user.dart'; const defaultMetadataLimit = "20"; class MetadataPlugin { static Future create( PluginConfiguration config, Uint8List byteCode, ) async { final sharedPreferences = await SharedPreferences.getInstance(); BuildContext? pageContext; final hetu = Hetu(); hetu.init(); HetuStdLoader.loadBindings(hetu); HetuSpotubePluginLoader.loadBindings( hetu, localStorageImpl: SharedPreferencesLocalStorage( sharedPreferences, config.slug, ), onNavigatorPush: (route) { return rootNavigatorKey.currentContext?.router .pushWidget(Builder(builder: (context) { pageContext = context; return Scaffold( headers: const [ TitleBar( automaticallyImplyLeading: true, ) ], child: route, ); })); }, onNavigatorPop: () { pageContext?.maybePop(); }, ); await HetuStdLoader.loadBytecodeFlutter(hetu); await HetuOtpUtilLoader.loadBytecodeFlutter(hetu); await HetuSpotubePluginLoader.loadBytecodeFlutter(hetu); hetu.loadBytecode(bytes: byteCode, moduleName: "plugin"); hetu.eval(""" import "module:plugin" as plugin var Plugin = plugin.${config.entryPoint} var metadataPlugin = Plugin() """); return MetadataPlugin._(hetu); } final Hetu hetu; late final MetadataAuthEndpoint auth; late final MetadataPluginUserEndpoint user; MetadataPlugin._(this.hetu) { auth = MetadataAuthEndpoint(hetu); user = MetadataPluginUserEndpoint(hetu); } }