mirror of
https://github.com/zarzet/SpotiFLAC-Mobile.git
synced 2026-10-21 06:52:18 +02:00
feat(discord): add opt-in mobile rich presence with track artwork
This commit is contained in:
1 parent
bbe2caa754
commit
0b2cf0e4e5
40 files changed
+1839
-18
No files matched your search
@@ -0,0 +1,76 @@
|
||||
import 'dart:async';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:spotiflac_android/l10n/l10n.dart';
|
||||
import 'package:spotiflac_android/providers/settings_provider.dart';
|
||||
import 'package:spotiflac_android/services/discord_presence_service.dart';
|
||||
import 'package:spotiflac_android/widgets/settings_group.dart';
|
||||
|
||||
class DiscordPresenceSettings extends ConsumerWidget {
|
||||
const DiscordPresenceSettings({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context, WidgetRef ref) {
|
||||
final enabled = ref.watch(
|
||||
settingsProvider.select((s) => s.discordRichPresenceEnabled),
|
||||
);
|
||||
final service = DiscordPresenceService.instance;
|
||||
final l10n = context.l10n;
|
||||
return ValueListenableBuilder<DiscordPresenceStatus>(
|
||||
valueListenable: service.status,
|
||||
builder: (context, status, _) => SettingsGroup(
|
||||
children: [
|
||||
SettingsSwitchItem(
|
||||
icon: Icons.headphones_outlined,
|
||||
title: 'Discord Rich Presence',
|
||||
subtitle: l10n.discordPresenceDescription,
|
||||
value: enabled,
|
||||
onChanged: ref
|
||||
.read(settingsProvider.notifier)
|
||||
.setDiscordRichPresenceEnabled,
|
||||
showDivider: enabled,
|
||||
),
|
||||
if (enabled)
|
||||
SettingsItem(
|
||||
icon: status == DiscordPresenceStatus.active
|
||||
? Icons.check_circle_outline
|
||||
: Icons.info_outline,
|
||||
title: switch (status) {
|
||||
DiscordPresenceStatus.disabled => l10n.discordPresenceDisabled,
|
||||
DiscordPresenceStatus.linkRequired => l10n.discordPresenceLink,
|
||||
DiscordPresenceStatus.connecting =>
|
||||
l10n.discordPresenceConnecting,
|
||||
DiscordPresenceStatus.ready => l10n.discordPresenceReady,
|
||||
DiscordPresenceStatus.active => l10n.discordPresenceActive,
|
||||
DiscordPresenceStatus.unavailable =>
|
||||
l10n.discordPresenceUnavailable,
|
||||
DiscordPresenceStatus.sdkUnavailable =>
|
||||
l10n.discordPresenceBuildUnavailable,
|
||||
},
|
||||
subtitle: Platform.isAndroid
|
||||
? l10n.discordPresenceAndroidHelp
|
||||
: l10n.discordPresenceIosHelp,
|
||||
onTap: status == DiscordPresenceStatus.linkRequired
|
||||
? () => unawaited(service.link())
|
||||
: null,
|
||||
showDivider: Platform.isIOS,
|
||||
),
|
||||
if (enabled && Platform.isIOS)
|
||||
SettingsItem(
|
||||
icon: Icons.link_off,
|
||||
title: l10n.discordPresenceDisconnect,
|
||||
onTap: () {
|
||||
ref
|
||||
.read(settingsProvider.notifier)
|
||||
.setDiscordRichPresenceEnabled(false);
|
||||
unawaited(service.forgetAccount());
|
||||
},
|
||||
showDivider: false,
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user