mirror of
https://github.com/KRTirtho/spotube.git
synced 2025-09-12 23:45: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:spotube/collections/spotube_icons.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/image.dart';
|
||||
import 'package:spotube/provider/download_manager_provider.dart';
|
||||
@ -59,8 +60,8 @@ class DownloadItem extends HookConsumerWidget {
|
||||
),
|
||||
),
|
||||
title: Text(track.name ?? ''),
|
||||
subtitle: TypeConversionUtils.artists_X_ClickableArtists(
|
||||
track.artists ?? <Artist>[],
|
||||
subtitle: ArtistLink(
|
||||
artists: track.artists ?? <Artist>[],
|
||||
mainAxisAlignment: WrapAlignment.start,
|
||||
),
|
||||
trailing: isQueryingSourceInfo
|
||||
|
@ -4,7 +4,6 @@ import 'package:flutter_hooks/flutter_hooks.dart';
|
||||
import 'package:go_router/go_router.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/spotube_icons.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/shared/animated_gradient.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/image/universal_image.dart';
|
||||
import 'package:spotube/components/shared/panels/sliding_up_panel.dart';
|
||||
@ -247,9 +247,8 @@ class PlayerView extends HookConsumerWidget {
|
||||
),
|
||||
)
|
||||
else
|
||||
TypeConversionUtils
|
||||
.artists_X_ClickableArtists(
|
||||
currentTrack?.artists ?? [],
|
||||
ArtistLink(
|
||||
artists: currentTrack?.artists ?? [],
|
||||
textStyle:
|
||||
theme.textTheme.bodyMedium!.copyWith(
|
||||
fontWeight: FontWeight.bold,
|
||||
|
@ -4,6 +4,7 @@ import 'package:spotify/spotify.dart';
|
||||
|
||||
import 'package:spotube/collections/assets.gen.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/extensions/artist_simple.dart';
|
||||
import 'package:spotube/extensions/constrains.dart';
|
||||
@ -74,8 +75,8 @@ class PlayerTrackDetails extends HookConsumerWidget {
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style: TextStyle(fontWeight: FontWeight.bold, color: color),
|
||||
),
|
||||
TypeConversionUtils.artists_X_ClickableArtists(
|
||||
playback.activeTrack?.artists ?? [],
|
||||
ArtistLink(
|
||||
artists: playback.activeTrack?.artists ?? [],
|
||||
onRouteChange: (route) {
|
||||
ServiceUtils.push(context, route);
|
||||
},
|
||||
|
@ -2,12 +2,12 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter_hooks/flutter_hooks.dart';
|
||||
import 'package:spotify/spotify.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/link_text.dart';
|
||||
import 'package:spotube/extensions/constrains.dart';
|
||||
import 'package:spotube/extensions/context.dart';
|
||||
import 'package:spotube/services/sourced_track/sourced_track.dart';
|
||||
import 'package:spotube/utils/type_conversion_utils.dart';
|
||||
import 'package:spotube/extensions/duration.dart';
|
||||
|
||||
class TrackDetailsDialog extends HookWidget {
|
||||
@ -24,8 +24,8 @@ class TrackDetailsDialog extends HookWidget {
|
||||
|
||||
final detailsMap = {
|
||||
context.l10n.title: track.name!,
|
||||
context.l10n.artist: TypeConversionUtils.artists_X_ClickableArtists(
|
||||
track.artists ?? <Artist>[],
|
||||
context.l10n.artist: ArtistLink(
|
||||
artists: track.artists ?? <Artist>[],
|
||||
mainAxisAlignment: WrapAlignment.start,
|
||||
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/heart_button.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/context.dart';
|
||||
import 'package:spotube/extensions/image.dart';
|
||||
@ -309,9 +310,7 @@ class TrackOptions extends HookConsumerWidget {
|
||||
),
|
||||
subtitle: Align(
|
||||
alignment: Alignment.centerLeft,
|
||||
child: TypeConversionUtils.artists_X_ClickableArtists(
|
||||
track.artists!,
|
||||
),
|
||||
child: ArtistLink(artists: track.artists!),
|
||||
),
|
||||
),
|
||||
],
|
||||
|
@ -9,6 +9,7 @@ import 'package:spotify/spotify.dart';
|
||||
import 'package:spotube/collections/spotube_icons.dart';
|
||||
import 'package:spotube/components/shared/hover_builder.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/track_tile/track_options.dart';
|
||||
import 'package:spotube/extensions/artist_simple.dart';
|
||||
@ -236,9 +237,7 @@ class TrackTile extends HookConsumerWidget {
|
||||
: ClipRect(
|
||||
child: ConstrainedBox(
|
||||
constraints: const BoxConstraints(maxHeight: 40),
|
||||
child: TypeConversionUtils.artists_X_ClickableArtists(
|
||||
track.artists ?? [],
|
||||
),
|
||||
child: ArtistLink(artists: track.artists ?? []),
|
||||
),
|
||||
),
|
||||
),
|
||||
|
@ -8,6 +8,7 @@ import 'package:spotube/collections/fake.dart';
|
||||
import 'package:spotube/collections/spotube_icons.dart';
|
||||
import 'package:spotube/components/shared/heart_button.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/page_window_title_bar.dart';
|
||||
import 'package:spotube/components/shared/track_tile/track_options.dart';
|
||||
@ -145,10 +146,7 @@ class TrackPage extends HookConsumerWidget {
|
||||
children: [
|
||||
const Icon(SpotubeIcons.artist),
|
||||
const Gap(5),
|
||||
TypeConversionUtils
|
||||
.artists_X_ClickableArtists(
|
||||
track.artists!,
|
||||
),
|
||||
ArtistLink(artists: track.artists!),
|
||||
],
|
||||
),
|
||||
const Gap(10),
|
||||
|
@ -2,12 +2,9 @@
|
||||
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:flutter/widgets.dart' hide Image;
|
||||
import 'package:metadata_god/metadata_god.dart';
|
||||
import 'package:path/path.dart';
|
||||
import 'package:spotube/components/shared/links/anchor_button.dart';
|
||||
import 'package:spotify/spotify.dart';
|
||||
import 'package:spotube/utils/service_utils.dart';
|
||||
|
||||
enum ImagePlaceholder {
|
||||
albumArt,
|
||||
@ -17,47 +14,6 @@ enum ImagePlaceholder {
|
||||
}
|
||||
|
||||
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) {
|
||||
Album album = Album();
|
||||
album.albumType = albumSimple.albumType;
|
||||
|
Loading…
Reference in New Issue
Block a user