Skip to content

Instantly share code, notes, and snippets.

@brandonpittman
Created November 18, 2022 02:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save brandonpittman/5db56ca398ec6e78cea6b3b9d3472ac6 to your computer and use it in GitHub Desktop.
Save brandonpittman/5db56ca398ec6e78cea6b3b9d3472ac6 to your computer and use it in GitHub Desktop.
Handle invalid SearchParams with Conform
let removeInvalidSearchParams = (
error: unknown,
request: Request,
prefix = "Unrecognized key(s) in object:"
) => {
let unrecongnizedKeysSchema = z.tuple([
z.tuple([z.string().length(0), z.string().startsWith(prefix)]),
]);
let result = unrecongnizedKeysSchema.safeParse(formatError(error));
if (result.success) {
let url = new URL(request.url);
let params = url.searchParams;
let next = new URLSearchParams(params);
let invalid = result.data[0][1]
.split(prefix)[1]
.split(", ")
.map((v) => v.replaceAll("'", ""))
.map((v) => v.trim());
for (let name of invalid) {
next.delete(name);
}
return next;
}
};
export const loader = async ({ request }: LoaderArgs) => {
let session = await getSession(request);
let idToken = await requireUser(request, session);
let url = new URL(request.url);
let searchParams = url.searchParams;
let submission = parse(searchParams);
try {
conditionsSchema.strict().parse(submission.value);
} catch (error) {
session.flash("globalMessage", "Invalid search conditions.");
session.flash("globalMessageVariant", "negative");
let next = removeInvalidSearchParams(error, request);
if (next) {
throw redirect(`${url.pathname}?${next.toString()}`, {
headers: {
"Set-Cookie": await commitSession(session),
},
});
} else {
throw redirectBack(request, {
fallback: route("/reports"),
headers: {
"Set-Cookie": await commitSession(session),
},
});
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment