2021-09-16 04:19:39 +01:00
import getEgg , { Egg , EggVariable } from '@/api/admin/eggs/getEgg' ;
import { Server } from '@/api/admin/servers/getServers' ;
2021-09-13 06:50:12 +01:00
import EggSelect from '@/components/admin/servers/EggSelect' ;
import NestSelect from '@/components/admin/servers/NestSelect' ;
2021-05-20 23:00:46 +01:00
import FormikSwitch from '@/components/elements/FormikSwitch' ;
2021-09-16 04:19:39 +01:00
import InputSpinner from '@/components/elements/InputSpinner' ;
import React , { useEffect , useState } from 'react' ;
2021-09-13 06:50:12 +01:00
import Button from '@/components/elements/Button' ;
2021-05-20 23:00:46 +01:00
import Input from '@/components/elements/Input' ;
import AdminBox from '@/components/admin/AdminBox' ;
import tw from 'twin.macro' ;
import { object } from 'yup' ;
import Field from '@/components/elements/Field' ;
import SpinnerOverlay from '@/components/elements/SpinnerOverlay' ;
2021-09-13 06:50:12 +01:00
import { Form , Formik , useFormikContext } from 'formik' ;
2021-05-20 23:00:46 +01:00
import { ApplicationStore } from '@/state' ;
import { Actions , useStoreActions } from 'easy-peasy' ;
import Label from '@/components/elements/Label' ;
2021-09-16 04:19:39 +01:00
import TitledGreyBox from '@/components/elements/TitledGreyBox' ;
2021-05-20 23:00:46 +01:00
2021-09-13 06:50:12 +01:00
// interface Values {
// startupCommand: string;
// image: string;
//
// eggId: number;
// skipScripts: boolean;
// }
2021-05-20 23:00:46 +01:00
2021-09-16 04:19:39 +01:00
function ServerStartupLineContainer ( { egg } : { egg : Egg } ) {
2021-05-20 23:00:46 +01:00
const { isSubmitting } = useFormikContext ( ) ;
return (
2021-09-13 06:50:12 +01:00
< AdminBox title = { 'Startup Command' } css = { tw ` relative w-full ` } >
2021-05-20 23:00:46 +01:00
< SpinnerOverlay visible = { isSubmitting } / >
< Form css = { tw ` mb-0 ` } >
2021-09-13 06:50:12 +01:00
< div css = { tw ` mb-6 ` } >
2021-05-20 23:00:46 +01:00
< Field
2021-09-13 06:50:12 +01:00
id = { 'startupCommand' }
name = { 'startupCommand' }
label = { 'Startup Command' }
type = { 'text' }
description = { 'Edit your server\'s startup command here. The following variables are available by default: {{SERVER_MEMORY}}, {{SERVER_IP}}, and {{SERVER_PORT}}.' }
2021-05-20 23:00:46 +01:00
/ >
< / div >
2021-09-13 06:50:12 +01:00
< div >
< Label > Default Startup Command < / Label >
2021-09-16 04:19:39 +01:00
< Input value = { egg . startup } readOnly / >
2021-09-13 06:50:12 +01:00
< / div >
2021-05-20 23:00:46 +01:00
< / Form >
< / AdminBox >
) ;
2021-09-13 06:50:12 +01:00
}
2021-05-20 23:00:46 +01:00
2021-09-16 04:19:39 +01:00
function ServerServiceContainer ( { server , egg , setEgg } : { server : Server , egg : Egg | null , setEgg : ( value : Egg | null ) = > void } ) {
2021-05-20 23:00:46 +01:00
const { isSubmitting } = useFormikContext ( ) ;
2021-09-16 04:19:39 +01:00
const [ nestId , setNestId ] = useState < number | null > ( server . nestId ) ;
2021-05-20 23:00:46 +01:00
return (
< AdminBox title = { 'Service Configuration' } css = { tw ` relative w-full ` } >
< SpinnerOverlay visible = { isSubmitting } / >
< Form css = { tw ` mb-0 ` } >
2021-09-13 06:50:12 +01:00
< div css = { tw ` mb-6 ` } >
< NestSelect nestId = { nestId } setNestId = { setNestId } / >
< / div >
< div css = { tw ` mb-6 ` } >
2021-09-16 04:19:39 +01:00
< EggSelect nestId = { nestId } egg = { egg } setEgg = { setEgg } / >
2021-09-13 06:50:12 +01:00
< / div >
< div css = { tw ` bg-neutral-800 border border-neutral-900 shadow-inner p-4 rounded ` } >
< FormikSwitch
name = { 'skipScript' }
label = { 'Skip Egg Install Script' }
description = { 'SoonTM' }
/ >
2021-05-20 23:00:46 +01:00
< / div >
< / Form >
< / AdminBox >
) ;
2021-09-13 06:50:12 +01:00
}
2021-05-20 23:00:46 +01:00
2021-09-13 06:50:12 +01:00
function ServerImageContainer ( ) {
2021-05-20 23:00:46 +01:00
const { isSubmitting } = useFormikContext ( ) ;
return (
2021-09-13 06:50:12 +01:00
< AdminBox title = { 'Image Configuration' } css = { tw ` relative w-full ` } >
2021-05-20 23:00:46 +01:00
< SpinnerOverlay visible = { isSubmitting } / >
< Form css = { tw ` mb-0 ` } >
2021-09-13 06:50:12 +01:00
< div css = { tw ` md:w-full md:flex md:flex-col ` } >
< div >
2021-05-20 23:00:46 +01:00
< Field
2021-09-13 06:50:12 +01:00
id = { 'image' }
name = { 'image' }
label = { 'Docker Image' }
type = { 'text' }
2021-05-20 23:00:46 +01:00
/ >
< / div >
< / div >
< / Form >
< / AdminBox >
) ;
2021-09-13 06:50:12 +01:00
}
2021-05-20 23:00:46 +01:00
2021-09-16 04:19:39 +01:00
function ServerVariableContainer ( { variable , defaultValue } : { variable : EggVariable , defaultValue : string } ) {
const [ value , setValue ] = useState < string > ( '' ) ;
useEffect ( ( ) = > {
setValue ( defaultValue ) ;
} , [ defaultValue ] ) ;
return (
< AdminBox title = { < p css = { tw ` text-sm uppercase ` } > { variable . name } < / p > } >
< InputSpinner visible = { false } >
< Input
name = { variable . envVariable }
placeholder = { variable . defaultValue }
type = { 'text' }
value = { value }
onChange = { e = > setValue ( e . target . value ) }
/ >
< / InputSpinner >
< p css = { tw ` mt-1 text-xs text-neutral-300 ` } >
{ variable . description }
< / p >
< / AdminBox >
) ;
}
export default function ServerStartupContainer ( { server } : { server : Server } ) {
2021-09-13 06:50:12 +01:00
const { clearFlashes } = useStoreActions ( ( actions : Actions < ApplicationStore > ) = > actions . flashes ) ;
2021-05-20 23:00:46 +01:00
2021-09-16 04:19:39 +01:00
const [ egg , setEgg ] = useState < Egg | null > ( null ) ;
2021-09-15 18:09:54 +01:00
2021-09-16 04:19:39 +01:00
useEffect ( ( ) = > {
getEgg ( server . eggId , [ 'variables' ] )
. then ( egg = > setEgg ( egg ) )
. catch ( error = > console . error ( error ) ) ;
} , [ ] ) ;
if ( egg === null ) {
return ( < > < / > ) ;
}
2021-05-20 23:00:46 +01:00
2021-09-15 18:09:54 +01:00
const submit = ( ) = > {
clearFlashes ( 'server' ) ;
} ;
2021-05-20 23:00:46 +01:00
return (
< Formik
onSubmit = { submit }
initialValues = { {
startupCommand : server.container.startupCommand ,
2021-09-13 06:50:12 +01:00
image : server.container.image ,
eggId : 0 ,
skipScripts : false ,
2021-05-20 23:00:46 +01:00
} }
2021-09-13 06:50:12 +01:00
validationSchema = { object ( ) . shape ( { } ) }
2021-05-20 23:00:46 +01:00
>
2021-09-13 06:50:12 +01:00
{ ( { isSubmitting , isValid } ) = > (
< div css = { tw ` flex flex-col ` } >
2021-09-16 04:19:39 +01:00
< div css = { tw ` flex flex-row mb-6 ` } >
< ServerStartupLineContainer egg = { egg } / >
2021-09-13 06:50:12 +01:00
< / div >
2021-09-16 04:19:39 +01:00
< div css = { tw ` grid grid-cols-1 md:grid-cols-2 md:gap-x-8 gap-y-6 md:gap-y-0 mb-6 ` } >
2021-09-13 06:50:12 +01:00
< div css = { tw ` flex ` } >
2021-09-16 04:19:39 +01:00
< ServerServiceContainer
server = { server }
egg = { egg }
setEgg = { setEgg }
/ >
2021-05-20 23:00:46 +01:00
< / div >
2021-09-13 06:50:12 +01:00
< div css = { tw ` flex ` } >
< ServerImageContainer / >
2021-05-20 23:00:46 +01:00
< / div >
2021-09-13 06:50:12 +01:00
< / div >
2021-09-16 04:19:39 +01:00
{ egg !== null &&
< div css = { tw ` grid gap-y-6 gap-x-8 grid-cols-1 md:grid-cols-2 ` } >
{ egg . relations . variables ? . map ( ( v , i ) = > (
< ServerVariableContainer
key = { i }
variable = { v }
defaultValue = { server . relations ? . variables . find ( v2 = > v . eggId === v2 . eggId && v . envVariable === v2 . envVariable ) ? . serverValue || '' }
/ >
) ) }
< / div >
}
< div css = { tw ` bg-neutral-700 rounded shadow-md py-2 pr-6 mt-6 ` } >
2021-09-13 06:50:12 +01:00
< div css = { tw ` flex flex-row ` } >
< Button type = "submit" size = "small" css = { tw ` ml-auto ` } disabled = { isSubmitting || ! isValid } >
Save Changes
< / Button >
2021-05-20 23:00:46 +01:00
< / div >
< / div >
2021-09-13 06:50:12 +01:00
< / div >
) }
2021-05-20 23:00:46 +01:00
< / Formik >
) ;
2021-09-13 06:50:12 +01:00
}