1
0
Fork 0
mirror of https://github.com/FrankerFaceZ/FrankerFaceZ.git synced 2025-08-07 23:00:54 +00:00

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.

This commit is contained in:
SirStendec 2017-11-17 03:12:08 -05:00
parent 863eafd32f
commit d2b4dcbce4
2 changed files with 62 additions and 15 deletions

View file

@ -60,20 +60,8 @@ export default class Metadata extends Module {
setup() { setup() {
const socket = this.resolve('socket'), const socket = this.resolve('socket'),
query = this.resolve('site.apollo').getQuery('ChannelPage_ChannelInfoBar_User'), apollo = this.resolve('site.apollo'),
result = query && query.lastResult, created_at = apollo.getFromQuery('ChannelPage_ChannelInfoBar_User', 'data.user.stream.createdAt');
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 {};
}
if ( ! created_at ) if ( ! created_at )
return {}; return {};

View file

@ -6,7 +6,7 @@
// ============================================================================ // ============================================================================
import Module from 'utilities/module'; import Module from 'utilities/module';
import {has} from 'utilities/object'; import {has, get} from 'utilities/object';
export default class Apollo extends Module { export default class Apollo extends Module {
constructor(...args) { constructor(...args) {
@ -264,6 +264,65 @@ export default class Apollo extends Module {
return query && query.observableQuery; 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;
}
} }