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, } from '../constants'; import { UpdateEnvVariables } from '../graphql/mutation'; import { getObjectDiff, capitalizeFirstLetter } from '../utils'; interface envVarTypes { GOOGLE_CLIENT_ID: string; GOOGLE_CLIENT_SECRET: string; GITHUB_CLIENT_ID: string; GITHUB_CLIENT_SECRET: string; FACEBOOK_CLIENT_ID: string; FACEBOOK_CLIENT_SECRET: string; ROLES: [string] | []; DEFAULT_ROLES: [string] | []; PROTECTED_ROLES: [string] | []; JWT_TYPE: string; JWT_SECRET: string; JWT_ROLE_CLAIM: string; JWT_PRIVATE_KEY: string; JWT_PUBLIC_KEY: string; REDIS_URL: string; SMTP_HOST: string; SMTP_PORT: string; SMTP_USERNAME: string; SMTP_PASSWORD: string; SENDER_EMAIL: string; ALLOWED_ORIGINS: [string] | []; ORGANIZATION_NAME: string; ORGANIZATION_LOGO: string; CUSTOM_ACCESS_TOKEN_SCRIPT: string; ADMIN_SECRET: string; DISABLE_LOGIN_PAGE: boolean; DISABLE_MAGIC_LINK_LOGIN: boolean; DISABLE_EMAIL_VERIFICATION: boolean; DISABLE_BASIC_AUTHENTICATION: boolean; OLD_ADMIN_SECRET: string; DATABASE_NAME: string; DATABASE_TYPE: string; DATABASE_URL: string; } 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, 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, }); useEffect(() => { let isMounted = true; async function getData() { const { data: { _env: envData }, } = await client.query(EnvVariablesQuery).toPromise(); if (isMounted) { setLoading(false); setEnvVariables({ ...envData, OLD_ADMIN_SECRET: envData.ADMIN_SECRET, ADMIN_SECRET: '', }); setAdminSecret({ value: '', disableInputField: true, }); } } getData(); return () => { isMounted = false; }; }, []); 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 ( 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: 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:
); }