Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 11 additions & 5 deletions src/data/action.ts
Original file line number Diff line number Diff line change
Expand Up @@ -412,7 +412,7 @@ let flightApplications = 0;
export function setupFlightDataConsumer(router: RouterContext) {
return subscribeFlightData<Record<string, any>>((data, { response }) => {
flightApplications++;
return applyResponseMetadata(response, router.navigatorFactory(), data);
applyResponseMetadata(response, router.navigatorFactory(), data);
});
}

Expand All @@ -427,12 +427,14 @@ function applyResponseMetadata(
metadata: Response | undefined,
navigate: Navigator,
flightData?: Record<string, any>
) {
): boolean {
let redirected = false;
let keys: string[] | undefined;
if (metadata) {
if (metadata.headers.has("X-Revalidate"))
keys = metadata.headers.get("X-Revalidate")!.split(",");
if (metadata.headers.has("Location")) {
redirected = true;
const locationUrl = metadata.headers.get("Location") || "/";
if (locationUrl.startsWith("http")) {
window.location.href = locationUrl;
Expand All @@ -447,6 +449,8 @@ function applyResponseMetadata(
flightData && Object.keys(flightData).forEach(k => query.set(k, flightData[k]));
// trigger revalidation
revalidate(keys, false);

return redirected;
}

async function handleResponse(
Expand Down Expand Up @@ -482,7 +486,9 @@ async function handleResponse(
// The transport consumer applies metadata before returning a server
// function's unwrapped value. Do not treat that value as a second plain
// action response and invalidate the freshly seeded query cache again.
if (!metadataHandled || metadata || flightData)
applyResponseMetadata(metadata, navigate, flightData);
return data != null ? { data } : undefined;
if (!metadataHandled || metadata || flightData) {
if (applyResponseMetadata(metadata, navigate, flightData))
return undefined;
}
return { data };
}
Loading