├── .babelrc ├── .gitignore ├── .leancloud ├── current_app_id ├── current_group └── recent_linked_apps ├── .leanignore ├── README.md ├── dist ├── bundle.5526aacf72a4dc966459.js ├── bundle.5526aacf72a4dc966459.js.map ├── index.html ├── manifest.6a485c0acf42206cac16.js ├── manifest.6a485c0acf42206cac16.js.map ├── vendor.fbaa01d86b252025d8b6.js └── vendor.fbaa01d86b252025d8b6.js.map ├── index.html ├── package.json ├── server.js ├── src ├── actions │ ├── index.js │ └── schema.js ├── api │ └── index.js ├── components │ ├── AddTodoButton.js │ ├── AddTodoPanel.js │ ├── App.js │ ├── BottomBar.js │ ├── FetchError.js │ ├── Main.js │ ├── Root.js │ ├── Todo.js │ └── TodoList.js ├── configureStore.js ├── constant │ └── index.js ├── containers │ ├── AddTodo.js │ ├── AppBar.js │ ├── FilterLink.js │ ├── Login.js │ ├── Sidebar.js │ └── VisibleTodoList.js ├── index.js ├── reducers │ ├── byId.js │ ├── control.js │ ├── createList.js │ ├── index.js │ └── userInfo.js └── styled │ ├── BottomBarContainer.js │ ├── BottomNavLink.js │ ├── Button.js │ ├── DatePicker.js │ ├── DeleteBtn.js │ ├── Form.js │ ├── List.js │ ├── ListContainer.js │ ├── Logged.js │ ├── LoginBtn.js │ ├── LoginForm.js │ ├── LoginIndicator.js │ ├── LoginInfo.js │ ├── NavButton.js │ ├── NormalLink.js │ ├── Overlay.js │ ├── Panel.js │ ├── ProgressBar.js │ ├── Schedule.js │ ├── Scroller.js │ ├── SubmitBtn.js │ ├── Textarea.js │ ├── TimeInfo.js │ ├── TodoCheckbox.js │ ├── TodoItem.js │ ├── TodoText.js │ ├── TopBar.js │ └── Welcome.js └── webpack.config.js /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | ["es2015", {"module": false, "loose": true}], 4 | "react", 5 | "stage-2", 6 | "es2016", 7 | "es2017" 8 | ] 9 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | *.log 3 | node_modules 4 | yarn.lock -------------------------------------------------------------------------------- /.leancloud/current_app_id: -------------------------------------------------------------------------------- 1 | fHlQK5K3zQdGFO0h4jPg7Azk-gzGzoHsz -------------------------------------------------------------------------------- /.leancloud/current_group: -------------------------------------------------------------------------------- 1 | web -------------------------------------------------------------------------------- /.leancloud/recent_linked_apps: -------------------------------------------------------------------------------- 1 | ["fHlQK5K3zQdGFO0h4jPg7Azk-gzGzoHsz"] -------------------------------------------------------------------------------- /.leanignore: -------------------------------------------------------------------------------- 1 | .git/ 2 | .DS_Store 3 | .avoscloud/ 4 | .leancloud/ 5 | node_modules/ -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Byemess-基于React&redux的在线Todo应用 2 | 3 | 为什么又是Todo,全世界的初学者都在做todo吗?可能很多人要问这句话,其实这句话可以等同于: 4 | 5 | - 为什么你做了个云音乐播放器? 6 | - 为什么你做了个新闻阅读APP? 7 | - 为什么你做了个VUE/REACT版本的CNODE? 8 | 9 | 究其本质,这几个应用都是data-map模式,哈哈哈哈这是我自己创的词,意思就是说,本质都是拿到一组数据,然后就像遍历数组一样将这些数据遍历渲染,这类project都可以算是pure-data-driven的。 10 | 11 | 至于我为什么做了Todo,答案很简单,我初学react&redux时接触的例子就是Todo,将这个app进行功能拓展,将会使用到react和redux的各种特性。 12 | 13 | 这个App的UI直接参考了知乎[@黄玄](https://www.zhihu.com/people/huxpro/answers)的Vue写的TodoApp,已经获得他本人的许可。设计活儿太磨人,本着熟练react&redux的项目实战的目的,UI和交互就没有想花太多时间去设计,直接照着样子写了一个,他的代码我可一个字都没看过,别喷我山寨哈哈哈。 14 | 15 | 16 | ## 已部署版本(2017.05.04更新 17 | heroku国内太卡了,还是直接用了Leancloud。 18 | [点这里点这里:Byemess](https://byemess.leanapp.cn/) 19 | 20 | ## 源代码 21 | [Github](https://github.com/kylewh/NoMess) 22 | 如果对你有有所启发或者帮助,送我一个star吧 :) 23 | 24 | ## 预览 25 | 26 | ### Login 27 | ![](http://om8hmotom.bkt.clouddn.com/2017-05-02-135825.jpg) 28 | 29 | ### Logged 30 | ![](http://om8hmotom.bkt.clouddn.com/2017-05-02-140119.jpg) 31 | 32 | ### Main 33 | ![](http://om8hmotom.bkt.clouddn.com/2017-05-02-135850.jpg) 34 | 35 | ### Add Todo 36 | ![](http://om8hmotom.bkt.clouddn.com/2017-05-02-140021.jpg) 37 | 38 | ### Responsive 39 | ![](http://om8hmotom.bkt.clouddn.com/2017-05-02-135938.jpg) 40 | 41 | ### Drawer 42 | 哈哈哈用drawer来插入一下自我推广的信息貌似是常用套路?主要的页面导航使用bottomBar去切换,这样切换起来更加方便。 43 | ![](http://om8hmotom.bkt.clouddn.com/2017-05-02-140211.jpg) 44 | 45 | ## 目录结构 46 | ![](http://om8hmotom.bkt.clouddn.com/2017-05-02-144625.jpg) 47 | 48 | 标准目录结构,有两个地方提一下: 49 | 50 | 1. styled 用来存储所有经过styled-components进行装饰后的组件,清一色presentational components,所以移入components目录下是没有问题的,但考虑到它的feature,在项目存在潜在规模扩大可能时,通过Feature进行分类更好,所以就没有进行合并。 51 | 52 | 2. 对于components 和 container的分类市面上真是五花八门,对我而言,我更倾向跟随redux作者(真是帅啊)的定义: `It's up to whether the component is aware of Redux`,通俗点说,不需要connect至store的组件都不是container. 这样的确make sense, 不过在组件的分配上会显得有点奇怪,这就比较考功力和经验了。 53 | 54 | ## Function 55 | 56 | - Single Page App 57 | - 在线注册账号,数据存储于leanCloud。 58 | - todoItem增删改,数据同步到云 59 | - 根据完成情况切换视图 60 | - 添加日期标签,所有item按日期分组 61 | 62 | ## TechStack 63 | - **React**: 全套ES6及以上语法,生命周期函数,ref操作,动态渲染,应有尽有。 64 | - **Redux**: 采用最佳实践,针对不同的逻辑state管理进行拆分,然后combine之. 采用Thunk处理Action,控制异步操作。 65 | - **React-Routerv4**:跟以前的版本有显著变化,构建单页APP利器。 66 | - **Styled-Components**: 强推,什么BEM,什么CSS-Module,通通靠边,结合Helper: Styled-props,彻底解决css组件化方案。告别预处理器,避免创造更多学习成本。 67 | - **Webpack**: 自动化构建,采用chunkhash方式分类打包文件,优化用户缓存策略。 68 | - **CSS3**: 结合CSSTransitionGroup,创建组件过场动画,优化体验。 69 | - **underscore**: 用它还是用lodash都行,我只是需要用一下里面的debounce,用来控制edit todoItem时API通信的频率。其实自己手写一个helper也行,在学习redux的练手项目里我就手写= = 。 70 | 71 | 后续可能优化使用的: 72 | 73 | - **reselect**: 再也不用手写那么多重复的state selector了! 74 | - **immutable**: 感受函数式的威力。 75 | - **redux saga**: 2017年了,还不使用generator的异步action控制体系。 76 | 77 | ## Problem 78 | 79 | 1. `state`的设计主要针对数据的获取与查找策略,模拟数据库的方式,建立`LookupTable`,存储目标id,遍历id进行数据拉取。这样的方式好处是在分状态显示todoItems时只需要操作id,而不需要操作数据实体,提高性能。 但是同时也遇到一个问题: 针对查找策略对应确定的api层构造相对耦合,数据拉取方式无法本地模仿,因此让我放弃了使用`LocalStorage`的进行离线状态的支持。 黄玄的策略是优先进行本地操作,用户可以选择上传或者下载数据,这个方式不错,对我有所启发。 过度对数据模型进行装饰的结果便是高耦合,这跟我初衷是基于在线存储数据有关。 算是一个教训。 80 | 81 | 2. 之前想要给登录成功页面添加延时跳转的功能,以便使用户体验更加完整,但是尝试未果,原因是login页面和list页面本质上是两个`route`下的组件,进行切换时会进行拉取数据 => `Re-render`,一旦我登录后再次进入login页面,无论我在login组件里如何尝试记录上一次的状态进行比对(`componentWillReceiveProps`),都是徒劳。 后来想到根目录下App组件可以进行connect保存一个登录的flag,以此来确保第一次从未登录状态进入登录状态时时才会进行跳转。但是我没有这样做,我实在不想污染APP这个root组件,除非再包一层... 82 | 83 | 3. 跳转部分React-router并没有提供更多API,其`Redirect`的时间上的可操控性不高,只能依赖注入`BrowserHistory`属性来进行人工push地址,略为丑陋。鄙人才疏学浅,相信不久后能找到更优雅的方式。 84 | 85 | ## 总结 86 | 87 | ### 我的不足 88 | - **耗费时长**:从学习React&Redux开始,花费了相对**较多的时间**在学习相关的综合知识(组件设计,结构设计,reducer,action的结构最佳实践等等),使得我的项目迟迟未能开工,个人可能更习惯有所深度的学习后再进行实践,也是贪了想少走弯路的念头。然后习惯性被炫酷的技术吸引,研究了两天react-motion(膜拜@chengmo大神啊,咱们中国小伙有智慧),因为当时想要实现drag Sortable List的效果,后来回过神来,先做出基本再说!这个APP从做出原型到重构修改总工时粗略计算大概不到8天,如果撸起袖子直接干,应该可以压缩到6天。当然了学习成本不可忽略,我给自己的时长计算时从0了解到输出成品。 89 | 90 | - **App效果**: 给自己打7分,可优化拓展的东西太多。还记得我说的`data-map`模型吗?我完全可以把这个App打造成一个工作台,把之前那些满地飞的项目都囊括进来,可以加大练习技术的力度,这样我就可以终结满知乎闹的什么“为何vue的demo比react多”之类的无聊话题,纯属Vue好上手!文档亲切直白如私教!各大中文网示例重构demo多到不行好吗!光是react这**英文环境**就够国内60%程序猿吃一壶了。(扯远了哈哈哈) 91 | 92 | ### 夸夸自己 93 | - **及时总结**: 学习的时候容易懵逼容易记忆断片怎么办!?这一度让我很苦恼,为了加速学习进程,唯有: 总结!梳理!写博客!于是诞生了这俩货:(新手朋友们看一看对概念原理理解一定会有帮助) 94 | - [我的第一本Redux小书(基础部分)](https://kylewh.github.io/2017/04/21/%E6%88%91%E7%9A%84%E7%AC%AC%E4%B8%80%E6%9C%ACredux%E5%B0%8F%E4%B9%A6/) 95 | - [Redux上手思维导图](https://kylewh.github.io/2017/04/21/Redux%E5%B0%8F%E4%B9%A6%E7%B3%BB%E5%88%97-Redux%E6%80%9D%E7%BB%B4%E5%AF%BC%E5%9B%BE/) 96 | - **自学上手效率**: 曾经一度不是很自信,当然了都是老大徒伤悲云云,对自己的真实实力还是有一定自信,我相信我能够短时间接受并运用甚至拓展所学知识,我也的确做到了。由于一开始便对react有迷之好感(这辈子第一次对一个技术生态有这种感觉),加上自己英语无压力,阅读了许多关于react技术栈的文章,了解了刀耕火种到现在一片大繁荣的react体系下的技术变迁,对知识体系有了一个宏观的把控,这个阶段大概一周,期间还看着网上的教程写了几个小demo用来针对训练一些技术点:比如`父子双向通信`,`生命周期函数使用场景`,`异步action处理方案`,`模拟redux内部核心功能`:[github(1)](https://github.com/kylewh/Dive_Into_React_Redux),[github(2)](https://github.com/kylewh/redux_mastering)。 我个人的思维很发散,容易噼里啪啦想到很远很歪,导致了以前学习过程中缺乏统一的节奏,一下捣鼓一下动画队列,一下看看源码,没有很持久的去做一件事,这次算是圆满啦。不过这次能上手这么快,也得益于以前javascript的基础,细节不保证全部能回忆,但是思想和经验都沉淀进了自己的脑子,接下来要去找工作,还得把基础好好过一遍,重中之重! 97 | 98 | - **解决实际问题的能力**: 现在自己解决问题的感觉越来越好,可以快速定位问题的症结,擅用搜索引擎(我真的好久好久没有用过baidu了...),specific的问题会一股脑先用文字输出的形式描述一遍,这样让问题的结构在脑中有个印象,然后过一会儿回来自己就萌发idea,然后尝试 -> 解决。 最后一句: **靠自己。** 99 | 100 | ## 最后的最后,求star,求支持,本人小硕应届,求推荐深圳的工作 :) 101 | 102 | -------------------------------------------------------------------------------- /dist/bundle.5526aacf72a4dc966459.js: -------------------------------------------------------------------------------- 1 | webpackJsonp([1],{106:function(t,n,e){"use strict";n.__esModule=!0;n.TOGGLE_ADD_TODO="TOGGLE_ADD_TODO",n.TOGGLE_SIDEBAR="TOGGLE_SIDEBAR",n.FETCH_TODOS_REQUEST="FETCH_TODOS_REQUEST",n.FETCH_TODOS_SUCCESS="FETCH_TODOS_SUCCESS",n.FETCH_TODOS_FAILURE="FETCH_TODOS_FAILURE",n.ADD_TODO_SUCCESS="ADD_TODO_SUCCESS",n.ADD_TODO_FAILURE="ADD_TODO_FAILURE",n.EDIT_TODO_SUCCESS="EDIT_TODO_SUCCESS",n.EDIT_TODO_FAILURE="EDIT_TODO_FAILURE",n.TOGGLE_TODO_SUCCESS="TOGGLE_TODO_SUCCESS",n.TOGGLE_TODO_FAILURE="TOGGLE_TODO_FAILURE",n.DELETE_TODO_SUCCESS="DELETE_TODO_SUCCESS",n.DELETE_TODO_FAILURE="DELETE_TODO_FAILURE",n.USER_LOGIN_REQUEST="USER_LOGIN_REQUEST",n.USER_LOGIN_SUCCESS="USER_LOGIN_SUCCESS",n.USER_LOGIN_FAILURE="USER_LOGIN_FAILURE",n.USER_LOGOUT_SUCCESS="USER_LOGOUT_SUCCESS",n.USER_LOGOUT_FAILURE="USER_LOGOUT_FAILURE"},171:function(t,n,e){"use strict";function o(t){return t&&t.__esModule?t:{default:t}}function r(t,n){var e={};for(var o in t)n.indexOf(o)>=0||Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e}n.__esModule=!0;var a=function(t,n){return t.raw=n,t}(["\n margin: "," !important;\n & span {\n color: "," !important;\n font-weight: lighter !important;\n font-size: ","px !important;\n }\n display: ",";\n "],["\n margin: "," !important;\n & span {\n color: "," !important;\n font-weight: lighter !important;\n font-size: ","px !important;\n }\n display: ",";\n "]),i=e(0),l=o(i),u=e(13),s=o(u),d=e(704),c=o(d),f=e(80),p=o(f),m={default:0,login:"30px 0 0 0",logout:"25px 0 0 0"},g={deafult:"#424242",login:"#03A9F4",logout:"#FF5B45"},h={default:16,bigger:18},b=(0,s.default)(function(t){var n=(t.hide,t.login,t.bigger,t.logout,r(t,["hide","login","bigger","logout"]));return l.default.createElement(p.default,n)})(a,(0,c.default)(m),(0,c.default)(g),(0,c.default)(h),function(t){return!0===t.hide?"none !important":"inline-block"});n.default=b},279:function(t,n,e){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var o=function(t,n){return function(e){var o=Object.keys(t).filter(function(t){return void 0!==e[t]});o.length;var r=o[0];return t[r]?t[r]:n&&e[n]&&t[e[n]]?t[e[n]]:void 0}};n.default=o},281:function(t,n,e){"use strict";function o(t){return t&&t.__esModule?t:{default:t}}function r(t,n){if(!(t instanceof n))throw new TypeError("Cannot call a class as a function")}function a(t,n){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!n||"object"!=typeof n&&"function"!=typeof n?t:n}function i(t,n){if("function"!=typeof n&&null!==n)throw new TypeError("Super expression must either be null or a function, not "+typeof n);t.prototype=Object.create(n&&n.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),n&&(Object.setPrototypeOf?Object.setPrototypeOf(t,n):t.__proto__=n)}n.__esModule=!0;var l=function(t,n){return t.raw=n,t}(['\n html,\n body {\n margin: 0;\n padding: 0;\n font-weight: 300;\n }\n\n body {\n font-family: "Helvetica Neue", "Arial", " Segoe UI", "PingFang SC", "Hiragino Sans GB", "STHeiti", "Microsoft YaHei", "Microsoft JhengHei", "Source Han Sans SC", "Noto Sans CJK SC", "Source Han Sans CN", "Noto Sans SC", "Source Han Sans TC", "Noto Sans CJK TC", "WenQuanYi Micro Hei", SimSun, sans-serif !important;\n }\n\n ul,\n li {\n margin: 0;\n padding: 0;\n list-style: none;\n }\n\n #root {\n height: 100vh;\n width: 100vw;\n background-color: whitesmoke;\n }\n\n button,\n input,\n select,\n textarea {\n margin: 0;\n font-size: 100%;\n font-family: inherit;\n }\n'],['\n html,\n body {\n margin: 0;\n padding: 0;\n font-weight: 300;\n }\n\n body {\n font-family: "Helvetica Neue", "Arial", " Segoe UI", "PingFang SC", "Hiragino Sans GB", "STHeiti", "Microsoft YaHei", "Microsoft JhengHei", "Source Han Sans SC", "Noto Sans CJK SC", "Source Han Sans CN", "Noto Sans SC", "Source Han Sans TC", "Noto Sans CJK TC", "WenQuanYi Micro Hei", SimSun, sans-serif !important;\n }\n\n ul,\n li {\n margin: 0;\n padding: 0;\n list-style: none;\n }\n\n #root {\n height: 100vh;\n width: 100vw;\n background-color: whitesmoke;\n }\n\n button,\n input,\n select,\n textarea {\n margin: 0;\n font-size: 100%;\n font-family: inherit;\n }\n']),u=e(0),s=o(u),d=e(35),c=e(126),f=o(c),p=e(36),m=e(13),g=e(96),h=e(239),b=o(h),y=e(671),v=o(y),_=e(238),x=o(_),w=e(288),E=o(w);(0,v.default)(),(0,m.injectGlobal)(l);var O=(0,b.default)({palette:{fontFamily:"Roboto",primary1Color:g.lightBlueA400,alternateTextColor:g.white},appBar:{height:60,color:"#2196f3"},checkbox:{boxColor:"#455a64",checkedColor:"#00b0ff"}}),S=function(t){function n(){return r(this,n),a(this,t.apply(this,arguments))}return i(n,t),n.prototype.componentDidMount=function(){console.log("app loaded")},n.prototype.render=function(){var t=this.props.store;return s.default.createElement(x.default,{muiTheme:O},s.default.createElement(d.Provider,{store:t},s.default.createElement(p.BrowserRouter,{history:(0,f.default)()},s.default.createElement(E.default,null))))},n}(u.Component);n.default=S},282:function(t,n,e){"use strict";function o(t){return t&&t.__esModule?t:{default:t}}n.__esModule=!0;var r=("function"==typeof Symbol&&Symbol.iterator,e(86)),a=e(53),i=e(168),l=e(169),u=o(l),s=e(37),d=o(s),c=function(){(0,r.initLeanCloud)();var t=[u.default,(0,i.createLogger)()],n=[a.applyMiddleware.apply(void 0,t)],e=a.compose;return(0,a.createStore)(d.default,e.apply(void 0,n))};n.default=c},285:function(t,n,e){"use strict";n.__esModule=!0,n.arrayOfTodos=n.todo=void 0;var o=e(105),r=n.todo=new o.schema.Entity("todos");n.arrayOfTodos=new o.schema.Array(r)},286:function(t,n,e){"use strict";function o(t){return t&&t.__esModule?t:{default:t}}function r(t,n){var e={};for(var o in t)n.indexOf(o)>=0||Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e}function a(t,n){return t.raw=n,t}n.__esModule=!0;var i=a(["\n -webkit-transform: rotate(-45deg);\n transform: rotate(-45deg);\n background-color: #f44336 !important;\n"],["\n -webkit-transform: rotate(-45deg);\n transform: rotate(-45deg);\n background-color: #f44336 !important;\n"]),l=a(["\n -webkit-transform: scale(1.1);\n transform: scale(1.1);\n -webkit-transition: all 0.3s !important;\n transition: all 0.3s !important;\n position: fixed !important;\n bottom: 84px !important;\n right: 20px !important;\n z-index: 100;\n & button {\n ","\n }\n"],["\n -webkit-transform: scale(1.1);\n transform: scale(1.1);\n -webkit-transition: all 0.3s !important;\n transition: all 0.3s !important;\n position: fixed !important;\n bottom: 84px !important;\n right: 20px !important;\n z-index: 100;\n & button {\n ","\n }\n"]),u=e(0),s=o(u),d=e(13),c=o(d),f=e(211),p=o(f),m=e(535),g=o(m),h=(0,d.css)(i),b=(0,c.default)(function(t){var n=(t.active,r(t,["active"]));return s.default.createElement(p.default,n)})(l,function(t){return!0===t.active?h:""}),y=function(t){var n=t.toggleAddToDo,e=t.isAdding;return s.default.createElement(b,{secondary:!0,active:e,onClick:function(){return n()}},s.default.createElement(g.default,null))};n.default=y},287:function(t,n,e){"use strict";function o(t){return t&&t.__esModule?t:{default:t}}function r(t,n){if(!(t instanceof n))throw new TypeError("Cannot call a class as a function")}function a(t,n){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!n||"object"!=typeof n&&"function"!=typeof n?t:n}function i(t,n){if("function"!=typeof n&&null!==n)throw new TypeError("Super expression must either be null or a function, not "+typeof n);t.prototype=Object.create(n&&n.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),n&&(Object.setPrototypeOf?Object.setPrototypeOf(t,n):t.__proto__=n)}n.__esModule=!0;var l=e(0),u=o(l),s=e(317),d=o(s),c=e(322),f=o(c),p=e(319),m=o(p),g=e(306),h=o(g),b=e(321),y=o(b),v=function(t){function n(){var e,o,i;r(this,n);for(var l=arguments.length,u=Array(l),s=0;s=0||Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e}function a(t,n){if(!(t instanceof n))throw new TypeError("Cannot call a class as a function")}function i(t,n){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!n||"object"!=typeof n&&"function"!=typeof n?t:n}function l(t,n){if("function"!=typeof n&&null!==n)throw new TypeError("Super expression must either be null or a function, not "+typeof n);t.prototype=Object.create(n&&n.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),n&&(Object.setPrototypeOf?Object.setPrototypeOf(t,n):t.__proto__=n)}n.__esModule=!0;var u=Object.assign||function(t){for(var n=1;n0?n+"天后":0===n?"今天":n<0?Math.abs(n)+"天前":void 0},n.prototype.render=function(){var t=this,n=this.props,e=n.todos,o=r(n,["todos"]),a=Object.keys(e);return d.default.createElement(x.default,null,d.default.createElement(m.default,{component:E.default,transitionName:"todo-list-ct",transitionEnterTimeout:300,transitionLeaveTimeout:250},a.map(function(n){var r={offsetDay:t.printOffsetDay(new Date(n)),date:n.slice(0,10),day:t.printDay(new Date(n))};return d.default.createElement(v.default,u({key:n,dateInfo:r,todosByDue:e[n]},o))})))},n}(s.Component),S=function(t,n){var e=n.match,o=e.params.filter||"all";return{todos:(0,b.getVisibleTodos)(t,o),errorMessage:(0,b.getErrorMessage)(t,o),isFecthing:(0,b.getIsFetching)(t,o),filter:o}};n.default=(0,f.withRouter)((0,c.connect)(S,h)(O))},299:function(t,n,e){"use strict";function o(t){return t&&t.__esModule?t:{default:t}}var r=e(0),a=o(r),i=e(17),l=e(281),u=o(l),s=e(282),d=o(s),c=(0,d.default)();(0,i.render)(a.default.createElement(u.default,{store:c}),document.getElementById("root"))},300:function(t,n,e){"use strict";n.__esModule=!0;var o=Object.assign||function(t){for(var n=1;n0&&void 0!==arguments[0]?arguments[0]:{},n=arguments[1];return n.response?o({},t,n.response.entities.todos):t};n.default=r;n.getTodo=function(t,n){return t[n]},n.getDue=function(t,n){return t[n].due}},301:function(t,n,e){"use strict";n.__esModule=!0,n.getIsSidebarOpen=n.getIsLogging=n.getIsAdding=void 0;var o=e(53),r=e(106),a=function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];switch(arguments[1].type){case r.TOGGLE_ADD_TODO:case r.ADD_TODO_SUCCESS:return!t;default:return t}},i=function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];switch(arguments[1].type){case r.TOGGLE_SIDEBAR:return!t;default:return t}},l=function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];switch(arguments[1].type){case r.USER_LOGIN_REQUEST:return t=!0;case r.USER_LOGIN_SUCCESS:case r.USER_LOGIN_FAILURE:return t=!1;default:return t}},u=(0,o.combineReducers)({isAdding:a,isLogging:l,isSidebarOpen:i});n.default=u;n.getIsAdding=function(t){return t.isAdding},n.getIsLogging=function(t){return t.isLogging},n.getIsSidebarOpen=function(t){return t.isSidebarOpen}},302:function(t,n,e){"use strict";n.__esModule=!0,n.getErrorMessage=n.getIsFetching=n.getIds=void 0;var o=e(53),r=e(106),a=function(t){var n=function(n,e){var o=e.response,r=o.result,a=o.entities,i=a.todos[r].completed;return i&&"active"===t||!i&&"completed"===t?n.filter(function(t){return t!==r}):n},e=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],o=arguments[1];switch(o.type){case r.FETCH_TODOS_SUCCESS:return t===o.filter?o.response.result:e;case r.ADD_TODO_SUCCESS:return"completed"!==t?[].concat(e,[o.response.result]):e;case r.TOGGLE_TODO_SUCCESS:return n(e,o);case r.DELETE_TODO_SUCCESS:return e.filter(function(t){return t!==o.id});default:return e}},a=function(){var n=arguments.length>0&&void 0!==arguments[0]&&arguments[0],e=arguments[1];if(e.filter!==t)return n;switch(e.type){case r.FETCH_TODOS_REQUEST:return n=!0;case r.FETCH_TODOS_SUCCESS:case r.FETCH_TODOS_FAILURE:return n=!1;default:return n}},i=function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,e=arguments[1];if(e.filter!==t)return n;switch(e.type){case r.FETCH_TODOS_FAILURE:case r.DELETE_TODO_FAILURE:case r.ADD_TODO_FAILURE:case r.TOGGLE_TODO_FAILURE:return e.message;case r.FETCH_TODOS_REQUEST:case r.FETCH_TODOS_SUCCESS:return null;default:return n}};return(0,o.combineReducers)({ids:e,isFetching:a,errorMessage:i})};n.default=a;n.getIds=function(t){return t.ids},n.getIsFetching=function(t){return t.isFetching},n.getErrorMessage=function(t){return t.errorMessage}},303:function(t,n,e){"use strict";n.__esModule=!0,n.getLogError=n.getCurrentUser=void 0;var o=Object.assign||function(t){for(var n=1;n0&&void 0!==arguments[0]?arguments[0]:{currentUser:a.getCurrentUser()||null,error:null},n=arguments[1];switch(n.type){case i.USER_LOGIN_SUCCESS:return o({},t,{currentUser:n.loginedUser,error:null});case i.USER_LOGOUT_SUCCESS:return o({},t,{currentUser:null});case i.USER_LOGIN_FAILURE:case i.USER_LOGOUT_FAILURE:return o({},t,{error:n.error});default:return t}};n.default=l;n.getCurrentUser=function(t){return t.currentUser},n.getLogError=function(t){return t.error}},304:function(t,n,e){"use strict";n.__esModule=!0;var o=function(t,n){return t.raw=n,t}(["\n position: fixed !important;\n bottom: 0 !important;\n zIndex: 1100 !important;\n width: 100% !important;\n boxShadow: none !important;\n border: 0 none !important;\n overflow: hidden !important;\n &>div {\n display: flex !important;\n justify-content: space-around !important;\n }\n"],["\n position: fixed !important;\n bottom: 0 !important;\n zIndex: 1100 !important;\n width: 100% !important;\n boxShadow: none !important;\n border: 0 none !important;\n overflow: hidden !important;\n &>div {\n display: flex !important;\n justify-content: space-around !important;\n }\n"]),r=e(13),a=function(t){return t&&t.__esModule?t:{default:t}}(r),i=e(52),l=(0,a.default)(i.Paper)(o);n.default=l},305:function(t,n,e){"use strict";n.__esModule=!0;var o=function(t,n){return t.raw=n,t}(["\n &.btn-active svg {\n fill: rgb(0, 176, 255) !important;\n }\n\n &.btn-active div {\n color: rgb(0, 176, 255) !important;\n }\n"],["\n &.btn-active svg {\n fill: rgb(0, 176, 255) !important;\n }\n\n &.btn-active div {\n color: rgb(0, 176, 255) !important;\n }\n"]),r=e(13),a=function(t){return t&&t.__esModule?t:{default:t}}(r),i=e(36),l=(0,a.default)(i.NavLink)(o);n.default=l},306:function(t,n,e){"use strict";n.__esModule=!0;var o=function(t,n){return t.raw=n,t}(["\n &::-webkit-inner-spin-button,\n &::-webkit-clear-button {\n display: none;\n }\n"],["\n &::-webkit-inner-spin-button,\n &::-webkit-clear-button {\n display: none;\n }\n"]),r=e(13),a=function(t){return t&&t.__esModule?t:{default:t}}(r),i=a.default.input(o);n.default=i},307:function(t,n,e){"use strict";function o(t){return t&&t.__esModule?t:{default:t}}function r(t,n){return t.raw=n,t}n.__esModule=!0;var a=r(["\n display: -ms-flexbox;\n display: -webkit-box;\n display: flex;\n padding: 12px;\n -ms-flex-line-pack: center;\n align-content: center;\n border-radius: 50%;\n &:active {\n background-color: #f5f5f5;\n }\n @media all and (min-width:640px) {\n & .delete {\n display: none !important;\n }\n }\n"],["\n display: -ms-flexbox;\n display: -webkit-box;\n display: flex;\n padding: 12px;\n -ms-flex-line-pack: center;\n align-content: center;\n border-radius: 50%;\n &:active {\n background-color: #f5f5f5;\n }\n @media all and (min-width:640px) {\n & .delete {\n display: none !important;\n }\n }\n"]),i=r(["\n display: inline-block !important;\n fill: #f44336 !important;\n -webkit-transition: all 200ms cubic-bezier(0.23, 1, 0.32, 1) 0ms !important;\n transition: all 200ms cubic-bezier(0.23, 1, 0.32, 1) 0ms !important;\n align-self: center;\n width: 18 !important;\n height: 18 !important;\n &:hover {\n color: #ff5722 !important;\n }\n"],["\n display: inline-block !important;\n fill: #f44336 !important;\n -webkit-transition: all 200ms cubic-bezier(0.23, 1, 0.32, 1) 0ms !important;\n transition: all 200ms cubic-bezier(0.23, 1, 0.32, 1) 0ms !important;\n align-self: center;\n width: 18 !important;\n height: 18 !important;\n &:hover {\n color: #ff5722 !important;\n }\n"]),l=e(0),u=o(l),s=e(13),d=o(s),c=e(536),f=o(c),p=d.default.a(a),m=(0,d.default)(f.default)(i),g=function(t){var n=t.onClick;return u.default.createElement(p,null,u.default.createElement(m,{className:"delete",onClick:n}))};n.default=g},308:function(t,n,e){"use strict";n.__esModule=!0;var o=function(t,n){return t.raw=n,t}(["\n &.todo-list-ct-enter {\n opacity: 0;\n -webkit-transform: translate3d(-350px, 0, 0);\n transform: translate3d(-350px, 0, 0);\n }\n\n &.todo-list-ct-enter.todo-list-ct-enter-active {\n opacity: 1;\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n -webkit-transition-property: opacity, -webkit-transform;\n transition-property: opacity, -webkit-transform;\n transition-property: transform, opacity;\n transition-property: transform, opacity, -webkit-transform;\n -webkit-transition-duration: 300ms;\n transition-duration: 300ms;\n }\n\n &.todo-list-ct-leave {\n opacity: 1;\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n -webkit-transition-property: opacity, -webkit-transform;\n transition-property: opacity, -webkit-transform;\n transition-property: transform, opacity;\n transition-property: transform, opacity, -webkit-transform;\n -webkit-transition-duration: 200ms;\n transition-duration: 200ms;\n }\n\n &.todo-list-ct-leave.todo-list-ct-leave-active {\n opacity: 0;\n -webkit-transform: translate3d(-350px, 0, 0);\n transform: translate3d(-350px, 0, 0);\n -webkit-transition-duration: 200ms;\n transition-duration: 200ms;\n }\n"],["\n &.todo-list-ct-enter {\n opacity: 0;\n -webkit-transform: translate3d(-350px, 0, 0);\n transform: translate3d(-350px, 0, 0);\n }\n\n &.todo-list-ct-enter.todo-list-ct-enter-active {\n opacity: 1;\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n -webkit-transition-property: opacity, -webkit-transform;\n transition-property: opacity, -webkit-transform;\n transition-property: transform, opacity;\n transition-property: transform, opacity, -webkit-transform;\n -webkit-transition-duration: 300ms;\n transition-duration: 300ms;\n }\n\n &.todo-list-ct-leave {\n opacity: 1;\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n -webkit-transition-property: opacity, -webkit-transform;\n transition-property: opacity, -webkit-transform;\n transition-property: transform, opacity;\n transition-property: transform, opacity, -webkit-transform;\n -webkit-transition-duration: 200ms;\n transition-duration: 200ms;\n }\n\n &.todo-list-ct-leave.todo-list-ct-leave-active {\n opacity: 0;\n -webkit-transform: translate3d(-350px, 0, 0);\n transform: translate3d(-350px, 0, 0);\n -webkit-transition-duration: 200ms;\n transition-duration: 200ms;\n }\n"]),r=e(13),a=function(t){return t&&t.__esModule?t:{default:t}}(r),i=a.default.ul(o);n.default=i},309:function(t,n,e){"use strict";n.__esModule=!0;var o=function(t,n){return t.raw=n,t}(["\n display: -ms-flexbox;\n display: -webkit-box;\n display: flex;\n padding-top: 15px;\n padding-bottom: 95px;\n -webkit-box-pack: center;\n -ms-flex-pack: center;\n justify-content: center;\n -webkit-box-orient: vertical;\n -webkit-box-direction: normal;\n -ms-flex-direction: column;\n flex-direction: column;\n @media all and (min-width:640px) {\n & {\n width: 70%;\n margin: 0 auto;\n }\n };\n @media all and (min-width:1000px) {\n & {\n width: 57%;\n margin: 0 auto;\n }\n };\n"],["\n display: -ms-flexbox;\n display: -webkit-box;\n display: flex;\n padding-top: 15px;\n padding-bottom: 95px;\n -webkit-box-pack: center;\n -ms-flex-pack: center;\n justify-content: center;\n -webkit-box-orient: vertical;\n -webkit-box-direction: normal;\n -ms-flex-direction: column;\n flex-direction: column;\n @media all and (min-width:640px) {\n & {\n width: 70%;\n margin: 0 auto;\n }\n };\n @media all and (min-width:1000px) {\n & {\n width: 57%;\n margin: 0 auto;\n }\n };\n"]),r=e(13),a=function(t){return t&&t.__esModule?t:{default:t}}(r),i=a.default.div(o);n.default=i},310:function(t,n,e){"use strict";function o(t){return t&&t.__esModule?t:{default:t}}function r(t,n){var e={};for(var o in t)n.indexOf(o)>=0||Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e}n.__esModule=!0;var a=Object.assign||function(t){for(var n=1;n=0||Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e}n.__esModule=!0;var a=function(t,n){return t.raw=n,t}(["\n display: ",";\n"],["\n display: ",";\n"]),i=e(0),l=o(i),u=e(13),s=o(u),d=e(218),c=o(d),f=(0,s.default)(function(t){var n=(t.hide,r(t,["hide"]));return l.default.createElement(c.default,n)})(a,function(t){return!0===t.hide?"none !important":"inline-block"});n.default=f},313:function(t,n,e){"use strict";function o(t,n){return t.raw=n,t}n.__esModule=!0;var r=o(["\n from {\n -webkit-transform: scale3d(1, 1, 1);\n transform: scale3d(1, 1, 1);\n }\n 50% {\n -webkit-transform: scale3d(1.05, 1.05, 1.05);\n transform: scale3d(1.05, 1.05, 1.05);\n }\n to {\n -webkit-transform: scale3d(1, 1, 1);\n transform: scale3d(1, 1, 1);\n }\n"],["\n from {\n -webkit-transform: scale3d(1, 1, 1);\n transform: scale3d(1, 1, 1);\n }\n 50% {\n -webkit-transform: scale3d(1.05, 1.05, 1.05);\n transform: scale3d(1.05, 1.05, 1.05);\n }\n to {\n -webkit-transform: scale3d(1, 1, 1);\n transform: scale3d(1, 1, 1);\n }\n"]),a=o(["\n color: #f44336;\n -webkit-animation: 1s ease-in pulse;\n animation: 1s ease-in ",";\n font-size: 14px;\n line-height: 1.7rem;\n"],["\n color: #f44336;\n -webkit-animation: 1s ease-in pulse;\n animation: 1s ease-in ",";\n font-size: 14px;\n line-height: 1.7rem;\n"]),i=o(["\n display: block;\n padding: 30px 0px 15px 0px;\n font-size: 1.2rem;\n color: #03A9F4;\n ","\n"],["\n display: block;\n padding: 30px 0px 15px 0px;\n font-size: 1.2rem;\n color: #03A9F4;\n ","\n"]),l=e(13),u=function(t){return t&&t.__esModule?t:{default:t}}(l),s=(0,l.keyframes)(r),d=(0,l.css)(a,s),c=u.default.span(i,function(t){return!0==!!t.error?d:""});n.default=c},314:function(t,n,e){"use strict";function o(t){return t&&t.__esModule?t:{default:t}}n.__esModule=!0;var r=function(t,n){return t.raw=n,t}(["\n fill: #fff !important;\n"],["\n fill: #fff !important;\n"]),a=e(0),i=o(a),l=e(52),u=e(241),s=o(u),d=e(13),c=o(d),f=(0,c.default)(s.default)(r);n.default=function(t){var n=t.onClick;return i.default.createElement(l.IconButton,{onClick:n},i.default.createElement(f,null))}},315:function(t,n,e){"use strict";n.__esModule=!0;var o=function(t,n){return t.raw=n,t}(["\n text-decoration: none;\n color: rgba(0, 0, 0, 0.87);\n"],["\n text-decoration: none;\n color: rgba(0, 0, 0, 0.87);\n"]),r=e(13),a=function(t){return t&&t.__esModule?t:{default:t}}(r),i=a.default.a(o);n.default=i},316:function(t,n,e){"use strict";n.__esModule=!0;var o=function(t,n){return t.raw=n,t}(["\n background-size: cover;\n background-position: center;\n height: 100vh;\n width: 100vw;\n background-image: ",";\n"],["\n background-size: cover;\n background-position: center;\n height: 100vh;\n width: 100vw;\n background-image: ",";\n"]),r=e(13),a=function(t){return t&&t.__esModule?t:{default:t}}(r),i=a.default.div(o,function(t){return t.login?"url('http://om8hmotom.bkt.clouddn.com/hot-air-balloon-35248-2560x1600.webp')":"none"});n.default=i},317:function(t,n,e){"use strict";n.__esModule=!0;var o=function(t,n){return t.raw=n,t}(["\n box-shadow: 0px 2px 5px rgba(0, 0, 0, 0.26);\n position: fixed;\n top: 0px;\n z-index: 900;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n border: none;\n padding-top: 58px;\n background-color: #2196f3 !important;\n @media all and (min-width:640px) {\n & {\n width: 500px;\n height: 60%;\n position: fixed;\n right: 86px;\n bottom: 66px;\n top: auto;\n padding-top: 0px !important;\n overflow: hidden;\n border-radius: 3px;\n }\n }\n &.addTodo-panel-enter {\n opacity: 0.01;\n -webkit-transform: translate3d(0, -20%, 0);\n transform: translate3d(0, -20%, 0);\n }\n\n &.addTodo-panel-enter.addTodo-panel-enter-active {\n opacity: 1;\n -webkit-transition: all 250ms ease;\n transition: all 250ms ease;\n transform: translate3d(0, 0, 0);\n -webkit-transform: translate3d(0, 0, 0);\n }\n\n &.addTodo-panel-leave {\n opacity: 1;\n }\n\n &.addTodo-panel-leave.addTodo-panel-leave-active {\n opacity: 0.01;\n -webkit-transition: all 300ms ease;\n transition: all 300ms ease;\n -webkit-transform: translate3d(0, -20%, 0);\n transform: translate3d(0, -20%, 0);\n }\n"],["\n box-shadow: 0px 2px 5px rgba(0, 0, 0, 0.26);\n position: fixed;\n top: 0px;\n z-index: 900;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n border: none;\n padding-top: 58px;\n background-color: #2196f3 !important;\n @media all and (min-width:640px) {\n & {\n width: 500px;\n height: 60%;\n position: fixed;\n right: 86px;\n bottom: 66px;\n top: auto;\n padding-top: 0px !important;\n overflow: hidden;\n border-radius: 3px;\n }\n }\n &.addTodo-panel-enter {\n opacity: 0.01;\n -webkit-transform: translate3d(0, -20%, 0);\n transform: translate3d(0, -20%, 0);\n }\n\n &.addTodo-panel-enter.addTodo-panel-enter-active {\n opacity: 1;\n -webkit-transition: all 250ms ease;\n transition: all 250ms ease;\n transform: translate3d(0, 0, 0);\n -webkit-transform: translate3d(0, 0, 0);\n }\n\n &.addTodo-panel-leave {\n opacity: 1;\n }\n\n &.addTodo-panel-leave.addTodo-panel-leave-active {\n opacity: 0.01;\n -webkit-transition: all 300ms ease;\n transition: all 300ms ease;\n -webkit-transform: translate3d(0, -20%, 0);\n transform: translate3d(0, -20%, 0);\n }\n"]),r=e(13),a=function(t){return t&&t.__esModule?t:{default:t}}(r),i=a.default.form(o);n.default=i},318:function(t,n,e){"use strict";function o(t){return t&&t.__esModule?t:{default:t}}function r(t,n){var e={};for(var o in t)n.indexOf(o)>=0||Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e}n.__esModule=!0;var a=function(t,n){return t.raw=n,t}(["\n height: 1px !important;\n backgroundColor: #FFEB3B !important;\n zIndex: 1200!important;\n display: ",";\n"],["\n height: 1px !important;\n backgroundColor: #FFEB3B !important;\n zIndex: 1200!important;\n display: ",";\n"]),i=e(0),l=o(i),u=e(213),s=o(u),d=e(13),c=o(d),f=(0,c.default)(function(t){var n=(t.hide,r(t,["hide"]));return l.default.createElement(s.default,n)})(a,function(t){return!1===t.hide?"none!important":"block!important"});n.default=f},319:function(t,n,e){"use strict";n.__esModule=!0;var o=function(t,n){return t.raw=n,t}(["\n font-size: 16px;\n padding: 0px;\n width: 100%;\n position: absolute;\n bottom: 0px;\n min-height: 56px;\n display: -ms-flexbox;\n display: -webkit-box;\n display: flex;\n -ms-flex-align: center;\n -webkit-box-align: center;\n align-items: center;\n -ms-flex-pack: distribute;\n justify-content: space-around;\n &>div:nth-of-type(1) {\n -ms-flex-positive: 2;\n -webkit-box-flex: 2;\n flex-grow: 2;\n }\n &>div:nth-of-type(2) {\n -ms-flex-positive: 4;\n -webkit-box-flex: 4;\n flex-grow: 4;\n }\n &>div:nth-of-type(3) {\n -ms-flex-positive: 2;\n -webkit-box-flex: 2;\n flex-grow: 2;\n }\n &>div>* {\n font-weight: lighter;\n outline: 0;\n color: #fff;\n padding: 15px;\n line-height: 20px;\n -webkit-appearance: none;\n background: none;\n border: none;\n text-align: center;\n }\n &>div>*:active {\n background-color: rgba(115, 130, 155, 0.1) !important;\n }\n"],["\n font-size: 16px;\n padding: 0px;\n width: 100%;\n position: absolute;\n bottom: 0px;\n min-height: 56px;\n display: -ms-flexbox;\n display: -webkit-box;\n display: flex;\n -ms-flex-align: center;\n -webkit-box-align: center;\n align-items: center;\n -ms-flex-pack: distribute;\n justify-content: space-around;\n &>div:nth-of-type(1) {\n -ms-flex-positive: 2;\n -webkit-box-flex: 2;\n flex-grow: 2;\n }\n &>div:nth-of-type(2) {\n -ms-flex-positive: 4;\n -webkit-box-flex: 4;\n flex-grow: 4;\n }\n &>div:nth-of-type(3) {\n -ms-flex-positive: 2;\n -webkit-box-flex: 2;\n flex-grow: 2;\n }\n &>div>* {\n font-weight: lighter;\n outline: 0;\n color: #fff;\n padding: 15px;\n line-height: 20px;\n -webkit-appearance: none;\n background: none;\n border: none;\n text-align: center;\n }\n &>div>*:active {\n background-color: rgba(115, 130, 155, 0.1) !important;\n }\n"]),r=e(13),a=function(t){return t&&t.__esModule?t:{default:t}}(r),i=a.default.div(o);n.default=i},320:function(t,n,e){"use strict";n.__esModule=!0;var o=function(t,n){return t.raw=n,t}(["\n position: absolute;\n top: 60px;\n bottom: 0px;\n overflow-x: hidden;\n overflow-y: scroll;\n width: 100%;\n z-index: 1;\n margin-bottom: 56px;\n"],["\n position: absolute;\n top: 60px;\n bottom: 0px;\n overflow-x: hidden;\n overflow-y: scroll;\n width: 100%;\n z-index: 1;\n margin-bottom: 56px;\n"]),r=e(13),a=function(t){return t&&t.__esModule?t:{default:t}}(r),i=a.default.div(o);n.default=i},321:function(t,n,e){"use strict";n.__esModule=!0;var o=function(t,n){return t.raw=n,t}(["\n font-size: 16px;\n color: #FFFF00!important;\n"],["\n font-size: 16px;\n color: #FFFF00!important;\n"]),r=e(13),a=function(t){return t&&t.__esModule?t:{default:t}}(r),i=a.default.input(o);n.default=i},322:function(t,n,e){"use strict";n.__esModule=!0;var o=function(t,n){return t.raw=n,t}(["\n & {\n display: block;\n box-sizing: border-box;\n width: 100%;\n height: 60%;\n padding: 20px;\n outline: none;\n border: none;\n resize: none;\n background-color: transparent;\n color: #FFFF00;\n font-size: 18px;\n }\n &::-webkit-input-placeholder {\n /* Chrome/Opera/Safari */\n color: #fff;\n font-weight: lighter;\n }\n\n &::-moz-placeholder {\n /* Firefox 19+ */\n color: #fff;\n font-weight: lighter;\n }\n\n &:-ms-input-placeholder {\n /* IE 10+ */\n color: #fff;\n font-weight: lighter;\n }\n\n &:-moz-placeholder {\n /* Firefox 18- */\n color: #fff;\n font-weight: lighter;\n }\n"],["\n & {\n display: block;\n box-sizing: border-box;\n width: 100%;\n height: 60%;\n padding: 20px;\n outline: none;\n border: none;\n resize: none;\n background-color: transparent;\n color: #FFFF00;\n font-size: 18px;\n }\n &::-webkit-input-placeholder {\n /* Chrome/Opera/Safari */\n color: #fff;\n font-weight: lighter;\n }\n\n &::-moz-placeholder {\n /* Firefox 19+ */\n color: #fff;\n font-weight: lighter;\n }\n\n &:-ms-input-placeholder {\n /* IE 10+ */\n color: #fff;\n font-weight: lighter;\n }\n\n &:-moz-placeholder {\n /* Firefox 18- */\n color: #fff;\n font-weight: lighter;\n }\n"]),r=e(13),a=function(t){return t&&t.__esModule?t:{default:t}}(r),i=a.default.textarea(o);n.default=i},323:function(t,n,e){"use strict";function o(t,n){return t.raw=n,t}n.__esModule=!0;var r=o(["\n background: #03A9F4;\n color: white !important;\n border-radius: 2px;\n padding: 1px 6px;\n margin: -4px 0px;\n min-width: initial;\n"],["\n background: #03A9F4;\n color: white !important;\n border-radius: 2px;\n padding: 1px 6px;\n margin: -4px 0px;\n min-width: initial;\n"]),a=o(["\n border: none;\n min-height: 16px;\n padding: 10px 10px 10px 20px;\n color: #aaa;\n font-size: 12px;\n position: relative;\n cursor: default;\n &:hover {\n background-color: #F0F0F0;\n }\n & em {\n font-style: normal;\n font-size: 14px;\n padding-right: 10px;\n min-width: 100px;\n display: inline-block;\n color: #9e9e9e;\n }\n & em{\n ","\n }\n & span {\n position: absolute;\n top: 50%;\n left: 50%;\n margin-top: -9px;\n margin-left: -50px;\n }\n"],["\n border: none;\n min-height: 16px;\n padding: 10px 10px 10px 20px;\n color: #aaa;\n font-size: 12px;\n position: relative;\n cursor: default;\n &:hover {\n background-color: #F0F0F0;\n }\n & em {\n font-style: normal;\n font-size: 14px;\n padding-right: 10px;\n min-width: 100px;\n display: inline-block;\n color: #9e9e9e;\n }\n & em{\n ","\n }\n & span {\n position: absolute;\n top: 50%;\n left: 50%;\n margin-top: -9px;\n margin-left: -50px;\n }\n"]),i=e(13),l=function(t){return t&&t.__esModule?t:{default:t}}(i),u=(0,i.css)(r),s=l.default.li(a,function(t){return!0===t.today?u:""});n.default=s},324:function(t,n,e){"use strict";function o(t){return t&&t.__esModule?t:{default:t}}n.__esModule=!0;var r=function(t,n){return t.raw=n,t}(["\n padding: 14px 14px 14px 0;\n display: block !important;\n width: 24px !important;\n"],["\n padding: 14px 14px 14px 0;\n display: block !important;\n width: 24px !important;\n"]),a=e(13),i=o(a),l=e(91),u=o(l),s=(0,i.default)(u.default)(r);n.default=s},325:function(t,n,e){"use strict";n.__esModule=!0;var o=function(t,n){return t.raw=n,t}(["\n background-color: white;\n margin-left: 0px;\n padding-left: 10px;\n padding-right: 4px;\n display: -ms-flexbox;\n display: -webkit-box;\n display: flex;\n word-break: break-all;\n -webkit-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n border-bottom: 1px solid #f5f5f5;\n & :last-of-type {\n border: none;\n }\n &:hover .delete {\n display: inline-block !important;\n }\n\n &.add-remove-item-enter {\n opacity: 0;\n -webkit-transform: translate3d(-350px, 0, 0);\n transform: translate3d(-350px, 0, 0);\n -moz-transform: translate3d(-350px, 0, 0);\n -ms-transform: translate3d(-350px, 0, 0);\n -o-transform: translate3d(-350px, 0, 0);\n }\n\n &.add-remove-item-enter.add-remove-item-enter-active {\n opacity: 1;\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n -webkit-transition-property: opacity, -webkit-transform;\n transition-property: opacity, -webkit-transform;\n transition-property: transform, opacity;\n transition-property: transform, opacity, -webkit-transform;\n -webkit-transition-duration: 250ms;\n transition-duration: 250ms;\n }\n\n &.add-remove-item.leave {\n opacity: 1;\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n -webkit-transition-property: opacity, -webkit-transform;\n transition-property: opacity, -webkit-transform;\n transition-property: transform, opacity;\n transition-property: transform, opacity, -webkit-transform;\n }\n\n &.add-remove-item-leave.add-remove-item-leave-active {\n opacity: 0;\n -webkit-transform: translate3d(-350px, 0, 0);\n transform: translate3d(-350px, 0, 0);\n -webkit-transition-duration: 250ms;\n transition-duration: 250ms;\n }\n"],["\n background-color: white;\n margin-left: 0px;\n padding-left: 10px;\n padding-right: 4px;\n display: -ms-flexbox;\n display: -webkit-box;\n display: flex;\n word-break: break-all;\n -webkit-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n border-bottom: 1px solid #f5f5f5;\n & :last-of-type {\n border: none;\n }\n &:hover .delete {\n display: inline-block !important;\n }\n\n &.add-remove-item-enter {\n opacity: 0;\n -webkit-transform: translate3d(-350px, 0, 0);\n transform: translate3d(-350px, 0, 0);\n -moz-transform: translate3d(-350px, 0, 0);\n -ms-transform: translate3d(-350px, 0, 0);\n -o-transform: translate3d(-350px, 0, 0);\n }\n\n &.add-remove-item-enter.add-remove-item-enter-active {\n opacity: 1;\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n -webkit-transition-property: opacity, -webkit-transform;\n transition-property: opacity, -webkit-transform;\n transition-property: transform, opacity;\n transition-property: transform, opacity, -webkit-transform;\n -webkit-transition-duration: 250ms;\n transition-duration: 250ms;\n }\n\n &.add-remove-item.leave {\n opacity: 1;\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n -webkit-transition-property: opacity, -webkit-transform;\n transition-property: opacity, -webkit-transform;\n transition-property: transform, opacity;\n transition-property: transform, opacity, -webkit-transform;\n }\n\n &.add-remove-item-leave.add-remove-item-leave-active {\n opacity: 0;\n -webkit-transform: translate3d(-350px, 0, 0);\n transform: translate3d(-350px, 0, 0);\n -webkit-transition-duration: 250ms;\n transition-duration: 250ms;\n }\n"]),r=e(13),a=function(t){return t&&t.__esModule?t:{default:t}}(r),i=a.default.li(o);n.default=i},326:function(t,n,e){"use strict";function o(t){return t&&t.__esModule?t:{default:t}}function r(t,n){var e={};for(var o in t)n.indexOf(o)>=0||Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e}n.__esModule=!0;var a=function(t,n){return t.raw=n,t}(["\n font-size: 16px;\n -webkit-box-flex: 1;\n -ms-flex-positive: 1;\n flex-grow: 1;\n color: #424242;\n &.completed textarea {\n color: ",";\n text-decoration: ","\n };\n &.today textarea {\n color: ",";\n };\n & textarea:focus {\n font-weight: 400 !important;\n }\n"],["\n font-size: 16px;\n -webkit-box-flex: 1;\n -ms-flex-positive: 1;\n flex-grow: 1;\n color: #424242;\n &.completed textarea {\n color: ",";\n text-decoration: ","\n };\n &.today textarea {\n color: ",";\n };\n & textarea:focus {\n font-weight: 400 !important;\n }\n"]),i=e(0),l=o(i),u=e(13),s=o(u),d=e(46),c=o(d),f=(0,s.default)(function(t){var n=(t.redText,t.lineThrough,r(t,["redText","lineThrough"]));return l.default.createElement(c.default,n)})(a,function(t){return!0===t.lineThrough?"#BDBDBD !important":"#757575 !important"},function(t){return!0===t.lineThrough?"line-through !important":"none"},function(t){return!0===t.redText?"#ec9494 !important":"#757575 !important"});n.default=f},327:function(t,n,e){"use strict";n.__esModule=!0;var o=function(t,n){return t.raw=n,t}(["\n position: fixed !important;\n top: 0 !important;\n left: 0 !important;\n height: 60px !important;\n & h1 {\n font-weight: 100 !important;\n font-size: 20px !important;\n text-align: center !important;\n }\n"],["\n position: fixed !important;\n top: 0 !important;\n left: 0 !important;\n height: 60px !important;\n & h1 {\n font-weight: 100 !important;\n font-size: 20px !important;\n text-align: center !important;\n }\n"]),r=e(13),a=function(t){return t&&t.__esModule?t:{default:t}}(r),i=e(52),l=function(t){if(t&&t.__esModule)return t;var n={};if(null!=t)for(var e in t)Object.prototype.hasOwnProperty.call(t,e)&&(n[e]=t[e]);return n.default=t,n}(i),u=(0,a.default)(l.AppBar)(o);n.default=u},328:function(t,n,e){"use strict";function o(t){return t&&t.__esModule?t:{default:t}}n.__esModule=!0;var r=function(t,n){return t.raw=n,t}(["\n color: #03A9F4;\n box-sizing: border-box;\n width: 100%;\n padding: 15% 15% 10%;\n min-height: 120px;\n margin: 0 auto;\n text-align: center;\n line-height: 1.5;\n & svg {\n height: 50px !important;\n width: 50px !important;\n fill: #8bc34a !important;\n }\n"],["\n color: #03A9F4;\n box-sizing: border-box;\n width: 100%;\n padding: 15% 15% 10%;\n min-height: 120px;\n margin: 0 auto;\n text-align: center;\n line-height: 1.5;\n & svg {\n height: 50px !important;\n width: 50px !important;\n fill: #8bc34a !important;\n }\n"]),a=e(0),i=o(a),l=e(13),u=o(l),s=e(240),d=o(s),c=e(171),f=o(c),p=u.default.div(r),m=function(t){var n=(t.isLogged,t.username),e=t.onLogoutClick;return i.default.createElement(p,null,i.default.createElement(d.default,null),i.default.createElement("p",null,"欢迎回来! ",n,i.default.createElement("br",null),i.default.createElement("br",null),"使用NoMess,立刻开始您的一天规划"),i.default.createElement(f.default,{bigger:!0,logout:!0,label:"退出登录",onTouchTap:function(t){e()}}))};n.default=m},37:function(t,n,e){"use strict";function o(t){if(t&&t.__esModule)return t;var n={};if(null!=t)for(var e in t)Object.prototype.hasOwnProperty.call(t,e)&&(n[e]=t[e]);return n.default=t,n}n.__esModule=!0,n.getErrorMessage=n.getIsFetching=n.getIsSidebarOpen=n.getCurrentUser=n.getLogError=n.getIsLogging=n.getIsAdding=n.getVisibleTodos=void 0;var r=e(53),a=e(300),i=o(a),l=e(301),u=o(l),s=e(303),d=o(s),c=e(302),f=o(c);o(e(86)).initLeanCloud();var p=(0,r.combineReducers)({all:(0,f.default)("all"),active:(0,f.default)("active"),completed:(0,f.default)("completed")}),m=(0,r.combineReducers)({byId:i.default,listByFilter:p,control:u.default,userInfo:d.default});n.default=m;n.getVisibleTodos=function(t,n){var e=f.getIds(t.listByFilter[n]),o={};return e.map(function(n){return i.getTodo(t.byId,n)}).sort(function(t,n){return+t.due-n.due}).forEach(function(t){var n=new Date(t.due).toJSON();o[n]||(o[n]=[]),o[n].push(t)}),o},n.getIsAdding=function(t){return u.getIsAdding(t.control)},n.getIsLogging=function(t){return u.getIsLogging(t.control)},n.getLogError=function(t){return d.getLogError(t.userInfo)},n.getCurrentUser=function(t){return d.getCurrentUser(t.userInfo)},n.getIsSidebarOpen=function(t){return u.getIsSidebarOpen(t.control)},n.getIsFetching=function(t,n){return f.getIsFetching(t.listByFilter[n])},n.getErrorMessage=function(t,n){return f.getErrorMessage(t.listByFilter[n])}},399:function(t,n,e){"use strict";var o=function(t){var n;for(n in t)if(t.hasOwnProperty(n))return n;return null};t.exports=o},532:function(t,n,e){"use strict";function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(n,"__esModule",{value:!0});var r=e(0),a=o(r),i=e(16),l=o(i),u=e(15),s=o(u),d=function(t){return a.default.createElement(s.default,t,a.default.createElement("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 3c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zm0 14.2c-2.5 0-4.71-1.28-6-3.22.03-1.99 4-3.08 6-3.08 1.99 0 5.97 1.09 6 3.08-1.29 1.94-3.5 3.22-6 3.22z"}))};d=(0,l.default)(d),d.displayName="ActionAccountCircle",d.muiName="SvgIcon",n.default=d},533:function(t,n,e){"use strict";function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(n,"__esModule",{value:!0});var r=e(0),a=o(r),i=e(16),l=o(i),u=e(15),s=o(u),d=function(t){return a.default.createElement(s.default,t,a.default.createElement("path",{d:"M19 3h-4.18C14.4 1.84 13.3 1 12 1c-1.3 0-2.4.84-2.82 2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm2 14H7v-2h7v2zm3-4H7v-2h10v2zm0-4H7V7h10v2z"}))};d=(0,l.default)(d),d.displayName="ActionAssignment",d.muiName="SvgIcon",n.default=d},534:function(t,n,e){"use strict";function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(n,"__esModule",{value:!0});var r=e(0),a=o(r),i=e(16),l=o(i),u=e(15),s=o(u),d=function(t){return a.default.createElement(s.default,t,a.default.createElement("path",{d:"M9 11.75c-.69 0-1.25.56-1.25 1.25s.56 1.25 1.25 1.25 1.25-.56 1.25-1.25-.56-1.25-1.25-1.25zm6 0c-.69 0-1.25.56-1.25 1.25s.56 1.25 1.25 1.25 1.25-.56 1.25-1.25-.56-1.25-1.25-1.25zM12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8 0-.29.02-.58.05-.86 2.36-1.05 4.23-2.98 5.21-5.37C11.07 8.33 14.05 10 17.42 10c.78 0 1.53-.09 2.25-.26.21.71.33 1.47.33 2.26 0 4.41-3.59 8-8 8z"}))};d=(0,l.default)(d),d.displayName="ActionFace",d.muiName="SvgIcon",n.default=d},535:function(t,n,e){"use strict";function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(n,"__esModule",{value:!0});var r=e(0),a=o(r),i=e(16),l=o(i),u=e(15),s=o(u),d=function(t){return a.default.createElement(s.default,t,a.default.createElement("path",{d:"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"}))};d=(0,l.default)(d),d.displayName="ContentAdd",d.muiName="SvgIcon",n.default=d},536:function(t,n,e){"use strict";function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(n,"__esModule",{value:!0});var r=e(0),a=o(r),i=e(16),l=o(i),u=e(15),s=o(u),d=function(t){return a.default.createElement(s.default,t,a.default.createElement("path",{d:"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"}))};d=(0,l.default)(d),d.displayName="ContentClear",d.muiName="SvgIcon",n.default=d},546:function(t,n,e){"use strict";function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(n,"__esModule",{value:!0});var r=e(0),a=o(r),i=e(16),l=o(i),u=e(15),s=o(u),d=function(t){return a.default.createElement(s.default,t,a.default.createElement("path",{d:"M16.53 11.06L15.47 10l-4.88 4.88-2.12-2.12-1.06 1.06L10.59 17l5.94-5.94zM19 3h-1V1h-2v2H8V1H6v2H5c-1.11 0-1.99.9-1.99 2L3 19c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H5V8h14v11z"}))};d=(0,l.default)(d),d.displayName="NotificationEventAvailable",d.muiName="SvgIcon",n.default=d},547:function(t,n,e){"use strict";function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(n,"__esModule",{value:!0});var r=e(0),a=o(r),i=e(16),l=o(i),u=e(15),s=o(u),d=function(t){return a.default.createElement(s.default,t,a.default.createElement("path",{d:"M9.31 17l2.44-2.44L14.19 17l1.06-1.06-2.44-2.44 2.44-2.44L14.19 10l-2.44 2.44L9.31 10l-1.06 1.06 2.44 2.44-2.44 2.44L9.31 17zM19 3h-1V1h-2v2H8V1H6v2H5c-1.11 0-1.99.9-1.99 2L3 19c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H5V8h14v11z"}))};d=(0,l.default)(d),d.displayName="NotificationEventBusy",d.muiName="SvgIcon",n.default=d},548:function(t,n,e){"use strict";function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(n,"__esModule",{value:!0});var r=e(0),a=o(r),i=e(16),l=o(i),u=e(15),s=o(u),d=function(t){return a.default.createElement(s.default,t,a.default.createElement("path",{d:"M17 10H7v2h10v-2zm2-7h-1V1h-2v2H8V1H6v2H5c-1.11 0-1.99.9-1.99 2L3 19c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H5V8h14v11zm-5-5H7v2h7v-2z"}))};d=(0,l.default)(d),d.displayName="NotificationEventNote",d.muiName="SvgIcon",n.default=d},549:function(t,n,e){"use strict";function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(n,"__esModule",{value:!0});var r=e(0),a=o(r),i=e(16),l=o(i),u=e(15),s=o(u),d=function(t){return a.default.createElement(s.default,t,a.default.createElement("path",{d:"M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z"}))};d=(0,l.default)(d),d.displayName="SocialPerson",d.muiName="SvgIcon",n.default=d},581:function(t,n,e){"use strict";var o={topAbort:null,topAnimationEnd:null,topAnimationIteration:null,topAnimationStart:null,topBlur:null,topCanPlay:null,topCanPlayThrough:null,topChange:null,topClick:null,topCompositionEnd:null,topCompositionStart:null,topCompositionUpdate:null,topContextMenu:null,topCopy:null,topCut:null,topDoubleClick:null,topDrag:null,topDragEnd:null,topDragEnter:null,topDragExit:null,topDragLeave:null,topDragOver:null,topDragStart:null,topDrop:null,topDurationChange:null,topEmptied:null,topEncrypted:null,topEnded:null,topError:null,topFocus:null,topInput:null,topInvalid:null,topKeyDown:null,topKeyPress:null,topKeyUp:null,topLoad:null,topLoadedData:null,topLoadedMetadata:null,topLoadStart:null,topMouseDown:null,topMouseMove:null,topMouseOut:null,topMouseOver:null,topMouseUp:null,topPaste:null,topPause:null,topPlay:null,topPlaying:null,topProgress:null,topRateChange:null,topReset:null,topScroll:null,topSeeked:null,topSeeking:null,topSelectionChange:null,topStalled:null,topSubmit:null,topSuspend:null,topTextInput:null,topTimeUpdate:null,topTouchCancel:null,topTouchEnd:null,topTouchMove:null,topTouchStart:null,topTransitionEnd:null,topVolumeChange:null,topWaiting:null,topWheel:null},r={topLevelTypes:o};t.exports=r},668:function(t,n,e){"use strict";function o(t,n){var e=d.extractSingleTouch(n);return e?e[t.page]:t.page in n?n[t.page]:n[t.client]+c[t.envScroll]}function r(t,n){var e=o(_.x,n),r=o(_.y,n);return Math.pow(Math.pow(e-t.x,2)+Math.pow(r-t.y,2),.5)}function a(t){return{tapMoveThreshold:h,ignoreMouseThreshold:b,eventTypes:E,extractEvents:function(n,e,a,i){if(!p(n)&&!m(n))return null;if(g(n))v=O();else if(t(v,O()))return null;var l=null,d=r(y,a);return m(n)&&d=0},h=10,b=750,y={x:null,y:null},v=null,_={x:{page:"pageX",client:"clientX",envScroll:"currentPageScrollLeft"},y:{page:"pageY",client:"clientY",envScroll:"currentPageScrollTop"}},x=["topTouchStart","topTouchCancel","topTouchEnd","topTouchMove"],w=["topMouseDown","topMouseMove","topMouseUp"].concat(x),E={touchTap:{phasedRegistrationNames:{bubbled:f({onTouchTap:null}),captured:f({onTouchTapCapture:null})},dependencies:w}},O=function(){return Date.now?Date.now:function(){return+new Date}}();t.exports=a},669:function(t,n){var e={extractSingleTouch:function(t){var n=t.touches,e=t.changedTouches,o=n&&n.length>0,r=e&&e.length>0;return!o&&r?e[0]:o?n[0]:t}};t.exports=e},670:function(t,n){t.exports=function(t,n){if(t&&n-t<750)return!0}},671:function(t,n,e){var o=(e(10),e(670)),r=!1;t.exports=function(t){t=t||{};var n=t.shouldRejectClick||o;r=!0,e(65).injection.injectEventPluginsByName({TapEventPlugin:e(668)(n)})}},703:function(t,n,e){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var o=e(279),r=function(t){return t&&t.__esModule?t:{default:t}}(o),a=function(t){return Object.keys(t).reduce(function(n,e){return n[e]=(0,r.default)(t[e],e),n},{})};n.default=a},704:function(t,n,e){"use strict";function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(n,"__esModule",{value:!0}),n.bindStyles=n.bind=void 0;var r=e(279),a=o(r),i=e(703),l=o(i);n.bind=l.default,n.bindStyles=l.default,n.default=a.default},71:function(t,n,e){"use strict";function o(t){if(t&&t.__esModule)return t;var n={};if(null!=t)for(var e in t)Object.prototype.hasOwnProperty.call(t,e)&&(n[e]=t[e]);return n.default=t,n}n.__esModule=!0,n.logOut=n.login=n.deleteTodo=n.toggleTodo=n.editTodo=n.addTodo=n.fetchTodos=n.toggleSideBar=n.toggleAddToDo=void 0;var r=Object.assign||function(t){for(var n=1;n 2 | 3 | 4 | Todos 5 | 6 | 7 | 8 | 9 |
10 |
11 | 12 | -------------------------------------------------------------------------------- /dist/manifest.6a485c0acf42206cac16.js: -------------------------------------------------------------------------------- 1 | !function(e){function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}var n=window.webpackJsonp;window.webpackJsonp=function(t,a,c){for(var u,i,f,l=0,s=[];l 2 | 3 | 4 | Todos 5 | 6 | 7 | 8 | 9 |
10 |
11 | 12 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "byemess", 3 | "version": "1.0.0", 4 | "description": "Todo app build with react & redux", 5 | "main": "index.js", 6 | "author": "Kylewh", 7 | "license": "MIT", 8 | "engines": { 9 | "node": "7.6.0", 10 | "npm": "4.1.2" 11 | }, 12 | "scripts": { 13 | "dev": "webpack-dev-server", 14 | "build": "npm run clean && webpack -p", 15 | "clean": "rimraf dist", 16 | "start": "node server.js" 17 | }, 18 | "dependencies": { 19 | "leanengine": "^2.0.0", 20 | "classnames": "^2.2.5", 21 | "express": "^4.15.2", 22 | "global": "^4.3.2", 23 | "history": "^4.6.1", 24 | "leancloud-storage": "^2.1.4", 25 | "material-ui": "^0.17.4", 26 | "normalizr": "^3.2.2", 27 | "react": "^15.5.4", 28 | "react-dom": "^15.5.4", 29 | "react-redux": "^5.0.4", 30 | "react-router-dom": "^4.1.1", 31 | "react-tap-event-plugin": "^2.0.1", 32 | "react-transition-group": "^1.1.3", 33 | "redux": "^3.6.0", 34 | "redux-form": "^6.6.3", 35 | "redux-logger": "^3.0.1", 36 | "redux-thunk": "^2.2.0", 37 | "styled-components": "^2.0.0-7", 38 | "styled-props": "^0.2.0", 39 | "underscore": "^1.8.3", 40 | "caniuse-api": "^1.5.2" 41 | }, 42 | "devDependencies": { 43 | "babel-cli": "^6.24.1", 44 | "babel-core": "^6.24.1", 45 | "babel-loader": "^7.0.0", 46 | "babel-preset-es2015": "^6.24.1", 47 | "babel-preset-es2016": "^6.24.1", 48 | "babel-preset-es2017": "^6.24.1", 49 | "babel-preset-react": "^6.24.1", 50 | "babel-preset-stage-2": "^6.24.1", 51 | "css-loader": "^0.28.0", 52 | "html-webpack-plugin": "^2.28.0", 53 | "rimraf": "^2.6.1", 54 | "standard": "^10.0.2", 55 | "style-loader": "^0.16.1", 56 | "webpack": "^2.4.1", 57 | "webpack-dev-server": "^2.4.3", 58 | "webpack-validator": "^3.0.0" 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var AV = require('leanengine'); 3 | const path = require('path') 4 | 5 | AV.init({ 6 | appId: process.env.LEANCLOUD_APP_ID || 'fHlQK5K3zQdGFO0h4jPg7Azk-gzGzoHsz', 7 | appKey: process.env.LEANCLOUD_APP_KEY || 'Tpz60WuMnnBGJGh3hr6os321', 8 | masterKey: process.env.LEANCLOUD_APP_MASTER_KEY || 'gf5hWN1qI2XreblTMLNB80TP' 9 | }); 10 | 11 | var app = express(); 12 | app.use(AV.express()); 13 | app.use(express.static(path.resolve(__dirname, './dist'))) 14 | app.get('*', (req, res) => { 15 | res.sendFile(path.resolve(__dirname, './dist/index.html')) 16 | }) 17 | app.listen(process.env.LEANCLOUD_APP_PORT); 18 | console.log('Server started') 19 | -------------------------------------------------------------------------------- /src/actions/index.js: -------------------------------------------------------------------------------- 1 | import * as api from '../api' 2 | import * as schema from './schema' 3 | import { normalize } from 'normalizr' 4 | import { getIsFetching } from '../reducers' 5 | 6 | // All action types will be stored at ../constant/action.js 7 | // in case of typo 8 | 9 | export const toggleAddToDo = () => ({ 10 | type: 'TOGGLE_ADD_TODO' 11 | }) 12 | 13 | export const toggleSideBar = () => ({ 14 | type: 'TOGGLE_SIDEBAR' 15 | }) 16 | 17 | export const fetchTodos = (filter) => (dispatch, getState) => { 18 | if (getIsFetching(getState(), filter)) { 19 | return Promise.resolve() 20 | } 21 | dispatch({ 22 | type: 'FETCH_TODOS_REQUEST', 23 | filter 24 | }) 25 | return api.fetchTodos(filter).then( 26 | response => { 27 | const receivedTodos = response.map(todo => { 28 | return { 29 | ...todo.attributes, 30 | id: todo.id 31 | } 32 | }) 33 | return dispatch({ 34 | type: 'FETCH_TODOS_SUCCESS', 35 | filter, 36 | response: normalize(receivedTodos, schema.arrayOfTodos) 37 | }) 38 | }, 39 | error => { 40 | dispatch({ 41 | type: 'FETCH_TODOS_FAILURE', 42 | filter, 43 | message: error.message || 'SOMETHING WENT WRONG' 44 | }) 45 | } 46 | ) 47 | } 48 | 49 | export const addTodo = (text, due) => (disptach) => { 50 | api.addTodo(text, due).then((response) => { 51 | const receivedTodo = { 52 | ...response.attributes, 53 | id: response.id 54 | } 55 | disptach({ 56 | type: 'ADD_TODO_SUCCESS', 57 | response: normalize(receivedTodo, schema.todo) 58 | }) 59 | }, 60 | error => { 61 | disptach({ 62 | type: 'ADD_TODO_FAILURE', 63 | filter: 'all', 64 | message: error.message || 'Add todo fail, please retry' 65 | }) 66 | }) 67 | } 68 | 69 | export const editTodo = (id, text) => (dispatch) => { 70 | api.editTodo(id, text).then((response) => { 71 | const receivedTodo = { 72 | ...response.attributes, 73 | id: response.id 74 | } 75 | dispatch({ 76 | type: 'EDIT_TODO_SUCCESS', 77 | response: normalize(receivedTodo, schema.todo) 78 | }) 79 | }, 80 | error => { 81 | disptach({ 82 | type: 'EDIT_TODO_FAILURE', 83 | filter: 'all', 84 | message: error.message || 'Edit fail, please retry.' 85 | }) 86 | }) 87 | } 88 | 89 | export const toggleTodo = (id) => (dispatch) => { 90 | api.toggleTodo(id).then((response) => { 91 | const receivedTodo = { 92 | ...response.attributes, 93 | id: response.id 94 | } 95 | dispatch({ 96 | type: 'TOGGLE_TODO_SUCCESS', 97 | response: normalize(receivedTodo, schema.todo) 98 | }) 99 | }, 100 | error => { 101 | dispatch({ 102 | type: 'TOGGLE_TODO_FAILURE', 103 | filter: 'all', 104 | message: error.message 105 | }) 106 | }) 107 | } 108 | 109 | export const deleteTodo = (id) => (dispatch) => { 110 | api.deleteTodo(id) 111 | .then(function (res) { 112 | if (res.results.length) { 113 | dispatch({ 114 | type: 'DELETE_TODO_SUCCESS', 115 | id: id 116 | }) 117 | } 118 | }, 119 | error => { 120 | dispatch({ 121 | type: 'DELETE_TODO_FAILURE', 122 | filter: 'all', 123 | message: error.message 124 | }) 125 | }) 126 | } 127 | 128 | export const login = (username, password) => (dispatch) => { 129 | if ( !username || !password ) { 130 | dispatch({ 131 | type: 'USER_LOGIN_FAILURE', 132 | error: { clientErr: '请确保已经输入账号密码.' } 133 | }) 134 | return 135 | } 136 | 137 | dispatch({ 138 | type: 'USER_LOGIN_REQUEST' 139 | }) 140 | 141 | api.login(username, password) 142 | .then(loginedUser => { 143 | dispatch({ 144 | type: 'USER_LOGIN_SUCCESS', 145 | loginedUser 146 | }) 147 | }) 148 | .catch(res => { 149 | if (res.code === 211) { 150 | console.log('无法找到用户,我们将为您注册,请注意您将会使用输入的用户名登录。') 151 | return api.signUp(username, password) 152 | .then(signedUser => { 153 | dispatch({ 154 | type: 'USER_LOGIN_SUCCESS', 155 | loginedUser: signedUser 156 | }) 157 | }) 158 | } 159 | dispatch({ 160 | type: 'USER_LOGIN_FAILURE', 161 | error: res 162 | }) 163 | }) 164 | } 165 | 166 | export const logOut = () => (dispatch) => { 167 | api.logOut().then(() => { 168 | dispatch({ 169 | type: 'USER_LOGOUT_SUCCESS' 170 | }) 171 | }).catch(res => { 172 | dispatch({ 173 | type: 'USER_LOGOUT_FAILURE', 174 | error: res 175 | }) 176 | }) 177 | } 178 | -------------------------------------------------------------------------------- /src/actions/schema.js: -------------------------------------------------------------------------------- 1 | import { schema } from 'normalizr' 2 | 3 | export const todo = new schema.Entity('todos') 4 | export const arrayOfTodos = new schema.Array(todo) 5 | -------------------------------------------------------------------------------- /src/api/index.js: -------------------------------------------------------------------------------- 1 | import AV from 'leancloud-storage/dist/av' 2 | /** 3 | * Will refractor it to a public interface 4 | */ 5 | export const initLeanCloud = () => { 6 | AV.initialize() 7 | const appId = 'fHlQK5K3zQdGFO0h4jPg7Azk-gzGzoHsz' 8 | const appKey = 'Tpz60WuMnnBGJGh3hr6os321' 9 | AV.init({ appId, appKey }) 10 | } 11 | 12 | export const fetchTodos = (filter) => { 13 | const query = new AV.Query('Todos') 14 | switch (filter) { 15 | case 'all': 16 | return query.ascending('due') 17 | .equalTo('owner', AV.User.current()) 18 | .find() 19 | case 'active': 20 | return query.ascending('due') 21 | .equalTo('completed', false) 22 | .equalTo('owner', AV.User.current()) 23 | .find() 24 | case 'completed': 25 | return query.ascending('due') 26 | .equalTo('completed', true) 27 | .equalTo('owner', AV.User.current()) 28 | .find() 29 | default: 30 | throw new Error(`Unknown Filter: ${filter}`) 31 | } 32 | } 33 | 34 | export const addTodo = (text, due) => { 35 | if (!AV.User.current()) { 36 | throw new Error('You have to login') 37 | } 38 | const Todos = AV.Object.extend('Todos') 39 | const todo = new Todos() 40 | todo.set('text', text) 41 | todo.set('completed', false) 42 | todo.set('due', due) 43 | todo.set('owner', AV.User.current()) 44 | return todo.save() 45 | } 46 | 47 | export const editTodo = (id, text) => { 48 | const query = new AV.Query('Todos') 49 | return query.get(id).then(function (oldTodo) { 50 | const updatedTodo = AV.Object.createWithoutData('Todos', id) 51 | updatedTodo.set({ 52 | completed: oldTodo.attributes.completed, 53 | text, 54 | due: oldTodo.attributes.due 55 | }) 56 | return updatedTodo.save() 57 | }, function (error) { 58 | throw new Error(error) 59 | }) 60 | } 61 | 62 | export const toggleTodo = (id) => { 63 | const query = new AV.Query('Todos') 64 | return query.get(id).then(function (oldTodo) { 65 | const updatedTodo = AV.Object.createWithoutData('Todos', id) 66 | updatedTodo.set({ 67 | completed: !oldTodo.attributes.completed, 68 | text: oldTodo.attributes.text, 69 | due: oldTodo.attributes.due 70 | }) 71 | return updatedTodo.save() 72 | }, function (error) {}) 73 | } 74 | 75 | export const deleteTodo = (id) => { 76 | return AV.Query.doCloudQuery(`delete from Todos where objectId="${id}"`) 77 | .then(function (res) { 78 | return res 79 | }, function (error) { 80 | throw new Error(error) 81 | }) 82 | } 83 | 84 | export const signUp = (username, password) => { 85 | const newUser = new AV.User() 86 | newUser.setUsername(username) 87 | newUser.setPassword(password) 88 | return newUser.signUp() 89 | } 90 | 91 | export const login = (username, password) => { 92 | return AV.User.logIn(username, password) 93 | } 94 | 95 | export const getCurrentUser = () => AV.User.current() 96 | 97 | export const logOut = () => AV.User.logOut() 98 | -------------------------------------------------------------------------------- /src/components/AddTodoButton.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import styled, { css } from 'styled-components' 3 | import FloatingActionButton from 'material-ui/FloatingActionButton' 4 | import ContentAdd from 'material-ui/svg-icons/content/add' 5 | 6 | const active = css` 7 | -webkit-transform: rotate(-45deg); 8 | transform: rotate(-45deg); 9 | background-color: #f44336 !important; 10 | ` 11 | 12 | const FloatBtn = styled(({active, ...rest}) => )` 13 | -webkit-transform: scale(1.1); 14 | transform: scale(1.1); 15 | -webkit-transition: all 0.3s !important; 16 | transition: all 0.3s !important; 17 | position: fixed !important; 18 | bottom: 84px !important; 19 | right: 20px !important; 20 | z-index: 100; 21 | & button { 22 | ${props => props.active === true 23 | ? active : '' 24 | } 25 | } 26 | ` 27 | 28 | const AddTodoButton = ({toggleAddToDo, isAdding}) => ( 29 | toggleAddToDo()} 33 | > 34 | 35 | 36 | ) 37 | 38 | export default AddTodoButton 39 | -------------------------------------------------------------------------------- /src/components/AddTodoPanel.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react' 2 | import Panel from '../styled/Panel' 3 | import Textarea from '../styled/Textarea' 4 | import Schedule from '../styled/Schedule' 5 | import DatePicker from '../styled/DatePicker' 6 | import SubmitBtn from '../styled/SubmitBtn' 7 | 8 | class AddTodoPanel extends Component { 9 | 10 | componentDidMount () { 11 | this.datePicker.value = this.injectDate() 12 | } 13 | 14 | handleSubmit = () => { 15 | const due = new Date(this.datePicker.value) 16 | this.props.addTodo(this.textarea.value.trim(), due) 17 | } 18 | 19 | handleKeyPressSubmit = ({keyCode}) => { 20 | const due = new Date(this.datePicker.value) 21 | if (keyCode === 13 && this.textarea.value.trim()) { 22 | this.props.addTodo(this.textarea.value.trim(), due) 23 | } 24 | } 25 | 26 | injectDate () { 27 | return new Date().toJSON().slice(0, 10) 28 | } 29 | 30 | quickPick = () => { 31 | let msec = +new Date(this.datePicker.value) - 0 32 | const diff = this.select.value * 24 * 3600 * 1000 33 | msec += diff 34 | this.datePicker.value = new Date(msec).toJSON().slice(0, 10) 35 | } 36 | 37 | render () { 38 | return ( 39 | 40 |