Skip to content

Commit e94e61d

Browse files
authored
Tabs + Build process (#24)
* WIP: moving to simple-ftp client * ADDED: needsConnection decorator CLEANED-UP: fileState so that no un-necessary FS is re-created ADDED: SimpleFtp.list, SimpleFtp.cd implemented (more work needed) * ADDED: basic cache handling for ftp connection (need to handle close/timeout now) FIXED: remove unneeded call to waitForConnection in several methods (@needsConnection) already does this * ADDED: Client.freeClient to remove a client ADDED: Ftp: schedule a call to 'NOOP' to detect timeouts (needs more work since we cannot call it if an operation is already in progress) * ADDED: canTimeout function that will create a new client if needed FIXED: 530 error keeps connection opened which breaks calls to client.access() * ADDED: no internet error handling (EHOSTDOWN) IMPROVED: made the login process use the canTimeout annotation as well FIXED: canTimeout should reject if login is skipped, fixes infinite loop FIXED: pathbar tooltip could be stuck if window was small enough FIXED: tooltip Linux example localized string * WIP: added the transferId to async FS calls so that a new FTP client can be used if needed * ADDED: implemented SimpleFtp.get/.getStream, works but needs testing * FIXED: made FsLocal detect Windows network shares which start with \\ * FIXED: use a new transferId when opening a file * IMPROVED: made openFile() define and use a Batch instead of using the get method RENAMED: appState.prepareDragDropTransfer -> prepareTransfer ADDED: appState.prepareLocalTransfer that transfers from a srcCache to local FS ADDED: Fs now exports DOWNLOADS_DIR const REMOVED: FS.get() method that's no longer used * ADDED: error handling on readStream when doing a transfer, needs testing * 1.4.1 * FIXED: hardcoded english strings in Toolbar.tsx, fixes #23 * FIXED: crash when initiating a transfer from ftp after going back in history * WIP: improve transfers progress bar * ADDED: tabs handling * FIXED: drag and drop (tabs regression) UPGRADED: blueprintjs to 3.10.0 (to use Icon htmlTitle prop) * ADDED: new ViewState store to keep track of view tabs WIP: close tab button works, needs testing * FIXED: using cursor keys would move selection in both views * FIXED: viewState.isActive set to false by default, not undefined, fixes mod + o FIXED: by default mod + o should open in current view, shift + mod + o in other view * IMPROVED: when clicking on an inactive view, only stop event propagation when click happens inside the filetable * UPDATED: React-FTP => React-Explorer UPDATED: mac build configuration now supports darkMode ADDED: new platform.isPackage to detect package mode FIXED: disable watcher/devtools in package mode * FIXED: close tab on non-selected tab ADDED: viewState.selectTab ADDED: new webpack production config file * FIXED: do not add a new history entry when selecting tab * IMPROVED: tab css * ADDED: new/next/previous/close tab accelerators, need to implement new tab * ADDED: missing locale string * ADDED: new sendFakeCombo() to send combos from the renderer process ADDED: addTab now works (should tabs added at the end?) IMPROVED: use ellipsis to cleanly cut tab titles * ADDED: app icon ADDED: Windows and Linux build targets ADDED: splash screen FIXED: watcher (development mode) ADDED: use OverlayScrellbars for main webview (needs testing on Win/Linux) ADDED: git hash now displayed in logs and about dialog * ADDED: copy button in about dialog to copy version string to clipboard (Win/Linux)
1 parent b766aff commit e94e61d

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+2771
-863
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@ node_modules
22
dist/
33
dist-e2e/
44
.DS_Store
5+
build/

README.md

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
# FTP & local file explorer written in TypeScript & React
22

3-
![React-FTP](./img/react-ftp.png)
3+
![React-Explorer](./img/react-ftp.png)
44

55
## Features
66

77
**Note**
8-
React-FTP is still being worked on so this is a work in progress.
8+
React-Explorer is still being worked on so this is a work in progress.
99

10-
- Plugin-based filesystem type: FTP and local supported for now
10+
- Plugin-based filesystem type: local supported for now
1111
- Can be fully keyboard controlled
12-
- Transfers from Local to FTP, from FTP to FTP and from local to local folders
12+
- Transfers from/to any plugin
1313
- Fully localized (French & English available)
14-
- DarkMode with automatic detection on macOS Mojave
14+
- Dark Mode with automatic detection on macOS Mojave
1515

1616
## Requirements
1717

@@ -21,9 +21,9 @@ React-FTP is still being worked on so this is a work in progress.
2121

2222
## Building for local development
2323

24-
In order to build React-FTP you need to have installed `nodejs`.
24+
In order to build React-Explorer you need to have installed `nodejs`.
2525

26-
Once installed, building React-FTP is as easy as typing:
26+
Once installed, building React-Explorer is as easy as typing:
2727

2828
```shell
2929
npm install && npm run build
@@ -38,34 +38,34 @@ npx electron ./dist/main.js
3838
```
3939

4040
## Building binary packages
41-
TODO
42-
43-
### Windows
41+
In order to build binary packages, simply type the following:
4442

45-
### macOS
43+
```shell
44+
npm run dist
45+
```
4646

47-
### Linux
47+
This will build packaged binaries of React Explorer into the `dist` folder.
4848

4949
## Tests
5050

5151
## How to develop a new Plugin
5252

53-
React-FTP has been written so that it can easily be extended using plugins.
53+
React-Explorer has been written so that it can easily be extended using plugins.
5454

5555
TODO
5656

5757
## Acknowledgments
5858

59-
FTP-Electron makes use of the following tools/components:
59+
React-Explorer makes use of the following tools/components:
6060

6161
- [React](https://reactjs.org)
6262
- [Electron](https://electron.s.org)
6363
- [TypeScript](https://typescriptlang.org)
6464
- [MobX](https://mobx.js.org)
6565
- [Blueprintjs](https://blueprintjs.com)
66-
- [node-ftp](https://github.com/warpdesign/node-ftp)
66+
- [basic-ftp](https://github.com/patrickjuchli/basic-ftp)
6767
- [i18next](https://i18next.com) & [react-i18n](https://github.com/i18next/react-i18next)
6868

6969
## Licence
7070

71-
React-FTP is licenced under the MIT licence.
71+
React-Explorer is licenced under the MIT licence.

img/icon-512x512.png

5.29 KB
Loading

img/react-explorer.png

6.27 KB
Loading

index.html

Lines changed: 65 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,70 @@
11
<!DOCTYPE html>
22
<html>
3-
<head>
4-
<meta charset="UTF-8" />
5-
<meta http-equiv="Content-Security-Policy" content="script-src 'self'">
6-
<title><%= htmlWebpackPlugin.options.title %></title>
7-
</head>
8-
<body>
9-
<div id="root"></div>
10-
<button id="reload">Reload!</button>
11-
<!-- Dependencies -->
12-
<!-- <script src="./node_modules/react/umd/react.development.js"></script>
3+
4+
<head>
5+
<meta charset="UTF-8" />
6+
<meta http-equiv="Content-Security-Policy" content="script-src 'self'">
7+
<title><%= htmlWebpackPlugin.options.title %></title>
8+
<style type="text/css">
9+
body {
10+
margin: 0;
11+
overflow: hidden;
12+
height: 100vh;
13+
}
14+
15+
#root {
16+
opacity: 0;
17+
transition-property: opacity;
18+
transition-duration: 1s;
19+
}
20+
21+
body.loaded #root {
22+
opacity: 1;
23+
}
24+
25+
.splash {
26+
position: absolute;
27+
z-index: 1;
28+
display: flex;
29+
justify-content: center;
30+
align-items: center;
31+
opacity: .6;
32+
transition-property: opacity;
33+
transition-duration: 1s;
34+
width: 100%;
35+
height: 90%;
36+
}
37+
38+
body.loaded .splash {
39+
pointer-events: none;
40+
opacity: 0;
41+
}
42+
</style>
43+
</head>
44+
45+
<body>
46+
<div class="splash">
47+
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 40 40"
48+
version="1.1" width="128px" height="128px">
49+
<g id="surface1">
50+
<path style=" fill:#B6DCFE;"
51+
d="M 1.5 35.5 L 1.5 4.5 L 11.792969 4.5 L 14.792969 7.5 L 35.5 7.5 L 35.5 35.5 Z " />
52+
<path style=" fill:#4788C7;"
53+
d="M 11.585938 5 L 14.585938 8 L 35 8 L 35 35 L 2 35 L 2 5 L 11.585938 5 M 12 4 L 1 4 L 1 36 L 36 36 L 36 7 L 15 7 Z " />
54+
<path style=" fill:#DFF0FE;"
55+
d="M 1.597656 35.5 L 5.417969 14.5 L 16.152344 14.5 L 19.152344 12.5 L 39.410156 12.5 L 35.578125 35.5 Z " />
56+
<path style=" fill:#4788C7;"
57+
d="M 38.820313 13 L 35.152344 35 L 2.199219 35 L 5.835938 15 L 16.304688 15 L 16.554688 14.832031 L 19.304688 13 L 38.820313 13 M 40 12 L 19 12 L 16 14 L 5 14 L 1 36 L 36 36 Z " />
58+
</g>
59+
</svg>
60+
</div>
61+
<div id="root"></div>
62+
<!-- Dependencies -->
63+
<!-- <script src="./node_modules/react/umd/react.development.js"></script>
1364
<script src="./node_modules/react-dom/umd/react-dom.development.js"></script> -->
1465

15-
<!-- Main -->
16-
<!-- <script src="./dist/bundle.js"></script> -->
17-
</body>
66+
<!-- Main -->
67+
<!-- <script src="./dist/bundle.js"></script> -->
68+
</body>
69+
1870
</html>

0 commit comments

Comments
 (0)