diff --git a/frontend/lib/main.dart b/frontend/lib/main.dart index f28a2ee..b1b9a74 100644 --- a/frontend/lib/main.dart +++ b/frontend/lib/main.dart @@ -54,15 +54,13 @@ class _SplashScreenState extends State { final userResult = await UserService.getCurrentUser(); if (userResult['success'] == true) { final userData = userResult['data']; - + // Check if user needs onboarding (activated = 0) if (userData['activated'] == 0) { Navigator.of(context).pushReplacement( MaterialPageRoute( - builder: (context) => EditProfileScreen( - userData: userData, - isOnboarding: true, - ), + builder: (context) => + EditProfileScreen(userData: userData, isOnboarding: true), ), ); } else { @@ -146,110 +144,110 @@ class _LandingPageState extends State { return PopScope( canPop: false, // Prevent back navigation from landing page child: Scaffold( - body: Stack( - children: [ - // Background gradient - Container( - decoration: BoxDecoration( - gradient: LinearGradient( - begin: Alignment.topCenter, - end: Alignment.bottomCenter, - colors: [ - Color(0xFF32B0A5), // Teal - Color(0xFF4600B9), // Purple - ], - stops: [0.0, 0.5], + body: Stack( + children: [ + // Background gradient + Container( + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [ + Color(0xFF32B0A5), // Teal + Color(0xFF4600B9), // Purple + ], + stops: [0.0, 0.5], + ), ), ), - ), - // Main content - SafeArea( - child: Column( - children: [ - Expanded( - child: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - // Logo - Container( - padding: EdgeInsets.all(40), - child: Text( - 'وصال', - style: TextStyle( - fontSize: 160, - fontWeight: FontWeight.w200, - fontFamily: 'Blaka', - color: Colors.white, - shadows: [ - Shadow( - offset: Offset(2, 2), - blurRadius: 4, - color: Colors.black.withOpacity(0.3), - ), - ], - ), - ), - ), - - SizedBox(height: 60), - - // Subtitle - Text( - 'Connections, Made\nEasier!', - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 32, - fontWeight: FontWeight.w600, - color: Colors.white, - height: 1.2, - ), - ), - - SizedBox(height: 80), - - // Get Started Button - Container( - width: 280, - height: 56, - child: ElevatedButton( - onPressed: _navigateDirectlyToLogin, - style: ElevatedButton.styleFrom( - backgroundColor: Color(0xFF6A4C93), - foregroundColor: Colors.white, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(28), - ), - elevation: 8, - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - 'Get Started', - style: TextStyle( - fontSize: 18, - fontWeight: FontWeight.w600, + // Main content + SafeArea( + child: Column( + children: [ + Expanded( + child: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + // Logo + Container( + padding: EdgeInsets.all(40), + child: Text( + 'وصال', + style: TextStyle( + fontSize: 160, + fontWeight: FontWeight.w200, + fontFamily: 'Blaka', + color: Colors.white, + shadows: [ + Shadow( + offset: Offset(2, 2), + blurRadius: 4, + color: Colors.black.withOpacity(0.3), ), - ), - SizedBox(width: 8), - Icon(Icons.arrow_forward, size: 20), - ], + ], + ), ), ), - ), - SizedBox(height: 24), - ], + SizedBox(height: 60), + + // Subtitle + Text( + 'Connections, Made\nEasier!', + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 32, + fontWeight: FontWeight.w600, + color: Colors.white, + height: 1.2, + ), + ), + + SizedBox(height: 80), + + // Get Started Button + Container( + width: 280, + height: 56, + child: ElevatedButton( + onPressed: _navigateDirectlyToLogin, + style: ElevatedButton.styleFrom( + backgroundColor: Color(0xFF6A4C93), + foregroundColor: Colors.white, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(28), + ), + elevation: 8, + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'Get Started', + style: TextStyle( + fontSize: 18, + fontWeight: FontWeight.w600, + ), + ), + SizedBox(width: 8), + Icon(Icons.arrow_forward, size: 20), + ], + ), + ), + ), + + SizedBox(height: 24), + ], + ), ), ), - ), - ], + ], + ), ), - ), - ], - ), + ], + ), ), ); } @@ -360,15 +358,13 @@ class _SignInPageState extends State { if (userResult['success'] == true) { final userData = userResult['data']; - + // Check if user needs onboarding (activated = 0) if (userData['activated'] == 0) { Navigator.of(context).pushReplacement( MaterialPageRoute( - builder: (context) => EditProfileScreen( - userData: userData, - isOnboarding: true, - ), + builder: (context) => + EditProfileScreen(userData: userData, isOnboarding: true), ), ); } else { @@ -412,247 +408,251 @@ class _SignInPageState extends State { canPop: false, // Prevent back navigation from sign in page child: Scaffold( body: Container( - decoration: BoxDecoration( - gradient: LinearGradient( - begin: Alignment.topCenter, - end: Alignment.bottomCenter, - colors: [Color(0xFF32B0A5), Color(0xFF4600B9)], - stops: [0.0, 0.5], + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [Color(0xFF32B0A5), Color(0xFF4600B9)], + stops: [0.0, 0.5], + ), ), - ), - child: SafeArea( - child: Column( - children: [ - // App bar - Padding( - padding: EdgeInsets.all(16), - child: Row( - children: [ - IconButton( - onPressed: () => Navigator.of(context).pop(), - icon: Icon(Icons.arrow_back, color: Colors.white), - ), - Text( - 'Sign In', - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.w600, - color: Colors.white, + child: SafeArea( + child: Column( + children: [ + // App bar + Padding( + padding: EdgeInsets.all(16), + child: Row( + children: [ + IconButton( + onPressed: () => Navigator.of(context).pop(), + icon: Icon(Icons.arrow_back, color: Colors.white), ), - ), - ], - ), - ), - - // Content - Expanded( - child: Container( - margin: EdgeInsets.all(16), - padding: EdgeInsets.all(24), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(16), - boxShadow: [ - BoxShadow( - color: Colors.black.withOpacity(0.1), - blurRadius: 20, - offset: Offset(0, 5), + Text( + 'Sign In', + style: TextStyle( + fontSize: 20, + fontWeight: FontWeight.w600, + color: Colors.white, + ), ), ], ), - child: Form( - key: _formKey, - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - SizedBox(height: 20), + ), - // Logo - Center( - child: Text( - 'وصال', - style: TextStyle( - fontSize: 48, - fontWeight: FontWeight.w200, - fontFamily: 'Blaka', - color: Color(0xFF6A4C93), - ), - ), + // Content + Expanded( + child: Container( + margin: EdgeInsets.all(16), + padding: EdgeInsets.all(24), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(16), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.1), + blurRadius: 20, + offset: Offset(0, 5), ), + ], + ), + child: Form( + key: _formKey, + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + SizedBox(height: 20), - SizedBox(height: 40), - - // Welcome text - Text( - 'Welcome Back!', - style: TextStyle( - fontSize: 24, - fontWeight: FontWeight.bold, - color: Colors.black87, - ), - textAlign: TextAlign.center, - ), - - SizedBox(height: 8), - - Text( - 'Sign in to socialize with your colleagues\nand transform your social life!', - style: TextStyle( - fontSize: 16, - color: Colors.grey[600], - ), - textAlign: TextAlign.center, - ), - - SizedBox(height: 40), - - // Email field - TextFormField( - controller: _emailController, - keyboardType: TextInputType.emailAddress, - decoration: InputDecoration( - labelText: 'Email', - prefixIcon: Icon(Icons.email_outlined), - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(12), - ), - focusedBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(12), - borderSide: BorderSide(color: Color(0xFF6A4C93)), - ), - ), - validator: (value) { - if (value == null || value.isEmpty) { - return 'Please enter your email'; - } - if (!value.contains('@')) { - return 'Please enter a valid email'; - } - return null; - }, - ), - - SizedBox(height: 20), - - // Password field - TextFormField( - controller: _passwordController, - obscureText: !_isPasswordVisible, - decoration: InputDecoration( - labelText: 'Password', - prefixIcon: Icon(Icons.lock_outline), - suffixIcon: IconButton( - icon: Icon( - _isPasswordVisible - ? Icons.visibility_off - : Icons.visibility, - ), - onPressed: () { - setState(() { - _isPasswordVisible = !_isPasswordVisible; - }); - }, - ), - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(12), - ), - focusedBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(12), - borderSide: BorderSide(color: Color(0xFF6A4C93)), - ), - ), - validator: (value) { - if (value == null || value.isEmpty) { - return 'Please enter your password'; - } - if (value.length < 6) { - return 'Password must be at least 6 characters'; - } - return null; - }, - ), - - SizedBox(height: 12), - - // Forgot password - Align( - alignment: Alignment.centerRight, - child: TextButton( - onPressed: _showHelpBottomSheet, + // Logo + Center( child: Text( - 'Forgot Password?', + 'وصال', style: TextStyle( + fontSize: 48, + fontWeight: FontWeight.w200, + fontFamily: 'Blaka', color: Color(0xFF6A4C93), - fontWeight: FontWeight.w600, ), ), ), - ), - SizedBox(height: 30), + SizedBox(height: 40), - // Sign in button - Container( - height: 56, - child: ElevatedButton( - onPressed: _isLoading ? null : _handleSignIn, - style: ElevatedButton.styleFrom( - backgroundColor: Color(0xFF6A4C93), - foregroundColor: Colors.white, - shape: RoundedRectangleBorder( + // Welcome text + Text( + 'Welcome Back!', + style: TextStyle( + fontSize: 24, + fontWeight: FontWeight.bold, + color: Colors.black87, + ), + textAlign: TextAlign.center, + ), + + SizedBox(height: 8), + + Text( + 'Sign in to socialize with your colleagues\nand transform your social life!', + style: TextStyle( + fontSize: 16, + color: Colors.grey[600], + ), + textAlign: TextAlign.center, + ), + + SizedBox(height: 40), + + // Email field + TextFormField( + controller: _emailController, + keyboardType: TextInputType.emailAddress, + decoration: InputDecoration( + labelText: 'Email', + prefixIcon: Icon(Icons.email_outlined), + border: OutlineInputBorder( borderRadius: BorderRadius.circular(12), ), - elevation: 2, + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: BorderSide( + color: Color(0xFF6A4C93), + ), + ), ), - child: _isLoading - ? CircularProgressIndicator( - valueColor: AlwaysStoppedAnimation( - Colors.white, - ), - ) - : Text( - 'Sign In', - style: TextStyle( - fontSize: 18, - fontWeight: FontWeight.w600, - ), - ), + validator: (value) { + if (value == null || value.isEmpty) { + return 'Please enter your email'; + } + if (!value.contains('@')) { + return 'Please enter a valid email'; + } + return null; + }, ), - ), - SizedBox(height: 20), + SizedBox(height: 20), - // Contact link for new accounts - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - "Don't have an account? ", - style: TextStyle(color: Colors.grey[600]), + // Password field + TextFormField( + controller: _passwordController, + obscureText: !_isPasswordVisible, + decoration: InputDecoration( + labelText: 'Password', + prefixIcon: Icon(Icons.lock_outline), + suffixIcon: IconButton( + icon: Icon( + _isPasswordVisible + ? Icons.visibility_off + : Icons.visibility, + ), + onPressed: () { + setState(() { + _isPasswordVisible = !_isPasswordVisible; + }); + }, + ), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + ), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: BorderSide( + color: Color(0xFF6A4C93), + ), + ), ), - GestureDetector( - onTap: _showHelpBottomSheet, + validator: (value) { + if (value == null || value.isEmpty) { + return 'Please enter your password'; + } + if (value.length < 6) { + return 'Password must be at least 6 characters'; + } + return null; + }, + ), + + SizedBox(height: 12), + + // Forgot password + Align( + alignment: Alignment.centerRight, + child: TextButton( + onPressed: _showHelpBottomSheet, child: Text( - 'Contact Support', + 'Forgot Password?', style: TextStyle( color: Color(0xFF6A4C93), fontWeight: FontWeight.w600, ), ), ), - ], - ), + ), - Spacer(), - ], + SizedBox(height: 30), + + // Sign in button + Container( + height: 56, + child: ElevatedButton( + onPressed: _isLoading ? null : _handleSignIn, + style: ElevatedButton.styleFrom( + backgroundColor: Color(0xFF6A4C93), + foregroundColor: Colors.white, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + elevation: 2, + ), + child: _isLoading + ? CircularProgressIndicator( + valueColor: AlwaysStoppedAnimation( + Colors.white, + ), + ) + : Text( + 'Sign In', + style: TextStyle( + fontSize: 18, + fontWeight: FontWeight.w600, + ), + ), + ), + ), + + SizedBox(height: 20), + + // Contact link for new accounts + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + "Don't have an account? ", + style: TextStyle(color: Colors.grey[600]), + ), + GestureDetector( + onTap: _showHelpBottomSheet, + child: Text( + 'Contact Support', + style: TextStyle( + color: Color(0xFF6A4C93), + fontWeight: FontWeight.w600, + ), + ), + ), + ], + ), + + Spacer(), + ], + ), ), ), ), - ), - ], + ], + ), ), ), - ), ), ); } diff --git a/frontend/lib/screens/home_screen.dart b/frontend/lib/screens/home_screen.dart index 2f63012..1c5aa6f 100644 --- a/frontend/lib/screens/home_screen.dart +++ b/frontend/lib/screens/home_screen.dart @@ -81,24 +81,43 @@ class _HomeScreenState extends State { canPop: false, // Prevent going back to authentication screens child: Scaffold( body: _pages[_currentIndex], - bottomNavigationBar: BottomNavigationBar( - currentIndex: _currentIndex, - onTap: (index) { - setState(() { - _currentIndex = index; - }); - }, - type: BottomNavigationBarType.fixed, - selectedItemColor: Color(0xFF6A4C93), - unselectedItemColor: Colors.grey, - items: [ - BottomNavigationBarItem(icon: Icon(Icons.home), label: 'Feed'), - BottomNavigationBarItem( - icon: _buildInvitationsBadge(), - label: 'Invitations', + bottomNavigationBar: Container( + decoration: BoxDecoration( + color: Colors.white, + boxShadow: [ + BoxShadow( + color: Colors.black12, + blurRadius: 4, + offset: Offset(0, -2), + ), + ], + ), + child: SafeArea( + child: Container( + height: 80, + child: BottomNavigationBar( + currentIndex: _currentIndex, + onTap: (index) { + setState(() { + _currentIndex = index; + }); + }, + type: BottomNavigationBarType.fixed, + selectedItemColor: Color(0xFF6A4C93), + unselectedItemColor: Colors.grey, + backgroundColor: Colors.transparent, + elevation: 0, + items: [ + BottomNavigationBarItem(icon: Icon(Icons.home), label: 'Feed'), + BottomNavigationBarItem( + icon: _buildInvitationsBadge(), + label: 'Invitations', + ), + BottomNavigationBarItem(icon: Icon(Icons.person), label: 'Profile'), + ], + ), ), - BottomNavigationBarItem(icon: Icon(Icons.person), label: 'Profile'), - ], + ), ), ), ); diff --git a/frontend/lib/screens/pages/profile_page.dart b/frontend/lib/screens/pages/profile_page.dart index d5e5116..7322b54 100644 --- a/frontend/lib/screens/pages/profile_page.dart +++ b/frontend/lib/screens/pages/profile_page.dart @@ -200,6 +200,7 @@ class _ProfilePageState extends State { backgroundColor: Colors.white, foregroundColor: Color(0xFF6A4C93), elevation: 0, + centerTitle: true, actions: [ if (userData != null) IconButton(