Files
buzz/mobile/lib/features/settings/settings_page.dart
kenny lopez a307669962 Add tablet workspace layout
Signed-off-by: kenny lopez <klopez4212@gmail.com>
2026-08-02 08:37:17 +01:00

109 lines
3.2 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:lucide_icons_flutter/lucide_icons.dart';
import 'package:nostr/nostr.dart' as nostr;
import 'package:package_info_plus/package_info_plus.dart';
import '../../shared/auth/auth.dart';
import '../../shared/clipboard_utils.dart';
import '../../shared/relay/relay.dart';
import '../../shared/theme/theme.dart';
import '../../shared/widgets/app_list.dart';
import '../../shared/widgets/app_list_card.dart';
import '../../shared/widgets/frosted_app_bar.dart';
import '../../shared/widgets/frosted_scaffold.dart';
import 'accent_picker_page.dart';
import 'theme_picker_page.dart';
part 'settings_page/appearance_section.dart';
part 'settings_page/connection_section.dart';
class SettingsPage extends HookConsumerWidget {
const SettingsPage({super.key, required this.profileHeader});
final Widget profileHeader;
@override
Widget build(BuildContext context, WidgetRef ref) {
final packageInfoFuture = useMemoized(() => PackageInfo.fromPlatform());
final packageInfo = useFuture(packageInfoFuture);
final isTablet = MediaQuery.sizeOf(context).shortestSide >= 600;
return FrostedScaffold(
appBar: const FrostedAppBar(title: Text('Settings')),
body: Column(
children: [
Expanded(
child: ListView(
padding: EdgeInsets.only(
top: frostedAppBarHeight(context),
bottom: Grid.xs,
),
children: [
Align(
alignment: Alignment.topCenter,
child: ConstrainedBox(
key: const Key('settings-content'),
constraints: BoxConstraints(
maxWidth: isTablet ? 640 : double.infinity,
),
child: Column(
children: [
profileHeader,
const _AppearanceSection(),
const _ConnectionSection(),
const _RemoveCommunitySection(),
],
),
),
),
],
),
),
if (packageInfo.hasData)
_VersionFooter(version: packageInfo.data!.version),
],
),
);
}
}
class _VersionFooter extends StatelessWidget {
const _VersionFooter({required this.version});
final String version;
@override
Widget build(BuildContext context) {
return SafeArea(
top: false,
child: Padding(
padding: const EdgeInsets.only(bottom: Grid.xs, top: Grid.xxs),
child: Center(
child: Text(
'v$version',
style: context.textTheme.bodySmall?.copyWith(
color: context.colors.onSurfaceVariant.withValues(alpha: 0.6),
),
),
),
),
);
}
}
/// Trailing affordance shared by the rows that push a picker page.
class _RowChevron extends StatelessWidget {
const _RowChevron();
@override
Widget build(BuildContext context) {
return Icon(
LucideIcons.chevronRight,
size: 18,
color: context.colors.onSurfaceVariant,
);
}
}