Skip to content

Commit

Permalink
chore: remove podcast_utils
Browse files Browse the repository at this point in the history
  • Loading branch information
Feichtmeier committed Oct 22, 2024
1 parent 7b5e25d commit e54e3c3
Show file tree
Hide file tree
Showing 12 changed files with 169 additions and 193 deletions.
39 changes: 1 addition & 38 deletions lib/common/view/snackbars.dart
Original file line number Diff line number Diff line change
@@ -1,15 +1,11 @@
import 'package:flutter/material.dart';
import 'package:watch_it/watch_it.dart';

import '../../l10n/l10n.dart';
import '../../radio/radio_model.dart';

ScaffoldFeatureController<SnackBar, SnackBarClosedReason> showSnackBar({
required BuildContext context,
Widget? content,
SnackBar? snackBar,
Duration? duration,
clear = true,
bool clear = true,
}) {
if (clear) {
ScaffoldMessenger.of(context).clearSnackBars();
Expand All @@ -22,36 +18,3 @@ ScaffoldFeatureController<SnackBar, SnackBarClosedReason> showSnackBar({
),
);
}

SnackBar buildConnectSnackBar({
required String? connectedHost,
required BuildContext context,
}) {
return SnackBar(
duration: connectedHost != null
? const Duration(seconds: 1)
: const Duration(seconds: 30),
content: Text(
connectedHost != null
? '${context.l10n.connectedTo}: $connectedHost'
: context.l10n.noRadioServerFound,
),
action: (connectedHost == null)
? SnackBarAction(
onPressed: () async {
final connectedHost = await di<RadioModel>().init();
if (context.mounted) {
showSnackBar(
context: context,
content: buildConnectSnackBar(
connectedHost: connectedHost,
context: context,
),
);
}
},
label: context.l10n.tryReconnect,
)
: null,
);
}
20 changes: 9 additions & 11 deletions lib/player/view/player_title_and_artist.dart
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ import '../../local_audio/local_audio_model.dart';
import '../../local_audio/view/album_page.dart';
import '../../local_audio/view/artist_page.dart';
import '../../podcasts/podcast_model.dart';
import '../../podcasts/podcast_utils.dart';
import '../../radio/view/station_page.dart';
import '../player_model.dart';
import 'player_view.dart';
Expand Down Expand Up @@ -256,16 +255,15 @@ class PlayerTitleAndArtist extends StatelessWidget with WatchItMixin {
_onRadioArtistTap(audio: audio, libraryModel: libraryModel);
return;
case AudioType.podcast:
searchAndPushPodcastPage(
context: context,
podcastModel: podcastModel,
libraryModel: libraryModel,
playerModel: playerModel,
feedUrl: audio.website!,
itemImageUrl: audio.albumArtUrl,
genre: audio.genre,
startPlaylist: false,
);
if (audio.website != null) {
podcastModel.loadPodcast(
context: context,
libraryModel: libraryModel,
feedUrl: audio.website!,
itemImageUrl: audio.albumArtUrl,
genre: audio.genre,
);
}
return;
default:
return;
Expand Down
7 changes: 1 addition & 6 deletions lib/playlists/view/manual_add_dialog.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,7 @@ import '../../common/view/theme.dart';
import '../../external_path/external_path_service.dart';
import '../../l10n/l10n.dart';
import '../../library/library_model.dart';
import '../../player/player_model.dart';
import '../../podcasts/podcast_model.dart';
import '../../podcasts/podcast_utils.dart';

class ManualAddDialog extends StatelessWidget {
const ManualAddDialog({super.key});
Expand Down Expand Up @@ -394,13 +392,10 @@ class _AddPodcastContentState extends State<AddPodcastContent> {
onPressed: _urlController.text.isEmpty
? null
: () {
searchAndPushPodcastPage(
di<PodcastModel>().loadPodcast(
context: context,
feedUrl: _urlController.text,
startPlaylist: false,
libraryModel: di<LibraryModel>(),
playerModel: di<PlayerModel>(),
podcastModel: di<PodcastModel>(),
);
},
child: Text(
Expand Down
83 changes: 76 additions & 7 deletions lib/podcasts/podcast_model.dart
Original file line number Diff line number Diff line change
@@ -1,9 +1,15 @@
import 'dart:async';

import 'package:flutter/material.dart';
import 'package:safe_change_notifier/safe_change_notifier.dart';

import '../common/data/audio.dart';
import '../common/view/snackbars.dart';
import '../library/library_model.dart';
import '../player/player_model.dart';
import 'podcast_service.dart';
import 'view/podcast_page.dart';
import 'view/podcast_snackbar_contents.dart';

class PodcastModel extends SafeChangeNotifier {
PodcastModel({
Expand Down Expand Up @@ -72,14 +78,77 @@ class PodcastModel extends SafeChangeNotifier {
notifyListeners();
}

Future<List<Audio>> findEpisodes({
// This is not optimal since the model uses widgets
// but tolerable since snackbars update over the rest of the UI
Future<void> loadPodcast({
required BuildContext context,
required LibraryModel libraryModel,
required String feedUrl,
String? itemImageUrl,
String? genre,
}) async =>
_podcastService.findEpisodes(
feedUrl: feedUrl,
itemImageUrl: itemImageUrl,
genre: genre,
);
PlayerModel? playerModel,
}) async {
if (libraryModel.isPageInLibrary(feedUrl)) {
return libraryModel.pushNamed(pageId: feedUrl);
}

showSnackBar(
context: context,
duration: const Duration(seconds: 1000),
content: const PodcastSearchLoadingSnackBarContent(),
);

setLoadingFeed(true);
return _podcastService
.findEpisodes(
feedUrl: feedUrl,
itemImageUrl: itemImageUrl,
genre: genre,
)
.then(
(podcast) async {
if (podcast.isEmpty) {
if (context.mounted) {
showSnackBar(
context: context,
content: const PodcastSearchEmptyFeedSnackBarContent(),
);
}
return;
}

if (playerModel != null) {
playerModel.startPlaylist(listName: feedUrl, audios: podcast);
} else {
libraryModel.push(
builder: (_) => PodcastPage(
imageUrl: itemImageUrl ?? podcast.firstOrNull?.imageUrl,
preFetchedEpisodes: podcast,
feedUrl: feedUrl,
title: podcast.firstOrNull?.album ??
podcast.firstOrNull?.title ??
feedUrl,
),
pageId: feedUrl,
);
}
},
).whenComplete(
() {
setLoadingFeed(false);
if (context.mounted) ScaffoldMessenger.of(context).clearSnackBars();
},
).timeout(
const Duration(seconds: 15),
onTimeout: () {
setLoadingFeed(false);
if (context.mounted) {
showSnackBar(
context: context,
content: const PodcastSearchTimeoutSnackBarContent(),
);
}
},
);
}
}
91 changes: 0 additions & 91 deletions lib/podcasts/podcast_utils.dart

This file was deleted.

2 changes: 2 additions & 0 deletions lib/podcasts/view/podcast_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,8 @@ class _PodcastPageState extends State<PodcastPage> {
void initState() {
super.initState();
final libraryModel = di<LibraryModel>();
if (!libraryModel.isPageInLibrary(widget.feedUrl)) return;

final episodes =
widget.preFetchedEpisodes ?? libraryModel.podcasts[widget.feedUrl];

Expand Down
41 changes: 41 additions & 0 deletions lib/radio/view/radio_connect_snackbar.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import 'package:flutter/material.dart';
import 'package:watch_it/watch_it.dart';

import '../../common/view/snackbars.dart';
import '../../l10n/l10n.dart';
import '../radio_model.dart';

class RadioConnectSnackbar extends StatelessWidget {
const RadioConnectSnackbar({super.key, this.connectedHost});

final String? connectedHost;

@override
Widget build(BuildContext context) {
final l10n = context.l10n;
return SnackBar(
duration: connectedHost != null
? const Duration(seconds: 1)
: const Duration(seconds: 30),
content: Text(
connectedHost != null
? '${l10n.connectedTo}: $connectedHost'
: l10n.noRadioServerFound,
),
action: (connectedHost == null)
? SnackBarAction(
onPressed: () async {
final connectedHost = await di<RadioModel>().init();
if (context.mounted) {
showSnackBar(
context: context,
content: RadioConnectSnackbar(connectedHost: connectedHost),
);
}
},
label: l10n.tryReconnect,
)
: null,
);
}
}
7 changes: 5 additions & 2 deletions lib/radio/view/radio_page_tag_bar.dart
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import '../../library/library_model.dart';
import '../../search/search_model.dart';
import '../../search/search_type.dart';
import '../radio_model.dart';
import 'radio_connect_snackbar.dart';

class RadioPageTagBar extends StatelessWidget {
const RadioPageTagBar({super.key, required this.station});
Expand Down Expand Up @@ -87,9 +88,11 @@ class RadioPageTagBar extends StatelessWidget {
if (context.mounted) {
showSnackBar(
context: context,
content: buildConnectSnackBar(
content: RadioConnectSnackbar(
connectedHost: connectedHost,
context: context,
),
duration: Duration(
seconds: connectedHost == null ? 10 : 3,
),
);
}
Expand Down
7 changes: 3 additions & 4 deletions lib/radio/view/radio_reconnect_button.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import '../../common/view/snackbars.dart';
import '../../l10n/l10n.dart';
import '../radio_model.dart';
import 'disconnected_server_icon.dart';
import 'radio_connect_snackbar.dart';

class RadioReconnectButton extends StatelessWidget {
const RadioReconnectButton({super.key});
Expand All @@ -22,10 +23,8 @@ class RadioReconnectButton extends StatelessWidget {
if (context.mounted) {
showSnackBar(
context: context,
snackBar: buildConnectSnackBar(
connectedHost: host,
context: context,
),
content: RadioConnectSnackbar(connectedHost: host),
duration: Duration(seconds: host == null ? 10 : 3),
);
}
},
Expand Down
Loading

0 comments on commit e54e3c3

Please sign in to comment.