import 'package:flutter/material.dart'; import 'package:hugeicons/hugeicons.dart'; import 'package:lottie/lottie.dart'; import 'package:provider/provider.dart'; import 'package:shimmer/shimmer.dart'; import 'package:mobo_project/base_app/features/company/widgets/company_selector_widget.dart'; import 'package:mobo_project/base_app/features/profile/pages/profile_screen.dart'; import 'package:mobo_project/base_app/features/profile/providers/profile_provider.dart'; import 'package:mobo_project/base_app/core/routing/page_transition.dart'; import 'package:mobo_project/core/utils/constants/color_constants.dart'; import 'package:mobo_project/core/widgets/custom_kanban_board.dart'; import '../../../base_app/core/const/app_colors.dart' as AppTheme; import '../model/project_model.dart'; import '../provider/project_provider.dart'; import '../widgets/project_kanban_tile.dart'; import 'project_detail_screen.dart'; import 'task_edit_screen.dart'; class ProjectListScreen extends StatefulWidget { const ProjectListScreen({super.key}); @override State<ProjectListScreen> createState() => _ProjectListScreenState(); } class _ProjectListScreenState extends State<ProjectListScreen> { bool _isKanbanView = true; final TextEditingController _searchController = TextEditingController(); @override void initState() { super.initState(); WidgetsBinding.instance.addPostFrameCallback((_) { context.read<ProjectProvider>().fetchProjects(); context.read<ProfileProvider>().fetchUserProfile(); }); } @override void dispose() { _searchController.dispose(); super.dispose(); } @override Widget build(BuildContext context) { final isDark = Theme.of(context).brightness == Brightness.dark; final projectProvider = context.watch<ProjectProvider>(); return Scaffold( appBar: AppBar( automaticallyImplyLeading: false, centerTitle: false, title: Text( 'Projects', style: TextStyle( fontWeight: FontWeight.bold, color: isDark ? Colors.white : Colors.black, fontSize: 23, ), ), actions: [ const CompanySelectorWidget(), IconButton( icon: Consumer<ProfileProvider>( builder: (context, profile, _) { if (profile.userAvatar != null) { return CircleAvatar( radius: 14, backgroundImage: MemoryImage(profile.userAvatar!), ); } return const HugeIcon( icon: HugeIcons.strokeRoundedUserCircle, color: ColorConstants.mainBlack, size: 24, ); }, ), onPressed: () { Navigator.push( context, dynamicRoute(context, const ProfileScreen()), ); }, ), const SizedBox(width: 8), ], ), floatingActionButton: FloatingActionButton( onPressed: () async { final result = await Navigator.push( context, MaterialPageRoute(builder: (context) => TaskEditScreen()), ); if (result == true) { if (context.mounted) { context.read<ProjectProvider>().fetchProjects(forceRefresh: true); } } }, backgroundColor: ColorConstants.primaryRed, child: const Icon(Icons.add_task, color: Colors.white), ), body: Stack( children: [ RefreshIndicator( onRefresh: () => context.read<ProjectProvider>().fetchProjects( forceRefresh: true, ), color: ColorConstants.primaryRed, child: Padding( padding: const EdgeInsets.all(16.0), child: Column( children: [ _buildHeader(isDark, projectProvider), SizedBox(height: 10), Expanded( child: _isKanbanView ? _buildKanbanView(projectProvider, isDark) : _buildBody(projectProvider, isDark), ), ], ), ), ), ], ), ); } List<ProjectModel> _getFilteredProjects(List<ProjectModel> projects) { final query = _searchController.text.toLowerCase(); if (query.isEmpty) return projects; return projects.where((project) { return project.displayName.toLowerCase().contains(query) || (project.partnerName?.toLowerCase().contains(query) ?? false); }).toList(); } String _getPageRange(int page, int perPage, int total) { int start = page * perPage + 1; int end = (page + 1) * perPage; if (end > total) { end = total; } if (total == 0) { return "0-0"; } return "$start-$end"; } Widget _buildHeader(bool i
Show More