Ankilan/src/components/Form/field-editor.jsx

142 lines
3.8 KiB
React
Raw Normal View History

2020-03-29 07:05:08 +00:00
import React, {useState, useEffect, useRef} from 'react';
import {connect} from 'react-redux';
2020-03-31 07:54:08 +00:00
import TextField from 'react-native-material-textfield/src/components/field';
2020-04-02 12:51:00 +00:00
import {StyleSheet, TextInput} from 'react-native';
2020-03-31 07:54:08 +00:00
import {View, Text, Button, Picker} from 'native-base';
import Icon from 'react-native-vector-icons/FontAwesome5';
import IconedButton from '../view/iconed-button.jsx';
2020-04-03 06:32:26 +00:00
import {POS_PICKER} from '../../constants/component-types';
2020-03-31 07:54:08 +00:00
const FieldEditor = props => {
const [data, setData] = useState(props.data);
const [values, setValues] = useState(props.data.values);
2020-04-03 06:32:26 +00:00
const [editing, setEditing] = useState(false);
2020-04-02 12:51:00 +00:00
const [selectedValue, setSelectedValue] = useState(props.data.values[0]);
const [userText, setUserText] = useState('');
2020-04-02 12:51:00 +00:00
const input = useRef();
const [finalText, setFinalText] = useState(props.data.values[0]);
2020-04-02 12:51:00 +00:00
useEffect(() => {
setData(props.data);
setValues(props.data.values)
}, [props]);
2020-03-31 07:54:08 +00:00
2020-04-03 06:32:26 +00:00
const selectValue = selected => {
setSelectedValue(selected);
if (props.type === POS_PICKER) {
values.forEach((value, id) => {
if (value === selected) props.onSelect(id);
});
2020-04-03 06:32:26 +00:00
}
2020-04-02 12:51:00 +00:00
};
const typing = text => {
setUserText(text);
};
const select = value => {
setFinalText(value);
setUserText(value);
selectValue(value);
2020-04-02 12:51:00 +00:00
};
const confirmTyped = () => {
let newValues = new Set(values);
newValues.add(userText);
setValues(Array.from(newValues));
setData({...data, values: [...values, userText]});
console.log(values);
2020-04-02 12:51:00 +00:00
};
2020-03-31 07:54:08 +00:00
useEffect(() => {
if (props.data.values !== values) {
setSelectedValue(values[values.length - 1]);
}
}, [values]);
useEffect(() => {
});
2020-04-02 12:51:00 +00:00
const styles = StyleSheet.create({
wrapper: {},
inner: {
display: 'flex',
justifyContent: 'space-between',
flexDirection: 'row',
alignItems: 'center',
alignContent: 'center',
},
row: {
display: 'flex',
flexDirection: 'row',
justifyContent: 'space-between',
width: 90,
},
button: {
width: 40,
height: 40,
display: 'flex',
justifyContent: 'center',
alignItems: 'center',
},
tfWrapper: {
width: editing ? '75%' : '84%',
},
pickerLabel: {
color: '#00000050',
fontSize: 12,
marginLeft: 2,
},
hr: {
height: 1,
width: '100%',
backgroundColor: '#00000070',
},
});
2020-03-31 07:54:08 +00:00
2020-04-02 12:51:00 +00:00
return (
<View style={styles.wrapper}>
<View style={styles.inner}>
<View style={styles.tfWrapper}>
{editing ? (
<TextField
lineType={'none'}
multiline={true}
2020-04-03 06:32:26 +00:00
label={props.data.label}
value={userText}
2020-04-02 12:51:00 +00:00
editable={true}
ref={input}
onChangeText={text => typing(text)}
/>
) : (
<View>
2020-04-03 06:32:26 +00:00
<Text style={styles.pickerLabel}>{props.data.label}</Text>
2020-04-02 12:51:00 +00:00
<Picker
selectedValue={selectedValue}
onValueChange={value => select(value)}>
{values.map((value, id) => {
2020-04-02 12:51:00 +00:00
return <Picker.Item value={value} label={value} key={id} />;
})}
</Picker>
</View>
)}
</View>
{editing ? (
<View style={styles.row}>
<IconedButton
icon="caret-down"
onPress={() => {
setEditing(!editing);
}}
/>
<IconedButton icon="check" onPress={confirmTyped} />
</View>
) : (
<IconedButton
icon="pen"
onPress={() => {
setEditing(!editing);
}}
/>
)}
</View>
<View style={styles.hr} />
</View>
);
2020-03-31 07:54:08 +00:00
};
export default connect()(FieldEditor);