Skip to content

Commit 1a27732

Browse files
committed
adds confirm dialog on overwrite
1 parent ad11ec5 commit 1a27732

13 files changed

+149
-7
lines changed

src/constants/action-types.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ const actionTypes = {
2525
UPDATE_DOWNLOAD_PROGRESS: 'UPDATE_DOWNLOAD_PROGRESS',
2626
QUEUE_NEW_FILE: 'QUEUE_NEW_FILE',
2727
QUEUE_CHANGE_FILE: 'QUEUE_CHANGE_FILE',
28+
QUEUE_OVERWRITE_FILE: 'QUEUE_OVERWRITE_FILE',
2829
RESET_ACTION_QUEUE: 'RESET_ACTION_QUEUE'
2930
};
3031

src/constants/overlay-states.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ const overlayStates = {
55
SAVE_OVERLAY: 'SAVE_OVERLAY',
66
DOWNLOAD_OVERLAY: 'DOWNLOAD_OVERLAY',
77
PROJECTS_OVERLAY: 'PROJECTS_OVERLAY',
8+
OVERWRITE_OVERLAY: 'OVERWRITE_OVERLAY',
89
DELETE_FILE_OVERLAY: 'DELETE_FILE_OVERLAY',
910
DELETE_PROJECT_OVERLAY: 'DELETE_PROJECT_OVERLAY'
1011
};

src/constants/queued-action-types.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22

33
const queuedActionTypes = {
44
NEW_FILE: 'NEW_FILE',
5-
CHANGE_FILE: 'CHANGE_FILE'
5+
CHANGE_FILE: 'CHANGE_FILE',
6+
OVERWRITE_FILE: 'OVERWRITE_FILE'
67
};
78

89
module.exports = queuedActionTypes;

src/creators/index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ const creators = {
77
showDeleteProjectOverlay: require('./show-delete-project-overlay'),
88
showDownloadOverlay: require('./show-download-overlay'),
99
showProjectsOverlay: require('./show-projects-overlay'),
10+
showOverwriteOverlay: require('./show-overwrite-overlay'),
1011
showSaveOverlay: require('./show-save-overlay'),
1112
hideOverlay: require('./hide-overlay'),
1213
// terminal creators
@@ -33,6 +34,7 @@ const creators = {
3334
// action queue creators
3435
queueNewFile: require('./queue-new-file'),
3536
queueChangeFile: require('./queue-change-file'),
37+
queueOverwriteFile: require('./queue-overwrite-file'),
3638
resetActionQueue: require('./reset-action-queue')
3739
};
3840

src/creators/queue-overwrite-file.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
'use strict';
2+
3+
const {
4+
QUEUE_OVERWRITE_FILE
5+
} = require('../constants/action-types');
6+
7+
function queueOverwriteFile(filename){
8+
return {
9+
type: QUEUE_OVERWRITE_FILE,
10+
payload: {
11+
filename
12+
}
13+
};
14+
}
15+
16+
module.exports = queueOverwriteFile;
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
'use strict';
2+
3+
const {
4+
SHOW_OVERLAY
5+
} = require('../constants/action-types');
6+
7+
const {
8+
OVERWRITE_OVERLAY
9+
} = require('../constants/overlay-states');
10+
11+
function showOverwriteOverlay(){
12+
return {
13+
type: SHOW_OVERLAY,
14+
payload: {
15+
state: OVERWRITE_OVERLAY
16+
}
17+
};
18+
}
19+
20+
module.exports = showOverwriteOverlay;

src/lib/documents.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,10 @@ class Documents {
4747
this._editor.swapDoc(doc);
4848
return doc;
4949
}
50+
51+
replace(filename){
52+
this._documents[filename] = this._editor.getDoc();
53+
}
5054
}
5155

5256
module.exports = Documents;

src/plugins/handlers.js

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ const highlighter = require('../lib/highlighter');
1515

1616
const {
1717
NEW_FILE,
18-
CHANGE_FILE
18+
CHANGE_FILE,
19+
OVERWRITE_FILE
1920
} = require('../constants/queued-action-types');
2021

2122
// TODO: move somewhere else?
@@ -71,6 +72,8 @@ function handlers(app, opts, done){
7172
return newFile();
7273
case CHANGE_FILE:
7374
return changeFile(nextFile);
75+
case OVERWRITE_FILE:
76+
return saveFileAs(nextFile, true);
7477
}
7578
}
7679

@@ -117,23 +120,32 @@ function handlers(app, opts, done){
117120
.then(function(){
118121
documents.swap(path.join(cwd, filename));
119122
});
123+
store.dispatch(creators.hideOverlay());
120124
}
121125
}
122126

