mirror of
https://github.com/KRTirtho/spotube.git
synced 2025-09-13 07:55:18 +00:00
refactor: use widget for artist link instead of a utility function
This commit is contained in:
parent
1cea95bbda
commit
1a6cea926f
@ -4,6 +4,7 @@ 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';
|
||||||
import 'package:spotube/components/shared/image/universal_image.dart';
|
import 'package:spotube/components/shared/image/universal_image.dart';
|
||||||
|
import 'package:spotube/components/shared/links/artist_link.dart';
|
||||||
import 'package:spotube/extensions/context.dart';
|
import 'package:spotube/extensions/context.dart';
|
||||||
import 'package:spotube/extensions/image.dart';
|
import 'package:spotube/extensions/image.dart';
|
||||||
import 'package:spotube/provider/download_manager_provider.dart';
|
import 'package:spotube/provider/download_manager_provider.dart';
|
||||||
@ -59,8 +60,8 @@ class DownloadItem extends HookConsumerWidget {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
title: Text(track.name ?? ''),
|
title: Text(track.name ?? ''),
|
||||||
subtitle: TypeConversionUtils.artists_X_ClickableArtists(
|
subtitle: ArtistLink(
|
||||||
track.artists ?? <Artist>[],
|
artists: track.artists ?? <Artist>[],
|
||||||
mainAxisAlignment: WrapAlignment.start,
|
mainAxisAlignment: WrapAlignment.start,
|
||||||
),
|
),
|
||||||
trailing: isQueryingSourceInfo
|
trailing: isQueryingSourceInfo
|
||||||
|
@ -4,7 +4,6 @@ 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:spotify/spotify.dart' hide Offset;
|
|
||||||
import 'package:spotube/collections/assets.gen.dart';
|
import 'package:spotube/collections/assets.gen.dart';
|
||||||
import 'package:spotube/collections/spotube_icons.dart';
|
import 'package:spotube/collections/spotube_icons.dart';
|
||||||
import 'package:spotube/components/player/player_actions.dart';
|
import 'package:spotube/components/player/player_actions.dart';
|
||||||
@ -13,6 +12,7 @@ import 'package:spotube/components/player/player_queue.dart';
|
|||||||
import 'package:spotube/components/player/volume_slider.dart';
|
import 'package:spotube/components/player/volume_slider.dart';
|
||||||
import 'package:spotube/components/shared/animated_gradient.dart';
|
import 'package:spotube/components/shared/animated_gradient.dart';
|
||||||
import 'package:spotube/components/shared/dialogs/track_details_dialog.dart';
|
import 'package:spotube/components/shared/dialogs/track_details_dialog.dart';
|
||||||
|
import 'package:spotube/components/shared/links/artist_link.dart';
|
||||||
import 'package:spotube/components/shared/page_window_title_bar.dart';
|
import 'package:spotube/components/shared/page_window_title_bar.dart';
|
||||||
import 'package:spotube/components/shared/image/universal_image.dart';
|
import 'package:spotube/components/shared/image/universal_image.dart';
|
||||||
import 'package:spotube/components/shared/panels/sliding_up_panel.dart';
|
import 'package:spotube/components/shared/panels/sliding_up_panel.dart';
|
||||||
@ -247,9 +247,8 @@ class PlayerView extends HookConsumerWidget {
|
|||||||
),
|
),
|
||||||
)
|
)
|
||||||
else
|
else
|
||||||
TypeConversionUtils
|
ArtistLink(
|
||||||
.artists_X_ClickableArtists(
|
artists: currentTrack?.artists ?? [],
|
||||||
currentTrack?.artists ?? [],
|
|
||||||
textStyle:
|
textStyle:
|
||||||
theme.textTheme.bodyMedium!.copyWith(
|
theme.textTheme.bodyMedium!.copyWith(
|
||||||
fontWeight: FontWeight.bold,
|
fontWeight: FontWeight.bold,
|
||||||
|
@ -4,6 +4,7 @@ import 'package:spotify/spotify.dart';
|
|||||||
|
|
||||||
import 'package:spotube/collections/assets.gen.dart';
|
import 'package:spotube/collections/assets.gen.dart';
|
||||||
import 'package:spotube/components/shared/image/universal_image.dart';
|
import 'package:spotube/components/shared/image/universal_image.dart';
|
||||||
|
import 'package:spotube/components/shared/links/artist_link.dart';
|
||||||
import 'package:spotube/components/shared/links/link_text.dart';
|
import 'package:spotube/components/shared/links/link_text.dart';
|
||||||
import 'package:spotube/extensions/artist_simple.dart';
|
import 'package:spotube/extensions/artist_simple.dart';
|
||||||
import 'package:spotube/extensions/constrains.dart';
|
import 'package:spotube/extensions/constrains.dart';
|
||||||
@ -74,8 +75,8 @@ class PlayerTrackDetails extends HookConsumerWidget {
|
|||||||
overflow: TextOverflow.ellipsis,
|
overflow: TextOverflow.ellipsis,
|
||||||
style: TextStyle(fontWeight: FontWeight.bold, color: color),
|
style: TextStyle(fontWeight: FontWeight.bold, color: color),
|
||||||
),
|
),
|
||||||
TypeConversionUtils.artists_X_ClickableArtists(
|
ArtistLink(
|
||||||
playback.activeTrack?.artists ?? [],
|
artists: playback.activeTrack?.artists ?? [],
|
||||||
onRouteChange: (route) {
|
onRouteChange: (route) {
|
||||||
ServiceUtils.push(context, route);
|
ServiceUtils.push(context, route);
|
||||||
},
|
},
|
||||||
|
@ -2,12 +2,12 @@ import 'package:flutter/material.dart';
|
|||||||
import 'package:flutter_hooks/flutter_hooks.dart';
|
import 'package:flutter_hooks/flutter_hooks.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';
|
||||||
|
import 'package:spotube/components/shared/links/artist_link.dart';
|
||||||
import 'package:spotube/components/shared/links/hyper_link.dart';
|
import 'package:spotube/components/shared/links/hyper_link.dart';
|
||||||
import 'package:spotube/components/shared/links/link_text.dart';
|
import 'package:spotube/components/shared/links/link_text.dart';
|
||||||
import 'package:spotube/extensions/constrains.dart';
|
import 'package:spotube/extensions/constrains.dart';
|
||||||
import 'package:spotube/extensions/context.dart';
|
import 'package:spotube/extensions/context.dart';
|
||||||
import 'package:spotube/services/sourced_track/sourced_track.dart';
|
import 'package:spotube/services/sourced_track/sourced_track.dart';
|
||||||
import 'package:spotube/utils/type_conversion_utils.dart';
|
|
||||||
import 'package:spotube/extensions/duration.dart';
|
import 'package:spotube/extensions/duration.dart';
|
||||||
|
|
||||||
class TrackDetailsDialog extends HookWidget {
|
class TrackDetailsDialog extends HookWidget {
|
||||||
@ -24,8 +24,8 @@ class TrackDetailsDialog extends HookWidget {
|
|||||||
|
|
||||||
final detailsMap = {
|
final detailsMap = {
|
||||||
context.l10n.title: track.name!,
|
context.l10n.title: track.name!,
|
||||||
context.l10n.artist: TypeConversionUtils.artists_X_ClickableArtists(
|
context.l10n.artist: ArtistLink(
|
||||||
track.artists ?? <Artist>[],
|
artists: track.artists ?? <Artist>[],
|
||||||
mainAxisAlignment: WrapAlignment.start,
|
mainAxisAlignment: WrapAlignment.start,
|
||||||
textStyle: const TextStyle(color: Colors.blue),
|
textStyle: const TextStyle(color: Colors.blue),
|
||||||
),
|
),
|
||||||
|
57
lib/components/shared/links/artist_link.dart
Normal file
57
lib/components/shared/links/artist_link.dart
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
import 'package:flutter/widgets.dart';
|
||||||
|
import 'package:spotify/spotify.dart';
|
||||||
|
import 'package:spotube/components/shared/links/anchor_button.dart';
|
||||||
|
import 'package:spotube/utils/service_utils.dart';
|
||||||
|
|
||||||
|
class ArtistLink extends StatelessWidget {
|
||||||
|
final List<ArtistSimple> artists;
|
||||||
|
final WrapCrossAlignment crossAxisAlignment;
|
||||||
|
final WrapAlignment mainAxisAlignment;
|
||||||
|
final TextStyle textStyle;
|
||||||
|
final void Function(String route)? onRouteChange;
|
||||||
|
|
||||||
|
const ArtistLink({
|
||||||
|
super.key,
|
||||||
|
required this.artists,
|
||||||
|
this.crossAxisAlignment = WrapCrossAlignment.center,
|
||||||
|
this.mainAxisAlignment = WrapAlignment.center,
|
||||||
|
this.textStyle = const TextStyle(),
|
||||||
|
this.onRouteChange,
|
||||||
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Wrap(
|
||||||
|
crossAxisAlignment: crossAxisAlignment,
|
||||||
|
alignment: mainAxisAlignment,
|
||||||
|
children: artists
|
||||||
|
.asMap()
|
||||||
|
.entries
|
||||||
|
.map(
|
||||||
|
(artist) => Builder(builder: (context) {
|
||||||
|
if (artist.value.name == null) {
|
||||||
|
return Text("Spotify", style: textStyle);
|
||||||
|
}
|
||||||
|
return AnchorButton(
|
||||||
|
(artist.key != artists.length - 1)
|
||||||
|
? "${artist.value.name}, "
|
||||||
|
: artist.value.name!,
|
||||||
|
onTap: () {
|
||||||
|
if (onRouteChange != null) {
|
||||||
|
onRouteChange?.call("/artist/${artist.value.id}");
|
||||||
|
} else {
|
||||||
|
ServiceUtils.push(
|
||||||
|
context,
|
||||||
|
"/artist/${artist.value.id}",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
overflow: TextOverflow.ellipsis,
|
||||||
|
style: textStyle,
|
||||||
|
);
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
.toList(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -15,6 +15,7 @@ import 'package:spotube/components/shared/dialogs/prompt_dialog.dart';
|
|||||||
import 'package:spotube/components/shared/dialogs/track_details_dialog.dart';
|
import 'package:spotube/components/shared/dialogs/track_details_dialog.dart';
|
||||||
import 'package:spotube/components/shared/heart_button.dart';
|
import 'package:spotube/components/shared/heart_button.dart';
|
||||||
import 'package:spotube/components/shared/image/universal_image.dart';
|
import 'package:spotube/components/shared/image/universal_image.dart';
|
||||||
|
import 'package:spotube/components/shared/links/artist_link.dart';
|
||||||
import 'package:spotube/extensions/constrains.dart';
|
import 'package:spotube/extensions/constrains.dart';
|
||||||
import 'package:spotube/extensions/context.dart';
|
import 'package:spotube/extensions/context.dart';
|
||||||
import 'package:spotube/extensions/image.dart';
|
import 'package:spotube/extensions/image.dart';
|
||||||
@ -309,9 +310,7 @@ class TrackOptions extends HookConsumerWidget {
|
|||||||
),
|
),
|
||||||
subtitle: Align(
|
subtitle: Align(
|
||||||
alignment: Alignment.centerLeft,
|
alignment: Alignment.centerLeft,
|
||||||
child: TypeConversionUtils.artists_X_ClickableArtists(
|
child: ArtistLink(artists: track.artists!),
|
||||||
track.artists!,
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
@ -9,6 +9,7 @@ import 'package:spotify/spotify.dart';
|
|||||||
import 'package:spotube/collections/spotube_icons.dart';
|
import 'package:spotube/collections/spotube_icons.dart';
|
||||||
import 'package:spotube/components/shared/hover_builder.dart';
|
import 'package:spotube/components/shared/hover_builder.dart';
|
||||||
import 'package:spotube/components/shared/image/universal_image.dart';
|
import 'package:spotube/components/shared/image/universal_image.dart';
|
||||||
|
import 'package:spotube/components/shared/links/artist_link.dart';
|
||||||
import 'package:spotube/components/shared/links/link_text.dart';
|
import 'package:spotube/components/shared/links/link_text.dart';
|
||||||
import 'package:spotube/components/shared/track_tile/track_options.dart';
|
import 'package:spotube/components/shared/track_tile/track_options.dart';
|
||||||
import 'package:spotube/extensions/artist_simple.dart';
|
import 'package:spotube/extensions/artist_simple.dart';
|
||||||
@ -236,9 +237,7 @@ class TrackTile extends HookConsumerWidget {
|
|||||||
: ClipRect(
|
: ClipRect(
|
||||||
child: ConstrainedBox(
|
child: ConstrainedBox(
|
||||||
constraints: const BoxConstraints(maxHeight: 40),
|
constraints: const BoxConstraints(maxHeight: 40),
|
||||||
child: TypeConversionUtils.artists_X_ClickableArtists(
|
child: ArtistLink(artists: track.artists ?? []),
|
||||||
track.artists ?? [],
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
@ -8,6 +8,7 @@ import 'package:spotube/collections/fake.dart';
|
|||||||
import 'package:spotube/collections/spotube_icons.dart';
|
import 'package:spotube/collections/spotube_icons.dart';
|
||||||
import 'package:spotube/components/shared/heart_button.dart';
|
import 'package:spotube/components/shared/heart_button.dart';
|
||||||
import 'package:spotube/components/shared/image/universal_image.dart';
|
import 'package:spotube/components/shared/image/universal_image.dart';
|
||||||
|
import 'package:spotube/components/shared/links/artist_link.dart';
|
||||||
import 'package:spotube/components/shared/links/link_text.dart';
|
import 'package:spotube/components/shared/links/link_text.dart';
|
||||||
import 'package:spotube/components/shared/page_window_title_bar.dart';
|
import 'package:spotube/components/shared/page_window_title_bar.dart';
|
||||||
import 'package:spotube/components/shared/track_tile/track_options.dart';
|
import 'package:spotube/components/shared/track_tile/track_options.dart';
|
||||||
@ -145,10 +146,7 @@ class TrackPage extends HookConsumerWidget {
|
|||||||
children: [
|
children: [
|
||||||
const Icon(SpotubeIcons.artist),
|
const Icon(SpotubeIcons.artist),
|
||||||
const Gap(5),
|
const Gap(5),
|
||||||
TypeConversionUtils
|
ArtistLink(artists: track.artists!),
|
||||||
.artists_X_ClickableArtists(
|
|
||||||
track.artists!,
|
|
||||||
),
|
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
const Gap(10),
|
const Gap(10),
|
||||||
|
@ -2,12 +2,9 @@
|
|||||||
|
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
|
|
||||||
import 'package:flutter/widgets.dart' hide Image;
|
|
||||||
import 'package:metadata_god/metadata_god.dart';
|
import 'package:metadata_god/metadata_god.dart';
|
||||||
import 'package:path/path.dart';
|
import 'package:path/path.dart';
|
||||||
import 'package:spotube/components/shared/links/anchor_button.dart';
|
|
||||||
import 'package:spotify/spotify.dart';
|
import 'package:spotify/spotify.dart';
|
||||||
import 'package:spotube/utils/service_utils.dart';
|
|
||||||
|
|
||||||
enum ImagePlaceholder {
|
enum ImagePlaceholder {
|
||||||
albumArt,
|
albumArt,
|
||||||
@ -17,47 +14,6 @@ enum ImagePlaceholder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
abstract class TypeConversionUtils {
|
abstract class TypeConversionUtils {
|
||||||
static Widget artists_X_ClickableArtists(
|
|
||||||
List<ArtistSimple> artists, {
|
|
||||||
WrapCrossAlignment crossAxisAlignment = WrapCrossAlignment.center,
|
|
||||||
WrapAlignment mainAxisAlignment = WrapAlignment.center,
|
|
||||||
TextStyle textStyle = const TextStyle(),
|
|
||||||
void Function(String route)? onRouteChange,
|
|
||||||
}) {
|
|
||||||
return Wrap(
|
|
||||||
crossAxisAlignment: crossAxisAlignment,
|
|
||||||
alignment: mainAxisAlignment,
|
|
||||||
children: artists
|
|
||||||
.asMap()
|
|
||||||
.entries
|
|
||||||
.map(
|
|
||||||
(artist) => Builder(builder: (context) {
|
|
||||||
if (artist.value.name == null) {
|
|
||||||
return Text("Spotify", style: textStyle);
|
|
||||||
}
|
|
||||||
return AnchorButton(
|
|
||||||
(artist.key != artists.length - 1)
|
|
||||||
? "${artist.value.name}, "
|
|
||||||
: artist.value.name!,
|
|
||||||
onTap: () {
|
|
||||||
if (onRouteChange != null) {
|
|
||||||
onRouteChange("/artist/${artist.value.id}");
|
|
||||||
} else {
|
|
||||||
ServiceUtils.push(
|
|
||||||
context,
|
|
||||||
"/artist/${artist.value.id}",
|
|
||||||
);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
overflow: TextOverflow.ellipsis,
|
|
||||||
style: textStyle,
|
|
||||||
);
|
|
||||||
}),
|
|
||||||
)
|
|
||||||
.toList(),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
static Album simpleAlbum_X_Album(AlbumSimple albumSimple) {
|
static Album simpleAlbum_X_Album(AlbumSimple albumSimple) {
|
||||||
Album album = Album();
|
Album album = Album();
|
||||||
album.albumType = albumSimple.albumType;
|
album.albumType = albumSimple.albumType;
|
||||||
|
Loading…
Reference in New Issue
Block a user