Skip to content

Добавление функции оплаты и подготовка к релизу в AppStore#77

Closed
neekeetuh wants to merge 21 commits intodevelopfrom
feat/payment_and_appstore_release
Closed

Добавление функции оплаты и подготовка к релизу в AppStore#77
neekeetuh wants to merge 21 commits intodevelopfrom
feat/payment_and_appstore_release

Conversation

@neekeetuh
Copy link
Contributor

  • Добавление логики оплаты
  • Разделение на слои (data source, repository)
  • Правки в локализации

Оплата протестирована как через testflight (sandbox account), так и через конфигурационный файл storekit (для имитации возврата средств).

Оплата проходит успешно, после завершения транзакции статус пользователя обновляется, и он получает все привилегии, при возврате денег статус про спадает

@neekeetuh neekeetuh requested a review from Nailloon May 30, 2025 10:23
@neekeetuh neekeetuh self-assigned this May 30, 2025
Copy link

@Nailloon Nailloon left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Замечание по вынесу в дата сорс именно логики связанной с определенными пакетами и обработке ошибок с помощью try catch, остальное выглядит нормально

Copy link

@Nailloon Nailloon left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Подправь моменты и работоспособность и мерджи

…ользу более простой реализации логики взаимодействия компонентов + вынесения апи ключа в .env файл
Copy link

@Nailloon Nailloon left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Желательно поправить замечания и можно мерджить. Также внимательно приглядись к пограничным кейсам, когда у тебя пользователь может попытаться обмануть систему

Comment on lines +34 to +37
if (provider.error == ProVersionError.restoreError) {
SharedFunctions.showSnackBar(
context, AppLocalizations.of(context).restorePurchasesError);
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Этот код можно вынести, у тебя он повторен с таким же в menu_app_bar


ProVersionProvider({required InAppPurchaseRepository repository})
: _repository = repository {
_state = const InitialProVersionState();

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

У тебя и здесь происходит задание переменной, и в init. Потенциально нельзя здесь не трогать тогда _state? Или ты так ты пытаешься обезопасить от вызова, когда init еще не отработал?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Да, потому что init асинхронный и стейт может из-за этого поздно инициализироваться, когда уже будет отрисован ui (тестил на айпаде)

bool get isPro => _isProStatus;
bool get isPurchaseError => _isPurchaseError;
bool get isRestoreError => _isRestoreError;
void _setState(ProVersionState state) {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Честно, хотелось бы любое другое название, но не _setState. Возникают сразу же ассоциации с виджетовским методом

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Понимаю, но блин, это буквально сеттер стейта), да и область видимости у него только внутри провайдера, так что наверное сложно будет запутаться. Хотя ладно, придумаю новое название

Comment on lines +20 to +21
Future<void> restorePurchases() async {
Purchases.restorePurchases();

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Эта операция у тебя всегда будет успешной? Что если я выключу интернет прямо во время запроса?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Это обрабатывается уже на уровне провайдера. Если будет какое-то исключение, то установится состояние ошибки, и в связи с этим появится снекбар с сообщением об ошибке


void downgradeFromPro() {
_setProStatus(false);
_setState(const InitialProVersionState());

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

В данном случае, когда есть у нас восстановление покупок это будто бы тоже самое, что downgrade. Только если не подразумевается другая логика в будущем для этого метода. Точно ли он у тебя до сих пор где-то используется или только для дебага?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Да, в текущей версии под ios в этом методе смысла нет, это скорее на будущее оставил, если понадобится функционал отмены покупки/возврата средств по нажатию на кнопку в приложении (если сбп будет подключаться, например)

@iamagentaka iamagentaka deleted the branch develop February 6, 2026 19:59
@iamagentaka iamagentaka closed this Feb 6, 2026
@iamagentaka iamagentaka deleted the feat/payment_and_appstore_release branch February 6, 2026 20:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants