Compare commits
65 Commits
responsive
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 6053179f25 | |||
| 2f95e39f0a | |||
| 404856622f | |||
| d08b9b3721 | |||
| 53c3464104 | |||
| 27732e3033 | |||
| 62d38422f7 | |||
| d09083de8b | |||
| 32fd6a3154 | |||
| 496c85f625 | |||
| 0dd6249fc2 | |||
| 2cda367152 | |||
| 87060c4340 | |||
| d17deb57e4 | |||
| c7a22cfe3e | |||
| e4977f9960 | |||
| 92211502e2 | |||
| 48e28bb2a0 | |||
| 917886a208 | |||
| 521a0d7885 | |||
| 5e8a701f64 | |||
| 8c1d8b0274 | |||
| f0ded5b4b6 | |||
| ce26bc1b69 | |||
| 2909de8763 | |||
| e7a45eaa50 | |||
| cd9e5d2e11 | |||
| 244db1c207 | |||
| 7f0ffc0674 | |||
| d1ed394a9f | |||
| af75c75332 | |||
| 5faf125fe7 | |||
| 7e2d250f1a | |||
| e66e062370 | |||
| b823a75886 | |||
| 60f0f542d4 | |||
| cc860b15ee | |||
| 645c5f7bff | |||
|
|
d68a8d6f1f | ||
|
|
971af955f9 | ||
|
|
4492822065 | ||
|
|
f32c001de3 | ||
|
|
8b058c1b92 | ||
|
|
249e45216c | ||
|
|
28d4ca64cb | ||
|
|
f0823eec57 | ||
|
|
6f8650b8a8 | ||
|
|
1f652b172d | ||
|
|
912f1218fd | ||
|
|
2d057c7e3a | ||
|
|
a4b10dc3da | ||
|
|
3261386cd6 | ||
|
|
590babbf3a | ||
|
|
94b8507ef6 | ||
|
|
23af127430 | ||
|
|
5b03415f96 | ||
|
|
69c9055a16 | ||
|
|
300d734bcf | ||
|
|
ef8bbd18d2 | ||
|
|
a26a4a85f0 | ||
|
|
38f27ba1d2 | ||
|
|
7411582d9b | ||
|
|
4f97c49d2f | ||
|
|
eeecbb54ec | ||
|
|
30f3f9787a |
68
.gitea/workflows/codeant.yml
Normal file
68
.gitea/workflows/codeant.yml
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
name: Codeant Security Scan
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: ["main"]
|
||||||
|
pull_request:
|
||||||
|
branches: ["main"]
|
||||||
|
schedule:
|
||||||
|
- cron: "0 0 * * *"
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
codeant-scan:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout Code
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Setup Node.js
|
||||||
|
uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
node-version: '22'
|
||||||
|
|
||||||
|
- name: Install CodeAnt CLI
|
||||||
|
run: npm install -g codeant-cli
|
||||||
|
|
||||||
|
# ✅ KEEP THIS (correct method)
|
||||||
|
- name: Configure CodeAnt Auth
|
||||||
|
env:
|
||||||
|
CODEANT_API_TOKEN: ${{ secrets.CODEANT_API_TOKEN }}
|
||||||
|
run: |
|
||||||
|
mkdir -p $HOME/.codeant
|
||||||
|
printf '{"apiKey":"%s"}\n' "$CODEANT_API_TOKEN" > $HOME/.codeant/config.json
|
||||||
|
|
||||||
|
- name: Setup Git identity
|
||||||
|
run: |
|
||||||
|
git config --global user.email "ci@gitea.local"
|
||||||
|
git config --global user.name "Gitea CI"
|
||||||
|
|
||||||
|
# 🔥 Full scan only on schedule
|
||||||
|
- name: Full repo AI scan (daily)
|
||||||
|
if: github.event_name == 'schedule'
|
||||||
|
run: |
|
||||||
|
echo "Running FULL repo scan..."
|
||||||
|
|
||||||
|
git checkout -b codeant-fullscan || git checkout codeant-fullscan
|
||||||
|
|
||||||
|
find . -type f \
|
||||||
|
-not -path "./.git/*" \
|
||||||
|
-exec sh -c 'echo "" >> "$1"' _ {} \;
|
||||||
|
|
||||||
|
git add .
|
||||||
|
git commit -m "full repo scan" || true
|
||||||
|
|
||||||
|
codeant review --committed > review.txt || true
|
||||||
|
|
||||||
|
# ⚡ Incremental scan
|
||||||
|
- name: Incremental AI scan
|
||||||
|
if: github.event_name != 'schedule'
|
||||||
|
run: |
|
||||||
|
echo "Running incremental scan..."
|
||||||
|
codeant review --committed > review.txt || true
|
||||||
|
|
||||||
|
- name: Show results
|
||||||
|
run: cat review.txt
|
||||||
36
.gitea/workflows/sonar.bak
Normal file
36
.gitea/workflows/sonar.bak
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
name: SonarQube Analysis
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [main]
|
||||||
|
pull_request:
|
||||||
|
branches: [main]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
sonarqube:
|
||||||
|
name: SonarQube Scan
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
# This runs the whole job INSIDE the sonar-scanner container
|
||||||
|
container:
|
||||||
|
image: sonarsource/sonar-scanner-cli:12.0.0.3214_8.0.1
|
||||||
|
options: --user root
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Run Scan
|
||||||
|
run: |
|
||||||
|
# Gitea repo name
|
||||||
|
REPO_NAME=${{ gitea.event.repository.name }}
|
||||||
|
|
||||||
|
# We call the scanner directly since we are already inside its container
|
||||||
|
sonar-scanner \
|
||||||
|
-Dsonar.projectKey=$REPO_NAME \
|
||||||
|
-Dsonar.projectName=$REPO_NAME \
|
||||||
|
-Dsonar.sources=. \
|
||||||
|
-Dsonar.host.url=${{ secrets.SONARQUBE_HOST }} \
|
||||||
|
-Dsonar.token=${{ secrets.SONARQUBE_TOKEN }} \
|
||||||
|
-Dsonar.exclusions=node_modules/**,dist/**,coverage/** \
|
||||||
|
-Dsonar.qualitygate.wait=true
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
Product comparison page build using **React** + **Redux** + **Bootstrap** + **SASS**
|
Product comparison page build using **React** + **Redux** + **Bootstrap** + **SASS**
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
It's build on top of [`create-react-app`](http://www.google.lt)
|
It's build on top of [`create-react-app`](http://www.google.lt)
|
||||||
|
|
||||||
@@ -26,8 +26,3 @@ License
|
|||||||
The MIT License (MIT). Please see License File for more information.
|
The MIT License (MIT). Please see License File for more information.
|
||||||
|
|
||||||
[](https://github.com/Rhymond/product-compare-react)
|
[](https://github.com/Rhymond/product-compare-react)
|
||||||
|
|
||||||
Todo
|
|
||||||
-
|
|
||||||
- [ ] Write tests
|
|
||||||
- [ ] Integrate CI
|
|
||||||
|
|||||||
12776
package-lock.json
generated
12776
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
63
package.json
63
package.json
@@ -4,55 +4,47 @@
|
|||||||
"private": true,
|
"private": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"autoprefixer": "7.1.1",
|
"autoprefixer": "7.1.1",
|
||||||
"babel-core": "6.25.0",
|
"babel-core": "^6.26.3",
|
||||||
"babel-eslint": "7.2.3",
|
|
||||||
"babel-jest": "20.0.3",
|
"babel-jest": "20.0.3",
|
||||||
"babel-loader": "7.0.0",
|
"babel-loader": "8.0.1",
|
||||||
"babel-preset-react-app": "^3.0.1",
|
"babel-preset-react-app": "^3.1.2",
|
||||||
"babel-runtime": "6.23.0",
|
"babel-runtime": "6.23.0",
|
||||||
"bootstrap": "^4.0.0-alpha.6",
|
"bootstrap": "^4.1.1",
|
||||||
"case-sensitive-paths-webpack-plugin": "2.1.1",
|
"case-sensitive-paths-webpack-plugin": "2.1.2",
|
||||||
"chalk": "1.1.3",
|
"chalk": "1.1.3",
|
||||||
"css-loader": "0.28.4",
|
"css-loader": "0.28.4",
|
||||||
"dotenv": "^4.0.0",
|
"dotenv": "^4.0.0",
|
||||||
"eslint": "3.19.0",
|
|
||||||
"eslint-config-react-app": "^1.0.5",
|
|
||||||
"eslint-loader": "1.7.1",
|
|
||||||
"eslint-plugin-flowtype": "2.34.0",
|
|
||||||
"eslint-plugin-import": "2.2.0",
|
|
||||||
"eslint-plugin-jsx-a11y": "5.0.3",
|
|
||||||
"eslint-plugin-react": "7.1.0",
|
|
||||||
"extract-text-webpack-plugin": "2.1.2",
|
"extract-text-webpack-plugin": "2.1.2",
|
||||||
"file-loader": "0.11.2",
|
"file-loader": "2.0.0",
|
||||||
"fs-extra": "3.0.1",
|
"fs-extra": "3.0.1",
|
||||||
"html-webpack-plugin": "2.29.0",
|
"html-webpack-plugin": "3.2.0",
|
||||||
"jest": "20.0.4",
|
"jest": "20.0.4",
|
||||||
"node-sass-chokidar": "0.0.3",
|
"node-sass-chokidar": "0.0.3",
|
||||||
"npm-run-all": "^4.1.1",
|
"npm-run-all": "^4.1.3",
|
||||||
"object-assign": "4.1.1",
|
"object-assign": "4.1.1",
|
||||||
"postcss-flexbugs-fixes": "3.0.0",
|
"postcss-flexbugs-fixes": "3.0.0",
|
||||||
"postcss-loader": "2.0.6",
|
"postcss-loader": "3.0.0",
|
||||||
"promise": "7.1.1",
|
"promise": "7.1.1",
|
||||||
"react": "^15.6.1",
|
"react": "^15.6.2",
|
||||||
"react-addons-css-transition-group": "^15.6.0",
|
"react-addons-css-transition-group": "^15.6.2",
|
||||||
"react-addons-transition-group": "^15.6.0",
|
"react-addons-transition-group": "^15.6.2",
|
||||||
"react-dev-utils": "^3.0.2",
|
"react-dev-utils": "^3.0.2",
|
||||||
"react-dom": "^15.6.1",
|
"react-dom": "^15.6.2",
|
||||||
"react-error-overlay": "^1.0.9",
|
"react-error-overlay": "^1.0.9",
|
||||||
"react-redux": "^5.0.5",
|
"react-redux": "^5.0.7",
|
||||||
"react-router": "^4.1.1",
|
"react-router": "^4.3.1",
|
||||||
"react-router-dom": "^4.1.1",
|
"react-router-dom": "^4.3.1",
|
||||||
"react-scripts": "^1.0.10",
|
"react-scripts": "^1.1.5",
|
||||||
"react-select": "^1.0.0-rc.5",
|
"react-select": "^1.2.1",
|
||||||
"redux": "^3.0.0",
|
"redux": "^3.0.0",
|
||||||
"redux-logger": "^3.0.6",
|
"redux-logger": "^3.0.6",
|
||||||
"redux-thunk": "^2.2.0",
|
"redux-thunk": "^2.3.0",
|
||||||
"style-loader": "0.18.2",
|
"style-loader": "0.23.0",
|
||||||
"sw-precache-webpack-plugin": "0.11.3",
|
"sw-precache-webpack-plugin": "0.11.5",
|
||||||
"url-loader": "0.5.9",
|
"url-loader": "1.1.1",
|
||||||
"webpack": "2.6.1",
|
"webpack": "4.17.1",
|
||||||
"webpack-dev-server": "2.5.0",
|
"webpack-dev-server": "^3.1.14",
|
||||||
"webpack-manifest-plugin": "1.1.0",
|
"webpack-manifest-plugin": "2.0.3",
|
||||||
"whatwg-fetch": "2.0.3"
|
"whatwg-fetch": "2.0.3"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
@@ -65,10 +57,11 @@
|
|||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"babel-eslint": "^7.2.3",
|
"babel-eslint": "^7.2.3",
|
||||||
"eslint": "^3.19.0",
|
"eslint": "^4.18.2",
|
||||||
"eslint-config-react-app": "^1.0.5",
|
"eslint-config-react-app": "^1.0.5",
|
||||||
|
"eslint-loader": "^1.7.1",
|
||||||
"eslint-plugin-flowtype": "^2.33.0",
|
"eslint-plugin-flowtype": "^2.33.0",
|
||||||
"eslint-plugin-import": "^2.2.0",
|
"eslint-plugin-import": "^2.14.0",
|
||||||
"eslint-plugin-jsx-a11y": "^5.0.1",
|
"eslint-plugin-jsx-a11y": "^5.0.1",
|
||||||
"eslint-plugin-react": "^7.0.1"
|
"eslint-plugin-react": "^7.0.1"
|
||||||
},
|
},
|
||||||
|
|||||||
BIN
public/images/Cherry.png
Normal file
BIN
public/images/Cherry.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 285 KiB |
BIN
public/images/Nuts.png
Normal file
BIN
public/images/Nuts.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 420 KiB |
BIN
public/images/Orange.png
Normal file
BIN
public/images/Orange.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 576 KiB |
BIN
public/images/Strawberry.png
Normal file
BIN
public/images/Strawberry.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 438 KiB |
@@ -1,39 +1,39 @@
|
|||||||
{
|
{
|
||||||
"products": [{
|
"products": [{
|
||||||
"id": "1",
|
"id": "1",
|
||||||
"name": "Chair",
|
"name": "Cherry",
|
||||||
"image": "https://devitems.com/preview/furnish/img/product/1.jpg",
|
"image": "images/Cherry.png",
|
||||||
"price": "$39",
|
"price": "$1.99",
|
||||||
"colors": ["red", "green", "blue"],
|
"colors": ["red", "green", "blue"],
|
||||||
"condition": "New",
|
"condition": "Fresh",
|
||||||
"description": "Black chair"
|
"description": "Two Cherries"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "2",
|
"id": "2",
|
||||||
"name": "Lamp",
|
"name": "Orange",
|
||||||
"image": "https://devitems.com/preview/furnish/img/product/2.jpg",
|
"image": "images/Orange.png",
|
||||||
"price": "$319",
|
"price": "$2.99",
|
||||||
"colors": ["green", "blue"],
|
"colors": ["green", "blue"],
|
||||||
"condition": "Used",
|
"condition": "Frozen",
|
||||||
"description": "Amazing lamp"
|
"description": "Giant Orange"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "3",
|
"id": "3",
|
||||||
"name": "Statue",
|
"name": "Nuts",
|
||||||
"image": "https://devitems.com/preview/furnish/img/product/3.jpg",
|
"image": "images/Nuts.png",
|
||||||
"price": "$239",
|
"price": "$1.00",
|
||||||
"colors": ["red"],
|
"colors": ["red"],
|
||||||
"condition": "Used",
|
"condition": "Frozen",
|
||||||
"description": "Used Statue"
|
"description": "Mixed Nuts"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "4",
|
"id": "4",
|
||||||
"name": "Seat",
|
"name": "Strawberry",
|
||||||
"image": "https://devitems.com/preview/furnish/img/product/4.jpg",
|
"image": "images/Strawberry.png",
|
||||||
"price": "$239",
|
"price": "$1.49",
|
||||||
"colors": ["blue"],
|
"colors": ["blue"],
|
||||||
"condition": "New",
|
"condition": "Fresh",
|
||||||
"description": "Large Seat"
|
"description": "Just Strawberry"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ const Compare = ({products}) =>
|
|||||||
<table className="table">
|
<table className="table">
|
||||||
<thead className="thead-default">
|
<thead className="thead-default">
|
||||||
<tr>
|
<tr>
|
||||||
<th></th>
|
<th />
|
||||||
{products.map(product =>
|
{products.map(product =>
|
||||||
<th key={product.id}>
|
<th key={product.id}>
|
||||||
{product.name}
|
{product.name}
|
||||||
@@ -27,7 +27,7 @@ const Compare = ({products}) =>
|
|||||||
{products.map(product =>
|
{products.map(product =>
|
||||||
<td key={product.id}>
|
<td key={product.id}>
|
||||||
{product.colors.map((color, index) =>
|
{product.colors.map((color, index) =>
|
||||||
<span key={index} className={"bg-" + color}></span>
|
<span key={index} className={"bg-" + color} />
|
||||||
)}
|
)}
|
||||||
</td>
|
</td>
|
||||||
)}
|
)}
|
||||||
@@ -35,7 +35,7 @@ const Compare = ({products}) =>
|
|||||||
<tr className="condition">
|
<tr className="condition">
|
||||||
<th scope="row">Condition</th>
|
<th scope="row">Condition</th>
|
||||||
{products.map(product =>
|
{products.map(product =>
|
||||||
<td key={product.id} className={product.condition === "Used" ? "bg-red" : "bg-green"}>
|
<td key={product.id} className={product.condition === "Frozen" ? "bg-red" : "bg-green"}>
|
||||||
{product.condition}
|
{product.condition}
|
||||||
</td>
|
</td>
|
||||||
)}
|
)}
|
||||||
@@ -43,6 +43,6 @@ const Compare = ({products}) =>
|
|||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>;
|
||||||
|
|
||||||
export default Compare
|
export default Compare
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
background-color: #fff;
|
background-color: #fff;
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
box-shadow: 0px 13px 21px -5px rgba(0, 0, 0, 0.05);
|
box-shadow: 0 13px 21px -5px rgba(0, 0, 0, 0.05);
|
||||||
border: 1px solid #eee;
|
border: 1px solid #eee;
|
||||||
font-size: 18px;
|
font-size: 18px;
|
||||||
table-layout: fixed;
|
table-layout: fixed;
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ const Product = ({product, compare}) =>
|
|||||||
<div key={product.id} className="col-sm-6 col-md-3">
|
<div key={product.id} className="col-sm-6 col-md-3">
|
||||||
<div className={"product " + (product.compare ? "compare" : "")} >
|
<div className={"product " + (product.compare ? "compare" : "")} >
|
||||||
<img src={product.image} alt={product.name} />
|
<img src={product.image} alt={product.name} />
|
||||||
<div className="image_overlay"></div>
|
<div className="image_overlay"/>
|
||||||
<div className="view_details" onClick={() => compare(product)}>
|
<div className="view_details" onClick={() => compare(product)}>
|
||||||
{product.compare ? "Remove" : "Compare"}
|
{product.compare ? "Remove" : "Compare"}
|
||||||
</div>
|
</div>
|
||||||
@@ -17,6 +17,6 @@ const Product = ({product, compare}) =>
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>;
|
||||||
|
|
||||||
export default Product
|
export default Product
|
||||||
|
|||||||
@@ -10,8 +10,9 @@ $product-main-color: $green;
|
|||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
transition: all 500ms ease-out;
|
transition: all 500ms ease-out;
|
||||||
margin-bottom: 30px;
|
margin-bottom: 30px;
|
||||||
|
border: 1px solid #ddd;
|
||||||
&:hover {
|
&:hover {
|
||||||
box-shadow: 0px 13px 21px -5px rgba(0, 0, 0, 0.2);
|
box-shadow: 0 13px 21px -5px rgba(0, 0, 0, 0.2);
|
||||||
.image_overlay {
|
.image_overlay {
|
||||||
opacity: $image-overlay-opacity;
|
opacity: $image-overlay-opacity;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,12 +2,10 @@ import React from 'react'
|
|||||||
import {Product} from '../'
|
import {Product} from '../'
|
||||||
|
|
||||||
const ProductList = ({products, compare}) =>
|
const ProductList = ({products, compare}) =>
|
||||||
<div>
|
|
||||||
<div className="row mt-3">
|
<div className="row mt-3">
|
||||||
{products.map(product =>
|
{products.map(product =>
|
||||||
<Product key={product.id} product={product} compare={compare} />
|
<Product key={product.id} product={product} compare={compare} />
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>;
|
||||||
</div>
|
|
||||||
|
|
||||||
export default ProductList
|
export default ProductList
|
||||||
|
|||||||
@@ -1,2 +1,2 @@
|
|||||||
export const FETCH_PRODUCTS = 'FETCH_PRODUCTS'
|
export const FETCH_PRODUCTS = 'FETCH_PRODUCTS';
|
||||||
export const COMPARE_PRODUCT = 'COMPARE_PRODUCT'
|
export const COMPARE_PRODUCT = 'COMPARE_PRODUCT';
|
||||||
|
|||||||
@@ -10,11 +10,16 @@ class Home extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const {products, actions} = this.props
|
const {products, actions} = this.props;
|
||||||
const compareProducts = products.filter(product => product.compare)
|
const compareProducts = products.filter(product => product.compare);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="home mt-5">
|
<div className="home mt-5">
|
||||||
|
<div className="row">
|
||||||
|
<div className="col-12">
|
||||||
|
<h2 className="mb-3">Compare Products</h2>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<ProductList products={products} compare={actions.compare}/>
|
<ProductList products={products} compare={actions.compare}/>
|
||||||
{compareProducts.length >= 2 &&
|
{compareProducts.length >= 2 &&
|
||||||
<Compare products={compareProducts}/>
|
<Compare products={compareProducts}/>
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import App from './containers/App'
|
|||||||
import 'bootstrap/dist/css/bootstrap.css'
|
import 'bootstrap/dist/css/bootstrap.css'
|
||||||
import './styles.css'
|
import './styles.css'
|
||||||
|
|
||||||
const loggerMiddleware = createLogger()
|
const loggerMiddleware = createLogger();
|
||||||
|
|
||||||
const store = createStore(
|
const store = createStore(
|
||||||
reducer,
|
reducer,
|
||||||
@@ -20,7 +20,7 @@ const store = createStore(
|
|||||||
thunkMiddleware,
|
thunkMiddleware,
|
||||||
loggerMiddleware
|
loggerMiddleware
|
||||||
)
|
)
|
||||||
)
|
);
|
||||||
|
|
||||||
ReactDOM.render(
|
ReactDOM.render(
|
||||||
<Provider store={store}>
|
<Provider store={store}>
|
||||||
@@ -29,6 +29,6 @@ ReactDOM.render(
|
|||||||
</BrowserRouter>
|
</BrowserRouter>
|
||||||
</Provider>,
|
</Provider>,
|
||||||
document.getElementById('root')
|
document.getElementById('root')
|
||||||
)
|
);
|
||||||
|
|
||||||
registerServiceWorker()
|
registerServiceWorker();
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
import { combineReducers } from 'redux'
|
import { combineReducers } from 'redux'
|
||||||
import product from './product_reducer'
|
import product from './productReducer'
|
||||||
|
|
||||||
const compareApp = combineReducers({
|
const compareApp = combineReducers({
|
||||||
product
|
product
|
||||||
})
|
});
|
||||||
|
|
||||||
export default compareApp
|
export default compareApp
|
||||||
@@ -2,7 +2,7 @@ import * as types from '../constants/types'
|
|||||||
|
|
||||||
const INITIAL_STATE = {
|
const INITIAL_STATE = {
|
||||||
products: []
|
products: []
|
||||||
}
|
};
|
||||||
|
|
||||||
export default function (state = INITIAL_STATE, action) {
|
export default function (state = INITIAL_STATE, action) {
|
||||||
switch (action.type) {
|
switch (action.type) {
|
||||||
@@ -11,7 +11,7 @@ export default function (state = INITIAL_STATE, action) {
|
|||||||
...state, products: action.payload.map(product =>
|
...state, products: action.payload.map(product =>
|
||||||
({...product, compare: false})
|
({...product, compare: false})
|
||||||
)
|
)
|
||||||
}
|
};
|
||||||
case types.COMPARE_PRODUCT:
|
case types.COMPARE_PRODUCT:
|
||||||
return {
|
return {
|
||||||
...state, products: state.products.map(product =>
|
...state, products: state.products.map(product =>
|
||||||
@@ -19,7 +19,7 @@ export default function (state = INITIAL_STATE, action) {
|
|||||||
({...product, compare: !product.compare}) :
|
({...product, compare: !product.compare}) :
|
||||||
product
|
product
|
||||||
)
|
)
|
||||||
}
|
};
|
||||||
default:
|
default:
|
||||||
return state
|
return state
|
||||||
}
|
}
|
||||||
@@ -2,6 +2,6 @@ body {
|
|||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
font-family: sans-serif;
|
font-family: sans-serif;
|
||||||
background: #eaebec;
|
background: #f6f7f8;
|
||||||
color: #393c45;
|
color: #393c45;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user