Initial commit: DLS - Dental Lab System

- Flutter + PocketBase dental lab management system
- Clinic & lab dashboards, job tracking, patient management
- Product catalog, finance tracking, multi-language support
- AI assistant integration, realtime notifications
- Windows installer (Inno Setup) included
- Developed by kovakyazilim.com
This commit is contained in:
Emre Emir
2026-06-11 15:57:31 +03:00
commit 8bbc9dbff2
226 changed files with 31308 additions and 0 deletions
+52
View File
@@ -0,0 +1,52 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart';
import '../providers/auth_provider.dart';
import 'app_router.dart';
// Bridges Riverpod auth state changes to GoRouter's Listenable interface
class _AuthRouterNotifier extends ChangeNotifier {
_AuthRouterNotifier(this._ref) {
_ref.listen<AuthState>(authProvider, (_, __) => notifyListeners());
}
final Ref _ref;
}
final routerProvider = Provider<GoRouter>((ref) {
final notifier = _AuthRouterNotifier(ref);
return GoRouter(
refreshListenable: notifier,
initialLocation: routeSignIn,
redirect: (context, state) {
final auth = ref.read(authProvider);
if (auth.isLoading) return null;
final loc = state.matchedLocation;
final onLoginOrRegister = loc == routeSignIn || loc == routeSignUp;
final onAuthPage = onLoginOrRegister || loc == routeOnboarding;
if (!auth.isAuthenticated) {
return onAuthPage ? null : routeSignIn;
}
// Authenticated but no tenant → onboarding
if (auth.activeTenant == null) {
return loc == routeOnboarding ? null : routeOnboarding;
}
final isLab = auth.activeTenant!.tenant.isLab;
if (onAuthPage) {
return isLab ? routeLabDashboard : routeClinicDashboard;
}
if (isLab && loc.startsWith('/clinic')) return routeLabDashboard;
if (!isLab && loc.startsWith('/lab')) return routeClinicDashboard;
return null;
},
routes: buildRoutes(),
);
});