diff --git a/src/components/Firestore/CollectionFilter/CollectionFilter.tsx b/src/components/Firestore/CollectionFilter/CollectionFilter.tsx index 4ba153a02..17d3e20fe 100644 --- a/src/components/Firestore/CollectionFilter/CollectionFilter.tsx +++ b/src/components/Firestore/CollectionFilter/CollectionFilter.tsx @@ -31,12 +31,23 @@ import { isSingleValueCollectionFilter, isSortableCollectionFilter, } from '../models'; +import { isBoolean, isNumber } from '../utils'; import { useCollectionFilter, useDispatch } from '../store'; import styles from './CollectionFilter.module.scss'; import { ConditionEntries } from './ConditionEntries'; import { ConditionEntry } from './ConditionEntry'; import { SortRadioGroup } from './SortRadioGroup'; +function getConditionEntryType(value: any) { + if (isBoolean(value)) { + return 'boolean'; + } + if (isNumber(value)) { + return 'number'; + } + return 'string'; +} + export const CollectionFilter: React.FC< React.PropsWithChildren<{ className?: string; @@ -54,7 +65,20 @@ export const CollectionFilter: React.FC< const cf = formMethods.watch(); + const [fieldType, setFieldType] = useState( + getConditionEntryType( + isSingleValueCollectionFilter(collectionFilter) && collectionFilter.value + ) + ); + const onSubmit = (data: CollectionFilterType) => { + if (isSingleValueCollectionFilter(data)) { + if (fieldType === 'number') { + data.value = Number(data.value); + } else if (fieldType === 'boolean') { + data.value = data.value === 'true'; + } + } dispatch( actions.addCollectionFilter({ path, @@ -96,7 +120,10 @@ export const CollectionFilter: React.FC< preview={} defaultOpen > - + {cf && isSingleValueCollectionFilter(cf) && ( )} @@ -207,9 +236,12 @@ const Preview: React.FC< ); }; -const ConditionSelect: React.FC> = ({ - children, -}) => { +const ConditionSelect: React.FC< + React.PropsWithChildren<{ + fieldType: string; + setFieldType: (type: string) => void; + }> +> = ({ children, fieldType, setFieldType }) => { const options: Array<{ label: string; value: WhereFilterOp; diff --git a/src/components/Firestore/CollectionFilter/ConditionEntry.tsx b/src/components/Firestore/CollectionFilter/ConditionEntry.tsx index 1ee9a8be8..b2c6bfd19 100644 --- a/src/components/Firestore/CollectionFilter/ConditionEntry.tsx +++ b/src/components/Firestore/CollectionFilter/ConditionEntry.tsx @@ -21,29 +21,21 @@ import { Field, SelectField } from '../../../components/common/Field'; import { NUMBER_REGEX, isBoolean, isNumber } from '../utils'; import styles from './CollectionFilter.module.scss'; -function getConditionEntryType(value: any) { - if (isBoolean(value)) { - return 'boolean'; - } - if (isNumber(value)) { - return 'number'; - } - return 'string'; -} interface ConditionEntryProps { name: string; // Error may be undefined; require consumers to still pass or we might end up // in a state where we validate without showing the error message. error: string | undefined; + fieldType: string; + setFieldType: (type: string) => void; } export const ConditionEntry: React.FC< React.PropsWithChildren -> = React.memo(({ name, error }) => { +> = React.memo(({ name, error, fieldType, setFieldType }) => { const { setValue, watch } = useFormContext(); const value = watch(name); - const [fieldType, setFieldType] = useState(getConditionEntryType(value)); useEffect(() => { // Essentially setting the defaultValue of this form-field, @@ -58,9 +50,7 @@ export const ConditionEntry: React.FC< { - setFieldType(evt.currentTarget.value); - }} + onChange={(evt) => setFieldType(evt.currentTarget.value)} fieldClassName={styles.conditionEntryType} />