apollo-client-rxjs
Version:
Adds RxJS to ApolloClient
53 lines • 2.09 kB
JavaScript
import { Observable } from 'rxjs/Observable';
import { switchMap } from 'rxjs/operator/switchMap';
import { combineLatest } from 'rxjs/observable/combineLatest';
import { omit } from './helpers';
import { ObservableQueryRef } from './ObservableQueryRef';
import { RxObservableQuery } from '../RxObservableQuery';
export function createWithObservableVariables(options, mapFn) {
var observableQueryRef = new ObservableQueryRef();
var varObs = observeVariables(options.variables);
return new RxObservableQuery(observableQueryRef, function (subscriber) {
var sub = switchMap.call(varObs, (function (newVariables) {
var cleanOptions = omit(options, 'variables');
var newOptions = Object.assign(cleanOptions, { variables: newVariables });
observableQueryRef.setRef(mapFn(newOptions));
return observableQueryRef.getRef();
})).subscribe(subscriber);
return function () { return sub.unsubscribe(); };
});
}
export function observeVariables(variables) {
var keys = Object.keys(variables);
return Observable.create(function (observer) {
combineLatest.call(undefined, mapVariablesToObservables(variables))
.subscribe(function (values) {
var resultVariables = {};
values.forEach(function (value, i) {
var key = keys[i];
resultVariables[key] = value;
});
observer.next(resultVariables);
});
});
}
function mapVariablesToObservables(variables) {
return Object.keys(variables)
.map(function (key) { return getVariableToObservable(variables[key]); });
}
function getVariableToObservable(variable) {
if (variable instanceof Observable) {
return variable;
}
else if (typeof variable !== 'undefined') {
return new Observable(function (subscriber) {
subscriber.next(variable);
});
}
else {
return new Observable(function (subscriber) {
subscriber.next(null);
});
}
}
//# sourceMappingURL=variables.js.map