const React = require("react"); const Component = React.Component; const { connect } = require("react-redux"); const { ListView, Text, TouchableOpacity, View, StyleSheet } = require("react-native"); const { Log } = require("lib/log.js"); const { _ } = require("lib/locale.js"); const { Checkbox } = require("lib/components/checkbox.js"); const { reg } = require("lib/registry.js"); const Note = require("lib/models/Note.js"); const { time } = require("lib/time-utils.js"); const { globalStyle, themeStyle } = require("lib/components/global-style.js"); class NoteItemComponent extends Component { constructor() { super(); this.styles_ = {}; } noteItem_press(noteId) { this.props.dispatch({ type: "NAV_GO", routeName: "Note", noteId: noteId, }); } styles() { const theme = themeStyle(this.props.theme); if (this.styles_[this.props.theme]) return this.styles_[this.props.theme]; this.styles_ = {}; let styles = { listItem: { flexDirection: "row", //height: 40, borderBottomWidth: 1, borderBottomColor: theme.dividerColor, alignItems: "flex-start", paddingLeft: theme.marginLeft, paddingRight: theme.marginRight, paddingTop: theme.itemMarginTop, paddingBottom: theme.itemMarginBottom, //backgroundColor: theme.backgroundColor, }, listItemText: { flex: 1, color: theme.color, fontSize: theme.fontSize, }, selectionWrapper: { backgroundColor: theme.backgroundColor, }, }; styles.listItemWithCheckbox = Object.assign({}, styles.listItem); delete styles.listItemWithCheckbox.paddingTop; delete styles.listItemWithCheckbox.paddingBottom; delete styles.listItemWithCheckbox.paddingLeft; styles.listItemTextWithCheckbox = Object.assign({}, styles.listItemText); styles.listItemTextWithCheckbox.marginTop = styles.listItem.paddingTop - 1; styles.listItemTextWithCheckbox.marginBottom = styles.listItem.paddingBottom; styles.selectionWrapperSelected = Object.assign({}, styles.selectionWrapper); styles.selectionWrapperSelected.backgroundColor = theme.selectedColor; this.styles_[this.props.theme] = StyleSheet.create(styles); return this.styles_[this.props.theme]; } async todoCheckbox_change(checked) { if (!this.props.note) return; const newNote = { id: this.props.note.id, todo_completed: checked ? time.unixMs() : 0, }; await Note.save(newNote); } onPress() { if (!this.props.note) return; if (!!this.props.note.encryption_applied) return; if (this.props.noteSelectionEnabled) { this.props.dispatch({ type: "NOTE_SELECTION_TOGGLE", id: this.props.note.id, }); } else { this.props.dispatch({ type: "NAV_GO", routeName: "Note", noteId: this.props.note.id, }); } } onLongPress() { if (!this.props.note) return; this.props.dispatch({ type: this.props.noteSelectionEnabled ? "NOTE_SELECTION_TOGGLE" : "NOTE_SELECTION_START", id: this.props.note.id, }); } render() { const note = this.props.note ? this.props.note : {}; const isTodo = !!Number(note.is_todo); const onPress = this.props.onPress; const onCheckboxChange = this.props.onCheckboxChange; const theme = themeStyle(this.props.theme); // IOS: display: none crashes the app let checkboxStyle = !isTodo ? { display: "none" } : { color: theme.color }; if (isTodo) { checkboxStyle.paddingRight = 10; checkboxStyle.paddingTop = theme.itemMarginTop; checkboxStyle.paddingBottom = theme.itemMarginBottom; checkboxStyle.paddingLeft = theme.marginLeft; } const checkboxChecked = !!Number(note.todo_completed); const listItemStyle = isTodo ? this.styles().listItemWithCheckbox : this.styles().listItem; const listItemTextStyle = isTodo ? this.styles().listItemTextWithCheckbox : this.styles().listItemText; const opacityStyle = isTodo && checkboxChecked ? { opacity: 0.4 } : {}; const isSelected = this.props.noteSelectionEnabled && this.props.selectedNoteIds.indexOf(note.id) >= 0; const selectionWrapperStyle = isSelected ? this.styles().selectionWrapperSelected : this.styles().selectionWrapper; return ( this.onPress()} onLongPress={() => this.onLongPress()} activeOpacity={0.5}> this.todoCheckbox_change(checked)} /> {Note.displayTitle(note)} ); } } const NoteItem = connect(state => { return { theme: state.settings.theme, noteSelectionEnabled: state.noteSelectionEnabled, selectedNoteIds: state.selectedNoteIds, }; })(NoteItemComponent); module.exports = { NoteItem };