2022-12-16 02:06:14 +00:00
|
|
|
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';
|
2022-12-16 02:06:14 +00:00
|
|
|
import { searchEggs } from '@/api/admin/egg';
|
|
|
|
import Label from '@/components/elements/Label';
|
|
|
|
import Select from '@/components/elements/Select';
|
|
|
|
|
|
|
|
interface Props {
|
|
|
|
nestId?: number;
|
|
|
|
selectedEggId?: number;
|
2023-09-29 22:33:15 +00:00
|
|
|
onEggSelect: (egg: WithRelationships<Egg, 'variables'> | undefined) => void;
|
2022-12-16 02:06:14 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
export default ({ nestId, selectedEggId, onEggSelect }: Props) => {
|
|
|
|
const [, , { setValue, setTouched }] = useField<Record<string, string | undefined>>('environment');
|
2023-09-29 22:33:15 +00:00
|
|
|
const [eggs, setEggs] = useState<WithRelationships<Egg, 'variables'>[] | undefined>(undefined);
|
2022-12-16 02:06:14 +00:00
|
|
|
|
2023-09-29 22:33:15 +00:00
|
|
|
const selectEgg = (egg: WithRelationships<Egg, 'variables'> | undefined) => {
|
|
|
|
if (egg === undefined) {
|
|
|
|
onEggSelect(undefined);
|
2022-12-16 02:06:14 +00:00
|
|
|
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) {
|
2023-09-29 22:33:15 +00:00
|
|
|
setEggs(undefined);
|
2022-12-16 02:06:14 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
searchEggs(nestId, {})
|
2023-09-29 22:33:15 +00:00
|
|
|
.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);
|
2022-12-16 02:06:14 +00:00
|
|
|
})
|
|
|
|
.catch(error => console.error(error));
|
|
|
|
}, [nestId]);
|
|
|
|
|
2023-09-29 22:33:15 +00:00
|
|
|
const onSelectChange = (event: ChangeEvent<HTMLSelectElement>) => {
|
|
|
|
selectEgg(eggs?.find(egg => egg.id.toString() === event.currentTarget.value) ?? undefined);
|
2022-12-16 02:06:14 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
return (
|
|
|
|
<>
|
|
|
|
<Label>Egg</Label>
|
2023-09-29 22:33:15 +00:00
|
|
|
<Select id={'eggId'} name={'eggId'} value={selectedEggId} onChange={onSelectChange}>
|
2022-12-16 02:06:14 +00:00
|
|
|
{!eggs ? (
|
|
|
|
<option disabled>Loading...</option>
|
|
|
|
) : (
|
|
|
|
eggs.map(v => (
|
|
|
|
<option key={v.id} value={v.id.toString()}>
|
|
|
|
{v.name}
|
|
|
|
</option>
|
|
|
|
))
|
|
|
|
)}
|
|
|
|
</Select>
|
|
|
|
</>
|
|
|
|
);
|
|
|
|
};
|