Добавление функции оплаты и подготовка к релизу в AppStore#77
Добавление функции оплаты и подготовка к релизу в AppStore#77
Conversation
…ран с отменой покупки
Nailloon
left a comment
There was a problem hiding this comment.
Замечание по вынесу в дата сорс именно логики связанной с определенными пакетами и обработке ошибок с помощью try catch, остальное выглядит нормально
frontend/lib/views/menu_view/components/pro_status_indicator.dart
Outdated
Show resolved
Hide resolved
…нформации в дата сорс
Nailloon
left a comment
There was a problem hiding this comment.
Подправь моменты и работоспособность и мерджи
…ользу более простой реализации логики взаимодействия компонентов + вынесения апи ключа в .env файл
…_chess into feat/payment_and_appstore_release
…файлы локализации
…лизированные данные
…вателем для устройств на ios
…й + обработка восстановления покупок
Nailloon
left a comment
There was a problem hiding this comment.
Желательно поправить замечания и можно мерджить. Также внимательно приглядись к пограничным кейсам, когда у тебя пользователь может попытаться обмануть систему
| if (provider.error == ProVersionError.restoreError) { | ||
| SharedFunctions.showSnackBar( | ||
| context, AppLocalizations.of(context).restorePurchasesError); | ||
| } |
There was a problem hiding this comment.
Этот код можно вынести, у тебя он повторен с таким же в menu_app_bar
|
|
||
| ProVersionProvider({required InAppPurchaseRepository repository}) | ||
| : _repository = repository { | ||
| _state = const InitialProVersionState(); |
There was a problem hiding this comment.
У тебя и здесь происходит задание переменной, и в init. Потенциально нельзя здесь не трогать тогда _state? Или ты так ты пытаешься обезопасить от вызова, когда init еще не отработал?
There was a problem hiding this comment.
Да, потому что init асинхронный и стейт может из-за этого поздно инициализироваться, когда уже будет отрисован ui (тестил на айпаде)
| bool get isPro => _isProStatus; | ||
| bool get isPurchaseError => _isPurchaseError; | ||
| bool get isRestoreError => _isRestoreError; | ||
| void _setState(ProVersionState state) { |
There was a problem hiding this comment.
Честно, хотелось бы любое другое название, но не _setState. Возникают сразу же ассоциации с виджетовским методом
There was a problem hiding this comment.
Понимаю, но блин, это буквально сеттер стейта), да и область видимости у него только внутри провайдера, так что наверное сложно будет запутаться. Хотя ладно, придумаю новое название
| Future<void> restorePurchases() async { | ||
| Purchases.restorePurchases(); |
There was a problem hiding this comment.
Эта операция у тебя всегда будет успешной? Что если я выключу интернет прямо во время запроса?
There was a problem hiding this comment.
Это обрабатывается уже на уровне провайдера. Если будет какое-то исключение, то установится состояние ошибки, и в связи с этим появится снекбар с сообщением об ошибке
|
|
||
| void downgradeFromPro() { | ||
| _setProStatus(false); | ||
| _setState(const InitialProVersionState()); |
There was a problem hiding this comment.
В данном случае, когда есть у нас восстановление покупок это будто бы тоже самое, что downgrade. Только если не подразумевается другая логика в будущем для этого метода. Точно ли он у тебя до сих пор где-то используется или только для дебага?
There was a problem hiding this comment.
Да, в текущей версии под ios в этом методе смысла нет, это скорее на будущее оставил, если понадобится функционал отмены покупки/возврата средств по нажатию на кнопку в приложении (если сбп будет подключаться, например)
Оплата протестирована как через testflight (sandbox account), так и через конфигурационный файл storekit (для имитации возврата средств).
Оплата проходит успешно, после завершения транзакции статус пользователя обновляется, и он получает все привилегии, при возврате денег статус про спадает