main function

void main()

Punto de entrada de la aplicación Klinico.

Configura el árbol de inyección de dependencias mediante MultiProvider: repositorios, servicios y ViewModels necesarios para toda la app. El ApiClient incluye un interceptor 401 que redirige al login cuando el token JWT caduca durante una sesión activa.

Implementation

void main() {
  runApp(
    MultiProvider(
      providers: [
        Provider(create: (_) => const FlutterSecureStorage()),
        Provider(
          create: (context) => ApiClient(
            getToken: () =>
                context.read<FlutterSecureStorage>().read(key: 'token'),
            // Callback (interceptor) que se invoca cuando la API devuelve 401 durante una sesión activa (token caducado en mitad del uso).
            onUnauthorized: () {
              // Capa 2: el token caducó durante la sesión → limpiar y redirigir
              final context = navigatorKey.currentContext;
              if (context != null) {
                context.read<LoginViewModel>().signOut();
              }
              navigatorKey.currentState?.pushAndRemoveUntil(
                MaterialPageRoute(builder: (_) => const LoginPage()),
                (route) => false,
              );
            },
          ),
        ),
        Provider(
          create: (context) => AuthRepository(context.read<ApiClient>()),
        ),
        Provider(
          create: (context) => AdmissionRepository(context.read<ApiClient>()),
        ),
        Provider(
          create: (context) => EpisodeRepository(context.read<ApiClient>()),
        ),
        Provider(
          create: (context) => PatientRepository(context.read<ApiClient>()),
        ),
        Provider(
          create: (context) => ServiceRepository(context.read<ApiClient>()),
        ),
        Provider(
          create: (context) => UserRepository(context.read<ApiClient>()),
        ),
        Provider(
          create: (context) => KpisRepository(context.read<ApiClient>()),
        ),

        Provider(
          create: (context) => AuthService(
            authRepository: context.read<AuthRepository>(),
            storage: context.read<FlutterSecureStorage>(),
          ),
        ),
        ChangeNotifierProvider(
          create: (context) =>
              LoginViewModel(authService: context.read<AuthService>()),
        ),
        ChangeNotifierProvider(
          create: (context) => AdmissionViewModel(
            repository: context.read<AdmissionRepository>(),
          ),
        ),
        ChangeNotifierProvider(
          create: (context) =>
              EpisodeViewModel(repository: context.read<EpisodeRepository>()),
        ),
        ChangeNotifierProvider(
          create: (context) =>
              WorkloadViewmodel(repository: context.read<UserRepository>()),
        ),
        ChangeNotifierProvider(
          create: (context) =>
              KpisViewModel(repository: context.read<KpisRepository>()),
        ),
      ],
      child: const MyApp(),
    ),
  );
}