@electerm/electerm-react 1.34.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (273) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +31 -0
  3. package/client/common/auto-complete-data-mapper.js +6 -0
  4. package/client/common/byte-format.js +14 -0
  5. package/client/common/class.js +52 -0
  6. package/client/common/clipboard.js +49 -0
  7. package/client/common/constants.js +308 -0
  8. package/client/common/create-lang-edit-link.js +7 -0
  9. package/client/common/create-title.js +29 -0
  10. package/client/common/db-fix.js +24 -0
  11. package/client/common/db.js +155 -0
  12. package/client/common/download-mirrors.js +10 -0
  13. package/client/common/download.js +16 -0
  14. package/client/common/error-handler.jsx +27 -0
  15. package/client/common/fetch-from-server.js +47 -0
  16. package/client/common/fetch.jsx +71 -0
  17. package/client/common/find-bookmark-group-id.js +15 -0
  18. package/client/common/find-parent.js +30 -0
  19. package/client/common/form-layout.js +27 -0
  20. package/client/common/fs.js +21 -0
  21. package/client/common/get-proxy.js +8 -0
  22. package/client/common/id-with-stamp.js +10 -0
  23. package/client/common/index-sorter.js +4 -0
  24. package/client/common/init-setting-item.js +32 -0
  25. package/client/common/is-absolute-path.js +3 -0
  26. package/client/common/is-ip.js +16 -0
  27. package/client/common/is-valid-path.js +7 -0
  28. package/client/common/key-control-pressed.js +13 -0
  29. package/client/common/key-pressed.js +13 -0
  30. package/client/common/key-shift-pressed.js +7 -0
  31. package/client/common/mode2permission.js +81 -0
  32. package/client/common/new-terminal.js +31 -0
  33. package/client/common/parse-int10.js +3 -0
  34. package/client/common/parse-json-safe.js +11 -0
  35. package/client/common/pass-enc.js +25 -0
  36. package/client/common/post-msg.js +3 -0
  37. package/client/common/pre.js +156 -0
  38. package/client/common/promise-timeout.js +27 -0
  39. package/client/common/resolve.js +31 -0
  40. package/client/common/run-idle.js +1 -0
  41. package/client/common/safe-local-storage.js +35 -0
  42. package/client/common/safe-name.js +19 -0
  43. package/client/common/sftp.js +74 -0
  44. package/client/common/terminal-theme.js +158 -0
  45. package/client/common/test-connection.js +12 -0
  46. package/client/common/time.js +30 -0
  47. package/client/common/to-simple-obj.js +5 -0
  48. package/client/common/track.js +7 -0
  49. package/client/common/transfer.js +76 -0
  50. package/client/common/trzsz.js +62 -0
  51. package/client/common/ui-theme.js +44 -0
  52. package/client/common/uid.js +5 -0
  53. package/client/common/update-check.js +79 -0
  54. package/client/common/upgrade.js +68 -0
  55. package/client/common/wait.js +8 -0
  56. package/client/common/ws.js +161 -0
  57. package/client/components/batch-op/batch-op.jsx +650 -0
  58. package/client/components/bookmark-form/bookmark-form.styl +8 -0
  59. package/client/components/bookmark-form/bookmark-group-tree-format.js +39 -0
  60. package/client/components/bookmark-form/encodes.js +44 -0
  61. package/client/components/bookmark-form/form-ssh-common.jsx +208 -0
  62. package/client/components/bookmark-form/form-tabs.jsx +69 -0
  63. package/client/components/bookmark-form/index.jsx +159 -0
  64. package/client/components/bookmark-form/local-form-ui.jsx +152 -0
  65. package/client/components/bookmark-form/local-form.jsx +16 -0
  66. package/client/components/bookmark-form/proxy.jsx +49 -0
  67. package/client/components/bookmark-form/quick-command-list.jsx +31 -0
  68. package/client/components/bookmark-form/quick-command.jsx +228 -0
  69. package/client/components/bookmark-form/render-auth-ssh.jsx +104 -0
  70. package/client/components/bookmark-form/render-connection-hopping.jsx +229 -0
  71. package/client/components/bookmark-form/render-delayed-scripts.jsx +88 -0
  72. package/client/components/bookmark-form/render-ssh-tunnel.jsx +116 -0
  73. package/client/components/bookmark-form/serial-form-ui.jsx +311 -0
  74. package/client/components/bookmark-form/serial-form.jsx +20 -0
  75. package/client/components/bookmark-form/sftp-enable.jsx +33 -0
  76. package/client/components/bookmark-form/ssh-form-ui.jsx +100 -0
  77. package/client/components/bookmark-form/ssh-form.jsx +348 -0
  78. package/client/components/bookmark-form/telnet-form-ui.jsx +154 -0
  79. package/client/components/bookmark-form/telnet-form.jsx +16 -0
  80. package/client/components/bookmark-form/tree-delete.jsx +87 -0
  81. package/client/components/bookmark-form/use-form-funcs.jsx +50 -0
  82. package/client/components/bookmark-form/use-quick-commands.jsx +83 -0
  83. package/client/components/bookmark-form/use-submit.jsx +77 -0
  84. package/client/components/bookmark-form/use-ui.jsx +82 -0
  85. package/client/components/bookmark-form/x11.jsx +23 -0
  86. package/client/components/common/animate-text.jsx +37 -0
  87. package/client/components/common/animate-text.styl +54 -0
  88. package/client/components/common/external-link.jsx +28 -0
  89. package/client/components/common/help-icon.jsx +25 -0
  90. package/client/components/common/highlight.jsx +23 -0
  91. package/client/components/common/highlight.styl +3 -0
  92. package/client/components/common/input-auto-focus.jsx +68 -0
  93. package/client/components/common/input-confirm.jsx +66 -0
  94. package/client/components/common/logo-elem.jsx +22 -0
  95. package/client/components/common/markdown.jsx +27 -0
  96. package/client/components/common/react-subx.jsx +1 -0
  97. package/client/components/common/resize-wrap.jsx +222 -0
  98. package/client/components/common/resize-wrap.styl +9 -0
  99. package/client/components/common/search.jsx +9 -0
  100. package/client/components/common/show-item.jsx +27 -0
  101. package/client/components/context-menu/boomarks.jsx +15 -0
  102. package/client/components/context-menu/context-menu.jsx +340 -0
  103. package/client/components/context-menu/context-menu.styl +90 -0
  104. package/client/components/context-menu/history.jsx +27 -0
  105. package/client/components/context-menu/icon-holder.jsx +5 -0
  106. package/client/components/context-menu/menu-btn.jsx +224 -0
  107. package/client/components/context-menu/sub-tab-menu.jsx +23 -0
  108. package/client/components/context-menu/tabs.jsx +22 -0
  109. package/client/components/context-menu/zoom.jsx +40 -0
  110. package/client/components/footer/batch-input.jsx +177 -0
  111. package/client/components/footer/footer-entry.jsx +141 -0
  112. package/client/components/footer/footer.styl +47 -0
  113. package/client/components/icons/match-case.jsx +10 -0
  114. package/client/components/icons/match-whole-word.jsx +13 -0
  115. package/client/components/icons/regular-exp.jsx +10 -0
  116. package/client/components/main/css-overwrite.jsx +92 -0
  117. package/client/components/main/error-wrapper.jsx +59 -0
  118. package/client/components/main/index.jsx +11 -0
  119. package/client/components/main/loading.jsx +25 -0
  120. package/client/components/main/main.jsx +149 -0
  121. package/client/components/main/term-fullscreen-control.jsx +21 -0
  122. package/client/components/main/term-fullscreen.styl +27 -0
  123. package/client/components/main/ui-theme.jsx +31 -0
  124. package/client/components/main/upgrade.jsx +351 -0
  125. package/client/components/main/upgrade.styl +27 -0
  126. package/client/components/main/wrapper.styl +41 -0
  127. package/client/components/quick-commands/qm.styl +29 -0
  128. package/client/components/quick-commands/quick-command-item.jsx +36 -0
  129. package/client/components/quick-commands/quick-command-transport-mod.jsx +54 -0
  130. package/client/components/quick-commands/quick-command-transport.jsx +12 -0
  131. package/client/components/quick-commands/quick-commands-box.jsx +233 -0
  132. package/client/components/quick-commands/quick-commands-form-elem.jsx +119 -0
  133. package/client/components/quick-commands/quick-commands-form.jsx +33 -0
  134. package/client/components/quick-commands/quick-commands-list.jsx +128 -0
  135. package/client/components/quick-commands/quick-commands-select.jsx +38 -0
  136. package/client/components/session/session.jsx +533 -0
  137. package/client/components/session/session.styl +53 -0
  138. package/client/components/session/sessions.jsx +445 -0
  139. package/client/components/setting-panel/bookmark-transport.jsx +148 -0
  140. package/client/components/setting-panel/bookmark-tree-list.jsx +14 -0
  141. package/client/components/setting-panel/col.jsx +18 -0
  142. package/client/components/setting-panel/list.jsx +186 -0
  143. package/client/components/setting-panel/list.styl +33 -0
  144. package/client/components/setting-panel/on-tree-drop.js +222 -0
  145. package/client/components/setting-panel/setting-modal.jsx +163 -0
  146. package/client/components/setting-panel/setting-wrap.jsx +37 -0
  147. package/client/components/setting-panel/setting-wrap.styl +52 -0
  148. package/client/components/setting-panel/setting.jsx +858 -0
  149. package/client/components/setting-panel/setting.styl +4 -0
  150. package/client/components/setting-panel/start-session-select.jsx +91 -0
  151. package/client/components/setting-panel/tab-bookmarks.jsx +37 -0
  152. package/client/components/setting-panel/tab-history.jsx +44 -0
  153. package/client/components/setting-panel/tab-quick-commands.jsx +38 -0
  154. package/client/components/setting-panel/tab-settings.jsx +42 -0
  155. package/client/components/setting-panel/tab-themes.jsx +34 -0
  156. package/client/components/setting-panel/tree-list.jsx +978 -0
  157. package/client/components/setting-panel/tree-list.styl +57 -0
  158. package/client/components/setting-sync/data-import.jsx +65 -0
  159. package/client/components/setting-sync/setting-sync-form.jsx +271 -0
  160. package/client/components/setting-sync/setting-sync.jsx +81 -0
  161. package/client/components/setting-sync/sync.styl +7 -0
  162. package/client/components/sftp/address-bar.jsx +139 -0
  163. package/client/components/sftp/address-bookmark-item.jsx +47 -0
  164. package/client/components/sftp/address-bookmark.jsx +81 -0
  165. package/client/components/sftp/address-bookmark.styl +8 -0
  166. package/client/components/sftp/confirm-modal.jsx +184 -0
  167. package/client/components/sftp/file-icon.jsx +22 -0
  168. package/client/components/sftp/file-item.jsx +1226 -0
  169. package/client/components/sftp/file-mode-modal.jsx +205 -0
  170. package/client/components/sftp/file-props-modal.jsx +211 -0
  171. package/client/components/sftp/file-read.js +81 -0
  172. package/client/components/sftp/list-table-ui.jsx +547 -0
  173. package/client/components/sftp/owner-list.js +97 -0
  174. package/client/components/sftp/paged-list.jsx +60 -0
  175. package/client/components/sftp/permission-render.jsx +42 -0
  176. package/client/components/sftp/sftp-entry.jsx +1069 -0
  177. package/client/components/sftp/sftp.styl +217 -0
  178. package/client/components/sftp/transfer-common.js +9 -0
  179. package/client/components/sftp/transfer-conflict.jsx +315 -0
  180. package/client/components/sftp/transfer-speed-format.js +60 -0
  181. package/client/components/sftp/transfer-tag.jsx +40 -0
  182. package/client/components/sftp/transfer-tag.styl +11 -0
  183. package/client/components/sftp/transfer.styl +55 -0
  184. package/client/components/sftp/transport-action.jsx +410 -0
  185. package/client/components/sftp/transport-entry.jsx +108 -0
  186. package/client/components/sftp/transport-types.js +8 -0
  187. package/client/components/sftp/transports-action.jsx +111 -0
  188. package/client/components/sftp/transports-ui.jsx +93 -0
  189. package/client/components/sftp/zip.js +42 -0
  190. package/client/components/sidebar/bookmark-select.jsx +48 -0
  191. package/client/components/sidebar/bookmark.jsx +82 -0
  192. package/client/components/sidebar/history.jsx +66 -0
  193. package/client/components/sidebar/index.jsx +230 -0
  194. package/client/components/sidebar/info-modal.jsx +250 -0
  195. package/client/components/sidebar/info.styl +27 -0
  196. package/client/components/sidebar/side-icon.jsx +25 -0
  197. package/client/components/sidebar/sidebar.styl +128 -0
  198. package/client/components/sidebar/transfer-history-modal.jsx +110 -0
  199. package/client/components/sidebar/transfer-history.styl +3 -0
  200. package/client/components/sidebar/transfer-list-control.jsx +205 -0
  201. package/client/components/sidebar/transfer-list.jsx +55 -0
  202. package/client/components/sidebar/transfer-modal.jsx +76 -0
  203. package/client/components/sidebar/transfer.styl +8 -0
  204. package/client/components/sidebar/transport-ui.jsx +109 -0
  205. package/client/components/tabs/index.jsx +320 -0
  206. package/client/components/tabs/tab.jsx +427 -0
  207. package/client/components/tabs/tabs.styl +220 -0
  208. package/client/components/tabs/window-control.jsx +55 -0
  209. package/client/components/terminal/attach-addon-custom.js +70 -0
  210. package/client/components/terminal/build-ls-term-id.js +5 -0
  211. package/client/components/terminal/index.jsx +1358 -0
  212. package/client/components/terminal/normal-buffer.jsx +33 -0
  213. package/client/components/terminal/term-search.jsx +224 -0
  214. package/client/components/terminal/term-search.styl +15 -0
  215. package/client/components/terminal/terminal-apis.js +31 -0
  216. package/client/components/terminal/terminal-interactive.jsx +148 -0
  217. package/client/components/terminal/terminal.styl +96 -0
  218. package/client/components/terminal/xterm-zmodem.js +48 -0
  219. package/client/components/terminal/zmodem-transfer.jsx +98 -0
  220. package/client/components/terminal/zmodem.styl +14 -0
  221. package/client/components/terminal-info/activity.jsx +54 -0
  222. package/client/components/terminal-info/base.jsx +25 -0
  223. package/client/components/terminal-info/content.jsx +101 -0
  224. package/client/components/terminal-info/data-cols-parser.jsx +50 -0
  225. package/client/components/terminal-info/disk.jsx +29 -0
  226. package/client/components/terminal-info/index.jsx +25 -0
  227. package/client/components/terminal-info/network.jsx +114 -0
  228. package/client/components/terminal-info/resource.jsx +80 -0
  229. package/client/components/terminal-info/run-cmd.jsx +273 -0
  230. package/client/components/terminal-info/terminal-info.styl +29 -0
  231. package/client/components/terminal-info/up.jsx +15 -0
  232. package/client/components/terminal-theme/index.jsx +264 -0
  233. package/client/components/terminal-theme/terminal-theme-list.styl +3 -0
  234. package/client/components/terminal-theme/theme-list.jsx +146 -0
  235. package/client/components/text-editor/text-editor-form.jsx +97 -0
  236. package/client/components/text-editor/text-editor.jsx +182 -0
  237. package/client/css/antd-overwrite.styl +14 -0
  238. package/client/css/basic.styl +38 -0
  239. package/client/css/includes/box.styl +154 -0
  240. package/client/css/includes/font-size.styl +6 -0
  241. package/client/css/includes/index.styl +3 -0
  242. package/client/css/includes/text.styl +31 -0
  243. package/client/css/includes/theme-default.styl +20 -0
  244. package/client/entry/basic.js +58 -0
  245. package/client/entry/index.jsx +15 -0
  246. package/client/entry/worker.js +137 -0
  247. package/client/store/address-bookmark.js +25 -0
  248. package/client/store/app-upgrade.js +23 -0
  249. package/client/store/batch-input-history.js +26 -0
  250. package/client/store/bookmark-group.js +128 -0
  251. package/client/store/bookmark.js +22 -0
  252. package/client/store/common.js +140 -0
  253. package/client/store/context-menu.js +23 -0
  254. package/client/store/db-upgrade.js +43 -0
  255. package/client/store/event.js +70 -0
  256. package/client/store/index.js +335 -0
  257. package/client/store/init-state.js +191 -0
  258. package/client/store/item.js +120 -0
  259. package/client/store/load-data.js +198 -0
  260. package/client/store/quick-command.js +43 -0
  261. package/client/store/session.js +54 -0
  262. package/client/store/setting.js +208 -0
  263. package/client/store/sidebar.js +48 -0
  264. package/client/store/sync.js +390 -0
  265. package/client/store/system-menu.js +120 -0
  266. package/client/store/tab.js +74 -0
  267. package/client/store/terminal-theme.js +116 -0
  268. package/client/store/transfer-history.js +27 -0
  269. package/client/store/transfer-list.js +20 -0
  270. package/client/store/ui-theme.js +71 -0
  271. package/client/store/watch.js +116 -0
  272. package/client/views/index.pug +58 -0
  273. package/package.json +34 -0
