From 7816cb8068ce97c2eef1d01a17f0786b2428998e Mon Sep 17 00:00:00 2001 From: Kingkor Roy Tirtho Date: Sun, 9 Jun 2024 09:30:17 +0600 Subject: [PATCH] refactor: break down heart button hook into a different file --- .../{ => heart_button}/heart_button.dart | 35 +----------- .../heart_button/use_track_toggle_like.dart | 37 ++++++++++++ lib/components/titlebar/mouse_state.dart | 56 ++++++++++--------- lib/components/track_tile/track_options.dart | 2 +- .../sections/header/header_actions.dart | 2 +- lib/modules/player/player_actions.dart | 2 +- lib/pages/track/track.dart | 2 +- 7 files changed, 71 insertions(+), 65 deletions(-) rename lib/components/{ => heart_button}/heart_button.dart (70%) create mode 100644 lib/components/heart_button/use_track_toggle_like.dart diff --git a/lib/components/heart_button.dart b/lib/components/heart_button/heart_button.dart similarity index 70% rename from lib/components/heart_button.dart rename to lib/components/heart_button/heart_button.dart index c296d7a9..8222b8e6 100644 --- a/lib/components/heart_button.dart +++ b/lib/components/heart_button/heart_button.dart @@ -1,11 +1,10 @@ import 'package:flutter/material.dart'; -import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:spotify/spotify.dart'; +import 'package:spotube/components/heart_button/use_track_toggle_like.dart'; import 'package:spotube/extensions/context.dart'; import 'package:spotube/provider/authentication_provider.dart'; -import 'package:spotube/provider/scrobbler_provider.dart'; import 'package:spotube/provider/spotify/spotify.dart'; class HeartButton extends HookConsumerWidget { @@ -55,38 +54,6 @@ class HeartButton extends HookConsumerWidget { } } -typedef UseTrackToggleLike = ({ - bool isLiked, - Future Function(Track track) toggleTrackLike, -}); - -UseTrackToggleLike useTrackToggleLike(Track track, WidgetRef ref) { - final savedTracks = ref.watch(likedTracksProvider); - final savedTracksNotifier = ref.watch(likedTracksProvider.notifier); - - final isLiked = useMemoized( - () => - savedTracks.asData?.value.any((element) => element.id == track.id) ?? - false, - [savedTracks.asData?.value, track.id], - ); - - final scrobblerNotifier = ref.read(scrobblerProvider.notifier); - - return ( - isLiked: isLiked, - toggleTrackLike: (track) async { - await savedTracksNotifier.toggleFavorite(track); - - if (!isLiked) { - await scrobblerNotifier.love(track); - } else { - await scrobblerNotifier.unlove(track); - } - }, - ); -} - class TrackHeartButton extends HookConsumerWidget { final Track track; const TrackHeartButton({ diff --git a/lib/components/heart_button/use_track_toggle_like.dart b/lib/components/heart_button/use_track_toggle_like.dart new file mode 100644 index 00000000..2a886feb --- /dev/null +++ b/lib/components/heart_button/use_track_toggle_like.dart @@ -0,0 +1,37 @@ +import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:spotify/spotify.dart'; +import 'package:spotube/provider/scrobbler_provider.dart'; +import 'package:spotube/provider/spotify/spotify.dart'; + +typedef UseTrackToggleLike = ({ + bool isLiked, + Future Function(Track track) toggleTrackLike, +}); + +UseTrackToggleLike useTrackToggleLike(Track track, WidgetRef ref) { + final savedTracks = ref.watch(likedTracksProvider); + final savedTracksNotifier = ref.watch(likedTracksProvider.notifier); + + final isLiked = useMemoized( + () => + savedTracks.asData?.value.any((element) => element.id == track.id) ?? + false, + [savedTracks.asData?.value, track.id], + ); + + final scrobblerNotifier = ref.read(scrobblerProvider.notifier); + + return ( + isLiked: isLiked, + toggleTrackLike: (track) async { + await savedTracksNotifier.toggleFavorite(track); + + if (!isLiked) { + await scrobblerNotifier.love(track); + } else { + await scrobblerNotifier.unlove(track); + } + }, + ); +} diff --git a/lib/components/titlebar/mouse_state.dart b/lib/components/titlebar/mouse_state.dart index 726c6595..9af2a8b0 100644 --- a/lib/components/titlebar/mouse_state.dart +++ b/lib/components/titlebar/mouse_state.dart @@ -33,39 +33,41 @@ class _MouseStateBuilderState extends State { @override Widget build(BuildContext context) { return MouseRegion( - onEnter: (event) { + onEnter: (event) { + setState(() { + _mouseState.isMouseOver = true; + }); + }, + onExit: (event) { + setState(() { + _mouseState.isMouseOver = false; + }); + }, + child: GestureDetector( + onTapDown: (_) { setState(() { - _mouseState.isMouseOver = true; + _mouseState.isMouseDown = true; }); }, - onExit: (event) { + onTapCancel: () { setState(() { + _mouseState.isMouseDown = false; + }); + }, + onTap: () { + setState(() { + _mouseState.isMouseDown = false; _mouseState.isMouseOver = false; }); + _ambiguate(WidgetsBinding.instance)!.addPostFrameCallback((_) { + if (widget.onPressed != null) { + widget.onPressed!(); + } + }); }, - child: GestureDetector( - onTapDown: (_) { - setState(() { - _mouseState.isMouseDown = true; - }); - }, - onTapCancel: () { - setState(() { - _mouseState.isMouseDown = false; - }); - }, - onTap: () { - setState(() { - _mouseState.isMouseDown = false; - _mouseState.isMouseOver = false; - }); - _ambiguate(WidgetsBinding.instance)!.addPostFrameCallback((_) { - if (widget.onPressed != null) { - widget.onPressed!(); - } - }); - }, - onTapUp: (_) {}, - child: widget.builder(context, _mouseState))); + onTapUp: (_) {}, + child: widget.builder(context, _mouseState), + ), + ); } } diff --git a/lib/components/track_tile/track_options.dart b/lib/components/track_tile/track_options.dart index de604744..89f6679d 100644 --- a/lib/components/track_tile/track_options.dart +++ b/lib/components/track_tile/track_options.dart @@ -12,7 +12,7 @@ import 'package:spotube/components/adaptive/adaptive_pop_sheet_list.dart'; import 'package:spotube/components/dialogs/playlist_add_track_dialog.dart'; import 'package:spotube/components/dialogs/prompt_dialog.dart'; import 'package:spotube/components/dialogs/track_details_dialog.dart'; -import 'package:spotube/components/heart_button.dart'; +import 'package:spotube/components/heart_button/use_track_toggle_like.dart'; import 'package:spotube/components/image/universal_image.dart'; import 'package:spotube/components/links/artist_link.dart'; import 'package:spotube/extensions/constrains.dart'; diff --git a/lib/components/tracks_view/sections/header/header_actions.dart b/lib/components/tracks_view/sections/header/header_actions.dart index a1e959d9..3e0c4cc1 100644 --- a/lib/components/tracks_view/sections/header/header_actions.dart +++ b/lib/components/tracks_view/sections/header/header_actions.dart @@ -5,7 +5,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:spotify/spotify.dart'; import 'package:spotube/collections/spotube_icons.dart'; import 'package:spotube/modules/playlist/playlist_create_dialog.dart'; -import 'package:spotube/components/heart_button.dart'; +import 'package:spotube/components/heart_button/heart_button.dart'; import 'package:spotube/components/tracks_view/sections/body/use_is_user_playlist.dart'; import 'package:spotube/components/tracks_view/track_view_props.dart'; import 'package:spotube/extensions/context.dart'; diff --git a/lib/modules/player/player_actions.dart b/lib/modules/player/player_actions.dart index df366485..41de7388 100644 --- a/lib/modules/player/player_actions.dart +++ b/lib/modules/player/player_actions.dart @@ -6,7 +6,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:spotube/collections/spotube_icons.dart'; import 'package:spotube/modules/player/sibling_tracks_sheet.dart'; import 'package:spotube/components/adaptive/adaptive_pop_sheet_list.dart'; -import 'package:spotube/components/heart_button.dart'; +import 'package:spotube/components/heart_button/heart_button.dart'; import 'package:spotube/extensions/artist_simple.dart'; import 'package:spotube/extensions/context.dart'; import 'package:spotube/extensions/duration.dart'; diff --git a/lib/pages/track/track.dart b/lib/pages/track/track.dart index b5c9e4fa..1e9b2067 100644 --- a/lib/pages/track/track.dart +++ b/lib/pages/track/track.dart @@ -6,7 +6,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:skeletonizer/skeletonizer.dart'; import 'package:spotube/collections/fake.dart'; import 'package:spotube/collections/spotube_icons.dart'; -import 'package:spotube/components/heart_button.dart'; +import 'package:spotube/components/heart_button/heart_button.dart'; import 'package:spotube/components/image/universal_image.dart'; import 'package:spotube/components/links/artist_link.dart'; import 'package:spotube/components/links/link_text.dart';