Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 5979e9f

Browse files
author
Krasimir Tsonev
committed
Bug fixes
1 parent e38b546 commit 5979e9f

12 files changed

Lines changed: 80 additions & 49 deletions

File tree

demoit.zip

125 Bytes
Binary file not shown.

dist/demoit.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/sandbox.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
font-weight: inherit;
2222
font-style: inherit;
2323
font-size: 100%;
24-
font-family: Arial, Helvetica, sans-serif;
24+
font-family: "Fira Mono", monospace;
2525
vertical-align: baseline;
2626
}
2727
*, *:before, *:after {
@@ -221,7 +221,7 @@
221221
try {
222222
str = stringifyRecursion(something, undefined, 2).toString();
223223
} catch(error) {
224-
str = something;
224+
str = something.toString();
225225
}
226226
logMessage(str);
227227
} else {

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "demoit",
3-
"version": "6.5.0",
3+
"version": "6.5.1",
44
"description": "A live coding tool",
55
"main": "index.js",
66
"repository": {

src/js/constants.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ function matchAgainstURL(pattern) {
22
return window.location.href.match(pattern);
33
}
44

5+
export const DEBUG = false;
6+
57
export const IS_PROD = matchAgainstURL(/^https:\/\/poet.codes/) || matchAgainstURL(/^http:\/\/localhost:8004/);
68
export const DEV = matchAgainstURL(/^http:\/\/localhost:8004/);
79

src/js/editor.js

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,11 @@ import output from './output';
66
import loadAppDeps from './dependencies';
77
import defineCodeMirrorCommands from './utils/codeMirrorCommands';
88

9-
export const ON_SELECT = 'e_s';
9+
export const ON_SELECT = 'e_ON_SELECT';
10+
export const ON_FILE_CHANGE = 'e_ON_FILE_CHANGE';
11+
export const ON_FILE_SAVE = 'e_ON_FILE_SAVE';
1012

11-
export default async function editor(state, listeners) {
13+
export default async function editor(state, listener) {
1214
const { clearConsole, addToConsole } = createConsole();
1315
const { resetOutput, loadDependenciesInOutput, executeInOut } = await output(state, addToConsole);
1416
const execute = async () => {
@@ -20,7 +22,7 @@ export default async function editor(state, listeners) {
2022
const onSave = async (code) => {
2123
clearConsole();
2224
state.editFile(state.getActiveFile(), { c: code });
23-
state.pendingChanges(false);
25+
listener(ON_FILE_SAVE, code, codeMirrorEditor);
2426
execute();
2527
};
2628
const container = el.withFallback('.js-code-editor');
@@ -35,14 +37,14 @@ export default async function editor(state, listeners) {
3537
state.getActiveFileContent(),
3638
onSave,
3739
function onChange() {
38-
state.pendingChanges(true);
40+
listener(ON_FILE_CHANGE);
3941
},
4042
function showFile(index) {
4143
state.setActiveFileByIndex(index);
4244
loadFileInEditor();
4345
},
4446
function onSelection(code) {
45-
listeners.forEach(c => c(ON_SELECT, code, codeMirrorEditor));
47+
listener(ON_SELECT, code, codeMirrorEditor);
4648
}
4749
);
4850

@@ -56,12 +58,13 @@ export default async function editor(state, listeners) {
5658
case 'html': codeMirrorEditor.setOption('mode', 'htmlmixed'); break;
5759
default: codeMirrorEditor.setOption('mode', 'jsx'); break;
5860
}
59-
// we have to do this because we fire the onChange handler of the editor which sets editing=true;
60-
state.pendingChanges(false);
6161
execute();
6262
}
6363

64-
return { loadFileInEditor, save: () => onSave(codeMirrorEditor.getValue()) };
64+
return { loadFileInEditor, save: () => {
65+
onSave(codeMirrorEditor.getValue());
66+
codeMirrorEditor.focus();
67+
}};
6568
}
6669

6770
function codeMirror(container, editorSettings, value, onSave, onChange, showFile, onSelection) {
@@ -82,7 +85,11 @@ function codeMirror(container, editorSettings, value, onSave, onChange, showFile
8285
highlightSelectionMatches: { showToken: /\w/, annotateScrollbar: true }
8386
});
8487
const save = () => onSave(editor.getValue());
85-
const change = () => onChange(editor.getValue());
88+
const change = (instance, { origin }) => {
89+
if (origin !== 'setValue') {
90+
onChange(editor.getValue());
91+
}
92+
};
8693

8794
editor.on('change', change);
8895
editor.setOption('extraKeys', {

src/js/index.js

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import pkg from '../../package.json';
33
import el from './utils/element';
44
import layout from './layout';
5-
import editor, { ON_SELECT } from './editor';
5+
import editor, { ON_SELECT, ON_FILE_CHANGE, ON_FILE_SAVE } from './editor';
66
import createState from './state';
77
import newFilePopUp from './popups/newFilePopUp';
88
import editFilePopUp from './popups/editFilePopUp';
@@ -11,15 +11,31 @@ import settings from './settings';
1111
import statusBar from './statusBar';
1212
import story from './story';
1313
import reader from './reader';
14+
import { DEBUG } from './constants';
1415

1516
createState(pkg.version).then(state => {
1617
async function render() {
1718
layout(state);
1819

20+
let setFilePendingStatus = () => {};
1921
const addToStory = story(state, () => executeCurrentFile());
20-
const { loadFileInEditor: executeCurrentFile, save: saveCurrentFile } = await editor(state, [
21-
(event, data, editor) => (event === ON_SELECT && addToStory(data, editor))
22-
]);
22+
const { loadFileInEditor: executeCurrentFile, save: saveCurrentFile } = await editor(
23+
state,
24+
(event, data, editor) => {
25+
DEBUG && console.log('editor event=' + event);
26+
switch (event) {
27+
case ON_SELECT:
28+
addToStory(data, editor);
29+
break;
30+
case ON_FILE_CHANGE:
31+
setFilePendingStatus(true);
32+
break;
33+
case ON_FILE_SAVE:
34+
setFilePendingStatus(false);
35+
break;
36+
}
37+
}
38+
);
2339

2440
reader(state, () => executeCurrentFile());
2541
executeCurrentFile();
@@ -34,7 +50,7 @@ createState(pkg.version).then(state => {
3450
() => executeCurrentFile()
3551
);
3652

37-
statusBar(
53+
setFilePendingStatus = statusBar(
3854
state,
3955
function showFile(filename) {
4056
state.setActiveFile(filename);

src/js/output.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ const createMessageSender = (iframe, addToConsole) => {
2626
op,
2727
value,
2828
marker: markerId
29-
});
29+
}, '*');
3030
}
3131
});
3232
};

src/js/state.js

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import {
66
ensureDemoIdInPageURL,
77
ensureUniqueFileName
88
} from './utils';
9-
import { IS_PROD } from './constants';
9+
import { IS_PROD, DEBUG } from './constants';
1010
import { DEFAULT_LAYOUT } from './layout';
1111
import API from './providers/api';
1212
import LS from './utils/localStorage';
@@ -57,9 +57,11 @@ export const FILE_CHANGED = 'FILE_CHANGED';
5757

5858
export default async function createState(version) {
5959
let onChangeListeners = [];
60-
const onChange = event => onChangeListeners.forEach(c => c(event));
60+
const onChange = event => {
61+
DEBUG && console.log('state:onChange event=' + event);
62+
onChangeListeners.forEach(c => c(event));
63+
};
6164
let profile = LS(LS_PROFILE_KEY);
62-
let pendingChanges = false;
6365

6466
var state = window.state;
6567

@@ -81,15 +83,17 @@ export default async function createState(version) {
8183

8284
git.import(state.files);
8385
git.listen(event => {
86+
DEBUG && console.log('state:git event=' + event);
8487
if (event === git.ON_COMMIT || event === git.ON_CHECKOUT) {
85-
persist();
88+
persist('git.listen');
8689
}
8790
onChange(event);
8891
});
8992

9093
let activeFile = resolveActiveFile();
9194

92-
const persist = (fork = false, done = () => {}) => {
95+
const persist = (reason, fork = false, done = () => {}) => {
96+
DEBUG && console.log('state:persist reason=' + reason);
9397
if (api.isForkable()) {
9498
if (!fork && !api.isDemoOwner()) { return; }
9599
if (fork) { delete state.owner; }
@@ -117,7 +121,7 @@ export default async function createState(version) {
117121
setActiveFile(filename) {
118122
activeFile = filename;
119123
location.hash = filename;
120-
onChange();
124+
onChange('setActiveFile');
121125
return filename;
122126
},
123127
setActiveFileByIndex(index) {
@@ -148,8 +152,8 @@ export default async function createState(version) {
148152
state.desc = description;
149153
state.published = !!published;
150154
state.storyWithCode = !!storyWithCode;
151-
onChange();
152-
persist();
155+
onChange('meta');
156+
persist('meta');
153157
return null;
154158
}
155159

@@ -169,34 +173,34 @@ export default async function createState(version) {
169173
},
170174
setDependencies(dependencies) {
171175
state.dependencies = dependencies;
172-
persist();
176+
persist('setDependencies');
173177
},
174178
getEditorSettings() {
175179
return state.editor;
176180
},
177181
editFile(filename, updates) {
178182
git.save(filename, updates);
179-
persist();
183+
persist('editFile');
180184
},
181185
renameFile(filename, newName) {
182186
if (activeFile === filename) {
183187
this.setActiveFile(newName);
184188
}
185189
git.rename(filename, newName);
186-
persist();
190+
persist('renameFile');
187191
},
188192
addNewFile(filename = 'untitled.js') {
189193
filename = git.get(filename) ? ensureUniqueFileName(filename) : filename;
190194
git.save(filename, { c: '' });
191195
this.setActiveFile(filename);
192-
persist();
196+
persist('addNewFile');
193197
},
194198
deleteFile(filename) {
195199
git.del(filename);
196200
if (filename === activeFile) {
197201
this.setActiveFile(getFirstFile());
198202
}
199-
persist();
203+
persist('deleteFile');
200204
},
201205
listen(callback) {
202206
onChangeListeners.push(callback);
@@ -211,24 +215,20 @@ export default async function createState(version) {
211215
if (newTheme) {
212216
state.editor.theme = newTheme;
213217
};
214-
persist();
218+
persist('updateThemeAndLayout');
215219
},
216220
updateStatusBarVisibility(value) {
217-
state.editor.statusBar = value;
221+
if (state.editor.statusBar !== value) {
222+
state.editor.statusBar = value;
223+
persist('updateStatusBarVisibility');
224+
}
218225
},
219226
setEntryPoint(filename) {
220227
const newValue = !git.get(filename).en;
221228

222229
git.saveAll({ en: false });
223230
git.save(filename, { en: newValue });
224231
},
225-
pendingChanges(status) {
226-
if (typeof status !== 'undefined') {
227-
pendingChanges = status;
228-
onChange();
229-
}
230-
return pendingChanges;
231-
},
232232
dump() {
233233
return state;
234234
},
@@ -237,7 +237,7 @@ export default async function createState(version) {
237237
return IS_PROD && api.loggedIn();
238238
},
239239
fork() {
240-
persist(true, onChange);
240+
persist('fork', true, () => onChange('fork'));
241241
},
242242
// profile methods
243243
loggedIn() {

src/js/statusBar.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ export default function statusBar(state, showFile, newFile, editFile, showSettin
2020
const menu = el.withRelaxedCleanup('.status-bar-menu');
2121
let visibility = !!state.getEditorSettings().statusBar;
2222
let visibilityMenu = false;
23+
let pending = false;
2324

2425
const toggleMenu = () => {
2526
menu.css('display', (visibilityMenu = !visibilityMenu) ? 'block' : 'none');
@@ -36,7 +37,7 @@ export default function statusBar(state, showFile, newFile, editFile, showSettin
3637

3738
items.push(createLink(
3839
'file:' + filename,
39-
`<span>${ filename }${ isCurrentFile && state.pendingChanges() ? '*' : ''}</span>`,
40+
`<span>${ filename }${ isCurrentFile && pending ? '*' : ''}</span>`,
4041
`file${ isCurrentFile ? ' active' : '' }${ file.en ? ' entry' : ''}`
4142
));
4243
});
@@ -76,7 +77,7 @@ export default function statusBar(state, showFile, newFile, editFile, showSettin
7677
button.onClick(() => {
7778
if (!state.isCurrentFile(filename)) {
7879
showFile(filename);
79-
} else if (state.pendingChanges()) {
80+
} else if (pending) {
8081
saveCurrentFile();
8182
}
8283
});
@@ -128,4 +129,9 @@ export default function statusBar(state, showFile, newFile, editFile, showSettin
128129
render();
129130

130131
state.listen(render);
132+
133+
return (value) => {
134+
pending = value;
135+
render();
136+
};
131137
}

0 commit comments

Comments
 (0)