2015-10-27 23:19:30 +00:00
|
|
|
|
/* Copyright 2015 Realm Inc - All Rights Reserved
|
|
|
|
|
* Proprietary and Confidential
|
|
|
|
|
*/
|
|
|
|
|
|
2015-10-27 08:52:26 +00:00
|
|
|
|
'use strict';
|
|
|
|
|
|
|
|
|
|
const React = require('react-native');
|
|
|
|
|
const realm = require('./realm');
|
|
|
|
|
const styles = require('./styles');
|
|
|
|
|
|
|
|
|
|
const { Text, TextInput, TouchableWithoutFeedback, View } = React;
|
|
|
|
|
|
|
|
|
|
class TodoListItem extends React.Component {
|
|
|
|
|
constructor(props) {
|
|
|
|
|
super(props);
|
|
|
|
|
|
|
|
|
|
this._onChangeText = this._onChangeText.bind(this);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
get done() {
|
|
|
|
|
let items = this.props.item.items;
|
|
|
|
|
return items.length > 0 && Array.prototype.every.call(items, (item) => item.done);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
get text() {
|
|
|
|
|
return this.props.item.name;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
set text(text) {
|
|
|
|
|
this.props.item.name = text;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
componentDidMount() {
|
|
|
|
|
// The autoFocus prop on TextInput was not working for us :(
|
|
|
|
|
this._focusInputIfNecessary();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
componentDidUpdate() {
|
|
|
|
|
this._focusInputIfNecessary();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
render() {
|
|
|
|
|
return (
|
|
|
|
|
<View style={styles.listItem}>
|
|
|
|
|
{this.renderLeftSide()}
|
|
|
|
|
{this.renderText()}
|
|
|
|
|
{this.renderRightSide()}
|
|
|
|
|
</View>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
renderLeftSide() {
|
|
|
|
|
return (
|
|
|
|
|
<View style={styles.listItemLeftSide}>
|
|
|
|
|
<Text>{this.done ? '✓' : '⁃'}</Text>
|
|
|
|
|
</View>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
renderRightSide() {
|
|
|
|
|
// Only show the delete button while not editing the text.
|
|
|
|
|
return this.props.editing ? null : this.renderDelete();
|
|
|
|
|
}
|
|
|
|
|
|
2015-10-27 10:08:18 +00:00
|
|
|
|
renderText(extraStyle) {
|
2015-10-27 08:52:26 +00:00
|
|
|
|
if (this.props.editing) {
|
|
|
|
|
return (
|
|
|
|
|
<TextInput
|
|
|
|
|
ref="input"
|
|
|
|
|
value={this.text}
|
2015-10-28 18:25:54 +00:00
|
|
|
|
placeholder="Todo…"
|
2015-10-27 10:08:18 +00:00
|
|
|
|
style={[styles.listItemInput, extraStyle]}
|
2015-10-27 08:52:26 +00:00
|
|
|
|
onChangeText={this._onChangeText}
|
|
|
|
|
onEndEditing={this.props.onEndEditing}
|
|
|
|
|
enablesReturnKeyAutomatically={true} />
|
|
|
|
|
);
|
|
|
|
|
} else {
|
|
|
|
|
return (
|
|
|
|
|
<Text
|
2015-10-27 10:08:18 +00:00
|
|
|
|
style={[styles.listItemText, extraStyle]}
|
2015-10-27 08:52:26 +00:00
|
|
|
|
onPress={this.props.onPress}
|
|
|
|
|
suppressHighlighting={true}>
|
|
|
|
|
{this.text}
|
|
|
|
|
</Text>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
renderDelete() {
|
|
|
|
|
return (
|
|
|
|
|
<TouchableWithoutFeedback onPress={this.props.onPressDelete}>
|
|
|
|
|
<View style={styles.listItemDelete}>
|
|
|
|
|
<Text>𐄂</Text>
|
|
|
|
|
</View>
|
|
|
|
|
</TouchableWithoutFeedback>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_onChangeText(text) {
|
|
|
|
|
realm.write(() => {
|
|
|
|
|
this.text = text;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
this.forceUpdate();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_focusInputIfNecessary() {
|
|
|
|
|
if (!this.props.editing) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let input = this.refs.input;
|
|
|
|
|
if (!input.isFocused()) {
|
|
|
|
|
input.focus();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
module.exports = TodoListItem;
|