Spaces:
Running
Running
import { Button, Container, Stack, TextInput, Title } from "@mantine/core"; | |
import { type FormEvent, useState } from "react"; | |
import { validateAccessKey } from "../../modules/accessKey"; | |
import { addLogEntry } from "../../modules/logEntries"; | |
interface AccessPageState { | |
accessKey: string; | |
error: string; | |
} | |
export default function AccessPage({ | |
onAccessKeyValid, | |
}: { | |
onAccessKeyValid: () => void; | |
}) { | |
const [state, setState] = useState<AccessPageState>({ | |
accessKey: "", | |
error: "", | |
}); | |
const handleSubmit = async (formEvent: FormEvent<HTMLFormElement>) => { | |
formEvent.preventDefault(); | |
setState((prev) => ({ ...prev, error: "" })); | |
try { | |
const isValid = await validateAccessKey(state.accessKey); | |
if (isValid) { | |
addLogEntry("Valid access key entered"); | |
onAccessKeyValid(); | |
} else { | |
setState((prev) => ({ ...prev, error: "Invalid access key" })); | |
addLogEntry("Invalid access key attempt"); | |
} | |
} catch (error) { | |
setState((prev) => ({ ...prev, error: "Error validating access key" })); | |
addLogEntry(`Error validating access key: ${error}`); | |
} | |
}; | |
return ( | |
<Container size="xs"> | |
<Stack p="lg" mih="100vh" justify="center"> | |
<Title order={2} ta="center"> | |
Access Restricted | |
</Title> | |
<form onSubmit={handleSubmit}> | |
<Stack gap="xs"> | |
<TextInput | |
value={state.accessKey} | |
onChange={({ target }) => | |
setState((prev) => ({ ...prev, accessKey: target.value })) | |
} | |
placeholder="Enter your access key to continue" | |
required | |
autoFocus | |
error={state.error} | |
styles={{ | |
input: { | |
textAlign: "center", | |
}, | |
}} | |
/> | |
<Button size="xs" type="submit"> | |
Submit | |
</Button> | |
</Stack> | |
</form> | |
</Stack> | |
</Container> | |
); | |
} | |