Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit8f1954c

Browse files
committed
save progress to localStorage
1 parent0b1ffd7 commit8f1954c

File tree

32 files changed

+186
-141
lines changed

32 files changed

+186
-141
lines changed

‎lib/actions/_types.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ exports.HINT_POSITION_SET = 'HINT_POSITION_SET';
88
exports.HINT_SHOW='HINT_SHOW';
99
exports.PACKAGE_SET='PACKAGE_SET';
1010
exports.PAGE_SET='PAGE_SET';
11+
exports.POSITION_LOAD='POSITION_LOAD';
1112
exports.POSITION_SET='POSITION_SET';
1213
exports.PROGRESS_LOAD='PROGRESS_LOAD';
1314
exports.ROUTE_SET='ROUTE_SET';

‎lib/actions/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ var page_1 = require('./page');
1414
exports.pageSet=page_1.pageSet;
1515
exports.pageNext=page_1.pageNext;
1616
varposition_1=require('./position');
17+
exports.positionLoad=position_1.positionLoad;
1718
exports.positionSet=position_1.positionSet;
1819
varroute_1=require('./route');
1920
exports.routeSet=route_1.routeSet;

‎lib/actions/position.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
"use strict";
22
var_types_1=require('./_types');
3+
functionpositionLoad(){
4+
return{type:_types_1.POSITION_LOAD};
5+
}
6+
exports.positionLoad=positionLoad;
37
functionpositionSet(position){
48
return{
59
payload:{position:position},

‎lib/actions/progress.js

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,21 @@
11
"use strict";
22
var_types_1=require('./_types');
3+
varposition_1=require('./position');
34
varstore_1=require('../store');
45
functionprogressLoad(){
6+
setTimeout(function(){
7+
store_1.default.dispatch(position_1.positionLoad());
8+
});
59
return{type:_types_1.PROGRESS_LOAD};
610
}
711
exports.progressLoad=progressLoad;
12+
functionisTrue(x){
13+
returnx===true;
14+
}
815
functioncompletePage(){
916
varposition=store_1.default.getState().position;
10-
varpageLength=store_1.default.getState().progress.chapters[position.chapter].pages.length;
11-
if(position.page>=pageLength-1){
17+
varchapter=store_1.default.getState().progress.chapters[position.chapter];
18+
if(chapter.pages.every(function(x){returnx;})){
1219
store_1.default.dispatch(completeChapter());
1320
}
1421
return{
@@ -19,8 +26,8 @@ function completePage() {
1926
exports.completePage=completePage;
2027
functioncompleteChapter(){
2128
varchapter=store_1.default.getState().position.chapter;
22-
varchapterLength=store_1.default.getState().progress.chapters.length;
23-
if(chapter>=chapterLength-1){
29+
varprogress=store_1.default.getState().progress;
30+
if(progress.chapters.every(function(x){returnx.completed;})){
2431
store_1.default.dispatch(completeTutorial());
2532
}
2633
return{

‎lib/components/Page/Hints/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ var help_1 = require('material-ui/svg-icons/action/help');
77
varstyles={
88
position:'relative',
99
margin:'-5px 20px',
10+
right:'10px',
1011
width:'360px',
1112
textAlign:'center',
1213
zIndex:'0',

‎lib/components/Page/PageToolbar/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ var styles = {
1111
right:'0px',
1212
height:'60px',
1313
width:'400px',
14+
margin:'0px',
1415
};
1516
exports.PageToolbar=function(_a){
1617
vartasks=_a.tasks,taskPosition=_a.taskPosition,children=_a.children;

‎lib/components/Progress/ProgressChapter/index.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ var descriptionStyles = {
1010
fontSize:'14px'
1111
};
1212
exports.ProgressChapter=function(_a){
13-
varchapter=_a.chapter,chapterIndex=_a.chapterIndex,position=_a.position;
13+
varprogress=_a.progress,chapter=_a.chapter,chapterIndex=_a.chapterIndex,position=_a.position;
1414
varisActive=chapterIndex===position.chapter;
15-
return(React.createElement(List_1.ListItem,{key:chapterIndex,className:isActive ?'isActive' :null,style:styles,initiallyOpen:chapterIndex===0,primaryTogglesNestedList:chapterIndex===position.chapter&&!chapter.completed,nestedItems:chapter.pages.map(function(page,pageIndex){return(React.createElement(ProgressPage_1.ProgressPage,{key:pageIndex,pageIndex:pageIndex,page:page,chapterIndex:chapterIndex,position:position}));})},React.createElement("h3",null,chapterIndex+1,". ",chapter.title),React.createElement("span",{style:descriptionStyles},React.createElement(index_1.Markdown,null,chapter.description))));
15+
return(React.createElement(List_1.ListItem,{key:chapterIndex,className:isActive ?'isActive' :null,style:styles,initiallyOpen:chapterIndex===0,primaryTogglesNestedList:chapterIndex===position.chapter&&!progress.chapters[chapterIndex].completed,nestedItems:chapter.pages.map(function(page,pageIndex){return(React.createElement(ProgressPage_1.ProgressPage,{key:pageIndex,pageIndex:pageIndex,page:page,chapterIndex:chapterIndex,position:position,progress:progress}));})},React.createElement("h3",null,chapterIndex+1,". ",chapter.title),React.createElement("span",{style:descriptionStyles},React.createElement(index_1.Markdown,null,chapter.description))));
1616
};

‎lib/components/Progress/ProgressPage/index.js

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,18 +29,19 @@ var ProgressPage = (function (_super) {
2929
_super.apply(this,arguments);
3030
}
3131
ProgressPage.prototype.canActivate=function(isActive){
32-
var_a=this.props,chapterIndex=_a.chapterIndex,pageIndex=_a.pageIndex,position=_a.position;
33-
varearlierChapter=chapterIndex<position.chapter;
32+
var_a=this.props,chapterIndex=_a.chapterIndex,pageIndex=_a.pageIndex,position=_a.position,progress=_a.progress;
33+
varcompleted=progress.chapters[chapterIndex].pages[pageIndex];
3434
varcurrentChapter=chapterIndex===position.chapter;
3535
varearlierOrCurrentPage=pageIndex<=position.page;
36-
returnisActive||earlierChapter||
36+
returnisActive||completed||
3737
(currentChapter&&earlierOrCurrentPage);
3838
};
3939
ProgressPage.prototype.render=function(){
40-
var_a=this.props,page=_a.page,position=_a.position,chapterIndex=_a.chapterIndex,pageIndex=_a.pageIndex,selectPage=_a.selectPage;
40+
var_a=this.props,page=_a.page,position=_a.position,chapterIndex=_a.chapterIndex,pageIndex=_a.pageIndex,progress=_a.progress,selectPage=_a.selectPage;
4141
varisActive=chapterIndex===position.chapter&&pageIndex===position.page;
4242
varcanActivate=this.canActivate(isActive);
43-
return(React.createElement(List_1.ListItem,{key:pageIndex,style:Object.assign({},styles,!canActivate ?{color:colors_1.grey400} :{}),primaryText:(pageIndex+1)+". "+page.title,secondaryText:canActivate ?page.description :'',leftIcon:progressIcon_1.progressIcon(page.completed,isActive),onClick:canActivate
43+
varcompleted=progress.chapters[chapterIndex].pages[pageIndex];
44+
return(React.createElement(List_1.ListItem,{key:pageIndex,style:Object.assign({},styles,!canActivate ?{color:colors_1.grey400} :{}),primaryText:(pageIndex+1)+". "+page.title,secondaryText:canActivate ?page.description :'',leftIcon:progressIcon_1.progressIcon(completed,isActive),onClick:canActivate
4445
?selectPage.bind(this,{
4546
chapter:chapterIndex,
4647
page:pageIndex

‎lib/components/Progress/index.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,6 @@ var pageStyle = {
99
margin:'0px',
1010
};
1111
exports.Progress=function(_a){
12-
varprogress=_a.progress,position=_a.position,info=_a.info;
13-
return(React.createElement(Paper_1.default,{style:pageStyle},React.createElement(List_1.List,null,React.createElement(Subheader_1.default,null,info.title),progress.chapters.map(function(chapter,chapterIndex){return(React.createElement(ProgressChapter_1.ProgressChapter,{key:chapterIndex,chapter:chapter,chapterIndex:chapterIndex,position:position}));}))));
12+
varprogress=_a.progress,position=_a.position,info=_a.info,tutorial=_a.tutorial;
13+
return(React.createElement(Paper_1.default,{style:pageStyle},React.createElement(List_1.List,null,React.createElement(Subheader_1.default,null,info.name),tutorial.chapters.map(function(chapter,chapterIndex){return(React.createElement(ProgressChapter_1.ProgressChapter,{key:chapterIndex,chapter:chapter,chapterIndex:chapterIndex,position:position,progress:progress}));}))));
1414
};

‎lib/components/mount.js

Lines changed: 0 additions & 14 deletions
This file was deleted.

‎lib/reducers/position/index.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,25 @@
11
"use strict";
22
var_types_1=require('../../actions/_types');
3+
varstore_1=require('../../store');
34
var_position={
45
chapter:0,
56
page:0,
67
};
78
functionpositionReducer(position,action){
89
if(position===void0){position=_position;}
910
switch(action.type){
11+
case_types_1.POSITION_LOAD:
12+
varchapters=store_1.default.getState().progress.chapters;
13+
varchapter=chapters.indexOf(function(x){return!x.completed;});
14+
if(chapter<0){
15+
chapter=chapters.length-1;
16+
}
17+
varprogressPage=chapters[chapter].pages;
18+
varpage=progressPage.indexOf(function(x){return!x;});
19+
if(page<0){
20+
page=progressPage.length-1;
21+
}
22+
return{chapter:chapter,page:page};
1023
case_types_1.PAGE_SET:
1124
case_types_1.POSITION_SET:
1225
returnaction.payload.position;

‎lib/reducers/progress/index.js

Lines changed: 19 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,43 @@
11
"use strict";
22
var_types_1=require('../../actions/_types');
3+
varlocal_storage_1=require('./local-storage');
34
varstore_1=require('../../store');
45
var_progress={
56
completed:false,
6-
chapters:[{
7-
title:'',
8-
description:'',
9-
completed:false,
10-
pages:[{
11-
title:'',
12-
description:'',
13-
completed:false,
14-
}]
15-
}]
7+
chapters:[]
168
};
179
functionprogressReducer(progress,action){
1810
if(progress===void0){progress=_progress;}
1911
switch(action.type){
2012
case_types_1.PROGRESS_LOAD:
21-
varchapters=store_1.default.getState().tutorial.chapters;
13+
vartutorial=store_1.default.getState().tutorial;
14+
varsaved=local_storage_1.loadProgressFromLocalStorage();
15+
if(saved){
16+
returnsaved;
17+
}
2218
return{
2319
completed:false,
24-
chapters:!chapters ?[] :chapters.map(function(_a){
25-
vartitle=_a.title,description=_a.description,completed=_a.completed,pages=_a.pages;
26-
return{
27-
title:title,description:description,completed:completed||false,
28-
pages:!pages ?[] :pages.map(function(page){
29-
return{
30-
title:page.title,
31-
description:page.description,
32-
completed:page.completed||false,
33-
};
34-
})
35-
};
36-
})
20+
chapters:!tutorial.chapters
21+
?[]
22+
:tutorial.chapters.map(function(chapter){
23+
return{
24+
completed:false,
25+
pages:chapter.pages.map(function(){returnfalse;})
26+
};
27+
})
3728
};
3829
case_types_1.COMPLETE_PAGE:
3930
varposition=action.payload.position;
40-
progress.chapters[position.chapter].pages[position.page].completed=true;
31+
progress.chapters[position.chapter].pages[position.page]=true;
32+
local_storage_1.saveToLocalStorage(progress);
4133
returnprogress;
4234
case_types_1.COMPLETE_CHAPTER:
4335
progress.chapters[action.payload.chapter].completed=true;
36+
local_storage_1.saveToLocalStorage(progress);
4437
returnprogress;
4538
case_types_1.COMPLETE_TUTORIAL:
4639
progress.completed=true;
40+
local_storage_1.saveToLocalStorage(progress);
4741
returnprogress;
4842
default:
4943
returnprogress;
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
"use strict";
2+
varstore_1=require('../../store');
3+
functiongetLocalStorageKey(){
4+
return'coderoad:'+store_1.default.getState().tutorial.name;
5+
}
6+
functionsaveToLocalStorage(progress){
7+
try{
8+
window.localStorage
9+
.setItem(getLocalStorageKey(),JSON.stringify(progress));
10+
}
11+
catch(e){
12+
console.log('Error saving progress:',e);
13+
}
14+
}
15+
exports.saveToLocalStorage=saveToLocalStorage;
16+
functionloadProgressFromLocalStorage(){
17+
varsavedProgress=JSON.parse(window.localStorage.getItem(getLocalStorageKey())||null);
18+
if(savedProgress){
19+
returnsavedProgress;
20+
}
21+
returnnull;
22+
}
23+
exports.loadProgressFromLocalStorage=loadProgressFromLocalStorage;

‎lib/store/localStorage.js

Lines changed: 0 additions & 13 deletions
This file was deleted.

‎lib/store/middleware.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,12 @@
22
varenv='dev';
33
varredux_1=require('redux');
44
varredux_thunk_1=require('redux-thunk');
5-
varlocalStorage_1=require('./localStorage');
65
varmiddlewares=[redux_thunk_1.default];
76
if(env&&env==='dev'){
87
varcreateLogger=require('redux-logger');
98
varlogger=createLogger();
109
middlewares.push(logger);
1110
}
12-
varcreateStoreWithMiddleware=redux_1.compose(redux_1.applyMiddleware.apply(void0,middlewares),localStorage_1.default)(redux_1.createStore);
11+
varcreateStoreWithMiddleware=redux_1.compose(redux_1.applyMiddleware.apply(void0,middlewares))(redux_1.createStore);
1312
Object.defineProperty(exports,"__esModule",{value:true});
1413
exports.default=createStoreWithMiddleware;

‎package.json

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,6 @@
4747
"react-redux":"4.4.5",
4848
"react-tap-event-plugin":"1.0.0",
4949
"redux":"3.5.2",
50-
"redux-localstorage":"^1.0.0-rc4",
51-
"redux-localstorage-filter":"^0.1.1",
5250
"redux-logger":"2.6.1",
5351
"redux-thunk":"2.0.1"
5452
},

‎src/actions/_types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ export const HINT_POSITION_SET = 'HINT_POSITION_SET';
77
exportconstHINT_SHOW='HINT_SHOW';
88
exportconstPACKAGE_SET='PACKAGE_SET';
99
exportconstPAGE_SET='PAGE_SET';
10+
exportconstPOSITION_LOAD='POSITION_LOAD';
1011
exportconstPOSITION_SET='POSITION_SET';
1112
exportconstPROGRESS_LOAD='PROGRESS_LOAD';
1213
exportconstROUTE_SET='ROUTE_SET';

‎src/actions/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ export {
44
}from'./progress';
55
export{hintShow,hintPositionSet}from'./hint';
66
export{pageSet,pageNext}from'./page';
7-
export{positionSet}from'./position';
7+
export{positionLoad,positionSet}from'./position';
88
export{routeSet}from'./route';
99
export{setupVerify}from'./setup';
1010
export{

‎src/actions/position.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
import{POSITION_SET}from'./_types';
1+
import{POSITION_SET,POSITION_LOAD}from'./_types';
2+
3+
exportfunctionpositionLoad(){
4+
return{type:POSITION_LOAD};
5+
}
26

37
exportfunctionpositionSet(position:CR.Position):Action{
48
return{

‎src/actions/progress.ts

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,25 @@
11
import{
22
PROGRESS_LOAD,COMPLETE_PAGE,COMPLETE_CHAPTER,COMPLETE_TUTORIAL
33
}from'./_types';
4+
import{positionLoad}from'./position';
45
importstorefrom'../store';
56

67
exportfunctionprogressLoad():Action{
8+
setTimeout(function(){
9+
store.dispatch(positionLoad());
10+
});
711
return{type:PROGRESS_LOAD};
812
}
913

14+
functionisTrue(x){
15+
returnx===true;
16+
}
17+
1018
exportfunctioncompletePage():Action{
1119
constposition:CR.Position=store.getState().position;
12-
constpageLength:number=store.getState().progress.chapters[position.chapter].pages.length;
13-
if(position.page>=pageLength-1){
20+
constchapter=store.getState().progress.chapters[position.chapter];
21+
// all pages are true, chapter complete
22+
if(chapter.pages.every(x=>x)){
1423
store.dispatch(completeChapter());
1524
}
1625
return{
@@ -21,8 +30,9 @@ export function completePage(): Action {
2130

2231
exportfunctioncompleteChapter():Action{
2332
constchapter:number=store.getState().position.chapter;
24-
constchapterLength:number=store.getState().progress.chapters.length;
25-
if(chapter>=chapterLength-1){
33+
constprogress=store.getState().progress;
34+
// all chapters complete, tutorial complete
35+
if(progress.chapters.every(x=>x.completed)){
2636
store.dispatch(completeTutorial());
2737
}
2838
return{

‎src/components/Page/Hints/index.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import Help from 'material-ui/svg-icons/action/help';
77
conststyles={
88
position:'relative',
99
margin:'-5px 20px',
10+
right:'10px',
1011
width:'360px',
1112
textAlign:'center',
1213
zIndex:'0',

‎src/components/Page/PageToolbar/index.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ const styles = {
1111
right:'0px',
1212
height:'60px',
1313
width:'400px',
14+
margin:'0px',
1415
};
1516

1617
exportconstPageToolbar:React.StatelessComponent<{

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp