import * as React from 'react'; import { View, StyleSheet } from 'react-native'; import { connect } from 'react-redux'; import Folder from '@joplin/lib/models/Folder'; import BaseModel from '@joplin/lib/BaseModel'; import { ScreenHeader } from '../ScreenHeader'; import { BaseScreenComponent } from '../base-screen'; import shim from '@joplin/lib/shim'; import { _ } from '@joplin/lib/locale'; import FolderPicker from '../FolderPicker'; import TextInput from '../TextInput'; import { FolderEntity } from '@joplin/lib/services/database/types'; import { AppState } from '../../utils/types'; import { Dispatch } from 'redux'; interface Props { folderId: string; selectedFolderId: string; themeId: number; folders: FolderEntity[]; dispatch: Dispatch; } interface State { folder: FolderEntity; lastSavedFolder: FolderEntity|null; } class FolderScreenComponent extends BaseScreenComponent { public constructor(props: Props) { super(props); this.state = { folder: Folder.new(), lastSavedFolder: null, }; } public override UNSAFE_componentWillMount() { if (!this.props.folderId) { const folder = Folder.new(); this.setState({ folder: folder, lastSavedFolder: { ...folder }, }); } else { // eslint-disable-next-line promise/prefer-await-to-then -- Old code before rule was applied void Folder.load(this.props.folderId).then(folder => { this.setState({ folder: folder, lastSavedFolder: { ...folder }, }); }); } } private isModified() { if (!this.state.folder || !this.state.lastSavedFolder) return false; const diff = BaseModel.diffObjects(this.state.folder, this.state.lastSavedFolder); delete diff.type_; return !!Object.getOwnPropertyNames(diff).length; } private folderComponent_change(propName: keyof FolderEntity, propValue: string) { this.setState((prevState) => { const folder = { ...prevState.folder, [propName]: propValue, }; return { folder: folder }; }); } private title_changeText(text: string) { this.folderComponent_change('title', text); } private parent_changeValue(parent: string) { this.folderComponent_change('parent_id', parent); } private async saveFolderButton_press() { let folder = { ...this.state.folder }; try { if (folder.id && !(await Folder.canNestUnder(folder.id, folder.parent_id))) throw new Error(_('Cannot move notebook to this location')); folder = await Folder.save(folder, { userSideValidation: true }); } catch (error) { void shim.showErrorDialog(_('The notebook could not be saved: %s', error.message)); return; } this.setState({ lastSavedFolder: { ...folder }, folder: folder, }); this.props.dispatch({ type: 'NAV_GO', routeName: 'Notes', folderId: folder.id, }); } public override render() { const saveButtonDisabled = !this.isModified() || !this.state.folder.title; return ( this.saveFolderButton_press()} showSideMenuButton={false} showSearchButton={false} /> this.title_changeText(text)} editable={!this.state.folder.encryption_applied} /> this.parent_changeValue(newValue)} mustSelect /> ); } } export default connect((state: AppState) => { return { folderId: state.selectedFolderId, themeId: state.settings.theme, folders: state.folders.filter((folder) => folder.id !== state.selectedFolderId), }; })(FolderScreenComponent); const styles = StyleSheet.create({ folderPickerContainer: { height: 46, paddingLeft: 14, paddingRight: 14, paddingTop: 12, paddingBottom: 12, }, });