Skip to content

Commit 16c73d4

Browse files
Merge branch 'staging' of https://github.com/OpenSignLabs/OpenSign into rotatepage_document
2 parents 96aff52 + b298571 commit 16c73d4

File tree

17 files changed

+981
-925
lines changed

17 files changed

+981
-925
lines changed

apps/OpenSign/package-lock.json

Lines changed: 600 additions & 509 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

apps/OpenSign/package.json

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,16 @@
44
"private": true,
55
"dependencies": {
66
"@formkit/auto-animate": "^0.8.2",
7-
"@lottiefiles/dotlottie-react": "^0.8.7",
7+
"@lottiefiles/dotlottie-react": "^0.8.9",
88
"@pdf-lib/fontkit": "^1.1.1",
99
"@radix-ui/themes": "^3.1.3",
1010
"@react-pdf/renderer": "^3.4.4",
1111
"@reduxjs/toolkit": "^2.2.7",
1212
"axios": "^1.7.4",
1313
"file-saver": "^2.0.5",
14-
"i18next": "^23.12.2",
14+
"i18next": "^23.14.0",
1515
"i18next-browser-languagedetector": "^8.0.0",
16-
"i18next-http-backend": "^2.5.2",
16+
"i18next-http-backend": "^2.6.1",
1717
"jwt-decode": "^4.0.0",
1818
"moment": "^2.30.1",
1919
"nth-check": "^2.1.1",
@@ -36,10 +36,10 @@
3636
"react-i18next": "^15.0.1",
3737
"react-konva": "^18.2.10",
3838
"react-pdf": "^9.1.0",
39-
"react-quill-new": "^3.2.2",
39+
"react-quill-new": "^3.3.0",
4040
"react-redux": "^9.1.2",
4141
"react-rnd": "^10.4.11",
42-
"react-router-dom": "^6.26.0",
42+
"react-router-dom": "^6.26.1",
4343
"react-scripts": "5.0.1",
4444
"react-scrollbars-custom": "^4.1.1",
4545
"react-select": "^5.8.0",
@@ -94,9 +94,9 @@
9494
},
9595
"devDependencies": {
9696
"@babel/core": "^7.25.2",
97-
"@babel/preset-env": "^7.25.3",
97+
"@babel/preset-env": "^7.25.4",
9898
"@babel/preset-react": "^7.24.7",
99-
"@babel/runtime-corejs2": "^7.25.0",
99+
"@babel/runtime-corejs2": "^7.25.4",
100100
"autoprefixer": "^10.4.20",
101101
"babel-loader": "^9.1.3",
102102
"clean-webpack-plugin": "^4.0.0",
@@ -110,7 +110,7 @@
110110
"eslint-plugin-prettier": "^5.2.1",
111111
"eslint-plugin-react": "^7.34.3",
112112
"lint-staged": "^15.2.8",
113-
"mini-css-extract-plugin": "^2.9.0",
113+
"mini-css-extract-plugin": "^2.9.1",
114114
"postcss": "^8.4.41",
115115
"prettier": "^3.3.3",
116116
"pretty-quick": "^4.0.0",

apps/OpenSign/public/locales/en/translation.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -618,5 +618,6 @@
618618
"rotate-right":"Rotate right",
619619
"rotate-left":"Rotate left",
620620
"rotate-alert-mssg":"All widgets on this page will be lost. Are you sure you want to proceed?",
621-
"templateid":"Template-Id"
621+
"templateid":"Template-Id",
622+
"bulksendsubcriptionalert":"Please upgrade to Professional or Team plan to use quicksend."
622623
}

apps/OpenSign/public/locales/fr/translation.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -618,5 +618,6 @@
618618
"rotate-right" :"Faire pivoter à droite",
619619
"rotate-left" :"Faire pivoter à gauche",
620620
"rotate-alert-mssg" :"Tous les widgets de cette page seront perdus. Êtes-vous sûr de vouloir continuer ?",
621-
"templateid":"ID de modèle"
621+
"templateid":"ID de modèle",
622+
"bulksendsubcriptionalert":"Veuillez passer au forfait Professionnel ou Équipe pour utiliser Quicksend."
622623
}

