Files
sendico/frontend/pshared/lib/provider/payout_verification.dart
2026-02-18 18:15:38 +03:00

104 lines
3.0 KiB
Dart

import 'package:flutter/material.dart';
import 'package:pshared/api/responses/verification/response.dart';
import 'package:pshared/provider/resource.dart';
import 'package:pshared/service/verification.dart';
import 'package:pshared/utils/exception.dart';
class PayoutVerificationProvider extends ChangeNotifier {
Resource<VerificationResponse?> _resource = Resource(data: null);
DateTime? _cooldownUntil;
VerificationResponse? get response => _resource.data;
bool get isLoading => _resource.isLoading;
Exception? get error => _resource.error;
String get target => _resource.data?.target ?? '';
String? get idempotencyKey => _resource.data?.idempotencyKey;
DateTime? get cooldownUntil => _cooldownUntil;
Future<VerificationResponse> requestCode() async {
_setResource(_resource.copyWith(isLoading: true, error: null));
try {
final response = await VerificationService.requestPayoutCode();
_cooldownUntil = _resolveCooldownUntil(response);
_setResource(_resource.copyWith(
data: response,
isLoading: false,
error: null,
));
return response;
} catch (e) {
_setResource(_resource.copyWith(
isLoading: false,
error: toException(e),
));
rethrow;
}
}
Future<VerificationResponse> resendCode() async {
final currentKey = _resource.data?.idempotencyKey;
if (currentKey == null || currentKey.isEmpty) {
throw StateError('Payout verification is not initialized');
}
_setResource(_resource.copyWith(isLoading: true, error: null));
try {
final response = await VerificationService.resendPayoutCode(
idempotencyKey: currentKey,
);
_cooldownUntil = _resolveCooldownUntil(response);
_setResource(_resource.copyWith(
data: response,
isLoading: false,
error: null,
));
return response;
} catch (e) {
_setResource(_resource.copyWith(
isLoading: false,
error: toException(e),
));
rethrow;
}
}
Future<void> confirmCode(String code) async {
final currentKey = _resource.data?.idempotencyKey;
if (currentKey == null || currentKey.isEmpty) {
throw StateError('Payout verification is not initialized');
}
_setResource(_resource.copyWith(isLoading: true, error: null));
try {
await VerificationService.confirmPayoutCode(
code: code.trim(),
idempotencyKey: currentKey,
);
_setResource(_resource.copyWith(isLoading: false, error: null));
} catch (e) {
_setResource(_resource.copyWith(
isLoading: false,
error: toException(e),
));
rethrow;
}
}
void reset() {
_cooldownUntil = null;
_setResource(Resource(data: null));
}
DateTime? _resolveCooldownUntil(VerificationResponse response) {
if (response.cooldownSeconds <= 0) return null;
return DateTime.now().add(response.cooldownDuration);
}
void _setResource(Resource<VerificationResponse?> resource) {
_resource = resource;
notifyListeners();
}
}