Compare commits

...

7 Commits

Author SHA1 Message Date
Richard Hajek
0f61b03868
Merge 42e954428b into c0d50d441e 2025-08-29 14:56:59 +06:00
Kingkor Roy Tirtho
c0d50d441e fix: use plugin author and name as slug 2025-08-29 14:56:24 +06:00
Kingkor Roy Tirtho
66cae6c7ac chore: upgrade Flutter version 2025-08-29 13:08:28 +06:00
Richard Hajek
42e954428b feat: added filtering duplicates in recent 2025-01-18 18:01:26 +01:00
Kingkor Roy Tirtho
8c1337d1fc
Merge pull request #2118 from KRTirtho/dev
chore: release 3.9.0
2024-12-09 00:04:29 +06:00
Kingkor Roy Tirtho
94e704087f Merge branch 'dev' 2024-10-09 16:38:23 +06:00
Kingkor Roy Tirtho
8e287ab1e5
Merge pull request #1981 from KRTirtho/dev
Release 3.8.3
2024-10-09 15:39:31 +06:00
18 changed files with 244 additions and 133 deletions

View File

@ -1,3 +1,3 @@
{
"flutterSdkVersion": "3.32.7"
"flutterSdkVersion": "3.35.2"
}

2
.fvmrc
View File

@ -1,4 +1,4 @@
{
"flutter": "3.32.7",
"flutter": "3.35.2",
"flavors": {}
}

View File

@ -4,7 +4,7 @@ on:
pull_request:
env:
FLUTTER_VERSION: 3.32.7
FLUTTER_VERSION: 3.35.2
jobs:
lint:

View File

@ -20,7 +20,7 @@ on:
description: Dry run without uploading to release
env:
FLUTTER_VERSION: 3.32.7
FLUTTER_VERSION: 3.35.2
FLUTTER_CHANNEL: master
permissions:

View File

@ -30,5 +30,5 @@
"README.md": "LICENSE,CODE_OF_CONDUCT.md,CONTRIBUTING.md,SECURITY.md,CONTRIBUTION.md,CHANGELOG.md,PRIVACY_POLICY.md",
"*.dart": "${capture}.g.dart,${capture}.freezed.dart"
},
"dart.flutterSdkPath": ".fvm/versions/3.32.7"
"dart.flutterSdkPath": ".fvm/versions/3.35.2"
}

View File

@ -2,4 +2,3 @@ arb-dir: lib/l10n
template-arb-file: app_en.arb
output-dir: lib/l10n/generated
untranslated-messages-file: untranslated_messages.json
synthetic-package: false

View File

