Browse Source

homework11 done

holevchuk.evgeny 1 year ago
parent
commit
229bdc5b3c
2 changed files with 94 additions and 0 deletions
  1. 25 0
      hw11/redux.html
  2. 69 0
      hw11/redux.js

+ 25 - 0
hw11/redux.html

@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="UTF-8">
+	<title>Title</title>
+</head>
+<body>
+<select id="goods">
+	<option value="videoCards">videoCards</option>
+	<option value="processors">processors</option>
+	<option value="memory">memory</option>
+</select>
+<input id="amount"
+       placeholder="количество товара"
+       type="number"
+>
+<input id="money"
+       placeholder="Укажите сумму"
+       type="number"
+>
+<button id="buy">купить</button>
+<div id="storeBlock"></div>
+<script src="redux.js"></script>
+</body>
+</html>

+ 69 - 0
hw11/redux.js

@@ -0,0 +1,69 @@
+function shoppingCartReducer(state, {type, what, howMach, money}) {
+	if(!state) {
+		return {
+			videoCards: {
+				amount: 100,
+				price: 180
+			},
+			processors: {
+				amount: 100,
+				price: 120
+			},
+			memory: {
+				amount: 100,
+				price: 80
+			},
+			totalMoney: 0
+		}
+	}
+	if(type === 'buy') {
+		return {
+			...state,
+			[what]: {
+				amount: (state[what].amount - howMach < 0 || money < state[what].price) ? state[what].amount : state[what].amount - howMach,
+				price: state[what].price
+			},
+			totalMoney: (state[what].amount - howMach < 0 || money < state[what].price) ? state.totalMoney : (howMach * money) + state.totalMoney
+		}
+	}
+	return state;
+}
+
+function createStore(reducer){
+	let state       = reducer(undefined, {});
+	let cbs         = [];
+
+	const getState  = () => state;
+	const subscribe = cb => (cbs.push(cb),
+		() => cbs = cbs.filter(c => c !== cb));
+
+	const dispatch  = action => {
+		const newState = reducer(state, action);
+		if (newState !== state){
+			state = newState;
+			for (let cb of cbs)  cb();
+		}
+	}
+
+	return {
+		getState,
+		dispatch,
+		subscribe
+	}
+}
+
+const store = createStore(shoppingCartReducer);
+
+store.subscribe(() => storeBlock.innerText = JSON.stringify(store.getState()));
+
+const buyAction = (what, howMach, money) => ({type: 'buy', what: `${what}`, howMach, money});
+
+store.dispatch(buyAction('videoCards', 0, 0));
+
+buy.addEventListener('click', () => {
+	let what = goods[goods.options.selectedIndex].value;
+	let howMach = amount.value;
+	let moneyVal = money.value;
+	store.dispatch(buyAction(what, howMach, moneyVal));
+})
+