395 lines
11 KiB
React
395 lines
11 KiB
React
|
|
"use client";
|
||
|
|
|
||
|
|
import "../../style/globals.css";
|
||
|
|
import { Inter } from "next/font/google";
|
||
|
|
import "../../style/fontiran.css";
|
||
|
|
import NavBAr from "@comp/NavBar/NavBAr";
|
||
|
|
import "swiper/css";
|
||
|
|
import "swiper/css/navigation";
|
||
|
|
import "react-spring-bottom-sheet/dist/style.css";
|
||
|
|
import AppContext from "../../Contexts/AppContext";
|
||
|
|
import { useCallback, useEffect, useState } from "react";
|
||
|
|
import { motion } from "framer-motion";
|
||
|
|
import Link from "next/link";
|
||
|
|
import { usePathname, useRouter } from "next/navigation";
|
||
|
|
import { toast, ToastContainer } from "react-toastify";
|
||
|
|
import "react-toastify/dist/ReactToastify.css";
|
||
|
|
import Loading from "plugins/Loading/page";
|
||
|
|
import Chapar, { getToken } from "plugins/Chapar";
|
||
|
|
|
||
|
|
const inter = Inter({ subsets: ["latin"] });
|
||
|
|
|
||
|
|
export const metadata = {
|
||
|
|
title: "Create Next App",
|
||
|
|
description: "Generated by create next app",
|
||
|
|
};
|
||
|
|
|
||
|
|
export default function RootLayout({ children }) {
|
||
|
|
// BottomSheet
|
||
|
|
const [BottomSheetCreateRoleOpen, setBottomSheetCreateRoleOpen] =
|
||
|
|
useState(false);
|
||
|
|
|
||
|
|
const [BottomSheetCreateEmployeesOpen, setBottomSheetCreateEmployeesOpen] =
|
||
|
|
useState(false);
|
||
|
|
|
||
|
|
const [BottomSheetCreateShiftsOpen, setBottomSheetCreateShiftsOpen] =
|
||
|
|
useState(false);
|
||
|
|
|
||
|
|
// BigPlus
|
||
|
|
const [BigPlusOpen, setBigPlusOpen] = useState(false);
|
||
|
|
const [BigPlusRotateIcon, setBigPlusRotateIcon] = useState(false);
|
||
|
|
|
||
|
|
// login
|
||
|
|
const [phoneNumber, setPhoneNumber] = useState("");
|
||
|
|
const [verifyCode, setVerifyCode] = useState("");
|
||
|
|
const [stepLogin, setStepLogin] = useState(0);
|
||
|
|
const [tokenForStorage, setTokenForStorage] = useState(null);
|
||
|
|
|
||
|
|
// loading
|
||
|
|
const [loading, setLoading] = useState(false);
|
||
|
|
|
||
|
|
//auth
|
||
|
|
const [complexId, setComplexId] = useState(0);
|
||
|
|
|
||
|
|
// createRole / role
|
||
|
|
const [permissions, setPermissions] = useState(0);
|
||
|
|
const [permissionsChoose, setPermissionsChoose] = useState([]);
|
||
|
|
const [rolesData, setRolesData] = useState([]);
|
||
|
|
|
||
|
|
// createUser/ user
|
||
|
|
const [usersData, setUsersData] = useState([]);
|
||
|
|
const [rolesChoose, setRolesChoose] = useState([]);
|
||
|
|
|
||
|
|
const pathname = usePathname();
|
||
|
|
const router = useRouter();
|
||
|
|
const hiddenUrls = ["/login", "/"];
|
||
|
|
const shouldRenderComponent = !hiddenUrls.includes(pathname);
|
||
|
|
|
||
|
|
const closeBigPlusPage = () => {
|
||
|
|
setTimeout(() => {
|
||
|
|
setBigPlusOpen(false);
|
||
|
|
}, 500);
|
||
|
|
|
||
|
|
setBigPlusRotateIcon(false);
|
||
|
|
};
|
||
|
|
|
||
|
|
const ConfirmPhoneNumber = async (phoneNumber) => {
|
||
|
|
try {
|
||
|
|
const data = await Chapar.get(
|
||
|
|
`${process.env.NEXT_PUBLIC_API_URL}/auth/verifycode?phoneNumber=${phoneNumber}`
|
||
|
|
);
|
||
|
|
setStepLogin(1);
|
||
|
|
localStorage.removeItem("token");
|
||
|
|
} catch ({ error, status }) {
|
||
|
|
toast.error(" اطلاعات را صحیح وارد کنید ", {
|
||
|
|
position: "bottom-right",
|
||
|
|
closeOnClick: true,
|
||
|
|
});
|
||
|
|
}
|
||
|
|
};
|
||
|
|
const LoginWhitVerifyCode = async () => {
|
||
|
|
setLoading(true);
|
||
|
|
|
||
|
|
try {
|
||
|
|
const data = await Chapar.post(
|
||
|
|
`${process.env.NEXT_PUBLIC_API_URL}/auth/login/code`,
|
||
|
|
{
|
||
|
|
userName: phoneNumber,
|
||
|
|
password: null,
|
||
|
|
verifyCode,
|
||
|
|
}
|
||
|
|
);
|
||
|
|
setLoading(false);
|
||
|
|
localStorage.setItem("token", data.access_token);
|
||
|
|
|
||
|
|
if (data.user.signUpStatus == 1) {
|
||
|
|
setStepLogin(2);
|
||
|
|
} else if (data.user.signUpStatus == 2) {
|
||
|
|
toast.success(` ${data.user.firstName} جان خوش اومدی `, {
|
||
|
|
position: "bottom-right",
|
||
|
|
closeOnClick: true,
|
||
|
|
});
|
||
|
|
router.push("/home");
|
||
|
|
}
|
||
|
|
} catch ({ error, status }) {
|
||
|
|
toast.error(`${error.response.data.message}`, {
|
||
|
|
position: "bottom-right",
|
||
|
|
closeOnClick: true,
|
||
|
|
});
|
||
|
|
setLoading(false);
|
||
|
|
}
|
||
|
|
};
|
||
|
|
const SignUpLogin = async (body) => {
|
||
|
|
setLoading(true);
|
||
|
|
|
||
|
|
try {
|
||
|
|
const data = await Chapar.post(
|
||
|
|
`${process.env.NEXT_PUBLIC_API_URL}/auth/signup/complex`,
|
||
|
|
body,
|
||
|
|
{
|
||
|
|
headers: {
|
||
|
|
Authorization: getToken(),
|
||
|
|
},
|
||
|
|
}
|
||
|
|
);
|
||
|
|
setLoading(false);
|
||
|
|
|
||
|
|
if (data.user.signUpStatus == 2 || data.user.signUpStatus == 3) {
|
||
|
|
toast.success(` ${data.user.firstName} جان خوش اومدی `, {
|
||
|
|
position: "bottom-right",
|
||
|
|
closeOnClick: true,
|
||
|
|
});
|
||
|
|
localStorage.setItem("token", data.access_token);
|
||
|
|
|
||
|
|
router.push("/home");
|
||
|
|
}
|
||
|
|
} catch ({ error, status }) {
|
||
|
|
toast.error(`${error.response.data.message}`, {
|
||
|
|
position: "bottom-right",
|
||
|
|
closeOnClick: true,
|
||
|
|
});
|
||
|
|
setLoading(false);
|
||
|
|
}
|
||
|
|
};
|
||
|
|
const GetPermissions = async (body) => {
|
||
|
|
setLoading(true);
|
||
|
|
|
||
|
|
try {
|
||
|
|
const data = await Chapar.get(
|
||
|
|
`${process.env.NEXT_PUBLIC_API_URL}/role/permission`,
|
||
|
|
|
||
|
|
{
|
||
|
|
headers: {
|
||
|
|
Authorization: getToken(),
|
||
|
|
},
|
||
|
|
}
|
||
|
|
);
|
||
|
|
|
||
|
|
console.log(data);
|
||
|
|
setPermissions(data);
|
||
|
|
setLoading(false);
|
||
|
|
} catch ({ error, status }) {
|
||
|
|
toast.error(`${error.response.data.message}`, {
|
||
|
|
position: "bottom-right",
|
||
|
|
closeOnClick: true,
|
||
|
|
});
|
||
|
|
setLoading(false);
|
||
|
|
}
|
||
|
|
};
|
||
|
|
const CreateRole = async (body) => {
|
||
|
|
setLoading(true);
|
||
|
|
try {
|
||
|
|
const data = await Chapar.post(
|
||
|
|
`${process.env.NEXT_PUBLIC_API_URL}/role`,
|
||
|
|
body,
|
||
|
|
|
||
|
|
{
|
||
|
|
headers: {
|
||
|
|
Authorization: getToken(),
|
||
|
|
},
|
||
|
|
}
|
||
|
|
);
|
||
|
|
toast.success(`نقش ساخته شد`, {
|
||
|
|
position: "bottom-right",
|
||
|
|
closeOnClick: true,
|
||
|
|
});
|
||
|
|
setBottomSheetCreateRoleOpen(false);
|
||
|
|
setLoading(false);
|
||
|
|
GetRoles();
|
||
|
|
} catch ({ error, status }) {
|
||
|
|
toast.error(`${error.response.data.message}`, {
|
||
|
|
position: "bottom-right",
|
||
|
|
closeOnClick: true,
|
||
|
|
});
|
||
|
|
setLoading(false);
|
||
|
|
}
|
||
|
|
};
|
||
|
|
const GetRoles = async () => {
|
||
|
|
setLoading(true);
|
||
|
|
try {
|
||
|
|
const data = await Chapar.get(
|
||
|
|
`${process.env.NEXT_PUBLIC_API_URL}/role?page=0`,
|
||
|
|
|
||
|
|
{
|
||
|
|
headers: {
|
||
|
|
Authorization: getToken(),
|
||
|
|
},
|
||
|
|
}
|
||
|
|
);
|
||
|
|
|
||
|
|
setRolesData(data);
|
||
|
|
setLoading(false);
|
||
|
|
} catch ({ error, status }) {
|
||
|
|
toast.error(`${error.response.data.message}`, {
|
||
|
|
position: "bottom-right",
|
||
|
|
closeOnClick: true,
|
||
|
|
});
|
||
|
|
setLoading(false);
|
||
|
|
}
|
||
|
|
};
|
||
|
|
const CreateUser = async (body) => {
|
||
|
|
setLoading(true);
|
||
|
|
try {
|
||
|
|
const data = await Chapar.post(
|
||
|
|
`${process.env.NEXT_PUBLIC_API_URL}/user`,
|
||
|
|
body,
|
||
|
|
|
||
|
|
{
|
||
|
|
headers: {
|
||
|
|
Authorization: getToken(),
|
||
|
|
},
|
||
|
|
}
|
||
|
|
);
|
||
|
|
toast.success(`کاربر ساخته شد`, {
|
||
|
|
position: "bottom-right",
|
||
|
|
closeOnClick: true,
|
||
|
|
});
|
||
|
|
setBottomSheetCreateEmployeesOpen(false);
|
||
|
|
setLoading(false);
|
||
|
|
GetUsers();
|
||
|
|
} catch ({ error, status }) {
|
||
|
|
toast.error(`${error.response.data.message}`, {
|
||
|
|
position: "bottom-right",
|
||
|
|
closeOnClick: true,
|
||
|
|
});
|
||
|
|
setLoading(false);
|
||
|
|
}
|
||
|
|
};
|
||
|
|
const GetUsers = async () => {
|
||
|
|
setLoading(true);
|
||
|
|
try {
|
||
|
|
const data = await Chapar.get(
|
||
|
|
`${process.env.NEXT_PUBLIC_API_URL}/role?page=0`,
|
||
|
|
|
||
|
|
{
|
||
|
|
headers: {
|
||
|
|
Authorization: getToken(),
|
||
|
|
},
|
||
|
|
}
|
||
|
|
);
|
||
|
|
|
||
|
|
setUsersData(data);
|
||
|
|
setLoading(false);
|
||
|
|
} catch ({ error, status }) {
|
||
|
|
toast.error(`${error.response.data.message}`, {
|
||
|
|
position: "bottom-right",
|
||
|
|
closeOnClick: true,
|
||
|
|
});
|
||
|
|
setLoading(false);
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
// useEffect(() => {
|
||
|
|
// GetPermissions();
|
||
|
|
// }, []);
|
||
|
|
|
||
|
|
return (
|
||
|
|
<AppContext.Provider
|
||
|
|
value={{
|
||
|
|
state: {
|
||
|
|
BottomSheetCreateRoleOpen,
|
||
|
|
BottomSheetCreateEmployeesOpen,
|
||
|
|
BottomSheetCreateShiftsOpen,
|
||
|
|
BigPlusOpen,
|
||
|
|
BigPlusRotateIcon,
|
||
|
|
loading,
|
||
|
|
stepLogin,
|
||
|
|
phoneNumber,
|
||
|
|
verifyCode,
|
||
|
|
tokenForStorage,
|
||
|
|
complexId,
|
||
|
|
permissions,
|
||
|
|
permissionsChoose,
|
||
|
|
rolesData,
|
||
|
|
usersData,
|
||
|
|
rolesChoose,
|
||
|
|
},
|
||
|
|
setBottomSheetCreateRoleOpen,
|
||
|
|
setBottomSheetCreateEmployeesOpen,
|
||
|
|
setBottomSheetCreateShiftsOpen,
|
||
|
|
setBigPlusOpen,
|
||
|
|
setBigPlusRotateIcon,
|
||
|
|
setLoading,
|
||
|
|
ConfirmPhoneNumber,
|
||
|
|
LoginWhitVerifyCode,
|
||
|
|
setStepLogin,
|
||
|
|
setPhoneNumber,
|
||
|
|
setVerifyCode,
|
||
|
|
SignUpLogin,
|
||
|
|
setTokenForStorage,
|
||
|
|
setComplexId,
|
||
|
|
setPermissions,
|
||
|
|
GetPermissions,
|
||
|
|
setPermissionsChoose,
|
||
|
|
CreateRole,
|
||
|
|
setRolesData,
|
||
|
|
GetRoles,
|
||
|
|
CreateUser,
|
||
|
|
GetUsers,
|
||
|
|
setUsersData,
|
||
|
|
setRolesChoose,
|
||
|
|
}}
|
||
|
|
>
|
||
|
|
<html lang="en">
|
||
|
|
<body className={inter.className}>
|
||
|
|
{children}
|
||
|
|
{shouldRenderComponent && <NavBAr />}
|
||
|
|
<ToastContainer position="bottom-right" closeOnClick={true} rtl />
|
||
|
|
<Loading />
|
||
|
|
{BigPlusOpen ? (
|
||
|
|
<div className="fixed w-full top-0 z-40">
|
||
|
|
<motion.div
|
||
|
|
animate={{ opacity: [0, 0.5, 1] }}
|
||
|
|
transition={{ duration: 0.3 }}
|
||
|
|
>
|
||
|
|
<div className="bg-BigPlus h-screen">
|
||
|
|
<div className="flex justify-center">
|
||
|
|
<div className="bg-primary-200 w-[60px] h-[60px] rounded-full fixed bottom-[37px] ">
|
||
|
|
<div
|
||
|
|
onClick={() => {
|
||
|
|
closeBigPlusPage();
|
||
|
|
}}
|
||
|
|
>
|
||
|
|
<svg
|
||
|
|
width="25"
|
||
|
|
height="25"
|
||
|
|
viewBox="0 0 16 16"
|
||
|
|
fill="none"
|
||
|
|
xmlns="http://www.w3.org/2000/svg"
|
||
|
|
className={`mx-auto mt-[16px] transition-all ${
|
||
|
|
BigPlusRotateIcon ? " rotate-45" : " rotate-0"
|
||
|
|
} `}
|
||
|
|
>
|
||
|
|
<path
|
||
|
|
d="M14 6H10V2C10 1.46957 9.78929 0.960859 9.41421 0.585786C9.03914 0.210714 8.53043 0 8 0C7.46957 0 6.96086 0.210714 6.58579 0.585786C6.21071 0.960859 6 1.46957 6 2L6.071 6H2C1.46957 6 0.960859 6.21071 0.585786 6.58579C0.210714 6.96086 0 7.46957 0 8C0 8.53043 0.210714 9.03914 0.585786 9.41421C0.960859 9.78929 1.46957 10 2 10L6.071 9.929L6 14C6 14.5304 6.21071 15.0391 6.58579 15.4142C6.96086 15.7893 7.46957 16 8 16C8.53043 16 9.03914 15.7893 9.41421 15.4142C9.78929 15.0391 10 14.5304 10 14V9.929L14 10C14.5304 10 15.0391 9.78929 15.4142 9.41421C15.7893 9.03914 16 8.53043 16 8C16 7.46957 15.7893 6.96086 15.4142 6.58579C15.0391 6.21071 14.5304 6 14 6Z"
|
||
|
|
fill="white"
|
||
|
|
/>
|
||
|
|
</svg>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
<div className="flex justify-between px-4 fixed bottom-[110px] w-full">
|
||
|
|
<Link href={"/dsdasd"}>
|
||
|
|
<div className="bg-secondaryDark-100 p-3 m-2 w-full rounded-full">
|
||
|
|
<p className="mb-0 text-white">افزودن خرید جدیـــــد</p>
|
||
|
|
</div>
|
||
|
|
</Link>
|
||
|
|
|
||
|
|
<Link href={"/dsdasd"}>
|
||
|
|
<div className="bg-secondaryDark-100 p-3 m-2 w-full rounded-full">
|
||
|
|
<p className="mb-0 text-white">افزودن وظیفه جدید</p>
|
||
|
|
</div>
|
||
|
|
</Link>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
</motion.div>
|
||
|
|
</div>
|
||
|
|
) : (
|
||
|
|
""
|
||
|
|
)}
|
||
|
|
</body>
|
||
|
|
</html>
|
||
|
|
</AppContext.Provider>
|
||
|
|
);
|
||
|
|
}
|