Files
standardnotes-app/packages/web/src/javascripts/Components/NoteGroupView/NoteGroupView.tsx
T

118 lines
3.7 KiB
TypeScript

import { FileItem } from '@standardnotes/snjs'
import { AbstractComponent } from '@/Components/Abstract/PureComponent'
import MultipleSelectedNotes from '@/Components/MultipleSelectedNotes/MultipleSelectedNotes'
import MultipleSelectedFiles from '../MultipleSelectedFiles/MultipleSelectedFiles'
import { AppPaneId } from '../Panes/AppPaneMetadata'
import FileView from '../FileView/FileView'
import NoteView from '../NoteView/NoteView'
import { NoteViewController } from '../NoteView/Controller/NoteViewController'
import { FileViewController } from '../NoteView/Controller/FileViewController'
import { WebApplication } from '@/Application/WebApplication'
type State = {
showMultipleSelectedNotes: boolean
showMultipleSelectedFiles: boolean
controllers: (NoteViewController | FileViewController)[]
selectedFile: FileItem | undefined
selectedPane?: AppPaneId
isInMobileView?: boolean
}
type Props = {
application: WebApplication
className?: string
}
class NoteGroupView extends AbstractComponent<Props, State> {
private removeChangeObserver!: () => void
constructor(props: Props) {
super(props, props.application)
this.state = {
showMultipleSelectedNotes: false,
showMultipleSelectedFiles: false,
controllers: [],
selectedFile: undefined,
}
}
override componentDidMount(): void {
super.componentDidMount()
const controllerGroup = this.application.itemControllerGroup
this.removeChangeObserver = this.application.itemControllerGroup.addActiveControllerChangeObserver(() => {
const controllers = controllerGroup.itemControllers
this.setState({
controllers: controllers,
})
})
this.autorun(() => {
if (this.application.notesController) {
this.setState({
showMultipleSelectedNotes: this.application.notesController.selectedNotesCount > 1,
})
}
if (this.application.itemListController) {
this.setState({
showMultipleSelectedFiles: this.application.itemListController.selectedFilesCount > 1,
})
}
})
this.autorun(() => {
if (this.application.itemListController) {
this.setState({
selectedFile: this.application.itemListController.selectedFiles[0],
})
}
})
this.autorun(() => {
if (this.application.paneController) {
this.setState({
selectedPane: this.application.paneController.currentPane,
isInMobileView: this.application.paneController.isInMobileView,
})
}
})
}
override deinit() {
this.removeChangeObserver?.()
;(this.removeChangeObserver as unknown) = undefined
super.deinit()
}
override render() {
const shouldNotShowMultipleSelectedItems =
!this.state.showMultipleSelectedNotes && !this.state.showMultipleSelectedFiles
const hasControllers = this.state.controllers.length > 0
return (
<>
{this.state.showMultipleSelectedNotes && <MultipleSelectedNotes application={this.application} />}
{this.state.showMultipleSelectedFiles && (
<MultipleSelectedFiles itemListController={this.application.itemListController} />
)}
{shouldNotShowMultipleSelectedItems && hasControllers && (
<>
{this.state.controllers.map((controller) => {
return controller instanceof NoteViewController ? (
<NoteView key={controller.runtimeId} application={this.application} controller={controller} />
) : (
<FileView key={controller.runtimeId} application={this.application} file={controller.item} />
)
})}
</>
)}
</>
)
}
}
export default NoteGroupView