diff --git a/client/ui/controllers/api/apiConfigsController.cpp b/client/ui/controllers/api/apiConfigsController.cpp index 21ba5f8fd..83ca3284f 100644 --- a/client/ui/controllers/api/apiConfigsController.cpp +++ b/client/ui/controllers/api/apiConfigsController.cpp @@ -382,6 +382,51 @@ bool ApiConfigsController::fillAvailableServices() } QJsonObject data = QJsonDocument::fromJson(responseBody).object(); + +#if defined(Q_OS_IOS) || defined(MACOS_NE) + QEventLoop waitProducts; + bool productsFetched = false; + QString productPrice; + QString productCurrency; + + IosController::Instance()->fetchProducts(QStringList() << QStringLiteral("amnezia_premium_6_month"), + [&](const QList &products, + const QStringList &invalidIds, + const QString &errorString) { + if (!errorString.isEmpty() || products.isEmpty()) { + qWarning().noquote() << "[IAP] Failed to fetch product price:" << errorString; + } else { + const auto &product = products.first(); + productPrice = product.value("price").toString(); + productCurrency = product.value("currencyCode").toString(); + productsFetched = true; + qInfo().noquote() << "[IAP] Fetched product price:" << productPrice << productCurrency; + } + waitProducts.quit(); + }); + waitProducts.exec(); + + if (productsFetched && !productPrice.isEmpty()) { + QJsonArray services = data.value("services").toArray(); + for (int i = 0; i < services.size(); ++i) { + QJsonObject service = services[i].toObject(); + if (service.value(configKey::serviceType).toString() == serviceType::amneziaPremium) { + QJsonObject serviceInfo = service.value(configKey::serviceInfo).toObject(); + QString formattedPrice = productPrice; + if (!productCurrency.isEmpty()) { + formattedPrice += " " + productCurrency; + } + serviceInfo["price"] = formattedPrice; + service[configKey::serviceInfo] = serviceInfo; + services[i] = service; + data["services"] = services; + qInfo().noquote() << "[IAP] Updated premium service price in data:" << formattedPrice; + break; + } + } + } +#endif + m_apiServicesModel->updateModel(data); if (m_apiServicesModel->rowCount() > 0) { m_apiServicesModel->setServiceIndex(0); diff --git a/client/ui/models/api/apiServicesModel.cpp b/client/ui/models/api/apiServicesModel.cpp index d571346b7..5ed9cca16 100644 --- a/client/ui/models/api/apiServicesModel.cpp +++ b/client/ui/models/api/apiServicesModel.cpp @@ -112,7 +112,11 @@ QVariant ApiServicesModel::data(const QModelIndex &index, int role) const if (price == "free") { return tr("Free"); } +#if defined(Q_OS_IOS) || defined(MACOS_NE) + return tr("%1 $").arg(price); +#else return tr("%1 $/month").arg(price); +#endif } case EndDateRole: { return QDateTime::fromString(apiServiceData.subscription.endDate, Qt::ISODate).toLocalTime().toString("d MMM yyyy"); diff --git a/client/ui/qml/Pages2/PageSetupWizardApiServiceInfo.qml b/client/ui/qml/Pages2/PageSetupWizardApiServiceInfo.qml index 16ac2f204..c5e581af8 100644 --- a/client/ui/qml/Pages2/PageSetupWizardApiServiceInfo.qml +++ b/client/ui/qml/Pages2/PageSetupWizardApiServiceInfo.qml @@ -97,16 +97,32 @@ PageType { } } + ParagraphTextType { + Layout.fillWidth: true + Layout.topMargin: 16 + Layout.leftMargin: 16 + Layout.rightMargin: 16 + + visible: (Qt.platform.os === "ios" || IsMacOsNeBuild) && ApiServicesModel.getSelectedServiceType() === "amnezia-premium" + + horizontalAlignment: Text.AlignHCenter + textFormat: Text.PlainText + color: AmneziaStyle.color.mutedGray + font.pixelSize: 12 + + text: qsTr("Charged to your Apple ID at confirmation. Renews automatically unless auto-renew is turned off at least 24 hours before period end. Manage in Apple ID settings.") + } + BasicButtonType { id: continueButton Layout.fillWidth: true Layout.topMargin: 32 - Layout.bottomMargin: 32 + Layout.bottomMargin: 16 Layout.leftMargin: 16 Layout.rightMargin: 16 - text: qsTr("Connect") + text: ApiServicesModel.getSelectedServiceType() === "amnezia-premium" ? qsTr("Subscribe Now") : qsTr("Connect") clickedFunc: function() { PageController.showBusyIndicator(true) @@ -121,6 +137,37 @@ PageType { } } } + + ParagraphTextType { + Layout.fillWidth: true + Layout.topMargin: 16 + Layout.leftMargin: 16 + Layout.rightMargin: 16 + Layout.bottomMargin: 32 + + visible: (Qt.platform.os === "ios" || IsMacOsNeBuild) && ApiServicesModel.getSelectedServiceType() === "amnezia-premium" + + horizontalAlignment: Text.AlignHCenter + textFormat: Text.RichText + color: AmneziaStyle.color.mutedGray + font.pixelSize: 12 + + text: { + var termsUrl = "https://www.apple.com/legal/internet-services/itunes/dev/stdeula/" + var privacyUrl = LanguageModel.getCurrentSiteUrl("policy") + return qsTr("By continuing, you agree to the Terms of Use and Privacy Policy").arg(termsUrl).arg(privacyUrl) + } + + onLinkActivated: function(link) { + Qt.openUrlExternally(link) + } + + MouseArea { + anchors.fill: parent + acceptedButtons: Qt.NoButton + cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor + } + } } }