-
Notifications
You must be signed in to change notification settings - Fork 529
Expand file tree
/
Copy pathContextMenu.js
More file actions
161 lines (151 loc) · 5.65 KB
/
ContextMenu.js
File metadata and controls
161 lines (151 loc) · 5.65 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
import React from 'react'
import PropTypes from 'prop-types'
import { withTranslation } from 'react-i18next'
import { CopyToClipboard } from 'react-copy-to-clipboard'
import { Dropdown, DropdownMenu, Option } from '../dropdown/Dropdown.js'
import StrokeCopy from '../../icons/StrokeCopy.js'
import StrokeShare from '../../icons/StrokeShare.js'
import StrokeSpeaker from '../../icons/StrokeSpeaker.js'
import StrokePencil from '../../icons/StrokePencil.js'
import StrokeIpld from '../../icons/StrokeIpld.js'
import StrokeTrash from '../../icons/StrokeTrash.js'
import StrokeDownload from '../../icons/StrokeDownload.js'
import StrokeData from '../../icons/StrokeData.js'
import StrokePin from '../../icons/StrokePin.js'
import { cliCmdKeys } from '../../bundles/files/consts.js'
class ContextMenu extends React.Component {
constructor (props) {
super(props)
this.dropdownMenuRef = React.createRef()
}
state = {
dropdown: false
}
wrap = (name, cliOptions) => () => {
if (name === 'onCliTutorMode' && cliOptions) {
this.props.doSetCliOptions(cliOptions)
}
this.props.handleClick()
this.props[name]()
}
componentDidUpdate () {
if (this.props.autofocus && this.props.isOpen) {
if (!this.dropdownMenuRef.current) return
const firstButton = this.dropdownMenuRef.current.querySelector('button')
if (!firstButton) return
firstButton.focus()
}
}
render () {
const {
t, onRename, onRemove, onDownload, onInspect, onShare, onDownloadCar, onPublish,
translateX, translateY, className, isMfs, isUnknown, isCliTutorModeEnabled
} = this.props
return (
<Dropdown className={className}>
<DropdownMenu
ref={this.dropdownMenuRef}
top={-8}
arrowMarginRight='11px'
left='calc(100% - 200px)'
translateX={-translateX}
translateY={-translateY}
open={this.props.isOpen}
onDismiss={this.props.handleClick}>
{ onShare &&
<Option onClick={this.wrap('onShare')}>
<StrokeShare className='w2 mr2 fill-aqua' />
{t('actions.share')}
</Option>
}
<CopyToClipboard text={String(this.props.cid)} onCopy={this.props.handleClick}>
<Option>
<StrokeCopy className='w2 mr2 fill-aqua' />
{t('actions.copyHash')}
</Option>
</CopyToClipboard>
{ onInspect &&
<Option onClick={this.wrap('onInspect')}>
<StrokeIpld className='w2 mr2 fill-aqua' />
{t('app:actions.inspect')}
</Option>
}
<Option onClick={this.wrap('onPinning')} isCliTutorModeEnabled={isCliTutorModeEnabled}
onCliTutorMode={this.wrap('onCliTutorMode', cliCmdKeys.PIN_OBJECT)}>
<StrokePin className='w2 mr2 fill-aqua' />
{ t('app:actions.setPinning') }
</Option>
{ !isUnknown && onDownload &&
<Option onClick={this.wrap('onDownload')} isCliTutorModeEnabled={isCliTutorModeEnabled}
onCliTutorMode={this.wrap('onCliTutorMode', cliCmdKeys.DOWNLOAD_OBJECT_COMMAND)}>
<StrokeDownload className='w2 mr2 fill-aqua' />
{t('app:actions.download')}
</Option>
}
{ !isUnknown && onDownloadCar &&
<Option onClick={this.wrap('onDownloadCar')} isCliTutorModeEnabled={isCliTutorModeEnabled}
onCliTutorMode={this.wrap('onCliTutorMode', cliCmdKeys.DOWNLOAD_CAR_COMMAND)}>
<StrokeData className='w2 mr2 fill-aqua' />
{t('app:actions.downloadCar')}
</Option>
}
{ !isUnknown && isMfs && onRename &&
<Option onClick={this.wrap('onRename')} isCliTutorModeEnabled={isCliTutorModeEnabled}
onCliTutorMode={this.wrap('onCliTutorMode', cliCmdKeys.RENAME_IPFS_OBJECT)}>
<StrokePencil className='w2 mr2 fill-aqua' />
{t('app:actions.rename')}
</Option>
}
{ !isUnknown && isMfs && onRemove &&
<Option onClick={this.wrap('onRemove')} isCliTutorModeEnabled={isCliTutorModeEnabled}
onCliTutorMode={this.wrap('onCliTutorMode', cliCmdKeys.REMOVE_FILE_FROM_IPFS)}>
<StrokeTrash className='w2 mr2 fill-aqua' />
{t('app:actions.remove')}
</Option>
}
{ onPublish &&
<Option onClick={this.wrap('onPublish')} isCliTutorModeEnabled={isCliTutorModeEnabled}
onCliTutorMode={this.wrap('onCliTutorMode', cliCmdKeys.PUBLISH_WITH_IPNS)}>
<StrokeSpeaker className='w2 mr2 fill-aqua' />
{t('actions.publishWithIpns')}
</Option>
}
</DropdownMenu>
</Dropdown>
)
}
}
ContextMenu.propTypes = {
isMfs: PropTypes.bool.isRequired,
isOpen: PropTypes.bool.isRequired,
isUnknown: PropTypes.bool.isRequired,
hash: PropTypes.string,
pinned: PropTypes.bool,
handleClick: PropTypes.func,
translateX: PropTypes.number.isRequired,
translateY: PropTypes.number.isRequired,
left: PropTypes.number.isRequired,
onRemove: PropTypes.func,
onRename: PropTypes.func,
onDownload: PropTypes.func,
onDownloadCar: PropTypes.func,
onInspect: PropTypes.func,
onShare: PropTypes.func,
onPublish: PropTypes.func,
className: PropTypes.string,
t: PropTypes.func.isRequired,
tReady: PropTypes.bool.isRequired,
autofocus: PropTypes.bool
}
ContextMenu.defaultProps = {
isMfs: false,
isOpen: false,
isUnknown: false,
top: 0,
left: 0,
right: 'auto',
translateX: 0,
translateY: 0,
className: ''
}
export default withTranslation('files', { withRef: true })(ContextMenu)