# Medication Tracker - Nokken Documentation
Documentation for the Nokken medical tracking application
Author: Charlotte Croce

Skip to content

# Medication Tracker

The medication tracker feature allows users to manage their medications, track adherence, and receive refill alerts.

## Models

- `Medication`: Core model representing a medication with properties for name, dosage, schedule, inventory, and type-specific details.
- `MedicationDose`: Represents a specific instance of a medication taken at a particular date and time slot.

      class MedicationDose {
        final String medicationId;
        final DateTime date;
        final String timeSlot;

        // Methods for generating unique keys
        String toKey() {...}
        static MedicationDose fromKey(String key) {...}
      }

- `InjectionDetails`: Extends medication information with injection-specific details like needle types, site rotation, and supplies tracking.
- `InjectionSite`: Manages individual injection locations on the body.
- `InjectionSiteRotation`: Handles the automatic rotation of injection sites.

## Providers

- `medicationStateProvider`: Manages medication CRUD operations with the database.
- `medicationTakenProvider`: Tracks which medications have been taken on specific dates.
- Various derived providers:

    // Main state providers
    final medicationStateProvider = StateNotifierProvider<MedicationNotifier, MedicationState>
    final medicationTakenProvider = StateNotifierProvider<MedicationTakenNotifier, Set<String>>

    // Derived providers
    final medicationsProvider = Provider<List<Medication>>
    final medicationsLoadingProvider = Provider<bool>
    final medicationsErrorProvider = Provider<String?>
    final medicationsByNeedRefillProvider = Provider<List<Medication>>
    final sortedMedicationsProvider = Provider<List<Medication>>
    final groupedMedicationTypeProvider = Provider<Map<String, List<Medication>>>

### State Notifiers

    class MedicationNotifier extends StateNotifier<MedicationState> {
      // Notifier methods
      Future<void> loadMedications() async {...}
      Future<void> addMedication(Medication medication) async {...}
      Future<void> updateMedication(Medication medication) async {...}
      Future<void> updateMedicationQuantity(Medication medication, bool taken) async {...}
      Future<void> deleteMedication(String id) async {...}
    }

    class MedicationTakenNotifier extends StateNotifier<Set<String>> {
      // Notifier methods
      Future<void> loadTakenMedicationsForDate(DateTime date) async {...}
      Future<void> setMedicationTaken(MedicationDose dose, bool taken, {String? customKey}) async {...}
      Future<void> clearOldData(int olderThanDays) async {...}
    }

## Screens

- `MedicationListScreen`: Displays all medications with grouping by type and refill alerts.
- `MedicationDetailScreen`: Detailed view of medication information with adherence tracking.
- `AddEditMedicationScreen`: Form for adding and editing medications with type-specific fields.
- `InjectionSiteTrackerScreen`: Interface for managing and visualizing injection site rotation.
- `InjectionSiteViewerScreen`: Visualization of the current injection site on a body diagram.

## Interactions

- Uses `DatabaseService` for persistent storage of medication data
- Uses `NotificationService` for medication reminders
- Interacts with Scheduler feature to display medications on calendar and daily views
- Uses `ValidationService` to ensure data integrity