diff --git a/lib/core/widgets/side_menu.dart b/lib/core/widgets/side_menu.dart index 4c77f83..e622a90 100644 --- a/lib/core/widgets/side_menu.dart +++ b/lib/core/widgets/side_menu.dart @@ -20,7 +20,7 @@ class SideMenu extends ConsumerWidget { return Drawer( child: Column( children: [ - // 🔹 Header + // Header DrawerHeader( decoration: BoxDecoration(color: Color(0xFF3B81F9)), child: SizedBox( @@ -76,7 +76,7 @@ class SideMenu extends ConsumerWidget { ), ), - // 🔹 Logout button at the bottom + // Logout button at the bottom const Divider(height: 1), Padding( padding: const EdgeInsets.only(bottom: 24.0), @@ -109,24 +109,28 @@ class SideMenu extends ConsumerWidget { ); } - // 🔸 Section title widget + // Section title widget Widget _sectionHeader(String title) { - return Padding( - padding: const EdgeInsets.only(left: 8.0), - child: Text( - title, - style: const TextStyle( - fontFamily: 'Roboto', - fontWeight: FontWeight.w700, - fontSize: 15, - letterSpacing: 0.5, - color: Color(0xFF3B81F9), + return Container( + padding: EdgeInsets.symmetric(vertical: 8), + decoration: BoxDecoration(color: Color.fromARGB(255, 225, 236, 255)), + child: Padding( + padding: const EdgeInsets.only(left: 8.0), + child: Text( + title, + style: const TextStyle( + fontFamily: 'Roboto', + fontWeight: FontWeight.w700, + fontSize: 15, + letterSpacing: 0.5, + color: Color(0xFF3B81F9), + ), ), ), ); } - // 🔸 Menu item widget + // Menu item widget Widget _menuItem( BuildContext context, String emoji, @@ -140,7 +144,6 @@ class SideMenu extends ConsumerWidget { child: InkWell( borderRadius: BorderRadius.circular(10), onTap: () { - Navigator.pop(context); onItemSelected(route); Navigator.pushNamed(context, route); }, diff --git a/lib/main.dart b/lib/main.dart index 2a76beb..5325513 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,5 +1,4 @@ import 'package:autos/core/routing/app_router.dart'; -import 'package:autos/core/routing/route_paths.dart'; import 'package:autos/presentation/providers/user_provider.dart'; import 'package:autos/presentation/screens/auth/login_screen.dart'; import 'package:autos/presentation/screens/dashboard/dashboard_screen.dart'; @@ -32,21 +31,25 @@ class _MyAppState extends ConsumerState { // Load user from secure storage await userNotifier.loadUserFromStorage(); + // Stop loading after user is restored setState(() => _isLoading = false); } @override Widget build(BuildContext context) { + // Show loading screen until user session is restored + if (_isLoading) { + return const MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + body: Center(child: CircularProgressIndicator()), + ), + ); + } + final userState = ref.watch(userProvider); final user = userState.value; - // if (_isLoading) { - // return const MaterialApp( - // debugShowCheckedModeBanner: false, - // home: Scaffold(body: Center(child: CircularProgressIndicator())), - // ); - // } - return MaterialApp( debugShowCheckedModeBanner: false, title: "Autos", @@ -54,8 +57,8 @@ class _MyAppState extends ConsumerState { colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), ), - /// Dynamic home based on session - home: user != null ? DashboardScreen() : LoginScreen(), + // Dynamic home based on session + home: user != null ? const DashboardScreen() : const LoginScreen(), onGenerateRoute: AppRouter.generateRoute, ); diff --git a/lib/presentation/screens/dashboard/dashboard_screen.dart b/lib/presentation/screens/dashboard/dashboard_screen.dart index 601a5fb..d8434b7 100644 --- a/lib/presentation/screens/dashboard/dashboard_screen.dart +++ b/lib/presentation/screens/dashboard/dashboard_screen.dart @@ -32,7 +32,7 @@ class _DashboardScreenState extends ConsumerState { ), body: Stack( children: [ - // 🔵 TOP BAR — RESPONSIVE & CENTERED + // TOP BAR — RESPONSIVE & CENTERED Positioned( top: topPadding, left: 0, diff --git a/lib/presentation/screens/splash/splash_screen.dart b/lib/presentation/screens/splash/splash_screen.dart index e69de29..9778e0c 100644 --- a/lib/presentation/screens/splash/splash_screen.dart +++ b/lib/presentation/screens/splash/splash_screen.dart @@ -0,0 +1,14 @@ +import 'package:flutter/material.dart'; + +class SplashScreen extends StatelessWidget { + const SplashScreen({super.key}); + + @override + Widget build(BuildContext context) { + return const Scaffold( + body: Center( + child: CircularProgressIndicator(), + ), + ); + } +} diff --git a/lib/presentation/screens/turn14_screen/turn14_screen.dart b/lib/presentation/screens/turn14_screen/turn14_screen.dart index 9ec8776..5713c36 100644 --- a/lib/presentation/screens/turn14_screen/turn14_screen.dart +++ b/lib/presentation/screens/turn14_screen/turn14_screen.dart @@ -1,3 +1,5 @@ +import 'package:autos/core/theme/app_typography.dart'; +import 'package:autos/core/widgets/hamburger_button.dart'; import 'package:autos/core/widgets/side_menu.dart'; import 'package:autos/presentation/providers/user_provider.dart'; import 'package:flutter/material.dart'; @@ -12,7 +14,7 @@ class Turn14Screen extends ConsumerStatefulWidget { class _Turn14ScreenState extends ConsumerState { final GlobalKey _scaffoldKey = GlobalKey(); - String selected = 'dashboard'; + String selected = 'turn14'; @override Widget build(BuildContext context) { @@ -27,6 +29,196 @@ class _Turn14ScreenState extends ConsumerState { setState(() => selected = key); }, ), + body: Stack( + children: [ + Positioned( + top: topPadding, + left: 0, + right: 0, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + "Turn14 Settings", + style: AppTypo.h2.copyWith(fontWeight: FontWeight.w700), + ), + ], + ), + ), + + SingleChildScrollView( + padding: EdgeInsets.fromLTRB(16, topPadding + 55, 16, 20), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Description Row + Row( + children: [ + Text("⚡", style: const TextStyle(fontSize: 28)), + const SizedBox(width: 8), + Expanded( + child: Text( + "Manage your Turn14 API credentials securely.", + style: AppTypo.body.copyWith( + color: Colors.black54, + height: 1.4, + ), + ), + ), + ], + ), + const SizedBox(height: 20), + + // Client ID Input + _inputField( + label: "Client ID", + controller: TextEditingController(), + ), + const SizedBox(height: 20), + + // Secret Key Input With Eye Icon + _passwordField( + label: "Secret Key", + controller: TextEditingController(), + ), + const SizedBox(height: 25), + + // Save Button + SizedBox( + width: double.infinity, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + padding: const EdgeInsets.symmetric(vertical: 16), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + backgroundColor: const Color(0xFF00C9FF), + ), + onPressed: () {}, + child: const Text( + "Save Credentials", + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: 16, + ), + ), + ), + ), + const SizedBox(height: 20), + + // Info Box + Container( + width: double.infinity, + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: const Color(0xFFE8F1FF), + borderRadius: BorderRadius.circular(10), + ), + child: Row( + children: const [ + Icon(Icons.info, color: Colors.blue), + SizedBox(width: 10), + Text( + "No credentials saved yet.", + style: TextStyle(color: Colors.black87), + ), + ], + ), + ), + const SizedBox(height: 20), + + // Tips Box + Container( + width: double.infinity, + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: const Color(0xFFE8FCFF), + borderRadius: BorderRadius.circular(10), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: const [ + Text( + "💡 Connection Tips", + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 16, + ), + ), + SizedBox(height: 10), + Text("• Ensure your credentials are valid and active."), + Text("• Credentials are encrypted before saving."), + Text("• Contact Turn14 support for API setup help."), + ], + ), + ), + ], + ), + ), + + HamburgerButton(scaffoldKey: _scaffoldKey), + ], + ), ); } + + Widget _inputField({required String label, required TextEditingController controller}) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(label, style: const TextStyle(fontWeight: FontWeight.w600)), + const SizedBox(height: 8), + TextField( + controller: controller, + decoration: InputDecoration( + filled: true, + fillColor: const Color(0xFFF0F6FF), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(10), + borderSide: BorderSide.none, + ), + ), + ), + ], + ); +} + +Widget _passwordField({ + required String label, + required TextEditingController controller, +}) { + bool _obscure = true; + + return StatefulBuilder( + builder: (context, setStateSB) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(label, style: const TextStyle(fontWeight: FontWeight.w600)), + const SizedBox(height: 8), + TextField( + controller: controller, + obscureText: _obscure, + decoration: InputDecoration( + filled: true, + fillColor: const Color(0xFFF0F6FF), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(10), + borderSide: BorderSide.none, + ), + suffixIcon: IconButton( + icon: Icon( + _obscure ? Icons.visibility_off : Icons.visibility, + ), + onPressed: () => setStateSB(() => _obscure = !_obscure), + ), + ), + ), + ], + ); + }, + ); +} + }