Skip to content

Commit 9a07cc7

Browse files
committed
7855 Show webview when JITM CTA is tapped
1 parent 272b7c7 commit 9a07cc7

File tree

3 files changed

+47
-6
lines changed

3 files changed

+47
-6
lines changed

WooCommerce/Classes/ViewModels/Feature Announcement Cards/JustInTimeMessageAnnouncementCardViewModel.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,10 @@ struct JustInTimeMessageAnnouncementCardViewModel: AnnouncementCardViewModelProt
1818
// No-op
1919
}
2020

21+
let onCTATapped: (() -> Void)?
22+
2123
func ctaTapped() {
22-
// No-op
24+
onCTATapped?()
2325
}
2426

2527
var showDismissConfirmation: Bool = false

WooCommerce/Classes/ViewRelated/Dashboard/DashboardViewController.swift

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ final class DashboardViewController: UIViewController {
126126
observeStatsVersionForDashboardUIUpdates()
127127
trackProductsOnboardingEligibility()
128128
observeAnnouncements()
129+
observeShowWebViewSheet()
129130
if hasAnnouncementFeatureFlag {
130131
viewModel.syncAnnouncements(for: siteID)
131132
}
@@ -305,6 +306,23 @@ private extension DashboardViewController {
305306
}.store(in: &subscriptions)
306307
}
307308

309+
func observeShowWebViewSheet() {
310+
viewModel.$showWebViewSheet.sink { [weak self] viewModel in
311+
guard let self = self else { return }
312+
guard let viewModel = viewModel else { return }
313+
self.openWebView(viewModel: viewModel)
314+
}
315+
.store(in: &subscriptions)
316+
}
317+
318+
private func openWebView(viewModel: WebViewSheetViewModel) {
319+
let cardReaderWebview = WebViewSheet(viewModel: viewModel) { [weak self] in
320+
self?.dismiss(animated: true)
321+
}
322+
let hostingController = UIHostingController(rootView: cardReaderWebview)
323+
present(hostingController, animated: true, completion: nil)
324+
}
325+
308326
// This is used so we have a specific type for the view while applying modifiers.
309327
struct AnnouncementCardWrapper: View {
310328
let cardView: FeatureAnnouncementCardView
@@ -323,8 +341,8 @@ private extension DashboardViewController {
323341
}
324342

325343
let cardView = FeatureAnnouncementCardView(viewModel: viewModel,
326-
dismiss: {},
327-
callToAction: {})
344+
dismiss: {},
345+
callToAction: {})
328346

329347
self.showAnnouncement(AnnouncementCardWrapper(cardView: cardView))
330348
}

WooCommerce/Classes/ViewRelated/Dashboard/DashboardViewModel.swift

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ final class DashboardViewModel {
99

1010
@Published private(set) var announcementViewModel: AnnouncementCardViewModelProtocol? = nil
1111

12+
@Published private(set) var showWebViewSheet: WebViewSheetViewModel? = nil
13+
1214
private let stores: StoresManager
1315

1416
init(stores: StoresManager = ServiceLocator.stores) {
@@ -107,9 +109,20 @@ final class DashboardViewModel {
107109
hook: .adminNotices) { result in
108110
switch result {
109111
case let .success(.some(message)):
110-
let viewModel = JustInTimeMessageAnnouncementCardViewModel(title: message.title,
111-
message: message.detail,
112-
buttonTitle: message.buttonTitle)
112+
let viewModel = JustInTimeMessageAnnouncementCardViewModel(
113+
title: message.title,
114+
message: message.detail,
115+
buttonTitle: message.buttonTitle,
116+
onCTATapped: { [weak self] in
117+
guard let self = self,
118+
let url = URL(string: message.url)
119+
else { return }
120+
let webViewModel = WebViewSheetViewModel(
121+
url: url,
122+
navigationTitle: message.title,
123+
wpComAuthenticated: self.needsAuthenticatedWebView(url: url))
124+
self.showWebViewSheet = webViewModel
125+
})
113126
self.announcementViewModel = viewModel
114127
default:
115128
break
@@ -118,6 +131,13 @@ final class DashboardViewModel {
118131
stores.dispatch(action)
119132
}
120133
}
134+
135+
private func needsAuthenticatedWebView(url: URL) -> Bool {
136+
guard let host = url.host else {
137+
return false
138+
}
139+
return Constants.trustedDomains.contains(host)
140+
}
121141
}
122142

123143
// MARK: - Constants
@@ -126,5 +146,6 @@ private extension DashboardViewModel {
126146
enum Constants {
127147
static let topEarnerStatsLimit: Int = 5
128148
static let dashboardScreenName = "my_store"
149+
static let trustedDomains = ["woocommerce.com", "wordpress.com"]
129150
}
130151
}

0 commit comments

Comments
 (0)