diff --git a/WordPress/Classes/ViewRelated/Plugins/PluginViewController.swift b/WordPress/Classes/ViewRelated/Plugins/PluginViewController.swift index 2eb4e00aebc2..fb67d7965294 100644 --- a/WordPress/Classes/ViewRelated/Plugins/PluginViewController.swift +++ b/WordPress/Classes/ViewRelated/Plugins/PluginViewController.swift @@ -76,6 +76,7 @@ class PluginViewController: UITableViewController { tableView.estimatedRowHeight = 44 bindViewModel() + observeNetworkStatus() } private func setupViews() { @@ -167,3 +168,11 @@ private extension PluginViewController { return noResultsViewController } } + +extension PluginViewController: NetworkStatusDelegate { + func networkStatusDidChange(active: Bool) { + if active { + viewModel.networkStatusDidChange(active: active) + } + } +} diff --git a/WordPress/Classes/ViewRelated/Plugins/PluginViewModel.swift b/WordPress/Classes/ViewRelated/Plugins/PluginViewModel.swift index 0985b1681ed5..0787d19686bf 100644 --- a/WordPress/Classes/ViewRelated/Plugins/PluginViewModel.swift +++ b/WordPress/Classes/ViewRelated/Plugins/PluginViewModel.swift @@ -60,11 +60,14 @@ class PluginViewModel: Observable { let changeDispatcher = Dispatcher() let queryReceipt: Receipt? + private let store: PluginStore + init(plugin: Plugin, capabilities: SitePluginCapabilities, site: JetpackSiteRef, store: PluginStore = StoreContainer.shared.plugin) { self.state = .plugin(plugin) self.capabilities = capabilities self.site = site self.isInstallingPlugin = false + self.store = store queryReceipt = nil storeReceipt = store.onChange { [weak self] in @@ -98,27 +101,28 @@ class PluginViewModel: Observable { } private init(with slug: String, state: State, site: JetpackSiteRef, store: PluginStore) { + self.store = store self.state = state - self.capabilities = store.getPlugins(site: site)?.capabilities + self.capabilities = self.store.getPlugins(site: site)?.capabilities self.site = site self.isInstallingPlugin = false - queryReceipt = store.query(.directoryEntry(slug: slug)) + queryReceipt = self.store.query(.directoryEntry(slug: slug)) - storeReceipt = store.onChange { [weak self] in - guard let entry = store.getPluginDirectoryEntry(slug: slug) else { + storeReceipt = self.store.onChange { [weak self] in + guard let entry = self?.store.getPluginDirectoryEntry(slug: slug) else { self?.state = .error return } - if let plugin = store.getPlugin(slug: entry.slug, site: site) { + if let plugin = self?.store.getPlugin(slug: entry.slug, site: site) { self?.state = .plugin(plugin) } else { self?.state = .directoryEntry(entry) } - self?.capabilities = store.getPlugins(site: site)?.capabilities - self?.isInstallingPlugin = store.isInstallingPlugin(site: site, slug: slug) + self?.capabilities = self?.store.getPlugins(site: site)?.capabilities + self?.isInstallingPlugin = self?.store.isInstallingPlugin(site: site, slug: slug) ?? false } } @@ -587,3 +591,22 @@ private extension String { static let title = NSLocalizedString("Loading Plugin...", comment: "Text displayed while loading an specific plugin") } } + +extension PluginViewModel { + func networkStatusDidChange(active: Bool) { + guard active else { + return + } + + switch state { + case .error: + store.processQueries() + state = .loading + case .directoryEntry(let entry): + store.processQueries() + state = .directoryEntry(entry) + default: + break + } + } +}