diff --git a/lib/modules/metadata_plugins/installed_plugin.dart b/lib/modules/metadata_plugins/installed_plugin.dart index 9692c38c..daba3797 100644 --- a/lib/modules/metadata_plugins/installed_plugin.dart +++ b/lib/modules/metadata_plugins/installed_plugin.dart @@ -1,4 +1,3 @@ -import 'package:flutter/foundation.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:shadcn_flutter/shadcn_flutter_extension.dart'; diff --git a/lib/modules/metadata_plugins/plugin_repository.dart b/lib/modules/metadata_plugins/plugin_repository.dart index 3a093741..80714cc6 100644 --- a/lib/modules/metadata_plugins/plugin_repository.dart +++ b/lib/modules/metadata_plugins/plugin_repository.dart @@ -26,7 +26,8 @@ class MetadataPluginRepositoryItem extends HookConsumerWidget { return Card( child: Basic( - title: Text(pluginRepo.name), + title: Text( + "${pluginRepo.owner == "KRTirtho" ? "" : "${pluginRepo.owner}/"}${pluginRepo.name}"), subtitle: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, diff --git a/lib/provider/metadata_plugin/metadata_plugin_provider.dart b/lib/provider/metadata_plugin/metadata_plugin_provider.dart index 2a2d9a22..05a4b3ae 100644 --- a/lib/provider/metadata_plugin/metadata_plugin_provider.dart +++ b/lib/provider/metadata_plugin/metadata_plugin_provider.dart @@ -89,42 +89,60 @@ class MetadataPluginNotifier extends AsyncNotifier { } Future toStatePlugins( - List plugins) async { + List plugins, + ) async { int defaultPlugin = -1; - final pluginConfigs = plugins.mapIndexed( - (index, plugin) { - if (plugin.selected) { - defaultPlugin = index; - } + final pluginConfigs = []; + + for (int i = 0; i < plugins.length; i++) { + final plugin = plugins[i]; + + final pluginConfig = PluginConfiguration( + type: PluginType.metadata, + name: plugin.name, + author: plugin.author, + description: plugin.description, + version: plugin.version, + entryPoint: plugin.entryPoint, + pluginApiVersion: plugin.pluginApiVersion, + repository: plugin.repository, + apis: plugin.apis + .map( + (e) => PluginApis.values.firstWhereOrNull( + (api) => api.name == e, + ), + ) + .nonNulls + .toList(), + abilities: plugin.abilities + .map( + (e) => PluginAbilities.values.firstWhereOrNull( + (ability) => ability.name == e, + ), + ) + .nonNulls + .toList(), + ); + + final pluginExtractionDir = await _getPluginExtractionDir(pluginConfig); + final pluginJsonFile = + File(join(pluginExtractionDir.path, "plugin.json")); + final pluginBinaryFile = + File(join(pluginExtractionDir.path, "plugin.out")); + + if (!await pluginExtractionDir.exists() || + !await pluginJsonFile.exists() || + !await pluginBinaryFile.exists()) { + continue; + } + + pluginConfigs.add(pluginConfig); + + if (plugin.selected) { + defaultPlugin = pluginConfigs.length - 1; + } + } - return PluginConfiguration( - type: PluginType.metadata, - name: plugin.name, - author: plugin.author, - description: plugin.description, - version: plugin.version, - entryPoint: plugin.entryPoint, - pluginApiVersion: plugin.pluginApiVersion, - repository: plugin.repository, - apis: plugin.apis - .map( - (e) => PluginApis.values.firstWhereOrNull( - (api) => api.name == e, - ), - ) - .nonNulls - .toList(), - abilities: plugin.abilities - .map( - (e) => PluginAbilities.values.firstWhereOrNull( - (ability) => ability.name == e, - ), - ) - .nonNulls - .toList(), - ); - }, - ).toList(); return MetadataPluginState( plugins: pluginConfigs, defaultPlugin: defaultPlugin, @@ -207,7 +225,7 @@ class MetadataPluginNotifier extends AsyncNotifier { final pluginDir = await _getPluginRootDir(); final pluginExtractionDirPath = join( pluginDir.path, - "${ServiceUtils.sanitizeFilename(plugin.name)}-${plugin.version}", + "${ServiceUtils.sanitizeFilename(plugin.author)}-${ServiceUtils.sanitizeFilename(plugin.name)}-${plugin.version}", ); return Directory(pluginExtractionDirPath); } @@ -314,7 +332,8 @@ class MetadataPluginNotifier extends AsyncNotifier { final pluginRes = await (database.metadataPluginsTable.select() ..where( - (tbl) => tbl.name.equals(plugin.name), + (tbl) => + tbl.name.equals(plugin.name) & tbl.author.equals(plugin.author), ) ..limit(1)) .get(); @@ -344,8 +363,8 @@ class MetadataPluginNotifier extends AsyncNotifier { if (pluginExtractionDir.existsSync()) { await pluginExtractionDir.delete(recursive: true); } - await database.metadataPluginsTable - .deleteWhere((tbl) => tbl.name.equals(plugin.name)); + await database.metadataPluginsTable.deleteWhere((tbl) => + tbl.name.equals(plugin.name) & tbl.author.equals(plugin.author)); } Future updatePlugin( @@ -356,7 +375,8 @@ class MetadataPluginNotifier extends AsyncNotifier { final pluginUpdatedConfig = await downloadAndCachePlugin(update.downloadUrl); - if (pluginUpdatedConfig.name != plugin.name) { + if (pluginUpdatedConfig.name != plugin.name && + pluginUpdatedConfig.author != plugin.author) { throw MetadataPluginException.invalidPluginConfiguration(); } _assertPluginApiCompatibility(pluginUpdatedConfig); @@ -375,7 +395,8 @@ class MetadataPluginNotifier extends AsyncNotifier { .write(const MetadataPluginsTableCompanion(selected: Value(false))); await (database.metadataPluginsTable.update() - ..where((tbl) => tbl.name.equals(plugin.name))) + ..where((tbl) => + tbl.name.equals(plugin.name) & tbl.author.equals(plugin.author))) .write( const MetadataPluginsTableCompanion(selected: Value(true)), );