diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..f2d42bc --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,41 @@ +# Code of Conduct + +## Our Commitment +At Cooketh Flow, we are committed to fostering an inclusive, welcoming, and respectful community for all contributors, users, and participants. We expect everyone engaging with the project to uphold these values to create a positive environment. + +## Who This Applies To +This Code of Conduct applies to all community members, including but not limited to: +- Project maintainers +- Contributors +- Users +- Community members in discussions, events, and online spaces + +## Expected Behavior +To ensure a respectful and inclusive environment, we expect all participants to: +- *Be Respectful*: Treat others with kindness, professionalism, and empathy. +- *Be Inclusive*: Welcome and respect people of all backgrounds and identities. +- *Collaborate Openly*: Engage in constructive discussions and offer helpful feedback. +- *Respect Differences*: Understand that people have diverse opinions and experiences. +- *Give Credit*: Properly attribute contributions and ideas. + +## Unacceptable Behavior +The following behaviors are considered unacceptable within our community: +- Harassment, discrimination, or hate speech of any kind. +- Personal attacks, insults, or derogatory comments. +- Spamming, trolling, or intentionally disrupting discussions. +- Publishing private or sensitive information without consent. +- Any conduct that violates GitHub’s [Community Guidelines](https://docs.github.com/en/site-policy/github-terms/github-community-guidelines). + +## Reporting Violations +If you experience or witness any violation of this Code of Conduct, please report it by contacting the project maintainers at [contact email or GitHub issues]. All reports will be handled confidentially and reviewed promptly. + +## Enforcement +Violations of this Code of Conduct may result in: +- A warning from project maintainers. +- Temporary or permanent removal from the project or community spaces. +- Reporting to relevant platforms or authorities if necessary. + +## Acknowledgment +This Code of Conduct is inspired by and adapted from the [Contributor Covenant](https://www.contributor-covenant.org/). + +By participating in Cooketh Flow, you agree to abide by these guidelines and help create a positive and inclusive community. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..7726b6a --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,57 @@ +# CONTRIBUTING.md + +# Contributing to Cooketh Flow + +Thank you for your interest in contributing to **Cooketh Flow**! 🚀 We welcome contributions of all kinds, including code, documentation, bug reports, and feature suggestions. + +## How to Contribute + +1. **Fork the Repository**: Click the `Fork` button at the top of the repository page to create your own copy. +2. **Clone Your Fork**: Clone the repository to your local machine: + ```sh + git clone https://github.com/your-username/Cooketh-Flow.git + cd Cooketh-Flow + ``` +3. **Create a Branch**: Create a new branch for your changes from the `rewrite` branch: + ```sh + git checkout rewrite + git checkout -b feature-branch + ``` +4. **Make Changes**: Implement your changes and ensure they follow the project's coding guidelines. **Do not touch or tamper with the `v0.1.0` branch**, as it is used for deployment. +5. **Test Your Changes**: Run tests (if applicable) to verify that everything works correctly. +6. **Commit Your Changes**: Commit with a clear message describing your changes: + ```sh + git commit -m "Add feature XYZ" + ``` +7. **Push Your Changes**: Push your branch to your forked repository: + ```sh + git push origin feature-branch + ``` +8. **Open a Pull Request**: Go to the original repository and open a Pull Request (PR) targeting the `rewrite` branch. **Ensure your PR is directed to the `rewrite` branch, not `v0.1.0`.** + +## Code Guidelines + +- Follow consistent formatting and linting rules. +- Write clear and concise commit messages. +- Document your code where necessary. +- Ensure your changes do not break existing functionality. + +## Reporting Issues + +If you find a bug or have a feature request, please [open an issue](https://github.com/CookethOrg/Cooketh-Flow/issues) with a clear description and any relevant details. + +## Community Guidelines + +- Be respectful and inclusive. +- Follow the [Code of Conduct](CODE_OF_CONDUCT.md). +- Help others by reviewing and discussing pull requests. + +## Governance +[Cooketh Flow](https://github.com/CookethOrg/Cooketh-Flow) is led by [Subroto Banerjee](https://github.com/TeeWrath) as BDFL, who makes final decisions on the project’s direction. Contributors are encouraged to share ideas via GitHub Issues, but the BDFL reserves the right to guide the roadmap. + +## License + +By contributing, you agree that your contributions will be licensed under the same license as Cooketh Flow. + +--- +We appreciate your contributions! ❤️ Happy coding! diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..8d30055 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 Cooketh Org + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/lib/app.dart b/lib/app.dart index 94a140b..f170e0e 100644 --- a/lib/app.dart +++ b/lib/app.dart @@ -24,15 +24,10 @@ class MyApp extends StatelessWidget { debugShowCheckedModeBanner: false, routerConfig: AppRouteConfig.returnRouter(), localizationsDelegates: const [ - // GlobalMaterialLocalizations.delegate, - // GlobalWidgetsLocalizations.delegate, - // GlobalCupertinoLocalizations.delegate, FlutterQuillLocalizations.delegate, // REQUIRED for flutter_quill ], - // NEW: Define supported locales (at least English for now) supportedLocales: const [ - Locale('en', ''), // English - // Add other locales your app supports if needed, e.g., Locale('es', '') for Spanish + Locale('en', ''), // English for now ], ); }, diff --git a/lib/core/helpers/date_time_helper.dart b/lib/core/helpers/date_time_helper.dart index 0a8ff58..48897fd 100644 --- a/lib/core/helpers/date_time_helper.dart +++ b/lib/core/helpers/date_time_helper.dart @@ -2,16 +2,18 @@ class DateTimeHelper { String formatLastEdited(DateTime? lastEdited) { if (lastEdited == null) return "Edited Just Now"; final now = DateTime.now(); - final difference = now.difference(lastEdited); + final difference = now.difference(lastEdited); - if (difference.inDays > 0) { - return 'Edited ${difference.inDays} day${difference.inDays == 1 ? '' : 's'} ago'; - } else if (difference.inHours > 0) { - return 'Edited ${difference.inHours} hour${difference.inHours == 1 ? '' : 's'} ago'; - } else if (difference.inMinutes > 0) { - return 'Edited ${difference.inMinutes} minute${difference.inMinutes == 1 ? '' : 's'} ago'; - } else { - return 'Edited just now'; - } + if (difference.inDays > 0) { + return 'Edited ${difference.inDays} day${difference.inDays == 1 ? '' : 's'} ago'; + } else if (difference.inHours > 0) { + return 'Edited ${difference.inHours} hour${difference.inHours == 1 ? '' : 's'} ago'; + } else if (difference.inMinutes > 0) { + return 'Edited ${difference.inMinutes} minute${difference.inMinutes == 1 ? '' : 's'} ago'; + } else if (difference.inSeconds > 0) { + return 'Edited ${difference.inSeconds} second${difference.inSeconds == 1 ? '' : 's'} ago'; + } else { + return 'Edited just now'; + } } } diff --git a/lib/core/helpers/input_validators.dart b/lib/core/helpers/input_validators.dart index 4967428..baa281a 100644 --- a/lib/core/helpers/input_validators.dart +++ b/lib/core/helpers/input_validators.dart @@ -54,7 +54,7 @@ String? validatePassword(String? value) { return 'Password must contain at least one special character (., _, @, or #)'; } - // Optional: Check for common weak passwords + // Check for common weak passwords if (value.contains(RegExp(r'(123456|password|qwerty|abc123)'))) { return 'Password is too common or weak'; } @@ -72,7 +72,7 @@ String? validateEmail(String? value) { 'Example: yourname@example.com'; } - // Optional: Disallow disposable emails + // Disallow disposable emails if (value.endsWith('@tempmail.com') || value.endsWith('@mailinator.com')) { return 'Disposable email addresses are not allowed'; diff --git a/lib/core/helpers/responsive_layout.helper.dart b/lib/core/helpers/responsive_layout.helper.dart index 92d11cc..e6e2cef 100644 --- a/lib/core/helpers/responsive_layout.helper.dart +++ b/lib/core/helpers/responsive_layout.helper.dart @@ -1,7 +1,6 @@ +import 'package:cookethflow/core/utils/enums.dart'; import 'package:flutter/material.dart'; -enum DeviceType { mobile, tab, desktop } - class ResponsiveLayoutHelper { static const int mobileMaxWidth = 375; static const int tabletMaxWidth = 720; diff --git a/lib/core/utils/enums.dart b/lib/core/utils/enums.dart index 0d984f1..03405b3 100644 --- a/lib/core/utils/enums.dart +++ b/lib/core/utils/enums.dart @@ -3,6 +3,8 @@ import 'package:phosphor_flutter/phosphor_flutter.dart'; enum ProviderState { inital, empty, loading, loaded, success, error } +enum DeviceType { mobile, tab, desktop } + enum NodeType { note, rectangle, diff --git a/lib/features/auth/pages/login.dart b/lib/features/auth/pages/login.dart index 9fcfc60..3501944 100644 --- a/lib/features/auth/pages/login.dart +++ b/lib/features/auth/pages/login.dart @@ -1,4 +1,5 @@ import 'package:cookethflow/core/helpers/responsive_layout.helper.dart'; +import 'package:cookethflow/core/utils/enums.dart'; import 'package:cookethflow/features/auth/pages/desktop/login_desktop.dart'; import 'package:cookethflow/features/auth/pages/mobile/login_mobile.dart'; import 'package:cookethflow/features/auth/pages/tablet/login_tablet.dart'; diff --git a/lib/features/auth/pages/signup.dart b/lib/features/auth/pages/signup.dart index 9b71bd2..044272a 100644 --- a/lib/features/auth/pages/signup.dart +++ b/lib/features/auth/pages/signup.dart @@ -1,4 +1,5 @@ import 'package:cookethflow/core/helpers/responsive_layout.helper.dart'; +import 'package:cookethflow/core/utils/enums.dart'; import 'package:cookethflow/features/auth/pages/desktop/signup_desktop.dart'; import 'package:cookethflow/features/auth/pages/mobile/signup_mobile.dart'; import 'package:cookethflow/features/auth/pages/tablet/signup_tablet.dart'; diff --git a/lib/features/auth/widgets/login_form.dart b/lib/features/auth/widgets/login_form.dart index 96a8106..40ecb3a 100644 --- a/lib/features/auth/widgets/login_form.dart +++ b/lib/features/auth/widgets/login_form.dart @@ -10,6 +10,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:go_router/go_router.dart'; import 'package:provider/provider.dart'; import 'package:phosphor_flutter/phosphor_flutter.dart'; +import 'package:cookethflow/core/utils/enums.dart' as en; class LoginForm extends StatelessWidget { const LoginForm({super.key}); @@ -18,10 +19,10 @@ class LoginForm extends StatelessWidget { Widget build(BuildContext context) { final isMobile = responsive_helper.ResponsiveLayoutHelper.getDeviceType(context) == - responsive_helper.DeviceType.mobile; + en.DeviceType.mobile; final isDesktop = responsive_helper.ResponsiveLayoutHelper.getDeviceType(context) == - responsive_helper.DeviceType.desktop; + en.DeviceType.desktop; // Use a MultiProvider to listen to both AuthenticationProvider and SupabaseService // SupabaseService's currentUser updates will trigger rebuilds related to auth state. diff --git a/lib/features/auth/widgets/signup_form.dart b/lib/features/auth/widgets/signup_form.dart index 990bf10..804c9cc 100644 --- a/lib/features/auth/widgets/signup_form.dart +++ b/lib/features/auth/widgets/signup_form.dart @@ -10,6 +10,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:go_router/go_router.dart'; import 'package:provider/provider.dart'; import 'package:phosphor_flutter/phosphor_flutter.dart'; +import 'package:cookethflow/core/utils/enums.dart' as en; class SignUpForm extends StatelessWidget { const SignUpForm({super.key}); @@ -18,10 +19,10 @@ class SignUpForm extends StatelessWidget { Widget build(BuildContext context) { final isMobile = responsive_helper.ResponsiveLayoutHelper.getDeviceType(context) == - responsive_helper.DeviceType.mobile; + en.DeviceType.mobile; final isDesktop = responsive_helper.ResponsiveLayoutHelper.getDeviceType(context) == - responsive_helper.DeviceType.desktop; + en.DeviceType.desktop; return Consumer2( // Consume both providers diff --git a/lib/features/dashboard/pages/dashboard.dart b/lib/features/dashboard/pages/dashboard.dart index adbbef2..649341d 100644 --- a/lib/features/dashboard/pages/dashboard.dart +++ b/lib/features/dashboard/pages/dashboard.dart @@ -6,6 +6,7 @@ import 'package:cookethflow/features/dashboard/pages/mobile/dashboard_mobile.dar import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:provider/provider.dart'; +import 'package:cookethflow/core/utils/enums.dart' as en; class DashboardPage extends StatelessWidget { const DashboardPage({super.key}); @@ -14,13 +15,13 @@ class DashboardPage extends StatelessWidget { Widget build(BuildContext context) { Widget dashboardScreen; switch (responsive_helper.ResponsiveLayoutHelper.getDeviceType(context)) { - case responsive_helper.DeviceType.desktop: + case en.DeviceType.desktop: dashboardScreen = DashboardDesktop(); break; - case responsive_helper.DeviceType.tab: + case en.DeviceType.tab: dashboardScreen = DashboardDesktop(); break; - case responsive_helper.DeviceType.mobile: + case en.DeviceType.mobile: dashboardScreen = DashboardMobile(); break; } diff --git a/lib/features/dashboard/pages/desktop/dashboard_desktop.dart b/lib/features/dashboard/pages/desktop/dashboard_desktop.dart index d1f9212..52dce0d 100644 --- a/lib/features/dashboard/pages/desktop/dashboard_desktop.dart +++ b/lib/features/dashboard/pages/desktop/dashboard_desktop.dart @@ -8,13 +8,14 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:provider/provider.dart'; import 'package:cookethflow/core/helpers/responsive_layout.helper.dart' as rh; +import 'package:cookethflow/core/utils/enums.dart' as en; class DashboardDesktop extends StatelessWidget { const DashboardDesktop({super.key}); @override Widget build(BuildContext context) { - rh.DeviceType deviceType = rh.ResponsiveLayoutHelper.getDeviceType(context); + en.DeviceType deviceType = rh.ResponsiveLayoutHelper.getDeviceType(context); return Consumer2( builder: (context, provider,supabaseprovider, child) { return LayoutBuilder( @@ -29,7 +30,7 @@ class DashboardDesktop extends StatelessWidget { provider.isDrawerOpen ? constraints.maxHeight : 0.185.sh, - width: deviceType == rh.DeviceType.desktop ? 0.24.sw : deviceType == rh.DeviceType.tab ? 0.257.sw : 600.w, + width: deviceType == en.DeviceType.desktop ? 0.24.sw : deviceType == en.DeviceType.tab ? 0.257.sw : 600.w, child: const DashboardDrawer(), ), @@ -108,7 +109,7 @@ class DashboardDesktop extends StatelessWidget { ), ); } - rh.DeviceType deviceType = rh.ResponsiveLayoutHelper.getDeviceType(context); + en.DeviceType deviceType = rh.ResponsiveLayoutHelper.getDeviceType(context); return GridView.builder( shrinkWrap: true, itemCount: displayedWorkspaces.length, @@ -117,7 +118,7 @@ class DashboardDesktop extends StatelessWidget { crossAxisCount: 3, crossAxisSpacing: 20.w, mainAxisSpacing: 20.h, - childAspectRatio: deviceType == rh.DeviceType.desktop ? 4.0/3 : 3.2/ 3, + childAspectRatio: deviceType == en.DeviceType.desktop ? 4.0/3 : 3.2/ 3, ), itemBuilder: (context, index) { final workspace = displayedWorkspaces[index]; diff --git a/lib/features/dashboard/pages/mobile/dashboard_mobile.dart b/lib/features/dashboard/pages/mobile/dashboard_mobile.dart index 31a59fe..d6e33d3 100644 --- a/lib/features/dashboard/pages/mobile/dashboard_mobile.dart +++ b/lib/features/dashboard/pages/mobile/dashboard_mobile.dart @@ -9,6 +9,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:provider/provider.dart'; import 'package:cookethflow/core/helpers/responsive_layout.helper.dart' as rh; +import 'package:cookethflow/core/utils/enums.dart' as en; class DashboardMobile extends StatefulWidget { const DashboardMobile({super.key}); @@ -21,7 +22,7 @@ class _DashboardMobileState extends State { bool is_Visible = false; @override Widget build(BuildContext context) { - rh.DeviceType deviceType = rh.ResponsiveLayoutHelper.getDeviceType(context); + en.DeviceType deviceType = rh.ResponsiveLayoutHelper.getDeviceType(context); return Consumer2( builder: (context, provider,suprovider,child) { return LayoutBuilder( @@ -71,7 +72,7 @@ class _DashboardMobileState extends State { duration: const Duration(milliseconds: 500), height: provider.isDrawerOpen ? 0.8.sh : 0.185.sh, width: - deviceType == rh.DeviceType.desktop ? 400.w : 0.70.sw, + deviceType == en.DeviceType.desktop ? 400.w : 0.70.sw, child: const DashboardDrawerMob(), ), ), diff --git a/lib/features/dashboard/pages/mobile/drawer_mobile.dart b/lib/features/dashboard/pages/mobile/drawer_mobile.dart index 1e0bdb8..a64b3d8 100644 --- a/lib/features/dashboard/pages/mobile/drawer_mobile.dart +++ b/lib/features/dashboard/pages/mobile/drawer_mobile.dart @@ -9,13 +9,14 @@ import 'package:provider/provider.dart'; import 'package:cookethflow/features/dashboard/widgets/upgrade_plan.dart'; import 'package:cookethflow/features/dashboard/widgets/edit_profile.dart'; import 'package:cached_network_image/cached_network_image.dart'; // For network images +import 'package:cookethflow/core/utils/enums.dart' as en; class DashboardDrawerMob extends StatelessWidget { const DashboardDrawerMob({super.key}); @override Widget build(BuildContext context) { - rh.DeviceType device = rh.ResponsiveLayoutHelper.getDeviceType(context); + en.DeviceType device = rh.ResponsiveLayoutHelper.getDeviceType(context); return Consumer2( // Consume both providers builder: (context, dashboardProvider, supabaseService, child) { @@ -32,7 +33,13 @@ class DashboardDrawerMob extends StatelessWidget { return Container( decoration: BoxDecoration( color: Theme.of(context).cardColor, - border: Border.all(color:supabaseService.isDark?Colors.grey.shade700: const Color(0xFFD9D9D9), width: 1.2), + border: Border.all( + color: + supabaseService.isDark + ? Colors.grey.shade700 + : const Color(0xFFD9D9D9), + width: 1.2, + ), borderRadius: BorderRadius.circular(12.r), ), child: Padding( @@ -49,9 +56,9 @@ class DashboardDrawerMob extends StatelessWidget { ClipOval( child: SizedBox( width: - device == rh.DeviceType.desktop ? 72.w : 190.w, + device == en.DeviceType.desktop ? 72.w : 190.w, height: - device == rh.DeviceType.desktop ? 72.h : 80.h, + device == en.DeviceType.desktop ? 72.h : 80.h, child: displayAvatarUrl.isNotEmpty ? CachedNetworkImage( @@ -73,7 +80,7 @@ class DashboardDrawerMob extends StatelessWidget { ), ), SizedBox( - width: device == rh.DeviceType.desktop ? 8.w : 30.w, + width: device == en.DeviceType.desktop ? 8.w : 30.w, ), Flexible( child: Column( @@ -85,7 +92,7 @@ class DashboardDrawerMob extends StatelessWidget { style: TextStyle( fontFamily: 'Frederik', fontSize: - device == rh.DeviceType.desktop + device == en.DeviceType.desktop ? 24.sp : 75.sp, fontWeight: FontWeight.w600, @@ -98,7 +105,7 @@ class DashboardDrawerMob extends StatelessWidget { style: TextStyle( fontFamily: 'Frederik', fontSize: - device == rh.DeviceType.desktop + device == en.DeviceType.desktop ? 16.sp : 58.sp, ), @@ -108,9 +115,7 @@ class DashboardDrawerMob extends StatelessWidget { ), ], ), - SizedBox( - height : 15.h, - ), + SizedBox(height: 15.h), Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ @@ -130,9 +135,9 @@ class DashboardDrawerMob extends StatelessWidget { style: ElevatedButton.styleFrom( padding: EdgeInsets.symmetric( horizontal: - device == rh.DeviceType.desktop ? 28.w : 65.w, + device == en.DeviceType.desktop ? 28.w : 65.w, vertical: - device == rh.DeviceType.desktop ? 24.h : 20.h, + device == en.DeviceType.desktop ? 24.h : 20.h, ), foregroundColor: primaryColor, shape: RoundedRectangleBorder( @@ -142,7 +147,7 @@ class DashboardDrawerMob extends StatelessWidget { side: BorderSide(color: primaryColor), minimumSize: Size( 0, - device == rh.DeviceType.desktop ? 48.h : 40.h, + device == en.DeviceType.desktop ? 48.h : 40.h, ), ), label: Text( @@ -150,7 +155,7 @@ class DashboardDrawerMob extends StatelessWidget { style: TextStyle( fontFamily: 'Fredrik', fontSize: - device == rh.DeviceType.desktop + device == en.DeviceType.desktop ? 16.sp : 45.sp, color: primaryColor, @@ -171,9 +176,9 @@ class DashboardDrawerMob extends StatelessWidget { style: ElevatedButton.styleFrom( padding: EdgeInsets.symmetric( horizontal: - device == rh.DeviceType.desktop ? 28.w : 65.w, + device == en.DeviceType.desktop ? 28.w : 65.w, vertical: - device == rh.DeviceType.desktop ? 24.h : 20.h, + device == en.DeviceType.desktop ? 24.h : 20.h, ), foregroundColor: primaryColor, shape: RoundedRectangleBorder( @@ -183,7 +188,7 @@ class DashboardDrawerMob extends StatelessWidget { side: BorderSide(color: primaryColor), minimumSize: Size( 0, - device == rh.DeviceType.desktop ? 48.h : 40.h, + device == en.DeviceType.desktop ? 48.h : 40.h, ), ), label: Text( @@ -191,7 +196,7 @@ class DashboardDrawerMob extends StatelessWidget { style: TextStyle( fontFamily: 'Fredrik', fontSize: - device == rh.DeviceType.desktop + device == en.DeviceType.desktop ? 16.sp : 45.sp, color: Colors.white, @@ -202,7 +207,7 @@ class DashboardDrawerMob extends StatelessWidget { ), ], ), - SizedBox(height: device == rh.DeviceType.desktop ? 15.h : 10.h), + SizedBox(height: device == en.DeviceType.desktop ? 15.h : 10.h), Visibility( visible: dashboardProvider.isDrawerOpen, child: Divider(color: Colors.grey, thickness: 0.5), @@ -224,9 +229,9 @@ class DashboardDrawerMob extends StatelessWidget { margin: EdgeInsets.symmetric(vertical: 0.8.h), padding: EdgeInsets.symmetric( horizontal: - device == rh.DeviceType.desktop ? 12.w : 16.w, + device == en.DeviceType.desktop ? 12.w : 16.w, vertical: - device == rh.DeviceType.desktop ? 12.h : 10.h, + device == en.DeviceType.desktop ? 12.h : 10.h, ), decoration: BoxDecoration( color: Colors.transparent, @@ -240,9 +245,11 @@ class DashboardDrawerMob extends StatelessWidget { color: isSelected ? secondaryColors[6] - : supabaseService.isDark?Colors.white: Colors.black, + : supabaseService.isDark + ? Colors.white + : Colors.black, size: - device == rh.DeviceType.desktop + device == en.DeviceType.desktop ? 26.sp : 100.sp, ), @@ -251,7 +258,7 @@ class DashboardDrawerMob extends StatelessWidget { ), SizedBox( width: - device == rh.DeviceType.desktop + device == en.DeviceType.desktop ? 12.w : 10.w, ), @@ -260,11 +267,15 @@ class DashboardDrawerMob extends StatelessWidget { style: TextStyle( fontFamily: 'Fredrik', fontSize: - device == rh.DeviceType.desktop + device == en.DeviceType.desktop ? 18.sp : 55.sp, color: - isSelected ? Colors.blue : supabaseService.isDark?Colors.white: Colors.black, + isSelected + ? Colors.blue + : supabaseService.isDark + ? Colors.white + : Colors.black, fontWeight: isSelected ? FontWeight.w800 @@ -280,7 +291,7 @@ class DashboardDrawerMob extends StatelessWidget { ), Spacer(), Spacer(), - UpgradeCard(sv: supabaseService,), + UpgradeCard(sv: supabaseService), ], ), ), diff --git a/lib/features/dashboard/widgets/dashboard_drawer.dart b/lib/features/dashboard/widgets/dashboard_drawer.dart index 1e2b9b6..dcf0951 100644 --- a/lib/features/dashboard/widgets/dashboard_drawer.dart +++ b/lib/features/dashboard/widgets/dashboard_drawer.dart @@ -11,13 +11,14 @@ import 'package:provider/provider.dart'; import 'package:cookethflow/features/dashboard/widgets/upgrade_plan.dart'; import 'package:cookethflow/features/dashboard/widgets/edit_profile.dart'; import 'package:cached_network_image/cached_network_image.dart'; // For network images +import 'package:cookethflow/core/utils/enums.dart' as en; class DashboardDrawer extends StatelessWidget { const DashboardDrawer({super.key}); @override Widget build(BuildContext context) { - rh.DeviceType device = rh.ResponsiveLayoutHelper.getDeviceType(context); + en.DeviceType device = rh.ResponsiveLayoutHelper.getDeviceType(context); return Consumer2( // Consume both providers builder: (context, dashboardProvider, supabaseService, child) { @@ -64,15 +65,15 @@ class DashboardDrawer extends StatelessWidget { ClipOval( child: SizedBox( width: - device == rh.DeviceType.desktop + device == en.DeviceType.desktop ? 72.w - : device == rh.DeviceType.tab + : device == en.DeviceType.tab ? 72.w : 80.w, height: - device == rh.DeviceType.desktop + device == en.DeviceType.desktop ? 72.h - : device == rh.DeviceType.tab + : device == en.DeviceType.tab ? 72.h : 80.h, child: @@ -86,7 +87,7 @@ class DashboardDrawer extends StatelessWidget { errorWidget: (context, url, error) => Image.asset( - supabaseService! + supabaseService .defaultPfpPath, fit: BoxFit.cover, ), // Fallback to default asset @@ -99,9 +100,9 @@ class DashboardDrawer extends StatelessWidget { ), SizedBox( width: - device == rh.DeviceType.desktop + device == en.DeviceType.desktop ? 8.w - : device == rh.DeviceType.tab + : device == en.DeviceType.tab ? 8.w : 24.w, ), @@ -115,9 +116,9 @@ class DashboardDrawer extends StatelessWidget { style: TextStyle( fontFamily: 'Frederik', fontSize: - device == rh.DeviceType.desktop + device == en.DeviceType.desktop ? 24.sp - : device == rh.DeviceType.tab + : device == en.DeviceType.tab ? 24.sp : 36.sp, fontWeight: FontWeight.w600, @@ -130,9 +131,9 @@ class DashboardDrawer extends StatelessWidget { style: TextStyle( fontFamily: 'Frederik', fontSize: - device == rh.DeviceType.desktop + device == en.DeviceType.desktop ? 16.sp - : device == rh.DeviceType.tab + : device == en.DeviceType.tab ? 16.sp : 24.sp, ), @@ -144,16 +145,16 @@ class DashboardDrawer extends StatelessWidget { ), SizedBox( height: - device == rh.DeviceType.desktop + device == en.DeviceType.desktop ? 30.h - : device == rh.DeviceType.tab + : device == en.DeviceType.tab ? 30.h : 16.h, ), Row( mainAxisSize: MainAxisSize.min, mainAxisAlignment: - device == rh.DeviceType.desktop + device == en.DeviceType.desktop ? MainAxisAlignment.start : MainAxisAlignment.spaceBetween, children: [ @@ -169,16 +170,16 @@ class DashboardDrawer extends StatelessWidget { PhosphorIcons.pencilSimple(), color: primaryColor, size: - device == rh.DeviceType.desktop ? 30.h : 25.h, + device == en.DeviceType.desktop ? 30.h : 25.h, ), style: ElevatedButton.styleFrom( padding: EdgeInsets.symmetric( horizontal: - device == rh.DeviceType.desktop + device == en.DeviceType.desktop ? 28.w : 24.w, vertical: - device == rh.DeviceType.desktop + device == en.DeviceType.desktop ? 24.h : 15.h, ), @@ -193,9 +194,9 @@ class DashboardDrawer extends StatelessWidget { side: BorderSide(color: primaryColor), minimumSize: Size( 0, - device == rh.DeviceType.desktop + device == en.DeviceType.desktop ? 48.h - : device == rh.DeviceType.tab + : device == en.DeviceType.tab ? 48.h : 40.h, ), @@ -205,9 +206,9 @@ class DashboardDrawer extends StatelessWidget { style: TextStyle( fontFamily: 'Fredrik', fontSize: - device == rh.DeviceType.desktop + device == en.DeviceType.desktop ? 16.sp - : device == rh.DeviceType.tab + : device == en.DeviceType.tab ? 18.sp : 24.sp, color: primaryColor, @@ -226,16 +227,16 @@ class DashboardDrawer extends StatelessWidget { PhosphorIcons.signOut(), color: Colors.white, size: - device == rh.DeviceType.desktop ? 30.h : 25.h, + device == en.DeviceType.desktop ? 30.h : 25.h, ), style: ElevatedButton.styleFrom( padding: EdgeInsets.symmetric( horizontal: - device == rh.DeviceType.desktop + device == en.DeviceType.desktop ? 28.w : 24.w, vertical: - device == rh.DeviceType.desktop + device == en.DeviceType.desktop ? 24.h : 15.h, ), @@ -247,9 +248,9 @@ class DashboardDrawer extends StatelessWidget { side: BorderSide(color: primaryColor), minimumSize: Size( 0, - device == rh.DeviceType.desktop + device == en.DeviceType.desktop ? 48.h - : device == rh.DeviceType.tab + : device == en.DeviceType.tab ? 48.h : 40.h, ), @@ -259,9 +260,9 @@ class DashboardDrawer extends StatelessWidget { style: TextStyle( fontFamily: 'Fredrik', fontSize: - device == rh.DeviceType.desktop + device == en.DeviceType.desktop ? 16.sp - : device == rh.DeviceType.tab + : device == en.DeviceType.tab ? 18.sp : 24.sp, color: Colors.white, @@ -274,9 +275,9 @@ class DashboardDrawer extends StatelessWidget { ), SizedBox( height: - device == rh.DeviceType.desktop + device == en.DeviceType.desktop ? 15.h - : device == rh.DeviceType.tab + : device == en.DeviceType.tab ? 15.h : 10.h, ), @@ -301,9 +302,9 @@ class DashboardDrawer extends StatelessWidget { margin: EdgeInsets.symmetric(vertical: 4.h), padding: EdgeInsets.symmetric( horizontal: - device == rh.DeviceType.desktop ? 12.w : 16.w, + device == en.DeviceType.desktop ? 12.w : 16.w, vertical: - device == rh.DeviceType.desktop ? 12.h : 16.h, + device == en.DeviceType.desktop ? 12.h : 16.h, ), decoration: BoxDecoration( color: Colors.transparent, @@ -321,7 +322,7 @@ class DashboardDrawer extends StatelessWidget { ? Colors.white : Colors.black, size: - device == rh.DeviceType.desktop + device == en.DeviceType.desktop ? 26.sp : 34.sp, ), @@ -330,7 +331,7 @@ class DashboardDrawer extends StatelessWidget { ), SizedBox( width: - device == rh.DeviceType.desktop + device == en.DeviceType.desktop ? 12.w : 10.w, ), @@ -339,9 +340,9 @@ class DashboardDrawer extends StatelessWidget { style: TextStyle( fontFamily: 'Fredrik', fontSize: - device == rh.DeviceType.desktop + device == en.DeviceType.desktop ? 18.sp - : device == rh.DeviceType.tab + : device == en.DeviceType.tab ? 25.sp : 16.sp, color: diff --git a/lib/features/dashboard/widgets/edit_profile.dart b/lib/features/dashboard/widgets/edit_profile.dart index 5b63c8d..2303880 100644 --- a/lib/features/dashboard/widgets/edit_profile.dart +++ b/lib/features/dashboard/widgets/edit_profile.dart @@ -12,7 +12,7 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:image_picker/image_picker.dart'; import 'package:cookethflow/core/helpers/responsive_layout.helper.dart' as rh; - +import 'package:cookethflow/core/utils/enums.dart' as en; class ProfileSettingsWidget extends StatefulWidget { const ProfileSettingsWidget({super.key}); @@ -87,12 +87,10 @@ class _ProfileSettingsWidgetState extends State { // Upload Profile Picture if a new one was selected if (_selectedImage != null) { try { - await supabaseService.uploadUserProfilePicture( - _selectedImage!, + await supabaseService.uploadUserProfilePicture(_selectedImage!); + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text('Profile picture updated!')), ); - ScaffoldMessenger.of( - context, - ).showSnackBar(const SnackBar(content: Text('Profile picture updated!'))); setState(() { _selectedImage = null; // Clear selected image after upload }); @@ -102,25 +100,25 @@ class _ProfileSettingsWidgetState extends State { ).showSnackBar(SnackBar(content: Text(e.toString()))); } } - + // Refresh user data from Supabase to ensure UI is in sync await supabaseService.supabase.auth.refreshSession(); } @override Widget build(BuildContext context) { - rh.DeviceType deviceType = rh.ResponsiveLayoutHelper.getDeviceType(context); - bool is_desk = deviceType == rh.DeviceType.desktop ? true : false; + en.DeviceType deviceType = rh.ResponsiveLayoutHelper.getDeviceType(context); + bool isDesk = deviceType == en.DeviceType.desktop ? true : false; return Consumer2( builder: (context, dashboardProvider, supabaseService, child) { final currentUser = supabaseService.currentUser; - + // Update controllers with the current state of the provider _nameController.text = currentUser?.name ?? ''; _emailController.text = currentUser?.email ?? ''; _usernameController.text = currentUser?.username ?? ''; - + final String displayAvatarUrl = _selectedImage != null ? _selectedImage!.path @@ -132,9 +130,9 @@ class _ProfileSettingsWidgetState extends State { borderRadius: BorderRadius.circular(16), ), child: Container( - width: deviceType == rh.DeviceType.desktop ? 500 : 1.6.sw, + width: deviceType == en.DeviceType.desktop ? 500 : 1.6.sw, padding: - deviceType == rh.DeviceType.desktop + deviceType == en.DeviceType.desktop ? const EdgeInsets.all(24) : const EdgeInsets.only(top: 16, left: 10, right: 10), child: Column( @@ -151,7 +149,7 @@ class _ProfileSettingsWidgetState extends State { constraints: const BoxConstraints(), ), ), - deviceType == rh.DeviceType.desktop + deviceType == en.DeviceType.desktop ? const SizedBox(height: 16) : const SizedBox(height: 8), @@ -209,8 +207,7 @@ class _ProfileSettingsWidgetState extends State { child: InkWell( onTap: _pickImage, child: Container( - width: - 28, + width: 28, height: 28, decoration: BoxDecoration( color: Theme.of(context).primaryColor, @@ -230,7 +227,7 @@ class _ProfileSettingsWidgetState extends State { ), ], ), - deviceType == rh.DeviceType.desktop + deviceType == en.DeviceType.desktop ? const SizedBox(width: 16) : const SizedBox(width: 8), Column( @@ -245,7 +242,7 @@ class _ProfileSettingsWidgetState extends State { Theme.of(context).textTheme.titleLarge?.color, ), ), - deviceType == rh.DeviceType.desktop + deviceType == en.DeviceType.desktop ? const SizedBox(height: 4) : const SizedBox(height: 2), Text( @@ -260,7 +257,7 @@ class _ProfileSettingsWidgetState extends State { ], ), - deviceType == rh.DeviceType.desktop + deviceType == en.DeviceType.desktop ? const SizedBox(height: 32) : const SizedBox(height: 16), @@ -281,7 +278,7 @@ class _ProfileSettingsWidgetState extends State { ], ), - deviceType == rh.DeviceType.desktop + deviceType == en.DeviceType.desktop ? const SizedBox(height: 20) : const SizedBox(height: 10), @@ -293,7 +290,7 @@ class _ProfileSettingsWidgetState extends State { width: 250, ), - deviceType == rh.DeviceType.desktop + deviceType == en.DeviceType.desktop ? const SizedBox(height: 32) : const SizedBox(height: 16), @@ -313,13 +310,14 @@ class _ProfileSettingsWidgetState extends State { Theme.of(context).textTheme.titleLarge?.color, ), ), - deviceType == rh.DeviceType.desktop + deviceType == en.DeviceType.desktop ? const SizedBox(height: 4) : const SizedBox(height: 2), Text( 'Toggle between light and dark mode', style: TextStyle( - fontSize:deviceType == rh.DeviceType.desktop? 14 : 10, + fontSize: + deviceType == en.DeviceType.desktop ? 14 : 10, color: Theme.of(context).textTheme.bodySmall?.color, ), ), @@ -332,9 +330,9 @@ class _ProfileSettingsWidgetState extends State { ? Icons.dark_mode : Icons.light_mode, color: Theme.of(context).iconTheme.color, - size:deviceType == rh.DeviceType.desktop?20 : 10, + size: deviceType == en.DeviceType.desktop ? 20 : 10, ), - deviceType == rh.DeviceType.desktop + deviceType == en.DeviceType.desktop ? const SizedBox(height: 8) : const SizedBox(height: 4), Switch( @@ -347,7 +345,7 @@ class _ProfileSettingsWidgetState extends State { ], ), - deviceType == rh.DeviceType.desktop + deviceType == en.DeviceType.desktop ? const SizedBox(height: 32) : const SizedBox(height: 16), @@ -401,11 +399,11 @@ class _ProfileSettingsWidgetState extends State { ], ), - deviceType == rh.DeviceType.desktop + deviceType == en.DeviceType.desktop ? const SizedBox(height: 32) : const SizedBox(height: 16), Divider(color: Theme.of(context).dividerColor), - deviceType == rh.DeviceType.desktop + deviceType == en.DeviceType.desktop ? const SizedBox(height: 24) : const SizedBox(height: 12), @@ -425,20 +423,21 @@ class _ProfileSettingsWidgetState extends State { Theme.of(context).textTheme.titleLarge?.color, ), ), - deviceType == rh.DeviceType.desktop + deviceType == en.DeviceType.desktop ? const SizedBox(height: 4) : const SizedBox(height: 4), Text( 'Permanently delete your account', style: TextStyle( - fontSize:deviceType == rh.DeviceType.desktop? 14 : 10, + fontSize: + deviceType == en.DeviceType.desktop ? 14 : 10, color: Theme.of(context).textTheme.bodySmall?.color, ), ), ], ), Visibility( - visible: is_desk, + visible: isDesk, child: ElevatedButton( onPressed: () { showDialog( @@ -450,9 +449,9 @@ class _ProfileSettingsWidgetState extends State { backgroundColor: secondaryColors[1], padding: EdgeInsets.symmetric( horizontal: - deviceType == rh.DeviceType.desktop ? 20 : 10, + deviceType == en.DeviceType.desktop ? 20 : 10, vertical: - deviceType == rh.DeviceType.desktop ? 10 : 5, + deviceType == en.DeviceType.desktop ? 10 : 5, ), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(8), @@ -484,7 +483,7 @@ class _ProfileSettingsWidgetState extends State { ), const SizedBox(height: 8), Visibility( - visible: !is_desk, + visible: !isDesk, child: Center( child: ElevatedButton( onPressed: () { @@ -497,9 +496,9 @@ class _ProfileSettingsWidgetState extends State { backgroundColor: secondaryColors[1], padding: EdgeInsets.symmetric( horizontal: - deviceType == rh.DeviceType.desktop ? 20 : 10, + deviceType == en.DeviceType.desktop ? 20 : 10, vertical: - deviceType == rh.DeviceType.desktop ? 10 : 5, + deviceType == en.DeviceType.desktop ? 10 : 5, ), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(8), @@ -578,4 +577,4 @@ class _ProfileSettingsWidgetState extends State { ), ); } -} \ No newline at end of file +} diff --git a/lib/features/dashboard/widgets/project_card.dart b/lib/features/dashboard/widgets/project_card.dart index 170d6ec..0947c30 100644 --- a/lib/features/dashboard/widgets/project_card.dart +++ b/lib/features/dashboard/widgets/project_card.dart @@ -11,6 +11,7 @@ import 'package:go_router/go_router.dart'; import 'package:phosphor_flutter/phosphor_flutter.dart'; import 'package:provider/provider.dart'; import 'package:cookethflow/core/helpers/responsive_layout.helper.dart' as rh; +import 'package:cookethflow/core/utils/enums.dart' as en; class ProjectCard extends StatelessWidget { const ProjectCard({super.key, required this.workspaceId, required this.su}); @@ -19,7 +20,7 @@ class ProjectCard extends StatelessWidget { @override Widget build(BuildContext context) { - rh.DeviceType deviceType = rh.ResponsiveLayoutHelper.getDeviceType(context); + en.DeviceType deviceType = rh.ResponsiveLayoutHelper.getDeviceType(context); DateTimeHelper dth = DateTimeHelper(); return Consumer2( builder: (context, provider, workspaceProvider, child) { @@ -76,7 +77,7 @@ class ProjectCard extends StatelessWidget { right: 12.w, child: Container( padding: - deviceType == rh.DeviceType.desktop + deviceType == en.DeviceType.desktop ? EdgeInsets.all(8.w) : EdgeInsets.all(8.w), decoration: BoxDecoration( @@ -89,7 +90,7 @@ class ProjectCard extends StatelessWidget { color: su.isDark ? Color.fromRGBO(75, 75, 75, 1) - : Color.fromRGBO(217, 217, 217,1), + : Color.fromRGBO(217, 217, 217, 1), ), ), child: IconButton( @@ -112,9 +113,9 @@ class ProjectCard extends StatelessWidget { icon: Icon( PhosphorIconsRegular.dotsThree, size: - deviceType == rh.DeviceType.desktop + deviceType == en.DeviceType.desktop ? 32.sp - : deviceType == rh.DeviceType.tab + : deviceType == en.DeviceType.tab ? 32.sp : 80.sp, color: su.isDark ? Colors.white : Colors.black, @@ -129,10 +130,7 @@ class ProjectCard extends StatelessWidget { Expanded( flex: 1, child: Padding( - padding: EdgeInsets.symmetric( - horizontal: 24, - vertical: 16, - ), + padding: EdgeInsets.symmetric(horizontal: 24, vertical: 16), child: Row( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.spaceBetween, @@ -146,13 +144,12 @@ class ProjectCard extends StatelessWidget { style: TextStyle( fontFamily: 'Fredrik', fontSize: - deviceType == rh.DeviceType.desktop + deviceType == en.DeviceType.desktop ? 20.sp - : deviceType == rh.DeviceType.tab + : deviceType == en.DeviceType.tab ? 18.sp : 50.sp, - color: - su.isDark ? Colors.white : Colors.black, + color: su.isDark ? Colors.white : Colors.black, fontWeight: FontWeight.w600, ), overflow: TextOverflow.ellipsis, @@ -163,13 +160,11 @@ class ProjectCard extends StatelessWidget { style: TextStyle( fontFamily: 'Fredrik', color: - su.isDark - ? Colors.white - : Colors.grey[600], + su.isDark ? Colors.white : Colors.grey[600], fontSize: - deviceType == rh.DeviceType.desktop + deviceType == en.DeviceType.desktop ? 14.sp - : deviceType == rh.DeviceType.tab + : deviceType == en.DeviceType.tab ? 14.sp : 44.sp, fontWeight: FontWeight.w500, @@ -199,9 +194,9 @@ class ProjectCard extends StatelessWidget { // Use a key to help AnimatedSwitcher differentiate between the two icons key: ValueKey(workspace.isStarred), size: - deviceType == rh.DeviceType.desktop + deviceType == en.DeviceType.desktop ? 32.sp - : deviceType == rh.DeviceType.tab + : deviceType == en.DeviceType.tab ? 32.sp : 62.sp, color: diff --git a/lib/features/dashboard/widgets/start_project.dart b/lib/features/dashboard/widgets/start_project.dart index 4b3564b..3d09ae3 100644 --- a/lib/features/dashboard/widgets/start_project.dart +++ b/lib/features/dashboard/widgets/start_project.dart @@ -5,23 +5,29 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:phosphor_flutter/phosphor_flutter.dart'; import 'package:provider/provider.dart'; import 'package:cookethflow/core/helpers/responsive_layout.helper.dart' as rh; +import 'package:cookethflow/core/utils/enums.dart' as en; class StartProject extends StatelessWidget { const StartProject({super.key}); @override Widget build(BuildContext context) { - rh.DeviceType deviceType = rh.ResponsiveLayoutHelper.getDeviceType(context); + en.DeviceType deviceType = rh.ResponsiveLayoutHelper.getDeviceType(context); return Consumer( builder: (context, value, child) { return ElevatedButton( onPressed: () { - showDialog(context: context, builder: (context) => AddProject(),); + showDialog(context: context, builder: (context) => AddProject()); }, style: ElevatedButton.styleFrom( elevation: 0, backgroundColor: primaryColor, - padding: deviceType == rh.DeviceType.desktop ? EdgeInsets.symmetric(vertical: 35.h, horizontal: 24.w) : deviceType == rh.DeviceType.tab ?EdgeInsets.symmetric(vertical: 35.h, horizontal: 24.w) : EdgeInsets.symmetric(vertical: 20.h, horizontal: 24.w) , + padding: + deviceType == en.DeviceType.desktop + ? EdgeInsets.symmetric(vertical: 35.h, horizontal: 24.w) + : deviceType == en.DeviceType.tab + ? EdgeInsets.symmetric(vertical: 35.h, horizontal: 24.w) + : EdgeInsets.symmetric(vertical: 20.h, horizontal: 24.w), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(12.r), ), @@ -33,7 +39,12 @@ class StartProject extends StatelessWidget { 'Start a New Project', style: TextStyle( fontFamily: 'Fredrik', - fontSize:deviceType == rh.DeviceType.desktop ? 18.sp : deviceType == rh.DeviceType.tab ?25.sp : 35.sp, + fontSize: + deviceType == en.DeviceType.desktop + ? 18.sp + : deviceType == en.DeviceType.tab + ? 25.sp + : 35.sp, color: Colors.white, fontWeight: FontWeight.w500, ), diff --git a/lib/features/dashboard/widgets/upgrade_plan.dart b/lib/features/dashboard/widgets/upgrade_plan.dart index 0a57378..fb7d74b 100644 --- a/lib/features/dashboard/widgets/upgrade_plan.dart +++ b/lib/features/dashboard/widgets/upgrade_plan.dart @@ -4,6 +4,7 @@ import 'package:cookethflow/core/theme/colors.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:phosphor_flutter/phosphor_flutter.dart'; +import 'package:cookethflow/core/utils/enums.dart' as en; class UpgradeCard extends StatefulWidget { final SupabaseService sv; @@ -16,28 +17,29 @@ class UpgradeCard extends StatefulWidget { class _UpgradeCardState extends State { @override Widget build(BuildContext context) { - rh.DeviceType device = rh.ResponsiveLayoutHelper.getDeviceType(context); + en.DeviceType device = rh.ResponsiveLayoutHelper.getDeviceType(context); return Container( margin: EdgeInsets.only(top: 20.h), padding: EdgeInsets.symmetric( horizontal: - device == rh.DeviceType.desktop + device == en.DeviceType.desktop ? 24.w - : device == rh.DeviceType.tab + : device == en.DeviceType.tab ? 24.w : 30.w, vertical: - device == rh.DeviceType.desktop + device == en.DeviceType.desktop ? 20.w - : device == rh.DeviceType.tab + : device == en.DeviceType.tab ? 20.w : 30.w, ), decoration: BoxDecoration( - color: widget.sv.isDark - ? Color.fromRGBO(48, 48, 48, 100) - : Color.fromRGBO(255, 255, 255, 100), + color: + widget.sv.isDark + ? Color.fromRGBO(48, 48, 48, 100) + : Color.fromRGBO(255, 255, 255, 100), borderRadius: BorderRadius.circular(12.r), border: Border.all( color: widget.sv.isDark ? Colors.grey.shade700 : Color(0xFFD9D9D9), @@ -54,9 +56,9 @@ class _UpgradeCardState extends State { PhosphorIconsRegular.sparkle, color: widget.sv.isDark ? Colors.white : Colors.black, size: - device == rh.DeviceType.desktop + device == en.DeviceType.desktop ? 24.sp - : device == rh.DeviceType.tab + : device == en.DeviceType.tab ? 28.sp : 20.sp, ), @@ -66,9 +68,9 @@ class _UpgradeCardState extends State { style: TextStyle( fontFamily: 'Fredrik', fontSize: - device == rh.DeviceType.desktop + device == en.DeviceType.desktop ? 20.sp - : device == rh.DeviceType.tab + : device == en.DeviceType.tab ? 24.sp : 45.sp, fontWeight: FontWeight.w600, @@ -83,12 +85,12 @@ class _UpgradeCardState extends State { style: TextStyle( fontFamily: 'Fredrik', fontSize: - device == rh.DeviceType.desktop + device == en.DeviceType.desktop ? 16.sp - : device == rh.DeviceType.tab + : device == en.DeviceType.tab ? 20.sp : 45.sp, - color: widget.sv.isDark?Colors.white: Color(0xFF4B4B4B), + color: widget.sv.isDark ? Colors.white : Color(0xFF4B4B4B), height: 2, ), ), @@ -104,9 +106,9 @@ class _UpgradeCardState extends State { foregroundColor: Colors.white, padding: EdgeInsets.symmetric( vertical: - device == rh.DeviceType.desktop + device == en.DeviceType.desktop ? 12.h - : device == rh.DeviceType.tab + : device == en.DeviceType.tab ? 16.h : 0.8.h, ), @@ -120,9 +122,9 @@ class _UpgradeCardState extends State { style: TextStyle( fontFamily: 'Fredrik', fontSize: - device == rh.DeviceType.desktop + device == en.DeviceType.desktop ? 14.sp - : device == rh.DeviceType.tab + : device == en.DeviceType.tab ? 18.sp : 45.sp, fontWeight: FontWeight.w500, diff --git a/lib/features/workspace/pages/desktop/workspace_desktop.dart b/lib/features/workspace/pages/desktop/workspace_desktop.dart index 49ff891..9c2fe2c 100644 --- a/lib/features/workspace/pages/desktop/workspace_desktop.dart +++ b/lib/features/workspace/pages/desktop/workspace_desktop.dart @@ -20,6 +20,7 @@ import 'package:provider/provider.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:cookethflow/features/workspace/widgets/object_text_editor.dart'; import 'package:vector_math/vector_math_64.dart' as vector_math; +import 'package:cookethflow/core/utils/enums.dart' as en; class WorkspaceDesktop extends StatefulWidget { const WorkspaceDesktop({super.key}); @@ -79,7 +80,7 @@ class _WorkspaceDesktopState extends State { StickyNoteIntent: CallbackAction( onInvoke: (intent) { final provider = Provider.of(context, listen: false); - final device = rh.DeviceType.desktop; + final device = en.DeviceType.desktop; _showStickyNote(context, device, provider); return null; }, @@ -254,7 +255,7 @@ class _WorkspaceDesktopState extends State { void _showStickyNote( BuildContext context, - rh.DeviceType device, + en.DeviceType device, SupabaseService su, ) { final RenderBox? renderBox = context.findRenderObject() as RenderBox?; @@ -273,11 +274,11 @@ class _WorkspaceDesktopState extends State { ), ), Positioned( - right: device == rh.DeviceType.mobile ? position.dx : 150.w, + right: device == en.DeviceType.mobile ? position.dx : 150.w, top: - device == rh.DeviceType.desktop + device == en.DeviceType.desktop ? 500.h - : device == rh.DeviceType.tab + : device == en.DeviceType.tab ? 500.h : position.dy - 390.h, child: Material( diff --git a/lib/features/workspace/pages/mobile/workspace_mobile.dart b/lib/features/workspace/pages/mobile/workspace_mobile.dart index b1a07aa..a336403 100644 --- a/lib/features/workspace/pages/mobile/workspace_mobile.dart +++ b/lib/features/workspace/pages/mobile/workspace_mobile.dart @@ -18,13 +18,14 @@ import 'package:provider/provider.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:cookethflow/features/workspace/widgets/object_text_editor.dart'; import 'package:vector_math/vector_math_64.dart' as vector_math; +import 'package:cookethflow/core/utils/enums.dart' as en; class WorkspaceMobile extends StatelessWidget { const WorkspaceMobile({super.key}); @override Widget build(BuildContext context) { - rh.DeviceType device = rh.ResponsiveLayoutHelper.getDeviceType(context); + en.DeviceType device = rh.ResponsiveLayoutHelper.getDeviceType(context); return Consumer2( builder: (context, provider, suprovider, child) { @@ -107,7 +108,7 @@ class WorkspaceMobile extends StatelessWidget { } } -Widget workspaceDrawerMob(rh.DeviceType device) { +Widget workspaceDrawerMob(en.DeviceType device) { return Consumer2( builder: (context, provider, suprovider, child) { Color defaultBorderColor = const Color(0xFFD9D9D9); @@ -176,7 +177,9 @@ Widget workspaceDrawerMob(rh.DeviceType device) { onPressed: () { showDialog( context: context, - builder: (context) => ExportDialog(su: suprovider,wp: provider,), + builder: + (context) => + ExportDialog(su: suprovider, wp: provider), ); }, style: ElevatedButton.styleFrom( @@ -274,7 +277,7 @@ Widget _buildSelectableListTile( required int index, required bool isSelected, required VoidCallback onTap, - required rh.DeviceType device, + required en.DeviceType device, }) { Color iconTextColor = isSelected ? Colors.blue : Colors.black; diff --git a/lib/features/workspace/pages/tablet/workspace_tablet.dart b/lib/features/workspace/pages/tablet/workspace_tablet.dart index ab1b707..707979a 100644 --- a/lib/features/workspace/pages/tablet/workspace_tablet.dart +++ b/lib/features/workspace/pages/tablet/workspace_tablet.dart @@ -12,6 +12,7 @@ import 'package:flutter_provider/flutter_provider.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:phosphor_flutter/phosphor_flutter.dart'; import 'package:cookethflow/features/workspace/widgets/workspace_drawer.dart'; +import 'package:cookethflow/core/utils/enums.dart' as en; class WorkspaceTablet extends StatelessWidget { const WorkspaceTablet({super.key}); @@ -20,9 +21,9 @@ class WorkspaceTablet extends StatelessWidget { Widget build(BuildContext context) { final device = rh.ResponsiveLayoutHelper.getDeviceType(context); - return Consumer2( - builder: (context, suprovider,workspaceProvider) { - return Scaffold( + return Consumer2( + builder: (context, suprovider, workspaceProvider) { + return Scaffold( backgroundColor: const Color(0xFFF8F8F8), body: Padding( padding: EdgeInsets.symmetric( @@ -40,12 +41,15 @@ class WorkspaceTablet extends StatelessWidget { Positioned( top: 0, right: 0.001.sw, - child: ExportProjectButton(su: suprovider,wp:workspaceProvider,), + child: ExportProjectButton( + su: suprovider, + wp: workspaceProvider, + ), ), // Container( // padding: EdgeInsets.symmetric( - // horizontal: device == rh.DeviceType.tab ? 20.w : 24.w, + // horizontal: device == en.DeviceType.tab ? 20.w : 24.w, // vertical: 16.h, // ), // decoration: BoxDecoration( @@ -147,7 +151,7 @@ class WorkspaceTablet extends StatelessWidget { "100%", style: TextStyle( fontSize: - device == rh.DeviceType.desktop ? 20.sp : 40.sp, + device == en.DeviceType.desktop ? 20.sp : 40.sp, color: Colors.black, fontWeight: FontWeight.w500, ), @@ -160,7 +164,7 @@ class WorkspaceTablet extends StatelessWidget { icon: Icon( PhosphorIconsRegular.plus, size: - device == rh.DeviceType.desktop ? 20.sp : 50.sp, + device == en.DeviceType.desktop ? 20.sp : 50.sp, ), visualDensity: VisualDensity.compact, ), @@ -172,7 +176,7 @@ class WorkspaceTablet extends StatelessWidget { icon: Icon( PhosphorIconsRegular.minus, size: - device == rh.DeviceType.desktop ? 20.sp : 50.sp, + device == en.DeviceType.desktop ? 20.sp : 50.sp, ), visualDensity: VisualDensity.compact, ), diff --git a/lib/features/workspace/pages/workspace.dart b/lib/features/workspace/pages/workspace.dart index 5f6472c..9980d1b 100644 --- a/lib/features/workspace/pages/workspace.dart +++ b/lib/features/workspace/pages/workspace.dart @@ -4,6 +4,7 @@ import 'package:flutter/material.dart'; import 'package:cookethflow/features/workspace/pages/desktop/workspace_desktop.dart'; import 'package:cookethflow/features/workspace/pages/tablet/workspace_tablet.dart'; import 'package:cookethflow/features/workspace/pages/mobile/workspace_mobile.dart'; +import 'package:cookethflow/core/utils/enums.dart' as en; class WorkspacePage extends StatelessWidget { const WorkspacePage({super.key}); @@ -13,13 +14,13 @@ class WorkspacePage extends StatelessWidget { Widget workspaceScreen; switch (responsive_helper.ResponsiveLayoutHelper.getDeviceType(context)) { - case responsive_helper.DeviceType.desktop: + case en.DeviceType.desktop: workspaceScreen = const WorkspaceDesktop(); break; - case responsive_helper.DeviceType.tab: + case en.DeviceType.tab: workspaceScreen = const WorkspaceTablet(); break; - case responsive_helper.DeviceType.mobile: + case en.DeviceType.mobile: workspaceScreen = const WorkspaceMobile(); break; } diff --git a/lib/features/workspace/widgets/colour_picker_bg.dart b/lib/features/workspace/widgets/colour_picker_bg.dart index 9ac03ca..33ae846 100644 --- a/lib/features/workspace/widgets/colour_picker_bg.dart +++ b/lib/features/workspace/widgets/colour_picker_bg.dart @@ -3,16 +3,17 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:phosphor_flutter/phosphor_flutter.dart'; import 'package:cookethflow/core/theme/colors.dart'; import 'package:cookethflow/core/helpers/responsive_layout.helper.dart' as rh; +import 'package:cookethflow/core/utils/enums.dart' as en; class ColorPickerWidget extends StatefulWidget { final Color initialColor; final Function(Color) onColorChanged; const ColorPickerWidget({ - Key? key, + super.key, this.initialColor = Colors.red, required this.onColorChanged, - }) : super(key: key); + }); @override _ColorPickerWidgetState createState() => _ColorPickerWidgetState(); @@ -83,14 +84,17 @@ class _ColorPickerWidgetState extends State { ), IconButton( onPressed: () => Navigator.of(context).pop(), - icon: Icon(PhosphorIconsRegular.x, size: 28.sp), // Larger close icon + icon: Icon( + PhosphorIconsRegular.x, + size: 28.sp, + ), // Larger close icon padding: EdgeInsets.zero, constraints: const BoxConstraints(), ), ], ), SizedBox(height: 24.h), - + // Color Picker Area (Static Gradient with Draggable Circle) Container( height: 250.h, // Increased height for better visibility @@ -116,7 +120,7 @@ class _ColorPickerWidgetState extends State { ), ), SizedBox(height: 24.h), - + // Hue Slider with Rounded Edges ClipRRect( borderRadius: BorderRadius.circular(12.r), // Rounded edges @@ -124,7 +128,14 @@ class _ColorPickerWidgetState extends State { height: 40.h, // Increased height for better interaction decoration: BoxDecoration( gradient: LinearGradient( - colors: [Colors.red, Colors.yellow, Colors.green, Colors.cyan, Colors.blue, Colors.purple], + colors: [ + Colors.red, + Colors.yellow, + Colors.green, + Colors.cyan, + Colors.blue, + Colors.purple, + ], ), border: Border.all(color: Colors.grey.shade300), ), @@ -144,7 +155,7 @@ class _ColorPickerWidgetState extends State { ), ), SizedBox(height: 24.h), - + // Opacity Slider with Rounded Edges ClipRRect( borderRadius: BorderRadius.circular(12.r), // Rounded edges @@ -172,7 +183,7 @@ class _ColorPickerWidgetState extends State { ), ), SizedBox(height: 24.h), - + // Color Info Row( children: [ @@ -194,7 +205,10 @@ class _ColorPickerWidgetState extends State { SizedBox(width: 12.w), Expanded( child: Container( - padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 10.h), + padding: EdgeInsets.symmetric( + horizontal: 12.w, + vertical: 10.h, + ), decoration: BoxDecoration( color: Colors.grey.shade100, borderRadius: BorderRadius.circular(10.r), @@ -228,7 +242,7 @@ class _ColorPickerWidgetState extends State { ], ), SizedBox(height: 24.h), - + // On this page Container( width: double.infinity, @@ -257,7 +271,7 @@ class _ColorPickerWidgetState extends State { ), ), SizedBox(height: 24.h), - + // Color Palette Wrap( spacing: 12.w, @@ -270,7 +284,7 @@ class _ColorPickerWidgetState extends State { Colors.purple, Colors.pink[100]!, Colors.green[100]!, - Colors.purple[100]! + Colors.purple[100]!, ]) Container( width: 60.w, // Increased size for better visibility @@ -307,9 +321,13 @@ class ColorToolBar extends StatelessWidget { child: Column( mainAxisSize: MainAxisSize.min, children: [ - _toolIcon(PhosphorIconsRegular.paintBucket, device, onTap: () { - _showColorPicker(context); - }), + _toolIcon( + PhosphorIconsRegular.paintBucket, + device, + onTap: () { + _showColorPicker(context); + }, + ), _horizontaldivider(), _toolIcon(PhosphorIconsRegular.circlesThreePlus, device), _toolIcon( @@ -334,21 +352,22 @@ class ColorToolBar extends StatelessWidget { void _showColorPicker(BuildContext context) { showDialog( context: context, - builder: (context) => Dialog( - backgroundColor: Colors.transparent, - child: ColorPickerWidget( - initialColor: Colors.red, - onColorChanged: (color) { - print('Selected color: $color'); - }, - ), - ), + builder: + (context) => Dialog( + backgroundColor: Colors.transparent, + child: ColorPickerWidget( + initialColor: Colors.red, + onColorChanged: (color) { + print('Selected color: $color'); + }, + ), + ), ); } Widget _toolIcon( IconData iconData, - rh.DeviceType device, { + en.DeviceType device, { Color iconColor = Colors.black87, Color backgroundColor = Colors.white, VoidCallback? onTap, @@ -361,11 +380,7 @@ class ColorToolBar extends StatelessWidget { ), child: IconButton( onPressed: onTap ?? () {}, - icon: Icon( - iconData, - size: 32.sp, - color: iconColor, - ), + icon: Icon(iconData, size: 32.sp, color: iconColor), splashRadius: 28.r, ), ); diff --git a/lib/features/workspace/widgets/export_dialog.dart b/lib/features/workspace/widgets/export_dialog.dart index 90485d2..ed9e2de 100644 --- a/lib/features/workspace/widgets/export_dialog.dart +++ b/lib/features/workspace/widgets/export_dialog.dart @@ -5,6 +5,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:phosphor_flutter/phosphor_flutter.dart'; import 'package:cookethflow/core/helpers/responsive_layout.helper.dart' as rh; +import 'package:cookethflow/core/utils/enums.dart' as en; class ExportDialog extends StatefulWidget { final SupabaseService su; @@ -54,9 +55,9 @@ class _ExportDialogState extends State { 'Export', style: TextStyle( fontSize: - device == rh.DeviceType.desktop + device == en.DeviceType.desktop ? 22.sp - : device == rh.DeviceType.tab + : device == en.DeviceType.tab ? 22.sp : 60.sp, fontWeight: FontWeight.w600, @@ -70,9 +71,9 @@ class _ExportDialogState extends State { icon: Icon( PhosphorIconsRegular.x, size: - device == rh.DeviceType.desktop + device == en.DeviceType.desktop ? 24.sp - : device == rh.DeviceType.tab + : device == en.DeviceType.tab ? 24.sp : 55.sp, ), @@ -91,9 +92,9 @@ class _ExportDialogState extends State { 'Export as', style: TextStyle( fontSize: - device == rh.DeviceType.desktop + device == en.DeviceType.desktop ? 16.sp - : device == rh.DeviceType.tab + : device == en.DeviceType.tab ? 16.sp : 45.sp, color: widget.su.isDark ? Colors.white : Colors.grey[700], @@ -111,9 +112,9 @@ class _ExportDialogState extends State { icon: Icon( PhosphorIconsRegular.caretDown, size: - device == rh.DeviceType.desktop + device == en.DeviceType.desktop ? 16.sp - : device == rh.DeviceType.tab + : device == en.DeviceType.tab ? 16.sp : 45.sp, ), @@ -132,9 +133,9 @@ class _ExportDialogState extends State { value, style: TextStyle( fontSize: - device == rh.DeviceType.desktop + device == en.DeviceType.desktop ? 16.sp - : device == rh.DeviceType.tab + : device == en.DeviceType.tab ? 16.sp : 45.sp, color: @@ -182,9 +183,9 @@ class _ExportDialogState extends State { 'Export Flowchart', style: TextStyle( fontSize: - device == rh.DeviceType.desktop + device == en.DeviceType.desktop ? 16.sp - : device == rh.DeviceType.tab + : device == en.DeviceType.tab ? 16.sp : 45.sp, fontWeight: FontWeight.w600, diff --git a/lib/features/workspace/widgets/export_project_button.dart b/lib/features/workspace/widgets/export_project_button.dart index 673e5d8..d409399 100644 --- a/lib/features/workspace/widgets/export_project_button.dart +++ b/lib/features/workspace/widgets/export_project_button.dart @@ -8,14 +8,15 @@ import 'package:cookethflow/features/workspace/widgets/export_dialog.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:phosphor_flutter/phosphor_flutter.dart'; +import 'package:cookethflow/core/utils/enums.dart' as en; class ExportProjectButton extends StatelessWidget { final SupabaseService su; final WorkspaceProvider wp; // MODIFIED: Added WorkspaceProvider const ExportProjectButton({ - super.key, - required this.su, + super.key, + required this.su, required this.wp, // MODIFIED: Added to constructor }); @@ -25,7 +26,7 @@ class ExportProjectButton extends StatelessWidget { return ElevatedButton( onPressed: () { showDialog( - context: context, + context: context, // MODIFIED: Pass both providers to the dialog builder: (context) => ExportDialog(su: su, wp: wp), ); @@ -45,7 +46,7 @@ class ExportProjectButton extends StatelessWidget { 'Export Flowchart', style: TextStyle( fontFamily: 'Fredrik', - fontSize: device == rh.DeviceType.desktop ? 18.sp : 25.sp, + fontSize: device == en.DeviceType.desktop ? 18.sp : 25.sp, color: Colors.white, fontWeight: FontWeight.w500, ), @@ -54,10 +55,10 @@ class ExportProjectButton extends StatelessWidget { Icon( PhosphorIconsRegular.export, color: Colors.white, - size: device == rh.DeviceType.desktop ? 24.sp : 40.sp, + size: device == en.DeviceType.desktop ? 24.sp : 40.sp, ), ], ), ); } -} \ No newline at end of file +} diff --git a/lib/features/workspace/widgets/node_picker.dart b/lib/features/workspace/widgets/node_picker.dart index 0f68299..00a6494 100644 --- a/lib/features/workspace/widgets/node_picker.dart +++ b/lib/features/workspace/widgets/node_picker.dart @@ -6,6 +6,7 @@ import 'dart:math' as math; import 'package:cookethflow/core/helpers/responsive_layout.helper.dart' as rh; import 'package:provider/provider.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:cookethflow/core/utils/enums.dart' as en; // The main NodePicker widget, now stateful class NodePicker extends StatefulWidget { @@ -105,9 +106,9 @@ class _NodePickerState extends State { elevation: 0, child: Container( width: - device == rh.DeviceType.desktop + device == en.DeviceType.desktop ? 340 - : device == rh.DeviceType.tab + : device == en.DeviceType.tab ? 340 : 300, padding: const EdgeInsets.all(24.0), @@ -138,14 +139,18 @@ class _NodePickerState extends State { fontSize: 24, fontWeight: FontWeight.w600, color: - widget.su.isDark ? Colors.white : const Color(0xFF111827), + widget.su.isDark + ? Colors.white + : const Color(0xFF111827), ), ), IconButton( icon: Icon( Icons.close, color: - widget.su.isDark ? Colors.white : const Color(0xFF111827), + widget.su.isDark + ? Colors.white + : const Color(0xFF111827), size: 28, ), onPressed: () { @@ -239,8 +244,12 @@ class ShapeWidget extends StatelessWidget { final SupabaseService su; final WorkspaceProvider provider; - - const ShapeWidget({super.key, required this.shapeType, required this.su, required this.provider}); + const ShapeWidget({ + super.key, + required this.shapeType, + required this.su, + required this.provider, + }); @override Widget build(BuildContext context) { @@ -251,7 +260,9 @@ class ShapeWidget extends StatelessWidget { color: Colors.transparent, borderRadius: BorderRadius.circular(8.0), ), - child: CustomPaint(painter: ShapePainter(shapeType: shapeType, su: su, provider: provider)), + child: CustomPaint( + painter: ShapePainter(shapeType: shapeType, su: su, provider: provider), + ), ); } } @@ -262,16 +273,17 @@ class ShapePainter extends CustomPainter { final SupabaseService su; final WorkspaceProvider provider; - ShapePainter({required this.shapeType, required this.su, required this.provider}); + ShapePainter({ + required this.shapeType, + required this.su, + required this.provider, + }); @override void paint(Canvas canvas, Size size) { final paint = Paint() - ..color = - su.isDark - ? Colors.white - : Colors.black + ..color = su.isDark ? Colors.white : Colors.black ..style = PaintingStyle.stroke ..strokeWidth = 1.0; @@ -356,4 +368,4 @@ class ShapePainter extends CustomPainter { bool shouldRepaint(covariant CustomPainter oldDelegate) { return false; } -} \ No newline at end of file +} diff --git a/lib/features/workspace/widgets/toolbar.dart b/lib/features/workspace/widgets/toolbar.dart index b53699b..4c8175b 100644 --- a/lib/features/workspace/widgets/toolbar.dart +++ b/lib/features/workspace/widgets/toolbar.dart @@ -10,7 +10,8 @@ import 'package:phosphor_flutter/phosphor_flutter.dart'; import 'package:cookethflow/core/theme/colors.dart'; import 'package:cookethflow/core/helpers/responsive_layout.helper.dart' as rh; import 'package:cookethflow/features/workspace/widgets/sticky_notes.dart'; -import 'package:cookethflow/features/workspace/widgets/workspace_color_picker.dart'; // Import the new picker +import 'package:cookethflow/features/workspace/widgets/workspace_color_picker.dart'; +import 'package:cookethflow/core/utils/enums.dart' as en; class ToolBar extends StatelessWidget { const ToolBar({super.key}); @@ -24,9 +25,9 @@ class ToolBar extends StatelessWidget { return Container( padding: EdgeInsets.symmetric( vertical: - device == rh.DeviceType.desktop + device == en.DeviceType.desktop ? 20.h - : device == rh.DeviceType.tab + : device == en.DeviceType.tab ? 16.h : 2.h, horizontal: 24.w, @@ -46,7 +47,7 @@ class ToolBar extends StatelessWidget { ), ), child: - device == rh.DeviceType.mobile + device == en.DeviceType.mobile ? FittedBox( fit: BoxFit.scaleDown, child: Row( @@ -77,7 +78,12 @@ class ToolBar extends StatelessWidget { 'Add new node', device, onPressed: () { - _showNodePicker(context, device, suprovider, provider); + _showNodePicker( + context, + device, + suprovider, + provider, + ); }, backgroundColor: suprovider.isDark @@ -204,7 +210,12 @@ class ToolBar extends StatelessWidget { 'Add new node', device, onPressed: () { - _showNodePicker(context, device, suprovider, provider); + _showNodePicker( + context, + device, + suprovider, + provider, + ); }, backgroundColor: suprovider.isDark @@ -309,7 +320,7 @@ class ToolBar extends StatelessWidget { Widget _toolIcon( IconData iconData, String tooltip, - rh.DeviceType device, { + en.DeviceType device, { Color iconColor = Colors.black87, Color backgroundColor = Colors.white, required VoidCallback onPressed, @@ -327,9 +338,9 @@ class ToolBar extends StatelessWidget { icon: Icon( iconData, size: - device == rh.DeviceType.desktop + device == en.DeviceType.desktop ? 36.sp - : device == rh.DeviceType.tab + : device == en.DeviceType.tab ? 60.sp : 100.sp, ), @@ -340,9 +351,9 @@ class ToolBar extends StatelessWidget { ); } - Widget _horizontalDivider(rh.DeviceType device) { + Widget _horizontalDivider(en.DeviceType device) { return Container( - width: device == rh.DeviceType.desktop ? 28.w : 45.w, + width: device == en.DeviceType.desktop ? 28.w : 45.w, height: 2.h, color: const Color(0xFFD9D9D9), margin: EdgeInsets.symmetric(vertical: 8.h), @@ -351,7 +362,7 @@ class ToolBar extends StatelessWidget { void _showNodePicker( BuildContext context, - rh.DeviceType device, + en.DeviceType device, SupabaseService su, WorkspaceProvider wp, ) { @@ -360,9 +371,9 @@ class ToolBar extends StatelessWidget { final position = renderBox.localToGlobal(Offset.zero); final nodePickerWidth = - device == rh.DeviceType.desktop + device == en.DeviceType.desktop ? 340 - : device == rh.DeviceType.tab + : device == en.DeviceType.tab ? 340 : 300; // The width of the NodePicker widget final padding = 20.w; // Padding between the toolbar and the picker @@ -373,7 +384,7 @@ class ToolBar extends StatelessWidget { builder: (context) { double topPos; double leftPos; - if (device == rh.DeviceType.mobile) { + if (device == en.DeviceType.mobile) { topPos = position.dy - 500.h; leftPos = position.dx; } else { @@ -382,9 +393,7 @@ class ToolBar extends StatelessWidget { } return Stack( children: [ - Positioned.fill( - child: Container(color: Colors.transparent), - ), + Positioned.fill(child: Container(color: Colors.transparent)), Positioned( top: topPos, left: leftPos, @@ -402,7 +411,7 @@ class ToolBar extends StatelessWidget { void _showColorPicker( BuildContext context, WorkspaceProvider provider, - rh.DeviceType device, + en.DeviceType device, SupabaseService su, ) { final RenderBox? renderBox = context.findRenderObject() as RenderBox?; @@ -417,7 +426,7 @@ class ToolBar extends StatelessWidget { builder: (context) { double topPos; double leftPos; - if (device == rh.DeviceType.mobile) { + if (device == en.DeviceType.mobile) { topPos = position.dy - 390.h; leftPos = position.dx; } else { @@ -455,7 +464,7 @@ class ToolBar extends StatelessWidget { void _showStickyNote( BuildContext context, - rh.DeviceType device, + en.DeviceType device, SupabaseService su, ) { final RenderBox? renderBox = context.findRenderObject() as RenderBox?; @@ -474,11 +483,11 @@ class ToolBar extends StatelessWidget { ), ), Positioned( - right: device == rh.DeviceType.mobile ? position.dx : 150.w, + right: device == en.DeviceType.mobile ? position.dx : 150.w, top: - device == rh.DeviceType.desktop + device == en.DeviceType.desktop ? 500.h - : device == rh.DeviceType.tab + : device == en.DeviceType.tab ? 500.h : position.dy - 390.h, child: Material( @@ -491,4 +500,4 @@ class ToolBar extends StatelessWidget { ); } } -} \ No newline at end of file +} diff --git a/lib/features/workspace/widgets/undo_redo_button.dart b/lib/features/workspace/widgets/undo_redo_button.dart index c3ede53..3b4a3a5 100644 --- a/lib/features/workspace/widgets/undo_redo_button.dart +++ b/lib/features/workspace/widgets/undo_redo_button.dart @@ -4,19 +4,20 @@ import 'package:cookethflow/features/workspace/widgets/vertical_divider.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:phosphor_flutter/phosphor_flutter.dart'; +import 'package:cookethflow/core/utils/enums.dart' as en; class UndoRedoButton extends StatelessWidget { final SupabaseService su; - const UndoRedoButton({super.key,required this.su}); + const UndoRedoButton({super.key, required this.su}); @override Widget build(BuildContext context) { bool isDesktop = rh.ResponsiveLayoutHelper.getDeviceType(context) == - rh.DeviceType.desktop; + en.DeviceType.desktop; bool isTab = - rh.ResponsiveLayoutHelper.getDeviceType(context) == rh.DeviceType.tab; + rh.ResponsiveLayoutHelper.getDeviceType(context) == en.DeviceType.tab; return Container( padding: EdgeInsets.symmetric( @@ -34,9 +35,15 @@ class UndoRedoButton extends StatelessWidget { : 8.h, ), decoration: BoxDecoration( - color: su.isDark ? Color.fromRGBO(48, 48, 48, 1): Colors.white, + color: su.isDark ? Color.fromRGBO(48, 48, 48, 1) : Colors.white, borderRadius: BorderRadius.circular(12.r), - border: Border.all(color:su.isDark ?Color.fromRGBO(75, 75, 75, 1): const Color(0xFFD9D9D9), width: 1.2), + border: Border.all( + color: + su.isDark + ? Color.fromRGBO(75, 75, 75, 1) + : const Color(0xFFD9D9D9), + width: 1.2, + ), ), child: SizedBox( height: diff --git a/lib/features/workspace/widgets/vertical_divider.dart b/lib/features/workspace/widgets/vertical_divider.dart index 84d1847..0613366 100644 --- a/lib/features/workspace/widgets/vertical_divider.dart +++ b/lib/features/workspace/widgets/vertical_divider.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:cookethflow/core/helpers/responsive_layout.helper.dart' as rh; import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:cookethflow/core/utils/enums.dart' as en; class VerticalCustomDivider extends StatelessWidget { const VerticalCustomDivider({super.key}); @@ -9,9 +10,9 @@ class VerticalCustomDivider extends StatelessWidget { Widget build(BuildContext context) { bool isDesktop = rh.ResponsiveLayoutHelper.getDeviceType(context) == - rh.DeviceType.desktop; + en.DeviceType.desktop; bool isTab = - rh.ResponsiveLayoutHelper.getDeviceType(context) == rh.DeviceType.tab; + rh.ResponsiveLayoutHelper.getDeviceType(context) == en.DeviceType.tab; return Container( height: 24.h, width: diff --git a/lib/features/workspace/widgets/workspace_color_picker.dart b/lib/features/workspace/widgets/workspace_color_picker.dart index 5df8f9d..df523a1 100644 --- a/lib/features/workspace/widgets/workspace_color_picker.dart +++ b/lib/features/workspace/widgets/workspace_color_picker.dart @@ -3,6 +3,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:phosphor_flutter/phosphor_flutter.dart'; import 'package:cookethflow/core/helpers/responsive_layout.helper.dart' as rh; +import 'package:cookethflow/core/utils/enums.dart' as en; class WorkspaceColorPicker extends StatefulWidget { final SupabaseService su; @@ -10,11 +11,11 @@ class WorkspaceColorPicker extends StatefulWidget { final Function(Color) onColorChanged; const WorkspaceColorPicker({ - Key? key, + super.key, required this.initialColor, required this.onColorChanged, required this.su, - }) : super(key: key); + }); @override _WorkspaceColorPickerState createState() => _WorkspaceColorPickerState(); @@ -64,9 +65,9 @@ class _WorkspaceColorPickerState extends State { final device = rh.ResponsiveLayoutHelper.getDeviceType(context); return Container( width: - device == rh.DeviceType.desktop + device == en.DeviceType.desktop ? 350.w - : device == rh.DeviceType.tab + : device == en.DeviceType.tab ? 350.w : 1000.w, padding: EdgeInsets.all(20.r), @@ -96,9 +97,9 @@ class _WorkspaceColorPickerState extends State { 'Background Colour', style: TextStyle( fontSize: - device == rh.DeviceType.desktop + device == en.DeviceType.desktop ? 20.sp - : device == rh.DeviceType.tab + : device == en.DeviceType.tab ? 20.sp : 50.sp, fontWeight: FontWeight.w600, @@ -109,9 +110,9 @@ class _WorkspaceColorPickerState extends State { icon: Icon( PhosphorIconsRegular.x, size: - device == rh.DeviceType.desktop + device == en.DeviceType.desktop ? 24.sp - : device == rh.DeviceType.tab + : device == en.DeviceType.tab ? 24.sp : 55.sp, ), @@ -226,9 +227,9 @@ class _WorkspaceColorPickerState extends State { color: Colors.grey.shade800, fontWeight: FontWeight.w500, fontSize: - device == rh.DeviceType.desktop + device == en.DeviceType.desktop ? 16.sp - : device == rh.DeviceType.tab + : device == en.DeviceType.tab ? 16.sp : 40.sp, fontFamily: 'monospace', diff --git a/lib/features/workspace/widgets/workspace_drawer.dart b/lib/features/workspace/widgets/workspace_drawer.dart index b672eec..ca2fe3b 100644 --- a/lib/features/workspace/widgets/workspace_drawer.dart +++ b/lib/features/workspace/widgets/workspace_drawer.dart @@ -8,6 +8,7 @@ import 'package:go_router/go_router.dart'; import 'package:phosphor_flutter/phosphor_flutter.dart'; import 'package:cookethflow/core/helpers/responsive_layout.helper.dart' as rh; import 'package:provider/provider.dart'; +import 'package:cookethflow/core/utils/enums.dart' as en; class WorkspaceDrawer extends StatelessWidget { const WorkspaceDrawer({super.key}); @@ -39,13 +40,13 @@ class WorkspaceDrawer extends StatelessWidget { height: provider.isDrawerOpen ? 1.sh - : device == rh.DeviceType.desktop + : device == en.DeviceType.desktop ? 0.09.sh : 0.08.sh, - width: device == rh.DeviceType.desktop ? 0.195.sw : 0.27.sw, + width: device == en.DeviceType.desktop ? 0.195.sw : 0.27.sw, padding: EdgeInsets.symmetric( - horizontal: device == rh.DeviceType.desktop ? 24.w : 15.w, - vertical: device == rh.DeviceType.desktop ? 16.h : 10.h, + horizontal: device == en.DeviceType.desktop ? 24.w : 15.w, + vertical: device == en.DeviceType.desktop ? 16.h : 10.h, ), decoration: BoxDecoration( color: @@ -71,7 +72,7 @@ class WorkspaceDrawer extends StatelessWidget { }, icon: Icon( PhosphorIconsRegular.arrowLeft, - size: device == rh.DeviceType.desktop ? 32.sp : 50.sp, + size: device == en.DeviceType.desktop ? 32.sp : 50.sp, color: suprovider.isDark ? Colors.white : Colors.black, ), splashRadius: 24.r, @@ -84,7 +85,7 @@ class WorkspaceDrawer extends StatelessWidget { style: TextStyle( fontFamily: 'Fredrik', fontSize: - device == rh.DeviceType.desktop ? 24.sp : 42.sp, + device == en.DeviceType.desktop ? 24.sp : 42.sp, fontWeight: FontWeight.w600, color: suprovider.isDark ? Colors.white : Colors.black, @@ -100,7 +101,7 @@ class WorkspaceDrawer extends StatelessWidget { ), ), SizedBox( - width: device == rh.DeviceType.desktop ? 50.w : 20.w, + width: device == en.DeviceType.desktop ? 50.w : 20.w, ), IconButton( onPressed: () { @@ -111,7 +112,7 @@ class WorkspaceDrawer extends StatelessWidget { ? Icon( PhosphorIconsRegular.sidebarSimple, size: - device == rh.DeviceType.desktop + device == en.DeviceType.desktop ? 32.sp : 50.sp, color: @@ -122,7 +123,7 @@ class WorkspaceDrawer extends StatelessWidget { : Icon( Icons.close, size: - device == rh.DeviceType.desktop + device == en.DeviceType.desktop ? 32.sp : 50.sp, color: @@ -149,7 +150,7 @@ class WorkspaceDrawer extends StatelessWidget { ? Column( mainAxisSize: MainAxisSize.max, children: [ - device == rh.DeviceType.desktop + device == en.DeviceType.desktop ? SizedBox(height: 20.h) : SizedBox(height: 10.h), const Divider( @@ -164,7 +165,7 @@ class WorkspaceDrawer extends StatelessWidget { provider.canvasObjectsList.length, separatorBuilder: (context, index) => - device == rh.DeviceType.desktop + device == en.DeviceType.desktop ? SizedBox(height: 8.h) : SizedBox(height: 2.h), itemBuilder: (context, index) { @@ -217,7 +218,7 @@ class WorkspaceDrawer extends StatelessWidget { required int index, required bool isSelected, required VoidCallback onTap, - required rh.DeviceType device, + required en.DeviceType device, required SupabaseService su, }) { Color iconTextColor = @@ -232,14 +233,14 @@ class WorkspaceDrawer extends StatelessWidget { child: ListTile( leading: Icon( iconData, - size: device == rh.DeviceType.desktop ? 24.sp : 35.sp, + size: device == en.DeviceType.desktop ? 24.sp : 35.sp, color: iconTextColor, ), title: Text( title, style: TextStyle( fontFamily: 'Fredrik', - fontSize: device == rh.DeviceType.desktop ? 18.sp : 28.sp, + fontSize: device == en.DeviceType.desktop ? 18.sp : 28.sp, color: iconTextColor, ), ), diff --git a/lib/features/workspace/widgets/zoom_control_button.dart b/lib/features/workspace/widgets/zoom_control_button.dart index 660a652..a692867 100644 --- a/lib/features/workspace/widgets/zoom_control_button.dart +++ b/lib/features/workspace/widgets/zoom_control_button.dart @@ -6,6 +6,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:phosphor_flutter/phosphor_flutter.dart'; import 'package:provider/provider.dart'; import 'package:cookethflow/core/helpers/responsive_layout.helper.dart' as rh; +import 'package:cookethflow/core/utils/enums.dart' as en; class ZoomControlButton extends StatelessWidget { const ZoomControlButton({super.key}); @@ -40,18 +41,18 @@ class ZoomControlButton extends StatelessWidget { // color: suprovider.isDark ? Colors.white : Colors.black, // fontWeight: FontWeight.w500, // fontSize: - // device == rh.DeviceType.desktop + // device == en.DeviceType.desktop // ? 24.sp - // : device == rh.DeviceType.tab + // : device == en.DeviceType.tab // ? 24.sp // : 40.sp, // ), // ), // SizedBox( // width: - // device == rh.DeviceType.desktop + // device == en.DeviceType.desktop // ? 8.w - // : device == rh.DeviceType.tab + // : device == en.DeviceType.tab // ? 8.w // : 12.w, // ), @@ -65,9 +66,9 @@ class ZoomControlButton extends StatelessWidget { icon: Icon( PhosphorIconsRegular.plus, size: - device == rh.DeviceType.desktop + device == en.DeviceType.desktop ? 24.sp - : device == rh.DeviceType.tab + : device == en.DeviceType.tab ? 24.sp : 40.sp, ), @@ -84,9 +85,9 @@ class ZoomControlButton extends StatelessWidget { icon: Icon( PhosphorIconsRegular.minus, size: - device == rh.DeviceType.desktop + device == en.DeviceType.desktop ? 24.sp - : device == rh.DeviceType.tab + : device == en.DeviceType.tab ? 24.sp : 40.sp, ), @@ -102,9 +103,9 @@ class ZoomControlButton extends StatelessWidget { icon: Icon( PhosphorIconsRegular.resize, size: - device == rh.DeviceType.desktop + device == en.DeviceType.desktop ? 24.sp - : device == rh.DeviceType.tab + : device == en.DeviceType.tab ? 24.sp : 60.sp, ), // Icon for reset