119 lines
4.1 KiB
Dart
119 lines
4.1 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
import 'package:lucide_icons/lucide_icons.dart';
|
|
import 'package:package_info_plus/package_info_plus.dart';
|
|
import 'package:flutter/services.dart';
|
|
import '../../screens/dev_menu_screen.dart';
|
|
import '../../providers/theme_provider.dart';
|
|
import '../../theme/app_colors.dart';
|
|
import '../../constants/app_constants.dart';
|
|
|
|
class OtherSettingsSection extends ConsumerStatefulWidget {
|
|
final bool showBusinessMode;
|
|
final String title;
|
|
|
|
const OtherSettingsSection({
|
|
super.key,
|
|
this.showBusinessMode = true,
|
|
this.title = 'データ・その他',
|
|
});
|
|
|
|
@override
|
|
ConsumerState<OtherSettingsSection> createState() => _OtherSettingsSectionState();
|
|
}
|
|
|
|
class _OtherSettingsSectionState extends ConsumerState<OtherSettingsSection> {
|
|
String _appVersion = 'Loading...';
|
|
int _devTapCount = 0;
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
_loadAppVersion();
|
|
}
|
|
|
|
Future<void> _loadAppVersion() async {
|
|
final packageInfo = await PackageInfo.fromPlatform();
|
|
if (mounted) {
|
|
setState(() {
|
|
_appVersion = 'v${packageInfo.version}+${packageInfo.buildNumber}';
|
|
});
|
|
}
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final userProfile = ref.watch(userProfileProvider);
|
|
final appColors = Theme.of(context).extension<AppColors>()!;
|
|
|
|
return Column(
|
|
children: [
|
|
_buildSectionHeader(context, widget.title, LucideIcons.database),
|
|
Card(
|
|
color: appColors.surfaceSubtle,
|
|
child: Column(
|
|
children: [
|
|
if (widget.showBusinessMode) ...[
|
|
ListTile(
|
|
leading: Icon(LucideIcons.store, color: appColors.warning),
|
|
title: Text('ビジネスモード (Beta)', style: TextStyle(color: appColors.textPrimary)),
|
|
subtitle: Text('お品書き作成機能など', style: TextStyle(color: appColors.textSecondary)),
|
|
trailing: Switch(
|
|
value: userProfile.isBusinessMode,
|
|
onChanged: (val) => ref.read(userProfileProvider.notifier).toggleBusinessMode(),
|
|
activeThumbColor: appColors.warning,
|
|
inactiveThumbColor: appColors.iconSubtle,
|
|
inactiveTrackColor: appColors.divider,
|
|
),
|
|
),
|
|
Divider(height: 1, color: appColors.divider),
|
|
],
|
|
ListTile(
|
|
leading: Icon(LucideIcons.info, color: appColors.iconDefault),
|
|
title: Text('アプリバージョン', style: TextStyle(color: appColors.textPrimary)),
|
|
subtitle: Text(_appVersion, style: TextStyle(color: appColors.textSecondary)),
|
|
onTap: () {
|
|
setState(() {
|
|
_devTapCount++;
|
|
if (_devTapCount >= AppConstants.devModeTapCount) {
|
|
_devTapCount = 0;
|
|
HapticFeedback.heavyImpact();
|
|
Navigator.push(
|
|
context,
|
|
MaterialPageRoute(builder: (context) => const DevMenuScreen()),
|
|
);
|
|
} else {
|
|
// Optional: Small feedback
|
|
HapticFeedback.lightImpact();
|
|
}
|
|
});
|
|
},
|
|
),
|
|
],
|
|
),
|
|
),
|
|
],
|
|
);
|
|
}
|
|
|
|
Widget _buildSectionHeader(BuildContext context, String title, IconData icon) {
|
|
final appColors = Theme.of(context).extension<AppColors>()!;
|
|
return Padding(
|
|
padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 4),
|
|
child: Row(
|
|
children: [
|
|
Icon(icon, size: 20, color: appColors.iconDefault),
|
|
const SizedBox(width: 8),
|
|
Text(
|
|
title,
|
|
style: Theme.of(context).textTheme.titleMedium?.copyWith(
|
|
fontWeight: FontWeight.bold,
|
|
color: appColors.textPrimary,
|
|
),
|
|
),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
}
|