misc_pterodactyl-panel/resources/scripts/components/admin/servers/EggSelect.tsx

79 lines
2.5 KiB
TypeScript
Raw Permalink Normal View History

import { useField } from 'formik';
import type { ChangeEvent } from 'react';
import { useEffect, useState } from 'react';
import type { WithRelationships } from '@/api/admin';
2023-10-02 22:56:48 +00:00
import type { Egg } from '@/api/admin/egg';
import { searchEggs } from '@/api/admin/egg';
import Label from '@/components/elements/Label';
import Select from '@/components/elements/Select';
interface Props {
nestId?: number;
selectedEggId?: number;
onEggSelect: (egg: WithRelationships<Egg, 'variables'> | undefined) => void;
}
export default ({ nestId, selectedEggId, onEggSelect }: Props) => {
const [, , { setValue, setTouched }] = useField<Record<string, string | undefined>>('environment');
const [eggs, setEggs] = useState<WithRelationships<Egg, 'variables'>[] | undefined>(undefined);
const selectEgg = (egg: WithRelationships<Egg, 'variables'> | undefined) => {
if (egg === undefined) {
onEggSelect(undefined);
return;
}
// Clear values
setValue({});
setTouched(true);
onEggSelect(egg);
const values: Record<string, any> = {};
egg.relationships.variables?.forEach(v => {
values[v.environmentVariable] = v.defaultValue;
});
setValue(values);
setTouched(true);
};
useEffect(() => {
if (!nestId) {
setEggs(undefined);
return;
}
searchEggs(nestId, {})
.then(_eggs => {
setEggs(_eggs);
// If the currently selected egg is in the selected nest, use it instead of picking the first egg on the nest.
const egg = _eggs.find(egg => egg.id === selectedEggId) ?? _eggs[0];
selectEgg(egg);
})
.catch(error => console.error(error));
}, [nestId]);
const onSelectChange = (event: ChangeEvent<HTMLSelectElement>) => {
selectEgg(eggs?.find(egg => egg.id.toString() === event.currentTarget.value) ?? undefined);
};
return (
<>
<Label>Egg</Label>
<Select id={'eggId'} name={'eggId'} value={selectedEggId} onChange={onSelectChange}>
{!eggs ? (
<option disabled>Loading...</option>
) : (
eggs.map(v => (
<option key={v.id} value={v.id.toString()}>
{v.name}
</option>
))
)}
</Select>
</>
);
};