Add pricing entry flow and platform admin foundations
This commit is contained in:
@@ -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)),
|
||||
|
||||
Reference in New Issue
Block a user