├── .gitignore ├── 00_Boilerplate ├── .babelrc ├── package.json ├── readme.md ├── readme_es.md ├── src │ ├── index.html │ └── main.ts ├── tsconfig.json └── webpack.config.js ├── 01_HelloReact ├── .babelrc ├── package.json ├── readme.md ├── readme_es.md ├── src │ ├── hello.tsx │ ├── index.html │ ├── main.ts │ └── main.tsx ├── tsconfig.json └── webpack.config.js ├── 02_Properties ├── .babelrc ├── package.json ├── readme.md ├── readme_es.md ├── src │ ├── hello.tsx │ ├── index.html │ ├── main.ts │ └── main.tsx ├── tsconfig.json └── webpack.config.js ├── 03_State ├── .babelrc ├── package.json ├── readme.md ├── readme_es.md ├── src │ ├── app.tsx │ ├── hello.tsx │ ├── index.html │ ├── main.tsx │ └── nameEdit.tsx ├── tsconfig.json └── webpack.config.js ├── 04_Callback ├── .babelrc ├── package.json ├── readme.md ├── readme_es.md ├── src │ ├── app.tsx │ ├── hello.tsx │ ├── index.html │ ├── main.tsx │ └── nameEdit.tsx ├── tsconfig.json └── webpack.config.js ├── 05_Refactor ├── .babelrc ├── package.json ├── readme.md ├── readme_es.md ├── src │ ├── app.tsx │ ├── hello.tsx │ ├── index.html │ ├── main.tsx │ └── nameEdit.tsx ├── tsconfig.json └── webpack.config.js ├── 06_MoveBackToStateless ├── .babelrc ├── package.json ├── readme.md ├── readme_es.md ├── src │ ├── app.tsx │ ├── hello.tsx │ ├── index.html │ ├── main.tsx │ └── nameEdit.tsx ├── tsconfig.json └── webpack.config.js ├── 07_Enable ├── .babelrc ├── package.json ├── readme.md ├── readme_es.md ├── src │ ├── app.tsx │ ├── hello.tsx │ ├── index.html │ ├── main.tsx │ └── nameEdit.tsx ├── tsconfig.json └── webpack.config.js ├── 08_Colorpicker ├── .babelrc ├── package.json ├── readme.md ├── readme_es.md ├── src │ ├── app.tsx │ ├── color.ts │ ├── colordisplayer.tsx │ ├── colorpicker.tsx │ ├── index.html │ ├── main.tsx │ └── nameEdit.tsx ├── tsconfig.json └── webpack.config.js ├── 09_ColorpRefactor ├── .babelrc ├── package.json ├── readme.md ├── readme_es.md ├── src │ ├── app.tsx │ ├── color.ts │ ├── colordisplayer.tsx │ ├── colorpicker.tsx │ ├── colorslider.tsx │ ├── index.html │ ├── main.tsx │ └── nameEdit.tsx ├── tsconfig.json └── webpack.config.js ├── 10_Sidebar ├── .babelrc ├── package.json ├── readme.md ├── readme_es.md ├── src │ ├── app.tsx │ ├── hello.tsx │ ├── index.html │ ├── main.tsx │ ├── nameEdit.tsx │ ├── sidebar.css │ └── sidebar.tsx ├── tsconfig.json └── webpack.config.js ├── 11_TableMock ├── .babelrc ├── package.json ├── readme.md ├── readme_es.md ├── src │ ├── api │ │ └── memberAPI.ts │ ├── app.tsx │ ├── hello.tsx │ ├── index.html │ ├── main.tsx │ ├── memberRow.tsx │ ├── membersTable.tsx │ ├── model │ │ ├── member.ts │ │ └── memberMockData.ts │ └── nameEdit.tsx ├── tsconfig.json └── webpack.config.js ├── 12_TableHttp ├── .babelrc ├── package.json ├── readme.md ├── readme_es.md ├── src │ ├── api │ │ └── memberAPI.ts │ ├── app.tsx │ ├── hello.tsx │ ├── index.html │ ├── main.tsx │ ├── memberHead.tsx │ ├── memberRow.tsx │ ├── membersTable.tsx │ ├── model │ │ ├── member.ts │ │ └── memberMockData.ts │ └── nameEdit.tsx ├── tsconfig.json └── webpack.config.js ├── 12_TableHttp_Axios ├── .babelrc ├── package.json ├── readme.md ├── readme_es.md ├── src │ ├── api │ │ └── memberAPI.ts │ ├── app.tsx │ ├── hello.tsx │ ├── index.html │ ├── main.tsx │ ├── memberHead.tsx │ ├── memberRow.tsx │ ├── membersTable.tsx │ ├── model │ │ ├── member.ts │ │ └── memberMockData.ts │ └── nameEdit.tsx ├── tsconfig.json └── webpack.config.js ├── 13_ShouldUpdate ├── .babelrc ├── package.json ├── readme.md ├── readme_es.md ├── src │ ├── app.tsx │ ├── content │ │ ├── five.png │ │ ├── four.png │ │ ├── one.png │ │ ├── site.css │ │ ├── three.png │ │ └── two.png │ ├── face.tsx │ ├── hello.tsx │ ├── index.html │ ├── main.tsx │ └── nameEdit.tsx ├── tsconfig.json └── webpack.config.js ├── 14_ReactRouter ├── .babelrc ├── package.json ├── readme.md ├── readme_es.md ├── src │ ├── app.tsx │ ├── hello.tsx │ ├── index.html │ ├── main.tsx │ ├── nameEdit.tsx │ ├── pageA.tsx │ └── pageB.tsx ├── tsconfig.json └── webpack.config.js ├── 15_LoginForm ├── .babelrc ├── package.json ├── readme.md ├── readme_es.md ├── src │ ├── api │ │ └── login.ts │ ├── common │ │ ├── index.tsx │ │ └── notification.tsx │ ├── hello.tsx │ ├── index.html │ ├── main.tsx │ ├── model │ │ └── login.ts │ ├── nameEdit.tsx │ └── pages │ │ ├── b │ │ ├── index.ts │ │ └── pageB.tsx │ │ └── login │ │ ├── index.ts │ │ ├── loginForm.tsx │ │ └── loginPage.tsx ├── tsconfig.json └── webpack.config.js ├── 16_Validation ├── .babelrc ├── package.json ├── readme.md ├── src │ ├── api │ │ └── login.ts │ ├── common │ │ ├── forms │ │ │ └── textFieldForm.tsx │ │ ├── index.tsx │ │ └── notification.tsx │ ├── hello.tsx │ ├── index.html │ ├── main.tsx │ ├── model │ │ └── login.ts │ ├── nameEdit.tsx │ └── pages │ │ ├── b │ │ ├── index.ts │ │ └── pageB.tsx │ │ └── login │ │ ├── index.ts │ │ ├── loginForm.tsx │ │ ├── loginPage.tsx │ │ ├── loginValidations.ts │ │ └── viewmodel.ts ├── tsconfig.json └── webpack.config.js ├── 17_Context ├── .babelrc ├── Readme.md ├── package.json ├── readme_es.md ├── src │ ├── api │ │ └── login.ts │ ├── common │ │ ├── forms │ │ │ └── textFieldForm.tsx │ │ ├── index.tsx │ │ ├── notification.tsx │ │ └── sessionContext.tsx │ ├── hello.tsx │ ├── index.html │ ├── main.tsx │ ├── model │ │ └── login.ts │ ├── nameEdit.tsx │ └── pages │ │ ├── b │ │ ├── index.ts │ │ └── pageB.tsx │ │ └── login │ │ ├── index.ts │ │ ├── loginForm.tsx │ │ ├── loginPage.tsx │ │ ├── loginValidations.ts │ │ └── viewmodel.ts ├── tsconfig.json └── webpack.config.js ├── 18_Hoc ├── .babelrc ├── Readme.md ├── package.json ├── readme_es.md ├── src │ ├── api │ │ └── login.ts │ ├── common │ │ ├── forms │ │ │ └── textFieldForm.tsx │ │ ├── index.tsx │ │ ├── notification.tsx │ │ └── sessionContext.tsx │ ├── hello.tsx │ ├── index.html │ ├── main.tsx │ ├── model │ │ └── login.ts │ ├── nameEdit.tsx │ └── pages │ │ ├── b │ │ ├── index.ts │ │ └── pageB.tsx │ │ └── login │ │ ├── index.ts │ │ ├── loginForm.tsx │ │ ├── loginPage.tsx │ │ ├── loginValidations.ts │ │ └── viewmodel.ts ├── tsconfig.json └── webpack.config.js ├── 19_RenderProps ├── .babelrc ├── Readme.md ├── package.json ├── readme_es.md ├── src │ ├── api │ │ └── login.ts │ ├── common │ │ ├── forms │ │ │ └── textFieldForm.tsx │ │ ├── index.tsx │ │ ├── notification.tsx │ │ └── sessionContext.tsx │ ├── hello.tsx │ ├── index.html │ ├── main.tsx │ ├── model │ │ └── login.ts │ ├── nameEdit.tsx │ └── pages │ │ ├── b │ │ ├── index.ts │ │ └── pageB.tsx │ │ └── login │ │ ├── index.ts │ │ ├── loginForm.tsx │ │ ├── loginPage.tsx │ │ ├── loginValidations.ts │ │ └── viewmodel.ts ├── tsconfig.json └── webpack.config.js ├── 20_ErrorBoundaries ├── .babelrc ├── package.json ├── readme.md ├── readme_es.md ├── src │ ├── app.tsx │ ├── errorBoundary.tsx │ ├── faultyComponent.tsx │ ├── hello.tsx │ ├── index.html │ ├── main.tsx │ └── nameEdit.tsx ├── tsconfig.json └── webpack.config.js ├── 21_Hooks ├── .babelrc ├── package.json ├── readme.md ├── readme_es.md ├── src │ ├── api │ │ └── memberAPI.ts │ ├── app.tsx │ ├── hello.tsx │ ├── index.html │ ├── main.tsx │ ├── memberHead.tsx │ ├── memberRow.tsx │ ├── membersTable.tsx │ ├── model │ │ ├── member.ts │ │ └── memberMockData.ts │ └── nameEdit.tsx ├── tsconfig.json └── webpack.config.js ├── 22_Hooks_UseContext ├── .babelrc ├── Readme.md ├── package.json ├── readme_es.md ├── src │ ├── api │ │ └── login.ts │ ├── common │ │ ├── forms │ │ │ └── textFieldForm.tsx │ │ ├── index.tsx │ │ ├── notification.tsx │ │ └── sessionContext.tsx │ ├── hello.tsx │ ├── index.html │ ├── main.tsx │ ├── model │ │ └── login.ts │ ├── nameEdit.tsx │ └── pages │ │ ├── b │ │ ├── index.ts │ │ └── pageB.tsx │ │ └── login │ │ ├── index.ts │ │ ├── loginForm.tsx │ │ ├── loginPage.tsx │ │ ├── loginValidations.ts │ │ └── viewmodel.ts ├── tsconfig.json └── webpack.config.js ├── 99_readme_resources ├── 01 HelloReact │ └── browser_output.png └── 04 Callback │ └── browser_output.png ├── LICENSE └── readme.md /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store 3 | dist/ 4 | typings/ 5 | *.orig 6 | .idea/ 7 | */src/**/*.js 8 | */src/**/*.js.map 9 | **/.vscode/ 10 | 10 Sidebar/npm-debug.log 11 | package-lock.json 12 | 00 Boilerplate/package-lock.json 13 | -------------------------------------------------------------------------------- /00_Boilerplate/.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | [ 4 | "@babel/preset-env", 5 | { 6 | "useBuiltIns": "entry" 7 | } 8 | ] 9 | ] 10 | } 11 | -------------------------------------------------------------------------------- /00_Boilerplate/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "reactbysample", 3 | "version": "1.0.0", 4 | "description": "In this sample we setup the basic plumbing to \"build\" our project and launch it in a dev server.", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "webpack-dev-server --mode development --inline --hot --open", 8 | "build": "webpack --mode development", 9 | "test": "echo \"Error: no test specified\" && exit 1" 10 | }, 11 | "author": "", 12 | "license": "ISC", 13 | "devDependencies": { 14 | "@babel/cli": "^7.1.2", 15 | "@babel/core": "^7.1.2", 16 | "@babel/polyfill": "^7.0.0", 17 | "@babel/preset-env": "^7.1.0", 18 | "awesome-typescript-loader": "^5.2.1", 19 | "babel-loader": "^8.0.4", 20 | "css-loader": "^1.0.0", 21 | "file-loader": "^2.0.0", 22 | "html-webpack-plugin": "^3.2.0", 23 | "mini-css-extract-plugin": "^0.4.3", 24 | "style-loader": "^0.23.1", 25 | "typescript": "^3.1.1", 26 | "url-loader": "^1.1.1", 27 | "webpack": "^4.20.2", 28 | "webpack-cli": "^3.1.2", 29 | "webpack-dev-server": "^3.1.9" 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /00_Boilerplate/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 |39 | Avatar 40 | | 41 |42 | Id 43 | | 44 |45 | Name 46 | | 47 |
---|