feat: replace all types of buttons with platform buttons

This commit is contained in:
Kingkor Roy Tirtho 2022-10-29 15:26:55 +06:00
parent 9eee573ce9
commit 69739b4572
26 changed files with 131 additions and 97 deletions

View File

@ -4,6 +4,7 @@ import 'package:flutter/material.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';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:platform_ui/platform_ui.dart';
import 'package:spotify/spotify.dart'; import 'package:spotify/spotify.dart';
import 'package:spotube/components/Artist/ArtistAlbumList.dart'; import 'package:spotube/components/Artist/ArtistAlbumList.dart';
import 'package:spotube/components/Artist/ArtistCard.dart'; import 'package:spotube/components/Artist/ArtistCard.dart';
@ -176,7 +177,7 @@ class ArtistProfile extends HookConsumerWidget {
); );
}, },
), ),
IconButton( PlatformIconButton(
icon: const Icon(Icons.share_rounded), icon: const Icon(Icons.share_rounded),
onPressed: () { onPressed: () {
Clipboard.setData( Clipboard.setData(
@ -260,11 +261,13 @@ class ArtistProfile extends HookConsumerWidget {
color: Theme.of(context).primaryColor, color: Theme.of(context).primaryColor,
borderRadius: BorderRadius.circular(50), borderRadius: BorderRadius.circular(50),
), ),
child: IconButton( child: PlatformIconButton(
icon: Icon(isPlaylistPlaying icon: Icon(
isPlaylistPlaying
? Icons.stop_rounded ? Icons.stop_rounded
: Icons.play_arrow_rounded), : Icons.play_arrow_rounded,
color: Colors.white, color: Colors.white,
),
onPressed: () => onPressed: () =>
playPlaylist(topTracks.toList()), playPlaylist(topTracks.toList()),
), ),

View File

@ -75,7 +75,7 @@ class Sidebar extends HookConsumerWidget {
if (layoutMode == LayoutMode.compact || if (layoutMode == LayoutMode.compact ||
(breakpoints.isSm && layoutMode == LayoutMode.adaptive)) { (breakpoints.isSm && layoutMode == LayoutMode.adaptive)) {
return Container(); return child;
} }
void toggleExtended() => void toggleExtended() =>
@ -117,7 +117,7 @@ class Sidebar extends HookConsumerWidget {
child: MoveWindow( child: MoveWindow(
child: !extended.value child: !extended.value
? Center( ? Center(
child: IconButton( child: PlatformIconButton(
icon: const Icon(Icons.menu_rounded), icon: const Icon(Icons.menu_rounded),
onPressed: toggleExtended, onPressed: toggleExtended,
), ),
@ -127,7 +127,7 @@ class Sidebar extends HookConsumerWidget {
), ),
if (!kIsDesktop && !extended.value) if (!kIsDesktop && !extended.value)
Center( Center(
child: IconButton( child: PlatformIconButton(
icon: const Icon(Icons.menu_rounded), icon: const Icon(Icons.menu_rounded),
onPressed: toggleExtended, onPressed: toggleExtended,
), ),
@ -143,7 +143,7 @@ class Sidebar extends HookConsumerWidget {
"Spotube", "Spotube",
style: Theme.of(context).textTheme.headline4, style: Theme.of(context).textTheme.headline4,
), ),
IconButton( PlatformIconButton(
icon: const Icon(Icons.menu_rounded), icon: const Icon(Icons.menu_rounded),
onPressed: toggleExtended, onPressed: toggleExtended,
), ),
@ -241,7 +241,7 @@ class SidebarFooter extends HookConsumerWidget {
], ],
), ),
), ),
IconButton( PlatformIconButton(
icon: const Icon(Icons.settings_outlined), icon: const Icon(Icons.settings_outlined),
onPressed: () => Sidebar.goToSettings(context)), onPressed: () => Sidebar.goToSettings(context)),
], ],

View File

@ -30,7 +30,7 @@ class UserDownloads extends HookConsumerWidget {
), ),
), ),
const SizedBox(width: 10), const SizedBox(width: 10),
ElevatedButton( PlatformFilledButton(
style: ElevatedButton.styleFrom( style: ElevatedButton.styleFrom(
backgroundColor: Colors.red[50], backgroundColor: Colors.red[50],
foregroundColor: Colors.red[400], foregroundColor: Colors.red[400],

View File

@ -1,6 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:introduction_screen/introduction_screen.dart'; import 'package:introduction_screen/introduction_screen.dart';
import 'package:platform_ui/platform_ui.dart';
import 'package:spotube/components/Login/TokenLoginForms.dart'; import 'package:spotube/components/Login/TokenLoginForms.dart';
import 'package:spotube/components/Shared/Hyperlink.dart'; import 'package:spotube/components/Shared/Hyperlink.dart';
import 'package:spotube/components/Shared/PageWindowTitleBar.dart'; import 'package:spotube/components/Shared/PageWindowTitleBar.dart';
@ -16,7 +17,7 @@ class LoginTutorial extends ConsumerWidget {
return Scaffold( return Scaffold(
appBar: PageWindowTitleBar( appBar: PageWindowTitleBar(
leading: TextButton( leading: PlatformTextButton(
child: const Text("Exit"), child: const Text("Exit"),
onPressed: () { onPressed: () {
Navigator.of(context).pop(); Navigator.of(context).pop();
@ -27,7 +28,7 @@ class LoginTutorial extends ConsumerWidget {
next: const Text("Next"), next: const Text("Next"),
back: const Text("Previous"), back: const Text("Previous"),
showBackButton: true, showBackButton: true,
overrideDone: TextButton( overrideDone: PlatformTextButton(
onPressed: auth.isLoggedIn onPressed: auth.isLoggedIn
? () { ? () {
ServiceUtils.navigate(context, "/"); ServiceUtils.navigate(context, "/");

View File

@ -1,6 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.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:platform_ui/platform_ui.dart';
import 'package:spotube/components/Login/TokenLoginForms.dart'; import 'package:spotube/components/Login/TokenLoginForms.dart';
import 'package:spotube/components/Shared/PageWindowTitleBar.dart'; import 'package:spotube/components/Shared/PageWindowTitleBar.dart';
import 'package:spotube/hooks/useBreakpoints.dart'; import 'package:spotube/hooks/useBreakpoints.dart';
@ -45,7 +46,7 @@ class TokenLogin extends HookConsumerWidget {
crossAxisAlignment: WrapCrossAlignment.center, crossAxisAlignment: WrapCrossAlignment.center,
children: [ children: [
const Text("Don't know how to do this?"), const Text("Don't know how to do this?"),
TextButton( PlatformTextButton(
child: const Text( child: const Text(
"Follow along the Step by Step guide", "Follow along the Step by Step guide",
), ),

View File

@ -1,6 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.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:platform_ui/platform_ui.dart';
import 'package:spotube/provider/Auth.dart'; import 'package:spotube/provider/Auth.dart';
import 'package:spotube/utils/service_utils.dart'; import 'package:spotube/utils/service_utils.dart';
@ -42,7 +43,7 @@ class TokenLoginForm extends HookConsumerWidget {
keyboardType: TextInputType.visiblePassword, keyboardType: TextInputType.visiblePassword,
), ),
const SizedBox(height: 20), const SizedBox(height: 20),
ElevatedButton( PlatformFilledButton(
onPressed: () async { onPressed: () async {
if (keyCodeController.text.isEmpty || if (keyCodeController.text.isEmpty ||
directCodeController.text.isEmpty) { directCodeController.text.isEmpty) {

View File

@ -1,6 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.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:platform_ui/platform_ui.dart';
import 'package:spotube/components/Lyrics/SyncedLyrics.dart'; import 'package:spotube/components/Lyrics/SyncedLyrics.dart';
class LyricDelayAdjustDialog extends HookConsumerWidget { class LyricDelayAdjustDialog extends HookConsumerWidget {
@ -18,13 +19,13 @@ class LyricDelayAdjustDialog extends HookConsumerWidget {
return AlertDialog( return AlertDialog(
title: const Center(child: Text("Adjust Lyrics Delay")), title: const Center(child: Text("Adjust Lyrics Delay")),
actions: [ actions: [
ElevatedButton( PlatformFilledButton(
child: const Text("Cancel"), child: const Text("Cancel"),
onPressed: () { onPressed: () {
Navigator.of(context).pop(); Navigator.of(context).pop();
}, },
), ),
ElevatedButton( PlatformFilledButton(
child: const Text("Done"), child: const Text("Done"),
onPressed: () { onPressed: () {
Navigator.of(context).pop( Navigator.of(context).pop(
@ -38,7 +39,7 @@ class LyricDelayAdjustDialog extends HookConsumerWidget {
content: Row( content: Row(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
IconButton( PlatformIconButton(
icon: const Icon(Icons.remove_rounded), icon: const Icon(Icons.remove_rounded),
onPressed: () { onPressed: () {
controller.text = "${getValue() - 25}ms"; controller.text = "${getValue() - 25}ms";
@ -61,7 +62,7 @@ class LyricDelayAdjustDialog extends HookConsumerWidget {
}, },
), ),
), ),
IconButton( PlatformIconButton(
icon: const Icon(Icons.add_rounded), icon: const Icon(Icons.add_rounded),
onPressed: () { onPressed: () {
controller.text = "${getValue() + 25}ms"; controller.text = "${getValue() + 25}ms";

View File

@ -3,6 +3,7 @@ import 'package:flutter/material.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:palette_generator/palette_generator.dart'; import 'package:palette_generator/palette_generator.dart';
import 'package:platform_ui/platform_ui.dart';
import 'package:spotify/spotify.dart'; import 'package:spotify/spotify.dart';
import 'package:spotube/components/LoaderShimmers/ShimmerLyrics.dart'; import 'package:spotube/components/LoaderShimmers/ShimmerLyrics.dart';
import 'package:spotube/components/Lyrics/LyricDelayAdjustDialog.dart'; import 'package:spotube/components/Lyrics/LyricDelayAdjustDialog.dart';
@ -85,7 +86,7 @@ class SyncedLyrics extends HookConsumerWidget {
Positioned.fill( Positioned.fill(
child: Align( child: Align(
alignment: Alignment.centerRight, alignment: Alignment.centerRight,
child: IconButton( child: PlatformIconButton(
tooltip: "Lyrics Delay", tooltip: "Lyrics Delay",
icon: const Icon(Icons.av_timer_rounded), icon: const Icon(Icons.av_timer_rounded),
onPressed: () async { onPressed: () async {

View File

@ -2,6 +2,7 @@ import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.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:platform_ui/platform_ui.dart';
import 'package:spotify/spotify.dart'; import 'package:spotify/spotify.dart';
import 'package:spotube/components/Library/UserLocalTracks.dart'; import 'package:spotube/components/Library/UserLocalTracks.dart';
import 'package:spotube/components/Player/PlayerQueue.dart'; import 'package:spotube/components/Player/PlayerQueue.dart';
@ -48,7 +49,7 @@ class PlayerActions extends HookConsumerWidget {
return Row( return Row(
mainAxisAlignment: mainAxisAlignment, mainAxisAlignment: mainAxisAlignment,
children: [ children: [
IconButton( PlatformIconButton(
icon: const Icon(Icons.queue_music_rounded), icon: const Icon(Icons.queue_music_rounded),
tooltip: 'Queue', tooltip: 'Queue',
onPressed: playback.playlist != null onPressed: playback.playlist != null
@ -73,7 +74,7 @@ class PlayerActions extends HookConsumerWidget {
} }
: null, : null,
), ),
IconButton( PlatformIconButton(
icon: const Icon(Icons.alt_route_rounded), icon: const Icon(Icons.alt_route_rounded),
tooltip: "Alternative Track Sources", tooltip: "Alternative Track Sources",
onPressed: playback.track != null onPressed: playback.track != null
@ -108,7 +109,7 @@ class PlayerActions extends HookConsumerWidget {
), ),
) )
else else
IconButton( PlatformIconButton(
tooltip: 'Download track', tooltip: 'Download track',
icon: Icon( icon: Icon(
isDownloaded isDownloaded

View File

@ -2,6 +2,7 @@ import 'package:flutter/material.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';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:platform_ui/platform_ui.dart';
import 'package:spotube/hooks/playback.dart'; import 'package:spotube/hooks/playback.dart';
import 'package:spotube/models/Intents.dart'; import 'package:spotube/models/Intents.dart';
import 'package:spotube/models/Logger.dart'; import 'package:spotube/models/Logger.dart';
@ -138,7 +139,7 @@ class PlayerControls extends HookConsumerWidget {
Row( Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly, mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [ children: [
IconButton( PlatformIconButton(
tooltip: playback.isLoop tooltip: playback.isLoop
? "Repeat playlist" ? "Repeat playlist"
: playback.isShuffled : playback.isShuffled
@ -156,14 +157,16 @@ class PlayerControls extends HookConsumerWidget {
? null ? null
: playback.cyclePlaybackMode, : playback.cyclePlaybackMode,
), ),
IconButton( PlatformIconButton(
tooltip: "Previous track", tooltip: "Previous track",
icon: const Icon(Icons.skip_previous_rounded), icon: Icon(
Icons.skip_previous_rounded,
color: iconColor, color: iconColor,
),
onPressed: () { onPressed: () {
onPrevious(); onPrevious();
}), }),
IconButton( PlatformIconButton(
tooltip: playback.isPlaying tooltip: playback.isPlaying
? "Pause playback" ? "Pause playback"
: "Resume playback", : "Resume playback",
@ -177,23 +180,27 @@ class PlayerControls extends HookConsumerWidget {
playback.isPlaying playback.isPlaying
? Icons.pause_rounded ? Icons.pause_rounded
: Icons.play_arrow_rounded, : Icons.play_arrow_rounded,
),
color: iconColor, color: iconColor,
),
onPressed: Actions.handler<PlayPauseIntent>( onPressed: Actions.handler<PlayPauseIntent>(
context, context,
PlayPauseIntent(ref), PlayPauseIntent(ref),
), ),
), ),
IconButton( PlatformIconButton(
tooltip: "Next track", tooltip: "Next track",
icon: const Icon(Icons.skip_next_rounded), icon: Icon(
onPressed: () => onNext(), Icons.skip_next_rounded,
color: iconColor, color: iconColor,
), ),
IconButton( onPressed: () => onNext(),
),
PlatformIconButton(
tooltip: "Stop playback", tooltip: "Stop playback",
icon: const Icon(Icons.stop_rounded), icon: Icon(
Icons.stop_rounded,
color: iconColor, color: iconColor,
),
onPressed: playback.track != null onPressed: playback.track != null
? () async { ? () async {
try { try {

View File

@ -3,6 +3,7 @@ import 'dart:ui';
import 'package:flutter/material.dart'; import 'package:flutter/material.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:platform_ui/platform_ui.dart';
import 'package:spotube/components/Player/PlayerTrackDetails.dart'; import 'package:spotube/components/Player/PlayerTrackDetails.dart';
import 'package:spotube/hooks/playback.dart'; import 'package:spotube/hooks/playback.dart';
import 'package:spotube/hooks/usePaletteColor.dart'; import 'package:spotube/hooks/usePaletteColor.dart';
@ -79,21 +80,23 @@ class PlayerOverlay extends HookConsumerWidget {
), ),
Row( Row(
children: [ children: [
IconButton( PlatformIconButton(
icon: const Icon(Icons.skip_previous_rounded), icon: Icon(
Icons.skip_previous_rounded,
color: paletteColor.bodyTextColor, color: paletteColor.bodyTextColor,
),
onPressed: () { onPressed: () {
onPrevious(); onPrevious();
}), }),
Consumer( Consumer(
builder: (context, ref, _) { builder: (context, ref, _) {
return IconButton( return PlatformIconButton(
icon: Icon( icon: Icon(
ref.read(playbackProvider).isPlaying ref.read(playbackProvider).isPlaying
? Icons.pause_rounded ? Icons.pause_rounded
: Icons.play_arrow_rounded, : Icons.play_arrow_rounded,
),
color: paletteColor.bodyTextColor, color: paletteColor.bodyTextColor,
),
onPressed: Actions.handler<PlayPauseIntent>( onPressed: Actions.handler<PlayPauseIntent>(
context, context,
PlayPauseIntent(ref), PlayPauseIntent(ref),
@ -101,11 +104,13 @@ class PlayerOverlay extends HookConsumerWidget {
); );
}, },
), ),
IconButton( PlatformIconButton(
icon: const Icon(Icons.skip_next_rounded), icon: Icon(
onPressed: () => onNext(), Icons.skip_next_rounded,
color: paletteColor.bodyTextColor, color: paletteColor.bodyTextColor,
), ),
onPressed: () => onNext(),
),
], ],
), ),
], ],

View File

@ -5,6 +5,7 @@ import 'package:flutter_hooks/flutter_hooks.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:palette_generator/palette_generator.dart'; import 'package:palette_generator/palette_generator.dart';
import 'package:platform_ui/platform_ui.dart';
import 'package:spotube/components/Player/PlayerActions.dart'; import 'package:spotube/components/Player/PlayerActions.dart';
import 'package:spotube/components/Player/PlayerControls.dart'; import 'package:spotube/components/Player/PlayerControls.dart';
import 'package:spotube/components/Shared/PageWindowTitleBar.dart'; import 'package:spotube/components/Shared/PageWindowTitleBar.dart';
@ -162,7 +163,7 @@ class PlayerView extends HookConsumerWidget {
mainAxisAlignment: MainAxisAlignment.spaceEvenly, mainAxisAlignment: MainAxisAlignment.spaceEvenly,
floatingQueue: false, floatingQueue: false,
extraActions: [ extraActions: [
IconButton( PlatformIconButton(
tooltip: "Open Lyrics", tooltip: "Open Lyrics",
icon: const Icon(Icons.lyrics_rounded), icon: const Icon(Icons.lyrics_rounded),
onPressed: () { onPressed: () {

View File

@ -185,7 +185,7 @@ class Search extends HookConsumerWidget {
}), }),
if (searchTrack.hasNextPage && tracks.isNotEmpty) if (searchTrack.hasNextPage && tracks.isNotEmpty)
Center( Center(
child: TextButton( child: PlatformTextButton(
onPressed: searchTrack.isFetchingNextPage onPressed: searchTrack.isFetchingNextPage
? null ? null
: () => searchTrack.fetchNextPage(), : () => searchTrack.fetchNextPage(),

View File

@ -1,6 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.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:platform_ui/platform_ui.dart';
import 'package:spotube/provider/UserPreferences.dart'; import 'package:spotube/provider/UserPreferences.dart';
final highContrast = MaterialColor( final highContrast = MaterialColor(
@ -68,13 +69,13 @@ class ColorSchemePickerDialog extends HookConsumerWidget {
return AlertDialog( return AlertDialog(
title: Text("Pick ${schemeType.name} color scheme"), title: Text("Pick ${schemeType.name} color scheme"),
actions: [ actions: [
TextButton( PlatformTextButton(
child: const Text("Cancel"), child: const Text("Cancel"),
onPressed: () { onPressed: () {
Navigator.pop(context); Navigator.pop(context);
}, },
), ),
ElevatedButton( PlatformFilledButton(
child: const Text("Save"), child: const Text("Save"),
onPressed: () { onPressed: () {
switch (schemeType) { switch (schemeType) {

View File

@ -466,9 +466,7 @@ class Settings extends HookConsumerWidget {
), ),
), ),
), ),
trailing: (context, update) => ElevatedButton.icon( trailing: (context, update) => PlatformFilledButton(
icon: const Icon(Icons.favorite_outline_rounded),
label: const Text("Please Sponsor/Donate"),
style: ElevatedButton.styleFrom( style: ElevatedButton.styleFrom(
backgroundColor: Colors.red[100], backgroundColor: Colors.red[100],
foregroundColor: Colors.pinkAccent, foregroundColor: Colors.pinkAccent,
@ -480,6 +478,12 @@ class Settings extends HookConsumerWidget {
mode: LaunchMode.externalApplication, mode: LaunchMode.externalApplication,
); );
}, },
child: Row(
children: const [
Icon(Icons.favorite_outline_rounded),
Text("Please Sponsor/Donate"),
],
),
), ),
), ),
PlatformListTile( PlatformListTile(

View File

@ -1,5 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:platform_ui/platform_ui.dart';
import 'package:popover/popover.dart'; import 'package:popover/popover.dart';
import 'package:spotube/hooks/useBreakpoints.dart'; import 'package:spotube/hooks/useBreakpoints.dart';
@ -24,23 +25,25 @@ class Action extends StatelessWidget {
"\"", "\"",
"", "",
), ),
child: IconButton( child: PlatformIconButton(
icon: icon, icon: icon,
onPressed: onPressed, onPressed: onPressed,
), ),
); );
} }
return TextButton.icon( return PlatformTextButton(
style: TextButton.styleFrom( style: TextButton.styleFrom(
foregroundColor: Theme.of(context).textTheme.bodyMedium?.color, foregroundColor: Theme.of(context).textTheme.bodyMedium?.color,
padding: const EdgeInsets.all(20), padding: const EdgeInsets.all(20),
), ),
icon: icon,
label: Align(
alignment: Alignment.centerLeft,
child: text,
),
onPressed: onPressed, onPressed: onPressed,
child: Row(
children: [
icon,
const SizedBox(width: 10),
text,
],
),
); );
} }
} }
@ -59,7 +62,7 @@ class AdaptiveActions extends HookWidget {
final breakpoint = useBreakpoints(); final breakpoint = useBreakpoints();
if (breakpoint.isLessThan(breakOn)) { if (breakpoint.isLessThan(breakOn)) {
return IconButton( return PlatformIconButton(
icon: const Icon(Icons.more_horiz), icon: const Icon(Icons.more_horiz),
onPressed: () { onPressed: () {
showPopover( showPopover(

View File

@ -1,5 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:platform_ui/platform_ui.dart';
import 'package:spotube/provider/Auth.dart'; import 'package:spotube/provider/Auth.dart';
import 'package:spotube/utils/service_utils.dart'; import 'package:spotube/utils/service_utils.dart';
@ -21,7 +22,7 @@ class AnonymousFallback extends ConsumerWidget {
children: [ children: [
const Text("You're not logged in"), const Text("You're not logged in"),
const SizedBox(height: 10), const SizedBox(height: 10),
ElevatedButton( PlatformFilledButton(
child: const Text("Login with Spotify"), child: const Text("Login with Spotify"),
onPressed: () => ServiceUtils.navigate(context, "/settings"), onPressed: () => ServiceUtils.navigate(context, "/settings"),
) )

View File

@ -1,4 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:platform_ui/platform_ui.dart';
import 'package:spotube/components/Shared/UniversalImage.dart'; import 'package:spotube/components/Shared/UniversalImage.dart';
class DownloadConfirmationDialog extends StatelessWidget { class DownloadConfirmationDialog extends StatelessWidget {
@ -57,11 +58,11 @@ class DownloadConfirmationDialog extends StatelessWidget {
), ),
), ),
actions: [ actions: [
ElevatedButton( PlatformFilledButton(
child: const Text("Decline"), child: const Text("Decline"),
onPressed: () => Navigator.of(context).pop(false), onPressed: () => Navigator.of(context).pop(false),
), ),
ElevatedButton( PlatformFilledButton(
onPressed: () => Navigator.of(context).pop(true), onPressed: () => Navigator.of(context).pop(true),
style: ElevatedButton.styleFrom( style: ElevatedButton.styleFrom(
foregroundColor: Colors.white, foregroundColor: Colors.white,

View File

@ -3,6 +3,7 @@ import 'package:fl_query_hooks/fl_query_hooks.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.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:platform_ui/platform_ui.dart';
import 'package:spotify/spotify.dart'; import 'package:spotify/spotify.dart';
import 'package:spotube/hooks/usePaletteColor.dart'; import 'package:spotube/hooks/usePaletteColor.dart';
import 'package:spotube/provider/Auth.dart'; import 'package:spotube/provider/Auth.dart';
@ -32,7 +33,7 @@ class HeartButton extends ConsumerWidget {
if (!auth.isLoggedIn) return Container(); if (!auth.isLoggedIn) return Container();
return IconButton( return PlatformIconButton(
tooltip: tooltip, tooltip: tooltip,
icon: Icon( icon: Icon(
icon ?? icon ??

View File

@ -1,5 +1,6 @@
import 'package:bitsdojo_window/bitsdojo_window.dart'; import 'package:bitsdojo_window/bitsdojo_window.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:platform_ui/platform_ui.dart';
import 'package:spotube/utils/platform.dart'; import 'package:spotube/utils/platform.dart';
class TitleBarActionButtons extends StatelessWidget { class TitleBarActionButtons extends StatelessWidget {
@ -26,7 +27,7 @@ class TitleBarActionButtons extends StatelessWidget {
data: const IconThemeData(size: 16), data: const IconThemeData(size: 16),
child: Row( child: Row(
children: [ children: [
TextButton( PlatformTextButton(
onPressed: () { onPressed: () {
appWindow.minimize(); appWindow.minimize();
}, },
@ -38,7 +39,7 @@ class TitleBarActionButtons extends StatelessWidget {
Icons.minimize_rounded, Icons.minimize_rounded,
color: color, color: color,
)), )),
TextButton( PlatformTextButton(
onPressed: () async { onPressed: () async {
appWindow.maximizeOrRestore(); appWindow.maximizeOrRestore();
}, },
@ -50,7 +51,7 @@ class TitleBarActionButtons extends StatelessWidget {
Icons.crop_square_rounded, Icons.crop_square_rounded,
color: color, color: color,
)), )),
TextButton( PlatformTextButton(
onPressed: () { onPressed: () {
appWindow.close(); appWindow.close();
}, },

View File

@ -1,5 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:platform_ui/platform_ui.dart';
import 'package:spotify/spotify.dart'; import 'package:spotify/spotify.dart';
final replaceDownloadedFileState = StateProvider<bool?>((ref) => null); final replaceDownloadedFileState = StateProvider<bool?>((ref) => null);
@ -48,13 +49,13 @@ class ReplaceDownloadedFileDialog extends ConsumerWidget {
], ],
), ),
actions: [ actions: [
TextButton( PlatformTextButton(
child: const Text("No"), child: const Text("No"),
onPressed: () { onPressed: () {
Navigator.pop(context, false); Navigator.pop(context, false);
}, },
), ),
TextButton( PlatformTextButton(
child: const Text("Yes"), child: const Text("Yes"),
onPressed: () { onPressed: () {
Navigator.pop(context, true); Navigator.pop(context, true);

View File

@ -2,6 +2,7 @@ import 'package:fl_query/fl_query.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';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:platform_ui/platform_ui.dart';
import 'package:spotube/components/LoaderShimmers/ShimmerTrackTile.dart'; import 'package:spotube/components/LoaderShimmers/ShimmerTrackTile.dart';
import 'package:spotube/components/Shared/PageWindowTitleBar.dart'; import 'package:spotube/components/Shared/PageWindowTitleBar.dart';
import 'package:spotube/components/Shared/TracksTableView.dart'; import 'package:spotube/components/Shared/TracksTableView.dart';
@ -59,7 +60,7 @@ class TrackCollectionView<T> extends HookConsumerWidget {
final List<Widget> buttons = [ final List<Widget> buttons = [
if (showShare) if (showShare)
IconButton( PlatformIconButton(
icon: Icon( icon: Icon(
Icons.share_rounded, Icons.share_rounded,
color: color?.titleTextColor, color: color?.titleTextColor,
@ -71,13 +72,9 @@ class TrackCollectionView<T> extends HookConsumerWidget {
// play playlist // play playlist
Container( Container(
margin: const EdgeInsets.symmetric(vertical: 10), margin: const EdgeInsets.symmetric(vertical: 10),
child: ElevatedButton( child: PlatformFilledButton(
style: ButtonStyle( style: ButtonStyle(
backgroundColor: shape: MaterialStateProperty.all(const CircleBorder()),
MaterialStateProperty.all(Theme.of(context).primaryColor),
shape: MaterialStateProperty.all(
const CircleBorder(),
),
), ),
onPressed: tracksSnapshot.data != null ? onPlay : null, onPressed: tracksSnapshot.data != null ? onPlay : null,
child: Icon( child: Icon(
@ -112,7 +109,7 @@ class TrackCollectionView<T> extends HookConsumerWidget {
}, [collapsed.value]); }, [collapsed.value]);
return SafeArea( return SafeArea(
child: Scaffold( child: PlatformScaffold(
appBar: kIsDesktop appBar: kIsDesktop
? PageWindowTitleBar( ? PageWindowTitleBar(
backgroundColor: color?.color, backgroundColor: color?.color,

View File

@ -2,6 +2,7 @@ import 'package:flutter/material.dart' hide Action;
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:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:platform_ui/platform_ui.dart';
import 'package:spotify/spotify.dart' hide Image; import 'package:spotify/spotify.dart' hide Image;
import 'package:spotube/components/Shared/AdaptivePopupMenuButton.dart'; import 'package:spotube/components/Shared/AdaptivePopupMenuButton.dart';
import 'package:spotube/components/Shared/HeartButton.dart'; import 'package:spotube/components/Shared/HeartButton.dart';
@ -105,11 +106,11 @@ class TrackTile extends HookConsumerWidget {
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
), ),
actions: [ actions: [
TextButton( PlatformTextButton(
child: const Text("Cancel"), child: const Text("Cancel"),
onPressed: () => Navigator.pop(context), onPressed: () => Navigator.pop(context),
), ),
ElevatedButton( PlatformFilledButton(
child: const Text("Add"), child: const Text("Add"),
onPressed: () async { onPressed: () async {
final selectedPlaylists = playlistsCheck final selectedPlaylists = playlistsCheck
@ -214,7 +215,7 @@ class TrackTile extends HookConsumerWidget {
), ),
), ),
), ),
IconButton( PlatformIconButton(
icon: Icon( icon: Icon(
playback.track?.id != null && playback.track?.id != null &&
playback.track?.id == track.value.id playback.track?.id == track.value.id

View File

@ -1,6 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.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:platform_ui/platform_ui.dart';
import 'package:spotify/spotify.dart'; import 'package:spotify/spotify.dart';
import 'package:spotube/components/Library/UserLocalTracks.dart'; import 'package:spotube/components/Library/UserLocalTracks.dart';
import 'package:spotube/components/Shared/DownloadConfirmationDialog.dart'; import 'package:spotube/components/Shared/DownloadConfirmationDialog.dart';
@ -126,10 +127,9 @@ class TracksTableView extends HookConsumerWidget {
.state = value; .state = value;
}, },
), ),
PopupMenuButton( PlatformPopupMenuButton(
itemBuilder: (context) { items: [
return [ PlatformPopupMenuItem(
PopupMenuItem(
enabled: selected.value.isNotEmpty, enabled: selected.value.isNotEmpty,
value: "download", value: "download",
child: Row( child: Row(
@ -141,8 +141,7 @@ class TracksTableView extends HookConsumerWidget {
], ],
), ),
), ),
]; ],
},
onSelected: (action) async { onSelected: (action) async {
switch (action) { switch (action) {
case "download": case "download":
@ -163,6 +162,7 @@ class TracksTableView extends HookConsumerWidget {
default: default:
} }
}, },
child: const Icon(Icons.more_vert),
), ),
], ],
), ),

View File

@ -5,6 +5,7 @@ import 'package:flutter/material.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:http/http.dart' as http; import 'package:http/http.dart' as http;
import 'package:platform_ui/platform_ui.dart';
import 'package:spotube/components/Shared/AnchorButton.dart'; import 'package:spotube/components/Shared/AnchorButton.dart';
import 'package:spotube/hooks/usePackageInfo.dart'; import 'package:spotube/hooks/usePackageInfo.dart';
import 'package:spotube/provider/UserPreferences.dart'; import 'package:spotube/provider/UserPreferences.dart';
@ -59,7 +60,7 @@ void useUpdateChecker(WidgetRef ref) {
return AlertDialog( return AlertDialog(
title: const Text("Spotube has an update"), title: const Text("Spotube has an update"),
actions: [ actions: [
ElevatedButton( PlatformFilledButton(
child: const Text("Download Now"), child: const Text("Download Now"),
onPressed: () => download(url), onPressed: () => download(url),
), ),

View File

@ -199,7 +199,7 @@ class SpotubeState extends ConsumerState<Spotube> with WidgetsBindingObserver {
}; };
}, []); }, []);
platform = TargetPlatform.macOS; platform = TargetPlatform.windows;
return PlatformApp.router( return PlatformApp.router(
routeInformationParser: router.routeInformationParser, routeInformationParser: router.routeInformationParser,