@ -9,7 +9,7 @@ import 'package:spotube/provider/history/recent.dart';
class HomeRecentlyPlayedSection extends HookConsumerWidget {
const HomeRecentlyPlayedSection({super.key});
@override
Widget build(BuildContext context, ref) {
final history = ref.watch(recentlyPlayedItems);
@ -20,17 +20,20 @@ class HomeRecentlyPlayedSection extends HookConsumerWidget {
return const SizedBox();
}
final uniqueItems = <dynamic>{};
final filteredItems = [
for (final item in historyData)
if (item.playlist != null && item.playlist?.id != null && uniqueItems.add(item.playlist!.id!))
item.playlist
else if (item.album != null && item.album?.id != null && uniqueItems.add(item.album?.id))
item.album
];
return Skeletonizer(
enabled: history.isLoading,
child: HorizontalPlaybuttonCardView(
title: Text(context.l10n.recently_played),
items: [
for (final item in historyData)
if (item.playlist != null)
item.playlist
else if (item.album != null)
item.album
],
items: filteredItems,
hasNextPage: false,
isLoadingNextPage: false,
onFetchMore: () {},

View File

@ -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';

View File

@ -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,

View File

@ -16,6 +16,7 @@ import 'package:spotube/provider/metadata_plugin/core/repositories.dart';
import 'package:spotube/provider/metadata_plugin/metadata_plugin_provider.dart';
import 'package:file_picker/file_picker.dart';
import 'package:spotube/provider/metadata_plugin/utils/common.dart';
import 'package:spotube/services/logger/logger.dart';
import 'package:spotube/utils/platform.dart';
import 'package:very_good_infinite_list/very_good_infinite_list.dart';
import 'package:sliver_tools/sliver_tools.dart';
@ -82,28 +83,66 @@ class SettingsMetadataProviderPage extends HookConsumerWidget {
),
),
),
Tooltip(
tooltip: const TooltipContainer(
child: Text("Download and install plugin from url"),
).call,
child: IconButton.secondary(
icon: const Icon(SpotubeIcons.download),
onPressed: () async {
if (formKey.currentState?.saveAndValidate() ??
false) {
final url = formKey.currentState
?.fields["plugin_url"]?.value as String;
HookBuilder(builder: (context) {
final isLoading = useState(false);
if (url.isNotEmpty) {
final pluginConfig = await pluginsNotifier
.downloadAndCachePlugin(url);
return Tooltip(
tooltip: const TooltipContainer(
child: Text("Download and install plugin from url"),
).call,
child: IconButton.secondary(
icon: isLoading.value
? const SizedBox.square(
dimension: 22,
child:
CircularProgressIndicator(strokeWidth: 2),
)
: const Icon(SpotubeIcons.download),
enabled: !isLoading.value,
onPressed: () async {
try {
if (formKey.currentState?.saveAndValidate() ??
false) {
final url = formKey.currentState
?.fields["plugin_url"]?.value as String;
await pluginsNotifier.addPlugin(pluginConfig);
if (url.isNotEmpty) {
isLoading.value = true;
final pluginConfig = await pluginsNotifier
.downloadAndCachePlugin(url);
await pluginsNotifier.addPlugin(pluginConfig);
formKey.currentState?.fields["plugin_url"]
?.reset();
}
}
} catch (e, stackTrace) {
AppLogger.reportError(e, stackTrace);
if (context.mounted) {
showToast(
showDuration: const Duration(seconds: 5),
context: context,
builder: (context, overlay) {
return SurfaceCard(
child: Basic(
leading: const Icon(
SpotubeIcons.error,
color: Colors.red,
),
title: Text("Failed to add plugin: $e"),
),
);
},
);
}
} finally {
isLoading.value = false;
}
}
},
),
),
},
),
);
}),
Tooltip(
tooltip: const TooltipContainer(
child: Text("Upload plugin from file"),

View File

@ -89,42 +89,60 @@ class MetadataPluginNotifier extends AsyncNotifier<MetadataPluginState> {
}
Future<MetadataPluginState> toStatePlugins(
List<MetadataPluginsTableData> plugins) async {
List<MetadataPluginsTableData> plugins,
) async {
int defaultPlugin = -1;
final pluginConfigs = plugins.mapIndexed(
(index, plugin) {
if (plugin.selected) {
defaultPlugin = index;
}
final pluginConfigs = <PluginConfiguration>[];
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<MetadataPluginState> {
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<MetadataPluginState> {
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<MetadataPluginState> {
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<void> updatePlugin(
@ -356,7 +375,8 @@ class MetadataPluginNotifier extends AsyncNotifier<MetadataPluginState> {
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<MetadataPluginState> {
.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)),
);

View File

@ -11,11 +11,13 @@
#include <flutter_secure_storage_linux/flutter_secure_storage_linux_plugin.h>
#include <flutter_timezone/flutter_timezone_plugin.h>
#include <gtk/gtk_plugin.h>
#include <irondash_engine_context/irondash_engine_context_plugin.h>
#include <local_notifier/local_notifier_plugin.h>
#include <media_kit_libs_linux/media_kit_libs_linux_plugin.h>
#include <open_file_linux/open_file_linux_plugin.h>
#include <screen_retriever_linux/screen_retriever_linux_plugin.h>
#include <sqlite3_flutter_libs/sqlite3_flutter_libs_plugin.h>
#include <super_native_extensions/super_native_extensions_plugin.h>
#include <system_theme/system_theme_plugin.h>
#include <tray_manager/tray_manager_plugin.h>
#include <url_launcher_linux/url_launcher_plugin.h>
@ -37,6 +39,9 @@ void fl_register_plugins(FlPluginRegistry* registry) {
g_autoptr(FlPluginRegistrar) gtk_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "GtkPlugin");
gtk_plugin_register_with_registrar(gtk_registrar);
g_autoptr(FlPluginRegistrar) irondash_engine_context_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "IrondashEngineContextPlugin");
irondash_engine_context_plugin_register_with_registrar(irondash_engine_context_registrar);
g_autoptr(FlPluginRegistrar) local_notifier_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "LocalNotifierPlugin");
local_notifier_plugin_register_with_registrar(local_notifier_registrar);
@ -52,6 +57,9 @@ void fl_register_plugins(FlPluginRegistry* registry) {
g_autoptr(FlPluginRegistrar) sqlite3_flutter_libs_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "Sqlite3FlutterLibsPlugin");
sqlite3_flutter_libs_plugin_register_with_registrar(sqlite3_flutter_libs_registrar);
g_autoptr(FlPluginRegistrar) super_native_extensions_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "SuperNativeExtensionsPlugin");
super_native_extensions_plugin_register_with_registrar(super_native_extensions_registrar);
g_autoptr(FlPluginRegistrar) system_theme_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "SystemThemePlugin");
system_theme_plugin_register_with_registrar(system_theme_registrar);

View File

@ -8,11 +8,13 @@ list(APPEND FLUTTER_PLUGIN_LIST
flutter_secure_storage_linux
flutter_timezone
gtk
irondash_engine_context
local_notifier
media_kit_libs_linux
open_file_linux
screen_retriever_linux
sqlite3_flutter_libs
super_native_extensions
system_theme
tray_manager
url_launcher_linux

View File

@ -16,6 +16,7 @@ import file_selector_macos
import flutter_inappwebview_macos
import flutter_secure_storage_macos
import flutter_timezone
import irondash_engine_context
import local_notifier
import media_kit_libs_macos_audio
import open_file_mac
@ -25,6 +26,7 @@ import screen_retriever_macos
import shared_preferences_foundation
import sqflite_darwin
import sqlite3_flutter_libs
import super_native_extensions
import system_theme
import tray_manager
import url_launcher_macos
@ -42,6 +44,7 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
InAppWebViewFlutterPlugin.register(with: registry.registrar(forPlugin: "InAppWebViewFlutterPlugin"))
FlutterSecureStoragePlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStoragePlugin"))
FlutterTimezonePlugin.register(with: registry.registrar(forPlugin: "FlutterTimezonePlugin"))
IrondashEngineContextPlugin.register(with: registry.registrar(forPlugin: "IrondashEngineContextPlugin"))
LocalNotifierPlugin.register(with: registry.registrar(forPlugin: "LocalNotifierPlugin"))
MediaKitLibsMacosAudioPlugin.register(with: registry.registrar(forPlugin: "MediaKitLibsMacosAudioPlugin"))
OpenFilePlugin.register(with: registry.registrar(forPlugin: "OpenFilePlugin"))
@ -51,6 +54,7 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))
SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin"))
Sqlite3FlutterLibsPlugin.register(with: registry.registrar(forPlugin: "Sqlite3FlutterLibsPlugin"))
SuperNativeExtensionsPlugin.register(with: registry.registrar(forPlugin: "SuperNativeExtensionsPlugin"))
SystemThemePlugin.register(with: registry.registrar(forPlugin: "SystemThemePlugin"))
TrayManagerPlugin.register(with: registry.registrar(forPlugin: "TrayManagerPlugin"))
UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin"))

View File

@ -5,23 +5,18 @@ packages:
dependency: transitive
description:
name: _fe_analyzer_shared
sha256: "16e298750b6d0af7ce8a3ba7c18c69c3785d11b15ec83f6dcd0ad2a0009b3cab"
sha256: "0b2f2bd91ba804e53a61d757b986f89f1f9eaed5b11e4b2f5a2468d86d6c9fc7"
url: "https://pub.dev"
source: hosted
version: "76.0.0"
_macros:
dependency: transitive
description: dart
source: sdk
version: "0.3.3"
version: "67.0.0"
analyzer:
dependency: transitive
description:
name: analyzer
sha256: "1f14db053a8c23e260789e9b0980fa27f2680dd640932cae5e1137cce0e46e1e"
sha256: "37577842a27e4338429a1cbc32679d508836510b056f1eedf0c8d20e39c1383d"
url: "https://pub.dev"
source: hosted
version: "6.11.0"
version: "6.4.1"
analyzer_plugin:
dependency: transitive
description:
@ -427,10 +422,10 @@ packages:
dependency: transitive
description:
name: country_flags
sha256: dad797491167a5b8dee465b969cb756795d842fdfc3fc1ff93f22e9c1884b73d
sha256: "78a7bf8aabd7ae1a90087f0c517471ac9ebfe07addc652692f58da0f0f833196"
url: "https://pub.dev"
source: hosted
version: "3.1.0"
version: "3.3.0"
coverage:
dependency: transitive
description:
@ -483,10 +478,10 @@ packages:
dependency: transitive
description:
name: dart_style
sha256: "7856d364b589d1f08986e140938578ed36ed948581fbc3bc9aef1805039ac5ab"
sha256: "99e066ce75c89d6b29903d788a7bb9369cf754f7b24bf70bf4b6d6d6b26853b9"
url: "https://pub.dev"
source: hosted
version: "2.3.7"
version: "2.3.6"
dartx:
dependency: transitive
description:
@ -582,18 +577,18 @@ packages:
dependency: "direct main"
description:
name: drift
sha256: c2d073d35ad441730812f4ea05b5dd031fb81c5f9786a4f5fb77ecd6307b6f74
sha256: df027d168a2985a2e9da900adeba2ab0136f0d84436592cf3cd5135f82c8579c
url: "https://pub.dev"
source: hosted
version: "2.22.1"
version: "2.21.0"
drift_dev:
dependency: "direct dev"
description:
name: drift_dev
sha256: f4ab5d6976b1e31551ceb82ff597a505bda7818ff4f7be08a1da9d55eb6e730c
sha256: "623649abe932fc17bd32e578e7e05f7ac5e7dd0b33e6c8669a0634105d1389bf"
url: "https://pub.dev"
source: hosted
version: "2.22.1"
version: "2.21.2"
duration:
dependency: "direct main"
description:
@ -1107,10 +1102,10 @@ packages:
dependency: "direct dev"
description:
name: freezed
sha256: "44c19278dd9d89292cf46e97dc0c1e52ce03275f40a97c5a348e802a924bf40e"
sha256: a434911f643466d78462625df76fd9eb13e57348ff43fe1f77bbe909522c67a1
url: "https://pub.dev"
source: hosted
version: "2.5.7"
version: "2.5.2"
freezed_annotation:
dependency: "direct main"
description:
@ -1420,6 +1415,22 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.0.5"
irondash_engine_context:
dependency: transitive
description:
name: irondash_engine_context
sha256: "2bb0bc13dfda9f5aaef8dde06ecc5feb1379f5bb387d59716d799554f3f305d7"
url: "https://pub.dev"
source: hosted
version: "0.5.5"
irondash_message_channel:
dependency: transitive
description:
name: irondash_message_channel
sha256: b4101669776509c76133b8917ab8cfc704d3ad92a8c450b92934dd8884a2f060
url: "https://pub.dev"
source: hosted
version: "0.7.0"
jiosaavn:
dependency: "direct main"
description:
@ -1432,18 +1443,18 @@ packages:
dependency: transitive
description:
name: jovial_misc
sha256: "4b10a4cac4f492d9692e97699bff775efa84abdba29909124cbccf3126e31cea"
sha256: "4301011027d87b8b919cb862db84071a34448eadbb32cc8d40fe505424dfe69a"
url: "https://pub.dev"
source: hosted
version: "0.9.0"
version: "0.9.2"
jovial_svg:
dependency: transitive
description:
name: jovial_svg
sha256: ca14d42956b9949c36333065c9141f100e930c918f57f4bd8dd59d35581bd3fc
sha256: "6791b1435547bdc0793081a166d41a8a313ebc61e4e5136fb7a3218781fb9e50"
url: "https://pub.dev"
source: hosted
version: "1.1.24"
version: "1.1.27"
js:
dependency: transitive
description:
@ -1464,34 +1475,34 @@ packages:
dependency: "direct dev"
description:
name: json_serializable
sha256: c2fcb3920cf2b6ae6845954186420fca40bc0a8abcc84903b7801f17d7050d7c
sha256: ea1432d167339ea9b5bb153f0571d0039607a873d6e04e0117af043f14a1fd4b
url: "https://pub.dev"
source: hosted
version: "6.9.0"
version: "6.8.0"
leak_tracker:
dependency: transitive
description:
name: leak_tracker
sha256: "6bb818ecbdffe216e81182c2f0714a2e62b593f4a4f13098713ff1685dfb6ab0"
sha256: "8dcda04c3fc16c14f48a7bb586d4be1f0d1572731b6d81d51772ef47c02081e0"
url: "https://pub.dev"
source: hosted
version: "10.0.9"
version: "11.0.1"
leak_tracker_flutter_testing:
dependency: transitive
description:
name: leak_tracker_flutter_testing
sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573
sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1"
url: "https://pub.dev"
source: hosted
version: "3.0.9"
version: "3.0.10"
leak_tracker_testing:
dependency: transitive
description:
name: leak_tracker_testing
sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3"
sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1"
url: "https://pub.dev"
source: hosted
version: "3.0.1"
version: "3.0.2"
lints:
dependency: transitive
description:
@ -1532,14 +1543,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.0.2"
macros:
dependency: transitive
description:
name: macros
sha256: "1d9e801cd66f7ea3663c45fc708450db1fa57f988142c64289142c9b7ee80656"
url: "https://pub.dev"
source: hosted
version: "0.1.3-main.0"
markdown:
dependency: transitive
description:
@ -1920,10 +1923,10 @@ packages:
dependency: transitive
description:
name: phonecodes
sha256: "094a76b0ba3d8f9c1c83044ae8783d46e6906703c86eb08facd876844c264bf5"
sha256: d963c19d35914cd83620e64125689a0c09047e25046639f2a124142ccf5868bb
url: "https://pub.dev"
source: hosted
version: "0.0.3"
version: "0.0.4"
piped_client:
dependency: "direct main"
description:
@ -1932,6 +1935,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "0.1.2"
pixel_snap:
dependency: transitive
description:
name: pixel_snap
sha256: "677410ea37b07cd37ecb6d5e6c0d8d7615a7cf3bd92ba406fd1ac57e937d1fb0"
url: "https://pub.dev"
source: hosted
version: "0.1.5"
platform:
dependency: transitive
description:
@ -2121,10 +2132,10 @@ packages:
dependency: "direct main"
description:
name: shadcn_flutter
sha256: "4a4dff36252101f344c77fd659d791c52c808cfe3ab68deea4ea949d942d9e5b"
sha256: "33903ee990eaaa5b50bb0105e445e370c42411e582563f98db20faf0c15f1035"
url: "https://pub.dev"
source: hosted
version: "0.0.39"
version: "0.0.42"
shared_preferences:
dependency: "direct main"
description:
@ -2390,10 +2401,10 @@ packages:
dependency: transitive
description:
name: sqlparser
sha256: "4cad4b2c5f63dc9ea1a8dcffb58cf762322bea5dd8836870164a65e913bdae41"
sha256: d77749237609784e337ec36c979d41f6f38a7b279df98622ae23929c8eb954a4
url: "https://pub.dev"
source: hosted
version: "0.40.0"
version: "0.39.2"
stack_trace:
dependency: transitive
description:
@ -2442,6 +2453,22 @@ packages:
url: "https://pub.dev"
source: hosted
version: "0.0.3"
super_clipboard:
dependency: transitive
description:
name: super_clipboard
sha256: e73f3bb7e66cc9260efa1dc507f979138e7e106c3521e2dda2d0311f6d728a16
url: "https://pub.dev"
source: hosted
version: "0.9.1"
super_native_extensions:
dependency: transitive
description:
name: super_native_extensions
sha256: b9611dcb68f1047d6f3ef11af25e4e68a21b1a705bbcc3eb8cb4e9f5c3148569
url: "https://pub.dev"
source: hosted
version: "0.9.1"
sync_http:
dependency: transitive
description:
@ -2462,10 +2489,10 @@ packages:
dependency: transitive
description:
name: syntax_highlight
sha256: ee33b6aa82cc722bb9b40152a792181dee222353b486c0255fde666a3e3a4997
sha256: "4d3ba40658cadba6ba55d697f29f00b43538ebb6eb4a0ca0e895c568eaced138"
url: "https://pub.dev"
source: hosted
version: "0.4.0"
version: "0.5.0"
system_theme:
dependency: "direct main"
description:
@ -2494,26 +2521,26 @@ packages:
dependency: "direct main"
description:
name: test
sha256: "301b213cd241ca982e9ba50266bd3f5bd1ea33f1455554c5abb85d1be0e2d87e"
sha256: "65e29d831719be0591f7b3b1a32a3cda258ec98c58c7b25f7b84241bc31215bb"
url: "https://pub.dev"
source: hosted
version: "1.25.15"
version: "1.26.2"
test_api:
dependency: transitive
description:
name: test_api
sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd
sha256: "522f00f556e73044315fa4585ec3270f1808a4b186c936e612cab0b565ff1e00"
url: "https://pub.dev"
source: hosted
version: "0.7.4"
version: "0.7.6"
test_core:
dependency: transitive
description:
name: test_core
sha256: "84d17c3486c8dfdbe5e12a50c8ae176d15e2a771b96909a9442b40173649ccaa"
sha256: "80bf5a02b60af04b09e14f6fe68b921aad119493e26e490deaca5993fef1b05a"
url: "https://pub.dev"
source: hosted
version: "0.6.8"
version: "0.6.11"
time:
dependency: transitive
description:
@ -2702,10 +2729,10 @@ packages:
dependency: transitive
description:
name: vector_math
sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803"
sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b
url: "https://pub.dev"
source: hosted
version: "2.1.4"
version: "2.2.0"
version:
dependency: "direct main"
description:
@ -2860,5 +2887,5 @@ packages:
source: git
version: "1.0.0"
sdks:
dart: ">=3.7.2 <4.0.0"
flutter: ">=3.32.0"
dart: ">=3.8.0-0 <4.0.0"
flutter: ">=3.35.1"

View File

@ -101,7 +101,7 @@ dependencies:
ref: dart-3-support
url: https://github.com/KRTirtho/scrobblenaut.git
scroll_to_index: ^3.0.1
shadcn_flutter: ^0.0.39
shadcn_flutter: ^0.0.42
shared_preferences: ^2.2.3
shelf: ^1.4.1
shelf_router: ^1.1.4

View File

@ -14,11 +14,13 @@
#include <flutter_inappwebview_windows/flutter_inappwebview_windows_plugin_c_api.h>
#include <flutter_secure_storage_windows/flutter_secure_storage_windows_plugin.h>
#include <flutter_timezone/flutter_timezone_plugin_c_api.h>
#include <irondash_engine_context/irondash_engine_context_plugin_c_api.h>
#include <local_notifier/local_notifier_plugin.h>
#include <media_kit_libs_windows_audio/media_kit_libs_windows_audio_plugin_c_api.h>
#include <permission_handler_windows/permission_handler_windows_plugin.h>
#include <screen_retriever_windows/screen_retriever_windows_plugin_c_api.h>
#include <sqlite3_flutter_libs/sqlite3_flutter_libs_plugin.h>
#include <super_native_extensions/super_native_extensions_plugin_c_api.h>
#include <system_theme/system_theme_plugin.h>
#include <tray_manager/tray_manager_plugin.h>
#include <url_launcher_windows/url_launcher_windows.h>
@ -41,6 +43,8 @@ void RegisterPlugins(flutter::PluginRegistry* registry) {
registry->GetRegistrarForPlugin("FlutterSecureStorageWindowsPlugin"));
FlutterTimezonePluginCApiRegisterWithRegistrar(
registry->GetRegistrarForPlugin("FlutterTimezonePluginCApi"));
IrondashEngineContextPluginCApiRegisterWithRegistrar(
registry->GetRegistrarForPlugin("IrondashEngineContextPluginCApi"));
LocalNotifierPluginRegisterWithRegistrar(
registry->GetRegistrarForPlugin("LocalNotifierPlugin"));
MediaKitLibsWindowsAudioPluginCApiRegisterWithRegistrar(
@ -51,6 +55,8 @@ void RegisterPlugins(flutter::PluginRegistry* registry) {
registry->GetRegistrarForPlugin("ScreenRetrieverWindowsPluginCApi"));
Sqlite3FlutterLibsPluginRegisterWithRegistrar(
registry->GetRegistrarForPlugin("Sqlite3FlutterLibsPlugin"));
SuperNativeExtensionsPluginCApiRegisterWithRegistrar(
registry->GetRegistrarForPlugin("SuperNativeExtensionsPluginCApi"));
SystemThemePluginRegisterWithRegistrar(
registry->GetRegistrarForPlugin("SystemThemePlugin"));
TrayManagerPluginRegisterWithRegistrar(

View File

@ -11,11 +11,13 @@ list(APPEND FLUTTER_PLUGIN_LIST
flutter_inappwebview_windows
flutter_secure_storage_windows
flutter_timezone
irondash_engine_context
local_notifier
media_kit_libs_windows_audio
permission_handler_windows
screen_retriever_windows
sqlite3_flutter_libs
super_native_extensions
system_theme
tray_manager
url_launcher_windows