forked from eatvio/eatvio_app
44 lines
2.3 KiB
Dart
44 lines
2.3 KiB
Dart
import 'package:sbp/data/c2bmembers_data.dart';
|
||
import 'package:sbp/models/c2bmembers_model.dart';
|
||
import 'package:sbp/sbp.dart' as sbp;
|
||
|
||
/// Контракт обёртки над нативным плагином СБП (Система Быстрых Платежей).
|
||
///
|
||
/// Статичные методы класса [Sbp] из пакета `sbp` работают через MethodChannel,
|
||
/// поэтому не поддаются прямому мокированию в тестах. Этот интерфейс вводится
|
||
/// для тестируемости и возможности подмены реализации (см. [SbpServiceImpl]).
|
||
abstract class SbpService {
|
||
/// Возвращает список банков, установленных на устройстве пользователя
|
||
/// и поддерживающих оплату по СБП.
|
||
Future<List<C2bmemberModel>> getInstalledBanks();
|
||
|
||
/// Открывает банковское приложение [bank] для оплаты по ссылке [url]
|
||
/// (checkout_url вида `https://qr.nspk.ru/...`).
|
||
///
|
||
/// Возвращает `true`, если приложение банка успешно запущено.
|
||
Future<bool> openBank({required String url, required C2bmemberModel bank});
|
||
}
|
||
|
||
/// Реализация [SbpService], делегирующая вызовы в статичные методы пакета `sbp`.
|
||
class SbpServiceImpl implements SbpService {
|
||
const SbpServiceImpl();
|
||
|
||
@override
|
||
Future<List<C2bmemberModel>> getInstalledBanks() {
|
||
// Используем встроенный справочник банков c2bmembersData (получаемый с
|
||
// https://qr.nspk.ru/proxyapp/c2bmembers.json) и фильтруем только те, что
|
||
// установлены на устройстве. Локальные иконки/названия включены, чтобы UI
|
||
// не зависел от сетевой загрузки логотипов.
|
||
return sbp.Sbp.getInstalledBanks(
|
||
C2bmembersModel.fromJson(c2bmembersData),
|
||
useAndroidLocalIcons: true,
|
||
useAndroidLocalNames: true,
|
||
);
|
||
}
|
||
|
||
@override
|
||
Future<bool> openBank({required String url, required C2bmemberModel bank}) {
|
||
return sbp.Sbp.openBank(url, bank);
|
||
}
|
||
}
|