From 474c381fd943fef3a16022116e2db1f01c5c4b96 Mon Sep 17 00:00:00 2001 From: Andrew Smith Date: Fri, 23 Aug 2019 18:20:26 +0100 Subject: [PATCH 01/24] chore #11: Create mock data for cards --- package-lock.json | 6 +++ package.json | 1 + src/tools/generateCards.js | 32 +++++++++++++++ src/tools/mockData.js | 84 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 123 insertions(+) create mode 100644 src/tools/generateCards.js diff --git a/package-lock.json b/package-lock.json index 321ce83..e71e368 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11089,6 +11089,12 @@ "performance-now": "^2.1.0" } }, + "random-words": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/random-words/-/random-words-1.1.0.tgz", + "integrity": "sha512-GyV8PlSmQE08S/RSCjG9Uh0uQaUC7iRpA18PWk9OSnvNCzKQ+B2NxqqN/cYBej4t7dfBWxh10KFBYSiNcg1jlg==", + "dev": true + }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", diff --git a/package.json b/package.json index 7f8cbbb..aa299e8 100644 --- a/package.json +++ b/package.json @@ -94,6 +94,7 @@ "node-fetch": "^2.3.0", "npm-run-all": "^4.1.5", "postcss-loader": "^3.0.0", + "random-words": "^1.1.0", "redux-immutable-state-invariant": "^2.1.0", "redux-mock-store": "^1.5.3", "style-loader": "^0.23.1" diff --git a/src/tools/generateCards.js b/src/tools/generateCards.js new file mode 100644 index 0000000..0026906 --- /dev/null +++ b/src/tools/generateCards.js @@ -0,0 +1,32 @@ +const randomWords = require("random-words"); + +const words = randomWords({ exactly: 10, wordsPerString: 2 }); + +var mongoObjectId = function() { + var timestamp = ((new Date().getTime() / 1000) | 0).toString(16); + return ( + timestamp + + "xxxxxxxxxxxxxxxx" + .replace(/[x]/g, function() { + return ((Math.random() * 16) | 0).toString(16); + }) + .toLowerCase() + ); +}; + +const generateCards = function() { + const cards = []; + for (let i = 0; i < 10; i++) { + let card = { + _id: mongoObjectId(), + title: words[i], + boardId: "", + status: "", + ownerId: "" + }; + cards.push(card); + } + console.log(cards); +}; + +module.exports = generateCards(); diff --git a/src/tools/mockData.js b/src/tools/mockData.js index 26106e3..ae8e9b5 100755 --- a/src/tools/mockData.js +++ b/src/tools/mockData.js @@ -1,3 +1,85 @@ +// Cards. +const cards = [ + { + _id: "5d6020254ea3a4ab3ffc476b", + title: "material leather", + boardId: "", + status: "", + ownerId: "" + }, + { + _id: "5d602025c1b269d1aeba775d", + title: "labor hearing", + boardId: "", + status: "", + ownerId: "" + }, + { + _id: "5d6020255c4c086beb74fe3b", + title: "struck affect", + boardId: "", + status: "", + ownerId: "" + }, + { + _id: "5d602025f80d7c1056749a9a", + title: "continent difficulty", + boardId: "", + status: "", + ownerId: "" + }, + { + _id: "5d602025d4c222584dabbd78", + title: "screen forty", + boardId: "", + status: "", + ownerId: "" + }, + { + _id: "5d602025a00dd4be2452e132", + title: "report forth", + boardId: "", + status: "", + ownerId: "" + }, + { + _id: "5d602025e29e75c53bccc713", + title: "on faster", + boardId: "", + status: "", + ownerId: "" + }, + { + _id: "5d6020252f61ab55e13cb823", + title: "sat upon", + boardId: "", + status: "", + ownerId: "" + }, + { + _id: "5d6020253f49acf252b4b2a6", + title: "major something", + boardId: "", + status: "", + ownerId: "" + }, + { + _id: "5d602025fd3db74ec9005051", + title: "faster specific", + boardId: "", + status: "", + ownerId: "" + } +]; + +const newCard = { + title: "", + boardId: "", + status: "", + ownerId: "" +}; + +// Users. const users = [ { _id: "5d42e5d5e1e3d731df26010a", @@ -100,6 +182,8 @@ const newUser = { }; module.exports = { + cards, + newCard, newUser, users }; From 99e5cbf38e2ba8bbd20f00672a1417268b641750 Mon Sep 17 00:00:00 2001 From: Andrew Smith Date: Fri, 23 Aug 2019 18:25:37 +0100 Subject: [PATCH 02/24] feature #11: create mock db with cards and users --- src/tools/createMockDb.js | 4 +- src/tools/db.json | 167 +++++++++++++++++++++++++++++++++++++- 2 files changed, 168 insertions(+), 3 deletions(-) diff --git a/src/tools/createMockDb.js b/src/tools/createMockDb.js index 433f4b4..1d9886d 100755 --- a/src/tools/createMockDb.js +++ b/src/tools/createMockDb.js @@ -3,8 +3,8 @@ const fs = require("fs"); const path = require("path"); const mockData = require("./mockData"); -const { users } = mockData; -const data = JSON.stringify({ users }); +const { cards, users } = mockData; +const data = JSON.stringify({ cards, users }); const filepath = path.join(__dirname, "db.json"); fs.writeFile(filepath, data, function(err) { diff --git a/src/tools/db.json b/src/tools/db.json index d0b93db..39c0eff 100644 --- a/src/tools/db.json +++ b/src/tools/db.json @@ -1 +1,166 @@ -{"users":[{"_id":"5d42e5d5e1e3d731df26010a","firstName":"Andrew","lastName":"Smith","address":"32 Walpole Road","city":"London","postcode":"N17","__v":0},{"_id":"5d43fed51d0825849c0f0b67","firstName":"Rosa","lastName":"Smith","address":"32 Walpole Road","city":"London","postcode":"N17","__v":0},{"_id":"5d42104a7979bd071c129604","firstName":"Dora","lastName":"Fitzgerald","address":"1300 Eknaw Path","city":"Evegirhe","postcode":"P8K 4T1","__v":0},{"_id":"5d42104a7979bd071c129605","firstName":"Bryan","lastName":"Fitzgerald","address":"1050 Dedu Point","city":"Irhekde","postcode":"G1K 2N9","__v":0},{"_id":"5d42104a7979bd071c129606","firstName":"Dale","lastName":"Fitzgerald","address":"560 Fibab Glen","city":"Hudmakap","postcode":"T9U 0N6","__v":0},{"_id":"5d42104a7979bd071c129607","firstName":"Alma","lastName":"Fitzgerald","address":"1630 Zuas Place","city":"Caturaagu","postcode":"G9E 7N0","__v":0},{"_id":"5d42104a7979bd071c129608","firstName":"Billy","lastName":"Fitzgerald","address":"1689 Hopge Square","city":"Vinpati","postcode":"C2O 6D1","__v":0},{"_id":"5d42104a7979bd071c129609","firstName":"Adeline","lastName":"Fitzgerald","address":"1912 Dusved Ridge","city":"Atehasma","postcode":"N2D 7C3","__v":0},{"_id":"5d42104a7979bd071c12960a","firstName":"Charlotte","lastName":"Fitzgerald","address":"611 Gumaf Way","city":"Kalover","postcode":"E4Y 2E7","__v":0},{"_id":"5d42104a7979bd071c12960b","firstName":"Rodney","lastName":"Fitzgerald","address":"1961 Goku Heights","city":"Kivzupzi","postcode":"J5C 8H1","__v":0}]} \ No newline at end of file +{ + "cards": [ + { + "_id": "5d6020254ea3a4ab3ffc476b", + "title": "material leather", + "boardId": "", + "status": "", + "ownerId": "" + }, + { + "_id": "5d602025c1b269d1aeba775d", + "title": "labor hearing", + "boardId": "", + "status": "", + "ownerId": "" + }, + { + "_id": "5d6020255c4c086beb74fe3b", + "title": "struck affect", + "boardId": "", + "status": "", + "ownerId": "" + }, + { + "_id": "5d602025f80d7c1056749a9a", + "title": "continent difficulty", + "boardId": "", + "status": "", + "ownerId": "" + }, + { + "_id": "5d602025d4c222584dabbd78", + "title": "screen forty", + "boardId": "", + "status": "", + "ownerId": "" + }, + { + "_id": "5d602025a00dd4be2452e132", + "title": "report forth", + "boardId": "", + "status": "", + "ownerId": "" + }, + { + "_id": "5d602025e29e75c53bccc713", + "title": "on faster", + "boardId": "", + "status": "", + "ownerId": "" + }, + { + "_id": "5d6020252f61ab55e13cb823", + "title": "sat upon", + "boardId": "", + "status": "", + "ownerId": "" + }, + { + "_id": "5d6020253f49acf252b4b2a6", + "title": "major something", + "boardId": "", + "status": "", + "ownerId": "" + }, + { + "_id": "5d602025fd3db74ec9005051", + "title": "faster specific", + "boardId": "", + "status": "", + "ownerId": "" + } + ], + "users": [ + { + "_id": "5d42e5d5e1e3d731df26010a", + "firstName": "Andrew", + "lastName": "Smith", + "address": "32 Walpole Road", + "city": "London", + "postcode": "N17", + "__v": 0 + }, + { + "_id": "5d43fed51d0825849c0f0b67", + "firstName": "Rosa", + "lastName": "Smith", + "address": "32 Walpole Road", + "city": "London", + "postcode": "N17", + "__v": 0 + }, + { + "_id": "5d42104a7979bd071c129604", + "firstName": "Dora", + "lastName": "Fitzgerald", + "address": "1300 Eknaw Path", + "city": "Evegirhe", + "postcode": "P8K 4T1", + "__v": 0 + }, + { + "_id": "5d42104a7979bd071c129605", + "firstName": "Bryan", + "lastName": "Fitzgerald", + "address": "1050 Dedu Point", + "city": "Irhekde", + "postcode": "G1K 2N9", + "__v": 0 + }, + { + "_id": "5d42104a7979bd071c129606", + "firstName": "Dale", + "lastName": "Fitzgerald", + "address": "560 Fibab Glen", + "city": "Hudmakap", + "postcode": "T9U 0N6", + "__v": 0 + }, + { + "_id": "5d42104a7979bd071c129607", + "firstName": "Alma", + "lastName": "Fitzgerald", + "address": "1630 Zuas Place", + "city": "Caturaagu", + "postcode": "G9E 7N0", + "__v": 0 + }, + { + "_id": "5d42104a7979bd071c129608", + "firstName": "Billy", + "lastName": "Fitzgerald", + "address": "1689 Hopge Square", + "city": "Vinpati", + "postcode": "C2O 6D1", + "__v": 0 + }, + { + "_id": "5d42104a7979bd071c129609", + "firstName": "Adeline", + "lastName": "Fitzgerald", + "address": "1912 Dusved Ridge", + "city": "Atehasma", + "postcode": "N2D 7C3", + "__v": 0 + }, + { + "_id": "5d42104a7979bd071c12960a", + "firstName": "Charlotte", + "lastName": "Fitzgerald", + "address": "611 Gumaf Way", + "city": "Kalover", + "postcode": "E4Y 2E7", + "__v": 0 + }, + { + "_id": "5d42104a7979bd071c12960b", + "firstName": "Rodney", + "lastName": "Fitzgerald", + "address": "1961 Goku Heights", + "city": "Kivzupzi", + "postcode": "J5C 8H1", + "__v": 0 + } + ] +} From 84f7bca827722f5e4e759b3a874d5f94583689a9 Mon Sep 17 00:00:00 2001 From: Andrew Smith Date: Fri, 23 Aug 2019 18:40:32 +0100 Subject: [PATCH 03/24] feature #11: Create card API and card actions --- src/api/cardApi.js | 30 ++++++ src/redux/actions/cardActions.js | 62 ++++++++++++ src/tools/db.json | 167 +------------------------------ 3 files changed, 93 insertions(+), 166 deletions(-) create mode 100755 src/api/cardApi.js create mode 100644 src/redux/actions/cardActions.js diff --git a/src/api/cardApi.js b/src/api/cardApi.js new file mode 100755 index 0000000..b681ef5 --- /dev/null +++ b/src/api/cardApi.js @@ -0,0 +1,30 @@ +import { handleResponse, handleError } from "./apiUtils"; +const baseUrl = process.env.REACT_APP_API_URL + "/api/cards/"; + +export function getCards() { + return fetch(baseUrl) + .then(handleResponse) + .catch(handleError); +} + +export function getOneCard(CardId) { + return fetch(baseUrl + CardId) + .then(handleResponse) + .catch(handleError); +} + +export function saveCard(Card) { + return fetch(baseUrl + (Card._id || ""), { + method: Card._id ? "PUT" : "POST", + headers: { "content-type": "application/json" }, + body: JSON.stringify(Card) + }) + .then(handleResponse) + .catch(handleError); +} + +export function deleteCard(CardId) { + return fetch(baseUrl + CardId, { method: "DELETE" }) + .then(handleResponse) + .catch(handleError); +} diff --git a/src/redux/actions/cardActions.js b/src/redux/actions/cardActions.js new file mode 100644 index 0000000..b69c568 --- /dev/null +++ b/src/redux/actions/cardActions.js @@ -0,0 +1,62 @@ +import * as actionTypes from "./actionTypes"; +import * as cardApi from "../../api/cardApi"; +import { beginApiCall } from "./apiStatusActions"; + +export function apiCallError(error) { + return { type: actionTypes.API_CALL_ERROR, error: error }; +} + +export function createCardSuccess(card) { + return { type: actionTypes.CREATE_USER_SUCCESS, card: card }; +} + +export function deleteCardOptimistic(card) { + return { type: actionTypes.DELETE_USER_OPTIMISTIC, card: card }; +} + +export function loadCardsSuccess(cards) { + return { type: actionTypes.LOAD_USERS_SUCCESS, cards: cards }; +} + +export function updateCardSuccess(card) { + return { type: actionTypes.UPDATE_USER_SUCCESS, card: card }; +} + +export function deleteCard(card) { + return function(dispatch) { + dispatch(deleteCardOptimistic(card)); + return cardApi.deleteCard(card._id); + }; +} + +export function loadCards() { + return function(dispatch) { + dispatch(beginApiCall()); + return cardApi + .getCards() + .then(cards => { + dispatch(loadCardsSuccess(cards)); + }) + .catch(err => { + dispatch(apiCallError(err)); + throw err; + }); + }; +} + +export function saveCard(card) { + return function(dispatch) { + dispatch(beginApiCall()); + return cardApi + .saveCard(card) + .then(savedCard => { + card._id + ? dispatch(updateCardSuccess(savedCard)) + : dispatch(createCardSuccess(savedCard)); + }) + .catch(err => { + dispatch(apiCallError(err)); + throw err; + }); + }; +} diff --git a/src/tools/db.json b/src/tools/db.json index 39c0eff..e5e6bf8 100644 --- a/src/tools/db.json +++ b/src/tools/db.json @@ -1,166 +1 @@ -{ - "cards": [ - { - "_id": "5d6020254ea3a4ab3ffc476b", - "title": "material leather", - "boardId": "", - "status": "", - "ownerId": "" - }, - { - "_id": "5d602025c1b269d1aeba775d", - "title": "labor hearing", - "boardId": "", - "status": "", - "ownerId": "" - }, - { - "_id": "5d6020255c4c086beb74fe3b", - "title": "struck affect", - "boardId": "", - "status": "", - "ownerId": "" - }, - { - "_id": "5d602025f80d7c1056749a9a", - "title": "continent difficulty", - "boardId": "", - "status": "", - "ownerId": "" - }, - { - "_id": "5d602025d4c222584dabbd78", - "title": "screen forty", - "boardId": "", - "status": "", - "ownerId": "" - }, - { - "_id": "5d602025a00dd4be2452e132", - "title": "report forth", - "boardId": "", - "status": "", - "ownerId": "" - }, - { - "_id": "5d602025e29e75c53bccc713", - "title": "on faster", - "boardId": "", - "status": "", - "ownerId": "" - }, - { - "_id": "5d6020252f61ab55e13cb823", - "title": "sat upon", - "boardId": "", - "status": "", - "ownerId": "" - }, - { - "_id": "5d6020253f49acf252b4b2a6", - "title": "major something", - "boardId": "", - "status": "", - "ownerId": "" - }, - { - "_id": "5d602025fd3db74ec9005051", - "title": "faster specific", - "boardId": "", - "status": "", - "ownerId": "" - } - ], - "users": [ - { - "_id": "5d42e5d5e1e3d731df26010a", - "firstName": "Andrew", - "lastName": "Smith", - "address": "32 Walpole Road", - "city": "London", - "postcode": "N17", - "__v": 0 - }, - { - "_id": "5d43fed51d0825849c0f0b67", - "firstName": "Rosa", - "lastName": "Smith", - "address": "32 Walpole Road", - "city": "London", - "postcode": "N17", - "__v": 0 - }, - { - "_id": "5d42104a7979bd071c129604", - "firstName": "Dora", - "lastName": "Fitzgerald", - "address": "1300 Eknaw Path", - "city": "Evegirhe", - "postcode": "P8K 4T1", - "__v": 0 - }, - { - "_id": "5d42104a7979bd071c129605", - "firstName": "Bryan", - "lastName": "Fitzgerald", - "address": "1050 Dedu Point", - "city": "Irhekde", - "postcode": "G1K 2N9", - "__v": 0 - }, - { - "_id": "5d42104a7979bd071c129606", - "firstName": "Dale", - "lastName": "Fitzgerald", - "address": "560 Fibab Glen", - "city": "Hudmakap", - "postcode": "T9U 0N6", - "__v": 0 - }, - { - "_id": "5d42104a7979bd071c129607", - "firstName": "Alma", - "lastName": "Fitzgerald", - "address": "1630 Zuas Place", - "city": "Caturaagu", - "postcode": "G9E 7N0", - "__v": 0 - }, - { - "_id": "5d42104a7979bd071c129608", - "firstName": "Billy", - "lastName": "Fitzgerald", - "address": "1689 Hopge Square", - "city": "Vinpati", - "postcode": "C2O 6D1", - "__v": 0 - }, - { - "_id": "5d42104a7979bd071c129609", - "firstName": "Adeline", - "lastName": "Fitzgerald", - "address": "1912 Dusved Ridge", - "city": "Atehasma", - "postcode": "N2D 7C3", - "__v": 0 - }, - { - "_id": "5d42104a7979bd071c12960a", - "firstName": "Charlotte", - "lastName": "Fitzgerald", - "address": "611 Gumaf Way", - "city": "Kalover", - "postcode": "E4Y 2E7", - "__v": 0 - }, - { - "_id": "5d42104a7979bd071c12960b", - "firstName": "Rodney", - "lastName": "Fitzgerald", - "address": "1961 Goku Heights", - "city": "Kivzupzi", - "postcode": "J5C 8H1", - "__v": 0 - } - ] -} +{"cards":[{"_id":"5d6020254ea3a4ab3ffc476b","title":"material leather","boardId":"","status":"","ownerId":""},{"_id":"5d602025c1b269d1aeba775d","title":"labor hearing","boardId":"","status":"","ownerId":""},{"_id":"5d6020255c4c086beb74fe3b","title":"struck affect","boardId":"","status":"","ownerId":""},{"_id":"5d602025f80d7c1056749a9a","title":"continent difficulty","boardId":"","status":"","ownerId":""},{"_id":"5d602025d4c222584dabbd78","title":"screen forty","boardId":"","status":"","ownerId":""},{"_id":"5d602025a00dd4be2452e132","title":"report forth","boardId":"","status":"","ownerId":""},{"_id":"5d602025e29e75c53bccc713","title":"on faster","boardId":"","status":"","ownerId":""},{"_id":"5d6020252f61ab55e13cb823","title":"sat upon","boardId":"","status":"","ownerId":""},{"_id":"5d6020253f49acf252b4b2a6","title":"major something","boardId":"","status":"","ownerId":""},{"_id":"5d602025fd3db74ec9005051","title":"faster specific","boardId":"","status":"","ownerId":""}],"users":[{"_id":"5d42e5d5e1e3d731df26010a","firstName":"Andrew","lastName":"Smith","address":"32 Walpole Road","city":"London","postcode":"N17","__v":0},{"_id":"5d43fed51d0825849c0f0b67","firstName":"Rosa","lastName":"Smith","address":"32 Walpole Road","city":"London","postcode":"N17","__v":0},{"_id":"5d42104a7979bd071c129604","firstName":"Dora","lastName":"Fitzgerald","address":"1300 Eknaw Path","city":"Evegirhe","postcode":"P8K 4T1","__v":0},{"_id":"5d42104a7979bd071c129605","firstName":"Bryan","lastName":"Fitzgerald","address":"1050 Dedu Point","city":"Irhekde","postcode":"G1K 2N9","__v":0},{"_id":"5d42104a7979bd071c129606","firstName":"Dale","lastName":"Fitzgerald","address":"560 Fibab Glen","city":"Hudmakap","postcode":"T9U 0N6","__v":0},{"_id":"5d42104a7979bd071c129607","firstName":"Alma","lastName":"Fitzgerald","address":"1630 Zuas Place","city":"Caturaagu","postcode":"G9E 7N0","__v":0},{"_id":"5d42104a7979bd071c129608","firstName":"Billy","lastName":"Fitzgerald","address":"1689 Hopge Square","city":"Vinpati","postcode":"C2O 6D1","__v":0},{"_id":"5d42104a7979bd071c129609","firstName":"Adeline","lastName":"Fitzgerald","address":"1912 Dusved Ridge","city":"Atehasma","postcode":"N2D 7C3","__v":0},{"_id":"5d42104a7979bd071c12960a","firstName":"Charlotte","lastName":"Fitzgerald","address":"611 Gumaf Way","city":"Kalover","postcode":"E4Y 2E7","__v":0},{"_id":"5d42104a7979bd071c12960b","firstName":"Rodney","lastName":"Fitzgerald","address":"1961 Goku Heights","city":"Kivzupzi","postcode":"J5C 8H1","__v":0}]} \ No newline at end of file From cdd2d586b1b968d71bf100ab33ee52203dc3268d Mon Sep 17 00:00:00 2001 From: Andrew Smith Date: Fri, 23 Aug 2019 18:44:16 +0100 Subject: [PATCH 04/24] feature #11: Create user action types --- src/redux/actions/actionTypes.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/redux/actions/actionTypes.js b/src/redux/actions/actionTypes.js index ef4320f..9da7f17 100644 --- a/src/redux/actions/actionTypes.js +++ b/src/redux/actions/actionTypes.js @@ -1,3 +1,9 @@ +// Card actions. +export const CREATE_CARD_SUCCESS = "CREATE_CARD_SUCCESS"; +export const DELETE_CARD_OPTIMISTIC = "DELETE_CARD_OPTIMISTIC"; +export const LOAD_CARDS_SUCCESS = "LOAD_CARDS_SUCCESS"; +export const UPDATE_CARD_SUCCESS = "UPDATE_CARD_SUCCESS"; + // User actions. export const CREATE_USER_SUCCESS = "CREATE_USER_SUCCESS"; export const DELETE_USER_OPTIMISTIC = "DELETE_USER_OPTIMISTIC"; From 697ac5ccdfdeeaf291e32b44ad7a9f3abfab45f0 Mon Sep 17 00:00:00 2001 From: Andrew Smith Date: Fri, 23 Aug 2019 18:46:11 +0100 Subject: [PATCH 05/24] feature #11: Create card reducers --- src/redux/reducers/cardReducer.js | 19 +++++++++++++++++++ src/redux/reducers/initialState.js | 1 + 2 files changed, 20 insertions(+) create mode 100644 src/redux/reducers/cardReducer.js diff --git a/src/redux/reducers/cardReducer.js b/src/redux/reducers/cardReducer.js new file mode 100644 index 0000000..0efcea0 --- /dev/null +++ b/src/redux/reducers/cardReducer.js @@ -0,0 +1,19 @@ +import * as actionTypes from "../actions/actionTypes"; +import initialState from "./initialState"; + +export default function cardReducer(state = initialState.cards, action) { + switch (action.type) { + case actionTypes.DELETE_CARD_OPTIMISTIC: + return state.filter(card => card._id !== action.card._id); + case actionTypes.CREATE_CARD_SUCCESS: + return [...state, { ...action.card }]; + case actionTypes.LOAD_CARDS_SUCCESS: + return action.cards; + case actionTypes.UPDATE_CARD_SUCCESS: + return state.map(card => + card._id === action.card._id ? action.card : card + ); + default: + return state; + } +} diff --git a/src/redux/reducers/initialState.js b/src/redux/reducers/initialState.js index d50e997..3fc2124 100644 --- a/src/redux/reducers/initialState.js +++ b/src/redux/reducers/initialState.js @@ -1,4 +1,5 @@ export default { + cards: [], users: [], apiCallsInProgress: 0 }; From 9f5bd424f7392662eb5af5bc201d3800186206a1 Mon Sep 17 00:00:00 2001 From: Andrew Smith Date: Fri, 23 Aug 2019 18:47:21 +0100 Subject: [PATCH 06/24] feature #11: Add card reducers to root reducer --- src/redux/reducers/index.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/redux/reducers/index.js b/src/redux/reducers/index.js index 166ed5e..e0c6ff5 100644 --- a/src/redux/reducers/index.js +++ b/src/redux/reducers/index.js @@ -1,10 +1,11 @@ import { combineReducers } from "redux"; import apiCallsInProgress from "./apiStatusReducer"; - +import cards from "./cardReducer"; import users from "./userReducer"; const rootReducer = combineReducers({ apiCallsInProgress, + cards, users }); From c7cc9ffa49643d1ed0b584eb96c38f19f0295e09 Mon Sep 17 00:00:00 2001 From: Andrew Smith Date: Sat, 24 Aug 2019 00:21:16 +0100 Subject: [PATCH 07/24] feature #11: Add populated owner data to mock data. --- src/tools/db.json | 2 +- src/tools/generateCards.js | 2 +- src/tools/mockData.js | 142 +++++++++++++++++++++++++++++-------- 3 files changed, 113 insertions(+), 33 deletions(-) diff --git a/src/tools/db.json b/src/tools/db.json index e5e6bf8..93edf83 100644 --- a/src/tools/db.json +++ b/src/tools/db.json @@ -1 +1 @@ -{"cards":[{"_id":"5d6020254ea3a4ab3ffc476b","title":"material leather","boardId":"","status":"","ownerId":""},{"_id":"5d602025c1b269d1aeba775d","title":"labor hearing","boardId":"","status":"","ownerId":""},{"_id":"5d6020255c4c086beb74fe3b","title":"struck affect","boardId":"","status":"","ownerId":""},{"_id":"5d602025f80d7c1056749a9a","title":"continent difficulty","boardId":"","status":"","ownerId":""},{"_id":"5d602025d4c222584dabbd78","title":"screen forty","boardId":"","status":"","ownerId":""},{"_id":"5d602025a00dd4be2452e132","title":"report forth","boardId":"","status":"","ownerId":""},{"_id":"5d602025e29e75c53bccc713","title":"on faster","boardId":"","status":"","ownerId":""},{"_id":"5d6020252f61ab55e13cb823","title":"sat upon","boardId":"","status":"","ownerId":""},{"_id":"5d6020253f49acf252b4b2a6","title":"major something","boardId":"","status":"","ownerId":""},{"_id":"5d602025fd3db74ec9005051","title":"faster specific","boardId":"","status":"","ownerId":""}],"users":[{"_id":"5d42e5d5e1e3d731df26010a","firstName":"Andrew","lastName":"Smith","address":"32 Walpole Road","city":"London","postcode":"N17","__v":0},{"_id":"5d43fed51d0825849c0f0b67","firstName":"Rosa","lastName":"Smith","address":"32 Walpole Road","city":"London","postcode":"N17","__v":0},{"_id":"5d42104a7979bd071c129604","firstName":"Dora","lastName":"Fitzgerald","address":"1300 Eknaw Path","city":"Evegirhe","postcode":"P8K 4T1","__v":0},{"_id":"5d42104a7979bd071c129605","firstName":"Bryan","lastName":"Fitzgerald","address":"1050 Dedu Point","city":"Irhekde","postcode":"G1K 2N9","__v":0},{"_id":"5d42104a7979bd071c129606","firstName":"Dale","lastName":"Fitzgerald","address":"560 Fibab Glen","city":"Hudmakap","postcode":"T9U 0N6","__v":0},{"_id":"5d42104a7979bd071c129607","firstName":"Alma","lastName":"Fitzgerald","address":"1630 Zuas Place","city":"Caturaagu","postcode":"G9E 7N0","__v":0},{"_id":"5d42104a7979bd071c129608","firstName":"Billy","lastName":"Fitzgerald","address":"1689 Hopge Square","city":"Vinpati","postcode":"C2O 6D1","__v":0},{"_id":"5d42104a7979bd071c129609","firstName":"Adeline","lastName":"Fitzgerald","address":"1912 Dusved Ridge","city":"Atehasma","postcode":"N2D 7C3","__v":0},{"_id":"5d42104a7979bd071c12960a","firstName":"Charlotte","lastName":"Fitzgerald","address":"611 Gumaf Way","city":"Kalover","postcode":"E4Y 2E7","__v":0},{"_id":"5d42104a7979bd071c12960b","firstName":"Rodney","lastName":"Fitzgerald","address":"1961 Goku Heights","city":"Kivzupzi","postcode":"J5C 8H1","__v":0}]} \ No newline at end of file +{"cards":[{"_id":"5d60727643805a36c4c71d11","title":"main until","boardId":"","status":"","owner":{"_id":"5d42e5d5e1e3d731df26010a","firstName":"Andrew","lastName":"Smith","address":"32 Walpole Road","city":"London","postcode":"N17","__v":0}},{"_id":"5d6072760a36855fc69a385d","title":"worry know","boardId":"","status":"","owner":{"_id":"5d42e5d5e1e3d731df26010a","firstName":"Andrew","lastName":"Smith","address":"32 Walpole Road","city":"London","postcode":"N17","__v":0}},{"_id":"5d60727602117c1e63eaaf33","title":"empty fog","boardId":"","status":"","owner":{"_id":"5d42e5d5e1e3d731df26010a","firstName":"Andrew","lastName":"Smith","address":"32 Walpole Road","city":"London","postcode":"N17","__v":0}},{"_id":"5d6072760c989fa581296e02","title":"taste become","boardId":"","status":"","owner":{"_id":"5d42104a7979bd071c129604","firstName":"Dora","lastName":"Fitzgerald","address":"1300 Eknaw Path","city":"Evegirhe","postcode":"P8K 4T1","__v":0}},{"_id":"5d6072763a5e8a7c5838ccfc","title":"clean hurry","boardId":"","status":"","owner":{"_id":"5d42104a7979bd071c129604","firstName":"Dora","lastName":"Fitzgerald","address":"1300 Eknaw Path","city":"Evegirhe","postcode":"P8K 4T1","__v":0}},{"_id":"5d6072761396a6b379fa5c3a","title":"class invented","boardId":"","status":"","owner":{"_id":"5d42104a7979bd071c129604","firstName":"Dora","lastName":"Fitzgerald","address":"1300 Eknaw Path","city":"Evegirhe","postcode":"P8K 4T1","__v":0}},{"_id":"5d607276ba59ac18120faf88","title":"care respect","boardId":"","status":"","owner":{"_id":"5d42104a7979bd071c12960b","firstName":"Rodney","lastName":"Fitzgerald","address":"1961 Goku Heights","city":"Kivzupzi","postcode":"J5C 8H1","__v":0}},{"_id":"5d60727626e6e7175e135164","title":"stone enough","boardId":"","status":"","owner":{"_id":"5d42104a7979bd071c12960b","firstName":"Rodney","lastName":"Fitzgerald","address":"1961 Goku Heights","city":"Kivzupzi","postcode":"J5C 8H1","__v":0}},{"_id":"5d607276ba76a9f8094409f0","title":"visit gulf","boardId":"","status":"","owner":{"_id":"5d42104a7979bd071c12960b","firstName":"Rodney","lastName":"Fitzgerald","address":"1961 Goku Heights","city":"Kivzupzi","postcode":"J5C 8H1","__v":0}},{"_id":"5d607276f683aa17684f4288","title":"air running","boardId":"","status":"","owner":{"_id":"5d42104a7979bd071c12960b","firstName":"Rodney","lastName":"Fitzgerald","address":"1961 Goku Heights","city":"Kivzupzi","postcode":"J5C 8H1","__v":0}}],"users":[{"_id":"5d42e5d5e1e3d731df26010a","firstName":"Andrew","lastName":"Smith","address":"32 Walpole Road","city":"London","postcode":"N17","__v":0},{"_id":"5d43fed51d0825849c0f0b67","firstName":"Rosa","lastName":"Smith","address":"32 Walpole Road","city":"London","postcode":"N17","__v":0},{"_id":"5d42104a7979bd071c129604","firstName":"Dora","lastName":"Fitzgerald","address":"1300 Eknaw Path","city":"Evegirhe","postcode":"P8K 4T1","__v":0},{"_id":"5d42104a7979bd071c129605","firstName":"Bryan","lastName":"Fitzgerald","address":"1050 Dedu Point","city":"Irhekde","postcode":"G1K 2N9","__v":0},{"_id":"5d42104a7979bd071c129606","firstName":"Dale","lastName":"Fitzgerald","address":"560 Fibab Glen","city":"Hudmakap","postcode":"T9U 0N6","__v":0},{"_id":"5d42104a7979bd071c129607","firstName":"Alma","lastName":"Fitzgerald","address":"1630 Zuas Place","city":"Caturaagu","postcode":"G9E 7N0","__v":0},{"_id":"5d42104a7979bd071c129608","firstName":"Billy","lastName":"Fitzgerald","address":"1689 Hopge Square","city":"Vinpati","postcode":"C2O 6D1","__v":0},{"_id":"5d42104a7979bd071c129609","firstName":"Adeline","lastName":"Fitzgerald","address":"1912 Dusved Ridge","city":"Atehasma","postcode":"N2D 7C3","__v":0},{"_id":"5d42104a7979bd071c12960a","firstName":"Charlotte","lastName":"Fitzgerald","address":"611 Gumaf Way","city":"Kalover","postcode":"E4Y 2E7","__v":0},{"_id":"5d42104a7979bd071c12960b","firstName":"Rodney","lastName":"Fitzgerald","address":"1961 Goku Heights","city":"Kivzupzi","postcode":"J5C 8H1","__v":0}]} \ No newline at end of file diff --git a/src/tools/generateCards.js b/src/tools/generateCards.js index 0026906..0f4ed8b 100644 --- a/src/tools/generateCards.js +++ b/src/tools/generateCards.js @@ -22,7 +22,7 @@ const generateCards = function() { title: words[i], boardId: "", status: "", - ownerId: "" + owner: "" }; cards.push(card); } diff --git a/src/tools/mockData.js b/src/tools/mockData.js index ae8e9b5..6951357 100755 --- a/src/tools/mockData.js +++ b/src/tools/mockData.js @@ -1,74 +1,154 @@ // Cards. const cards = [ { - _id: "5d6020254ea3a4ab3ffc476b", - title: "material leather", + _id: "5d60727643805a36c4c71d11", + title: "main until", boardId: "", status: "", - ownerId: "" + owner: { + _id: "5d42e5d5e1e3d731df26010a", + firstName: "Andrew", + lastName: "Smith", + address: "32 Walpole Road", + city: "London", + postcode: "N17", + __v: 0 + } }, { - _id: "5d602025c1b269d1aeba775d", - title: "labor hearing", + _id: "5d6072760a36855fc69a385d", + title: "worry know", boardId: "", status: "", - ownerId: "" + owner: { + _id: "5d42e5d5e1e3d731df26010a", + firstName: "Andrew", + lastName: "Smith", + address: "32 Walpole Road", + city: "London", + postcode: "N17", + __v: 0 + } }, { - _id: "5d6020255c4c086beb74fe3b", - title: "struck affect", + _id: "5d60727602117c1e63eaaf33", + title: "empty fog", boardId: "", status: "", - ownerId: "" + owner: { + _id: "5d42e5d5e1e3d731df26010a", + firstName: "Andrew", + lastName: "Smith", + address: "32 Walpole Road", + city: "London", + postcode: "N17", + __v: 0 + } }, { - _id: "5d602025f80d7c1056749a9a", - title: "continent difficulty", + _id: "5d6072760c989fa581296e02", + title: "taste become", boardId: "", status: "", - ownerId: "" + owner: { + _id: "5d42104a7979bd071c129604", + firstName: "Dora", + lastName: "Fitzgerald", + address: "1300 Eknaw Path", + city: "Evegirhe", + postcode: "P8K 4T1", + __v: 0 + } }, { - _id: "5d602025d4c222584dabbd78", - title: "screen forty", + _id: "5d6072763a5e8a7c5838ccfc", + title: "clean hurry", boardId: "", status: "", - ownerId: "" + owner: { + _id: "5d42104a7979bd071c129604", + firstName: "Dora", + lastName: "Fitzgerald", + address: "1300 Eknaw Path", + city: "Evegirhe", + postcode: "P8K 4T1", + __v: 0 + } }, { - _id: "5d602025a00dd4be2452e132", - title: "report forth", + _id: "5d6072761396a6b379fa5c3a", + title: "class invented", boardId: "", status: "", - ownerId: "" + owner: { + _id: "5d42104a7979bd071c129604", + firstName: "Dora", + lastName: "Fitzgerald", + address: "1300 Eknaw Path", + city: "Evegirhe", + postcode: "P8K 4T1", + __v: 0 + } }, { - _id: "5d602025e29e75c53bccc713", - title: "on faster", + _id: "5d607276ba59ac18120faf88", + title: "care respect", boardId: "", status: "", - ownerId: "" + owner: { + _id: "5d42104a7979bd071c12960b", + firstName: "Rodney", + lastName: "Fitzgerald", + address: "1961 Goku Heights", + city: "Kivzupzi", + postcode: "J5C 8H1", + __v: 0 + } }, { - _id: "5d6020252f61ab55e13cb823", - title: "sat upon", + _id: "5d60727626e6e7175e135164", + title: "stone enough", boardId: "", status: "", - ownerId: "" + owner: { + _id: "5d42104a7979bd071c12960b", + firstName: "Rodney", + lastName: "Fitzgerald", + address: "1961 Goku Heights", + city: "Kivzupzi", + postcode: "J5C 8H1", + __v: 0 + } }, { - _id: "5d6020253f49acf252b4b2a6", - title: "major something", + _id: "5d607276ba76a9f8094409f0", + title: "visit gulf", boardId: "", status: "", - ownerId: "" + owner: { + _id: "5d42104a7979bd071c12960b", + firstName: "Rodney", + lastName: "Fitzgerald", + address: "1961 Goku Heights", + city: "Kivzupzi", + postcode: "J5C 8H1", + __v: 0 + } }, { - _id: "5d602025fd3db74ec9005051", - title: "faster specific", + _id: "5d607276f683aa17684f4288", + title: "air running", boardId: "", status: "", - ownerId: "" + owner: { + _id: "5d42104a7979bd071c12960b", + firstName: "Rodney", + lastName: "Fitzgerald", + address: "1961 Goku Heights", + city: "Kivzupzi", + postcode: "J5C 8H1", + __v: 0 + } } ]; @@ -76,7 +156,7 @@ const newCard = { title: "", boardId: "", status: "", - ownerId: "" + owner: "" }; // Users. From ca9774ce17767795e081be9e18ef2608a72531d7 Mon Sep 17 00:00:00 2001 From: Andrew Smith Date: Sat, 24 Aug 2019 00:27:10 +0100 Subject: [PATCH 08/24] chore #11: Change development api back to mock api --- src/components/users/UsersPage.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/users/UsersPage.js b/src/components/users/UsersPage.js index 148c60d..3eadf09 100644 --- a/src/components/users/UsersPage.js +++ b/src/components/users/UsersPage.js @@ -29,7 +29,7 @@ class UsersPage extends React.Component { } render() { return ( -
+
{this.state.redirectToAddUserPage && }

