176 lines
5.0 KiB
Dart
176 lines
5.0 KiB
Dart
/// Selected Role State Provider
|
|
///
|
|
/// Manages the selected user role during registration.
|
|
/// Simple state provider for role selection in the registration form.
|
|
///
|
|
/// Uses Riverpod 3.0 with code generation for type-safe state management.
|
|
library;
|
|
|
|
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
|
import 'package:worker/features/auth/domain/entities/user.dart';
|
|
|
|
part 'selected_role_provider.g.dart';
|
|
|
|
/// Selected Role Provider
|
|
///
|
|
/// Manages the currently selected user role in the registration form.
|
|
/// Provides methods to select and clear role selection.
|
|
///
|
|
/// This provider is used to:
|
|
/// - Track which role the user has selected
|
|
/// - Conditionally show/hide verification fields based on role
|
|
/// - Validate required documents for dealer/worker roles
|
|
///
|
|
/// Usage in widgets:
|
|
/// ```dart
|
|
/// // Watch the selected role
|
|
/// final selectedRole = ref.watch(selectedRoleProvider);
|
|
///
|
|
/// // Select a role
|
|
/// ref.read(selectedRoleProvider.notifier).selectRole(UserRole.customer);
|
|
///
|
|
/// // Clear selection
|
|
/// ref.read(selectedRoleProvider.notifier).clearRole();
|
|
///
|
|
/// // Show verification section conditionally
|
|
/// if (selectedRole == UserRole.customer) {
|
|
/// VerificationSection(),
|
|
/// }
|
|
/// ```
|
|
@riverpod
|
|
class SelectedRole extends _$SelectedRole {
|
|
/// Initialize with no role selected
|
|
@override
|
|
UserRole? build() {
|
|
return null;
|
|
}
|
|
|
|
/// Select a user role
|
|
///
|
|
/// Updates the state with the newly selected role.
|
|
/// This triggers UI updates that depend on role selection.
|
|
///
|
|
/// Parameters:
|
|
/// - [role]: The user role to select
|
|
///
|
|
/// Example:
|
|
/// ```dart
|
|
/// // User selects "Đại lý hệ thống" (dealer)
|
|
/// ref.read(selectedRoleProvider.notifier).selectRole(UserRole.customer);
|
|
/// // This will show verification fields
|
|
/// ```
|
|
void selectRole(UserRole role) {
|
|
state = role;
|
|
}
|
|
|
|
/// Clear the role selection
|
|
///
|
|
/// Resets the state to null (no role selected).
|
|
/// Useful when resetting the form or canceling registration.
|
|
///
|
|
/// Example:
|
|
/// ```dart
|
|
/// // User clicks "Cancel" or goes back
|
|
/// ref.read(selectedRoleProvider.notifier).clearRole();
|
|
/// // This will hide verification fields
|
|
/// ```
|
|
void clearRole() {
|
|
state = null;
|
|
}
|
|
|
|
/// Check if a role is currently selected
|
|
///
|
|
/// Returns true if any role has been selected, false otherwise.
|
|
bool get hasSelection => state != null;
|
|
|
|
/// Check if verification is required for current role
|
|
///
|
|
/// Returns true if the selected role requires verification documents
|
|
/// (CCCD, certificates, etc.). Currently only customer role requires this.
|
|
///
|
|
/// This is used to conditionally show the verification section:
|
|
/// ```dart
|
|
/// if (ref.read(selectedRoleProvider.notifier).requiresVerification) {
|
|
/// // Show CCCD input, file uploads, etc.
|
|
/// }
|
|
/// ```
|
|
bool get requiresVerification => state == UserRole.customer;
|
|
|
|
/// Get the display name for the current role (Vietnamese)
|
|
///
|
|
/// Returns a user-friendly Vietnamese name for the selected role,
|
|
/// or null if no role is selected.
|
|
///
|
|
/// Example:
|
|
/// ```dart
|
|
/// final displayName = ref.read(selectedRoleProvider.notifier).displayName;
|
|
/// // Returns: "Đại lý hệ thống" for customer role
|
|
/// ```
|
|
String? get displayName {
|
|
if (state == null) return null;
|
|
|
|
switch (state!) {
|
|
case UserRole.customer:
|
|
return 'Đại lý/Thầu thợ/Kiến trúc sư';
|
|
case UserRole.sales:
|
|
return 'Nhân viên kinh doanh';
|
|
case UserRole.admin:
|
|
return 'Quản trị viên';
|
|
case UserRole.accountant:
|
|
return 'Kế toán';
|
|
case UserRole.designer:
|
|
return 'Thiết kế';
|
|
}
|
|
}
|
|
}
|
|
|
|
/// Convenience provider for checking if verification is required
|
|
///
|
|
/// Returns true if the currently selected role requires verification
|
|
/// documents (CCCD, certificates, etc.).
|
|
///
|
|
/// Usage:
|
|
/// ```dart
|
|
/// final needsVerification = ref.watch(requiresVerificationProvider);
|
|
/// if (needsVerification) {
|
|
/// // Show verification section with file uploads
|
|
/// }
|
|
/// ```
|
|
@riverpod
|
|
bool requiresVerification(Ref ref) {
|
|
final selectedRole = ref.watch(selectedRoleProvider);
|
|
return selectedRole == UserRole.customer;
|
|
}
|
|
|
|
/// Convenience provider for getting role display name
|
|
///
|
|
/// Returns a user-friendly Vietnamese name for the selected role,
|
|
/// or null if no role is selected.
|
|
///
|
|
/// Usage:
|
|
/// ```dart
|
|
/// final roleName = ref.watch(roleDisplayNameProvider);
|
|
/// if (roleName != null) {
|
|
/// Text('Bạn đang đăng ký với vai trò: $roleName');
|
|
/// }
|
|
/// ```
|
|
@riverpod
|
|
String? roleDisplayName(Ref ref) {
|
|
final selectedRole = ref.watch(selectedRoleProvider);
|
|
|
|
if (selectedRole == null) return null;
|
|
|
|
switch (selectedRole) {
|
|
case UserRole.customer:
|
|
return 'Đại lý/Thầu thợ/Kiến trúc sư';
|
|
case UserRole.sales:
|
|
return 'Nhân viên kinh doanh';
|
|
case UserRole.admin:
|
|
return 'Quản trị viên';
|
|
case UserRole.accountant:
|
|
return 'Kế toán';
|
|
case UserRole.designer:
|
|
return 'Thiết kế';
|
|
}
|
|
}
|