import { useMutation } from '@apollo/react-hooks' import { makeStyles } from '@material-ui/core/styles' import base64 from 'base-64' import classnames from 'classnames' import { Field, Form, Formik } from 'formik' import gql from 'graphql-tag' import React, { useState } from 'react' import * as Yup from 'yup' import ErrorMessage from 'src/components/ErrorMessage' import Modal from 'src/components/Modal' import { Button } from 'src/components/buttons' import { TextInput, RadioGroup } from 'src/components/inputs/formik' import { H1, H3, Info2, P, Mono } from 'src/components/typography' import CopyToClipboard from 'src/pages/Transactions/CopyToClipboard' import { urlResolver } from 'src/utils/urlResolver' import styles from '../UserManagement.styles' const useStyles = makeStyles(styles) const CREATE_USER = gql` mutation createRegisterToken($username: String!, $role: String!) { createRegisterToken(username: $username, role: $role) { token expire } } ` const validationSchema = Yup.object().shape({ username: Yup.string() .email('Username field should be in an email format!') .required('Username field is required!'), role: Yup.string().required('Role field is required!') }) const initialValues = { username: '', role: '' } const radioOptions = [ { code: 'user', display: 'Regular user' }, { code: 'superuser', display: 'Superuser' } ] const getErrorMsg = (formikErrors, formikTouched, mutationError) => { if (!formikErrors || !formikTouched) return null if (mutationError) return 'Internal server error' if (formikErrors.username && formikTouched.username) return formikErrors.username return null } const CreateUserModal = ({ state, dispatch }) => { const classes = useStyles() const [usernameField, setUsernameField] = useState('') const [createUserURL, setCreateUserURL] = useState(null) const handleClose = () => { setCreateUserURL(null) dispatch({ type: 'close', payload: 'showCreateUserModal' }) } const [createUser, { error }] = useMutation(CREATE_USER, { onCompleted: ({ createRegisterToken: token }) => { const queryParams = // Pazuz-created register tokens add a field to identify the creator process.env.REACT_APP_BUILD_TARGET === 'LAMASSU' ? `t=${token.token}` : `t=${token.token}&id=${base64.encode(usernameField)}` setCreateUserURL(urlResolver(`/register?${queryParams}`)) } }) const roleClass = (formikErrors, formikTouched) => ({ [classes.error]: formikErrors.role && formikTouched.role }) return ( <> {state.showCreateUserModal && !createUserURL && ( { setUsernameField(values.username) createUser({ variables: { username: values.username, role: values.role } }) }}> {({ errors, touched }) => ( Create new user Role {getErrorMsg(errors, touched, error) && ( {getErrorMsg(errors, touched, error)} )} Finish )} )} {state.showCreateUserModal && createUserURL && ( Creating {usernameField}... Safely share this link with {usernameField} to finish the registration process. {createUserURL} )} > ) } export default CreateUserModal
Safely share this link with {usernameField} to finish the registration process.