RhythmBox/lib/screens/settings.dart

132 lines
5.1 KiB
Dart
Raw Normal View History

2024-08-26 05:29:17 +00:00
import 'package:flutter/material.dart';
2024-08-29 07:02:49 +00:00
import 'package:get/get.dart';
import 'package:rhythm_box/providers/auth.dart';
import 'package:rhythm_box/providers/spotify.dart';
2024-08-29 14:34:56 +00:00
import 'package:rhythm_box/providers/user_preferences.dart';
2024-08-29 07:02:49 +00:00
import 'package:rhythm_box/screens/auth/login.dart';
import 'package:rhythm_box/widgets/auto_cache_image.dart';
2024-08-29 14:34:56 +00:00
import 'package:rhythm_box/widgets/sized_container.dart';
2024-08-26 05:29:17 +00:00
class SettingsScreen extends StatefulWidget {
const SettingsScreen({super.key});
@override
State<SettingsScreen> createState() => _SettingsScreenState();
}
class _SettingsScreenState extends State<SettingsScreen> {
2024-08-29 07:02:49 +00:00
late final SpotifyProvider _spotify = Get.find();
late final AuthenticationProvider _authenticate = Get.find();
2024-08-29 14:34:56 +00:00
late final UserPreferencesProvider _preferences = Get.find();
2024-08-29 07:02:49 +00:00
bool _isLoggingIn = false;
2024-08-26 05:29:17 +00:00
@override
Widget build(BuildContext context) {
2024-08-28 17:45:33 +00:00
return Material(
color: Theme.of(context).colorScheme.surface,
2024-08-29 14:34:56 +00:00
child: Scaffold(
appBar: AppBar(
title: const Text('Settings'),
centerTitle: MediaQuery.of(context).size.width >= 720,
),
body: CenteredContainer(
child: Column(
children: [
Obx(() {
if (_authenticate.auth.value == null) {
return ListTile(
contentPadding: const EdgeInsets.symmetric(horizontal: 24),
leading: const Icon(Icons.login),
title: const Text('Connect with Spotify'),
subtitle:
const Text('To explore your own library and more'),
trailing: const Icon(Icons.chevron_right),
enabled: !_isLoggingIn,
onTap: () async {
setState(() => _isLoggingIn = true);
await universalLogin(context);
setState(() => _isLoggingIn = false);
},
);
}
return FutureBuilder(
future: _spotify.api.me.get(),
builder: (context, snapshot) {
if (!snapshot.hasData) {
return const ListTile(
contentPadding:
const EdgeInsets.symmetric(horizontal: 24),
leading: SizedBox(
width: 20,
height: 20,
child: CircularProgressIndicator(
strokeWidth: 3,
),
),
title: Text('Loading...'),
);
}
return ListTile(
leading: (snapshot.data!.images?.isNotEmpty ?? false)
? CircleAvatar(
backgroundImage: AutoCacheImage.provider(
snapshot.data!.images!.firstOrNull!.url!,
),
)
: const Icon(Icons.account_circle),
title: Text(snapshot.data!.displayName!),
subtitle: const Text('Connected with your Spotify'),
);
},
);
}),
Obx(() {
if (_authenticate.auth.value == null) {
return const SizedBox();
}
2024-08-29 07:02:49 +00:00
return ListTile(
contentPadding: const EdgeInsets.symmetric(horizontal: 24),
2024-08-29 14:34:56 +00:00
leading: const Icon(Icons.logout),
title: const Text('Log out'),
subtitle: const Text('Disconnect with this Spotify account'),
2024-08-29 07:02:49 +00:00
trailing: const Icon(Icons.chevron_right),
onTap: () async {
2024-08-29 14:34:56 +00:00
_authenticate.logout();
2024-08-29 07:02:49 +00:00
},
);
2024-08-29 14:34:56 +00:00
}),
const Divider(thickness: 0.3, height: 1),
2024-08-29 15:03:41 +00:00
Obx(
() => SwitchListTile(
contentPadding: const EdgeInsets.symmetric(horizontal: 24),
secondary: const Icon(Icons.all_inclusive),
title: const Text('Endless Playback'),
subtitle: const Text(
'Automatically get more recommendation for you after your queue finish playing'),
value: _preferences.state.value.endlessPlayback,
onChanged: _preferences.setEndlessPlayback,
),
),
2024-08-29 14:34:56 +00:00
Obx(
() => SwitchListTile(
contentPadding: const EdgeInsets.symmetric(horizontal: 24),
secondary: const Icon(Icons.graphic_eq),
title: const Text('Normalize Audio'),
subtitle:
const Text('Make audio not too loud either too quiet'),
value: _preferences.state.value.normalizeAudio,
onChanged: _preferences.setNormalizeAudio,
),
),
],
),
2024-08-28 17:45:33 +00:00
),
),
);
2024-08-26 05:29:17 +00:00
}
}