chore: use shadcn in all places that's using material

This commit is contained in:
Kingkor Roy Tirtho 2025-01-30 21:44:07 +06:00
parent e0760e6250
commit 6cf4ca9179
36 changed files with 70 additions and 91 deletions

View File

@ -39,9 +39,9 @@ abstract class Env {
static final String _releaseChannel = _Env._releaseChannel; static final String _releaseChannel = _Env._releaseChannel;
@EnviedField(varName: "DISABLE_SPOTIFY_IMAGES", defaultValue: "0") @EnviedField(varName: "DISABLE_SPOTIFY_IMAGES", defaultValue: "0")
static final int _disableSpotifyImages = _Env._disableSpotifyImages; static final String _disableSpotifyImages = _Env._disableSpotifyImages;
static bool get disableSpotifyImages => _disableSpotifyImages == 1; static bool get disableSpotifyImages => _disableSpotifyImages == "1";
static ReleaseChannel get releaseChannel => _releaseChannel == "stable" static ReleaseChannel get releaseChannel => _releaseChannel == "stable"
? ReleaseChannel.stable ? ReleaseChannel.stable

View File

@ -1,4 +1,4 @@
import 'package:flutter/material.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart';
const gradients = [ const gradients = [
LinearGradient(colors: [ LinearGradient(colors: [

View File

@ -1,4 +1,4 @@
import 'package:flutter/material.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart';
import 'package:spotube/collections/spotube_icons.dart'; import 'package:spotube/collections/spotube_icons.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:spotube/pages/home/home.dart'; import 'package:spotube/pages/home/home.dart';

View File

@ -1,5 +1,5 @@
import 'package:fluentui_system_icons/fluentui_system_icons.dart'; import 'package:fluentui_system_icons/fluentui_system_icons.dart';
import 'package:flutter/material.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart';
import 'package:flutter_feather_icons/flutter_feather_icons.dart'; import 'package:flutter_feather_icons/flutter_feather_icons.dart';
import 'package:simple_icons/simple_icons.dart'; import 'package:simple_icons/simple_icons.dart';

View File

@ -1,4 +1,4 @@
import 'package:flutter/material.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart';
import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_hooks/flutter_hooks.dart';
class AnimateGradient extends HookWidget { class AnimateGradient extends HookWidget {

View File

@ -1,6 +1,6 @@
import 'dart:io'; import 'dart:io';
import 'package:flutter/material.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart';
/// A temporary workaround for [WillPopScope] and [PopScope] not working in GoRouter /// A temporary workaround for [WillPopScope] and [PopScope] not working in GoRouter
/// https://github.com/flutter/flutter/issues/140869#issuecomment-2247181468 /// https://github.com/flutter/flutter/issues/140869#issuecomment-2247181468

View File

@ -1,5 +1,5 @@
import 'package:draggable_scrollbar/draggable_scrollbar.dart'; import 'package:draggable_scrollbar/draggable_scrollbar.dart';
import 'package:flutter/material.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart';
import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:spotube/utils/platform.dart'; import 'package:spotube/utils/platform.dart';

View File

@ -1,4 +1,4 @@
import 'package:flutter/material.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart';
import 'package:spotify/spotify.dart'; import 'package:spotify/spotify.dart';
import 'package:spotube/components/links/anchor_button.dart'; import 'package:spotube/components/links/anchor_button.dart';
import 'package:spotube/extensions/context.dart'; import 'package:spotube/extensions/context.dart';

View File

@ -1,4 +1,4 @@
import 'package:flutter/material.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart';
import 'package:spotube/components/links/anchor_button.dart'; import 'package:spotube/components/links/anchor_button.dart';
import 'package:url_launcher/url_launcher_string.dart'; import 'package:url_launcher/url_launcher_string.dart';

View File

@ -1,4 +1,4 @@
import 'package:flutter/material.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart';
import 'package:spotube/components/links/anchor_button.dart'; import 'package:spotube/components/links/anchor_button.dart';
import 'package:spotube/utils/service_utils.dart'; import 'package:spotube/utils/service_utils.dart';

View File

@ -1,4 +1,4 @@
import 'package:flutter/material.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart';
import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:gap/gap.dart'; import 'package:gap/gap.dart';

View File

@ -1,4 +1,4 @@
import 'package:flutter/material.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart';
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
class SpotubePage<T> extends MaterialPage<T> { class SpotubePage<T> extends MaterialPage<T> {

View File

@ -1,4 +1,4 @@
import 'package:flutter/material.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart';
import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:shadcn_flutter/shadcn_flutter_extension.dart'; import 'package:shadcn_flutter/shadcn_flutter_extension.dart';

View File

@ -1,4 +1,4 @@
import 'package:flutter/material.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart';
extension ColorAlterer on Color { extension ColorAlterer on Color {
Color darken(double amount) { Color darken(double amount) {

View File

@ -1,4 +1,4 @@
import 'package:flutter/material.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart';
extension AppLocale on BuildContext { extension AppLocale on BuildContext {

View File

@ -1,34 +0,0 @@
import 'package:flutter/material.dart';
class ShimmerColorTheme extends ThemeExtension<ShimmerColorTheme> {
final Color? shimmerColor;
final Color? shimmerBackgroundColor;
ShimmerColorTheme({
this.shimmerBackgroundColor,
this.shimmerColor,
});
@override
ThemeExtension<ShimmerColorTheme> copyWith(
{Color? shimmerColor, Color? shimmerBackgroundColor}) {
return ShimmerColorTheme(
shimmerBackgroundColor:
shimmerBackgroundColor ?? this.shimmerBackgroundColor,
shimmerColor: shimmerColor ?? this.shimmerColor,
);
}
@override
ThemeExtension<ShimmerColorTheme> lerp(
ThemeExtension<ShimmerColorTheme>? other, double t) {
if (other is! ShimmerColorTheme) {
return this;
}
return ShimmerColorTheme(
shimmerBackgroundColor:
Color.lerp(shimmerBackgroundColor, other.shimmerBackgroundColor, t),
shimmerColor: Color.lerp(shimmerColor, other.shimmerColor, t),
);
}
}

View File

@ -1,4 +1,4 @@
import 'package:flutter/material.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart';
import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:spotube/utils/platform.dart'; import 'package:spotube/utils/platform.dart';
import 'package:window_manager/window_manager.dart'; import 'package:window_manager/window_manager.dart';

View File

@ -1,5 +1,5 @@
import 'package:flutter/gestures.dart'; import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart';
import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:spotube/utils/platform.dart'; import 'package:spotube/utils/platform.dart';

View File

@ -1,4 +1,4 @@
import 'package:flutter/material.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart';
import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:scroll_to_index/scroll_to_index.dart'; import 'package:scroll_to_index/scroll_to_index.dart';

View File

@ -1,4 +1,4 @@
import 'package:flutter/material.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart';
import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:package_info_plus/package_info_plus.dart'; import 'package:package_info_plus/package_info_plus.dart';

View File

@ -1,4 +1,4 @@
import 'package:flutter/material.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart';
import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:spotube/extensions/constrains.dart'; import 'package:spotube/extensions/constrains.dart';

View File

@ -1,4 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/services.dart';
import 'package:shadcn_flutter/shadcn_flutter.dart';
import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_hooks/flutter_hooks.dart';
T useBrightnessValue<T>( T useBrightnessValue<T>(

View File

@ -1,4 +1,4 @@
import 'package:flutter/material.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_hooks/flutter_hooks.dart';
@ -9,7 +9,7 @@ VoidCallback useCustomStatusBarColor(
bool? automaticSystemUiAdjustment, bool? automaticSystemUiAdjustment,
}) { }) {
final context = useContext(); final context = useContext();
final backgroundColor = Theme.of(context).scaffoldBackgroundColor; final backgroundColor = Theme.of(context).colorScheme.background;
// ignore: invalid_use_of_visible_for_testing_member // ignore: invalid_use_of_visible_for_testing_member
final previousState = SystemChrome.latestStyle; final previousState = SystemChrome.latestStyle;

View File

@ -1,4 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/services.dart';
import 'package:shadcn_flutter/shadcn_flutter.dart';
import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:palette_generator/palette_generator.dart'; import 'package:palette_generator/palette_generator.dart';
@ -6,7 +7,7 @@ import 'package:spotube/components/image/universal_image.dart';
final _paletteColorState = StateProvider<PaletteColor>( final _paletteColorState = StateProvider<PaletteColor>(
(ref) { (ref) {
return PaletteColor(Colors.grey[300]!, 0); return PaletteColor(Colors.gray[300], 0);
}, },
); );

View File

@ -16,7 +16,7 @@
library l10n; library l10n;
import 'package:flutter/material.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart';
class L10n { class L10n {
static final all = [ static final all = [

View File

@ -2,7 +2,7 @@
import 'package:drift/internal/versioned_schema.dart' as i0; import 'package:drift/internal/versioned_schema.dart' as i0;
import 'package:drift/drift.dart' as i1; import 'package:drift/drift.dart' as i1;
import 'package:drift/drift.dart'; // ignore_for_file: type=lint,unused_import import 'package:drift/drift.dart'; // ignore_for_file: type=lint,unused_import
import 'package:flutter/material.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart';
import 'package:spotify/spotify.dart'; import 'package:spotify/spotify.dart';
import 'package:spotube/models/database/database.dart'; import 'package:spotube/models/database/database.dart';
import 'package:spotube/services/sourced_track/enums.dart'; import 'package:spotube/services/sourced_track/enums.dart';

View File

@ -1,4 +1,4 @@
import 'package:flutter/material.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:spotify/spotify.dart'; import 'package:spotify/spotify.dart';
@ -53,14 +53,14 @@ class PlayerTrackDetails extends HookConsumerWidget {
"/track/${playback.activeTrack?.id}", "/track/${playback.activeTrack?.id}",
push: true, push: true,
overflow: TextOverflow.ellipsis, overflow: TextOverflow.ellipsis,
style: theme.textTheme.bodyMedium!.copyWith( style: theme.typography.normal.copyWith(
color: color, color: color,
), ),
), ),
Text( Text(
playback.activeTrack?.artists?.asString() ?? "", playback.activeTrack?.artists?.asString() ?? "",
overflow: TextOverflow.ellipsis, overflow: TextOverflow.ellipsis,
style: theme.textTheme.bodySmall!.copyWith(color: color), style: theme.typography.small.copyWith(color: color),
) )
], ],
), ),

View File

@ -1,5 +1,5 @@
import 'package:flutter/gestures.dart'; import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:spotify/spotify.dart'; import 'package:spotify/spotify.dart';
import 'package:spotube/collections/spotube_icons.dart'; import 'package:spotube/collections/spotube_icons.dart';
@ -16,7 +16,7 @@ class ArtistPageFooter extends ConsumerWidget {
@override @override
Widget build(BuildContext context, ref) { Widget build(BuildContext context, ref) {
final ThemeData(:textTheme) = Theme.of(context); final ThemeData(:typography) = Theme.of(context);
final mediaQuery = MediaQuery.of(context); final mediaQuery = MediaQuery.of(context);
final artistImage = artist.images.asUrlString( final artistImage = artist.images.asUrlString(
@ -50,7 +50,7 @@ class ArtistPageFooter extends ConsumerWidget {
alignment: Alignment.center, alignment: Alignment.center,
child: RichText( child: RichText(
text: TextSpan( text: TextSpan(
style: textTheme.bodyLarge?.copyWith( style: typography.semiBold.copyWith(
color: Colors.white, color: Colors.white,
), ),
children: [ children: [
@ -64,7 +64,7 @@ class ArtistPageFooter extends ConsumerWidget {
), ),
TextSpan( TextSpan(
text: " Wikipedia", text: " Wikipedia",
style: textTheme.titleLarge?.copyWith( style: typography.large.copyWith(
color: Colors.white, color: Colors.white,
), ),
), ),
@ -74,10 +74,10 @@ class ArtistPageFooter extends ConsumerWidget {
), ),
TextSpan( TextSpan(
text: '\n...read more at wikipedia', text: '\n...read more at wikipedia',
style: textTheme.bodyLarge?.copyWith( style: typography.semiBold.copyWith(
color: Colors.lightBlue[300], color: Colors.sky[300],
decoration: TextDecoration.underline, decoration: TextDecoration.underline,
decorationColor: Colors.lightBlue[300], decorationColor: Colors.sky[300],
), ),
recognizer: TapGestureRecognizer() recognizer: TapGestureRecognizer()
..onTap = () async { ..onTap = () async {

View File

@ -1,4 +1,4 @@
import 'package:flutter/material.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:spotube/modules/artist/artist_card.dart'; import 'package:spotube/modules/artist/artist_card.dart';
import 'package:spotube/provider/spotify/spotify.dart'; import 'package:spotube/provider/spotify/spotify.dart';

View File

@ -1,7 +1,7 @@
import 'dart:io'; import 'dart:io';
import 'package:desktop_webview_window/desktop_webview_window.dart'; import 'package:desktop_webview_window/desktop_webview_window.dart';
import 'package:flutter/material.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart' hide join;
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
@ -28,7 +28,8 @@ Future<void> Function() useLoginCallback(WidgetRef ref) {
final exp = RegExp(r"https:\/\/accounts.spotify.com\/.+\/status"); final exp = RegExp(r"https:\/\/accounts.spotify.com\/.+\/status");
final applicationSupportDir = await getApplicationSupportDirectory(); final applicationSupportDir = await getApplicationSupportDirectory();
final userDataFolder = Directory( final userDataFolder = Directory(
join(applicationSupportDir.path, "webview_window_Webview2")); join(applicationSupportDir.path, "webview_window_Webview2"),
);
if (!await userDataFolder.exists()) { if (!await userDataFolder.exists()) {
await userDataFolder.create(); await userDataFolder.create();

View File

@ -1,7 +1,8 @@
import 'package:flutter/material.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart'; import 'package:flutter_inappwebview/flutter_inappwebview.dart';
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:spotube/components/button/back_button.dart';
import 'package:spotube/components/titlebar/titlebar.dart'; import 'package:spotube/components/titlebar/titlebar.dart';
import 'package:spotube/provider/authentication/authentication.dart'; import 'package:spotube/provider/authentication/authentication.dart';
@ -17,19 +18,21 @@ class WebViewLogin extends HookConsumerWidget {
if (kIsDesktop) { if (kIsDesktop) {
const Scaffold( const Scaffold(
body: Center( child: Center(
child: Text('This feature is not available on desktop'), child: Text('This feature is not available on desktop'),
), ),
); );
} }
return Scaffold( return Scaffold(
appBar: const TitleBar( headers: const [
TitleBar(
leading: [BackButton(color: Colors.white)], leading: [BackButton(color: Colors.white)],
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
), ),
extendBodyBehindAppBar: true, ],
body: InAppWebView( floatingHeader: true,
child: InAppWebView(
initialSettings: InAppWebViewSettings( initialSettings: InAppWebViewSettings(
userAgent: userAgent:
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 safari/537.36", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 safari/537.36",

View File

@ -1,4 +1,4 @@
import 'package:flutter/material.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart';
import 'package:spotube/extensions/context.dart'; import 'package:spotube/extensions/context.dart';
import 'package:url_launcher/url_launcher_string.dart'; import 'package:url_launcher/url_launcher_string.dart';
@ -19,7 +19,7 @@ class NoWebviewRuntimeDialog extends StatelessWidget {
}, },
child: Text(context.l10n.cancel), child: Text(context.l10n.cancel),
), ),
FilledButton( Button.primary(
onPressed: () async { onPressed: () async {
final url = switch (platform) { final url = switch (platform) {
TargetPlatform.windows => TargetPlatform.windows =>
@ -30,8 +30,15 @@ class NoWebviewRuntimeDialog extends StatelessWidget {
_ => "", _ => "",
}; };
if (url.isEmpty) { if (url.isEmpty) {
ScaffoldMessenger.of(context).showSnackBar( showToast(
const SnackBar(content: Text('Unsupported platform')), context: context,
builder: (context, overlay) {
return const SurfaceCard(
child: Basic(
title: Text('Unsupported platform'),
),
);
},
); );
} }

View File

@ -11,7 +11,7 @@ import 'package:spotube/provider/database/database.dart';
import 'package:spotube/services/logger/logger.dart'; import 'package:spotube/services/logger/logger.dart';
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:dio/dio.dart'; import 'package:dio/dio.dart';
import 'package:flutter/material.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
import 'package:lrc/lrc.dart'; import 'package:lrc/lrc.dart';
import 'package:package_info_plus/package_info_plus.dart'; import 'package:package_info_plus/package_info_plus.dart';

View File

@ -1,5 +1,5 @@
import 'package:audio_service/audio_service.dart'; import 'package:audio_service/audio_service.dart';
import 'package:flutter/material.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:spotify/spotify.dart'; import 'package:spotify/spotify.dart';
import 'package:spotube/collections/env.dart'; import 'package:spotube/collections/env.dart';

View File

@ -3,7 +3,7 @@ import 'dart:io';
import 'dart:isolate'; import 'dart:isolate';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart' hide join;
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:logger/logger.dart'; import 'package:logger/logger.dart';
import 'package:path/path.dart'; import 'package:path/path.dart';

View File

@ -1,4 +1,4 @@
import 'package:flutter/material.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart';
import 'package:spotube/services/kv_store/kv_store.dart'; import 'package:spotube/services/kv_store/kv_store.dart';
import 'package:spotube/utils/platform.dart'; import 'package:spotube/utils/platform.dart';
import 'package:window_manager/window_manager.dart'; import 'package:window_manager/window_manager.dart';