From 829a3094ca7a4f665fa79adc7adc5e4256e44cdb Mon Sep 17 00:00:00 2001 From: Cesar Tardaguila <2722505+ctarda@users.noreply.github.com> Date: Fri, 27 Jul 2018 09:29:49 +0800 Subject: [PATCH 01/11] Make the view model aware of changes in the network status --- .../ViewRelated/Plugins/PluginViewModel.swift | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/WordPress/Classes/ViewRelated/Plugins/PluginViewModel.swift b/WordPress/Classes/ViewRelated/Plugins/PluginViewModel.swift index b826ad79876f..66881f7f53e2 100644 --- a/WordPress/Classes/ViewRelated/Plugins/PluginViewModel.swift +++ b/WordPress/Classes/ViewRelated/Plugins/PluginViewModel.swift @@ -579,3 +579,16 @@ private extension String { static let title = NSLocalizedString("Loading Plugin...", comment: "Text displayed while loading an specific plugin") } } + +extension NetworkStatusDelegate where Self: PluginViewController { + func observeNetworkStatus() { + // Do something here in order to observe changes in the network status + } +} + +extension PluginViewController: NetworkStatusDelegate { + func networkStatusDidChange(active: Bool) { + //updateNoResults() + print("network status did change") + } +} From 6291028fe544c5f634521e8c08448506d96d3360 Mon Sep 17 00:00:00 2001 From: Cesar Tardaguila <2722505+ctarda@users.noreply.github.com> Date: Fri, 27 Jul 2018 10:04:59 +0800 Subject: [PATCH 02/11] Update extensions to implement awareness in view model instead of view --- WordPress/Classes/ViewRelated/Plugins/PluginViewModel.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Plugins/PluginViewModel.swift b/WordPress/Classes/ViewRelated/Plugins/PluginViewModel.swift index 66881f7f53e2..2c07c5193ac0 100644 --- a/WordPress/Classes/ViewRelated/Plugins/PluginViewModel.swift +++ b/WordPress/Classes/ViewRelated/Plugins/PluginViewModel.swift @@ -580,13 +580,13 @@ private extension String { } } -extension NetworkStatusDelegate where Self: PluginViewController { +extension NetworkStatusDelegate where Self: PluginViewModel { func observeNetworkStatus() { // Do something here in order to observe changes in the network status } } -extension PluginViewController: NetworkStatusDelegate { +extension PluginViewModel: NetworkStatusDelegate { func networkStatusDidChange(active: Bool) { //updateNoResults() print("network status did change") From 4dd34e0df24cfdff3328ff050990c743154def83 Mon Sep 17 00:00:00 2001 From: Cesar Tardaguila <2722505+ctarda@users.noreply.github.com> Date: Fri, 27 Jul 2018 10:06:22 +0800 Subject: [PATCH 03/11] And start observing on initialisation --- WordPress/Classes/ViewRelated/Plugins/PluginViewModel.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/WordPress/Classes/ViewRelated/Plugins/PluginViewModel.swift b/WordPress/Classes/ViewRelated/Plugins/PluginViewModel.swift index 2c07c5193ac0..70b4a2f9105e 100644 --- a/WordPress/Classes/ViewRelated/Plugins/PluginViewModel.swift +++ b/WordPress/Classes/ViewRelated/Plugins/PluginViewModel.swift @@ -75,6 +75,8 @@ class PluginViewModel: Observable { self?.state = .plugin(plugin) } + + observeNetworkStatus() } convenience init(directoryEntry: PluginDirectoryEntry, site: JetpackSiteRef, store: PluginStore = StoreContainer.shared.plugin) { From ece7807c0e3d71869eea94dc98c0054e560f43fd Mon Sep 17 00:00:00 2001 From: Cesar Tardaguila <2722505+ctarda@users.noreply.github.com> Date: Mon, 30 Jul 2018 15:28:18 +0800 Subject: [PATCH 04/11] Move the logic tot he view controller --- .../Plugins/PluginViewController.swift | 10 ++++++++++ .../ViewRelated/Plugins/PluginViewModel.swift | 15 --------------- 2 files changed, 10 insertions(+), 15 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Plugins/PluginViewController.swift b/WordPress/Classes/ViewRelated/Plugins/PluginViewController.swift index 2eb4e00aebc2..fa7a0ee5b8d5 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,12 @@ private extension PluginViewController { return noResultsViewController } } + +extension PluginViewController: NetworkStatusDelegate { + func networkStatusDidChange(active: Bool) { + print("====== network status changed =====") + if active { + print("----- reload all the things") + } + } +} diff --git a/WordPress/Classes/ViewRelated/Plugins/PluginViewModel.swift b/WordPress/Classes/ViewRelated/Plugins/PluginViewModel.swift index 70b4a2f9105e..b826ad79876f 100644 --- a/WordPress/Classes/ViewRelated/Plugins/PluginViewModel.swift +++ b/WordPress/Classes/ViewRelated/Plugins/PluginViewModel.swift @@ -75,8 +75,6 @@ class PluginViewModel: Observable { self?.state = .plugin(plugin) } - - observeNetworkStatus() } convenience init(directoryEntry: PluginDirectoryEntry, site: JetpackSiteRef, store: PluginStore = StoreContainer.shared.plugin) { @@ -581,16 +579,3 @@ private extension String { static let title = NSLocalizedString("Loading Plugin...", comment: "Text displayed while loading an specific plugin") } } - -extension NetworkStatusDelegate where Self: PluginViewModel { - func observeNetworkStatus() { - // Do something here in order to observe changes in the network status - } -} - -extension PluginViewModel: NetworkStatusDelegate { - func networkStatusDidChange(active: Bool) { - //updateNoResults() - print("network status did change") - } -} From eb02fd7a271115bf72c21fc12dfc2d56b38323f9 Mon Sep 17 00:00:00 2001 From: Cesar Tardaguila <2722505+ctarda@users.noreply.github.com> Date: Mon, 30 Jul 2018 16:40:14 +0800 Subject: [PATCH 05/11] Expose a reload plugin method --- .../Classes/ViewRelated/Plugins/PluginViewModel.swift | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/WordPress/Classes/ViewRelated/Plugins/PluginViewModel.swift b/WordPress/Classes/ViewRelated/Plugins/PluginViewModel.swift index b826ad79876f..0edfd96a9c6c 100644 --- a/WordPress/Classes/ViewRelated/Plugins/PluginViewModel.swift +++ b/WordPress/Classes/ViewRelated/Plugins/PluginViewModel.swift @@ -579,3 +579,11 @@ private extension String { static let title = NSLocalizedString("Loading Plugin...", comment: "Text displayed while loading an specific plugin") } } + +extension PluginViewModel { + func reloadPlugin() { + state = .loading + let store = StoreContainer.shared.plugin + store.processQueries() + } +} From 6cbdb80be14aa3e7db5ee6375a429b6bd8ac21d3 Mon Sep 17 00:00:00 2001 From: Cesar Tardaguila <2722505+ctarda@users.noreply.github.com> Date: Mon, 30 Jul 2018 16:40:53 +0800 Subject: [PATCH 06/11] Reload by brute force --- .../Classes/ViewRelated/Plugins/PluginViewController.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Plugins/PluginViewController.swift b/WordPress/Classes/ViewRelated/Plugins/PluginViewController.swift index fa7a0ee5b8d5..b7ec422160c1 100644 --- a/WordPress/Classes/ViewRelated/Plugins/PluginViewController.swift +++ b/WordPress/Classes/ViewRelated/Plugins/PluginViewController.swift @@ -171,9 +171,9 @@ private extension PluginViewController { extension PluginViewController: NetworkStatusDelegate { func networkStatusDidChange(active: Bool) { - print("====== network status changed =====") if active { - print("----- reload all the things") + viewModel.reloadPlugin() + updateNoResults() } } } From f3a64456281ea451191ae5b0e84812e189014ef3 Mon Sep 17 00:00:00 2001 From: Cesar Tardaguila <2722505+ctarda@users.noreply.github.com> Date: Tue, 31 Jul 2018 10:46:40 +0800 Subject: [PATCH 07/11] Retain plugin store --- .../ViewRelated/Plugins/PluginViewModel.swift | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Plugins/PluginViewModel.swift b/WordPress/Classes/ViewRelated/Plugins/PluginViewModel.swift index 0edfd96a9c6c..963287804842 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 } } @@ -581,9 +585,10 @@ private extension String { } extension PluginViewModel { - func reloadPlugin() { - state = .loading - let store = StoreContainer.shared.plugin - store.processQueries() + func networkStatusDidChange(active: Bool) { + if active { + state = .loading + store.processQueries() + } } } From 1b4a722c9e3d101f15ecdc69985624c0c52c5a9d Mon Sep 17 00:00:00 2001 From: Cesar Tardaguila <2722505+ctarda@users.noreply.github.com> Date: Tue, 31 Jul 2018 10:47:00 +0800 Subject: [PATCH 08/11] Pass networkStatusDidChange to view model --- .../Classes/ViewRelated/Plugins/PluginViewController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPress/Classes/ViewRelated/Plugins/PluginViewController.swift b/WordPress/Classes/ViewRelated/Plugins/PluginViewController.swift index b7ec422160c1..d60a7c13a97e 100644 --- a/WordPress/Classes/ViewRelated/Plugins/PluginViewController.swift +++ b/WordPress/Classes/ViewRelated/Plugins/PluginViewController.swift @@ -172,7 +172,7 @@ private extension PluginViewController { extension PluginViewController: NetworkStatusDelegate { func networkStatusDidChange(active: Bool) { if active { - viewModel.reloadPlugin() + viewModel.networkStatusDidChange(active: active) updateNoResults() } } From 2fc5d19cfecd050125dd5b128f07fe9eb6770188 Mon Sep 17 00:00:00 2001 From: Cesar Tardaguila <2722505+ctarda@users.noreply.github.com> Date: Wed, 1 Aug 2018 11:30:48 +0800 Subject: [PATCH 09/11] Reload only when in error state --- WordPress/Classes/ViewRelated/Plugins/PluginViewModel.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPress/Classes/ViewRelated/Plugins/PluginViewModel.swift b/WordPress/Classes/ViewRelated/Plugins/PluginViewModel.swift index 963287804842..3e0dc702c0c2 100644 --- a/WordPress/Classes/ViewRelated/Plugins/PluginViewModel.swift +++ b/WordPress/Classes/ViewRelated/Plugins/PluginViewModel.swift @@ -586,7 +586,7 @@ private extension String { extension PluginViewModel { func networkStatusDidChange(active: Bool) { - if active { + if active, case .error = state { state = .loading store.processQueries() } From 99bc718fe3b85ed5378e0a285f5e1dc254e434b0 Mon Sep 17 00:00:00 2001 From: Cesar Tardaguila <2722505+ctarda@users.noreply.github.com> Date: Thu, 2 Aug 2018 09:37:00 +0800 Subject: [PATCH 10/11] Do not update error view manually when reloading --- WordPress/Classes/ViewRelated/Plugins/PluginViewController.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/WordPress/Classes/ViewRelated/Plugins/PluginViewController.swift b/WordPress/Classes/ViewRelated/Plugins/PluginViewController.swift index d60a7c13a97e..fb67d7965294 100644 --- a/WordPress/Classes/ViewRelated/Plugins/PluginViewController.swift +++ b/WordPress/Classes/ViewRelated/Plugins/PluginViewController.swift @@ -173,7 +173,6 @@ extension PluginViewController: NetworkStatusDelegate { func networkStatusDidChange(active: Bool) { if active { viewModel.networkStatusDidChange(active: active) - updateNoResults() } } } From f2d11c44dd4e63fca19bcb4bec5eec41fdb44d5c Mon Sep 17 00:00:00 2001 From: Cesar Tardaguila <2722505+ctarda@users.noreply.github.com> Date: Thu, 2 Aug 2018 09:45:14 +0800 Subject: [PATCH 11/11] And update viewmodel to handle the directoryEntry case --- .../ViewRelated/Plugins/PluginViewModel.swift | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/WordPress/Classes/ViewRelated/Plugins/PluginViewModel.swift b/WordPress/Classes/ViewRelated/Plugins/PluginViewModel.swift index 9f303b443bba..0787d19686bf 100644 --- a/WordPress/Classes/ViewRelated/Plugins/PluginViewModel.swift +++ b/WordPress/Classes/ViewRelated/Plugins/PluginViewModel.swift @@ -594,9 +594,19 @@ private extension String { extension PluginViewModel { func networkStatusDidChange(active: Bool) { - if active, case .error = state { + guard active else { + return + } + + switch state { + case .error: + store.processQueries() state = .loading + case .directoryEntry(let entry): store.processQueries() + state = .directoryEntry(entry) + default: + break } } }