From d2b4dcbce451dce035650646529979ad7220c7a0 Mon Sep 17 00:00:00 2001 From: SirStendec Date: Fri, 17 Nov 2017 03:12:08 -0500 Subject: [PATCH] Attempt at fixing caching issues with Apollo for the stream up-time display, as well as adding a re-usable function for grabbing data from Apollo. --- src/modules/metadata.js | 16 ++------- src/utilities/compat/apollo.js | 61 +++++++++++++++++++++++++++++++++- 2 files changed, 62 insertions(+), 15 deletions(-) diff --git a/src/modules/metadata.js b/src/modules/metadata.js index 5181b37d..05e45395 100644 --- a/src/modules/metadata.js +++ b/src/modules/metadata.js @@ -60,20 +60,8 @@ export default class Metadata extends Module { setup() { const socket = this.resolve('socket'), - query = this.resolve('site.apollo').getQuery('ChannelPage_ChannelInfoBar_User'), - result = query && query.lastResult, - created_at = result && get('data.user.stream.createdAt', result); - - if ( ! query ) - return {}; - - if ( created_at === undefined && ! query._ffz_refetched ) { - query._ffz_refetched = true; - if ( result ) - result.stale = true; - query.refetch(); - return {}; - } + apollo = this.resolve('site.apollo'), + created_at = apollo.getFromQuery('ChannelPage_ChannelInfoBar_User', 'data.user.stream.createdAt'); if ( ! created_at ) return {}; diff --git a/src/utilities/compat/apollo.js b/src/utilities/compat/apollo.js index f1d201ba..fa0857a9 100644 --- a/src/utilities/compat/apollo.js +++ b/src/utilities/compat/apollo.js @@ -6,7 +6,7 @@ // ============================================================================ import Module from 'utilities/module'; -import {has} from 'utilities/object'; +import {has, get} from 'utilities/object'; export default class Apollo extends Module { constructor(...args) { @@ -264,6 +264,65 @@ export default class Apollo extends Module { return query && query.observableQuery; } + + ensureQuery(operation, predicate, delay = 500, retry_wait = 120000) { + const query = this.getQuery(operation); + + if ( query ) { + const result = query.lastResult; + let passed; + if ( ! result ) + passed = false; + else if ( result.loading ) + passed = true; + else if ( typeof predicate === 'function' ) + passed = predicate(result); + else + passed = get(predicate, result) !== undefined; + + if ( ! passed && Date.now() - (query._ffz_last_retry || 0) >= retry_wait ) { + query._ffz_last_retry = Date.now(); + if ( delay === 0 ) + query.refetch(); + else if ( delay > 0 ) + setTimeout(() => query.refetch(), delay); + } + } + + return query; + } + + + getFromQuery(operation, predicate, delay = 500, retry_wait = 120000) { + const query = this.getQuery(operation), + result = query && query.lastResult; + + if ( ! query ) + return undefined; + + let out; + + if ( result ) { + if ( typeof predicate === 'function' ) + out = predicate(result); + else + out = get(predicate, result) + + if ( result.loading ) + return undefined; + } + + if ( out === undefined && Date.now() - (query._ffz_last_retry || 0) >= retry_wait ) { + query._ffz_last_retry = Date.now(); + if ( delay === 0 ) + query.refetch(); + else if ( delay > 0 ) + setTimeout(() => query.refetch(), delay); + } + + return out; + } + }