Skip to content

Commit 3607afb

Browse files
committed
check setup before loading tutorials
1 parent 46fa72e commit 3607afb

37 files changed

+680
-270
lines changed

lib/actions/tutorials.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ function loadTutorials() {
1010
if (window.coderoad.dir) {
1111
var packageJson = loadRootPackageJson();
1212
if (!packageJson) {
13-
window.coderoad.package = null;
13+
window.coderoad.setup.hasPackageJson = null;
1414
var message = 'No package.json file available. Try running "npm init --y" in terminal';
1515
console.log(message);
1616
_base_1.store.dispatch(Action.toggleAlert({ message: message, action: 'tip', duration: 6000 }));

lib/atom/editor.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,3 +86,7 @@ exports.closeAllPanels = closeAllPanels;
8686
function quit() {
8787
}
8888
exports.quit = quit;
89+
function openFolder() {
90+
atom.open();
91+
}
92+
exports.openFolder = openFolder;

lib/atom/main.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ var editor_1 = require('./editor');
66
var Main = (function () {
77
function Main() {
88
window.coderoad = {
9-
dir: null
9+
dir: null,
10+
setup: {}
1011
};
1112
polyfills_1.default();
1213
editor_1.setAtomGlobals();

lib/components/_components.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ var account_1 = require('./account/account');
1313
exports.Account = account_1.default;
1414
var progress_1 = require('./progress/progress');
1515
exports.Progress = progress_1.default;
16-
var projects_1 = require('./projects/projects');
17-
exports.Projects = projects_1.default;
16+
var start_1 = require('./start/start');
17+
exports.Start = start_1.Start;
1818
var markdown_1 = require('./markdown/markdown');
1919
exports.MarkdownText = markdown_1.default;
2020
var alert_1 = require('./alert/alert');

lib/components/app/router.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ var default_1 = (function (_super) {
1919
case 'progress':
2020
return React.createElement(_components_1.Progress, {progress: state.progress, position: state.position});
2121
case 'projects':
22-
return React.createElement(_components_1.Projects, {tutorials: state.tutorials});
22+
return React.createElement(_components_1.Start, {tutorials: state.tutorials});
2323
default:
2424
throw 'Error: Route not found.';
2525
}

lib/components/projects/projects.js

Lines changed: 7 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,65 +1,10 @@
11
'use strict';
2-
var __extends = (this && this.__extends) || function (d, b) {
3-
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
4-
function __() { this.constructor = d; }
5-
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
6-
};
7-
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
8-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
9-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
10-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
11-
return c > 3 && r && Object.defineProperty(target, key, r), r;
12-
};
13-
var __metadata = (this && this.__metadata) || function (k, v) {
14-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
15-
};
162
var React = require('react');
17-
var react_redux_1 = require('react-redux');
18-
var Action = require('../../actions/actions');
193
var material_ui_1 = require('material-ui');
20-
var Projects = (function (_super) {
21-
__extends(Projects, _super);
22-
function Projects() {
23-
_super.apply(this, arguments);
24-
}
25-
Projects.prototype.load = function () {
26-
this.props.loadTutorials();
27-
};
28-
Projects.prototype.trim = function (name) {
29-
if (name.match(/^coderoad-tutorial-/)) {
30-
return name.slice(18);
31-
}
32-
if (name.match(/^coderoad-/)) {
33-
return name.slice(9);
34-
}
35-
return name;
36-
};
37-
Projects.prototype.render = function () {
38-
var _this = this;
39-
return (React.createElement(material_ui_1.Paper, {className: 'cr-projects'}, React.createElement("div", {className: 'cr-projects-header'}, React.createElement("span", {className: 'title'}, "CodeRoad"), React.createElement("p", {className: 'tagline'}, "Tutorials in the Editor"), React.createElement("div", {className: 'cr-tutorials'}, React.createElement(material_ui_1.List, {subheader: 'Tutorials'}, window.coderoad.dir ? null : React.createElement(material_ui_1.ListItem, {key: 'open', primaryText: 'Create an Atom Project', secondaryText: 'File > Open > any older'}), this.props.tutorials.length > 0 ?
40-
this.props.tutorials.map(function (tutorial, index) {
41-
return (React.createElement(material_ui_1.ListItem, {key: index, primaryText: _this.trim(tutorial), onClick: _this.props.selectProject.bind(_this, tutorial)}));
42-
}) : React.createElement(material_ui_1.ListItem, {key: 'demo', primaryText: 'Try a Demo', secondaryText: 'npm i -s coderoad-functional-school'})), React.createElement("br", null), React.createElement(material_ui_1.RaisedButton, {label: 'Load Tutorials', secondary: true, onClick: this.load.bind(this)})), React.createElement("p", {className: 'notes'}, "Beta"))));
43-
};
44-
Projects = __decorate([
45-
react_redux_1.connect(null, function (dispatch) {
46-
return {
47-
selectProject: function (name) {
48-
Action.loadTutorial(name);
49-
dispatch(Action.setRoute('progress'));
50-
},
51-
toggleAlert: function (item) {
52-
dispatch(Action.toggleAlert(item));
53-
},
54-
loadTutorials: function () {
55-
dispatch(Action.loadTutorials());
56-
}
57-
};
58-
}),
59-
__metadata('design:paramtypes', [])
60-
], Projects);
61-
return Projects;
62-
}(React.Component));
63-
Object.defineProperty(exports, "__esModule", { value: true });
64-
exports.default = Projects;
65-
;
4+
var setup_1 = require('./setup');
5+
var tutorials_1 = require('./tutorials');
6+
exports.Project = function (_a) {
7+
var tutorials = _a.tutorials;
8+
return (React.createElement(material_ui_1.Paper, {className: 'cr-projects'}, React.createElement("div", {className: 'cr-projects-header'}, React.createElement("span", {className: 'title'}, "CodeRoad"), React.createElement("p", {className: 'tagline'}, "Tutorials in the Editor"), window.coderoad.dir && window.coderoad.setup.hasPackageJson && tutorials.length > 0 ?
9+
React.createElement(tutorials_1.default, {tutorials: tutorials}) : React.createElement(setup_1.SetupGuide, null), React.createElement("p", {className: 'notes'}, "Beta"))));
10+
};

lib/components/projects/setup.js

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
"use strict";
2+
var _this = this;
3+
var React = require('react');
4+
var material_ui_1 = require('material-ui');
5+
var _components_1 = require('../_components');
6+
var start_1 = require('../../services/start');
7+
var editor_1 = require('../../atom/editor');
8+
exports.SetupGuide = function () {
9+
var warnings = [];
10+
if (!window.coderoad.dir) {
11+
warnings.push({
12+
key: 'noProject',
13+
title: 'Create an Atom Project',
14+
click: editor_1.openFolder,
15+
text: 'File > Open > a workspace folder'
16+
});
17+
}
18+
if (!window.coderoad.setup.hasPackageJson) {
19+
warnings.push({
20+
key: 'noPackageJson',
21+
title: 'Create a `package.json` file',
22+
click: start_1.createPackageJson,
23+
text: '`npm init`'
24+
});
25+
}
26+
if (_this.props.tutorials.length < 1) {
27+
warnings.push({
28+
key: 'noTutorial',
29+
title: 'Install a Tutorial',
30+
click: null,
31+
text: '`npm i --save coderoad-functional-school`'
32+
});
33+
}
34+
return (React.createElement("div", {className: 'setup'}, React.createElement(material_ui_1.List, {subheader: 'Setup'}, warnings.map(function (w) { return React.createElement(material_ui_1.ListItem, {key: w.key, primaryText: w.title, onClick: w.click}, React.createElement(_components_1.MarkdownText, {text: w.text})); }))));
35+
};

lib/components/projects/start.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
'use strict';
2+
var React = require('react');
3+
var material_ui_1 = require('material-ui');
4+
var setup_1 = require('./setup');
5+
var tutorials_1 = require('./tutorials');
6+
exports.Project = function (_a) {
7+
var tutorials = _a.tutorials;
8+
return (React.createElement(material_ui_1.Paper, {className: 'cr-projects'}, React.createElement("div", {className: 'cr-projects-header'}, React.createElement("span", {className: 'title'}, "CodeRoad"), React.createElement("p", {className: 'tagline'}, "Tutorials in the Editor"), window.coderoad.dir && window.coderoad.setup.hasPackageJson && tutorials.length > 0 ?
9+
React.createElement(tutorials_1.default, {tutorials: tutorials}) : React.createElement(setup_1.SetupGuide, null), React.createElement("p", {className: 'notes'}, "Beta"))));
10+
};

lib/components/projects/tutorials.js

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
"use strict";
2+
var __extends = (this && this.__extends) || function (d, b) {
3+
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
4+
function __() { this.constructor = d; }
5+
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
6+
};
7+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
8+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
9+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
10+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
11+
return c > 3 && r && Object.defineProperty(target, key, r), r;
12+
};
13+
var __metadata = (this && this.__metadata) || function (k, v) {
14+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
15+
};
16+
var React = require('react');
17+
var material_ui_1 = require('material-ui');
18+
var react_redux_1 = require('react-redux');
19+
var Action = require('../../actions/actions');
20+
var default_1 = (function (_super) {
21+
__extends(default_1, _super);
22+
function default_1() {
23+
_super.apply(this, arguments);
24+
}
25+
default_1.prototype.trim = function (name) {
26+
if (name.match(/^coderoad-tutorial-/)) {
27+
return name.slice(18);
28+
}
29+
if (name.match(/^coderoad-/)) {
30+
return name.slice(9);
31+
}
32+
return name;
33+
};
34+
default_1.prototype.render = function () {
35+
var _this = this;
36+
var _a = this.props, loadTutorials = _a.loadTutorials, selectProject = _a.selectProject, toggleAlert = _a.toggleAlert;
37+
return (React.createElement("div", {className: 'cr-tutorials'}, React.createElement(material_ui_1.List, {subheader: 'Tutorials'}, this.props.tutorials.map(function (tutorial, index) {
38+
return (React.createElement(material_ui_1.ListItem, {key: index, primaryText: _this.trim(tutorial), onClick: selectProject.bind(_this, tutorial)}));
39+
})), React.createElement("br", null), React.createElement(material_ui_1.RaisedButton, {label: 'Load Tutorials', secondary: true, onTouchTap: loadTutorials})));
40+
};
41+
default_1 = __decorate([
42+
react_redux_1.connect(null, function (dispatch) {
43+
return {
44+
selectProject: function (name) {
45+
Action.loadTutorial(name);
46+
dispatch(Action.setRoute('progress'));
47+
},
48+
toggleAlert: function (item) {
49+
dispatch(Action.toggleAlert(item));
50+
},
51+
loadTutorials: function () {
52+
dispatch(Action.loadTutorials());
53+
}
54+
};
55+
}),
56+
__metadata('design:paramtypes', [])
57+
], default_1);
58+
return default_1;
59+
}(React.Component));
60+
Object.defineProperty(exports, "__esModule", { value: true });
61+
exports.default = default_1;

lib/components/start/setup.js

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
"use strict";
2+
var React = require('react');
3+
var material_ui_1 = require('material-ui');
4+
var _components_1 = require('../_components');
5+
var start_1 = require('../../services/start');
6+
var editor_1 = require('../../atom/editor');
7+
exports.SetupGuide = function (_a) {
8+
var tutorials = _a.tutorials;
9+
var warnings = [];
10+
if (!window.coderoad.dir) {
11+
warnings.push({
12+
key: 'noProject',
13+
title: 'Create an Atom Project',
14+
click: editor_1.openFolder,
15+
text: 'File > Open > a workspace folder'
16+
});
17+
}
18+
if (!window.coderoad.setup.hasPackageJson) {
19+
warnings.push({
20+
key: 'noPackageJson',
21+
title: 'Create a `package.json` file',
22+
click: start_1.createPackageJson,
23+
text: '`npm init`'
24+
});
25+
}
26+
if (tutorials.length < 1) {
27+
warnings.push({
28+
key: 'noTutorial',
29+
title: 'Install a Tutorial',
30+
click: null,
31+
text: '`npm i --save coderoad-functional-school`'
32+
});
33+
}
34+
return (React.createElement("div", {className: 'setup'}, React.createElement(material_ui_1.List, {subheader: 'Setup'}, warnings.map(function (w) { return React.createElement(material_ui_1.ListItem, {key: w.key, primaryText: w.title, onClick: w.click}, React.createElement(_components_1.MarkdownText, {text: w.text})); }))));
35+
};

lib/components/start/start.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
'use strict';
2+
var React = require('react');
3+
var material_ui_1 = require('material-ui');
4+
var setup_1 = require('./setup');
5+
var tutorials_1 = require('./tutorials');
6+
exports.Start = function (_a) {
7+
var tutorials = _a.tutorials;
8+
return (React.createElement(material_ui_1.Paper, {className: 'cr-projects'}, React.createElement("div", {className: 'cr-projects-header'}, React.createElement("span", {className: 'title'}, "CodeRoad"), React.createElement("p", {className: 'tagline'}, "Tutorials in the Editor"), window.coderoad.dir && window.coderoad.setup.hasPackageJson && tutorials.length > 0 ?
9+
React.createElement(tutorials_1.default, {tutorials: tutorials}) : React.createElement(setup_1.SetupGuide, {tutorials: tutorials}), React.createElement("p", {className: 'notes'}, "Beta"))));
10+
};

lib/components/start/tutorials.js

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
"use strict";
2+
var __extends = (this && this.__extends) || function (d, b) {
3+
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
4+
function __() { this.constructor = d; }
5+
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
6+
};
7+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
8+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
9+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
10+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
11+
return c > 3 && r && Object.defineProperty(target, key, r), r;
12+
};
13+
var __metadata = (this && this.__metadata) || function (k, v) {
14+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
15+
};
16+
var React = require('react');
17+
var material_ui_1 = require('material-ui');
18+
var react_redux_1 = require('react-redux');
19+
var Action = require('../../actions/actions');
20+
var default_1 = (function (_super) {
21+
__extends(default_1, _super);
22+
function default_1() {
23+
_super.apply(this, arguments);
24+
}
25+
default_1.prototype.trim = function (name) {
26+
if (name.match(/^coderoad-tutorial-/)) {
27+
return name.slice(18);
28+
}
29+
if (name.match(/^coderoad-/)) {
30+
return name.slice(9);
31+
}
32+
return name;
33+
};
34+
default_1.prototype.render = function () {
35+
var _this = this;
36+
var _a = this.props, tutorials = _a.tutorials, loadTutorials = _a.loadTutorials, selectProject = _a.selectProject, toggleAlert = _a.toggleAlert;
37+
return (React.createElement("div", {className: 'cr-tutorials'}, React.createElement(material_ui_1.List, {subheader: 'Tutorials'}, tutorials.map(function (tutorial, index) {
38+
return (React.createElement(material_ui_1.ListItem, {key: index, primaryText: _this.trim(tutorial), onClick: selectProject.bind(_this, tutorial)}));
39+
})), React.createElement("br", null), React.createElement(material_ui_1.RaisedButton, {label: 'Load Tutorials', secondary: true, onTouchTap: loadTutorials})));
40+
};
41+
default_1 = __decorate([
42+
react_redux_1.connect(null, function (dispatch) {
43+
return {
44+
selectProject: function (name) {
45+
Action.loadTutorial(name);
46+
dispatch(Action.setRoute('progress'));
47+
},
48+
toggleAlert: function (item) {
49+
dispatch(Action.toggleAlert(item));
50+
},
51+
loadTutorials: function () {
52+
dispatch(Action.loadTutorials());
53+
}
54+
};
55+
}),
56+
__metadata('design:paramtypes', [])
57+
], default_1);
58+
return default_1;
59+
}(React.Component));
60+
Object.defineProperty(exports, "__esModule", { value: true });
61+
exports.default = default_1;

lib/reducers/editor-actions/actions.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,3 +100,7 @@ function editorActions(actionString) {
100100
});
101101
}
102102
exports.editorActions = editorActions;
103+
function openFolder() {
104+
atom.open();
105+
}
106+
exports.openFolder = openFolder;

lib/services/setGlobals.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ function loadRunnerDep(config) {
2626
runnerRoot = treeDep;
2727
}
2828
else {
29-
var message = "Error loading test runner. Post an issue.";
29+
var message = 'Error loading test runner. Post an issue.';
3030
console.log(message);
3131
throw message;
3232
}

lib/services/start.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
"use strict";
2+
var exists_1 = require('./exists');
3+
var path = require('path');
4+
var editor_1 = require('../atom/editor');
5+
var packageData = "{\n\"name\": \"demo\",\n\"dependencies\": {\n \"coderoad-functional-school\": \"^0.1.9\"\n }\n}";
6+
function createPackageJson() {
7+
var packagePath = path.join(window.coderoad.dir, 'package.json');
8+
return new Promise(function (resolve, reject) {
9+
editor_1.open(packagePath);
10+
setTimeout(function () {
11+
resolve();
12+
});
13+
}).then(function () {
14+
editor_1.set(packageData);
15+
window.coderoad.setup.hasPackageJson = true;
16+
});
17+
}
18+
exports.createPackageJson = createPackageJson;
19+
function checkSetup() {
20+
var packagePath = path.join(window.coderoad.dir, 'package.json');
21+
if (exists_1.fileExists(packagePath)) {
22+
window.coderoad.setup.hasPackageJson = true;
23+
}
24+
}

src/actions/tutorials.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ export function loadTutorials(): CR.Action {
1010
if (window.coderoad.dir) {
1111
let packageJson: PackageJson = loadRootPackageJson();
1212
if (!packageJson) {
13-
window.coderoad.package = null;
13+
window.coderoad.setup.hasPackageJson = null;
1414
let message = 'No package.json file available. Try running "npm init --y" in terminal';
1515
console.log(message);
1616
store.dispatch(Action.toggleAlert({ message, action: 'tip', duration: 6000 }));

src/atom/editor.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,3 +98,7 @@ export function closeAllPanels() {
9898
export function quit() {
9999
// TODO: quit without destroying ALL subscriptions
100100
}
101+
102+
export function openFolder() {
103+
atom.open();
104+
}

0 commit comments

Comments
 (0)