Skip to content

Commit b1775cd

Browse files
committed
lots of behavior fixes and cleanup
1 parent 79a5d5b commit b1775cd

File tree

4 files changed

+95
-89
lines changed

4 files changed

+95
-89
lines changed

plugins/sidebar/index.js

Lines changed: 7 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ const deviceStore = require('../../src/stores/device');
1515
const editorStore = require('../../src/stores/editor');
1616
const fileStore = require('../../src/stores/file');
1717

18-
const { processCreate, processSave, newFile } = require('../../src/actions/file');
18+
const { processCreate, processNoCreate, processSave, newFile, loadFile } = require('../../src/actions/file');
1919
function noop(){}
2020

2121
function sidebar(app, opts, done){
@@ -41,30 +41,6 @@ function sidebar(app, opts, done){
4141
});
4242
chrome.syncFileSystem.onServiceStatusChanged.addListener(refreshDirectory);
4343

44-
// TODO: move to file store
45-
function loadFile(filename, cb = noop){
46-
const previousFile = space.filename.deref();
47-
let unsaved = false;
48-
if(previousFile) {
49-
unsaved = _checkUnsaved(previousFile);
50-
}
51-
52-
if(filename && !unsaved){
53-
space.loadFile(filename, (err) => {
54-
if(err){
55-
cb(err);
56-
return;
57-
}
58-
59-
userConfig.set('last-file', filename);
60-
61-
cb();
62-
});
63-
} else {
64-
cb();
65-
}
66-
}
67-
6844
app.view('sidebar', function(el, cb){
6945
console.log('sidebar render');
7046
const directory = space.directory;
@@ -84,32 +60,16 @@ function sidebar(app, opts, done){
8460
});
8561

8662
// Internal Helpers
87-
function _checkUnsaved(file) {
88-
const unnamed = space.directory.every(function(x) {
89-
if(x.get('name') === file) {
90-
return false;
91-
}
92-
else {
93-
return true;
94-
}
95-
});
96-
if(unnamed) {
97-
processSave();
98-
return true;
99-
}
100-
}
10163

10264
function _onChangeFileStore() {
10365
const { showSaveOverlay } = fileStore.getState();
10466
if (showSaveOverlay) {
10567
_showCreateOverlay();
68+
} else {
69+
overlay.hide();
10670
}
10771
}
10872

109-
function _hideOverlay() {
110-
overlay.hide();
111-
}
112-
11373
function _renderOverlay(component){
11474
function renderer(el){
11575
React.render(component, el);
@@ -122,7 +82,7 @@ function sidebar(app, opts, done){
12282
const component = (
12383
<NewFileOverlay
12484
onAccept={processCreate}
125-
onCancel={_hideOverlay} />
85+
onCancel={processNoCreate} />
12686
);
12787

12888
_renderOverlay(component);
@@ -141,8 +101,6 @@ function sidebar(app, opts, done){
141101
fileStore.userConfig = userConfig;
142102

143103
fileStore.toast = toast;
144-
fileStore.loadFile = loadFile;
145-
fileStore.overlay = overlay;
146104

147105
// Set up listeners
148106
fileStore.listen(_onChangeFileStore);
@@ -151,13 +109,10 @@ function sidebar(app, opts, done){
151109
const cwd = userConfig.get('cwd') || opts.defaultProject;
152110
const lastFile = userConfig.get('last-file');
153111
console.log(lastFile);
154-
space.changeDir(cwd, () => loadFile(lastFile, (err) => {
155-
if(err){
156-
newFile();
157-
}
158-
112+
space.changeDir(cwd, () => {
113+
loadFile(lastFile);
159114
done();
160-
}));
115+
});
161116

162117
}
163118

plugins/sidebar/overlays/new-file.js

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class NewFileOverlay extends React.Component {
3333

3434
return (
3535
<Card styles={styles.overlay}>
36-
<h3 style={styles.overlayTitle}>Please name your file.</h3>
36+
<h3 style={styles.overlayTitle}>Do you want to save the changes you made to New file?</h3>
3737
<TextField
3838
value={fileName}
3939
ref="filename"
@@ -42,8 +42,9 @@ class NewFileOverlay extends React.Component {
4242
floatingLabel
4343
onChange={this._onUpdateName} />
4444
<div style={styles.overlayButtonContainer}>
45-
<Button onClick={this._onAccept}>Create</Button>
46-
<Button onClick={this._onCancel}>Cancel</Button>
45+
<Button onClick={this._onAccept}>Save As</Button>
46+
<Button onClick={() => this._onCancel({ trash: true })}>Don't Save</Button>
47+
<Button onClick={() => this._onCancel({ trash: false })}>Cancel</Button>
4748
</div>
4849
</Card>
4950
);
@@ -54,16 +55,16 @@ class NewFileOverlay extends React.Component {
5455

5556
clearName();
5657
if(typeof onAccept === 'function'){
57-
onAccept(fileName, evt);
58+
onAccept(fileName);
5859
}
5960
}
6061

61-
_onCancel(evt){
62+
_onCancel(status, evt){
6263
const { onCancel } = this.props;
6364

6465
clearName();
6566
if(typeof onCancel === 'function'){
66-
onCancel(evt);
67+
onCancel(status);
6768
}
6869
}
6970

src/actions/file.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,18 @@ class FileActions {
1919
this.dispatch();
2020
}
2121

22+
loadFile(filename){
23+
this.dispatch(filename);
24+
}
25+
2226
processCreate(name) {
2327
this.dispatch(name);
2428
}
2529

30+
processNoCreate(status){
31+
this.dispatch(status);
32+
}
33+
2634
processSave() {
2735
this.dispatch();
2836
}

src/stores/file.js

Lines changed: 73 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ const alt = require('../alt');
66
const styles = require('../../plugins/sidebar/styles');
77

88
const { clearName, deleteFile, hideOverlay, newFile, processCreate,
9-
processSave, updateName } = require('../actions/file');
9+
processNoCreate, processSave, updateName, loadFile } = require('../actions/file');
1010

1111
class FileStore {
1212
constructor() {
@@ -16,26 +16,37 @@ class FileStore {
1616
onDeleteFile: deleteFile,
1717
onHideOverlay: hideOverlay,
1818
onNewFile: newFile,
19+
onLoadFile: loadFile,
20+
onProcessNoCreate: processNoCreate,
1921
onProcessCreate: processCreate,
2022
onProcessSave: processSave,
2123
onUpdateName: updateName
2224
});
2325

2426
this.state = {
2527
fileName: '',
28+
isNewFile: false,
2629
showSaveOverlay: false
2730
};
2831

32+
this.loadQueue = [];
2933
}
3034

3135
onClearName() {
36+
const { workspace } = this.getInstance();
3237
this.setState({
33-
fileName: ''
38+
fileName: workspace.filename.deref()
39+
});
40+
}
41+
42+
onUpdateName(value) {
43+
this.setState({
44+
fileName: value
3445
});
3546
}
3647

3748
onDeleteFile(name) {
38-
const { overlay, workspace } = this.getInstance();
49+
const { workspace } = this.getInstance();
3950

4051
if(!name){
4152
return;
@@ -45,7 +56,7 @@ class FileStore {
4556
.tap(() => this._handleSuccess(`'${name}' deleted successfully`))
4657
.catch(this._handleError)
4758
.finally(() => {
48-
overlay.hide();
59+
this.setState({ showSaveOverlay: false });
4960
this.onNewFile();
5061
});
5162

@@ -58,13 +69,12 @@ class FileStore {
5869
}
5970

6071
onHideOverlay() {
61-
const { overlay } = this.getInstance();
62-
overlay.hide();
72+
this.setState({ showSaveOverlay: false });
6373
this.onClearName();
6474
}
6575

6676
onProcessCreate(name) {
67-
const { loadFile, overlay, workspace } = this.getInstance();
77+
const { loadFile, workspace } = this.getInstance();
6878

6979
if(!name){
7080
return;
@@ -73,34 +83,36 @@ class FileStore {
7383
workspace.filename.update(() => name);
7484
// TODO: these should transparently accept cursors for all non-function params
7585
workspace.saveFile(workspace.filename.deref(), workspace.current)
76-
.tap(() => loadFile(name, () => this._handleSuccess(`'${name}' created successfully`)))
86+
.tap(() => {
87+
this.setState({ isNewFile: false });
88+
if(this.loadQueue.length){
89+
this.onLoadFile(this.loadQueue.shift());
90+
}
91+
})
92+
.tap(() => this._handleSuccess(`'${name}' created successfully`))
7793
.catch(this._handleError)
78-
.finally(overlay.hide);
94+
.finally(() => this.setState({ showSaveOverlay: false }));
7995

8096
this.onHideSave();
8197
}
8298

83-
onProcessSave() {
84-
85-
const { workspace } = this.getInstance();
86-
87-
// TODO: reuse with checkUnsaved in sidebar index
88-
const file = workspace.filename.deref();
89-
const unnamed = workspace.directory.every(function(x) {
90-
if(x.get('name') === file) {
91-
return false;
92-
}
93-
else {
94-
return true;
99+
onProcessNoCreate(status){
100+
if(status.trash){
101+
this.setState({ isNewFile: false, showSaveOverlay: false });
102+
if(this.loadQueue.length){
103+
this.onLoadFile(this.loadQueue.shift());
95104
}
96-
});
97-
if(unnamed) {
98-
this.setState({
99-
fileName: file,
100-
showSaveOverlay: true
101-
});
105+
} else {
106+
this.setState({ showSaveOverlay: false });
102107
}
103-
else {
108+
}
109+
110+
onProcessSave() {
111+
const { isNewFile } = this.state;
112+
113+
if(isNewFile) {
114+
this.setState({ showSaveOverlay: true });
115+
} else {
104116
this.setState({ showSaveOverlay: false });
105117
this._save();
106118
}
@@ -139,11 +151,41 @@ class FileStore {
139151
workspace.updateContent('');
140152

141153
userConfig.set('last-file', builtName);
142-
}
143154

144-
onUpdateName(value) {
145155
this.setState({
146-
fileName: value
156+
fileName: builtName,
157+
isNewFile: true
158+
});
159+
}
160+
161+
_queueLoad(filename){
162+
this.loadQueue.push(filename);
163+
}
164+
165+
onLoadFile(filename){
166+
const { workspace, userConfig } = this.getInstance();
167+
const { isNewFile } = this.state;
168+
169+
const content = workspace.current.deref();
170+
171+
if(isNewFile && content.length){
172+
this._queueLoad(filename);
173+
this.onProcessSave();
174+
return;
175+
}
176+
177+
workspace.loadFile(filename, (err) => {
178+
if(err){
179+
this._handleError(err);
180+
return;
181+
}
182+
183+
userConfig.set('last-file', filename);
184+
185+
this.setState({
186+
fileName: filename,
187+
isNewFile: false
188+
});
147189
});
148190
}
149191

0 commit comments

Comments
 (0)