diff --git a/package-lock.json b/package-lock.json
index 8dfe3bf..d936fad 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -8,16 +8,18 @@
"name": "crm-customer-ui",
"version": "0.1.0",
"dependencies": {
+ "@reduxjs/toolkit": "^1.9.7",
"@types/node": "20.5.1",
"@types/react": "18.2.20",
"@types/react-dom": "18.2.7",
"autoprefixer": "10.4.15",
"eslint": "8.47.0",
- "eslint-config-next": "13.4.19",
- "next": "13.4.19",
+ "eslint-config-next": "^13.5.4",
+ "next": "^13.5.4",
"postcss": "8.4.28",
- "react": "18.2.0",
- "react-dom": "18.2.0",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0",
+ "react-redux": "^8.1.3",
"tailwindcss": "3.3.3",
"typescript": "5.1.6"
}
@@ -178,22 +180,22 @@
}
},
"node_modules/@next/env": {
- "version": "13.4.19",
- "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.19.tgz",
- "integrity": "sha512-FsAT5x0jF2kkhNkKkukhsyYOrRqtSxrEhfliniIq0bwWbuXLgyt3Gv0Ml+b91XwjwArmuP7NxCiGd++GGKdNMQ=="
+ "version": "13.5.4",
+ "resolved": "https://registry.npmjs.org/@next/env/-/env-13.5.4.tgz",
+ "integrity": "sha512-LGegJkMvRNw90WWphGJ3RMHMVplYcOfRWf2Be3td3sUa+1AaxmsYyANsA+znrGCBjXJNi4XAQlSoEfUxs/4kIQ=="
},
"node_modules/@next/eslint-plugin-next": {
- "version": "13.4.19",
- "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.4.19.tgz",
- "integrity": "sha512-N/O+zGb6wZQdwu6atMZHbR7T9Np5SUFUjZqCbj0sXm+MwQO35M8TazVB4otm87GkXYs2l6OPwARd3/PUWhZBVQ==",
+ "version": "13.5.4",
+ "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.5.4.tgz",
+ "integrity": "sha512-vI94U+D7RNgX6XypSyjeFrOzxGlZyxOplU0dVE5norIfZGn/LDjJYPHdvdsR5vN1eRtl6PDAsOHmycFEOljK5A==",
"dependencies": {
"glob": "7.1.7"
}
},
"node_modules/@next/swc-darwin-arm64": {
- "version": "13.4.19",
- "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.19.tgz",
- "integrity": "sha512-vv1qrjXeGbuF2mOkhkdxMDtv9np7W4mcBtaDnHU+yJG+bBwa6rYsYSCI/9Xm5+TuF5SbZbrWO6G1NfTh1TMjvQ==",
+ "version": "13.5.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.5.4.tgz",
+ "integrity": "sha512-Df8SHuXgF1p+aonBMcDPEsaahNo2TCwuie7VXED4FVyECvdXfRT9unapm54NssV9tF3OQFKBFOdlje4T43VO0w==",
"cpu": [
"arm64"
],
@@ -206,9 +208,9 @@
}
},
"node_modules/@next/swc-darwin-x64": {
- "version": "13.4.19",
- "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.19.tgz",
- "integrity": "sha512-jyzO6wwYhx6F+7gD8ddZfuqO4TtpJdw3wyOduR4fxTUCm3aLw7YmHGYNjS0xRSYGAkLpBkH1E0RcelyId6lNsw==",
+ "version": "13.5.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.5.4.tgz",
+ "integrity": "sha512-siPuUwO45PnNRMeZnSa8n/Lye5ZX93IJom9wQRB5DEOdFrw0JjOMu1GINB8jAEdwa7Vdyn1oJ2xGNaQpdQQ9Pw==",
"cpu": [
"x64"
],
@@ -221,9 +223,9 @@
}
},
"node_modules/@next/swc-linux-arm64-gnu": {
- "version": "13.4.19",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.19.tgz",
- "integrity": "sha512-vdlnIlaAEh6H+G6HrKZB9c2zJKnpPVKnA6LBwjwT2BTjxI7e0Hx30+FoWCgi50e+YO49p6oPOtesP9mXDRiiUg==",
+ "version": "13.5.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.5.4.tgz",
+ "integrity": "sha512-l/k/fvRP/zmB2jkFMfefmFkyZbDkYW0mRM/LB+tH5u9pB98WsHXC0WvDHlGCYp3CH/jlkJPL7gN8nkTQVrQ/2w==",
"cpu": [
"arm64"
],
@@ -236,9 +238,9 @@
}
},
"node_modules/@next/swc-linux-arm64-musl": {
- "version": "13.4.19",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.19.tgz",
- "integrity": "sha512-aU0HkH2XPgxqrbNRBFb3si9Ahu/CpaR5RPmN2s9GiM9qJCiBBlZtRTiEca+DC+xRPyCThTtWYgxjWHgU7ZkyvA==",
+ "version": "13.5.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.5.4.tgz",
+ "integrity": "sha512-YYGb7SlLkI+XqfQa8VPErljb7k9nUnhhRrVaOdfJNCaQnHBcvbT7cx/UjDQLdleJcfyg1Hkn5YSSIeVfjgmkTg==",
"cpu": [
"arm64"
],
@@ -251,9 +253,9 @@
}
},
"node_modules/@next/swc-linux-x64-gnu": {
- "version": "13.4.19",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.19.tgz",
- "integrity": "sha512-htwOEagMa/CXNykFFeAHHvMJeqZfNQEoQvHfsA4wgg5QqGNqD5soeCer4oGlCol6NGUxknrQO6VEustcv+Md+g==",
+ "version": "13.5.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.5.4.tgz",
+ "integrity": "sha512-uE61vyUSClnCH18YHjA8tE1prr/PBFlBFhxBZis4XBRJoR+txAky5d7gGNUIbQ8sZZ7LVkSVgm/5Fc7mwXmRAg==",
"cpu": [
"x64"
],
@@ -266,9 +268,9 @@
}
},
"node_modules/@next/swc-linux-x64-musl": {
- "version": "13.4.19",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.19.tgz",
- "integrity": "sha512-4Gj4vvtbK1JH8ApWTT214b3GwUh9EKKQjY41hH/t+u55Knxi/0wesMzwQRhppK6Ddalhu0TEttbiJ+wRcoEj5Q==",
+ "version": "13.5.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.5.4.tgz",
+ "integrity": "sha512-qVEKFYML/GvJSy9CfYqAdUexA6M5AklYcQCW+8JECmkQHGoPxCf04iMh7CPR7wkHyWWK+XLt4Ja7hhsPJtSnhg==",
"cpu": [
"x64"
],
@@ -281,9 +283,9 @@
}
},
"node_modules/@next/swc-win32-arm64-msvc": {
- "version": "13.4.19",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.19.tgz",
- "integrity": "sha512-bUfDevQK4NsIAHXs3/JNgnvEY+LRyneDN788W2NYiRIIzmILjba7LaQTfihuFawZDhRtkYCv3JDC3B4TwnmRJw==",
+ "version": "13.5.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.5.4.tgz",
+ "integrity": "sha512-mDSQfqxAlfpeZOLPxLymZkX0hYF3juN57W6vFHTvwKlnHfmh12Pt7hPIRLYIShk8uYRsKPtMTth/EzpwRI+u8w==",
"cpu": [
"arm64"
],
@@ -296,9 +298,9 @@
}
},
"node_modules/@next/swc-win32-ia32-msvc": {
- "version": "13.4.19",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.19.tgz",
- "integrity": "sha512-Y5kikILFAr81LYIFaw6j/NrOtmiM4Sf3GtOc0pn50ez2GCkr+oejYuKGcwAwq3jiTKuzF6OF4iT2INPoxRycEA==",
+ "version": "13.5.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.5.4.tgz",
+ "integrity": "sha512-aoqAT2XIekIWoriwzOmGFAvTtVY5O7JjV21giozBTP5c6uZhpvTWRbmHXbmsjZqY4HnEZQRXWkSAppsIBweKqw==",
"cpu": [
"ia32"
],
@@ -311,9 +313,9 @@
}
},
"node_modules/@next/swc-win32-x64-msvc": {
- "version": "13.4.19",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.19.tgz",
- "integrity": "sha512-YzA78jBDXMYiINdPdJJwGgPNT3YqBNNGhsthsDoWHL9p24tEJn9ViQf/ZqTbwSpX/RrkPupLfuuTH2sf73JBAw==",
+ "version": "13.5.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.5.4.tgz",
+ "integrity": "sha512-cyRvlAxwlddlqeB9xtPSfNSCRy8BOa4wtMo0IuI9P7Y0XT2qpDrpFKRyZ7kUngZis59mPVla5k8X1oOJ8RxDYg==",
"cpu": [
"x64"
],
@@ -357,19 +359,51 @@
"node": ">= 8"
}
},
+ "node_modules/@reduxjs/toolkit": {
+ "version": "1.9.7",
+ "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.7.tgz",
+ "integrity": "sha512-t7v8ZPxhhKgOKtU+uyJT13lu4vL7az5aFi4IdoDs/eS548edn2M8Ik9h8fxgvMjGoAUVFSt6ZC1P5cWmQ014QQ==",
+ "dependencies": {
+ "immer": "^9.0.21",
+ "redux": "^4.2.1",
+ "redux-thunk": "^2.4.2",
+ "reselect": "^4.1.8"
+ },
+ "peerDependencies": {
+ "react": "^16.9.0 || ^17.0.0 || ^18",
+ "react-redux": "^7.2.1 || ^8.0.2"
+ },
+ "peerDependenciesMeta": {
+ "react": {
+ "optional": true
+ },
+ "react-redux": {
+ "optional": true
+ }
+ }
+ },
"node_modules/@rushstack/eslint-patch": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.3.3.tgz",
"integrity": "sha512-0xd7qez0AQ+MbHatZTlI1gu5vkG8r7MYRUJAHPAHJBmGLs16zpkrpAVLvjQKQOqaXPDUBwOiJzNc00znHSCVBw=="
},
"node_modules/@swc/helpers": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz",
- "integrity": "sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==",
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz",
+ "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==",
"dependencies": {
"tslib": "^2.4.0"
}
},
+ "node_modules/@types/hoist-non-react-statics": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.3.tgz",
+ "integrity": "sha512-Wny3a2UXn5FEA1l7gc6BbpoV5mD1XijZqgkp4TRgDCDL5r3B5ieOFGUX5h3n78Tr1MEG7BfvoM8qeztdvNU0fw==",
+ "dependencies": {
+ "@types/react": "*",
+ "hoist-non-react-statics": "^3.3.0"
+ }
+ },
"node_modules/@types/json5": {
"version": "0.0.29",
"resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
@@ -408,6 +442,11 @@
"resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz",
"integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ=="
},
+ "node_modules/@types/use-sync-external-store": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz",
+ "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA=="
+ },
"node_modules/@typescript-eslint/parser": {
"version": "6.4.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.4.0.tgz",
@@ -1316,18 +1355,18 @@
}
},
"node_modules/eslint-config-next": {
- "version": "13.4.19",
- "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.4.19.tgz",
- "integrity": "sha512-WE8367sqMnjhWHvR5OivmfwENRQ1ixfNE9hZwQqNCsd+iM3KnuMc1V8Pt6ytgjxjf23D+xbesADv9x3xaKfT3g==",
+ "version": "13.5.4",
+ "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.5.4.tgz",
+ "integrity": "sha512-FzQGIj4UEszRX7fcRSJK6L1LrDiVZvDFW320VVntVKh3BSU8Fb9kpaoxQx0cdFgf3MQXdeSbrCXJ/5Z/NndDkQ==",
"dependencies": {
- "@next/eslint-plugin-next": "13.4.19",
- "@rushstack/eslint-patch": "^1.1.3",
+ "@next/eslint-plugin-next": "13.5.4",
+ "@rushstack/eslint-patch": "^1.3.3",
"@typescript-eslint/parser": "^5.4.2 || ^6.0.0",
"eslint-import-resolver-node": "^0.3.6",
"eslint-import-resolver-typescript": "^3.5.2",
- "eslint-plugin-import": "^2.26.0",
- "eslint-plugin-jsx-a11y": "^6.5.1",
- "eslint-plugin-react": "^7.31.7",
+ "eslint-plugin-import": "^2.28.1",
+ "eslint-plugin-jsx-a11y": "^6.7.1",
+ "eslint-plugin-react": "^7.33.2",
"eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705"
},
"peerDependencies": {
@@ -2043,6 +2082,14 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/hoist-non-react-statics": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
+ "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
+ "dependencies": {
+ "react-is": "^16.7.0"
+ }
+ },
"node_modules/ignore": {
"version": "5.2.4",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
@@ -2051,6 +2098,15 @@
"node": ">= 4"
}
},
+ "node_modules/immer": {
+ "version": "9.0.21",
+ "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz",
+ "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/immer"
+ }
+ },
"node_modules/import-fresh": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
@@ -2638,35 +2694,34 @@
"integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="
},
"node_modules/next": {
- "version": "13.4.19",
- "resolved": "https://registry.npmjs.org/next/-/next-13.4.19.tgz",
- "integrity": "sha512-HuPSzzAbJ1T4BD8e0bs6B9C1kWQ6gv8ykZoRWs5AQoiIuqbGHHdQO7Ljuvg05Q0Z24E2ABozHe6FxDvI6HfyAw==",
+ "version": "13.5.4",
+ "resolved": "https://registry.npmjs.org/next/-/next-13.5.4.tgz",
+ "integrity": "sha512-+93un5S779gho8y9ASQhb/bTkQF17FNQOtXLKAj3lsNgltEcF0C5PMLLncDmH+8X1EnJH1kbqAERa29nRXqhjA==",
"dependencies": {
- "@next/env": "13.4.19",
- "@swc/helpers": "0.5.1",
+ "@next/env": "13.5.4",
+ "@swc/helpers": "0.5.2",
"busboy": "1.6.0",
"caniuse-lite": "^1.0.30001406",
- "postcss": "8.4.14",
+ "postcss": "8.4.31",
"styled-jsx": "5.1.1",
- "watchpack": "2.4.0",
- "zod": "3.21.4"
+ "watchpack": "2.4.0"
},
"bin": {
"next": "dist/bin/next"
},
"engines": {
- "node": ">=16.8.0"
+ "node": ">=16.14.0"
},
"optionalDependencies": {
- "@next/swc-darwin-arm64": "13.4.19",
- "@next/swc-darwin-x64": "13.4.19",
- "@next/swc-linux-arm64-gnu": "13.4.19",
- "@next/swc-linux-arm64-musl": "13.4.19",
- "@next/swc-linux-x64-gnu": "13.4.19",
- "@next/swc-linux-x64-musl": "13.4.19",
- "@next/swc-win32-arm64-msvc": "13.4.19",
- "@next/swc-win32-ia32-msvc": "13.4.19",
- "@next/swc-win32-x64-msvc": "13.4.19"
+ "@next/swc-darwin-arm64": "13.5.4",
+ "@next/swc-darwin-x64": "13.5.4",
+ "@next/swc-linux-arm64-gnu": "13.5.4",
+ "@next/swc-linux-arm64-musl": "13.5.4",
+ "@next/swc-linux-x64-gnu": "13.5.4",
+ "@next/swc-linux-x64-musl": "13.5.4",
+ "@next/swc-win32-arm64-msvc": "13.5.4",
+ "@next/swc-win32-ia32-msvc": "13.5.4",
+ "@next/swc-win32-x64-msvc": "13.5.4"
},
"peerDependencies": {
"@opentelemetry/api": "^1.1.0",
@@ -2684,9 +2739,9 @@
}
},
"node_modules/next/node_modules/postcss": {
- "version": "8.4.14",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz",
- "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==",
+ "version": "8.4.31",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
+ "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
"funding": [
{
"type": "opencollective",
@@ -2695,10 +2750,14 @@
{
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
}
],
"dependencies": {
- "nanoid": "^3.3.4",
+ "nanoid": "^3.3.6",
"picocolors": "^1.0.0",
"source-map-js": "^1.0.2"
},
@@ -3173,6 +3232,49 @@
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
},
+ "node_modules/react-redux": {
+ "version": "8.1.3",
+ "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.1.3.tgz",
+ "integrity": "sha512-n0ZrutD7DaX/j9VscF+uTALI3oUPa/pO4Z3soOBIjuRn/FzVu6aehhysxZCLi6y7duMf52WNZGMl7CtuK5EnRw==",
+ "dependencies": {
+ "@babel/runtime": "^7.12.1",
+ "@types/hoist-non-react-statics": "^3.3.1",
+ "@types/use-sync-external-store": "^0.0.3",
+ "hoist-non-react-statics": "^3.3.2",
+ "react-is": "^18.0.0",
+ "use-sync-external-store": "^1.0.0"
+ },
+ "peerDependencies": {
+ "@types/react": "^16.8 || ^17.0 || ^18.0",
+ "@types/react-dom": "^16.8 || ^17.0 || ^18.0",
+ "react": "^16.8 || ^17.0 || ^18.0",
+ "react-dom": "^16.8 || ^17.0 || ^18.0",
+ "react-native": ">=0.59",
+ "redux": "^4 || ^5.0.0-beta.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ },
+ "react-dom": {
+ "optional": true
+ },
+ "react-native": {
+ "optional": true
+ },
+ "redux": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-redux/node_modules/react-is": {
+ "version": "18.2.0",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz",
+ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w=="
+ },
"node_modules/read-cache": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
@@ -3192,6 +3294,22 @@
"node": ">=8.10.0"
}
},
+ "node_modules/redux": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz",
+ "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==",
+ "dependencies": {
+ "@babel/runtime": "^7.9.2"
+ }
+ },
+ "node_modules/redux-thunk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz",
+ "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==",
+ "peerDependencies": {
+ "redux": "^4"
+ }
+ },
"node_modules/reflect.getprototypeof": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.3.tgz",
@@ -3232,6 +3350,11 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/reselect": {
+ "version": "4.1.8",
+ "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz",
+ "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ=="
+ },
"node_modules/resolve": {
"version": "1.22.4",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz",
@@ -3848,6 +3971,14 @@
"punycode": "^2.1.0"
}
},
+ "node_modules/use-sync-external-store": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz",
+ "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==",
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
"node_modules/util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
@@ -3979,14 +4110,6 @@
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
- },
- "node_modules/zod": {
- "version": "3.21.4",
- "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz",
- "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==",
- "funding": {
- "url": "https://github.com/sponsors/colinhacks"
- }
}
},
"dependencies": {
@@ -4097,70 +4220,70 @@
}
},
"@next/env": {
- "version": "13.4.19",
- "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.19.tgz",
- "integrity": "sha512-FsAT5x0jF2kkhNkKkukhsyYOrRqtSxrEhfliniIq0bwWbuXLgyt3Gv0Ml+b91XwjwArmuP7NxCiGd++GGKdNMQ=="
+ "version": "13.5.4",
+ "resolved": "https://registry.npmjs.org/@next/env/-/env-13.5.4.tgz",
+ "integrity": "sha512-LGegJkMvRNw90WWphGJ3RMHMVplYcOfRWf2Be3td3sUa+1AaxmsYyANsA+znrGCBjXJNi4XAQlSoEfUxs/4kIQ=="
},
"@next/eslint-plugin-next": {
- "version": "13.4.19",
- "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.4.19.tgz",
- "integrity": "sha512-N/O+zGb6wZQdwu6atMZHbR7T9Np5SUFUjZqCbj0sXm+MwQO35M8TazVB4otm87GkXYs2l6OPwARd3/PUWhZBVQ==",
+ "version": "13.5.4",
+ "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.5.4.tgz",
+ "integrity": "sha512-vI94U+D7RNgX6XypSyjeFrOzxGlZyxOplU0dVE5norIfZGn/LDjJYPHdvdsR5vN1eRtl6PDAsOHmycFEOljK5A==",
"requires": {
"glob": "7.1.7"
}
},
"@next/swc-darwin-arm64": {
- "version": "13.4.19",
- "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.19.tgz",
- "integrity": "sha512-vv1qrjXeGbuF2mOkhkdxMDtv9np7W4mcBtaDnHU+yJG+bBwa6rYsYSCI/9Xm5+TuF5SbZbrWO6G1NfTh1TMjvQ==",
+ "version": "13.5.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.5.4.tgz",
+ "integrity": "sha512-Df8SHuXgF1p+aonBMcDPEsaahNo2TCwuie7VXED4FVyECvdXfRT9unapm54NssV9tF3OQFKBFOdlje4T43VO0w==",
"optional": true
},
"@next/swc-darwin-x64": {
- "version": "13.4.19",
- "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.19.tgz",
- "integrity": "sha512-jyzO6wwYhx6F+7gD8ddZfuqO4TtpJdw3wyOduR4fxTUCm3aLw7YmHGYNjS0xRSYGAkLpBkH1E0RcelyId6lNsw==",
+ "version": "13.5.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.5.4.tgz",
+ "integrity": "sha512-siPuUwO45PnNRMeZnSa8n/Lye5ZX93IJom9wQRB5DEOdFrw0JjOMu1GINB8jAEdwa7Vdyn1oJ2xGNaQpdQQ9Pw==",
"optional": true
},
"@next/swc-linux-arm64-gnu": {
- "version": "13.4.19",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.19.tgz",
- "integrity": "sha512-vdlnIlaAEh6H+G6HrKZB9c2zJKnpPVKnA6LBwjwT2BTjxI7e0Hx30+FoWCgi50e+YO49p6oPOtesP9mXDRiiUg==",
+ "version": "13.5.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.5.4.tgz",
+ "integrity": "sha512-l/k/fvRP/zmB2jkFMfefmFkyZbDkYW0mRM/LB+tH5u9pB98WsHXC0WvDHlGCYp3CH/jlkJPL7gN8nkTQVrQ/2w==",
"optional": true
},
"@next/swc-linux-arm64-musl": {
- "version": "13.4.19",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.19.tgz",
- "integrity": "sha512-aU0HkH2XPgxqrbNRBFb3si9Ahu/CpaR5RPmN2s9GiM9qJCiBBlZtRTiEca+DC+xRPyCThTtWYgxjWHgU7ZkyvA==",
+ "version": "13.5.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.5.4.tgz",
+ "integrity": "sha512-YYGb7SlLkI+XqfQa8VPErljb7k9nUnhhRrVaOdfJNCaQnHBcvbT7cx/UjDQLdleJcfyg1Hkn5YSSIeVfjgmkTg==",
"optional": true
},
"@next/swc-linux-x64-gnu": {
- "version": "13.4.19",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.19.tgz",
- "integrity": "sha512-htwOEagMa/CXNykFFeAHHvMJeqZfNQEoQvHfsA4wgg5QqGNqD5soeCer4oGlCol6NGUxknrQO6VEustcv+Md+g==",
+ "version": "13.5.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.5.4.tgz",
+ "integrity": "sha512-uE61vyUSClnCH18YHjA8tE1prr/PBFlBFhxBZis4XBRJoR+txAky5d7gGNUIbQ8sZZ7LVkSVgm/5Fc7mwXmRAg==",
"optional": true
},
"@next/swc-linux-x64-musl": {
- "version": "13.4.19",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.19.tgz",
- "integrity": "sha512-4Gj4vvtbK1JH8ApWTT214b3GwUh9EKKQjY41hH/t+u55Knxi/0wesMzwQRhppK6Ddalhu0TEttbiJ+wRcoEj5Q==",
+ "version": "13.5.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.5.4.tgz",
+ "integrity": "sha512-qVEKFYML/GvJSy9CfYqAdUexA6M5AklYcQCW+8JECmkQHGoPxCf04iMh7CPR7wkHyWWK+XLt4Ja7hhsPJtSnhg==",
"optional": true
},
"@next/swc-win32-arm64-msvc": {
- "version": "13.4.19",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.19.tgz",
- "integrity": "sha512-bUfDevQK4NsIAHXs3/JNgnvEY+LRyneDN788W2NYiRIIzmILjba7LaQTfihuFawZDhRtkYCv3JDC3B4TwnmRJw==",
+ "version": "13.5.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.5.4.tgz",
+ "integrity": "sha512-mDSQfqxAlfpeZOLPxLymZkX0hYF3juN57W6vFHTvwKlnHfmh12Pt7hPIRLYIShk8uYRsKPtMTth/EzpwRI+u8w==",
"optional": true
},
"@next/swc-win32-ia32-msvc": {
- "version": "13.4.19",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.19.tgz",
- "integrity": "sha512-Y5kikILFAr81LYIFaw6j/NrOtmiM4Sf3GtOc0pn50ez2GCkr+oejYuKGcwAwq3jiTKuzF6OF4iT2INPoxRycEA==",
+ "version": "13.5.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.5.4.tgz",
+ "integrity": "sha512-aoqAT2XIekIWoriwzOmGFAvTtVY5O7JjV21giozBTP5c6uZhpvTWRbmHXbmsjZqY4HnEZQRXWkSAppsIBweKqw==",
"optional": true
},
"@next/swc-win32-x64-msvc": {
- "version": "13.4.19",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.19.tgz",
- "integrity": "sha512-YzA78jBDXMYiINdPdJJwGgPNT3YqBNNGhsthsDoWHL9p24tEJn9ViQf/ZqTbwSpX/RrkPupLfuuTH2sf73JBAw==",
+ "version": "13.5.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.5.4.tgz",
+ "integrity": "sha512-cyRvlAxwlddlqeB9xtPSfNSCRy8BOa4wtMo0IuI9P7Y0XT2qpDrpFKRyZ7kUngZis59mPVla5k8X1oOJ8RxDYg==",
"optional": true
},
"@nodelib/fs.scandir": {
@@ -4186,19 +4309,39 @@
"fastq": "^1.6.0"
}
},
+ "@reduxjs/toolkit": {
+ "version": "1.9.7",
+ "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.7.tgz",
+ "integrity": "sha512-t7v8ZPxhhKgOKtU+uyJT13lu4vL7az5aFi4IdoDs/eS548edn2M8Ik9h8fxgvMjGoAUVFSt6ZC1P5cWmQ014QQ==",
+ "requires": {
+ "immer": "^9.0.21",
+ "redux": "^4.2.1",
+ "redux-thunk": "^2.4.2",
+ "reselect": "^4.1.8"
+ }
+ },
"@rushstack/eslint-patch": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.3.3.tgz",
"integrity": "sha512-0xd7qez0AQ+MbHatZTlI1gu5vkG8r7MYRUJAHPAHJBmGLs16zpkrpAVLvjQKQOqaXPDUBwOiJzNc00znHSCVBw=="
},
"@swc/helpers": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz",
- "integrity": "sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==",
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz",
+ "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==",
"requires": {
"tslib": "^2.4.0"
}
},
+ "@types/hoist-non-react-statics": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.3.tgz",
+ "integrity": "sha512-Wny3a2UXn5FEA1l7gc6BbpoV5mD1XijZqgkp4TRgDCDL5r3B5ieOFGUX5h3n78Tr1MEG7BfvoM8qeztdvNU0fw==",
+ "requires": {
+ "@types/react": "*",
+ "hoist-non-react-statics": "^3.3.0"
+ }
+ },
"@types/json5": {
"version": "0.0.29",
"resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
@@ -4237,6 +4380,11 @@
"resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz",
"integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ=="
},
+ "@types/use-sync-external-store": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz",
+ "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA=="
+ },
"@typescript-eslint/parser": {
"version": "6.4.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.4.0.tgz",
@@ -4861,18 +5009,18 @@
}
},
"eslint-config-next": {
- "version": "13.4.19",
- "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.4.19.tgz",
- "integrity": "sha512-WE8367sqMnjhWHvR5OivmfwENRQ1ixfNE9hZwQqNCsd+iM3KnuMc1V8Pt6ytgjxjf23D+xbesADv9x3xaKfT3g==",
+ "version": "13.5.4",
+ "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.5.4.tgz",
+ "integrity": "sha512-FzQGIj4UEszRX7fcRSJK6L1LrDiVZvDFW320VVntVKh3BSU8Fb9kpaoxQx0cdFgf3MQXdeSbrCXJ/5Z/NndDkQ==",
"requires": {
- "@next/eslint-plugin-next": "13.4.19",
- "@rushstack/eslint-patch": "^1.1.3",
+ "@next/eslint-plugin-next": "13.5.4",
+ "@rushstack/eslint-patch": "^1.3.3",
"@typescript-eslint/parser": "^5.4.2 || ^6.0.0",
"eslint-import-resolver-node": "^0.3.6",
"eslint-import-resolver-typescript": "^3.5.2",
- "eslint-plugin-import": "^2.26.0",
- "eslint-plugin-jsx-a11y": "^6.5.1",
- "eslint-plugin-react": "^7.31.7",
+ "eslint-plugin-import": "^2.28.1",
+ "eslint-plugin-jsx-a11y": "^6.7.1",
+ "eslint-plugin-react": "^7.33.2",
"eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705"
}
},
@@ -5383,11 +5531,24 @@
"has-symbols": "^1.0.2"
}
},
+ "hoist-non-react-statics": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
+ "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
+ "requires": {
+ "react-is": "^16.7.0"
+ }
+ },
"ignore": {
"version": "5.2.4",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
"integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ=="
},
+ "immer": {
+ "version": "9.0.21",
+ "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz",
+ "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA=="
+ },
"import-fresh": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
@@ -5798,35 +5959,34 @@
"integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="
},
"next": {
- "version": "13.4.19",
- "resolved": "https://registry.npmjs.org/next/-/next-13.4.19.tgz",
- "integrity": "sha512-HuPSzzAbJ1T4BD8e0bs6B9C1kWQ6gv8ykZoRWs5AQoiIuqbGHHdQO7Ljuvg05Q0Z24E2ABozHe6FxDvI6HfyAw==",
+ "version": "13.5.4",
+ "resolved": "https://registry.npmjs.org/next/-/next-13.5.4.tgz",
+ "integrity": "sha512-+93un5S779gho8y9ASQhb/bTkQF17FNQOtXLKAj3lsNgltEcF0C5PMLLncDmH+8X1EnJH1kbqAERa29nRXqhjA==",
"requires": {
- "@next/env": "13.4.19",
- "@next/swc-darwin-arm64": "13.4.19",
- "@next/swc-darwin-x64": "13.4.19",
- "@next/swc-linux-arm64-gnu": "13.4.19",
- "@next/swc-linux-arm64-musl": "13.4.19",
- "@next/swc-linux-x64-gnu": "13.4.19",
- "@next/swc-linux-x64-musl": "13.4.19",
- "@next/swc-win32-arm64-msvc": "13.4.19",
- "@next/swc-win32-ia32-msvc": "13.4.19",
- "@next/swc-win32-x64-msvc": "13.4.19",
- "@swc/helpers": "0.5.1",
+ "@next/env": "13.5.4",
+ "@next/swc-darwin-arm64": "13.5.4",
+ "@next/swc-darwin-x64": "13.5.4",
+ "@next/swc-linux-arm64-gnu": "13.5.4",
+ "@next/swc-linux-arm64-musl": "13.5.4",
+ "@next/swc-linux-x64-gnu": "13.5.4",
+ "@next/swc-linux-x64-musl": "13.5.4",
+ "@next/swc-win32-arm64-msvc": "13.5.4",
+ "@next/swc-win32-ia32-msvc": "13.5.4",
+ "@next/swc-win32-x64-msvc": "13.5.4",
+ "@swc/helpers": "0.5.2",
"busboy": "1.6.0",
"caniuse-lite": "^1.0.30001406",
- "postcss": "8.4.14",
+ "postcss": "8.4.31",
"styled-jsx": "5.1.1",
- "watchpack": "2.4.0",
- "zod": "3.21.4"
+ "watchpack": "2.4.0"
},
"dependencies": {
"postcss": {
- "version": "8.4.14",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz",
- "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==",
+ "version": "8.4.31",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
+ "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
"requires": {
- "nanoid": "^3.3.4",
+ "nanoid": "^3.3.6",
"picocolors": "^1.0.0",
"source-map-js": "^1.0.2"
}
@@ -6125,6 +6285,26 @@
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
},
+ "react-redux": {
+ "version": "8.1.3",
+ "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.1.3.tgz",
+ "integrity": "sha512-n0ZrutD7DaX/j9VscF+uTALI3oUPa/pO4Z3soOBIjuRn/FzVu6aehhysxZCLi6y7duMf52WNZGMl7CtuK5EnRw==",
+ "requires": {
+ "@babel/runtime": "^7.12.1",
+ "@types/hoist-non-react-statics": "^3.3.1",
+ "@types/use-sync-external-store": "^0.0.3",
+ "hoist-non-react-statics": "^3.3.2",
+ "react-is": "^18.0.0",
+ "use-sync-external-store": "^1.0.0"
+ },
+ "dependencies": {
+ "react-is": {
+ "version": "18.2.0",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz",
+ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w=="
+ }
+ }
+ },
"read-cache": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
@@ -6141,6 +6321,20 @@
"picomatch": "^2.2.1"
}
},
+ "redux": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz",
+ "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==",
+ "requires": {
+ "@babel/runtime": "^7.9.2"
+ }
+ },
+ "redux-thunk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz",
+ "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==",
+ "requires": {}
+ },
"reflect.getprototypeof": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.3.tgz",
@@ -6169,6 +6363,11 @@
"functions-have-names": "^1.2.3"
}
},
+ "reselect": {
+ "version": "4.1.8",
+ "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz",
+ "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ=="
+ },
"resolve": {
"version": "1.22.4",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz",
@@ -6577,6 +6776,12 @@
"punycode": "^2.1.0"
}
},
+ "use-sync-external-store": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz",
+ "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==",
+ "requires": {}
+ },
"util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
@@ -6672,11 +6877,6 @@
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
"integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="
- },
- "zod": {
- "version": "3.21.4",
- "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz",
- "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw=="
}
}
}
diff --git a/package.json b/package.json
index 6915a5f..cf83c44 100644
--- a/package.json
+++ b/package.json
@@ -9,16 +9,18 @@
"lint": "next lint"
},
"dependencies": {
+ "@reduxjs/toolkit": "^1.9.7",
"@types/node": "20.5.1",
"@types/react": "18.2.20",
"@types/react-dom": "18.2.7",
"autoprefixer": "10.4.15",
"eslint": "8.47.0",
- "eslint-config-next": "13.4.19",
- "next": "13.4.19",
+ "eslint-config-next": "^13.5.4",
+ "next": "^13.5.4",
"postcss": "8.4.28",
- "react": "18.2.0",
- "react-dom": "18.2.0",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0",
+ "react-redux": "^8.1.3",
"tailwindcss": "3.3.3",
"typescript": "5.1.6"
}
diff --git a/public/zano45-9.png b/public/zano45-9.png
new file mode 100644
index 0000000..9d6dfbc
Binary files /dev/null and b/public/zano45-9.png differ
diff --git a/src/app/(index)/layout.tsx b/src/app/(index)/layout.tsx
new file mode 100644
index 0000000..c8a5205
--- /dev/null
+++ b/src/app/(index)/layout.tsx
@@ -0,0 +1,67 @@
+import '../globals.css'
+import type { Metadata } from 'next'
+import { Inter } from 'next/font/google'
+import HamberMenu from '../components/layout/hamber-menu'
+import { headers } from 'next/headers';
+import OrderContextProvider from '@/context/OrderContextProvider';
+import ReduxProvider from '../redux/provider';
+
+
+const inter = Inter({ subsets: ['latin'] })
+
+export const metadata: Metadata = {
+ title: 'Fesahat CRM',
+ description: 'Perfect CRM software',
+}
+
+export default function RootLayout({
+ children,
+}: {
+ children: React.ReactNode
+}) {
+
+ const headersList = headers();
+ const activePath = headersList.get('x-invoke-path');
+ //const navigation = use
+ return (
+
+
+
+
+
+
+
+ - صفحه اصلی
+ - سفارشات
+ - تیکت ها
+ - چک ها
+ - واریزی ها
+ - صورت حساب
+
+
+
+
+
+
+
+
+
+
+ محمد جواد فصاحت
+
+
+
+
+
+
+ {children}
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/src/app/(index)/page.tsx b/src/app/(index)/page.tsx
new file mode 100644
index 0000000..bd5beb2
--- /dev/null
+++ b/src/app/(index)/page.tsx
@@ -0,0 +1,53 @@
+import { Fragment } from "react"
+import { headers } from 'next/headers';
+import Link from "next/link";
+
+const Page = ()=>{
+
+ const headersList = headers();
+ const activePath = headersList.get('x-invoke-path');
+
+ return (
+ <>
+ { activePath == '/' ?
+
+
+
+
+
+ سفارشات
+
+
+
+
+
+
+ تیکت ها
+
+
+
+ چک ها
+
+
+
+ واریزی ها
+
+
+
+ صورت حساب
+
+
+
+
+
+
+ : null }
+
+
+
+
+ >
+ )
+}
+
+export default Page
\ No newline at end of file
diff --git a/src/app/(index)/shop/layout.tsx b/src/app/(index)/shop/layout.tsx
new file mode 100644
index 0000000..45aa63a
--- /dev/null
+++ b/src/app/(index)/shop/layout.tsx
@@ -0,0 +1,40 @@
+import OrderItem from '@/app/components/layout/order-item'
+import OrdersList from '@/app/components/layout/shop/orders-list'
+import type { Metadata } from 'next'
+
+export const metadata: Metadata = {
+ title: 'Fesahat Shop',
+ description: 'Perfect CRM software',
+}
+
+export default function ShopLayout({
+ children,
+}: {
+ children: React.ReactNode
+}) {
+ return (
+
+
+ {children}
+
+
+
سبد خرید شما
+
+
+
+
+
+
+
+
+
+
مشاهده کامل سبد خرید
+
+ ثبت نهایی
+
+
+
+
+
+ )
+}
diff --git a/src/app/(index)/shop/page.tsx b/src/app/(index)/shop/page.tsx
new file mode 100644
index 0000000..4799304
--- /dev/null
+++ b/src/app/(index)/shop/page.tsx
@@ -0,0 +1,46 @@
+import ProductCategoryBox from '@/app/components/layout/shop/products-cat'
+import Image from 'next/image'
+
+const Page = ()=>{
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ )
+}
+
+export default Page
\ No newline at end of file
diff --git a/src/app/(index)/shop/product/[id]/page.tsx b/src/app/(index)/shop/product/[id]/page.tsx
new file mode 100644
index 0000000..584a181
--- /dev/null
+++ b/src/app/(index)/shop/product/[id]/page.tsx
@@ -0,0 +1,48 @@
+'use client'
+import Products from '@/app/components/layout/shop/products'
+import Image from 'next/image'
+import Link from 'next/link'
+import { useRouter } from 'next/navigation'
+
+
+const Page = ()=>{
+ const router = useRouter()
+ return (
+ <>
+
+
+
+
+ سیفون پایه دار سیفون پایه دار
+
+
+ { router.back() }} className='cursor-pointer bg-cyan-700 pr-1 pl-1 text-white text-[0.9rem] rounded'>بازگشت
+
+
+
+
+
+
+
+
+
+
+
{ router.back() }} className='w-full text-center bg-gray-800 text-white rounded mt-2 p-2'>
+ بازگشت به صفحه قبل
+
+
+
+
+
+ >
+ )
+}
+
+export default Page
\ No newline at end of file
diff --git a/src/app/layout.tsx b/src/app/(login_register)/layout.tsx
similarity index 53%
rename from src/app/layout.tsx
rename to src/app/(login_register)/layout.tsx
index ae84562..d5eca56 100644
--- a/src/app/layout.tsx
+++ b/src/app/(login_register)/layout.tsx
@@ -1,12 +1,12 @@
-import './globals.css'
+import '../globals.css'
import type { Metadata } from 'next'
import { Inter } from 'next/font/google'
const inter = Inter({ subsets: ['latin'] })
export const metadata: Metadata = {
- title: 'Create Next App',
- description: 'Generated by create next app',
+ title: 'Fesahat CRM',
+ description: 'Perfect CRM software',
}
export default function RootLayout({
@@ -15,8 +15,12 @@ export default function RootLayout({
children: React.ReactNode
}) {
return (
-
- {children}
+
+
+
+ {children}
+
+
)
}
diff --git a/src/app/(login_register)/login/page.tsx b/src/app/(login_register)/login/page.tsx
new file mode 100644
index 0000000..708bc88
--- /dev/null
+++ b/src/app/(login_register)/login/page.tsx
@@ -0,0 +1,32 @@
+import { Fragment } from "react"
+
+const Page = ()=>{
+ return (
+
+
+
+ )
+}
+
+export default Page
\ No newline at end of file
diff --git a/src/app/(login_register)/register/layout.tsx b/src/app/(login_register)/register/layout.tsx
new file mode 100644
index 0000000..a14e64f
--- /dev/null
+++ b/src/app/(login_register)/register/layout.tsx
@@ -0,0 +1,16 @@
+export const metadata = {
+ title: 'Next.js',
+ description: 'Generated by Next.js',
+}
+
+export default function RootLayout({
+ children,
+}: {
+ children: React.ReactNode
+}) {
+ return (
+
+ {children}
+
+ )
+}
diff --git a/src/app/(login_register)/register/page.tsx b/src/app/(login_register)/register/page.tsx
new file mode 100644
index 0000000..6576145
--- /dev/null
+++ b/src/app/(login_register)/register/page.tsx
@@ -0,0 +1,16 @@
+import { Fragment } from "react"
+
+const Page = ()=>{
+ return (
+
+
+ 01
+
+
+ 02
+
+
+ )
+}
+
+export default Page
\ No newline at end of file
diff --git a/src/app/components/layout/hamber-menu.tsx b/src/app/components/layout/hamber-menu.tsx
new file mode 100644
index 0000000..7d03c3d
--- /dev/null
+++ b/src/app/components/layout/hamber-menu.tsx
@@ -0,0 +1,16 @@
+'use client'
+import { useState } from "react"
+import TopMenu from "./top-menu"
+
+
+const HamberMenu = ()=>{
+ const [showMenu, setShowMenu] = useState(false)
+ return (
+
+ { setShowMenu(!showMenu) }} >منو
+
+
+ )
+}
+
+export default HamberMenu
\ No newline at end of file
diff --git a/src/app/components/layout/order-item.tsx b/src/app/components/layout/order-item.tsx
new file mode 100644
index 0000000..a83954c
--- /dev/null
+++ b/src/app/components/layout/order-item.tsx
@@ -0,0 +1,49 @@
+interface OrderItemProps {
+
+}
+
+
+const OrderItem = ()=>{
+ return (
+ <>
+
+
+ سه راهي دريچه بازديد 90 درجه
+
+
+
+
+
+ سایز
+
+
+
+ تعداد
+
+
+ قیمت
+
+
+
+
+
+
+
+ 110*3.2
+
+
+
+ 24 کارتن
+
+
+ 5.598.058
+
+
+
+
+
+ >
+ )
+}
+
+export default OrderItem
\ No newline at end of file
diff --git a/src/app/components/layout/shop/orders-list.tsx b/src/app/components/layout/shop/orders-list.tsx
new file mode 100644
index 0000000..a853081
--- /dev/null
+++ b/src/app/components/layout/shop/orders-list.tsx
@@ -0,0 +1,31 @@
+'use client'
+import { useOrderContext } from "@/context/OrderContext"
+import OrderItem from "../order-item"
+import { useSelector } from 'react-redux'
+import { RootState } from "@/app/redux/store"
+
+const OrdersList = ()=>{
+ const {orderList} = useOrderContext()
+ const count = useSelector((state: RootState) => state.counter.counter_value )
+
+ return (
+ <>
+ {count}
+ {orderList.map((iteamo: any)=>(
+ {iteamo}
+ ))}
+
+
+
+
+
+
+
+
+
+
+ >
+ )
+}
+
+export default OrdersList
\ No newline at end of file
diff --git a/src/app/components/layout/shop/products-cat.tsx b/src/app/components/layout/shop/products-cat.tsx
new file mode 100644
index 0000000..7a96bc7
--- /dev/null
+++ b/src/app/components/layout/shop/products-cat.tsx
@@ -0,0 +1,23 @@
+import Image from "next/image"
+import Link from "next/link"
+
+
+const ProductCategoryBox = ()=>{
+ return (
+
+
سیفون پایه دار
+
+
+
+
+ 23 نوع
+
+
+ مشاهده
+
+
+
+ )
+}
+
+export default ProductCategoryBox
\ No newline at end of file
diff --git a/src/app/components/layout/shop/products.tsx b/src/app/components/layout/shop/products.tsx
new file mode 100644
index 0000000..6c7b490
--- /dev/null
+++ b/src/app/components/layout/shop/products.tsx
@@ -0,0 +1,44 @@
+'use client'
+import { useOrderContext } from "@/context/OrderContext"
+import Image from "next/image"
+import Link from "next/link"
+import { useDispatch } from "react-redux"
+import { incr } from "@/app/redux/features/couterSlice"
+
+
+const Products = ()=>{
+ const {addToOrderList} = useOrderContext()
+ const dispatch = useDispatch()
+
+ return (
+ <>
+
+
+
+
+ سایز
+ 110*3.2
+
+
+
+ قیمت
+ 1060000
+
+
+
+
+
+
+
+
+ { dispatch ( incr() ) } }>inc
+ { addToOrderList('salam') }} className='cursor-pointer bg-lime-600 text-white rounded pt-1 pb-1 w-full text-center'>ثبت
+
+
+
+ >
+
+ )
+}
+
+export default Products
\ No newline at end of file
diff --git a/src/app/components/layout/top-menu.tsx b/src/app/components/layout/top-menu.tsx
new file mode 100644
index 0000000..2d450ef
--- /dev/null
+++ b/src/app/components/layout/top-menu.tsx
@@ -0,0 +1,23 @@
+import Link from 'next/link'
+
+interface TopMenuProps {
+ showMenu: boolean,
+ setShowMenu: Function,
+}
+
+const TopMenu = (props: TopMenuProps)=>{
+ return (
+
+ { props.setShowMenu(false) }} href={"/"}>
+ - صفحه اصلی
+
+ - سفارشات
+ - تیکت ها
+ - چک ها
+ - واریزی ها
+ - صورت حساب
+
+ )
+}
+
+export default TopMenu
\ No newline at end of file
diff --git a/src/app/globals.css b/src/app/globals.css
index fd81e88..b5c61c9 100644
--- a/src/app/globals.css
+++ b/src/app/globals.css
@@ -1,27 +1,3 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
-
-:root {
- --foreground-rgb: 0, 0, 0;
- --background-start-rgb: 214, 219, 220;
- --background-end-rgb: 255, 255, 255;
-}
-
-@media (prefers-color-scheme: dark) {
- :root {
- --foreground-rgb: 255, 255, 255;
- --background-start-rgb: 0, 0, 0;
- --background-end-rgb: 0, 0, 0;
- }
-}
-
-body {
- color: rgb(var(--foreground-rgb));
- background: linear-gradient(
- to bottom,
- transparent,
- rgb(var(--background-end-rgb))
- )
- rgb(var(--background-start-rgb));
-}
diff --git a/src/app/page.tsx b/src/app/page.tsx
deleted file mode 100644
index e38c626..0000000
--- a/src/app/page.tsx
+++ /dev/null
@@ -1,113 +0,0 @@
-import Image from 'next/image'
-
-export default function Home() {
- return (
-
-
-
- Get started by editing
- src/app/page.tsx
-
-
-
-
-
-
-
-
-
-
- )
-}
diff --git a/src/app/redux/features/couterSlice.ts b/src/app/redux/features/couterSlice.ts
new file mode 100644
index 0000000..8000bde
--- /dev/null
+++ b/src/app/redux/features/couterSlice.ts
@@ -0,0 +1,27 @@
+'use client'
+
+import { createSlice } from "@reduxjs/toolkit"
+
+interface CounterState {
+ counter_value: number
+}
+
+const initialState: CounterState = {
+ counter_value: 0
+}
+
+export const counterSlice = createSlice({
+ name: 'counter',
+ initialState,
+ reducers: {
+ incr: (state)=>{
+ state.counter_value += 1
+ },
+ decr: (state)=>{
+ state.counter_value -= 1
+ },
+ },
+})
+
+export const { incr, decr } = counterSlice.actions;
+export default counterSlice.reducer;
\ No newline at end of file
diff --git a/src/app/redux/provider.tsx b/src/app/redux/provider.tsx
new file mode 100644
index 0000000..0340d75
--- /dev/null
+++ b/src/app/redux/provider.tsx
@@ -0,0 +1,14 @@
+'use client'
+
+import { Provider } from "react-redux"
+import { store } from "./store"
+
+const ReduxProvider = ({children} : {children: React.ReactNode})=>{
+ return (
+
+ { children }
+
+ )
+}
+
+export default ReduxProvider
\ No newline at end of file
diff --git a/src/app/redux/store.ts b/src/app/redux/store.ts
new file mode 100644
index 0000000..8b4d284
--- /dev/null
+++ b/src/app/redux/store.ts
@@ -0,0 +1,15 @@
+'use client'
+
+import { configureStore } from "@reduxjs/toolkit"
+import couterReducer from "./features/couterSlice"
+
+
+export const store = configureStore({
+ reducer: {
+ counter: couterReducer
+ },
+})
+
+export type RootState = ReturnType
+export type AppDispatch = typeof store.dispatch
+
diff --git a/src/context/OrderContext.ts b/src/context/OrderContext.ts
new file mode 100644
index 0000000..94e629c
--- /dev/null
+++ b/src/context/OrderContext.ts
@@ -0,0 +1,18 @@
+import { createContext, useContext } from "react"
+
+
+interface IOrderContext{
+ orderList: any,
+ addToOrderList: (product: any)=>void
+
+}
+
+export const OrderContext = createContext({
+ orderList: [],
+ addToOrderList(product) {
+
+ },
+})
+
+export const useOrderContext = ()=> useContext(OrderContext);
+
diff --git a/src/context/OrderContextProvider.tsx b/src/context/OrderContextProvider.tsx
new file mode 100644
index 0000000..67e17f4
--- /dev/null
+++ b/src/context/OrderContextProvider.tsx
@@ -0,0 +1,29 @@
+'use client'
+import React, {ReactNode, useState, useEffect} from 'react'
+import { OrderContext } from './OrderContext'
+
+interface IProps {
+ children: ReactNode
+}
+
+const OrderContextProvider = ({children}: IProps)=>{
+ const [orderList, setOrderList] = useState([])
+
+ useEffect(()=>{
+ setOrderList(['salam1', 'salam2'])
+ }, [])
+
+ const addToOrderList = (norderList: any) => {
+ setOrderList([...orderList, norderList])
+ }
+ return (
+
+ {children}
+
+ )
+}
+
+export default OrderContextProvider
\ No newline at end of file