import 'package:flutter/material.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:salonbooking/page/login_page.dart'; import 'package:salonbooking/page/register_page.dart'; import 'package:salonbooking/page/splash_screen.dart'; import 'package:salonbooking/pelanggan/main_navigation.dart'; import 'package:salonbooking/karyawan/home_karyawan.dart'; import 'package:salonbooking/pemilik/home_pemilik.dart'; import 'dart:convert'; // Navigator global final GlobalKey navigatorKey = GlobalKey(); void main() => runApp(const MyApp()); class MyApp extends StatefulWidget { const MyApp({super.key}); @override State createState() => _MyAppState(); } class _MyAppState extends State { bool showSplash = true; void _handleLogin(String token, Map user) async { final prefs = await SharedPreferences.getInstance(); await prefs.setString('token', token); await prefs.setString('user', jsonEncode(user)); _navigateToRolePage(token, user); } void _handleSplashComplete() { setState(() { showSplash = false; }); } static void _navigateToRolePage(String token, Map user) { switch (user['role']) { case 'pelanggan': navigatorKey.currentState!.pushAndRemoveUntil( MaterialPageRoute( builder: (_) => MainNavigation( userName: user['name'] ?? 'User', token: token, user: user, ), ), (route) => false, ); break; case 'karyawan': navigatorKey.currentState!.pushAndRemoveUntil( MaterialPageRoute( builder: (_) => KaryawanHomePage( user['name'] ?? 'User', token: token, user: user, ), ), (route) => false, ); break; case 'pemilik': navigatorKey.currentState!.pushAndRemoveUntil( MaterialPageRoute( builder: (_) => PemilikHomePage( name: user['name'] ?? 'User', token: token, ), ), (route) => false, ); break; default: navigatorKey.currentState!.pushAndRemoveUntil( MaterialPageRoute( builder: (_) => const Scaffold( body: Center(child: Text('Role tidak dikenal')), ), ), (route) => false, ); } } @override Widget build(BuildContext context) { return MaterialApp( title: 'Salon App', theme: ThemeData( primarySwatch: Colors.pink, scaffoldBackgroundColor: const Color(0xFFFFF6F9), appBarTheme: const AppBarTheme( backgroundColor: Color(0xFFF48FB1), foregroundColor: Colors.white, elevation: 2, ), elevatedButtonTheme: ElevatedButtonThemeData( style: ElevatedButton.styleFrom( backgroundColor: const Color(0xFFF06292), padding: const EdgeInsets.symmetric(horizontal: 40, vertical: 14), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(30), ), textStyle: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), ), ), ), debugShowCheckedModeBanner: false, navigatorKey: navigatorKey, home: showSplash ? SplashScreen(onInitializationComplete: _handleSplashComplete) : HomeSelector(onLoginSuccess: _handleLogin), ); } } class HomeSelector extends StatefulWidget { final Function(String token, Map user) onLoginSuccess; const HomeSelector({super.key, required this.onLoginSuccess}); @override State createState() => _HomeSelectorState(); } class _HomeSelectorState extends State { bool isLoading = true; @override void initState() { super.initState(); checkLoginStatus(); } Future checkLoginStatus() async { final prefs = await SharedPreferences.getInstance(); final token = prefs.getString('token'); final userJson = prefs.getString('user'); if (token != null && userJson != null) { final user = jsonDecode(userJson); widget.onLoginSuccess(token, user); } else { setState(() => isLoading = false); } } @override Widget build(BuildContext context) { if (isLoading) { return const Scaffold( body: Center(child: CircularProgressIndicator()), ); } return Scaffold( appBar: AppBar(title: const Text('Salon Booking App')), body: Center( child: Padding( padding: const EdgeInsets.symmetric(horizontal: 32), child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Container( decoration: BoxDecoration( color: const Color(0xFFFADADD), shape: BoxShape.circle, boxShadow: [ BoxShadow( color: const Color(0xFFFADADD).withOpacity(0.6), spreadRadius: 5, blurRadius: 15, offset: const Offset(0, 8), ), ], ), padding: const EdgeInsets.all(24), child: const Icon( Icons.content_cut, size: 72, color: Color(0xFFF06292), ), ), const SizedBox(height: 40), const Text( 'Welcome to Salon Booking', style: TextStyle( fontSize: 28, fontWeight: FontWeight.bold, color: Color(0xFF880E4F), ), textAlign: TextAlign.center, ), const SizedBox(height: 20), const Text( 'Manage your salon bookings with ease', style: TextStyle( fontSize: 16, color: Color(0xFFA51164), ), textAlign: TextAlign.center, ), const SizedBox(height: 40), ElevatedButton.icon( icon: const Icon(Icons.login), label: const Text('Login'), onPressed: () => Navigator.push( context, MaterialPageRoute(builder: (_) => LoginPage(onLoginSuccess: widget.onLoginSuccess)), ), ), const SizedBox(height: 20), ElevatedButton.icon( icon: const Icon(Icons.person_add), label: const Text('Register'), style: ElevatedButton.styleFrom( backgroundColor: const Color(0xFFF8BBD0), padding: const EdgeInsets.symmetric(horizontal: 40, vertical: 14), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(30), ), textStyle: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), foregroundColor: const Color(0xFF880E4F), ), onPressed: () => Navigator.push( context, MaterialPageRoute(builder: (_) => RegisterPage()), ), ), ], ), ), ), ); } }