Submit
Path:
~
/
/
usr
/
share
/
grafana
/
public
/
app
/
core
/
components
/
Signup
/
File Content:
SignupPage.tsx
import React from 'react'; import { useForm } from 'react-hook-form'; import { getBackendSrv } from '@grafana/runtime'; import { Field, Input, Button, LinkButton, Stack } from '@grafana/ui'; import { getConfig } from 'app/core/config'; import { useAppNotification } from 'app/core/copy/appNotification'; import { GrafanaRouteComponentProps } from 'app/core/navigation/types'; import { w3cStandardEmailValidator } from 'app/features/admin/utils'; import { InnerBox, LoginLayout } from '../Login/LoginLayout'; import { PasswordField } from '../PasswordField/PasswordField'; interface SignupDTO { name?: string; email: string; username: string; orgName?: string; password: string; code: string; confirm?: string; } interface QueryParams { email?: string; code?: string; } interface Props extends GrafanaRouteComponentProps<{}, QueryParams> {} export const SignupPage = ({ queryParams }: Props) => { const notifyApp = useAppNotification(); const { handleSubmit, formState: { errors }, register, getValues, } = useForm<SignupDTO>({ defaultValues: { email: queryParams.email, code: queryParams.code } }); const onSubmit = async (formData: SignupDTO) => { if (formData.name === '') { delete formData.name; } delete formData.confirm; const response = await getBackendSrv() .post('/api/user/signup/step2', { email: formData.email, code: formData.code, username: formData.email, orgName: formData.orgName, password: formData.password, name: formData.name, }) .catch((err) => { const msg = err.data?.message || err; notifyApp.warning(msg); }); if (response.code === 'redirect-to-select-org') { window.location.assign(getConfig().appSubUrl + '/profile/select-org?signup=1'); } window.location.assign(getConfig().appSubUrl + '/'); }; return ( <LoginLayout> <InnerBox> <form onSubmit={handleSubmit(onSubmit)} style={{ width: '100%' }}> <Field label="Your name"> <Input id="user-name" {...register('name')} placeholder="(optional)" /> </Field> <Field label="Email" invalid={!!errors.email} error={errors.email?.message}> <Input id="email" {...register('email', { required: 'Email is required', pattern: { value: w3cStandardEmailValidator, message: 'Email is invalid', }, })} type="email" placeholder="Email" /> </Field> {!getConfig().autoAssignOrg && ( <Field label="Org. name"> <Input id="org-name" {...register('orgName')} placeholder="Org. name" /> </Field> )} {getConfig().verifyEmailEnabled && ( <Field label="Email verification code (sent to your email)"> <Input id="verification-code" {...register('code')} placeholder="Code" /> </Field> )} <Field label="Password" invalid={!!errors.password} error={errors?.password?.message}> <PasswordField id="new-password" autoFocus autoComplete="new-password" {...register('password', { required: 'Password is required' })} /> </Field> <Field label="Confirm password" invalid={!!errors.confirm} error={errors?.confirm?.message}> <PasswordField id="confirm-new-password" autoComplete="new-password" {...register('confirm', { required: 'Confirmed password is required', validate: (v) => v === getValues().password || 'Passwords must match!', })} /> </Field> <Stack> <Button type="submit">Submit</Button> <LinkButton fill="text" href={getConfig().appSubUrl + '/login'}> Back to login </LinkButton> </Stack> </form> </InnerBox> </LoginLayout> ); }; export default SignupPage;
Edit
Rename
Chmod
Delete
FILE
FOLDER
INFO
Name
Size
Permission
Action
SignupPage.test.tsx
4293 bytes
0644
SignupPage.tsx
4175 bytes
0644
VerifyEmail.tsx
2143 bytes
0644
VerifyEmailPage.test.tsx
2555 bytes
0644
VerifyEmailPage.tsx
324 bytes
0644
N4ST4R_ID | Naxtarrr