123-
function saveFileAs(filename){
127+
function saveFileAs(filename, overwrite){
124128
if(!filename){
125129
return;
126130
}
127131

128-
const { cwd, content } = workspace.getState();
132+
const { cwd, content, directory } = workspace.getState();
133+
if(!overwrite && _.filter(directory, {name: filename}).length){
134+
return showOverwriteOverlay(filename);
135+
}
129136

130137
workspace.updateFilename(filename)
131138
.then(() => workspace.saveFile(filename, content))
132139
.then(() => userConfig.set('last-file', filename))
133140
.then(function(){
134-
documents.swap(path.join(cwd, filename));
141+
documents.replace(path.join(cwd, filename));
135142
handleActionQueue();
136143
});
144+
store.dispatch(creators.hideOverlay());
145+
}
146+
147+
function overwriteFile(){
148+
handleActionQueue();
137149
}
138150

139151
function dontSaveFile(){
@@ -229,6 +241,11 @@ function handlers(app, opts, done){
229241
store.dispatch(creators.showSaveOverlay());
230242
}
231243

244+
function showOverwriteOverlay(name){
245+
store.dispatch(creators.queueOverwriteFile(name));
246+
store.dispatch(creators.showOverwriteOverlay());
247+
}
248+
232249
function showDownloadOverlay(){
233250
store.dispatch(creators.showDownloadOverlay());
234251
// TODO: is there ever a time when show download overlay doesn't reload devices?
@@ -567,6 +584,7 @@ function handlers(app, opts, done){
567584
deleteFile,
568585
changeFile,
569586
dontSaveFile,
587+
overwriteFile,
570588
// project methods
571589
changeProject,
572590
deleteProject,

src/plugins/overlays.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ const React = require('react');
55
const SaveOverlay = require('../views/save-overlay');
66
const ProjectOverlay = require('../views/project-overlay');
77
const DownloadOverlay = require('../views/download-overlay');
8+
const OverwriteOverlay = require('../views/overwrite-overlay');
89
const DeleteFileOverlay = require('../views/delete-file-overlay');
910
const DeleteProjectOverlay = require('../views/delete-project-overlay');
1011

@@ -15,6 +16,7 @@ const {
1516
SAVE_OVERLAY,
1617
DOWNLOAD_OVERLAY,
1718
PROJECTS_OVERLAY,
19+
OVERWRITE_OVERLAY,
1820
DELETE_FILE_OVERLAY,
1921
DELETE_PROJECT_OVERLAY
2022
} = require('../constants/overlay-states');
@@ -38,6 +40,9 @@ function overlays(app, opts, done){
3840
case SAVE_OVERLAY:
3941
renderOverlay(<SaveOverlay workspace={workspace} handlers={handlers} />);
4042
break;
43+
case OVERWRITE_OVERLAY:
44+
renderOverlay(<OverwriteOverlay store={store} handlers={handlers} />);
45+
break;
4146
case DOWNLOAD_OVERLAY:
4247
renderOverlay(<DownloadOverlay store={store} handlers={handlers} />);
4348
break;

src/reducers/next-action.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,14 @@
33
const {
44
QUEUE_NEW_FILE,
55
QUEUE_CHANGE_FILE,
6+
QUEUE_OVERWRITE_FILE,
67
RESET_ACTION_QUEUE
78
} = require('../constants/action-types');
89

910
const {
1011
NEW_FILE,
11-
CHANGE_FILE
12+
CHANGE_FILE,
13+
OVERWRITE_FILE
1214
} = require('../constants/queued-action-types');
1315

1416
const initial = '';
@@ -19,6 +21,8 @@ function nextAction(state = initial, { type }){
1921
return NEW_FILE;
2022
case QUEUE_CHANGE_FILE:
2123
return CHANGE_FILE;
24+
case QUEUE_OVERWRITE_FILE:
25+
return OVERWRITE_FILE;
2226
case RESET_ACTION_QUEUE:
2327
return initial;
2428
default:

src/reducers/next-file.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
const {
44
QUEUE_CHANGE_FILE,
5+
QUEUE_OVERWRITE_FILE,
56
RESET_ACTION_QUEUE
67
} = require('../constants/action-types');
78

@@ -11,6 +12,8 @@ function nextFile(state = initial, { type, payload }){
1112
switch(type){
1213
case QUEUE_CHANGE_FILE:
1314
return payload.filename;
15+
case QUEUE_OVERWRITE_FILE:
16+
return payload.filename;
1417
case RESET_ACTION_QUEUE:
1518
return initial;
1619
default:

src/views/overwrite-overlay.js

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
'use strict';
2+
3+
const React = require('react');
4+
const { createContainer } = require('sovereign');
5+
const Button = require('react-material/components/Button');
6+
7+
const Overlay = require('../components/overlay');
8+
const OverlayTitle = require('../components/overlay-title');
9+
const OverlayFooter = require('../components/overlay-footer');
10+
11+
class OverwriteOverlay extends React.Component {
12+
13+
constructor(...args){
14+
super(...args);
15+
16+
this.overwrite = this.overwrite.bind(this);
17+
}
18+
19+
overwrite(){
20+
const {
21+
filename,
22+
handlers
23+
} = this.props;
24+
25+
const {
26+
overwriteFile
27+
} = handlers;
28+
29+
overwriteFile();
30+
}
31+
32+
render(){
33+
const {
34+
filename,
35+
handlers
36+
} = this.props;
37+
38+
const {
39+
hideOverlay
40+
} = handlers;
41+
42+
return (
43+
<Overlay>
44+
<OverlayTitle>File '{filename}' already exists. Overwrite anyway?</OverlayTitle>
45+
<OverlayFooter>
46+
<Button onClick={this.overwrite}>Overwrite</Button>
47+
<Button onClick={hideOverlay}>Cancel</Button>
48+
</OverlayFooter>
49+
</Overlay>
50+
);
51+
}
52+
}
53+
54+
module.exports = createContainer(OverwriteOverlay, {
55+
getStores({ store }){
56+
return {
57+
store
58+
};
59+
},
60+
61+
getPropsFromStores({ store }){
62+
const { nextFile } = store.getState();
63+
64+
return {
65+
filename: nextFile
66+
};
67+
}
68+
});

src/views/save-overlay.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,6 @@ class SaveOverlay extends React.Component {
6060
} = this.props.handlers;
6161

6262
saveFileAs(filename);
63-
hideOverlay();
6463
this.clearName();
6564
}
6665

0 commit comments

Comments
 (0)