commit
						09070ffda8
					
				
				 129 changed files with 89428 additions and 0 deletions
			
			
		@ -0,0 +1,22 @@ | 
				
			|||||||
 | 
					module.exports = { | 
				
			||||||
 | 
					  root: true, | 
				
			||||||
 | 
					  env: { browser: true, es2020: true }, | 
				
			||||||
 | 
					  extends: [ | 
				
			||||||
 | 
					    'eslint:recommended', | 
				
			||||||
 | 
					    'plugin:react/recommended', | 
				
			||||||
 | 
					    'plugin:react/jsx-runtime', | 
				
			||||||
 | 
					    'plugin:react-hooks/recommended', | 
				
			||||||
 | 
					  ], | 
				
			||||||
 | 
					  ignorePatterns: ['dist', '.eslintrc.cjs'], | 
				
			||||||
 | 
					  parserOptions: { ecmaVersion: 'latest', sourceType: 'module' }, | 
				
			||||||
 | 
					  settings: { react: { version: '18.2' } }, | 
				
			||||||
 | 
					  plugins: ['react-refresh'], | 
				
			||||||
 | 
					  rules: { | 
				
			||||||
 | 
					    'react/jsx-no-target-blank': 'off', | 
				
			||||||
 | 
					    "react/prop-types": "off", | 
				
			||||||
 | 
					    'react-refresh/only-export-components': [ | 
				
			||||||
 | 
					      'warn', | 
				
			||||||
 | 
					      { allowConstantExport: true }, | 
				
			||||||
 | 
					    ], | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,24 @@ | 
				
			|||||||
 | 
					# Logs | 
				
			||||||
 | 
					logs | 
				
			||||||
 | 
					*.log | 
				
			||||||
 | 
					npm-debug.log* | 
				
			||||||
 | 
					yarn-debug.log* | 
				
			||||||
 | 
					yarn-error.log* | 
				
			||||||
 | 
					pnpm-debug.log* | 
				
			||||||
 | 
					lerna-debug.log* | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					node_modules | 
				
			||||||
 | 
					dist | 
				
			||||||
 | 
					dist-ssr | 
				
			||||||
 | 
					*.local | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Editor directories and files | 
				
			||||||
 | 
					.vscode/* | 
				
			||||||
 | 
					!.vscode/extensions.json | 
				
			||||||
 | 
					.idea | 
				
			||||||
 | 
					.DS_Store | 
				
			||||||
 | 
					*.suo | 
				
			||||||
 | 
					*.ntvs* | 
				
			||||||
 | 
					*.njsproj | 
				
			||||||
 | 
					*.sln | 
				
			||||||
 | 
					*.sw? | 
				
			||||||
@ -0,0 +1,8 @@ | 
				
			|||||||
 | 
					# React + Vite | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Currently, two official plugins are available: | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh | 
				
			||||||
 | 
					- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh | 
				
			||||||
@ -0,0 +1,14 @@ | 
				
			|||||||
 | 
					<!doctype html> | 
				
			||||||
 | 
					<html lang="en"> | 
				
			||||||
 | 
					  <head> | 
				
			||||||
 | 
					    <meta charset="UTF-8" /> | 
				
			||||||
 | 
					    <link rel="icon" type="image/svg+xml" href="/vite.svg" /> | 
				
			||||||
 | 
					    <meta name="viewport" content="width=device-width, initial-scale=1.0" /> | 
				
			||||||
 | 
					    <title>Vite + React</title> | 
				
			||||||
 | 
					    <script type="module" src="/tailwind.js"></script> | 
				
			||||||
 | 
					  </head> | 
				
			||||||
 | 
					  <body> | 
				
			||||||
 | 
					    <div id="root"></div> | 
				
			||||||
 | 
					    <script type="module" src="/src/main.jsx"></script> | 
				
			||||||
 | 
					  </body> | 
				
			||||||
 | 
					</html> | 
				
			||||||
@ -0,0 +1,9 @@ | 
				
			|||||||
 | 
					{ | 
				
			||||||
 | 
					  "compilerOptions": { | 
				
			||||||
 | 
					    "baseUrl": "./", | 
				
			||||||
 | 
					    "paths": { | 
				
			||||||
 | 
					      "~/*": ["src/*"], | 
				
			||||||
 | 
					      "@/*": ["public/*"] | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					} | 
				
			||||||
									
										
											File diff suppressed because it is too large
											Load Diff
										
									
								
							
						@ -0,0 +1,51 @@ | 
				
			|||||||
 | 
					{ | 
				
			||||||
 | 
					  "name": "porseline", | 
				
			||||||
 | 
					  "private": true, | 
				
			||||||
 | 
					  "version": "0.0.0", | 
				
			||||||
 | 
					  "type": "module", | 
				
			||||||
 | 
					  "scripts": { | 
				
			||||||
 | 
					    "dev": "vite", | 
				
			||||||
 | 
					    "build": "vite build", | 
				
			||||||
 | 
					    "lint": "eslint . --ext js,jsx --report-unused-disable-directives --max-warnings 0", | 
				
			||||||
 | 
					    "preview": "vite preview" | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  "dependencies": { | 
				
			||||||
 | 
					    "@vitejs/plugin-react-refresh": "^1.3.6", | 
				
			||||||
 | 
					    "axios": "^1.7.2", | 
				
			||||||
 | 
					    "bcryptjs": "^2.4.3", | 
				
			||||||
 | 
					    "framer-motion": "^11.3.8", | 
				
			||||||
 | 
					    "leaflet": "^1.9.4", | 
				
			||||||
 | 
					    "react": "^18.3.1", | 
				
			||||||
 | 
					    "react-contenteditable": "^3.3.7", | 
				
			||||||
 | 
					    "react-dom": "^18.3.1", | 
				
			||||||
 | 
					    "react-iconly": "^2.2.10", | 
				
			||||||
 | 
					    "react-loading": "^2.0.3", | 
				
			||||||
 | 
					    "react-modern-drawer": "^1.3.1", | 
				
			||||||
 | 
					    "react-redux": "^9.1.2", | 
				
			||||||
 | 
					    "react-router-dom": "^6.25.1", | 
				
			||||||
 | 
					    "react-spring-bottom-sheet": "^3.4.1", | 
				
			||||||
 | 
					    "react-toastify": "^10.0.5", | 
				
			||||||
 | 
					    "react-topbar-progress-indicator": "^4.1.1", | 
				
			||||||
 | 
					    "redux": "^5.0.1", | 
				
			||||||
 | 
					    "redux-devtools-extension": "^2.13.9", | 
				
			||||||
 | 
					    "redux-thunk": "^3.1.0", | 
				
			||||||
 | 
					    "vite-plugin-compression": "^0.5.1", | 
				
			||||||
 | 
					    "vite-plugin-monaco-editor": "^1.1.0", | 
				
			||||||
 | 
					    "vite-plugin-pages": "^0.32.3", | 
				
			||||||
 | 
					    "vite-plugin-pwa": "^0.20.0" | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  "devDependencies": { | 
				
			||||||
 | 
					    "@types/react": "^18.3.3", | 
				
			||||||
 | 
					    "@types/react-dom": "^18.3.0", | 
				
			||||||
 | 
					    "@vitejs/plugin-react": "^4.3.1", | 
				
			||||||
 | 
					    "autoprefixer": "^10.4.19", | 
				
			||||||
 | 
					    "eslint": "^8.57.0", | 
				
			||||||
 | 
					    "eslint-plugin-react": "^7.34.3", | 
				
			||||||
 | 
					    "eslint-plugin-react-hooks": "^4.6.2", | 
				
			||||||
 | 
					    "eslint-plugin-react-refresh": "^0.4.7", | 
				
			||||||
 | 
					    "postcss": "^8.4.39", | 
				
			||||||
 | 
					    "sass": "^1.77.8", | 
				
			||||||
 | 
					    "tailwindcss": "^3.4.6", | 
				
			||||||
 | 
					    "vite": "^5.3.4" | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,6 @@ | 
				
			|||||||
 | 
					export default { | 
				
			||||||
 | 
					  plugins: { | 
				
			||||||
 | 
					    tailwindcss: {}, | 
				
			||||||
 | 
					    autoprefixer: {}, | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					} | 
				
			||||||
									
										Binary file not shown.
									
								
							
						
									
										Binary file not shown.
									
								
							
						
									
										Binary file not shown.
									
								
							
						
									
										Binary file not shown.
									
								
							
						
									
										Binary file not shown.
									
								
							
						
									
										Binary file not shown.
									
								
							
						
									
										Binary file not shown.
									
								
							
						
									
										Binary file not shown.
									
								
							
						
									
										Binary file not shown.
									
								
							
						
									
										
											File diff suppressed because it is too large
											Load Diff
										
									
								
							
						
									
										Binary file not shown.
									
								
							
						| 
		 After Width: | Height: | Size: 4.2 MiB  | 
									
										Binary file not shown.
									
								
							
						
									
										Binary file not shown.
									
								
							
						
									
										Binary file not shown.
									
								
							
						
									
										Binary file not shown.
									
								
							
						| 
		 After Width: | Height: | Size: 11 KiB  | 
									
										
											File diff suppressed because it is too large
											Load Diff
										
									
								
							
						
									
										
											File diff suppressed because one or more lines are too long
										
									
								
							
						| 
		 After Width: | Height: | Size: 1.5 KiB  | 
@ -0,0 +1,229 @@ | 
				
			|||||||
 | 
					// import "./App.css"; | 
				
			||||||
 | 
					// import Input from "./component/Input/Input"; | 
				
			||||||
 | 
					// import Landing from "./component/Landing/Landing"; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// function App() { | 
				
			||||||
 | 
					//   return ( | 
				
			||||||
 | 
					//     <div className="flex flex-col w-full items-center justify-around  h-screen p-4 mx-auto bg-gradient-to-r from-purple-600 to-blue-600"> | 
				
			||||||
 | 
					//       <Landing/> | 
				
			||||||
 | 
					//       {/* <Input | 
				
			||||||
 | 
					//         type="text" | 
				
			||||||
 | 
					//         placeholder=" نام خود را وارد کنید ..." | 
				
			||||||
 | 
					//         className="w-[25rem] h-10 p-2 text-gray-600 outline-none rounded-lg" | 
				
			||||||
 | 
					//       /> | 
				
			||||||
 | 
					//       <button | 
				
			||||||
 | 
					//         type="submit" | 
				
			||||||
 | 
					//         className="cursor-pointer w-16 p-4 bg-green-500 outline-none rounded-lg text-yellow-100" | 
				
			||||||
 | 
					//       > | 
				
			||||||
 | 
					//         بعدی | 
				
			||||||
 | 
					//       </button> */} | 
				
			||||||
 | 
					//     </div> | 
				
			||||||
 | 
					//   ); | 
				
			||||||
 | 
					// } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// export default App; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					////////////////////////////////default | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import  { Suspense, useEffect, useMemo } from "react"; | 
				
			||||||
 | 
					import { config, menu, user } from "~/redux/actions"; | 
				
			||||||
 | 
					import { useLocation, useNavigate, useRoutes } from "react-router-dom"; | 
				
			||||||
 | 
					import Dialog from "~/components/Dialog"; | 
				
			||||||
 | 
					import ErrorBoundary from "~/components/ErrorBoundary"; | 
				
			||||||
 | 
					// import Footer from "~/components/Footer"; | 
				
			||||||
 | 
					// import Header from "~/components/Header"; | 
				
			||||||
 | 
					import Loading from "~/components/Loading"; | 
				
			||||||
 | 
					// import Menu from "~/components/Menu"; | 
				
			||||||
 | 
					import Theme from "~/components/Theme"; | 
				
			||||||
 | 
					import Toast from "~/components/Toast"; | 
				
			||||||
 | 
					import appconfig from "./config"; | 
				
			||||||
 | 
					import { connect } from "react-redux"; | 
				
			||||||
 | 
					import { motion } from "framer-motion"; | 
				
			||||||
 | 
					import routes from "~react-pages"; | 
				
			||||||
 | 
					// import ChangesLog from "./ChangesLog"; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//router | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// import { BrowserRouter as Router } from "react-router-dom"; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if (appconfig.base) | 
				
			||||||
 | 
					  routes.forEach((e) => { | 
				
			||||||
 | 
					    e.path = (appconfig.base + "/" + e.path).replace("//", "/"); | 
				
			||||||
 | 
					  }); | 
				
			||||||
 | 
					const pageVariants = { | 
				
			||||||
 | 
					  initial: { opacity: 0 }, | 
				
			||||||
 | 
					  in: { opacity: 1 }, | 
				
			||||||
 | 
					  out: { opacity: 0 }, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					const pageTransition = { | 
				
			||||||
 | 
					  type: "slide", | 
				
			||||||
 | 
					  ease: "linear", | 
				
			||||||
 | 
					  duration: 0.5, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					const Root = ({ | 
				
			||||||
 | 
					  user, | 
				
			||||||
 | 
					  dialog, | 
				
			||||||
 | 
					  menuList, | 
				
			||||||
 | 
					  setDialog, | 
				
			||||||
 | 
					  getMenuList, | 
				
			||||||
 | 
					  themeName, | 
				
			||||||
 | 
					  device, | 
				
			||||||
 | 
					  setDevice, | 
				
			||||||
 | 
					  ActiveRoleId, | 
				
			||||||
 | 
					  setActiveRole, | 
				
			||||||
 | 
					  setBottomSheet, | 
				
			||||||
 | 
					  switchRole, | 
				
			||||||
 | 
					  userRoleId, | 
				
			||||||
 | 
					  hasMenu, | 
				
			||||||
 | 
					  hasHeader, | 
				
			||||||
 | 
					  setMenu, | 
				
			||||||
 | 
					  setTheme, | 
				
			||||||
 | 
					  themeColors, | 
				
			||||||
 | 
					  login, | 
				
			||||||
 | 
					  logout, | 
				
			||||||
 | 
					}) => { | 
				
			||||||
 | 
					  const queryParams = Object.fromEntries( | 
				
			||||||
 | 
					    new URLSearchParams(window.location.search) | 
				
			||||||
 | 
					  ); | 
				
			||||||
 | 
					  const navigate = useNavigate(); | 
				
			||||||
 | 
					  const location = useLocation(); | 
				
			||||||
 | 
					  // FIXME | 
				
			||||||
 | 
					  useMemo(async () => { | 
				
			||||||
 | 
					    setMenu(true); | 
				
			||||||
 | 
					    if (user) getMenuList(); | 
				
			||||||
 | 
					  }, [user, ActiveRoleId]); | 
				
			||||||
 | 
					  useEffect(() => { | 
				
			||||||
 | 
					    if (!location.pathname.includes("wiki") && user && menuList.length < 2) | 
				
			||||||
 | 
					      getMenuList(); | 
				
			||||||
 | 
					  }, [location.pathname]); | 
				
			||||||
 | 
					  let multyRole = user?.userRoles?.length > 1; | 
				
			||||||
 | 
					  // console.log({ Location, user, ActiveRoleId, multyRole }); | 
				
			||||||
 | 
					  if (user && user.passwordHealth?.message) { | 
				
			||||||
 | 
					    let Location = location.pathname.split("/")[appconfig.base ? 2 : 1]; | 
				
			||||||
 | 
					    if (!Location.includes("renewPassword")) | 
				
			||||||
 | 
					      navigate(appconfig.base + "/renewPassword", { replace: true }); | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					  let Location = location.pathname.split("/")[appconfig.base ? 2 : 1]; | 
				
			||||||
 | 
					  const publics = ["landing"]; | 
				
			||||||
 | 
					  const publicsOnly = ["login", "guilds", "clients", "help"]; | 
				
			||||||
 | 
					  const isPublicOnly = publicsOnly.includes(Location); | 
				
			||||||
 | 
					  const isPublic = publics.includes(Location); | 
				
			||||||
 | 
					  useEffect(() => { | 
				
			||||||
 | 
					    if (!queryParams.code && !user && ActiveRoleId != undefined) { | 
				
			||||||
 | 
					      login(); | 
				
			||||||
 | 
					    }  else { | 
				
			||||||
 | 
					      // else if (!user && !ActiveRoleId) await logout(); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (!user && !isPublic && !isPublicOnly) { | 
				
			||||||
 | 
					        if (!location.pathname.includes("logout")) | 
				
			||||||
 | 
					          if (typeof location.search === "string") | 
				
			||||||
 | 
					            window.sessionStorage.setItem( | 
				
			||||||
 | 
					              "next", | 
				
			||||||
 | 
					              location.pathname + (location.search || "") | 
				
			||||||
 | 
					            ); | 
				
			||||||
 | 
					        navigate(appconfig.base + "/login", { | 
				
			||||||
 | 
					          replace: false, | 
				
			||||||
 | 
					        }); | 
				
			||||||
 | 
					      } else if ( | 
				
			||||||
 | 
					        Location != "logout" && | 
				
			||||||
 | 
					        user && | 
				
			||||||
 | 
					        ActiveRoleId == undefined && | 
				
			||||||
 | 
					        multyRole | 
				
			||||||
 | 
					      ) { | 
				
			||||||
 | 
					        navigate(appconfig.base + "/switchRole", { replace: true }); | 
				
			||||||
 | 
					      } else if (user && isPublicOnly) { | 
				
			||||||
 | 
					        let next = window.sessionStorage.getItem("next") || "/"; | 
				
			||||||
 | 
					        window.sessionStorage.removeItem("next"); | 
				
			||||||
 | 
					        navigate(appconfig.base + next); | 
				
			||||||
 | 
					      } | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					  }, [Location, user]); | 
				
			||||||
 | 
					  return ( | 
				
			||||||
 | 
					    <Theme | 
				
			||||||
 | 
					      themeColors={themeColors} | 
				
			||||||
 | 
					      themeName={themeName} | 
				
			||||||
 | 
					      device={device} | 
				
			||||||
 | 
					      setDevice={setDevice} | 
				
			||||||
 | 
					    > | 
				
			||||||
 | 
					      <div className="flex flex-row w-full max-w-screen h-full bg-background"> | 
				
			||||||
 | 
					        {/* {hasMenu && ( | 
				
			||||||
 | 
					          <Menu | 
				
			||||||
 | 
					            device={device} | 
				
			||||||
 | 
					            user={user} | 
				
			||||||
 | 
					            setDialog={setDialog} | 
				
			||||||
 | 
					            menuList={menuList} | 
				
			||||||
 | 
					            setActiveRole={setActiveRole} | 
				
			||||||
 | 
					            switchRole={switchRole} | 
				
			||||||
 | 
					            userRoleId={userRoleId} | 
				
			||||||
 | 
					          /> | 
				
			||||||
 | 
					        )} */} | 
				
			||||||
 | 
					        <div className="flex flex-col flex-1   prettyScroll overflow-y-auto"> | 
				
			||||||
 | 
					          {/* {hasHeader && ( | 
				
			||||||
 | 
					            <Header | 
				
			||||||
 | 
					              themeColors={themeColors} | 
				
			||||||
 | 
					              setTheme={setTheme} | 
				
			||||||
 | 
					              themeName={themeName} | 
				
			||||||
 | 
					              user={user} | 
				
			||||||
 | 
					              location={location} | 
				
			||||||
 | 
					              setBottomSheet={setBottomSheet} | 
				
			||||||
 | 
					            /> | 
				
			||||||
 | 
					          )} */} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          <section className="flex flex-col flex-1 bg-background"> | 
				
			||||||
 | 
					            <Suspense fallback={<Loading />}> | 
				
			||||||
 | 
					              <motion.div | 
				
			||||||
 | 
					                key={location.pathname} | 
				
			||||||
 | 
					                initial="initial" | 
				
			||||||
 | 
					                animate="in" | 
				
			||||||
 | 
					                variants={pageVariants} | 
				
			||||||
 | 
					                transition={pageTransition} | 
				
			||||||
 | 
					                className="w-full h-screen flex-1 flex" | 
				
			||||||
 | 
					              > | 
				
			||||||
 | 
					                <ErrorBoundary>{useRoutes(routes)}</ErrorBoundary> | 
				
			||||||
 | 
					              </motion.div> | 
				
			||||||
 | 
					            </Suspense> | 
				
			||||||
 | 
					          </section> | 
				
			||||||
 | 
					          {/* <Footer user={user} location={location} /> */} | 
				
			||||||
 | 
					        </div> | 
				
			||||||
 | 
					      </div> | 
				
			||||||
 | 
					      {/* <ChangesLog setDialog={setDialog} user={user} /> */} | 
				
			||||||
 | 
					      <Dialog setDialog={setDialog} dialog={dialog} /> | 
				
			||||||
 | 
					      <Toast /> | 
				
			||||||
 | 
					    </Theme> | 
				
			||||||
 | 
					  ); | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default connect( | 
				
			||||||
 | 
					  (state) => ({ | 
				
			||||||
 | 
					    user: state.user.status, | 
				
			||||||
 | 
					    dialog: state.config.dialog, | 
				
			||||||
 | 
					    bottomSheet: state.config.bottomSheet, | 
				
			||||||
 | 
					    menuList: state.menu.list, | 
				
			||||||
 | 
					    themeName: state.config.themeName, | 
				
			||||||
 | 
					    device: state.config.device, | 
				
			||||||
 | 
					    hasMenu: state.config.menu, | 
				
			||||||
 | 
					    hasHeader: state.config.header, | 
				
			||||||
 | 
					    ActiveRoleId: state.user.ActiveRoleId, | 
				
			||||||
 | 
					    userRoleId: state.user.userRoleId, | 
				
			||||||
 | 
					    themeColors: state.config.themeColors, | 
				
			||||||
 | 
					  }), | 
				
			||||||
 | 
					  { | 
				
			||||||
 | 
					    setDialog: config.setDialog, | 
				
			||||||
 | 
					    setBottomSheet: config.setBottomSheet, | 
				
			||||||
 | 
					    getMenuList: menu.list, | 
				
			||||||
 | 
					    setDevice: config.setDevice, | 
				
			||||||
 | 
					    setActiveRole: user.setActiveRoleId, | 
				
			||||||
 | 
					    switchRole: user.switchRole, | 
				
			||||||
 | 
					    setMenu: config.setMenu, | 
				
			||||||
 | 
					    setTheme: config.setTheme, | 
				
			||||||
 | 
					    getProfile: user.getProfile, | 
				
			||||||
 | 
					    login: user.login, | 
				
			||||||
 | 
					    logout: user.logout, | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					)(Root); | 
				
			||||||
@ -0,0 +1,55 @@ | 
				
			|||||||
 | 
					@import "./iconsax.css"; | 
				
			||||||
 | 
					 #root { | 
				
			||||||
 | 
					  /* max-width: 1280px; */ | 
				
			||||||
 | 
					  margin: 0 auto; | 
				
			||||||
 | 
					  direction: rtl; | 
				
			||||||
 | 
					}  | 
				
			||||||
 | 
					@font-face { | 
				
			||||||
 | 
					  font-family: iransans; | 
				
			||||||
 | 
					  src: url("/font/3.ttf"); | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@font-face { | 
				
			||||||
 | 
					  font-family: font-1; | 
				
			||||||
 | 
					  src: url("/font/1.ttf"); | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@font-face { | 
				
			||||||
 | 
					  font-family: font-2; | 
				
			||||||
 | 
					  src: url("/font/2.ttf"); | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@font-face { | 
				
			||||||
 | 
					  font-family: font-3; | 
				
			||||||
 | 
					  src: url("/font/3.ttf"); | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@font-face { | 
				
			||||||
 | 
					  font-family: font-4; | 
				
			||||||
 | 
					  src: url("/font/4.ttf"); | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@font-face { | 
				
			||||||
 | 
					  font-family: font-5; | 
				
			||||||
 | 
					  src: url("/font/5.ttf"); | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@font-face { | 
				
			||||||
 | 
					  font-family: font-6; | 
				
			||||||
 | 
					  src: url("/font/6.ttf"); | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@font-face { | 
				
			||||||
 | 
					  font-family: font-7; | 
				
			||||||
 | 
					  src: url("/font/7.ttf"); | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@font-face { | 
				
			||||||
 | 
					  font-family: font-8; | 
				
			||||||
 | 
					  src: url("/font/8.ttf"); | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@font-face { | 
				
			||||||
 | 
					  font-family: font-9; | 
				
			||||||
 | 
					  src: url("/font/9.ttf"); | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,27 @@ | 
				
			|||||||
 | 
					import { BottomSheet } from "react-spring-bottom-sheet"; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const customBottomSheet = ({ | 
				
			||||||
 | 
					  className, | 
				
			||||||
 | 
					  cancel, | 
				
			||||||
 | 
					  hidden, | 
				
			||||||
 | 
					  children, | 
				
			||||||
 | 
					  height, //= window.innerHeight / 2, | 
				
			||||||
 | 
					}) => { | 
				
			||||||
 | 
					  return ( | 
				
			||||||
 | 
					    <BottomSheet | 
				
			||||||
 | 
					      className={className} | 
				
			||||||
 | 
					      open={!hidden} | 
				
			||||||
 | 
					      defaultSnap={height} | 
				
			||||||
 | 
					      // blocking | 
				
			||||||
 | 
					      onDismiss={cancel} | 
				
			||||||
 | 
					      snapPoints={() => [ | 
				
			||||||
 | 
					        window.innerHeight / 6, | 
				
			||||||
 | 
					        window.innerHeight / 2, | 
				
			||||||
 | 
					        window.innerHeight * 0.95, | 
				
			||||||
 | 
					      ]} | 
				
			||||||
 | 
					    > | 
				
			||||||
 | 
					      {children} | 
				
			||||||
 | 
					    </BottomSheet> | 
				
			||||||
 | 
					  ); | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					export default customBottomSheet; | 
				
			||||||
@ -0,0 +1,247 @@ | 
				
			|||||||
 | 
					import React, { useEffect, useState, useRef } from "react"; | 
				
			||||||
 | 
					import { useNavigate } from "react-router-dom"; | 
				
			||||||
 | 
					import ContentEditable from "react-contenteditable"; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//components | 
				
			||||||
 | 
					import Icon from "~/components/Icon"; | 
				
			||||||
 | 
					import Loading from "~/components/Loading"; | 
				
			||||||
 | 
					import appConfig from "~/config"; | 
				
			||||||
 | 
					const { redirects } = appConfig; | 
				
			||||||
 | 
					const downloadUrl = (file_path) => { | 
				
			||||||
 | 
					  var a = window.document.createElement("A"); | 
				
			||||||
 | 
					  a.href = file_path; | 
				
			||||||
 | 
					  a.target = "_blank"; | 
				
			||||||
 | 
					  a.download = file_path.substr(file_path.lastIndexOf("/") + 1); | 
				
			||||||
 | 
					  window.document.body.appendChild(a); | 
				
			||||||
 | 
					  a.click(); | 
				
			||||||
 | 
					  window.document.body.removeChild(a); | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					const Button = ({ | 
				
			||||||
 | 
					  id, | 
				
			||||||
 | 
					  badge, | 
				
			||||||
 | 
					  tabIndex, | 
				
			||||||
 | 
					  draggable, | 
				
			||||||
 | 
					  onDragStart, | 
				
			||||||
 | 
					  style, | 
				
			||||||
 | 
					  text, | 
				
			||||||
 | 
					  link, | 
				
			||||||
 | 
					  icon, | 
				
			||||||
 | 
					  iconColor, | 
				
			||||||
 | 
					  iconSize, | 
				
			||||||
 | 
					  iconSet, | 
				
			||||||
 | 
					  iconClassName, | 
				
			||||||
 | 
					  disabled, | 
				
			||||||
 | 
					  scale, | 
				
			||||||
 | 
					  surface, | 
				
			||||||
 | 
					  title, | 
				
			||||||
 | 
					  primary, | 
				
			||||||
 | 
					  outline, | 
				
			||||||
 | 
					  action, | 
				
			||||||
 | 
					  loading: loading_, | 
				
			||||||
 | 
					  className, | 
				
			||||||
 | 
					  children, | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  textClassName, | 
				
			||||||
 | 
					  progress, | 
				
			||||||
 | 
					  dropdown, | 
				
			||||||
 | 
					  hoverDropdown, | 
				
			||||||
 | 
					  refAction = () => {}, | 
				
			||||||
 | 
					  ref, | 
				
			||||||
 | 
					  editable, | 
				
			||||||
 | 
					  onChange, | 
				
			||||||
 | 
					  inputRef, | 
				
			||||||
 | 
					  target, | 
				
			||||||
 | 
					  badgeCalssName, | 
				
			||||||
 | 
					  dropdownClassName, | 
				
			||||||
 | 
					  dpClassName, | 
				
			||||||
 | 
					}) => { | 
				
			||||||
 | 
					  const dropdownRef = useRef(); | 
				
			||||||
 | 
					  if (editable) { | 
				
			||||||
 | 
					    link = undefined; | 
				
			||||||
 | 
					    action = undefined; | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					  if (ref && !refAction) refAction = ref; | 
				
			||||||
 | 
					  const navigate = useNavigate(); | 
				
			||||||
 | 
					  const [menu, setMenu] = useState(false); | 
				
			||||||
 | 
					  const [loading, setLoading] = useState(loading_); | 
				
			||||||
 | 
					  const outsideClick = (event) => { | 
				
			||||||
 | 
					    if (dropdownRef.current && !dropdownRef.current.contains(event.target)) { | 
				
			||||||
 | 
					      event.preventDefault(); | 
				
			||||||
 | 
					      setMenu(false); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					  }; | 
				
			||||||
 | 
					  useEffect(() => { | 
				
			||||||
 | 
					    if (menu) document.addEventListener("mousedown", outsideClick); | 
				
			||||||
 | 
					    else document.removeEventListener("mousedown", outsideClick); | 
				
			||||||
 | 
					  }, [menu]); | 
				
			||||||
 | 
					  useEffect(() => { | 
				
			||||||
 | 
					    setLoading(loading_); | 
				
			||||||
 | 
					  }, [loading_]); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  className = className || ""; | 
				
			||||||
 | 
					  if (outline) | 
				
			||||||
 | 
					    className += " border  border-primary text-primary  hover:bg-surface"; | 
				
			||||||
 | 
					  if (primary) { | 
				
			||||||
 | 
					    if (!className.includes("bg-")) | 
				
			||||||
 | 
					      className += " font-6 bg-primary hover:brightness-90"; | 
				
			||||||
 | 
					    className += ` text-primaryText  `; | 
				
			||||||
 | 
					    // primaryColor = "text-primaryText"; | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (surface) className += ` bg-surface text-surfaceText `; | 
				
			||||||
 | 
					  if (disabled) className += ` grayscale opacity-80`; | 
				
			||||||
 | 
					  if (scale) className += ` hover:scale-105`; | 
				
			||||||
 | 
					  if (!className.includes("justify")) className += ` justify-center`; | 
				
			||||||
 | 
					  if (!className.includes("rounded")) className += ` rounded-md`; | 
				
			||||||
 | 
					  const doAction = async (e) => { | 
				
			||||||
 | 
					    setLoading(true); | 
				
			||||||
 | 
					    if (!menu && action) await action(e); | 
				
			||||||
 | 
					    if (dropdown) setMenu(true); | 
				
			||||||
 | 
					    setLoading(false); | 
				
			||||||
 | 
					  }; | 
				
			||||||
 | 
					  let timer; | 
				
			||||||
 | 
					  let Container = !dropdown ? React.Fragment : DropdownContainer; | 
				
			||||||
 | 
					  return ( | 
				
			||||||
 | 
					    <Container> | 
				
			||||||
 | 
					      <button | 
				
			||||||
 | 
					        id={id || null} | 
				
			||||||
 | 
					        tabIndex={tabIndex} | 
				
			||||||
 | 
					        draggable={draggable} | 
				
			||||||
 | 
					        onDragStart={onDragStart} | 
				
			||||||
 | 
					        style={style || {}} | 
				
			||||||
 | 
					        ref={inputRef} | 
				
			||||||
 | 
					        title={title || text} | 
				
			||||||
 | 
					        className={`${className} flex text-sm my-2 py-2 gap-2   transition-all    items-center `} | 
				
			||||||
 | 
					        onMouseEnter={ | 
				
			||||||
 | 
					          hoverDropdown | 
				
			||||||
 | 
					            ? () => | 
				
			||||||
 | 
					                (timer = setTimeout(() => { | 
				
			||||||
 | 
					                  setMenu(true); | 
				
			||||||
 | 
					                }, 100)) | 
				
			||||||
 | 
					            : null | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					        onMouseLeave={ | 
				
			||||||
 | 
					          hoverDropdown | 
				
			||||||
 | 
					            ? () => | 
				
			||||||
 | 
					                (timer = setTimeout(() => { | 
				
			||||||
 | 
					                  setMenu(false); | 
				
			||||||
 | 
					                }, 100)) | 
				
			||||||
 | 
					            : null | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					        onClick={(e) => { | 
				
			||||||
 | 
					          e.preventDefault(); | 
				
			||||||
 | 
					          e.stopPropagation(); | 
				
			||||||
 | 
					          if (!disabled && !loading) { | 
				
			||||||
 | 
					            if (dropdown || action) doAction(e); | 
				
			||||||
 | 
					            if (redirects[link]) link = redirects[link]; | 
				
			||||||
 | 
					            if (typeof link == "string") | 
				
			||||||
 | 
					              if (target == "download") downloadUrl(link); | 
				
			||||||
 | 
					              else if (link.includes("http") && target == "_self") | 
				
			||||||
 | 
					                window.location.href = link; | 
				
			||||||
 | 
					              else if (link.includes("http") || link.slice(0, 4) == "data") { | 
				
			||||||
 | 
					                let w = window.open(link, target || "_blank", true); | 
				
			||||||
 | 
					                if (link.slice(0, 4) == "data") { | 
				
			||||||
 | 
					                  let image = new Image(); | 
				
			||||||
 | 
					                  image.src = link; | 
				
			||||||
 | 
					                  setTimeout(function () { | 
				
			||||||
 | 
					                    w.document.write(image.outerHTML); | 
				
			||||||
 | 
					                  }, 0); | 
				
			||||||
 | 
					                } | 
				
			||||||
 | 
					              } else if (link.includes("#")) | 
				
			||||||
 | 
					                window.document.querySelector(link).scrollIntoView({ | 
				
			||||||
 | 
					                  behavior: "smooth", | 
				
			||||||
 | 
					                  block: "start", | 
				
			||||||
 | 
					                  inline: "nearest", | 
				
			||||||
 | 
					                }); | 
				
			||||||
 | 
					              else { | 
				
			||||||
 | 
					                if (window.event.ctrlKey || (target && target != "_self")) | 
				
			||||||
 | 
					                  window.open( | 
				
			||||||
 | 
					                    !appConfig.base ? link : "/" + appConfig.base + link, | 
				
			||||||
 | 
					                    target || "_blank" | 
				
			||||||
 | 
					                  ); | 
				
			||||||
 | 
					                else | 
				
			||||||
 | 
					                  navigate( | 
				
			||||||
 | 
					                    !appConfig.base ? link : "/" + appConfig.base + link | 
				
			||||||
 | 
					                  ); | 
				
			||||||
 | 
					              } | 
				
			||||||
 | 
					            else if (link) navigate(link); | 
				
			||||||
 | 
					          } | 
				
			||||||
 | 
					        }} | 
				
			||||||
 | 
					      > | 
				
			||||||
 | 
					        {loading && progress > 0 && ( | 
				
			||||||
 | 
					          <div className={`${textClassName}`}>{progress}%</div> | 
				
			||||||
 | 
					        )} | 
				
			||||||
 | 
					        {loading ? ( | 
				
			||||||
 | 
					          <Loading | 
				
			||||||
 | 
					            text="" | 
				
			||||||
 | 
					            textClassName={"text-[white]"} | 
				
			||||||
 | 
					            color={primary ? "white" : ""} | 
				
			||||||
 | 
					            size={10} | 
				
			||||||
 | 
					          /> | 
				
			||||||
 | 
					        ) : null} | 
				
			||||||
 | 
					        {icon && ( | 
				
			||||||
 | 
					          <Icon | 
				
			||||||
 | 
					            name={icon} | 
				
			||||||
 | 
					            color={ | 
				
			||||||
 | 
					              iconColor || (primary && "var(--primaryText)") || "var(--primary)" | 
				
			||||||
 | 
					            } | 
				
			||||||
 | 
					            size={iconSize} | 
				
			||||||
 | 
					            variant={iconSet} | 
				
			||||||
 | 
					            className={ | 
				
			||||||
 | 
					              (editable ? "" : text ? "" : "flex-1 ") + (iconClassName || "") | 
				
			||||||
 | 
					            } | 
				
			||||||
 | 
					          /> | 
				
			||||||
 | 
					        )} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        {editable ? ( | 
				
			||||||
 | 
					          <ContentEditable | 
				
			||||||
 | 
					            html={text} | 
				
			||||||
 | 
					            onChange={(e) => onChange(e.target.value)} | 
				
			||||||
 | 
					            className={!text ? " w-1 rounded " : "min-w-10 "} | 
				
			||||||
 | 
					          /> | 
				
			||||||
 | 
					        ) : ( | 
				
			||||||
 | 
					          text && | 
				
			||||||
 | 
					          text != " " && <div className={`${textClassName}`}>{text}</div> | 
				
			||||||
 | 
					        )} | 
				
			||||||
 | 
					        {badge ? ( | 
				
			||||||
 | 
					          <div className="relative ltr -left-1"> | 
				
			||||||
 | 
					            <span | 
				
			||||||
 | 
					              className={ | 
				
			||||||
 | 
					                badgeCalssName + | 
				
			||||||
 | 
					                ` bg-error text-primaryText text-[12px] px-2 absolute rtl bottom-2 rounded-lg` | 
				
			||||||
 | 
					              } | 
				
			||||||
 | 
					            > | 
				
			||||||
 | 
					              {badge} | 
				
			||||||
 | 
					            </span> | 
				
			||||||
 | 
					          </div> | 
				
			||||||
 | 
					        ) : null} | 
				
			||||||
 | 
					        {!dropdown ? children : null} | 
				
			||||||
 | 
					      </button> | 
				
			||||||
 | 
					      {dropdown ? ( | 
				
			||||||
 | 
					        <div | 
				
			||||||
 | 
					          ref={dropdownRef} | 
				
			||||||
 | 
					          className={ | 
				
			||||||
 | 
					            dpClassName + " absolute ltr:left-0 rtl:right-0 translate-x-0  " | 
				
			||||||
 | 
					          } | 
				
			||||||
 | 
					        > | 
				
			||||||
 | 
					          <div | 
				
			||||||
 | 
					            id="dropdown" | 
				
			||||||
 | 
					            className={`${ | 
				
			||||||
 | 
					              menu ? "" : "hidden" | 
				
			||||||
 | 
					            } min-w-fit px-2 absolute text-xs list-none  rounded-lg divide-gray-100 shadow-xl bg-background  my-0 py-0   ${dropdownClassName}`} | 
				
			||||||
 | 
					            onMouseLeave={() => setMenu(false)} | 
				
			||||||
 | 
					            onMouseEnter={() => clearTimeout(timer)} | 
				
			||||||
 | 
					          > | 
				
			||||||
 | 
					            {children} | 
				
			||||||
 | 
					          </div> | 
				
			||||||
 | 
					        </div> | 
				
			||||||
 | 
					      ) : null} | 
				
			||||||
 | 
					    </Container> | 
				
			||||||
 | 
					  ); | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const DropdownContainer = ({ children }) => { | 
				
			||||||
 | 
					  return <div className="">{children}</div>; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default Button; | 
				
			||||||
@ -0,0 +1,166 @@ | 
				
			|||||||
 | 
					import React,{useState} from "react"; | 
				
			||||||
 | 
					//components | 
				
			||||||
 | 
					import Button from "~/components/Button"; | 
				
			||||||
 | 
					import Icon from "~/components/Icon"; | 
				
			||||||
 | 
					import BottomSheet from "~/components/BottomSheet"; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const Dialog = ({ dialog, setDialog }) => { | 
				
			||||||
 | 
					   | 
				
			||||||
 | 
					  const [boxAnimation, setBoxAnimation] = useState(false); | 
				
			||||||
 | 
					  if (!dialog.open) return null; | 
				
			||||||
 | 
					  let { | 
				
			||||||
 | 
					    text, | 
				
			||||||
 | 
					    type = "confirm", | 
				
			||||||
 | 
					    accept, | 
				
			||||||
 | 
					    children, | 
				
			||||||
 | 
					    className, | 
				
			||||||
 | 
					    action, | 
				
			||||||
 | 
					    cancel, | 
				
			||||||
 | 
					    loading, | 
				
			||||||
 | 
					    progress, | 
				
			||||||
 | 
					    footer, | 
				
			||||||
 | 
					    icon, | 
				
			||||||
 | 
					    iconColor, | 
				
			||||||
 | 
					  } = dialog; | 
				
			||||||
 | 
					  accept = accept || action; | 
				
			||||||
 | 
					  React.useEffect(() => { | 
				
			||||||
 | 
					    setTimeout(() => { | 
				
			||||||
 | 
					      setBoxAnimation(true); | 
				
			||||||
 | 
					    }, 200); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return () => { | 
				
			||||||
 | 
					      setBoxAnimation(false); | 
				
			||||||
 | 
					    }; | 
				
			||||||
 | 
					  }, []); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const exit = React.useCallback( | 
				
			||||||
 | 
					    (e) => { | 
				
			||||||
 | 
					      cancel && cancel(); | 
				
			||||||
 | 
					      setDialog({ ...dialog, open: !dialog.open }); | 
				
			||||||
 | 
					      e.stopPropagation(); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					    [dialog, setDialog] | 
				
			||||||
 | 
					  ); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const acceptFunc = React.useCallback(() => { | 
				
			||||||
 | 
					    accept(); | 
				
			||||||
 | 
					    setDialog({ ...dialog, open: !dialog.open }); | 
				
			||||||
 | 
					    // e.stopPropagation(); | 
				
			||||||
 | 
					  }, [dialog, setDialog, accept]); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return ( | 
				
			||||||
 | 
					    <> | 
				
			||||||
 | 
					      <div | 
				
			||||||
 | 
					        className=" hidden md:flex w-screen h-full fixed top-0 right-0 bg-surfaceDark bg-opacity-10 backdrop-filter backdrop-blur-lg  justify-center items-center" | 
				
			||||||
 | 
					        style={{ zIndex: 70 }} | 
				
			||||||
 | 
					        onClick={(e) => exit(e)} | 
				
			||||||
 | 
					      > | 
				
			||||||
 | 
					        <div | 
				
			||||||
 | 
					          className={`flex flex-col items-center bg-surfaceLight bg-opacity-100 text-surfaceText md:min-w-[500px] p-3 gap-2   rounded-md transition-all transform shadow ${ | 
				
			||||||
 | 
					            boxAnimation ? "scale-100" : "scale-0" | 
				
			||||||
 | 
					          }`} | 
				
			||||||
 | 
					          style={{ minWidth: 300 }} | 
				
			||||||
 | 
					          onClick={(e) => e.stopPropagation()} | 
				
			||||||
 | 
					        > | 
				
			||||||
 | 
					          <div | 
				
			||||||
 | 
					            className={`${className} text-tiny p-${ | 
				
			||||||
 | 
					              text ? 4 : 2 | 
				
			||||||
 | 
					            } text-gray-22 bg-surface rounded-md  w-full leading-7`} | 
				
			||||||
 | 
					          > | 
				
			||||||
 | 
					            <div className="flex items-center w-full gap-2 justify-center"> | 
				
			||||||
 | 
					              {icon && <Icon name={icon} size={32} />} <span>{text}</span> | 
				
			||||||
 | 
					            </div> | 
				
			||||||
 | 
					            {children} | 
				
			||||||
 | 
					          </div> | 
				
			||||||
 | 
					          <div className="modal-footer  w-full  flex md:flex-row flex-col gap-1 justify-between  "> | 
				
			||||||
 | 
					            {footer && <div className="flex-1">{footer}</div>} | 
				
			||||||
 | 
					            {type === "confirm" && ( | 
				
			||||||
 | 
					              <div className="flex  gap-4 w-full"> | 
				
			||||||
 | 
					                <Button | 
				
			||||||
 | 
					                  text="تایید" | 
				
			||||||
 | 
					                  primary | 
				
			||||||
 | 
					                  action={acceptFunc} | 
				
			||||||
 | 
					                  className="flex-1 !my-0" | 
				
			||||||
 | 
					                  loading={loading} | 
				
			||||||
 | 
					                  progress={progress} | 
				
			||||||
 | 
					                /> | 
				
			||||||
 | 
					                <Button | 
				
			||||||
 | 
					                  text="انصراف" | 
				
			||||||
 | 
					                  outline | 
				
			||||||
 | 
					                  className="flex-1 !my-0" | 
				
			||||||
 | 
					                  action={exit} | 
				
			||||||
 | 
					                /> | 
				
			||||||
 | 
					              </div> | 
				
			||||||
 | 
					            )} | 
				
			||||||
 | 
					            {type === "alert" && ( | 
				
			||||||
 | 
					              <div className="flex  gap-4 w-full"> | 
				
			||||||
 | 
					                <Button | 
				
			||||||
 | 
					                  text="تایید" | 
				
			||||||
 | 
					                  loading={loading} | 
				
			||||||
 | 
					                  progress={progress} | 
				
			||||||
 | 
					                  primary | 
				
			||||||
 | 
					                  className="flex-1 !my-0" | 
				
			||||||
 | 
					                  action={acceptFunc} | 
				
			||||||
 | 
					                /> | 
				
			||||||
 | 
					              </div> | 
				
			||||||
 | 
					            )} | 
				
			||||||
 | 
					          </div> | 
				
			||||||
 | 
					        </div> | 
				
			||||||
 | 
					      </div> | 
				
			||||||
 | 
					      <BottomSheet | 
				
			||||||
 | 
					        className={"md:hidden block h-fit"} | 
				
			||||||
 | 
					        cancel={exit} | 
				
			||||||
 | 
					        hidden={!dialog.open} | 
				
			||||||
 | 
					        height={text ? 300 : (window.innerHeight * 2) / 3} | 
				
			||||||
 | 
					      > | 
				
			||||||
 | 
					        <div className="p-2 rtl"> | 
				
			||||||
 | 
					          <div className="flex items-center w-full gap-2 justify-center"> | 
				
			||||||
 | 
					            {icon && <Icon name={icon} size={32} color={iconColor} />}{" "} | 
				
			||||||
 | 
					            <span>{text}</span> | 
				
			||||||
 | 
					          </div> | 
				
			||||||
 | 
					          {children} | 
				
			||||||
 | 
					        </div> | 
				
			||||||
 | 
					        <div className="flex gap-2 bg-opacity-100 "> | 
				
			||||||
 | 
					          <div className="modal-footer absolute left-0 bottom-2 px-2 pt-2 gap-1 rtl w-full flex  justify-between px-2  flex-col  bg-background  "> | 
				
			||||||
 | 
					            {footer && <div>{footer}</div>} | 
				
			||||||
 | 
					            <div className="modal-footer  w-full  flex md:flex-row flex-col gap-1 justify-between  "> | 
				
			||||||
 | 
					              {footer && <div className="flex-1">{footer}</div>} | 
				
			||||||
 | 
					              {type === "confirm" && ( | 
				
			||||||
 | 
					                <div className="flex  gap-4 w-full"> | 
				
			||||||
 | 
					                  <Button | 
				
			||||||
 | 
					                    text="تایید" | 
				
			||||||
 | 
					                    primary | 
				
			||||||
 | 
					                    action={acceptFunc} | 
				
			||||||
 | 
					                    className="flex-1 !my-0" | 
				
			||||||
 | 
					                    loading={loading} | 
				
			||||||
 | 
					                    progress={progress} | 
				
			||||||
 | 
					                  /> | 
				
			||||||
 | 
					                  <Button | 
				
			||||||
 | 
					                    text="انصراف" | 
				
			||||||
 | 
					                    outline | 
				
			||||||
 | 
					                    className="flex-1 !my-0" | 
				
			||||||
 | 
					                    action={exit} | 
				
			||||||
 | 
					                  /> | 
				
			||||||
 | 
					                </div> | 
				
			||||||
 | 
					              )} | 
				
			||||||
 | 
					              {type === "alert" && ( | 
				
			||||||
 | 
					                <div className="flex  gap-4 w-full"> | 
				
			||||||
 | 
					                  <Button | 
				
			||||||
 | 
					                    text="تایید" | 
				
			||||||
 | 
					                    loading={loading} | 
				
			||||||
 | 
					                    progress={progress} | 
				
			||||||
 | 
					                    primary | 
				
			||||||
 | 
					                    className="flex-1 !my-0" | 
				
			||||||
 | 
					                    action={acceptFunc} | 
				
			||||||
 | 
					                  /> | 
				
			||||||
 | 
					                </div> | 
				
			||||||
 | 
					              )} | 
				
			||||||
 | 
					            </div> | 
				
			||||||
 | 
					          </div> | 
				
			||||||
 | 
					        </div> | 
				
			||||||
 | 
					      </BottomSheet> | 
				
			||||||
 | 
					    </> | 
				
			||||||
 | 
					  ); | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default Dialog; | 
				
			||||||
@ -0,0 +1,80 @@ | 
				
			|||||||
 | 
					import React from "react"; | 
				
			||||||
 | 
					import Button from "~/components/Button"; | 
				
			||||||
 | 
					import { connect } from "react-redux"; | 
				
			||||||
 | 
					import { publicApi } from "~/redux/actions"; | 
				
			||||||
 | 
					import appConfig from "~/config"; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const { version } = appConfig; | 
				
			||||||
 | 
					const agent = window.navigator.userAgent; | 
				
			||||||
 | 
					class ErrorBoundary extends React.Component { | 
				
			||||||
 | 
					  constructor(props) { | 
				
			||||||
 | 
					    super(props); | 
				
			||||||
 | 
					    this.state = { error: false }; | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					  static getDerivedStateFromError(error) { | 
				
			||||||
 | 
					    return { error }; | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					  render() { | 
				
			||||||
 | 
					    if (this.state.error) { | 
				
			||||||
 | 
					      let errors = this.state.error.stack.split("\n"); | 
				
			||||||
 | 
					      if (errors[0].includes("dynamically imported")) { | 
				
			||||||
 | 
					        window.location.reload(true); | 
				
			||||||
 | 
					        return null; | 
				
			||||||
 | 
					      } // .filter((e) => !e.includes("node_module")); | 
				
			||||||
 | 
					      return ( | 
				
			||||||
 | 
					        <div className="w-full h-full"> | 
				
			||||||
 | 
					          <div className="border-error  bg-surface text-error rounded-lg border  flex-1 min-h-10 flex flex-col gap-2 p-3 m-3"> | 
				
			||||||
 | 
					            <div className="font-6"> خطای نمایشی</div> | 
				
			||||||
 | 
					            <div className="ltr font-6"> | 
				
			||||||
 | 
					              متاسفانه برای نمایش اطلاعات این صفحه خطایی وجود دارد | 
				
			||||||
 | 
					              {/* {errors[0].replace("ReferenceError:", "")} */} | 
				
			||||||
 | 
					            </div> | 
				
			||||||
 | 
					            {/* <hr /> | 
				
			||||||
 | 
					            {errors.slice(1).map((e, i) => ( | 
				
			||||||
 | 
					              <div key={i} className={"ltr text-xs"}> | 
				
			||||||
 | 
					                {e} | 
				
			||||||
 | 
					              </div> | 
				
			||||||
 | 
					            ))} */} | 
				
			||||||
 | 
					            <hr /> | 
				
			||||||
 | 
					            <div className="flex flex-col md:flex-row-reverse gap-2 justify-start"> | 
				
			||||||
 | 
					              <Button | 
				
			||||||
 | 
					                action={() => | 
				
			||||||
 | 
					                  this.props.report({ | 
				
			||||||
 | 
					                    error: this.state.error.stack, | 
				
			||||||
 | 
					                    version, | 
				
			||||||
 | 
					                    method: "UI", | 
				
			||||||
 | 
					                    path: window.location.pathname, | 
				
			||||||
 | 
					                    data: Object.fromEntries( | 
				
			||||||
 | 
					                      new URLSearchParams(window.location.search) | 
				
			||||||
 | 
					                    ), | 
				
			||||||
 | 
					                    statusCode: 600, | 
				
			||||||
 | 
					                    agent, | 
				
			||||||
 | 
					                    duration: 0, | 
				
			||||||
 | 
					                  }) | 
				
			||||||
 | 
					                } | 
				
			||||||
 | 
					                text="گزارش خطا" | 
				
			||||||
 | 
					                primary | 
				
			||||||
 | 
					                className="bg-error  !my-0 px-2" | 
				
			||||||
 | 
					                loading={this.props.loading} | 
				
			||||||
 | 
					              /> | 
				
			||||||
 | 
					              <Button | 
				
			||||||
 | 
					                // outline | 
				
			||||||
 | 
					                text="صفحه اصلی" | 
				
			||||||
 | 
					                link={"/"} | 
				
			||||||
 | 
					                className={"border border-error text-error !my-0 px-2"} | 
				
			||||||
 | 
					              /> | 
				
			||||||
 | 
					            </div> | 
				
			||||||
 | 
					          </div> | 
				
			||||||
 | 
					        </div> | 
				
			||||||
 | 
					      ); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					    return this.props.children; | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default connect( | 
				
			||||||
 | 
					  (state) => ({ | 
				
			||||||
 | 
					    loading: state.publicApi.loading, | 
				
			||||||
 | 
					  }), | 
				
			||||||
 | 
					  { report: publicApi.report } | 
				
			||||||
 | 
					)(ErrorBoundary); | 
				
			||||||
@ -0,0 +1,11 @@ | 
				
			|||||||
 | 
					import React from "react"; | 
				
			||||||
 | 
					import CopyRight from "~/components/CopyRight"; | 
				
			||||||
 | 
					const Footer = ({ user, location }) => { | 
				
			||||||
 | 
					  return ( | 
				
			||||||
 | 
					    <footer className={`${user ? "hidden" : ""} lg:flex flex-col w-full`}> | 
				
			||||||
 | 
					      {/* <div className="flex  bg-surface text-surfaceText">بخش فوتر</div> */} | 
				
			||||||
 | 
					      <CopyRight image /> | 
				
			||||||
 | 
					    </footer> | 
				
			||||||
 | 
					  ); | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					export default Footer; | 
				
			||||||
@ -0,0 +1,30 @@ | 
				
			|||||||
 | 
					import { Iconly } from "react-iconly"; | 
				
			||||||
 | 
					import icons, { iconlyList } from "~/icons"; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const Icon = ({ name, size = 24, variant, color, className, title }) => { | 
				
			||||||
 | 
					  let primaryColor = "var(--primary)"; | 
				
			||||||
 | 
					  let iconSaxSet = new Set(icons); | 
				
			||||||
 | 
					  if (iconlyList[name]) | 
				
			||||||
 | 
					    return ( | 
				
			||||||
 | 
					      <Iconly | 
				
			||||||
 | 
					        size={size} | 
				
			||||||
 | 
					        primaryColor={color || primaryColor} | 
				
			||||||
 | 
					        name={name} | 
				
			||||||
 | 
					        filled={variant == "bold" ? true : false} | 
				
			||||||
 | 
					        stroke={variant || null} | 
				
			||||||
 | 
					        className={className} | 
				
			||||||
 | 
					      /> | 
				
			||||||
 | 
					    ); | 
				
			||||||
 | 
					  if (iconSaxSet.has(name)) { | 
				
			||||||
 | 
					    return ( | 
				
			||||||
 | 
					      <span | 
				
			||||||
 | 
					        title={title} | 
				
			||||||
 | 
					        className={`${className} ltr isax isax-${name}`} | 
				
			||||||
 | 
					        style={{ fontSize: size, color: color, fontWeight: variant }} | 
				
			||||||
 | 
					      /> | 
				
			||||||
 | 
					    ); | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					  // console.log(name); | 
				
			||||||
 | 
					  return <img src={name} alt={name} className={className} />; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					export default Icon; | 
				
			||||||
@ -0,0 +1,9 @@ | 
				
			|||||||
 | 
					function Input({ type, placeholder ,className}) { | 
				
			||||||
 | 
					  return ( | 
				
			||||||
 | 
					    <div className="flex items-center justify-between "> | 
				
			||||||
 | 
					      <input type={type} placeholder={placeholder} className={className} /> | 
				
			||||||
 | 
					    </div> | 
				
			||||||
 | 
					  ); | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default Input; | 
				
			||||||
@ -0,0 +1,36 @@ | 
				
			|||||||
 | 
					import React from "react"; | 
				
			||||||
 | 
					import TopBarProgress from "react-topbar-progress-indicator"; | 
				
			||||||
 | 
					import Loading from "react-loading"; | 
				
			||||||
 | 
					TopBarProgress.config({ | 
				
			||||||
 | 
					  barColors: { | 
				
			||||||
 | 
					    0: "#3C58EA", | 
				
			||||||
 | 
					    0.5: "#0dbe94", | 
				
			||||||
 | 
					    1: "#3C58EA", | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  shadowBlur: 1, | 
				
			||||||
 | 
					}); | 
				
			||||||
 | 
					const myLoading = ({ text, color, size, className, textClassName }) => { | 
				
			||||||
 | 
					  size = size || 20; | 
				
			||||||
 | 
					  color = color || "var(--primary)"; | 
				
			||||||
 | 
					  return ( | 
				
			||||||
 | 
					    <div | 
				
			||||||
 | 
					      className={ | 
				
			||||||
 | 
					        "flex text-xs text-center text-surfaceText gap-3 justify-center my-5 " + | 
				
			||||||
 | 
					        className | 
				
			||||||
 | 
					      } | 
				
			||||||
 | 
					    > | 
				
			||||||
 | 
					      <Loading | 
				
			||||||
 | 
					        color={color} | 
				
			||||||
 | 
					        type="spin" | 
				
			||||||
 | 
					        width={size + "px"} | 
				
			||||||
 | 
					        height={size + "px"} | 
				
			||||||
 | 
					      /> | 
				
			||||||
 | 
					      <span className={`text-surfaceText ${textClassName} pt-1`}> | 
				
			||||||
 | 
					        {typeof text == "string" ? text : "در حال پردازش و دریافت اطلاعات ..."} | 
				
			||||||
 | 
					      </span> | 
				
			||||||
 | 
					      <TopBarProgress /> | 
				
			||||||
 | 
					    </div> | 
				
			||||||
 | 
					  ); | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default myLoading; | 
				
			||||||
@ -0,0 +1,65 @@ | 
				
			|||||||
 | 
					import _ from "lodash"; | 
				
			||||||
 | 
					import { useMemo } from "react"; | 
				
			||||||
 | 
					import { IconlyProvider } from "react-iconly"; | 
				
			||||||
 | 
					import { useEffect } from "react"; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const root = document.querySelector(":root"); | 
				
			||||||
 | 
					function hexToRgb(hex) { | 
				
			||||||
 | 
					  var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); | 
				
			||||||
 | 
					  return result | 
				
			||||||
 | 
					    ? [ | 
				
			||||||
 | 
					        parseInt(result[1], 16), | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        parseInt(result[2], 16), | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        parseInt(result[3], 16), | 
				
			||||||
 | 
					      ] | 
				
			||||||
 | 
					    : []; | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					const Theme = ({ themeColors, children, themeName, device, setDevice }) => { | 
				
			||||||
 | 
					  useEffect(() => { | 
				
			||||||
 | 
					    const activeTheme = themeColors[themeName]; | 
				
			||||||
 | 
					    for (let k in activeTheme) root.style.setProperty(k, activeTheme[k]); | 
				
			||||||
 | 
					    for (let k in activeTheme) | 
				
			||||||
 | 
					      root.style.setProperty( | 
				
			||||||
 | 
					        k + "RGB", | 
				
			||||||
 | 
					        `${hexToRgb(activeTheme[k]).join(",")}` | 
				
			||||||
 | 
					      ); | 
				
			||||||
 | 
					    window.localStorage.setItem("themeName", themeName); | 
				
			||||||
 | 
					  }, [themeName]); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const checkSize = () => { | 
				
			||||||
 | 
					    const width = window.innerWidth; | 
				
			||||||
 | 
					    if (width <= 640) { | 
				
			||||||
 | 
					      if (device !== "mobile") setDevice("mobile"); | 
				
			||||||
 | 
					    } else if (width <= 1024) { | 
				
			||||||
 | 
					      if (device !== "tablet") setDevice("tablet"); | 
				
			||||||
 | 
					    } else { | 
				
			||||||
 | 
					      if (device !== "desktop") setDevice("desktop"); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					    document.documentElement.style.setProperty( | 
				
			||||||
 | 
					      "--vh", | 
				
			||||||
 | 
					      window.innerHeight * 0.01 + "px" | 
				
			||||||
 | 
					    ); | 
				
			||||||
 | 
					  }; | 
				
			||||||
 | 
					  window.addEventListener("resize", _.debounce(checkSize, 300)); | 
				
			||||||
 | 
					  useMemo(checkSize, []); | 
				
			||||||
 | 
					  return ( | 
				
			||||||
 | 
					    <div> | 
				
			||||||
 | 
					      <IconlyProvider | 
				
			||||||
 | 
					        set="outline" | 
				
			||||||
 | 
					        primaryColor="#3C58EA" | 
				
			||||||
 | 
					        secondaryColor="#ffffff" | 
				
			||||||
 | 
					        size="medium " | 
				
			||||||
 | 
					      > | 
				
			||||||
 | 
					        <div | 
				
			||||||
 | 
					          className={`w-screen real-height real-max-height flex flex-col lg:flex-row rtl overflow-hidden lg:py-0  | 
				
			||||||
 | 
					            }`} | 
				
			||||||
 | 
					        > | 
				
			||||||
 | 
					          {children} | 
				
			||||||
 | 
					        </div> | 
				
			||||||
 | 
					      </IconlyProvider> | 
				
			||||||
 | 
					    </div> | 
				
			||||||
 | 
					  ); | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					export default Theme; | 
				
			||||||
@ -0,0 +1,23 @@ | 
				
			|||||||
 | 
					import React from "react"; | 
				
			||||||
 | 
					import { ToastContainer, Slide } from "react-toastify"; | 
				
			||||||
 | 
					const Toast = () => { | 
				
			||||||
 | 
					  return ( | 
				
			||||||
 | 
					    <React.Fragment> | 
				
			||||||
 | 
					      <ToastContainer | 
				
			||||||
 | 
					        position="bottom-left" | 
				
			||||||
 | 
					        theme="colored" | 
				
			||||||
 | 
					        autoClose={3000} | 
				
			||||||
 | 
					        // hideProgressBar={true} | 
				
			||||||
 | 
					        newestOnTop={true} | 
				
			||||||
 | 
					        closeOnClick | 
				
			||||||
 | 
					        rtl={true} | 
				
			||||||
 | 
					        pauseOnFocusLoss | 
				
			||||||
 | 
					        draggable | 
				
			||||||
 | 
					        pauseOnHover | 
				
			||||||
 | 
					        Progress="0.1" | 
				
			||||||
 | 
					        transition={Slide} | 
				
			||||||
 | 
					      /> | 
				
			||||||
 | 
					    </React.Fragment> | 
				
			||||||
 | 
					  ); | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					export default Toast; | 
				
			||||||
									
										
											File diff suppressed because it is too large
											Load Diff
										
									
								
							
						
									
										
											File diff suppressed because it is too large
											Load Diff
										
									
								
							
						@ -0,0 +1,66 @@ | 
				
			|||||||
 | 
					@tailwind base; | 
				
			||||||
 | 
					@tailwind components; | 
				
			||||||
 | 
					@tailwind utilities; | 
				
			||||||
 | 
					:root { | 
				
			||||||
 | 
					  font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; | 
				
			||||||
 | 
					  line-height: 1.5; | 
				
			||||||
 | 
					  font-weight: 400; | 
				
			||||||
 | 
					  background-image: linear-gradient(to right, var(--tw-gradient-stops));  color:white | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* a { | 
				
			||||||
 | 
					  font-weight: 500; | 
				
			||||||
 | 
					  color: #646cff; | 
				
			||||||
 | 
					  text-decoration: inherit; | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					a:hover { | 
				
			||||||
 | 
					  color: #535bf2; | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					body { | 
				
			||||||
 | 
					  margin: 0; | 
				
			||||||
 | 
					  display: flex; | 
				
			||||||
 | 
					  align-items: center; | 
				
			||||||
 | 
					  justify-content: space-around; | 
				
			||||||
 | 
					  min-width: 320px; | 
				
			||||||
 | 
					  min-height: 100vh; | 
				
			||||||
 | 
					} */ | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*  | 
				
			||||||
 | 
					h1 { | 
				
			||||||
 | 
					  font-size: 3.2em; | 
				
			||||||
 | 
					  line-height: 1.1; | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					button { | 
				
			||||||
 | 
					  border-radius: 8px; | 
				
			||||||
 | 
					  border: 1px solid transparent; | 
				
			||||||
 | 
					  padding: 0.6em 1.2em; | 
				
			||||||
 | 
					  font-size: 1em; | 
				
			||||||
 | 
					  font-weight: 500; | 
				
			||||||
 | 
					  font-family: inherit; | 
				
			||||||
 | 
					  background-color: #1a1a1a; | 
				
			||||||
 | 
					  cursor: pointer; | 
				
			||||||
 | 
					  transition: border-color 0.25s; | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					button:hover { | 
				
			||||||
 | 
					  border-color: #646cff; | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					button:focus, | 
				
			||||||
 | 
					button:focus-visible { | 
				
			||||||
 | 
					  outline: 4px auto -webkit-focus-ring-color; | 
				
			||||||
 | 
					} */ | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@media (prefers-color-scheme: light) { | 
				
			||||||
 | 
					  :root { | 
				
			||||||
 | 
					    color: #213547; | 
				
			||||||
 | 
					    background-color: #ffffff; | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					  a:hover { | 
				
			||||||
 | 
					    color: #747bff; | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					  button { | 
				
			||||||
 | 
					    background-color: #f9f9f9; | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,111 @@ | 
				
			|||||||
 | 
					import React, { StrictMode } from "react"; | 
				
			||||||
 | 
					import ReactDOM from "react-dom/client"; | 
				
			||||||
 | 
					import App from "./App"; | 
				
			||||||
 | 
					//router | 
				
			||||||
 | 
					import { BrowserRouter as Router } from "react-router-dom"; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//redux | 
				
			||||||
 | 
					import store from "~/redux/store"; | 
				
			||||||
 | 
					import { Provider } from "react-redux"; | 
				
			||||||
 | 
					//external css | 
				
			||||||
 | 
					import "./App.scss"; | 
				
			||||||
 | 
					// import "./tailwind.js"; | 
				
			||||||
 | 
					import "react-toastify/dist/ReactToastify.css"; | 
				
			||||||
 | 
					import "react-modern-drawer/dist/index.css"; | 
				
			||||||
 | 
					import "react-spring-bottom-sheet/dist/style.css"; | 
				
			||||||
 | 
					import "leaflet/dist/leaflet.css"; | 
				
			||||||
 | 
					// import "leaflet-draw/dist/leaflet.draw.css"; | 
				
			||||||
 | 
					// import "react-orgchart/index.css"; | 
				
			||||||
 | 
					// import "react-quill/dist/quill.core.css"; | 
				
			||||||
 | 
					// import "react-quill/dist/quill.snow.css"; | 
				
			||||||
 | 
					// import "./leaflet.min.css" | 
				
			||||||
 | 
					// import "./leaflet.min.css" | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// if (tailwind == undefined) window.location.reload(true); | 
				
			||||||
 | 
					window.t = (i) => i; | 
				
			||||||
 | 
					setTimeout(() => { | 
				
			||||||
 | 
					  tailwind.config = { | 
				
			||||||
 | 
					    theme: { | 
				
			||||||
 | 
					      colors: { | 
				
			||||||
 | 
					        primary: "rgba(var(--primaryRGB) , var(--tw-bg-opacity,1))", | 
				
			||||||
 | 
					        primaryLight: "rgba(var(--primaryLightRGB) , var(--tw-bg-opacity,1))", | 
				
			||||||
 | 
					        primaryDark: "rgba(var(--primaryDarkRGB) , var(--tw-bg-opacity,1))", | 
				
			||||||
 | 
					        secondary: "rgba(var(--secondaryRGB) , var(--tw-bg-opacity,1))", | 
				
			||||||
 | 
					        secondaryDark: "rgba(var(--secondaryDarkRGB) , var(--tw-bg-opacity,1))", | 
				
			||||||
 | 
					        secondaryLight: | 
				
			||||||
 | 
					          "rgba(var(--secondaryLightRGB) , var(--tw-bg-opacity,1))", | 
				
			||||||
 | 
					        surface: "rgba(var(--surfaceRGB) , var(--tw-bg-opacity,1))", | 
				
			||||||
 | 
					        surfaceLight: "rgba(var(--surfaceLightRGB) , var(--tw-bg-opacity,1))", | 
				
			||||||
 | 
					        surfaceDark: "rgba(var(--surfaceDarkRGB) , var(--tw-bg-opacity,1))", | 
				
			||||||
 | 
					        success: "rgba(var(--successRGB) , var(--tw-bg-opacity,1))", | 
				
			||||||
 | 
					        successText: "rgba(var(--successTextRGB) , var(--tw-bg-opacity,1))", | 
				
			||||||
 | 
					        warning: "rgba(var(--warningRGB) , var(--tw-bg-opacity,1))", | 
				
			||||||
 | 
					        warningText: "rgba(var(--warningTextRGB) , var(--tw-bg-opacity,1))", | 
				
			||||||
 | 
					        error: "rgba(var(--errorRGB) , var(--tw-bg-opacity,1))", | 
				
			||||||
 | 
					        primaryText: "var(--primaryText)", | 
				
			||||||
 | 
					        secondaryText: "var(--secondaryText)", | 
				
			||||||
 | 
					        background: "var(--background)", | 
				
			||||||
 | 
					        backgroundText: "var(--backgroundText)", | 
				
			||||||
 | 
					        surfaceText: "var(--surfaceText)", | 
				
			||||||
 | 
					        surfaceBorder: "var(--surfaceBorder)", | 
				
			||||||
 | 
					        info: "var(--info)", | 
				
			||||||
 | 
					        infoText: "var(--infoText)", | 
				
			||||||
 | 
					        errorText: "var(--errorText)", | 
				
			||||||
 | 
					        borderColor: "var(--borderColor)", | 
				
			||||||
 | 
					        backgroundBorder: "var(--backgroundBorder)", | 
				
			||||||
 | 
					      }, | 
				
			||||||
 | 
					      fontFamily: { | 
				
			||||||
 | 
					        1: ["font-1"], | 
				
			||||||
 | 
					        2: ["font-2"], | 
				
			||||||
 | 
					        3: ["font-3"], | 
				
			||||||
 | 
					        4: ["font-4"], | 
				
			||||||
 | 
					        5: ["font-5"], | 
				
			||||||
 | 
					        6: ["font-6"], | 
				
			||||||
 | 
					        7: ["font-7"], | 
				
			||||||
 | 
					        8: ["font-8"], | 
				
			||||||
 | 
					        9: ["font-9"], | 
				
			||||||
 | 
					      }, | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  }; | 
				
			||||||
 | 
					}, 100); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const root = ReactDOM.createRoot(document.getElementById("root")); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// if (window.location.hostname == "localhost") { | 
				
			||||||
 | 
					if (!window.initialized) { | 
				
			||||||
 | 
					  var onBeforeUnLoadEvent = false; | 
				
			||||||
 | 
					  let counter = +window.localStorage.getItem("activeTabs") || 0; | 
				
			||||||
 | 
					  window.localStorage.setItem("activeTabs", counter + 1); | 
				
			||||||
 | 
					  window.initialized = true; | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					window.onunload = window.onbeforeunload = function (event) { | 
				
			||||||
 | 
					  event.stopImmediatePropagation(); | 
				
			||||||
 | 
					  if (!onBeforeUnLoadEvent) { | 
				
			||||||
 | 
					    onBeforeUnLoadEvent = true; | 
				
			||||||
 | 
					    let counter = +window.localStorage.getItem("activeTabs"); | 
				
			||||||
 | 
					    if (counter > 0) window.localStorage.setItem("activeTabs", counter - 1); | 
				
			||||||
 | 
					    if (counter == 1) { | 
				
			||||||
 | 
					      window.localStorage.removeItem("activeTabs"); | 
				
			||||||
 | 
					      if (window.location.hostname == "sameh.barnamenegar.com") { | 
				
			||||||
 | 
					        window.localStorage.removeItem("activeRoleId"); | 
				
			||||||
 | 
					        window.sessionStorage.removeItem("userData"); | 
				
			||||||
 | 
					        window.sessionStorage.removeItem("sessionId"); | 
				
			||||||
 | 
					        window.Axios.post("/user/logout", { timeout: true }); | 
				
			||||||
 | 
					      } | 
				
			||||||
 | 
					      // return "نشست شما خاتمه پیدا کرد"; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					  return null; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					// } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					root.render( | 
				
			||||||
 | 
					  //   <StrictMode> | 
				
			||||||
 | 
					  <Router> | 
				
			||||||
 | 
					    <Provider store={store}> | 
				
			||||||
 | 
					      <App /> | 
				
			||||||
 | 
					    </Provider> | 
				
			||||||
 | 
					  </Router> | 
				
			||||||
 | 
					  //   </StrictMode> | 
				
			||||||
 | 
					); | 
				
			||||||
@ -0,0 +1,21 @@ | 
				
			|||||||
 | 
					import Button from "~/components/Button" | 
				
			||||||
 | 
					function Landing() { | 
				
			||||||
 | 
					  return ( | 
				
			||||||
 | 
					    <div className='flex flex-col items-center w-full '> | 
				
			||||||
 | 
					      <div className="flex items-center justify-center mb-6"> | 
				
			||||||
 | 
					        <img src="/images/logo.png" alt="flower" className="w-[250px] "/> | 
				
			||||||
 | 
					       | 
				
			||||||
 | 
					      </div> | 
				
			||||||
 | 
					      <div className="flex items-center justify-center"> | 
				
			||||||
 | 
					<p className="font-4 rtl w-[500px] h-[150px] text-md text-gray-400">سلام و عرض ارادت ! | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					این پرسشنامه شامل فرم مشخصات عمومی و ارزشیابی شخصی شما از مهارت ها و شامل 32 سوال فنی است و حدود 45 دقیقه ممکن است نیاز به زمان داشته باشد<br/>. | 
				
			||||||
 | 
					پیشاپیش از وقتی که میگذارید صمیمانه سپاسگزاریم و آرزوی بهترین ها را برای شما داریم .<br/> | 
				
			||||||
 | 
					بنا بر این اگر آماده یک چالش کوچک هستید </p> | 
				
			||||||
 | 
					      </div> | 
				
			||||||
 | 
					      <Button text="بیا شروع کنیم" className="px-4" primary/> | 
				
			||||||
 | 
					    </div> | 
				
			||||||
 | 
					  ) | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default Landing | 
				
			||||||
@ -0,0 +1,77 @@ | 
				
			|||||||
 | 
					import proxy from "~/redux/proxy"; | 
				
			||||||
 | 
					const prefix = "admin/"; | 
				
			||||||
 | 
					const admin = { | 
				
			||||||
 | 
					  backupLink: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await proxy.get("admin/backupLink", data, { dispatch }), | 
				
			||||||
 | 
					  list: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get( | 
				
			||||||
 | 
					        prefix + data._service + "/", | 
				
			||||||
 | 
					        { ...data, schema: true }, | 
				
			||||||
 | 
					        { dispatch } | 
				
			||||||
 | 
					      ); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  info: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get(prefix + data._service + "/" + data.id, data, { | 
				
			||||||
 | 
					        dispatch, | 
				
			||||||
 | 
					      }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  add: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.post(prefix + data._service + "/add", data, { | 
				
			||||||
 | 
					        dispatch, | 
				
			||||||
 | 
					      }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  delete: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.delete( | 
				
			||||||
 | 
					        prefix + data._service + "/delete/" + data.id, | 
				
			||||||
 | 
					        data, | 
				
			||||||
 | 
					        { | 
				
			||||||
 | 
					          dispatch, | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					      ); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  update: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.put( | 
				
			||||||
 | 
					        prefix + data._service + "/update/" + data.id, | 
				
			||||||
 | 
					        data, | 
				
			||||||
 | 
					        { | 
				
			||||||
 | 
					          dispatch, | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					      ); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  getExcelData: (data) => async (dispatch) => { | 
				
			||||||
 | 
					    return await proxy.get( | 
				
			||||||
 | 
					      prefix + data._service + "/list", | 
				
			||||||
 | 
					      { ...data, excelData: true }, | 
				
			||||||
 | 
					      { dispatch } | 
				
			||||||
 | 
					    ); | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  clearExcelData: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      await dispatch({ | 
				
			||||||
 | 
					        type: prefix + data._service + "/clearExcelData", | 
				
			||||||
 | 
					        data, | 
				
			||||||
 | 
					      }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  timeReport: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get(prefix + data._service + "/timeReport", data, { | 
				
			||||||
 | 
					        dispatch, | 
				
			||||||
 | 
					      }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default admin; | 
				
			||||||
@ -0,0 +1,21 @@ | 
				
			|||||||
 | 
					import proxy from "../proxy"; | 
				
			||||||
 | 
					const audit = { | 
				
			||||||
 | 
					  check: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await proxy.get("audit/check", data, { dispatch }), | 
				
			||||||
 | 
					  revokeRole: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await proxy.get("audit/revokeRole", data, { dispatch }), | 
				
			||||||
 | 
					  revokeTask: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await proxy.get("audit/revokeTask", data, { dispatch }), | 
				
			||||||
 | 
					  multiAssign: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await proxy.post("audit/multiAssign", data, { dispatch }), | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default audit; | 
				
			||||||
@ -0,0 +1,73 @@ | 
				
			|||||||
 | 
					import proxy from "~/redux/proxy"; | 
				
			||||||
 | 
					const prefix = "auto/"; | 
				
			||||||
 | 
					const auto = { | 
				
			||||||
 | 
					  list: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					      async (dispatch) => { | 
				
			||||||
 | 
					        return await proxy.get( | 
				
			||||||
 | 
					          prefix + data._service + "/", | 
				
			||||||
 | 
					          { ...data, schema: true }, | 
				
			||||||
 | 
					          { dispatch } | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					      }, | 
				
			||||||
 | 
					  info: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					      async (dispatch) => { | 
				
			||||||
 | 
					        return await proxy.get(prefix + data._service + "/" + data.id, data, { | 
				
			||||||
 | 
					          dispatch, | 
				
			||||||
 | 
					        }); | 
				
			||||||
 | 
					      }, | 
				
			||||||
 | 
					  add: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					      async (dispatch) => { | 
				
			||||||
 | 
					        return await proxy.post(prefix + data._service + "/add", data, { | 
				
			||||||
 | 
					          dispatch, | 
				
			||||||
 | 
					        }); | 
				
			||||||
 | 
					      }, | 
				
			||||||
 | 
					  delete: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					      async (dispatch) => { | 
				
			||||||
 | 
					        return await proxy.delete( | 
				
			||||||
 | 
					          prefix + data._service + "/delete/" + data.id, | 
				
			||||||
 | 
					          data, | 
				
			||||||
 | 
					          { | 
				
			||||||
 | 
					            dispatch, | 
				
			||||||
 | 
					          } | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					      }, | 
				
			||||||
 | 
					  update: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					      async (dispatch) => { | 
				
			||||||
 | 
					        return await proxy.put( | 
				
			||||||
 | 
					          prefix + data._service + "/update/" + data.id, | 
				
			||||||
 | 
					          data, | 
				
			||||||
 | 
					          { | 
				
			||||||
 | 
					            dispatch, | 
				
			||||||
 | 
					          } | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					      }, | 
				
			||||||
 | 
					  getExcelData: (data) => async (dispatch) => { | 
				
			||||||
 | 
					    return await proxy.get( | 
				
			||||||
 | 
					      prefix + data._service + "/", | 
				
			||||||
 | 
					      { ...data, excelData: true }, | 
				
			||||||
 | 
					      { dispatch } | 
				
			||||||
 | 
					    ); | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  clearExcelData: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					      async (dispatch) => { | 
				
			||||||
 | 
					        await dispatch({ | 
				
			||||||
 | 
					          type: prefix + data._service + "/clearExcelData", | 
				
			||||||
 | 
					          data, | 
				
			||||||
 | 
					        }); | 
				
			||||||
 | 
					      }, | 
				
			||||||
 | 
					  timeReport: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					      async (dispatch) => { | 
				
			||||||
 | 
					        return await proxy.get(prefix + data._service + "/timeReport", data, { | 
				
			||||||
 | 
					          dispatch, | 
				
			||||||
 | 
					        }); | 
				
			||||||
 | 
					      }, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default auto; | 
				
			||||||
@ -0,0 +1,37 @@ | 
				
			|||||||
 | 
					import proxy from "../proxy"; | 
				
			||||||
 | 
					const book = { | 
				
			||||||
 | 
					  list: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await proxy.get("book/list", data, { dispatch }), | 
				
			||||||
 | 
					  info: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await proxy.get("book/info", data, { dispatch }), | 
				
			||||||
 | 
					  update: | 
				
			||||||
 | 
					    (data = {}, data2 = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.put("book/update", data); | 
				
			||||||
 | 
					      return await proxy.get("book/list", data2, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  add: | 
				
			||||||
 | 
					    (data = {}, data2 = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.post("book/add", data); | 
				
			||||||
 | 
					      return await proxy.get("book/list", data2, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  del: | 
				
			||||||
 | 
					    (data = {}, data2 = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.delete("book/delete", data); | 
				
			||||||
 | 
					      return await proxy.get("book/list", data2, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  searchBook: (data) => async (dispatch) => { | 
				
			||||||
 | 
					    dispatch({ type: "book/search", data: data }); | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  filterBook: (data) => async (dispatch) => { | 
				
			||||||
 | 
					    dispatch({ type: "book/filter", data: data }); | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default book; | 
				
			||||||
@ -0,0 +1,43 @@ | 
				
			|||||||
 | 
					import proxy from "~/redux/proxy"; | 
				
			||||||
 | 
					const certificate = { | 
				
			||||||
 | 
					  list: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await proxy.get("certificate/list", data, { dispatch }), | 
				
			||||||
 | 
					  add: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await proxy.post("certificate/add", data, { dispatch }), | 
				
			||||||
 | 
					  healthQualification_start: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await proxy.post("certificate/healthQualification/start", data, { | 
				
			||||||
 | 
					        dispatch, | 
				
			||||||
 | 
					      }), | 
				
			||||||
 | 
					  freeAuditRegistration_start: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await proxy.post("certificate/freeAuditRegistration/start", data, { | 
				
			||||||
 | 
					        dispatch, | 
				
			||||||
 | 
					      }), | 
				
			||||||
 | 
					  certifiedGuildAddUnitStart: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await proxy.post("certificate/certifiedGuildAddUnitStart", data, { | 
				
			||||||
 | 
					        dispatch, | 
				
			||||||
 | 
					      }), | 
				
			||||||
 | 
					  freeAuditAddUnitStart: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await proxy.post("certificate/freeAuditAddUnitStart", data, { | 
				
			||||||
 | 
					        dispatch, | 
				
			||||||
 | 
					      }), | 
				
			||||||
 | 
					  checkConflict: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await proxy.get("certificate/checkConflict", data, { | 
				
			||||||
 | 
					        dispatch, | 
				
			||||||
 | 
					      }), | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default certificate; | 
				
			||||||
@ -0,0 +1,35 @@ | 
				
			|||||||
 | 
					import proxy from "~/redux/proxy"; | 
				
			||||||
 | 
					const comment = { | 
				
			||||||
 | 
					  list: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get("comment/list", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  info: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get("comment/info", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  add: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.post("comment/add", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  homePage: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get("comment/homePage", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  delete: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.delete("comment/delete", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  update: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.put("comment/update", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default comment; | 
				
			||||||
@ -0,0 +1,30 @@ | 
				
			|||||||
 | 
					const config = { | 
				
			||||||
 | 
					  setDialog: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      await dispatch({ type: "config/setDialog", data }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  setBottomSheet: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await dispatch({ type: "config/setBottomSheet", data }), | 
				
			||||||
 | 
					  setMenu: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await dispatch({ type: "config/setMenu", data }), | 
				
			||||||
 | 
					  setHeader: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await dispatch({ type: "config/setHeader", data }), | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  setTheme: (data) => async (dispatch) => | 
				
			||||||
 | 
					    await dispatch({ type: "config/setTheme", data }), | 
				
			||||||
 | 
					  addTheme: (data) => async (dispatch) => | 
				
			||||||
 | 
					    await dispatch({ type: "config/addTheme", data }), | 
				
			||||||
 | 
					  deleteTheme: (data) => async (dispatch) => | 
				
			||||||
 | 
					    await dispatch({ type: "config/deleteTheme", data }), | 
				
			||||||
 | 
					  setDevice: (data) => async (dispatch) => | 
				
			||||||
 | 
					    await dispatch({ type: "config/setDevice", data }), | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default config; | 
				
			||||||
@ -0,0 +1,17 @@ | 
				
			|||||||
 | 
					import proxy from "~/redux/proxy"; | 
				
			||||||
 | 
					const content = { | 
				
			||||||
 | 
					  list: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await proxy.get("content/list", data, { dispatch }), | 
				
			||||||
 | 
					  add: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await proxy.post("content/add", data, { dispatch }), | 
				
			||||||
 | 
					  info: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await proxy.get("content/info", data, { dispatch }), | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default content; | 
				
			||||||
@ -0,0 +1,17 @@ | 
				
			|||||||
 | 
					import proxy from "../proxy"; | 
				
			||||||
 | 
					const craft = { | 
				
			||||||
 | 
					  add: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await proxy.post("layout/add", data, { dispatch }), | 
				
			||||||
 | 
					  get: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await proxy.get("layout/info", data, { dispatch }), | 
				
			||||||
 | 
					  update: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await proxy.put("layout/update", data, { dispatch }), | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default craft; | 
				
			||||||
@ -0,0 +1,9 @@ | 
				
			|||||||
 | 
					import proxy from "../proxy"; | 
				
			||||||
 | 
					const documents = { | 
				
			||||||
 | 
					  list: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await proxy.post("sync/documentDataModel", data, { dispatch }), | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default documents; | 
				
			||||||
@ -0,0 +1,19 @@ | 
				
			|||||||
 | 
					import proxy from "~/redux/proxy"; | 
				
			||||||
 | 
					const faq = { | 
				
			||||||
 | 
					  list: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await proxy.get("faq/list", data, { dispatch }), | 
				
			||||||
 | 
					  register: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await proxy.post("faq/add", data, { dispatch }), | 
				
			||||||
 | 
					  selectFaq: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await dispatch({ type: "faq/selectFaq", data: data }), | 
				
			||||||
 | 
					  searchFaq: (data) => async (dispatch) => | 
				
			||||||
 | 
					    await dispatch({ type: "faq/search", data: data }), | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default faq; | 
				
			||||||
@ -0,0 +1,19 @@ | 
				
			|||||||
 | 
					import proxy from "~/redux/proxy"; | 
				
			||||||
 | 
					const faq = { | 
				
			||||||
 | 
					  list: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await proxy.get("faq/list", data, { dispatch }), | 
				
			||||||
 | 
					  add: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await proxy.post("faq/add", data, { dispatch }), | 
				
			||||||
 | 
					  selectFaq: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await dispatch({ type: "faq/selectFaq", data: data }), | 
				
			||||||
 | 
					  searchFaq: (data) => async (dispatch) => | 
				
			||||||
 | 
					    await dispatch({ type: "faq/search", data: data }), | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default faq; | 
				
			||||||
@ -0,0 +1,122 @@ | 
				
			|||||||
 | 
					import proxy from "~/redux/proxy"; | 
				
			||||||
 | 
					const extToMimes = { | 
				
			||||||
 | 
					  jpg: "image/jpeg", | 
				
			||||||
 | 
					  png: "image/png", | 
				
			||||||
 | 
					  mp4: "video/mp4", | 
				
			||||||
 | 
					  doc: "application/msword", | 
				
			||||||
 | 
					  bmp: "image/bmp", | 
				
			||||||
 | 
					  docx: "application/vnd.openxmlformats-officedocument.wordprocessingml.document", | 
				
			||||||
 | 
					  xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", | 
				
			||||||
 | 
					  mp3: "audio/mpeg", | 
				
			||||||
 | 
					  pdf: "application/pdf", | 
				
			||||||
 | 
					  zip: "application/zip", | 
				
			||||||
 | 
					  rar: "application/vnd.rar", | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					const headers = { | 
				
			||||||
 | 
					  "504B0304": "application/zip", | 
				
			||||||
 | 
					  25504446: "application/pdf", | 
				
			||||||
 | 
					  "504b34": | 
				
			||||||
 | 
					    "application/x-zip-compressed|application/vnd.openxmlformats-officedocument.wordprocessingml.document|application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", | 
				
			||||||
 | 
					  "89504e47": "image/png", | 
				
			||||||
 | 
					  ffd8ffe0: "image/jpeg", | 
				
			||||||
 | 
					  ffd8ffe1: "image/jpeg", | 
				
			||||||
 | 
					  ffd8ffe2: "image/jpeg", | 
				
			||||||
 | 
					  ffd8ffe3: "image/jpeg", | 
				
			||||||
 | 
					  ffd8ffe8: "image/jpeg", | 
				
			||||||
 | 
					  47494638: "image/gif", | 
				
			||||||
 | 
					  d0cf11e0: "application/msword", | 
				
			||||||
 | 
					  "6674797069736F6D": "video/mp4", | 
				
			||||||
 | 
					  494433: "audio/mpeg", | 
				
			||||||
 | 
					  "526172211A0700": "application/vnd.rar", | 
				
			||||||
 | 
					  "526172211A070100": "application/vnd.rar", | 
				
			||||||
 | 
					  "424D": "image/bmp", | 
				
			||||||
 | 
					  "223f636f": "text/csv", | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					function getMimeType(file, callback) { | 
				
			||||||
 | 
					  const fileReader = new FileReader(); | 
				
			||||||
 | 
					  fileReader.onloadend = function (event) { | 
				
			||||||
 | 
					    let mimeType = ""; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const arr = new Uint8Array(event.target.result).subarray(0, 4); | 
				
			||||||
 | 
					    let header = ""; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (let index = 0; index < arr.length; index++) { | 
				
			||||||
 | 
					      header += arr[index].toString(16); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					    mimeType = headers[header]; | 
				
			||||||
 | 
					    if (!mimeType) console.log("!mimeType Header:", header); | 
				
			||||||
 | 
					    callback(mimeType); | 
				
			||||||
 | 
					  }; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  fileReader.readAsArrayBuffer(file); | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					// import * as fileType from "file-type";
 | 
				
			||||||
 | 
					const file = { | 
				
			||||||
 | 
					  getLimits: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await proxy.get("file/limits", data, { dispatch }), | 
				
			||||||
 | 
					  setSignature: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await dispatch({ type: "file/setSignature", data }), | 
				
			||||||
 | 
					  upload: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      let mimeType = await new Promise((r) => getMimeType(data.file, r)); | 
				
			||||||
 | 
					      if ( | 
				
			||||||
 | 
					        !window.config.admin_config_uploadExtensions | 
				
			||||||
 | 
					          .split(",") | 
				
			||||||
 | 
					          .includes(data.file.name.split(".").slice(-1)[0]) | 
				
			||||||
 | 
					      ) | 
				
			||||||
 | 
					        return { statusCode: 400, message: "پسوند فایل ارسالی مجاز نیست" }; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (!mimeType || !mimeType.split("|").includes(data.file.type)) | 
				
			||||||
 | 
					        return { statusCode: 400, message: "فرمت فایل ارسالی مجاز نیست" }; | 
				
			||||||
 | 
					      if ( | 
				
			||||||
 | 
					        data.file.size > | 
				
			||||||
 | 
					        window.config.admin_config_maxUploadSize * 1024 * 1024 | 
				
			||||||
 | 
					      ) | 
				
			||||||
 | 
					        return { | 
				
			||||||
 | 
					          statusCode: 400, | 
				
			||||||
 | 
					          message: `حجم فایل ارسالی باید کمتر از ${window.config.admin_config_maxUploadSize} مگابایت باشد`, | 
				
			||||||
 | 
					        }; | 
				
			||||||
 | 
					      var formData = new FormData(); | 
				
			||||||
 | 
					      for (let key in data) formData.append(key, data[key]); | 
				
			||||||
 | 
					      return await proxy.post( | 
				
			||||||
 | 
					        "file/upload", | 
				
			||||||
 | 
					        formData, | 
				
			||||||
 | 
					        { | 
				
			||||||
 | 
					          dispatch, | 
				
			||||||
 | 
					          headers: { | 
				
			||||||
 | 
					            "Content-Type": "multipart/form-data", | 
				
			||||||
 | 
					          }, | 
				
			||||||
 | 
					        }, | 
				
			||||||
 | 
					        data | 
				
			||||||
 | 
					      ); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  directUpload: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      var formData = new FormData(); | 
				
			||||||
 | 
					      for (let key in data) formData.append(key, data[key]); | 
				
			||||||
 | 
					      return await proxy.post( | 
				
			||||||
 | 
					        "file/directUpload", | 
				
			||||||
 | 
					        formData, | 
				
			||||||
 | 
					        { | 
				
			||||||
 | 
					          dispatch, | 
				
			||||||
 | 
					          headers: { | 
				
			||||||
 | 
					            "Content-Type": "multipart/form-data", | 
				
			||||||
 | 
					          }, | 
				
			||||||
 | 
					        }, | 
				
			||||||
 | 
					        data | 
				
			||||||
 | 
					      ); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  loading: (data) => (dispatch) => dispatch({ type: "file/loading", data }), | 
				
			||||||
 | 
					  groupList: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await proxy.get("file/group/list", data, { dispatch }), | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default file; | 
				
			||||||
@ -0,0 +1,89 @@ | 
				
			|||||||
 | 
					import proxy from "~/redux/proxy"; | 
				
			||||||
 | 
					const healthCard = { | 
				
			||||||
 | 
					  updatePrintDate: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.put("healthCard/updatePrintDate", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  setVoid: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.put("healthCard/setVoid", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  revertAutoCancel: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.put("healthCard/revertAutoCancel", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  changeJobId: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.put("healthCard/changeJobId", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  abate: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.post("healthCard/abate", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  forceApprove: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.post("healthCard/forceApprove", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  voidIncorrectUniversity: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.post("healthCard/voidIncorrectUniversity", data, { | 
				
			||||||
 | 
					        dispatch, | 
				
			||||||
 | 
					      }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  getJobs: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get("healthCard/getJobs", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  list: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get("healthCard/list", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  getExcelData: (data) => async (dispatch) => { | 
				
			||||||
 | 
					    return await proxy.get( | 
				
			||||||
 | 
					      "healthCard/list", | 
				
			||||||
 | 
					      { ...data, excelData: true }, | 
				
			||||||
 | 
					      { dispatch } | 
				
			||||||
 | 
					    ); | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  clearExcelData: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      await dispatch({ type: "healthCard/clearExcelData", data }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  getlog: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get("healthCard/nationalIdLog", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  info: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get("healthCard/info", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  add: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.post("healthCard/add", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  delete: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.delete("healthCard/delete", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  update: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.put("healthCard/update", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default healthCard; | 
				
			||||||
@ -0,0 +1,38 @@ | 
				
			|||||||
 | 
					// @create-index
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export { default as book } from "./book.js"; | 
				
			||||||
 | 
					export { default as comment } from "./comment.js"; | 
				
			||||||
 | 
					export { default as config } from "./config.js"; | 
				
			||||||
 | 
					export { default as faq } from "./faq.js"; | 
				
			||||||
 | 
					export { default as file } from "./file.js"; | 
				
			||||||
 | 
					export { default as map } from "./map.js"; | 
				
			||||||
 | 
					export { default as menu } from "./menu.js"; | 
				
			||||||
 | 
					export { default as offCode } from "./offCode.js"; | 
				
			||||||
 | 
					export { default as otp } from "./otp.js"; | 
				
			||||||
 | 
					export { default as process } from "./process.js"; | 
				
			||||||
 | 
					export { default as product } from "./product.js"; | 
				
			||||||
 | 
					export { default as publicApi } from "./publicApi.js"; | 
				
			||||||
 | 
					export { default as report } from "./report.js"; | 
				
			||||||
 | 
					export { default as role } from "./role.js"; | 
				
			||||||
 | 
					export { default as roleFunction } from "./roleFunction.js"; | 
				
			||||||
 | 
					export { default as user } from "./user.js"; | 
				
			||||||
 | 
					export { default as userFactor } from "./userFactor.js"; | 
				
			||||||
 | 
					export { default as userProduct } from "./userProduct.js"; | 
				
			||||||
 | 
					export { default as userFavorite } from "./userFavorite.js"; | 
				
			||||||
 | 
					export { default as userAddress } from "./userAddress.js"; | 
				
			||||||
 | 
					export { default as admin } from "./admin.js"; | 
				
			||||||
 | 
					export { default as auto } from "./auto.js"; | 
				
			||||||
 | 
					export { default as craft } from "./craft.js"; | 
				
			||||||
 | 
					export { default as transport } from "./transport.js"; | 
				
			||||||
 | 
					export { default as task } from "./task.js"; | 
				
			||||||
 | 
					export { default as unit } from "./unit.js"; | 
				
			||||||
 | 
					export { default as healthCard } from "./healthCard.js"; | 
				
			||||||
 | 
					export { default as network } from "./network.js"; | 
				
			||||||
 | 
					export { default as inspection } from "./inspection.js"; | 
				
			||||||
 | 
					export { default as waterSupply } from "./waterSupply.js"; | 
				
			||||||
 | 
					export { default as content } from "./content.js"; | 
				
			||||||
 | 
					export { default as certificate } from "./certificate.js"; | 
				
			||||||
 | 
					export { default as workFlow } from "./workFlow.js"; | 
				
			||||||
 | 
					export { default as documents } from "./documents.js"; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export { default as audit } from "./audit.js"; | 
				
			||||||
@ -0,0 +1,49 @@ | 
				
			|||||||
 | 
					import proxy from "~/redux/proxy"; | 
				
			||||||
 | 
					const inspection = { | 
				
			||||||
 | 
					  getStatics: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get("bpms/inspection/statistics/network", data, { | 
				
			||||||
 | 
					        dispatch, | 
				
			||||||
 | 
					      }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  list: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get("inspection/list", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  getExcelData: (data) => async (dispatch) => { | 
				
			||||||
 | 
					    return await proxy.get( | 
				
			||||||
 | 
					      "inspection/list", | 
				
			||||||
 | 
					      { ...data, excelData: true }, | 
				
			||||||
 | 
					      { dispatch } | 
				
			||||||
 | 
					    ); | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  clearExcelData: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      await dispatch({ type: "inspection/clearExcelData", data }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  info: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get("inspection/info", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  add: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.post("inspection/add", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  delete: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.delete("inspection/delete", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  update: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.put("inspection/update", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default inspection; | 
				
			||||||
@ -0,0 +1,13 @@ | 
				
			|||||||
 | 
					import proxy from "~/redux/proxy"; | 
				
			||||||
 | 
					const map = { | 
				
			||||||
 | 
					  setDrawJSON: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    (dispatch) => | 
				
			||||||
 | 
					      dispatch({ type: "map/setDrawJSON", data }), | 
				
			||||||
 | 
					  setMap: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    (dispatch) => | 
				
			||||||
 | 
					      dispatch({ type: "map/setMap", data }), | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default map; | 
				
			||||||
@ -0,0 +1,45 @@ | 
				
			|||||||
 | 
					import proxy from "~/redux/proxy"; | 
				
			||||||
 | 
					const menu = { | 
				
			||||||
 | 
					  list: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get("menu/list", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  homePage: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get("menu/homePage", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  Adminlist: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get("menu/admin/list", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  info: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get("menu/info", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  add: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.post("menu/add", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  homePage: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get("menu/homePage", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  delete: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.delete("menu/delete", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  update: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.put("menu/update", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default menu; | 
				
			||||||
@ -0,0 +1,42 @@ | 
				
			|||||||
 | 
					import proxy from "~/redux/proxy"; | 
				
			||||||
 | 
					const network = { | 
				
			||||||
 | 
					  list: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get("network/list", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  getExcelData: (data) => async (dispatch) => { | 
				
			||||||
 | 
					    return await proxy.get( | 
				
			||||||
 | 
					      "network/list", | 
				
			||||||
 | 
					      { ...data, excelData: true }, | 
				
			||||||
 | 
					      { dispatch } | 
				
			||||||
 | 
					    ); | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  clearExcelData: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      await dispatch({ type: "network/clearExcelData", data }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  info: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get("network/info", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  add: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.post("network/add", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  delete: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.delete("network/delete", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  update: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.put("network/update", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default network; | 
				
			||||||
@ -0,0 +1,47 @@ | 
				
			|||||||
 | 
					import proxy from "~/redux/proxy"; | 
				
			||||||
 | 
					const network = { | 
				
			||||||
 | 
					  list: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get("network/list", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  getExcelData: (data) => async (dispatch) => { | 
				
			||||||
 | 
					    return await proxy.get( | 
				
			||||||
 | 
					      "network/list", | 
				
			||||||
 | 
					      { ...data, excelData: true }, | 
				
			||||||
 | 
					      { dispatch } | 
				
			||||||
 | 
					    ); | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  clearExcelData: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      await dispatch({ type: "network/clearExcelData", data }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  info: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get("network/info", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  add: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.post("network/add", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  delete: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.delete("network/delete", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  update: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.put("network/update", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  transfer: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.put("network/transfer", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default network; | 
				
			||||||
@ -0,0 +1,9 @@ | 
				
			|||||||
 | 
					import proxy from "../proxy"; | 
				
			||||||
 | 
					const offCode = { | 
				
			||||||
 | 
					  list: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await proxy.get("offCode/list", data, { dispatch }), | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default offCode; | 
				
			||||||
@ -0,0 +1,8 @@ | 
				
			|||||||
 | 
					const otp = { | 
				
			||||||
 | 
					  set: (data) => async (dispatch) => | 
				
			||||||
 | 
					    await dispatch({ type: "authentication/otp/set", data: data }), | 
				
			||||||
 | 
					  reset:  (data) => async (dispatch) => | 
				
			||||||
 | 
					  await dispatch({ type: "authentication/otp/reset" }), | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default otp; | 
				
			||||||
@ -0,0 +1,35 @@ | 
				
			|||||||
 | 
					import proxy from "~/redux/proxy"; | 
				
			||||||
 | 
					const user = { | 
				
			||||||
 | 
					  list: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get("process/list", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  info: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get("process/info", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  add: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.post("process/add", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  copy: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.post("process/copy", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  delete: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.delete("process/delete", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  update: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.put("process/update", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default user; | 
				
			||||||
@ -0,0 +1,51 @@ | 
				
			|||||||
 | 
					import proxy from "~/redux/proxy"; | 
				
			||||||
 | 
					const product = { | 
				
			||||||
 | 
					  getSimilar: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await proxy.get("product/similar", data, { dispatch }), | 
				
			||||||
 | 
					  list: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get("product/list", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  getExcelData: (data) => async (dispatch) => { | 
				
			||||||
 | 
					    return await proxy.get( | 
				
			||||||
 | 
					      "product/list", | 
				
			||||||
 | 
					      { ...data, excelData: true }, | 
				
			||||||
 | 
					      { dispatch } | 
				
			||||||
 | 
					    ); | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  clearExcelData: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      await dispatch({ type: "product/clearExcelData", data }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  info: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get("product/info", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  add: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.post("product/add", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  homePage: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get("product/homePage", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  delete: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.delete("product/delete", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  update: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.put("product/update", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default product; | 
				
			||||||
@ -0,0 +1,59 @@ | 
				
			|||||||
 | 
					import proxy from "~/redux/proxy"; | 
				
			||||||
 | 
					const publicApi = { | 
				
			||||||
 | 
					  report: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await proxy.post("public/report", data, { dispatch }), | 
				
			||||||
 | 
					  //blog start
 | 
				
			||||||
 | 
					  captcha: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await proxy.get("public/captcha", data, { dispatch }), | 
				
			||||||
 | 
					  setHashtag: (data) => async (dispatch) => | 
				
			||||||
 | 
					    await dispatch({ type: "public/setHashtag", data }), | 
				
			||||||
 | 
					  blogList: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await proxy.get("public/blogList", data, { dispatch }), | 
				
			||||||
 | 
					  blogInfo: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await proxy.get("public/blogInfo", data, { dispatch }), | 
				
			||||||
 | 
					  // blog end
 | 
				
			||||||
 | 
					  bookInfo: | 
				
			||||||
 | 
					    (data = {}, data2 = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get("public/vod/bookCourse", data, { dispatch }); | 
				
			||||||
 | 
					      // return await proxy.get("book/info", data2, { dispatch });
 | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  bookSection: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await proxy.get("public/vod/bookSection", data, { dispatch }), | 
				
			||||||
 | 
					  activeSeason: (data) => async (dispatch) => | 
				
			||||||
 | 
					    await dispatch({ type: "public/vod/activeSeason", data }), | 
				
			||||||
 | 
					  activeVOD: (data) => async (dispatch) => | 
				
			||||||
 | 
					    await dispatch({ type: "public/vod/activeVOD", data }), | 
				
			||||||
 | 
					  loginMenu: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await proxy.get("public/loginMenu", data, { dispatch }), | 
				
			||||||
 | 
					  changesLog: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await proxy.get("public/changesLog", data, { dispatch }), | 
				
			||||||
 | 
					  sliderList: (data) => async (dispatch) => | 
				
			||||||
 | 
					    await proxy.get("public/slider/list", data, { dispatch }), | 
				
			||||||
 | 
					  sendOtp: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await proxy.get("public/otp", data, { dispatch }), | 
				
			||||||
 | 
					  clearOtp: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      dispatch({ type: "public/clearOtp", data }), | 
				
			||||||
 | 
					  getArList: (data) => async (dispatch) => | 
				
			||||||
 | 
					    await proxy.get("public/ar", data, { dispatch }), | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default publicApi; | 
				
			||||||
@ -0,0 +1,48 @@ | 
				
			|||||||
 | 
					import proxy from "../proxy"; | 
				
			||||||
 | 
					const report = { | 
				
			||||||
 | 
					  product_dashboard: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await proxy.get("report/product/dashboard", data, { dispatch }), | 
				
			||||||
 | 
					  content_dashboard: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await proxy.get("report/content/dashboard", data, { dispatch }), | 
				
			||||||
 | 
					  productType_sold_count: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await proxy.get("report/productType/sold/count", data, { dispatch }), | 
				
			||||||
 | 
					  getClinets: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await proxy.get("report/clients", data, { dispatch }), | 
				
			||||||
 | 
					  grade_sold_count: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await proxy.get("report/grade/sold/count", data, { dispatch }), | 
				
			||||||
 | 
					  book_sold_count: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await proxy.get("report/book/sold/count", data, { dispatch }), | 
				
			||||||
 | 
					  product_total_sold: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await proxy.get("report/product/total/sold", data, { dispatch }), | 
				
			||||||
 | 
					  code_total_sold: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await proxy.get("report/code/total/sold", data, { dispatch }), | 
				
			||||||
 | 
					  getData: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await proxy.get("report/getData", data, { dispatch }), | 
				
			||||||
 | 
					  list: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await proxy.get("report/list", data, { dispatch }), | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  clearData: (data) => async (dispatch) => | 
				
			||||||
 | 
					    await dispatch({ type: "report/clearData", data }), | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default report; | 
				
			||||||
@ -0,0 +1,6 @@ | 
				
			|||||||
 | 
					const role = { | 
				
			||||||
 | 
					  set: (data) => async (dispatch) => | 
				
			||||||
 | 
					    await dispatch({ type: "authentication/role/set", data }), | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default role; | 
				
			||||||
@ -0,0 +1,40 @@ | 
				
			|||||||
 | 
					import proxy from "~/redux/proxy"; | 
				
			||||||
 | 
					const menu = { | 
				
			||||||
 | 
					  list: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get( | 
				
			||||||
 | 
					        "admin/roleFunction", | 
				
			||||||
 | 
					        { ...data, schema: true }, | 
				
			||||||
 | 
					        { dispatch } | 
				
			||||||
 | 
					      ); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  info: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get("admin/roleFunction/" + data.id, data, { | 
				
			||||||
 | 
					        dispatch, | 
				
			||||||
 | 
					      }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  add: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.post("admin/roleFunction/add", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  delete: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.delete("admin/roleFunction/delete/" + data.id, data, { | 
				
			||||||
 | 
					        dispatch, | 
				
			||||||
 | 
					      }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  update: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.put("admin/roleFunction/update/" + data.id, data, { | 
				
			||||||
 | 
					        dispatch, | 
				
			||||||
 | 
					      }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default menu; | 
				
			||||||
@ -0,0 +1,118 @@ | 
				
			|||||||
 | 
					import proxy from "../proxy"; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const task = { | 
				
			||||||
 | 
					  inactive: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.post("bpms/taskFlow/inactive", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  draft: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.post("bpms/task/draft", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  done: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.post("bpms/task/done", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  archive: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.put("bpms/task/archive", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  revert: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.post("bpms/task/revert", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  cancel: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.post("bpms/task/cancel", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  rollback: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get("bpms/task/rollback", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  rollback2: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get("bpms/task/rollback2", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  startable: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get("bpms/process/startable", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  inboxInfo: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get("bpms/inboxInfo", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  start: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.post("bpms/process/start", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  list: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get("bpms/task/list", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  processList: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get("bpms/process/list", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  getExcelData: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get("bpms/task/list", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  htmlCreator: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get("bpms/htmlCreator", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  checklistInfo: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get("bpms/task/checklistInfo", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  info: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get("bpms/task/info", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  tree: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get("bpms/task/tree", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  done: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.post("bpms/task/done", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  periodicSampling: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get("bpms/periodicSampling", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  samplingStart: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.post("bpms/samplingStart", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  watersupply_startInspection: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.post("bpms/watersupply/startInspection", data, { | 
				
			||||||
 | 
					        dispatch, | 
				
			||||||
 | 
					      }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default task; | 
				
			||||||
@ -0,0 +1,17 @@ | 
				
			|||||||
 | 
					import proxy from "../proxy"; | 
				
			||||||
 | 
					const transport = { | 
				
			||||||
 | 
					  list: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get("transport/list", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  set: | 
				
			||||||
 | 
					    (data = {}, data2 = {}, data3 = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.post("transport/setTransport", data, { dispatch }); | 
				
			||||||
 | 
					      return await proxy.get("userFactor/info", data2, { dispatch }); | 
				
			||||||
 | 
					      return await proxy.get("transport/list", data3, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default transport; | 
				
			||||||
@ -0,0 +1,66 @@ | 
				
			|||||||
 | 
					import proxy from "~/redux/proxy"; | 
				
			||||||
 | 
					const unit = { | 
				
			||||||
 | 
					  instructions: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get("unit/instructions", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  list: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get("unit/list", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  getExcelData: (data) => async (dispatch) => { | 
				
			||||||
 | 
					    return await proxy.get( | 
				
			||||||
 | 
					      "unit/list", | 
				
			||||||
 | 
					      { ...data, excelData: true }, | 
				
			||||||
 | 
					      { dispatch } | 
				
			||||||
 | 
					    ); | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  clearExcelData: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await dispatch({ type: "unit/clearExcelData", data }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  info: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get("unit/info", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  checkContractLimit: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get("unit/checkContractLimit", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  add: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.post("unit/add", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  delete: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.delete("unit/delete", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  update: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.put("unit/update", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  healthQualification_list: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get("unit/healthQualification/list", data, { | 
				
			||||||
 | 
					        dispatch, | 
				
			||||||
 | 
					      }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  freeAuditorRevoke: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.post("unit/freeAuditorRevoke", data, { | 
				
			||||||
 | 
					        dispatch, | 
				
			||||||
 | 
					      }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default unit; | 
				
			||||||
@ -0,0 +1,155 @@ | 
				
			|||||||
 | 
					import proxy from "~/redux/proxy"; | 
				
			||||||
 | 
					const user = { | 
				
			||||||
 | 
					  signer: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await proxy.post("user/signer", data, { dispatch }), | 
				
			||||||
 | 
					  setActiveRoleId: (data) => async (dispatch) => | 
				
			||||||
 | 
					    dispatch({ type: "user/setActiveRoleId", data }), | 
				
			||||||
 | 
					  login: (data) => async (dispatch) => | 
				
			||||||
 | 
					    await proxy.login("user/login", data, { dispatch }), | 
				
			||||||
 | 
					  switchRole: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.login("user/switchRole", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  otp_login: (data) => async (dispatch) => | 
				
			||||||
 | 
					    await proxy.login("user/otp/login", data, { dispatch }), | 
				
			||||||
 | 
					  sso_login: (data) => async (dispatch) => | 
				
			||||||
 | 
					    await proxy.login("user/sso/login", data, { dispatch }), | 
				
			||||||
 | 
					  sso_login2: (data) => async (dispatch) => | 
				
			||||||
 | 
					    await proxy.login("user/sso/login2", data, { dispatch }), | 
				
			||||||
 | 
					  otp_register: (data) => async (dispatch) => | 
				
			||||||
 | 
					    await proxy.login("user/otp/register", data, { dispatch }), | 
				
			||||||
 | 
					  logout: (data) => async (dispatch) => | 
				
			||||||
 | 
					    await proxy.logout("user/logout", data, { dispatch }), | 
				
			||||||
 | 
					  getUserRole: (data) => async (dispatch) => | 
				
			||||||
 | 
					    await proxy.get("user/getUserRole", data, { dispatch }), | 
				
			||||||
 | 
					  getProfile: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await proxy.get("user/getProfile", data, { dispatch }), | 
				
			||||||
 | 
					  setProfile: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.put("user/setProfile", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  list: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get("user/list", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  getExcelData: (data) => async (dispatch) => { | 
				
			||||||
 | 
					    return await proxy.get( | 
				
			||||||
 | 
					      "user/list", | 
				
			||||||
 | 
					      { ...data, excelData: true }, | 
				
			||||||
 | 
					      { dispatch } | 
				
			||||||
 | 
					    ); | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  clearExcelData: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      await dispatch({ type: "user/clearExcelData", data }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  info: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get("user/info", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  add: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.post("user/add", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  setDefaultPassword: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.put("user/setDefaultPassword", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  resetPassword: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.post("user/resetPassword", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  addUserRole: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.post("user/addUserRole", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  deleteUserRole: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.delete("user/deleteUserRole", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  updateUserRole: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.put("user/updateUserRole", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  referAndDeleteUserRole: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.delete("user/referAndDeleteUserRole", data, { | 
				
			||||||
 | 
					        dispatch, | 
				
			||||||
 | 
					      }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  copyRoleFunction: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.post("user/copyRoleFunction", data, { | 
				
			||||||
 | 
					        dispatch, | 
				
			||||||
 | 
					      }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  delete: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.delete("user/delete", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  update: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.put("user/update", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  names: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get("user/names", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  setName: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.put("user/setName", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  examination_info: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get("user/examination/info", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  examination_add: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.post("user/examination/add", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  examination_update: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.put("user/examination/update", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  changeNetwork: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.put("user/changeNetwork", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  changeNetwork3: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.put("user/changeNetwork3", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  admin_otlt: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      await dispatch({ type: "user/admin/otlt", data }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default user; | 
				
			||||||
@ -0,0 +1,34 @@ | 
				
			|||||||
 | 
					import proxy from "../proxy"; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const userAddress = { | 
				
			||||||
 | 
					  list: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get("userAddress/list", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  info: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get("userAddress/info", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  update: | 
				
			||||||
 | 
					    (data = {}, data2 = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.put("userAddress/update", data, { dispatch }); | 
				
			||||||
 | 
					      // return await proxy.get("userAddress/list", data2, { dispatch });
 | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  add: | 
				
			||||||
 | 
					    (data = {}, data2 = {}, data3 = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.post("userAddress/add", data, { dispatch }); | 
				
			||||||
 | 
					      // return await proxy.get("userAddress/list", data2, { dispatch });
 | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  del: | 
				
			||||||
 | 
					    (data = {}, data2 = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.delete("userAddress/delete", data, { dispatch }); | 
				
			||||||
 | 
					      // return await proxy.get("userAddress/list", data2, { dispatch });
 | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default userAddress; | 
				
			||||||
@ -0,0 +1,82 @@ | 
				
			|||||||
 | 
					import proxy from "../proxy"; | 
				
			||||||
 | 
					const userFactor = { | 
				
			||||||
 | 
					  list: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await proxy.get("userFactor/list", data, { dispatch }), | 
				
			||||||
 | 
					  getExcelData: (data) => async (dispatch) => { | 
				
			||||||
 | 
					    return await proxy.get( | 
				
			||||||
 | 
					      "userFactor/list", | 
				
			||||||
 | 
					      { ...data, excelData: true }, | 
				
			||||||
 | 
					      { dispatch } | 
				
			||||||
 | 
					    ); | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  clearExcelData: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      await dispatch({ type: "userFactor/clearExcelData", data }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  orders: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await proxy.get("userFactor/orders", data, { dispatch }), | 
				
			||||||
 | 
					  info: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await proxy.get("userFactor/info", data, { dispatch }), | 
				
			||||||
 | 
					  AdminInfo: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await proxy.get("userFactor/admin/info", data, { dispatch }), | 
				
			||||||
 | 
					  update: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.put("userFactor/update", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  delete: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.delete("userFactor/delete", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  payment: | 
				
			||||||
 | 
					    (data = {}, data2 = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.post("userFactor/payment", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  verify: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.post("userFactor/verify", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  add: | 
				
			||||||
 | 
					    (data = {}, data2 = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.post("userFactor/add", data, { dispatch }); | 
				
			||||||
 | 
					      return await proxy.get("userFactor/list", data2, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  del: | 
				
			||||||
 | 
					    (data = {}, data2 = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.delete("userFactor/delete", data, { dispatch }); | 
				
			||||||
 | 
					      return await proxy.get("userFactor/list", data2, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  donate: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.post("userFactor/donate", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  deleteUserOffCode: | 
				
			||||||
 | 
					    (data = {}, data2 = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.delete("userFactor/deleteUserOffCode", data, { | 
				
			||||||
 | 
					        dispatch, | 
				
			||||||
 | 
					      }); | 
				
			||||||
 | 
					      return await proxy.get("userFactor/info", data2, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  fullList: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await proxy.get("userFactor/fullList", data, { dispatch }), | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default userFactor; | 
				
			||||||
@ -0,0 +1,27 @@ | 
				
			|||||||
 | 
					import proxy from "../proxy"; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const userFavorite = { | 
				
			||||||
 | 
					  list: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get("userFavorite/list", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  update: | 
				
			||||||
 | 
					    (data = {}, data2 = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.put("userFavorite/update", data); | 
				
			||||||
 | 
					      return await proxy.get("userFavorite/list", data2, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  add: | 
				
			||||||
 | 
					    (data = {}, data2 = {}, data3 = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.post("userFavorite/add", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  del: | 
				
			||||||
 | 
					    (data = {}, data2 = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.delete("userFavorite/delete", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default userFavorite; | 
				
			||||||
@ -0,0 +1,59 @@ | 
				
			|||||||
 | 
					import proxy from "../proxy"; | 
				
			||||||
 | 
					const userProduct = { | 
				
			||||||
 | 
					  list: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get("userProduct/list", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  getExcelData: (data) => async (dispatch) => { | 
				
			||||||
 | 
					    return await proxy.get( | 
				
			||||||
 | 
					      "userProduct/list", | 
				
			||||||
 | 
					      { ...data, excelData: true }, | 
				
			||||||
 | 
					      { dispatch } | 
				
			||||||
 | 
					    ); | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  clearExcelData: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      await dispatch({ type: "userProduct/clearExcelData", data }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  myList: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get("userProduct/myList", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  info: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => | 
				
			||||||
 | 
					      await proxy.get("userProduct/info", data, { dispatch }), | 
				
			||||||
 | 
					  update: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.put("userProduct/update", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  delete: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.delete("userProduct/delete", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  add: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.post("userProduct/add", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  addShow: | 
				
			||||||
 | 
					    (data = {}, data2 = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.post("userProduct/addShow", data, { dispatch }); | 
				
			||||||
 | 
					      return await proxy.get("userProduct/list", data2, { dispatch }); | 
				
			||||||
 | 
					      // return await proxy.get("userFactor/info", data3, { dispatch });
 | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  del: | 
				
			||||||
 | 
					    (data = {}, data2 = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.delete("userProduct/delete", data); | 
				
			||||||
 | 
					      return await proxy.get("userProduct/list", data2, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default userProduct; | 
				
			||||||
@ -0,0 +1,42 @@ | 
				
			|||||||
 | 
					import proxy from "~/redux/proxy"; | 
				
			||||||
 | 
					const waterSupply = { | 
				
			||||||
 | 
					  list: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get("waterSupply/list", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  getExcelData: (data) => async (dispatch) => { | 
				
			||||||
 | 
					    return await proxy.get( | 
				
			||||||
 | 
					      "waterSupply/list", | 
				
			||||||
 | 
					      { ...data, excelData: true }, | 
				
			||||||
 | 
					      { dispatch } | 
				
			||||||
 | 
					    ); | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  clearExcelData: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      await dispatch({ type: "waterSupply/clearExcelData", data }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  info: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.get("waterSupply/info", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  add: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.post("waterSupply/add", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  delete: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.delete("waterSupply/delete", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  update: | 
				
			||||||
 | 
					    (data = {}) => | 
				
			||||||
 | 
					    async (dispatch) => { | 
				
			||||||
 | 
					      return await proxy.put("waterSupply/update", data, { dispatch }); | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default waterSupply; | 
				
			||||||
@ -0,0 +1,13 @@ | 
				
			|||||||
 | 
					import proxy from "~/redux/proxy"; | 
				
			||||||
 | 
					const prefix = "auto/"; | 
				
			||||||
 | 
					const workFlow = { | 
				
			||||||
 | 
					    info: | 
				
			||||||
 | 
					        (data = {}) => | 
				
			||||||
 | 
					            async (dispatch) => { | 
				
			||||||
 | 
					                return await proxy.get(prefix + data._service + "/" + data.id, data, { | 
				
			||||||
 | 
					                    dispatch, | 
				
			||||||
 | 
					                }); | 
				
			||||||
 | 
					            }, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default workFlow; | 
				
			||||||
@ -0,0 +1,7 @@ | 
				
			|||||||
 | 
					// @create-index
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export * as actions  from './actions'; | 
				
			||||||
 | 
					export { default as proxy } from './proxy.js'; | 
				
			||||||
 | 
					export * as reducers  from './reducers'; | 
				
			||||||
 | 
					export { default as store } from './store.js'; | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -0,0 +1,241 @@ | 
				
			|||||||
 | 
					import _ from "lodash"; | 
				
			||||||
 | 
					import axios from "axios"; | 
				
			||||||
 | 
					import config from "~/config"; | 
				
			||||||
 | 
					import bcrypt from "bcryptjs"; | 
				
			||||||
 | 
					let { baseUrl, TTL = 360 } = config; | 
				
			||||||
 | 
					if (window.location.href.includes("barnamenegar.com")) | 
				
			||||||
 | 
					  baseUrl = "https://sameh.barnamenegar.com/api/v2/"; | 
				
			||||||
 | 
					let Axios; | 
				
			||||||
 | 
					let progressDespatch; | 
				
			||||||
 | 
					const race = (promises) => | 
				
			||||||
 | 
					  new Promise((resolve, reject) => { | 
				
			||||||
 | 
					    for (const promise of promises) promise.then(resolve, reject); | 
				
			||||||
 | 
					  }); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const reAxios = async (baseUrl) => { | 
				
			||||||
 | 
					  if (window.location.href.includes("barnamenegar.com")) | 
				
			||||||
 | 
					    baseUrl = "https://sameh.barnamenegar.com/api/v2/"; | 
				
			||||||
 | 
					  let access; | 
				
			||||||
 | 
					  let sessionId = sessionStorage.getItem("sessionId"); | 
				
			||||||
 | 
					  if (sessionId) access = btoa(bcrypt.hashSync(sessionId, 10)); | 
				
			||||||
 | 
					  baseUrl = baseUrl || config.baseUrl; | 
				
			||||||
 | 
					  Axios = axios.create({ | 
				
			||||||
 | 
					    onUploadProgress: (progressEvent) => { | 
				
			||||||
 | 
					      if (progressDespatch) { | 
				
			||||||
 | 
					        progressDespatch( | 
				
			||||||
 | 
					          Math.round((progressEvent.loaded / progressEvent.total) * 100) | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					      } | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					    withCredentials: true, | 
				
			||||||
 | 
					    validateStatus: null, | 
				
			||||||
 | 
					    baseURL: baseUrl, | 
				
			||||||
 | 
					    headers: access ? { Authorization: `Bearer ${access}` } : {}, | 
				
			||||||
 | 
					  }); | 
				
			||||||
 | 
					  window.Axios = Axios; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					reAxios(); | 
				
			||||||
 | 
					window.reAxios = reAxios; | 
				
			||||||
 | 
					class Proxy { | 
				
			||||||
 | 
					  get = async (url, params, opt, data) => | 
				
			||||||
 | 
					    await this.check( | 
				
			||||||
 | 
					      url, | 
				
			||||||
 | 
					      opt, | 
				
			||||||
 | 
					      async () => await Axios.get(url, { params, _service: undefined, ...opt }), | 
				
			||||||
 | 
					      data || params | 
				
			||||||
 | 
					    ); | 
				
			||||||
 | 
					  post = async (url, params, opt, data) => | 
				
			||||||
 | 
					    await this.check( | 
				
			||||||
 | 
					      url, | 
				
			||||||
 | 
					      opt, | 
				
			||||||
 | 
					      async () => await Axios.post(url, params, opt), | 
				
			||||||
 | 
					      data || params | 
				
			||||||
 | 
					    ); | 
				
			||||||
 | 
					  put = async (url, params, opt, data) => { | 
				
			||||||
 | 
					    if (window.location.href.includes("barnamenegar.com")) | 
				
			||||||
 | 
					      return await this.post(url, params, opt, data); | 
				
			||||||
 | 
					    return await this.check( | 
				
			||||||
 | 
					      url, | 
				
			||||||
 | 
					      opt, | 
				
			||||||
 | 
					      async () => await Axios.put(url, params, opt), | 
				
			||||||
 | 
					      data || params | 
				
			||||||
 | 
					    ); | 
				
			||||||
 | 
					  }; | 
				
			||||||
 | 
					  delete = async (url, params, opt, data) => { | 
				
			||||||
 | 
					    if (window.location.href.includes("barnamenegar.com")) | 
				
			||||||
 | 
					      return await this.post(url, params, opt, data); | 
				
			||||||
 | 
					    return await this.check( | 
				
			||||||
 | 
					      url, | 
				
			||||||
 | 
					      opt, | 
				
			||||||
 | 
					      async () => await Axios.delete(url, { ...opt, data: params }), | 
				
			||||||
 | 
					      data || params | 
				
			||||||
 | 
					    ); | 
				
			||||||
 | 
					  }; | 
				
			||||||
 | 
					  timeout = new Promise((r) => | 
				
			||||||
 | 
					    setTimeout( | 
				
			||||||
 | 
					      () => r({ data: { status: 500, message: "سرور پاسخگو نیست" } }), | 
				
			||||||
 | 
					      TTL * 1000 | 
				
			||||||
 | 
					    ) | 
				
			||||||
 | 
					  ); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  check = async (url, { dispatch }, fetch, params) => { | 
				
			||||||
 | 
					    dispatch = dispatch || (() => {}); | 
				
			||||||
 | 
					    url && dispatch({ type: url.split("/")[0] + "/loading", params }); | 
				
			||||||
 | 
					    progressDespatch = (p) => { | 
				
			||||||
 | 
					      dispatch({ type: url.split("/")[0] + "/progress", data: p }); | 
				
			||||||
 | 
					    }; | 
				
			||||||
 | 
					    const response = await race([ | 
				
			||||||
 | 
					      new Promise(async (r) => r(await fetch())), | 
				
			||||||
 | 
					      new Promise(async (r) => | 
				
			||||||
 | 
					        setTimeout( | 
				
			||||||
 | 
					          () => r({ status: 500, message: "خطا: عدم پاسخگویی اتصال به سرور" }), | 
				
			||||||
 | 
					          TTL * 1000 | 
				
			||||||
 | 
					        ) | 
				
			||||||
 | 
					      ), | 
				
			||||||
 | 
					    ]); | 
				
			||||||
 | 
					    switch (response.status) { | 
				
			||||||
 | 
					      case 200: | 
				
			||||||
 | 
					        window.serverDate = response.data.date; | 
				
			||||||
 | 
					        (response.data?.logs || []).forEach((r) => { | 
				
			||||||
 | 
					          if (r[0].etag) | 
				
			||||||
 | 
					            console[r[0].mode]( | 
				
			||||||
 | 
					              `${config.baseUrl}/${url} ${r[0].name}:${r[0].line}:${r[0].time}ms`, | 
				
			||||||
 | 
					              ...r.slice(1) | 
				
			||||||
 | 
					            ); | 
				
			||||||
 | 
					        }); | 
				
			||||||
 | 
					        dispatch({ | 
				
			||||||
 | 
					          type: url, | 
				
			||||||
 | 
					          data: response.data.data, | 
				
			||||||
 | 
					          schema: response.data.schema, | 
				
			||||||
 | 
					          count: response.data.count, | 
				
			||||||
 | 
					          message: response.data.message, | 
				
			||||||
 | 
					          params, | 
				
			||||||
 | 
					          headers: response.headers, | 
				
			||||||
 | 
					        }); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return response.data.data; | 
				
			||||||
 | 
					      case 401: | 
				
			||||||
 | 
					        let refresh = false; // await this.refresh();
 | 
				
			||||||
 | 
					        if (refresh) { | 
				
			||||||
 | 
					          let response = await fetch(); | 
				
			||||||
 | 
					          dispatch({ type: url, data: response.data.data }); | 
				
			||||||
 | 
					          return response.data.data; | 
				
			||||||
 | 
					        } else { | 
				
			||||||
 | 
					          sessionStorage.removeItem("userData"); | 
				
			||||||
 | 
					          sessionStorage.removeItem("sessionId"); | 
				
			||||||
 | 
					          window.location.href = "/login"; | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					        // dispatch({
 | 
				
			||||||
 | 
					        //   type: url.split("/")[0] + "/error",
 | 
				
			||||||
 | 
					        //   data: response.data || response,
 | 
				
			||||||
 | 
					        // });
 | 
				
			||||||
 | 
					        break; | 
				
			||||||
 | 
					      case 403: | 
				
			||||||
 | 
					      default: | 
				
			||||||
 | 
					        dispatch({ | 
				
			||||||
 | 
					          type: url.split("/")[0] + "/error", | 
				
			||||||
 | 
					          data: response?.data?.data || | 
				
			||||||
 | 
					            response?.data || { message: "خطای برقراری ارتباط" }, | 
				
			||||||
 | 
					          message: | 
				
			||||||
 | 
					            response.data?.message == undefined | 
				
			||||||
 | 
					              ? "خطای برقراری ارتباط" | 
				
			||||||
 | 
					              : response.data?.message, | 
				
			||||||
 | 
					          params, | 
				
			||||||
 | 
					        }); | 
				
			||||||
 | 
					        return { statusCode: response.status, message: response.data?.message }; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					    return false; | 
				
			||||||
 | 
					  }; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  login = async (url, params, opt = {}) => { | 
				
			||||||
 | 
					    let { dispatch } = opt; | 
				
			||||||
 | 
					    this.post(url, params, { | 
				
			||||||
 | 
					      dispatch: async (obj) => { | 
				
			||||||
 | 
					        console.log({ obj }); | 
				
			||||||
 | 
					        let login = obj.data; | 
				
			||||||
 | 
					        let sessionId = obj.headers?.sessionid; | 
				
			||||||
 | 
					        if (!login) return dispatch(obj); | 
				
			||||||
 | 
					        console.log({ obj }); | 
				
			||||||
 | 
					        sessionStorage.removeItem("userData"); | 
				
			||||||
 | 
					        sessionStorage.removeItem("sessionId"); | 
				
			||||||
 | 
					        await new Promise((r) => setTimeout(r, 100)); | 
				
			||||||
 | 
					        delete login.accessToken; | 
				
			||||||
 | 
					        delete login.refreshToken; | 
				
			||||||
 | 
					        if (!login.statusCode) { | 
				
			||||||
 | 
					          sessionStorage.setItem("userData", JSON.stringify(login)); | 
				
			||||||
 | 
					          sessionStorage.setItem("sessionId", sessionId); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					        if (!localStorage.getItem("activeRoleId")) | 
				
			||||||
 | 
					          localStorage.setItem("activeRoleId", 0); | 
				
			||||||
 | 
					        // clearInterval(window.checkValidation);
 | 
				
			||||||
 | 
					        // window.checkValidation = setInterval(() => {
 | 
				
			||||||
 | 
					        //   console.log("start validation");
 | 
				
			||||||
 | 
					        //   try {
 | 
				
			||||||
 | 
					        //     let validation = JSON.parse(
 | 
				
			||||||
 | 
					        //       sessionStorage.getItem("userData")
 | 
				
			||||||
 | 
					        //     ).validation;
 | 
				
			||||||
 | 
					        //     console.log({ validation, now: new Date().getTime() });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        //     if (!validation || validation < new Date().getTime())
 | 
				
			||||||
 | 
					        //       throw new Error("not validated");
 | 
				
			||||||
 | 
					        //   } catch (e) {
 | 
				
			||||||
 | 
					        //     console.log(e.message, e);
 | 
				
			||||||
 | 
					        //     localStorage.removeItem("activeRoleId");
 | 
				
			||||||
 | 
					        //     window.sessionStorage.clear();
 | 
				
			||||||
 | 
					        //     return window.location.reload();
 | 
				
			||||||
 | 
					        //   }
 | 
				
			||||||
 | 
					        // }, 300 * 1000);
 | 
				
			||||||
 | 
					        reAxios(); | 
				
			||||||
 | 
					        dispatch(obj); | 
				
			||||||
 | 
					      }, | 
				
			||||||
 | 
					    }); | 
				
			||||||
 | 
					  }; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  logout = async (url, params, { dispatch }) => { | 
				
			||||||
 | 
					    clearInterval(window.checkValidation); | 
				
			||||||
 | 
					    dispatch({ type: url.split("/")[0] + "/loading" }); | 
				
			||||||
 | 
					    await this.post(url, params, { | 
				
			||||||
 | 
					      dispatch: (obj) => { | 
				
			||||||
 | 
					        localStorage.removeItem("activeRoleId"); | 
				
			||||||
 | 
					        window.navigator.serviceWorker | 
				
			||||||
 | 
					          .getRegistrations() | 
				
			||||||
 | 
					          .then(function (registrations) { | 
				
			||||||
 | 
					            for (let registration of registrations) { | 
				
			||||||
 | 
					              registration.unregister(); | 
				
			||||||
 | 
					            } | 
				
			||||||
 | 
					          }); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        dispatch(obj); | 
				
			||||||
 | 
					      }, | 
				
			||||||
 | 
					    }); | 
				
			||||||
 | 
					  }; | 
				
			||||||
 | 
					  status = () => { | 
				
			||||||
 | 
					    const userData = sessionStorage.getItem("userData"); | 
				
			||||||
 | 
					    if (userData) { | 
				
			||||||
 | 
					      // clearInterval(window.checkValidation);
 | 
				
			||||||
 | 
					      // window.checkValidation = setInterval(() => {
 | 
				
			||||||
 | 
					      //   try {
 | 
				
			||||||
 | 
					      //     let validation = JSON.parse(
 | 
				
			||||||
 | 
					      //       sessionStorage.getItem("userData")
 | 
				
			||||||
 | 
					      //     ).validation;
 | 
				
			||||||
 | 
					      //     console.log({ validation, now: new Date().getTime() });
 | 
				
			||||||
 | 
					      //     if (!validation || validation < new Date().getTime())
 | 
				
			||||||
 | 
					      //       throw new Error("not validated");
 | 
				
			||||||
 | 
					      //   } catch (e) {
 | 
				
			||||||
 | 
					      //     console.log(e.message, e);
 | 
				
			||||||
 | 
					      //     localStorage.removeItem("activeRoleId");
 | 
				
			||||||
 | 
					      //     window.sessionStorage.clear();
 | 
				
			||||||
 | 
					      //     return window.location.reload();
 | 
				
			||||||
 | 
					      //   }
 | 
				
			||||||
 | 
					      // }, 300 * 1000);
 | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					    return userData ? JSON.parse(userData) : null; | 
				
			||||||
 | 
					    // let profile = await axios.get("user/fetProfile");
 | 
				
			||||||
 | 
					    // sessionStorage.setItem("userData", JSON.stringify(profile.data));
 | 
				
			||||||
 | 
					    // console.log(profile);
 | 
				
			||||||
 | 
					    // return profile.data;
 | 
				
			||||||
 | 
					  }; | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					const _proxy = new Proxy(); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default _proxy; | 
				
			||||||
@ -0,0 +1,146 @@ | 
				
			|||||||
 | 
					import config from "~/config"; | 
				
			||||||
 | 
					import { toast } from "react-toastify"; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let { baseUrl } = config; | 
				
			||||||
 | 
					if (window.location.href.includes("barnamenegar.com")) | 
				
			||||||
 | 
					  baseUrl = "https://sameh.barnamenegar.com/api/v2/"; | 
				
			||||||
 | 
					const initialState = { | 
				
			||||||
 | 
					  backupLink: null, | 
				
			||||||
 | 
					  userFactor: { | 
				
			||||||
 | 
					    beforeSchema: [ | 
				
			||||||
 | 
					      { | 
				
			||||||
 | 
					        text: "نمایش", | 
				
			||||||
 | 
					        description: "نمایش", | 
				
			||||||
 | 
					        type: "button", | 
				
			||||||
 | 
					        link: "`factor?id=${row.id}`", | 
				
			||||||
 | 
					      }, | 
				
			||||||
 | 
					    ], | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  file: { | 
				
			||||||
 | 
					    beforeSchema: [ | 
				
			||||||
 | 
					      { | 
				
			||||||
 | 
					        text: "نمایش", | 
				
			||||||
 | 
					        description: "نمایش", | 
				
			||||||
 | 
					        link: | 
				
			||||||
 | 
					          "`${row.type=='folder'? 'file/?pid='+row.id: '" + | 
				
			||||||
 | 
					          baseUrl + | 
				
			||||||
 | 
					          "file/'+row.id}`", | 
				
			||||||
 | 
					        type: "button", | 
				
			||||||
 | 
					      }, | 
				
			||||||
 | 
					    ], | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default function admin(state = initialState, action) { | 
				
			||||||
 | 
					  let { type, data, schema, count, params, message } = action; | 
				
			||||||
 | 
					  if (type == "admin/backupLink") | 
				
			||||||
 | 
					    return { ...state, loading: false, backupLink: data, error: null }; | 
				
			||||||
 | 
					  if (!params && !params?._service) return state; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const pathPrefix = `admin/${params._service}/`; | 
				
			||||||
 | 
					  switch (type.split(pathPrefix)[1]) { | 
				
			||||||
 | 
					    case "": | 
				
			||||||
 | 
					      if (params.excelData) | 
				
			||||||
 | 
					        return { | 
				
			||||||
 | 
					          ...state, | 
				
			||||||
 | 
					          [params._service]: { | 
				
			||||||
 | 
					            ...state[params._service], | 
				
			||||||
 | 
					            loading: false, | 
				
			||||||
 | 
					            error: null, | 
				
			||||||
 | 
					            schema: schema, | 
				
			||||||
 | 
					            excelData: data, | 
				
			||||||
 | 
					          }, | 
				
			||||||
 | 
					        }; | 
				
			||||||
 | 
					      return { | 
				
			||||||
 | 
					        ...state, | 
				
			||||||
 | 
					        [params._service]: { | 
				
			||||||
 | 
					          ...state[params._service], | 
				
			||||||
 | 
					          loading: false, | 
				
			||||||
 | 
					          error: null, | 
				
			||||||
 | 
					          list: data, | 
				
			||||||
 | 
					          schema: schema, | 
				
			||||||
 | 
					          count, | 
				
			||||||
 | 
					          pageCount: +Math.floor((count - 1) / params.pageSize) + 1, | 
				
			||||||
 | 
					        }, | 
				
			||||||
 | 
					      }; | 
				
			||||||
 | 
					    case "clearExcelData": { | 
				
			||||||
 | 
					      return { | 
				
			||||||
 | 
					        ...state, | 
				
			||||||
 | 
					        [params._service]: { | 
				
			||||||
 | 
					          ...state[params._service], | 
				
			||||||
 | 
					          loading: false, | 
				
			||||||
 | 
					          excelData: null, | 
				
			||||||
 | 
					        }, | 
				
			||||||
 | 
					      }; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					    case "/" + params.id: | 
				
			||||||
 | 
					      return { | 
				
			||||||
 | 
					        ...state, | 
				
			||||||
 | 
					        [params._service]: { | 
				
			||||||
 | 
					          ...state[params._service], | 
				
			||||||
 | 
					          loading: false, | 
				
			||||||
 | 
					          error: null, | 
				
			||||||
 | 
					          info: data, | 
				
			||||||
 | 
					        }, | 
				
			||||||
 | 
					      }; | 
				
			||||||
 | 
					    case "add": | 
				
			||||||
 | 
					      toast.success(message); | 
				
			||||||
 | 
					      return { | 
				
			||||||
 | 
					        ...state, | 
				
			||||||
 | 
					        [params._service]: { | 
				
			||||||
 | 
					          ...state[params._service], | 
				
			||||||
 | 
					          loading: false, | 
				
			||||||
 | 
					          error: null, | 
				
			||||||
 | 
					        }, | 
				
			||||||
 | 
					      }; | 
				
			||||||
 | 
					    case "update/" + params.id: | 
				
			||||||
 | 
					      toast.success(message); | 
				
			||||||
 | 
					      return { | 
				
			||||||
 | 
					        ...state, | 
				
			||||||
 | 
					        [params._service]: { | 
				
			||||||
 | 
					          ...state[params._service], | 
				
			||||||
 | 
					          loading: false, | 
				
			||||||
 | 
					          error: null, | 
				
			||||||
 | 
					        }, | 
				
			||||||
 | 
					      }; | 
				
			||||||
 | 
					    case "delete/" + params.id: | 
				
			||||||
 | 
					      toast.success(message); | 
				
			||||||
 | 
					      return { | 
				
			||||||
 | 
					        ...state, | 
				
			||||||
 | 
					        [params._service]: { | 
				
			||||||
 | 
					          ...state[params._service], | 
				
			||||||
 | 
					          loading: false, | 
				
			||||||
 | 
					          error: null, | 
				
			||||||
 | 
					        }, | 
				
			||||||
 | 
					      }; | 
				
			||||||
 | 
					    case "loading": | 
				
			||||||
 | 
					      return { | 
				
			||||||
 | 
					        ...state, | 
				
			||||||
 | 
					        [params._service]: { | 
				
			||||||
 | 
					          ...state[params._service], | 
				
			||||||
 | 
					          loading: true, | 
				
			||||||
 | 
					        }, | 
				
			||||||
 | 
					      }; | 
				
			||||||
 | 
					    case "error": | 
				
			||||||
 | 
					      toast.error(message, { autoClose: !message.includes("!!") }); | 
				
			||||||
 | 
					      return { | 
				
			||||||
 | 
					        ...state, | 
				
			||||||
 | 
					        [params._service]: { | 
				
			||||||
 | 
					          ...state[params._service], | 
				
			||||||
 | 
					          loading: false, | 
				
			||||||
 | 
					          error: data.message, | 
				
			||||||
 | 
					        }, | 
				
			||||||
 | 
					      }; | 
				
			||||||
 | 
					    case "timeReport": | 
				
			||||||
 | 
					      return { | 
				
			||||||
 | 
					        ...state, | 
				
			||||||
 | 
					        [params._service]: { | 
				
			||||||
 | 
					          ...state[params._service], | 
				
			||||||
 | 
					          timeReport: data, | 
				
			||||||
 | 
					          error: null, | 
				
			||||||
 | 
					        }, | 
				
			||||||
 | 
					      }; | 
				
			||||||
 | 
					    default: | 
				
			||||||
 | 
					      return state; | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,40 @@ | 
				
			|||||||
 | 
					import { toast } from "react-toastify"; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const initialState = { | 
				
			||||||
 | 
					  loading: false, | 
				
			||||||
 | 
					  error: null, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default function audit(state = initialState, action) { | 
				
			||||||
 | 
					  let { type, data, message } = action; | 
				
			||||||
 | 
					  switch (type) { | 
				
			||||||
 | 
					    case "audit/revokeRole": | 
				
			||||||
 | 
					      toast.success(message, { autoClose: false }); | 
				
			||||||
 | 
					      return { | 
				
			||||||
 | 
					        ...state, | 
				
			||||||
 | 
					        loading: false, | 
				
			||||||
 | 
					        error: null, | 
				
			||||||
 | 
					      }; | 
				
			||||||
 | 
					    case "audit/revokeTask": | 
				
			||||||
 | 
					      toast.success(message, { autoClose: false }); | 
				
			||||||
 | 
					      return { | 
				
			||||||
 | 
					        ...state, | 
				
			||||||
 | 
					        loading: false, | 
				
			||||||
 | 
					        error: null, | 
				
			||||||
 | 
					      }; | 
				
			||||||
 | 
					    case "audit/check": | 
				
			||||||
 | 
					      toast.info(message, { autoClose: false }); | 
				
			||||||
 | 
					      return { | 
				
			||||||
 | 
					        ...state, | 
				
			||||||
 | 
					        loading: false, | 
				
			||||||
 | 
					        error: null, | 
				
			||||||
 | 
					      }; | 
				
			||||||
 | 
					    case "audit/loading": | 
				
			||||||
 | 
					      return { ...state, loading: true }; | 
				
			||||||
 | 
					    case "audit/error": | 
				
			||||||
 | 
					      toast.error(data.message, { autoClose: !data.message.includes("!!") }); | 
				
			||||||
 | 
					      return { ...state, loading: false, error: data.message || message }; | 
				
			||||||
 | 
					    default: | 
				
			||||||
 | 
					      return state; | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,186 @@ | 
				
			|||||||
 | 
					import config from "~/config"; | 
				
			||||||
 | 
					import { toast } from "react-toastify"; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let { baseUrl } = config; | 
				
			||||||
 | 
					if (window.location.href.includes("barnamenegar.com")) | 
				
			||||||
 | 
					  baseUrl = "https://sameh.barnamenegar.com/api/v2/"; | 
				
			||||||
 | 
					const initialState = { | 
				
			||||||
 | 
					  userFactor: { | 
				
			||||||
 | 
					    beforeSchema: [ | 
				
			||||||
 | 
					      { | 
				
			||||||
 | 
					        text: "نمایش", | 
				
			||||||
 | 
					        description: "نمایش", | 
				
			||||||
 | 
					        type: "button", | 
				
			||||||
 | 
					        link: "`factor?id=${row.id}`", | 
				
			||||||
 | 
					      }, | 
				
			||||||
 | 
					    ], | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  file: { | 
				
			||||||
 | 
					    beforeSchema: [ | 
				
			||||||
 | 
					      { | 
				
			||||||
 | 
					        text: "نمایش", | 
				
			||||||
 | 
					        description: "نمایش", | 
				
			||||||
 | 
					        link: | 
				
			||||||
 | 
					          "`${row.type=='folder'? 'file/?pid='+row.id: '" + | 
				
			||||||
 | 
					          baseUrl + | 
				
			||||||
 | 
					          "file/'+row.id}`", | 
				
			||||||
 | 
					        type: "button", | 
				
			||||||
 | 
					      }, | 
				
			||||||
 | 
					    ], | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  info: {}, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default function auto(state = initialState, action) { | 
				
			||||||
 | 
					  let { type, data, schema, count, params, message } = action; | 
				
			||||||
 | 
					  if (!params && !params?._service) return state; | 
				
			||||||
 | 
					  const pathPrefix = `auto/${params._service}/`; | 
				
			||||||
 | 
					  if (type == "auto/loading") | 
				
			||||||
 | 
					    return { | 
				
			||||||
 | 
					      ...state, | 
				
			||||||
 | 
					      loading: true, | 
				
			||||||
 | 
					    }; | 
				
			||||||
 | 
					  if (type == "auto/error") { | 
				
			||||||
 | 
					    toast.error(message, { autoClose: !message.includes("!!") }); | 
				
			||||||
 | 
					    return { | 
				
			||||||
 | 
					      ...state, | 
				
			||||||
 | 
					      loading: false, | 
				
			||||||
 | 
					    }; | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					  switch (type.split(pathPrefix)[1]) { | 
				
			||||||
 | 
					    case "": | 
				
			||||||
 | 
					      if (params.excelData) | 
				
			||||||
 | 
					        return { | 
				
			||||||
 | 
					          ...state, | 
				
			||||||
 | 
					          loading: false, | 
				
			||||||
 | 
					          [params._service]: { | 
				
			||||||
 | 
					            ...state[params._service], | 
				
			||||||
 | 
					            loading: false, | 
				
			||||||
 | 
					            error: null, | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            excelData: data, | 
				
			||||||
 | 
					          }, | 
				
			||||||
 | 
					        }; | 
				
			||||||
 | 
					      if (params._append) | 
				
			||||||
 | 
					        return { | 
				
			||||||
 | 
					          ...state, | 
				
			||||||
 | 
					          loading: false, | 
				
			||||||
 | 
					          [params._service]: { | 
				
			||||||
 | 
					            ...state[params._service], | 
				
			||||||
 | 
					            loading: false, | 
				
			||||||
 | 
					            error: null, | 
				
			||||||
 | 
					            append: { ...state[params._service].append, [params.pid]: data }, | 
				
			||||||
 | 
					          }, | 
				
			||||||
 | 
					        }; | 
				
			||||||
 | 
					      return { | 
				
			||||||
 | 
					        ...state, | 
				
			||||||
 | 
					        loading: false, | 
				
			||||||
 | 
					        [params._service]: { | 
				
			||||||
 | 
					          ...state[params._service], | 
				
			||||||
 | 
					          loading: false, | 
				
			||||||
 | 
					          error: null, | 
				
			||||||
 | 
					          list: data, | 
				
			||||||
 | 
					          schema: schema, | 
				
			||||||
 | 
					          count, | 
				
			||||||
 | 
					          append: {}, | 
				
			||||||
 | 
					          done: false, | 
				
			||||||
 | 
					          pageCount: +Math.floor((count - 1) / params.pageSize) + 1, | 
				
			||||||
 | 
					        }, | 
				
			||||||
 | 
					      }; | 
				
			||||||
 | 
					    case "clearExcelData": { | 
				
			||||||
 | 
					      return { | 
				
			||||||
 | 
					        ...state, | 
				
			||||||
 | 
					        loading: false, | 
				
			||||||
 | 
					        [params._service]: { | 
				
			||||||
 | 
					          ...state[params._service], | 
				
			||||||
 | 
					          loading: false, | 
				
			||||||
 | 
					          excelData: null, | 
				
			||||||
 | 
					        }, | 
				
			||||||
 | 
					      }; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					    case "/" + params.id: | 
				
			||||||
 | 
					      return { | 
				
			||||||
 | 
					        ...state, | 
				
			||||||
 | 
					        loading: false, | 
				
			||||||
 | 
					        [params._service]: { | 
				
			||||||
 | 
					          ...state[params._service], | 
				
			||||||
 | 
					          loading: false, | 
				
			||||||
 | 
					          error: null, | 
				
			||||||
 | 
					          info: data, | 
				
			||||||
 | 
					        }, | 
				
			||||||
 | 
					      }; | 
				
			||||||
 | 
					    case "add": | 
				
			||||||
 | 
					      toast.success(message); | 
				
			||||||
 | 
					      return { | 
				
			||||||
 | 
					        ...state, | 
				
			||||||
 | 
					        loading: false, | 
				
			||||||
 | 
					        [params._service]: { | 
				
			||||||
 | 
					          ...state[params._service], | 
				
			||||||
 | 
					          loading: false, | 
				
			||||||
 | 
					          error: null, | 
				
			||||||
 | 
					          done: true, | 
				
			||||||
 | 
					        }, | 
				
			||||||
 | 
					      }; | 
				
			||||||
 | 
					    case "update/" + params.id: | 
				
			||||||
 | 
					      if (!params["silent"]) toast.success(message); | 
				
			||||||
 | 
					      return { | 
				
			||||||
 | 
					        ...state, | 
				
			||||||
 | 
					        loading: false, | 
				
			||||||
 | 
					        [params._service]: { | 
				
			||||||
 | 
					          ...state[params._service], | 
				
			||||||
 | 
					          loading: false, | 
				
			||||||
 | 
					          error: null, | 
				
			||||||
 | 
					          done: true, | 
				
			||||||
 | 
					        }, | 
				
			||||||
 | 
					      }; | 
				
			||||||
 | 
					    case "delete/" + params.id: | 
				
			||||||
 | 
					      if (!params["silent"]) toast.success(message); | 
				
			||||||
 | 
					      return { | 
				
			||||||
 | 
					        ...state, | 
				
			||||||
 | 
					        loading: false, | 
				
			||||||
 | 
					        [params._service]: { | 
				
			||||||
 | 
					          ...state[params._service], | 
				
			||||||
 | 
					          loading: false, | 
				
			||||||
 | 
					          error: null, | 
				
			||||||
 | 
					          done: true, | 
				
			||||||
 | 
					        }, | 
				
			||||||
 | 
					      }; | 
				
			||||||
 | 
					    case "loading": | 
				
			||||||
 | 
					      return { | 
				
			||||||
 | 
					        ...state, | 
				
			||||||
 | 
					        loading: true, | 
				
			||||||
 | 
					        [params._service]: { | 
				
			||||||
 | 
					          ...state[params._service], | 
				
			||||||
 | 
					          loading: true, | 
				
			||||||
 | 
					          done: false, | 
				
			||||||
 | 
					        }, | 
				
			||||||
 | 
					      }; | 
				
			||||||
 | 
					    case "error": | 
				
			||||||
 | 
					      toast.error(message, { autoClose: !message.includes("!!") }); | 
				
			||||||
 | 
					      return { | 
				
			||||||
 | 
					        ...state, | 
				
			||||||
 | 
					        loading: false, | 
				
			||||||
 | 
					        [params._service]: { | 
				
			||||||
 | 
					          ...state[params._service], | 
				
			||||||
 | 
					          loading: false, | 
				
			||||||
 | 
					          error: data.message, | 
				
			||||||
 | 
					          done: false, | 
				
			||||||
 | 
					        }, | 
				
			||||||
 | 
					      }; | 
				
			||||||
 | 
					    case "timeReport": | 
				
			||||||
 | 
					      return { | 
				
			||||||
 | 
					        ...state, | 
				
			||||||
 | 
					        loading: false, | 
				
			||||||
 | 
					        [params._service]: { | 
				
			||||||
 | 
					          ...state[params._service], | 
				
			||||||
 | 
					          timeReport: data, | 
				
			||||||
 | 
					          error: null, | 
				
			||||||
 | 
					        }, | 
				
			||||||
 | 
					      }; | 
				
			||||||
 | 
					    case "bpms_workflow/" + params.id: | 
				
			||||||
 | 
					      console.log("case"); | 
				
			||||||
 | 
					      return { ...state, loading: false, info: { data: "sd" } }; | 
				
			||||||
 | 
					    default: | 
				
			||||||
 | 
					      return state; | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,127 @@ | 
				
			|||||||
 | 
					import { toast } from "react-toastify"; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const initialState = { | 
				
			||||||
 | 
					  loading: false, | 
				
			||||||
 | 
					  error: null, | 
				
			||||||
 | 
					  list: [], | 
				
			||||||
 | 
					  info: null, | 
				
			||||||
 | 
					  searchResult: [], | 
				
			||||||
 | 
					  filterResult: [], | 
				
			||||||
 | 
					  subjects: [], | 
				
			||||||
 | 
					  levels: [], | 
				
			||||||
 | 
					  sortFilters: ["مرتب سازی", "محبوب ترین", "جدیدترین"], | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const grades = [ | 
				
			||||||
 | 
					  "پیش دبستان", | 
				
			||||||
 | 
					  "اول", | 
				
			||||||
 | 
					  "دوم", | 
				
			||||||
 | 
					  "سوم", | 
				
			||||||
 | 
					  "چهارم", | 
				
			||||||
 | 
					  "پنجم", | 
				
			||||||
 | 
					  "ششم", | 
				
			||||||
 | 
					  "هفتم", | 
				
			||||||
 | 
					  "هشتم", | 
				
			||||||
 | 
					  "نهم", | 
				
			||||||
 | 
					  "دهم", | 
				
			||||||
 | 
					  "یازدهم", | 
				
			||||||
 | 
					  "دوازدهم", | 
				
			||||||
 | 
					]; | 
				
			||||||
 | 
					export default function book(state = initialState, action) { | 
				
			||||||
 | 
					  let { type, data } = action; | 
				
			||||||
 | 
					  switch (type) { | 
				
			||||||
 | 
					    case "book/list": | 
				
			||||||
 | 
					      let itemsSubject = (Array.isArray(data) ? data : []).map( | 
				
			||||||
 | 
					        (item, index) => item.name | 
				
			||||||
 | 
					      ); | 
				
			||||||
 | 
					      if (window.innerWidth < 1000) { | 
				
			||||||
 | 
					        itemsSubject.unshift("نام کتاب"); | 
				
			||||||
 | 
					      } | 
				
			||||||
 | 
					      let itemsLevel = (Array.isArray(data) ? data : []) | 
				
			||||||
 | 
					        .map((item) => item.gradeId * 1) | 
				
			||||||
 | 
					        .sort((a, b) => a - b) | 
				
			||||||
 | 
					        .map((e) => grades[e]); | 
				
			||||||
 | 
					      if (window.innerWidth < 1000) { | 
				
			||||||
 | 
					        itemsLevel.unshift("پایه تحصیلی"); | 
				
			||||||
 | 
					      } | 
				
			||||||
 | 
					      return { | 
				
			||||||
 | 
					        ...state, | 
				
			||||||
 | 
					        loading: false, | 
				
			||||||
 | 
					        list: data, | 
				
			||||||
 | 
					        subjects: [...new Set(itemsSubject)], | 
				
			||||||
 | 
					        levels: [...new Set(itemsLevel)], | 
				
			||||||
 | 
					        filterResult: data, | 
				
			||||||
 | 
					        error: null, | 
				
			||||||
 | 
					      }; | 
				
			||||||
 | 
					    case "book/info": | 
				
			||||||
 | 
					      return { ...state, loading: false, info: data, error: null }; | 
				
			||||||
 | 
					    case "book/update": | 
				
			||||||
 | 
					      return { ...state, loading: false, error: null }; | 
				
			||||||
 | 
					    case "book/add": | 
				
			||||||
 | 
					      return { ...state, loading: false, error: null }; | 
				
			||||||
 | 
					    case "book/delete": | 
				
			||||||
 | 
					      return { ...state, loading: false, error: null }; | 
				
			||||||
 | 
					    case "book/search": | 
				
			||||||
 | 
					      return { ...state }; | 
				
			||||||
 | 
					    case "book/filter": | 
				
			||||||
 | 
					      const realList = state.list; | 
				
			||||||
 | 
					      const level = data.level; | 
				
			||||||
 | 
					      const subject = data.subject; | 
				
			||||||
 | 
					      const sort = data.sort; | 
				
			||||||
 | 
					      const search = data.search; | 
				
			||||||
 | 
					      if (level.length > 0 || subject.length > 0 || sort || search) { | 
				
			||||||
 | 
					        localStorage.setItem("filter", "ON"); | 
				
			||||||
 | 
					      } | 
				
			||||||
 | 
					      let finalSort; | 
				
			||||||
 | 
					      let byLevelFilter = []; | 
				
			||||||
 | 
					      if (level.length > 0) { | 
				
			||||||
 | 
					        level.forEach((item1) => { | 
				
			||||||
 | 
					          for (let i = 0; i < realList.length; i++) { | 
				
			||||||
 | 
					            if (grades[realList[i].gradeId] === item1) { | 
				
			||||||
 | 
					              byLevelFilter.push(realList[i]); | 
				
			||||||
 | 
					            } | 
				
			||||||
 | 
					          } | 
				
			||||||
 | 
					        }); | 
				
			||||||
 | 
					      } else { | 
				
			||||||
 | 
					        byLevelFilter = realList; | 
				
			||||||
 | 
					      } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      let bySubjectFilter = []; | 
				
			||||||
 | 
					      if (subject.length > 0) { | 
				
			||||||
 | 
					        subject.forEach((item1) => { | 
				
			||||||
 | 
					          for (let i = 0; i < byLevelFilter.length; i++) { | 
				
			||||||
 | 
					            if (byLevelFilter[i].name === item1) { | 
				
			||||||
 | 
					              bySubjectFilter.push(byLevelFilter[i]); | 
				
			||||||
 | 
					            } | 
				
			||||||
 | 
					          } | 
				
			||||||
 | 
					        }); | 
				
			||||||
 | 
					      } else { | 
				
			||||||
 | 
					        bySubjectFilter = byLevelFilter; | 
				
			||||||
 | 
					      } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      const bySearchFilter = search | 
				
			||||||
 | 
					        ? bySubjectFilter.filter((item1) => item1.name.indexOf(search) !== -1) | 
				
			||||||
 | 
					        : bySubjectFilter; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (sort === "گران ترین") { | 
				
			||||||
 | 
					        finalSort = bySearchFilter.sort((item1, item2) => { | 
				
			||||||
 | 
					          return item1.product[0].price - item2.product[0].price; | 
				
			||||||
 | 
					        }); | 
				
			||||||
 | 
					      } else { | 
				
			||||||
 | 
					        finalSort = bySearchFilter; | 
				
			||||||
 | 
					      } | 
				
			||||||
 | 
					      return { | 
				
			||||||
 | 
					        ...state, | 
				
			||||||
 | 
					        loading: false, | 
				
			||||||
 | 
					        error: null, | 
				
			||||||
 | 
					        filterResult: finalSort, | 
				
			||||||
 | 
					      }; | 
				
			||||||
 | 
					    case "book/loading": | 
				
			||||||
 | 
					      return { ...state, loading: true }; | 
				
			||||||
 | 
					    case "book/error": | 
				
			||||||
 | 
					      toast.error(data.message, { autoClose: !data.message.includes("!!") }); | 
				
			||||||
 | 
					      return { ...state, loading: false, error: data.message }; | 
				
			||||||
 | 
					    default: | 
				
			||||||
 | 
					      return state; | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,51 @@ | 
				
			|||||||
 | 
					import { toast } from "react-toastify"; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const initialState = { | 
				
			||||||
 | 
					  loading: false, | 
				
			||||||
 | 
					  error: null, | 
				
			||||||
 | 
					  list: [], | 
				
			||||||
 | 
					  searchResult: [], | 
				
			||||||
 | 
					  search: null, | 
				
			||||||
 | 
					  roleConflicts: [], | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					export default function certificate(state = initialState, action) { | 
				
			||||||
 | 
					  let { type, data } = action; | 
				
			||||||
 | 
					  switch (type) { | 
				
			||||||
 | 
					    case "certificate/checkConflict": | 
				
			||||||
 | 
					      return { ...state, loading: false, roleConflicts: data, error: null }; | 
				
			||||||
 | 
					    case "certificate/list": | 
				
			||||||
 | 
					      return { ...state, loading: false, list: data, error: null }; | 
				
			||||||
 | 
					    case "certificate/add": | 
				
			||||||
 | 
					      return { ...state, loading: false, error: null }; | 
				
			||||||
 | 
					    case "certificate/healthQualification/start": | 
				
			||||||
 | 
					      return { | 
				
			||||||
 | 
					        ...state, | 
				
			||||||
 | 
					        loading: false, | 
				
			||||||
 | 
					        error: null, | 
				
			||||||
 | 
					        start: data, | 
				
			||||||
 | 
					      }; | 
				
			||||||
 | 
					    case "certificate/freeAuditRegistration/start": | 
				
			||||||
 | 
					      return { | 
				
			||||||
 | 
					        ...state, | 
				
			||||||
 | 
					        loading: false, | 
				
			||||||
 | 
					        error: null, | 
				
			||||||
 | 
					        start: data, | 
				
			||||||
 | 
					      }; | 
				
			||||||
 | 
					    case "certificate/certifiedGuildAddUnitStart": | 
				
			||||||
 | 
					    case "certificate/freeAuditAddUnitStart": | 
				
			||||||
 | 
					      return { | 
				
			||||||
 | 
					        ...state, | 
				
			||||||
 | 
					        loading: false, | 
				
			||||||
 | 
					        error: null, | 
				
			||||||
 | 
					        start: data, | 
				
			||||||
 | 
					      }; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    case "certificate/loading": | 
				
			||||||
 | 
					      return { ...state, loading: true }; | 
				
			||||||
 | 
					    case "certificate/error": | 
				
			||||||
 | 
					      toast.error(data.message, { autoClose: !data.message.includes("!!") }); | 
				
			||||||
 | 
					      return { ...state, loading: false, error: data.message }; | 
				
			||||||
 | 
					    default: | 
				
			||||||
 | 
					      return state; | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,37 @@ | 
				
			|||||||
 | 
					import proxy from "~/redux/proxy"; | 
				
			||||||
 | 
					import { toast } from "react-toastify"; | 
				
			||||||
 | 
					const status = proxy.status(); | 
				
			||||||
 | 
					const initialState = { | 
				
			||||||
 | 
					  status, | 
				
			||||||
 | 
					  loading: false, | 
				
			||||||
 | 
					  error: null, | 
				
			||||||
 | 
					  list: [], | 
				
			||||||
 | 
					  schema: [], | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default function comment(state = initialState, action) { | 
				
			||||||
 | 
					  let { type, data, schema, count, params } = action; | 
				
			||||||
 | 
					  switch (type) { | 
				
			||||||
 | 
					    case "comment/list": | 
				
			||||||
 | 
					      return { | 
				
			||||||
 | 
					        ...state, | 
				
			||||||
 | 
					        loading: false, | 
				
			||||||
 | 
					        error: null, | 
				
			||||||
 | 
					        list: data, | 
				
			||||||
 | 
					        schema: schema, | 
				
			||||||
 | 
					        count, | 
				
			||||||
 | 
					        pageCount: +Math.floor((count - 1) / params.pageSize) + 1, | 
				
			||||||
 | 
					      }; | 
				
			||||||
 | 
					    case "comment/add": | 
				
			||||||
 | 
					      return { ...state, loading: false, error: null }; | 
				
			||||||
 | 
					    case "comment/delete": | 
				
			||||||
 | 
					      return { ...state, loading: false, error: null }; | 
				
			||||||
 | 
					    case "comment/loading": | 
				
			||||||
 | 
					      return { ...state, loading: true }; | 
				
			||||||
 | 
					    case "comment/error": | 
				
			||||||
 | 
					      toast.error(data.message, { autoClose: !data.message.includes("!!") }); | 
				
			||||||
 | 
					      return { ...state, loading: false, error: data.message }; | 
				
			||||||
 | 
					    default: | 
				
			||||||
 | 
					      return state; | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,31 @@ | 
				
			|||||||
 | 
					import { toast } from "react-toastify"; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const initialState = { | 
				
			||||||
 | 
					  loading: false, | 
				
			||||||
 | 
					  error: null, | 
				
			||||||
 | 
					  list: [], | 
				
			||||||
 | 
					  info: null, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					export default function content(state = initialState, action) { | 
				
			||||||
 | 
					  let { type, data } = action; | 
				
			||||||
 | 
					  switch (type) { | 
				
			||||||
 | 
					    case "content/list": | 
				
			||||||
 | 
					      return { ...state, loading: false, list: data, error: null }; | 
				
			||||||
 | 
					    case "content/add": | 
				
			||||||
 | 
					      return { ...state, loading: false, error: null }; | 
				
			||||||
 | 
					    case "content/info": | 
				
			||||||
 | 
					      return { | 
				
			||||||
 | 
					        ...state, | 
				
			||||||
 | 
					        loading: false, | 
				
			||||||
 | 
					        error: null, | 
				
			||||||
 | 
					        info: data, | 
				
			||||||
 | 
					      }; | 
				
			||||||
 | 
					    case "content/loading": | 
				
			||||||
 | 
					      return { ...state, loading: true }; | 
				
			||||||
 | 
					    case "content/error": | 
				
			||||||
 | 
					      toast.error(data.message, { autoClose: !data.message.includes("!!") }); | 
				
			||||||
 | 
					      return { ...state, loading: false, error: data.message }; | 
				
			||||||
 | 
					    default: | 
				
			||||||
 | 
					      return state; | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,23 @@ | 
				
			|||||||
 | 
					import proxy from "~/redux/proxy"; | 
				
			||||||
 | 
					import { toast } from "react-toastify"; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const initialState = { | 
				
			||||||
 | 
					  loading: false, | 
				
			||||||
 | 
					  error: null, | 
				
			||||||
 | 
					  info: null, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default function craft(state = initialState, action) { | 
				
			||||||
 | 
					  let { type, data } = action; | 
				
			||||||
 | 
					  switch (type) { | 
				
			||||||
 | 
					    case "layout/info": | 
				
			||||||
 | 
					      return { ...state, loading: false, error: null, info: data }; | 
				
			||||||
 | 
					    case "layout/loading": | 
				
			||||||
 | 
					      return { ...state, loading: true }; | 
				
			||||||
 | 
					    case "layout/error": | 
				
			||||||
 | 
					      toast.error(data.message, { autoClose: !data.message.includes("!!") }); | 
				
			||||||
 | 
					      return { ...state, loading: false, error: data.message }; | 
				
			||||||
 | 
					    default: | 
				
			||||||
 | 
					      return state; | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,17 @@ | 
				
			|||||||
 | 
					import { toast } from "react-toastify"; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const initialState = { | 
				
			||||||
 | 
					  loading: false, | 
				
			||||||
 | 
					  error: null, | 
				
			||||||
 | 
					  list: [], | 
				
			||||||
 | 
					  info: null, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					export default function content(state = initialState, action) { | 
				
			||||||
 | 
					  let { type, data } = action; | 
				
			||||||
 | 
					  switch (type) { | 
				
			||||||
 | 
					    case "sync/documentDataModel": | 
				
			||||||
 | 
					      return { ...state, loading: false, list: data, error: null }; | 
				
			||||||
 | 
					    default: | 
				
			||||||
 | 
					      return state; | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,57 @@ | 
				
			|||||||
 | 
					import { toast } from "react-toastify"; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const initialState = { | 
				
			||||||
 | 
					  loading: false, | 
				
			||||||
 | 
					  error: null, | 
				
			||||||
 | 
					  list: [], | 
				
			||||||
 | 
					  searchResult: [], | 
				
			||||||
 | 
					  search: null, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					export default function faq(state = initialState, action) { | 
				
			||||||
 | 
					  let { type, data } = action; | 
				
			||||||
 | 
					  switch (type) { | 
				
			||||||
 | 
					    case "faq/list": | 
				
			||||||
 | 
					      return { ...state, loading: false, list: data, error: null }; | 
				
			||||||
 | 
					    case "faq/add": | 
				
			||||||
 | 
					      return { ...state, loading: false, error: null }; | 
				
			||||||
 | 
					    case "faq/selectFaq": | 
				
			||||||
 | 
					      return { | 
				
			||||||
 | 
					        ...state, | 
				
			||||||
 | 
					        loading: false, | 
				
			||||||
 | 
					        error: null, | 
				
			||||||
 | 
					        list: !state.search | 
				
			||||||
 | 
					          ? state.list.map((item) => | 
				
			||||||
 | 
					              item.id === data | 
				
			||||||
 | 
					                ? { ...item, active: !item.active } | 
				
			||||||
 | 
					                : { ...item, active: false } | 
				
			||||||
 | 
					            ) | 
				
			||||||
 | 
					          : state.list, | 
				
			||||||
 | 
					        searchResult: state.search | 
				
			||||||
 | 
					          ? state.searchResult.map((item) => | 
				
			||||||
 | 
					              item.id === data | 
				
			||||||
 | 
					                ? { ...item, active: !item.active } | 
				
			||||||
 | 
					                : { ...item, active: false } | 
				
			||||||
 | 
					            ) | 
				
			||||||
 | 
					          : state.searchResult, | 
				
			||||||
 | 
					      }; | 
				
			||||||
 | 
					    case "faq/search": | 
				
			||||||
 | 
					      return { | 
				
			||||||
 | 
					        ...state, | 
				
			||||||
 | 
					        loading: false, | 
				
			||||||
 | 
					        error: null, | 
				
			||||||
 | 
					        search: data, | 
				
			||||||
 | 
					        searchResult: state.list.filter( | 
				
			||||||
 | 
					          (item) => | 
				
			||||||
 | 
					            item.title.indexOf(data) !== -1 || | 
				
			||||||
 | 
					            item.description.indexOf(data) !== -1 | 
				
			||||||
 | 
					        ), | 
				
			||||||
 | 
					      }; | 
				
			||||||
 | 
					    case "faq/loading": | 
				
			||||||
 | 
					      return { ...state, loading: true }; | 
				
			||||||
 | 
					    case "faq/error": | 
				
			||||||
 | 
					      toast.error(data.message, { autoClose: !data.message.includes("!!") }); | 
				
			||||||
 | 
					      return { ...state, loading: false, error: data.message }; | 
				
			||||||
 | 
					    default: | 
				
			||||||
 | 
					      return state; | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,87 @@ | 
				
			|||||||
 | 
					import { toast } from "react-toastify"; | 
				
			||||||
 | 
					window.config = { | 
				
			||||||
 | 
					  ...(window.config || {}), | 
				
			||||||
 | 
					  admin_config_maxUploadSize: 50, | 
				
			||||||
 | 
					  admin_config_uploadExtensions: "doc,docx,pdf,jpg,png,bmp,xls,xlsx,mp4,zip", | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					const initialState = { | 
				
			||||||
 | 
					  loading: false, | 
				
			||||||
 | 
					  error: null, | 
				
			||||||
 | 
					  id: null, | 
				
			||||||
 | 
					  signature: "", | 
				
			||||||
 | 
					  progress: 0, | 
				
			||||||
 | 
					  groupList: [], | 
				
			||||||
 | 
					  list: [ | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					      id: 1, | 
				
			||||||
 | 
					      name: "file a", | 
				
			||||||
 | 
					      type: "PNG", | 
				
			||||||
 | 
					      size: 50, | 
				
			||||||
 | 
					      uploadAt: "2022-09-10", | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					      id: 1, | 
				
			||||||
 | 
					      name: "file b", | 
				
			||||||
 | 
					      type: "JPG", | 
				
			||||||
 | 
					      size: 50, | 
				
			||||||
 | 
					      uploadAt: "2022-09-10", | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					      id: 1, | 
				
			||||||
 | 
					      name: "folder a", | 
				
			||||||
 | 
					      type: "folder", | 
				
			||||||
 | 
					      size: 50, | 
				
			||||||
 | 
					      uploadAt: "2022-09-10", | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  ], | 
				
			||||||
 | 
					  schema: [ | 
				
			||||||
 | 
					    { name: "id", desc: "شناسه", description: "شناسه", type: "number" }, | 
				
			||||||
 | 
					    { name: "name", desc: "نام", description: "نام", type: "string" }, | 
				
			||||||
 | 
					    { name: "type", desc: "نوع", description: "شناسه", type: "string" }, | 
				
			||||||
 | 
					    { name: "size", desc: "حجم", description: "شناسه", type: "number" }, | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					      name: "uploadAt", | 
				
			||||||
 | 
					      desc: "تاریخ آپلود", | 
				
			||||||
 | 
					      description: "شناسه", | 
				
			||||||
 | 
					      type: "date", | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  ], | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default function file(state = initialState, action) { | 
				
			||||||
 | 
					  let { type, data, params } = action; | 
				
			||||||
 | 
					  switch (type) { | 
				
			||||||
 | 
					    case "file/setSignature": | 
				
			||||||
 | 
					      return { | 
				
			||||||
 | 
					        ...state, | 
				
			||||||
 | 
					        signature: data, | 
				
			||||||
 | 
					      }; | 
				
			||||||
 | 
					    case "file/directUpload": | 
				
			||||||
 | 
					    case "file/upload": | 
				
			||||||
 | 
					      toast.success("فایل  با موفقیت بارگذاری و ثبت شد"); | 
				
			||||||
 | 
					      return { | 
				
			||||||
 | 
					        ...state, | 
				
			||||||
 | 
					        loading: false, | 
				
			||||||
 | 
					        error: null, | 
				
			||||||
 | 
					        id: data.id, | 
				
			||||||
 | 
					      }; | 
				
			||||||
 | 
					    case "message/send": | 
				
			||||||
 | 
					      return { ...state, id: null }; | 
				
			||||||
 | 
					    case "file/limits": | 
				
			||||||
 | 
					      window.config = { | 
				
			||||||
 | 
					        ...(window.config || {}), | 
				
			||||||
 | 
					        ...data, | 
				
			||||||
 | 
					      }; | 
				
			||||||
 | 
					      return { ...state, loading: false, error: null }; | 
				
			||||||
 | 
					    case "file/group/list": | 
				
			||||||
 | 
					      return { ...state, groupList: data, loading: false, error: null }; | 
				
			||||||
 | 
					    case "file/loading": | 
				
			||||||
 | 
					      return { ...state, loading: true, progress: 0 }; | 
				
			||||||
 | 
					    case "file/progress": | 
				
			||||||
 | 
					      return { ...state, progress: data }; | 
				
			||||||
 | 
					    case "file/error": | 
				
			||||||
 | 
					      return { ...state, loading: false, error: data.message }; | 
				
			||||||
 | 
					    default: | 
				
			||||||
 | 
					      return state; | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					} | 
				
			||||||
Some files were not shown because too many files have changed in this diff Show More
					Loading…
					
					
				
		Reference in new issue