Users

{this.props.loading ? ( From 282440a510a940dcd67659666a33df14299225c2 Mon Sep 17 00:00:00 2001 From: Andrew Smith Date: Wed, 28 Aug 2019 14:46:53 +0100 Subject: [PATCH 09/24] chore #12: npm install --- package-lock.json | 81 ++++++++++++++++++++++++++++++++++++----------- package.json | 2 +- 2 files changed, 63 insertions(+), 20 deletions(-) diff --git a/package-lock.json b/package-lock.json index 65854e2..b723da2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1705,7 +1705,8 @@ "acorn": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.0.0.tgz", - "integrity": "sha512-PaF/MduxijYYt7unVGRuds1vBC9bFxbNf+VWqhOClfdgy7RlVkQqt610ig1/yxTgsDIfW1cWDel5EBbOy3jdtQ==" + "integrity": "sha512-PaF/MduxijYYt7unVGRuds1vBC9bFxbNf+VWqhOClfdgy7RlVkQqt610ig1/yxTgsDIfW1cWDel5EBbOy3jdtQ==", + "dev": true }, "acorn-globals": { "version": "4.3.3", @@ -1726,7 +1727,8 @@ "acorn-jsx": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.2.tgz", - "integrity": "sha512-tiNTrP1MP0QrChmD2DdupCr6HWSFeKVw5d/dHTu4Y7rkAkRhU/Dt7dphAfIUyxtHpl/eBVip5uTNSpQJHylpAw==" + "integrity": "sha512-tiNTrP1MP0QrChmD2DdupCr6HWSFeKVw5d/dHTu4Y7rkAkRhU/Dt7dphAfIUyxtHpl/eBVip5uTNSpQJHylpAw==", + "dev": true }, "acorn-walk": { "version": "6.2.0", @@ -1800,7 +1802,8 @@ "ansi-escapes": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true }, "ansi-html": { "version": "0.0.7", @@ -3420,6 +3423,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, "requires": { "restore-cursor": "^2.0.0" } @@ -4405,6 +4409,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, "requires": { "esutils": "^2.0.2" } @@ -4586,7 +4591,8 @@ "emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true }, "emojis-list": { "version": "2.1.0", @@ -4732,6 +4738,7 @@ "version": "6.2.2", "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.2.2.tgz", "integrity": "sha512-mf0elOkxHbdyGX1IJEUsNBzCDdyoUgljF3rRlgfyYh0pwGnreLc0jjD6ZuleOibjmnUWZLY2eXwSooeOgGJ2jw==", + "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "ajv": "^6.10.0", @@ -4775,12 +4782,14 @@ "ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, "requires": { "nice-try": "^1.0.4", "path-key": "^2.0.1", @@ -4792,7 +4801,8 @@ "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true } } }, @@ -4800,6 +4810,7 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, "requires": { "ms": "^2.1.1" } @@ -4808,6 +4819,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", + "dev": true, "requires": { "esrecurse": "^4.1.0", "estraverse": "^4.1.1" @@ -4817,6 +4829,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.1.0.tgz", "integrity": "sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ==", + "dev": true, "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -4825,17 +4838,20 @@ "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true }, "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, "requires": { "ansi-regex": "^4.1.0" } @@ -4843,7 +4859,8 @@ "strip-json-comments": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", - "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==" + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", + "dev": true } } }, @@ -5144,6 +5161,7 @@ "version": "6.1.1", "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.1.tgz", "integrity": "sha512-EYbr8XZUhWbYCqQRW0duU5LxzL5bETN6AjKBGy1302qqzPaCH10QbRg3Wvco79Z8x9WbiE8HYB4e75xl6qUYvQ==", + "dev": true, "requires": { "acorn": "^7.0.0", "acorn-jsx": "^5.0.2", @@ -5159,6 +5177,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "dev": true, "requires": { "estraverse": "^4.0.0" } @@ -5539,6 +5558,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, "requires": { "escape-string-regexp": "^1.0.5" } @@ -5547,6 +5567,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, "requires": { "flat-cache": "^2.0.1" } @@ -5645,6 +5666,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, "requires": { "flatted": "^2.0.0", "rimraf": "2.6.3", @@ -5654,7 +5676,8 @@ "flatted": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", - "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==" + "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", + "dev": true }, "flatten": { "version": "1.0.2", @@ -5939,6 +5962,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.0.0.tgz", "integrity": "sha512-Z2RwiujPRGluePM6j699ktJYxmPpJKCfpGA13jz2hmFZC7gKetzrWvg5KN3+OsIFmydGyZ1AVwERCq1w/ZZwRg==", + "dev": true, "requires": { "is-glob": "^4.0.1" } @@ -6440,7 +6464,8 @@ "ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true }, "immer": { "version": "2.1.5", @@ -6525,6 +6550,7 @@ "version": "6.5.2", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", + "dev": true, "requires": { "ansi-escapes": "^3.2.0", "chalk": "^2.4.2", @@ -6544,12 +6570,14 @@ "ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, "requires": { "ansi-regex": "^4.1.0" } @@ -8434,7 +8462,8 @@ "json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true }, "json-stringify-safe": { "version": "5.0.1", @@ -9139,7 +9168,8 @@ "mute-stream": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true }, "nan": { "version": "2.14.0", @@ -9601,6 +9631,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, "requires": { "mimic-fn": "^1.0.0" }, @@ -9608,7 +9639,8 @@ "mimic-fn": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true } } }, @@ -9867,6 +9899,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, "requires": { "callsites": "^3.0.0" }, @@ -9874,7 +9907,8 @@ "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true } } }, @@ -10933,7 +10967,8 @@ "progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true }, "promise": { "version": "8.0.3", @@ -11857,6 +11892,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, "requires": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" @@ -12356,6 +12392,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, "requires": { "ansi-styles": "^3.2.0", "astral-regex": "^1.0.0", @@ -12979,6 +13016,7 @@ "version": "5.4.6", "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, "requires": { "ajv": "^6.10.2", "lodash": "^4.17.14", @@ -12989,12 +13027,14 @@ "ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, "requires": { "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", @@ -13005,6 +13045,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, "requires": { "ansi-regex": "^4.1.0" } @@ -13610,7 +13651,8 @@ "v8-compile-cache": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", - "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==" + "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", + "dev": true }, "validate-npm-package-license": { "version": "3.0.4", @@ -14193,6 +14235,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, "requires": { "mkdirp": "^0.5.1" } diff --git a/package.json b/package.json index 5b6b36f..6702938 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,6 @@ "css-loader": "2.1.1", "dotenv": "6.2.0", "dotenv-expand": "4.2.0", - "eslint": "^6.2.2", "eslint-config-react-app": "^5.0.1", "eslint-loader": "2.2.1", "eslint-plugin-flowtype": "3.13.0", @@ -89,6 +88,7 @@ }, "devDependencies": { "cssnano": "^4.1.10", + "eslint": "^6.2.2", "fetch-mock": "^7.3.9", "json-server": "^0.14.2", "node-fetch": "^2.3.0", From cacaf7519e4145b6c9af2e6948966f8c28b76f55 Mon Sep 17 00:00:00 2001 From: Andrew Smith Date: Wed, 28 Aug 2019 14:53:21 +0100 Subject: [PATCH 10/24] chore #12: Installed bcrypt as dev dependency --- package-lock.json | 328 +++++++++++++++++++++++++++++++++++++ package.json | 1 + src/tools/generateCards.js | 1 + 3 files changed, 330 insertions(+) diff --git a/package-lock.json b/package-lock.json index b723da2..b9b060d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1693,6 +1693,12 @@ "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", "integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w==" }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, "accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", @@ -1837,6 +1843,48 @@ "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -2382,6 +2430,24 @@ "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" }, + "bcrypt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-3.0.6.tgz", + "integrity": "sha512-taA5bCTfXe7FUjKroKky9EXpdhkVvhE5owfxfLYodbrAR1Ul3juLmIQmIQBK4L9a5BuUcE6cqmwT+Da20lF9tg==", + "dev": true, + "requires": { + "nan": "2.13.2", + "node-pre-gyp": "0.12.0" + }, + "dependencies": { + "nan": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.13.2.tgz", + "integrity": "sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==", + "dev": true + } + } + }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", @@ -3663,6 +3729,12 @@ "date-now": "^0.1.4" } }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true + }, "constants-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", @@ -4321,6 +4393,12 @@ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true + }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -4340,6 +4418,12 @@ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "dev": true + }, "detect-newline": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", @@ -5861,6 +5945,15 @@ "universalify": "^0.1.0" } }, + "fs-minipass": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.6.tgz", + "integrity": "sha512-crhvyXcMejjv3Z5d2Fa9sf5xLYVCF5O1c71QxbVnbLsmYMBEvDAftewesN/HhY03YRoA7zOMxjNGrF5svGaaeQ==", + "dev": true, + "requires": { + "minipass": "^2.2.1" + } + }, "fs-write-stream-atomic": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", @@ -5916,6 +6009,59 @@ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, "get-caller-file": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", @@ -6156,6 +6302,12 @@ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=" }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true + }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -6467,6 +6619,15 @@ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true }, + "ignore-walk": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", + "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, "immer": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/immer/-/immer-2.1.5.tgz", @@ -9060,6 +9221,33 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, + "minipass": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.4.0.tgz", + "integrity": "sha512-6PmOuSP4NnZXzs2z6rbwzLJu/c5gdzYg1mRI/WIYdx45iiX7T+a4esOzavD6V/KmBzAaopFSTZPZcUx73bqKWA==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + }, + "dependencies": { + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "dev": true + } + } + }, + "minizlib": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", + "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", + "dev": true, + "requires": { + "minipass": "^2.2.1" + } + }, "mississippi": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", @@ -9213,6 +9401,34 @@ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" }, + "needle": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.4.0.tgz", + "integrity": "sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==", + "dev": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, "negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", @@ -9365,6 +9581,32 @@ } } }, + "node-pre-gyp": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz", + "integrity": "sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A==", + "dev": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, "node-releases": { "version": "1.1.28", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.28.tgz", @@ -9380,6 +9622,16 @@ } } }, + "nopt": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "dev": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -9416,6 +9668,22 @@ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==" }, + "npm-bundled": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.6.tgz", + "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==", + "dev": true + }, + "npm-packlist": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.4.tgz", + "integrity": "sha512-zTLo8UcVYtDU3gdeaFu2Xu0n0EvelfHDGuqtNIn5RO7yQj4H1TqNdBc/yZjxnWA0PVB8D3Woyp0i5B43JwQ6Vw==", + "dev": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, "npm-run-all": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", @@ -9464,6 +9732,18 @@ "path-key": "^2.0.0" } }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, "nth-check": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", @@ -9711,6 +9991,12 @@ "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, "os-locale": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", @@ -9769,6 +10055,16 @@ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, "p-defer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", @@ -13057,6 +13353,29 @@ "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" }, + "tar": { + "version": "4.4.10", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.10.tgz", + "integrity": "sha512-g2SVs5QIxvo6OLp0GudTqEf05maawKUxXru104iaayWA09551tFCTI8f1Asb4lPfkBr91k07iL4c11XO3/b0tA==", + "dev": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.5", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + }, + "dependencies": { + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "dev": true + } + } + }, "term-size": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", @@ -13993,6 +14312,15 @@ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, "widest-line": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", diff --git a/package.json b/package.json index 6702938..ee2ae7e 100644 --- a/package.json +++ b/package.json @@ -87,6 +87,7 @@ "workbox-webpack-plugin": "4.3.1" }, "devDependencies": { + "bcrypt": "^3.0.6", "cssnano": "^4.1.10", "eslint": "^6.2.2", "fetch-mock": "^7.3.9", diff --git a/src/tools/generateCards.js b/src/tools/generateCards.js index 0f4ed8b..5902acc 100644 --- a/src/tools/generateCards.js +++ b/src/tools/generateCards.js @@ -1,4 +1,5 @@ const randomWords = require("random-words"); +const bcrypt = require("bcrypt"); const words = randomWords({ exactly: 10, wordsPerString: 2 }); From 9142d0df018efdf469497a2fb46568ea5b92c1e4 Mon Sep 17 00:00:00 2001 From: Andrew Smith Date: Wed, 28 Aug 2019 15:13:44 +0100 Subject: [PATCH 11/24] chore #12: Update mockUsers to include userName and password --- src/tools/generateCards.js | 18 ++++++++++++++- src/tools/mockData.js | 45 ++++++++++++++++++++++++++++---------- 2 files changed, 50 insertions(+), 13 deletions(-) diff --git a/src/tools/generateCards.js b/src/tools/generateCards.js index 5902acc..91110f7 100644 --- a/src/tools/generateCards.js +++ b/src/tools/generateCards.js @@ -1,5 +1,6 @@ const randomWords = require("random-words"); const bcrypt = require("bcrypt"); +const { users } = require("./mockData"); const words = randomWords({ exactly: 10, wordsPerString: 2 }); @@ -30,4 +31,19 @@ const generateCards = function() { console.log(cards); }; -module.exports = generateCards(); +const updateMockUsers = function() { + const updatedUsers = users.map(user => { + let userName = randomWords({ exactly: 2, join: " " }); + let password = bcrypt.hashSync(userName, 5); + let newFields = { + userName: userName, + password: password + }; + return Object.assign(user, newFields); + }); + console.log(updatedUsers); +}; + +module.exports = + // generateCards, + updateMockUsers(); diff --git a/src/tools/mockData.js b/src/tools/mockData.js index 6951357..536a993 100755 --- a/src/tools/mockData.js +++ b/src/tools/mockData.js @@ -168,7 +168,9 @@ const users = [ address: "32 Walpole Road", city: "London", postcode: "N17", - __v: 0 + __v: 0, + userName: "claws circle", + password: "$2b$05$2.3R3gIiLY0.k3W2NyFU1eS0By2gEatUxvFNZ/hm6w.uLP4xynrZK" }, { _id: "5d43fed51d0825849c0f0b67", @@ -177,7 +179,9 @@ const users = [ address: "32 Walpole Road", city: "London", postcode: "N17", - __v: 0 + __v: 0, + userName: "court nation", + password: "$2b$05$N8m6IdK07d.ebxqkS2pvDuBAh8oVkeVblDr/D36u5GdK3eKa9OrWy" }, { _id: "5d42104a7979bd071c129604", @@ -186,7 +190,9 @@ const users = [ address: "1300 Eknaw Path", city: "Evegirhe", postcode: "P8K 4T1", - __v: 0 + __v: 0, + userName: "brass indeed", + password: "$2b$05$CB4O9hzF7Wx.C..hActQoOzjIiFVcKK79h6zJutK1seHj13b9i/gq" }, { _id: "5d42104a7979bd071c129605", @@ -195,7 +201,9 @@ const users = [ address: "1050 Dedu Point", city: "Irhekde", postcode: "G1K 2N9", - __v: 0 + __v: 0, + userName: "interior one", + password: "$2b$05$u3S3FSfVetkUrYAbQgUTROLbk7l4Ez3Z6PcQlp1XRiPoy83ult.BW" }, { _id: "5d42104a7979bd071c129606", @@ -204,7 +212,9 @@ const users = [ address: "560 Fibab Glen", city: "Hudmakap", postcode: "T9U 0N6", - __v: 0 + __v: 0, + userName: "season carried", + password: "$2b$05$d1NOjWSsLqvjssyI1LKaK.QcnofuAwjgIozR86Pn/p2ixA0CjVX06" }, { _id: "5d42104a7979bd071c129607", @@ -213,7 +223,9 @@ const users = [ address: "1630 Zuas Place", city: "Caturaagu", postcode: "G9E 7N0", - __v: 0 + __v: 0, + userName: "stay underline", + password: "$2b$05$MqkYhqxPam.a2LuUB7J9l.nDih2DRRIYxGoxh4SLzKxvA7W7Ltmjm" }, { _id: "5d42104a7979bd071c129608", @@ -222,7 +234,9 @@ const users = [ address: "1689 Hopge Square", city: "Vinpati", postcode: "C2O 6D1", - __v: 0 + __v: 0, + userName: "end owner", + password: "$2b$05$1ErQO/LyTVZzPqXy5fv2AOEQUBcw0cypVQffxXX7J/1qJphFckDbO" }, { _id: "5d42104a7979bd071c129609", @@ -231,7 +245,9 @@ const users = [ address: "1912 Dusved Ridge", city: "Atehasma", postcode: "N2D 7C3", - __v: 0 + __v: 0, + userName: "column location", + password: "$2b$05$BHvS9h08epkH8LL7CJ31HuCz09fYJ3DIv81w0BWZQu.mtoB0v7BV2" }, { _id: "5d42104a7979bd071c12960a", @@ -240,7 +256,9 @@ const users = [ address: "611 Gumaf Way", city: "Kalover", postcode: "E4Y 2E7", - __v: 0 + __v: 0, + userName: "action please", + password: "$2b$05$8TrKFk/gSO241uG/4s6k.uJWi/0tc0KZPCoqbVryAfVu/7YfgDqvy" }, { _id: "5d42104a7979bd071c12960b", @@ -249,16 +267,19 @@ const users = [ address: "1961 Goku Heights", city: "Kivzupzi", postcode: "J5C 8H1", - __v: 0 + __v: 0, + userName: "solution primitive", + password: "$2b$05$ZQXo4wwzA.wzrGKY7/BM8uthaaoYXvkFx8HbbUDlPTwXMAGZOKsu." } ]; - const newUser = { firstName: "", lastName: "", address: "", city: "", - postcode: "" + postcode: "", + userName: "", + password: "" }; module.exports = { From 37900c4973d2aecb3379bd8109d6bae119b53448 Mon Sep 17 00:00:00 2001 From: Andrew Smith Date: Wed, 28 Aug 2019 17:54:14 +0100 Subject: [PATCH 12/24] chore #12: Set up material-ui --- package-lock.json | 267 ++++++++++++++++++++++++++++++++++++++++++++++ package.json | 2 + public/index.html | 8 ++ src/tools/db.json | 2 +- 4 files changed, 278 insertions(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index b9b060d..91c5a49 100644 --- a/package-lock.json +++ b/package-lock.json @@ -985,6 +985,11 @@ "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-9.0.1.tgz", "integrity": "sha512-6It2EVfGskxZCQhuykrfnALg7oVeiI6KclWSmGDqB0AiInVrTGB9Jp9i4/Ad21u9Jde/voVQz6eFX/eSg/UsPA==" }, + "@emotion/hash": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.7.2.tgz", + "integrity": "sha512-RMtr1i6E8MXaBWwhXL3yeOU8JXRnz8GNxHvaUfVvwxokvayUY0zoBeWbKw1S9XkufmGEEdQd228pSZXFkAln8Q==" + }, "@hapi/address": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.0.0.tgz", @@ -1242,6 +1247,117 @@ "@types/yargs": "^13.0.0" } }, + "@material-ui/core": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.3.3.tgz", + "integrity": "sha512-wUQjoJEbtVWYi+R9gBWCPGy0O+c0oY8cAp2TugyB70f89ahq/cnfnTbMZl6O2arKe2xQlfAMzY8rOOy8UMzJoQ==", + "requires": { + "@babel/runtime": "^7.4.4", + "@material-ui/styles": "^4.3.3", + "@material-ui/system": "^4.3.3", + "@material-ui/types": "^4.1.1", + "@material-ui/utils": "^4.3.0", + "@types/react-transition-group": "^4.2.0", + "clsx": "^1.0.2", + "convert-css-length": "^2.0.1", + "deepmerge": "^4.0.0", + "hoist-non-react-statics": "^3.2.1", + "is-plain-object": "^3.0.0", + "normalize-scroll-left": "^0.2.0", + "popper.js": "^1.14.1", + "prop-types": "^15.7.2", + "react-transition-group": "^4.0.0", + "warning": "^4.0.1" + }, + "dependencies": { + "is-plain-object": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.0.tgz", + "integrity": "sha512-tZIpofR+P05k8Aocp7UI/2UTa9lTJSebCXpFFoR9aibpokDj/uXBsJ8luUu0tTVYKkMU6URDUuOfJZ7koewXvg==", + "requires": { + "isobject": "^4.0.0" + } + }, + "isobject": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-4.0.0.tgz", + "integrity": "sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==" + }, + "react-transition-group": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.2.2.tgz", + "integrity": "sha512-uP0tjqewtvjb7kGZFpZYPoD/NlVZmIgts9eTt1w35pAaEApPxQGv94lD3VkqyXf2aMqrSGwhs6EV/DLaoKbLSw==", + "requires": { + "@babel/runtime": "^7.4.5", + "dom-helpers": "^3.4.0", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + } + } + } + }, + "@material-ui/icons": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@material-ui/icons/-/icons-4.2.1.tgz", + "integrity": "sha512-FvSD5lUBJ66frI4l4AYAPy2CH14Zs2Dgm0o3oOMr33BdQtOAjCgbdOcvPBeaD1w6OQl31uNW3CKOE8xfPNxvUQ==", + "requires": { + "@babel/runtime": "^7.2.0" + } + }, + "@material-ui/styles": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.3.3.tgz", + "integrity": "sha512-quupQ6RYXbtKBJxhLkF3RQx6LSfrfuh2lYpILvk7p9XNkfqOQq36fuNVgrJ/A+NNn03uqDFfQYIWh4CByKr4hA==", + "requires": { + "@babel/runtime": "^7.4.4", + "@emotion/hash": "^0.7.1", + "@material-ui/types": "^4.1.1", + "@material-ui/utils": "^4.1.0", + "clsx": "^1.0.2", + "csstype": "^2.5.2", + "deepmerge": "^4.0.0", + "hoist-non-react-statics": "^3.2.1", + "jss": "10.0.0-alpha.24", + "jss-plugin-camel-case": "10.0.0-alpha.24", + "jss-plugin-default-unit": "10.0.0-alpha.24", + "jss-plugin-global": "10.0.0-alpha.24", + "jss-plugin-nested": "10.0.0-alpha.24", + "jss-plugin-props-sort": "10.0.0-alpha.24", + "jss-plugin-rule-value-function": "10.0.0-alpha.24", + "jss-plugin-vendor-prefixer": "10.0.0-alpha.24", + "prop-types": "^15.7.2", + "warning": "^4.0.1" + } + }, + "@material-ui/system": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.3.3.tgz", + "integrity": "sha512-j7JyvlhcTdc1wV6HzrDTU7XXlarxYXEUyzyHawOA0kCGmYVN2uFHENQRARLUdl+mEmuXO4TsAhNAiqiKakkFMg==", + "requires": { + "@babel/runtime": "^7.4.4", + "deepmerge": "^4.0.0", + "prop-types": "^15.7.2", + "warning": "^4.0.1" + } + }, + "@material-ui/types": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@material-ui/types/-/types-4.1.1.tgz", + "integrity": "sha512-AN+GZNXytX9yxGi0JOfxHrRTbhFybjUJ05rnsBVjcB+16e466Z0Xe5IxawuOayVZgTBNDxmPKo5j4V6OnMtaSQ==", + "requires": { + "@types/react": "*" + } + }, + "@material-ui/utils": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.3.0.tgz", + "integrity": "sha512-tK3Z/ap5ifPQwIryuGQ+AHLh2hEyBLRPj4NCMcqVrQfD+0KH2IP5BXR4A+wGVsyamKfLaOc8tz1fzxZblsztpw==", + "requires": { + "@babel/runtime": "^7.4.4", + "prop-types": "^15.7.2", + "react-is": "^16.8.6" + } + }, "@mrmlnc/readdir-enhanced": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", @@ -1448,11 +1564,33 @@ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.3.tgz", "integrity": "sha512-Il2DtDVRGDcqjDtE+rF8iqg1CArehSK84HZJCT7AMITlyXRBpuPhqGLDQMowraqqu1coEaimg4ZOqggt6L6L+A==" }, + "@types/prop-types": { + "version": "15.7.1", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.1.tgz", + "integrity": "sha512-CFzn9idOEpHrgdw8JsoTkaDDyRWk1jrzIV8djzcgpq0y9tG4B4lFT+Nxh52DVpDXV+n4+NPNv7M1Dj5uMp6XFg==" + }, "@types/q": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz", "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==" }, + "@types/react": { + "version": "16.9.2", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.2.tgz", + "integrity": "sha512-jYP2LWwlh+FTqGd9v7ynUKZzjj98T8x7Yclz479QdRhHfuW9yQ+0jjnD31eXSXutmBpppj5PYNLYLRfnZJvcfg==", + "requires": { + "@types/prop-types": "*", + "csstype": "^2.2.0" + } + }, + "@types/react-transition-group": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.2.2.tgz", + "integrity": "sha512-YfoaTNqBwbIqpiJ5NNfxfgg5kyFP1Hqf/jqBtSWNv0E+EkkxmN+3VD6U2fu86tlQvdAc1o0SdWhnWFwcRMTn9A==", + "requires": { + "@types/react": "*" + } + }, "@types/stack-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", @@ -3521,6 +3659,11 @@ "shallow-clone": "^0.1.2" } }, + "clsx": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.0.4.tgz", + "integrity": "sha512-1mQ557MIZTrL/140j+JVdRM6e31/OA4vTYxXgqIIZlndyfjHpyawKZia1Im05Vp9BWmImkcNrNtFYQMyFcgJDg==" + }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -3758,6 +3901,11 @@ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, + "convert-css-length": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/convert-css-length/-/convert-css-length-2.0.1.tgz", + "integrity": "sha512-iGpbcvhLPRKUbBc0Quxx7w/bV14AC3ItuBEGMahA5WTYqB8lq9jH0kTXFheCBASsYnqeMFZhiTruNxr1N59Axg==" + }, "convert-source-map": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", @@ -4036,6 +4184,15 @@ "resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.1.tgz", "integrity": "sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY=" }, + "css-vendor": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.6.tgz", + "integrity": "sha512-buv8FoZh84iMrtPHYGYll00/qSNV0gYO6E/GUCjUPTsSPj7uf/wot/QZwig+7qdFGxJ7HjOSJoclbhag09TVUQ==", + "requires": { + "@babel/runtime": "^7.5.5", + "is-in-browser": "^1.0.2" + } + }, "css-what": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", @@ -4164,6 +4321,11 @@ "cssom": "0.3.x" } }, + "csstype": { + "version": "2.6.6", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.6.tgz", + "integrity": "sha512-RpFbQGUE74iyPgvr46U9t1xoQBM8T4BL8SxrN66Le2xYAPSaDJJKeztV3awugusb3g3G9iL8StmkBBXhcbbXhg==" + }, "cyclist": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", @@ -4252,6 +4414,11 @@ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" }, + "deepmerge": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.0.0.tgz", + "integrity": "sha512-YZ1rOP5+kHor4hMAH+HRQnBQHg+wvS1un1hAOuIcxcBy0hzcUf6Jg2a1w65kpoOUnurOfZbERwjI1TfZxNjcww==" + }, "default-gateway": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", @@ -6574,6 +6741,11 @@ "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" }, + "hyphenate-style-name": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.3.tgz", + "integrity": "sha512-EcuixamT82oplpoJ2XU4pDtKGWQ7b00CD9f1ug9IaQ3p1bkHMiKCZ9ut9QDI6qsa6cpUuB+A/I+zLtdNK4n2DQ==" + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -6903,6 +7075,11 @@ "is-extglob": "^2.1.1" } }, + "is-in-browser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", + "integrity": "sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU=" + }, "is-installed-globally": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", @@ -8675,6 +8852,83 @@ "verror": "1.10.0" } }, + "jss": { + "version": "10.0.0-alpha.24", + "resolved": "https://registry.npmjs.org/jss/-/jss-10.0.0-alpha.24.tgz", + "integrity": "sha512-kfuSitcj7MTrDtSPLkrWcZppgZlTE3A+cqrkC+Z10WYROt0RXIWINAaK8tE2ohwkDfUlaM1YcRYvV3iT6YNFTA==", + "requires": { + "@babel/runtime": "^7.3.1", + "csstype": "^2.6.5", + "is-in-browser": "^1.1.3", + "tiny-warning": "^1.0.2" + } + }, + "jss-plugin-camel-case": { + "version": "10.0.0-alpha.24", + "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.0.0-alpha.24.tgz", + "integrity": "sha512-cRYLbGl6oO9wdGXp3hn+xqc8pw8bjaui25dDYuEeEsRZMh5/OKl3ByYxDT3PLKgFqouy5Xo+YmLGVH8l+nnEdQ==", + "requires": { + "@babel/runtime": "^7.3.1", + "hyphenate-style-name": "^1.0.3", + "jss": "10.0.0-alpha.24" + } + }, + "jss-plugin-default-unit": { + "version": "10.0.0-alpha.24", + "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.0.0-alpha.24.tgz", + "integrity": "sha512-1E1XlJqJ/9I1lR5EO/tA75U1LIIicKvW6xZEKLxAP8NC/rUjI+yBQBTBJn61LOpua51e7fgW8me46Z+iuXiC4A==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.0.0-alpha.24" + } + }, + "jss-plugin-global": { + "version": "10.0.0-alpha.24", + "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.0.0-alpha.24.tgz", + "integrity": "sha512-3LoxrZloF4tvXrS5S7enV9OhtaxXsEP3BQdiE76vI/ecCmgNDZNpnPd8MG20ptn2iAOsoMGfoMX20Ea1IKl/Mg==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.0.0-alpha.24" + } + }, + "jss-plugin-nested": { + "version": "10.0.0-alpha.24", + "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.0.0-alpha.24.tgz", + "integrity": "sha512-BWU6NaRZTVSJc7N+3FeHacdkFOjCMThouoRQPCWVxeT0nmAVlVGwgYzChcI+vzncx+UaRQC0x+01FYhVQ2xAFA==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.0.0-alpha.24", + "tiny-warning": "^1.0.2" + } + }, + "jss-plugin-props-sort": { + "version": "10.0.0-alpha.24", + "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.0.0-alpha.24.tgz", + "integrity": "sha512-TB4RpXwnGSEE58rN2RRzcWqhIaz0oAS1UBg10mk1fuLpkKyHEJWuuZXzgGih23Ivl/8LDVzTF+QRY5JagMUUGg==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.0.0-alpha.24" + } + }, + "jss-plugin-rule-value-function": { + "version": "10.0.0-alpha.24", + "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.0.0-alpha.24.tgz", + "integrity": "sha512-uFw4tf8PN48bdv4ZcDjG3OzKPIFZ4gpCC1cWO/dyexYfFIubX3bnQUbK4B0wPNe9LJU4KQo8s4F42B8B1ADTrA==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.0.0-alpha.24" + } + }, + "jss-plugin-vendor-prefixer": { + "version": "10.0.0-alpha.24", + "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.0.0-alpha.24.tgz", + "integrity": "sha512-hffKj0kSSvZsXs6RYEylpBlEGjryMzU1lsWqC5vQAT/Xb3tDe60BbEarEOFLBGv7EfyajXkuRwlXAQocV5ejCg==", + "requires": { + "@babel/runtime": "^7.3.1", + "css-vendor": "^2.0.5", + "jss": "10.0.0-alpha.24" + } + }, "jsx-ast-utils": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.2.1.tgz", @@ -9663,6 +9917,11 @@ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" }, + "normalize-scroll-left": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/normalize-scroll-left/-/normalize-scroll-left-0.2.0.tgz", + "integrity": "sha512-t5oCENZJl8TGusJKoCJm7+asaSsPuNmK6+iEjrZ5TyBj2f02brCRsd4c83hwtu+e5d4LCSBZ0uoDlMjBo+A8yA==" + }, "normalize-url": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", @@ -14038,6 +14297,14 @@ "makeerror": "1.0.x" } }, + "warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "requires": { + "loose-envify": "^1.0.0" + } + }, "watchpack": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", diff --git a/package.json b/package.json index ee2ae7e..1bb381b 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,8 @@ }, "dependencies": { "@babel/core": "7.5.5", + "@material-ui/core": "^4.3.3", + "@material-ui/icons": "^4.2.1", "@svgr/webpack": "4.3.2", "@typescript-eslint/eslint-plugin": "1.13.0", "@typescript-eslint/parser": "1.13.0", diff --git a/public/index.html b/public/index.html index 2f84431..42cf9e2 100644 --- a/public/index.html +++ b/public/index.html @@ -3,6 +3,14 @@ + + Date: Wed, 28 Aug 2019 18:03:11 +0100 Subject: [PATCH 13/24] feature #12: Add Material-ui button to user form --- src/components/users/UserForm.js | 5 +- src/tools/db.json | 267 ++++++++++++++++++++++++++++++- 2 files changed, 269 insertions(+), 3 deletions(-) diff --git a/src/components/users/UserForm.js b/src/components/users/UserForm.js index 0c5808f..83bf19e 100644 --- a/src/components/users/UserForm.js +++ b/src/components/users/UserForm.js @@ -1,6 +1,7 @@ import React from "react"; import PropTypes from "prop-types"; import TextInput from "../common/TextInput"; +import Button from "@material-ui/core/Button"; const UserForm = ({ user, onChange, onSave, saving = false, errors = {} }) => { return ( @@ -50,9 +51,9 @@ const UserForm = ({ user, onChange, onSave, saving = false, errors = {} }) => { onChange={onChange} error={errors.postcode} /> - + ); }; diff --git a/src/tools/db.json b/src/tools/db.json index f9395de..09e29b7 100644 --- a/src/tools/db.json +++ b/src/tools/db.json @@ -1 +1,266 @@ -{"cards":[{"_id":"5d60727643805a36c4c71d11","title":"main until","boardId":"","status":"","owner":{"_id":"5d42e5d5e1e3d731df26010a","firstName":"Andrew","lastName":"Smith","address":"32 Walpole Road","city":"London","postcode":"N17","__v":0}},{"_id":"5d6072760a36855fc69a385d","title":"worry know","boardId":"","status":"","owner":{"_id":"5d42e5d5e1e3d731df26010a","firstName":"Andrew","lastName":"Smith","address":"32 Walpole Road","city":"London","postcode":"N17","__v":0}},{"_id":"5d60727602117c1e63eaaf33","title":"empty fog","boardId":"","status":"","owner":{"_id":"5d42e5d5e1e3d731df26010a","firstName":"Andrew","lastName":"Smith","address":"32 Walpole Road","city":"London","postcode":"N17","__v":0}},{"_id":"5d6072760c989fa581296e02","title":"taste become","boardId":"","status":"","owner":{"_id":"5d42104a7979bd071c129604","firstName":"Dora","lastName":"Fitzgerald","address":"1300 Eknaw Path","city":"Evegirhe","postcode":"P8K 4T1","__v":0}},{"_id":"5d6072763a5e8a7c5838ccfc","title":"clean hurry","boardId":"","status":"","owner":{"_id":"5d42104a7979bd071c129604","firstName":"Dora","lastName":"Fitzgerald","address":"1300 Eknaw Path","city":"Evegirhe","postcode":"P8K 4T1","__v":0}},{"_id":"5d6072761396a6b379fa5c3a","title":"class invented","boardId":"","status":"","owner":{"_id":"5d42104a7979bd071c129604","firstName":"Dora","lastName":"Fitzgerald","address":"1300 Eknaw Path","city":"Evegirhe","postcode":"P8K 4T1","__v":0}},{"_id":"5d607276ba59ac18120faf88","title":"care respect","boardId":"","status":"","owner":{"_id":"5d42104a7979bd071c12960b","firstName":"Rodney","lastName":"Fitzgerald","address":"1961 Goku Heights","city":"Kivzupzi","postcode":"J5C 8H1","__v":0}},{"_id":"5d60727626e6e7175e135164","title":"stone enough","boardId":"","status":"","owner":{"_id":"5d42104a7979bd071c12960b","firstName":"Rodney","lastName":"Fitzgerald","address":"1961 Goku Heights","city":"Kivzupzi","postcode":"J5C 8H1","__v":0}},{"_id":"5d607276ba76a9f8094409f0","title":"visit gulf","boardId":"","status":"","owner":{"_id":"5d42104a7979bd071c12960b","firstName":"Rodney","lastName":"Fitzgerald","address":"1961 Goku Heights","city":"Kivzupzi","postcode":"J5C 8H1","__v":0}},{"_id":"5d607276f683aa17684f4288","title":"air running","boardId":"","status":"","owner":{"_id":"5d42104a7979bd071c12960b","firstName":"Rodney","lastName":"Fitzgerald","address":"1961 Goku Heights","city":"Kivzupzi","postcode":"J5C 8H1","__v":0}}],"users":[{"_id":"5d42e5d5e1e3d731df26010a","firstName":"Andrew","lastName":"Smith","address":"32 Walpole Road","city":"London","postcode":"N17","__v":0,"userName":"claws circle","password":"$2b$05$2.3R3gIiLY0.k3W2NyFU1eS0By2gEatUxvFNZ/hm6w.uLP4xynrZK"},{"_id":"5d43fed51d0825849c0f0b67","firstName":"Rosa","lastName":"Smith","address":"32 Walpole Road","city":"London","postcode":"N17","__v":0,"userName":"court nation","password":"$2b$05$N8m6IdK07d.ebxqkS2pvDuBAh8oVkeVblDr/D36u5GdK3eKa9OrWy"},{"_id":"5d42104a7979bd071c129604","firstName":"Dora","lastName":"Fitzgerald","address":"1300 Eknaw Path","city":"Evegirhe","postcode":"P8K 4T1","__v":0,"userName":"brass indeed","password":"$2b$05$CB4O9hzF7Wx.C..hActQoOzjIiFVcKK79h6zJutK1seHj13b9i/gq"},{"_id":"5d42104a7979bd071c129605","firstName":"Bryan","lastName":"Fitzgerald","address":"1050 Dedu Point","city":"Irhekde","postcode":"G1K 2N9","__v":0,"userName":"interior one","password":"$2b$05$u3S3FSfVetkUrYAbQgUTROLbk7l4Ez3Z6PcQlp1XRiPoy83ult.BW"},{"_id":"5d42104a7979bd071c129606","firstName":"Dale","lastName":"Fitzgerald","address":"560 Fibab Glen","city":"Hudmakap","postcode":"T9U 0N6","__v":0,"userName":"season carried","password":"$2b$05$d1NOjWSsLqvjssyI1LKaK.QcnofuAwjgIozR86Pn/p2ixA0CjVX06"},{"_id":"5d42104a7979bd071c129607","firstName":"Alma","lastName":"Fitzgerald","address":"1630 Zuas Place","city":"Caturaagu","postcode":"G9E 7N0","__v":0,"userName":"stay underline","password":"$2b$05$MqkYhqxPam.a2LuUB7J9l.nDih2DRRIYxGoxh4SLzKxvA7W7Ltmjm"},{"_id":"5d42104a7979bd071c129608","firstName":"Billy","lastName":"Fitzgerald","address":"1689 Hopge Square","city":"Vinpati","postcode":"C2O 6D1","__v":0,"userName":"end owner","password":"$2b$05$1ErQO/LyTVZzPqXy5fv2AOEQUBcw0cypVQffxXX7J/1qJphFckDbO"},{"_id":"5d42104a7979bd071c129609","firstName":"Adeline","lastName":"Fitzgerald","address":"1912 Dusved Ridge","city":"Atehasma","postcode":"N2D 7C3","__v":0,"userName":"column location","password":"$2b$05$BHvS9h08epkH8LL7CJ31HuCz09fYJ3DIv81w0BWZQu.mtoB0v7BV2"},{"_id":"5d42104a7979bd071c12960a","firstName":"Charlotte","lastName":"Fitzgerald","address":"611 Gumaf Way","city":"Kalover","postcode":"E4Y 2E7","__v":0,"userName":"action please","password":"$2b$05$8TrKFk/gSO241uG/4s6k.uJWi/0tc0KZPCoqbVryAfVu/7YfgDqvy"},{"_id":"5d42104a7979bd071c12960b","firstName":"Rodney","lastName":"Fitzgerald","address":"1961 Goku Heights","city":"Kivzupzi","postcode":"J5C 8H1","__v":0,"userName":"solution primitive","password":"$2b$05$ZQXo4wwzA.wzrGKY7/BM8uthaaoYXvkFx8HbbUDlPTwXMAGZOKsu."}]} \ No newline at end of file +{ + "cards": [ + { + "_id": "5d60727643805a36c4c71d11", + "title": "main until", + "boardId": "", + "status": "", + "owner": { + "_id": "5d42e5d5e1e3d731df26010a", + "firstName": "Andrew", + "lastName": "Smith", + "address": "32 Walpole Road", + "city": "London", + "postcode": "N17", + "__v": 0 + } + }, + { + "_id": "5d6072760a36855fc69a385d", + "title": "worry know", + "boardId": "", + "status": "", + "owner": { + "_id": "5d42e5d5e1e3d731df26010a", + "firstName": "Andrew", + "lastName": "Smith", + "address": "32 Walpole Road", + "city": "London", + "postcode": "N17", + "__v": 0 + } + }, + { + "_id": "5d60727602117c1e63eaaf33", + "title": "empty fog", + "boardId": "", + "status": "", + "owner": { + "_id": "5d42e5d5e1e3d731df26010a", + "firstName": "Andrew", + "lastName": "Smith", + "address": "32 Walpole Road", + "city": "London", + "postcode": "N17", + "__v": 0 + } + }, + { + "_id": "5d6072760c989fa581296e02", + "title": "taste become", + "boardId": "", + "status": "", + "owner": { + "_id": "5d42104a7979bd071c129604", + "firstName": "Dora", + "lastName": "Fitzgerald", + "address": "1300 Eknaw Path", + "city": "Evegirhe", + "postcode": "P8K 4T1", + "__v": 0 + } + }, + { + "_id": "5d6072763a5e8a7c5838ccfc", + "title": "clean hurry", + "boardId": "", + "status": "", + "owner": { + "_id": "5d42104a7979bd071c129604", + "firstName": "Dora", + "lastName": "Fitzgerald", + "address": "1300 Eknaw Path", + "city": "Evegirhe", + "postcode": "P8K 4T1", + "__v": 0 + } + }, + { + "_id": "5d6072761396a6b379fa5c3a", + "title": "class invented", + "boardId": "", + "status": "", + "owner": { + "_id": "5d42104a7979bd071c129604", + "firstName": "Dora", + "lastName": "Fitzgerald", + "address": "1300 Eknaw Path", + "city": "Evegirhe", + "postcode": "P8K 4T1", + "__v": 0 + } + }, + { + "_id": "5d607276ba59ac18120faf88", + "title": "care respect", + "boardId": "", + "status": "", + "owner": { + "_id": "5d42104a7979bd071c12960b", + "firstName": "Rodney", + "lastName": "Fitzgerald", + "address": "1961 Goku Heights", + "city": "Kivzupzi", + "postcode": "J5C 8H1", + "__v": 0 + } + }, + { + "_id": "5d60727626e6e7175e135164", + "title": "stone enough", + "boardId": "", + "status": "", + "owner": { + "_id": "5d42104a7979bd071c12960b", + "firstName": "Rodney", + "lastName": "Fitzgerald", + "address": "1961 Goku Heights", + "city": "Kivzupzi", + "postcode": "J5C 8H1", + "__v": 0 + } + }, + { + "_id": "5d607276ba76a9f8094409f0", + "title": "visit gulf", + "boardId": "", + "status": "", + "owner": { + "_id": "5d42104a7979bd071c12960b", + "firstName": "Rodney", + "lastName": "Fitzgerald", + "address": "1961 Goku Heights", + "city": "Kivzupzi", + "postcode": "J5C 8H1", + "__v": 0 + } + }, + { + "_id": "5d607276f683aa17684f4288", + "title": "air running", + "boardId": "", + "status": "", + "owner": { + "_id": "5d42104a7979bd071c12960b", + "firstName": "Rodney", + "lastName": "Fitzgerald", + "address": "1961 Goku Heights", + "city": "Kivzupzi", + "postcode": "J5C 8H1", + "__v": 0 + } + } + ], + "users": [ + { + "_id": "5d42e5d5e1e3d731df26010a", + "firstName": "Andrew", + "lastName": "Smith", + "address": "32 Walpole Road", + "city": "London", + "postcode": "N17", + "__v": 0, + "userName": "claws circle", + "password": "$2b$05$2.3R3gIiLY0.k3W2NyFU1eS0By2gEatUxvFNZ/hm6w.uLP4xynrZK" + }, + { + "_id": "5d43fed51d0825849c0f0b67", + "firstName": "Rosa", + "lastName": "Smith", + "address": "32 Walpole Road", + "city": "London", + "postcode": "N17", + "__v": 0, + "userName": "court nation", + "password": "$2b$05$N8m6IdK07d.ebxqkS2pvDuBAh8oVkeVblDr/D36u5GdK3eKa9OrWy" + }, + { + "_id": "5d42104a7979bd071c129604", + "firstName": "Dora", + "lastName": "Fitzgerald", + "address": "1300 Eknaw Path", + "city": "Evegirhe", + "postcode": "P8K 4T1", + "__v": 0, + "userName": "brass indeed", + "password": "$2b$05$CB4O9hzF7Wx.C..hActQoOzjIiFVcKK79h6zJutK1seHj13b9i/gq" + }, + { + "_id": "5d42104a7979bd071c129605", + "firstName": "Bryan", + "lastName": "Fitzgerald", + "address": "1050 Dedu Point", + "city": "Irhekde", + "postcode": "G1K 2N9", + "__v": 0, + "userName": "interior one", + "password": "$2b$05$u3S3FSfVetkUrYAbQgUTROLbk7l4Ez3Z6PcQlp1XRiPoy83ult.BW" + }, + { + "_id": "5d42104a7979bd071c129606", + "firstName": "Dale", + "lastName": "Fitzgerald", + "address": "560 Fibab Glen", + "city": "Hudmakap", + "postcode": "T9U 0N6", + "__v": 0, + "userName": "season carried", + "password": "$2b$05$d1NOjWSsLqvjssyI1LKaK.QcnofuAwjgIozR86Pn/p2ixA0CjVX06" + }, + { + "_id": "5d42104a7979bd071c129607", + "firstName": "Alma", + "lastName": "Fitzgerald", + "address": "1630 Zuas Place", + "city": "Caturaagu", + "postcode": "G9E 7N0", + "__v": 0, + "userName": "stay underline", + "password": "$2b$05$MqkYhqxPam.a2LuUB7J9l.nDih2DRRIYxGoxh4SLzKxvA7W7Ltmjm" + }, + { + "_id": "5d42104a7979bd071c129608", + "firstName": "Billy", + "lastName": "Fitzgerald", + "address": "1689 Hopge Square", + "city": "Vinpati", + "postcode": "C2O 6D1", + "__v": 0, + "userName": "end owner", + "password": "$2b$05$1ErQO/LyTVZzPqXy5fv2AOEQUBcw0cypVQffxXX7J/1qJphFckDbO" + }, + { + "_id": "5d42104a7979bd071c129609", + "firstName": "Adeline", + "lastName": "Fitzgerald", + "address": "1912 Dusved Ridge", + "city": "Atehasma", + "postcode": "N2D 7C3", + "__v": 0, + "userName": "column location", + "password": "$2b$05$BHvS9h08epkH8LL7CJ31HuCz09fYJ3DIv81w0BWZQu.mtoB0v7BV2" + }, + { + "_id": "5d42104a7979bd071c12960a", + "firstName": "Charlotte", + "lastName": "Fitzgerald", + "address": "611 Gumaf Way", + "city": "Kalover", + "postcode": "E4Y 2E7", + "__v": 0, + "userName": "action please", + "password": "$2b$05$8TrKFk/gSO241uG/4s6k.uJWi/0tc0KZPCoqbVryAfVu/7YfgDqvy" + }, + { + "_id": "5d42104a7979bd071c12960b", + "firstName": "Rodney", + "lastName": "Fitzgerald", + "address": "1961 Goku Heights", + "city": "Kivzupzi", + "postcode": "J5C 8H1", + "__v": 0, + "userName": "solution primitive", + "password": "$2b$05$ZQXo4wwzA.wzrGKY7/BM8uthaaoYXvkFx8HbbUDlPTwXMAGZOKsu." + } + ] +} \ No newline at end of file From 91f02f78ab0feb67850d36ece06f83f6522d364f Mon Sep 17 00:00:00 2001 From: Andrew Smith Date: Wed, 28 Aug 2019 18:07:10 +0100 Subject: [PATCH 14/24] feature #12: Add Material-ui container to wrap app --- src/components/App.js | 5 +- src/tools/db.json | 267 +----------------------------------------- 2 files changed, 4 insertions(+), 268 deletions(-) diff --git a/src/components/App.js b/src/components/App.js index fc44301..ca430c1 100644 --- a/src/components/App.js +++ b/src/components/App.js @@ -3,13 +3,14 @@ import Header from "./common/Header"; import Routes from "./common/Routes"; import { ToastContainer } from "react-toastify"; import "react-toastify/dist/ReactToastify.css"; +import Container from "@material-ui/core/Container"; const App = () => ( -
+
-
+ ); export default App; diff --git a/src/tools/db.json b/src/tools/db.json index 09e29b7..f9395de 100644 --- a/src/tools/db.json +++ b/src/tools/db.json @@ -1,266 +1 @@ -{ - "cards": [ - { - "_id": "5d60727643805a36c4c71d11", - "title": "main until", - "boardId": "", - "status": "", - "owner": { - "_id": "5d42e5d5e1e3d731df26010a", - "firstName": "Andrew", - "lastName": "Smith", - "address": "32 Walpole Road", - "city": "London", - "postcode": "N17", - "__v": 0 - } - }, - { - "_id": "5d6072760a36855fc69a385d", - "title": "worry know", - "boardId": "", - "status": "", - "owner": { - "_id": "5d42e5d5e1e3d731df26010a", - "firstName": "Andrew", - "lastName": "Smith", - "address": "32 Walpole Road", - "city": "London", - "postcode": "N17", - "__v": 0 - } - }, - { - "_id": "5d60727602117c1e63eaaf33", - "title": "empty fog", - "boardId": "", - "status": "", - "owner": { - "_id": "5d42e5d5e1e3d731df26010a", - "firstName": "Andrew", - "lastName": "Smith", - "address": "32 Walpole Road", - "city": "London", - "postcode": "N17", - "__v": 0 - } - }, - { - "_id": "5d6072760c989fa581296e02", - "title": "taste become", - "boardId": "", - "status": "", - "owner": { - "_id": "5d42104a7979bd071c129604", - "firstName": "Dora", - "lastName": "Fitzgerald", - "address": "1300 Eknaw Path", - "city": "Evegirhe", - "postcode": "P8K 4T1", - "__v": 0 - } - }, - { - "_id": "5d6072763a5e8a7c5838ccfc", - "title": "clean hurry", - "boardId": "", - "status": "", - "owner": { - "_id": "5d42104a7979bd071c129604", - "firstName": "Dora", - "lastName": "Fitzgerald", - "address": "1300 Eknaw Path", - "city": "Evegirhe", - "postcode": "P8K 4T1", - "__v": 0 - } - }, - { - "_id": "5d6072761396a6b379fa5c3a", - "title": "class invented", - "boardId": "", - "status": "", - "owner": { - "_id": "5d42104a7979bd071c129604", - "firstName": "Dora", - "lastName": "Fitzgerald", - "address": "1300 Eknaw Path", - "city": "Evegirhe", - "postcode": "P8K 4T1", - "__v": 0 - } - }, - { - "_id": "5d607276ba59ac18120faf88", - "title": "care respect", - "boardId": "", - "status": "", - "owner": { - "_id": "5d42104a7979bd071c12960b", - "firstName": "Rodney", - "lastName": "Fitzgerald", - "address": "1961 Goku Heights", - "city": "Kivzupzi", - "postcode": "J5C 8H1", - "__v": 0 - } - }, - { - "_id": "5d60727626e6e7175e135164", - "title": "stone enough", - "boardId": "", - "status": "", - "owner": { - "_id": "5d42104a7979bd071c12960b", - "firstName": "Rodney", - "lastName": "Fitzgerald", - "address": "1961 Goku Heights", - "city": "Kivzupzi", - "postcode": "J5C 8H1", - "__v": 0 - } - }, - { - "_id": "5d607276ba76a9f8094409f0", - "title": "visit gulf", - "boardId": "", - "status": "", - "owner": { - "_id": "5d42104a7979bd071c12960b", - "firstName": "Rodney", - "lastName": "Fitzgerald", - "address": "1961 Goku Heights", - "city": "Kivzupzi", - "postcode": "J5C 8H1", - "__v": 0 - } - }, - { - "_id": "5d607276f683aa17684f4288", - "title": "air running", - "boardId": "", - "status": "", - "owner": { - "_id": "5d42104a7979bd071c12960b", - "firstName": "Rodney", - "lastName": "Fitzgerald", - "address": "1961 Goku Heights", - "city": "Kivzupzi", - "postcode": "J5C 8H1", - "__v": 0 - } - } - ], - "users": [ - { - "_id": "5d42e5d5e1e3d731df26010a", - "firstName": "Andrew", - "lastName": "Smith", - "address": "32 Walpole Road", - "city": "London", - "postcode": "N17", - "__v": 0, - "userName": "claws circle", - "password": "$2b$05$2.3R3gIiLY0.k3W2NyFU1eS0By2gEatUxvFNZ/hm6w.uLP4xynrZK" - }, - { - "_id": "5d43fed51d0825849c0f0b67", - "firstName": "Rosa", - "lastName": "Smith", - "address": "32 Walpole Road", - "city": "London", - "postcode": "N17", - "__v": 0, - "userName": "court nation", - "password": "$2b$05$N8m6IdK07d.ebxqkS2pvDuBAh8oVkeVblDr/D36u5GdK3eKa9OrWy" - }, - { - "_id": "5d42104a7979bd071c129604", - "firstName": "Dora", - "lastName": "Fitzgerald", - "address": "1300 Eknaw Path", - "city": "Evegirhe", - "postcode": "P8K 4T1", - "__v": 0, - "userName": "brass indeed", - "password": "$2b$05$CB4O9hzF7Wx.C..hActQoOzjIiFVcKK79h6zJutK1seHj13b9i/gq" - }, - { - "_id": "5d42104a7979bd071c129605", - "firstName": "Bryan", - "lastName": "Fitzgerald", - "address": "1050 Dedu Point", - "city": "Irhekde", - "postcode": "G1K 2N9", - "__v": 0, - "userName": "interior one", - "password": "$2b$05$u3S3FSfVetkUrYAbQgUTROLbk7l4Ez3Z6PcQlp1XRiPoy83ult.BW" - }, - { - "_id": "5d42104a7979bd071c129606", - "firstName": "Dale", - "lastName": "Fitzgerald", - "address": "560 Fibab Glen", - "city": "Hudmakap", - "postcode": "T9U 0N6", - "__v": 0, - "userName": "season carried", - "password": "$2b$05$d1NOjWSsLqvjssyI1LKaK.QcnofuAwjgIozR86Pn/p2ixA0CjVX06" - }, - { - "_id": "5d42104a7979bd071c129607", - "firstName": "Alma", - "lastName": "Fitzgerald", - "address": "1630 Zuas Place", - "city": "Caturaagu", - "postcode": "G9E 7N0", - "__v": 0, - "userName": "stay underline", - "password": "$2b$05$MqkYhqxPam.a2LuUB7J9l.nDih2DRRIYxGoxh4SLzKxvA7W7Ltmjm" - }, - { - "_id": "5d42104a7979bd071c129608", - "firstName": "Billy", - "lastName": "Fitzgerald", - "address": "1689 Hopge Square", - "city": "Vinpati", - "postcode": "C2O 6D1", - "__v": 0, - "userName": "end owner", - "password": "$2b$05$1ErQO/LyTVZzPqXy5fv2AOEQUBcw0cypVQffxXX7J/1qJphFckDbO" - }, - { - "_id": "5d42104a7979bd071c129609", - "firstName": "Adeline", - "lastName": "Fitzgerald", - "address": "1912 Dusved Ridge", - "city": "Atehasma", - "postcode": "N2D 7C3", - "__v": 0, - "userName": "column location", - "password": "$2b$05$BHvS9h08epkH8LL7CJ31HuCz09fYJ3DIv81w0BWZQu.mtoB0v7BV2" - }, - { - "_id": "5d42104a7979bd071c12960a", - "firstName": "Charlotte", - "lastName": "Fitzgerald", - "address": "611 Gumaf Way", - "city": "Kalover", - "postcode": "E4Y 2E7", - "__v": 0, - "userName": "action please", - "password": "$2b$05$8TrKFk/gSO241uG/4s6k.uJWi/0tc0KZPCoqbVryAfVu/7YfgDqvy" - }, - { - "_id": "5d42104a7979bd071c12960b", - "firstName": "Rodney", - "lastName": "Fitzgerald", - "address": "1961 Goku Heights", - "city": "Kivzupzi", - "postcode": "J5C 8H1", - "__v": 0, - "userName": "solution primitive", - "password": "$2b$05$ZQXo4wwzA.wzrGKY7/BM8uthaaoYXvkFx8HbbUDlPTwXMAGZOKsu." - } - ] -} \ No newline at end of file +{"cards":[{"_id":"5d60727643805a36c4c71d11","title":"main until","boardId":"","status":"","owner":{"_id":"5d42e5d5e1e3d731df26010a","firstName":"Andrew","lastName":"Smith","address":"32 Walpole Road","city":"London","postcode":"N17","__v":0}},{"_id":"5d6072760a36855fc69a385d","title":"worry know","boardId":"","status":"","owner":{"_id":"5d42e5d5e1e3d731df26010a","firstName":"Andrew","lastName":"Smith","address":"32 Walpole Road","city":"London","postcode":"N17","__v":0}},{"_id":"5d60727602117c1e63eaaf33","title":"empty fog","boardId":"","status":"","owner":{"_id":"5d42e5d5e1e3d731df26010a","firstName":"Andrew","lastName":"Smith","address":"32 Walpole Road","city":"London","postcode":"N17","__v":0}},{"_id":"5d6072760c989fa581296e02","title":"taste become","boardId":"","status":"","owner":{"_id":"5d42104a7979bd071c129604","firstName":"Dora","lastName":"Fitzgerald","address":"1300 Eknaw Path","city":"Evegirhe","postcode":"P8K 4T1","__v":0}},{"_id":"5d6072763a5e8a7c5838ccfc","title":"clean hurry","boardId":"","status":"","owner":{"_id":"5d42104a7979bd071c129604","firstName":"Dora","lastName":"Fitzgerald","address":"1300 Eknaw Path","city":"Evegirhe","postcode":"P8K 4T1","__v":0}},{"_id":"5d6072761396a6b379fa5c3a","title":"class invented","boardId":"","status":"","owner":{"_id":"5d42104a7979bd071c129604","firstName":"Dora","lastName":"Fitzgerald","address":"1300 Eknaw Path","city":"Evegirhe","postcode":"P8K 4T1","__v":0}},{"_id":"5d607276ba59ac18120faf88","title":"care respect","boardId":"","status":"","owner":{"_id":"5d42104a7979bd071c12960b","firstName":"Rodney","lastName":"Fitzgerald","address":"1961 Goku Heights","city":"Kivzupzi","postcode":"J5C 8H1","__v":0}},{"_id":"5d60727626e6e7175e135164","title":"stone enough","boardId":"","status":"","owner":{"_id":"5d42104a7979bd071c12960b","firstName":"Rodney","lastName":"Fitzgerald","address":"1961 Goku Heights","city":"Kivzupzi","postcode":"J5C 8H1","__v":0}},{"_id":"5d607276ba76a9f8094409f0","title":"visit gulf","boardId":"","status":"","owner":{"_id":"5d42104a7979bd071c12960b","firstName":"Rodney","lastName":"Fitzgerald","address":"1961 Goku Heights","city":"Kivzupzi","postcode":"J5C 8H1","__v":0}},{"_id":"5d607276f683aa17684f4288","title":"air running","boardId":"","status":"","owner":{"_id":"5d42104a7979bd071c12960b","firstName":"Rodney","lastName":"Fitzgerald","address":"1961 Goku Heights","city":"Kivzupzi","postcode":"J5C 8H1","__v":0}}],"users":[{"_id":"5d42e5d5e1e3d731df26010a","firstName":"Andrew","lastName":"Smith","address":"32 Walpole Road","city":"London","postcode":"N17","__v":0,"userName":"claws circle","password":"$2b$05$2.3R3gIiLY0.k3W2NyFU1eS0By2gEatUxvFNZ/hm6w.uLP4xynrZK"},{"_id":"5d43fed51d0825849c0f0b67","firstName":"Rosa","lastName":"Smith","address":"32 Walpole Road","city":"London","postcode":"N17","__v":0,"userName":"court nation","password":"$2b$05$N8m6IdK07d.ebxqkS2pvDuBAh8oVkeVblDr/D36u5GdK3eKa9OrWy"},{"_id":"5d42104a7979bd071c129604","firstName":"Dora","lastName":"Fitzgerald","address":"1300 Eknaw Path","city":"Evegirhe","postcode":"P8K 4T1","__v":0,"userName":"brass indeed","password":"$2b$05$CB4O9hzF7Wx.C..hActQoOzjIiFVcKK79h6zJutK1seHj13b9i/gq"},{"_id":"5d42104a7979bd071c129605","firstName":"Bryan","lastName":"Fitzgerald","address":"1050 Dedu Point","city":"Irhekde","postcode":"G1K 2N9","__v":0,"userName":"interior one","password":"$2b$05$u3S3FSfVetkUrYAbQgUTROLbk7l4Ez3Z6PcQlp1XRiPoy83ult.BW"},{"_id":"5d42104a7979bd071c129606","firstName":"Dale","lastName":"Fitzgerald","address":"560 Fibab Glen","city":"Hudmakap","postcode":"T9U 0N6","__v":0,"userName":"season carried","password":"$2b$05$d1NOjWSsLqvjssyI1LKaK.QcnofuAwjgIozR86Pn/p2ixA0CjVX06"},{"_id":"5d42104a7979bd071c129607","firstName":"Alma","lastName":"Fitzgerald","address":"1630 Zuas Place","city":"Caturaagu","postcode":"G9E 7N0","__v":0,"userName":"stay underline","password":"$2b$05$MqkYhqxPam.a2LuUB7J9l.nDih2DRRIYxGoxh4SLzKxvA7W7Ltmjm"},{"_id":"5d42104a7979bd071c129608","firstName":"Billy","lastName":"Fitzgerald","address":"1689 Hopge Square","city":"Vinpati","postcode":"C2O 6D1","__v":0,"userName":"end owner","password":"$2b$05$1ErQO/LyTVZzPqXy5fv2AOEQUBcw0cypVQffxXX7J/1qJphFckDbO"},{"_id":"5d42104a7979bd071c129609","firstName":"Adeline","lastName":"Fitzgerald","address":"1912 Dusved Ridge","city":"Atehasma","postcode":"N2D 7C3","__v":0,"userName":"column location","password":"$2b$05$BHvS9h08epkH8LL7CJ31HuCz09fYJ3DIv81w0BWZQu.mtoB0v7BV2"},{"_id":"5d42104a7979bd071c12960a","firstName":"Charlotte","lastName":"Fitzgerald","address":"611 Gumaf Way","city":"Kalover","postcode":"E4Y 2E7","__v":0,"userName":"action please","password":"$2b$05$8TrKFk/gSO241uG/4s6k.uJWi/0tc0KZPCoqbVryAfVu/7YfgDqvy"},{"_id":"5d42104a7979bd071c12960b","firstName":"Rodney","lastName":"Fitzgerald","address":"1961 Goku Heights","city":"Kivzupzi","postcode":"J5C 8H1","__v":0,"userName":"solution primitive","password":"$2b$05$ZQXo4wwzA.wzrGKY7/BM8uthaaoYXvkFx8HbbUDlPTwXMAGZOKsu."}]} \ No newline at end of file From a896949bc5f64652b285fdcf822233232b1e0549 Mon Sep 17 00:00:00 2001 From: Andrew Smith Date: Wed, 28 Aug 2019 18:09:52 +0100 Subject: [PATCH 15/24] feature #12: Add Material-ui button to Users page --- src/components/users/UsersPage.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/components/users/UsersPage.js b/src/components/users/UsersPage.js index 3eadf09..05daee0 100644 --- a/src/components/users/UsersPage.js +++ b/src/components/users/UsersPage.js @@ -7,6 +7,7 @@ import * as userActions from "../../redux/actions/userActions"; import { Redirect } from "react-router-dom"; import Loader from "../common/Loader"; import { toast } from "react-toastify"; +import Button from "@material-ui/core/Button"; class UsersPage extends React.Component { constructor(props) { @@ -36,12 +37,13 @@ class UsersPage extends React.Component { ) : ( <> - + Date: Wed, 28 Aug 2019 23:51:11 +0100 Subject: [PATCH 16/24] feature #12: Initial set up for auth --- src/api/authApi.js | 12 ++++ src/components/auth/LoginForm.js | 50 +++++++++++++++ src/components/auth/LoginPage.js | 84 +++++++++++++++++++++++++ src/components/auth/RegistrationForm.js | 30 +++++++++ src/components/auth/RegistrationPage.js | 20 ++++++ src/components/common/Routes.js | 2 + src/components/common/TextInput.js | 13 +++- src/components/users/UserForm.js | 5 ++ src/redux/actions/actionTypes.js | 6 ++ src/redux/actions/authActions.js | 17 +++++ 10 files changed, 237 insertions(+), 2 deletions(-) create mode 100644 src/api/authApi.js create mode 100644 src/components/auth/LoginForm.js create mode 100644 src/components/auth/LoginPage.js create mode 100644 src/components/auth/RegistrationForm.js create mode 100644 src/components/auth/RegistrationPage.js create mode 100644 src/redux/actions/authActions.js diff --git a/src/api/authApi.js b/src/api/authApi.js new file mode 100644 index 0000000..2c1e7f3 --- /dev/null +++ b/src/api/authApi.js @@ -0,0 +1,12 @@ +import { handleResponse, handleError } from "./apiUtils"; +const baseUrl = process.env.REACT_APP_API_URL + "/api/auth/"; + +export function login(userName, password) { + const requestOptions = { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ userName, password }) + }; + + return fetch(requestOptions); +} diff --git a/src/components/auth/LoginForm.js b/src/components/auth/LoginForm.js new file mode 100644 index 0000000..62a4931 --- /dev/null +++ b/src/components/auth/LoginForm.js @@ -0,0 +1,50 @@ +import React from "react"; +import { Card } from "@material-ui/core"; +import TextInput from "../common/TextInput"; + +const LoginForm = ({ onChange, onSave, errors, user }) => ( + +
+

Registration

+ {errors.summary &&

{errors.summary}

} + + + + + + + + + +
+); + +export default LoginForm; diff --git a/src/components/auth/LoginPage.js b/src/components/auth/LoginPage.js new file mode 100644 index 0000000..63a665f --- /dev/null +++ b/src/components/auth/LoginPage.js @@ -0,0 +1,84 @@ +import React, { Component } from "react"; +import PropTypes from "prop-types"; +import LoginForm from "./LoginForm"; +import { connect } from "react-redux"; +import { bindActionCreators } from "redux"; +import * as authActions from "../../redux/actions/authActions"; + +class LoginPage extends Component { + constructor(props, context) { + super(props, context); + + this.state = { + user: {}, + errors: {}, + saving: false + }; + + this.handleChange = this.handleChange.bind(this); + this.handleSave = this.handleSave.bind(this); + } + + formIsValid() { + const { firstName, lastName, userName, password } = this.state.user; + const errors = {}; + + if (!firstName) errors.firstName = "First name is required"; + if (!lastName) errors.lastName = "Last name is required"; + if (!userName) errors.userName = "User name is required"; + + this.setState({ errors: errors }); + return Object.keys(errors).length === 0; + } + + handleChange(event) { + const { name, value } = event.target; + let user = Object.assign({}, this.state.user); + user[name] = value; + this.setState({ user: user }); + } + + handleSave(event) { + event.preventDefault(); + if (!this.formIsValid()) return; + this.setState({ saving: true }); + this.props.actions + .saveUser(this.state.user) + .then(() => { + toast.success("User saved"); + this.props.history.push("/users"); + }) + .catch(error => { + this.setState({ + errors: { + onSave: error.message + }, + saving: false + }); + }); + } + + render() { + return ( +
+ +
+ ); + } +} +function mapStateToProps(state) { + return {}; +} + +const mapDispatchToProps = dispatch => ({ + actions: bindActionCreators(authActions, dispatch) +}); + +LoginPage.propTypes = { + actions: PropTypes.object.isRequired +}; + +export default connect( + mapStateToProps, + mapDispatchToProps +)(LoginPage); diff --git a/src/components/auth/RegistrationForm.js b/src/components/auth/RegistrationForm.js new file mode 100644 index 0000000..cbdf0f3 --- /dev/null +++ b/src/components/auth/RegistrationForm.js @@ -0,0 +1,30 @@ +import React from "react"; +import { Card } from "@material-ui/core"; +import TextInput from "../common/TextInput"; + +const RegistrationForm = ({ onChange, onSave, errors, user }) => ( + +
+

Registration

+ {errors.summary &&

{errors.summary}

} + + + + + +
+); + +export default RegistrationForm; diff --git a/src/components/auth/RegistrationPage.js b/src/components/auth/RegistrationPage.js new file mode 100644 index 0000000..e7ea583 --- /dev/null +++ b/src/components/auth/RegistrationPage.js @@ -0,0 +1,20 @@ +import React, { Component } from "react"; +import { connect } from "react-redux"; + +class RegistrationPage extends Component { + render() { + return
; + } +} +function mapStateToProps(state) { + return {}; +} + +function mapDispatchToProps(dispatch) { + return {}; +} + +export default connect( + mapStateToProps, + mapDispatchToProps +)(RegistrationPage); diff --git a/src/components/common/Routes.js b/src/components/common/Routes.js index ef6e0e8..765f0d0 100644 --- a/src/components/common/Routes.js +++ b/src/components/common/Routes.js @@ -4,12 +4,14 @@ import AboutPage from "../about/AboutPage"; import HomePage from "../home/HomePage"; import UsersPage from "../users/UsersPage"; import { default as ManageUserPage } from "../users/ManageUserPage"; +import RegistrationForm from "../auth/RegistrationForm"; class Routes extends React.Component { render() { return ( + diff --git a/src/components/common/TextInput.js b/src/components/common/TextInput.js index 83af4ba..7904917 100644 --- a/src/components/common/TextInput.js +++ b/src/components/common/TextInput.js @@ -1,7 +1,15 @@ import React from "react"; import PropTypes from "prop-types"; -const TextInput = ({ name, label, onChange, placeholder, value, error }) => { +const TextInput = ({ + name, + type, + label, + onChange, + placeholder, + value, + error +}) => { let wrapperClass = "form-group"; if (error && error.length > 0) { wrapperClass += "has-error"; @@ -12,7 +20,7 @@ const TextInput = ({ name, label, onChange, placeholder, value, error }) => {
{ TextInput.propTypes = { name: PropTypes.string.isRequired, + type: PropTypes.string.isRequired, label: PropTypes.string.isRequired, onChange: PropTypes.func.isRequired, placeholder: PropTypes.string, diff --git a/src/components/users/UserForm.js b/src/components/users/UserForm.js index 83bf19e..219b2e5 100644 --- a/src/components/users/UserForm.js +++ b/src/components/users/UserForm.js @@ -14,6 +14,7 @@ const UserForm = ({ user, onChange, onSave, saving = false, errors = {} }) => { )} { { { { Date: Thu, 29 Aug 2019 10:14:52 +0100 Subject: [PATCH 17/24] feature #12: Add login to User Api --- src/api/authApi copy.js | 12 ++++++++++++ src/api/userApi.js | 15 +++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 src/api/authApi copy.js diff --git a/src/api/authApi copy.js b/src/api/authApi copy.js new file mode 100644 index 0000000..2c1e7f3 --- /dev/null +++ b/src/api/authApi copy.js @@ -0,0 +1,12 @@ +import { handleResponse, handleError } from "./apiUtils"; +const baseUrl = process.env.REACT_APP_API_URL + "/api/auth/"; + +export function login(userName, password) { + const requestOptions = { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ userName, password }) + }; + + return fetch(requestOptions); +} diff --git a/src/api/userApi.js b/src/api/userApi.js index 0ba7b93..2145062 100755 --- a/src/api/userApi.js +++ b/src/api/userApi.js @@ -13,6 +13,21 @@ export function getOneUser(userId) { .catch(handleError); } +export function login(userName, password) { + const requestOptions = { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ userName, password }) + }; + + return fetch(baseUrl + "/authenticate", requestOptions) + .then(handleResponse) + .then(user => { + localStorage.setItem("trelloid_jwt_token", JSON.stringify(user.token)); + }) + .catch(handleError); +} + export function saveUser(user) { return fetch(baseUrl + (user._id || ""), { method: user._id ? "PUT" : "POST", From f6b2d2b34d7fc33a3f06f30972fa32d5fcc305c3 Mon Sep 17 00:00:00 2001 From: Andrew Smith Date: Thu, 29 Aug 2019 11:03:26 +0100 Subject: [PATCH 18/24] feature #12: Return token from authenticate user --- package-lock.json | 94 +++++++++++++++++++++++++++++++- package.json | 1 + src/redux/actions/authActions.js | 4 ++ src/tools/apiServer.js | 38 +++++++++++++ 4 files changed, 135 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 91c5a49..b4a23a2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2846,6 +2846,11 @@ "ieee754": "^1.1.4" } }, + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" + }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", @@ -4815,6 +4820,14 @@ "safer-buffer": "^2.1.0" } }, + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -8841,6 +8854,35 @@ "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" }, + "jsonwebtoken": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", + "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", + "requires": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^5.6.0" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", @@ -8938,6 +8980,25 @@ "object.assign": "^4.1.0" } }, + "jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "requires": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, "killable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", @@ -9103,17 +9164,46 @@ "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" }, + "lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" + }, + "lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" + }, + "lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" + }, + "lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" + }, "lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", - "dev": true + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" }, "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" + }, "lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", diff --git a/package.json b/package.json index 1bb381b..c014c84 100644 --- a/package.json +++ b/package.json @@ -52,6 +52,7 @@ "jest-resolve": "24.8.0", "jest-watch-typeahead": "0.3.1", "jquery": "^3.4.1", + "jsonwebtoken": "^8.5.1", "mini-css-extract-plugin": "0.5.0", "optimize-css-assets-webpack-plugin": "5.0.3", "pnp-webpack-plugin": "1.5.0", diff --git a/src/redux/actions/authActions.js b/src/redux/actions/authActions.js index 569cdfe..b58fe28 100644 --- a/src/redux/actions/authActions.js +++ b/src/redux/actions/authActions.js @@ -15,3 +15,7 @@ export function loginSuccess(user) { export function logout(user) { return { type: actionTypes.LOGOUT, user: user }; } + +export function login(user) { + return; +} diff --git a/src/tools/apiServer.js b/src/tools/apiServer.js index 37e17c1..4d0880d 100755 --- a/src/tools/apiServer.js +++ b/src/tools/apiServer.js @@ -1,7 +1,12 @@ const jsonServer = require("json-server"); const server = jsonServer.create(); const path = require("path"); +const fs = require("fs"); +const jwt = require("jsonwebtoken"); const router = jsonServer.router(path.join(__dirname, "db.json")); +const users = JSON.parse( + fs.readFileSync(path.join(__dirname, "db.json"), "UTF-8") +).users; const ObjectId = require("bson").ObjectId; const middlewares = jsonServer.defaults(); @@ -31,6 +36,18 @@ server.post("/users/", function(req, res, next) { } }); +server.post("/users/authenticate", function(req, res, next) { + const { userName, password } = req.body; + if (isAuthenticated(userName, password) === false) { + const status = 401; + const message = "Incorrect email or password"; + res.status(status).json({ status, message }); + return; + } + const access_token = createToken({ userName, password }); + res.status(200).json({ access_token }); +}); + router.db._.id = "_id"; server.use("/api", router); @@ -52,3 +69,24 @@ function validateUser(user) { if (!user.postcode) return "Postcode is required."; return ""; } + +const SECRET_KEY = "123456789"; +const expiresIn = "1h"; + +function createToken(payload) { + return jwt.sign(payload, SECRET_KEY, { expiresIn }); +} + +function verifyToken(token) { + return jwt.verify(token, SECRET_KEY, (err, decode) => + decode !== undefined ? decode : err + ); +} + +function isAuthenticated(userName, password) { + return ( + users.findIndex( + user => user.userName === userName && user.password === password + ) !== -1 + ); +} From 3a2fba5a24960664034b3acf3749cb1b7af9c1e4 Mon Sep 17 00:00:00 2001 From: Andrew Smith Date: Thu, 29 Aug 2019 11:15:59 +0100 Subject: [PATCH 19/24] feature #12: Compare supplied password with hashed. --- src/tools/apiServer.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/tools/apiServer.js b/src/tools/apiServer.js index 4d0880d..e93bcad 100755 --- a/src/tools/apiServer.js +++ b/src/tools/apiServer.js @@ -3,6 +3,7 @@ const server = jsonServer.create(); const path = require("path"); const fs = require("fs"); const jwt = require("jsonwebtoken"); +const bcrypt = require("bcrypt"); const router = jsonServer.router(path.join(__dirname, "db.json")); const users = JSON.parse( fs.readFileSync(path.join(__dirname, "db.json"), "UTF-8") @@ -86,7 +87,9 @@ function verifyToken(token) { function isAuthenticated(userName, password) { return ( users.findIndex( - user => user.userName === userName && user.password === password + user => + user.userName === userName && + bcrypt.compareSync(password, user.password) ) !== -1 ); } From 070520f6f9047fceec26ef218ef07496a7a868e6 Mon Sep 17 00:00:00 2001 From: Andrew Smith Date: Thu, 29 Aug 2019 11:29:17 +0100 Subject: [PATCH 20/24] feature #12: API protected with Bearer token auth --- src/tools/apiServer.js | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/tools/apiServer.js b/src/tools/apiServer.js index e93bcad..b0dd7c6 100755 --- a/src/tools/apiServer.js +++ b/src/tools/apiServer.js @@ -37,7 +37,7 @@ server.post("/users/", function(req, res, next) { } }); -server.post("/users/authenticate", function(req, res, next) { +server.post("/auth/login", function(req, res, next) { const { userName, password } = req.body; if (isAuthenticated(userName, password) === false) { const status = 401; @@ -51,6 +51,26 @@ server.post("/users/authenticate", function(req, res, next) { router.db._.id = "_id"; +server.use(/^(?!\/auth).*$/, (req, res, next) => { + if ( + req.headers.authorization === undefined || + req.headers.authorization.split(" ")[0] !== "Bearer" + ) { + const status = 401; + const message = "Bad authorization header"; + res.status(status).json({ status, message }); + return; + } + try { + verifyToken(req.headers.authorization.split(" ")[1]); + next(); + } catch (err) { + const status = 401; + const message = "Error: access_token is not valid"; + res.status(status).json({ status, message }); + } +}); + server.use("/api", router); const port = 3001; From b55409cb482a3602e3666c2272062b72986613b7 Mon Sep 17 00:00:00 2001 From: Andrew Smith Date: Thu, 29 Aug 2019 13:20:43 +0100 Subject: [PATCH 21/24] feature #12: login functionality --- package.json | 1 + src/api/authApi copy.js | 12 ------------ src/api/authApi.js | 21 ++++++++++++++++++--- src/components/auth/LoginForm.js | 18 ------------------ src/components/auth/LoginPage.js | 18 +++++++++++------- src/redux/actions/actionTypes.js | 2 +- src/redux/actions/authActions.js | 26 +++++++++++++++++++++++--- src/redux/reducers/authReducer.js | 11 +++++++++++ src/redux/reducers/index.js | 2 ++ src/tools/apiServer.js | 18 +++++++++--------- src/tools/history.js | 3 +++ 11 files changed, 79 insertions(+), 53 deletions(-) delete mode 100644 src/api/authApi copy.js create mode 100644 src/redux/reducers/authReducer.js create mode 100644 src/tools/history.js diff --git a/package.json b/package.json index c014c84..ef645d6 100644 --- a/package.json +++ b/package.json @@ -43,6 +43,7 @@ "express": "^4.17.1", "file-loader": "3.0.1", "fs-extra": "7.0.1", + "history": "^4.9.0", "html-webpack-plugin": "4.0.0-beta.5", "identity-obj-proxy": "3.0.0", "immer": "^2.1.5", diff --git a/src/api/authApi copy.js b/src/api/authApi copy.js deleted file mode 100644 index 2c1e7f3..0000000 --- a/src/api/authApi copy.js +++ /dev/null @@ -1,12 +0,0 @@ -import { handleResponse, handleError } from "./apiUtils"; -const baseUrl = process.env.REACT_APP_API_URL + "/api/auth/"; - -export function login(userName, password) { - const requestOptions = { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ userName, password }) - }; - - return fetch(requestOptions); -} diff --git a/src/api/authApi.js b/src/api/authApi.js index 2c1e7f3..4c7ee6a 100644 --- a/src/api/authApi.js +++ b/src/api/authApi.js @@ -1,12 +1,27 @@ import { handleResponse, handleError } from "./apiUtils"; const baseUrl = process.env.REACT_APP_API_URL + "/api/auth/"; -export function login(userName, password) { +function login(username, password) { const requestOptions = { method: "POST", headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ userName, password }) + body: JSON.stringify({ username, password }) }; - return fetch(requestOptions); + return fetch(baseUrl + "/auth/login", requestOptions) + .then(handleResponse) + .then(token => { + localStorage.setItem("trelloid_token", JSON.stringify(token)); + return token; + }) + .catch(handleError); } + +function logout() { + localStorage.removeItem("user"); +} + +export const auth = { + login, + logout +}; diff --git a/src/components/auth/LoginForm.js b/src/components/auth/LoginForm.js index 62a4931..81aa83f 100644 --- a/src/components/auth/LoginForm.js +++ b/src/components/auth/LoginForm.js @@ -8,24 +8,6 @@ const LoginForm = ({ onChange, onSave, errors, user }) => (

Registration

{errors.summary &&

{errors.summary}

} - - - - { - toast.success("User saved"); - this.props.history.push("/users"); + this.props.history.push("/"); }) .catch(error => { this.setState({ @@ -61,7 +59,13 @@ class LoginPage extends Component { render() { return (
- +
); } diff --git a/src/redux/actions/actionTypes.js b/src/redux/actions/actionTypes.js index 87a0950..73df9b1 100644 --- a/src/redux/actions/actionTypes.js +++ b/src/redux/actions/actionTypes.js @@ -2,7 +2,7 @@ export const LOGIN_REQUEST = "LOGIN_REQUEST"; export const LOGIN_SUCCESS = "LOGIN_SUCCESS"; export const LOGIN_FAILURE = "LOGIN_FAILURE"; -export const LOGOUT = "LOGOUT"; +export const LOGOUT_SUCCESS = "LOGOUT_SUCCESS"; // Card actions. export const CREATE_CARD_SUCCESS = "CREATE_CARD_SUCCESS"; diff --git a/src/redux/actions/authActions.js b/src/redux/actions/authActions.js index b58fe28..a9639aa 100644 --- a/src/redux/actions/authActions.js +++ b/src/redux/actions/authActions.js @@ -1,4 +1,6 @@ import * as actionTypes from "./actionTypes"; +import { beginApiCall } from "./apiStatusActions"; +import * as authApi from "../../api/authApi"; export function loginFailure(user) { return { type: actionTypes.LOGIN_FAILURE, user: user }; @@ -12,10 +14,28 @@ export function loginSuccess(user) { return { type: actionTypes.LOGIN_SUCCESS, user: user }; } -export function logout(user) { - return { type: actionTypes.LOGOUT, user: user }; +export function logoutSuccess(user) { + return { type: actionTypes.LOGOUT_SUCCESS }; } export function login(user) { - return; + return function(dispatch) { + dispatch(beginApiCall()); + dispatch(loginRequest({ user })); + const { userName, password } = user; + return authApi + .login(userName, password) + .then(() => { + dispatch(loginSuccess(user)); + }) + .catch(err => { + dispatch(loginFailure(err)); + throw err; + }); + }; +} + +export function logout() { + localStorage.removeItem("trelloid_token"); + return logoutSuccess(); } diff --git a/src/redux/reducers/authReducer.js b/src/redux/reducers/authReducer.js new file mode 100644 index 0000000..3535e93 --- /dev/null +++ b/src/redux/reducers/authReducer.js @@ -0,0 +1,11 @@ +import * as actionTypes from "../actions/actionTypes"; +import initialState from "./initialState"; + +export default function authReducer(state = initialState.users, action) { + switch (action.type) { + case actionTypes.LOGIN_SUCCESS: + return action.user; + default: + return state; + } +} diff --git a/src/redux/reducers/index.js b/src/redux/reducers/index.js index e0c6ff5..2a89849 100644 --- a/src/redux/reducers/index.js +++ b/src/redux/reducers/index.js @@ -1,10 +1,12 @@ import { combineReducers } from "redux"; import apiCallsInProgress from "./apiStatusReducer"; +import auth from "./authReducer"; import cards from "./cardReducer"; import users from "./userReducer"; const rootReducer = combineReducers({ apiCallsInProgress, + auth, cards, users }); diff --git a/src/tools/apiServer.js b/src/tools/apiServer.js index b0dd7c6..ff091ef 100755 --- a/src/tools/apiServer.js +++ b/src/tools/apiServer.js @@ -39,14 +39,16 @@ server.post("/users/", function(req, res, next) { server.post("/auth/login", function(req, res, next) { const { userName, password } = req.body; - if (isAuthenticated(userName, password) === false) { + const user = isAuthenticated(userName, password); + if (user) { + const access_token = createToken({ userName, password }); + res.status(200).json({ access_token, user }); + } else { const status = 401; const message = "Incorrect email or password"; res.status(status).json({ status, message }); return; } - const access_token = createToken({ userName, password }); - res.status(200).json({ access_token }); }); router.db._.id = "_id"; @@ -105,11 +107,9 @@ function verifyToken(token) { } function isAuthenticated(userName, password) { - return ( - users.findIndex( - user => - user.userName === userName && - bcrypt.compareSync(password, user.password) - ) !== -1 + const user = users.filter( + user => + user.userName === userName && bcrypt.compareSync(password, user.password) ); + return user[0]; } diff --git a/src/tools/history.js b/src/tools/history.js new file mode 100644 index 0000000..7001cee --- /dev/null +++ b/src/tools/history.js @@ -0,0 +1,3 @@ +import { createBrowserHistory } from "history"; + +export const history = createBrowserHistory(); From 17189f286a9b48190cca2cf898a638abff8f48ee Mon Sep 17 00:00:00 2001 From: Andrew Smith Date: Thu, 29 Aug 2019 13:24:00 +0100 Subject: [PATCH 22/24] feature #12: Removed password from login user --- src/tools/apiServer.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/tools/apiServer.js b/src/tools/apiServer.js index ff091ef..c6ad4c1 100755 --- a/src/tools/apiServer.js +++ b/src/tools/apiServer.js @@ -110,6 +110,7 @@ function isAuthenticated(userName, password) { const user = users.filter( user => user.userName === userName && bcrypt.compareSync(password, user.password) - ); - return user[0]; + )[0]; + delete user.password; + return user; } From a92c9f0552aa716538bead122e0c1ccc535a2ea2 Mon Sep 17 00:00:00 2001 From: Andrew Smith Date: Thu, 29 Aug 2019 21:26:36 +0100 Subject: [PATCH 23/24] feature #12: Implement login --- package.json | 346 ++++++++++++++--------------- src/api/authApi.js | 10 +- src/components/auth/LoginForm.js | 8 +- src/components/common/Routes.js | 2 + src/components/common/TextInput.js | 2 +- src/index.js | 2 - src/redux/actions/authActions.js | 2 +- 7 files changed, 188 insertions(+), 184 deletions(-) diff --git a/package.json b/package.json index ef645d6..5f6254d 100644 --- a/package.json +++ b/package.json @@ -1,175 +1,175 @@ { - "name": "trelloid", - "description": "Kanban board front end app.", - "main": "server.js", - "scripts": { - "start": "run-p start:dev start:api", - "start:dev": "REACT_APP_ENV=development node scripts/start.js", - "prestart:api": "node src/tools/createMockDb.js", - "start:api": "node src/tools/apiServer.js", - "test": "node scripts/test.js", - "build": "node scripts/build.js", - "postinstall": "REACT_APP_ENV=production node scripts/build.js" - }, - "eslintConfig": { - "extends": "react-app" - }, - "dependencies": { - "@babel/core": "7.5.5", - "@material-ui/core": "^4.3.3", - "@material-ui/icons": "^4.2.1", - "@svgr/webpack": "4.3.2", - "@typescript-eslint/eslint-plugin": "1.13.0", - "@typescript-eslint/parser": "1.13.0", - "babel-eslint": "10.0.2", - "babel-jest": "^24.8.0", - "babel-loader": "8.0.6", - "babel-plugin-named-asset-import": "^0.3.3", - "babel-preset-react-app": "^9.0.1", - "bootstrap": "^4.3.1", - "bson": "^4.0.2", - "camelcase": "^5.2.0", - "case-sensitive-paths-webpack-plugin": "2.2.0", - "css-loader": "2.1.1", - "dotenv": "6.2.0", - "dotenv-expand": "4.2.0", - "eslint-config-react-app": "^5.0.1", - "eslint-loader": "2.2.1", - "eslint-plugin-flowtype": "3.13.0", - "eslint-plugin-import": "2.18.2", - "eslint-plugin-jsx-a11y": "6.2.3", - "eslint-plugin-react": "7.14.3", - "eslint-plugin-react-hooks": "^1.6.1", - "express": "^4.17.1", - "file-loader": "3.0.1", - "fs-extra": "7.0.1", - "history": "^4.9.0", - "html-webpack-plugin": "4.0.0-beta.5", - "identity-obj-proxy": "3.0.0", - "immer": "^2.1.5", - "is-wsl": "^1.1.0", - "jest": "24.8.0", - "jest-environment-jsdom-fourteen": "0.1.0", - "jest-resolve": "24.8.0", - "jest-watch-typeahead": "0.3.1", - "jquery": "^3.4.1", - "jsonwebtoken": "^8.5.1", - "mini-css-extract-plugin": "0.5.0", - "optimize-css-assets-webpack-plugin": "5.0.3", - "pnp-webpack-plugin": "1.5.0", - "popper.js": "^1.15.0", - "postcss-flexbugs-fixes": "4.1.0", - "postcss-loader": "3.0.0", - "postcss-normalize": "7.0.1", - "postcss-preset-env": "6.7.0", - "postcss-safe-parser": "4.0.1", - "prop-types": "^15.7.2", - "react": "^16.9.0", - "react-app-polyfill": "^1.0.2", - "react-dev-utils": "^9.0.3", - "react-dom": "^16.9.0", - "react-html-parser": "^2.0.2", - "react-redux": "^6.0.1", - "react-router-dom": "^5.0.1", - "react-toastify": "^4.5.2", - "redux": "^4.0.4", - "redux-thunk": "^2.3.0", - "remarkable": "^2.0.0", - "reselect": "^4.0.0", - "resolve": "1.12.0", - "resolve-url-loader": "3.1.0", - "sass-loader": "7.2.0", - "semver": "6.3.0", - "style-loader": "1.0.0", - "terser-webpack-plugin": "1.4.1", - "ts-pnp": "1.1.2", - "typescript": "^3.5.3", - "url-loader": "2.1.0", - "webpack": "4.39.1", - "webpack-dev-server": "3.2.1", - "webpack-manifest-plugin": "2.0.4", - "workbox-webpack-plugin": "4.3.1" - }, - "devDependencies": { - "bcrypt": "^3.0.6", - "cssnano": "^4.1.10", - "eslint": "^6.2.2", - "fetch-mock": "^7.3.9", - "json-server": "^0.14.2", - "node-fetch": "^2.3.0", - "npm-run-all": "^4.1.5", - "postcss-loader": "^3.0.0", - "random-words": "^1.1.0", - "redux-immutable-state-invariant": "^2.1.0", - "redux-mock-store": "^1.5.3", - "style-loader": "^0.23.1" - }, - "engines": { - "node": ">=8" - }, - "browserslist": { - "production": [ - ">0.2%", - "not dead", - "not op_mini all" - ], - "development": [ - "last 1 chrome version", - "last 1 firefox version", - "last 1 safari version" - ] - }, - "jest": { - "roots": [ - "/src" - ], - "collectCoverageFrom": [ - "src/**/*.{js,jsx,ts,tsx}", - "!src/**/*.d.ts" - ], - "setupFiles": [ - "react-app-polyfill/jsdom" - ], - "setupFilesAfterEnv": [], - "testMatch": [ - "/src/**/__tests__/**/*.{js,jsx,ts,tsx}", - "/src/**/*.{spec,test}.{js,jsx,ts,tsx}" - ], - "testEnvironment": "jest-environment-jsdom-fourteen", - "transform": { - "^.+\\.(js|jsx|ts|tsx)$": "/node_modules/babel-jest", - "^.+\\.css$": "/config/jest/cssTransform.js", - "^(?!.*\\.(js|jsx|ts|tsx|css|json)$)": "/config/jest/fileTransform.js" - }, - "transformIgnorePatterns": [ - "[/\\\\]node_modules[/\\\\].+\\.(js|jsx|ts|tsx)$", - "^.+\\.module\\.(css|sass|scss)$" - ], - "modulePaths": [], - "moduleNameMapper": { - "^react-native$": "react-native-web", - "^.+\\.module\\.(css|sass|scss)$": "identity-obj-proxy" - }, - "moduleFileExtensions": [ - "web.js", - "js", - "web.ts", - "ts", - "web.tsx", - "tsx", - "json", - "web.jsx", - "jsx", - "node" - ], - "watchPlugins": [ - "jest-watch-typeahead/filename", - "jest-watch-typeahead/testname" - ] - }, - "babel": { - "presets": [ - "react-app" - ] - } + "name": "trelloid", + "description": "Kanban board front end app.", + "main": "server.js", + "scripts": { + "start": "run-p start:dev start:api", + "start:dev": "REACT_APP_ENV=development node --inspect scripts/start.js", + "prestart:api": "node src/tools/createMockDb.js", + "start:api": "node src/tools/apiServer.js", + "test": "node scripts/test.js", + "build": "node scripts/build.js", + "postinstall": "REACT_APP_ENV=production node scripts/build.js" + }, + "eslintConfig": { + "extends": "react-app" + }, + "dependencies": { + "@babel/core": "7.5.5", + "@material-ui/core": "^4.3.3", + "@material-ui/icons": "^4.2.1", + "@svgr/webpack": "4.3.2", + "@typescript-eslint/eslint-plugin": "1.13.0", + "@typescript-eslint/parser": "1.13.0", + "babel-eslint": "10.0.2", + "babel-jest": "^24.8.0", + "babel-loader": "8.0.6", + "babel-plugin-named-asset-import": "^0.3.3", + "babel-preset-react-app": "^9.0.1", + "bootstrap": "^4.3.1", + "bson": "^4.0.2", + "camelcase": "^5.2.0", + "case-sensitive-paths-webpack-plugin": "2.2.0", + "css-loader": "2.1.1", + "dotenv": "6.2.0", + "dotenv-expand": "4.2.0", + "eslint-config-react-app": "^5.0.1", + "eslint-loader": "2.2.1", + "eslint-plugin-flowtype": "3.13.0", + "eslint-plugin-import": "2.18.2", + "eslint-plugin-jsx-a11y": "6.2.3", + "eslint-plugin-react": "7.14.3", + "eslint-plugin-react-hooks": "^1.6.1", + "express": "^4.17.1", + "file-loader": "3.0.1", + "fs-extra": "7.0.1", + "history": "^4.9.0", + "html-webpack-plugin": "4.0.0-beta.5", + "identity-obj-proxy": "3.0.0", + "immer": "^2.1.5", + "is-wsl": "^1.1.0", + "jest": "24.8.0", + "jest-environment-jsdom-fourteen": "0.1.0", + "jest-resolve": "24.8.0", + "jest-watch-typeahead": "0.3.1", + "jquery": "^3.4.1", + "jsonwebtoken": "^8.5.1", + "mini-css-extract-plugin": "0.5.0", + "optimize-css-assets-webpack-plugin": "5.0.3", + "pnp-webpack-plugin": "1.5.0", + "popper.js": "^1.15.0", + "postcss-flexbugs-fixes": "4.1.0", + "postcss-loader": "3.0.0", + "postcss-normalize": "7.0.1", + "postcss-preset-env": "6.7.0", + "postcss-safe-parser": "4.0.1", + "prop-types": "^15.7.2", + "react": "^16.9.0", + "react-app-polyfill": "^1.0.2", + "react-dev-utils": "^9.0.3", + "react-dom": "^16.9.0", + "react-html-parser": "^2.0.2", + "react-redux": "^6.0.1", + "react-router-dom": "^5.0.1", + "react-toastify": "^4.5.2", + "redux": "^4.0.4", + "redux-thunk": "^2.3.0", + "remarkable": "^2.0.0", + "reselect": "^4.0.0", + "resolve": "1.12.0", + "resolve-url-loader": "3.1.0", + "sass-loader": "7.2.0", + "semver": "6.3.0", + "style-loader": "1.0.0", + "terser-webpack-plugin": "1.4.1", + "ts-pnp": "1.1.2", + "typescript": "^3.5.3", + "url-loader": "2.1.0", + "webpack": "4.39.1", + "webpack-dev-server": "3.2.1", + "webpack-manifest-plugin": "2.0.4", + "workbox-webpack-plugin": "4.3.1" + }, + "devDependencies": { + "bcrypt": "^3.0.6", + "cssnano": "^4.1.10", + "eslint": "^6.2.2", + "fetch-mock": "^7.3.9", + "json-server": "^0.14.2", + "node-fetch": "^2.3.0", + "npm-run-all": "^4.1.5", + "postcss-loader": "^3.0.0", + "random-words": "^1.1.0", + "redux-immutable-state-invariant": "^2.1.0", + "redux-mock-store": "^1.5.3", + "style-loader": "^0.23.1" + }, + "engines": { + "node": ">=8" + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "jest": { + "roots": [ + "/src" + ], + "collectCoverageFrom": [ + "src/**/*.{js,jsx,ts,tsx}", + "!src/**/*.d.ts" + ], + "setupFiles": [ + "react-app-polyfill/jsdom" + ], + "setupFilesAfterEnv": [], + "testMatch": [ + "/src/**/__tests__/**/*.{js,jsx,ts,tsx}", + "/src/**/*.{spec,test}.{js,jsx,ts,tsx}" + ], + "testEnvironment": "jest-environment-jsdom-fourteen", + "transform": { + "^.+\\.(js|jsx|ts|tsx)$": "/node_modules/babel-jest", + "^.+\\.css$": "/config/jest/cssTransform.js", + "^(?!.*\\.(js|jsx|ts|tsx|css|json)$)": "/config/jest/fileTransform.js" + }, + "transformIgnorePatterns": [ + "[/\\\\]node_modules[/\\\\].+\\.(js|jsx|ts|tsx)$", + "^.+\\.module\\.(css|sass|scss)$" + ], + "modulePaths": [], + "moduleNameMapper": { + "^react-native$": "react-native-web", + "^.+\\.module\\.(css|sass|scss)$": "identity-obj-proxy" + }, + "moduleFileExtensions": [ + "web.js", + "js", + "web.ts", + "ts", + "web.tsx", + "tsx", + "json", + "web.jsx", + "jsx", + "node" + ], + "watchPlugins": [ + "jest-watch-typeahead/filename", + "jest-watch-typeahead/testname" + ] + }, + "babel": { + "presets": [ + "react-app" + ] + } } diff --git a/src/api/authApi.js b/src/api/authApi.js index 4c7ee6a..9432cbb 100644 --- a/src/api/authApi.js +++ b/src/api/authApi.js @@ -1,14 +1,14 @@ import { handleResponse, handleError } from "./apiUtils"; -const baseUrl = process.env.REACT_APP_API_URL + "/api/auth/"; +const baseUrl = process.env.REACT_APP_API_URL + "/auth"; -function login(username, password) { +function login(userName, password) { const requestOptions = { method: "POST", headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ username, password }) + body: JSON.stringify({ userName, password }) }; - return fetch(baseUrl + "/auth/login", requestOptions) + return fetch(baseUrl + "/login", requestOptions) .then(handleResponse) .then(token => { localStorage.setItem("trelloid_token", JSON.stringify(token)); @@ -21,7 +21,7 @@ function logout() { localStorage.removeItem("user"); } -export const auth = { +export default { login, logout }; diff --git a/src/components/auth/LoginForm.js b/src/components/auth/LoginForm.js index 81aa83f..fa445a1 100644 --- a/src/components/auth/LoginForm.js +++ b/src/components/auth/LoginForm.js @@ -1,11 +1,12 @@ import React from "react"; import { Card } from "@material-ui/core"; +import Button from "@material-ui/core/Button"; import TextInput from "../common/TextInput"; -const LoginForm = ({ onChange, onSave, errors, user }) => ( +const LoginForm = ({ onChange, onSave, saving, errors, user }) => (
-

Registration

+

Log in

{errors.summary &&

{errors.summary}

} ( onChange={onChange} error={errors.password} /> +
); diff --git a/src/components/common/Routes.js b/src/components/common/Routes.js index 765f0d0..d51d144 100644 --- a/src/components/common/Routes.js +++ b/src/components/common/Routes.js @@ -5,12 +5,14 @@ import HomePage from "../home/HomePage"; import UsersPage from "../users/UsersPage"; import { default as ManageUserPage } from "../users/ManageUserPage"; import RegistrationForm from "../auth/RegistrationForm"; +import LoginPage from "../auth/LoginPage"; class Routes extends React.Component { render() { return ( + diff --git a/src/components/common/TextInput.js b/src/components/common/TextInput.js index 7904917..c2e38cd 100644 --- a/src/components/common/TextInput.js +++ b/src/components/common/TextInput.js @@ -20,7 +20,7 @@ const TextInput = ({
diff --git a/src/redux/actions/authActions.js b/src/redux/actions/authActions.js index a9639aa..51b98bf 100644 --- a/src/redux/actions/authActions.js +++ b/src/redux/actions/authActions.js @@ -1,6 +1,6 @@ import * as actionTypes from "./actionTypes"; import { beginApiCall } from "./apiStatusActions"; -import * as authApi from "../../api/authApi"; +import authApi from "../../api/authApi"; export function loginFailure(user) { return { type: actionTypes.LOGIN_FAILURE, user: user }; From b9794a74082e049e8d9ff2041cf42d04e2178c83 Mon Sep 17 00:00:00 2001 From: Andrew Smith Date: Thu, 29 Aug 2019 23:12:00 +0100 Subject: [PATCH 24/24] feature #12: Protect user api GET --- src/api/authApi.js | 6 +++--- src/api/userApi.js | 27 ++++++++++----------------- src/components/auth/LoginPage.js | 4 +++- src/index.js | 2 ++ src/redux/reducers/authReducer.js | 7 ++++--- src/redux/reducers/index.js | 4 ++-- src/redux/reducers/userReducer.js | 2 +- src/tools/apiServer.js | 4 ++-- 8 files changed, 27 insertions(+), 29 deletions(-) diff --git a/src/api/authApi.js b/src/api/authApi.js index 9432cbb..d4daf85 100644 --- a/src/api/authApi.js +++ b/src/api/authApi.js @@ -10,9 +10,9 @@ function login(userName, password) { return fetch(baseUrl + "/login", requestOptions) .then(handleResponse) - .then(token => { - localStorage.setItem("trelloid_token", JSON.stringify(token)); - return token; + .then(auth => { + localStorage.setItem("trelloid_token", JSON.stringify(auth.token)); + return auth.user; }) .catch(handleError); } diff --git a/src/api/userApi.js b/src/api/userApi.js index 2145062..dc83788 100755 --- a/src/api/userApi.js +++ b/src/api/userApi.js @@ -1,8 +1,12 @@ import { handleResponse, handleError } from "./apiUtils"; const baseUrl = process.env.REACT_APP_API_URL + "/api/users/"; +const bearerHeaders = { + headers: { Authorization: "Bearer " + getToken() } +}; + export function getUsers() { - return fetch(baseUrl) + return fetch(baseUrl, bearerHeaders) .then(handleResponse) .catch(handleError); } @@ -13,25 +17,10 @@ export function getOneUser(userId) { .catch(handleError); } -export function login(userName, password) { - const requestOptions = { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ userName, password }) - }; - - return fetch(baseUrl + "/authenticate", requestOptions) - .then(handleResponse) - .then(user => { - localStorage.setItem("trelloid_jwt_token", JSON.stringify(user.token)); - }) - .catch(handleError); -} - export function saveUser(user) { return fetch(baseUrl + (user._id || ""), { method: user._id ? "PUT" : "POST", - headers: { "content-type": "application/json" }, + headers: { "Content-type": "application/json" }, body: JSON.stringify(user) }) .then(handleResponse) @@ -43,3 +32,7 @@ export function deleteUser(userId) { .then(handleResponse) .catch(handleError); } + +function getToken() { + return localStorage.getItem("trelloid_token"); +} diff --git a/src/components/auth/LoginPage.js b/src/components/auth/LoginPage.js index 0824fbf..64545e5 100644 --- a/src/components/auth/LoginPage.js +++ b/src/components/auth/LoginPage.js @@ -71,7 +71,9 @@ class LoginPage extends Component { } } function mapStateToProps(state) { - return {}; + const { loggingIn } = state.authentication; + + return { loggingIn }; } const mapDispatchToProps = dispatch => ({ diff --git a/src/index.js b/src/index.js index a769c07..b2d8806 100644 --- a/src/index.js +++ b/src/index.js @@ -4,10 +4,12 @@ import { BrowserRouter as Router } from "react-router-dom"; import App from "./components/App"; import { Provider } from "react-redux"; import configureStore from "./redux/configureStore"; +import { loadUsers } from "./redux/actions/userActions"; import "./styles/styles.css"; import "../node_modules/bootstrap/dist/css/bootstrap.min.css"; const store = configureStore(); +store.dispatch(loadUsers()); render( diff --git a/src/redux/reducers/authReducer.js b/src/redux/reducers/authReducer.js index 3535e93..049aa3d 100644 --- a/src/redux/reducers/authReducer.js +++ b/src/redux/reducers/authReducer.js @@ -1,10 +1,11 @@ import * as actionTypes from "../actions/actionTypes"; -import initialState from "./initialState"; -export default function authReducer(state = initialState.users, action) { +export default function authentication(state = {}, action) { switch (action.type) { + case actionTypes.LOGIN_REQUEST: + return { loggingIn: true, user: action.user }; case actionTypes.LOGIN_SUCCESS: - return action.user; + return { loggedIn: true, user: action.user }; default: return state; } diff --git a/src/redux/reducers/index.js b/src/redux/reducers/index.js index 2a89849..986f2c2 100644 --- a/src/redux/reducers/index.js +++ b/src/redux/reducers/index.js @@ -1,12 +1,12 @@ import { combineReducers } from "redux"; import apiCallsInProgress from "./apiStatusReducer"; -import auth from "./authReducer"; +import authentication from "./authReducer"; import cards from "./cardReducer"; import users from "./userReducer"; const rootReducer = combineReducers({ apiCallsInProgress, - auth, + authentication, cards, users }); diff --git a/src/redux/reducers/userReducer.js b/src/redux/reducers/userReducer.js index ac6ede8..8a76da1 100644 --- a/src/redux/reducers/userReducer.js +++ b/src/redux/reducers/userReducer.js @@ -1,7 +1,7 @@ import * as actionTypes from "../actions/actionTypes"; import initialState from "./initialState"; -export default function userReducer(state = initialState.users, action) { +export default function users(state = initialState.users, action) { switch (action.type) { case actionTypes.DELETE_USER_OPTIMISTIC: return state.filter(user => user._id !== action.user._id); diff --git a/src/tools/apiServer.js b/src/tools/apiServer.js index c6ad4c1..ca0b0e7 100755 --- a/src/tools/apiServer.js +++ b/src/tools/apiServer.js @@ -41,8 +41,8 @@ server.post("/auth/login", function(req, res, next) { const { userName, password } = req.body; const user = isAuthenticated(userName, password); if (user) { - const access_token = createToken({ userName, password }); - res.status(200).json({ access_token, user }); + const tokenValue = createToken({ userName, password }); + res.status(200).json({ token: tokenValue, user }); } else { const status = 401; const message = "Incorrect email or password";