import React, { useEffect } from 'react'; import { Box, Divider, Flex, Stack, Center, Text, Button, Input, InputGroup, InputRightElement, useToast, } from '@chakra-ui/react'; import { useClient } from 'urql'; import { FaGoogle, FaGithub, FaFacebookF, FaSave, FaRegEyeSlash, FaRegEye, } from 'react-icons/fa'; import _ from 'lodash'; import InputField from '../components/InputField'; import { EnvVariablesQuery } from '../graphql/queries'; import { ArrayInputType, SelectInputType, HiddenInputType, TextInputType, TextAreaInputType, SwitchInputType, HMACEncryptionType, RSAEncryptionType, ECDSAEncryptionType, envVarTypes, } from '../constants'; import { UpdateEnvVariables } from '../graphql/mutation'; import { getObjectDiff, capitalizeFirstLetter } from '../utils'; import GenerateKeysModal from '../components/GenerateKeysModal'; export default function Environment() { const client = useClient(); const toast = useToast(); const [adminSecret, setAdminSecret] = React.useState< Record >({ value: '', disableInputField: true, }); const [loading, setLoading] = React.useState(true); const [envVariables, setEnvVariables] = React.useState({ GOOGLE_CLIENT_ID: '', GOOGLE_CLIENT_SECRET: '', GITHUB_CLIENT_ID: '', GITHUB_CLIENT_SECRET: '', FACEBOOK_CLIENT_ID: '', FACEBOOK_CLIENT_SECRET: '', ROLES: [], DEFAULT_ROLES: [], PROTECTED_ROLES: [], JWT_TYPE: '', JWT_SECRET: '', JWT_ROLE_CLAIM: '', JWT_PRIVATE_KEY: '', JWT_PUBLIC_KEY: '', REDIS_URL: '', SMTP_HOST: '', SMTP_PORT: '', SMTP_USERNAME: '', SMTP_PASSWORD: '', SENDER_EMAIL: '', ALLOWED_ORIGINS: [], ORGANIZATION_NAME: '', ORGANIZATION_LOGO: '', CUSTOM_ACCESS_TOKEN_SCRIPT: '', ADMIN_SECRET: '', DISABLE_LOGIN_PAGE: false, DISABLE_MAGIC_LINK_LOGIN: false, DISABLE_EMAIL_VERIFICATION: false, DISABLE_BASIC_AUTHENTICATION: false, DISABLE_SIGN_UP: false, OLD_ADMIN_SECRET: '', DATABASE_NAME: '', DATABASE_TYPE: '', DATABASE_URL: '', }); const [fieldVisibility, setFieldVisibility] = React.useState< Record >({ GOOGLE_CLIENT_SECRET: false, GITHUB_CLIENT_SECRET: false, FACEBOOK_CLIENT_SECRET: false, JWT_SECRET: false, SMTP_PASSWORD: false, ADMIN_SECRET: false, OLD_ADMIN_SECRET: false, }); async function getData() { const { data: { _env: envData }, } = await client.query(EnvVariablesQuery).toPromise(); setLoading(false); setEnvVariables({ ...envData, OLD_ADMIN_SECRET: envData.ADMIN_SECRET, ADMIN_SECRET: '', }); setAdminSecret({ value: '', disableInputField: true, }); } useEffect(() => { getData(); }, []); const validateAdminSecretHandler = (event: any) => { if (envVariables.OLD_ADMIN_SECRET === event.target.value) { setAdminSecret({ ...adminSecret, value: event.target.value, disableInputField: false, }); } else { setAdminSecret({ ...adminSecret, value: event.target.value, disableInputField: true, }); } if (envVariables.ADMIN_SECRET !== '') { setEnvVariables({ ...envVariables, ADMIN_SECRET: '' }); } }; const saveHandler = async () => { setLoading(true); const { data: { _env: envData }, } = await client.query(EnvVariablesQuery).toPromise(); const diff = getObjectDiff(envVariables, envData); const updatedEnvVariables = diff.reduce( (acc: any, property: string) => ({ ...acc, // @ts-ignore [property]: envVariables[property], }), {} ); if ( updatedEnvVariables[HiddenInputType.ADMIN_SECRET] === '' || updatedEnvVariables[HiddenInputType.OLD_ADMIN_SECRET] !== envData.ADMIN_SECRET ) { delete updatedEnvVariables.OLD_ADMIN_SECRET; delete updatedEnvVariables.ADMIN_SECRET; } delete updatedEnvVariables.DATABASE_URL; delete updatedEnvVariables.DATABASE_TYPE; delete updatedEnvVariables.DATABASE_NAME; const res = await client .mutation(UpdateEnvVariables, { params: updatedEnvVariables }) .toPromise(); setLoading(false); if (res.error) { toast({ title: capitalizeFirstLetter(res.error.message), isClosable: true, status: 'error', position: 'bottom-right', }); return; } setAdminSecret({ value: '', disableInputField: true, }); toast({ title: `Successfully updated ${ Object.keys(updatedEnvVariables).length } variables`, isClosable: true, status: 'success', position: 'bottom-right', }); }; return ( Your instance information Client ID
{}} inputType={TextInputType.CLIENT_ID} placeholder="Client ID" isDisabled={true} />
Client Secret
Social Media Logins
Roles Roles:
Default Roles:
Protected Roles:
JWT (JSON Web Tokens) Configurations JWT Type: {Object.values(HMACEncryptionType).includes(envVariables.JWT_TYPE) ? ( JWT Secret
) : ( <> Public Key
Private Key
)} JWT Role Claim:
Session Storage Redis URL:
Email Configurations SMTP Host:
SMTP Port:
SMTP Username:
SMTP Password:
From Email:
White Listing Allowed Origins:
Organization Information Organization Name:
Organization Logo:
Custom Access Token Scripts
Disable Features Disable Login Page: Disable Email Verification: Disable Magic Login Link: Disable Basic Authentication: Disable Sign Up: Danger Note: Database related environment variables cannot be updated from dashboard :( DataBase Name:
DataBase Type:
DataBase URL:
Old Admin Secret:
validateAdminSecretHandler(event)} type={ !fieldVisibility[HiddenInputType.OLD_ADMIN_SECRET] ? 'password' : 'text' } /> {fieldVisibility[HiddenInputType.OLD_ADMIN_SECRET] ? (
setFieldVisibility({ ...fieldVisibility, [HiddenInputType.OLD_ADMIN_SECRET]: false, }) } >
) : (
setFieldVisibility({ ...fieldVisibility, [HiddenInputType.OLD_ADMIN_SECRET]: true, }) } >
)} } />
New Admin Secret:
); }