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; + } + }