import 'dart:developer'; import 'package:dartz/dartz.dart'; import 'package:data_channel/data_channel.dart'; import 'package:injectable/injectable.dart'; import '../../../domain/wallet/wallet.dart'; import '../datasources/pin_remote_data_provider.dart'; @Injectable(as: IPinRepository) class PinRepository implements IPinRepository { final PinRemoteDataProvider _remoteDataProvider; final String _logName = 'PinRepository'; PinRepository(this._remoteDataProvider); @override Future> getStatus() => _run( 'getStatus', _remoteDataProvider.fetchStatus, (dto) => dto.toDomain(), ); @override Future> requestOtp(PinOtpPurpose purpose) => _run( 'requestOtp', () => _remoteDataProvider.requestOtp(purpose), (dto) => dto.toDomain(), ); @override Future> setup({ required String otpToken, required String otpCode, required String pin, required String confirmPin, }) => _run( 'setup', () => _remoteDataProvider.setup( otpToken: otpToken, otpCode: otpCode, pin: pin, confirmPin: confirmPin, ), (dto) => dto.toDomain(), ); @override Future> change({ required String oldPin, required String pin, required String confirmPin, }) => _run( 'change', () => _remoteDataProvider.change( oldPin: oldPin, pin: pin, confirmPin: confirmPin, ), (value) => value, ); @override Future> reset({ required String otpToken, required String otpCode, required String pin, required String confirmPin, }) => _run( 'reset', () => _remoteDataProvider.reset( otpToken: otpToken, otpCode: otpCode, pin: pin, confirmPin: confirmPin, ), (value) => value, ); Future> _run( String name, Future> Function() call, R Function(D dto) toDomain, ) async { try { final result = await call(); if (result.hasError) return left(result.error!); return right(toDomain(result.data as D)); } catch (e, s) { log(name, name: _logName, error: e, stackTrace: s); return left(const WalletFailure.unexpectedError()); } } }