piral-urql
Version:
Plugin for providing a GraphQL client in Piral.
61 lines • 2 kB
JavaScript
import * as React from 'react';
import { Provider } from 'urql';
import { gqlQuery, gqlMutation, gqlSubscription } from './queries';
import { setupGqlClient } from './setup';
function extendOptions(context, options) {
const originalHeaders = options.headers || {};
const headerPromises = [];
context.emit('before-fetch', {
headers: originalHeaders,
setHeaders(headers) {
if (headers) {
headerPromises.push(headers);
}
},
});
return Promise.all(headerPromises).then((newHeaders) => {
const headers = newHeaders.reduce((obj, header) => {
if (typeof header === 'object' && header) {
return {
...obj,
...header,
};
}
return obj;
}, originalHeaders);
return {
...options,
headers,
};
});
}
function defaultGqlClient() {
if (typeof window !== 'undefined') {
return setupGqlClient();
}
else {
return undefined;
}
}
/**
* Creates new Pilet API extensions for GraphQL.
* @param client The specific urql client to be used, if any.
*/
export function createGqlApi(client = defaultGqlClient()) {
return (context) => {
context.includeProvider(React.createElement(Provider, { value: client }));
return {
query(q, o = {}) {
return extendOptions(context, o).then((options) => gqlQuery(client, q, options));
},
mutate(q, o = {}) {
return extendOptions(context, o).then((options) => gqlMutation(client, q, options));
},
subscribe(q, subscriber, o = {}) {
const unsubscribe = extendOptions(context, o).then((options) => gqlSubscription(client, q, subscriber, options));
return () => unsubscribe.then((cb) => cb());
},
};
};
}
//# sourceMappingURL=create.js.map