@@ -0,0 +1,410 @@
1
+ import { useEffect, useRef } from 'react'
2
+ import { useDelta, useConditionalEffect } from 'react-delta'
3
+ import copy from 'json-deep-copy'
4
+ import { findIndex, isFunction, noop } from 'lodash-es'
5
+ import generate from '../../common/uid'
6
+ import { typeMap, transferTypeMap } from '../../common/constants'
7
+ import fs from '../../common/fs'
8
+ import { transportTypes } from './transport-types'
9
+ import format, { computeLeftTime, computePassedTime } from './transfer-speed-format'
10
+ import { getFolderFromFilePath } from './file-read'
11
+ import resolve from '../../common/resolve'
12
+ import delay from '../../common/wait'
13
+ import { zipCmd, unzipCmd, rmCmd, mvCmd, mkdirCmd } from './zip'
14
+ import './transfer.styl'
15
+
16
+ export default function transportAction (props) {
17
+ const { transfer } = props
18
+ const inst = useRef({})
19
+ const unzipping = useRef(false)
20
+ const initRef = useDelta(transfer.inited)
21
+ const initRefExpand = useDelta(transfer.expaned)
22
+ function update (up) {
23
+ props.modifier((old) => {
24
+ const transferList = copy(old.transferList)
25
+ const index = findIndex(transferList, t => t.id === transfer.id)
26
+ if (index < 0) {
27
+ return {
28
+ transferList
29
+ }
30
+ }
31
+ window.store.editTransfer(
32
+ transferList[index].id,
33
+ up
34
+ )
35
+ Object.assign(transferList[index], up)
36
+ return {
37
+ transferList
38
+ }
39
+ })
40
+ }
41
+ function insert (insts) {
42
+ props.modifier((old) => {
43
+ const transferList = copy(old.transferList)
44
+ const index = findIndex(transferList, t => t.id === transfer.id)
45
+ transferList.splice(index, 1, ...insts)
46
+ window.store.setTransfers(transferList)
47
+ return {
48
+ transferList
49
+ }
50
+ })
51
+ }
52
+ function onEnd (update = {}) {
53
+ if (inst.current.onCancel) {
54
+ return
55
+ }
56
+ const {
57
+ typeTo,
58
+ next
59
+ } = transfer
60
+ const cb = props[typeTo + 'List']
61
+ const finishTime = Date.now()
62
+ if (!props.config.disableTransferHistory) {
63
+ window.store.addTransferHistory(
64
+ {
65
+ ...transfer,
66
+ ...update,
67
+ finishTime,
68
+ startTime: inst.current.startTime,
69
+ speed: format(transfer.fromFile.size, inst.current.startTime),
70
+ host: props.tab.host
71
+ }
72
+ )
73
+ }
74
+ if (next) {
75
+ insert([copy(next)])
76
+ }
77
+ cancel(cb)
78
+ }
79
+ function onData (transferred) {
80
+ if (inst.current.onCancel) {
81
+ return
82
+ }
83
+ const up = {}
84
+ const total = transfer.fromFile.size
85
+ let percent = total === 0
86
+ ? 0
87
+ : Math.floor(100 * transferred / total)
88
+ percent = percent >= 100 ? 99 : percent
89
+ up.percent = percent
90
+ up.status = 'active'
91
+ up.transferred = transferred
92
+ up.startTime = inst.current.startTime
93
+ up.speed = format(transferred, up.startTime)
94
+ Object.assign(
95
+ up,
96
+ computeLeftTime(transferred, total, up.startTime)
97
+ )
98
+ up.passedTime = computePassedTime(up.startTime)
99
+ update(up)
100
+ }
101
+ function cancel (callback) {
102
+ if (inst.current.onCancel) {
103
+ return
104
+ }
105
+ inst.current.onCancel = true
106
+ const { id } = transfer
107
+ inst.current.transport && inst.current.transport.destroy()
108
+ props.modifier((old) => {
109
+ const oldTrans = copy(old.transferList)
110
+ const transferList = oldTrans.filter(t => {
111
+ return t.id !== id
112
+ })
113
+ window.store.setTransfers(transferList)
114
+ return {
115
+ transferList
116
+ }
117
+ }, isFunction(callback) ? callback : noop)
118
+ }
119
+
120
+ function pause () {
121
+ inst.current.transport && inst.current.transport.pause()
122
+ update({
123
+ pausing: true
124
+ })
125
+ }
126
+
127
+ function resume () {
128
+ update({
129
+ pausing: false
130
+ })
131
+ inst.current.transport && inst.current.transport.resume()
132
+ }
133
+
134
+ function handlePauseOrResume () {
135
+ if (transfer.pausing) {
136
+ resume()
137
+ } else {
138
+ pause()
139
+ }
140
+ }
141
+
142
+ function onMessage (e) {
143
+ const action = e?.data?.action
144
+ const id = e?.data?.id
145
+ const ids = e?.data?.ids
146
+ if (id === transfer.id) {
147
+ switch (action) {
148
+ case transportTypes.cancelTransport:
149
+ cancel()
150
+ break
151
+ case transportTypes.pauseOrResumeTransfer:
152
+ handlePauseOrResume()
153
+ break
154
+ default:
155
+ break
156
+ }
157
+ }
158
+ if (
159
+ (ids && ids.includes(transfer.id)) ||
160
+ (ids && ids.length === 0)
161
+ ) {
162
+ if (
163
+ action === transportTypes.pauseTransport
164
+ ) {
165
+ pause()
166
+ } else if (action === transportTypes.resumeTransport) {
167
+ resume()
168
+ } else if (action === transportTypes.cancelTransport) {
169
+ cancel()
170
+ }
171
+ }
172
+ }
173
+ function initEvent () {
174
+ window.addEventListener('message', onMessage)
175
+ }
176
+ function onDestroy () {
177
+ window.removeEventListener('message', onMessage)
178
+ }
179
+ function mvOrCp () {
180
+ const {
181
+ fromPath,
182
+ toPath,
183
+ typeFrom,
184
+ operation // 'mv' or 'cp'
185
+ } = transfer
186
+ if (typeFrom === typeMap.local) {
187
+ return fs[operation](fromPath, toPath)
188
+ .then(onEnd)
189
+ .catch(e => {
190
+ onEnd()
191
+ onError(e)
192
+ })
193
+ }
194
+ return props.sftp[operation](fromPath, toPath)
195
+ .then(onEnd)
196
+ .catch(e => {
197
+ onEnd()
198
+ onError(e)
199
+ })
200
+ }
201
+ async function zipTransfer () {
202
+ const {
203
+ fromPath,
204
+ toPath,
205
+ typeFrom
206
+ } = transfer
207
+ let p
208
+ let isFromRemote
209
+ if (typeFrom === typeMap.local) {
210
+ isFromRemote = false
211
+ p = await fs.zipFolder(fromPath)
212
+ } else {
213
+ isFromRemote = true
214
+ p = await zipCmd(props.pid, props.sessionId, fromPath)
215
+ }
216
+ const { name } = getFolderFromFilePath(p, isFromRemote)
217
+ const { path } = getFolderFromFilePath(toPath, !isFromRemote)
218
+ const nTo = resolve(path, name)
219
+ const newTrans1 = {
220
+ ...copy(transfer),
221
+ toPathReal: transfer.toPath,
222
+ fromPathReal: transfer.fromPath,
223
+ toPath: nTo,
224
+ fromPath: p,
225
+ id: generate()
226
+ }
227
+ delete newTrans1.fromFile
228
+ delete newTrans1.inited
229
+ delete newTrans1.zip
230
+ const newTrans2 = copy(newTrans1)
231
+ newTrans2.unzip = true
232
+ newTrans2.id = generate()
233
+ newTrans1.next = newTrans2
234
+ insert([newTrans1])
235
+ }
236
+
237
+ function buildUnzipPath (transfer) {
238
+ const {
239
+ newName,
240
+ toPath,
241
+ typeTo,
242
+ oldName
243
+ } = transfer
244
+ const isToRemote = typeTo === typeMap.remote
245
+ const { path } = getFolderFromFilePath(toPath, isToRemote)
246
+ const np = newName
247
+ ? resolve(path, 'temp-' + newName)
248
+ : path
249
+ return {
250
+ targetPath: path,
251
+ path: np,
252
+ name: oldName
253
+ }
254
+ }
255
+
256
+ async function unzipFile () {
257
+ if (unzipping.current) {
258
+ return false
259
+ }
260
+ unzipping.current = true
261
+ const {
262
+ fromPath,
263
+ toPath,
264
+ typeTo,
265
+ newName
266
+ } = transfer
267
+ const isToRemote = typeTo === typeMap.remote
268
+ const {
269
+ path,
270
+ name,
271
+ targetPath
272
+ } = buildUnzipPath(transfer)
273
+ if (isToRemote) {
274
+ if (newName) {
275
+ await mkdirCmd(props.pid, props.sessionId, path)
276
+ await delay(1000)
277
+ }
278
+ await unzipCmd(props.pid, props.sessionId, toPath, path)
279
+ if (newName) {
280
+ const mvFrom = resolve(path, name)
281
+ const mvTo = resolve(targetPath, newName)
282
+ await mvCmd(props.pid, props.sessionId, mvFrom, mvTo)
283
+ }
284
+ } else {
285
+ if (newName) {
286
+ await fs.mkdir(path)
287
+ }
288
+ await fs.unzipFile(toPath, path)
289
+ if (newName) {
290
+ const mvFrom = resolve(path, name)
291
+ const mvTo = resolve(targetPath, newName)
292
+ await fs.mv(mvFrom, mvTo)
293
+ }
294
+ }
295
+ await rmCmd(props.pid, props.sessionId, !isToRemote ? fromPath : toPath)
296
+ await fs.rmrf(!isToRemote ? toPath : fromPath)
297
+ if (newName) {
298
+ if (isToRemote) {
299
+ await rmCmd(props.pid, props.sessionId, path)
300
+ } else {
301
+ await fs.rmrf(path)
302
+ }
303
+ }
304
+ onEnd()
305
+ }
306
+
307
+ async function doTransfer () {
308
+ const {
309
+ fromPath,
310
+ toPath,
311
+ typeFrom,
312
+ fromFile: {
313
+ mode: fromMode
314
+ },
315
+ toFile = {}
316
+ } = transfer
317
+ const transferType = typeFrom === typeMap.local ? transferTypeMap.upload : transferTypeMap.download
318
+ const isDown = transferType === transferTypeMap.download
319
+ const localPath = isDown
320
+ ? toPath
321
+ : fromPath
322
+ const remotePath = isDown
323
+ ? fromPath
324
+ : toPath
325
+ const mode = toFile.mode || fromMode
326
+ inst.current.transport = await props.sftp[transferType]({
327
+ remotePath,
328
+ localPath,
329
+ options: { mode },
330
+ onData,
331
+ onError,
332
+ onEnd
333
+ })
334
+ }
335
+ function isTransferAction (action) {
336
+ return action.includes('rename') || action === 'transfer'
337
+ }
338
+ async function initTransfer () {
339
+ if (inst.current.started) {
340
+ return
341
+ }
342
+ const {
343
+ typeFrom,
344
+ typeTo,
345
+ fromFile: {
346
+ isDirectory
347
+ },
348
+ action,
349
+ expanded,
350
+ zip,
351
+ unzip,
352
+ inited
353
+ } = transfer
354
+ const t = Date.now()
355
+ update({
356
+ startTime: t
357
+ })
358
+ inst.current.startTime = t
359
+ inst.current.started = true
360
+ if (unzip && inited) {
361
+ unzipFile()
362
+ } else if (zip && inited) {
363
+ zipTransfer()
364
+ } else if (typeFrom === typeTo) {
365
+ return mvOrCp()
366
+ } else if (isDirectory && expanded && isTransferAction(action)) {
367
+ return mkdir()
368
+ .then(onEnd)
369
+ .catch(onError)
370
+ } else if (!isDirectory) {
371
+ doTransfer()
372
+ } else if (expanded && isDirectory && !isTransferAction(action)) {
373
+ cancel()
374
+ }
375
+ }
376
+ function onError (e) {
377
+ const up = {
378
+ status: 'exception',
379
+ error: e.message
380
+ }
381
+ onEnd(up)
382
+ window.store.onError(e)
383
+ }
384
+ async function mkdir () {
385
+ const {
386
+ typeTo,
387
+ toPath
388
+ } = transfer
389
+ if (typeTo === typeMap.local) {
390
+ return fs.mkdir(toPath)
391
+ .catch(onError)
392
+ }
393
+ return props.sftp.mkdir(toPath)
394
+ .catch(onError)
395
+ }
396
+ useEffect(() => {
397
+ initEvent()
398
+ if (props.transfer.inited) {
399
+ initTransfer()
400
+ }
401
+ return onDestroy
402
+ }, [])
403
+ useConditionalEffect(() => {
404
+ initTransfer()
405
+ }, initRef && initRef.prev !== initRef.curr && initRef.curr === true)
406
+ useConditionalEffect(() => {
407
+ initTransfer()
408
+ }, initRefExpand && initRefExpand.prev !== initRefExpand.curr && initRef.curr === true)
409
+ return null
410
+ }
@@ -0,0 +1,108 @@
1
+ import { PureComponent } from 'react'
2
+ import Confirms from './confirm-modal'
3
+ import ConflictHandler from './transfer-conflict'
4
+ import TransfersHandler from './transports-action'
5
+ import deepCopy from 'json-deep-copy'
6
+ import runIdle from '../../common/run-idle'
7
+ import { commonActions } from '../../common/constants'
8
+ import { pick } from 'lodash-es'
9
+
10
+ export default class TransferEntry extends PureComponent {
11
+ constructor (props) {
12
+ super(props)
13
+ this.state = {
14
+ transferToConfirm: null,
15
+ transferList: [],
16
+ pauseAll: false
17
+ }
18
+ }
19
+
20
+ componentDidMount () {
21
+ window.addEventListener('message', this.onAdd)
22
+ }
23
+
24
+ componentWillUnmount () {
25
+ window.removeEventListener('message', this.onAdd)
26
+ }
27
+
28
+ onAdd = e => {
29
+ const {
30
+ sessionId,
31
+ list,
32
+ action
33
+ } = e?.data || {}
34
+ if (
35
+ action !== commonActions.addTransfer ||
36
+ sessionId !== this.props.sessionId
37
+ ) {
38
+ return false
39
+ }
40
+ this.addTransferList(list)
41
+ }
42
+
43
+ modifier = (...args) => {
44
+ runIdle(() => this.setState(...args))
45
+ }
46
+
47
+ addTransferList = list => {
48
+ this.modifier((old) => {
49
+ let transferList = deepCopy(old.transferList)
50
+ transferList = [
51
+ ...transferList,
52
+ ...list
53
+ ]
54
+ window.store.setTransfers(transferList)
55
+ return {
56
+ transferList
57
+ }
58
+ })
59
+ }
60
+
61
+ render () {
62
+ const prps1 = {
63
+ transferToConfirm: this.state.transferToConfirm,
64
+ modifier: this.modifier
65
+ }
66
+ const prps2 = {
67
+ transferList: this.state.transferList,
68
+ modifier: this.modifier,
69
+ addTransferList: this.addTransferList,
70
+ transferToConfirm: this.state.transferToConfirm,
71
+ ...pick(this.props, [
72
+ 'localList',
73
+ 'remoteList',
74
+ 'sftp',
75
+ 'sessionId',
76
+ 'host',
77
+ 'tab'
78
+ ])
79
+ }
80
+ const prps3 = {
81
+ transferList: this.state.transferList,
82
+ modifier: this.modifier,
83
+ pauseAll: this.state.pauseAll,
84
+ localList: this.props.localListDebounce,
85
+ remoteList: this.props.remoteListDebounce,
86
+ ...pick(this.props, [
87
+ 'sftp',
88
+ 'config',
89
+ 'tab',
90
+ 'sessionId',
91
+ 'pid'
92
+ ])
93
+ }
94
+ return (
95
+ <div>
96
+ <ConflictHandler
97
+ {...prps2}
98
+ />
99
+ <TransfersHandler
100
+ {...prps3}
101
+ />
102
+ <Confirms
103
+ {...prps1}
104
+ />
105
+ </div>
106
+ )
107
+ }
108
+ }
@@ -0,0 +1,8 @@
1
+ export const transportTypes = {
2
+ pauseTransport: 'pause-transport',
3
+ resumeTransport: 'resume-transport',
4
+ cancelTransport: 'cancel-transport',
5
+ pauseOrResumeTransfer: 'pause-or-resume-transfer',
6
+ pauseOrResumeAll: 'pause-or-resume-all',
7
+ cancelAll: 'cancel-all'
8
+ }
@@ -0,0 +1,111 @@
1
+ /**
2
+ * pass transfer list from props
3
+ * when list changes, do transfer and other op
4
+ */
5
+
6
+ import { useDelta, useConditionalEffect } from 'react-delta'
7
+ import copy from 'json-deep-copy'
8
+ import Transports from './transports-ui'
9
+ import { maxTransport } from '../../common/constants'
10
+ import eq from 'fast-deep-equal'
11
+ import { isUndefined } from 'lodash-es'
12
+
13
+ export default (props) => {
14
+ const { transferList, pauseAll } = props
15
+ const delta = useDelta(transferList)
16
+ const pauseControl = useDelta(pauseAll)
17
+ async function control () {
18
+ props.modifier((old) => {
19
+ let transferList = copy(old.transferList)
20
+ transferList = transferList.map(t => {
21
+ const {
22
+ typeTo,
23
+ typeFrom,
24
+ fromFile,
25
+ inited
26
+ } = t
27
+ const ready = !!fromFile
28
+ if (typeTo === typeFrom && ready && !inited) {
29
+ t.inited = true
30
+ }
31
+ return t
32
+ })
33
+ if (old.pauseAll) {
34
+ window.store.setTransfers(transferList)
35
+ return {
36
+ transferList
37
+ }
38
+ }
39
+ let count = transferList.filter(t => {
40
+ const {
41
+ typeTo,
42
+ typeFrom,
43
+ inited
44
+ } = t
45
+ return typeTo !== typeFrom && inited
46
+ }).length
47
+ if (count >= maxTransport) {
48
+ window.store.setTransfers(transferList)
49
+ return {
50
+ transferList
51
+ }
52
+ }
53
+ const len = transferList.length
54
+ const ids = []
55
+ for (let i = 0; i < len; i++) {
56
+ const tr = transferList[i]
57
+ const {
58
+ typeTo,
59
+ typeFrom,
60
+ inited,
61
+ fromFile,
62
+ error,
63
+ id,
64
+ action,
65
+ parentId,
66
+ expanded
67
+ } = tr
68
+ if (!error) {
69
+ ids.push(id)
70
+ }
71
+ const isTransfer = typeTo !== typeFrom
72
+ const parentFolderNotFinished = parentId && ids.includes(parentId)
73
+ const ready = (
74
+ (action && fromFile && !fromFile.isDirectory) ||
75
+ (action && fromFile && fromFile.isDirectory && expanded)
76
+ )
77
+ if (
78
+ !ready ||
79
+ inited ||
80
+ !isTransfer ||
81
+ parentFolderNotFinished
82
+ ) {
83
+ continue
84
+ }
85
+ // if (isTransfer && tr.fromFile.isDirectory) {
86
+ // i = len
87
+ // continue
88
+ // }
89
+ if (
90
+ fromFile && count < maxTransport
91
+ ) {
92
+ count++
93
+ tr.inited = true
94
+ }
95
+ }
96
+ window.store.setTransfers(transferList)
97
+ return {
98
+ transferList
99
+ }
100
+ })
101
+ }
102
+ useConditionalEffect(() => {
103
+ control()
104
+ }, pauseControl && pauseControl.prev && pauseControl.prev !== pauseControl.curr)
105
+ useConditionalEffect(() => {
106
+ control()
107
+ }, delta && !isUndefined(delta.prev) && !eq(delta.prev, delta.curr))
108
+ return (
109
+ <Transports {...props} />
110
+ )
111
+ }