diff --git a/apps/OpenSign/public/locales/en/translation.json b/apps/OpenSign/public/locales/en/translation.json index fdc74a522..72ff69023 100644 --- a/apps/OpenSign/public/locales/en/translation.json +++ b/apps/OpenSign/public/locales/en/translation.json @@ -636,6 +636,8 @@ "quota-mail-tip":"Tip: You can still sign <1>unlimited documents1> by manually sharing the signing request links.", "quota-mail-head":"Quota Reached", "unauthorized-modal":"You don't have permission to perform this action, please contact {{adminName}}<{{adminEmail}}>.", - "sent-this-month":"Sent this month" + "sent-this-month":"Sent this month", + "available-seats":"Available seats", + "buy-users":"Buy more users" } diff --git a/apps/OpenSign/public/locales/fr/translation.json b/apps/OpenSign/public/locales/fr/translation.json index c4eaf9200..4373ff1c2 100644 --- a/apps/OpenSign/public/locales/fr/translation.json +++ b/apps/OpenSign/public/locales/fr/translation.json @@ -635,6 +635,7 @@ "quota-mail-tip-tip":"Astuce : Vous pouvez toujours signer un nombre <1>illimité de documents1> en partageant manuellement les liens de demande de signature.", "quota-mail-head":"Quota atteint", "unauthorized-modal":"Vous n'êtes pas autorisé à effectuer cette action, veuillez contacter {{adminName}}<{{adminEmail}}>.", - "sent-this-month":"envoyé ce mois-ci" - + "sent-this-month":"envoyé ce mois-ci", + "available-seats":"Disponible sièges", + "buy-users":"Acheter plus d'utilisateurs" } diff --git a/apps/OpenSign/src/layout/HomeLayout.js b/apps/OpenSign/src/layout/HomeLayout.js index ee0187aef..085784e4e 100644 --- a/apps/OpenSign/src/layout/HomeLayout.js +++ b/apps/OpenSign/src/layout/HomeLayout.js @@ -252,9 +252,9 @@ const HomeLayout = () => { } }; - const handleLoginBtn = () => { + const handleLoginBtn = async () => { try { - Parse?.User?.logOut(); + await Parse?.User?.logOut(); } catch (err) { console.log("err ", err); } finally { diff --git a/apps/OpenSign/src/pages/PlanSubscriptions.js b/apps/OpenSign/src/pages/PlanSubscriptions.js index 8428487ef..96d283ccb 100644 --- a/apps/OpenSign/src/pages/PlanSubscriptions.js +++ b/apps/OpenSign/src/pages/PlanSubscriptions.js @@ -121,9 +121,9 @@ const PlanSubscriptions = () => { }; const handleLogout = async () => { try { - Parse?.User?.logOut(); + await Parse?.User?.logOut(); } catch (err) { - console.log("Err", err); + console.log("Err while logging out", err); } let appdata = localStorage.getItem("userSettings"); let applogo = localStorage.getItem("appLogo"); diff --git a/apps/OpenSign/src/pages/UserList.js b/apps/OpenSign/src/pages/UserList.js index 1359e0261..2bb42c555 100644 --- a/apps/OpenSign/src/pages/UserList.js +++ b/apps/OpenSign/src/pages/UserList.js @@ -9,7 +9,7 @@ import Tooltip from "../primitives/Tooltip"; import AddUser from "../components/AddUser"; import SubscribeCard from "../primitives/SubscribeCard"; import { isEnableSubscription } from "../constant/const"; -import { checkIsSubscribed } from "../constant/Utils"; +import { fetchSubscriptionInfo } from "../constant/Utils"; import Title from "../components/Title"; import { validplan } from "../json/plansArr"; import { useTranslation } from "react-i18next"; @@ -19,7 +19,11 @@ const UserList = () => { const { t } = useTranslation(); const [userList, setUserList] = useState([]); const [isLoader, setIsLoader] = useState(false); - const [isModal, setIsModal] = useState(false); + const [isModal, setIsModal] = useState({ + form: false, + addseats: false, + options: false + }); const location = useLocation(); const isDashboard = location?.pathname === "/dashboard/35KBoSgoAK" ? true : false; @@ -27,9 +31,16 @@ const UserList = () => { const [isAlert, setIsAlert] = useState({ type: "success", msg: "" }); const [isActiveModal, setIsActiveModal] = useState({}); const [isActLoader, setIsActLoader] = useState({}); - const [isSubscribe, setIsSubscribe] = useState({ plan: "", isValid: false }); + const [isSubscribe, setIsSubscribe] = useState({ + plan: "", + isValid: false, + priceperUser: 0 + }); const [isAdmin, setIsAdmin] = useState(false); const [formHeader, setFormHeader] = useState(t("add-user")); + const [usersCount, setUserCounts] = useState({ allowed: 0, totalAllowed: 0 }); + const [amount, setAmount] = useState({ quantity: 1, price: 0 }); + const [isBuyLoader, setIsBuyLoader] = useState(false); const recordperPage = 10; const startIndex = (currentPage - 1) * recordperPage; // user per page @@ -81,7 +92,6 @@ const UserList = () => { pages.push(lastPageIndex); } } - return pages; }; const pageNumbers = getPaginationRange(); @@ -96,13 +106,44 @@ const UserList = () => { async function fetchUserList() { try { setIsLoader(true); + const extUser = + localStorage.getItem("Extand_Class") && + JSON.parse(localStorage.getItem("Extand_Class"))?.[0]; if (isEnableSubscription) { - const subscribe = await checkIsSubscribed(); - setIsSubscribe(subscribe); + const subscribe = await fetchSubscriptionInfo(); + if (subscribe?.plan_code?.includes("team")) { + const isSupAdmin = + subscribe?.adminId && extUser?.objectId === subscribe?.adminId; + setIsSubscribe({ + plan: subscribe.plan_code, + isValid: true, + adminId: subscribe.adminId, + priceperUser: subscribe.price, + isSuperAdmin: isSupAdmin + }); + setAmount((prev) => ({ ...prev, price: subscribe.price })); + try { + const res = await Parse.Cloud.run("allowedusers"); + console.log("res ", res); + setUserCounts((obj) => ({ + ...obj, + allowed: res, + totalAllowed: subscribe?.totalAllowedUser || 0 + })); + } catch (err) { + console.log("err while get users", err); + } + } else { + setIsSubscribe({ + plan: subscribe.plan_code, + isValid: false, + adminId: subscribe.adminId + }); + } } else { setIsSubscribe({ plan: "teams-yearly", isValid: true }); } - const extUser = JSON.parse(localStorage.getItem("Extand_Class"))?.[0]; + if (extUser) { const admin = extUser?.UserRole && @@ -121,14 +162,12 @@ const UserList = () => { console.log("Err in fetch userlist", err); setIsAlert({ type: "danger", msg: t("something-went-wrong-mssg") }); } finally { - setTimeout(() => { - setIsAlert({ type: "success", msg: "" }); - }, 1500); + setTimeout(() => setIsAlert({ type: "success", msg: "" }), 1500); setIsLoader(false); } } - const handleFormModal = () => { - setIsModal(!isModal); + const handleModal = (modalName) => { + setIsModal((obj) => ({ ...obj, [modalName]: !obj[modalName] })); }; // Change page @@ -196,6 +235,39 @@ const UserList = () => { const handleToggleBtn = (user) => { setIsActiveModal({ [user.objectId]: true }); }; + + const handleAddOnSubmit = async (e) => { + e.preventDefault(); + e.stopPropagation(); + setIsBuyLoader(true); + try { + const resAddon = await Parse.Cloud.run("buyaddonusers", { + users: amount.quantity + }); + if (resAddon) { + const _resAddon = JSON.parse(JSON.stringify(resAddon)); + if (_resAddon.status === "success") { + setUserCounts((obj) => ({ + ...obj, + allowed: obj.allowed + amount.quantity, + totalAllowed: _resAddon.addon + })); + } + } + } catch (err) { + console.log("Err in buy addon", err); + setIsAlert({ type: "danger", msg: t("something-went-wrong-mssg") }); + } finally { + setTimeout(() => setIsAlert({ type: "success", msg: "" }), 2000); + setIsBuyLoader(false); + handleModal("addseats"); + } + }; + const handlePricePerUser = (e) => { + const quantity = e.target.value; + const price = e.target?.value > 0 ? isSubscribe.priceperUser * quantity : 0; + setAmount((prev) => ({ ...prev, quantity: quantity, price: price })); + }; return (