diff --git a/.env b/.env
new file mode 100644
index 0000000..bd5351d
--- /dev/null
+++ b/.env
@@ -0,0 +1 @@
+ENV = production
\ No newline at end of file
diff --git a/.eslintrc.js b/.eslintrc.js
new file mode 100644
index 0000000..bd90d97
--- /dev/null
+++ b/.eslintrc.js
@@ -0,0 +1,12 @@
+module.exports = {
+ // ...
+ rules: {
+ quotes: ["error", "single"],
+ // we want to force semicolons
+ semi: ["error", "always"],
+ // we use 2 spaces to indent our code
+ indent: ["error", 2],
+ // we want to avoid extraneous spaces
+ "no-multi-spaces": ["error"],
+ },
+};
diff --git a/.eslintrc.json b/.eslintrc.json
new file mode 100644
index 0000000..0aceefe
--- /dev/null
+++ b/.eslintrc.json
@@ -0,0 +1,20 @@
+{
+ "env": {
+ "browser": true,
+ "es2021": true
+ },
+ "extends": [
+ "eslint:recommended",
+ "plugin:react/recommended",
+ "plugin:react-hooks/recommended"
+ ],
+ "parserOptions": {
+ "ecmaVersion": 12,
+ "sourceType": "module",
+ "ecmaFeatures": {
+ "jsx": true
+ }
+ },
+ "plugins": ["react", "react-hooks"],
+ "rules": {}
+}
diff --git a/.gitignore b/.gitignore
new file mode 100755
index 0000000..24ce172
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,24 @@
+# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
+
+# dependencies
+/node_modules
+/.pnp
+.pnp.js
+
+pnpm-lock.yaml
+# testing
+/coverage
+
+# production
+/build
+
+# misc
+.DS_Store
+.env.local
+.env.development.local
+.env.test.local
+.env.production.local
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+package-lock.json
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..54360f6
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,20 @@
+{
+ "cSpell.words": [
+ "aldeen",
+ "antd",
+ "Datepicker",
+ "formik",
+ "Karim",
+ "queryqlent",
+ "szhsin",
+ "Viewelement",
+ "zustand"
+ ],
+ "editor.formatOnSave": true,
+ "editor.formatOnPaste": false,
+ "prettier.useTabs": false,
+ "editor.codeActionsOnSave": {
+ "source.fixAll.eslint": "explicit"
+ },
+ "eslint.validate": ["javascript"]
+}
diff --git a/db.json b/db.json
new file mode 100644
index 0000000..4c839ed
--- /dev/null
+++ b/db.json
@@ -0,0 +1,110 @@
+{
+ "example": [
+ {
+ "id": 1,
+ "name": "ibrahim",
+ "email": "ibrahim@gmail.com"
+ },
+ {
+ "id": 2,
+ "name": "gregr",
+ "email": "ibrahimgmail.com"
+ },
+ {
+ "id": 3,
+ "name": "mhmad",
+ "email": "mhmad@gmial.com"
+ },
+ {
+ "id": 4,
+ "name": "soso",
+ "email": "soso@gmail.com"
+ },
+ {
+ "id": 5,
+ "name": "few",
+ "email": "jfpwrej"
+ },
+ {
+ "id": 6,
+ "name": "sos",
+ "email": "fdwf"
+ },
+ {
+ "id": 7,
+ "name": "sos",
+ "email": "fdwf"
+ },
+ {
+ "id": 8,
+ "name": "sos",
+ "email": "fdwf"
+ }
+ ],
+ "test2": [
+ {
+ "id": 1,
+ "email": "admin@adamin.com"
+ },
+ {
+ "id": 1,
+ "email": "admin@adamin.com"
+ },
+ {
+ "id": 1,
+ "email": "admin@adamin.com"
+ },
+ {
+ "id": 1,
+ "email": "admin@adamin.com"
+ }
+ ],
+ "users": [
+ {
+ "id": 1,
+ "email": "admin@adamin.com",
+ "password": "password",
+ "token": "token"
+ }
+ ],
+ "activities": [
+ {
+ "id": 1,
+ "image": "/public/Activities/data-display/Rectangle 103.png",
+ "title": "nunc id cursus metus aliquam eleifend mi",
+ "text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ultrices tincidunt arcu non sodales neque sodales ut etiam sit.",
+ "location": "Consectetur adipiscing elit, sed do",
+ "time": "25 JAN 2024 - 30 JAN 2024"
+ },
+ {
+ "id": 2,
+ "image": "/public/Activities/data-display/Rectangle 103.png",
+ "title": "nunc id cursus metus aliquam eleifend mi",
+ "text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ultrices tincidunt arcu non sodales neque sodales ut etiam sit.",
+ "location": "Consectetur adipiscing elit, sed do",
+ "time": "25 JAN 2024 - 30 JAN 2024"
+ },
+ {
+ "id": 3,
+ "image": "/public/Activities/data-display/Rectangle 103.png",
+ "title": "nunc id cursus metus aliquam eleifend mi",
+ "text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ultrices tincidunt arcu non sodales neque sodales ut etiam sit.",
+ "location": "Consectetur adipiscing elit, sed do",
+ "time": "25 JAN 2024 - 30 JAN 2024"
+ }
+ ],
+ "activities/popular": [
+ {
+ "first": "25 JAN 2024",
+ "second": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod "
+ },
+ {
+ "first": "25 JAN 2024",
+ "second": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod "
+ },
+ {
+ "first": "25 JAN 2024",
+ "second": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod "
+ }
+ ]
+}
diff --git a/eslint.config.mjs b/eslint.config.mjs
new file mode 100644
index 0000000..a7ef612
--- /dev/null
+++ b/eslint.config.mjs
@@ -0,0 +1,12 @@
+import globals from "globals";
+import pluginJs from "@eslint/js";
+import tseslint from "typescript-eslint";
+import pluginReactConfig from "eslint-plugin-react/configs/recommended.js";
+import { fixupConfigRules } from "@eslint/compat";
+
+export default [
+ { languageOptions: { globals: globals.browser } },
+ pluginJs.configs.recommended,
+ ...tseslint.configs.recommended,
+ ...fixupConfigRules(pluginReactConfig),
+];
diff --git a/index.html b/index.html
new file mode 100755
index 0000000..ecb7d1a
--- /dev/null
+++ b/index.html
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ React-Start-App
+
+
+ You need to enable JavaScript to run this app.
+
+
+
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..cb4bf7f
--- /dev/null
+++ b/package.json
@@ -0,0 +1,87 @@
+{
+ "name": "my-app",
+ "version": "0.1.0",
+ "private": true,
+ "dependencies": {
+ "@ant-design/icons": "^5.3.7",
+ "@reduxjs/toolkit": "^2.2.5",
+ "@types/node": "^16.18.98",
+ "@types/react": "^18.3.3",
+ "@types/react-dom": "^18.3.0",
+ "@types/react-helmet": "^6.1.11",
+ "antd": "^5.18.0",
+ "axios": "^1.7.2",
+ "bootstrap": "^5.3.3",
+ "chart.js": "^4.4.3",
+ "dayjs": "^1.11.11",
+ "firebase": "^10.12.2",
+ "formik": "^2.4.6",
+ "i18next": "^23.11.5",
+ "json-server": "^0.17.4",
+ "lodash": "^4.17.21",
+ "lodash.debounce": "^4.0.8",
+ "prettier": "^3.3.1",
+ "react": "^18.3.1",
+ "react-bootstrap": "^2.10.2",
+ "react-dom": "^18.3.1",
+ "react-helmet": "^6.1.0",
+ "react-i18next": "^13.5.0",
+ "react-icons": "^4.12.0",
+ "react-player": "^2.16.0",
+ "react-query": "^3.39.3",
+ "react-redux": "^9.1.2",
+ "react-router-dom": "^6.23.1",
+ "react-toastify": "^10.0.5",
+ "reactstrap": "^9.2.2",
+ "sass": "^1.77.4",
+ "socket.io-client": "^4.7.5",
+ "swiper": "^11.1.4",
+ "typescript": "^4.9.5",
+ "yup": "^1.4.0",
+ "zustand": "^4.5.2"
+ },
+ "scripts": {
+ "start": "vite --port=3000",
+ "build": "vite build",
+ "format": "prettier --write .",
+ "test": "react-scripts test",
+ "eject": "react-scripts eject",
+ "g:api": "node src/Extensions/FileGenerator/generateApi.js",
+ "g:column": "node src/Extensions/FileGenerator/generateColumn.js",
+ "g:formutil": "node src/Extensions/FileGenerator/generateformUtils.js",
+ "g:page": "node src/Extensions/FileGenerator/generatePage.js",
+ "g:dashboard": "node src/Extensions/FileGenerator/generateDashboard.js ",
+ "g:modal:add": "node src/Extensions/FileGenerator/generateEditModal.js ",
+ "g:model:edit": "node src/Extensions/FileGenerator/generateEditModal.js "
+ },
+ "eslintConfig": {
+ "extends": [
+ "react-app",
+ "react-app/jest"
+ ]
+ },
+ "browserslist": {
+ "production": [
+ ">0.2%",
+ "not dead",
+ "not op_mini all"
+ ],
+ "development": [
+ "last 1 chrome version",
+ "last 1 firefox version",
+ "last 1 safari version"
+ ]
+ },
+ "devDependencies": {
+ "@eslint/compat": "^1.0.3",
+ "@eslint/js": "^9.4.0",
+ "@types/lodash": "^4.17.4",
+ "@vitejs/plugin-react": "^4.3.0",
+ "eslint": "^9.4.0",
+ "eslint-plugin-react": "^7.34.2",
+ "eslint-plugin-react-hooks": "^4.6.2",
+ "globals": "^15.3.0",
+ "typescript-eslint": "^7.12.0",
+ "vite": "^5.2.12"
+ }
+}
diff --git a/public/About/AboutUS.png b/public/About/AboutUS.png
new file mode 100644
index 0000000..467a7b0
Binary files /dev/null and b/public/About/AboutUS.png differ
diff --git a/public/About/Hands.png b/public/About/Hands.png
new file mode 100644
index 0000000..fc9a6dd
Binary files /dev/null and b/public/About/Hands.png differ
diff --git a/public/About/Laptop.png b/public/About/Laptop.png
new file mode 100644
index 0000000..8ff1400
Binary files /dev/null and b/public/About/Laptop.png differ
diff --git a/public/About/Media.png b/public/About/Media.png
new file mode 100644
index 0000000..da987ef
Binary files /dev/null and b/public/About/Media.png differ
diff --git a/public/About/line.svg b/public/About/line.svg
new file mode 100644
index 0000000..71bcd58
--- /dev/null
+++ b/public/About/line.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/public/Activities/data-display/2 25.png b/public/Activities/data-display/2 25.png
new file mode 100644
index 0000000..55a67ad
Binary files /dev/null and b/public/Activities/data-display/2 25.png differ
diff --git a/public/Activities/data-display/Rectangle 103.png b/public/Activities/data-display/Rectangle 103.png
new file mode 100644
index 0000000..e6b0d8b
Binary files /dev/null and b/public/Activities/data-display/Rectangle 103.png differ
diff --git a/public/Activities/iconsSearch.svg b/public/Activities/iconsSearch.svg
new file mode 100644
index 0000000..e7b4dc2
--- /dev/null
+++ b/public/Activities/iconsSearch.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/public/Activities/main.png b/public/Activities/main.png
new file mode 100644
index 0000000..46e3d05
Binary files /dev/null and b/public/Activities/main.png differ
diff --git a/public/Activities/mediaIcons/Group.png b/public/Activities/mediaIcons/Group.png
new file mode 100644
index 0000000..63dee7b
Binary files /dev/null and b/public/Activities/mediaIcons/Group.png differ
diff --git a/public/Activities/mediaIcons/insta.png b/public/Activities/mediaIcons/insta.png
new file mode 100644
index 0000000..65f4a69
Binary files /dev/null and b/public/Activities/mediaIcons/insta.png differ
diff --git a/public/Activities/mediaIcons/teleg.png b/public/Activities/mediaIcons/teleg.png
new file mode 100644
index 0000000..d1c2ebe
Binary files /dev/null and b/public/Activities/mediaIcons/teleg.png differ
diff --git a/public/Activities/mediaIcons/whats.png b/public/Activities/mediaIcons/whats.png
new file mode 100644
index 0000000..e857fdf
Binary files /dev/null and b/public/Activities/mediaIcons/whats.png differ
diff --git a/public/App/Ar.svg b/public/App/Ar.svg
new file mode 100644
index 0000000..c409129
--- /dev/null
+++ b/public/App/Ar.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/public/App/Logo.png b/public/App/Logo.png
new file mode 100644
index 0000000..6d64fe9
Binary files /dev/null and b/public/App/Logo.png differ
diff --git a/public/App/Logo.svg b/public/App/Logo.svg
new file mode 100644
index 0000000..b4fa18d
--- /dev/null
+++ b/public/App/Logo.svg
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/public/Cart/CartProduct.png b/public/Cart/CartProduct.png
new file mode 100644
index 0000000..eee158c
Binary files /dev/null and b/public/Cart/CartProduct.png differ
diff --git a/public/Contact/ContactImage.png b/public/Contact/ContactImage.png
new file mode 100644
index 0000000..d93ac19
Binary files /dev/null and b/public/Contact/ContactImage.png differ
diff --git a/public/Faqs/FaqsImage.png b/public/Faqs/FaqsImage.png
new file mode 100644
index 0000000..6ca8e66
Binary files /dev/null and b/public/Faqs/FaqsImage.png differ
diff --git a/public/Home/BatteryLife.png b/public/Home/BatteryLife.png
new file mode 100644
index 0000000..64e89b9
Binary files /dev/null and b/public/Home/BatteryLife.png differ
diff --git a/public/Home/Bose_Headphones.png b/public/Home/Bose_Headphones.png
new file mode 100644
index 0000000..abfa723
Binary files /dev/null and b/public/Home/Bose_Headphones.png differ
diff --git a/public/Home/HeadPhone.png b/public/Home/HeadPhone.png
new file mode 100644
index 0000000..769e4ce
Binary files /dev/null and b/public/Home/HeadPhone.png differ
diff --git a/public/Home/HeroSection.png b/public/Home/HeroSection.png
new file mode 100644
index 0000000..af5be13
Binary files /dev/null and b/public/Home/HeroSection.png differ
diff --git a/public/Home/HeroShape.png b/public/Home/HeroShape.png
new file mode 100644
index 0000000..cd5a97d
Binary files /dev/null and b/public/Home/HeroShape.png differ
diff --git a/public/Home/HeroShape.svg b/public/Home/HeroShape.svg
new file mode 100644
index 0000000..bef788d
--- /dev/null
+++ b/public/Home/HeroShape.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/Home/Noise_Cancellation.png b/public/Home/Noise_Cancellation.png
new file mode 100644
index 0000000..b800039
Binary files /dev/null and b/public/Home/Noise_Cancellation.png differ
diff --git a/public/Home/Noise_Cancellation.svg b/public/Home/Noise_Cancellation.svg
new file mode 100644
index 0000000..ef55a08
--- /dev/null
+++ b/public/Home/Noise_Cancellation.svg
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/public/Home/PerfectSound.png b/public/Home/PerfectSound.png
new file mode 100644
index 0000000..bc4937f
Binary files /dev/null and b/public/Home/PerfectSound.png differ
diff --git a/public/Home/big_transparent_leaf.png b/public/Home/big_transparent_leaf.png
new file mode 100644
index 0000000..13b3eb0
Binary files /dev/null and b/public/Home/big_transparent_leaf.png differ
diff --git a/public/Home/leaf.png b/public/Home/leaf.png
new file mode 100644
index 0000000..0e02a35
Binary files /dev/null and b/public/Home/leaf.png differ
diff --git a/public/Home/p1.png b/public/Home/p1.png
new file mode 100644
index 0000000..795cc4c
Binary files /dev/null and b/public/Home/p1.png differ
diff --git a/public/Home/partner1.png b/public/Home/partner1.png
new file mode 100644
index 0000000..7b9af23
Binary files /dev/null and b/public/Home/partner1.png differ
diff --git a/public/Home/partner2.png b/public/Home/partner2.png
new file mode 100644
index 0000000..c801fa9
Binary files /dev/null and b/public/Home/partner2.png differ
diff --git a/public/Home/slider-shape.png b/public/Home/slider-shape.png
new file mode 100644
index 0000000..0045d57
Binary files /dev/null and b/public/Home/slider-shape.png differ
diff --git a/public/Home/small_transparent_leaf.png b/public/Home/small_transparent_leaf.png
new file mode 100644
index 0000000..b312c50
Binary files /dev/null and b/public/Home/small_transparent_leaf.png differ
diff --git a/public/Layout/Ar.svg b/public/Layout/Ar.svg
new file mode 100755
index 0000000..c409129
--- /dev/null
+++ b/public/Layout/Ar.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/public/Layout/Ch.jpg b/public/Layout/Ch.jpg
new file mode 100644
index 0000000..fac2ac1
Binary files /dev/null and b/public/Layout/Ch.jpg differ
diff --git a/public/Layout/EmptyOrder.png b/public/Layout/EmptyOrder.png
new file mode 100644
index 0000000..ab61e13
Binary files /dev/null and b/public/Layout/EmptyOrder.png differ
diff --git a/public/Layout/En.svg b/public/Layout/En.svg
new file mode 100755
index 0000000..b1db6ff
--- /dev/null
+++ b/public/Layout/En.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/public/Layout/Footer.jpg b/public/Layout/Footer.jpg
new file mode 100644
index 0000000..43476c8
Binary files /dev/null and b/public/Layout/Footer.jpg differ
diff --git a/public/Layout/Footer/1.png b/public/Layout/Footer/1.png
new file mode 100644
index 0000000..49a8ee3
Binary files /dev/null and b/public/Layout/Footer/1.png differ
diff --git a/public/Layout/Footer/2.png b/public/Layout/Footer/2.png
new file mode 100644
index 0000000..7158919
Binary files /dev/null and b/public/Layout/Footer/2.png differ
diff --git a/public/Layout/Footer/3.png b/public/Layout/Footer/3.png
new file mode 100644
index 0000000..5b25347
Binary files /dev/null and b/public/Layout/Footer/3.png differ
diff --git a/public/Layout/Footer/4.png b/public/Layout/Footer/4.png
new file mode 100644
index 0000000..178f1e7
Binary files /dev/null and b/public/Layout/Footer/4.png differ
diff --git a/public/Layout/KarimLogo.svg b/public/Layout/KarimLogo.svg
new file mode 100755
index 0000000..0544713
--- /dev/null
+++ b/public/Layout/KarimLogo.svg
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/public/Layout/KarimLogo.tsx b/public/Layout/KarimLogo.tsx
new file mode 100644
index 0000000..61167b0
--- /dev/null
+++ b/public/Layout/KarimLogo.tsx
@@ -0,0 +1,54 @@
+import React from "react";
+
+const KarimLogo = () => {
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ );
+};
+
+export default KarimLogo;
diff --git a/public/Layout/LoginBg.jpg b/public/Layout/LoginBg.jpg
new file mode 100644
index 0000000..fc3a090
Binary files /dev/null and b/public/Layout/LoginBg.jpg differ
diff --git a/public/Layout/dark.svg b/public/Layout/dark.svg
new file mode 100644
index 0000000..a5020a5
--- /dev/null
+++ b/public/Layout/dark.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/public/Layout/light.svg b/public/Layout/light.svg
new file mode 100644
index 0000000..f484697
--- /dev/null
+++ b/public/Layout/light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/public/firebase-messaging-sw.js b/public/firebase-messaging-sw.js
new file mode 100644
index 0000000..f316b91
--- /dev/null
+++ b/public/firebase-messaging-sw.js
@@ -0,0 +1,29 @@
+importScripts("https://www.gstatic.com/firebasejs/8.2.0/firebase-app.js");
+importScripts("https://www.gstatic.com/firebasejs/8.2.0/firebase-messaging.js");
+
+// Initialize the Firebase app in the service worker by passing the generated config
+const firebaseConfig = {
+ apiKey: "AIzaSyCcg92Eqrw7TzL8fBQVklVKXwuT3hu0GIQ",
+ authDomain: "dm-store-678d4.firebaseapp.com",
+ projectId: "dm-store-678d4",
+ storageBucket: "dm-store-678d4.appspot.com",
+ messagingSenderId: "91725694575",
+ appId: "1:91725694575:web:6ce7f7d0dfdf807c376f9a",
+ measurementId: "G-TZRGSK472N"
+};
+
+firebase.initializeApp(firebaseConfig);
+
+// Retrieve firebase messaging
+const messaging = firebase.messaging();
+
+messaging.onBackgroundMessage(function (payload) {
+ console.log("Received background message ", payload);
+
+ const notificationTitle = payload.notification.title;
+ const notificationOptions = {
+ body: payload.notification.body,
+ };
+
+ self.registration.showNotification(notificationTitle, notificationOptions);
+});
\ No newline at end of file
diff --git a/public/icon/percent.svg b/public/icon/percent.svg
new file mode 100644
index 0000000..be5c388
--- /dev/null
+++ b/public/icon/percent.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/index.html b/public/index.html
new file mode 100755
index 0000000..ecb7d1a
--- /dev/null
+++ b/public/index.html
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ React-Start-App
+
+
+ You need to enable JavaScript to run this app.
+
+
+
diff --git a/public/robots.txt b/public/robots.txt
new file mode 100755
index 0000000..e9e57dc
--- /dev/null
+++ b/public/robots.txt
@@ -0,0 +1,3 @@
+# https://www.robotstxt.org/robotstxt.html
+User-agent: *
+Disallow:
diff --git a/public/site.webmanifest b/public/site.webmanifest
new file mode 100644
index 0000000..ea26d6f
--- /dev/null
+++ b/public/site.webmanifest
@@ -0,0 +1,27 @@
+{
+ "name": "ReactStart-App",
+ "short_name": "RS",
+ "description": "A social networking platform with automated content moderation and context-based authentication system.",
+ "start_url": "/",
+ "display": "standalone",
+ "background_color": "#ffffff",
+ "theme_color": "#000000",
+ "icons": [
+ {
+ "src": "./App/Logo.svg",
+ "sizes": "192x192",
+ "type": "image/png"
+ },
+ {
+ "src": "./App/Logo.svg",
+ "sizes": "512x512",
+ "type": "image/png"
+ },
+ {
+ "src": "./App/Logo.svg",
+ "sizes": "192x192",
+ "type": "image/png",
+ "purpose": "maskable"
+ }
+ ]
+}
diff --git a/src/App.tsx b/src/App.tsx
new file mode 100755
index 0000000..999b8b4
--- /dev/null
+++ b/src/App.tsx
@@ -0,0 +1,57 @@
+import { Suspense, useEffect } from "react";
+import { Route, Routes } from "react-router-dom";
+import Layout from "./Layout/Ui/Layout";
+import { routes } from "./Routes";
+import { Spin } from "antd";
+import { useGuest } from "./api/auth";
+import useAuthState from "./state/AuthState";
+import { requestPermission } from "./utils/firebase/firebase";
+
+const App = () => {
+ const { data, mutate } = useGuest();
+ const { Guest, setGuest } = useAuthState();
+
+ useEffect(() => {
+ if (data) {
+ //@ts-ignore
+ const guest = data?.token;
+ setGuest(guest);
+
+ }
+ }, [data]);
+
+ useEffect(() => {
+ const fn_firebase = (async () => {
+ const token = await requestPermission()
+ if (!Guest) {
+ mutate({ fcm_token: token });
+ }
+ })
+ fn_firebase()
+ }, [Guest])
+
+ if (!Guest) {
+ return ;
+ }
+ return (
+
+ {routes?.map((route: any) => (
+ }>
+ {route.withLayout ? (
+ {route.element}
+ ) : (
+ route.element
+ )}
+
+ }
+ />
+ ))}
+
+ );
+};
+
+export default App;
diff --git a/src/Components/Auth/AuthTabs.tsx b/src/Components/Auth/AuthTabs.tsx
new file mode 100644
index 0000000..7695026
--- /dev/null
+++ b/src/Components/Auth/AuthTabs.tsx
@@ -0,0 +1,39 @@
+import React from 'react';
+import { Tabs } from 'antd';
+import type { TabsProps } from 'antd';
+import { useTranslation } from 'react-i18next';
+import RegisterForm from '../../Pages/Auth/Register';
+import LoginForm from '../../Pages/Auth/LoginForm';
+import VerifyForm from '../../Pages/Auth/VerifyForm';
+
+const AuthTabs = ({setOpen}:any) => {
+
+ const {t} = useTranslation();
+
+ const items: TabsProps['items'] = [
+ {
+ key: '1',
+ label: t('Login'),
+ children: ,
+
+ },
+ {
+ key: '2',
+ label: t('Create Account'),
+ children: ,
+
+ },
+ {
+ key: '3',
+ label: t('Verify'),
+ children: ,
+
+ },
+ ];
+
+ return (
+
+ )
+}
+
+export default AuthTabs
\ No newline at end of file
diff --git a/src/Components/Cart/CardItem.tsx b/src/Components/Cart/CardItem.tsx
new file mode 100644
index 0000000..2c5f8aa
--- /dev/null
+++ b/src/Components/Cart/CardItem.tsx
@@ -0,0 +1,105 @@
+import {
+ CloseOutlined,
+ MinusCircleOutlined,
+ PlusCircleFilled,
+} from "@ant-design/icons";
+import React, { useState } from "react";
+import { Card, Skeleton, Button, Tooltip, Popconfirm } from "antd";
+import useLoadingState from "../../Hooks/useLoadingState";
+import { TProduct } from "../../types/Cart";
+import { FaRegTrashAlt, FaTruck, FaPlus } from "react-icons/fa";
+import { useTranslation } from "react-i18next";
+import { MdOutlineVerified } from "react-icons/md";
+import { FiMinus } from "react-icons/fi";
+import CustomImage from "../../ui/CustomImage";
+import { Product } from "../../types/item";
+import { useCartState } from "../../state/CartState";
+import { languageObject } from "../../utils/languageObject";
+import { Currency } from "../../Layout/app/Const";
+
+interface CartItemProps {
+ data: Product;
+}
+
+const CardItem: React.FC = ({ data }) => {
+ const [loading, resetLoading] = useLoadingState(true, 2000);
+ const { t } = useTranslation();
+ const { setCart, deleteFromCart, removeFromCart } = useCartState();
+
+ const addToCart = () => {
+ setCart(data);
+ };
+
+ const DeleteFromCart = () => {
+ deleteFromCart(data?.id);
+ };
+ const RemoveFromCart = () => {
+ removeFromCart(data?.id);
+ };
+
+ const price = (data?.quantity ?? 1) * data?.price;
+
+ return (
+
+
+
+
+
+
+
+ {languageObject(data?.name)}
+
+ {t("Free Delivery")}
+
+
+ {t("Guaranteed")}
+
+
+
+
+ {price} {Currency}{" "}
+
+
+
+
{
+ RemoveFromCart();
+ }}
+ className="trashIcon"
+ />
+
+ {
+ DeleteFromCart();
+ }}
+ >
+
+
+ {data?.quantity}
+ {
+ addToCart();
+ }}
+ >
+ {" "}
+
+
+
+
+
+
+
+ );
+};
+
+export default CardItem;
diff --git a/src/Components/Cart/Cart.tsx b/src/Components/Cart/Cart.tsx
new file mode 100644
index 0000000..cc61d94
--- /dev/null
+++ b/src/Components/Cart/Cart.tsx
@@ -0,0 +1,12 @@
+import CartWithDrawer from '../HOC/CartWithDrawer'
+
+const ViewCart = () => {
+
+ return (
+
+
+
+ )
+}
+
+export default ViewCart
\ No newline at end of file
diff --git a/src/Components/Categories/BrandFilter.tsx b/src/Components/Categories/BrandFilter.tsx
new file mode 100644
index 0000000..4d06896
--- /dev/null
+++ b/src/Components/Categories/BrandFilter.tsx
@@ -0,0 +1,47 @@
+import React from "react";
+import { Checkbox } from "antd";
+import type { CheckboxProps } from "antd";
+import { useFilterStateState } from "../../state/Filter";
+import { useGetCategories } from "../../api/Categories";
+import { Category } from "../../types/item";
+import { languageObject } from "../../utils/languageObject";
+
+const BrandFilter = () => {
+ const { setFilter, Filter } = useFilterStateState();
+ const onChange =
+ (Category: Category): CheckboxProps["onChange"] =>
+ (e) => {
+ const checked = e.target.checked;
+
+ if (checked) {
+ setFilter([...Filter, { name:Category?.name,id:Category?.id,type:"category", index: Filter.length }]);
+ } else {
+ const newArray = Filter?.filter((item: any) => item.name !== Category?.name);
+ setFilter(newArray);
+ }
+ };
+
+
+
+ const {data:categories_data} = useGetCategories({
+ parent_id:''
+ })
+ const categories = categories_data?.categories as Category[] || [] ;
+
+ return (
+
+ {categories?.map((brand) => (
+ item.name === brand?.name)}
+ key={brand?.id}
+ onChange={onChange(brand)}
+
+ >
+ {languageObject(brand?.name)}
+
+ ))}
+
+ );
+};
+
+export default BrandFilter;
diff --git a/src/Components/Categories/Connectivity.tsx b/src/Components/Categories/Connectivity.tsx
new file mode 100644
index 0000000..c2ed845
--- /dev/null
+++ b/src/Components/Categories/Connectivity.tsx
@@ -0,0 +1,49 @@
+import React from "react";
+import { Checkbox } from "antd";
+import type { CheckboxProps } from "antd";
+import { useFilterStateState } from "../../state/Filter";
+import { useGetCategories } from "../../api/Categories";
+import { Category } from "../../types/item";
+import { languageObject } from "../../utils/languageObject";
+import { useGetBaseSubCategory } from "../../api/baseSubCategory";
+
+const BrandFilter = () => {
+ const { setFilter, Filter } = useFilterStateState();
+ const onChange =
+ (Category: Category): CheckboxProps["onChange"] =>
+ (e) => {
+ const checked = e.target.checked;
+ console.log(Category);
+ console.log(languageObject(Category?.name));
+
+ if (checked) {
+
+ setFilter([...Filter, { name:languageObject(Category?.name),id:Category?.id,type:"sub_category", index: Filter.length }]);
+ } else {
+ const newArray = Filter?.filter((item: any) => item.name !== languageObject(Category?.name));
+ setFilter(newArray);
+ }
+ };
+
+
+
+ const {data:categories_data} = useGetBaseSubCategory()
+ const categories = categories_data?.[0] as Category[] || [] ;
+
+ return (
+
+ {categories?.map((brand) => (
+ languageObject(item?.name) === languageObject(brand?.name))}
+ key={brand?.id}
+ onChange={onChange(brand)}
+
+ >
+ {languageObject(brand?.name)}
+
+ ))}
+
+ );
+};
+
+export default BrandFilter;
diff --git a/src/Components/Categories/WearingStyle.tsx b/src/Components/Categories/WearingStyle.tsx
new file mode 100644
index 0000000..d37d490
--- /dev/null
+++ b/src/Components/Categories/WearingStyle.tsx
@@ -0,0 +1,43 @@
+import React from "react";
+import { Checkbox } from "antd";
+import type { CheckboxProps } from "antd";
+import { useFilterStateState } from "../../state/Filter";
+
+const WearingStyleFilter = () => {
+ const { setFilter, Filter } = useFilterStateState();
+ const onChange =
+ (name: string): CheckboxProps["onChange"] =>
+ (e) => {
+ const checked = e.target.checked;
+
+ if (checked) {
+ setFilter([...Filter, { name, index: Filter.length }]);
+ } else {
+ const newArray = Filter?.filter((item: any) => item.name !== name);
+ setFilter(newArray);
+ }
+ };
+
+ const array_of_filter = [
+ "WearingStyle1",
+ "WearingStyle2",
+ "WearingStyle3",
+ "WearingStyle4",
+ "WearingStyle5",
+ ];
+ return (
+
+ {array_of_filter?.map((WearingStyle) => (
+ item.name === WearingStyle)}
+ key={WearingStyle}
+ onChange={onChange(WearingStyle)}
+ >
+ {WearingStyle}
+
+ ))}
+
+ );
+};
+
+export default WearingStyleFilter;
diff --git a/src/Components/Core/Media/Media.tsx b/src/Components/Core/Media/Media.tsx
new file mode 100644
index 0000000..31fea45
--- /dev/null
+++ b/src/Components/Core/Media/Media.tsx
@@ -0,0 +1,14 @@
+import { mediaData } from "../../../data/MediaData";
+
+export default function Media() {
+ return (
+
+
WE ARE SOCIAL
+
+ {mediaData.map((item, index) => {
+ return
;
+ })}
+
+
+ );
+}
diff --git a/src/Components/Core/Search/SearchComponent.tsx b/src/Components/Core/Search/SearchComponent.tsx
new file mode 100644
index 0000000..1243caf
--- /dev/null
+++ b/src/Components/Core/Search/SearchComponent.tsx
@@ -0,0 +1,22 @@
+//@ts-ignore
+import searchIcons from "../../../../public/Activities/iconsSearch.svg";
+import useSearchQueryWithoutConfirm from "../../../Hooks/useSearchQueryWithoutConfirm";
+export default function SearchComponent() {
+ const { inputValue, setInputValue } = useSearchQueryWithoutConfirm({
+ queryParams: "search",
+ });
+ return (
+
+
SEARCH
+
setInputValue(e.target.value)}
+ value={inputValue}
+ type="text"
+ placeholder="Enter Your Keyword"
+ style={{
+ backgroundImage: `url(${searchIcons})`,
+ }}
+ />
+
+ );
+}
diff --git a/src/Components/HOC/AuthWithDrawer.tsx b/src/Components/HOC/AuthWithDrawer.tsx
new file mode 100644
index 0000000..a6f2a78
--- /dev/null
+++ b/src/Components/HOC/AuthWithDrawer.tsx
@@ -0,0 +1,54 @@
+import React, { useState } from 'react';
+import type { DrawerProps } from 'antd';
+import { Button, Drawer, Space } from 'antd';
+import { BsArrowLeft } from 'react-icons/bs';
+import { useTranslation } from 'react-i18next';
+import AuthTabs from '../Auth/AuthTabs';
+import useAuthState from '../../state/AuthState';
+import { FaUser } from 'react-icons/fa';
+import { LuUser2 } from "react-icons/lu";
+import { useNavigate } from 'react-router-dom';
+import SettingDrawer from './SettingDrawer';
+
+
+const WithDrawer: React.FC = () => {
+
+ const [open, setOpen] = useState(false);
+ const [placement, setPlacement] = useState('right');
+ const {t} = useTranslation();
+ const {isAuthenticated} = useAuthState()
+ const navigate = useNavigate()
+
+ return (
+ <>
+
+ {isAuthenticated?
+
+ :
+ setOpen(true)} icon={t("Login / Sign Up")} className='MenuButton' type='primary' />
+ }
+
+ setOpen(false)}
+ open={open}
+ key={placement}
+ width={600}
+ className='AuthAithDrawer'
+ style={{maxHeight:"90%"}}
+ >
+
+ setOpen(false)}> {t("Back")}
+
+
+
+ >
+ );
+};
+
+export default WithDrawer;
+
diff --git a/src/Components/HOC/CartWithDrawer.tsx b/src/Components/HOC/CartWithDrawer.tsx
new file mode 100644
index 0000000..af510ea
--- /dev/null
+++ b/src/Components/HOC/CartWithDrawer.tsx
@@ -0,0 +1,108 @@
+import React, { useState, ReactNode, useEffect } from "react";
+import type { DrawerProps } from "antd";
+import { Badge, Button, Drawer, Space } from "antd";
+import CardItem from "../Cart/CardItem";
+import { BsArrowLeft, BsCart } from "react-icons/bs";
+import { Link } from "react-router-dom";
+import { useTranslation } from "react-i18next";
+import { useCartState } from "../../state/CartState";
+import { Currency } from "../../Layout/app/Const";
+import useAuthState from "../../state/AuthState";
+import { LocalStorageEnum } from "../../api/utils/LocalStorage";
+import { useAddOrder } from "../../api/order";
+import { toast } from "react-toastify";
+import { BiBasket } from "react-icons/bi";
+
+const CartWithDrawer = () => {
+ const [open, setOpen] = useState(false);
+ const [placement, setPlacement] = useState("right");
+ const { t } = useTranslation();
+ const { Cart, calculateTotalPrice, calculateTotalQuantity, removeCart } =
+ useCartState();
+ const { user } = useAuthState();
+ const { mutate, isLoading, isSuccess } = useAddOrder();
+ const products = Cart?.map((item: any) => ({
+ quantity: item?.quantity,
+ id: item?.id,
+ }));
+
+ const addOrder = () => {
+ mutate({
+ email: user?.email,
+ products: products,
+ form: ["adding orders"],
+ });
+ };
+
+ useEffect(() => {
+ if (isSuccess) {
+
+ removeCart();
+ toast.success("order added success");
+ setOpen(false);
+ }
+ }, [isSuccess]);
+
+ return (
+ <>
+
+
+ setOpen(true)} className="icon_navbar">
+
+
+
+
+
+ setOpen(false)}
+ open={open}
+ key={placement}
+ width={550}
+ style={{maxHeight:"90%"}}
+ >
+
+ {t("Cart")}
+ setOpen(false)}>
+ {t("Back To Shopping")}
+
+
+
+
+
+ {Cart.map((item: any, index: number) => (
+
+ ))}
+
+
+ {Cart?.length > 0 ? (
+
+
+ {t("Grand Total")}
+
+
+ {" "}
+ {calculateTotalPrice()} {Currency}{" "}
+
+
+
addOrder()}
+ type="primary"
+ block
+ >
+ {t("Checkout")}
+
+
+ ) : (
+
+ )}
+
+
+ >
+ );
+};
+
+export default CartWithDrawer;
diff --git a/src/Components/HOC/ChangeMode.tsx b/src/Components/HOC/ChangeMode.tsx
new file mode 100644
index 0000000..e41fe5f
--- /dev/null
+++ b/src/Components/HOC/ChangeMode.tsx
@@ -0,0 +1,26 @@
+import React, { memo, useCallback } from "react";
+import { useTranslation } from "react-i18next";
+import { TChangeMode, TModeIcon } from "../../types/ChangeMode";
+
+
+export const ChangeModeHelper = ({ ChangeModeFunction, ChangeFunctionAttr }:TChangeMode) => {
+ const handleClick = useCallback(() => {
+ ChangeModeFunction(ChangeFunctionAttr);
+ }, [ChangeModeFunction, ChangeFunctionAttr]);
+
+ return handleClick;
+};
+
+export const ChangeModeComp = ({onClickFunction, src, modeText,icon, isImage = true}:TModeIcon) =>{
+ const { t } = useTranslation();
+ const ModeContainer = memo(() => (
+
+ {isImage
+ ?
+ : icon
+ }
+ {t(modeText)}
+
+ ));
+ return ;
+}
diff --git a/src/Components/HOC/SearchWithDrawer.tsx b/src/Components/HOC/SearchWithDrawer.tsx
new file mode 100644
index 0000000..53a8c7a
--- /dev/null
+++ b/src/Components/HOC/SearchWithDrawer.tsx
@@ -0,0 +1,56 @@
+import React, { useState, ReactNode } from 'react';
+import type { DrawerProps } from 'antd';
+import { Badge, Button, Drawer, Space } from 'antd';
+import CardItem from '../Cart/CardItem';
+import { BsArrowLeft, BsCart, BsSearch } from 'react-icons/bs';
+import { Link } from 'react-router-dom';
+import { ShoppingCartOutlined } from '@ant-design/icons';
+import { useCartData } from '../../Redux/DispatchData';
+import { useTranslation } from 'react-i18next';
+import { TiDeleteOutline } from "react-icons/ti";
+import SearchButton from '../Utils/Search/SearchButton';
+import { GoClock } from "react-icons/go";
+import { FiDelete } from "react-icons/fi";
+import { RiSearch2Line, RiSearchLine } from "react-icons/ri";
+
+
+
+const SearchWithDrawer = () => {
+ const [open, setOpen] = useState(false);
+ const [placement, setPlacement] = useState('right');
+ const { DataCart,count} = useCartData()
+ const {t} = useTranslation();
+
+
+ return (
+ <>
+
+ setOpen(true)} className="icon_navbar">
+
+
+
+
+ setOpen(false)}
+ open={open}
+ key={placement}
+ width ={700}
+ style={{maxHeight:"40%"}}
+ >
+
+
+ setOpen(false)}>
+
+
+
+
+
+ >
+ );
+};
+
+export default SearchWithDrawer;
+
diff --git a/src/Components/HOC/SettingDrawer.tsx b/src/Components/HOC/SettingDrawer.tsx
new file mode 100644
index 0000000..45ff942
--- /dev/null
+++ b/src/Components/HOC/SettingDrawer.tsx
@@ -0,0 +1,73 @@
+import React, { useState } from 'react';
+import type { DrawerProps } from 'antd';
+import { Drawer, Space } from 'antd';
+import { BsArrowLeft } from 'react-icons/bs';
+import { useTranslation } from 'react-i18next';
+import { FaShoppingBag } from 'react-icons/fa';
+import { LuUser2 } from "react-icons/lu";
+import { useNavigate } from 'react-router-dom';
+import { CgProfile } from 'react-icons/cg';
+import SettingDrawerSingleTab from '../Setting/SettingDrawerSingleTab';
+import { IoMdHeartEmpty } from 'react-icons/io';
+import { CiLogout } from 'react-icons/ci';
+import { LocalStorageEnum } from '../../api/utils/LocalStorage';
+import useAuthState from '../../state/AuthState';
+
+
+const SettingDrawer: React.FC = () => {
+
+ const {t} = useTranslation();
+ const SettingDrawerData = [
+ { tabName: "Orders", icon: FaShoppingBag },
+ { tabName: "Wish List", icon: IoMdHeartEmpty },
+ ];
+
+ const {logout} = useAuthState()
+ const [open, setOpen] = useState(false);
+ const [placement, setPlacement] = useState('right');
+ const User = JSON.parse(localStorage.getItem(LocalStorageEnum.USER_KEY) ?? "");
+
+ return (
+ <>
+
+ setOpen(true)}>
+
+
+ setOpen(false)}
+ open={open}
+ key={placement}
+ width={270}
+ style={{maxHeight:"44%"}}
+ >
+
+
{t("Profile")}
+
setOpen(false)}> {t("Back")}
+
+
+
+
+
+
{User?.name}
+ {User?.email}
+
+
+
+
+ {SettingDrawerData.map((data, index) => (
+ setOpen(false)} key={index} Icon={data.icon} tabName={data.tabName} />
+ ))}
+
+
+
+
+
+ >
+ );
+};
+
+export default SettingDrawer;
+
diff --git a/src/Components/HOC/WithFormik.tsx b/src/Components/HOC/WithFormik.tsx
new file mode 100644
index 0000000..c77026c
--- /dev/null
+++ b/src/Components/HOC/WithFormik.tsx
@@ -0,0 +1,28 @@
+import { Form, Formik } from "formik";
+import React from "react";
+import * as Yup from "yup";
+
+const WithFormik = ({ children }: any) => {
+ const getInitialValues = () => {
+ return { name: "" };
+ };
+ const getValidationSchema = () => {
+ return Yup.object().shape({});
+ };
+ const handleSubmit = () => {};
+ return (
+
+ {
+
+ {(formik) => }
+
+ }
+
+ );
+};
+
+export default WithFormik;
diff --git a/src/Components/HOC/withVisibale.tsx b/src/Components/HOC/withVisibale.tsx
new file mode 100644
index 0000000..fc738c6
--- /dev/null
+++ b/src/Components/HOC/withVisibale.tsx
@@ -0,0 +1,32 @@
+import { useEffect, useRef, useState } from "react";
+
+// This is your Layout Component
+const Visibale = ({ children, ...props }: any) => {
+ const ref = useRef();
+ const [isVisible, setIsVisible] = useState(false);
+
+ useEffect(() => {
+ const observer = new IntersectionObserver(([entry]) => {
+ if (isVisible === false) {
+ setIsVisible(entry.isIntersecting);
+ }
+ });
+ if (ref.current) {
+ observer.observe(ref.current);
+ }
+ return () => {
+ if (ref.current) {
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ observer.unobserve(ref.current);
+ }
+ };
+ }, [isVisible]); // Empty array ensures effect is only run on mount and unmount
+
+ return (
+
+ {isVisible && children}
+
+ );
+};
+
+export default Visibale;
diff --git a/src/Components/Home/BatteryLife.tsx b/src/Components/Home/BatteryLife.tsx
new file mode 100644
index 0000000..326aa63
--- /dev/null
+++ b/src/Components/Home/BatteryLife.tsx
@@ -0,0 +1,18 @@
+import React from "react";
+import { useTranslation } from "react-i18next";
+
+const BatteryLife = () => {
+ const {t} = useTranslation();
+ return (
+
+
+
{t("Up to 20 hours battery life")}
+
{t("Enjoy up to 20 hours of listening, enough time to pore through this entire playlist. So you can keep the music — or the quiet — going all day long. And when it finally runs down, a quick 15-minute charge gives you another 2.5 hours")}.
+
+
+
+
+ );
+};
+
+export default BatteryLife;
diff --git a/src/Components/Home/BestSale.tsx b/src/Components/Home/BestSale.tsx
new file mode 100644
index 0000000..9fab39d
--- /dev/null
+++ b/src/Components/Home/BestSale.tsx
@@ -0,0 +1,25 @@
+import { useNavigate } from "react-router-dom";
+import { useTranslation } from "react-i18next";
+import ProductSwiper from "./ProductSwiper";
+
+const Products = () => {
+ const {t} = useTranslation();
+
+ const navigate = useNavigate();
+ const handelSeeAll = () => {
+ navigate(`/categories?type=best_sale`);
+ };
+ return (
+
+
+ {t("Best Sale")}
+ {t("View all")}
+
+
+
+
+
+ );
+};
+
+export default Products;
diff --git a/src/Components/Home/BoseHeadphones.tsx b/src/Components/Home/BoseHeadphones.tsx
new file mode 100644
index 0000000..c80b953
--- /dev/null
+++ b/src/Components/Home/BoseHeadphones.tsx
@@ -0,0 +1,22 @@
+import React from "react";
+import { useTranslation } from "react-i18next";
+import { GoArrowUpRight } from "react-icons/go";
+
+const BoseHeadphones = () => {
+ const {t} = useTranslation();
+ return (
+
+
+
+
{t("Bose Headphones")}
+ {t("Smarter than your average headphones")}
+
+ {t("Shop now")}
+
+
+
+
+ );
+};
+
+export default BoseHeadphones;
diff --git a/src/Components/Home/CategoriesSlider.tsx b/src/Components/Home/CategoriesSlider.tsx
new file mode 100644
index 0000000..fb2917f
--- /dev/null
+++ b/src/Components/Home/CategoriesSlider.tsx
@@ -0,0 +1,68 @@
+// import Swiper core and required modules
+import { Navigation, Pagination, Scrollbar, A11y } from "swiper/modules";
+
+import { Swiper, SwiperSlide } from "swiper/react";
+
+// Import Swiper styles
+import "swiper/css";
+import "swiper/css/navigation";
+import "swiper/css/pagination";
+import "swiper/css/scrollbar";
+import { useGetCategories } from "../../api/Categories";
+import { Category } from "../../types/item";
+import { useNavigate } from "react-router-dom";
+import { addBaseUrlToSrc } from "../../utils/addBaseUrlToSrc";
+
+const CategoriesSlider = () => {
+ const { data } = useGetCategories();
+ const categories = (data?.categories as Category[]) || ([] as []);
+ const navigate = useNavigate();
+ const handelNavigate = (data: Category) => {
+ navigate(`/categories?category=${data?.id}`);
+ };
+
+
+ return (
+
+
+ {categories?.map((item: Category, index: number) => {
+ return (
+
+
+
handelNavigate(item)}
+ src={addBaseUrlToSrc(item?.photo)}
+ alt={`category ${index + 1}`}
+ />
+
+
+ );
+ })}
+
+
+ );
+};
+export default CategoriesSlider;
diff --git a/src/Components/Home/HeroSection.tsx b/src/Components/Home/HeroSection.tsx
new file mode 100644
index 0000000..ca30d61
--- /dev/null
+++ b/src/Components/Home/HeroSection.tsx
@@ -0,0 +1,23 @@
+import React from "react";
+import { useTranslation } from "react-i18next";
+
+const HeroSection = () => {
+ const [t] = useTranslation();
+ return (
+
+
+
{t("Quite Comfort 35 wireless headphones II")}
+
+
+ {/*
$229.50 */}
+ {t("Buy Now")}
+
+
+
+
+
+
+ );
+};
+
+export default HeroSection;
diff --git a/src/Components/Home/NoiseCancellation.tsx b/src/Components/Home/NoiseCancellation.tsx
new file mode 100644
index 0000000..8fced26
--- /dev/null
+++ b/src/Components/Home/NoiseCancellation.tsx
@@ -0,0 +1,11 @@
+import React from "react";
+
+const NoiseCancellation = () => {
+ return (
+
+
+
+ );
+};
+
+export default NoiseCancellation;
diff --git a/src/Components/Home/OnSaleCard.tsx b/src/Components/Home/OnSaleCard.tsx
new file mode 100644
index 0000000..2429a86
--- /dev/null
+++ b/src/Components/Home/OnSaleCard.tsx
@@ -0,0 +1,18 @@
+import React from "react";
+
+const OnSaleCard = () => {
+ return (
+
+
+
Apple Airphone Pro2
+
+ {" "}
+
$49.00
+
$34.30
{" "}
+
+
30%
+
+ );
+};
+
+export default OnSaleCard;
diff --git a/src/Components/Home/OnSaleSlider.tsx b/src/Components/Home/OnSaleSlider.tsx
new file mode 100644
index 0000000..88617a6
--- /dev/null
+++ b/src/Components/Home/OnSaleSlider.tsx
@@ -0,0 +1,17 @@
+import React from "react";
+import OnSaleCard from "./OnSaleCard";
+
+const OnSaleSlider = () => {
+ return (
+
+
+
+
+
+
+
+
+ );
+};
+
+export default OnSaleSlider;
diff --git a/src/Components/Home/PerfectSound.tsx b/src/Components/Home/PerfectSound.tsx
new file mode 100644
index 0000000..bcf18ca
--- /dev/null
+++ b/src/Components/Home/PerfectSound.tsx
@@ -0,0 +1,19 @@
+import React from "react";
+import { useTranslation } from "react-i18next";
+
+const PerfectSound = () => {
+ const {t} = useTranslation();
+ return (
+
+
+
{t("Perfect sound immersive world")}
+
+ {t("QuietComfort 35 wireless headphones II are engineered with renowned noise cancellation. With the Google Assistant and Amazon Alexa built-in, you have instant access to millions of songs, playlists and more—hands free")}.
+
+
+
+
+ );
+};
+
+export default PerfectSound;
diff --git a/src/Components/Home/PremiumDesign.tsx b/src/Components/Home/PremiumDesign.tsx
new file mode 100644
index 0000000..5b545e0
--- /dev/null
+++ b/src/Components/Home/PremiumDesign.tsx
@@ -0,0 +1,17 @@
+import React from "react";
+import { useTranslation } from "react-i18next";
+
+const PremiumDesign = () => {
+ const {t} = useTranslation();
+ return (
+
+
{t("Premium Design")}
+
+ {t("When you want to take your music anywhere, you need headphones built to keep up. With impact-resistant materials, glass-filled nylon, and corrosion-resistant stainless steel, they’re engineered to survive life on the go")}.
+
+
+
+ );
+};
+
+export default PremiumDesign;
diff --git a/src/Components/Home/ProductCard.tsx b/src/Components/Home/ProductCard.tsx
new file mode 100644
index 0000000..40978e1
--- /dev/null
+++ b/src/Components/Home/ProductCard.tsx
@@ -0,0 +1,120 @@
+import React, { useEffect } from "react";
+import { FaHeart, FaStar } from "react-icons/fa";
+import { Currency } from "../../Layout/app/Const";
+import { FaCartPlus } from "react-icons/fa6";
+import { useTranslation } from "react-i18next";
+import { useNavigate } from "react-router-dom";
+import CustomImage from "../../ui/CustomImage";
+import { languageObject } from "../../utils/languageObject";
+import { Product } from "../../types/item";
+import { useAddFavorite, useDeleteFavorite } from "../../api/Favorite";
+import useAuthState from "../../state/AuthState";
+import { toast } from "react-toastify";
+import { useCartState } from "../../state/CartState";
+import { useQueryClient } from "react-query";
+
+const ProductCard = ({ item }: { item: Product }) => {
+ const [t] = useTranslation();
+ const navigate = useNavigate();
+ const { isAuthenticated } = useAuthState();
+ // console.log(item);
+
+ const handel_click = (id: number) => {
+ console.log(id);
+
+ navigate(`/product/${id}`);
+ };
+
+ const { mutate: addToFavorite, isSuccess: Add } = useAddFavorite();
+ const { mutate: deleteToFavorite, isSuccess: Delete } = useDeleteFavorite();
+ const price = Number(item?.price);
+ const discountAmount = 10;
+ const oldPrice = (Number(price) / 0.9).toFixed(2);
+
+ const min = 4.5;
+ const max = 5;
+ const randomRate = (Math.random() * (max - min) + min)?.toFixed(1);
+
+ const { Cart, setCart } = useCartState();
+
+ const queryClient = useQueryClient();
+
+ const handelChangeFavorite = (item: Product) => {
+ if (!isAuthenticated) {
+ toast.error("sorry you need to be authenticated");
+ return;
+ }
+
+ if (item?.favorite) {
+
+ deleteToFavorite({
+ id: item?.id,
+ });
+ } else {
+ addToFavorite({
+ id: item?.id,
+ });
+ }
+ };
+
+ useEffect(() => {
+ if (Add) {
+ toast.success("added success");
+ queryClient.invalidateQueries("mainProduct");
+ }
+ }, [Add]);
+ useEffect(() => {
+ if (Delete) {
+ toast.success("removed success");
+ queryClient.invalidateQueries("mainProduct");
+ }
+ }, [Delete]);
+
+ const handelAddToCart = (item: Product) => {
+ if (!isAuthenticated) {
+
+ toast.error("sorry you need to be authenticated");
+ return;
+ }
+ setCart(item);
+
+
+ toast.success(`${languageObject(item?.name)}` + " added to cart");
+ };
+
+
+ return (
+
+
handel_click(item?.base_product_id)} />
+ {languageObject(item?.name)}
+
+ {" "}
+ {Currency} {oldPrice}{" "}
+
+
+
+ {" "}
+ {Currency} {price}
+
+
+ {" "}
+ {randomRate}
+
+
+ {discountAmount}%
+
+
+ handelAddToCart(item)}>
+
+ {t("add to cart")}
+
+ handelChangeFavorite(item)}
+ className={item?.favorite ? "" : "not_favorite"}
+ />
+
+
+ );
+};
+
+export default ProductCard;
diff --git a/src/Components/Home/ProductSwiper.tsx b/src/Components/Home/ProductSwiper.tsx
new file mode 100644
index 0000000..67d800c
--- /dev/null
+++ b/src/Components/Home/ProductSwiper.tsx
@@ -0,0 +1,58 @@
+import React, { useRef, useState } from 'react';
+import { Swiper, SwiperSlide } from 'swiper/react';
+import 'swiper/css';
+import 'swiper/css/free-mode';
+import 'swiper/css/pagination';
+import ProductCard from './ProductCard';
+import { Product } from '../../types/item';
+import { useGetBaseProduct } from '../../api/baseProduct';
+import { A11y, Autoplay, Navigation, Pagination, Scrollbar } from 'swiper/modules';
+import { Spin } from 'antd';
+
+
+
+const ProductSwiper = () => {
+ const language = localStorage.getItem('language') ;
+ console.log(language);
+
+ const [swiperDirection, setSwiperDirection] = useState(language === "ar" ? "rtl" : "ltr");
+ const swiperRef = useRef(null);
+
+ const { data, isLoading } = useGetBaseProduct({
+ mostOrderd: "asc",
+ });
+ const BaseProducts = (data?.products as Product[]) || ([] as []);
+
+ return (
+
+
(swiperRef.current = swiper)} // Store swiper instance
+ >
+ {
+ isLoading ? :
+ BaseProducts?.map((item:Product, index:number) => (
+
+
+
+ ))
+ }
+
+
+ );
+}
+
+export default ProductSwiper;
diff --git a/src/Components/Home/Products.tsx b/src/Components/Home/Products.tsx
new file mode 100644
index 0000000..55fd389
--- /dev/null
+++ b/src/Components/Home/Products.tsx
@@ -0,0 +1,26 @@
+import { useNavigate } from "react-router-dom";
+import { useTranslation } from "react-i18next";
+import ProductSwiper from "./ProductSwiper";
+
+const Products = () => {
+ const {t} = useTranslation();
+
+ const navigate = useNavigate();
+ const handelSeeAll = () => {
+ navigate(`/categories?type=new_product`);
+ };
+
+ return (
+
+
+ {t("New Products")}
+ {t("View all")}
+
+
+
+
+
+ );
+};
+
+export default Products;
diff --git a/src/Components/Home/ProductsOnSale.tsx b/src/Components/Home/ProductsOnSale.tsx
new file mode 100644
index 0000000..986ee22
--- /dev/null
+++ b/src/Components/Home/ProductsOnSale.tsx
@@ -0,0 +1,31 @@
+import React from "react";
+import OnSaleSlider from "./OnSaleSlider";
+import { IoIosArrowBack } from "react-icons/io";
+import { IoIosArrowForward } from "react-icons/io";
+
+const ProductsOnSale = () => {
+ return (
+
+
+
+ Products On Sale
+ Shop Now!
+
+ View all
+
+
+
+
+
+ {" "}
+ {" "}
+
+
+
+
+
+
+ );
+};
+
+export default ProductsOnSale;
diff --git a/src/Components/Setting/SettingDrawerSingleTab.tsx b/src/Components/Setting/SettingDrawerSingleTab.tsx
new file mode 100644
index 0000000..13fa737
--- /dev/null
+++ b/src/Components/Setting/SettingDrawerSingleTab.tsx
@@ -0,0 +1,19 @@
+import React from 'react'
+import { CgProfile } from 'react-icons/cg'
+import { IconBaseProps } from 'react-icons/lib'
+import { Link } from 'react-router-dom'
+
+const SettingDrawerSingleTab = ({tabName, Icon,onCLick, link = "/settings"}:{tabName:string, Icon:any,onCLick:any, link?:string}) => {
+ return (
+
+
+
+ )
+}
+
+export default SettingDrawerSingleTab
\ No newline at end of file
diff --git a/src/Components/Setting/SettingTabHeader.tsx b/src/Components/Setting/SettingTabHeader.tsx
new file mode 100644
index 0000000..868240d
--- /dev/null
+++ b/src/Components/Setting/SettingTabHeader.tsx
@@ -0,0 +1,16 @@
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+
+const SettingTabHeader = ({title,text}:{title:string ,text:string}) => {
+
+ const {t} = useTranslation();
+
+ return (
+
+
{t(title)}
+
{t(text)}
+
+ )
+}
+
+export default SettingTabHeader
\ No newline at end of file
diff --git a/src/Components/Setting/SettingTabs.tsx b/src/Components/Setting/SettingTabs.tsx
new file mode 100644
index 0000000..98aa00e
--- /dev/null
+++ b/src/Components/Setting/SettingTabs.tsx
@@ -0,0 +1,95 @@
+import React, { useState } from 'react';
+import type { TabsProps } from 'antd';
+import { Tabs } from 'antd';
+import { useTranslation } from 'react-i18next';
+import { CgProfile } from "react-icons/cg";
+import { IoCartOutline } from "react-icons/io5";
+import { IoMdHeartEmpty } from "react-icons/io";
+import { GrShieldSecurity,GrContactInfo } from "react-icons/gr";
+import { CiLogout } from "react-icons/ci";
+import ContactTab from './Tabs/ContactTab';
+import ChangePasswordTab from './Tabs/ChangePasswordTab';
+import OrderTab from './Tabs/OrderTab';
+import WishlistTab from './Tabs/WishlistTab';
+import { useWindowResize } from '../../Hooks/useWindowResize';
+import useAuthState from '../../state/AuthState';
+import { LocalStorageEnum } from '../../api/utils/LocalStorage';
+import { Link } from 'react-router-dom';
+import { toast } from 'react-toastify';
+
+type TabPosition = 'left' | 'right' | 'top' | 'bottom';
+
+const SettingTabs: React.FC = () => {
+ const {windowWidth} = useWindowResize()
+
+ const [tabPosition, setTabPosition] = useState(windowWidth < 800 ? 'top' : 'left');
+ const {t} = useTranslation();
+ const {logout} = useAuthState()
+
+ const name = JSON.parse(localStorage.getItem(LocalStorageEnum?.USER_KEY) ?? '')?.name
+ const handleLogout = () =>{
+ logout()
+ toast.success(t("you logged out successfully"))
+ }
+ const items: TabsProps['items'] = [
+ {
+ key: '1',
+ label: name,
+ icon: ,
+ disabled: true,
+ },
+ // {
+ // key: '2',
+ // label: t('Personal Data'),
+ // children: ,
+ // icon:
+ // },
+ {
+ key: '3',
+ label: t('Orders'),
+ children: ,
+ icon:
+ },
+ {
+ key: '4',
+ label: t('Wishlist'),
+ children: ,
+ icon:
+ },
+ {
+ key: '5',
+ label: t('Security and access'),
+ children: ,
+ icon:
+
+ },
+ {
+ key: '6',
+ label: t('Contact Us'),
+ children: ,
+ icon:
+
+ },
+ {
+ key: '7',
+ label: {t('Logout')} ,
+ icon:
+
+ },
+ ];
+
+
+ return (
+ <>
+
+ >
+ );
+};
+
+export default SettingTabs;
\ No newline at end of file
diff --git a/src/Components/Setting/Tabs/ChangePasswordTab.tsx b/src/Components/Setting/Tabs/ChangePasswordTab.tsx
new file mode 100644
index 0000000..95235f6
--- /dev/null
+++ b/src/Components/Setting/Tabs/ChangePasswordTab.tsx
@@ -0,0 +1,51 @@
+import React from 'react'
+import { Formik, Form, Field } from 'formik';
+import { useTranslation } from 'react-i18next';
+import { FaKey } from "react-icons/fa";
+import { Input } from 'antd';
+import SettingTabHeader from '../SettingTabHeader';
+import { Button } from 'react-bootstrap';
+import { useChangePassword } from '../../../api/auth';
+
+
+const ChangePasswordTab = () => {
+ const [t] = useTranslation();
+
+ const {mutate} = useChangePassword()
+ const handelSubmit = (values: any) => {
+ mutate({ ...values });
+ };
+
+ return (
+
+
+ )
+}
+
+export default ChangePasswordTab
\ No newline at end of file
diff --git a/src/Components/Setting/Tabs/ContactTab.tsx b/src/Components/Setting/Tabs/ContactTab.tsx
new file mode 100644
index 0000000..abf2201
--- /dev/null
+++ b/src/Components/Setting/Tabs/ContactTab.tsx
@@ -0,0 +1,125 @@
+import React, { useEffect, useRef, useState } from 'react'
+import { FaInstagram, FaLinkedinIn, FaTwitter } from "react-icons/fa6";
+import { Button, Form } from 'react-bootstrap';
+import { useTranslation } from 'react-i18next';
+import { toast } from 'react-toastify';
+import { IoMailOutline,IoEarthOutline } from "react-icons/io5";
+import { FiPhone } from "react-icons/fi";
+import { FaFacebookF } from "react-icons/fa";
+import { useAddSupportMessage } from '../../../api/supportMessages';
+
+const ContactTab = ({className=""}: {className?: string }) => {
+ const form = useRef(null);
+ const { t } = useTranslation();
+ const {mutate,isSuccess,isLoading} = useAddSupportMessage()
+
+ const SoicalInfo: { icon: any; text: string }[] = [
+ {
+ icon: ,
+ text: "info@yourdomain.com",
+ },
+ {
+ icon: ,
+ text: "+1 (378) 400-1234",
+ },
+ {
+ icon: ,
+ text: "www.yourdomain.com",
+ },
+ ];
+
+ const SoicalIcons: { icon: any; }[] = [
+ {
+ icon: ,
+ },
+ {
+ icon: ,
+ },
+ {
+ icon: ,
+ },
+ {
+ icon: ,
+ },
+ ];
+
+ const [Name , setName] = useState('')
+ const [Email , setEmail] = useState('')
+ const [Message , setMessage] = useState('')
+
+ const sendEmail = (e: React.FormEvent) => {
+ e.preventDefault();
+
+
+
+ if(!Name || !Email || !Message ){
+ toast.error(t("please_fill_all_input"))
+ }else{
+ }
+ mutate({
+ name:Name,
+ email:Email,
+ message:Message
+ })
+
+
+ };
+
+
+ useEffect(() => {
+ if(isSuccess){
+ setMessage('')
+ setName('')
+ setEmail('')
+ toast.success(t("Send Successfully"))
+
+ }
+ }, [isSuccess])
+
+
+ return (
+
+
+
+ {
+ SoicalInfo.map((item)=>(
+
+
{item.icon}
+
{item.text}
+
+ ))
+ }
+
+
+ {
+ SoicalIcons.map((item)=>(
+ {item.icon}
+ ))
+ }
+
+
+
+
+
+ setName(e.target.value)} required autoFocus />
+
+
+ setEmail(e.target.value)} required/>
+
+
+ setMessage(e.target.value)} required />
+
+
+
+ {t('Submit')}
+
+
+
+
+
+
+ )
+}
+
+export default ContactTab
\ No newline at end of file
diff --git a/src/Components/Setting/Tabs/FormUtils/ChangePasswordTab.ts b/src/Components/Setting/Tabs/FormUtils/ChangePasswordTab.ts
new file mode 100644
index 0000000..e69de29
diff --git a/src/Components/Setting/Tabs/FormUtils/OrderTabs/CanceledOrderTab.tsx b/src/Components/Setting/Tabs/FormUtils/OrderTabs/CanceledOrderTab.tsx
new file mode 100644
index 0000000..15fca53
--- /dev/null
+++ b/src/Components/Setting/Tabs/FormUtils/OrderTabs/CanceledOrderTab.tsx
@@ -0,0 +1,14 @@
+import React from 'react'
+import { OrderData } from '../../../../../data/OrderData'
+import OrdersTable from './OrderTable'
+
+const CanceledOrderTab = () => {
+ return (
+
+
+
+
+ )
+}
+
+export default CanceledOrderTab
\ No newline at end of file
diff --git a/src/Components/Setting/Tabs/FormUtils/OrderTabs/CurrentOrderTab.tsx b/src/Components/Setting/Tabs/FormUtils/OrderTabs/CurrentOrderTab.tsx
new file mode 100644
index 0000000..c5047f6
--- /dev/null
+++ b/src/Components/Setting/Tabs/FormUtils/OrderTabs/CurrentOrderTab.tsx
@@ -0,0 +1,9 @@
+import React from 'react'
+
+const CurrentOrderTab = () => {
+ return (
+ CurrentOrderTab
+ )
+}
+
+export default CurrentOrderTab
\ No newline at end of file
diff --git a/src/Components/Setting/Tabs/FormUtils/OrderTabs/DeliveredOrderTab.tsx b/src/Components/Setting/Tabs/FormUtils/OrderTabs/DeliveredOrderTab.tsx
new file mode 100644
index 0000000..5528b0e
--- /dev/null
+++ b/src/Components/Setting/Tabs/FormUtils/OrderTabs/DeliveredOrderTab.tsx
@@ -0,0 +1,13 @@
+import React from 'react'
+import OrdersTable from './OrderTable'
+import { OrderData } from '../../../../../data/OrderData'
+
+const DeliveredOrderTab = () => {
+ return (
+
+
+
+ )
+}
+
+export default DeliveredOrderTab
\ No newline at end of file
diff --git a/src/Components/Setting/Tabs/FormUtils/OrderTabs/EmptyOrder.tsx b/src/Components/Setting/Tabs/FormUtils/OrderTabs/EmptyOrder.tsx
new file mode 100644
index 0000000..2f3a269
--- /dev/null
+++ b/src/Components/Setting/Tabs/FormUtils/OrderTabs/EmptyOrder.tsx
@@ -0,0 +1,14 @@
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+
+const EmptyOrder = () => {
+ const {t} = useTranslation();
+ return (
+
+
+
{t("You have not placed any orders yet")}
+
+ )
+}
+
+export default EmptyOrder
\ No newline at end of file
diff --git a/src/Components/Setting/Tabs/FormUtils/OrderTabs/Order.tsx b/src/Components/Setting/Tabs/FormUtils/OrderTabs/Order.tsx
new file mode 100644
index 0000000..b5515c5
--- /dev/null
+++ b/src/Components/Setting/Tabs/FormUtils/OrderTabs/Order.tsx
@@ -0,0 +1,41 @@
+import { useTranslation } from 'react-i18next';
+import { Tabs } from 'antd';
+import type { TabsProps } from 'antd';
+import CurrentOrderTab from './CurrentOrderTab';
+import DeliveredOrderTab from './DeliveredOrderTab';
+import CanceledOrderTab from './CanceledOrderTab';
+import ReyurnedOrderTab from './ReyurnedOrderTab';
+import EmptyOrder from './EmptyOrder';
+
+const OrderTabs = () => {
+ const {t} = useTranslation();
+ const items: TabsProps['items'] = [
+ {
+ key: '1',
+ label: {t("Current")} ,
+ children: ,
+ },
+ // {
+ // key: '2',
+ // label: {t("Order With Status")} 0 ,
+ // children: ,
+ // },
+ // {
+ // key: '3',
+ // label: {t("Canceled")} 0 ,
+ // children: ,
+ // },
+ // {
+ // key: '4',
+ // label: {t("Reyurned")} 0 ,
+ // children: ,
+ // },
+ ];
+ return (
+ <>
+ ;
+ >
+)
+}
+
+export default OrderTabs
\ No newline at end of file
diff --git a/src/Components/Setting/Tabs/FormUtils/OrderTabs/OrderTable.tsx b/src/Components/Setting/Tabs/FormUtils/OrderTabs/OrderTable.tsx
new file mode 100644
index 0000000..67bf5fe
--- /dev/null
+++ b/src/Components/Setting/Tabs/FormUtils/OrderTabs/OrderTable.tsx
@@ -0,0 +1,73 @@
+import { Table, Tag } from 'antd';
+import type { TableProps } from 'antd';
+import { useNavigate } from 'react-router-dom';
+import { useTranslation } from 'react-i18next';
+import { useGetOrder } from '../../../../../api/order';
+import { LocalStorageEnum } from '../../../../../api/utils/LocalStorage';
+import EmptyOrder from './EmptyOrder';
+
+interface DataType {
+ id: string;
+ order_code: string;
+ order_total: number;
+ placed_on: string;
+ order_status: string;
+ sent_to:string
+}
+
+const OrdersTable = () => {
+ const navigate = useNavigate()
+ const [t] = useTranslation()
+ const id = JSON.parse(localStorage.getItem(LocalStorageEnum?.USER_KEY) ?? '')?.id
+
+ const {data,isLoading} = useGetOrder({
+ user_id:id
+ })
+ const orders = data?.Orders || []
+
+ const columns: TableProps['columns'] = [
+ {
+ title: t('order code'),
+ dataIndex: 'id',
+ key: 'id',
+ render: (text) => {text} ,
+ },
+ {
+ title: t('total'),
+ dataIndex: 'total',
+ key: 'total',
+ },
+ {
+ title: t('coupon'),
+ dataIndex: 'coupon',
+ key: 'coupon',
+ },
+ {
+ title: t('state'),
+ dataIndex: 'state',
+ key: 'state',
+ },
+
+ ];
+
+ return (
+ orders?.length > 0 ?
+ {
+ return {
+ onClick: (event) => {
+ navigate('/single_order?order_id=' + record?.id)
+ },
+ };
+ }}
+ columns={columns}
+ dataSource={orders || []}
+ loading={isLoading}
+ />
+
+ :
+
+ )
+};
+
+export default OrdersTable;
diff --git a/src/Components/Setting/Tabs/FormUtils/OrderTabs/ReyurnedOrderTab.tsx b/src/Components/Setting/Tabs/FormUtils/OrderTabs/ReyurnedOrderTab.tsx
new file mode 100644
index 0000000..bb0d9da
--- /dev/null
+++ b/src/Components/Setting/Tabs/FormUtils/OrderTabs/ReyurnedOrderTab.tsx
@@ -0,0 +1,13 @@
+import React from 'react'
+import { OrderData } from '../../../../../data/OrderData'
+import OrdersTable from './OrderTable'
+
+const ReyurnedOrderTab = () => {
+ return (
+
+
+
+ )
+}
+
+export default ReyurnedOrderTab
\ No newline at end of file
diff --git a/src/Components/Setting/Tabs/FormUtils/PersonalDataTabsUtils.ts b/src/Components/Setting/Tabs/FormUtils/PersonalDataTabsUtils.ts
new file mode 100644
index 0000000..e6a9daf
--- /dev/null
+++ b/src/Components/Setting/Tabs/FormUtils/PersonalDataTabsUtils.ts
@@ -0,0 +1,11 @@
+export const handelSubmit = (values:any)=>{
+
+ // Implemnt Your Auth Code
+ // navigate('/', { replace: true })
+ }
+
+ export const getInitialValues = (values:any)=>{
+
+ // Implemnt Your Auth Code
+ // navigate('/', { replace: true })
+ }
\ No newline at end of file
diff --git a/src/Components/Setting/Tabs/OrderTab.tsx b/src/Components/Setting/Tabs/OrderTab.tsx
new file mode 100644
index 0000000..8fcb51f
--- /dev/null
+++ b/src/Components/Setting/Tabs/OrderTab.tsx
@@ -0,0 +1,14 @@
+import React from 'react'
+import SettingTabHeader from '../SettingTabHeader';
+import OrderTabs from './FormUtils/OrderTabs/Order';
+
+const OrderTab = () => {
+ return (
+
+
+
+
+ )
+}
+
+export default OrderTab;
\ No newline at end of file
diff --git a/src/Components/Setting/Tabs/PersonalDataTabs.tsx b/src/Components/Setting/Tabs/PersonalDataTabs.tsx
new file mode 100644
index 0000000..29d0941
--- /dev/null
+++ b/src/Components/Setting/Tabs/PersonalDataTabs.tsx
@@ -0,0 +1,94 @@
+import React from 'react'
+import { Formik, Form, Field } from 'formik';
+import { useTranslation } from 'react-i18next';
+import { useNavigate } from 'react-router-dom';
+import { CiMail } from "react-icons/ci";
+import { FaKey } from "react-icons/fa";
+import { Input } from 'antd';
+import { Button } from 'react-bootstrap';
+import { getInitialValues, handelSubmit } from './FormUtils/PersonalDataTabsUtils';
+import SettingTabHeader from '../SettingTabHeader';
+import { IoPerson } from "react-icons/io5";
+import { FiPhone } from "react-icons/fi";
+import { HiOutlineHome } from "react-icons/hi2";
+
+
+const PersonalDataTabs = () => {
+ const [t] = useTranslation();
+
+
+ return (
+
+
+ )
+}
+
+export default PersonalDataTabs
\ No newline at end of file
diff --git a/src/Components/Setting/Tabs/WishlistTab.tsx b/src/Components/Setting/Tabs/WishlistTab.tsx
new file mode 100644
index 0000000..8d7bfd4
--- /dev/null
+++ b/src/Components/Setting/Tabs/WishlistTab.tsx
@@ -0,0 +1,28 @@
+import React from 'react'
+import SettingTabHeader from '../SettingTabHeader'
+import ProductCard from '../../Home/ProductCard'
+import { useGetBaseProduct } from '../../../api/baseProduct';
+import { Product } from '../../../types/item';
+import { Spin } from 'antd';
+import { useGetFavorite } from '../../../api/Favorite';
+
+const WishlistTab = () => {
+
+ const { data , isLoading } = useGetFavorite();
+ const BaseProducts = (data?.products as Product[]) || ([] as []);
+
+ return (
+
+
+
+
+ {isLoading && }
+ {BaseProducts?.map((item: Product, index: number) => (
+
+ ))}
+
+
+ )
+}
+
+export default WishlistTab
\ No newline at end of file
diff --git a/src/Components/Ui/CurserBlob.tsx b/src/Components/Ui/CurserBlob.tsx
new file mode 100644
index 0000000..078b3fe
--- /dev/null
+++ b/src/Components/Ui/CurserBlob.tsx
@@ -0,0 +1,35 @@
+import React, { useEffect } from "react";
+
+const CursorBlob = () => {
+ useEffect(() => {
+ const blob = document.getElementById("Blob");
+
+ const handleMouseMove = (event: any) => {
+ const { clientX, clientY } = event;
+
+ const scrollTop =
+ window.pageYOffset || document.documentElement.scrollTop;
+ const scrollLeft =
+ window.pageXOffset || document.documentElement.scrollLeft;
+
+ blob &&
+ blob.animate(
+ {
+ top: `${clientY + scrollTop}px`,
+ left: `${clientX + scrollLeft}px`,
+ },
+ { duration: 5000, fill: "forwards" },
+ );
+ };
+
+ document.addEventListener("mousemove", handleMouseMove);
+
+ return () => {
+ document.removeEventListener("mousemove", handleMouseMove);
+ };
+ }, []);
+
+ return
;
+};
+
+export default CursorBlob;
diff --git a/src/Components/Ui/HeaderLink.tsx b/src/Components/Ui/HeaderLink.tsx
new file mode 100644
index 0000000..062107b
--- /dev/null
+++ b/src/Components/Ui/HeaderLink.tsx
@@ -0,0 +1,27 @@
+import React from 'react'
+import { useTranslation } from 'react-i18next';
+import { FaChevronRight } from 'react-icons/fa';
+import { Link } from 'react-router-dom';
+import { THeaderLink } from '../../types/App';
+
+const HeaderLink = ({text,isMulti,extraText,extraLink}:THeaderLink) => {
+ const { t } = useTranslation();
+
+ return (
+
+ {t("Home")}
+
+ {
+ isMulti ?
+ <>
+ { t(extraText || "")}
+
+ >
+ : ""
+ }
+ {t(text)}
+
+ )
+}
+
+export default HeaderLink
\ No newline at end of file
diff --git a/src/Components/Utils/Loading/Loading.scss b/src/Components/Utils/Loading/Loading.scss
new file mode 100755
index 0000000..1669a02
--- /dev/null
+++ b/src/Components/Utils/Loading/Loading.scss
@@ -0,0 +1,91 @@
+.Loading {
+ .wrapper {
+ width: 200px;
+ height: 60px;
+ position: relative;
+ left: 40%;
+ z-index: 1;
+ }
+
+ .circle {
+ width: 20px;
+ height: 20px;
+ position: absolute;
+ border-radius: 50%;
+ background-color: var(--primary);
+ left: 15%;
+ transform-origin: 50%;
+ animation: circle7124 0.5s alternate infinite ease;
+ }
+
+ @keyframes circle7124 {
+ 0% {
+ top: 60px;
+ height: 5px;
+ border-radius: 50px 50px 25px 25px;
+ transform: scaleX(1.7);
+ }
+
+ 40% {
+ height: 20px;
+ border-radius: 50%;
+ transform: scaleX(1);
+ }
+
+ 100% {
+ top: 0%;
+ }
+ }
+
+ .circle:nth-child(2) {
+ left: 45%;
+ animation-delay: 0.2s;
+ }
+
+ .circle:nth-child(3) {
+ left: auto;
+ right: 15%;
+ animation-delay: 0.3s;
+ }
+
+ .shadow {
+ width: 20px;
+ height: 4px;
+ border-radius: 50%;
+ background-color: rgba(0, 0, 0, 0.9);
+ position: absolute;
+ top: 62px;
+ transform-origin: 50%;
+ z-index: -1;
+ left: 15%;
+ filter: blur(1px);
+ animation: shadow046 0.5s alternate infinite ease;
+ }
+
+ @keyframes shadow046 {
+ 0% {
+ transform: scaleX(1.5);
+ }
+
+ 40% {
+ transform: scaleX(1);
+ opacity: 0.7;
+ }
+
+ 100% {
+ transform: scaleX(0.2);
+ opacity: 0.4;
+ }
+ }
+
+ .shadow:nth-child(4) {
+ left: 45%;
+ animation-delay: 0.2s;
+ }
+
+ .shadow:nth-child(5) {
+ left: auto;
+ right: 15%;
+ animation-delay: 0.3s;
+ }
+}
diff --git a/src/Components/Utils/Loading/Loading.tsx b/src/Components/Utils/Loading/Loading.tsx
new file mode 100755
index 0000000..d45d68a
--- /dev/null
+++ b/src/Components/Utils/Loading/Loading.tsx
@@ -0,0 +1,18 @@
+import React from "react";
+import "./Loading.scss";
+const Loading = () => {
+ return (
+
+ );
+};
+
+export default Loading;
diff --git a/src/Components/Utils/Search/Search.tsx b/src/Components/Utils/Search/Search.tsx
new file mode 100644
index 0000000..9e0a8e4
--- /dev/null
+++ b/src/Components/Utils/Search/Search.tsx
@@ -0,0 +1,11 @@
+import SearchWithDrawer from '../../HOC/SearchWithDrawer'
+
+const ViewSearch = () => {
+ return (
+
+
+
+ )
+}
+
+export default ViewSearch
\ No newline at end of file
diff --git a/src/Components/Utils/Search/SearchButton.tsx b/src/Components/Utils/Search/SearchButton.tsx
new file mode 100644
index 0000000..16c2ae9
--- /dev/null
+++ b/src/Components/Utils/Search/SearchButton.tsx
@@ -0,0 +1,66 @@
+import React, { useState } from 'react';
+import { Select, Spin } from 'antd';
+import { useNavigate, useSearchParams } from 'react-router-dom';
+import { useTranslation } from 'react-i18next';
+import { LuSearch } from 'react-icons/lu';
+import { useGetBaseProduct } from '../../../api/baseProduct';
+import { Product } from '../../../types/item';
+
+const SearchButton: React.FC = () => {
+ const navigate = useNavigate();
+ const { t } = useTranslation();
+ const [searchParams] = useSearchParams();
+ const [query, setQuery] = useState(searchParams.get('search'));
+
+ const { data, isLoading } = useGetBaseProduct({
+ name: query,
+ });
+ const BaseProducts = (data?.products as Product[]) || [];
+
+ const options = BaseProducts.map((product: any) => ({
+ value: product.base_product_id,
+ label: product?.name as string, // Ensuring the label is a string
+ }));
+
+ const handleSearchChange = (value: string) => {
+ setQuery(value);
+ navigate(`${window.location.pathname}?search=${value}`, {
+ replace: true,
+ });
+ };
+
+ const handleSelectChange = (value: number) => {
+ const selectedProduct = BaseProducts.find(product => product.base_product_id === value);
+ if (selectedProduct) {
+ navigate(`/product/${selectedProduct.base_product_id}`);
+ }
+ };
+
+ const filterOption = (input: string, option?: { label: string }) => {
+ if (!option) return false;
+ const filteredData = option?.label.toLowerCase().includes(input.toLowerCase());
+
+ return filteredData;
+ };
+
+ return (
+ }
+ placeholder={t('Search Product Name') as string} // Ensuring the placeholder is a string
+ allowClear
+ showSearch
+ loading={isLoading}
+ onSearch={handleSearchChange}
+ onChange={handleSelectChange}
+ options={options}
+ optionFilterProp="label"
+ filterOption={filterOption}
+ notFoundContent={
+ isLoading ? : "not found data"
+ }
+ />
+ );
+};
+
+export default SearchButton;
diff --git a/src/Components/Utils/SearchBar/SearchBar.scss b/src/Components/Utils/SearchBar/SearchBar.scss
new file mode 100755
index 0000000..337fab6
--- /dev/null
+++ b/src/Components/Utils/SearchBar/SearchBar.scss
@@ -0,0 +1,107 @@
+.SearchBar {
+ .group {
+ display: flex;
+ align-items: center;
+ position: relative;
+ max-width: 190px;
+ }
+
+ .input {
+ width: 100%;
+ height: 40px;
+ padding: 0 1rem;
+ padding-left: 2.5rem;
+ border-radius: 8px;
+ outline: none;
+ font-weight: 500;
+ background: var(--primary);
+ color: var(--bg);
+ border: none;
+ box-shadow: 2px 2px 7px 0 var(--primary);
+ }
+
+ .input::placeholder {
+ color: var(--bg);
+ }
+
+ .icon {
+ position: absolute;
+ left: 1rem;
+ fill: var(--bg);
+ width: 1rem;
+ height: 1rem;
+ }
+ }
+ .InputAutoComplete{
+ width: 78%;
+ height: 48px;
+ margin-top: 0px;margin-bottom: 38px;
+ .ant-select-arrow{
+ font-size: 32px;
+ color: var(--DarkGray) !important;
+ svg{
+ font-size: 20px;
+ }
+ }
+ .ant-select-selector{
+ border-radius: 10px !important;
+ border: 1.4px solid var(--DarkGray) !important;
+ padding-left: 18px !important;
+ span{
+ color: var(--DarkGray) !important;
+ font-size: 14px;
+ }
+ }
+ }
+
+ .Drawer_search_Body{
+ width: 90%;
+ margin-inline: auto;
+ .recent_search_text{
+ display: flex; justify-content: space-between;align-items: center;
+ .recent_search_text_container{
+ margin-block: 8px;
+ width: 100%;
+ display: flex; justify-content: space-between;
+ div{
+ display: flex;
+ p{
+ text-transform: capitalize;
+ font-size: 20px;
+ }
+ svg{
+ opacity: .6;
+ font-size: 20px;
+ margin-right: 10px;
+ }
+ }
+ }
+ svg{
+ font-size: 10px;
+ opacity: .6;
+ }
+ }
+ }
+
+ .search_first_section{
+ width: 91%;
+ margin-inline: auto;
+ display: flex;justify-content: space-between;align-items: center;
+ .delete_icon{
+ height: 75px;
+ cursor: pointer;
+ svg{
+ font-size: 30px;
+ }
+ }
+ }
+
+ .ViewSearch{
+ .ant-drawer .ant-drawer-content {
+ height: 50% !important ;width: 100% ;
+ min-height: 50% !important;
+ display: flex; flex-direction: column;
+ border-radius: 5px 0 0 5px;
+ }
+
+ }
\ No newline at end of file
diff --git a/src/Components/Utils/SearchBar/SearchBar.tsx b/src/Components/Utils/SearchBar/SearchBar.tsx
new file mode 100755
index 0000000..546a205
--- /dev/null
+++ b/src/Components/Utils/SearchBar/SearchBar.tsx
@@ -0,0 +1,18 @@
+import React from "react";
+import "./SearchBar.scss";
+const SearchBar = () => {
+ return (
+
+ );
+};
+
+export default SearchBar;
diff --git a/src/Components/Utils/Theme.tsx b/src/Components/Utils/Theme.tsx
new file mode 100644
index 0000000..6730285
--- /dev/null
+++ b/src/Components/Utils/Theme.tsx
@@ -0,0 +1,56 @@
+import React, { memo } from "react";
+import type { MenuProps } from "antd";
+import { Button, Dropdown, Space } from "antd";
+import { useTranslation } from "react-i18next";
+import { BsFillMoonStarsFill, BsFillSunFill } from "react-icons/bs";
+import { useChangeTheme } from "../../Hooks/useChangeTheme";
+
+const Theme: React.FC = () => {
+ const { currentTheme, changeTheme } = useChangeTheme();
+ const { t } = useTranslation();
+
+ const LightTheme = memo(() => (
+
+
+ {t("light")}
+
+ ));
+
+ const DarkTheme = memo(() => (
+
+
+ {t("dark")}
+
+ ));
+
+ const lightThemeClickHandler = React.useCallback(() => {
+ changeTheme("light");
+ }, [changeTheme]);
+
+ const darkThemeClickHandler = React.useCallback(() => {
+ changeTheme("dark");
+ }, [changeTheme]);
+
+ const items: MenuProps["items"] = [
+ {
+ key: "1",
+ label: ,
+ },
+ {
+ key: "2",
+ label: ,
+ },
+ ];
+
+ return (
+
+
+
+ {currentTheme === "dark" ? : }
+
+
+
+ );
+};
+
+export default Theme;
diff --git a/src/Components/Utils/Translate.tsx b/src/Components/Utils/Translate.tsx
new file mode 100755
index 0000000..3df16d5
--- /dev/null
+++ b/src/Components/Utils/Translate.tsx
@@ -0,0 +1,44 @@
+import React from 'react';
+import type { MenuProps } from 'antd';
+import { Button, Dropdown, Space } from 'antd';
+import { useChangeLanguage } from '../../Hooks/useChangeLanguage';
+import { useTranslation } from 'react-i18next';
+import { TranslateEnum } from '../../enums/Translate';
+import { ChangeModeComp, ChangeModeHelper } from '../HOC/ChangeMode';
+
+const Translate: React.FC = () => {
+ const { currentLanguage, changeLanguage } = useChangeLanguage();
+ const { ARABIC, ENGLISH,CHINESE } = TranslateEnum;
+ const { t } = useTranslation();
+
+ const handleLanguageChange = (language: string) => {
+ return ChangeModeHelper({
+ ChangeModeFunction: changeLanguage,
+ ChangeFunctionAttr: language
+ });
+ };
+
+ const items = [
+ {
+ key: '1',
+ label: ,
+ },
+ {
+ key: '2',
+ label: ,
+ },
+ {
+ key: '3',
+ label: ,
+ },
+ ];
+ return (
+
+
+ {t(currentLanguage)}
+
+
+ );
+};
+
+export default Translate;
diff --git a/src/Hooks/useChangeLanguage.tsx b/src/Hooks/useChangeLanguage.tsx
new file mode 100644
index 0000000..9f09766
--- /dev/null
+++ b/src/Hooks/useChangeLanguage.tsx
@@ -0,0 +1,57 @@
+import { useCallback, useEffect, useState } from "react";
+import translationEN from "../translate/en.json";
+import translationAR from "../translate/ar.json";
+import translationCH from "../translate/ch.json";
+import { initReactI18next } from "react-i18next";
+import i18n from "i18next"; // Make sure this import is correct
+// ... (your imports)
+
+i18n.use(initReactI18next).init({
+ resources: {
+ en: {
+ translation: translationEN,
+ },
+ ar: {
+ translation: translationAR,
+ },
+ ch: {
+ translation: translationCH,
+ },
+ },
+ lng: localStorage.getItem("language") || "en", // Use stored language or default to English
+ interpolation: {
+ escapeValue: false,
+ },
+});
+
+export const useChangeLanguage = () => {
+ const [currentLanguage, setCurrentLanguage] = useState(
+ localStorage.getItem("language") || "en",
+ );
+
+ useEffect(() => {
+ if (currentLanguage === "ar") {
+ i18n.changeLanguage("ar");
+ document.body.setAttribute("dir", "rtl");
+ document.body.classList.add("ar");
+ document.body.classList.remove("en"),document.body.classList.remove("ch")
+ } else if(currentLanguage === "en"){
+ i18n.changeLanguage('en');
+ document.body.setAttribute('dir', 'ltr');
+ document.body.classList.add('en');
+ document.body.classList.remove("ar"),document.body.classList.remove("ch")
+ } else {
+ i18n.changeLanguage('ch');
+ document.body.setAttribute('dir', 'ltr');
+ document.body.classList.add('ch');
+ document.body.classList.remove("en"),document.body.classList.remove("ar")
+ }
+ localStorage.setItem("language", currentLanguage);
+ }, [currentLanguage]);
+
+ const changeLanguage = useCallback((newLanguage: any) => {
+ setCurrentLanguage(newLanguage);
+ }, []);
+
+ return { currentLanguage, changeLanguage };
+};
diff --git a/src/Hooks/useChangeTheme.tsx b/src/Hooks/useChangeTheme.tsx
new file mode 100644
index 0000000..d9525f0
--- /dev/null
+++ b/src/Hooks/useChangeTheme.tsx
@@ -0,0 +1,23 @@
+import { useCallback, useEffect, useState } from "react";
+
+export const useChangeTheme = () => {
+ const [currentTheme, setCurrentTheme] = useState(
+ localStorage.getItem("theme") ?? "light",
+ );
+
+ useEffect(() => {
+ if (currentTheme === "dark") {
+ document.body.classList.add("dark");
+ } else {
+ document.body.classList.remove("dark");
+ }
+
+ localStorage.setItem("theme", currentTheme);
+ }, [currentTheme]);
+
+ const changeTheme = useCallback((newTheme: any) => {
+ setCurrentTheme(newTheme);
+ }, []);
+
+ return { currentTheme, changeTheme };
+};
diff --git a/src/Hooks/useColor.ts b/src/Hooks/useColor.ts
new file mode 100644
index 0000000..795d737
--- /dev/null
+++ b/src/Hooks/useColor.ts
@@ -0,0 +1,9 @@
+export const getColor = (color: string) => {
+ return getComputedStyle(
+ document.querySelector(":root") as any,
+ )?.getPropertyValue(color);
+};
+
+export const setColor = (color: string, value: string) => {
+ document.documentElement.style.setProperty(color, value);
+};
diff --git a/src/Hooks/useDisableShortcutsAndRightClick.tsx b/src/Hooks/useDisableShortcutsAndRightClick.tsx
new file mode 100644
index 0000000..0eb8043
--- /dev/null
+++ b/src/Hooks/useDisableShortcutsAndRightClick.tsx
@@ -0,0 +1,40 @@
+import { useEffect } from "react";
+
+const useDisableShortcutsAndRightClick = () => {
+ useEffect(() => {
+ const disableShortcutsAndRightClick = (event: Event) => {
+ // Check for Ctrl+Shift+C or F12
+ if (
+ (event as KeyboardEvent).ctrlKey &&
+ (event as KeyboardEvent).shiftKey &&
+ ((event as KeyboardEvent).key === "C" ||
+ (event as KeyboardEvent).key === "c" ||
+ (event as KeyboardEvent).keyCode === 123) /* F12 key code */
+ ) {
+ event.preventDefault();
+ }
+ };
+
+ const disableRightClick = (event: MouseEvent) => {
+ event.preventDefault();
+ };
+
+ document.addEventListener("keydown", disableShortcutsAndRightClick);
+ document.addEventListener("contextmenu", disableRightClick);
+
+ // Attempt to prevent F12 key default behavior
+ document.addEventListener("keydown", (event) => {
+ if (event.key === "F12" || event.keyCode === 123) {
+ event.preventDefault();
+ return false;
+ }
+ });
+
+ return () => {
+ document.removeEventListener("keydown", disableShortcutsAndRightClick);
+ document.removeEventListener("contextmenu", disableRightClick);
+ };
+ }, []);
+};
+
+export default useDisableShortcutsAndRightClick;
diff --git a/src/Hooks/useLoadingState.tsx b/src/Hooks/useLoadingState.tsx
new file mode 100644
index 0000000..aa27812
--- /dev/null
+++ b/src/Hooks/useLoadingState.tsx
@@ -0,0 +1,24 @@
+import { useState, useEffect } from "react";
+
+function useLoadingState(
+ initialValue: boolean,
+ duration: number,
+): [boolean, () => void] {
+ const [loading, setLoading] = useState(initialValue);
+
+ useEffect(() => {
+ const timeoutId = setTimeout(() => {
+ setLoading(false);
+ }, duration);
+
+ return () => clearTimeout(timeoutId);
+ }, [duration]);
+
+ const resetLoading = () => {
+ setLoading(true);
+ };
+
+ return [loading, resetLoading];
+}
+
+export default useLoadingState;
diff --git a/src/Hooks/useSearchQueryWithoutConfirm.tsx b/src/Hooks/useSearchQueryWithoutConfirm.tsx
new file mode 100644
index 0000000..a01470f
--- /dev/null
+++ b/src/Hooks/useSearchQueryWithoutConfirm.tsx
@@ -0,0 +1,49 @@
+import debounce from "lodash/debounce";
+import React, { useCallback, useEffect, useState } from "react";
+import { useSearchParams } from "react-router-dom";
+export default function useSearchQueryWithoutConfirm({
+ queryParams,
+}: {
+ queryParams: string;
+}): {
+ inputValue: string;
+ setInputValue: React.Dispatch>;
+} {
+ const [searchParams, setSearchParams] = useSearchParams();
+ const [inputValue, setInputValue] = useState(
+ searchParams.get(queryParams) || "",
+ );
+ const updateParams = (page: string) => {
+ const params = searchParams.get(queryParams);
+
+ if (params) {
+ searchParams.set(queryParams, page.toString());
+
+ setSearchParams(searchParams, { replace: true });
+ return;
+ }
+ searchParams.append(queryParams, page.toString());
+
+ setSearchParams(searchParams, { replace: true });
+ };
+
+ const debouncedSetSearchParams = useCallback(
+ debounce((value) => {
+ updateParams(value);
+ }, 500),
+ [],
+ );
+ useEffect(() => {
+ if (!inputValue || !inputValue.trim()) {
+ return;
+ }
+ debouncedSetSearchParams(inputValue.trim());
+ return () => {
+ debouncedSetSearchParams.cancel();
+ };
+ }, [inputValue, debouncedSetSearchParams]);
+ return {
+ inputValue,
+ setInputValue,
+ };
+}
diff --git a/src/Hooks/useSearchResults.tsx b/src/Hooks/useSearchResults.tsx
new file mode 100644
index 0000000..f598f82
--- /dev/null
+++ b/src/Hooks/useSearchResults.tsx
@@ -0,0 +1,21 @@
+import { useEffect, useState } from "react";
+
+const useSearchResults = (data: any[] | undefined, query: string | null) => {
+ const [results, setResults] = useState([]);
+
+ useEffect(() => {
+ const filteredResults =
+ data?.filter((item: any) =>
+ item?.toLowerCase()?.includes(query?.toLowerCase()),
+ ) ?? [];
+
+ setResults(filteredResults);
+
+ if (results?.length === 0 && query != null && query?.length > 1) {
+ }
+ }, [query]);
+
+ return results;
+};
+
+export default useSearchResults;
diff --git a/src/Hooks/useSocketTracker.ts b/src/Hooks/useSocketTracker.ts
new file mode 100644
index 0000000..082346c
--- /dev/null
+++ b/src/Hooks/useSocketTracker.ts
@@ -0,0 +1,26 @@
+import React from "react";
+import { getSocket } from "../lib/SocketProvider";
+
+function useSocketTracker() {
+ const isLocal = true;
+
+ if (!isLocal) {
+ return;
+ }
+
+ const socket = getSocket();
+
+ socket.on("connect", () => {
+ console.log("CONNECT");
+ });
+
+ socket.on("disconnect", () => {
+ console.log("DISCONNECT");
+ });
+
+ socket.onAny((event, ...arg) => {
+ console.log("EVENT ", event, arg);
+ });
+}
+
+export default useSocketTracker;
diff --git a/src/Hooks/useUpdateSearchParams.tsx b/src/Hooks/useUpdateSearchParams.tsx
new file mode 100644
index 0000000..15b770b
--- /dev/null
+++ b/src/Hooks/useUpdateSearchParams.tsx
@@ -0,0 +1,18 @@
+import { useSearchParams } from "react-router-dom";
+
+export default function useUpdateSearchParams() {
+ const [searchParams, setSearchParams] = useSearchParams();
+
+ const updateParams = (query: string, value: string) => {
+ const params = searchParams.get(query);
+ if (params) {
+ searchParams.set(query, value);
+ setSearchParams(searchParams, { replace: true });
+ return;
+ }
+ searchParams.append(query, value);
+ setSearchParams(searchParams, { replace: true });
+ };
+
+ return { updateParams };
+}
diff --git a/src/Hooks/useWindowResize.tsx b/src/Hooks/useWindowResize.tsx
new file mode 100644
index 0000000..3585264
--- /dev/null
+++ b/src/Hooks/useWindowResize.tsx
@@ -0,0 +1,20 @@
+import React, { useEffect, useState } from 'react'
+
+export const useWindowResize = () => {
+ const [windowWidth, setWindowWidth] = useState(window.innerWidth);
+
+ useEffect(() => {
+ window.addEventListener('resize', handleResize);
+ // Cleanup function to remove the event listener
+ return () => {
+ window.removeEventListener('resize', handleResize);
+ };
+ }, [windowWidth]);
+
+ const handleResize = () => {
+ setWindowWidth(window.innerWidth);
+ };
+
+ return {windowWidth , handleResize};
+}
+
diff --git a/src/Hooks/usegetTitleFromRoute.tsx b/src/Hooks/usegetTitleFromRoute.tsx
new file mode 100644
index 0000000..514443f
--- /dev/null
+++ b/src/Hooks/usegetTitleFromRoute.tsx
@@ -0,0 +1,8 @@
+import { AppKeyEnum } from "../enums/AppKey";
+import { AppRoutes } from "../Routes";
+
+export const usegetTitleFromRoute = (path: any) => {
+ if (AppRoutes[path]) {
+ return `${AppRoutes[path]}`;
+ }
+};
diff --git a/src/Layout/Ui/ComponentStatusHandler.tsx b/src/Layout/Ui/ComponentStatusHandler.tsx
new file mode 100644
index 0000000..f8b7bd2
--- /dev/null
+++ b/src/Layout/Ui/ComponentStatusHandler.tsx
@@ -0,0 +1,18 @@
+import React from "react";
+import { QueryStatusEnum } from "../../enums/QueryStatus";
+import Loading from "../../Components/Utils/Loading/Loading";
+
+interface ComponentStatusHandlerProps {
+ children: React.ReactNode;
+ status: QueryStatusEnum;
+}
+function ComponentStatusHandler({
+ children,
+ status,
+}: ComponentStatusHandlerProps) {
+ if (status === QueryStatusEnum.LOADING) return ;
+ if (status === QueryStatusEnum.ERROR) return Error
;
+ return children;
+}
+
+export default ComponentStatusHandler;
diff --git a/src/Layout/Ui/Footer.tsx b/src/Layout/Ui/Footer.tsx
new file mode 100644
index 0000000..183a02d
--- /dev/null
+++ b/src/Layout/Ui/Footer.tsx
@@ -0,0 +1,70 @@
+import React from "react";
+import { BsTelephoneOutboundFill } from "react-icons/bs";
+import {
+ FaFacebook,
+ FaInstagram,
+ FaLocationArrow,
+ FaTwitter,
+ FaYoutube,
+} from "react-icons/fa";
+import { IoLocationSharp } from "react-icons/io5";
+import { BiMessageRoundedCheck } from "react-icons/bi";
+import { useTranslation } from "react-i18next";
+import { Link } from "react-router-dom";
+
+const Footer = () => {
+ const {t} = useTranslation();
+ return (
+
+
+
+
+ {t("DM is the one of the world’s largest online shops that providing over 1500 headphones for its costumers from over 80 countries")}
+
+
+
+
+
{t("info")}
+
+
{t("About us")}
+
{t("Headphones")}
+
{t("Earphones")}
+
{t("FAQS")}
+
+
+
+
{t("Contact us")}
+
+
+
+ 123 Main Street, Anytown,USA
+
+
+
+ +1 (555) 123-4567
+
+
+
+ DM Support@gmail.com
+
+
+
+
+
{t("Sign up for News and updates")}
+
+
+
+
+
+
+
+
+ );
+};
+
+export default Footer;
diff --git a/src/Layout/Ui/Layout.tsx b/src/Layout/Ui/Layout.tsx
new file mode 100755
index 0000000..c99006a
--- /dev/null
+++ b/src/Layout/Ui/Layout.tsx
@@ -0,0 +1,33 @@
+import React from "react";
+import { usegetTitleFromRoute } from "../../Hooks/usegetTitleFromRoute";
+import { Helmet } from "react-helmet";
+import { useLocation } from "react-router-dom";
+import NavBar from "./NavBar";
+import Footer from "./Footer";
+import Help from "../../Pages/Help/Page";
+import { useHelpStateState } from "../../state/HelpState";
+const Layout = ({
+ children,
+ className = "",
+}: {
+ children: React.ReactNode;
+ className?: string;
+}) => {
+ const location = useLocation();
+ const { HelpModal } = useHelpStateState();
+ return (
+ <>
+
+ {usegetTitleFromRoute(location.pathname)}
+
+
+
+ {children}
+
+ {HelpModal && }
+
+ >
+ );
+};
+
+export default Layout;
diff --git a/src/Layout/Ui/NavBar.tsx b/src/Layout/Ui/NavBar.tsx
new file mode 100755
index 0000000..ccc9e92
--- /dev/null
+++ b/src/Layout/Ui/NavBar.tsx
@@ -0,0 +1,115 @@
+import { useState } from "react";
+import { Link, useLocation } from "react-router-dom";
+import { BsCart, BsSearch } from "react-icons/bs";
+import { useTranslation } from "react-i18next";
+import { useHelpStateState } from "../../state/HelpState";
+import Auth from "../../Pages/Auth/Page";
+import { Drawer } from "antd";
+import { GiHamburgerMenu } from "react-icons/gi";
+import ViewCart from "../../Components/Cart/Cart";
+import { useCartState } from "../../state/CartState";
+import ViewSearch from "../../Components/Utils/Search/Search";
+import Translate from "../../Components/Utils/Translate";
+
+const NavBar = () => {
+ type item = { name: string; href: string };
+ const { pathname } = useLocation();
+ const [t] = useTranslation();
+
+ const Links: item[] = [
+ { name: t("Home"), href: "/" },
+ { name: t("Categories"), href: "/categories" },
+ { name: t("FAQS"), href: "/faq" },
+ { name: t("about"), href: "/about" },
+ { name: t("Contact"), href: "/contact" },
+ { name: t("help"), href: "help" },
+ ];
+
+ const { setHelpModal } = useHelpStateState();
+
+ const [open, setOpen] = useState(false);
+
+ const showDrawer = () => {
+ setOpen(true);
+ };
+
+ const onClose = () => {
+ setOpen(false);
+ };
+
+ return (
+
+
+
+ {Links?.map((item: item, index: number) => {
+ if (item?.href === "help") {
+ return (
+
setHelpModal()}
+ >
+ {" "}
+ {item?.name}{" "}
+
+ );
+ }
+ return (
+
+ {item?.name}
+
+ );
+ })}
+
+
+
+
+
+
+
+
+
+
+
}>
+
+
+ {Links?.map((item: item, index: number) => {
+ if (item?.href === "help") {
+ return (
+
{
+ setHelpModal();
+ onClose();
+ }}
+ >
+ {" "}
+ {item?.name}{" "}
+
+ );
+ }
+ return (
+
+ {item?.name}
+
+ );
+ })}
+
+
+
+
+
+ );
+};
+
+export default NavBar;
diff --git a/src/Layout/Ui/NotFoundPage.tsx b/src/Layout/Ui/NotFoundPage.tsx
new file mode 100644
index 0000000..5031f6f
--- /dev/null
+++ b/src/Layout/Ui/NotFoundPage.tsx
@@ -0,0 +1,21 @@
+import React from "react";
+import { useNavigate } from "react-router-dom";
+
+function NotFoundPage() {
+ const navigate = useNavigate();
+ return (
+
+
+
+ 404
| This page could not be found
+
+
+ {" "}
+ navigate("/", { replace: true })}>Home
+
+
+
+ );
+}
+
+export default NotFoundPage;
diff --git a/src/Layout/Ui/SideBar.tsx b/src/Layout/Ui/SideBar.tsx
new file mode 100755
index 0000000..ba308f9
--- /dev/null
+++ b/src/Layout/Ui/SideBar.tsx
@@ -0,0 +1,7 @@
+import React from "react";
+
+const SideBar = () => {
+ return SideBar
;
+};
+
+export default SideBar;
diff --git a/src/Layout/app/Const.tsx b/src/Layout/app/Const.tsx
new file mode 100755
index 0000000..5310f0d
--- /dev/null
+++ b/src/Layout/app/Const.tsx
@@ -0,0 +1,48 @@
+export const SideBarLogoUrl = "../Layout/KarimLogo.svg";
+export const UserImageURL =
+ "data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAA8AAD/4QMsaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjUtYzAxNCA3OS4xNTE0ODEsIDIwMTMvMDMvMTMtMTI6MDk6MTUgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDQyAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo4RDI0Q0Q2RjcxQ0ExMUU1QjA2Q0JBMTlGNjJDRUVCMyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo4RDI0Q0Q3MDcxQ0ExMUU1QjA2Q0JBMTlGNjJDRUVCMyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjhEMjRDRDZENzFDQTExRTVCMDZDQkExOUY2MkNFRUIzIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjhEMjRDRDZFNzFDQTExRTVCMDZDQkExOUY2MkNFRUIzIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoKDBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgB9AH0AwERAAIRAQMRAf/EAHwAAQACAwEBAAAAAAAAAAAAAAABBgMEBQcCAQEAAAAAAAAAAAAAAAAAAAAAEAEAAgECAwQIBAIHCQEAAAAAAQIDEQQhBQYxQVESYXGBkSIyQhOxwVIjoRTRYjNTJBU14XKCkrLiQ4NUFhEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8A9cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAJAAAABAJAAAAAABAJAAAAAAAAAAAAABAJAABAJAAAAAAAAAAAAAAAAAAAAAAAAAAABAJAAAAAAAAAAAAAABAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAJAAAAAAAAAAAAAABAJA1AAAAAAAAAAAAAAAAAAAAAAABAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB948OXJPlx0m8z3RGoN/B07zbNETGCaRP65iv4g3cXR29tGuTNjp6I1mfwBsV6M/XutPDSmv5wCf/xeP/65/wCT/uBjt0Zk4+Tc1nw1rMA1s3SXM6fJNMnqnT8dAaG45RzLb/2mC0R+qI1j3wDTmJidJjQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAmImZ0iNZ8IB1Nl05zHc+W00+1jn6r8OHqBYNn0ry/DpbLrntw+bhHD0QDq4dvgw18uLHWkf1YiAZAAAAAAAau55XsNzExlw1mZ+qI0n3wDib7pCsxNtnk0ntjHfs9WoOBu+W73aTpnxTWPHtj3g1gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbvLuUbzfX/arpjifiyT2QC2ct6f2WymL6fdzfrt+UA6gAAAAAAAAAAAPnJix5aTTJWLVnhMTxBXOZ9J0ms5NjOlv7qez2SCtZsGXBknHlrNL14TEg+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd7kvTd9zEZ91rXD21p32BbMWLHixxjx1ilKxpEQD7AAAAAAAAAAAAAABpcy5Ttd/j8uWumSPlyR2wCl8y5Zudhm+3ljWs/JeOyYBpgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAs3T/T1ZrTebyuuvxYsM+HdNtf4As4AAAAAAAAAAAAAAAAAMO72mDd4LYc9fNS3vifGAUfnHKMvLtx5Z1thvxxZPGPCfTANAAAAAAAAAAAAAAAAAAAAAAAAAAEAkAAAAAAAAAAAAAFg6b5H9+0bzcV/arOuKs/VMd/qBbQAAAAAAAAAAAAAAAAAAAYN7s8O8218GWNa27J74numAUPmXL82x3VsOSOHbS3daviDVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0OS8stv93FJ4YqfFln0eAL3jx0x4648cRWlY0rEeAPoAAAAAAAAAAAAAAAAAAAAHO51yqm/2sxpEZ6ccd/yBRL0tS81tGlqzpMemAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACa1ta0VrGtrTpER3yC+cj5fGy2NKTH7t/iyT6Z7gdAAAAAAAAAAAAAAAAAAAAAAAFT6r5ZOPNG8x1+C/DJp3T4+0FeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2ultjGffTmvGtMMax4ebuBcwAAAAAAAAAAAAAAAAAAAAAAAYd5tqbnbZMN41reJj2g87zYrYst8duFqTMTHqB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvXT2zjbctx6xHnyfHaY9PYDpgAAAAAAAAAAAAAAAAAAAAAAAAp/VuzjFva56xEVzRx0/VAOEAAAAAAAAAAAAAAAAAAAAAACASACASAAAAAAADY5ft53G9w4YjXz2iJ9QPRK1itYrHZEaR7ASAAAAAAAAAAAAAAAAAAAAAAAADk9T7X73K72iNbYpi8ervBSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdvpLBGTmU5J/wDFSZ9s8AXIAAAAAAAAAAAAAAAAAAAAAAAAAGPcYozYMmKey9Zr74B5vkr5L2r+mZj3AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFp6NxR9vcZe/WtY/EFkAAAAAAAAAAAAAAAAAAAAAAAAAAB57zfFGLmW4pHZF50BqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuPSFJjl17d1sk6eyIB3AAAAAAAAAAAAAAAAAAAAAAAAAAAUbqWs15xm17/LPvgHLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABc+kv9K/8AZb8IB2gAAAAAAAAAAAAAAAAAAAAAAAAAAUjqn/Wcv+7T/pgHJAAAAAAAAAAAAAAAAAAAAAAAAAAABAJAAAABcOkLzPL8ldflyTw9cA7oAAAAAAAAAAAAAAAAAAAAAAAAAAKL1Jebc4z8ddNI90A5gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALP0Zl+HcYfVaPwBZgAAAAAAAAAAAAAAAAAAAAAAAAAAeec1y/e5juMnda86A1QAQCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdnpTcfa5n5J7MtZr7uILoAAAAAAAAAAAAAAAAAAAAAAAAADFus0Ydtlyz9FZn3QDzi9vNe1vGZn3ggEAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGbZZ5wbrFmidJpaJ1B6LjvW9K3rOsWiJifWD6AAAAAAAAAAAAAAAAAAAAAAAABxuqd19rls44nS2aYrp6I4yClgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAu/TW9jccurWba5MPw2j0dwOsAAAAAAAAAAAAAAAAAAAAAAAACmdVb2M+/wDs1trTDGn/ABT2g4oAAAAAAAAAAAAAAAAAAAAAAAIABIAAIBIAAAAAOv0zvo23MIpedKZo8s+GvcC7AAAAAAAAAAAAAAAAAAAAAAAA1+Ybum02mTPfsrHD0z3A88yZLZMlr2+a0zM+0HyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEzE6xwmOyQXnp/mUbzY1i1tc+L4ckd/okHUAAAAAAAAAAAAAAAAAAAAAABTuqeZ/f3MbbFbXFi+bSeE2/2A4YAAAAAAAAAAAAAAAAAAAAAAAAIBIAAAAAAAAAAANzlXMcmw3dc1eNJ4ZK+NQX7BnxZ8NM2KfNjvGtZB9gAAAAAAAAAAAAAAAAAAAA5XP+b12O28lJ/wARkjSkeEeIKPMzMzM8ZnjMgAAAAAAAAgEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7XT3O52eSNvmt/h7zwmfpme/wBQLnExMRMTrE8YmAAAAAAAAAAAAAAAAAAAAavMuYYdjtrZsk8eylO+0goe93mbebm+fLOtrTwjwjwgGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFg6f6h/l4rtN1OuHXSmT9Ovj6AWytq2rFqzFqz2THGASAAAAAAAAAAAAAAAADW5hzHbbHBOXNbj9NI+a0+gFG5nzLPv9xObJwrHClI7KwDUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1+TdQ59jMYssTl2093fX1AuO23W33WKMuC8XpPfH5gygAAAAAAAAAAAAAA5nNue7XYV8v9pnnsxxPZ6wU3e77c7zNOXPbzWnsjuiPCAa4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANjZcw3WzyefBea8fir3T64BcOT87nf/AAXw2x5NNfNETNJ9oOqAAAAAAAAAAACL3ilLXnsrGs6AqvNeqNxbzYdrS2GO/Jbhb2R3Ar172vab3mbWtxm08ZkEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaeAOpy/p7f7zS01+1i/Xbh7oBYtl0zy7b/Fev3r+N+z3A61KUpWK0iK1jsiOEAkAAAAAAAAAAAAGtuuXbLdRMZ8VbTMaebTj7wcHf9IaVm+zvrP93f8AKQV7c7Tcba80zY5paPGAYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdDlvJN7vrVmlfLhmeOW3Zp6PEFq5f0/sNnEW8v3csfXfj7oB0/UAAAAAAAAAAAAAAAAADFuNrt9xSaZscXrPjAK5zTpOYicmxnXjxxW/KQVzLiy4ck48tZpevbWe0HyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD6x4smW8Y8dZte3CKwC0co6WpTy5t78V+2MXdHr8QWKtK0rFaRFaxwiI7ASAAAAAAAAAAAAAAAAAAAADT5hyrZ76k1zU+PuyR80e0FP5pyTdbC+to8+GflyR+YOcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADZ2HL9zvs32sFdf1WnsiPSC68q5NtuX4/h+PNMfHkmOM+oG+AAAAAAAAAAAAAAAAAAAAAAACL0pes1vEWrMaTEgqnOumbYtdxsom2Ptti749XoBXgAQCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAb3KuU5+YZorWNMUfPk7oBd9lsdvssEYcFdIj5rd8z4yDYAAAAAAAAAAAAAAAAAAAAAAAAAABXufdO0yxbdbSvly9t8cdk+mAVS1Zraa2jS0cJiQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADf5RynLzDcRWNa4a8cmTwgF5222w7bDXDhr5cdeyPzkGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAHC6h5DXc0tutvGm4rxvWPrj+kFPms1mYmNJjhMAAAAAgEgAAAAAAAAAAAAAAAAAAAAAAA2+Wcuzb/c1w4+Fe29+6IBe9ns8G0wVw4Y0rWOM98z4yDOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACu9R8ijJW2821f3Kxrkxx3x4wCqAAAAAAAAAAAAAAAAAAAAAAAAAAAAybfBl3GamHFHmvedIgF85VyzDsNtXHSNbzxyX75kG6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMRMaTxgFQ6l5LG2v/N4K/s3n9ysdlZn+kHBAAAAAAAAAAAAAAAAAAAAAAAAAA9QLl03yf8AlcP8zmjTPkjhE/TUHbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8ZsVM2K2LJGtLxpaPRIKHzjlmTl+6nHOs4rccVvGAaIAAAAAAAAAAAAAAIBIAIBIAAAAAO101yn+a3H38tf2MU66THC1vAFz7I0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoc55ZTf7S1NIjLXjjtpxifD2goeTHfHe1LxNbVnS0T4wD5BAAJAAAAAAAAAAAAAAAAAAABk223ybjPTDjjW15iIB6DsNnj2e1x7enGKRxnxnvkGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACq9V8r8l432P5bzpljwnxBXAQCQAAAAAAAAAAAAAAAQCQAAAWnpPlkRSd9kj4p1ri9XfILIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFutti3OC+DLGtLxpIPPt9tL7TdZMF+2k6RPjHdIMAAAAAAAAAAAAAAAAAAAAAM+x2l93u8e3p23nSZ8I75B6Hgw0w4aYscaUpEVrHqB9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArnV3LvPipvaR8VPhy+qeyQVUAAAAAAAAAAAAAAAAAAAAFn6P2MxGXeWiNJ/bxz3/1pBZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfG4w0zYL4bxrXJWazE+kHnO52+Tb58mHJwvjtNZ9gMYAAAAAAAAAAAAAAAAAAPrHS2S9aV+a0xWPXPAHomx2tdrtMW3idft1iNfGe8GcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFT6v2Xk3GPd17MkeS0emvZ/AFeAAAABAJAAAAAAAAAAAAB2Ol9n9/mUZLRE0wR5uPjPCAXUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGjzvaRuuW5sekeaI81NfGvEFAAAAAAAAAAAAAAAAAAABc+lNp9nl33Zj4s8+b2RwgHaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmNeAPPucbWdrzHNi00r5vNX1W4g0wAAAAAAAAAAAAAAAAfWPHbJkrjr815iI9oPR9rhrh2+PFXspWI90AyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAq3WO10yYdzEcLRNLezjAK2AAAAAAAAAAAAAAAADpdPbf7/NcMTHw0nzz7AXsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK6l2/3uVZJiJm2PS8aegFHAAAAAAAAAAAAAAAABY+jcGuXPmn6Yise3iC1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAx7nHGXb5Mc9lqzH8Aeb3rNL2rPbWZifYCAAAAAAAAAAAAAAAAXPpPD9vlnnnty3mfdwB2gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAefc5w/Z5nuKd3nmY9vEGmAAAAAAAAAAAAAAAD0Dk2L7XK9vX+pEzr6QboAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKX1Zi8nNPNH10ifcDjAAAAAAAAAAAAAAAmtfNaK+M6A9I29Ipt8dYjSK1iP4AyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAq3WWPTLt8kR21msyCtgAAAAAAAAAAAAAAy7Snn3WGvjev4g9IiNIiI7IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXusseu2wX74vMe+AVMAAAAAAAAAAAAAAG1yvy/wCY7fzdnnjtB6GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADh9X+X/Lqa9vnjQFOAAAAAAAB//Z";
+export const LoginBg = "../Layout/LoginBg.jpg";
+export const BaseURL = "https://64df594871c3335b25827869.mockapi.io/";
+export const Currency = "$";
+
+//// rm -rf .git
+export const convert_data_to_select = (array = []) => {
+ if (typeof array === "undefined" || !Array.isArray(array)) {
+ throw new Error("Expected an array argument");
+ }
+ let new_array: any = [];
+ array.map((e: any) => new_array.push({ label: e?.name, value: e?.id }));
+
+ return new_array;
+};
+
+export const FakeSelectData: any = [
+ {
+ name: "mhmad",
+ id: 1,
+ },
+ {
+ name: "karim",
+ id: 2,
+ },
+ {
+ name: "suliman",
+ id: 3,
+ },
+ {
+ name: "ibrahim",
+ id: 4,
+ },
+];
+
+export const hasValue = (fieldValue: any, name: string): boolean => {
+ if (Array.isArray(fieldValue)) {
+ return fieldValue.length > 0;
+ } else if (typeof fieldValue === "object") {
+ return Object.keys(fieldValue).length > 0;
+ } else {
+ return !!fieldValue;
+ }
+};
+
+/// & json-server --watch db.json
diff --git a/src/Pages/About/Page.tsx b/src/Pages/About/Page.tsx
new file mode 100644
index 0000000..fc63c17
--- /dev/null
+++ b/src/Pages/About/Page.tsx
@@ -0,0 +1,58 @@
+import React from "react";
+import { useTranslation } from "react-i18next";
+import { IoIosArrowForward } from "react-icons/io";
+import HeaderLink from "../../Components/Ui/HeaderLink";
+
+const Page = () => {
+ const [t] = useTranslation();
+ return (
+
+
+
+
+
+
+
+
+
+
+
{t("WE ARE DM GROUP")}
+
+
+
+
+
{t("About Us")}
+
+ {t("We are DM company, which has been working for two decades. We are active in the United Arab Emirates in the field of stock laptops, computer parts, RAM, hard drives, etc. We are currently working with Europe, Africa and the Middle East.We provide you the best services with the shortest time and the highest quality")}
+
+
+
+
+
+
+
+
{t("YOU CAN FIND US IN")} :
+
{t("Telegram ID")} : @DM_GROUP
+
{t("Email")} : DM_group@gmail.com
+
{t("Instagram")} : DM_Group
+
{t("LinkedIn")} : DM_Group
+
+
{t("Whatsapp")} :
+
+
+971 56 311 30 11
+ +971 56 611 0 211
+ +971 54 518 60 64
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export default Page;
diff --git a/src/Pages/Auth/LoginForm.tsx b/src/Pages/Auth/LoginForm.tsx
new file mode 100755
index 0000000..388cfa7
--- /dev/null
+++ b/src/Pages/Auth/LoginForm.tsx
@@ -0,0 +1,84 @@
+import React, { useEffect } from "react";
+import { Formik, Form, Field } from "formik";
+import Translate from "../../Components/Utils/Translate";
+import { useTranslation } from "react-i18next";
+import { useNavigate } from "react-router-dom";
+import { AppKeyEnum } from "../../enums/AppKey";
+import { CiMail } from "react-icons/ci";
+import { FaKey } from "react-icons/fa";
+import { Input, Spin } from "antd";
+import { Button } from "react-bootstrap";
+import { useLogin } from "../../api/auth";
+import { toast } from "react-toastify";
+import useAuthState from "../../state/AuthState";
+import { FCM_TOKEN_KEY } from "../../utils/firebase/firebase";
+
+const LoginForm = ({ setOpen }: any) => {
+ const [t] = useTranslation();
+ const { mutate, isLoading, isSuccess, data } = useLogin();
+ const { login } = useAuthState();
+ const FCM = localStorage.getItem(FCM_TOKEN_KEY)
+
+ const handelSubmit = (values: any) => {
+ if (!values.email || !values.password) {
+ toast.error(t("pleas_fill_all_label"));
+
+ return;
+ }
+ mutate({ ...values, fcm_token: FCM });
+ };
+
+ useEffect(() => {
+ if (isSuccess) {
+ login(data?.data as any);
+ toast.success("login successfully");
+ setOpen(false);
+ }
+ }, [isSuccess]);
+ return (
+
+
{t("Log in to DM")}
+
+
+
+
+ );
+};
+
+export default LoginForm;
diff --git a/src/Pages/Auth/Page.tsx b/src/Pages/Auth/Page.tsx
new file mode 100644
index 0000000..11218c9
--- /dev/null
+++ b/src/Pages/Auth/Page.tsx
@@ -0,0 +1,10 @@
+import WithDrawer from "../../Components/HOC/AuthWithDrawer";
+const Auth = () => {
+ return (
+
+
+
+ );
+};
+
+export default Auth;
diff --git a/src/Pages/Auth/Register.tsx b/src/Pages/Auth/Register.tsx
new file mode 100644
index 0000000..c9b0b5e
--- /dev/null
+++ b/src/Pages/Auth/Register.tsx
@@ -0,0 +1,95 @@
+import React, { useEffect } from "react";
+import { Formik, Form, Field } from "formik";
+import Translate from "../../Components/Utils/Translate";
+import { useTranslation } from "react-i18next";
+import { useNavigate } from "react-router-dom";
+import { AppKeyEnum } from "../../enums/AppKey";
+import { CiMail } from "react-icons/ci";
+import { FaKey } from "react-icons/fa";
+import { Input, Spin } from "antd";
+import { Button } from "react-bootstrap";
+import { IoMdPerson } from "react-icons/io";
+import { toast } from "react-toastify";
+import { useRegister } from "../../api/auth";
+import useAuthState from "../../state/AuthState";
+
+const RegisterForm = ({ setOpen }: any) => {
+ const [t] = useTranslation();
+
+ const navigate = useNavigate();
+ const { mutate, isLoading, isSuccess, data } = useRegister();
+
+ const handelSubmit = (values: any) => {
+ if (!values.email || !values.password || !values.name) {
+ toast.error(t("pleas_fill_all_label"));
+ return;
+ }
+ mutate(values);
+ };
+
+
+ useEffect(() => {
+ if (isSuccess) {
+ toast.success("registered successfully");
+
+ }
+ }, [isSuccess]);
+
+ return (
+
+
{t("Create your account")}
+
+
+
+
+ );
+};
+
+export default RegisterForm;
diff --git a/src/Pages/Auth/VerifyForm.tsx b/src/Pages/Auth/VerifyForm.tsx
new file mode 100644
index 0000000..e7d476b
--- /dev/null
+++ b/src/Pages/Auth/VerifyForm.tsx
@@ -0,0 +1,84 @@
+import React, { useEffect } from 'react'
+import { Formik, Form, Field } from 'formik';
+import Translate from '../../Components/Utils/Translate';
+import { useTranslation } from 'react-i18next';
+import { useNavigate } from 'react-router-dom';
+import { AppKeyEnum } from "../../enums/AppKey";
+import { CiMail } from "react-icons/ci";
+import { FaKey } from "react-icons/fa";
+import { Input, Spin } from 'antd';
+import { Button } from 'react-bootstrap';
+import { IoMdPerson } from "react-icons/io";
+import { toast } from 'react-toastify';
+import { useVerify } from '../../api/auth';
+
+
+const VerifyForm = () => {
+ const [t] = useTranslation();
+ const { mutate, isLoading, isSuccess, data } = useVerify();
+
+ const handelSubmit = (values: any) => {
+ if (!values.email || !values.verify_code ) {
+ toast.error(t("pleas_fill_all_label"));
+ return;
+ }
+ mutate(values);
+ };
+ useEffect(() => {
+ if (isSuccess) {
+ toast.success("registered successfully");
+
+ }
+ }, [isSuccess]);
+
+ return (
+
+
{t("verify your account")}
+
+
+
+
+
+
+ )
+}
+
+export default VerifyForm;
\ No newline at end of file
diff --git a/src/Pages/Categories/FilterSection.tsx b/src/Pages/Categories/FilterSection.tsx
new file mode 100644
index 0000000..027c4de
--- /dev/null
+++ b/src/Pages/Categories/FilterSection.tsx
@@ -0,0 +1,46 @@
+import React from "react";
+import type { CollapseProps } from "antd";
+import { Collapse } from "antd";
+import BrandFilter from "../../Components/Categories/BrandFilter";
+import WearingStyleFilter from "../../Components/Categories/WearingStyle";
+import ConnectivityFilter from "../../Components/Categories/Connectivity";
+import { IoIosArrowDown } from "react-icons/io";
+import { SlArrowDown } from "react-icons/sl";
+import { useTranslation } from "react-i18next";
+
+
+const FilterSection: React.FC = () => {
+
+ const [t] = useTranslation()
+const items: CollapseProps["items"] = [
+ {
+ key: "1",
+ label: t("Categories"),
+ children: ,
+ },
+ {
+ key: "2",
+ label: t("sub_categories"),
+ children: ,
+ },
+ // {
+ // key: "3",
+ // label: "Wearing Style",
+ // children: ,
+ // },
+];
+
+
+ return (
+
+ );
+}
+
+export default FilterSection;
diff --git a/src/Pages/Categories/Page.tsx b/src/Pages/Categories/Page.tsx
new file mode 100644
index 0000000..f22fc5f
--- /dev/null
+++ b/src/Pages/Categories/Page.tsx
@@ -0,0 +1,161 @@
+import React, { useState, useEffect } from "react";
+import ProductCard from "../../Components/Home/ProductCard";
+import { MdOutlineCancel } from "react-icons/md";
+import { useFilterStateState } from "../../state/Filter";
+import { Drawer, Pagination, Select, Spin } from "antd";
+import FilterSection from "./FilterSection";
+import { useGetBaseProduct } from "../../api/baseProduct";
+import { Category, Product } from "../../types/item";
+import { IoIosArrowForward } from "react-icons/io";
+import { useTranslation } from "react-i18next";
+import { useSearchParams } from "react-router-dom";
+import HeaderLink from "../../Components/Ui/HeaderLink";
+
+const Page = () => {
+ const { Filter, setFilter } = useFilterStateState();
+ const [searchParams, setSearchParams] = useSearchParams();
+ const type_param = searchParams.get('type');
+
+ const [type, setType] = useState(type_param);
+ const [currentPage, setCurrentPage] = useState(1);
+ const [totalItems, setTotalItems] = useState(0);
+ console.log(totalItems);
+
+
+ useEffect(() => {
+ setType(type_param);
+ }, [type_param]);
+
+
+ const handel_filter_delete = (index: number) => {
+ setFilter(Filter.filter((_: any, i: number) => i !== index));
+ };
+
+ const handel_filter_reset = () => {
+ setFilter([]);
+ };
+
+ const handleChange = (value: string) => {
+ const newArray = Filter?.filter((item: any) => item.select !== true);
+ setFilter([
+ ...newArray,
+ { name: value, index: Filter.length, select: true },
+ ]);
+ if (type_param) {
+ searchParams.delete('type');
+ setSearchParams(searchParams);
+ }
+ setType(value);
+ };
+
+ const handlePageChange = (page: number) => {
+ setCurrentPage(page);
+ };
+
+ const [open, setOpen] = useState(false);
+
+ const showDrawer = () => {
+ setOpen(true);
+ };
+
+ const onClose = () => {
+ setOpen(false);
+ };
+
+ const categories = Filter?.filter((item:any)=> item.select !== true)?.map((item:any)=> item?.id)
+ console.log(categories,"categories");
+
+
+ const { data , isLoading } = useGetBaseProduct({
+ type: type,
+ page: currentPage,
+ categories_id:categories
+ });
+
+ useEffect(() => {
+ if (data?.meta) {
+ setTotalItems(data.meta?.total);
+ }
+ }, [data]);
+
+ const BaseProducts = (data?.products as Product[]) || ([] as []);
+
+ const [t] = useTranslation();
+
+ return (
+
+
+
+
+
+
+ {t("Filters")}
+ handel_filter_reset()}>{t("Clear_All")}
+
+
+
+
+
+
+ {isLoading && }
+ {BaseProducts?.map((item: Product, index: number) => (
+
+ ))}
+
+
+
+
+
+ );
+};
+
+export default Page;
diff --git a/src/Pages/Contact/Contact.tsx b/src/Pages/Contact/Contact.tsx
new file mode 100644
index 0000000..ba0697e
--- /dev/null
+++ b/src/Pages/Contact/Contact.tsx
@@ -0,0 +1,89 @@
+import React, { useRef, useState } from 'react'
+import { FaChevronRight, FaInstagram, FaLinkedinIn, FaTwitter } from "react-icons/fa6";
+import { Button, Form } from 'react-bootstrap';
+import { useTranslation } from 'react-i18next';
+import { toast } from 'react-toastify';
+import { IoMailOutline,IoEarthOutline } from "react-icons/io5";
+import { FiPhone } from "react-icons/fi";
+import { FaFacebookF } from "react-icons/fa";
+import ContactTab from '../../Components/Setting/Tabs/ContactTab';
+import HeaderLink from '../../Components/Ui/HeaderLink';
+
+const Contact = () => {
+ const form = useRef(null);
+ const { t } = useTranslation();
+
+ const sendEmail = (e: React.FormEvent) => {
+ e.preventDefault();
+
+
+
+ if(!Name || !Email || !Message ){
+ toast.error(t("please_fill_all_input"))
+ }else{
+ toast.success(t("Send Successfully"))
+ }
+
+ setMessage('')
+ setName('')
+ setEmail('')
+
+ };
+
+ const [Name , setName] = useState('')
+ const [Email , setEmail] = useState('')
+ const [Message , setMessage] = useState('')
+
+
+ const SoicalInfo: { icon: any; text: string }[] = [
+ {
+ icon: ,
+ text: "info@yourdomain.com",
+ },
+ {
+ icon: ,
+ text: "+1 (378) 400-1234",
+ },
+ {
+ icon: ,
+ text: "www.yourdomain.com",
+ },
+ ];
+
+ const SoicalIcons: { icon: any; }[] = [
+ {
+ icon: ,
+ },
+ {
+ icon: ,
+ },
+ {
+ icon: ,
+ },
+ {
+ icon: ,
+ },
+ ];
+
+ return (
+
+
+
+
+
+
+
{t("Contact Us")}
+
{t("DM")} / {t("Contact")}
+
+
+
+
+
{t("We love meeting new people and helping them")}.
+
+
+
+
+ )
+}
+
+export default Contact
\ No newline at end of file
diff --git a/src/Pages/Faqs/CollapseGroup.tsx b/src/Pages/Faqs/CollapseGroup.tsx
new file mode 100644
index 0000000..b5ae6d1
--- /dev/null
+++ b/src/Pages/Faqs/CollapseGroup.tsx
@@ -0,0 +1,68 @@
+import type { CollapseProps } from "antd";
+import { Collapse } from "antd";
+import React from 'react'
+import { useTranslation } from "react-i18next";
+
+
+const CollapseGroup = () => {
+ const {t} = useTranslation();
+
+ const items: CollapseProps["items"] = [
+ {
+ key: "1",
+ label: t("Can I purchase products from DM using installment payments?"),
+ children: (
+
+ {t("Yes, DM offers the option to purchase products using both cash and installment payments. This allows you to choose the payment method that suits your needs and budget")}.
+
+ ),
+ },
+ {
+ key: "2",
+ label: t("How can I engage with the magazine content on DM?"),
+ children: (
+
+ {t("You can actively engage with the magazine content by leaving comments and participating in the question-and-answer section. Feel free to share your thoughts, ask questions, and interact with enthusiastsin the community")}.
+
+ ),
+ },
+ {
+ key: "3",
+ label: t("Does DM offer a warranty on its products?"),
+ children: (
+
+ {t("Yes, DM provides a warranty on all eligible products. The specific warranty details may vary depending on the manufacturer and product category. Please refer to the product description or contact our customer support for more information")}.
+
+ ),
+ },
+ {
+ key: "4",
+ label: t("Is DM a secure platform for online shopping?"),
+ children: (
+
+ {t("Yes, DM provides a warranty on all eligible products. The specific warranty details may vary depending on the manufacturer and product category. Please refer to the product description or contact our customer support for more information")}.
+
+ ),
+ },
+ {
+ key: "5",
+ label: t("How can I get assistance with my purchase or any other inquiries?"),
+ children: (
+
+ {t("If you need assistance with your purchase or have any questions, our dicated customer is here to help. You out to us through the contact page on our website, and we'll be happy to assist you promptly")}.
+
+ ),
+ },
+ ];
+
+ return (
+
+ )
+}
+
+export default CollapseGroup
\ No newline at end of file
diff --git a/src/Pages/Faqs/Faqs.tsx b/src/Pages/Faqs/Faqs.tsx
new file mode 100644
index 0000000..647857b
--- /dev/null
+++ b/src/Pages/Faqs/Faqs.tsx
@@ -0,0 +1,36 @@
+import React from "react";
+import { useTranslation } from "react-i18next";
+import { FaqsInfo } from "../../data/FaqsInfo";
+import CollapseGroup from "./CollapseGroup";
+import { IoIosArrowForward } from "react-icons/io";
+import HeaderLink from "../../Components/Ui/HeaderLink";
+
+const Faqs = () => {
+ const { t } = useTranslation();
+
+ return (
+
+
+
+
+
+
{t("Frequently Asked Questions")}
+
+
+
+
+
{t("Table of Contents")}
+ {FaqsInfo.map((info) => (
+
{t(info.text)}
+ ))}
+
+
+
+
+
+
+
+ );
+};
+
+export default Faqs;
diff --git a/src/Pages/Help/Page.tsx b/src/Pages/Help/Page.tsx
new file mode 100644
index 0000000..e5eb6d5
--- /dev/null
+++ b/src/Pages/Help/Page.tsx
@@ -0,0 +1,95 @@
+import React from "react";
+import { useTranslation } from "react-i18next";
+import { disconnectSocket, getSocket } from "../../lib/SocketProvider";
+import { useHelpStateState } from "../../state/HelpState";
+import useSocketTracker from "../../Hooks/useSocketTracker";
+import { Message } from "../../types/Socket";
+import { SOCKET } from "../../enums/Socket";
+import { TiDelete } from "react-icons/ti";
+import { GiHamburger } from "react-icons/gi";
+import { MenuOutlined } from "@ant-design/icons";
+
+const Page = () => {
+ const Socket = getSocket();
+
+ const [t] = useTranslation();
+ const [messages, setMessages] = React.useState([]);
+ const [input, setInput] = React.useState("");
+ const messagesEndRef = React.useRef(null);
+
+ const { setHelpModal } = useHelpStateState();
+
+ useSocketTracker();
+
+ React.useEffect(() => {
+ Socket.on(SOCKET.EVENT_SEND_MESSAGE, (msg: string) => {
+ setMessages((prevMessages) => [
+ ...prevMessages,
+ { type: SOCKET.INCOMING, text: msg },
+ ]);
+ });
+
+ return () => {
+ disconnectSocket();
+ };
+ }, []);
+
+ const handleSubmit = (e: React.FormEvent) => {
+ e.preventDefault();
+ if (input.trim()) {
+ Socket.emit(SOCKET.EVENT_SEND_MESSAGE, input);
+ setMessages((prevMessages) => [
+ ...prevMessages,
+ { type: SOCKET.OUTGOING, text: input },
+ ]);
+ setInput("");
+ scrollToBottom();
+ }
+ };
+ const scrollToBottom = () => {
+ if (messagesEndRef.current) {
+ messagesEndRef.current.scrollIntoView({ behavior: "smooth" });
+ }
+ };
+
+ return (
+ <>
+
+
+
+ {messages?.length > 0 && (
+
+ {messages.map((msg: Message, index) => (
+
+ {msg.text}
+
+ ))}
+
+
+ )}
+
+
+
+
+
+ setHelpModal()} className="black_bg" />
+ >
+ );
+};
+
+export default Page;
diff --git a/src/Pages/Home/Page.tsx b/src/Pages/Home/Page.tsx
new file mode 100644
index 0000000..b63d361
--- /dev/null
+++ b/src/Pages/Home/Page.tsx
@@ -0,0 +1,30 @@
+import React from "react";
+import HeroSection from "../../Components/Home/HeroSection";
+import HomeSlider from "../../Components/Home/CategoriesSlider";
+import ProductsOnSale from "../../Components/Home/ProductsOnSale";
+import Products from "../../Components/Home/Products";
+import PremiumDesign from "../../Components/Home/PremiumDesign";
+import BoseHeadphones from "../../Components/Home/BoseHeadphones";
+import NoiseCancellation from "../../Components/Home/NoiseCancellation";
+import BatteryLife from "../../Components/Home/BatteryLife";
+import PerfectSound from "../../Components/Home/PerfectSound";
+import BestSale from "../../Components/Home/BestSale";
+
+const Page = () => {
+ return (
+
+
+
+ {/*
*/}
+
+
+
+
+
+
+
+
+ );
+};
+
+export default Page;
diff --git a/src/Pages/Product/Page.tsx b/src/Pages/Product/Page.tsx
new file mode 100644
index 0000000..d6e63b9
--- /dev/null
+++ b/src/Pages/Product/Page.tsx
@@ -0,0 +1,102 @@
+import React, { useState } from "react";
+import { useTranslation } from "react-i18next";
+import { IoIosArrowForward } from "react-icons/io";
+import { Currency } from "../../Layout/app/Const";
+import Similar from "./Similar";
+import { useGetSingleBaseProduct } from "../../api/baseProduct";
+import { Product } from "../../types/item";
+import { useParams } from "react-router-dom";
+import CustomImage from "../../ui/CustomImage";
+import { Spin } from "antd";
+import { languageObject } from "../../utils/languageObject";
+import { jsonObjectToArray } from "../../utils/jsonObjectToArray";
+import HeaderLink from "../../Components/Ui/HeaderLink";
+import { BaseURL } from "../../api/utils/config";
+
+const Page = () => {
+
+ const [t] = useTranslation();
+ const {product_id} = useParams()
+ const {data,isLoading} = useGetSingleBaseProduct({
+ show:product_id
+ })
+ const product = data?.data?.product as Product || {}
+
+
+ const [MainImage, setMainImage] = useState(product?.main_photo);
+
+ const handelImage = (item: any) => {
+ // setMainImage(item);
+ };
+ console.log(product?.images);
+
+ const info = jsonObjectToArray(product?.info)
+
+ if(isLoading){
+ return
+ }
+ return (
+
+
+
+
+
+
+
+ {product?.images?.map((item,index)=>{
+ return (
+
handelImage(item?.path)} >
+
+
+ )
+ })}
+
+ handelImage('/Home/p1.png')}
+ // src={}
+ alt=""
+ />
+
+
+
+
+
+
+
{languageObject(product?.name)}
+
+
+
+ category {languageObject(product?.category?.name)}
+
+
+ price {product?.price}
+
+
+ brand SAMSUNG
+
+
+ {info?.map((item:any)=>{
+ return (
+
+ item SAMSUNG
+
+ )
+ })}
+
+ description {languageObject(product?.description)}
+
+
+
+
+
+
+ );
+};
+
+export default Page;
diff --git a/src/Pages/Product/Similar.tsx b/src/Pages/Product/Similar.tsx
new file mode 100644
index 0000000..8269de3
--- /dev/null
+++ b/src/Pages/Product/Similar.tsx
@@ -0,0 +1,19 @@
+import { useGetBaseProduct } from "../../api/baseProduct";
+import ProductSwiper from "../../Components/Home/ProductSwiper";
+
+const Similar = () => {
+ const { data } = useGetBaseProduct();
+
+ return (
+
+ );
+};
+
+export default Similar;
diff --git a/src/Pages/Setting/Page.tsx b/src/Pages/Setting/Page.tsx
new file mode 100644
index 0000000..14cb2aa
--- /dev/null
+++ b/src/Pages/Setting/Page.tsx
@@ -0,0 +1,25 @@
+import React from 'react'
+import { useTranslation } from 'react-i18next';
+import { FaChevronRight } from 'react-icons/fa';
+import SettingTabs from '../../Components/Setting/SettingTabs';
+import HeaderLink from '../../Components/Ui/HeaderLink';
+
+function SettingPage() {
+ const { t } = useTranslation();
+
+ return (
+ <>
+
+ >
+ )
+}
+
+export default SettingPage
\ No newline at end of file
diff --git a/src/ProviderContainer.tsx b/src/ProviderContainer.tsx
new file mode 100644
index 0000000..abd578b
--- /dev/null
+++ b/src/ProviderContainer.tsx
@@ -0,0 +1,37 @@
+import QueryProvider from "./lib/ReactQueryProvider";
+import { BrowserRouter } from "react-router-dom";
+import { Tchildren } from "./types/App";
+import { ConfigProvider } from "antd";
+import ReduxT from "./lib/ReduxT";
+import ToastProvider from "./lib/ToastProvider";
+
+function ProviderContainer({ children }: Tchildren) {
+ return (
+
+
+
+
+
+ {/* */}
+ {children}
+ {/* */}
+
+
+
+
+
+ );
+}
+
+export default ProviderContainer;
diff --git a/src/Redux/DispatchData.tsx b/src/Redux/DispatchData.tsx
new file mode 100644
index 0000000..e812d79
--- /dev/null
+++ b/src/Redux/DispatchData.tsx
@@ -0,0 +1,28 @@
+import { useDispatch, useSelector } from "react-redux";
+import { RootState } from "./store";
+import { setProductData } from "./Slice/productSlice";
+
+import { useEffect } from "react";
+import { setCartData } from "./Slice/cartSlice";
+import { Cartdata } from "../data/CartData";
+
+export const useProductData = () => {
+ const Product = useSelector((state: RootState) => state.Product.value);
+ const dispatch = useDispatch();
+ useEffect(() => {
+ dispatch(setProductData([]));
+ }, [dispatch]);
+ return { Product, dispatch };
+};
+
+export const useCartData = () => {
+ const DataCart = useSelector((state: RootState) => state.Cart.value);
+ const count = useSelector((state: RootState) => state.Cart.count);
+
+ const dispatch = useDispatch();
+ useEffect(() => {
+ dispatch(setCartData(Cartdata));
+ }, [dispatch, DataCart, count]);
+
+ return { DataCart, dispatch, count };
+};
diff --git a/src/Redux/Slice/cartSlice.tsx b/src/Redux/Slice/cartSlice.tsx
new file mode 100644
index 0000000..60ff8d9
--- /dev/null
+++ b/src/Redux/Slice/cartSlice.tsx
@@ -0,0 +1,30 @@
+import { createSlice } from "@reduxjs/toolkit";
+import type { PayloadAction } from "@reduxjs/toolkit";
+import { TProduct } from "../../types/Cart";
+
+interface CartState {
+ value: TProduct[] | [];
+ count: number;
+}
+
+const initialState: CartState = {
+ value: [],
+ count: 3,
+};
+
+export const CartSlice = createSlice({
+ name: "Cart",
+ initialState,
+ reducers: {
+ setCartData: (state: any, action: PayloadAction) => {
+ return {
+ ...state,
+ value: action.payload,
+ };
+ },
+ },
+});
+
+export const { setCartData } = CartSlice.actions;
+
+export default CartSlice.reducer;
diff --git a/src/Redux/Slice/index.tsx b/src/Redux/Slice/index.tsx
new file mode 100644
index 0000000..ac5ebac
--- /dev/null
+++ b/src/Redux/Slice/index.tsx
@@ -0,0 +1,4 @@
+import ProductReducer from "./productSlice";
+import CartSliceReducer from "./cartSlice";
+
+export { ProductReducer, CartSliceReducer };
diff --git a/src/Redux/Slice/productSlice.tsx b/src/Redux/Slice/productSlice.tsx
new file mode 100644
index 0000000..fdf1a88
--- /dev/null
+++ b/src/Redux/Slice/productSlice.tsx
@@ -0,0 +1,29 @@
+import { createSlice } from "@reduxjs/toolkit";
+import type { PayloadAction } from "@reduxjs/toolkit";
+
+interface ProductState {
+ value: any;
+}
+
+const initialState: ProductState = {
+ value: {
+ data: [],
+ },
+};
+
+export const ProductSlice = createSlice({
+ name: "product",
+ initialState,
+ reducers: {
+ setProductData: (state: any, action: PayloadAction) => {
+ return {
+ ...state,
+ value: action.payload,
+ };
+ },
+ },
+});
+
+export const { setProductData } = ProductSlice.actions;
+
+export default ProductSlice.reducer;
diff --git a/src/Redux/store.tsx b/src/Redux/store.tsx
new file mode 100644
index 0000000..cb3adaf
--- /dev/null
+++ b/src/Redux/store.tsx
@@ -0,0 +1,12 @@
+import { configureStore } from "@reduxjs/toolkit";
+import { CartSliceReducer, ProductReducer } from "./Slice";
+
+export const store = configureStore({
+ reducer: {
+ Product: ProductReducer,
+ Cart: CartSliceReducer,
+ },
+});
+
+export type RootState = ReturnType;
+export type AppDispatch = typeof store.dispatch;
diff --git a/src/Routes.tsx b/src/Routes.tsx
new file mode 100644
index 0000000..571c902
--- /dev/null
+++ b/src/Routes.tsx
@@ -0,0 +1,49 @@
+import { lazy } from "react";
+import Auth from "./Pages/Auth/Page";
+import Page from "./Pages/Home/Page";
+import { TRoute } from "./types/App";
+import Contact from "./Pages/Contact/Contact";
+import Faqs from "./Pages/Faqs/Faqs";
+import About from "./Pages/About/Page";
+import Categories from "./Pages/Categories/Page";
+import SettingPage from "./Pages/Setting/Page";
+import Product from "./Pages/Product/Page";
+
+const Page404 = lazy(() => import("./Layout/Ui/NotFoundPage"));
+
+export const routes: TRoute[] = [
+ { path: "*", header: "Error Page", element: },
+ { path: "/auth", header: "Sign In", element: },
+ { path: "/", header: "Home Page", element: , withLayout: true },
+ {
+ path: "/contact",
+ header: "Contact",
+ element: ,
+ withLayout: true,
+ },
+ { path: "/faq", header: "Faq", element: , withLayout: true },
+ { path: "/about", header: "About", element: , withLayout: true },
+ {
+ path: "/categories",
+ header: "Categories",
+ element: ,
+ withLayout: true,
+ },
+ {
+ path: "/settings",
+ header: "Settings",
+ element: ,
+ withLayout: true,
+ },
+
+ {
+ path: "/product/:product_id",
+ header: "product",
+ element: ,
+ withLayout: true,
+ },
+];
+
+export const AppRoutes: Record = Object.fromEntries(
+ routes.map((route) => [route.path, route.header]),
+);
diff --git a/src/Styles/Activities/ActivitiesPage.scss b/src/Styles/Activities/ActivitiesPage.scss
new file mode 100644
index 0000000..b90515c
--- /dev/null
+++ b/src/Styles/Activities/ActivitiesPage.scss
@@ -0,0 +1,22 @@
+.Activities {
+ display: flex;
+ align-items: center;
+ flex-direction: column;
+}
+
+.ActivitiesPage {
+ display: flex;
+ width: 100%;
+ height: 100%;
+}
+.pagination {
+ ul {
+ li {
+ border: 0.5px solid #757575;
+ }
+ a {
+ border: 0.5px solid #757575;
+ border-radius: 6px;
+ }
+ }
+}
diff --git a/src/Styles/Activities/Feild.scss b/src/Styles/Activities/Feild.scss
new file mode 100644
index 0000000..c4872d2
--- /dev/null
+++ b/src/Styles/Activities/Feild.scss
@@ -0,0 +1,43 @@
+.status_holder {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ height: 100%;
+ width: 100%;
+ color: #333333;
+ font-style: italic;
+ margin-block: 6px;
+}
+.status_saperator {
+ border: 1px solid #d9d9d9;
+ width: 100%;
+ margin-block: 8px;
+}
+
+.PopularFeild {
+ display: flex;
+ justify-content: space-around;
+ align-items: center;
+ width: 100%;
+ height: 100%;
+ flex-direction: column;
+ .popular_holder {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 100%;
+ height: 100%;
+ gap: 30px;
+ }
+ .first {
+ font-size: 10px;
+ color: #016855;
+ max-width: 25px;
+ text-align: center;
+ }
+ .second {
+ // flex: 1;
+ font-size: 12px;
+ color: #757575;
+ }
+}
diff --git a/src/Styles/Activities/HeroSection.scss b/src/Styles/Activities/HeroSection.scss
new file mode 100644
index 0000000..736232e
--- /dev/null
+++ b/src/Styles/Activities/HeroSection.scss
@@ -0,0 +1,15 @@
+.Activities_Hero {
+ width: 100%;
+ height: 300px;
+ background-size: cover;
+ background-position: center;
+ background-repeat: no-repeat;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ background-color: aquamarine;
+ > h1 {
+ color: var(--secondary);
+ font-size: 40px;
+ }
+}
diff --git a/src/Styles/Activities/LeftBody.scss b/src/Styles/Activities/LeftBody.scss
new file mode 100644
index 0000000..a7c1e9a
--- /dev/null
+++ b/src/Styles/Activities/LeftBody.scss
@@ -0,0 +1,82 @@
+.LeftBody {
+ flex: 1;
+ display: flex;
+ align-items: center;
+ width: 100%;
+ height: 100%;
+ padding: 2vw;
+ flex-direction: column;
+}
+
+.LeftBodyHolder {
+ display: flex;
+ justify-content: center;
+ width: 100%;
+ height: 100%;
+ flex-direction: column;
+ border-color: var(--border);
+ border-style: solid;
+ border-width: 1px;
+ border-radius: 20px;
+ max-width: 837px;
+ max-height: 597px;
+ margin-top: 3vw;
+ padding-bottom: 1vw;
+
+ > img {
+ width: 100%;
+ height: 350%;
+ object-fit: cover;
+ }
+ .data_holder {
+ padding-inline: 3vw;
+ }
+ .title {
+ font-size: 25px;
+ font-weight: 400;
+ color: #333333;
+ }
+ .line {
+ width: 100%;
+ height: 1px;
+ background-color: #acacac;
+ margin-block: 1vw;
+ }
+ .text {
+ width: 100%;
+ > p {
+ color: #757575;
+ font-size: 12px;
+ font-weight: 400;
+ line-height: 18px;
+ max-width: 400px;
+ }
+ }
+ .read {
+ color: var(--border);
+ font-size: 14px;
+ font-weight: 500;
+ cursor: pointer;
+ &:hover {
+ text-decoration: underline;
+ }
+ }
+ .location {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ color: #757575;
+ font-size: 12px;
+ font-weight: 700;
+
+ > img {
+ width: 20px;
+ height: 20px;
+ }
+ .location_icon {
+ width: 20px;
+ height: 20px;
+ color: var(--border);
+ }
+ }
+}
diff --git a/src/Styles/Activities/RightBody.scss b/src/Styles/Activities/RightBody.scss
new file mode 100644
index 0000000..2aa68e5
--- /dev/null
+++ b/src/Styles/Activities/RightBody.scss
@@ -0,0 +1,46 @@
+.RightBody {
+ flex: 0.4;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ width: 100%;
+ height: 100%;
+ padding-top: 3vw;
+ padding-inline: 6vw;
+ border-color: var(--border);
+
+ > p {
+ margin-top: 20px;
+ }
+ .status_box {
+ width: 100%;
+ max-width: 300px;
+ display: flex;
+ align-items: center;
+ border: 1px solid #757575;
+ flex-direction: column;
+ border-radius: 15px;
+ font-size: 12px;
+ padding: 1vw;
+ margin-top: 8px;
+ }
+ > h3 {
+ color: black;
+ font-size: 17px;
+ margin-block: 23px;
+ }
+
+ .popular_box {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ width: 100%;
+ height: 100%;
+ border: 1px solid #757575;
+ flex-direction: column;
+ border-radius: 15px;
+ font-size: 12px;
+ padding: 1vw;
+ margin-top: 8px;
+ }
+}
diff --git a/src/Styles/Activities/index.scss b/src/Styles/Activities/index.scss
new file mode 100644
index 0000000..7181530
--- /dev/null
+++ b/src/Styles/Activities/index.scss
@@ -0,0 +1,5 @@
+@import "./HeroSection.scss";
+@import "./ActivitiesPage.scss";
+@import "./RightBody.scss";
+@import "./LeftBody.scss";
+@import "./Feild.scss";
diff --git a/src/Styles/App/App.scss b/src/Styles/App/App.scss
new file mode 100644
index 0000000..eb972b4
--- /dev/null
+++ b/src/Styles/App/App.scss
@@ -0,0 +1,59 @@
+html,
+body {
+ background: var(--bg);
+}
+
+* {
+ padding: 0;
+ margin: 0;
+}
+
+a {
+ color: inherit;
+ // font-weight: bold;
+ text-decoration: none;
+ cursor: pointer;
+}
+
+button,
+svg {
+ cursor: pointer;
+}
+
+.not_foound_page {
+ background: black;
+ height: 100vh;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+
+ p {
+ color: white;
+ display: inline;
+ }
+ h6 {
+ display: inline;
+ margin-inline: 20px;
+ height: 140px !important;
+
+ width: 20px;
+ }
+ .container-not-found {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ div {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ }
+ button {
+ border: none;
+ outline: none;
+ padding: 8px;
+ border-radius: 10px;
+
+ margin-inline: 30px;
+ }
+ }
+}
diff --git a/src/Styles/App/KeyFrames.scss b/src/Styles/App/KeyFrames.scss
new file mode 100644
index 0000000..9db9316
--- /dev/null
+++ b/src/Styles/App/KeyFrames.scss
@@ -0,0 +1,117 @@
+@keyframes fadeInBottom {
+ from {
+ opacity: 0;
+ transform: translate3d(0, 1600px, 0);
+ }
+ 80% {
+ transform: translate3d(0, 10px, 0);
+ }
+ 90%,
+ 70% {
+ transform: translate3d(0, 0%, 0);
+ }
+ to {
+ opacity: 1;
+ transform: none;
+ }
+}
+
+@keyframes fadeInRight {
+ from {
+ opacity: 0;
+ transform: translate3d(1600px, 0, 0);
+ }
+ 80% {
+ transform: translate3d(10px, 0, 0);
+ }
+ 90%,
+ 70% {
+ transform: translate3d(0, 0%, 0);
+ }
+ to {
+ opacity: 1;
+ transform: none;
+ }
+}
+@keyframes fadeInLeft {
+ from {
+ opacity: 0;
+ transform: translate3d(-1600px, 0, 0);
+ }
+ 80% {
+ transform: translate3d(-10px, 0, 0);
+ }
+ 90%,
+ 70% {
+ transform: translate3d(0, 0%, 0);
+ }
+ to {
+ opacity: 1;
+ transform: none;
+ }
+}
+@keyframes opacityIn {
+ from {
+ opacity: 0;
+ }
+
+ to {
+ opacity: 1;
+ }
+}
+
+@mixin fadeTow($Time) {
+ > *:nth-child(1) {
+ animation: fadeInLeft $Time ease-in-out;
+ }
+ > *:nth-child(2) {
+ animation: fadeInRight $Time ease-in-out;
+ }
+}
+@mixin fadeThree($Time) {
+ > *:nth-child(1) {
+ animation: fadeInLeft $Time ease-in-out;
+ }
+ > *:nth-child(2) {
+ animation: fadeInBottom $Time ease-in-out;
+ }
+ > *:nth-child(3) {
+ animation: fadeInRight $Time ease-in-out;
+ }
+}
+
+@keyframes bounce {
+ from,
+ 20%,
+ 53%,
+ 80%,
+ to {
+ animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);
+ transform: translate3d(0, 0, 0);
+ }
+
+ 40%,
+ 43% {
+ animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);
+ transform: translate3d(0, -30px, 0);
+ }
+
+ 70% {
+ animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);
+ transform: translate3d(0, -15px, 0);
+ }
+
+ 90% {
+ transform: translate3d(0, -4px, 0);
+ }
+}
+@keyframes fadeOutRight {
+ from {
+ opacity: 1;
+ }
+
+ to {
+ opacity: 0;
+ transform: translateX(1600px);
+ }
+}
diff --git a/src/Styles/App/Mixing.scss b/src/Styles/App/Mixing.scss
new file mode 100644
index 0000000..93918ac
--- /dev/null
+++ b/src/Styles/App/Mixing.scss
@@ -0,0 +1,150 @@
+@mixin Shadow {
+ box-shadow: 0 4px 20px 0 rgba(0, 0, 0, 0.07);
+}
+
+@mixin HardShadow {
+ box-shadow: 0 4px 20px 0 rgba(0, 0, 0, 0.1);
+}
+@mixin Flex {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+@mixin Hover {
+ &:hover {
+ color: var(--secondary);
+ }
+}
+
+@mixin Hover_outline_characters {
+ &:hover {
+ text-shadow: 2px 2px var(--secondary);
+ }
+}
+
+@mixin underLineText($color1, $color2) {
+ background-image: linear-gradient(90deg, $color1, $color2);
+ background-size: 0% 3px;
+ background-repeat: no-repeat;
+ background-position: left bottom;
+ transition: background-size 500ms ease-in-out;
+ &:hover {
+ background-size: 100% 3px;
+ }
+}
+.underLineText {
+ background-image: linear-gradient(90deg, var(--primary), var(--secondary));
+ background-size: 0% 3px;
+ background-repeat: no-repeat;
+ background-position: left bottom;
+ transition: background-size 500ms ease-in-out;
+ &:hover {
+ background-size: 100% 3px;
+ }
+}
+
+@media screen and (max-width: 800px) {
+ .test {
+ background-color: red;
+ }
+}
+
+@mixin Typewriter {
+ // border-right: 5px solid var(--secondary);
+ width: 100%;
+ word-spacing: nowrap;
+ text-wrap: nowrap;
+ overflow: hidden;
+ animation: typing 6s;
+}
+
+@keyframes typing {
+ from {
+ width: 0;
+ }
+}
+
+@mixin Glitch {
+ letter-spacing: 5px;
+ animation: shift 8s ease-in-out infinite alternate;
+}
+
+@keyframes shift {
+ 0%,
+ 40%,
+ 44%,
+ 58%,
+ 61%,
+ 65%,
+ 69%,
+ 73%,
+ 100% {
+ transform: skewX(0deg);
+ }
+
+ 41% {
+ transform: skewX(10deg);
+ }
+
+ 42% {
+ transform: skewX(-10deg);
+ }
+
+ 59% {
+ transform: skewX(40deg) skewY(10deg);
+ }
+
+ 60% {
+ transform: skewX(-40deg) skewY(-10deg);
+ }
+
+ 63% {
+ transform: skewX(10deg) skewY(-5deg);
+ }
+
+ 70% {
+ transform: skewX(-50deg) skewY(-20deg);
+ }
+
+ 71% {
+ transform: skewX(10deg) skewY(-10deg);
+ }
+}
+
+@mixin Scrollbar($color) {
+ scroll-behavior: smooth;
+ scroll-padding: 10rem;
+ &::-webkit-scrollbar {
+ width: 8px;
+ }
+
+ /* Handle */
+ &::-webkit-scrollbar-thumb {
+ background-color: $color;
+ border-radius: 3px; /* Adjust border-radius as needed */
+ }
+
+ /* Track */
+ &::-webkit-scrollbar-track {
+ background-color: transparent; /* Set to desired background color */
+ }
+}
+
+@mixin HoverPrimary {
+ transition: 0.4s ease-in-out;
+ &:hover {
+ background: var(--secondary);
+ color: var(--primary);
+ border: 1px solid var(--primary);
+ }
+}
+
+@mixin HoverSecondary {
+ transition: 0.4s ease-in-out;
+ &:hover {
+ background: var(--primary);
+ color: var(--secondary);
+ border: 1px solid var(--secondary);
+ }
+}
diff --git a/src/Styles/App/Varibils.scss b/src/Styles/App/Varibils.scss
new file mode 100644
index 0000000..c04f39a
--- /dev/null
+++ b/src/Styles/App/Varibils.scss
@@ -0,0 +1,32 @@
+:root {
+ --primary: red;
+
+ --secondary: rgb(255, 255, 255);
+ --text: black;
+
+ --DarkPrimary: rgb(168, 22, 22);
+
+ --bg: white;
+ --bg2: #dcdcdc;
+ --white: white;
+ --shadow: rgba(0, 0, 0, 0.15);
+ --gray: rgb(207, 210, 214);
+ --whiteGray: #717171;
+ --DarkGray: #444444;
+
+ --navbar-height: 80px;
+ --border-radius: 0.4vw;
+ --padding-page: 90%;
+ --margin-block: 100px;
+ --primary-low-opacity: rgba(255, 0, 0, 0.686);
+}
+
+:root:has(.dark) {
+ --primary: #7a987c;
+ --secondary: #ffd12e;
+ --text: #ffffff;
+ --bg: #1f1f1f;
+ --bg2: #2c2c2c;
+ --shadow: rgba(255, 255, 255, 0.15);
+ --gray: #a0aec0;
+}
diff --git a/src/Styles/App/className.scss b/src/Styles/App/className.scss
new file mode 100644
index 0000000..ea4e93c
--- /dev/null
+++ b/src/Styles/App/className.scss
@@ -0,0 +1,54 @@
+.custom_button {
+ outline: none;
+ border: none;
+ border-radius: var(--border-radius);
+ padding: 0.8vw 0.4vw;
+ width: fit-content;
+ white-space: nowrap;
+ background: var(--secondary);
+ color: var(--primary);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 15px;
+ padding-inline: 2vw;
+ font-size: 1vw;
+ font-weight: bold;
+}
+.button {
+ outline: none;
+ border: none;
+ border-radius: var(--border-radius);
+ padding: 0.8vw 0.4vw;
+ width: fit-content;
+ white-space: nowrap;
+ background: var(--primary);
+ color: var(--secondary);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 15px;
+ padding-inline: 2vw;
+ font-size: 1vw;
+ font-weight: bold;
+}
+
+@media screen and (max-width: 1000px) {
+ .button {
+ outline: none;
+ border: none;
+ border-radius: 6px;
+ padding: 5px 10px;
+ width: fit-content;
+ white-space: nowrap;
+ background: var(--primary);
+ color: var(--secondary);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 15px;
+ padding-inline: 2vw;
+ font-size: 15px;
+ font-weight: bold;
+ }
+}
diff --git a/src/Styles/App/index.scss b/src/Styles/App/index.scss
new file mode 100644
index 0000000..16f7795
--- /dev/null
+++ b/src/Styles/App/index.scss
@@ -0,0 +1,18 @@
+@import "./Varibils.scss";
+@import "./Mixing.scss";
+@import "./KeyFrames.scss";
+@import "./App.scss";
+@import "./className.scss";
+
+@import "../Core/index.scss";
+
+@import "../Layout/index.scss";
+@import "../Page/index.scss";
+
+@import "../Activities/index.scss";
+
+@import "../components/index.scss";
+
+@import "../components/Card.scss";
+
+@import "../../Components/Utils/SearchBar/SearchBar.scss";
diff --git a/src/Styles/Auth/Auth.scss b/src/Styles/Auth/Auth.scss
new file mode 100644
index 0000000..b5c220e
--- /dev/null
+++ b/src/Styles/Auth/Auth.scss
@@ -0,0 +1,154 @@
+.Auth{
+ .MenuButton{
+ outline: none;
+ border: none;
+ border-radius: var(--border-radius);
+ width: fit-content;
+ white-space: nowrap;
+ background: var(--secondary);
+ color: var(--text);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 15px;
+ padding-inline: 1vw;
+ padding-block: 20px;
+ font-size: 1vw;
+ &:hover{
+ background: var(--DarkPrimary) !important;
+ }
+ }
+}
+ .ant-drawer .ant-drawer-content {
+ display: flex; flex-direction: column;
+ border-radius: 5px 0 0 5px;
+ }
+.auth_first_section{
+ width: 100%;
+ display: flex;justify-content: end;align-items: end;
+ span{
+ text-align: end;
+ cursor: pointer;
+ width: 100%;
+ font-size: 20px;
+ font-weight: 600;
+ opacity: .7;
+ }
+}
+
+.auth_header{
+ width: 86%;
+ @include Flex;
+ margin-inline: auto;
+ .auth_tab{
+ width: 100%;
+ text-align: center;
+ font-size: 24px;
+ color: #717171;
+ }
+ .ant-tabs .ant-tabs-tab{
+ cursor: pointer;
+ width: 100% !important;
+ @include Flex ;
+ font-size: 22px;
+ color: #717171;
+ }
+ .ant-tabs >div>.ant-tabs-nav .ant-tabs-nav-list,.ant-tabs >.ant-tabs-nav .ant-tabs-nav-list{
+ width: 100%;
+ @include Flex;
+ }
+}
+
+.ant-tabs .ant-tabs-ink-bar{
+ background: var(--primary);
+}
+.ant-tabs .ant-tabs-tab.ant-tabs-tab-active .ant-tabs-tab-btn ,.ant-tabs .ant-tabs-tab:hover{
+ color: var(--primary);
+}
+.ant-tabs-nav-operations{
+ display: none !important;
+}
+.LoginForm ,.RegisterForm, .VerifyForm{
+ width: 92%;
+ @include Flex;flex-direction: column;
+ margin-inline: auto;
+ h5{
+ color: var(--text);
+ font-size: 35px;
+ margin-block: 20px;
+ text-transform: capitalize;
+ }
+ .login_form_container{
+ width: 100%;
+ .login_button{
+ padding: 12px 0;
+ background: var(--primary);
+ font-size: 20px;
+ border: none;
+ border-radius: 10px;
+ }
+ .login_input{
+ width: 100%;
+ display: flex;
+ padding: 12px 15px;
+ border-radius: 10px;
+ &:hover{
+ border: 1px solid var(--primary);
+ }
+ }
+ .ant-input-prefix{
+ color: #B4B4B4;
+ font-size: 25px;
+ }
+ }
+}
+
+
+@media screen and (max-width:650px) {
+ .AuthAithDrawer{
+ .ant-tabs .ant-tabs-tab-btn{
+ font-size: 14px !important;
+ }
+ }
+
+ .LoginForm ,.RegisterForm{
+ width: 100%;
+ h5{
+ font-size: 25px;
+ margin-block: 20px;
+ }
+ .login_form_container{
+ width: 100%;
+ .login_button{
+ font-size: 14px;
+ }
+ }
+ }
+
+ .Auth{
+ .MenuButton{
+ outline: none;
+ border: none;
+ border-radius: var(--border-radius);
+ width: fit-content;
+ white-space: nowrap;
+ background: var(--secondary);
+ color: var(--primary);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 15px;
+ padding-inline: 5px;
+ padding-block: 10px;
+ font-size: 11px;
+ &:hover{
+ background: var(--DarkPrimary) !important;
+ }
+
+ }
+
+ }
+
+
+}
+
diff --git a/src/Styles/Core/Media.scss b/src/Styles/Core/Media.scss
new file mode 100644
index 0000000..f92b18d
--- /dev/null
+++ b/src/Styles/Core/Media.scss
@@ -0,0 +1,18 @@
+.Media {
+ > h3 {
+ color: black;
+ font-size: 17px;
+ margin-block: 23px;
+ }
+ .media_box {
+ display: flex;
+ align-items: center;
+ width: 100%;
+ height: 100%;
+ gap: 1vw;
+ }
+ img {
+ width: 30px;
+ height: 30px;
+ }
+}
diff --git a/src/Styles/Core/SearchComponent.scss b/src/Styles/Core/SearchComponent.scss
new file mode 100644
index 0000000..05c36ad
--- /dev/null
+++ b/src/Styles/Core/SearchComponent.scss
@@ -0,0 +1,22 @@
+.SearchComponent {
+ > p {
+ margin: 0;
+ }
+ > input {
+ background-size: 15px 15px;
+ background-repeat: no-repeat;
+ background-position-x: 98%;
+ background-position-y: 50%;
+ border-radius: 5px;
+ border: 1px solid;
+ max-width: 250px;
+ padding-left: 5px;
+ font-size: small;
+ color: #757575;
+ }
+ > input::placeholder {
+ color: #757575;
+ font-size: 9px;
+ padding-left: 3px;
+ }
+}
diff --git a/src/Styles/Core/index.scss b/src/Styles/Core/index.scss
new file mode 100644
index 0000000..84b9970
--- /dev/null
+++ b/src/Styles/Core/index.scss
@@ -0,0 +1,2 @@
+@import "./SearchComponent.scss";
+@import "./Media.scss";
diff --git a/src/Styles/Layout/Footer.scss b/src/Styles/Layout/Footer.scss
new file mode 100644
index 0000000..b8dc251
--- /dev/null
+++ b/src/Styles/Layout/Footer.scss
@@ -0,0 +1,99 @@
+.Footer{
+border-top: 1px solid var(--primary);
+ color: var(--text);
+ display: flex;
+ justify-content: space-between;
+ padding: 4% 4%;
+ .footer_first_section{
+ width: 30%;
+ display: flex;
+ flex-direction: column;
+
+ gap: 20px;
+ >img{
+ width: 70px;
+ }
+ div{
+ display: flex;
+ gap: 10px;
+ >img{
+ width: 50px;
+ }
+ }
+ h6{
+ font-weight: bold;
+ }
+ }
+ .footer_last_section{
+ width: 25%;
+ h6{
+ font-weight: bold;
+ font-size:16px;
+ }
+ svg{
+ color: #7A7A7A;
+ font-size: 30px;
+ }
+ display: flex;
+ flex-direction: column;
+ gap: 20px;
+ div{
+ display: flex;
+ gap: 15px;
+ }
+ }
+
+}
+
+@media screen and (max-width: 1000px) {
+
+ .Footer{
+ color: var(--text);
+ display: flex;
+ justify-content: space-between;
+ padding: 4% 4%;
+ flex-wrap: wrap;
+ gap: 30px;
+ .footer_first_section{
+ width: 100%;
+ display: flex;
+ flex-direction: column;
+
+ gap: 20px;
+ >img{
+ width: 70px;
+ }
+ div{
+ display: flex;
+ gap: 10px;
+ >img{
+ width: 50px;
+ }
+ }
+ h6{
+ font-weight: bold;
+ }
+
+ }
+ .footer_last_section{
+ width: 100%;
+ h6{
+ font-weight: bold;
+ font-size:16px;
+ }
+ svg{
+ color: #7A7A7A;
+ font-size: 30px;
+ }
+ display: flex;
+ flex-direction: column;
+ gap: 20px;
+ div{
+ display: flex;
+ gap: 15px;
+ }
+ }
+
+ }
+
+ }
\ No newline at end of file
diff --git a/src/Styles/Layout/Layout.scss b/src/Styles/Layout/Layout.scss
new file mode 100755
index 0000000..f712592
--- /dev/null
+++ b/src/Styles/Layout/Layout.scss
@@ -0,0 +1,69 @@
+
+
+.Layout_Body:has(.HeroSection) {
+ padding-top: 0px;
+}
+
+.swiper-android .swiper-slide, .swiper-ios .swiper-slide, .swiper-wrapper{
+ margin-bottom: 40px !important;
+}
+.swiper-pagination-bullet {
+ width: 10px;height: 10px;
+}
+.swiper-pagination-bullet-active{
+ background: var(--primary ) !important;
+}
+
+.header_link{
+ margin-top: 20px;
+ display: flex;justify-content: start;align-items: center;
+ color: var(--whiteGray);
+ font-size: 20px;
+ letter-spacing: .7px;
+ cursor: pointer;
+ .page_title_link{
+ color: var(--primary);
+ border-bottom: 2px solid var(--primary);
+ padding-bottom: 3px;
+ margin-left: 10px;
+ }
+}
+
+.ar{
+ .header_link{
+ svg{
+ transform: rotate(180deg) ;
+ }
+ }
+ .ant-pagination{
+ .anticon svg{
+ transform: rotate(180deg) ;
+ }
+ }
+}
+
+@media screen and (max-width:600px) {
+ .header_link{
+ font-size: 12px;
+ }
+}
+
+ a:hover{
+ color: var(--primary);
+}
+
+.Translate{
+ border-color: transparent;
+ font-weight: 500;
+ font-size: 20px;
+ margin-bottom: -10px;
+ background: transparent;
+ &:hover{
+ background: transparent !important;
+ color: var(--text) !important;
+ }
+}
+
+.pointer{
+ cursor: pointer;
+}
diff --git a/src/Styles/Layout/NavBar.scss b/src/Styles/Layout/NavBar.scss
new file mode 100755
index 0000000..a8088bd
--- /dev/null
+++ b/src/Styles/Layout/NavBar.scss
@@ -0,0 +1,133 @@
+.Layout:has(.home_page){
+ .navbar{
+ position: absolute;
+ border: none;
+
+ }
+}
+
+
+.navbar{
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ color: var(--secondary);
+ padding-inline: 5.5vw;
+ height: var(--navbar-height);
+ width: 100%;
+ z-index: 999;
+ border-bottom: .8px solid var(--primary);
+
+
+ >img{
+ width: 4.7vw;
+ }
+ .navbar_links{
+ display: flex;
+ gap: 3vw;
+
+ .navbar_link{
+ color: var(--text);
+ opacity: .5;
+ // font-weight: bold;
+
+ cursor: pointer;
+ &:hover{
+ opacity: 1;
+
+ }
+
+
+ }
+ .active{
+
+ opacity: 1;
+ // border-bottom: .1vw solid var(--primary);
+ color: var(--primary);
+ }
+ }
+ >span{
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ }
+ .menu{
+ display: none;
+ }
+
+ article{
+ display: flex;
+ gap: 5%;
+ align-items: center;
+ >.icon_navbar{
+ padding: 10px;
+ // background: var(--primary);
+ @include Flex;
+ border-radius: 50%;
+ width: 30px;
+ height: 40px;
+ }
+ svg{
+ color: var(--text) !important;
+ font-size: 20px !important;
+ font-weight: 100;
+
+ }
+ }
+}
+
+
+
+@media screen and (max-width: 1000px) {
+ .navbar{
+ >img{
+ width: 50px;
+ }
+ .navbar_links{
+ display: none;
+ }
+ article{
+ // display: none;
+ gap: 10px;
+ }
+ .menu{
+ display: inline;
+ svg{
+ color: var(--text);
+ }
+
+ }
+
+ }
+ .menu_navbar_links{
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+
+ .menu_navbar_link{
+ cursor: pointer;
+ }
+ }
+}
+
+@media screen and (max-width:450px) {
+ .navbar{
+ article{
+ gap: 2px !important;
+ svg{
+ font-size: 10px !important;
+ }
+ .icon_navbar{
+ font-size: 10px !important;
+ }
+ }
+ }
+}
+
+.ant-drawer .ant-drawer-header-title {
+ width: 100%;
+ justify-content: end;align-items: end;
+}
+.ant-drawer .ant-drawer-header{
+ flex-direction: row-reverse;
+}
\ No newline at end of file
diff --git a/src/Styles/Layout/SideBar.scss b/src/Styles/Layout/SideBar.scss
new file mode 100755
index 0000000..e69de29
diff --git a/src/Styles/Layout/index.scss b/src/Styles/Layout/index.scss
new file mode 100644
index 0000000..b65085d
--- /dev/null
+++ b/src/Styles/Layout/index.scss
@@ -0,0 +1,4 @@
+@import "./NavBar.scss";
+@import "./Layout.scss";
+@import "./SideBar.scss";
+@import "./Footer.scss";
diff --git a/src/Styles/Page/About.scss b/src/Styles/Page/About.scss
new file mode 100644
index 0000000..5567aae
--- /dev/null
+++ b/src/Styles/Page/About.scss
@@ -0,0 +1,246 @@
+.About {
+ > img {
+ position: absolute;
+ width: 70%;
+ padding-top: 15%;
+ right: 15%;
+ top: 0;
+ z-index: 1;
+ }
+ .header_link{
+ width: 90%;
+ margin-inline: auto;
+ margin-bottom: 10px;
+ }
+ .About_Laptop {
+ padding-top: 0%;
+ padding-right: 5vw;
+
+ width: 100%;
+ display: flex;
+ align-items: flex-end;
+ justify-content: flex-end;
+ img {
+ width: 35vw;
+ }
+ }
+ .Dm_Group {
+ display: flex;
+ align-items: flex-end;
+ margin-bottom: 10%;
+
+ > div {
+ margin-top: 9%;
+ }
+ h1 {
+ background: var(--bg);
+ font-size: 4vw;
+ font-weight: bold;
+ margin-inline: 20%;
+ height: 90px;
+ }
+ z-index: 99;
+ position: relative;
+ }
+
+ .AboutUS {
+ margin-top: 5%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ position: relative;
+ width: 90%;
+ margin-inline: auto;
+
+ position: relative;
+ z-index: 10;
+ img {
+ width: 100%;
+ border-radius: 1vw;
+ }
+ .AboutUS_Info {
+ position: absolute;
+ display: flex;
+ flex-direction: column;
+ padding: 10%;
+ gap: 20px;
+ h1 {
+ color: var(--primary);
+ font-size: 4vw;
+ }
+ p {
+ color: var(--secondary);
+ font-size: 2vw;
+ }
+ }
+ }
+ .Media {
+ margin-top: 5%;
+ display: flex;
+ justify-content: flex-end;
+ position: relative;
+ width: 90%;
+ margin-inline: auto;
+ position: relative;
+ z-index: 10;
+ img {
+ width: 100%;
+ border-radius: 1vw;
+ height: auto;
+ }
+ .Media_info {
+ position: absolute;
+ display: flex;
+ flex-direction: column;
+ padding: 10%;
+ gap: 2.4vw;
+ color: var(--secondary);
+ h1 {
+ color: var(--primary);
+ font-size: 4vw;
+ }
+ h6 {
+ font-size: 2vw;
+ }
+ > div {
+ display: flex;
+ gap: 20px;
+ }
+ }
+ }
+ .Hands {
+ margin-top: 10%;
+ img {
+ width: 100%;
+ }
+ }
+}
+
+
+.ar{
+ .About_Laptop{
+ justify-content: flex-start;
+ }
+ .Media{
+ justify-content: flex-start !important;
+ .Media_info{
+ gap: 2.4vw !important;
+ }
+ }
+}
+@media screen and (max-width: 1000px) {
+ .About {
+ > img {
+ position: absolute;
+ width: 70%;
+ padding-top: 15%;
+ right: 15%;
+ top: 0;
+ z-index: 1;
+ display: none;
+ }
+ .About_Laptop {
+ padding-top: 10%;
+ padding-right: 5vw;
+
+ width: 100%;
+ display: flex;
+ align-items: flex-end;
+ display: none;
+
+ img {
+ width: 30vw;
+ }
+ }
+ .Dm_Group {
+ display: flex;
+ align-items: flex-end;
+ margin-bottom: 10%;
+ display: none;
+
+ > div {
+ margin-top: 10%;
+ }
+ h1 {
+ background: var(--bg);
+ font-size: 4vw;
+ font-weight: bold;
+ margin-inline: 20%;
+ }
+ z-index: 999;
+ position: relative;
+ }
+
+ .AboutUS {
+ margin-top: 5%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ position: relative;
+ width: 90%;
+ margin-inline: auto;
+
+ position: relative;
+ z-index: 10;
+ img {
+ width: 100%;
+ border-radius: 1vw;
+ }
+ .AboutUS_Info {
+ position: absolute;
+ display: flex;
+ flex-direction: column;
+ padding: 10%;
+ gap: 0px;
+ h1 {
+ color: var(--primary);
+ font-size: 4vw;
+ }
+ p {
+ color: var(--secondary);
+ font-size: 2vw;
+ }
+ }
+ }
+ .Media {
+ margin-top: 5%;
+ display: flex;
+ justify-content: flex-end;
+ position: relative;
+ width: 90%;
+ margin-inline: auto;
+ position: relative;
+ z-index: 10;
+ img {
+ width: 100%;
+ border-radius: 1vw;
+ height: auto;
+ }
+ .Media_info {
+ position: absolute;
+ display: flex;
+ flex-direction: column;
+ padding: 10%;
+ gap: 0;
+ color: var(--secondary);
+ h1 {
+ color: var(--primary);
+ font-size: 4vw;
+ }
+ h6 {
+ font-size: 2vw;
+ }
+ > div {
+ display: flex;
+ gap: 20px;
+ }
+ }
+ }
+ .Hands {
+ margin-top: 10%;
+ img {
+ width: 100%;
+ }
+ }
+ }
+}
diff --git a/src/Styles/Page/Cart.scss b/src/Styles/Page/Cart.scss
new file mode 100644
index 0000000..8e85f06
--- /dev/null
+++ b/src/Styles/Page/Cart.scss
@@ -0,0 +1,116 @@
+.cart_container{
+ .cart_container{
+ margin-top: auto;
+ button{
+ background-color: var(--secondary) !important;
+ color: var(--bg) !important;
+ font-weight: bold !important;
+ }
+ }
+
+ .ant-drawer-body{
+ height: 100% !important;
+ >div{
+ }
+ }
+
+ .Cart_Icon{
+ width: 50px;
+ height: 50px;
+ border-radius: 50%;
+ @include Flex;
+ svg{
+ }
+ }
+ .Badge_Button{
+ margin-inline: 10px;
+ // svg{
+ // height: 30px;
+ // color: var(--white);
+ // font-size: 20px !important;
+ // }
+ }
+
+ }
+
+.cart_first_section{
+ width: 100%;
+ display: flex;justify-content: space-between;
+ span{
+ width: 100%;
+ font-size: 20px;
+ font-weight: 600;
+ &:nth-child(2){
+ text-align: end;
+ cursor: pointer;
+ }
+ }
+
+}
+
+.ant-badge .ant-badge-count{
+ min-width: 15px;
+ height: 15px;
+ font-size: 10px;
+ @include Flex;
+}
+.ViewCart_Button{
+ width: 100%;
+ margin-top: 20px;
+ display: flex;justify-content: space-between;
+ p{
+ text-align: center;
+ font-size: 1\6px;
+ span{
+ font-weight: 500;
+ }
+ }
+ .cart_checkout_button{
+ width: 80% !important;
+ padding: 20px 10px;
+ background: var(--primary);
+ font-size: 18px ;
+ font-weight: 500;
+ text-transform:capitalize ;
+ &:hover{
+ background: var(--DarkPrimary);
+ }
+ }
+}
+
+
+.ar{
+ .cart_first_section{
+ display: flex;justify-content: space-between;
+ span{
+ &:nth-child(2){
+ display: flex; flex-direction: row-reverse;align-items: center;
+ text-align: end;
+ cursor: pointer;
+ svg{
+ margin-right: 10px;
+ }
+ }
+ }
+
+ }
+}
+@media screen and (max-width:650px) {
+ .cart_first_section{
+ span{
+ font-size: 13px;
+ }
+
+ }
+ .ViewCart_Button{
+ p{
+ font-size: 12px;
+ }
+ .cart_checkout_button_container{
+ .cart_checkout_button{
+ font-size: 15px;
+ padding: 20px 10px;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Styles/Page/Categories.scss b/src/Styles/Page/Categories.scss
new file mode 100644
index 0000000..726f50f
--- /dev/null
+++ b/src/Styles/Page/Categories.scss
@@ -0,0 +1,269 @@
+.Categories {
+ display: flex;
+ flex-direction: column;
+ .header_link{
+ width: 90%;
+ margin-inline: auto;
+ }
+ > main {
+ padding-block: 30px;
+ display: flex;
+
+ gap: 3%;
+ width: 90%;
+ margin-inline: auto;
+ }
+ .Categories_left {
+ width: 25%;
+ display: flex;
+ flex-direction: column;
+ background: var(--bg);
+ // gap: 20px;
+ padding: 10px;
+ > header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ // height: 40px;
+ padding-inline: 16px;
+ // margin-inline: auto;
+ h4 {
+ font-size: 1.4vw;
+ font-weight: bold;
+ color: var(--text);
+ }
+ h6 {
+ font-size: 1.1vw;
+ color: var(--primary);
+ cursor: pointer;
+ }
+ }
+ .filter_collapse {
+ .ant-collapse-content>.ant-collapse-content-box{
+ padding: 0px 16px 15px 16px !important;
+ }
+
+ .ant-collapse-header {
+ border-bottom: 1px solid #b4b4b4;
+ }
+ .ant-collapse-item-active{
+ transition: .4s ease-in-out;
+ // background-color: red;
+ .ant-collapse-header {
+ border-bottom: none;
+ }
+ border-bottom: 1px solid #b4b4b4;
+
+ }
+
+ .ant-collapse-item{
+
+ }
+ }
+ }
+ .Categories_Right {
+ display: flex;
+ flex-direction: column;
+ gap: 30px;
+ width: 90%;
+ > header {
+ display: flex;
+ justify-content: space-between;
+ // height: 40px;
+ width: 95%;
+ .filtered_items {
+ display: flex;
+ gap: 10px;
+ flex-wrap: wrap;
+ width: 80%;
+ }
+ .filtered_item {
+ @include Shadow;
+ border: 1px solid #191919;
+ color: #191919;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: 6px 10px;
+ min-width: 140px;
+ border-radius: 5px;
+ gap: 10px;
+ svg {
+ font-size: 20px;
+ border-radius: 20px;
+ }
+ }
+ .FillterSelect{
+ .ant-select-single.ant-select-lg:not(.ant-select-customize-input) .ant-select-selector{
+ border: none;
+ color: black !important;
+
+ }
+ .ant-select-single.ant-select-lg.ant-select-show-arrow .ant-select-selection-item, .ant-select-single.ant-select-lg.ant-select-show-arrow .ant-select-selection-placeholder{
+ color: black !important;
+ }
+ .ant-select-arrow{
+ color: black;
+ }
+ }
+ }
+ > main {
+ display: flex;
+ // justify-content: center;
+ flex-wrap: wrap;
+ gap: 40px;
+ }
+ .Pagination {
+ width: 100%;
+ display: flex;
+ justify-content: flex-end;
+ }
+ }
+
+ .CheckboxFilter {
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+ }
+}
+.show_on_responsive {
+ display: none;
+}
+
+@media screen and (max-width: 1000px) {
+ .show_on_responsive {
+ display: inline;
+ }
+ .Categories {
+ display: flex;
+ flex-direction: column;
+ > main {
+ padding-block: 30px;
+ display: flex;
+
+ gap: 2%;
+ width: 90%;
+ margin-inline: auto;
+ }
+
+ .Categories_left {
+ width: 30%;
+ display: flex;
+ flex-direction: column;
+ background: var(--bg);
+ gap: 20px;
+ display: none;
+
+ > header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ height: 40px;
+ h4 {
+ font-size: 1.7vw;
+ font-weight: bold;
+ color: var(--text);
+ }
+ h6 {
+ font-size: 1.5vw;
+ color: var(--primary);
+ cursor: pointer;
+ }
+ }
+ }
+ .Categories_Right {
+ display: flex;
+ flex-direction: column;
+ gap: 20px;
+ width: 100%;
+ > header {
+ display: flex;
+ justify-content: space-between;
+ height: 40px;
+ align-items: center;
+ .filtered_items {
+ display: flex;
+ gap: 20px;
+ flex-wrap: wrap;
+ width: 70%;
+ }
+ .filtered_item {
+ @include Shadow;
+ border: 1px solid #191919;
+ color: #191919;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: 8px 10px;
+ width: 150px;
+ border-radius: 5px;
+ svg {
+ font-size: 20px;
+ }
+ }
+ }
+ > main {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 40px;
+ justify-content: center;
+ }
+ .Pagination {
+ width: 100%;
+ display: flex;
+ justify-content: flex-end;
+ }
+ }
+
+ .CheckboxFilter {
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+ }
+ }
+ .remove_on_responsive {
+ display: none !important;
+ }
+ .filtered_item {
+ @include Shadow;
+ border: 1px solid #191919;
+ color: #191919;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: 8px 10px;
+ width: 150px;
+ border-radius: 5px;
+ svg {
+ font-size: 20px;
+ }
+ }
+
+ .CheckboxFilter {
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+ }
+ .filter_collapse {
+ .ant-collapse-header {
+ border-bottom: 1px solid #b4b4b4;
+
+ }
+ }
+}
+
+
+.ant-checkbox .ant-checkbox-inner{
+
+ border: 2px solid #A7A7A7;
+
+
+ }
+ .ant-checkbox-checked .ant-checkbox-inner{
+ background-color: red;
+ color: red !important;
+ border: 2px solid red !important;
+
+ }
+
+
\ No newline at end of file
diff --git a/src/Styles/Page/Contact.scss b/src/Styles/Page/Contact.scss
new file mode 100644
index 0000000..27d6b63
--- /dev/null
+++ b/src/Styles/Page/Contact.scss
@@ -0,0 +1,332 @@
+.contact_container{
+ display: flex;flex-direction: column;
+ width: 90vw;
+ margin-inline: auto;
+
+ .contact_image_section{
+ width: 100%;
+ height: 350px;
+ margin-top: 50px;
+ position: relative;
+ background-image: url('../../../public/Contact/ContactImage.png') !important;
+ background-position: center;
+ background-repeat: no-repeat;
+ background-size: cover;
+ border-radius: 10px;
+ display: flex;justify-content: center;align-items: end;
+ .text_sections{
+ width: 27%;
+ height: 160px;
+ @include Flex;
+ padding-top: 50px;
+ flex-direction: column;
+ background: #fff;
+ border-radius:30px 30px 0 0;
+ h1{
+ font-size: 3.8vw;
+ }
+ p{
+ font-size: 1.7vw;
+ color: var(--primary);
+ }
+ }
+ }
+
+ .contact_mid_section{
+ width: 100%;
+ @include Flex;
+ margin-block: 70px;
+ h3{
+ text-align: center;
+ width: 55%;
+ font-size:3.8vw;
+
+ }
+ }
+
+
+}
+
+.contact_last_section{
+ display: flex;justify-content: space-evenly;
+ width: 100%;
+ margin-inline:auto;
+ margin-bottom: 50px;
+ .left{
+ width: 28%;height: 32vw !important;
+ display: flex;justify-content: space-evenly; flex-direction: column;
+ // background: rgba(255, 0, 0, 0.542);
+ @include HardShadow;
+ border-radius: 50px;
+ .social_info{
+ width: 80%;
+ margin-inline: auto;
+ display: flex; flex-direction: column;justify-content: space-between;
+ .Single_info{
+ display: flex;align-items: center;
+ margin-block: 20px;
+ width: 100%;
+ span{
+ width: 4vw;
+ height: 4vw;
+ @include Flex;
+ border-radius: 50%;
+ background: var(--bg2);
+ svg{
+ font-size: 2vw;
+ color: var(--primary);
+ }
+ }
+ p{
+ width: 70%;
+ padding-inline: 15px !important;
+ font-size: 1.3vw;
+ color: var(--text);
+ margin-bottom: 0 !important;
+ }
+ }
+ }
+ .icons{
+ display: flex;justify-content: space-evenly;
+ width: 60%;
+ }
+ }
+
+ .right{
+ width: 35%;
+
+ >div {
+ h1 {
+ font-size: 4.5vw;
+ color: var(--fifthly) !important;
+ }
+
+ p {
+ font-size: 1.4vw;
+ }
+
+ width: 50%;
+ }
+
+ .contact_form {
+ width: 100%;
+ margin-top: 20px;
+ .form-control{
+ padding:10px !important ;
+ }
+ .button_container{
+ display: flex;justify-content: end;align-items: start;
+ .button {
+ padding: 10px;
+ width: 40% !important;
+ background-color: var(--primary) ;
+ color: var(--white);
+ outline: none;
+ border: none;
+ font-size: 16px;
+ border-radius: 10px;
+ font-weight: normal !important;
+ &:hover {
+ background-color: var(--DarkPrimary);
+ }
+ }
+ }
+ input {
+ margin-bottom: 20px;
+ }
+
+ }
+ }
+}
+.form-control{
+ border: 1.5px solid #B4B4B4 !important;
+ padding:20px 20px ;
+ border-radius: 10px;
+}
+
+
+
+
+@media screen and (max-width: 800px) {
+ .Contact {
+ width: 100%;
+ min-height: 500px;
+ margin-block: 50px;
+ display: flex;
+ align-items: center;
+ flex-wrap: wrap;
+ padding: 0 0vw;
+ gap: 50px;
+
+ >div {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+
+ h1 {
+ font-size: 11vw;
+ }
+
+ p {
+ font-size: 4vw;
+ padding-inline: 30px;
+ }
+
+ width: 100%;
+ text-align: center;
+ justify-content: center;
+ }
+
+ .button {
+ margin-left: 0 !important;
+ width: 100% !important;
+ }
+ .ant-row{
+ justify-content: end;
+ }
+ form{
+ width: 80%;
+ text-align: start;
+ }
+ }
+}
+
+
+@media screen and (max-width:900px) {
+ .contact_container{
+
+
+ .contact_image_section{
+ height: 250px;
+ margin-top: 30px;
+ .text_sections{
+ width:35%;
+ height: 140px;
+ padding-top: 10px;
+ h1{
+ font-size: 23px;
+ }
+ p{
+ font-size: 14px;
+ }
+ }
+ }
+
+ .contact_mid_section{
+ margin-block: 50px;
+ h3{
+ width: 80%;
+ font-size: 25px;
+ }
+ }
+
+ .contact_last_section{
+ justify-content: space-between;
+ .left{
+ width: 48%;height: 400px !important;
+ .social_info{
+ width: 80%;
+ .Single_info{
+ span{
+ width: 50px;
+ height: 50px;
+ }
+ p{
+ font-size: 15px;
+ }
+ }
+ }
+ .icons{
+ width: 60%;
+ }
+ }
+
+ .right{
+ width: 48%;
+ >div {
+ h1 {
+ font-size: 4.5vw;
+ }
+ p {
+ font-size: 1.4vw;
+ }
+ width: 50%;
+ }
+
+ .contact_form {
+ width: 100%;
+ .button_container{
+ .button {
+ padding: 15px;
+ width: 50% !important;
+ font-size: 20px;
+ }
+ }
+
+ }
+ }
+ }
+}
+
+
+}
+@media screen and (max-width:580px) {
+ .contact_container{
+ .contact_image_section{
+ .text_sections{
+ width: 50%;
+ }
+ }
+ .contact_last_section{
+ justify-content: center; flex-direction: column;align-items: center;
+ .left{
+ width:90%;
+ margin-block-end: 30px;
+ .social_info{
+ .Single_info{
+ span{
+ width: 50px;
+ height: 50px;
+ svg{
+ font-size: 30px;
+ }
+ }
+ p{
+ font-size: 15px;
+ }
+ }
+ }
+ .icons{
+ width: 80%;
+ }
+ }
+
+ .right{
+ width: 90%;
+ >div {
+ h1 {
+ font-size: 4.5vw;
+ }
+ p {
+ font-size: 1.4vw;
+ }
+ width: 50%;
+ }
+
+ .contact_form {
+ width: 100%;
+ .button_container{
+ .button {
+ padding: 15px;
+ width: 100% !important;
+ font-size: 14px;
+ }
+ }
+
+ }
+ }
+ }
+}
+
+
+}
\ No newline at end of file
diff --git a/src/Styles/Page/Faqs.scss b/src/Styles/Page/Faqs.scss
new file mode 100644
index 0000000..ded6a0a
--- /dev/null
+++ b/src/Styles/Page/Faqs.scss
@@ -0,0 +1,122 @@
+.faqs_container{
+ display: flex;flex-direction: column;
+ width: 90vw;
+ margin-inline: auto;
+
+ .faqs_image_section{
+ width: 100%;
+ margin-top: 50px;
+ position: relative;
+ z-index: 0;
+ img{
+ width: 100%;
+ border-radius: 10px;
+ }
+ h6{
+ position: absolute;
+ top: 43%;
+ left: 50px;
+ color: #021736;
+ font-size: 3vw;
+ }
+ }
+
+ .faqs_body{
+ width: 100%;
+ display: flex;justify-content: space-between;
+ margin-block:40px;
+ .left{
+ width: 20%;
+ h1{
+ font-size: 27px;
+ color: #0C0C0C;
+ margin-bottom: 20px;
+ }
+ p{
+ color: #0C0C0C;
+ font-size: 20px;
+ &:nth-child(2) {
+ color: var(--primary) !important;
+ }
+ }
+ }
+
+ .right{
+ width: 80%;
+ }
+
+ }
+}
+
+
+
+.ant-collapse [class^="ant-collapse"], .ant-collapse [class*=" ant-collapse"]{
+ background: #fff;
+}
+
+.ant-collapse>.ant-collapse-item >.ant-collapse-header .ant-collapse-header-text{
+ font-size: 1.8vw;
+ font-weight: 500;
+}
+
+.ant-collapse>.ant-collapse-item >.ant-collapse-header .ant-collapse-arrow svg{
+ font-size: 1.7vw;
+}
+
+.ant-collapse .ant-collapse-content{
+ p{
+ font-size: 1.4vw;
+ color: var(--primary);
+ margin-bottom: 0;
+ }
+}
+
+@media screen and (max-width:800px) {
+ .faqs_container{
+ .faqs_image_section{
+ margin-top: 30px;
+ h6{
+ width: 50%;
+ left: 20px;
+ font-size: 3.5vw;
+ }
+ }
+
+ .faqs_body{
+ @include Flex; flex-direction: column;
+ width: 100%;
+ .left{
+ text-align: center;
+ width: 90%;
+ h1{
+ font-size: 22px;
+ margin-bottom: 12px;
+ }
+ p{
+ font-size: 18px;
+ }
+ }
+ .right{
+ width: 95%;
+ }
+
+ }
+ }
+
+
+
+ .ant-collapse>.ant-collapse-item >.ant-collapse-header .ant-collapse-header-text{
+ font-size: 20px;
+ }
+
+ .ant-collapse>.ant-collapse-item >.ant-collapse-header .ant-collapse-arrow svg{
+ font-size: 15px;
+ }
+
+ .ant-collapse .ant-collapse-content{
+ p{
+ font-size: 16px;
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/src/Styles/Page/Help.scss b/src/Styles/Page/Help.scss
new file mode 100644
index 0000000..fbd4a5e
--- /dev/null
+++ b/src/Styles/Page/Help.scss
@@ -0,0 +1,91 @@
+.help {
+ position: fixed;
+ z-index: 100;
+ width: 370px;
+ height: 80vh;
+ min-height: 300px;
+ background-color: var(--bg);
+ top: 50%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+ border-radius: 7px;
+ border: 2px solid var(--secondary);
+ > header {
+ background: var(--primary);
+ border-top-left-radius: 7px;
+ border-top-right-radius: 7px;
+ height: 80px;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ color: var(--secondary);
+ font-size: 25px;
+ font-weight: bold;
+ }
+ .messages {
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+ overflow-y: auto;
+ max-height: 400px;
+ &::-webkit-scrollbar {
+ display: none;
+ }
+ }
+
+ main {
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+ padding: 20px 20px;
+ max-height: 400px;
+
+ .incoming {
+ background-color: #e6e5eb;
+ color: var(--text);
+ padding: 15px;
+ width: 90%;
+ border-top-left-radius: 10px;
+ border-top-right-radius: 10px;
+ border-bottom-right-radius: 10px;
+ font-size: 13px;
+ }
+ .outgoing {
+ direction: rtl;
+ align-self: flex-end;
+ background-color: #e6e5eb;
+ color: var(--text);
+ padding: 15px;
+ width: 90%;
+ border-top-left-radius: 10px;
+ border-top-right-radius: 10px;
+ border-bottom-left-radius: 10px;
+ font-size: 13px;
+ }
+ .socket_input {
+ background: #e6e5eb95;
+ outline: none;
+ border: none;
+ border-radius: 4px;
+ padding: 6px 10px;
+ width: 100%;
+
+ color: var(--text);
+ &::placeholder {
+ color: #9f9f9f;
+ }
+ }
+ }
+}
+
+.black_bg {
+ position: fixed;
+ top: 0;
+ left: 0;
+ background-color: black;
+ opacity: 0.4;
+ filter: blur(5px) brightness(0.8) contrast(120%);
+ z-index: 99;
+ width: 100%;
+ height: 100vh;
+}
diff --git a/src/Styles/Page/Home.scss b/src/Styles/Page/Home.scss
new file mode 100644
index 0000000..48b9f14
--- /dev/null
+++ b/src/Styles/Page/Home.scss
@@ -0,0 +1,594 @@
+.home_page {
+ .HeroSection {
+ display: flex;
+ padding: 10% 6%;
+ position: relative;
+ width: 100%;
+ z-index: 99;
+ min-height: 100vh;
+
+ &::after {
+ position: absolute;
+ content: "";
+ right: 0;
+ top: 0;
+ background: url("../../../public/Home/HeroShape.svg");
+ background-size: cover;
+ background-repeat: no-repeat;
+ width: 40%;
+ height: 100%;
+ z-index: -1;
+ }
+
+ > div {
+ display: flex;
+ flex-direction: column;
+ width: 45%;
+ gap: 20px;
+
+ h1 {
+ font-size: 4vw;
+ font-weight: bold;
+ }
+
+ > div {
+ display: flex;
+ gap: 30px;
+
+ h3 {
+ font-weight: bold;
+ }
+
+ button {
+ padding-inline: 10%;
+ border-radius: 2vw;
+ }
+ }
+ }
+
+ > span {
+ img {
+ width: 25vw;
+ }
+ }
+ }
+
+ .CategoriesSlider {
+ width: var(--padding-page);
+ margin-inline: auto;
+ margin-block: var(--margin-block);
+
+ [role="button"] {
+ color: var(--text) !important;
+ }
+
+ .CategoriesSlider_image {
+ padding: 10px 30px;
+
+ border: 1px solid #d9d9d9;
+ border-radius: 10px;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+
+ img {
+ width: 150px;
+ height: 150px;
+ }
+ }
+ }
+
+ .ProductsOnSale {
+ position: relative;
+ margin-inline: auto;
+ border-radius: var(--border-radius);
+ width: var(--padding-page);
+ background: var(--primary-low-opacity);
+ color: var(--secondary);
+ margin-block: var(--margin-block);
+ padding: 4% 10% 6% 10%;
+ min-height: 350px;
+ display: flex;
+
+ &::after {
+ position: absolute;
+ content: "";
+ left: 0;
+ top: 0;
+ background: url("../../../public/Home/slider-shape.png");
+ background-size: cover;
+ background-repeat: no-repeat;
+ width: 40%;
+ height: 100%;
+ z-index: 1;
+ }
+
+ > span {
+ z-index: 999999;
+ display: flex;
+ flex-direction: column;
+ text-align: center;
+ width: 30%;
+ gap: 50px;
+
+ > button {
+ all: unset;
+ }
+ }
+
+ .OnSaleSlider {
+ display: flex;
+ gap: 30px;
+ width: 100%;
+ overflow-x: scroll;
+
+ &::-webkit-scrollbar {
+ display: none;
+ }
+ }
+
+ .pagination {
+ position: absolute;
+ bottom: 3%;
+ right: 3%;
+ display: flex;
+
+ gap: 10px;
+
+ > div {
+ background-color: var(--secondary);
+ border-radius: 50%;
+ width: 30px;
+ height: 30px;
+ color: var(--primary);
+ display: flex;
+ justify-content: center;
+ align-items: center;
+
+ svg {
+ font-size: 25px;
+ }
+ }
+ }
+ }
+
+ .Products {
+ display: flex;
+ flex-direction: column;
+ margin-inline: auto;
+ width: var(--padding-page);
+ margin-block: var(--margin-block);
+ gap: 30px;
+
+ > header {
+ display: flex;
+ justify-content: space-between;
+ }
+
+ .ProductCards {
+ margin-inline: auto;
+ max-width: 90vw;
+ display: flex;
+ gap: 20px;
+ overflow-x: scroll;
+
+ &::-webkit-scrollbar {
+ display: none;
+ }
+ }
+ }
+
+ .PremiumDesign {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ gap: 10px;
+
+ > h1 {
+ font-size: 5vw;
+ }
+
+ > p {
+ width: 40%;
+ text-align: center;
+ }
+
+ img {
+ width: 100%;
+ }
+ }
+
+ .NoiseCancellation {
+ img {
+ width: 100%;
+ }
+ }
+
+ .BoseHeadphones {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ width: 100%;
+ position: relative;
+ margin-block: var(--margin-block);
+
+ > div {
+ position: absolute;
+ color: var(--secondary);
+ width: 70%;
+ left: 50%;
+ top: 50%;
+ transform: translate(-50%, -50%);
+ text-align: center;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ gap: 0px;
+
+ h1 {
+ font-size: 7vw;
+ font-weight: bold;
+ }
+
+ h6 {
+ font-size: 1.3vw;
+ }
+
+ button {
+ font-size: 2vw;
+ padding: 20px 2.4vw;
+ margin-top: 50px;
+ border-radius: 1vw;
+ }
+
+ svg {
+ font-size: 3vw;
+ }
+ }
+
+ > img {
+ width: 100%;
+ }
+ }
+
+ .BatteryLife,
+ .PerfectSound {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ justify-content: center;
+
+ > div {
+ width: 40%;
+
+ h1 {
+ font-size: 5vw;
+ font-weight: bold;
+ }
+
+ p {
+ font-size: 1vw;
+ }
+ }
+
+ > img {
+ }
+ }
+
+ .PerfectSound {
+ flex-direction: row-reverse;
+
+ > div {
+ padding-right: 5%;
+
+ h1 {
+ font-size: 4vw;
+ }
+ }
+ }
+}
+
+@media screen and (max-width: 1000px) {
+ .home_page {
+ .HeroSection {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ gap: 30px;
+ padding: max(10%,100px ) 6%;
+ position: relative;
+ width: 100%;
+ z-index: 99;
+ min-height: 100vh;
+
+ &::after {
+ position: absolute;
+ content: "";
+ right: 0;
+ top: 0;
+ background: url("../../../public/Home/HeroShape.svg");
+ background-size: cover;
+ background-repeat: no-repeat;
+ width: 40%;
+ height: 100%;
+ z-index: -1;
+ }
+
+ > div {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ width: 45%;
+ gap: 20px;
+
+ h1 {
+ font-size: 9vw;
+ font-weight: bold;
+ text-align: center;
+ }
+
+ > div {
+ display: flex;
+ flex-direction: column;
+ gap: 30px;
+ display: none;
+
+ h3 {
+ font-weight: bold;
+ }
+
+ button {
+ font-size: 30px;
+ padding-inline: 10%;
+ border-radius: 2vw;
+ }
+ }
+ }
+
+ > span {
+ img {
+ width: 50vw;
+ }
+ }
+ }
+
+ .CategoriesSlider {
+ width: var(--padding-page);
+ margin-inline: auto;
+ margin-block: var(--margin-block);
+
+ [role="button"] {
+ color: var(--text) !important;
+ }
+
+ .CategoriesSlider_image {
+ padding: 4% 10%;
+ border: 1px solid #d9d9d9;
+ border-radius: 10px;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+
+ img {
+ width: 100px;
+ height: 100px;
+
+ }
+ }
+ }
+
+ .ProductsOnSale {
+ display: none;
+ }
+
+ .Products {
+ display: flex;
+ flex-direction: column;
+ margin-inline: auto;
+ width: var(--padding-page);
+ margin-block: var(--margin-block);
+ gap: 30px;
+
+ > header {
+ display: flex;
+ justify-content: space-between;
+ }
+
+ .ProductCards {
+ display: flex;
+ gap: 20px;
+
+ overflow-x: scroll;
+
+ &::-webkit-scrollbar {
+ display: none;
+ }
+ }
+ }
+
+ .PremiumDesign {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ gap: 10px;
+
+ > h1 {
+ font-size: 5.5vw;
+ }
+
+ > p {
+ width: 70%;
+ text-align: center;
+ font-size: 2.5vw;
+ }
+
+ img {
+ width: 100%;
+ }
+ }
+
+ .NoiseCancellation {
+ img {
+ width: 100%;
+ }
+ }
+
+ .BoseHeadphones {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ width: 100%;
+ position: relative;
+ margin-block: var(--margin-block);
+
+ > div {
+ position: absolute;
+ color: var(--secondary);
+ width: 70%;
+ left: 50%;
+ top: 50%;
+ transform: translate(-50%, -50%);
+ text-align: center;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ gap: 0px;
+
+ h1 {
+ font-size: 7vw;
+ font-weight: bold;
+ }
+
+ h6 {
+ font-size: 3vw;
+ }
+
+ button {
+ font-size: 2vw;
+ padding: 10px 2.4vw;
+ margin-top: 50px;
+ border-radius: 1vw;
+ }
+
+ svg {
+ font-size: 3vw;
+ }
+ }
+
+ > img {
+ width: 100%;
+ }
+ }
+
+ .BatteryLife,
+ .PerfectSound {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ justify-content: center;
+ max-width: 100vw;
+ flex-wrap: wrap;
+ text-align: center;
+
+ > div {
+ width: 80%;
+
+ h1 {
+ font-size: 5vw;
+ font-weight: bold;
+ }
+
+ p {
+ font-size: 2.5vw;
+ }
+ }
+
+ > img {
+ max-width: 60vw;
+ }
+ }
+
+ .PerfectSound {
+ flex-direction: row-reverse;
+
+ > div {
+ padding-right: 5%;
+ p{
+ font-size: 2.5vw;
+ }
+ h1 {
+ font-size: 4.8vw;
+ }
+ }
+ }
+ }
+}
+
+
+.ar{
+
+ .home_page{
+ .HeroSection {
+ display: flex;
+ padding: 10% 6%;
+ position: relative;
+ width: 100%;
+ z-index: 99;
+ min-height: 100vh;
+
+ &::after {
+ position: absolute;
+ content: "";
+ right: auto;
+ scale: -1;
+ left: 0;
+ top: 0;
+ background: url("../../../public/Home/HeroShape.svg");
+ background-size: cover;
+ background-repeat: no-repeat;
+ width: 40%;
+ height: 100%;
+ z-index: -1;
+ }
+
+ > div {
+ display: flex;
+ flex-direction: column;
+ width: 45%;
+ gap: 20px;
+
+ h1 {
+ font-size: 4vw;
+ font-weight: bold;
+ }
+
+ > div {
+ display: flex;
+ gap: 30px;
+
+ h3 {
+ font-weight: bold;
+ }
+
+ button {
+ padding-inline: 10%;
+ border-radius: 2vw;
+ }
+ }
+ }
+
+ > span {
+ img {
+ width: 25vw;
+ }
+ }
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/src/Styles/Page/Order.scss b/src/Styles/Page/Order.scss
new file mode 100644
index 0000000..98f345b
--- /dev/null
+++ b/src/Styles/Page/Order.scss
@@ -0,0 +1,83 @@
+.OrderTab_container{
+
+ .ant-tabs >.ant-tabs-nav .ant-tabs-nav-list,.ant-tabs >div>.ant-tabs-nav .ant-tabs-nav-list{
+ background: transparent;
+ border-radius:0px;
+ }
+ .order_tab_title{
+ font-size: 24px;
+ margin-bottom: 0;
+ font-weight: normal;
+ transition: ease-in-out .2s;
+ span{
+ transition: ease-out .2s;
+ font-size: 18px;
+ padding: 3.5px 6px 3.5px 6px;
+ border-radius: 50%
+ }
+ &:hover{
+ color: var(--primary);
+ span{
+ color: var(--white);
+ background: var(--primary);
+ }
+ }
+ }
+}
+
+
+.ant-table-wrapper .ant-table-tbody >tr >th, .ant-table-wrapper .ant-table-tbody >tr >td,.ant-table-wrapper .ant-table-thead >tr>th, .ant-table-wrapper .ant-table-thead >tr>td{
+ background: #F6F6F6;
+}
+
+.EmptyOrder{
+ @include Flex; flex-direction: column;
+ width: 100%;
+ height: 50vh;
+ img{
+ width: 35%;
+ }
+ p{
+ text-align: center;
+ font-size: 22px;
+ }
+}
+
+
+@media screen and (max-width:800px) {
+ .order_tab_title{
+ font-size: 18px !important;
+ span{
+ font-size: 14px !important;
+ }
+ }
+
+
+ .EmptyOrder{
+ img{
+ width: 65% !important;
+ }
+ p{
+ font-size: 18px !important;
+ }
+ }
+}
+
+@media screen and (max-width:450px) {
+ .order_tab_title{
+ font-size: 14px !important;
+ span{
+ font-size: 10px !important;
+ }
+ }
+
+
+ .EmptyOrder{
+ img{
+ width: 65% !important;
+ }
+ p{
+ font-size: 14px !important;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Styles/Page/Product.scss b/src/Styles/Page/Product.scss
new file mode 100644
index 0000000..97cbb4e
--- /dev/null
+++ b/src/Styles/Page/Product.scss
@@ -0,0 +1,183 @@
+.loading_state {
+ min-height: 500px;
+@include Flex
+}
+
+.Product {
+ display: flex;
+ flex-direction: column;
+ min-height: 100vh;
+ .header_link{
+ width: 90%;
+ margin-inline: auto;
+ }
+ > main {
+ padding-inline: 10%;
+ margin-top: 30px;
+ display: flex;
+ width: 100%;
+ gap: 10%;
+ }
+ .Product_left {
+ display: flex;
+ width: 45%;
+ > span {
+ display: flex;
+ flex-direction: column;
+ gap: 20px;
+ > img {
+ width: 50%;
+ margin-inline: auto;
+ }
+ .gallery_product {
+ display: flex;
+ gap: 20px;
+ overflow-x: scroll;
+ // max-width: 40vw;
+ &::-webkit-scrollbar {
+ display: none;
+ }
+ span {
+ padding: 10px 15px;
+ border: 2px solid rgba(128, 128, 128, 0.1);
+ width: 100%;
+ > img {
+ width: 100%;
+ cursor: pointer;
+ }
+ }
+ }
+ }
+ }
+
+ .Product_Right {
+ display: flex;
+ flex-direction: column;
+ gap: 20px;
+ align-items: flex-start;
+ padding-top: 2%;
+ h1 {
+ font-size: 4vw;
+ }
+ > div {
+ display: flex;
+ flex-direction: column;
+ gap: 20px;
+ > span {
+ display: flex;
+ align-items: flex-start;
+ gap: 20px;
+ width: 80%;
+ h6 {
+ color: gray;
+ position: relative;
+ min-width: 80px;
+ }
+ }
+ }
+ }
+}
+
+.Products {
+ display: flex;
+ flex-direction: column;
+ margin-inline: auto;
+ width: var(--padding-page);
+ margin-block: var(--margin-block);
+ gap: 0px;
+
+ > header {
+ display: flex;
+ justify-content: space-between;
+ }
+
+ .ProductCards {
+ max-width: 90vw;
+ margin-inline: auto;
+ display: flex;
+ // gap: 40px;
+ // overflow-x: scroll;
+
+ // &::-webkit-scrollbar {
+ // display: none;
+ // }
+ }
+}
+
+
+@media screen and (max-width:700px) {
+ .Product {
+ display: flex;
+ min-height: 100vh;
+ .header_link{
+ width: 90%;
+ margin-inline: auto;
+ }
+ > main {
+ padding-inline: 10%;
+ margin-top: 30px;
+ display: flex;flex-direction: column;
+ width: 100%;
+ gap: 10%;
+ }
+ .Product_left {
+ display: flex;
+ width: 90%;
+ margin-inline: auto;
+ > span {
+ display: flex;
+ flex-direction: column;
+ gap: 20px;
+ > img {
+ width: 60%;
+ margin-inline: auto;
+ }
+ .gallery_product {
+ display: flex;
+ gap: 20px;
+ // overflow-x: scroll;
+ // &::-webkit-scrollbar {
+ // display: none;
+ // }
+ span {
+ padding: 10px 10px;
+ border: 2px solid rgba(128, 128, 128, 0.1);
+ width: 100%;
+ > img {
+ width: 100%;
+ cursor: pointer;
+ }
+ }
+ }
+ }
+ }
+
+ .Product_Right {
+ width: 90%;
+ margin-inline: auto;
+ display: flex;
+ flex-direction: column;
+ gap: 20px;
+ padding-top: 2%;
+ h1 {
+ font-size: 4vw;
+ }
+ > div {
+ display: flex;
+ flex-direction: column;
+ gap: 20px;
+ > span {
+ display: flex;
+ align-items: flex-start;
+ gap: 20px;
+ width: 100%;
+ h6 {
+ color: gray;
+ position: relative;
+ min-width: 80px;
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Styles/Page/index.scss b/src/Styles/Page/index.scss
new file mode 100644
index 0000000..34b2e1e
--- /dev/null
+++ b/src/Styles/Page/index.scss
@@ -0,0 +1,14 @@
+@import './Home.scss';
+@import './Help.scss';
+@import './About.scss';
+@import './Cart.scss';
+@import '../Auth/Auth.scss';
+@import './Contact.scss';
+@import './Faqs.scss';
+
+@import './Categories.scss';
+@import './setting.scss';
+
+@import './Categories.scss';
+@import './Product.scss';
+@import './Order.scss';
\ No newline at end of file
diff --git a/src/Styles/Page/setting.scss b/src/Styles/Page/setting.scss
new file mode 100644
index 0000000..65584e1
--- /dev/null
+++ b/src/Styles/Page/setting.scss
@@ -0,0 +1,558 @@
+.setting_container {
+ width: 90%;
+ min-height: 100vh;
+// padding-top: 4%;
+ margin-inline: auto;
+ .setting_header{
+ margin-top: 20px;
+ display: flex;justify-content: start;align-items: center;
+ color: var(--whiteGray);
+ font-size: 20px;
+ letter-spacing: .7px;
+ cursor: pointer;
+ span{
+ color: var(--primary);
+ border-bottom: 2px solid var(--primary);
+ padding-bottom: 3px;
+ margin-left: 10px;
+ }
+ }
+
+ .setting_body{
+ width: 100%;
+ display: flex;
+ margin-block: 30px;
+ .setting_body_tabs{
+ width: 100%;
+ .ant-tabs .ant-tabs-tab{
+ justify-content: start;align-items: start;
+ font-size: 24px;
+ width: 100% !important;
+ color: #717171;
+
+ }
+
+ .contact_tab{
+ justify-content: space-around !important;
+ margin-bottom: 50px;
+ .left{
+ width: 36%;height: 500px !important;
+ .social_info{
+ .Single_info{
+ span{
+ svg{
+ font-size: 2vw;
+ }
+ }
+ p{
+ width: 70%;
+ font-size: 1.3vw;
+ }
+ }
+ }
+ }
+
+ .right{
+ width: 48%;
+ >div {
+ h1 {
+ font-size: 4.5vw;
+ color: var(--fifthly) !important;
+ }
+
+ p {
+ font-size: 1.4vw;
+ }
+
+ width: 50%;
+ }
+ }
+ }
+
+ .PersonalDataTabs{
+ width: 100%;
+ .personl_data_form{
+ width: 100%;
+ display: flex;flex-direction: column;
+ >div{
+ display: flex;
+ flex-wrap: wrap !important;
+ }
+ .personl_data_form_button{
+ width: 20% !important;
+ padding: 12px 0 !important;
+ background: var(--primary);
+ color: var(--white);
+ font-size: 20px;
+ border: none;
+ &:hover{
+ background: var(--DarkPrimary);
+ }
+ }
+ }
+ }
+
+ .ChangePasswordTab{
+ .feild_container{
+ width: 50%;
+ margin: 0;
+ .personl_data_feild{
+ width:100%;
+ }
+ }
+ .personl_data_form_button{
+ width: 20% !important;
+ padding: 12px 0 !important;
+ background: var(--primary);
+ color: var(--white);
+ font-size: 20px;
+ border: none;
+ &:hover{
+ background: var(--DarkPrimary);
+ }
+ }
+ }
+
+ .WishlistTab_container{
+ display: flex; flex-direction: column;
+ width: 100% ;
+ .ProductCards{
+ display: flex;
+ flex-wrap: wrap;
+ gap: 30px;
+
+
+ }
+ }
+ }
+ }
+ .ant-tabs >.ant-tabs-nav .ant-tabs-nav-list,.ant-tabs >div>.ant-tabs-nav .ant-tabs-nav-list{
+ background: #F6F6F6;
+ border-radius: 5px;
+ }
+
+}
+
+.ant-tabs-nav{
+ margin-inline: 10px !important;
+}
+
+
+.ant-tabs-left >.ant-tabs-nav .ant-tabs-tab, .ant-tabs-right >.ant-tabs-nav .ant-tabs-tab, .ant-tabs-left >div>.ant-tabs-nav .ant-tabs-tab, .ant-tabs-right >div>.ant-tabs-nav .ant-tabs-tab{
+ text-align: start;
+ padding: 8px 40px !important;
+}
+
+// utils
+.feild_container{
+ width: 38%;
+ margin-right: 20px;
+ .personl_data_feild{
+ background: #f0f0f0;
+ border: none !important;
+ width: 100%;
+ display: flex;
+ padding: 17px 15px;
+ &:hover ,&:focus{
+ border: 1px solid var(--primary) !important;
+ }
+ }
+}
+.ant-input-prefix{
+ color: #B4B4B4;
+ font-size: 25px;
+ padding-right: 10px;
+}
+
+.SettingTabHeader{
+ p{
+ color: var(--whiteGray);
+ font-size: 18px;
+ margin-bottom: 30px;
+ }
+}
+
+
+// settings drawer
+.setting_drawer_first_section{
+ width: 100%;
+ display: flex;justify-content: end;align-items: center;
+ margin-bottom: 10px;
+ p{
+ width: 100%;
+ margin-bottom: 0;
+ font-size: 17px;
+ }
+ span{
+ text-align: end;
+ cursor: pointer;
+ width: 100%;
+ font-size: 20px;
+ font-weight: 600;
+ opacity: .7;
+ svg{
+ margin-inline: 5px;
+ }
+ }
+ }
+ .ant-drawer .ant-drawer-body{
+ padding: 15px;
+ padding-bottom: 0px !important;
+ }
+ .setting_drawer_body{
+ .setting_drawer_tab{
+ width: 100%;
+ display: flex;
+ margin-inline: auto;
+ margin-bottom: 20px;
+ svg{
+ font-size: 24px;
+ margin-inline: 14px;
+ }
+ div{
+ line-height: 1px !important;
+ }
+ h4{
+ margin-bottom: 7px ;
+ font-weight: normal;
+ font-size: 13px;
+ text-transform: capitalize;
+ }
+ h4:nth-child(1){
+ color: var(--primary);
+ font-size: 17px;
+ }
+ }
+ .without_primary{
+ opacity: .8;
+ display: flex;align-items: center;
+ h4{
+ color: var(--text) !important;
+ }
+ svg{
+ font-size: 24px;
+ }
+ }
+}
+
+.ar{
+ .setting_drawer_first_section{
+ span{
+ display: flex;flex-direction: row-reverse;align-items: center;
+ }
+ }
+ .personl_data_form{
+ span{
+ // display: flex;align-items: end;justify-content: end;
+ // text-align: end;
+ }
+ }
+}
+
+@media screen and (max-width:1100px) {
+ .setting_container {
+ width: 94%;
+
+ .setting_body{
+ width: 100%;
+ display: flex;
+ margin-block: 30px;
+ .setting_body_tabs{
+ .ant-tabs .ant-tabs-tab{
+ font-size: 20px !important;
+ }
+
+ .contact_tab{
+ .left{
+ width: 42%;height: 400px !important;
+ .social_info{
+ .Single_info{
+ span{
+ svg{
+ font-size: 2.5vw;
+ }
+ }
+ p{
+ font-size: 1.6vw;
+ }
+ }
+ }
+ }
+
+ .right{
+ width: 48%;
+ }
+ }
+
+ .ChangePasswordTab{
+ .feild_container{
+ width: 60%;
+ }
+ }
+
+ .WishlistTab_container{
+ .ProductCards{
+ .ProductCard{
+ width: 29%;
+ min-width: 180px;
+ }
+ }
+ }
+ }
+ }
+
+ }
+
+
+ // utils
+ .feild_container{
+ width: 46%;
+ }
+
+ .ant-input-prefix{
+ font-size: 20px;
+ }
+
+ .SettingTabHeader{
+ p{
+ margin-bottom: 20px;
+ }
+ }
+ .form-control{
+ padding:16px 20px !important ;
+ }
+
+
+}
+
+
+
+@media screen and (max-width:800px) {
+ .setting_container {
+ width: 94% !important;
+
+ .setting_header{
+ font-size: 16px;
+ }
+ .setting_body{
+ width: 100%;
+ display: flex;
+ margin-block: 30px;
+
+ .setting_body_tabs{
+ width: 100%;
+ .ant-tabs .ant-tabs-tab{
+ justify-content: start;align-items: start;
+ font-size: 24px;
+ width: 100% !important;
+ color: #717171;
+ }
+
+ .contact_tab{
+ justify-content: space-between !important;
+ margin-bottom: 20px;
+ .left{
+ width: 48%;height: 370px !important;
+ .social_info{
+ .Single_info{
+ span{
+ svg{
+ font-size: 14px;
+ }
+ }
+ p{
+ width: 70%;
+ font-size: 16px;
+ }
+ }
+ }
+ }
+ .right{
+ width: 48%;
+ .form-control{
+ padding:12px 16px !important ;
+ }
+ }
+ .button_container{
+ .button {
+ padding: 15px;
+ width: 50% !important;
+ font-size: 14px !important;
+ border-radius: 14px;
+ }
+ }
+ }
+
+ .PersonalDataTabs{
+ width: 100%;
+ .personl_data_form{
+ width: 100%;
+ display: flex;flex-direction: column;
+ margin-inline: auto;
+ >div{
+ display: flex;
+ flex-wrap: wrap !important;
+ }
+ .personl_data_form_button{
+ width: 40% !important;
+ padding: 12px 0 !important;
+ background: var(--primary);
+ color: var(--white);
+ font-size: 12px;
+ border: none;
+ &:hover{
+ background: var(--DarkPrimary);
+ }
+ }
+ }
+ }
+
+ .ChangePasswordTab{
+ .feild_container{
+ width: 80%;
+ .personl_data_feild{
+ width:100%;
+ }
+ }
+ .personl_data_form_button{
+ width: 30% !important;
+ padding: 12px 0 !important;
+ background: var(--primary);
+ color: var(--white);
+ font-size: 12px;
+ border: none;
+ &:hover{
+ background: var(--DarkPrimary);
+ }
+ }
+ }
+
+ .WishlistTab_container{
+ .ProductCards{
+ .ProductCard{
+ width: 30%;
+ min-width: 220px;
+ }
+ }
+ }
+ }
+ }
+ .ant-tabs >.ant-tabs-nav .ant-tabs-nav-list,.ant-tabs >div>.ant-tabs-nav .ant-tabs-nav-list{
+ background: #F6F6F6;
+ border-radius: 5px;
+ }
+
+ }
+
+
+
+
+ .ant-tabs-left >.ant-tabs-nav .ant-tabs-tab, .ant-tabs-right >.ant-tabs-nav .ant-tabs-tab, .ant-tabs-left >div>.ant-tabs-nav .ant-tabs-tab, .ant-tabs-right >div>.ant-tabs-nav .ant-tabs-tab{
+ text-align: start;
+ padding: 8px 40px !important;
+ }
+
+ // utils
+ .feild_container{
+ width: 46%;
+ margin-right: 6px;
+ .personl_data_feild{
+ font-size: 13px;
+ }
+ }
+ .ant-input-prefix{
+ font-size: 20px;
+ padding-right: 5px;
+ }
+
+ .SettingTabHeader{
+ p{
+ color: var(--whiteGray);
+ font-size: 14px;
+ margin-bottom: 20px;
+ }
+ }
+
+ .ant-table-wrapper .ant-table-cell, .ant-table-wrapper .ant-table-thead>tr>th, .ant-table-wrapper .ant-table-tbody>tr>th, .ant-table-wrapper .ant-table-tbody>tr>td, .ant-table-wrapper tfoot>tr>th, .ant-table-wrapper tfoot>tr>td {
+ font-size: 12px;
+ }
+}
+
+
+@media screen and (max-width:600px) {
+ .setting_container{
+ .contact_tab{
+ display: flex; flex-direction: column;justify-content: center;align-items: center;
+ .left{
+ width: 80% !important;
+ margin-inline: auto ;
+ margin-bottom: 30px;
+ .social_info{
+ .Single_info{
+ span{
+ svg{
+ // font-size: 30px !important;
+ }
+ }
+ p{
+ width: 70%;
+ font-size: 16px;
+ }
+ }
+ }
+ }
+ .right{
+ width: 80% !important;
+ .form-control{
+ padding:12px 16px !important ;
+ }
+ }
+ .button_container{
+ .button {
+ padding: 15px;
+ width: 50% !important;
+ font-size: 14px !important;
+ border-radius: 14px;
+ }
+ }
+ }
+ }
+
+}
+
+
+@media screen and (max-width:480px) {
+ .ant-table-wrapper .ant-table-cell, .ant-table-wrapper .ant-table-thead>tr>th, .ant-table-wrapper .ant-table-tbody>tr>th, .ant-table-wrapper .ant-table-tbody>tr>td, .ant-table-wrapper tfoot>tr>th, .ant-table-wrapper tfoot>tr>td {
+ font-size: 14px;
+ }
+ .ant-table-cell{
+ .ant-tag{
+ margin-inline: 0;
+ font-size: 7px;
+ }
+ }
+
+ .WishlistTab_container{
+ .ProductCards{
+ justify-content: center !important;
+ .ProductCard{
+ min-width: 280px !important;
+ }
+ }
+ }
+
+}
+
+.ant-tabs-nav-list{
+padding-block: 10px;
+}
+// .setting_container .ant-tabs > .ant-tabs-nav .ant-tabs-nav-list, .setting_container .ant-tabs > div > .ant-tabs-nav .ant-tabs-nav-list{
+ // }
+.ant-tabs-nav-list{
+ // transform: translate(-.674px, 0px) !important;
+}
+.ar{
+ .ant-tabs >.ant-tabs-nav .ant-tabs-nav-wrap, .ant-tabs >div>.ant-tabs-nav .ant-tabs-nav-wrap{
+ direction: ltr ;
+ }
+}
\ No newline at end of file
diff --git a/src/Styles/components/Card.scss b/src/Styles/components/Card.scss
new file mode 100644
index 0000000..e98fd98
--- /dev/null
+++ b/src/Styles/components/Card.scss
@@ -0,0 +1,140 @@
+.CardItem {
+ width: 100%;
+ display: flex !important;
+ justify-content: space-between;
+ align-items: center;
+ border-radius: 7px;
+ .ant-card-body {
+ @include Flex;
+ padding: 10px 5px;
+ width: 100%;
+ box-shadow: 10px 10px 20px 15px rgba(0, 0, 0, 0.1);
+ border-radius: 7px;
+ }
+ .Card_Img {
+ width: 40%;
+ img {
+ transform: translateX(-6px);
+ width: 40%;
+ }
+ }
+ .Card_Info {
+ width: 50%;
+ h5 {
+ font-size: 14px;
+ text-wrap: nowrap;
+ }
+ h6 {
+ display: flex;
+ align-items: center;
+ font-size: 10px;
+ color: var(--whiteGray);
+ svg {
+ margin-right: 5px;
+ color: var(--primary);
+ font-size: 15px;
+ }
+ }
+ .card_price {
+ width: 100%;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ p {
+ font-size: 14px;
+ color: var(--whiteGray);
+ margin-bottom: 0 !important;
+ }
+ .count_section {
+ width: 40%;
+ display: flex;
+ justify-content: end;
+ align-items: center;
+ .trashIcon {
+ color: #c91433;
+ }
+ .card_counter {
+ display: flex;
+ justify-content: space-around;
+ width: 80%;
+ svg {
+ color: var(--whiteGray);
+ }
+ }
+ }
+ }
+ }
+ .Card_Delete {
+ margin-left: 30px;
+ @include Flex;
+ }
+}
+
+@media screen and (max-width: 650px) {
+ .CardItem {
+ .ant-card-body {
+ @include Flex;
+ padding: 10px 0px;
+ width: 100%;
+ box-shadow: 10px 10px 20px 15px rgba(0, 0, 0, 0.1);
+ border-radius: 7px;
+ }
+ .Card_Img {
+ width: 30%;
+ img {
+ width: 100%;
+ // transform: translateX(-6px);
+ }
+ }
+ .Card_Info {
+ width: 70%;
+ h5 {
+ font-size: 14px;
+ text-wrap: nowrap;
+ }
+ h6 {
+ display: flex;
+ align-items: center;
+ font-size: 10px;
+ color: var(--whiteGray);
+ svg {
+ margin-right: 5px;
+ color: var(--primary);
+ font-size: 15px;
+ }
+ }
+ .card_price {
+ width: 100%;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ p {
+ font-size: 14px;
+ color: var(--whiteGray);
+ margin-bottom: 0 !important;
+ }
+ .count_section {
+ width: 40%;
+ display: flex;
+ justify-content: end;
+ align-items: center;
+ .trashIcon {
+ color: #c91433;
+ }
+ .card_counter {
+ display: flex;
+ justify-content: space-around;
+ width: 80%;
+ svg {
+ color: var(--whiteGray);
+ }
+ }
+ }
+ }
+ }
+ .Card_Delete {
+ margin-left: 30px;
+ @include Flex;
+ }
+ }
+}
diff --git a/src/Styles/components/OnSaleCard.scss b/src/Styles/components/OnSaleCard.scss
new file mode 100644
index 0000000..da18697
--- /dev/null
+++ b/src/Styles/components/OnSaleCard.scss
@@ -0,0 +1,47 @@
+.OnSaleCard {
+ background: var(--bg);
+ color: var(--text);
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+ padding: 10px 10px 0px 10px;
+ min-width: 200px;
+ border-radius: var(--border-radius);
+ position: relative;
+ height: fit-content;
+
+ h4 {
+ font-size: 16px;
+ margin-bottom: 0;
+ }
+
+ img {
+ width: 130px;
+ margin-inline: auto;
+ margin-bottom: 10px;
+ }
+
+ div {
+ display: flex;
+ justify-content: space-between;
+
+ p {
+ margin-bottom: 0;
+
+ &:nth-child(1) {
+ text-decoration: line-through;
+ }
+ }
+ }
+
+ > span {
+ position: absolute;
+ background-color: #fddbc9;
+ color: #f45e0c;
+ left: 0;
+ border-top-right-radius: 10px;
+ border-bottom-right-radius: 10px;
+ font-size: 13px;
+ padding: 4px;
+ }
+}
diff --git a/src/Styles/components/ProductCard.scss b/src/Styles/components/ProductCard.scss
new file mode 100644
index 0000000..7bd4f20
--- /dev/null
+++ b/src/Styles/components/ProductCard.scss
@@ -0,0 +1,113 @@
+.ProductCard {
+ background: var(--bg);
+ color: var(--text);
+ display: flex;
+ flex-direction: column;
+ gap: 5px;
+ padding: 10px;
+ min-width: 220px;
+ max-width: 220px;
+ border-radius: var(--border-radius);
+ position: relative;
+ height: fit-content;
+ @include Shadow;
+
+ h4 {
+ font-size: 16px;
+ margin-bottom: 0px;
+
+ border-top: 1px solid;
+ padding-top: 20px;
+ border-image: linear-gradient(
+ 90deg,
+ rgba(68, 68, 68, 0.1) 0%,
+ rgba(16, 16, 16, 0.5) 50%,
+ rgba(68, 68, 68, 0.1) 100%
+ )
+ 1;
+ }
+ > p {
+ margin-bottom: 0;
+ text-decoration: line-through;
+ font-size: 12px;
+ transform: translateY(10px);
+ color: #717171;
+ }
+
+ img {
+ width: 150px;
+ height: 130px;
+ margin-inline: auto;
+ margin-bottom: 20px;
+ cursor: pointer;
+ margin-top: 30px;
+ }
+
+ div {
+ display: flex;
+ justify-content: space-between;
+
+ p {
+ margin-bottom: 0;
+ font-size: 20px;
+ &:nth-child(2) {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 15px;
+ gap: 2px;
+ svg {
+ color: #eb8a17;
+ }
+ color: #eb8a17;
+ }
+ }
+ }
+
+ > span {
+ position: absolute;
+ background-color: #fddbc9;
+ color: #f45e0c;
+ left: 0;
+ border-top-right-radius: 10px;
+ border-bottom-right-radius: 10px;
+ font-size: 13px;
+ padding: 4px;
+ }
+ > article {
+ transition: 0.4s ease-in-out;
+ opacity: 0;
+ background-color: var(--bg);
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding-inline: 4%;
+ position: absolute;
+ bottom: 0;
+ width: 96%;
+ border-bottom-left-radius: var(--border-radius);
+ border-bottom-right-radius: var(--border-radius);
+ padding: 10px;
+
+ button {
+ background: transparent;
+ color: var(--primary);
+ border: 1px solid var(--primary);
+ font-size: 14px;
+ padding:6px 6px;
+ }
+ svg {
+ color: var(--primary);
+ cursor: pointer;
+ }
+ .not_favorite {
+ color: gray;
+ }
+ }
+ &:hover {
+ > article {
+ transition: 0.4s ease-in-out;
+ opacity: 1;
+ }
+ }
+}
diff --git a/src/Styles/components/ProductSwiper.scss b/src/Styles/components/ProductSwiper.scss
new file mode 100644
index 0000000..2306e72
--- /dev/null
+++ b/src/Styles/components/ProductSwiper.scss
@@ -0,0 +1,22 @@
+.productSwiper{
+ display: flex;
+ justify-content: center;align-items: center;
+ width: 96%;
+ margin-inline: auto;
+ padding-top: 25px;
+ .arrow_svg_right,.arrow_svg_left{
+ color: var(--primary);
+ font-size: 50px;
+ }
+
+}
+.ar{
+ .productSwiper{
+ flex-direction: row-reverse !important;
+ }
+}
+
+.swiper-slide{
+min-width: 220px;
+margin-inline: auto;
+}
\ No newline at end of file
diff --git a/src/Styles/components/antd.scss b/src/Styles/components/antd.scss
new file mode 100644
index 0000000..b1c7d61
--- /dev/null
+++ b/src/Styles/components/antd.scss
@@ -0,0 +1,17 @@
+// .ant-pagination .ant-pagination-item-active {
+// background: var(--secondary);
+// border-color: var(--secondary);
+// }
+
+// .ant-pagination .ant-pagination-item {
+// border-color: var(--secondary);
+// }
+// .pagination ul a {
+// border-color: transparent !important;
+// }
+
+.ant-drawer-right>.ant-drawer-content-wrapper{
+ box-shadow: none !important;
+}.ant-collapse>.ant-collapse-item:last-child,.ant-collapse>.ant-collapse-item:last-child>.ant-collapse-header{
+ border-radius: 0;
+}
\ No newline at end of file
diff --git a/src/Styles/components/index.scss b/src/Styles/components/index.scss
new file mode 100644
index 0000000..689cbfd
--- /dev/null
+++ b/src/Styles/components/index.scss
@@ -0,0 +1,4 @@
+@import "./OnSaleCard.scss";
+@import "./antd.scss";
+@import "./ProductCard.scss";
+@import "./ProductSwiper.scss";
diff --git a/src/api/Categories.ts b/src/api/Categories.ts
new file mode 100644
index 0000000..6aed446
--- /dev/null
+++ b/src/api/Categories.ts
@@ -0,0 +1,9 @@
+import useGetQuery from "./helper/useGetQuery";
+
+const API = {
+ GET: `category`,
+};
+const KEY = "categories";
+
+export const useGetCategories = (params?: any) =>
+ useGetQuery(KEY, API.GET, params);
diff --git a/src/api/Favorite.ts b/src/api/Favorite.ts
new file mode 100644
index 0000000..e937bf0
--- /dev/null
+++ b/src/api/Favorite.ts
@@ -0,0 +1,15 @@
+import useAddMutation from "./helper/useAddMutation";
+import useDeleteMutation from "./helper/useDeleteMutation";
+import useGetQuery from "./helper/useGetQuery";
+
+const API = {
+ GET: `favorite/me`,
+ ADD: `favorite`,
+ DELETE: `favorite`,
+};
+const KEY = "favorite/me";
+
+export const useGetFavorite = (params?: any) =>
+ useGetQuery(KEY, API.GET, params);
+export const useAddFavorite = () => useAddMutation(KEY, API.ADD);
+export const useDeleteFavorite = () => useDeleteMutation(KEY, API.ADD);
diff --git a/src/api/Product.ts b/src/api/Product.ts
new file mode 100644
index 0000000..9ea9d62
--- /dev/null
+++ b/src/api/Product.ts
@@ -0,0 +1,9 @@
+import useGetQuery from "./helper/useGetQuery";
+
+const API = {
+ GET: `product`,
+};
+const KEY = "product";
+
+export const useGetProduct = (params?: any) =>
+ useGetQuery(KEY, API.GET, params);
diff --git a/src/api/auth.ts b/src/api/auth.ts
new file mode 100644
index 0000000..452b39e
--- /dev/null
+++ b/src/api/auth.ts
@@ -0,0 +1,24 @@
+import useAddMutation from "./helper/useAddMutation";
+import useGetQuery from "./helper/useGetQuery";
+
+const API = {
+ REGISTER: `auth/register`,
+ LOGIN: `auth/login`,
+ GUEST: `guest`,
+ VERIFY: `auth/verify`,
+ PASSWORD:'auth/change_password',
+ UPDATE_PASSWORD: `user/changeAdminPassword`,
+
+
+};
+const KEY = "auth";
+
+export const useRegister = () => useAddMutation(KEY, API.REGISTER);
+export const useLogin = () => useAddMutation(KEY, API.LOGIN);
+export const useGuest = (params?: any) => useAddMutation(KEY, API.GUEST);
+
+export const useVerify = () => useAddMutation(KEY, API.VERIFY);
+
+export const useChangePassword = () => useAddMutation(KEY, API.UPDATE_PASSWORD);
+
+
diff --git a/src/api/baseProduct.ts b/src/api/baseProduct.ts
new file mode 100644
index 0000000..302d5f5
--- /dev/null
+++ b/src/api/baseProduct.ts
@@ -0,0 +1,16 @@
+import useGetQuery from "./helper/useGetQuery";
+
+const API = {
+ GET: `product?oneByBaseProduct=true`,
+ SHOW: `baseProduct`,
+
+};
+const KEY = "mainProduct";
+const SHOW = "baseProduct";
+
+export const useGetBaseProduct = (params?: any) =>
+ useGetQuery(KEY, API.GET, params);
+
+
+export const useGetSingleBaseProduct = (params?: any) =>
+ useGetQuery(SHOW, API.SHOW, params);
diff --git a/src/api/baseSubCategory.ts b/src/api/baseSubCategory.ts
new file mode 100644
index 0000000..1a13116
--- /dev/null
+++ b/src/api/baseSubCategory.ts
@@ -0,0 +1,9 @@
+import useGetQuery from "./helper/useGetQuery";
+
+const API = {
+ GET: `baseSubCategory`,
+};
+const KEY = "baseSubCategory";
+
+export const useGetBaseSubCategory = (params?: any) =>
+ useGetQuery(KEY, API.GET, params);
diff --git a/src/api/helper/AxiosBuilder.ts b/src/api/helper/AxiosBuilder.ts
new file mode 100644
index 0000000..d8cd905
--- /dev/null
+++ b/src/api/helper/AxiosBuilder.ts
@@ -0,0 +1,43 @@
+import axios, { AxiosInstance, AxiosRequestConfig, ResponseType } from "axios";
+
+class AxiosBuilder {
+ private baseURL: string = "";
+ private headers: Record = {};
+ private timeout: number = 60000; // Request failed with 60 second
+ private withCreds: boolean = false;
+ private responseType: ResponseType = "json";
+ // Custom Another Props with Your Position
+
+ withBaseURL(baseURL: string): AxiosBuilder {
+ this.baseURL = baseURL;
+ return this;
+ }
+
+ withHeaders(headers: Record): AxiosBuilder {
+ this.headers = headers;
+ return this;
+ }
+
+ withTimeout(timeout: number): AxiosBuilder {
+ this.timeout = timeout;
+ return this;
+ }
+
+ withResponseType(responseType: ResponseType): AxiosBuilder {
+ this.responseType = responseType;
+ return this;
+ }
+
+ build(): AxiosInstance {
+ const config: AxiosRequestConfig = {
+ baseURL: this.baseURL,
+ headers: this.headers,
+ timeout: this.timeout,
+ responseType: this.responseType,
+ };
+
+ return axios.create(config);
+ }
+}
+
+export default AxiosBuilder;
diff --git a/src/api/helper/useAddMutation.ts b/src/api/helper/useAddMutation.ts
new file mode 100644
index 0000000..f9b9362
--- /dev/null
+++ b/src/api/helper/useAddMutation.ts
@@ -0,0 +1,27 @@
+import { useMutation, UseMutationResult } from "react-query";
+import useAxios from "./useAxios";
+import { HEADER_KEY } from "../utils/config";
+import { AxiosResponse } from "axios";
+
+function useAddMutation(
+ key: string,
+ url: string,
+ message?: string,
+): UseMutationResult {
+ const axios = useAxios();
+ return useMutation(
+ async (dataToSend) => {
+ // const filterDataToSend = filterData(dataToSend);
+
+ const { data } = await axios.post(url, dataToSend, {
+ headers: {
+ "Content-Type": "multipart/form-data",
+ [HEADER_KEY]: key,
+ },
+ });
+ return data;
+ },
+ );
+}
+
+export default useAddMutation;
diff --git a/src/api/helper/useAxios.ts b/src/api/helper/useAxios.ts
new file mode 100644
index 0000000..bee810f
--- /dev/null
+++ b/src/api/helper/useAxios.ts
@@ -0,0 +1,70 @@
+import { BaseURL, HEADER_KEY } from "../utils/config";
+import AxiosBuilder from "./AxiosBuilder";
+import { useTranslation } from "react-i18next";
+import { toast } from "react-toastify";
+import { useQueryClient } from "react-query";
+import { useNavigate } from "react-router-dom";
+import useAuthState from "../../state/AuthState";
+import { AxiosQueryEnum, AxiosStatusEnum } from "../utils/Axios";
+
+function useAxios() {
+ const { isAuthenticated, token, Guest } = useAuthState();
+ const [t] = useTranslation();
+
+ const queryClient = useQueryClient();
+
+ const buildAxios = new AxiosBuilder()
+ .withBaseURL(BaseURL)
+ .withResponseType("json")
+ .withTimeout(120000);
+
+ if (isAuthenticated) {
+ buildAxios.withHeaders({
+ Authorization: "Bearer " + token,
+ });
+ } else {
+ buildAxios.withHeaders({
+ Authorization: "Bearer " + Guest,
+ });
+ }
+
+ const build_Axios = buildAxios.build();
+
+ build_Axios.interceptors.response.use(
+ function (response: any) {
+ const responseMsg = response?.data?.message;
+ const method = response.config.method;
+
+ const key = response.config.headers[HEADER_KEY];
+ const ResponseMessage =
+ responseMsg || t("validation.the_possess_done_successful");
+ if (method !== AxiosQueryEnum?.GET) {
+ queryClient.invalidateQueries(key);
+ // toast.success(ResponseMessage);
+ }
+ return response;
+ },
+ function (error) {
+ const status = error?.request?.status;
+ const errorMsg = error?.response?.data?.message;
+ const errorField = error?.response?.data;
+ const method = error.config.method;
+
+ if (status === AxiosStatusEnum.AUTHENTICATED) {
+ // logout();
+ // navigate("/auth");
+ }
+
+ if (method !== AxiosQueryEnum?.GET) {
+ const errorMessage = errorMsg || t("validation.some_thing_went_wrong");
+ toast.error(errorMessage);
+ return Promise.reject(error);
+ }
+ },
+ );
+ return build_Axios;
+
+ // return buildAxios.build();
+}
+
+export default useAxios;
diff --git a/src/api/helper/useDeleteMutation.ts b/src/api/helper/useDeleteMutation.ts
new file mode 100644
index 0000000..f3e6c84
--- /dev/null
+++ b/src/api/helper/useDeleteMutation.ts
@@ -0,0 +1,31 @@
+import { useMutation, UseMutationResult } from "react-query";
+import useAxios from "./useAxios";
+import { HEADER_KEY } from "../utils/config";
+import { AxiosResponse } from "axios";
+
+type DataToSend = {
+ id: number | string;
+};
+
+function useDeleteMutation(
+ key: any,
+ url: string,
+ message?: string,
+): UseMutationResult {
+ const axios = useAxios();
+ return useMutation(
+ async (dataToSend) => {
+ const { data } = await axios.delete(url, {
+ headers: {
+ [HEADER_KEY]: key,
+ },
+ data: {
+ id: dataToSend?.id,
+ },
+ });
+ return data;
+ },
+ );
+}
+
+export default useDeleteMutation;
diff --git a/src/api/helper/useGetQuery.ts b/src/api/helper/useGetQuery.ts
new file mode 100644
index 0000000..34af910
--- /dev/null
+++ b/src/api/helper/useGetQuery.ts
@@ -0,0 +1,40 @@
+import { useQuery } from "react-query";
+import useAxios from "./useAxios";
+import { useLocation } from "react-router-dom";
+import React from "react";
+import { filterParams } from "../utils/filterParams";
+import { PaginationParams } from "../utils/PaginationParams";
+
+function useGetQuery(
+ KEY: string | string[],
+ url: string,
+ params: any = {},
+ options: any = {},
+) {
+ const axios = useAxios();
+
+ const { show, pagination, querys, ...remainingParams } = params;
+
+ const location = useLocation();
+
+ const { page, per_page } = PaginationParams(location);
+
+ const param_to_send = pagination
+ ? { ...remainingParams, page: page, per_page: per_page }
+ : { ...remainingParams };
+
+ const filteredParams = param_to_send;
+
+ return useQuery(
+ [KEY, filteredParams, show],
+ async () => {
+ const response = await axios.get(url + (show ? `/${show}` : ""), {
+ params: filteredParams,
+ });
+ return response?.data ?? [];
+ },
+ options,
+ );
+}
+
+export default useGetQuery;
diff --git a/src/api/helper/useUpdateMutation.ts b/src/api/helper/useUpdateMutation.ts
new file mode 100644
index 0000000..d272171
--- /dev/null
+++ b/src/api/helper/useUpdateMutation.ts
@@ -0,0 +1,36 @@
+import { useMutation, UseMutationResult } from "react-query";
+import useAxios from "./useAxios";
+import { HEADER_KEY } from "../utils/config";
+import { AxiosResponse } from "axios";
+
+const useUpdateMutation = (
+ key: string,
+ url: string,
+ message?: string,
+): UseMutationResult => {
+ const axios = useAxios();
+
+ return useMutation(async (dataToSend) => {
+ let request = null;
+ let id = null;
+
+ if (dataToSend instanceof FormData) {
+ dataToSend.append("_method", "PUT");
+ request = dataToSend;
+ id = dataToSend.get("id");
+ } else {
+ request = { ...dataToSend, _method: "PUT" };
+ id = dataToSend?.id;
+ }
+
+ const { data } = await axios.post(url + `/` + id, request, {
+ headers: {
+ "Content-Type": "multipart/form-data",
+ [HEADER_KEY]: key,
+ },
+ });
+ return data;
+ });
+};
+
+export default useUpdateMutation;
diff --git a/src/api/order.ts b/src/api/order.ts
new file mode 100644
index 0000000..b4a9b1e
--- /dev/null
+++ b/src/api/order.ts
@@ -0,0 +1,13 @@
+import useAddMutation from "./helper/useAddMutation";
+import useDeleteMutation from "./helper/useDeleteMutation";
+import useGetQuery from "./helper/useGetQuery";
+
+const API = {
+ GET: `order`,
+ ADD: `order`,
+};
+const KEY = "order";
+
+export const useGetOrder = (params?: any) => useGetQuery(KEY, API.GET, params);
+export const useAddOrder = () => useAddMutation(KEY, API.ADD);
+export const useDeleteOrder = () => useDeleteMutation(KEY, API.ADD);
diff --git a/src/api/setting.ts b/src/api/setting.ts
new file mode 100644
index 0000000..55b4859
--- /dev/null
+++ b/src/api/setting.ts
@@ -0,0 +1,10 @@
+import useGetQuery from "./helper/useGetQuery";
+
+const API = {
+ GET: `setting`,
+};
+
+const KEY = "settings";
+
+export const useUpdateSetting = (params?: any) =>
+ useGetQuery(KEY, API.GET, params);
diff --git a/src/api/supportMessages.ts b/src/api/supportMessages.ts
new file mode 100644
index 0000000..59fb359
--- /dev/null
+++ b/src/api/supportMessages.ts
@@ -0,0 +1,10 @@
+import useAddMutation from "./helper/useAddMutation";
+import useDeleteMutation from "./helper/useDeleteMutation";
+import useGetQuery from "./helper/useGetQuery";
+
+const API = {
+ ADD: `supportMessages`,
+};
+const KEY = "supportMessages";
+
+export const useAddSupportMessage = () => useAddMutation(KEY, API.ADD);
diff --git a/src/api/utils/Axios.ts b/src/api/utils/Axios.ts
new file mode 100644
index 0000000..2f966fd
--- /dev/null
+++ b/src/api/utils/Axios.ts
@@ -0,0 +1,10 @@
+export enum AxiosQueryEnum {
+ GET = "get",
+ POST = "post",
+ DELETE = "delete",
+}
+
+export enum AxiosStatusEnum {
+ VALIDATION = 422,
+ AUTHENTICATED = 401,
+}
diff --git a/src/api/utils/LocalStorage.ts b/src/api/utils/LocalStorage.ts
new file mode 100644
index 0000000..a55f36c
--- /dev/null
+++ b/src/api/utils/LocalStorage.ts
@@ -0,0 +1,12 @@
+import { PROJECT_NAME } from "./config";
+
+export enum LocalStorageEnum {
+ LANGUAGE = PROJECT_NAME + "_LANGUAGE",
+ TOKEN_KEY = PROJECT_NAME + "_TOKEN_KEY",
+ CART_KEY = PROJECT_NAME + "_CART_KEY",
+ FCM_TOKEN_KEY = PROJECT_NAME + "_FCM_TOKEN_KEY",
+
+
+ USER_KEY = PROJECT_NAME + "_USER_KEY",
+ GUEST_KEY = PROJECT_NAME + "_GUEST_KEY",
+}
diff --git a/src/api/utils/PaginationParams.ts b/src/api/utils/PaginationParams.ts
new file mode 100644
index 0000000..6b1f83a
--- /dev/null
+++ b/src/api/utils/PaginationParams.ts
@@ -0,0 +1,7 @@
+export function PaginationParams(location: any) {
+ const searchParams = new URLSearchParams(location?.search);
+ return {
+ page: searchParams.get("page") || "",
+ per_page: searchParams.get("per_page") || "",
+ };
+}
diff --git a/src/api/utils/QueryStatusEnum.ts b/src/api/utils/QueryStatusEnum.ts
new file mode 100644
index 0000000..87f7f00
--- /dev/null
+++ b/src/api/utils/QueryStatusEnum.ts
@@ -0,0 +1,6 @@
+export enum QueryStatusEnum {
+ LOADING = "loading",
+ ERROR = "error",
+ SUCCESS = "success",
+ IDLE = "idle",
+}
diff --git a/src/api/utils/config.ts b/src/api/utils/config.ts
new file mode 100644
index 0000000..8d1d8f8
--- /dev/null
+++ b/src/api/utils/config.ts
@@ -0,0 +1,10 @@
+export const BaseURL = `https://back-demo.dmmobiles.com/api/`;
+// export const BaseURL = `http://192.168.1.112:8000/api/`;
+
+export const ImageBaseURL = `https://back-demo.dmmobiles.com`;
+
+export const PROJECT_NAME = "Dm";
+
+
+
+export const HEADER_KEY = "X-Custom-Query-Key";
diff --git a/src/api/utils/filterParams.ts b/src/api/utils/filterParams.ts
new file mode 100644
index 0000000..fd49731
--- /dev/null
+++ b/src/api/utils/filterParams.ts
@@ -0,0 +1,5 @@
+export function filterParams(params: any) {
+ return Object.fromEntries(
+ Object.entries(params ?? {}).filter(([_, value]) => value),
+ );
+}
diff --git a/src/api/utils/useSearchQuery.ts b/src/api/utils/useSearchQuery.ts
new file mode 100644
index 0000000..2f2f298
--- /dev/null
+++ b/src/api/utils/useSearchQuery.ts
@@ -0,0 +1,16 @@
+import { useState, useEffect } from "react";
+import { useLocation } from "react-router-dom";
+
+function useSearchQuery(paramName: string): [string, (value: string) => void] {
+ const location = useLocation();
+ const [queryValue, setQueryValue] = useState("");
+
+ useEffect(() => {
+ const searchParams = new URLSearchParams(location.search);
+ setQueryValue(searchParams.get(paramName) || "");
+ }, [location, paramName]);
+
+ return [queryValue, setQueryValue];
+}
+
+export default useSearchQuery;
diff --git a/src/data/CartData.ts b/src/data/CartData.ts
new file mode 100644
index 0000000..5f22be2
--- /dev/null
+++ b/src/data/CartData.ts
@@ -0,0 +1,18 @@
+import { TProduct } from "../types/Cart";
+
+export const Product = {
+ id: 1,
+ name: "Classic Rolex Watch",
+ img: "../Cart/CartProduct.png",
+ off: 15,
+ rate: 4.5,
+ price: 200,
+ old_price: 250,
+ brand: "karim",
+ description:
+ "Wireless Bluetooth HeadsetFM Frequency Response: 87.5 108 MHz Feature: FM Radio, Card Supported (Micro SD / TF)Made in China",
+ type: "Neck Sweater",
+ count: 1,
+};
+
+export const Cartdata: TProduct[] = [Product, Product, Product];
diff --git a/src/data/FaqsInfo.ts b/src/data/FaqsInfo.ts
new file mode 100644
index 0000000..02b3d37
--- /dev/null
+++ b/src/data/FaqsInfo.ts
@@ -0,0 +1,8 @@
+import { CollapseProps } from "antd";
+
+export const FaqsInfo: { text: string }[] = [
+ { text: "General" },
+ { text: "Trusts & Safety" },
+ { text: "Services" },
+ { text: "Billing" },
+];
diff --git a/src/data/MediaData.ts b/src/data/MediaData.ts
new file mode 100644
index 0000000..40df2f4
--- /dev/null
+++ b/src/data/MediaData.ts
@@ -0,0 +1,18 @@
+export const mediaData: { icons: string; link: string }[] = [
+ {
+ icons: "/Activities/mediaIcons/Group.png",
+ link: "https://www.linkedin.com/in/abhishek-kumar-69b6b9160/",
+ },
+ {
+ icons: "/Activities/mediaIcons/insta.png",
+ link: "https://www.linkedin.com/in/abhishek-kumar-69b6b9160/",
+ },
+ {
+ icons: "/Activities/mediaIcons/whats.png",
+ link: "https://www.linkedin.com/in/abhishek-kumar-69b6b9160/",
+ },
+ {
+ icons: "/Activities/mediaIcons/teleg.png",
+ link: "https://www.linkedin.com/in/abhishek-kumar-69b6b9160/",
+ },
+];
diff --git a/src/data/OrderData.ts b/src/data/OrderData.ts
new file mode 100644
index 0000000..d4165df
--- /dev/null
+++ b/src/data/OrderData.ts
@@ -0,0 +1,35 @@
+export const OrderData = [
+ {
+ id:'1',
+ order_code:"1321",
+ order_total:"150",
+ sent_to:"Jimmy Smith",
+ order_status:"delivered",
+ placed_on:"2024/10/10"
+ },
+ {
+ id:'2',
+ order_code:"1421",
+ order_total:"150",
+ sent_to:"Jimmy Smith",
+ order_status:"delivered",
+ placed_on:"2024/10/10"
+ },
+ {
+ id:'3',
+ order_code:"1521",
+ order_total:"150",
+ sent_to:"Jimmy Smith",
+ order_status:"delivered",
+ placed_on:"2024/10/10"
+ },
+ {
+ id:'4',
+ order_code:"1621",
+ order_total:"150",
+ sent_to:"Jimmy Smith",
+ order_status:"delivered",
+ placed_on:"2024/10/10"
+ },
+]
+
diff --git a/src/enums/AppKey.ts b/src/enums/AppKey.ts
new file mode 100644
index 0000000..67f90cf
--- /dev/null
+++ b/src/enums/AppKey.ts
@@ -0,0 +1,6 @@
+export enum AppKeyEnum {
+ PROJECT_NAME = "PROJECT_NAME",
+ TOKEN_KEY = "PROJECT_NAME" + "_TOKEN",
+ FCM_TOKEN_KEY = "NOKBEH_FCM_TOKEN"
+
+}
diff --git a/src/enums/QueryStatus.ts b/src/enums/QueryStatus.ts
new file mode 100644
index 0000000..e8ad3c9
--- /dev/null
+++ b/src/enums/QueryStatus.ts
@@ -0,0 +1,6 @@
+export enum QueryStatusEnum {
+ IDLE = "idle",
+ LOADING = "loading",
+ ERROR = "error",
+ SUCCESS = "success",
+}
diff --git a/src/enums/Socket.ts b/src/enums/Socket.ts
new file mode 100644
index 0000000..bd92788
--- /dev/null
+++ b/src/enums/Socket.ts
@@ -0,0 +1,5 @@
+export enum SOCKET {
+ EVENT_SEND_MESSAGE = "chat_message",
+ INCOMING = "incoming",
+ OUTGOING = "outgoing",
+}
diff --git a/src/enums/Status.ts b/src/enums/Status.ts
new file mode 100644
index 0000000..9b49118
--- /dev/null
+++ b/src/enums/Status.ts
@@ -0,0 +1,6 @@
+export enum Status {
+ All = "All",
+ Active = "Active",
+ Completed = "Completed",
+ Cancelled = "Cancelled",
+}
diff --git a/src/enums/Translate.ts b/src/enums/Translate.ts
new file mode 100644
index 0000000..e9c5790
--- /dev/null
+++ b/src/enums/Translate.ts
@@ -0,0 +1,5 @@
+export enum TranslateEnum {
+ ENGLISH = 'en',
+ ARABIC = 'ar',
+ CHINESE = 'ch'
+}
\ No newline at end of file
diff --git a/src/index.tsx b/src/index.tsx
new file mode 100755
index 0000000..667ef5a
--- /dev/null
+++ b/src/index.tsx
@@ -0,0 +1,12 @@
+import App from "./App";
+import "bootstrap/dist/css/bootstrap.min.css";
+import "./Styles/App/index.scss";
+import { createRoot } from "react-dom/client";
+import ProviderContainer from "./ProviderContainer";
+
+const root = createRoot(document.getElementById("root") as HTMLElement);
+root.render(
+
+
+ ,
+);
diff --git a/src/lib/ReactQueryProvider.tsx b/src/lib/ReactQueryProvider.tsx
new file mode 100755
index 0000000..fa16858
--- /dev/null
+++ b/src/lib/ReactQueryProvider.tsx
@@ -0,0 +1,12 @@
+import React from "react";
+import { QueryClient, QueryClientProvider } from "react-query";
+
+function QueryProvider({ children }: any) {
+ const queryClient = new QueryClient();
+
+ return (
+ {children}
+ );
+}
+
+export default QueryProvider;
diff --git a/src/lib/ReduxT.tsx b/src/lib/ReduxT.tsx
new file mode 100644
index 0000000..7eca41a
--- /dev/null
+++ b/src/lib/ReduxT.tsx
@@ -0,0 +1,9 @@
+import { store } from "../Redux/store";
+import { Provider } from "react-redux";
+import { TChildren } from "../types/App";
+
+function ReduxT({ children }: TChildren) {
+ return {children} ;
+}
+
+export default ReduxT;
diff --git a/src/lib/SocketProvider.tsx b/src/lib/SocketProvider.tsx
new file mode 100644
index 0000000..e624187
--- /dev/null
+++ b/src/lib/SocketProvider.tsx
@@ -0,0 +1,21 @@
+const BASE_URL = "ws://localhost:5000";
+
+import { io, Socket } from "socket.io-client";
+
+var socket: null | Socket = null;
+export const getSocket = () => {
+ if (!socket) {
+ socket = io(BASE_URL, {
+ autoConnect: true,
+ transports: ["websocket"],
+ });
+ }
+ return socket;
+};
+
+export const disconnectSocket = () => {
+ if (socket) {
+ socket.disconnect();
+ socket = null;
+ }
+};
diff --git a/src/lib/ToastProvider.tsx b/src/lib/ToastProvider.tsx
new file mode 100644
index 0000000..4cd2666
--- /dev/null
+++ b/src/lib/ToastProvider.tsx
@@ -0,0 +1,25 @@
+import React from "react";
+import { ToastContainer } from "react-toastify";
+import "react-toastify/dist/ReactToastify.css";
+
+function ToastProvider({ children }: any) {
+ return (
+ <>
+
+ {children}
+ >
+ );
+}
+
+export default ToastProvider;
diff --git a/src/lib/state.ts b/src/lib/state.ts
new file mode 100644
index 0000000..18dc560
--- /dev/null
+++ b/src/lib/state.ts
@@ -0,0 +1,29 @@
+import { create } from "zustand";
+
+interface ModalState {
+ isOpenAddModel: boolean;
+ isOpenEditModel: boolean;
+ objectToEdit: any;
+ isThemChanged: any;
+ setThemChange: () => void;
+ setIsOpenAddModel: () => void;
+ setIsOpenEditModel: () => void;
+ CloseAllModal: () => void;
+ setObjectToEdit: (data: any) => void;
+}
+
+export const usePageState = create((set) => ({
+ isOpenAddModel: false,
+ isOpenEditModel: false,
+ objectToEdit: null,
+ isThemChanged: false,
+ setThemChange: () =>
+ set((state) => ({ isThemChanged: !state.isThemChanged })),
+ setIsOpenAddModel: () =>
+ set((state) => ({ isOpenAddModel: !state.isOpenAddModel })),
+ setIsOpenEditModel: () =>
+ set((state) => ({ isOpenEditModel: !state.isOpenEditModel })),
+ CloseAllModal: () =>
+ set((state) => ({ isOpenAddModel: false, isOpenEditModel: false })),
+ setObjectToEdit: (data) => set(() => ({ objectToEdit: data })),
+}));
diff --git a/src/state/AuthState.ts b/src/state/AuthState.ts
new file mode 100644
index 0000000..5945b96
--- /dev/null
+++ b/src/state/AuthState.ts
@@ -0,0 +1,63 @@
+import { create } from "zustand";
+import { LocalStorageEnum } from "../api/utils/LocalStorage";
+
+interface LoginResponse {
+ token: string;
+ user: any;
+ token_node: string;
+}
+
+interface AuthStore {
+ user: any | null | undefined;
+ token: string | null | undefined;
+ isAuthenticated: boolean;
+ Guest: any | null | undefined;
+ setGuest: (newGuest: any) => void;
+ login: (userData: LoginResponse) => Promise;
+ logout: () => Promise;
+}
+
+const useAuthState = create((set) => {
+ const storedUser: any = localStorage.getItem(LocalStorageEnum.USER_KEY);
+ const storedGuest: any = localStorage.getItem(LocalStorageEnum.GUEST_KEY);
+
+ const storedToken = localStorage.getItem(LocalStorageEnum.TOKEN_KEY);
+
+ const initialUser =
+ storedUser && storedUser !== "undefined" ? JSON.parse(storedUser) : null;
+
+
+ return {
+ user: initialUser,
+ isAuthenticated: !!storedToken,
+ token: storedToken,
+ Guest: storedGuest,
+ setGuest: (Guest: string) => {
+ localStorage.setItem(LocalStorageEnum.GUEST_KEY, Guest);
+
+ set(() => ({
+ Guest: Guest,
+ }));
+ },
+ login: async (userData) => {
+ localStorage.setItem(LocalStorageEnum.TOKEN_KEY, userData?.token);
+
+ localStorage.setItem(
+ LocalStorageEnum.USER_KEY,
+ JSON.stringify(userData?.user),
+ );
+
+ set((state) => ({
+ user: userData.user,
+ isAuthenticated: true,
+ token: userData.token,
+ }));
+ },
+ logout: async () => {
+ localStorage.clear()
+ set((state) => ({ user: null, isAuthenticated: false, token: null ,Guest:null }));
+ },
+ };
+});
+
+export default useAuthState;
diff --git a/src/state/CartState.ts b/src/state/CartState.ts
new file mode 100644
index 0000000..02b1923
--- /dev/null
+++ b/src/state/CartState.ts
@@ -0,0 +1,124 @@
+import { create } from "zustand";
+import { LocalStorageEnum } from "../api/utils/LocalStorage";
+
+interface CartItem {
+ id: string | number;
+ quantity?: number; // Making quantity optional initially
+ price: number;
+}
+
+const calculateTotalPrice = (cart: CartItem[]): number => {
+ return cart.reduce((total, item) => {
+ // Calculate the price of each item by multiplying its price by its quantity
+ const itemPrice = item?.price * (item.quantity || 0);
+ // Add the price of the current item to the total
+ return total + itemPrice;
+ }, 0); // Start with a total of 0
+};
+
+// Define a function to calculate the total quantity of items in the cart
+const calculateTotalQuantity = (cart: CartItem[]): number => {
+ return cart.reduce((total, item) => {
+ // Add the quantity of each item to the total
+ return total + (item.quantity || 0);
+ }, 0); // Start with a total of 0
+};
+
+interface ModalState {
+ Cart: CartItem[];
+ setCart: (data: CartItem) => void;
+ deleteFromCart: (id: string | number) => void;
+ removeFromCart: any;
+ calculateTotalPrice: () => number; // Add the calculateTotalPrice function
+ calculateTotalQuantity: () => number; // Add the calculateTotalQuantity function
+ removeCart: any;
+}
+
+const getInitialCart = (): CartItem[] => {
+ const savedCart = localStorage.getItem(LocalStorageEnum?.CART_KEY);
+ return savedCart ? JSON.parse(savedCart) : [];
+};
+
+export const useCartState = create((set) => ({
+ Cart: getInitialCart(),
+ setCart: (data) => {
+ set((state) => {
+ const existingItem = state.Cart.find((item) => item.id === data.id);
+
+ if (existingItem) {
+ // If the item already exists in the cart, update its quantity
+ const updatedCart = state.Cart.map((item) =>
+ item.id === data.id
+ ? { ...item, quantity: (item.quantity || 0) + 1 } // If quantity doesn't exist, default to 0 and add 1
+ : item,
+ );
+ localStorage.setItem(
+ LocalStorageEnum?.CART_KEY,
+ JSON.stringify(updatedCart),
+ );
+ return { Cart: updatedCart };
+ } else {
+ // Otherwise, add the item to the cart with the specified quantity
+ const updatedCart = [
+ ...state.Cart,
+ { ...data, quantity: data.quantity || 1 },
+ ]; // If quantity doesn't exist, default to 1
+ localStorage.setItem(
+ LocalStorageEnum?.CART_KEY,
+ JSON.stringify(updatedCart),
+ );
+ return { Cart: updatedCart };
+ }
+ });
+ },
+ deleteFromCart: (id) => {
+ set((state) => {
+ const existingItemIndex = state.Cart.findIndex(
+ (item) => item.id === id && item.quantity && item.quantity > 1,
+ );
+
+ if (existingItemIndex !== -1) {
+ // If item has quantity > 1, decrement its quantity
+ const updatedCart = [...state.Cart];
+ if (updatedCart[existingItemIndex]?.quantity) {
+ // Use optional chaining to safely access quantity
+ //@ts-ignore
+ updatedCart[existingItemIndex].quantity--; // Decrement quantity if it exists and is greater than 1
+ }
+ localStorage.setItem(
+ LocalStorageEnum?.CART_KEY,
+ JSON.stringify(updatedCart),
+ );
+ return { Cart: updatedCart };
+ } else {
+ // Otherwise, remove the item from the cart
+ const updatedCart = state.Cart.filter((item) => item.id !== id);
+ localStorage.setItem(
+ LocalStorageEnum?.CART_KEY,
+ JSON.stringify(updatedCart),
+ );
+ return { Cart: updatedCart };
+ }
+ });
+ },
+
+ removeFromCart: (id: number) => {
+ set((state) => {
+ const updatedCart = state.Cart.filter((item) => item.id !== id);
+ localStorage.setItem(
+ LocalStorageEnum?.CART_KEY,
+ JSON.stringify(updatedCart),
+ );
+ return { Cart: updatedCart };
+ });
+ },
+
+ removeCart: () => {
+ set((state) => {
+ localStorage.setItem(LocalStorageEnum?.CART_KEY, "");
+ return { Cart: [] };
+ });
+ },
+ calculateTotalPrice: () => calculateTotalPrice(getInitialCart()),
+ calculateTotalQuantity: () => calculateTotalQuantity(getInitialCart()),
+}));
diff --git a/src/state/Filter.ts b/src/state/Filter.ts
new file mode 100644
index 0000000..01bde7d
--- /dev/null
+++ b/src/state/Filter.ts
@@ -0,0 +1,12 @@
+import { create } from "zustand";
+
+interface ModalState {
+ Filter: any;
+ setFilter: (data: any) => void;
+
+}
+
+export const useFilterStateState = create((set) => ({
+ Filter: [],
+ setFilter: (data) => set((state) => ({ Filter: data })),
+}));
diff --git a/src/state/HelpState.ts b/src/state/HelpState.ts
new file mode 100644
index 0000000..3373c1b
--- /dev/null
+++ b/src/state/HelpState.ts
@@ -0,0 +1,11 @@
+import { create } from "zustand";
+
+interface ModalState {
+ HelpModal: boolean;
+ setHelpModal: () => void;
+}
+
+export const useHelpStateState = create((set) => ({
+ HelpModal: false,
+ setHelpModal: () => set((state) => ({ HelpModal: !state?.HelpModal })),
+}));
diff --git a/src/translate/ar.json b/src/translate/ar.json
new file mode 100755
index 0000000..2bbe86e
--- /dev/null
+++ b/src/translate/ar.json
@@ -0,0 +1,392 @@
+{
+ "Ar": "عربي",
+ "En": "انكليزي",
+ "ar": "عربي",
+ "en": "انكليزي",
+ "ch": "صيني",
+ "Ch": "صيني",
+ "Chinese":"صيني",
+ "Arabic":"عربي",
+"English":"إنجليزي",
+"Login":"تسجيل الدخول",
+"Welcome back, please login to your account.":"مرحبًا بك مرة أخرى ، يرجى تسجيل الدخول إلى حسابك.",
+"Username":"اسم المستخدم",
+"Password":"كلمة المرور",
+"Sign in":"تسجيل الدخول",
+"Karim aldeen © 2022 | All Rights Reserved":"كريم الدين © 2022 |كل الحقوق محفوظة",
+"unknown":"مجهول",
+"super admin":"مشرف سوبر",
+"admin":"مسؤل",
+"Home":"الصفحة الرئيسية",
+"example":"مثال",
+"Log Out" : "تسجيل خروج" ,
+"Example":"مثال",
+"Add":"اضافة",
+"username":"اسم ",
+"password":"كلمة المرور ",
+"name":"اسم",
+"email":"الحساب",
+"cancel":"الغاء",
+"edit":"تعديل",
+"light":"وضع النهاري",
+"dark":"وضع اليلي",
+"delete_are_you_sure":"هل انت متاكد تريد الحذف ",
+"no_revert":"لايوجد عودة",
+"yes_delete_it":"نعم احذفها",
+"Categories":"التصنيفات",
+"home":"الصفحة الرئيسية",
+"about":"من نحن",
+"contact":"تواصل معنا",
+"Products":"المنتجات",
+"Auction Incomming ...":" مزاد وارد ...",
+"Register Now For Auction To Get Notification":"سجل الآن للحصول على المزاد للحصول على إشعار",
+"See more":"شاهد المزيد",
+"Purchase":"الاكثر شراء",
+"Highlight":"تسليط الضوء",
+"NEW ARRIVALS":"الوافدين الجدد",
+"SUMMER SALE":"تخفيضات الصيف",
+"20% OFF":"20% خصم",
+"Shop Now":"تسوق الآن",
+"Weekend Sale":"بيع عطلة نهاية الأسبوع",
+"Fine Smart Speaker":"مكبر صوت ذكي جيد",
+"Starting at":"يبدأ من",
+"Fast Delivery":"توصيل سريع",
+"Start from $10":"ابدأ من 10 دولارات",
+"Money Guarantee":"ضمان المال",
+"7 Days Back":"7 أيام",
+"365 Days":"365 يوما",
+"For free return":"للعودة المجانية",
+"Payment":"قسط",
+"Secure system":"نظام آمن",
+"Final Reduction":"التخفيض النهائي",
+"Sale up to 20% Off":"بيع ما يصل إلى 20 ٪ خصم",
+"Only From ":"فقط من",
+"Search here":"ابحث هنا",
+"Logout":"تسجيل خروج",
+"orders":"الطلبات",
+"About us":"معلومات عنا",
+"Contact us":"اتصل بنا",
+"Our Social Networks:":"شبكاتنا الاجتماعية:",
+"Useful links":"روابط مفيدة",
+"Syria":"سوريا",
+"Damascus":"دمشق",
+"Mazzeh":"مزه",
+"Copyright":"حقوق النشر",
+"UboutUsINfo":"الولايات المتحدة: خبراء في علم النقود.العملات المعدنية والرقم هي شغفنا.نود مشاركة هذا معك.سواء في الذهب أو الفضة أو البرونز: العملات المعدنية أكثر بكثير من الرؤوس أو ذيول.إنها تعبير عن التاريخ والاستثمار الجيد.إن العثور على طريقك في عالم العملات يتطلب المعرفة والخبرة والسمعة.نحن نقدم كل هذه الأشياء ، نتصرف لك بكفاءة وفردية.هل تبحث عن خبراء في علم اليونانية أو الرومانية أو البيزنطية أو العصور الوسطى أو الحديثة؟أنت في المكان المناسب.المزادات: ساعة العملات المعدنية.الربيع والخريف هي مواسم العملات المعدنية للتألق.في هذه المواسم ، يجد المشترين وعشاق الفن وجامعيهم على حد سواء أنفسهم في مزادات LEU في زيوريخ لتجربة التغيير في ملكية الندرة المختارة والخاصة بالرقم. يتم نشر هذه الكنوز في كتالوجات عالية الجودة ، والتي تحصل على اهتمام العملاء الدوليين.تجربة مثيرة لكل محب للعملة.",
+"Who are we":"من نحن",
+"Contact Us" : "اتصل بنا",
+"Send your message and it will be automatically sent to my Gmail" : "أرسل رسالتك وسيتم إرسالها تلقائيًا إلى Gmail",
+"Your Name" : "اسمك",
+"enter Your Name" : "أدخل أسمك",
+"Your Email" : "بريدك الإلكتروني",
+"enter Your Email" : "أدخل بريدك الإلكتروني",
+"Your Message" : "رسالتك",
+"type Your Message" : "اكتب رسالتك",
+"Submit" : "تأكيد",
+"ProductsFilter":"تصفية المنتجات",
+"Filter":"التصفية",
+"Price Range":"نطاق السعر",
+"All":"الجميع",
+"Most Purchased":"معظمهم",
+"Total":"المجموع",
+"items":"عنصر",
+"Your All Order total is :":"مجموع الطلب الخاص بك هو:",
+"order_code":"رمز الطلب",
+"order_total":"الطلب الكلي",
+"payment_status":"حالة السداد",
+"order_status":"حالة الطلب",
+"Sign In":"تسجيل الدخول",
+"Email":"بريد إلكتروني",
+"or Register":"أو سجل",
+"Create Account":"إنشاء حساب",
+"Name":"الاسم",
+"or login":"أو تسجيل الدخول",
+"Hello, Friend!":"مرحبا صديقي!",
+"Register with your personal details to use all of site features":"قم بالتسجيل باستخدام بياناتك الشخصية لاستخدام جميع ميزات الموقع",
+"Welcome Back!":"مرحبًا بعودتك!",
+"Enter your personal details to use all of site features":"أدخل بياناتك الشخصية لاستخدام جميع ميزات الموقع",
+"Sign Up":"اشتراك",
+"cart":"السلة",
+"Loaction":"الموقع",
+"Add To Cart":"اضافة الى السلة",
+
+"Category": "الفئة",
+"Description": "وصف",
+"Price": "السعر",
+"Quantity": "الكمية",
+"Purchasing Count": "عدد الشراء",
+"product Highlight": "منتج مميز",
+"product Most Purchase": "المنتج الأكثر شراء",
+
+"Delete": "حذف",
+"Delete the Item": "حذف العنصر",
+"Are you sure to delete this Item": "هل أنت متأكد من حذف هذا العنصر",
+"Yes": "نعم",
+"No": "لا",
+"Delivery Fees": "رسوم التوصيل",
+"Checkout": "الدفع",
+"Sub Total": "المجموع الفرعي",
+"CartInfo": "معلومات السلة",
+"Details": "تفاصيل",
+"Billing Address": "عنوان الفواتير",
+"Pay with": "الدفع بواسطة",
+"Phone": "الهاتف",
+"phone": "الهاتف",
+"Note": "ملاحظة",
+"Building Number": "رقم المبنى",
+"Zone Number": "رقم المنطقة",
+"Shipping Address": "عنوان الشحن",
+"Proceed To Payment": "الانتقال إلى الدفع",
+"Back to cart": "العودة إلى السلة",
+"Loading...": "جار التحميل...",
+"Review": "مراجعة",
+"back to Details": "العودة إلى التفاصيل",
+"Online": "عبر الإنترنت",
+"Cash On Delivery": "الدفع عند الاستلام",
+"Payment Method":"طريقة الدفع",
+"zone": "المنطقة",
+"building": "المبنى",
+"note": "ملاحظة",
+"dashed": "متقطع",
+"Phone is required": "الهاتف مطلوب",
+"Zone is required": "المنطقة مطلوبة",
+"note is required": "الملاحظة مطلوبة",
+"Building is required": "رقم المبنى مطلوب",
+
+"Please Login First": "الرجاء تسجيل الدخول أولاً",
+"failed_to_add_data": "فشلت إضافة البيانات",
+"Deleted": "تم الحذف",
+"please_login_first": "الرجاء تسجيل الدخول أولاً",
+"updated_successfully": "تم التحديث بنجاح",
+"failed_to_update_data": "فشل تحديث البيانات",
+"Error updating product quantity": "خطأ في تحديث كمية المنتج",
+"Product quantity updated successfully": "تم تحديث كمية المنتج بنجاح",
+"Your Data in proccess": "البيانات الخاصة بك قيد التنفيذ",
+"added to cart": "تمت الإضافة إلى السلة",
+"message_send_successfully": "تم إرسال الرسالة بنجاح",
+"please_fill_all_input": "الرجاء ملء جميع الحقول",
+"Loading Your Order":"تحميل الطلب الخاص بك",
+"Total paid": "الإجمالي المدفوع",
+"Free": "مجاني",
+"Invoice Date": "تاريخ الفاتورة",
+"System Number": "رقم النظام",
+"Discount": "الخصم",
+"Order Details": "تفاصيل الطلب",
+"Order Code": "رمز الطلب",
+"Receipt": "إيصال",
+"Thanks for your Order": "شكرًا لطلبك",
+"Delivery Charges": "رسوم التوصيل",
+
+
+"Buy Again":"اشتري مرة اخرى",
+"Thank You for Try and hope to make another one":"شكرا لك على المحاولة ونأمل أن نصنع واحدة أخرى",
+"Successfully Purchased Order!":"تم شراء الطلب بنجاح!",
+
+"empty":"فارغة",
+"Sorry, your cart is":"عذرا، سلة التسوق الخاصة بك ",
+"added to favourite":"تمت الاضافة الى المفضلة",
+"Removed From Favourite":"تمت الازالة من المفضلة",
+"view cart":"رؤية السلة",
+"favourite":"المفضلة",
+"Become Partner":"كن شريكًا",
+"Coin Price":"سعر العملة",
+"Coin Description":"وصف العملة",
+"Coin Name":"اسم العملة",
+"contactUs": {
+ "title": "اتصل بي",
+ "sendYourMessage": "أرسل رسالتك وسيتم إرسالها تلقائيًا إلى Gmail الخاص بي",
+ "name": "الاسم",
+ "enterYourName": "أدخل اسمك",
+ "email": "البريد الإلكتروني",
+ "enterYourEmail": "أدخل بريدك الإلكتروني",
+ "message": "الرسالة",
+ "typeYourMessage": "اكتب رسالتك هنا",
+ "submit": "إرسال",
+ "emailSentSuccess": "تم إرسال البريد الإلكتروني بنجاح!"
+},
+
+"enter Coin description":"ادخل وصف العملة",
+"enter Coin Name":"ادخل اسم العملة",
+"enter coin price":"ادخل سعر العملة",
+"Lowest Price":"أقل سعر",
+"products":"منتجات",
+"high quality products":"منتجات ذات جودة عالية",
+"Work Time":"وقت العمل",
+"Online 24 hour":"على الانترنت 24 ساعة",
+
+"Send your Coins and it will be automatically sent to my Gmail":"أرسل عملاتك المعدنية وسيتم إرسالها تلقائيًا إلى Gmail الخاص بي",
+"ClearIMageCoins2":"صور واضحة للعملات 2",
+"ClearIMageCoins":" صور واضحة للعملات",
+"upload_image":"رفع صورة",
+"Your Email has been verfied successfully":"لقد تم التحقق من بريدك الإلكتروني بنجاح",
+"You can continue using the website":"يمكنك الاستمرار في استخدام الموقع",
+"Verify Code Sent to Email":"تحقق من الرمز المرسل إلى البريد الإلكتروني",
+"Please enter the verification code sent to your email to complete the verification process":"الرجاء إدخال رمز التحقق المرسل إلى بريدك الإلكتروني لإكمال عملية التحقق.",
+"Resend Code":"أعد إرسال الرمز",
+"Verification code is invalid":"رمز التحقق غير صالح",
+"Verified Successfully":"تم التحقق بنجاح",
+"Invalid Code":"الرمز غير صحيح",
+"Code has been send successfully":"تم إرسال الرمز بنجاح",
+"Code has been send successfully to your email":"تم إرسال الرمز بنجاح إلى بريدك الإلكتروني",
+"Error while sending code plaese try agian later":"حدث خطأ أثناء إرسال الرمز، يرجى المحاولة لاحقًا",
+"Please verify your email":"يرجى التحقق من البريد الإلكتروني الخاص بك",
+"Failed to send code please try again":"حدث خطأ اُثناء ارسال الكود الرجاء المحاولة لاحقا",
+"Failed to submit code please try again":"حدث خطأ اُثناء تأكيد الكود الرجاء المحاولة لاحقا",
+"Privacy":"الخصوصية",
+"Privacy Policy":"سياسة الخصوصية",
+"View":"العرض",
+"Sort by":"الترتيب حسب",
+"Searching for":"البحث عن",
+"48 results found":"48 نتيجة وجدت",
+"Option":"الخيار",
+"Brand":"الماركة",
+"Ratings":"التقييمات",
+"Featured":"الاحدث",
+"In Stock":"منتهي",
+"On Sale":"خصومات",
+"Add To Favourite":"اضافة الى المفضلة",
+"title":"منتجات مميزة",
+
+"pending":"قيد الانتظار",
+"canceled":"ملغي",
+"accepted":"مقبول",
+"delivering":"قيد التوصيل",
+"delivered":"تم التوصيل",
+"My WishList":"المفضلة",
+"Social Media":"تواصل اجتماعي",
+"Contact":"معلومات التواصل",
+"Company name":"اسم الشركة",
+"partner":"شركاء",
+"ClearIMages":"صور واضحة",
+"Prouduct Name":"اسم المنتج",
+"Product Description":"وصف المنتج",
+"Product Price":"سعر المنتج",
+"enter Product price":"ادخل سعر المنتج",
+"enter Product description":"ادخل وصف المنتج",
+"enter Product Name":"ادخل اسم المنتج",
+"Get connected with us on social networks":"تواصل معنا على مواقع التواصل الاجتماعي",
+"This page could not be found":"هذه الصفحة غير موجودة",
+"Fast_Delivery":"سرعة التوصيل",
+"upolad_an_image": "رفع صورة",
+"Relevance": "ملائم",
+"Date": "الوقت",
+"Price To Low": "أقل سعر",
+"Price To High": "أعلى سعر",
+"Black Friday Sales Left": "مبيعات الجمعة السوداء المتبقية",
+"PAY ONLY FOR YOUR LOVING ELECTRONICS" : "ادفع فقط مقابل الأجهزة الإلكترونية التي تحبها",
+"Country": "الدولة",
+"Edit your": "تعديل",
+"Profile": "الملف الشخصي",
+"update": "تحديث",
+"Male":"ذكر",
+"Female":"أنثى",
+"Gender":"الجنس",
+"Join Our Family":"انضم الى عائلتنا",
+"Become Rider":"كن سائقا",
+"Order Info":"معلومات الطلب",
+"Your Personal Information":"معلوماتك الشخصية",
+"Become A Star":"كن نجما",
+"Market Place":"متجر",
+"Valid Commercial Registration":"سجل تجاري ساري المفعول",
+"Selection Type":"نوع الاختيار",
+"stores": "المتاجر",
+"Birthday":"يوم ميلادك",
+"is requierd":"مطلوب",
+"user":"المستخدم",
+"role":"دور",
+"FAQS": "الأسئلة الشائعة",
+"help": "مساعدة",
+"DM is the one of the world’s largest online shops that providing over 1500 headphones for its costumers from over 80 countries": "DM هي واحدة من أكبر المتاجر الإلكترونية في العالم، حيث توفر أكثر من 1500 سماعة رأس لعملائها من أكثر من 80 دولة",
+"info": "معلومات",
+"Headphones": "سماعات رأس",
+"Earphones": "سماعات أذن",
+"Sign up for News and updates": "اشترك للحصول على الأخبار والتحديثات",
+"Buy Now": "اشترِ الآن",
+"View all": "عرض الكل",
+"New Products": "منتجات جديدة",
+"Premium Design": "تصميم فاخر",
+"When you want to take your music anywhere, you need headphones built to keep up. With impact-resistant materials, glass-filled nylon, and corrosion-resistant stainless steel, they’re engineered to survive life on the go": "عندما تريد أخذ موسيقاك معك في أي مكان، تحتاج إلى سماعات رأس مصممة لتواكبك. مع مواد مقاومة للصدمات، نايلون مملوء بالزجاج، وفولاذ مقاوم للتآكل، فهي مصممة لتحمل الحياة أثناء التنقل",
+"Bose Headphones": "سماعات بوز",
+"Smarter than your average headphones": "أذكى من السماعات العادية",
+"Shop now": "تسوق الآن",
+"Perfect sound immersive world": "عالم غامر بصوت مثالي",
+"QuietComfort 35 wireless headphones II are engineered with renowned noise cancellation. With the Google Assistant and Amazon Alexa built-in, you have instant access to millions of songs, playlists and more—hands free": "تم تصميم سماعات QuietComfort 35 اللاسلكية الثانية بتقنية إلغاء الضوضاء الشهيرة. مع مساعد جوجل وأمازون أليكسا مدمجين، لديك وصول فوري إلى ملايين الأغاني وقوائم التشغيل والمزيد بدون استخدام اليدين",
+"Best Sale": "أفضل مبيعًا",
+"Enjoy up to 20 hours of listening, enough time to pore through this entire playlist. So you can keep the music — or the quiet — going all day long. And when it finally runs down, a quick 15-minute charge gives you another 2.5 hours": "استمتع بما يصل إلى 20 ساعة من الاستماع، وهو وقت كافٍ لاستعراض قائمة التشغيل بالكامل. يمكنك الاستمرار في الاستماع إلى الموسيقى - أو الهدوء - طوال اليوم. وعندما ينتهي الشحن، تعطيك شحنة سريعة لمدة 15 دقيقة 2.5 ساعة إضافية",
+"Up to 20 hours battery life": "حتى 20 ساعة من عمر البطارية",
+"Frequently Asked Questions": "الأسئلة المتكررة",
+"Table of Contents": "جدول المحتويات",
+"Billing": "الفوترة",
+"Services": "الخدمات",
+"Trusts & Safety": "الثقة والأمان",
+"General": "عام",
+"If you need assistance with your purchase or have any questions, our dedicated customer service is here to help. You can reach out to us through the contact page on our website, and we'll be happy to assist you promptly": "إذا كنت بحاجة إلى مساعدة في عملية الشراء أو لديك أي أسئلة، فإن خدمة العملاء المخصصة لدينا هنا لمساعدتك. يمكنك التواصل معنا عبر صفحة الاتصال على موقعنا، وسنكون سعداء بمساعدتك فورًا",
+"Yes, DM provides a warranty on all eligible products. The specific warranty details may vary depending on the manufacturer and product category. Please refer to the product description or contact our customer support for more information": "نعم، توفر DM ضمانًا على جميع المنتجات المؤهلة. قد تختلف تفاصيل الضمان المحددة حسب الشركة المصنعة وفئة المنتج. يرجى الرجوع إلى وصف المنتج أو الاتصال بدعم العملاء لدينا للحصول على مزيد من المعلومات",
+"You can actively engage with the magazine content by leaving comments and participating in the question-and-answer section. Feel free to share your thoughts, ask questions, and interact with enthusiasts in the community": "يمكنك التفاعل بنشاط مع محتوى المجلة من خلال ترك التعليقات والمشاركة في قسم الأسئلة والأجوبة. لا تتردد في مشاركة أفكارك، وطرح الأسئلة، والتفاعل مع المتحمسين في المجتمع",
+"Yes, DM offers the option to purchase products using both cash and installment payments. This allows you to choose the payment method that suits your needs and budget": "نعم، توفر DM خيار شراء المنتجات باستخدام الدفع النقدي والأقساط. يتيح لك ذلك اختيار طريقة الدفع التي تناسب احتياجاتك وميزانيتك",
+"How can I get assistance with my purchase or any other inquiries?": "كيف يمكنني الحصول على المساعدة في عملية الشراء أو أي استفسارات أخرى؟",
+"Is DM a secure platform for online shopping?": "هل DM منصة آمنة للتسوق عبر الإنترنت؟",
+"Does DM offer a warranty on its products?": "هل تقدم DM ضمانًا على منتجاتها؟",
+"How can I engage with the magazine content on DM?": "كيف يمكنني التفاعل مع محتوى المجلة على DM؟",
+"Can I purchase products from DM using installment payments?": "هل يمكنني شراء منتجات من DM باستخدام الدفع بالأقساط؟",
+"About Us": "معلومات عنا",
+"WE ARE DM GROUP": "نحن مجموعة DM",
+"We are DM company, which has been working for two decades. We are active in the United Arab Emirates in the field of stock laptops, computer parts, RAM, hard drives, etc. We are currently working with Europe, Africa and the Middle East. We provide you the best services with the shortest time and the highest quality": "نحن شركة DM، التي تعمل منذ عقدين. نحن نشطون في الإمارات العربية المتحدة في مجال مخزون أجهزة الكمبيوتر المحمولة، وأجزاء الكمبيوتر، وذاكرات الوصول العشوائي، والأقراص الصلبة، وما إلى ذلك. نحن نعمل حاليًا مع أوروبا وأفريقيا والشرق الأوسط. نحن نقدم لك أفضل الخدمات في أقصر وقت وبأعلى جودة",
+"YOU CAN FIND US IN": "يمكنك العثور علينا في",
+"Telegram ID": "معرف تيليجرام",
+"Instagram": "إنستغرام",
+"LinkedIn": "لينكد إن",
+"Whatsapp": "واتساب",
+"We love meeting new people and helping them": "نحب مقابلة أشخاص جدد ومساعدتهم",
+"* Your Name": "* اسمك",
+"* Email": "* البريد الإلكتروني",
+"Message": "رسالة",
+"Need Helps ?": "هل تحتاج إلى مساعدة؟",
+"Enter your model name": "أدخل اسم النموذج الخاص بك",
+"Wish List": "قائمة الأمنيات",
+"Orders": "الطلبات",
+"Back": "عودة",
+"Grand Total": "المجموع الكلي",
+"Back To Shopping": "العودة إلى التسوق",
+"Cart": "عربة التسوق",
+"Search Product Name": "ابحث عن اسم المنتج",
+"not found data": "لم يتم العثور على بيانات :(",
+"Product": "منتج",
+"Similar Products": "منتجات مشابهة",
+"Filters": "المرشحات",
+"Clear All": "مسح الكل",
+"Connectivity": "الاتصال",
+"Wearing Style": "أسلوب الارتداء",
+"discount": "خصم",
+"new Arrivals": "وصول جديد",
+"descending": "تنازلي",
+"ascending": "تصاعدي",
+"Account": "حساب",
+"Personal Data": "بيانات شخصية",
+"Security and access": "الأمان والوصول",
+"Wishlist": "قائمة الرغبات",
+"state": "الحالة",
+"coupon": "كوبون",
+"total": "المجموع",
+"order code": "رمز الطلب",
+"Current": "الحالي",
+"You have not placed any orders yet": "لم تقم بأي طلبات بعد",
+"Change password and phone number": "تغيير كلمة المرور ورقم الهاتف",
+"Security settings": "إعدادات الأمان",
+"See your favorites list here": "شاهد قائمة المفضلة هنا",
+"Change Password": "تغيير كلمة المرور",
+"Quite Comfort 35 wireless headphones II":"سماعات رأس لاسلكية مريحة تمامًا 35 II",
+
+"Verify": "تحقق",
+"Create Your Account": "أنشئ حسابك",
+"Log In To DM": "تسجيل الدخول إلى DM",
+"Verify Your Account": "تحقق من حسابك",
+"E-mail": "البريد الإلكتروني",
+"Full Name": "الاسم الكامل",
+"verify code": "تحقق من الرمز",
+"verify": "تحقق",
+"sub_categories": "الفئات الفرعية",
+"Clear_All": "مسح الكل"
+
+
+}
\ No newline at end of file
diff --git a/src/translate/ch.json b/src/translate/ch.json
new file mode 100644
index 0000000..3d333ff
--- /dev/null
+++ b/src/translate/ch.json
@@ -0,0 +1,376 @@
+{
+
+ "ch": "中國人",
+ "Ch": "中國人",
+ "Chinese":"中國人",
+ "Ar": "阿拉伯文",
+ "En": "英文",
+ "ar": "阿拉伯文",
+ "en": "英文",
+ "Arabic":"阿拉伯文",
+ "English":"英文",
+ "Login":"登录",
+ "Username":"用户名",
+ "Password":"密码",
+ "Sign in":"登录",
+ "unknown":"未知",
+ "admin":"管理员",
+ "Home":"主页",
+ "example":"例子",
+ "Log Out" : "登出",
+ "Example":"例子",
+ "Add":"添加",
+ "username":"用户名",
+ "password":"密码",
+ "name":"名字",
+ "email":"电子邮件",
+ "cancel":"取消",
+ "edit":"编辑",
+ "light":"浅色模式",
+ "dark":"深色模式",
+ "delete_are_you_sure":"确定删除",
+ "no_revert":"无法恢复",
+ "yes_delete_it":"是的,删除",
+ "Categories":"类别",
+ "home":"主页",
+ "about":"关于",
+ "contact":"联系",
+ "Products":"产品",
+ "See more":"查看更多",
+ "Purchase":"购买",
+ "Highlight":"亮点",
+ "NEW ARRIVALS":"新品到货",
+ "SUMMER SALE":"夏季特卖",
+ "20% OFF":"20% 折扣",
+ "Shop Now":"立即购买",
+ "Weekend Sale":"周末促销",
+ "Fine Smart Speaker":"优质智能音箱",
+ "Starting at":"起价 ",
+ "Fast Delivery":"快速配送",
+ "Start from $10":"起价 $10",
+ "Money Guarantee":"资金保障",
+ "7 Days Back":"7 天内退货",
+ "365 Days":"365 天",
+ "For free return":"免费退货",
+ "Payment":"支付",
+ "Secure system":"安全系统",
+ "Final Reduction":"最终降价",
+ "Sale up to 20% Off":"最高 20% 折扣",
+ "Only From ":"仅从 ",
+ "Search here":"在这里搜索",
+ "Logout":"登出",
+ "orders":"订单",
+ "About us":"关于我们",
+ "Contact us":"联系我们",
+ "Our Social Networks:":"我们的社交网络:",
+ "Useful links":"有用的链接",
+ "Syria":"叙利亚",
+ "Damascus":"大马士革",
+ "Mazzeh":"马泽",
+ "Copyright":"版权",
+ "Who are we":"我们是谁",
+ "UboutUsINfo":"关于我们:钱币学专家。硬币和钱币学是我们的激情。我们希望与您分享这一点。无论是金、银还是铜:硬币不仅仅是正反面。它们是历史的体现,也是良好的投资。在硬币世界中导航需要知识、经验和信誉。我们为您提供所有这些,专业且个性化。您正在寻找希腊、罗马、拜占庭、中世纪或现代钱币学的专家吗?您来对地方了。拍卖:硬币的时刻。春季和秋季是硬币闪耀的季节。在这些季节,买家、艺术爱好者和收藏家齐聚苏黎世的 Leu 拍卖行,体验精选稀有硬币和钱币特产的所有权变更。这些珍品被发布在高质量的目录中,吸引国际客户的注意。每个硬币爱好者的激动体验。",
+ "Contact Us" : "联系我们",
+ "Send your message and it will be automatically sent to my Gmail" : "发送您的信息,它将自动发送到我的 Gmail",
+ "Your Name" : "您的名字",
+ "enter Your Name" : "输入您的名字",
+ "Your Email" : "您的电子邮件",
+ "enter Your Email" : "输入您的电子邮件",
+ "Your Message" : "您的信息",
+ "type Your Message" : "在此输入您的信息",
+ "Submit" : "提交",
+ "ProductsFilter":"产品过滤",
+ "Filter":"过滤",
+ "Price Range":"价格范围",
+ "All":"全部",
+ "Most Purchased":"最畅销",
+ "Total":"总计",
+ "items":"项目",
+ "Your All Order total is :":"您的所有订单总额是:",
+ "order_code":"订单代码",
+ "order_total":"订单总额",
+ "payment_status":"支付状态",
+ "order_status":"订单状态",
+ "Sign In":"登录",
+ "Email":"电子邮件",
+ "or Register":"或注册",
+ "Create Account":"创建账户",
+ "Name":"名字",
+ "or login":"或登录",
+ "Hello, Friend!":"你好,朋友!",
+ "Register with your personal details to use all of site features":"使用您的个人详细信息注册以使用所有站点功能",
+ "Welcome Back!":"欢迎回来!",
+ "Enter your personal details to use all of site features":"输入您的个人详细信息以使用所有站点功能",
+ "Sign Up":"注册",
+ "cart":"购物车",
+ "Loaction":"位置",
+ "Add To Cart":"加入购物车",
+ "Category":"类别",
+ "Description":"描述",
+ "Price":"价格",
+ "Quantity":"数量",
+ "Purchasing Count":"购买次数",
+ "product Highlight":"产品亮点",
+ "product Most Purchase":"产品最畅销",
+ "Delete":"删除",
+ "Delete the Item":"删除项目",
+ "Are you sure to delete this Item":"您确定要删除此项目吗",
+ "Yes":"是",
+ "No":"否",
+ "Delivery Fees":"配送费用",
+ "Checkout":"结帐",
+ "Sub Total":"小计",
+ "CartInfo":"购物车信息",
+ "Details":"详情",
+ "Billing Address":"账单地址",
+ "Pay with":"支付方式",
+ "Phone":"电话",
+ "phone": "电话",
+ "Note":"备注",
+ "Building Number":"建筑号码",
+ "Zone Number":"区号",
+ "Shipping Address":"送货地址",
+ "Proceed To Payment":"继续付款",
+ "Back to cart":"返回购物车",
+ "Loading...":"加载中...",
+ "Review":"评论",
+ "back to Details":"返回详情",
+ "Online":"在线",
+ "Cash On Delivery":"货到付款",
+ "Payment Method":"支付方式",
+ "zone":"区",
+ "building":"建筑号码",
+ "note":"备注",
+ "dashed":"虚线",
+ "Phone is required":"需要电话",
+ "Zone is required":"需要区号",
+ "note is required":"需要备注",
+ "Building is required":"需要建筑号码",
+ "Please Login First":"请先登录",
+ "failed_to_add_data":"添加数据失败",
+ "Deleted":"已删除",
+ "please_login_first":"请先登录",
+ "updated_successfully":"更新成功",
+ "failed_to_update_data":"更新数据失败",
+ "Error updating product quantity":"更新产品数量时出错",
+ "Product quantity updated successfully":"产品数量更新成功",
+ "Your Data in proccess":"您的数据正在处理中",
+ "added to cart":"已加入购物车",
+ "message_send_successfully":"消息发送成功",
+ "please_fill_all_input":"请填写所有输入项",
+ "Loading Your Order":"加载您的订单",
+ "Total paid":"总支付",
+ "Free":"免费",
+ "Invoice Date":"发票日期",
+ "System Number":"系统编号",
+ "Discount":"折扣",
+ "Order Details":"订单详情",
+ "Order Code":"订单代码",
+ "Receipt":"收据",
+ "Thanks for your Order":"感谢您的订单",
+ "Delivery Charges":"配送费用",
+ "Buy Again":"再次购买",
+ "Thank You for Try and hope to make another one":"感谢您的尝试,希望再来一次",
+ "Successfully Purchased Order!":"成功购买订单!",
+ "empty":"空",
+ "Sorry, your cart is":"抱歉,您的购物车是",
+ "added to favourite":"已加入收藏",
+ "Removed From Favourite":"已从收藏中移除",
+ "view cart":"查看购物车",
+ "favourite":"收藏",
+ "Become Partner":"成为合作伙伴",
+ "Coin Price":"硬币价格",
+ "Coin Description":"硬币描述",
+ "Coin Name":"硬币名称",
+ "enter Coin description":"输入硬币描述",
+ "enter Coin Name":"输入硬币名称",
+ "enter coin price":"输入硬币价格",
+ "contactUs": {
+ "title": "联系我们",
+ "sendYourMessage": "发送您的信息,它将自动发送到我的 Gmail",
+ "name": "名字",
+ "enterYourName": "输入您的名字",
+ "email": "电子邮件",
+ "enterYourEmail": "输入您的电子邮件",
+ "message": "信息",
+ "typeYourMessage": "在此输入您的信息",
+ "submit": "提交",
+ "emailSentSuccess": "邮件发送成功!"
+ },
+ "Lowest Price":"最低价格",
+ "products":"产品",
+ "high quality products":"高质量产品",
+ "Work Time":"工作时间",
+ "Online 24 hour":"在线 24 小时",
+ "Send your Coins and it will be automatically sent to my Gmail":"发送您的硬币,它将自动发送到我的 Gmail",
+ "ClearIMageCoins2": "清除硬币图像2",
+ "ClearIMageCoins": "清除硬币图像",
+ "upload_image": "上传图片",
+ "Your Email has been verfied successfully": "您的邮箱已成功验证",
+ "You can continue using the website": "您可以继续使用该网站",
+ "cVerify Code Sent to Email": "验证码已发送到您的邮箱,请验证",
+ "Please enter the verification code sent to your email to complete the verification process": "请输入发送到您邮箱的验证码以完成验证过程。",
+ "Resend Code": "重新发送验证码",
+ "Verification code is invalid": "验证码无效",
+ "Verified Successfully": "验证成功",
+ "Invalid Code": "无效代码",
+ "Code has been send successfully": "验证码已成功发送",
+ "Code has been send successfully to your email": "验证码已成功发送到您的邮箱",
+ "Error while sending code plaese try agian later": "发送验证码时出错,请稍后再试",
+ "Please verify your email": "请验证您的邮箱",
+ "Failed to send code please try again": "发送验证码失败,请重试",
+ "Failed to submit code please try again": "提交验证码失败,请重试",
+ "Privacy": "隐私",
+ "Privacy Policy": "隐私政策",
+ "View": "查看",
+ "Sort by": "排序方式",
+ "Searching for": "搜索",
+ "48 results found": "找到48个结果",
+ "Option": "选项",
+ "Brand": "品牌",
+ "Ratings": "评分",
+ "Featured": "特色",
+ "In Stock": "有库存",
+ "On Sale": "正在销售",
+ "Add To Favourite": "添加到收藏",
+ "title": "特色产品",
+ "pending": "待处理",
+ "canceled": "已取消",
+ "accepted": "已接受",
+ "delivering": "正在配送",
+ "delivered": "已送达",
+ "My WishList": "我的愿望清单",
+ "Social Media": "社交媒体",
+ "Contact": "联系方式",
+ "Company name": "公司名称",
+ "logged in successfully": "登录成功",
+ "partner": "合作伙伴",
+ "ClearIMages": "清除图像",
+ "Prouduct Name": "产品名称",
+ "Product Description": "产品描述",
+ "Product Price": "产品价格",
+ "enter Product price": "输入产品价格",
+ "enter Product description": "输入产品描述",
+ "enter Product Name": "输入产品名称",
+ "Get connected with us on social networks": "在社交网络上与我们联系",
+ "This page could not be found": "找不到此页面",
+ "Fast_Delivery": "快速送货",
+ "upolad_an_image": "上传图片",
+ "Relevance": "相关性",
+ "Date": "日期",
+ "Price To Low": "价格从低到高",
+ "Price To High": "价格从高到低",
+ "Black Friday Sales Left": "黑色星期五促销剩余",
+ "PAY ONLY FOR YOUR LOVING ELECTRONICS": "只为您喜欢的电子产品付费",
+ "Country": "国家",
+ "Male": "男",
+ "Female": "女",
+ "Gender": "性别",
+ "Join Our Family": "加入我们的家庭",
+ "Become Rider": "成为骑手",
+ "Order Info": "订单信息",
+ "Your Personal Information": "您的个人信息",
+ "Become A Star": "成为明星",
+ "Market Place": "市场",
+ "Valid Commercial Registration": "有效的商业注册",
+ "Selection Type": "选择类型",
+ "stores": "商店",
+ "Birthday": "生日",
+ "is requierd": "是必需的",
+ "user": "用户",
+ "role": "角色",
+ "FAQS": "常见问题",
+ "help": "帮助",
+ "DM is the one of the world’s largest online shops that providing over 1500 headphones for its costumers from over 80 countries": "DM是世界上最大的在线商店之一,为来自80多个国家的客户提供超过1500种耳机",
+ "info": "信息",
+ "Headphones": "耳机",
+ "Earphones": "耳塞",
+ "Sign up for News and updates": "注册获取新闻和更新",
+ "Buy Now": "立即购买",
+ "View all": "查看全部",
+ "New Products": "新产品",
+ "Premium Design": "高级设计",
+ "When you want to take your music anywhere, you need headphones built to keep up. With impact-resistant materials, glass-filled nylon, and corrosion-resistant stainless steel, they’re engineered to survive life on the go": "当你想随时随地享受音乐时,你需要能够跟上你步伐的耳机。采用抗冲击材料、玻璃填充尼龙和耐腐蚀不锈钢制成,专为适应移动生活而设计",
+ "Bose Headphones": "Bose耳机",
+ "Smarter than your average headphones": "比普通耳机更智能",
+ "Shop now": "立即购物",
+ "Perfect sound immersive world": "完美音质,身临其境的世界",
+ "QuietComfort 35 wireless headphones II are engineered with renowned noise cancellation. With the Google Assistant and Amazon Alexa built-in, you have instant access to millions of songs, playlists and more—hands free": "QuietComfort 35无线耳机II采用著名的降噪技术设计。内置Google Assistant和Amazon Alexa,您可以立即访问数百万首歌曲、播放列表和更多内容—无需动手",
+ "Best Sale": "最佳销售",
+ "Enjoy up to 20 hours of listening, enough time to pore through this entire playlist. So you can keep the music — or the quiet — going all day long. And when it finally runs down, a quick 15-minute charge gives you another 2.5 hours": "享受长达20小时的聆听时间,足够让你浏览整个播放列表。这样你可以整天保持音乐或安静。当它最终耗尽电量时,快速充电15分钟可以再提供2.5小时的聆听时间",
+ "Up to 20 hours battery life": "电池续航时间长达20小时",
+ "Frequently Asked Questions": "常见问题",
+ "Table of Contents": "目录",
+ "Billing": "结算",
+ "Services": "服务",
+ "Trusts & Safety": "信任与安全",
+ "General": "常规",
+ "If you need assistance with your purchase or have any questions, our dicated customer is here to help. You out to us through the contact page on our website, and we'll be happy to assist you promptly": "如果您在购买过程中需要帮助或有任何疑问,我们的专职客户服务团队在这里为您提供帮助。您可以通过我们网站的联系页面与我们联系,我们会很乐意及时为您提供帮助",
+ "Yes, DM provides a warranty on all eligible products. The specific warranty details may vary depending on the manufacturer and product category. Please refer to the product description or contact our customer support for more information": "是的,DM对所有符合条件的产品提供保修。具体保修细节可能因制造商和产品类别而异。请参阅产品描述或联系我们的客户支持以获取更多信息",
+ "You can actively engage with the magazine content by leaving comments and participating in the question-and-answer section. Feel free to share your thoughts, ask questions, and interact with enthusiastsin the community": "您可以通过发表评论和参与问答部分积极参与杂志内容。随时分享您的想法,提出问题,与社区中的爱好者互动",
+ "Yes, DM offers the option to purchase products using both cash and installment payments. This allows you to choose the payment method that suits your needs and budget": "是的,DM提供现金和分期付款两种购买方式。这样您可以选择适合您的需求和预算的付款方式",
+ "How can I get assistance with my purchase or any other inquiries?": "我如何获取购买帮助或其他咨询?",
+ "Is DM a secure platform for online shopping?": "DM是一个安全的在线购物平台吗?",
+ "Does DM offer a warranty on its products?": "DM对其产品提供保修吗?",
+ "How can I engage with the magazine content on DM?": "我如何参与DM的杂志内容?",
+ "Can I purchase products from DM using installment payments?": "我可以使用分期付款从DM购买产品吗?",
+ "About Us": "关于我们",
+ "WE ARE DM GROUP": "我们是DM集团",
+ "We are DM company, which has been working for two decades. We are active in the United Arab Emirates in the field of stock laptops, computer parts, RAM, hard drives, etc. We are currently working with Europe, Africa and the Middle East.We provide you the best services with the shortest time and the highest quality": "我们是DM公司,已经运营了二十年。我们在阿拉伯联合酋长国活跃于库存笔记本电脑、电脑配件、RAM、硬盘等领域。目前我们与欧洲、非洲和中东合作。我们为您提供最优质的服务,最短的时间和最高的质量",
+ "YOU CAN FIND US IN": "您可以在以下地方找到我们",
+ "Telegram ID": "电报ID",
+ "Instagram": "Instagram",
+ "LinkedIn": "LinkedIn",
+ "Whatsapp": "Whatsapp",
+ "We love meeting new people and helping them": "我们喜欢认识新朋友并帮助他们",
+ "* Your Name": "* 您的姓名",
+ "* Email": "* 电子邮件",
+ "Message": "消息",
+ "Need Helps ?": "需要帮助?",
+ "Enter your model name": "输入您的型号名称",
+ "Wish List": "愿望清单",
+ "Orders": "订单",
+ "Back": "返回",
+ "Profile": "个人资料",
+ "Grand Total": "总计",
+ "Back To Shopping": "返回购物",
+ "Cart": "购物车",
+ "Search Product Name": "搜索产品名称",
+ "not found data": "未找到数据 :(",
+ "Product": "产品",
+ "Similar Products": "类似产品",
+ "Filters": "过滤器",
+ "Clear All": "清除所有",
+ "Connectivity": "连接性",
+ "Wearing Style": "佩戴风格",
+ "discount": "折扣",
+ "new Arrivals": "新到货",
+ "descending": "降序",
+ "ascending": "升序",
+ "Account": "帐户",
+ "Personal Data": "个人数据",
+ "Security and access": "安全和访问",
+ "Wishlist": "愿望清单",
+ "state": "状态",
+ "coupon": "优惠券",
+ "total": "总计",
+ "order code": "订单代码",
+ "Current": "当前",
+ "You have not placed any orders yet": "您还没有下过任何订单",
+ "Change password and phone number": "更改密码和电话号码",
+ "Security settings": "安全设置",
+ "See your favorites list here": "在这里查看您的收藏列表",
+ "Change Password": "更改密码",
+ "Quite Comfort 35 wireless headphones II":"相當舒適 35 無線耳機 II",
+
+ "Verify": "验证",
+ "Create Your Account": "创建您的账户",
+ "Log In To DM": "登录到 DM",
+ "Verify Your Account": "验证您的账户",
+ "E-mail": "电子邮件",
+ "Full Name": "全名",
+ "verify code": "验证代码",
+ "verify": "验证",
+ "sub_categories": "子类别",
+ "Clear_All": "清除所有"
+}
\ No newline at end of file
diff --git a/src/translate/en.json b/src/translate/en.json
new file mode 100755
index 0000000..e4114e6
--- /dev/null
+++ b/src/translate/en.json
@@ -0,0 +1,390 @@
+{
+ "Ar": "AR",
+ "ch": "CH",
+ "Ch": "CH",
+ "En": "EN",
+ "ar": "AR",
+ "en": "EN",
+ "Arabic":"Arabic",
+"English":"English",
+"Chinese":"Chinese",
+ "Login":"Login",
+ "Username":"Username",
+ "Password":"Password",
+ "Sign in":"Sign in",
+ "unknown":"unknown",
+"admin":"admin",
+"Home":"Home",
+"example":"example",
+"Log Out" : "Log Out" ,
+"Example":"Example",
+"Add":"Add",
+"username":"Username",
+"password":"Password",
+"name":"Name",
+"email":"Email",
+"cancel":"Cancel",
+"edit":"Edit",
+"light":"Light Mode",
+"dark":"Dark Mode",
+"delete_are_you_sure":"Delete Are You Sure",
+"no_revert":"no Revert",
+"yes_delete_it":"Yes Delete it",
+"Categories":"Categories",
+"home":"home",
+"about":"About",
+"contact":"contact",
+"Products":"Products",
+"See more":"See more",
+"Purchase":"Purchase",
+"Highlight":"Highlight",
+"NEW ARRIVALS":"NEW ARRIVALS",
+"SUMMER SALE":"SUMMER SALE",
+"20% OFF":"20% OFF",
+"Shop Now":"Shop Now",
+"Weekend Sale":"Weekend Sale",
+"Fine Smart Speaker":"Fine Smart Speaker",
+"Starting at":"Starting at ",
+"Fast Delivery":"Fast Delivery",
+"Start from $10":"Start from $10",
+"Money Guarantee":"Money Guarantee",
+"7 Days Back":"7 Days Back",
+"365 Days":"365 Days",
+"For free return":"For free return",
+"Payment":"Payment",
+"Secure system":"Secure system",
+"Final Reduction":"Final Reduction",
+"Sale up to 20% Off":"Sale up to 20% Off",
+"Only From ":"Only From ",
+"Search here":"Search here",
+"Logout":"Logout",
+"orders":"orders",
+"About us":"About us",
+"Contact us":"Contact us",
+"Our Social Networks:":"Our Social Networks:",
+"Useful links":"Useful links",
+"Syria":"Syria",
+"Damascus":"Damascus",
+"Mazzeh":"Mazzeh",
+"Copyright":"Copyright",
+"Who are we":"Who are we",
+"UboutUsINfo":" Us: Experts in numismatics. Coins and numismatics are our passion. We would like to share this with you. Whether in gold, silver or bronze: coins are so much more than heads or tails. They are an expression of history and a good investment. Finding your way in the world of coins requires knowledge, experience and reputability. We offer all of these things, acting for you competently and individually. Are you looking for experts in Greek, Roman, Byzantine, medieval or modern numismatics? You are in the right place. Auctions: The hour of coins. Spring and autumn are the seasons for coins to shine. In these seasons, buyers, art enthusiasts and collectors alike find themselves at Leu auctions in Zurich to experience the change in ownership of selected rarities and numismatic specialities.These treasures are published in high quality catalogues, which receive the attention of an international clientele. A thrilling experience for every coin lover.",
+
+"Contact Us" : "Contact Us",
+"Send your message and it will be automatically sent to my Gmail" : "Send your message and it will be automatically sent to my Gmail",
+"Your Name" : "Your Name",
+"enter Your Name" : "enter Your Name",
+"Your Email" : "Your Email",
+"enter Your Email" : "enter Your Email",
+"Your Message" : "Your Message",
+"type Your Message" : "type Your Message",
+"Submit" : "Submit",
+
+"ProductsFilter":"ProductsFilter",
+"Filter":"Filter",
+"Price Range":"Price Range",
+"All":"All",
+"Most Purchased":"Most Purchased",
+"Total":"Total",
+"items":"items",
+"Your All Order total is :":"Your All Order total is :",
+"order_code":"Order Code",
+"order_total":"Order Total",
+"payment_status":"Payment Status",
+"order_status":"Order Status",
+"Sign In":"Sign In",
+"Email":"Email",
+"or Register":"or Register",
+"Create Account":"Create Account",
+"Name":"Name",
+"or login":"or login",
+"Hello, Friend!":"Hello, Friend!",
+"Register with your personal details to use all of site features":"Register with your personal details to use all of site features",
+"Welcome Back!":"Welcome Back!",
+"Enter your personal details to use all of site features":"Enter your personal details to use all of site features",
+"Sign Up":"Sign Up",
+"cart":"Cart",
+"Loaction":"Loaction",
+"Add To Cart":"Add To Cart",
+
+"Category":"Category",
+"Description":"Description",
+"Price":"Price",
+"Quantity":"Quantity",
+"Purchasing Count":"Purchasing Count",
+"product Highlight":"product Highlight",
+"product Most Purchase":"product Most Purchase",
+
+"Delete":"Delete",
+"Delete the Item":"Delete the Item",
+"Are you sure to delete this Item":"Are you sure to delete this Item",
+"Yes":"Yes",
+"No":"No",
+"Delivery Fees":"Delivery Fees",
+"Checkout":"Checkout",
+"Sub Total":"Sub Total",
+"CartInfo":"CartInfo",
+"Details":"Details",
+"Billing Address":"Billing Address",
+"Pay with":"Pay with",
+"Phone":"Phone",
+"phone": "Phone",
+"Note":"Note",
+"Building Number":"Building Number",
+"Zone Number":"Zone Number",
+"Shipping Address":"Shipping Address",
+"Proceed To Payment":"Proceed To Payment",
+"Back to cart":"Back to cart",
+"Loading...":"Loading...",
+"Review":"Review",
+"back to Details":"back to Details",
+"Online":"Online",
+"Cash On Delivery":"Cash On Delivery",
+"Payment Method":"Payment Method",
+"zone":"Zone",
+"building":"Building Number",
+"note":"Note",
+"dashed":"dashed",
+"Phone is required":"Phone is required",
+"Zone is required":"Zone is required",
+"note is required":"Note is required",
+"Building is required":"Building Number is required",
+
+"Please Login First":"Please Login First",
+"failed_to_add_data":"Failed to add data",
+"Deleted":"Deleted",
+"please_login_first":"Please Login First",
+"updated_successfully":"Updated successfully",
+"failed_to_update_data":"Failed to update data",
+"Error updating product quantity":"Error updating product quantity",
+"Product quantity updated successfully":"Product quantity updated successfully",
+"Your Data in proccess":"Your Data in proccess",
+"added to cart":"added to cart",
+"message_send_successfully":"Message send successfully",
+"please_fill_all_input":"please_fill_all_input",
+"Loading Your Order":"Loading Your Order",
+"Total paid":"Total paid",
+"Free":"Free",
+"Invoice Date":"Invoice Date",
+"System Number":"System Number",
+"Discount":"Discount",
+"Order Details":"Order Details",
+"Order Code":"Order Code",
+"Receipt":"Receipt",
+"Thanks for your Order":"Thanks for your Order",
+"Delivery Charges":"Delivery Charges",
+
+"Buy Again":"Buy Again",
+"Thank You for Try and hope to make another one":"Thank You for Try and hope to make another one",
+"Successfully Purchased Order!":"Successfully Purchased Order!",
+
+"empty":"empty",
+"Sorry, your cart is":"Sorry, your cart is",
+"added to favourite":"Added to favourite",
+"Removed From Favourite":"Removed From Favourite",
+"view cart":"view cart",
+"favourite":"Favourite",
+"Become Partner":"Become Partner",
+"Coin Price":"Coin Price",
+"Coin Description":"Coin Description",
+"Coin Name":"Coin Name",
+"enter Coin description":"enter Coin description",
+"enter Coin Name":"enter Coin Name",
+"enter coin price":"enter coin price",
+
+"contactUs": {
+ "title": "Contact Me",
+ "sendYourMessage": "Send your message and it will be automatically sent to my Gmail",
+ "name": "Name",
+ "enterYourName": "Enter your name",
+ "email": "Email",
+ "enterYourEmail": "Enter your email",
+ "message": "Message",
+ "typeYourMessage": "Type your message here",
+ "submit": "Submit",
+ "emailSentSuccess": "Email sent successfully!"
+},
+"Lowest Price":"Lowest Price",
+"products":"products",
+"high quality products":"high quality products",
+"Work Time":"Work Time",
+"Online 24 hour":"Online 24 hour",
+"Send your Coins and it will be automatically sent to my Gmail":"Send your Coins and it will be automatically sent to my Gmail",
+
+"ClearIMageCoins2":"Clear Coins image 2",
+"ClearIMageCoins":"Clear Coins image",
+"upload_image":"Upload image",
+"Your Email has been verfied successfully":"Your Email has been verfied successfully",
+"You can continue using the website":"You can continue using the website",
+"cVerify Code Sent to Email":"Code Send to your Email Verified it",
+"Please enter the verification code sent to your email to complete the verification process":"Please enter the verification code sent to your email to complete the verification process.",
+"Resend Code":"Resend Code",
+"Verification code is invalid":"Verification code is invalid",
+"Verified Successfully":"Verified Successfully",
+"Invalid Code":"Invalid Code",
+"Code has been send successfully":"Code has been send successfully",
+"Code has been send successfully to your email":"Code has been send successfully to your email",
+"Error while sending code plaese try agian later":"Error while sending code plaese try agian later",
+"Please verify your email":"Please verify your email",
+"Failed to send code please try again":"Failed to send code please try again",
+"Failed to submit code please try again":"Failed to submit code please try again",
+"Privacy":"Privacy",
+"Privacy Policy":"Privacy Policy",
+"View":"View",
+"Sort by":"Sort by",
+"Searching for":"Searching for",
+"48 results found":"48 results found",
+"Option":"Option",
+"Brand":"Brand",
+"Ratings":"Ratings",
+"Featured":"Featured",
+"In Stock":"In Stock",
+"On Sale":"On Sale",
+"Add To Favourite":"Add To Favourite",
+"title":"Featured Products",
+
+"pending":"Pending",
+"canceled":"Canceled",
+"accepted":"Accepted",
+"delivering":"Delivering",
+"delivered":"Delivered",
+"My WishList":"My WishList",
+"Social Media":"Social Media",
+"Contact":"Contact info",
+"Company name":"Company name",
+"logged in successfully":"Logged in successfully",
+"partner":"Partners",
+"ClearIMages":"Clear Images",
+"Prouduct Name":"Product Name",
+"Product Description":"Product Description",
+"Product Price":"Product Price",
+"enter Product price":"enter Product price",
+"enter Product description":"enter Product description",
+"enter Product Name":"enter Product Name",
+"Get connected with us on social networks":"Get connected with us on social networks",
+"This page could not be found":"This page could not be found",
+"Fast_Delivery":"Fast Delivery",
+"upolad_an_image": "upload an image",
+"Relevance": "Relevance",
+"Date": "Date",
+"Price To Low": "Price To Low",
+"Price To High": "Price To High",
+"Black Friday Sales Left": "Black Friday Sales Left",
+"PAY ONLY FOR YOUR LOVING ELECTRONICS" : "PAY ONLY FOR YOUR LOVING ELECTRONICS",
+"Country": "Country",
+"Male":"Male",
+"Female":"Female",
+"Gender":"Gender",
+"Join Our Family":"Join Our Family",
+"Become Rider":"Become Rider",
+"Order Info":"Order Info",
+"Your Personal Information":"Your Personal Information",
+"Become A Star":"Become A Star",
+"Market Place":"Market Place",
+"Valid Commercial Registration":"Valid Commercial Registration",
+"Selection Type":"Selection Type",
+"stores": "stores",
+"Birthday":"Birthday",
+"is requierd":"is required",
+"user":"User",
+"role":"role",
+
+"FAQS":"FAQS",
+"help":"Help",
+"DM is the one of the world’s largest online shops that providing over 1500 headphones for its costumers from over 80 countries":"DM is the one of the world’s largest online shops that providing over 1500 headphones for its costumers from over 80 countries",
+"info":"Info",
+"Headphones":"Headphones",
+"Earphones":"Earphones",
+"Sign up for News and updates":"Sign up for News and updates",
+"Buy Now":"Buy Now",
+"View all":"View all",
+"New Products":"New Products",
+"Premium Design":"Premium Design",
+"When you want to take your music anywhere, you need headphones built to keep up. With impact-resistant materials, glass-filled nylon, and corrosion-resistant stainless steel, they’re engineered to survive life on the go":"When you want to take your music anywhere, you need headphones built to keep up. With impact-resistant materials, glass-filled nylon, and corrosion-resistant stainless steel, they’re engineered to survive life on the go",
+"Bose Headphones":"Bose Headphones",
+"Smarter than your average headphones":"Smarter than your average headphones",
+"Shop now":"Shop now",
+"Perfect sound immersive world":"Perfect sound immersive world",
+"QuietComfort 35 wireless headphones II are engineered with renowned noise cancellation. With the Google Assistant and Amazon Alexa built-in, you have instant access to millions of songs, playlists and more—hands free":"QuietComfort 35 wireless headphones II are engineered with renowned noise cancellation. With the Google Assistant and Amazon Alexa built-in, you have instant access to millions of songs, playlists and more—hands free",
+"Best Sale":"Best Sale",
+"Enjoy up to 20 hours of listening, enough time to pore through this entire playlist. So you can keep the music — or the quiet — going all day long. And when it finally runs down, a quick 15-minute charge gives you another 2.5 hours":"Enjoy up to 20 hours of listening, enough time to pore through this entire playlist. So you can keep the music — or the quiet — going all day long. And when it finally runs down, a quick 15-minute charge gives you another 2.5 hours",
+"Up to 20 hours battery life":"Up to 20 hours battery life",
+"Frequently Asked Questions":"Frequently Asked Questions",
+"Table of Contents":"Table of Contents",
+"Billing":"Billing",
+"Services":"Services",
+"Trusts & Safety":"Trusts & Safety",
+"General":"General",
+"If you need assistance with your purchase or have any questions, our dicated customer is here to help. You out to us through the contact page on our website, and we'll be happy to assist you promptly":"If you need assistance with your purchase or have any questions, our dicated customer is here to help. You out to us through the contact page on our website, and we'll be happy to assist you promptly",
+"Yes, DM provides a warranty on all eligible products. The specific warranty details may vary depending on the manufacturer and product category. Please refer to the product description or contact our customer support for more information":"Yes, DM provides a warranty on all eligible products. The specific warranty details may vary depending on the manufacturer and product category. Please refer to the product description or contact our customer support for more information",
+"You can actively engage with the magazine content by leaving comments and participating in the question-and-answer section. Feel free to share your thoughts, ask questions, and interact with enthusiastsin the community":"You can actively engage with the magazine content by leaving comments and participating in the question-and-answer section. Feel free to share your thoughts, ask questions, and interact with enthusiastsin the community",
+"Yes, DM offers the option to purchase products using both cash and installment payments. This allows you to choose the payment method that suits your needs and budget":"Yes, DM offers the option to purchase products using both cash and installment payments. This allows you to choose the payment method that suits your needs and budget",
+"How can I get assistance with my purchase or any other inquiries?":"How can I get assistance with my purchase or any other inquiries?",
+"Is DM a secure platform for online shopping?":"Is DM a secure platform for online shopping?",
+"Does DM offer a warranty on its products?":"Does DM offer a warranty on its products?",
+"How can I engage with the magazine content on DM?":"How can I engage with the magazine content on DM?",
+"Can I purchase products from DM using installment payments?":"Can I purchase products from DM using installment payments?",
+"About Us":"About Us",
+"WE ARE DM GROUP":"WE ARE DM GROUP",
+"We are DM company, which has been working for two decades. We are active in the United Arab Emirates in the field of stock laptops, computer parts, RAM, hard drives, etc. We are currently working with Europe, Africa and the Middle East.We provide you the best services with the shortest time and the highest quality":"We are DM company, which has been working for two decades. We are active in the United Arab Emirates in the field of stock laptops, computer parts, RAM, hard drives, etc. We are currently working with Europe, Africa and the Middle East.We provide you the best services with the shortest time and the highest quality",
+"YOU CAN FIND US IN":"YOU CAN FIND US IN",
+"Telegram ID":"Telegram ID",
+"Instagram":"Instagram",
+"LinkedIn":"LinkedIn",
+"Whatsapp":"Whatsapp",
+"We love meeting new people and helping them":"We love meeting new people and helping them",
+"* Your Name":"* Your Name",
+"* Email":"* Email",
+"Message":"Message",
+"Need Helps ?":"Need Helps ?",
+"Enter your model name":"Enter your model name",
+"Wish List":"Wish List",
+"Orders":"Orders",
+"Back":"Back",
+"Profile":"Profile",
+"Grand Total":"Grand Total",
+"Back To Shopping":"Back To Shopping",
+"Cart":"Cart",
+"Search Product Name":"Search Product Name",
+"not found data":"Data Not Found :( ",
+"Product":"Product",
+"Similar Products":"Similar Products",
+"Filters":"Filters",
+"Clear All":"Clear All",
+"Connectivity":"Connectivity",
+"Wearing Style":"Wearing Style",
+"discount":"discount",
+"new Arrivals":"new Arrivals",
+"descending":"descending",
+"ascending":"ascending",
+"Account":"Account",
+"Personal Data":"Personal Data",
+"Security and access":"Security and access",
+"Wishlist":"Wishlist",
+"state":"state",
+"coupon":"coupon",
+"total":"total",
+"order code":"order code",
+"Current":"Current",
+"You have not placed any orders yet":"You have not placed any orders yet",
+"Change password and phone number":"Change password and phone number",
+"Security settings":"Security settings",
+"See your favorites list here":"See your favorites list here",
+"Change Password":"Change Password",
+"Quite Comfort 35 wireless headphones II":"Quite Comfort 35 wireless headphones II",
+
+
+"Verify":"Verify",
+"Create Your Account":"Create Your Account",
+"Log In To DM":"Log In To DM",
+"Verify Your Account":"Verify Your Account",
+"E-mail":"E-mail",
+"Full Name":"Full Name",
+"verify code":"Verify Code",
+"verify":"Verify",
+"Login / Sign Up":"Login / Sign Up",
+ "sub_categories": "sub categories",
+ "Clear_All": "Clear All"
+
+
+}
\ No newline at end of file
diff --git a/src/types/App.ts b/src/types/App.ts
new file mode 100644
index 0000000..3f63d7e
--- /dev/null
+++ b/src/types/App.ts
@@ -0,0 +1,19 @@
+import { ReactElement, LazyExoticComponent, ReactNode } from "react";
+
+export type TRoute = {
+ path: string;
+ header: string;
+ element: ReactElement | LazyExoticComponent;
+ withLayout?: boolean;
+};
+
+export type Tchildren = {
+ children: ReactNode;
+};
+
+export type THeaderLink = {
+ text: string;
+ isMulti?:boolean,
+ extraText?:string,
+ extraLink?:string,
+};
\ No newline at end of file
diff --git a/src/types/Cart.ts b/src/types/Cart.ts
new file mode 100644
index 0000000..52fda1d
--- /dev/null
+++ b/src/types/Cart.ts
@@ -0,0 +1,13 @@
+export type TProduct = {
+ id: number;
+ name: string;
+ img: string;
+ rate: number;
+ price: number;
+ old_price: number;
+ off: number;
+ brand: string;
+ description: string;
+ type: string;
+ count: number;
+};
diff --git a/src/types/ChangeMode.ts b/src/types/ChangeMode.ts
new file mode 100644
index 0000000..36195e3
--- /dev/null
+++ b/src/types/ChangeMode.ts
@@ -0,0 +1,13 @@
+
+export type TChangeMode = {
+ ChangeModeFunction?:any
+ ChangeFunctionAttr:string
+};
+
+export type TModeIcon = {
+ onClickFunction: () => void;
+ src?: string;
+ modeText: string;
+ isImage?: boolean;
+ icon?: JSX.Element;
+}
\ No newline at end of file
diff --git a/src/types/Socket.ts b/src/types/Socket.ts
new file mode 100644
index 0000000..3d6e456
--- /dev/null
+++ b/src/types/Socket.ts
@@ -0,0 +1,4 @@
+export interface Message {
+ type: "incoming" | "outgoing";
+ text: string;
+}
diff --git a/src/types/item.ts b/src/types/item.ts
new file mode 100644
index 0000000..78a071f
--- /dev/null
+++ b/src/types/item.ts
@@ -0,0 +1,79 @@
+export interface Translation {
+ en: string;
+ ar: string;
+ de: string;
+}
+
+export interface Category {
+ id: number;
+ name: Translation;
+ parent_id: number | null;
+ parent: Category | null;
+ photo: string;
+ product_count: number;
+}
+
+export interface BaseProduct {
+ id: number;
+ category_id: number;
+ category: Category;
+ name: Translation;
+ info: string | null;
+ product_count: number;
+}
+
+export interface ProductImage {
+ id: number;
+ path: string;
+ product_id: number;
+ created_at: string;
+ updated_at: string;
+}
+
+export interface ProductAttributeValue {
+ id: number;
+ attribute_id: number;
+ value: Translation;
+ image: string | null;
+}
+
+export interface Attribute {
+ id: number;
+ name: Translation;
+ type: string;
+ icon: string | null;
+ category_id: number;
+ Attribute_values: ProductAttributeValue[];
+}
+
+export interface ProductAttribute {
+ attribute: Attribute;
+ value: ProductAttributeValue;
+}
+
+export interface Product {
+ id: number;
+ name: Translation;
+ price: number;
+ main_photo: string;
+ images: ProductImage[];
+ category: Category;
+ description: Translation;
+ info: any | null; // Adjust this type based on the actual structure if available
+ video: string | null;
+ base_product_id: number;
+ favorite: boolean;
+ count_of_favorites: number;
+ total_quantity_ordered: number;
+ attributes: ProductAttribute[];
+ other_attributes: any | null; // Adjust this type based on the actual structure if available
+}
+
+export interface MainData {
+ id: number;
+ category: Category;
+ product: Product;
+ name: Translation;
+ info: any | null; // Adjust this type based on the actual structure if available
+ products: Product[];
+}
diff --git a/src/ui/CustomImage.tsx b/src/ui/CustomImage.tsx
new file mode 100644
index 0000000..a53ecc7
--- /dev/null
+++ b/src/ui/CustomImage.tsx
@@ -0,0 +1,33 @@
+import React, { useState, useEffect } from "react";
+import { ImageBaseURL } from "../api/utils/config";
+
+interface ImageProps extends React.ImgHTMLAttributes {
+ src: string;
+}
+
+const CustomImage: React.FC = ({ src, ...props }) => {
+ const addBaseUrlToSrc = (src: string) => {
+ return ImageBaseURL + src?.replace("public", "/storage");
+ };
+
+ const [imgSrc, setImgSrc] = useState(addBaseUrlToSrc(src));
+
+ useEffect(() => {
+ setImgSrc(addBaseUrlToSrc(src));
+ }, [src]);
+
+ const handleError = () => {
+ setImgSrc("/Home/p1.png");
+ };
+
+ return (
+
+ );
+};
+
+export default CustomImage;
diff --git a/src/utils/addBaseUrlToSrc.ts b/src/utils/addBaseUrlToSrc.ts
new file mode 100644
index 0000000..0384105
--- /dev/null
+++ b/src/utils/addBaseUrlToSrc.ts
@@ -0,0 +1,5 @@
+import { ImageBaseURL } from "../api/utils/config";
+
+export const addBaseUrlToSrc = (src: string) => {
+ return ImageBaseURL + src?.replace("public", "/storage");
+};
diff --git a/src/utils/calculateTotalPrice.ts b/src/utils/calculateTotalPrice.ts
new file mode 100644
index 0000000..e69de29
diff --git a/src/utils/firebase/firebase.ts b/src/utils/firebase/firebase.ts
new file mode 100644
index 0000000..a816f7a
--- /dev/null
+++ b/src/utils/firebase/firebase.ts
@@ -0,0 +1,91 @@
+import { initializeApp } from 'firebase/app';
+import { getMessaging, getToken, onMessage } from 'firebase/messaging';
+import { toast } from 'react-toastify';
+
+// Firebase configuration object
+const firebaseConfig = {
+ apiKey: "AIzaSyCcg92Eqrw7TzL8fBQVklVKXwuT3hu0GIQ",
+ authDomain: "dm-store-678d4.firebaseapp.com",
+ projectId: "dm-store-678d4",
+ storageBucket: "dm-store-678d4.appspot.com",
+ messagingSenderId: "91725694575",
+ appId: "1:91725694575:web:6ce7f7d0dfdf807c376f9a",
+ measurementId: "G-TZRGSK472N"
+};
+
+// Constants for local storage keys
+export const KEY_NOTIFICATION_PERMISSION = 'KEY_NOTIFICATION_PERMISSION';
+export const FCM_TOKEN_KEY = 'DM_FCM_TOKEN_KEY';
+
+// Initialize Firebase
+export const initializeFirebase = () => {
+ initializeApp(firebaseConfig);
+
+};
+
+// Request notification permission and get FCM token
+export const requestPermission = async (): Promise => {
+ initializeFirebase();
+
+ if (typeof Notification === 'undefined') {
+ console.warn('Firebase Messaging is not supported in this browser.');
+ return;
+ }
+
+ const messaging = getMessaging();
+
+ // try {
+ // const permission = await Notification.requestPermission();
+
+
+ // if (permission === "granted") {
+ const currentToken = await getToken(messaging);
+
+
+ // localStorage.setItem(KEY_NOTIFICATION_PERMISSION, 'yes');
+ localStorage.setItem(FCM_TOKEN_KEY, currentToken || '');
+ // toast.success("Notifications enabled successfully.");
+ return currentToken ;
+ // }
+ // else {
+ // localStorage.setItem(KEY_NOTIFICATION_PERMISSION, 'no');
+ // toast.error("Notifications blocked. Please enable them in your browser.");
+ // }
+ // }
+ // catch (err) {
+ // localStorage.setItem(KEY_NOTIFICATION_PERMISSION, 'no');
+ // toast.error("Can't create FCM token.");
+ // console.error('An error occurred when requesting to receive the token:', err);
+ // }
+};
+
+// Request notification permission, get FCM token, and log out
+export const requestPermissionWithLogout = async (logout: () => void): Promise => {
+ initializeFirebase();
+
+ if (typeof Notification === 'undefined' || !('serviceWorker' in navigator)) {
+ console.warn('Firebase Messaging is not supported in this browser.');
+ return;
+ }
+
+ const messaging = getMessaging();
+
+ try {
+ const permission = await Notification.requestPermission();
+ if (permission === "granted") {
+ const currentToken = await getToken(messaging, { vapidKey: 'YOUR_PUBLIC_VAPID_KEY' });
+ localStorage.setItem(KEY_NOTIFICATION_PERMISSION, 'yes');
+ localStorage.setItem(FCM_TOKEN_KEY, currentToken || '');
+ toast.success("Notifications enabled successfully.");
+ console.log('FCM Token:', currentToken);
+ logout();
+ } else {
+ localStorage.setItem(KEY_NOTIFICATION_PERMISSION, 'no');
+ toast.error("Notifications blocked. Please enable them in your browser.");
+ }
+ } catch (err) {
+ localStorage.setItem(KEY_NOTIFICATION_PERMISSION, 'no');
+ toast.error("Can't create FCM token.");
+ console.error('An error occurred when requesting to receive the token:', err);
+ }
+};
diff --git a/src/utils/jsonObjectToArray.ts b/src/utils/jsonObjectToArray.ts
new file mode 100644
index 0000000..a1dbe66
--- /dev/null
+++ b/src/utils/jsonObjectToArray.ts
@@ -0,0 +1,20 @@
+type JsonObject = { [key: string]: any };
+
+export const jsonObjectToArray = (input: string | JsonObject): Array<{ key: string, value: any }> => {
+ let obj: JsonObject;
+
+ if (typeof input === 'string') {
+ try {
+ obj = JSON.parse(input);
+ } catch (error) {
+ return [];
+ }
+ } else if (typeof input === 'object' && input !== null) {
+ obj = input;
+ } else {
+ return [];
+ }
+
+ return Object.entries(obj).map(([key, value]) => ({ key, value }));
+};
+
diff --git a/src/utils/languageObject.ts b/src/utils/languageObject.ts
new file mode 100644
index 0000000..86f1f37
--- /dev/null
+++ b/src/utils/languageObject.ts
@@ -0,0 +1,4 @@
+export const languageObject = (object: Record) => {
+ const language: string = "en";
+ return object?.[language] || object || null;
+};
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100755
index 0000000..9d379a3
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,20 @@
+{
+ "compilerOptions": {
+ "target": "es5",
+ "lib": ["dom", "dom.iterable", "esnext"],
+ "allowJs": true,
+ "skipLibCheck": true,
+ "esModuleInterop": true,
+ "allowSyntheticDefaultImports": true,
+ "strict": true,
+ "forceConsistentCasingInFileNames": true,
+ "noFallthroughCasesInSwitch": true,
+ "module": "esnext",
+ "moduleResolution": "node",
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "noEmit": true,
+ "jsx": "react-jsx"
+ },
+ "include": ["src"]
+}
diff --git a/vite.config.js b/vite.config.js
new file mode 100644
index 0000000..13493b3
--- /dev/null
+++ b/vite.config.js
@@ -0,0 +1,11 @@
+import { defineConfig } from "vite";
+import react from "@vitejs/plugin-react";
+
+export default defineConfig(() => {
+ return {
+ build: {
+ outDir: "build",
+ },
+ plugins: [react()],
+ };
+});