UNPKG

next

Version:

The React Framework

105 lines (103 loc) 4.93 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); 0 && (module.exports = { addRefreshMarkerToActiveParallelSegments: null, refreshInactiveParallelSegments: null }); function _export(target, all) { for(var name in all)Object.defineProperty(target, name, { enumerable: true, get: all[name] }); } _export(exports, { addRefreshMarkerToActiveParallelSegments: function() { return addRefreshMarkerToActiveParallelSegments; }, refreshInactiveParallelSegments: function() { return refreshInactiveParallelSegments; } }); const _applyflightdata = require("./apply-flight-data"); const _fetchserverresponse = require("./fetch-server-response"); const _segment = require("../../../shared/lib/segment"); async function refreshInactiveParallelSegments(options) { const fetchedSegments = new Set(); await refreshInactiveParallelSegmentsImpl({ ...options, rootTree: options.updatedTree, fetchedSegments }); } async function refreshInactiveParallelSegmentsImpl(param) { let { navigatedAt, state, updatedTree, updatedCache, includeNextUrl, fetchedSegments, rootTree = updatedTree, canonicalUrl } = param; const [, parallelRoutes, refetchPath, refetchMarker] = updatedTree; const fetchPromises = []; if (refetchPath && refetchPath !== canonicalUrl && refetchMarker === 'refresh' && // it's possible for the tree to contain multiple segments that contain data at the same URL // we keep track of them so we can dedupe the requests !fetchedSegments.has(refetchPath)) { fetchedSegments.add(refetchPath) // Mark this URL as fetched ; // Eagerly kick off the fetch for the refetch path & the parallel routes. This should be fine to do as they each operate // independently on their own cache nodes, and `applyFlightData` will copy anything it doesn't care about from the existing cache. const fetchPromise = (0, _fetchserverresponse.fetchServerResponse)(new URL(refetchPath, location.origin), { // refetch from the root of the updated tree, otherwise it will be scoped to the current segment // and might not contain the data we need to patch in interception route data (such as dynamic params from a previous segment) flightRouterState: [ rootTree[0], rootTree[1], rootTree[2], 'refetch' ], nextUrl: includeNextUrl ? state.nextUrl : null }).then((param)=>{ let { flightData } = param; if (typeof flightData !== 'string') { for (const flightDataPath of flightData){ // we only pass the new cache as this function is called after clearing the router cache // and filling in the new page data from the server. Meaning the existing cache is actually the cache that's // just been created & has been written to, but hasn't been "committed" yet. (0, _applyflightdata.applyFlightData)(navigatedAt, updatedCache, updatedCache, flightDataPath); } } else { // When flightData is a string, it suggests that the server response should have triggered an MPA navigation // I'm not 100% sure of this decision, but it seems unlikely that we'd want to introduce a redirect side effect // when refreshing on-screen data, so handling this has been ommitted. } }); fetchPromises.push(fetchPromise); } for(const key in parallelRoutes){ const parallelFetchPromise = refreshInactiveParallelSegmentsImpl({ navigatedAt, state, updatedTree: parallelRoutes[key], updatedCache, includeNextUrl, fetchedSegments, rootTree, canonicalUrl }); fetchPromises.push(parallelFetchPromise); } await Promise.all(fetchPromises); } function addRefreshMarkerToActiveParallelSegments(tree, path) { const [segment, parallelRoutes, , refetchMarker] = tree; // a page segment might also contain concatenated search params, so we do a partial match on the key if (segment.includes(_segment.PAGE_SEGMENT_KEY) && refetchMarker !== 'refresh') { tree[2] = path; tree[3] = 'refresh'; } for(const key in parallelRoutes){ addRefreshMarkerToActiveParallelSegments(parallelRoutes[key], path); } } if ((typeof exports.default === 'function' || (typeof exports.default === 'object' && exports.default !== null)) && typeof exports.default.__esModule === 'undefined') { Object.defineProperty(exports.default, '__esModule', { value: true }); Object.assign(exports.default, exports); module.exports = exports.default; } //# sourceMappingURL=refetch-inactive-parallel-segments.js.map