@epfl-si/react-graphql-paginated
Version:
Like @epfl-si/react-graphql-simple, but with pagination / infinite queries
122 lines (119 loc) • 7.29 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.QueryClientGraphQLProvider = void 0;
exports.relayStylePagination = relayStylePagination;
exports.useInfiniteGraphQLQuery = useInfiniteGraphQLQuery;
require("core-js/modules/es.promise.js");
require("core-js/modules/web.dom-collections.iterator.js");
require("core-js/modules/es.symbol.description.js");
var React = _interopRequireWildcard(require("react"));
var _reactQuery = require("@tanstack/react-query");
var _reactGraphqlSimple = require("@epfl-si/react-graphql-simple");
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } /**
* A mix of @link ./graphql-provider.ts and `@tanstack/react-query`
*/
/**
* A convenient nesting of `<QueryClientProvider>...</QueryClientProvider>` and
* `<GraphQLProvider>`...`</GraphQLProvider>`
*/
const QueryClientGraphQLProvider = props => {
const {
current
} = (0, React.useRef)({
queryClient: props.queryClient
});
if (!current.queryClient) current.queryClient = new _reactQuery.QueryClient();
return /*#__PURE__*/React.createElement(_reactGraphqlSimple.GraphQLProvider, props, /*#__PURE__*/React.createElement(_reactQuery.QueryClientProvider, {
client: current.queryClient
}, props.children));
};
/**
* A convenient mix of `useGraphQLClient` and `useInfiniteQuery`.
*/
exports.QueryClientGraphQLProvider = QueryClientGraphQLProvider;
function useInfiniteGraphQLQuery(gql, variables, opts) {
if (variables && opts === undefined && looksLikeOptions(variables)) {
opts = variables;
variables = undefined;
}
if (!variables) variables = {};
// Disable most bells and whistles by default:
opts = _objectSpread({
networkMode: 'always',
// 127.0.0.1 is a thing mmkay
retry: false,
refetchOnMount: false,
refetchOnReconnect: false,
refetchOnWindowFocus: false
}, opts);
const clientPromise = (0, _reactGraphqlSimple.useGraphQLClient)();
return (0, _reactQuery.useInfiniteQuery)([gql, variables], async _ref => {
let {
pageParam = {}
} = _ref;
const client = await clientPromise;
try {
return client.request(gql, _objectSpread(_objectSpread({}, variables), pageParam));
} catch (e) {
console.error(e);
throw e;
}
}, opts);
}
function looksLikeOptions(someDict) {
return Object.keys(someDict).map(k => someDict[k]).some(f => typeof f === "function");
}
function relayStylePagination(opts) {
let {
direction,
cursorVariableName
} = opts || {};
if (!direction) direction = 'forward';
if (!cursorVariableName) cursorVariableName = 'cursor';
const api = {};
if (direction === 'forward' || direction === 'bidirectional') {
api.getNextPageParam = data => {
const endCursor = findPageInfo(data).endCursor;
if (!endCursor) return undefined;
let retval = {};
retval[cursorVariableName] = endCursor;
return retval;
};
}
if (direction === 'backward' || direction === 'bidirectional') {
api.getPreviousPageParam = data => {
const startCursor = findPageInfo(data).startCursor;
if (!startCursor) return undefined;
let retval = {};
retval[cursorVariableName] = startCursor;
return retval;
};
}
return api;
}
function findPageInfo(someDict) {
if (someDict !== null && someDict !== void 0 && someDict.pageInfo) return someDict.pageInfo;
const pageInfos = [];
for (let k of Object.keys(someDict)) {
const v = someDict[k];
if (v && v.pageInfo) {
pageInfos.push(v.pageInfo);
}
}
if (pageInfos.length === 1) {
return pageInfos[0];
} else if (pageInfos.length === 0) {
throw new Error("Unable to find `pageInfo` in first level of structure");
} else {
throw new Error("Found multiple `pageInfo`s in first level of structure");
}
}
//# sourceMappingURL=graphql-paginated.js.map