diff --git a/.env.example b/.env.example deleted file mode 100644 index 9b68b9a5..00000000 --- a/.env.example +++ /dev/null @@ -1 +0,0 @@ -APP_PORT= \ No newline at end of file diff --git a/.eslintrc.cjs b/.eslintrc.cjs index bfa68440..dc5d79bd 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -24,10 +24,16 @@ module.exports = { 'import/no-extraneous-dependencies': 0, 'import/extensions': 0, 'react/require-default-props': 0, + 'react/self-closing-comp': 0, 'no-param-reassign': [ 'error', { props: true, ignorePropertyModificationsFor: ['state'] }, ], }, - ignorePatterns: ['dist/**/*', 'postcss.config.js', 'tailwind.config.js'], + ignorePatterns: [ + 'dist//*', + 'postcss.config.js', + 'tailwind.config.js', + 'vite.config.ts', + ], }; diff --git a/.github/workflows/application.yml b/.github/workflows/application.yml index 429d1af3..d96af77e 100644 --- a/.github/workflows/application.yml +++ b/.github/workflows/application.yml @@ -1,19 +1,15 @@ name: CI for ecomm-project for Dynamite - on: push: branches: ['develop'] pull_request: branches: ['develop'] - jobs: build: runs-on: ubuntu-latest - strategy: matrix: node-version: [20.x] - steps: - uses: actions/checkout@v3 - name: Use Node.js ${{ matrix.node-version }} @@ -30,3 +26,5 @@ jobs: uses: codecov/codecov-action@v4.0.1 with: token: ${{ secrets.CODECOV_TOKEN }} + env: + VITE_BASE_URL: ${{ secrets.VITE_BASE_URL }} diff --git a/package-lock.json b/package-lock.json index 80134f49..8940bc7b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,6 +32,7 @@ "@types/jest": "^29.5.12", "@types/jsdom": "^21.1.7", "@types/mocha": "^10.0.7", + "@types/node": "^20.14.7", "@types/react": "^18.3.3", "@types/react-dom": "^18.2.22", "@types/redux-mock-store": "^1.0.6", @@ -697,358 +698,6 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", - "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", - "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", - "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", - "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", - "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", - "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", - "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", - "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", - "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", - "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", - "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", - "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", - "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", - "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", - "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", - "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", - "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", - "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", - "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", - "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", - "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", - "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/@esbuild/win32-x64": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", @@ -1852,201 +1501,6 @@ "node": ">=14.0.0" } }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz", - "integrity": "sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz", - "integrity": "sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz", - "integrity": "sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz", - "integrity": "sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz", - "integrity": "sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz", - "integrity": "sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz", - "integrity": "sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz", - "integrity": "sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz", - "integrity": "sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz", - "integrity": "sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz", - "integrity": "sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz", - "integrity": "sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz", - "integrity": "sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz", - "integrity": "sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz", - "integrity": "sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, "node_modules/@rollup/rollup-win32-x64-msvc": { "version": "4.18.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz", @@ -2373,9 +1827,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.14.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.2.tgz", - "integrity": "sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q==", + "version": "20.14.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.8.tgz", + "integrity": "sha512-DO+2/jZinXfROG7j7WKFn/3C6nFwxy2lLpgLjEXJz+0XKphZlTLJ14mo8Vfg8X5BWN6XjyESXq+LcYdT7tR3bA==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -5412,20 +4866,6 @@ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", diff --git a/package.json b/package.json index 101340df..2a0463a4 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,7 @@ "@types/jest": "^29.5.12", "@types/jsdom": "^21.1.7", "@types/mocha": "^10.0.7", + "@types/node": "^20.14.7", "@types/react": "^18.3.3", "@types/react-dom": "^18.2.22", "@types/redux-mock-store": "^1.0.6", diff --git a/src/__test__/App.test.tsx b/src/__test__/App.test.tsx new file mode 100644 index 00000000..85c0a27f --- /dev/null +++ b/src/__test__/App.test.tsx @@ -0,0 +1,17 @@ +import { render, screen } from '@testing-library/react'; +import { describe, it, expect } from 'vitest'; +import ErrorPage from '@/pages/ErrorPage'; + +describe('App', () => { + // it('Renders Welcome to Dynamites E-commerce', () => { + // render(); + // expect(screen.getByRole('paragraph')).toHaveTextContent( + // 'Welcome to Dynamites E-commerce' + // ); + // }); + + it('it renders Not Found Page', () => { + render(); + expect(screen.getByRole('paragraph')).toHaveTextContent('Not Found Page'); + }); +}); diff --git a/src/__test__/bannerAds/bannerAds.test.tsx b/src/__test__/bannerAds/bannerAds.test.tsx new file mode 100644 index 00000000..ee91db85 --- /dev/null +++ b/src/__test__/bannerAds/bannerAds.test.tsx @@ -0,0 +1,37 @@ +import { render, screen } from '@testing-library/react'; +import { describe, it, expect } from 'vitest'; +import { MemoryRouter } from 'react-router-dom'; +import BannerAd from '@/components/bannerAds/bannerAds'; +import egg from '@/assets/egg.png'; + +describe('banner Component', () => { + it('renders BannerAd component with given props', () => { + render( + + + + ); + + expect(screen.getAllByRole('paragraph')[0]).toHaveTextContent('this week'); + + expect(screen.getByText('eggs')).toBeInTheDocument(); + + expect(screen.getAllByRole('paragraph')[1]).toHaveTextContent('snacks'); + + const button = screen.getByRole('button', { name: /shop now/i }); + expect(button).toBeInTheDocument(); + + const icon = screen.getByTitle('icon'); + expect(icon).toBeInTheDocument(); + expect(button).toContainElement(icon); + + const image = screen.getByAltText(/eggs/i); + expect(image).toBeInTheDocument(); + }); +}); diff --git a/src/__test__/bannerAds/bannerSlice.test.tsx b/src/__test__/bannerAds/bannerSlice.test.tsx new file mode 100644 index 00000000..efc8b1e0 --- /dev/null +++ b/src/__test__/bannerAds/bannerSlice.test.tsx @@ -0,0 +1,51 @@ +import { describe, it, expect } from 'vitest'; +import productsReducer, { + initialState, + fetchProducts, +} from '@/app/bannerAds/BannerSlice'; + +describe('products reducer', () => { + it('should return the initial state', () => { + const action = { type: 'unknown/action' }; + expect(productsReducer(undefined, action)).toEqual(initialState); + }); + + it('should handle fetchProducts.pending', () => { + expect( + productsReducer(initialState, { + type: fetchProducts.pending.type, + }) + ).toEqual({ + ...initialState, + status: 'loading', + }); + }); + + it('should handle fetchProducts.fulfilled', () => { + const mockProducts = [ + { id: 1, name: 'Product A' }, + { id: 2, name: 'Product B' }, + ]; + expect( + productsReducer(initialState, { + type: fetchProducts.fulfilled.type, + payload: mockProducts, + }) + ).toEqual({ + ...initialState, + status: 'succeeded', + items: mockProducts, + }); + }); + + it('should handle fetchProducts.rejected', () => { + expect( + productsReducer(initialState, { + type: fetchProducts.rejected.type, + }) + ).toEqual({ + ...initialState, + status: 'failed', + }); + }); +}); diff --git a/src/app/bannerAds/BannerSlice.tsx b/src/app/bannerAds/BannerSlice.tsx new file mode 100644 index 00000000..a7a80aa5 --- /dev/null +++ b/src/app/bannerAds/BannerSlice.tsx @@ -0,0 +1,51 @@ +import { createAsyncThunk, createSlice } from '@reduxjs/toolkit'; +import axios from 'axios'; +import Product from '@/interfaces/product'; + +const apiUrl = `${import.meta.env.VITE_BASE_URL}`; + +export const fetchProducts = createAsyncThunk( + 'products/fetchProducts', + async (_, thunkAPI) => { + try { + const response = await axios.get( + `${apiUrl}/product/getAvailableProducts` + ); + const { data } = response; + return data.availableProducts.slice(0, 2); + } catch (error) { + return thunkAPI.rejectWithValue(error); + } + } +); + +export interface ProductsState { + items: Product[]; + status: 'idle' | 'loading' | 'succeeded' | 'failed'; +} + +export const initialState: ProductsState = { + items: [], + status: 'idle', +}; + +const productsSlice = createSlice({ + name: 'products', + initialState, + reducers: {}, + extraReducers: (builder) => { + builder + .addCase(fetchProducts.pending, (state) => { + state.status = 'loading'; + }) + .addCase(fetchProducts.fulfilled, (state, action) => { + state.status = 'succeeded'; + state.items = action.payload; + }) + .addCase(fetchProducts.rejected, (state) => { + state.status = 'failed'; + }); + }, +}); + +export default productsSlice.reducer; diff --git a/src/app/store.ts b/src/app/store.ts index ec08446e..5d9e8798 100644 --- a/src/app/store.ts +++ b/src/app/store.ts @@ -1,9 +1,11 @@ import { configureStore } from '@reduxjs/toolkit'; import signUpReducer from '../features/Auth/SignUpSlice'; +import bannerReducer from '@/app/bannerAds/BannerSlice'; export const store = configureStore({ reducer: { signUp: signUpReducer, + banners: bannerReducer, }, }); diff --git a/src/assets/egg.png b/src/assets/egg.png new file mode 100644 index 00000000..516f3bb5 Binary files /dev/null and b/src/assets/egg.png differ diff --git a/src/assets/snacks.png b/src/assets/snacks.png new file mode 100644 index 00000000..eb9aecda Binary files /dev/null and b/src/assets/snacks.png differ diff --git a/src/components/bannerAds/bannerAds.tsx b/src/components/bannerAds/bannerAds.tsx new file mode 100644 index 00000000..14d8c470 --- /dev/null +++ b/src/components/bannerAds/bannerAds.tsx @@ -0,0 +1,39 @@ +import { IoIosArrowRoundForward } from 'react-icons/io'; + +interface MyBannerAdsProps { + s_title: string; + title: string; + description: string; + image: string; +} + +function BannerAd({ s_title, title, description, image }: MyBannerAdsProps) { + return ( +
+
+

{s_title}

+

{title}

+

{description}

+ +
+ {title} +
+ ); +} + +export default BannerAd; diff --git a/src/components/bannerAds/bannerSection.tsx b/src/components/bannerAds/bannerSection.tsx new file mode 100644 index 00000000..8bb0fadb --- /dev/null +++ b/src/components/bannerAds/bannerSection.tsx @@ -0,0 +1,30 @@ +import { useEffect } from 'react'; +import { useDispatch, useSelector } from 'react-redux'; +import { RootState, AppDispatch } from '../../app/store'; +import { fetchProducts } from '@/app/bannerAds/BannerSlice'; +import BannerAd from '@/components/bannerAds/bannerAds'; + +function BannerSection() { + const dispatch: AppDispatch = useDispatch(); + const { items: banners } = useSelector((state: RootState) => state.banners); + + useEffect(() => { + dispatch(fetchProducts()); + }, [dispatch]); + + return ( +
+ {banners.map((banner) => ( + + ))} +
+ ); +} + +export default BannerSection; diff --git a/src/interfaces/Vendor.ts b/src/interfaces/Vendor.ts new file mode 100644 index 00000000..fe4e447a --- /dev/null +++ b/src/interfaces/Vendor.ts @@ -0,0 +1,5 @@ +export default interface Vendor { + firstName: string; + lastName: string; + picture: string | null; +} diff --git a/src/interfaces/category.ts b/src/interfaces/category.ts new file mode 100644 index 00000000..818943d3 --- /dev/null +++ b/src/interfaces/category.ts @@ -0,0 +1,7 @@ +export default interface Category { + id: number; + name: string; + description: string; + createdAt: string; + updatedAt: string; +} diff --git a/src/interfaces/product.ts b/src/interfaces/product.ts new file mode 100644 index 00000000..7e02c2bb --- /dev/null +++ b/src/interfaces/product.ts @@ -0,0 +1,22 @@ +import Vendor from '@/interfaces/Vendor'; +import Category from '@/interfaces/category'; + +export default interface Product { + id: number; + name: string; + image: string; + gallery: string[]; + shortDesc: string; + longDesc: string; + quantity: number; + regularPrice: number; + salesPrice: number; + tags: string[]; + type: string; + isAvailable: boolean; + averageRating: number; + createdAt: string; + updatedAt: string; + category: Category; + vendor: Vendor | null; +} diff --git a/src/pages/Home.tsx b/src/pages/Home.tsx index 2de9d910..a6abbee6 100644 --- a/src/pages/Home.tsx +++ b/src/pages/Home.tsx @@ -1,14 +1,17 @@ import HelloSection from '../components/HelloSection/HelloSection'; +import BannerSection from '@/components/bannerAds/bannerSection'; function Home() { return ( -
-
+
+
+
+ +
{/* Add more componets as you wish!!! */}
); } - export default Home; diff --git a/tailwind.config.js b/tailwind.config.js index 1a2aee72..7c53d54a 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -23,6 +23,8 @@ export default { textBlack: '#171A1F', lightGrey: '#DEE1E6', grey: '#565D6D', + black: '#171A1F', + bannerBg: '#F4F1EB', }, fontFamily: { Lexend: ['Lexend'],