-
Matiss Janis Aboltins authoredMatiss Janis Aboltins authored
GenericInput.js 5.32 KiB
import React from 'react';
import { useSelector } from 'react-redux';
import { getMonthYearFormat } from 'loot-core/src/shared/months';
import useCategories from '../../hooks/useCategories';
import AccountAutocomplete from '../autocomplete/AccountAutocomplete';
import Autocomplete from '../autocomplete/Autocomplete';
import CategoryAutocomplete from '../autocomplete/CategoryAutocomplete';
import PayeeAutocomplete from '../autocomplete/PayeeAutocomplete';
import SavedFilterAutocomplete from '../autocomplete/SavedFilterAutocomplete';
import Input from '../common/Input';
import View from '../common/View';
import { Checkbox } from '../forms';
import DateSelect from '../select/DateSelect';
import RecurringSchedulePicker from '../select/RecurringSchedulePicker';
export default function GenericInput({
field,
subfield,
type,
multi,
value,
inputRef,
style,
onChange,
}) {
let { grouped: categoryGroups } = useCategories();
let saved = useSelector(state => state.queries.saved);
let dateFormat = useSelector(
state => state.prefs.local.dateFormat || 'MM/dd/yyyy',
);
// This makes the UI more resilient in case of faulty data
if (multi && !Array.isArray(value)) {
value = [];
} else if (!multi && Array.isArray(value)) {
return null;
}
let showPlaceholder = multi ? value.length === 0 : true;
let content;
switch (type) {
case 'id':
switch (field) {
case 'payee':
content = (
<PayeeAutocomplete
multi={multi}
showMakeTransfer={false}
openOnFocus={true}
value={value}
onSelect={onChange}
inputProps={{
inputRef,
...(showPlaceholder ? { placeholder: 'nothing' } : null),
}}
/>
);
break;
case 'account':
content = (
<AccountAutocomplete
value={value}
multi={multi}
openOnFocus={true}
onSelect={onChange}
inputProps={{
inputRef,
...(showPlaceholder ? { placeholder: 'nothing' } : null),
}}
/>
);
break;
case 'category':
content = (
<CategoryAutocomplete
categoryGroups={categoryGroups}
value={value}
multi={multi}
openOnFocus={true}
onSelect={onChange}
inputProps={{
inputRef,
...(showPlaceholder ? { placeholder: 'nothing' } : null),
}}
/>
);
break;
default:
}
break;
case 'saved':
switch (field) {
case 'saved':
content = (
<SavedFilterAutocomplete
saved={saved}
value={value}
multi={multi}
openOnFocus={true}
onSelect={onChange}
inputProps={{
inputRef,
...(showPlaceholder ? { placeholder: 'nothing' } : null),
}}
/>
);
break;
default:
}
break;
case 'date':
switch (subfield) {
case 'month':
content = (
<Input
inputRef={inputRef}
defaultValue={value || ''}
placeholder={getMonthYearFormat(dateFormat).toLowerCase()}
onEnter={e => onChange(e.target.value)}
onBlur={e => onChange(e.target.value)}
/>
);
break;
case 'year':
content = (
<Input
inputRef={inputRef}
defaultValue={value || ''}
placeholder={'yyyy'}
onEnter={e => onChange(e.target.value)}
onBlur={e => onChange(e.target.value)}
/>
);
break;
default:
if (value && value.frequency) {
content = (
<RecurringSchedulePicker
value={value}
buttonStyle={{ justifyContent: 'flex-start' }}
onChange={onChange}
/>
);
} else {
content = (
<DateSelect
value={value}
dateFormat={dateFormat}
openOnFocus={false}
inputRef={inputRef}
inputProps={{ placeholder: dateFormat.toLowerCase() }}
onSelect={onChange}
/>
);
}
break;
}
break;
case 'boolean':
content = (
<Checkbox
checked={value}
value={value}
onChange={() => onChange(!value)}
/>
);
break;
default:
if (multi) {
content = (
<Autocomplete
multi={true}
suggestions={[]}
value={value}
inputProps={{ inputRef }}
onSelect={onChange}
/>
);
} else {
content = (
<Input
inputRef={inputRef}
defaultValue={value || ''}
placeholder="nothing"
onEnter={e => onChange(e.target.value)}
onBlur={e => onChange(e.target.value)}
/>
);
}
break;
}
return <View style={[{ flex: 1 }, style]}>{content}</View>;
}