import { Geopoint } from '../types/Asset'; import React, { ChangeEvent } from 'react'; import { TextInput, Select, TextArea, Label, Checkbox, Inline, Stack } from '@sanity/ui'; interface Props { label: string; onChange: (value: any) => void; placeholder?: string; type?: | 'checkbox' | 'color' | 'date' | 'datetime-local' | 'email' | 'location' | 'number' | 'select' | 'tel' | 'text' | 'time' | 'url'; value?: string | number | boolean | readonly string[] | undefined; } export const LabelWithInput = ({ label, onChange, type = 'text', ...rest }: Props) => { const elementsMap: { [key: string]: any } = { checkbox: CustomCheckbox, location: Location, textArea: TextArea, select: CustomSelect, }; const onChangeMap: { [key: string]: (e: any) => void } = { checkbox: (e: ChangeEvent) => onChange(e.target.checked), location: (value: Geopoint | undefined) => onChange(value), number: (e: ChangeEvent) => onChange(parseFloat(e.target.value)), select: (e: ChangeEvent) => onChange(e.target.value), }; const defaultOnChange = (e: ChangeEvent) => onChange(e.target.value); const handleOnChange = onChangeMap[type] || defaultOnChange; const Element = elementsMap[type] || TextInput; return ( ); }; const CustomCheckbox = ({ value, ...rest }: { value: boolean | undefined }) => ; const Location = ({ onChange, value = {}, }: { onChange: (value: Geopoint | ((prevState: Geopoint) => Geopoint)) => void; value?: Geopoint | undefined; }) => { const fields: Array<{ label: string; name: keyof Geopoint; type: string; step: string }> = [ { label: 'Latitude', name: 'lat', type: 'number', step: 'any' }, { label: 'Longitude', name: 'lng', type: 'number', step: 'any' }, { label: 'Altitude', name: 'alt', type: 'number', step: 'any' }, ]; const handleInputchange = (e: ChangeEvent) => { onChange({ ...(value || {}), [e.target.name]: parseFloat(e.target.value) }); }; return ( {fields.map(({ label, name, ...rest }: { label: string; name: keyof Geopoint }) => ( ))} ); }; type SelectOption = { title: string; value: string; }; const CustomSelect = ({ options, placeholder, value, label, ...rest }: { options: Array; placeholder: string | undefined; label: string; value: string | undefined; }) => { return ( ); };