Files
prosappweb/lib/main.dart
T
Lizandro GuarnizoandClaude Sonnet 4.6 60216fd0e3 feat: migrate Firebase → NestJS REST API backend
Replace all Firebase SDK (Auth, Firestore, Storage) with HTTP calls
to backend.prosapp.co/api/v1:

- New ApiService singleton (JWT token, GET/POST/PATCH/DELETE/upload)
- auth_provider: Firebase Auth → /auth/login, /auth/register, /auth/phone/*
- services_provider + calendar_services_provider → /services endpoints
- professional_provider + professionals_provider → /professional-info, /users/professionals
- profile_form_provider + professional_form_provider → /users/me, /storage/upload
- cities/professions/settings providers → /cities, /professions, /settings
- firebase_chat_repository → polling via /chats endpoints (3s interval)
- firebase_score_repository → polling via /comments endpoints (10s interval)
- professional_detail_provider → /users/:id + /professional-info/:id
- dashboard_view: Firestore.add → POST /services
- chat_view + rating_view: FirebaseAuth.uid → AuthProvider.user.id
- Models: Timestamp → String for createdAt fields
- google_fonts upgraded to ^8.1.0 (Dart 3.12 compat)
- Remove firebase_core, firebase_auth, cloud_firestore, firebase_storage from pubspec

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-18 15:53:39 -05:00

103 lines
4.1 KiB
Dart

import 'package:flutter_dotenv/flutter_dotenv.dart';
import 'package:flutter/material.dart';
import 'package:intl/date_symbol_data_local.dart';
import 'package:prosapp_web_app/providers/auth_provider.dart';
import 'package:prosapp_web_app/providers/calendar_services_provider.dart';
import 'package:prosapp_web_app/providers/chat_provider.dart';
import 'package:prosapp_web_app/providers/cities_provider.dart';
import 'package:prosapp_web_app/providers/professional_detail_provider.dart';
import 'package:prosapp_web_app/providers/professional_form_provider.dart';
import 'package:prosapp_web_app/providers/professional_provider.dart';
import 'package:prosapp_web_app/providers/professionals_provider.dart';
import 'package:prosapp_web_app/providers/professions_provider.dart';
import 'package:prosapp_web_app/providers/profile_form_provider.dart';
import 'package:prosapp_web_app/providers/score_provider.dart';
import 'package:prosapp_web_app/providers/services_provider.dart';
import 'package:prosapp_web_app/providers/settings_provider.dart';
import 'package:prosapp_web_app/providers/sidemenu_provider.dart';
import 'package:prosapp_web_app/router/router.dart';
import 'package:prosapp_web_app/services/local_storage.dart';
import 'package:prosapp_web_app/services/navigation_service.dart';
import 'package:prosapp_web_app/services/notifications_service.dart';
import 'package:prosapp_web_app/ui/layouts/auth/auth_layout.dart';
import 'package:prosapp_web_app/ui/layouts/dashboard/dashboard_layout.dart';
import 'package:prosapp_web_app/ui/layouts/splash/splash_layout.dart';
import 'package:provider/provider.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await dotenv.load(fileName: ".env");
await LocalStorage.configurePrefs();
await initializeDateFormatting('es_ES', null);
Flurorouter.configureRoutes();
runApp(const AppState());
}
class AppState extends StatelessWidget {
const AppState({super.key});
@override
Widget build(BuildContext context) {
return MultiProvider(
providers: [
ChangeNotifierProvider(lazy: false, create: (_) => AuthProvider()),
ChangeNotifierProvider(lazy: false, create: (_) => SideMenuProvider()),
ChangeNotifierProvider(lazy: false, create: (_) => ProfessionalProvider()),
ChangeNotifierProvider(create: (_) => SettingsProvider()),
ChangeNotifierProvider(create: (_) => ProfileFormProvider()),
ChangeNotifierProvider(create: (_) => ProfessionalFormProvider()),
ChangeNotifierProvider(create: (_) => ProfessionalsProvider()),
ChangeNotifierProvider(create: (_) => ServicesProvider()),
ChangeNotifierProvider(create: (_) => CalendarServicesProvider()),
ChangeNotifierProvider(create: (_) => CitiesProvider()),
ChangeNotifierProvider(create: (_) => ProfessionsProvider()),
ChangeNotifierProvider(create: (_) => ProfessionalDetailProvider()),
ChangeNotifierProvider(create: (_) => ScoreProvider()),
ChangeNotifierProvider(create: (_) => ChatProvider()),
],
child: const MyApp(),
);
}
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'ProsApp',
initialRoute: '/',
onGenerateRoute: Flurorouter.router.generator,
navigatorKey: NavigationService.navigatorKey,
scaffoldMessengerKey: NotificationsService.messengerKey,
builder: (_, child) {
final authProvider = Provider.of<AuthProvider>(context);
if (authProvider.authStatus == AuthStatus.checking) {
return const SplashLayout();
}
if (authProvider.authStatus == AuthStatus.authenticated) {
return DashboardLayout(child: child!);
} else {
return AuthLayout(child: child!);
}
},
theme: ThemeData.light().copyWith(
scrollbarTheme: const ScrollbarThemeData().copyWith(
thumbColor: WidgetStateProperty.all(
Colors.grey.withOpacity(0.5),
),
),
),
);
}
}