CLAUDE
SmartCrew Mobile - CLAUDE
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Project Overview
Smart Crew Mobile is a Flutter application for workforce management and time tracking. The app uses Firebase for backend services (Auth, Firestore, Functions, Crashlytics, Messaging), follows clean architecture principles, and uses Provider for state management.
Package name: clean_provider_architecture
Current version: 2025.0.28+2025.0.28
SDK: Flutter 3.2.0+
Development Commands
Essential Commands
flutter pub get— Install dependenciesflutter run -d <device>— Run app (e.g.,-d ios,-d chrome)flutter analyze— Run static analysis (MUST pass before pushing)flutter test— Run all testsflutter test test/provider/services/<file>_test.dart— Run specific test filedart format .— Format code (equivalent:flutter format .)flutter pub run build_runner build— Generate code (assets, colors, fonts from flutter_gen)
Build Commands
flutter build apk --release— Build Android release APKflutter build ios --release— Build iOS releaseflutter clean— Clean build artifacts
Firebase Commands
flutterfire configure— Update Firebase configuration (regenerateslib/firebase_options.dart)- Set
.envvariables for Firebase emulator configuration:EMULATOR_ACTIVE=true/falseEMULATOR_HOST=<ip>AUTH_PORT=<port>
Architecture & Code Organization
High-Level Architecture Pattern
This project follows a layered clean architecture with clear separation of concerns:
Presentation Layer (UI)
↓
State Management Layer (Providers)
↓
Business Logic Layer (Services)
↓
Data Layer (Repositories)
↓
External Services (Firebase, APIs)Key Architectural Components
1. Providers (lib/providers/)
- Purpose: State management using Provider package (ChangeNotifier pattern)
- Main Providers:
AuthProvider: Authentication state and user managementNetworkDataProvider: Singleton that aggregates multiple data providers via mixinsLocationProvider: Location tracking and geofencingHomeProvider: Home screen stateNotificationsProvider: Push notification handling
NetworkDataProvider Pattern: Uses mixins to compose multiple data providers (WorkLogsProvider, CompanyProvider, ReportProvider, etc.). This provider is initialized after auth and loads all workspace data in parallel using Future.wait().
2. Services (lib/services/)
- Purpose: Business logic and domain operations
- Pattern: Most services extend
BaseServicefor standardized logging - Key Service Categories:
logs/: Work log operations (clock in/out, breaks, calculations)work_logs_state_manager.dart: UI state management for work logs (ChangeNotifier)work_logs_data_service.dart: Data operations for work logswork_logs_cache_manager.dart: Local caching for work logswork_logs_business_service.dart: Business logic coordination
location/: Geolocation services (background tracking, jobsite enter/exit)checkout/: Checkout questions and validationstatus/: Status calculation servicesstorage/: Local storage (Hive) for recent selections and announcements
Service Design: Services are stateless and focused on single responsibilities. Complex workflows are orchestrated by higher-level services.
3. Repositories (lib/repositories/)
- Purpose: Data access layer for Firestore operations
- Current:
WorkLogsRepository- handles all work log CRUD operations and queries - Pattern: Repositories abstract Firestore queries and provide clean API for services
4. Models (lib/models/)
- Purpose: Data models and entities
- Key Models:
AppUser,DailyLog,Activity,BreakActivity,CheckoutQuestion,Company,Project,Equipment - Subpackages:
interfaces/: Interface definitions (activity, task, selection)form_data/: Form-related data modelslocal/: Local storage models (Hive-annotated)
5. Screens (lib/screens/)
- Organization:
logged_out/: Authentication screenslogged_in/home_tabs/: Main app tabs (home, docs, reports, profile, jobsites, projects, news)logged_in/viewer_pages/: Detail/viewer screenslogged_in/onboarding/: Onboarding flowsplash_screen.dart: Initial loading screen
6. Components (lib/components/)
- Purpose: Reusable UI widgets
- Subpackages:
base/: Foundation widgets (bottom sheets, etc.)custom/: Custom widgetsmodal/: Modal dialogsselection/: Selection componentscheckout/: Checkout-specific components
7. Generated Code (lib/gen/)
- Auto-generated by
flutter_gen(DO NOT edit manually) assets.gen.dart: Type-safe asset referencescolors.gen.dart: Colors fromassets/colors/colors.xmlfonts.gen.dart: Font family constants- Regenerate:
flutter pub run build_runner build
Data Flow Example: Work Logs
- User Action (UI) → triggers method in
WorkLogsStateManager(service) - State Manager → calls business service (
WorkLogsBusinessService) - Business Service → uses data service (
WorkLogsDataService) - Data Service → calls repository (
WorkLogsRepository) - Repository → executes Firestore query
- Result → bubbles back up, state manager calls
notifyListeners() - UI → rebuilds with new state
Key Design Patterns
- Singleton Pattern:
NetworkDataProvideruses singleton to ensure single instance - Mixin Pattern:
NetworkDataProvidercomposes functionality via mixins - Repository Pattern: Data access abstracted through repositories
- Service Layer Pattern: Business logic separated from presentation
- ChangeNotifier Pattern: State management via Provider's ChangeNotifier
- Factory Pattern: Model classes often have factory constructors (e.g.,
fromJson)
Coding Standards
Strict Analysis Rules
The project enforces strict type safety and code quality via analysis_options.yaml:
- No implicit casts or dynamics:
implicit-casts: false,implicit-dynamic: false - Always specify types:
always_specify_types: error - TODO comments are errors:
todo: error - Required parameters must not be missing:
missing_required_param: error - Prefer const: Use
constconstructors and literals wherever possible - Trailing commas: Required for better formatting (
require_trailing_commas) - Single quotes: Use single quotes for strings (
prefer_single_quotes) - Relative imports: Prefer relative imports within lib (
prefer_relative_imports)
Naming Conventions
- Files:
snake_case.dart(e.g.,work_logs_state_manager.dart) - Classes/Types:
UpperCamelCase(e.g.,WorkLogsService,DailyLog) - Members/Variables:
lowerCamelCase(e.g.,userId,dailyLog) - Constants:
lowerCamelCase(e.g.,defaultTimeout) - Enums:
UpperCamelCasefor type,lowerCamelCasefor values
Logging
- Use
appLogger(singleton) for all logging:appLogger.d(),appLogger.i(),appLogger.w(),appLogger.e() - Services extending
BaseServiceget automatic logging methods:logDebug(),logInfo(),logWarning(),logError() - Initialize logger in
main.dartviaappLogger.initialize()
Firebase Integration
- Auth: Firebase Auth with phone number authentication
- Firestore: Primary data store (users, daily_logs, companies, projects, etc.)
- Functions: Cloud Functions for server-side operations (region: us-central1)
- Crashlytics: Automatic error reporting
- FCM: Push notifications via Firebase Messaging
- Emulator: Can run with local Firebase emulator (configure via
.env)
Testing
Test Structure
- Mirror
lib/structure intest/ - Test files must end with
_test.dart - Current tests focus on services and providers
- Example test paths:
test/provider/services/switch_log_service_test.darttest/provider/services/add_manual_log_service_test.dart
Running Tests
- Run all tests:
flutter test - Run single test file:
flutter test test/provider/services/<file>_test.dart - Generate coverage:
flutter test --coverage - View coverage HTML (if lcov installed):
genhtml coverage/lcov.info -o coverage/html
Common Workflows
Adding a New Feature
- Define models in
lib/models/ - Create repository for data access in
lib/repositories/ - Create services for business logic in
lib/services/ - Create provider for state management in
lib/providers/ - Build UI components in
lib/components/and screens inlib/screens/ - Add mixins to
NetworkDataProviderif needed for global data - Write tests in
test/ - Run
flutter analyzeto ensure no issues
Working with Assets
- Add assets to appropriate directory under
assets/ - Declare in
pubspec.yamlunderflutter.assets - Run
flutter pub run build_runner buildto regeneratelib/gen/assets.gen.dart - Use generated constants:
Assets.images.logo(example)
Working with Colors
- Edit
assets/colors/colors.xml - Run
flutter pub run build_runner buildto regeneratelib/gen/colors.gen.dart - Use via
AppColors.colorNameor theme extensions
Working with Work Logs
Work logs are the core domain of the app. Key concepts:
- DailyLog: Represents a day's work with activities, breaks, and metadata
- Composite ID: Daily logs use composite IDs:
{userId}_{YYYY-MM-DD} - State Management:
WorkLogsStateManagermanages UI state (loading, current log, week logs, status per day) - Business Logic: Coordinated by
WorkLogsBusinessService - Caching:
WorkLogsCacheManagerhandles local caching for offline support - Status Types:
DayLogTypeenum defines log statuses (submitted, notSubmitted, off, scheduled, no_log, weekend)
Important Notes
Firebase Configuration
- Firebase config in
lib/firebase_options.dartis auto-generated by FlutterFire CLI - Update using:
flutterfire configure - Platform-specific configs:
- Android:
android/app/google-services.json - iOS:
ios/Runner/GoogleService-Info.plist
- Android:
Code Generation
Files in lib/gen/ are auto-generated. Always regenerate after changes to:
assets/directoryassets/colors/colors.xmlpubspec.yamlfonts or assets sections
Environment Variables
.env file contains:
EMULATOR_ACTIVE: Enable/disable Firebase emulatorEMULATOR_HOST: Emulator host IPAUTH_PORT: Auth emulator port
Platform-Specific Changes
Any changes to android/ or ios/ directories should be explicitly documented in PRs as they may affect native configurations.
State Management Best Practices
- Providers should call
notifyListeners()after state changes - Use
Consumer<T>orcontext.watch<T>()to listen to provider changes - Use
context.read<T>()for one-time reads without listening - Dispose of streams and subscriptions properly in services
Git Workflow
- Main branch:
main - Feature branches:
feature/<name> - Fix branches:
fix/<name> - Commit format:
<type>: <description>(e.g.,feat: add clock out validation,fix: break calculation) - PRs require: passing
flutter analyze, clear description, linked issues