diff --git a/lib/collections/routes.dart b/lib/collections/routes.dart index 19a63587..184a051b 100644 --- a/lib/collections/routes.dart +++ b/lib/collections/routes.dart @@ -91,6 +91,10 @@ class AppRouter extends RootStackRouter { path: "settings/metadata-provider", page: SettingsMetadataProviderRoute.page, ), + AutoRoute( + path: "settings/metadata-provider/metadata-form", + page: SettingsMetadataProviderFormRoute.page, + ), AutoRoute( path: "settings/blacklist", page: BlackListRoute.page, diff --git a/lib/collections/routes.gr.dart b/lib/collections/routes.gr.dart index d998e45a..a5138c2f 100644 --- a/lib/collections/routes.gr.dart +++ b/lib/collections/routes.gr.dart @@ -8,10 +8,10 @@ // coverage:ignore-file // ignore_for_file: no_leading_underscores_for_library_prefixes -import 'package:auto_route/auto_route.dart' as _i39; -import 'package:flutter/material.dart' as _i40; -import 'package:shadcn_flutter/shadcn_flutter.dart' as _i42; -import 'package:spotube/models/metadata/metadata.dart' as _i41; +import 'package:auto_route/auto_route.dart' as _i40; +import 'package:flutter/material.dart' as _i41; +import 'package:shadcn_flutter/shadcn_flutter.dart' as _i43; +import 'package:spotube/models/metadata/metadata.dart' as _i42; import 'package:spotube/pages/album/album.dart' as _i2; import 'package:spotube/pages/artist/artist.dart' as _i3; import 'package:spotube/pages/connect/connect.dart' as _i6; @@ -21,14 +21,14 @@ import 'package:spotube/pages/home/home.dart' as _i9; import 'package:spotube/pages/home/sections/section_items.dart' as _i8; import 'package:spotube/pages/lastfm_login/lastfm_login.dart' as _i10; import 'package:spotube/pages/library/library.dart' as _i11; -import 'package:spotube/pages/library/user_albums.dart' as _i34; -import 'package:spotube/pages/library/user_artists.dart' as _i35; -import 'package:spotube/pages/library/user_downloads.dart' as _i36; +import 'package:spotube/pages/library/user_albums.dart' as _i35; +import 'package:spotube/pages/library/user_artists.dart' as _i36; +import 'package:spotube/pages/library/user_downloads.dart' as _i37; import 'package:spotube/pages/library/user_local_tracks/local_folder.dart' as _i13; import 'package:spotube/pages/library/user_local_tracks/user_local_tracks.dart' - as _i37; -import 'package:spotube/pages/library/user_playlists.dart' as _i38; + as _i38; +import 'package:spotube/pages/library/user_playlists.dart' as _i39; import 'package:spotube/pages/lyrics/lyrics.dart' as _i15; import 'package:spotube/pages/lyrics/mini_lyrics.dart' as _i16; import 'package:spotube/pages/player/lyrics.dart' as _i17; @@ -42,21 +42,22 @@ import 'package:spotube/pages/search/search.dart' as _i23; import 'package:spotube/pages/settings/about.dart' as _i1; import 'package:spotube/pages/settings/blacklist.dart' as _i4; import 'package:spotube/pages/settings/logs.dart' as _i14; -import 'package:spotube/pages/settings/metadata_plugins.dart' as _i24; -import 'package:spotube/pages/settings/settings.dart' as _i25; -import 'package:spotube/pages/stats/albums/albums.dart' as _i26; -import 'package:spotube/pages/stats/artists/artists.dart' as _i27; -import 'package:spotube/pages/stats/fees/fees.dart' as _i31; -import 'package:spotube/pages/stats/minutes/minutes.dart' as _i28; -import 'package:spotube/pages/stats/playlists/playlists.dart' as _i30; -import 'package:spotube/pages/stats/stats.dart' as _i29; -import 'package:spotube/pages/stats/streams/streams.dart' as _i32; -import 'package:spotube/pages/track/track.dart' as _i33; +import 'package:spotube/pages/settings/metadata/metadata_form.dart' as _i24; +import 'package:spotube/pages/settings/metadata_plugins.dart' as _i25; +import 'package:spotube/pages/settings/settings.dart' as _i26; +import 'package:spotube/pages/stats/albums/albums.dart' as _i27; +import 'package:spotube/pages/stats/artists/artists.dart' as _i28; +import 'package:spotube/pages/stats/fees/fees.dart' as _i32; +import 'package:spotube/pages/stats/minutes/minutes.dart' as _i29; +import 'package:spotube/pages/stats/playlists/playlists.dart' as _i31; +import 'package:spotube/pages/stats/stats.dart' as _i30; +import 'package:spotube/pages/stats/streams/streams.dart' as _i33; +import 'package:spotube/pages/track/track.dart' as _i34; /// generated route for /// [_i1.AboutSpotubePage] -class AboutSpotubeRoute extends _i39.PageRouteInfo { - const AboutSpotubeRoute({List<_i39.PageRouteInfo>? children}) +class AboutSpotubeRoute extends _i40.PageRouteInfo { + const AboutSpotubeRoute({List<_i40.PageRouteInfo>? children}) : super( AboutSpotubeRoute.name, initialChildren: children, @@ -64,7 +65,7 @@ class AboutSpotubeRoute extends _i39.PageRouteInfo { static const String name = 'AboutSpotubeRoute'; - static _i39.PageInfo page = _i39.PageInfo( + static _i40.PageInfo page = _i40.PageInfo( name, builder: (data) { return const _i1.AboutSpotubePage(); @@ -74,12 +75,12 @@ class AboutSpotubeRoute extends _i39.PageRouteInfo { /// generated route for /// [_i2.AlbumPage] -class AlbumRoute extends _i39.PageRouteInfo { +class AlbumRoute extends _i40.PageRouteInfo { AlbumRoute({ - _i40.Key? key, + _i41.Key? key, required String id, - required _i41.SpotubeSimpleAlbumObject album, - List<_i39.PageRouteInfo>? children, + required _i42.SpotubeSimpleAlbumObject album, + List<_i40.PageRouteInfo>? children, }) : super( AlbumRoute.name, args: AlbumRouteArgs( @@ -93,7 +94,7 @@ class AlbumRoute extends _i39.PageRouteInfo { static const String name = 'AlbumRoute'; - static _i39.PageInfo page = _i39.PageInfo( + static _i40.PageInfo page = _i40.PageInfo( name, builder: (data) { final args = data.argsAs(); @@ -113,11 +114,11 @@ class AlbumRouteArgs { required this.album, }); - final _i40.Key? key; + final _i41.Key? key; final String id; - final _i41.SpotubeSimpleAlbumObject album; + final _i42.SpotubeSimpleAlbumObject album; @override String toString() { @@ -127,11 +128,11 @@ class AlbumRouteArgs { /// generated route for /// [_i3.ArtistPage] -class ArtistRoute extends _i39.PageRouteInfo { +class ArtistRoute extends _i40.PageRouteInfo { ArtistRoute({ required String artistId, - _i40.Key? key, - List<_i39.PageRouteInfo>? children, + _i41.Key? key, + List<_i40.PageRouteInfo>? children, }) : super( ArtistRoute.name, args: ArtistRouteArgs( @@ -144,7 +145,7 @@ class ArtistRoute extends _i39.PageRouteInfo { static const String name = 'ArtistRoute'; - static _i39.PageInfo page = _i39.PageInfo( + static _i40.PageInfo page = _i40.PageInfo( name, builder: (data) { final pathParams = data.inheritedPathParams; @@ -166,7 +167,7 @@ class ArtistRouteArgs { final String artistId; - final _i40.Key? key; + final _i41.Key? key; @override String toString() { @@ -176,8 +177,8 @@ class ArtistRouteArgs { /// generated route for /// [_i4.BlackListPage] -class BlackListRoute extends _i39.PageRouteInfo { - const BlackListRoute({List<_i39.PageRouteInfo>? children}) +class BlackListRoute extends _i40.PageRouteInfo { + const BlackListRoute({List<_i40.PageRouteInfo>? children}) : super( BlackListRoute.name, initialChildren: children, @@ -185,7 +186,7 @@ class BlackListRoute extends _i39.PageRouteInfo { static const String name = 'BlackListRoute'; - static _i39.PageInfo page = _i39.PageInfo( + static _i40.PageInfo page = _i40.PageInfo( name, builder: (data) { return const _i4.BlackListPage(); @@ -195,8 +196,8 @@ class BlackListRoute extends _i39.PageRouteInfo { /// generated route for /// [_i5.ConnectControlPage] -class ConnectControlRoute extends _i39.PageRouteInfo { - const ConnectControlRoute({List<_i39.PageRouteInfo>? children}) +class ConnectControlRoute extends _i40.PageRouteInfo { + const ConnectControlRoute({List<_i40.PageRouteInfo>? children}) : super( ConnectControlRoute.name, initialChildren: children, @@ -204,7 +205,7 @@ class ConnectControlRoute extends _i39.PageRouteInfo { static const String name = 'ConnectControlRoute'; - static _i39.PageInfo page = _i39.PageInfo( + static _i40.PageInfo page = _i40.PageInfo( name, builder: (data) { return const _i5.ConnectControlPage(); @@ -214,8 +215,8 @@ class ConnectControlRoute extends _i39.PageRouteInfo { /// generated route for /// [_i6.ConnectPage] -class ConnectRoute extends _i39.PageRouteInfo { - const ConnectRoute({List<_i39.PageRouteInfo>? children}) +class ConnectRoute extends _i40.PageRouteInfo { + const ConnectRoute({List<_i40.PageRouteInfo>? children}) : super( ConnectRoute.name, initialChildren: children, @@ -223,7 +224,7 @@ class ConnectRoute extends _i39.PageRouteInfo { static const String name = 'ConnectRoute'; - static _i39.PageInfo page = _i39.PageInfo( + static _i40.PageInfo page = _i40.PageInfo( name, builder: (data) { return const _i6.ConnectPage(); @@ -233,8 +234,8 @@ class ConnectRoute extends _i39.PageRouteInfo { /// generated route for /// [_i7.GettingStartedPage] -class GettingStartedRoute extends _i39.PageRouteInfo { - const GettingStartedRoute({List<_i39.PageRouteInfo>? children}) +class GettingStartedRoute extends _i40.PageRouteInfo { + const GettingStartedRoute({List<_i40.PageRouteInfo>? children}) : super( GettingStartedRoute.name, initialChildren: children, @@ -242,7 +243,7 @@ class GettingStartedRoute extends _i39.PageRouteInfo { static const String name = 'GettingStartedRoute'; - static _i39.PageInfo page = _i39.PageInfo( + static _i40.PageInfo page = _i40.PageInfo( name, builder: (data) { return const _i7.GettingStartedPage(); @@ -253,12 +254,12 @@ class GettingStartedRoute extends _i39.PageRouteInfo { /// generated route for /// [_i8.HomeBrowseSectionItemsPage] class HomeBrowseSectionItemsRoute - extends _i39.PageRouteInfo { + extends _i40.PageRouteInfo { HomeBrowseSectionItemsRoute({ - _i42.Key? key, + _i43.Key? key, required String sectionId, - required _i41.SpotubeBrowseSectionObject section, - List<_i39.PageRouteInfo>? children, + required _i42.SpotubeBrowseSectionObject section, + List<_i40.PageRouteInfo>? children, }) : super( HomeBrowseSectionItemsRoute.name, args: HomeBrowseSectionItemsRouteArgs( @@ -272,7 +273,7 @@ class HomeBrowseSectionItemsRoute static const String name = 'HomeBrowseSectionItemsRoute'; - static _i39.PageInfo page = _i39.PageInfo( + static _i40.PageInfo page = _i40.PageInfo( name, builder: (data) { final args = data.argsAs(); @@ -292,11 +293,11 @@ class HomeBrowseSectionItemsRouteArgs { required this.section, }); - final _i42.Key? key; + final _i43.Key? key; final String sectionId; - final _i41.SpotubeBrowseSectionObject section; + final _i42.SpotubeBrowseSectionObject section; @override String toString() { @@ -306,8 +307,8 @@ class HomeBrowseSectionItemsRouteArgs { /// generated route for /// [_i9.HomePage] -class HomeRoute extends _i39.PageRouteInfo { - const HomeRoute({List<_i39.PageRouteInfo>? children}) +class HomeRoute extends _i40.PageRouteInfo { + const HomeRoute({List<_i40.PageRouteInfo>? children}) : super( HomeRoute.name, initialChildren: children, @@ -315,7 +316,7 @@ class HomeRoute extends _i39.PageRouteInfo { static const String name = 'HomeRoute'; - static _i39.PageInfo page = _i39.PageInfo( + static _i40.PageInfo page = _i40.PageInfo( name, builder: (data) { return const _i9.HomePage(); @@ -325,8 +326,8 @@ class HomeRoute extends _i39.PageRouteInfo { /// generated route for /// [_i10.LastFMLoginPage] -class LastFMLoginRoute extends _i39.PageRouteInfo { - const LastFMLoginRoute({List<_i39.PageRouteInfo>? children}) +class LastFMLoginRoute extends _i40.PageRouteInfo { + const LastFMLoginRoute({List<_i40.PageRouteInfo>? children}) : super( LastFMLoginRoute.name, initialChildren: children, @@ -334,7 +335,7 @@ class LastFMLoginRoute extends _i39.PageRouteInfo { static const String name = 'LastFMLoginRoute'; - static _i39.PageInfo page = _i39.PageInfo( + static _i40.PageInfo page = _i40.PageInfo( name, builder: (data) { return const _i10.LastFMLoginPage(); @@ -344,8 +345,8 @@ class LastFMLoginRoute extends _i39.PageRouteInfo { /// generated route for /// [_i11.LibraryPage] -class LibraryRoute extends _i39.PageRouteInfo { - const LibraryRoute({List<_i39.PageRouteInfo>? children}) +class LibraryRoute extends _i40.PageRouteInfo { + const LibraryRoute({List<_i40.PageRouteInfo>? children}) : super( LibraryRoute.name, initialChildren: children, @@ -353,7 +354,7 @@ class LibraryRoute extends _i39.PageRouteInfo { static const String name = 'LibraryRoute'; - static _i39.PageInfo page = _i39.PageInfo( + static _i40.PageInfo page = _i40.PageInfo( name, builder: (data) { return const _i11.LibraryPage(); @@ -363,11 +364,11 @@ class LibraryRoute extends _i39.PageRouteInfo { /// generated route for /// [_i12.LikedPlaylistPage] -class LikedPlaylistRoute extends _i39.PageRouteInfo { +class LikedPlaylistRoute extends _i40.PageRouteInfo { LikedPlaylistRoute({ - _i40.Key? key, - required _i41.SpotubeSimplePlaylistObject playlist, - List<_i39.PageRouteInfo>? children, + _i41.Key? key, + required _i42.SpotubeSimplePlaylistObject playlist, + List<_i40.PageRouteInfo>? children, }) : super( LikedPlaylistRoute.name, args: LikedPlaylistRouteArgs( @@ -379,7 +380,7 @@ class LikedPlaylistRoute extends _i39.PageRouteInfo { static const String name = 'LikedPlaylistRoute'; - static _i39.PageInfo page = _i39.PageInfo( + static _i40.PageInfo page = _i40.PageInfo( name, builder: (data) { final args = data.argsAs(); @@ -397,9 +398,9 @@ class LikedPlaylistRouteArgs { required this.playlist, }); - final _i40.Key? key; + final _i41.Key? key; - final _i41.SpotubeSimplePlaylistObject playlist; + final _i42.SpotubeSimplePlaylistObject playlist; @override String toString() { @@ -409,13 +410,13 @@ class LikedPlaylistRouteArgs { /// generated route for /// [_i13.LocalLibraryPage] -class LocalLibraryRoute extends _i39.PageRouteInfo { +class LocalLibraryRoute extends _i40.PageRouteInfo { LocalLibraryRoute({ required String location, - _i40.Key? key, + _i41.Key? key, bool isDownloads = false, bool isCache = false, - List<_i39.PageRouteInfo>? children, + List<_i40.PageRouteInfo>? children, }) : super( LocalLibraryRoute.name, args: LocalLibraryRouteArgs( @@ -429,7 +430,7 @@ class LocalLibraryRoute extends _i39.PageRouteInfo { static const String name = 'LocalLibraryRoute'; - static _i39.PageInfo page = _i39.PageInfo( + static _i40.PageInfo page = _i40.PageInfo( name, builder: (data) { final args = data.argsAs(); @@ -453,7 +454,7 @@ class LocalLibraryRouteArgs { final String location; - final _i40.Key? key; + final _i41.Key? key; final bool isDownloads; @@ -467,8 +468,8 @@ class LocalLibraryRouteArgs { /// generated route for /// [_i14.LogsPage] -class LogsRoute extends _i39.PageRouteInfo { - const LogsRoute({List<_i39.PageRouteInfo>? children}) +class LogsRoute extends _i40.PageRouteInfo { + const LogsRoute({List<_i40.PageRouteInfo>? children}) : super( LogsRoute.name, initialChildren: children, @@ -476,7 +477,7 @@ class LogsRoute extends _i39.PageRouteInfo { static const String name = 'LogsRoute'; - static _i39.PageInfo page = _i39.PageInfo( + static _i40.PageInfo page = _i40.PageInfo( name, builder: (data) { return const _i14.LogsPage(); @@ -486,8 +487,8 @@ class LogsRoute extends _i39.PageRouteInfo { /// generated route for /// [_i15.LyricsPage] -class LyricsRoute extends _i39.PageRouteInfo { - const LyricsRoute({List<_i39.PageRouteInfo>? children}) +class LyricsRoute extends _i40.PageRouteInfo { + const LyricsRoute({List<_i40.PageRouteInfo>? children}) : super( LyricsRoute.name, initialChildren: children, @@ -495,7 +496,7 @@ class LyricsRoute extends _i39.PageRouteInfo { static const String name = 'LyricsRoute'; - static _i39.PageInfo page = _i39.PageInfo( + static _i40.PageInfo page = _i40.PageInfo( name, builder: (data) { return const _i15.LyricsPage(); @@ -505,11 +506,11 @@ class LyricsRoute extends _i39.PageRouteInfo { /// generated route for /// [_i16.MiniLyricsPage] -class MiniLyricsRoute extends _i39.PageRouteInfo { +class MiniLyricsRoute extends _i40.PageRouteInfo { MiniLyricsRoute({ - _i42.Key? key, - required _i42.Size prevSize, - List<_i39.PageRouteInfo>? children, + _i43.Key? key, + required _i43.Size prevSize, + List<_i40.PageRouteInfo>? children, }) : super( MiniLyricsRoute.name, args: MiniLyricsRouteArgs( @@ -521,7 +522,7 @@ class MiniLyricsRoute extends _i39.PageRouteInfo { static const String name = 'MiniLyricsRoute'; - static _i39.PageInfo page = _i39.PageInfo( + static _i40.PageInfo page = _i40.PageInfo( name, builder: (data) { final args = data.argsAs(); @@ -539,9 +540,9 @@ class MiniLyricsRouteArgs { required this.prevSize, }); - final _i42.Key? key; + final _i43.Key? key; - final _i42.Size prevSize; + final _i43.Size prevSize; @override String toString() { @@ -551,8 +552,8 @@ class MiniLyricsRouteArgs { /// generated route for /// [_i17.PlayerLyricsPage] -class PlayerLyricsRoute extends _i39.PageRouteInfo { - const PlayerLyricsRoute({List<_i39.PageRouteInfo>? children}) +class PlayerLyricsRoute extends _i40.PageRouteInfo { + const PlayerLyricsRoute({List<_i40.PageRouteInfo>? children}) : super( PlayerLyricsRoute.name, initialChildren: children, @@ -560,7 +561,7 @@ class PlayerLyricsRoute extends _i39.PageRouteInfo { static const String name = 'PlayerLyricsRoute'; - static _i39.PageInfo page = _i39.PageInfo( + static _i40.PageInfo page = _i40.PageInfo( name, builder: (data) { return const _i17.PlayerLyricsPage(); @@ -570,8 +571,8 @@ class PlayerLyricsRoute extends _i39.PageRouteInfo { /// generated route for /// [_i18.PlayerQueuePage] -class PlayerQueueRoute extends _i39.PageRouteInfo { - const PlayerQueueRoute({List<_i39.PageRouteInfo>? children}) +class PlayerQueueRoute extends _i40.PageRouteInfo { + const PlayerQueueRoute({List<_i40.PageRouteInfo>? children}) : super( PlayerQueueRoute.name, initialChildren: children, @@ -579,7 +580,7 @@ class PlayerQueueRoute extends _i39.PageRouteInfo { static const String name = 'PlayerQueueRoute'; - static _i39.PageInfo page = _i39.PageInfo( + static _i40.PageInfo page = _i40.PageInfo( name, builder: (data) { return const _i18.PlayerQueuePage(); @@ -589,8 +590,8 @@ class PlayerQueueRoute extends _i39.PageRouteInfo { /// generated route for /// [_i19.PlayerTrackSourcesPage] -class PlayerTrackSourcesRoute extends _i39.PageRouteInfo { - const PlayerTrackSourcesRoute({List<_i39.PageRouteInfo>? children}) +class PlayerTrackSourcesRoute extends _i40.PageRouteInfo { + const PlayerTrackSourcesRoute({List<_i40.PageRouteInfo>? children}) : super( PlayerTrackSourcesRoute.name, initialChildren: children, @@ -598,7 +599,7 @@ class PlayerTrackSourcesRoute extends _i39.PageRouteInfo { static const String name = 'PlayerTrackSourcesRoute'; - static _i39.PageInfo page = _i39.PageInfo( + static _i40.PageInfo page = _i40.PageInfo( name, builder: (data) { return const _i19.PlayerTrackSourcesPage(); @@ -608,12 +609,12 @@ class PlayerTrackSourcesRoute extends _i39.PageRouteInfo { /// generated route for /// [_i20.PlaylistPage] -class PlaylistRoute extends _i39.PageRouteInfo { +class PlaylistRoute extends _i40.PageRouteInfo { PlaylistRoute({ - _i40.Key? key, + _i41.Key? key, required String id, - required _i41.SpotubeSimplePlaylistObject playlist, - List<_i39.PageRouteInfo>? children, + required _i42.SpotubeSimplePlaylistObject playlist, + List<_i40.PageRouteInfo>? children, }) : super( PlaylistRoute.name, args: PlaylistRouteArgs( @@ -627,7 +628,7 @@ class PlaylistRoute extends _i39.PageRouteInfo { static const String name = 'PlaylistRoute'; - static _i39.PageInfo page = _i39.PageInfo( + static _i40.PageInfo page = _i40.PageInfo( name, builder: (data) { final args = data.argsAs(); @@ -647,11 +648,11 @@ class PlaylistRouteArgs { required this.playlist, }); - final _i40.Key? key; + final _i41.Key? key; final String id; - final _i41.SpotubeSimplePlaylistObject playlist; + final _i42.SpotubeSimplePlaylistObject playlist; @override String toString() { @@ -661,8 +662,8 @@ class PlaylistRouteArgs { /// generated route for /// [_i21.ProfilePage] -class ProfileRoute extends _i39.PageRouteInfo { - const ProfileRoute({List<_i39.PageRouteInfo>? children}) +class ProfileRoute extends _i40.PageRouteInfo { + const ProfileRoute({List<_i40.PageRouteInfo>? children}) : super( ProfileRoute.name, initialChildren: children, @@ -670,7 +671,7 @@ class ProfileRoute extends _i39.PageRouteInfo { static const String name = 'ProfileRoute'; - static _i39.PageInfo page = _i39.PageInfo( + static _i40.PageInfo page = _i40.PageInfo( name, builder: (data) { return const _i21.ProfilePage(); @@ -680,8 +681,8 @@ class ProfileRoute extends _i39.PageRouteInfo { /// generated route for /// [_i22.RootAppPage] -class RootAppRoute extends _i39.PageRouteInfo { - const RootAppRoute({List<_i39.PageRouteInfo>? children}) +class RootAppRoute extends _i40.PageRouteInfo { + const RootAppRoute({List<_i40.PageRouteInfo>? children}) : super( RootAppRoute.name, initialChildren: children, @@ -689,7 +690,7 @@ class RootAppRoute extends _i39.PageRouteInfo { static const String name = 'RootAppRoute'; - static _i39.PageInfo page = _i39.PageInfo( + static _i40.PageInfo page = _i40.PageInfo( name, builder: (data) { return const _i22.RootAppPage(); @@ -699,8 +700,8 @@ class RootAppRoute extends _i39.PageRouteInfo { /// generated route for /// [_i23.SearchPage] -class SearchRoute extends _i39.PageRouteInfo { - const SearchRoute({List<_i39.PageRouteInfo>? children}) +class SearchRoute extends _i40.PageRouteInfo { + const SearchRoute({List<_i40.PageRouteInfo>? children}) : super( SearchRoute.name, initialChildren: children, @@ -708,7 +709,7 @@ class SearchRoute extends _i39.PageRouteInfo { static const String name = 'SearchRoute'; - static _i39.PageInfo page = _i39.PageInfo( + static _i40.PageInfo page = _i40.PageInfo( name, builder: (data) { return const _i23.SearchPage(); @@ -717,9 +718,62 @@ class SearchRoute extends _i39.PageRouteInfo { } /// generated route for -/// [_i24.SettingsMetadataProviderPage] -class SettingsMetadataProviderRoute extends _i39.PageRouteInfo { - const SettingsMetadataProviderRoute({List<_i39.PageRouteInfo>? children}) +/// [_i24.SettingsMetadataProviderFormPage] +class SettingsMetadataProviderFormRoute + extends _i40.PageRouteInfo { + SettingsMetadataProviderFormRoute({ + _i43.Key? key, + required String title, + required List<_i42.MetadataFormFieldObject> fields, + List<_i40.PageRouteInfo>? children, + }) : super( + SettingsMetadataProviderFormRoute.name, + args: SettingsMetadataProviderFormRouteArgs( + key: key, + title: title, + fields: fields, + ), + initialChildren: children, + ); + + static const String name = 'SettingsMetadataProviderFormRoute'; + + static _i40.PageInfo page = _i40.PageInfo( + name, + builder: (data) { + final args = data.argsAs(); + return _i24.SettingsMetadataProviderFormPage( + key: args.key, + title: args.title, + fields: args.fields, + ); + }, + ); +} + +class SettingsMetadataProviderFormRouteArgs { + const SettingsMetadataProviderFormRouteArgs({ + this.key, + required this.title, + required this.fields, + }); + + final _i43.Key? key; + + final String title; + + final List<_i42.MetadataFormFieldObject> fields; + + @override + String toString() { + return 'SettingsMetadataProviderFormRouteArgs{key: $key, title: $title, fields: $fields}'; + } +} + +/// generated route for +/// [_i25.SettingsMetadataProviderPage] +class SettingsMetadataProviderRoute extends _i40.PageRouteInfo { + const SettingsMetadataProviderRoute({List<_i40.PageRouteInfo>? children}) : super( SettingsMetadataProviderRoute.name, initialChildren: children, @@ -727,18 +781,18 @@ class SettingsMetadataProviderRoute extends _i39.PageRouteInfo { static const String name = 'SettingsMetadataProviderRoute'; - static _i39.PageInfo page = _i39.PageInfo( + static _i40.PageInfo page = _i40.PageInfo( name, builder: (data) { - return const _i24.SettingsMetadataProviderPage(); + return const _i25.SettingsMetadataProviderPage(); }, ); } /// generated route for -/// [_i25.SettingsPage] -class SettingsRoute extends _i39.PageRouteInfo { - const SettingsRoute({List<_i39.PageRouteInfo>? children}) +/// [_i26.SettingsPage] +class SettingsRoute extends _i40.PageRouteInfo { + const SettingsRoute({List<_i40.PageRouteInfo>? children}) : super( SettingsRoute.name, initialChildren: children, @@ -746,18 +800,18 @@ class SettingsRoute extends _i39.PageRouteInfo { static const String name = 'SettingsRoute'; - static _i39.PageInfo page = _i39.PageInfo( + static _i40.PageInfo page = _i40.PageInfo( name, builder: (data) { - return const _i25.SettingsPage(); + return const _i26.SettingsPage(); }, ); } /// generated route for -/// [_i26.StatsAlbumsPage] -class StatsAlbumsRoute extends _i39.PageRouteInfo { - const StatsAlbumsRoute({List<_i39.PageRouteInfo>? children}) +/// [_i27.StatsAlbumsPage] +class StatsAlbumsRoute extends _i40.PageRouteInfo { + const StatsAlbumsRoute({List<_i40.PageRouteInfo>? children}) : super( StatsAlbumsRoute.name, initialChildren: children, @@ -765,18 +819,18 @@ class StatsAlbumsRoute extends _i39.PageRouteInfo { static const String name = 'StatsAlbumsRoute'; - static _i39.PageInfo page = _i39.PageInfo( + static _i40.PageInfo page = _i40.PageInfo( name, builder: (data) { - return const _i26.StatsAlbumsPage(); + return const _i27.StatsAlbumsPage(); }, ); } /// generated route for -/// [_i27.StatsArtistsPage] -class StatsArtistsRoute extends _i39.PageRouteInfo { - const StatsArtistsRoute({List<_i39.PageRouteInfo>? children}) +/// [_i28.StatsArtistsPage] +class StatsArtistsRoute extends _i40.PageRouteInfo { + const StatsArtistsRoute({List<_i40.PageRouteInfo>? children}) : super( StatsArtistsRoute.name, initialChildren: children, @@ -784,18 +838,18 @@ class StatsArtistsRoute extends _i39.PageRouteInfo { static const String name = 'StatsArtistsRoute'; - static _i39.PageInfo page = _i39.PageInfo( + static _i40.PageInfo page = _i40.PageInfo( name, builder: (data) { - return const _i27.StatsArtistsPage(); + return const _i28.StatsArtistsPage(); }, ); } /// generated route for -/// [_i28.StatsMinutesPage] -class StatsMinutesRoute extends _i39.PageRouteInfo { - const StatsMinutesRoute({List<_i39.PageRouteInfo>? children}) +/// [_i29.StatsMinutesPage] +class StatsMinutesRoute extends _i40.PageRouteInfo { + const StatsMinutesRoute({List<_i40.PageRouteInfo>? children}) : super( StatsMinutesRoute.name, initialChildren: children, @@ -803,18 +857,18 @@ class StatsMinutesRoute extends _i39.PageRouteInfo { static const String name = 'StatsMinutesRoute'; - static _i39.PageInfo page = _i39.PageInfo( + static _i40.PageInfo page = _i40.PageInfo( name, builder: (data) { - return const _i28.StatsMinutesPage(); + return const _i29.StatsMinutesPage(); }, ); } /// generated route for -/// [_i29.StatsPage] -class StatsRoute extends _i39.PageRouteInfo { - const StatsRoute({List<_i39.PageRouteInfo>? children}) +/// [_i30.StatsPage] +class StatsRoute extends _i40.PageRouteInfo { + const StatsRoute({List<_i40.PageRouteInfo>? children}) : super( StatsRoute.name, initialChildren: children, @@ -822,18 +876,18 @@ class StatsRoute extends _i39.PageRouteInfo { static const String name = 'StatsRoute'; - static _i39.PageInfo page = _i39.PageInfo( + static _i40.PageInfo page = _i40.PageInfo( name, builder: (data) { - return const _i29.StatsPage(); + return const _i30.StatsPage(); }, ); } /// generated route for -/// [_i30.StatsPlaylistsPage] -class StatsPlaylistsRoute extends _i39.PageRouteInfo { - const StatsPlaylistsRoute({List<_i39.PageRouteInfo>? children}) +/// [_i31.StatsPlaylistsPage] +class StatsPlaylistsRoute extends _i40.PageRouteInfo { + const StatsPlaylistsRoute({List<_i40.PageRouteInfo>? children}) : super( StatsPlaylistsRoute.name, initialChildren: children, @@ -841,18 +895,18 @@ class StatsPlaylistsRoute extends _i39.PageRouteInfo { static const String name = 'StatsPlaylistsRoute'; - static _i39.PageInfo page = _i39.PageInfo( + static _i40.PageInfo page = _i40.PageInfo( name, builder: (data) { - return const _i30.StatsPlaylistsPage(); + return const _i31.StatsPlaylistsPage(); }, ); } /// generated route for -/// [_i31.StatsStreamFeesPage] -class StatsStreamFeesRoute extends _i39.PageRouteInfo { - const StatsStreamFeesRoute({List<_i39.PageRouteInfo>? children}) +/// [_i32.StatsStreamFeesPage] +class StatsStreamFeesRoute extends _i40.PageRouteInfo { + const StatsStreamFeesRoute({List<_i40.PageRouteInfo>? children}) : super( StatsStreamFeesRoute.name, initialChildren: children, @@ -860,18 +914,18 @@ class StatsStreamFeesRoute extends _i39.PageRouteInfo { static const String name = 'StatsStreamFeesRoute'; - static _i39.PageInfo page = _i39.PageInfo( + static _i40.PageInfo page = _i40.PageInfo( name, builder: (data) { - return const _i31.StatsStreamFeesPage(); + return const _i32.StatsStreamFeesPage(); }, ); } /// generated route for -/// [_i32.StatsStreamsPage] -class StatsStreamsRoute extends _i39.PageRouteInfo { - const StatsStreamsRoute({List<_i39.PageRouteInfo>? children}) +/// [_i33.StatsStreamsPage] +class StatsStreamsRoute extends _i40.PageRouteInfo { + const StatsStreamsRoute({List<_i40.PageRouteInfo>? children}) : super( StatsStreamsRoute.name, initialChildren: children, @@ -879,21 +933,21 @@ class StatsStreamsRoute extends _i39.PageRouteInfo { static const String name = 'StatsStreamsRoute'; - static _i39.PageInfo page = _i39.PageInfo( + static _i40.PageInfo page = _i40.PageInfo( name, builder: (data) { - return const _i32.StatsStreamsPage(); + return const _i33.StatsStreamsPage(); }, ); } /// generated route for -/// [_i33.TrackPage] -class TrackRoute extends _i39.PageRouteInfo { +/// [_i34.TrackPage] +class TrackRoute extends _i40.PageRouteInfo { TrackRoute({ - _i42.Key? key, + _i43.Key? key, required String trackId, - List<_i39.PageRouteInfo>? children, + List<_i40.PageRouteInfo>? children, }) : super( TrackRoute.name, args: TrackRouteArgs( @@ -906,13 +960,13 @@ class TrackRoute extends _i39.PageRouteInfo { static const String name = 'TrackRoute'; - static _i39.PageInfo page = _i39.PageInfo( + static _i40.PageInfo page = _i40.PageInfo( name, builder: (data) { final pathParams = data.inheritedPathParams; final args = data.argsAs( orElse: () => TrackRouteArgs(trackId: pathParams.getString('id'))); - return _i33.TrackPage( + return _i34.TrackPage( key: args.key, trackId: args.trackId, ); @@ -926,7 +980,7 @@ class TrackRouteArgs { required this.trackId, }); - final _i42.Key? key; + final _i43.Key? key; final String trackId; @@ -937,9 +991,9 @@ class TrackRouteArgs { } /// generated route for -/// [_i34.UserAlbumsPage] -class UserAlbumsRoute extends _i39.PageRouteInfo { - const UserAlbumsRoute({List<_i39.PageRouteInfo>? children}) +/// [_i35.UserAlbumsPage] +class UserAlbumsRoute extends _i40.PageRouteInfo { + const UserAlbumsRoute({List<_i40.PageRouteInfo>? children}) : super( UserAlbumsRoute.name, initialChildren: children, @@ -947,18 +1001,18 @@ class UserAlbumsRoute extends _i39.PageRouteInfo { static const String name = 'UserAlbumsRoute'; - static _i39.PageInfo page = _i39.PageInfo( + static _i40.PageInfo page = _i40.PageInfo( name, builder: (data) { - return const _i34.UserAlbumsPage(); + return const _i35.UserAlbumsPage(); }, ); } /// generated route for -/// [_i35.UserArtistsPage] -class UserArtistsRoute extends _i39.PageRouteInfo { - const UserArtistsRoute({List<_i39.PageRouteInfo>? children}) +/// [_i36.UserArtistsPage] +class UserArtistsRoute extends _i40.PageRouteInfo { + const UserArtistsRoute({List<_i40.PageRouteInfo>? children}) : super( UserArtistsRoute.name, initialChildren: children, @@ -966,18 +1020,18 @@ class UserArtistsRoute extends _i39.PageRouteInfo { static const String name = 'UserArtistsRoute'; - static _i39.PageInfo page = _i39.PageInfo( + static _i40.PageInfo page = _i40.PageInfo( name, builder: (data) { - return const _i35.UserArtistsPage(); + return const _i36.UserArtistsPage(); }, ); } /// generated route for -/// [_i36.UserDownloadsPage] -class UserDownloadsRoute extends _i39.PageRouteInfo { - const UserDownloadsRoute({List<_i39.PageRouteInfo>? children}) +/// [_i37.UserDownloadsPage] +class UserDownloadsRoute extends _i40.PageRouteInfo { + const UserDownloadsRoute({List<_i40.PageRouteInfo>? children}) : super( UserDownloadsRoute.name, initialChildren: children, @@ -985,18 +1039,18 @@ class UserDownloadsRoute extends _i39.PageRouteInfo { static const String name = 'UserDownloadsRoute'; - static _i39.PageInfo page = _i39.PageInfo( + static _i40.PageInfo page = _i40.PageInfo( name, builder: (data) { - return const _i36.UserDownloadsPage(); + return const _i37.UserDownloadsPage(); }, ); } /// generated route for -/// [_i37.UserLocalLibraryPage] -class UserLocalLibraryRoute extends _i39.PageRouteInfo { - const UserLocalLibraryRoute({List<_i39.PageRouteInfo>? children}) +/// [_i38.UserLocalLibraryPage] +class UserLocalLibraryRoute extends _i40.PageRouteInfo { + const UserLocalLibraryRoute({List<_i40.PageRouteInfo>? children}) : super( UserLocalLibraryRoute.name, initialChildren: children, @@ -1004,18 +1058,18 @@ class UserLocalLibraryRoute extends _i39.PageRouteInfo { static const String name = 'UserLocalLibraryRoute'; - static _i39.PageInfo page = _i39.PageInfo( + static _i40.PageInfo page = _i40.PageInfo( name, builder: (data) { - return const _i37.UserLocalLibraryPage(); + return const _i38.UserLocalLibraryPage(); }, ); } /// generated route for -/// [_i38.UserPlaylistsPage] -class UserPlaylistsRoute extends _i39.PageRouteInfo { - const UserPlaylistsRoute({List<_i39.PageRouteInfo>? children}) +/// [_i39.UserPlaylistsPage] +class UserPlaylistsRoute extends _i40.PageRouteInfo { + const UserPlaylistsRoute({List<_i40.PageRouteInfo>? children}) : super( UserPlaylistsRoute.name, initialChildren: children, @@ -1023,10 +1077,10 @@ class UserPlaylistsRoute extends _i39.PageRouteInfo { static const String name = 'UserPlaylistsRoute'; - static _i39.PageInfo page = _i39.PageInfo( + static _i40.PageInfo page = _i40.PageInfo( name, builder: (data) { - return const _i38.UserPlaylistsPage(); + return const _i39.UserPlaylistsPage(); }, ); } diff --git a/lib/models/metadata/fields.dart b/lib/models/metadata/fields.dart new file mode 100644 index 00000000..11d6656d --- /dev/null +++ b/lib/models/metadata/fields.dart @@ -0,0 +1,26 @@ +part of 'metadata.dart'; + +enum FormFieldVariant { text, password, number } + +@Freezed(unionKey: 'objectType') +class MetadataFormFieldObject with _$MetadataFormFieldObject { + @FreezedUnionValue("input") + factory MetadataFormFieldObject.input({ + required String objectType, + required String id, + @Default(FormFieldVariant.text) FormFieldVariant variant, + String? placeholder, + String? defaultValue, + bool? required, + String? regex, + }) = MetadataFormFieldInputObject; + + @FreezedUnionValue("text") + factory MetadataFormFieldObject.text({ + required String objectType, + required String text, + }) = MetadataFormFieldTextObject; + + factory MetadataFormFieldObject.fromJson(Map json) => + _$MetadataFormFieldObjectFromJson(json); +} diff --git a/lib/models/metadata/metadata.dart b/lib/models/metadata/metadata.dart index c625a549..7e3496a4 100644 --- a/lib/models/metadata/metadata.dart +++ b/lib/models/metadata/metadata.dart @@ -18,6 +18,7 @@ part 'metadata.freezed.dart'; part 'album.dart'; part 'artist.dart'; part 'browse.dart'; +part 'fields.dart'; part 'image.dart'; part 'pagination.dart'; part 'playlist.dart'; diff --git a/lib/models/metadata/metadata.freezed.dart b/lib/models/metadata/metadata.freezed.dart index 636a092f..89361ff6 100644 --- a/lib/models/metadata/metadata.freezed.dart +++ b/lib/models/metadata/metadata.freezed.dart @@ -1469,6 +1469,609 @@ abstract class _SpotubeBrowseSectionObject get copyWith => throw _privateConstructorUsedError; } +MetadataFormFieldObject _$MetadataFormFieldObjectFromJson( + Map json) { + switch (json['objectType']) { + case 'input': + return MetadataFormFieldInputObject.fromJson(json); + case 'text': + return MetadataFormFieldTextObject.fromJson(json); + + default: + throw CheckedFromJsonException( + json, + 'objectType', + 'MetadataFormFieldObject', + 'Invalid union type "${json['objectType']}"!'); + } +} + +/// @nodoc +mixin _$MetadataFormFieldObject { + String get objectType => throw _privateConstructorUsedError; + @optionalTypeArgs + TResult when({ + required TResult Function( + String objectType, + String id, + FormFieldVariant variant, + String? placeholder, + String? defaultValue, + bool? required, + String? regex) + input, + required TResult Function(String objectType, String text) text, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function( + String objectType, + String id, + FormFieldVariant variant, + String? placeholder, + String? defaultValue, + bool? required, + String? regex)? + input, + TResult? Function(String objectType, String text)? text, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function( + String objectType, + String id, + FormFieldVariant variant, + String? placeholder, + String? defaultValue, + bool? required, + String? regex)? + input, + TResult Function(String objectType, String text)? text, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(MetadataFormFieldInputObject value) input, + required TResult Function(MetadataFormFieldTextObject value) text, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(MetadataFormFieldInputObject value)? input, + TResult? Function(MetadataFormFieldTextObject value)? text, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(MetadataFormFieldInputObject value)? input, + TResult Function(MetadataFormFieldTextObject value)? text, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + + /// Serializes this MetadataFormFieldObject to a JSON map. + Map toJson() => throw _privateConstructorUsedError; + + /// Create a copy of MetadataFormFieldObject + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $MetadataFormFieldObjectCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $MetadataFormFieldObjectCopyWith<$Res> { + factory $MetadataFormFieldObjectCopyWith(MetadataFormFieldObject value, + $Res Function(MetadataFormFieldObject) then) = + _$MetadataFormFieldObjectCopyWithImpl<$Res, MetadataFormFieldObject>; + @useResult + $Res call({String objectType}); +} + +/// @nodoc +class _$MetadataFormFieldObjectCopyWithImpl<$Res, + $Val extends MetadataFormFieldObject> + implements $MetadataFormFieldObjectCopyWith<$Res> { + _$MetadataFormFieldObjectCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of MetadataFormFieldObject + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? objectType = null, + }) { + return _then(_value.copyWith( + objectType: null == objectType + ? _value.objectType + : objectType // ignore: cast_nullable_to_non_nullable + as String, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$MetadataFormFieldInputObjectImplCopyWith<$Res> + implements $MetadataFormFieldObjectCopyWith<$Res> { + factory _$$MetadataFormFieldInputObjectImplCopyWith( + _$MetadataFormFieldInputObjectImpl value, + $Res Function(_$MetadataFormFieldInputObjectImpl) then) = + __$$MetadataFormFieldInputObjectImplCopyWithImpl<$Res>; + @override + @useResult + $Res call( + {String objectType, + String id, + FormFieldVariant variant, + String? placeholder, + String? defaultValue, + bool? required, + String? regex}); +} + +/// @nodoc +class __$$MetadataFormFieldInputObjectImplCopyWithImpl<$Res> + extends _$MetadataFormFieldObjectCopyWithImpl<$Res, + _$MetadataFormFieldInputObjectImpl> + implements _$$MetadataFormFieldInputObjectImplCopyWith<$Res> { + __$$MetadataFormFieldInputObjectImplCopyWithImpl( + _$MetadataFormFieldInputObjectImpl _value, + $Res Function(_$MetadataFormFieldInputObjectImpl) _then) + : super(_value, _then); + + /// Create a copy of MetadataFormFieldObject + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? objectType = null, + Object? id = null, + Object? variant = null, + Object? placeholder = freezed, + Object? defaultValue = freezed, + Object? required = freezed, + Object? regex = freezed, + }) { + return _then(_$MetadataFormFieldInputObjectImpl( + objectType: null == objectType + ? _value.objectType + : objectType // ignore: cast_nullable_to_non_nullable + as String, + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as String, + variant: null == variant + ? _value.variant + : variant // ignore: cast_nullable_to_non_nullable + as FormFieldVariant, + placeholder: freezed == placeholder + ? _value.placeholder + : placeholder // ignore: cast_nullable_to_non_nullable + as String?, + defaultValue: freezed == defaultValue + ? _value.defaultValue + : defaultValue // ignore: cast_nullable_to_non_nullable + as String?, + required: freezed == required + ? _value.required + : required // ignore: cast_nullable_to_non_nullable + as bool?, + regex: freezed == regex + ? _value.regex + : regex // ignore: cast_nullable_to_non_nullable + as String?, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$MetadataFormFieldInputObjectImpl + implements MetadataFormFieldInputObject { + _$MetadataFormFieldInputObjectImpl( + {required this.objectType, + required this.id, + this.variant = FormFieldVariant.text, + this.placeholder, + this.defaultValue, + this.required, + this.regex}); + + factory _$MetadataFormFieldInputObjectImpl.fromJson( + Map json) => + _$$MetadataFormFieldInputObjectImplFromJson(json); + + @override + final String objectType; + @override + final String id; + @override + @JsonKey() + final FormFieldVariant variant; + @override + final String? placeholder; + @override + final String? defaultValue; + @override + final bool? required; + @override + final String? regex; + + @override + String toString() { + return 'MetadataFormFieldObject.input(objectType: $objectType, id: $id, variant: $variant, placeholder: $placeholder, defaultValue: $defaultValue, required: $required, regex: $regex)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$MetadataFormFieldInputObjectImpl && + (identical(other.objectType, objectType) || + other.objectType == objectType) && + (identical(other.id, id) || other.id == id) && + (identical(other.variant, variant) || other.variant == variant) && + (identical(other.placeholder, placeholder) || + other.placeholder == placeholder) && + (identical(other.defaultValue, defaultValue) || + other.defaultValue == defaultValue) && + (identical(other.required, required) || + other.required == required) && + (identical(other.regex, regex) || other.regex == regex)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash(runtimeType, objectType, id, variant, + placeholder, defaultValue, required, regex); + + /// Create a copy of MetadataFormFieldObject + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$MetadataFormFieldInputObjectImplCopyWith< + _$MetadataFormFieldInputObjectImpl> + get copyWith => __$$MetadataFormFieldInputObjectImplCopyWithImpl< + _$MetadataFormFieldInputObjectImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function( + String objectType, + String id, + FormFieldVariant variant, + String? placeholder, + String? defaultValue, + bool? required, + String? regex) + input, + required TResult Function(String objectType, String text) text, + }) { + return input( + objectType, id, variant, placeholder, defaultValue, required, regex); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function( + String objectType, + String id, + FormFieldVariant variant, + String? placeholder, + String? defaultValue, + bool? required, + String? regex)? + input, + TResult? Function(String objectType, String text)? text, + }) { + return input?.call( + objectType, id, variant, placeholder, defaultValue, required, regex); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function( + String objectType, + String id, + FormFieldVariant variant, + String? placeholder, + String? defaultValue, + bool? required, + String? regex)? + input, + TResult Function(String objectType, String text)? text, + required TResult orElse(), + }) { + if (input != null) { + return input( + objectType, id, variant, placeholder, defaultValue, required, regex); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(MetadataFormFieldInputObject value) input, + required TResult Function(MetadataFormFieldTextObject value) text, + }) { + return input(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(MetadataFormFieldInputObject value)? input, + TResult? Function(MetadataFormFieldTextObject value)? text, + }) { + return input?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(MetadataFormFieldInputObject value)? input, + TResult Function(MetadataFormFieldTextObject value)? text, + required TResult orElse(), + }) { + if (input != null) { + return input(this); + } + return orElse(); + } + + @override + Map toJson() { + return _$$MetadataFormFieldInputObjectImplToJson( + this, + ); + } +} + +abstract class MetadataFormFieldInputObject implements MetadataFormFieldObject { + factory MetadataFormFieldInputObject( + {required final String objectType, + required final String id, + final FormFieldVariant variant, + final String? placeholder, + final String? defaultValue, + final bool? required, + final String? regex}) = _$MetadataFormFieldInputObjectImpl; + + factory MetadataFormFieldInputObject.fromJson(Map json) = + _$MetadataFormFieldInputObjectImpl.fromJson; + + @override + String get objectType; + String get id; + FormFieldVariant get variant; + String? get placeholder; + String? get defaultValue; + bool? get required; + String? get regex; + + /// Create a copy of MetadataFormFieldObject + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$MetadataFormFieldInputObjectImplCopyWith< + _$MetadataFormFieldInputObjectImpl> + get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$MetadataFormFieldTextObjectImplCopyWith<$Res> + implements $MetadataFormFieldObjectCopyWith<$Res> { + factory _$$MetadataFormFieldTextObjectImplCopyWith( + _$MetadataFormFieldTextObjectImpl value, + $Res Function(_$MetadataFormFieldTextObjectImpl) then) = + __$$MetadataFormFieldTextObjectImplCopyWithImpl<$Res>; + @override + @useResult + $Res call({String objectType, String text}); +} + +/// @nodoc +class __$$MetadataFormFieldTextObjectImplCopyWithImpl<$Res> + extends _$MetadataFormFieldObjectCopyWithImpl<$Res, + _$MetadataFormFieldTextObjectImpl> + implements _$$MetadataFormFieldTextObjectImplCopyWith<$Res> { + __$$MetadataFormFieldTextObjectImplCopyWithImpl( + _$MetadataFormFieldTextObjectImpl _value, + $Res Function(_$MetadataFormFieldTextObjectImpl) _then) + : super(_value, _then); + + /// Create a copy of MetadataFormFieldObject + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? objectType = null, + Object? text = null, + }) { + return _then(_$MetadataFormFieldTextObjectImpl( + objectType: null == objectType + ? _value.objectType + : objectType // ignore: cast_nullable_to_non_nullable + as String, + text: null == text + ? _value.text + : text // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$MetadataFormFieldTextObjectImpl implements MetadataFormFieldTextObject { + _$MetadataFormFieldTextObjectImpl( + {required this.objectType, required this.text}); + + factory _$MetadataFormFieldTextObjectImpl.fromJson( + Map json) => + _$$MetadataFormFieldTextObjectImplFromJson(json); + + @override + final String objectType; + @override + final String text; + + @override + String toString() { + return 'MetadataFormFieldObject.text(objectType: $objectType, text: $text)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$MetadataFormFieldTextObjectImpl && + (identical(other.objectType, objectType) || + other.objectType == objectType) && + (identical(other.text, text) || other.text == text)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash(runtimeType, objectType, text); + + /// Create a copy of MetadataFormFieldObject + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$MetadataFormFieldTextObjectImplCopyWith<_$MetadataFormFieldTextObjectImpl> + get copyWith => __$$MetadataFormFieldTextObjectImplCopyWithImpl< + _$MetadataFormFieldTextObjectImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function( + String objectType, + String id, + FormFieldVariant variant, + String? placeholder, + String? defaultValue, + bool? required, + String? regex) + input, + required TResult Function(String objectType, String text) text, + }) { + return text(objectType, this.text); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function( + String objectType, + String id, + FormFieldVariant variant, + String? placeholder, + String? defaultValue, + bool? required, + String? regex)? + input, + TResult? Function(String objectType, String text)? text, + }) { + return text?.call(objectType, this.text); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function( + String objectType, + String id, + FormFieldVariant variant, + String? placeholder, + String? defaultValue, + bool? required, + String? regex)? + input, + TResult Function(String objectType, String text)? text, + required TResult orElse(), + }) { + if (text != null) { + return text(objectType, this.text); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(MetadataFormFieldInputObject value) input, + required TResult Function(MetadataFormFieldTextObject value) text, + }) { + return text(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(MetadataFormFieldInputObject value)? input, + TResult? Function(MetadataFormFieldTextObject value)? text, + }) { + return text?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(MetadataFormFieldInputObject value)? input, + TResult Function(MetadataFormFieldTextObject value)? text, + required TResult orElse(), + }) { + if (text != null) { + return text(this); + } + return orElse(); + } + + @override + Map toJson() { + return _$$MetadataFormFieldTextObjectImplToJson( + this, + ); + } +} + +abstract class MetadataFormFieldTextObject implements MetadataFormFieldObject { + factory MetadataFormFieldTextObject( + {required final String objectType, + required final String text}) = _$MetadataFormFieldTextObjectImpl; + + factory MetadataFormFieldTextObject.fromJson(Map json) = + _$MetadataFormFieldTextObjectImpl.fromJson; + + @override + String get objectType; + String get text; + + /// Create a copy of MetadataFormFieldObject + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$MetadataFormFieldTextObjectImplCopyWith<_$MetadataFormFieldTextObjectImpl> + get copyWith => throw _privateConstructorUsedError; +} + SpotubeImageObject _$SpotubeImageObjectFromJson(Map json) { return _SpotubeImageObject.fromJson(json); } diff --git a/lib/models/metadata/metadata.g.dart b/lib/models/metadata/metadata.g.dart index 75e2ec18..ffafa931 100644 --- a/lib/models/metadata/metadata.g.dart +++ b/lib/models/metadata/metadata.g.dart @@ -153,6 +153,52 @@ Map _$$SpotubeBrowseSectionObjectImplToJson( 'items': instance.items.map(toJsonT).toList(), }; +_$MetadataFormFieldInputObjectImpl _$$MetadataFormFieldInputObjectImplFromJson( + Map json) => + _$MetadataFormFieldInputObjectImpl( + objectType: json['objectType'] as String, + id: json['id'] as String, + variant: + $enumDecodeNullable(_$FormFieldVariantEnumMap, json['variant']) ?? + FormFieldVariant.text, + placeholder: json['placeholder'] as String?, + defaultValue: json['defaultValue'] as String?, + required: json['required'] as bool?, + regex: json['regex'] as String?, + ); + +Map _$$MetadataFormFieldInputObjectImplToJson( + _$MetadataFormFieldInputObjectImpl instance) => + { + 'objectType': instance.objectType, + 'id': instance.id, + 'variant': _$FormFieldVariantEnumMap[instance.variant]!, + 'placeholder': instance.placeholder, + 'defaultValue': instance.defaultValue, + 'required': instance.required, + 'regex': instance.regex, + }; + +const _$FormFieldVariantEnumMap = { + FormFieldVariant.text: 'text', + FormFieldVariant.password: 'password', + FormFieldVariant.number: 'number', +}; + +_$MetadataFormFieldTextObjectImpl _$$MetadataFormFieldTextObjectImplFromJson( + Map json) => + _$MetadataFormFieldTextObjectImpl( + objectType: json['objectType'] as String, + text: json['text'] as String, + ); + +Map _$$MetadataFormFieldTextObjectImplToJson( + _$MetadataFormFieldTextObjectImpl instance) => + { + 'objectType': instance.objectType, + 'text': instance.text, + }; + _$SpotubeImageObjectImpl _$$SpotubeImageObjectImplFromJson(Map json) => _$SpotubeImageObjectImpl( url: json['url'] as String, diff --git a/lib/pages/settings/metadata/metadata_form.dart b/lib/pages/settings/metadata/metadata_form.dart new file mode 100644 index 00000000..3cd29937 --- /dev/null +++ b/lib/pages/settings/metadata/metadata_form.dart @@ -0,0 +1,141 @@ +import 'package:auto_route/auto_route.dart'; +import 'package:flutter_form_builder/flutter_form_builder.dart'; +import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:flutter_markdown_plus/flutter_markdown_plus.dart'; +import 'package:form_builder_validators/form_builder_validators.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:shadcn_flutter/shadcn_flutter.dart'; +import 'package:shadcn_flutter/shadcn_flutter_extension.dart'; +import 'package:spotube/components/titlebar/titlebar.dart'; +import 'package:spotube/extensions/context.dart'; +import 'package:spotube/models/metadata/metadata.dart'; + +@RoutePage() +class SettingsMetadataProviderFormPage extends HookConsumerWidget { + final String title; + final List fields; + const SettingsMetadataProviderFormPage({ + super.key, + required this.title, + required this.fields, + }); + + @override + Widget build(BuildContext context, ref) { + final formKey = useMemoized(() => GlobalKey(), []); + + return Scaffold( + headers: [ + TitleBar( + title: Text(title), + ), + ], + child: FormBuilder( + key: formKey, + child: Center( + child: Container( + padding: const EdgeInsets.all(16), + constraints: const BoxConstraints(maxWidth: 600), + child: CustomScrollView( + shrinkWrap: true, + slivers: [ + SliverToBoxAdapter( + child: Text( + title, + textAlign: TextAlign.center, + style: context.theme.typography.h2, + ), + ), + const SliverGap(24), + SliverList.separated( + itemCount: fields.length, + separatorBuilder: (context, index) => const Gap(12), + itemBuilder: (context, index) { + if (fields[index] is MetadataFormFieldTextObject) { + final field = + fields[index] as MetadataFormFieldTextObject; + return MarkdownBody(data: field.text); + } + + final field = fields[index] as MetadataFormFieldInputObject; + return FormBuilderField( + name: field.id, + initialValue: field.defaultValue, + validator: FormBuilderValidators.compose([ + if (field.required == true) + FormBuilderValidators.required( + errorText: 'This field is required', + ), + if (field.regex != null) + FormBuilderValidators.match( + RegExp(field.regex!), + errorText: + "Input doesn't match the required format", + ), + ]), + builder: (formField) { + return Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 4, + children: [ + TextField( + placeholder: field.placeholder == null + ? null + : Text(field.placeholder!), + initialValue: formField.value, + onChanged: (value) { + formField.didChange(value); + }, + obscureText: + field.variant == FormFieldVariant.password, + keyboardType: + field.variant == FormFieldVariant.number + ? TextInputType.number + : TextInputType.text, + features: [ + if (field.variant == FormFieldVariant.password) + const InputFeature.passwordToggle(), + ], + ), + if (formField.hasError) + Text( + formField.errorText ?? '', + style: const TextStyle( + color: Colors.red, fontSize: 12), + ), + ], + ); + }, + ); + }, + ), + const SliverGap(24), + SliverToBoxAdapter( + child: Button.primary( + onPressed: () { + if (formKey.currentState?.saveAndValidate() != true) { + return; + } + + final data = formKey.currentState!.value.entries + .map((e) => { + "id": e.key, + "value": e.value, + }) + .toList(); + + context.router.maybePop(data); + }, + child: Text(context.l10n.submit), + ), + ), + const SliverGap(200) + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/services/metadata/metadata.dart b/lib/services/metadata/metadata.dart index 98dad35a..14132cf3 100644 --- a/lib/services/metadata/metadata.dart +++ b/lib/services/metadata/metadata.dart @@ -8,6 +8,7 @@ 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/collections/routes.gr.dart'; import 'package:spotube/components/titlebar/titlebar.dart'; import 'package:spotube/models/metadata/metadata.dart'; import 'package:spotube/services/metadata/apis/localstorage.dart'; @@ -57,6 +58,20 @@ class MetadataPlugin { onNavigatorPop: () { pageContext?.maybePop(); }, + onShowForm: (title, fields) async { + if (rootNavigatorKey.currentContext == null) { + return []; + } + + return await rootNavigatorKey.currentContext!.router + .push>?>( + SettingsMetadataProviderFormRoute( + title: title, + fields: + fields.map((e) => MetadataFormFieldObject.fromJson(e)).toList(), + ), + ); + }, ); await HetuStdLoader.loadBytecodeFlutter(hetu); diff --git a/pubspec.lock b/pubspec.lock index 3cc1d962..680e068f 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -938,6 +938,14 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_markdown_plus: + dependency: "direct main" + description: + name: flutter_markdown_plus + sha256: fe74214c5ac2f850d93efda290dcde3f18006e90a87caa9e3e6c13222a5db4de + url: "https://pub.dev" + source: hosted + version: "1.0.3" flutter_native_splash: dependency: "direct main" description: @@ -1209,7 +1217,7 @@ packages: description: path: "." ref: main - resolved-ref: eeb574c3fac0da07ba93c9d972b7eb38960538d2 + resolved-ref: c4895250ee45a59c88770f97abebc9e9bbb62259 url: "https://github.com/KRTirtho/hetu_spotube_plugin.git" source: git version: "0.0.1" @@ -1523,6 +1531,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.1.3-main.0" + markdown: + dependency: transitive + description: + name: markdown + sha256: "935e23e1ff3bc02d390bad4d4be001208ee92cc217cb5b5a6c19bc14aaa318c1" + url: "https://pub.dev" + source: hosted + version: "7.3.0" matcher: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 545c608e..a791605a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -156,6 +156,7 @@ dependencies: url: https://github.com/KRTirtho/hetu_spotube_plugin.git ref: main get_it: ^8.0.3 + flutter_markdown_plus: ^1.0.3 dev_dependencies: build_runner: ^2.4.13