Created
November 18, 2022 02:44
-
-
Save brandonpittman/5db56ca398ec6e78cea6b3b9d3472ac6 to your computer and use it in GitHub Desktop.
Handle invalid SearchParams with Conform
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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