apps/OpenSign/src/components/BulkSendUi.js

Lines changed: 66 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,11 @@ import { useTranslation } from "react-i18next";
66
import Parse from "parse";
77
import ModalUi from "../primitives/ModalUi";
88
import { isEnableSubscription } from "../constant/const";
9+
import { fetchSubscription } from "../constant/Utils";
10+
import { useNavigate } from "react-router-dom";
911
const BulkSendUi = (props) => {
1012
const { t } = useTranslation();
13+
const navigate = useNavigate();
1114
const [forms, setForms] = useState([]);
1215
const [formId, setFormId] = useState(2);
1316
const formRef = useRef(null);
@@ -25,6 +28,7 @@ const BulkSendUi = (props) => {
2528
});
2629
const [isQuotaReached, setIsQuotaReached] = useState(false);
2730
const [isLoader, setIsLoader] = useState(false);
31+
const [isFreePlan, setIsFreePlan] = useState(false);
2832
const allowedSigners = 50;
2933
useEffect(() => {
3034
signatureExist();
@@ -36,6 +40,10 @@ const BulkSendUi = (props) => {
3640
if (isEnableSubscription) {
3741
setIsLoader(true);
3842
try {
43+
const subscription = await fetchSubscription();
44+
if (subscription?.plan === "freeplan") {
45+
setIsFreePlan(true);
46+
}
3947
const allowedquicksend = await Parse.Cloud.run("allowedquicksend");
4048
if (allowedquicksend > 0) {
4149
setIsBulkAvailable(true);
@@ -273,6 +281,9 @@ const BulkSendUi = (props) => {
273281
const handleCloseQuotaReached = () => {
274282
setIsQuotaReached(false);
275283
};
284+
const handleNavigation = () => {
285+
navigate("/subscription");
286+
};
276287
return (
277288
<>
278289
{isLoader ? (
@@ -385,46 +396,62 @@ const BulkSendUi = (props) => {
385396
)}
386397
</>
387398
) : (
388-
<form onSubmit={handleAddOnQuickSubmit} className="p-3">
389-
<p className="flex justify-center text-center mx-2 mb-3 text-base op-text-accent font-medium">
390-
{t("additional-quicksend")}
391-
</p>
392-
<div className="mb-3 flex justify-between">
393-
<label
394-
htmlFor="quantity"
395-
className="block text-xs text-gray-700 font-semibold"
396-
>
397-
{t("quantityofquicksend")}
398-
<span className="text-[red] text-[13px]">*</span>
399-
</label>
400-
<select
401-
value={amount.quantity}
402-
onChange={(e) => handlePricePerQuick(e)}
403-
name="quantity"
404-
className="op-select op-select-bordered op-select-sm focus:outline-none hover:border-base-content w-1/4 text-xs"
405-
required
406-
>
407-
{quantityList.length > 0 &&
408-
quantityList.map((x) => (
409-
<option key={x} value={x}>
410-
{x}
411-
</option>
412-
))}
413-
</select>
414-
</div>
415-
<div className="mb-3 flex justify-between">
416-
<label className="block text-xs text-gray-700 font-semibold">
417-
{t("Price")} (1 * {amount.priceperbulksend})
418-
</label>
419-
<div className="w-1/4 flex justify-center items-center text-sm">
420-
USD {amount.price}
399+
<>
400+
{isFreePlan ? (
401+
<div className="w-full h-[130px] flex flex-col justify-center items-center text-center p-4">
402+
<p className="text-base font-medium mb-2.5">
403+
{t("bulksendsubcriptionalert")}
404+
</p>
405+
<button
406+
onClick={() => handleNavigation()}
407+
className="op-btn op-btn-primary"
408+
>
409+
{t("upgrade-now")}
410+
</button>
421411
</div>
422-
</div>
423-
<hr className="text-base-content mb-3" />
424-
<button className="op-btn op-btn-primary w-full mt-2">
425-
{t("Proceed")}
426-
</button>
427-
</form>
412+
) : (
413+
<form onSubmit={handleAddOnQuickSubmit} className="p-3">
414+
<p className="flex justify-center text-center mx-2 mb-3 text-base op-text-accent font-medium">
415+
{t("additional-quicksend")}
416+
</p>
417+
<div className="mb-3 flex justify-between">
418+
<label
419+
htmlFor="quantity"
420+
className="block text-xs text-gray-700 font-semibold"
421+
>
422+
{t("quantityofquicksend")}
423+
<span className="text-[red] text-[13px]">*</span>
424+
</label>
425+
<select
426+
value={amount.quantity}
427+
onChange={(e) => handlePricePerQuick(e)}
428+
name="quantity"
429+
className="op-select op-select-bordered op-select-sm focus:outline-none hover:border-base-content w-1/4 text-xs"
430+
required
431+
>
432+
{quantityList.length > 0 &&
433+
quantityList.map((x) => (
434+
<option key={x} value={x}>
435+
{x}
436+
</option>
437+
))}
438+
</select>
439+
</div>
440+
<div className="mb-3 flex justify-between">
441+
<label className="block text-xs text-gray-700 font-semibold">
442+
{t("Price")} (1 * {amount.priceperbulksend})
443+
</label>
444+
<div className="w-1/4 flex justify-center items-center text-sm">
445+
USD {amount.price}
446+
</div>
447+
</div>
448+
<hr className="text-base-content mb-3" />
449+
<button className="op-btn op-btn-primary w-full mt-2">
450+
{t("Proceed")}
451+
</button>
452+
</form>
453+
)}
454+
</>
428455
)}
429456
</>
430457
)}

apps/OpenSign/src/components/pdf/DraftDocument.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ function DraftDocument() {
5454
navigate(`/recipientSignPdf/${data.objectId}`);
5555
}
5656
//checking if document has completed and signyour-self flow
57-
else if (!signerExist && !isPlaceholder) {
57+
else if ((!signerExist && !isPlaceholder) || data?.IsSignyourself) {
5858
navigate(`/signaturePdf/${data.objectId}`);
5959
}
6060
//checking if document has declined by someone

apps/OpenSign/src/components/pdf/RenderPdf.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -554,7 +554,7 @@ function RenderPdf({
554554
</React.Fragment>
555555
);
556556
})
557-
: xyPostion.map((data, ind) => {
557+
: xyPostion?.map((data, ind) => {
558558
// signyourself flow
559559
return (
560560
<React.Fragment key={ind}>

apps/OpenSign/src/pages/GenerateToken.js

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,13 @@ import Tooltip from "../primitives/Tooltip";
99
import Loader from "../primitives/Loader";
1010
import SubscribeCard from "../primitives/SubscribeCard";
1111
import Tour from "reactour";
12-
import { validplan } from "../json/plansArr";
1312
import { useTranslation } from "react-i18next";
1413
import Parse from "parse";
1514

1615
function GenerateToken() {
1716
const { t } = useTranslation();
18-
const [parseBaseUrl] = useState(localStorage.getItem("baseUrl"));
19-
const [parseAppId] = useState(localStorage.getItem("parseAppId"));
17+
const parseBaseUrl = localStorage.getItem("baseUrl");
18+
const parseAppId = localStorage.getItem("parseAppId");
2019
const [apiToken, SetApiToken] = useState("");
2120
const [isLoader, setIsLoader] = useState(true);
2221
const [isModal, setIsModal] = useState({
@@ -50,11 +49,17 @@ function GenerateToken() {
5049
const subscribe = await checkIsSubscribed();
5150
setIsSubscribe(subscribe);
5251
}
53-
const res = await Parse.Cloud.run("getapitoken");
52+
const url = parseBaseUrl + "functions/getapitoken";
53+
const headers = {
54+
"Content-Type": "application/json",
55+
"X-Parse-Application-Id": parseAppId,
56+
sessiontoken: localStorage.getItem("accesstoken")
57+
};
58+
const res = await axios.post(url, {}, { headers: headers });
5459
if (res) {
5560
const allowedapis = await Parse.Cloud.run("allowedapis");
5661
setAmount((obj) => ({ ...obj, totalapis: allowedapis }));
57-
SetApiToken(res?.result);
62+
SetApiToken(res?.data?.result?.result);
5863
}
5964
setIsLoader(false);
6065
} catch (err) {
@@ -65,7 +70,7 @@ function GenerateToken() {
6570
};
6671
const handleSubmit = async (e) => {
6772
e.preventDefault();
68-
if (!validplan[isSubscribe.plan] && isEnableSubscription) {
73+
if (isSubscribe?.plan === "freeplan" && isEnableSubscription) {
6974
setIsTour(true);
7075
} else {
7176
setIsLoader(true);
@@ -103,19 +108,27 @@ function GenerateToken() {
103108
setTimeout(() => setIsAlert({ type: "success", msg: "" }), 1500); // Reset copied state after 1.5 seconds
104109
};
105110
const handleModal = () => {
106-
setIsModal((obj) => ({ ...obj, generateapi: !obj.generateapi }));
111+
if (isSubscribe?.plan === "freeplan" && isEnableSubscription) {
112+
setIsTour(true);
113+
} else {
114+
setIsModal((obj) => ({ ...obj, generateapi: !obj.generateapi }));
115+
}
107116
};
108117

109118
const handleBuyAPIsModal = () => {
110-
setIsModal((obj) => ({ ...obj, buyapis: !obj.buyapis }));
119+
if (isSubscribe?.plan === "freeplan" && isEnableSubscription) {
120+
setIsTour(true);
121+
} else {
122+
setIsModal((obj) => ({ ...obj, buyapis: !obj.buyapis }));
123+
}
111124
};
112125

113126
const handlePricePerAPIs = (e) => {
114127
const quantity = e.target?.value;
115128
const price =
116129
quantity > 0
117130
? (Math.round(quantity * amount.priceperapi * 100) / 100).toFixed(2)
118-
: 500 * amount.priceperapi;
131+
: (Math.round(500 * amount.priceperapi * 100) / 100).toFixed(2);
119132
setAmount((prev) => ({ ...prev, quantity: quantity, price: price }));
120133
};
121134
const handleAddOnApiSubmit = async (e) => {
@@ -131,7 +144,7 @@ function GenerateToken() {
131144
if (_resAddon.status === "success") {
132145
setAmount((obj) => ({
133146
...obj,
134-
quantity: 1,
147+
quantity: 500,
135148
priceperapi: 0.15,
136149
price: (75.0).toFixed(2),
137150
totalapis: _resAddon.addon
@@ -172,16 +185,18 @@ function GenerateToken() {
172185
<span
173186
id="token"
174187
className={`${
175-
validplan[isSubscribe.plan]
176-
? ""
177-
: "bg-white/20 pointer-events-none select-none"
188+
isSubscribe?.plan === "freeplan"
189+
? "bg-white/20 pointer-events-none select-none"
190+
: ""
178191
} md:text-end py-2 md:py-0`}
179192
>
180193
<span
181194
className="cursor-pointer"
182195
onClick={() => copytoclipboard(apiToken)}
183196
>
184-
{apiToken ? apiToken : "_____"}
197+
{isSubscribe?.plan !== "freeplan" && apiToken
198+
? apiToken
199+
: "_____"}
185200
</span>
186201
<button
187202
className="op-btn op-btn-accent op-btn-outline op-btn-sm ml-2 cursor-pointer"
@@ -299,9 +314,9 @@ function GenerateToken() {
299314
</form>
300315
</ModalUi>
301316
</div>
302-
{!validplan[isSubscribe.plan] && isEnableSubscription && (
317+
{isSubscribe?.plan === "freeplan" && isEnableSubscription && (
303318
<div data-tut="apisubscribe">
304-
<SubscribeCard plan_code={isSubscribe.plan} />
319+
<SubscribeCard plan_code={isSubscribe?.plan} />
305320
</div>
306321
)}
307322
</>

0 commit comments

Comments
 (0)