create FileMenu class
This commit is contained in:
parent
431be1bf5a
commit
60943ca082
130
src/components/fileMenu.jsx
Normal file
130
src/components/fileMenu.jsx
Normal file
@ -0,0 +1,130 @@
|
||||
import { Component,Fragment } from 'react'
|
||||
import { Button, WarningButton, Input } from '../styled'
|
||||
import { FileSettingsHeader, FileSettingsPopup, FileMenuContainer, ButtonWrapper } from './fileBrowser.styled'
|
||||
|
||||
class FileMenu extends Component {
|
||||
constructor() {
|
||||
super()
|
||||
this.state = {
|
||||
action: "",
|
||||
newFile: ""
|
||||
}
|
||||
}
|
||||
|
||||
// update newFile state
|
||||
handleInputChange = e => {
|
||||
this.setState({ newFile: e.target.value })
|
||||
}
|
||||
|
||||
// start the action
|
||||
doAction = e => {
|
||||
if (typeof e?.preventDefault === "function") e.preventDefault()
|
||||
|
||||
const { action, newFile } = this.state
|
||||
|
||||
this.props.action(action, newFile)
|
||||
}
|
||||
|
||||
// after clicking new folder or rename show popup to enter file name
|
||||
handlePathClick = (e, action) => {
|
||||
e.stopPropagation()
|
||||
return this.setState({ action })
|
||||
}
|
||||
|
||||
// after clicking copy or move show the dest path
|
||||
handleSyncClick = (e, action) => {
|
||||
e.stopPropagation()
|
||||
this.setState({ action })
|
||||
}
|
||||
|
||||
// show delete warning and stop close menu
|
||||
handleDeleteClick = e => {
|
||||
e.stopPropagation()
|
||||
this.setState({ action: "delete" })
|
||||
}
|
||||
|
||||
// ask user to enter a path and submit
|
||||
renderPathPopup = () => {
|
||||
const { newFile, action } = this.state
|
||||
const { file } = this.props.info
|
||||
|
||||
if (action === "rename" || action === "newfolder") return (
|
||||
<FileSettingsPopup onClick={e => e.stopPropagation()}>
|
||||
<label htmlFor="newFile">
|
||||
<FileSettingsHeader> { action === "rename" ? `Renaming ${file.Name}` : "New Folder" } </FileSettingsHeader>
|
||||
</label>
|
||||
|
||||
<form onSubmit={this.doAction}>
|
||||
<Input type="text" name="newFile" id="newFile" autoFocus value={newFile} onChange={this.handleInputChange} autoComplete="off" />
|
||||
<Button type="submit"> Submit </Button>
|
||||
</form>
|
||||
</FileSettingsPopup>
|
||||
)
|
||||
}
|
||||
|
||||
// ask user to confirm the copy or move
|
||||
renderConfirmPath = () => {
|
||||
const { action } = this.state
|
||||
const { otherPath, file } = this.props.info
|
||||
|
||||
if (action === "copy" || action === "move") return (
|
||||
<FileSettingsPopup>
|
||||
<FileSettingsHeader> Confirm </FileSettingsHeader>
|
||||
<p>
|
||||
{ action === "copy" ? "Copy" : "Move" } { file.Name } to { otherPath }?
|
||||
</p>
|
||||
<ButtonWrapper>
|
||||
<Button onClick={() => this.props.action()}>Cancel</Button>
|
||||
<Button onClick={this.doAction}>{ action === "copy" ? "Copy" : "Move" }</Button>
|
||||
</ButtonWrapper>
|
||||
</FileSettingsPopup>
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Renders a simple menu to perform actions on the clicked file
|
||||
*/
|
||||
renderMenu = () => {
|
||||
const { cursorX, cursorY, file } = this.props.info
|
||||
const { action } = this.state
|
||||
|
||||
if (file?.Name?.length && (action === "delete" || action === "")) return (
|
||||
<FileMenuContainer
|
||||
onMouseLeave={() => this.setState({ showMenu: false })}
|
||||
cursorX={cursorX} cursorY={cursorY}
|
||||
>
|
||||
<Button onClick={e => this.handlePathClick(e, "newfolder")}> New Folder </Button>
|
||||
<Button onClick={e => this.handleSyncClick(e, "copy")}> Copy </Button>
|
||||
<Button onClick={e => this.handleSyncClick(e, "move")}> Move </Button>
|
||||
<Button onClick={e => this.handlePathClick(e, "rename")}> Rename </Button>
|
||||
{
|
||||
action === "delete" ?
|
||||
<WarningButton onClick={this.doAction}> Delete </WarningButton>
|
||||
:
|
||||
<Button onClick={this.handleDeleteClick}> Delete </Button>
|
||||
}
|
||||
</FileMenuContainer>
|
||||
)
|
||||
|
||||
if (action === "") return (
|
||||
<FileMenuContainer
|
||||
onMouseLeave={() => this.doAction()}
|
||||
cursorX={cursorX} cursorY={cursorY}
|
||||
>
|
||||
<Button onClick={e => this.handlePathClick(e, "newfolder")}> New Folder </Button>
|
||||
</FileMenuContainer>
|
||||
)
|
||||
}
|
||||
|
||||
render = () => {
|
||||
return (
|
||||
<Fragment>
|
||||
{ this.renderMenu() }
|
||||
{ this.renderConfirmPath() }
|
||||
{ this.renderPathPopup() }
|
||||
</Fragment>
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
export default FileMenu
|
Loading…
x
Reference in New Issue
Block a user