Add pricing entry flow and platform admin foundations

This commit is contained in:
egecankomur
2026-06-20 18:24:40 +03:00
parent 1d36ccdf30
commit ac42681f7e
44 changed files with 6567 additions and 1419 deletions
+33 -10
View File
@@ -3,8 +3,10 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:pocketbase/pocketbase.dart';
import '../auth/auth_repository.dart';
import '../services/notification_service.dart';
import '../../models/platform_admin.dart';
import '../../models/tenant.dart';
import '../../models/user_profile.dart';
import '../../features/shared/tenant_location_data.dart';
import 'locale_provider.dart';
class AuthState {
@@ -12,6 +14,7 @@ class AuthState {
this.profile,
this.activeTenant,
this.memberships = const [],
this.platformMemberships = const [],
this.isLoading = true,
this.error,
});
@@ -19,15 +22,24 @@ class AuthState {
final UserProfile? profile;
final TenantMembership? activeTenant;
final List<TenantMembership> memberships;
final List<PlatformMembership> platformMemberships;
final bool isLoading;
final String? error;
bool get isAuthenticated => profile != null;
bool get isSuperAdmin => platformMemberships.any((m) => m.isSuperAdmin);
PlatformMembership? get primaryPlatformMembership {
for (final membership in platformMemberships) {
if (membership.isActive) return membership;
}
return null;
}
AuthState copyWith({
UserProfile? profile,
TenantMembership? activeTenant,
List<TenantMembership>? memberships,
List<PlatformMembership>? platformMemberships,
bool? isLoading,
String? error,
bool clearError = false,
@@ -36,6 +48,7 @@ class AuthState {
profile: profile ?? this.profile,
activeTenant: activeTenant ?? this.activeTenant,
memberships: memberships ?? this.memberships,
platformMemberships: platformMemberships ?? this.platformMemberships,
isLoading: isLoading ?? this.isLoading,
error: clearError ? null : (error ?? this.error),
);
@@ -60,11 +73,12 @@ class AuthNotifier extends StateNotifier<AuthState> {
state = AuthState(
profile: result.user,
memberships: result.tenants,
activeTenant:
result.tenants.isEmpty ? null : result.tenants.first,
platformMemberships: result.platformMemberships,
activeTenant: result.tenants.isEmpty ? null : result.tenants.first,
isLoading: false,
);
final isLab = result.tenants.isNotEmpty && result.tenants.first.tenant.isLab;
final isLab =
result.tenants.isNotEmpty && result.tenants.first.tenant.isLab;
NotificationService.loginUser(result.user.id, isLab: isLab);
_applyLocale(result.user.preferredLanguage);
} catch (_) {
@@ -93,11 +107,12 @@ class AuthNotifier extends StateNotifier<AuthState> {
state = AuthState(
profile: result.user,
memberships: result.tenants,
activeTenant:
result.tenants.isEmpty ? null : result.tenants.first,
platformMemberships: result.platformMemberships,
activeTenant: result.tenants.isEmpty ? null : result.tenants.first,
isLoading: false,
);
final isLab = result.tenants.isNotEmpty && result.tenants.first.tenant.isLab;
final isLab =
result.tenants.isNotEmpty && result.tenants.first.tenant.isLab;
NotificationService.loginUser(result.user.id, isLab: isLab);
_applyLocale(result.user.preferredLanguage);
} catch (e) {
@@ -122,8 +137,8 @@ class AuthNotifier extends StateNotifier<AuthState> {
state = AuthState(
profile: result.user,
memberships: result.tenants,
activeTenant:
result.tenants.isEmpty ? null : result.tenants.first,
platformMemberships: result.platformMemberships,
activeTenant: result.tenants.isEmpty ? null : result.tenants.first,
isLoading: false,
);
} catch (e) {
@@ -157,6 +172,7 @@ class AuthNotifier extends StateNotifier<AuthState> {
state = state.copyWith(
profile: result.user,
memberships: result.tenants,
platformMemberships: result.platformMemberships,
activeTenant: newActive,
);
} catch (_) {}
@@ -172,11 +188,19 @@ class AuthNotifier extends StateNotifier<AuthState> {
required String tenantId,
required String companyName,
String? defaultCurrency,
TenantLocationData? location,
List<String>? workflowOverrides,
}) async {
await _repo.updateTenant(
tenantId,
companyName: companyName,
defaultCurrency: defaultCurrency,
companyAddress: location?.address,
city: location?.city,
district: location?.district,
latitude: location?.latitude,
longitude: location?.longitude,
workflowOverrides: workflowOverrides,
);
await refresh();
}
@@ -194,8 +218,7 @@ class AuthNotifier extends StateNotifier<AuthState> {
}
}
final authProvider =
StateNotifierProvider<AuthNotifier, AuthState>((ref) {
final authProvider = StateNotifierProvider<AuthNotifier, AuthState>((ref) {
return AuthNotifier(
onLocaleLoaded: (code) =>
ref.read(localeProvider.notifier).setLocale(Locale(code)),