Files
vikingowl 284299b946 feat: implement full Flutter MVP app
Complete Flutter app (Android + iOS) mirroring the web frontend:

- Core: Riverpod state, Dio networking with auth interceptor + auto-refresh,
  go_router navigation, flutter_secure_storage, light/dark theme with
  MedievalSharp/Crimson Pro fonts, German l10n
- Market: search with text/GPS/radius/date/sort filters, list + map views
  (flutter_map + OSM), detail screen with opening hours, admission prices,
  single-marker map, pagination
- Auth: login (password + magic link tabs), register, OAuth button placeholders,
  2FA code prompt on 401, sealed auth state provider
- User: profile view/edit/delete with confirm dialog, 2FA setup/disable
  on security screen
- GPS: geolocator with IP-based fallback (geojs.io) matching web behavior
- Platform: Android internet + location permissions, iOS NSLocation description
- Tests: date/currency/distance formatter unit tests (13 passing)
- Zero analysis issues, debug APK builds successfully
2026-02-21 07:10:30 +01:00

28 lines
841 B
Dart

import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import '../../core/providers.dart';
class ThemeToggleButton extends ConsumerWidget {
const ThemeToggleButton({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final ThemeModeOption mode = ref.watch(themeModeProvider);
final icon = switch (mode) {
ThemeModeOption.system => Icons.brightness_auto,
ThemeModeOption.light => Icons.light_mode,
ThemeModeOption.dark => Icons.dark_mode,
};
return IconButton(
icon: Icon(icon),
onPressed: () => ref.read(themeModeProvider.notifier).cycle(),
tooltip: switch (mode) {
ThemeModeOption.system => 'System',
ThemeModeOption.light => 'Hell',
ThemeModeOption.dark => 'Dunkel',
},
);
}
}