From 214d8fdabbbe9acb7fa7119d83922d778dd2a69c Mon Sep 17 00:00:00 2001 From: Stephenie Harris Date: Wed, 18 May 2022 17:15:27 -0600 Subject: [PATCH 1/5] Use method that returns cached prompt. --- .../Floating Create Button/CreateButtonCoordinator.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/WordPress/Classes/ViewRelated/System/Floating Create Button/CreateButtonCoordinator.swift b/WordPress/Classes/ViewRelated/System/Floating Create Button/CreateButtonCoordinator.swift index f0e4f9fa2b28..8463bc423b16 100644 --- a/WordPress/Classes/ViewRelated/System/Floating Create Button/CreateButtonCoordinator.swift +++ b/WordPress/Classes/ViewRelated/System/Floating Create Button/CreateButtonCoordinator.swift @@ -309,16 +309,16 @@ private extension CreateButtonCoordinator { // TODO: check for cached prompt first. guard let bloggingPromptsService = bloggingPromptsService else { - DDLogError("FAB > failed creating BloggingPromptsService instance.") + DDLogError("FAB: failed creating BloggingPromptsService instance.") prompt = nil return } - bloggingPromptsService.fetchTodaysPrompt(success: { [weak self] (prompt) in + bloggingPromptsService.todaysPrompt(success: { [weak self] (prompt) in self?.prompt = prompt }, failure: { [weak self] (error) in self?.prompt = nil - DDLogError("FAB > failed fetching blogging prompt: \(String(describing: error))") + DDLogError("FAB: failed fetching blogging prompt: \(String(describing: error))") }) } From 0b50f6891edd1c8cde274a0ce67e259e5b496374 Mon Sep 17 00:00:00 2001 From: Stephenie Harris Date: Wed, 18 May 2022 17:16:48 -0600 Subject: [PATCH 2/5] Add method that returns list prompts from either cache or remote. --- .../Services/BloggingPromptsService.swift | 34 +++++++++++++++++-- .../BloggingPromptsViewController.swift | 2 +- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/WordPress/Classes/Services/BloggingPromptsService.swift b/WordPress/Classes/Services/BloggingPromptsService.swift index f673d2861a15..ccf81a8aa5a5 100644 --- a/WordPress/Classes/Services/BloggingPromptsService.swift +++ b/WordPress/Classes/Services/BloggingPromptsService.swift @@ -6,6 +6,7 @@ class BloggingPromptsService { private let siteID: NSNumber private let remote: BloggingPromptsServiceRemote private let calendar: Calendar = .autoupdatingCurrent + private let maxListPrompts = 11 /// A UTC date formatter that ignores time information. private static var dateFormatter: DateFormatter = { @@ -23,6 +24,12 @@ class BloggingPromptsService { loadPrompts(from: Date(), number: 1).first } + /// Convenience computed variable that returns prompts for the prompts list from local store. + /// + var localListPrompts: [BloggingPrompt] { + loadPrompts(from: listStartDate, number: maxListPrompts) + } + /// Fetches a number of blogging prompts starting from the specified date. /// When no parameters are specified, this method will attempt to return prompts from ten days ago and two weeks ahead. /// @@ -89,10 +96,29 @@ class BloggingPromptsService { /// - failure: Closure to be called when the fetch process failed. func fetchListPrompts(success: @escaping ([BloggingPrompt]) -> Void, failure: @escaping (Error?) -> Void) { - let fromDate = calendar.date(byAdding: .day, value: -9, to: Date()) ?? Date() - fetchPrompts(from: fromDate, number: 11, success: success, failure: failure) + fetchPrompts(from: listStartDate, number: maxListPrompts, success: success, failure: failure) } + /// Convenience method to obtain the blogging prompts for the prompts list, + /// either from local cache or remote. + /// + /// - Parameters: + /// - success: Closure to be called when the fetch process succeeded. + /// - failure: Closure to be called when the fetch process failed. + func listPrompts(success: @escaping ([BloggingPrompt]) -> Void, + failure: @escaping (Error?) -> Void) { + + // If there aren't maxListPrompts cached, need to fetch more. + guard localListPrompts.count < maxListPrompts else { + success(localListPrompts) + return + } + + fetchListPrompts(success: success, failure: failure) + } + + // MARK: - Init + required init?(contextManager: CoreDataStack = ContextManager.shared, remote: BloggingPromptsServiceRemote? = nil, blog: Blog? = nil) { @@ -115,6 +141,10 @@ private extension BloggingPromptsService { calendar.date(byAdding: .day, value: -10, to: Date()) ?? Date() } + var listStartDate: Date { + calendar.date(byAdding: .day, value: -(maxListPrompts - 2), to: Date()) ?? Date() + } + /// Converts the given date to UTC and ignores the time information. /// Example: Given `2022-05-01 03:00:00 UTC-5`, this should return `2022-05-01 00:00:00 UTC`. /// diff --git a/WordPress/Classes/ViewRelated/Blog/Blogging Prompts/BloggingPromptsViewController.swift b/WordPress/Classes/ViewRelated/Blog/Blogging Prompts/BloggingPromptsViewController.swift index 94fc074836b5..2e41d6249cf7 100644 --- a/WordPress/Classes/ViewRelated/Blog/Blogging Prompts/BloggingPromptsViewController.swift +++ b/WordPress/Classes/ViewRelated/Blog/Blogging Prompts/BloggingPromptsViewController.swift @@ -116,7 +116,7 @@ private extension BloggingPromptsViewController { isLoading = true - bloggingPromptsService.fetchListPrompts(success: { [weak self] (prompts) in + bloggingPromptsService.listPrompts(success: { [weak self] (prompts) in self?.isLoading = false self?.prompts = prompts.sorted(by: { $0.date.compare($1.date) == .orderedDescending }) }, failure: { [weak self] (error) in From d1600e8a8633e5ed3c05af3a37859aa38d68faa8 Mon Sep 17 00:00:00 2001 From: Stephenie Harris Date: Wed, 18 May 2022 17:17:15 -0600 Subject: [PATCH 3/5] Add temporary logging to facilitate testing. --- WordPress/Classes/Services/BloggingPromptsService.swift | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/WordPress/Classes/Services/BloggingPromptsService.swift b/WordPress/Classes/Services/BloggingPromptsService.swift index ccf81a8aa5a5..ba972e3052b1 100644 --- a/WordPress/Classes/Services/BloggingPromptsService.swift +++ b/WordPress/Classes/Services/BloggingPromptsService.swift @@ -81,10 +81,11 @@ class BloggingPromptsService { func todaysPrompt(success: @escaping (BloggingPrompt?) -> Void, failure: @escaping (Error?) -> Void) { guard localTodaysPrompt == nil else { + print("🔴 todaysPrompt > returning local.") success(localTodaysPrompt) return } - + print("🔴 todaysPrompt > fetching.") fetchTodaysPrompt(success: success, failure: failure) } @@ -110,10 +111,12 @@ class BloggingPromptsService { // If there aren't maxListPrompts cached, need to fetch more. guard localListPrompts.count < maxListPrompts else { + print("🔴 listPrompts > returning local.") success(localListPrompts) return } + print("🔴 listPrompts > fetching.") fetchListPrompts(success: success, failure: failure) } From b55ef2cbc21852ed5bf8139a431b3802cd696784 Mon Sep 17 00:00:00 2001 From: Stephenie Harris Date: Wed, 18 May 2022 18:50:47 -0600 Subject: [PATCH 4/5] Remove TODO. --- .../Blog/Blogging Prompts/BloggingPromptsViewController.swift | 2 -- 1 file changed, 2 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Blog/Blogging Prompts/BloggingPromptsViewController.swift b/WordPress/Classes/ViewRelated/Blog/Blogging Prompts/BloggingPromptsViewController.swift index 2e41d6249cf7..d285c7ed02ee 100644 --- a/WordPress/Classes/ViewRelated/Blog/Blogging Prompts/BloggingPromptsViewController.swift +++ b/WordPress/Classes/ViewRelated/Blog/Blogging Prompts/BloggingPromptsViewController.swift @@ -106,8 +106,6 @@ private extension BloggingPromptsViewController { } func fetchPrompts() { - // TODO: show cached prompts first. - guard let bloggingPromptsService = bloggingPromptsService else { DDLogError("Failed creating BloggingPromptsService instance.") showErrorView() From 23679f2cfb766230107541bfe6eaf0b2c581480d Mon Sep 17 00:00:00 2001 From: Stephenie Harris Date: Thu, 19 May 2022 15:04:09 -0600 Subject: [PATCH 5/5] Remove test prints. --- WordPress/Classes/Services/BloggingPromptsService.swift | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/WordPress/Classes/Services/BloggingPromptsService.swift b/WordPress/Classes/Services/BloggingPromptsService.swift index ba972e3052b1..ccf81a8aa5a5 100644 --- a/WordPress/Classes/Services/BloggingPromptsService.swift +++ b/WordPress/Classes/Services/BloggingPromptsService.swift @@ -81,11 +81,10 @@ class BloggingPromptsService { func todaysPrompt(success: @escaping (BloggingPrompt?) -> Void, failure: @escaping (Error?) -> Void) { guard localTodaysPrompt == nil else { - print("🔴 todaysPrompt > returning local.") success(localTodaysPrompt) return } - print("🔴 todaysPrompt > fetching.") + fetchTodaysPrompt(success: success, failure: failure) } @@ -111,12 +110,10 @@ class BloggingPromptsService { // If there aren't maxListPrompts cached, need to fetch more. guard localListPrompts.count < maxListPrompts else { - print("🔴 listPrompts > returning local.") success(localListPrompts) return } - print("🔴 listPrompts > fetching.") fetchListPrompts(success: success, failure: failure) }