import React, { Component } from 'react'; import { View, Button, TextInput, WebView, Text, StyleSheet } from 'react-native'; import { connect } from 'react-redux' import { Log } from 'lib/log.js' import { Note } from 'lib/models/note.js' import { Folder } from 'lib/models/folder.js' import { ActionButton } from 'lib/components/action-button.js'; import Icon from 'react-native-vector-icons/Ionicons'; import { ScreenHeader } from 'lib/components/screen-header.js'; import { Checkbox } from 'lib/components/checkbox.js' import { _ } from 'lib/locale.js'; import marked from 'lib/marked.js'; import { BaseScreenComponent } from 'lib/components/base-screen.js'; const styles = StyleSheet.create({ webView: { fontSize: 10, }, }); class NoteScreenComponent extends BaseScreenComponent { static navigationOptions(options) { return { header: null }; } constructor() { super(); this.state = { note: Note.new(), mode: 'view', noteMetadata: '', showNoteMetadata: false, folder: null, } } componentWillMount() { if (!this.props.noteId) { let note = this.props.itemType == 'todo' ? Note.newTodo(this.props.folderId) : Note.new(this.props.folderId); this.setState({ note: note }); this.refreshNoteMetadata(); } else { Note.load(this.props.noteId).then((note) => { this.setState({ note: note }); this.refreshNoteMetadata(); }); } this.refreshFolder(); } async currentFolder() { let folderId = this.props.folderId; if (!folderId) { if (this.state.note && this.state.note.parent_id) folderId = this.state.note.parent_id; } if (!folderId) return Folder.defaultFolder(); return Folder.load(folderId); } async refreshFolder() { this.setState({ folder: await this.currentFolder() }); } noteComponent_change(propName, propValue) { this.setState((prevState, props) => { let note = Object.assign({}, prevState.note); note[propName] = propValue; return { note: note } }); } async refreshNoteMetadata(force = null) { if (force !== true && !this.state.showNoteMetadata) return; let noteMetadata = await Note.serializeAllProps(this.state.note); this.setState({ noteMetadata: noteMetadata }); } title_changeText(text) { this.noteComponent_change('title', text); } body_changeText(text) { this.noteComponent_change('body', text); } async saveNoteButton_press() { let note = Object.assign({}, this.state.note); if (!this.state.note.parent_id) { let folder = await Folder.defaultFolder(); if (!folder) { Log.warn('Cannot save note without a notebook'); return; } note.parent_id = folder.id; } let isNew = !note.id; note = await Note.save(note); this.setState({ note: note }); if (isNew) Note.updateGeolocation(note.id); this.refreshNoteMetadata(); } deleteNote_onPress(noteId) { Log.info('DELETE', noteId); } attachFile_onPress(noteId) { } showMetadata_onPress() { this.setState({ showNoteMetadata: !this.state.showNoteMetadata }); this.refreshNoteMetadata(true); } menuOptions() { return [ { title: _('Attach file'), onPress: () => { this.attachFile_onPress(this.state.note.id); } }, { title: _('Delete note'), onPress: () => { this.deleteNote_onPress(this.state.note.id); } }, { title: _('Toggle metadata'), onPress: () => { this.showMetadata_onPress(); } }, ]; } render() { const note = this.state.note; const isTodo = !!Number(note.is_todo); const folder = this.state.folder; let todoComponents = null; if (note.is_todo) { todoComponents = (