mirror of
https://github.com/zarzet/SpotiFLAC-Mobile.git
synced 2026-10-21 15:02:21 +02:00
feat(home): expose extension country settings and isolate regional caches
This commit is contained in:
1 parent
2455cabced
commit
1a6dc7366e
11 files changed
+606
-21
No files matched your search
@@ -0,0 +1,87 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:spotiflac_android/l10n/l10n.dart';
|
||||
import 'package:spotiflac_android/providers/explore_provider.dart';
|
||||
import 'package:spotiflac_android/providers/extension_provider.dart';
|
||||
import 'package:spotiflac_android/utils/extension_country_name.dart';
|
||||
import 'package:spotiflac_android/widgets/app_bottom_sheet.dart';
|
||||
import 'package:spotiflac_android/widgets/app_snack_bar.dart';
|
||||
import 'package:spotiflac_android/widgets/settings_group.dart';
|
||||
|
||||
class HomeFeedRegionSetting extends ConsumerStatefulWidget {
|
||||
const HomeFeedRegionSetting({super.key});
|
||||
|
||||
@override
|
||||
ConsumerState<HomeFeedRegionSetting> createState() =>
|
||||
_HomeFeedRegionSettingState();
|
||||
}
|
||||
|
||||
class _HomeFeedRegionSettingState extends ConsumerState<HomeFeedRegionSetting> {
|
||||
bool _saving = false;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final extension = ref.watch(homeFeedExtensionProvider);
|
||||
final setting = extension?.homeFeedRegionSetting;
|
||||
if (extension == null || setting == null) return const SizedBox.shrink();
|
||||
final saved = ref.watch(extensionSettingsProvider(extension.id));
|
||||
final selected = (saved.value?[setting.key] ?? setting.defaultValue)
|
||||
?.toString();
|
||||
return SettingsItem(
|
||||
icon: Icons.public,
|
||||
title: context.l10n.extensionsHomeFeedCountry,
|
||||
subtitle: saved.hasError
|
||||
? context.friendlyError(saved.error)
|
||||
: '${extensionCountryName(context, selected ?? '')} · ${extension.displayName}',
|
||||
showDivider: false,
|
||||
onTap: _saving
|
||||
? null
|
||||
: () async {
|
||||
if (saved.hasError) {
|
||||
ref.invalidate(extensionSettingsProvider(extension.id));
|
||||
return;
|
||||
}
|
||||
final region = await showAppScrollableBottomSheet<String>(
|
||||
context: context,
|
||||
title: context.l10n.extensionsHomeFeedCountry,
|
||||
subtitle:
|
||||
setting.description ??
|
||||
context.l10n.extensionsHomeFeedCountryDescription,
|
||||
builder: (sheetContext, controller) => SingleChildScrollView(
|
||||
controller: controller,
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
for (final code in setting.options!)
|
||||
AppSheetOption.choice(
|
||||
title: Text(extensionCountryName(sheetContext, code)),
|
||||
subtitle: Text(code.toUpperCase()),
|
||||
selected:
|
||||
code.toUpperCase() == selected?.toUpperCase(),
|
||||
onTap: () => Navigator.pop(sheetContext, code),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
if (!mounted || region == null) return;
|
||||
setState(() => _saving = true);
|
||||
final success = await ref
|
||||
.read(extensionProvider.notifier)
|
||||
.setHomeFeedRegion(extension.id, region);
|
||||
if (!mounted || !context.mounted) return;
|
||||
setState(() => _saving = false);
|
||||
if (!success) {
|
||||
showAppSnackBar(
|
||||
context,
|
||||
content: Text(
|
||||
context.l10n.snackbarError(
|
||||
context.friendlyError(ref.read(extensionProvider).error),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user