From 8a27d9e977d283b9397fd1ffe1098e582d376109 Mon Sep 17 00:00:00 2001 From: Hossein Mehrabi Date: Thu, 31 Aug 2023 15:08:15 +0330 Subject: [PATCH] refactor: unbody service initial data loader --- src/services/unbody/unbody.service.ts | 28 ++++++++++----------------- 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/src/services/unbody/unbody.service.ts b/src/services/unbody/unbody.service.ts index 6b1ac10..b63255f 100644 --- a/src/services/unbody/unbody.service.ts +++ b/src/services/unbody/unbody.service.ts @@ -1,5 +1,4 @@ import { ApolloClient, InMemoryCache } from '@apollo/client' -import { minutesToMilliseconds } from 'date-fns' import { CountDocumentsDocument, CountDocumentsQueryVariables, @@ -55,14 +54,13 @@ export class UnbodyService { helpers = UnbodyHelpers lastUpdate: number = 0 - initialDataLastUpdate: number = 0 - initialDataPromise: CreatePromiseResult<(typeof this)['initialData']> = - createPromise() + loadingInitialData: boolean = false initialData: { posts: LPE.Post.Document[] staticPages: LPE.StaticPage.Document[] } = { posts: [], staticPages: [] } + initialDataPromise: CreatePromiseResult = null as any constructor(private apiKey: string, private projectId: string) { const cache = new InMemoryCache({ @@ -114,20 +112,17 @@ export class UnbodyService { private checkForUpdates = async () => { const data = await getWebhookData() - if (!data) return - if (data.lastUpdate > this.lastUpdate) { + if (!this.loadingInitialData && data && data.lastUpdate > this.lastUpdate) { this.lastUpdate = data.lastUpdate - await this.clearCache() this.loadInitialData(true) } setTimeout(this.checkForUpdates, 1000) } - private _loadInitialData = async () => { - this.initialDataLastUpdate = +new Date() - + private _loadInitialData = async (callback: (data: any) => void) => { + this.loadingInitialData = true const articles: LPE.Article.Data[] = await this.fetchAllArticles() const episodes: LPE.Podcast.Document[] = await this.fetchAllEpisodes() const staticPages = await this.fetchAllStaticPages() @@ -140,22 +135,19 @@ export class UnbodyService { posts, staticPages, } - - this.initialDataPromise.resolve({ posts, staticPages }) + callback(this.initialData) + this.loadingInitialData = false } loadInitialData = async (forced: boolean = false) => { - if ( - forced || - +new Date() - this.initialDataLastUpdate > minutesToMilliseconds(10) - ) { - console.log('load initial data') + if (forced) { this.initialDataPromise && this.initialDataPromise.resolve(this.initialData) this.initialDataPromise = createPromise() + await this.clearCache() - this._loadInitialData() + this._loadInitialData(this.initialDataPromise.callback) } return this.initialDataPromise.promise