@samsheena/payment-ui 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -0
- package/dist/index.cjs.js +286 -0
- package/dist/index.cjs.js.map +1 -0
- package/dist/index.esm.js +284 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/styles.css +207 -0
- package/package.json +51 -0
package/README.md
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# glh-payment-ui
|
|
2
|
+
|
|
3
|
+
Frontend-only Payment Account + Subscription UI.
|
|
4
|
+
|
|
5
|
+
- ₹5/month fixed
|
|
6
|
+
- Plans exist but only 6-month plan enabled & default
|
|
7
|
+
- Always shows 100% discount and Net Payable ₹0
|
|
8
|
+
- No backend
|
|
9
|
+
|
|
10
|
+
## Install
|
|
11
|
+
npm i glh-payment-ui
|
|
12
|
+
|
|
13
|
+
## Usage
|
|
14
|
+
import { AccountButton } from "glh-payment-ui";
|
|
15
|
+
import "glh-payment-ui/dist/styles.css";
|
|
16
|
+
|
|
17
|
+
Place <AccountButton /> in the center area of your navbar.
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var React = require('react');
|
|
4
|
+
|
|
5
|
+
const PRICE_PER_MONTH = 5;
|
|
6
|
+
const PLAN_LIST = [{
|
|
7
|
+
key: "monthly",
|
|
8
|
+
label: "Monthly",
|
|
9
|
+
months: 1,
|
|
10
|
+
enabled: false
|
|
11
|
+
}, {
|
|
12
|
+
key: "3m",
|
|
13
|
+
label: "3 Months",
|
|
14
|
+
months: 3,
|
|
15
|
+
enabled: false
|
|
16
|
+
}, {
|
|
17
|
+
key: "6m",
|
|
18
|
+
label: "6 Months",
|
|
19
|
+
months: 6,
|
|
20
|
+
enabled: true
|
|
21
|
+
},
|
|
22
|
+
// ONLY enabled + default
|
|
23
|
+
{
|
|
24
|
+
key: "1y",
|
|
25
|
+
label: "Yearly",
|
|
26
|
+
months: 12,
|
|
27
|
+
enabled: false
|
|
28
|
+
}, {
|
|
29
|
+
key: "3y",
|
|
30
|
+
label: "3 Years",
|
|
31
|
+
months: 36,
|
|
32
|
+
enabled: false
|
|
33
|
+
}];
|
|
34
|
+
function PaymentModal({
|
|
35
|
+
open,
|
|
36
|
+
onClose
|
|
37
|
+
}) {
|
|
38
|
+
const defaultPlanKey = "6m";
|
|
39
|
+
const [fullName, setFullName] = React.useState("");
|
|
40
|
+
const [email, setEmail] = React.useState("");
|
|
41
|
+
const [planKey, setPlanKey] = React.useState(defaultPlanKey);
|
|
42
|
+
const [accountCreated, setAccountCreated] = React.useState(false);
|
|
43
|
+
const selectedPlan = React.useMemo(() => {
|
|
44
|
+
return PLAN_LIST.find(p => p.key === planKey) || PLAN_LIST[2];
|
|
45
|
+
}, [planKey]);
|
|
46
|
+
const total = React.useMemo(() => selectedPlan.months * PRICE_PER_MONTH, [selectedPlan]);
|
|
47
|
+
const discountPercent = 100;
|
|
48
|
+
const discountAmount = total; // 100% discount
|
|
49
|
+
const netPayable = 0; // always zero
|
|
50
|
+
|
|
51
|
+
function handleBackdropClick(e) {
|
|
52
|
+
if (e.target?.classList?.contains("glh-pay-backdrop")) onClose?.();
|
|
53
|
+
}
|
|
54
|
+
function createAccountAndSubscribe() {
|
|
55
|
+
// Frontend-only: store in localStorage so app can show "created" state later
|
|
56
|
+
const payload = {
|
|
57
|
+
createdAt: new Date().toISOString(),
|
|
58
|
+
fullName,
|
|
59
|
+
email,
|
|
60
|
+
plan: selectedPlan,
|
|
61
|
+
pricePerMonth: PRICE_PER_MONTH,
|
|
62
|
+
total,
|
|
63
|
+
discountPercent,
|
|
64
|
+
discountAmount,
|
|
65
|
+
netPayable
|
|
66
|
+
};
|
|
67
|
+
try {
|
|
68
|
+
localStorage.setItem("glh_payment_account", JSON.stringify(payload));
|
|
69
|
+
setAccountCreated(true);
|
|
70
|
+
} catch (err) {
|
|
71
|
+
// ignore; still show UI success
|
|
72
|
+
setAccountCreated(true);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (!open) return null;
|
|
76
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
77
|
+
className: "glh-pay-backdrop",
|
|
78
|
+
onMouseDown: handleBackdropClick,
|
|
79
|
+
role: "dialog",
|
|
80
|
+
"aria-modal": "true"
|
|
81
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
82
|
+
className: "glh-pay-modal",
|
|
83
|
+
onMouseDown: e => e.stopPropagation()
|
|
84
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
85
|
+
className: "glh-pay-header"
|
|
86
|
+
}, /*#__PURE__*/React.createElement("h3", {
|
|
87
|
+
className: "glh-pay-title"
|
|
88
|
+
}, "Create Payment Account"), /*#__PURE__*/React.createElement("button", {
|
|
89
|
+
className: "glh-pay-close",
|
|
90
|
+
onClick: onClose,
|
|
91
|
+
"aria-label": "Close"
|
|
92
|
+
}, "\u2715")), /*#__PURE__*/React.createElement("div", {
|
|
93
|
+
className: "glh-pay-body"
|
|
94
|
+
}, !accountCreated ? /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
|
|
95
|
+
className: "glh-pay-row"
|
|
96
|
+
}, /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("div", {
|
|
97
|
+
className: "glh-pay-label"
|
|
98
|
+
}, "Full Name"), /*#__PURE__*/React.createElement("input", {
|
|
99
|
+
className: "glh-pay-input",
|
|
100
|
+
value: fullName,
|
|
101
|
+
onChange: e => setFullName(e.target.value),
|
|
102
|
+
placeholder: "Enter your name"
|
|
103
|
+
})), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("div", {
|
|
104
|
+
className: "glh-pay-label"
|
|
105
|
+
}, "Email"), /*#__PURE__*/React.createElement("input", {
|
|
106
|
+
className: "glh-pay-input",
|
|
107
|
+
value: email,
|
|
108
|
+
onChange: e => setEmail(e.target.value),
|
|
109
|
+
placeholder: "Enter your email"
|
|
110
|
+
}))), /*#__PURE__*/React.createElement("div", {
|
|
111
|
+
className: "glh-pay-label",
|
|
112
|
+
style: {
|
|
113
|
+
marginBottom: 8
|
|
114
|
+
}
|
|
115
|
+
}, "Subscription Plans (\u20B9", PRICE_PER_MONTH, " / month)"), /*#__PURE__*/React.createElement("div", {
|
|
116
|
+
className: "glh-pay-plans"
|
|
117
|
+
}, PLAN_LIST.map(p => {
|
|
118
|
+
const disabled = !p.enabled;
|
|
119
|
+
const selected = p.key === planKey;
|
|
120
|
+
function pickPlan() {
|
|
121
|
+
if (disabled) return;
|
|
122
|
+
setPlanKey(p.key);
|
|
123
|
+
}
|
|
124
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
125
|
+
key: p.key,
|
|
126
|
+
className: ["glh-pay-plan", disabled ? "glh-pay-planDisabled" : "", selected ? "glh-pay-selected" : ""].join(" "),
|
|
127
|
+
onClick: pickPlan,
|
|
128
|
+
role: "button",
|
|
129
|
+
tabIndex: disabled ? -1 : 0,
|
|
130
|
+
onKeyDown: e => {
|
|
131
|
+
if ((e.key === "Enter" || e.key === " ") && !disabled) pickPlan();
|
|
132
|
+
},
|
|
133
|
+
"aria-disabled": disabled,
|
|
134
|
+
"aria-pressed": selected
|
|
135
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
136
|
+
style: {
|
|
137
|
+
display: "grid",
|
|
138
|
+
gap: 4
|
|
139
|
+
}
|
|
140
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
141
|
+
style: {
|
|
142
|
+
fontWeight: 900
|
|
143
|
+
}
|
|
144
|
+
}, p.label), /*#__PURE__*/React.createElement("div", {
|
|
145
|
+
style: {
|
|
146
|
+
fontSize: 12,
|
|
147
|
+
color: "rgba(0,0,0,0.65)"
|
|
148
|
+
}
|
|
149
|
+
}, "Duration: ", p.months, " month(s)")), /*#__PURE__*/React.createElement("div", {
|
|
150
|
+
style: {
|
|
151
|
+
display: "flex",
|
|
152
|
+
gap: 8,
|
|
153
|
+
alignItems: "center"
|
|
154
|
+
}
|
|
155
|
+
}, p.enabled ? /*#__PURE__*/React.createElement("span", {
|
|
156
|
+
className: "glh-pay-pill"
|
|
157
|
+
}, "ENABLED") : /*#__PURE__*/React.createElement("span", {
|
|
158
|
+
className: "glh-pay-pill"
|
|
159
|
+
}, "DISABLED"), selected ? /*#__PURE__*/React.createElement("span", {
|
|
160
|
+
className: "glh-pay-pill"
|
|
161
|
+
}, "SELECTED") : null));
|
|
162
|
+
})), /*#__PURE__*/React.createElement("div", {
|
|
163
|
+
className: "glh-pay-summary"
|
|
164
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
165
|
+
className: "glh-pay-line"
|
|
166
|
+
}, /*#__PURE__*/React.createElement("span", null, "Total (", selectedPlan.months, " \xD7 \u20B9", PRICE_PER_MONTH, ")"), /*#__PURE__*/React.createElement("span", {
|
|
167
|
+
className: "glh-pay-strong"
|
|
168
|
+
}, "\u20B9", total)), /*#__PURE__*/React.createElement("div", {
|
|
169
|
+
className: "glh-pay-line"
|
|
170
|
+
}, /*#__PURE__*/React.createElement("span", null, "Discount"), /*#__PURE__*/React.createElement("span", {
|
|
171
|
+
className: "glh-pay-strong"
|
|
172
|
+
}, discountPercent, "% (-\u20B9", discountAmount, ")")), /*#__PURE__*/React.createElement("div", {
|
|
173
|
+
className: "glh-pay-line"
|
|
174
|
+
}, /*#__PURE__*/React.createElement("span", {
|
|
175
|
+
className: "glh-pay-strong"
|
|
176
|
+
}, "Net Payable"), /*#__PURE__*/React.createElement("span", {
|
|
177
|
+
className: "glh-pay-strong"
|
|
178
|
+
}, "\u20B9", netPayable))), /*#__PURE__*/React.createElement("div", {
|
|
179
|
+
className: "glh-pay-note"
|
|
180
|
+
}, "Note: This package is frontend-only. Payment is always \u20B90 because 100% discount is applied.")) : /*#__PURE__*/React.createElement("div", {
|
|
181
|
+
style: {
|
|
182
|
+
padding: 6
|
|
183
|
+
}
|
|
184
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
185
|
+
style: {
|
|
186
|
+
fontWeight: 900,
|
|
187
|
+
fontSize: 16,
|
|
188
|
+
marginBottom: 8
|
|
189
|
+
}
|
|
190
|
+
}, "\u2705 Account Created"), /*#__PURE__*/React.createElement("div", {
|
|
191
|
+
style: {
|
|
192
|
+
fontSize: 13,
|
|
193
|
+
color: "rgba(0,0,0,0.7)"
|
|
194
|
+
}
|
|
195
|
+
}, "Your subscription is ready with ", /*#__PURE__*/React.createElement("b", null, "100% discount"), ". Net payable is ", /*#__PURE__*/React.createElement("b", null, "\u20B90"), "."), /*#__PURE__*/React.createElement("div", {
|
|
196
|
+
className: "glh-pay-summary",
|
|
197
|
+
style: {
|
|
198
|
+
marginTop: 14
|
|
199
|
+
}
|
|
200
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
201
|
+
className: "glh-pay-line"
|
|
202
|
+
}, /*#__PURE__*/React.createElement("span", null, "Selected Plan"), /*#__PURE__*/React.createElement("span", {
|
|
203
|
+
className: "glh-pay-strong"
|
|
204
|
+
}, selectedPlan.label)), /*#__PURE__*/React.createElement("div", {
|
|
205
|
+
className: "glh-pay-line"
|
|
206
|
+
}, /*#__PURE__*/React.createElement("span", null, "Total"), /*#__PURE__*/React.createElement("span", {
|
|
207
|
+
className: "glh-pay-strong"
|
|
208
|
+
}, "\u20B9", total)), /*#__PURE__*/React.createElement("div", {
|
|
209
|
+
className: "glh-pay-line"
|
|
210
|
+
}, /*#__PURE__*/React.createElement("span", null, "Discount"), /*#__PURE__*/React.createElement("span", {
|
|
211
|
+
className: "glh-pay-strong"
|
|
212
|
+
}, "100% (-\u20B9", total, ")")), /*#__PURE__*/React.createElement("div", {
|
|
213
|
+
className: "glh-pay-line"
|
|
214
|
+
}, /*#__PURE__*/React.createElement("span", {
|
|
215
|
+
className: "glh-pay-strong"
|
|
216
|
+
}, "Net Payable"), /*#__PURE__*/React.createElement("span", {
|
|
217
|
+
className: "glh-pay-strong"
|
|
218
|
+
}, "\u20B90"))))), /*#__PURE__*/React.createElement("div", {
|
|
219
|
+
className: "glh-pay-footer"
|
|
220
|
+
}, !accountCreated ? /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("button", {
|
|
221
|
+
className: "glh-pay-secondary",
|
|
222
|
+
onClick: onClose
|
|
223
|
+
}, "Cancel"), /*#__PURE__*/React.createElement("button", {
|
|
224
|
+
className: "glh-pay-primary",
|
|
225
|
+
onClick: createAccountAndSubscribe,
|
|
226
|
+
disabled: !fullName || !email,
|
|
227
|
+
title: !fullName || !email ? "Enter name & email" : "Create account",
|
|
228
|
+
style: !fullName || !email ? {
|
|
229
|
+
opacity: 0.6,
|
|
230
|
+
cursor: "not-allowed"
|
|
231
|
+
} : null
|
|
232
|
+
}, "Create Account")) : /*#__PURE__*/React.createElement("button", {
|
|
233
|
+
className: "glh-pay-primary",
|
|
234
|
+
onClick: onClose
|
|
235
|
+
}, "Done"))));
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* AccountButton
|
|
240
|
+
* - Place this component in the CENTER area of your navbar.
|
|
241
|
+
* - It renders a button and a modal for account creation + subscription summary.
|
|
242
|
+
*/
|
|
243
|
+
function AccountButton({
|
|
244
|
+
buttonText = "Account",
|
|
245
|
+
wrapperClassName = "",
|
|
246
|
+
buttonClassName = "",
|
|
247
|
+
onAccountCreated
|
|
248
|
+
}) {
|
|
249
|
+
const [open, setOpen] = React.useState(false);
|
|
250
|
+
const [hasAccount, setHasAccount] = React.useState(false);
|
|
251
|
+
React.useEffect(() => {
|
|
252
|
+
try {
|
|
253
|
+
const saved = localStorage.getItem("glh_payment_account");
|
|
254
|
+
setHasAccount(!!saved);
|
|
255
|
+
} catch (e) {
|
|
256
|
+
setHasAccount(false);
|
|
257
|
+
}
|
|
258
|
+
}, [open]);
|
|
259
|
+
function handleClose() {
|
|
260
|
+
setOpen(false);
|
|
261
|
+
// refresh state after close
|
|
262
|
+
try {
|
|
263
|
+
const saved = localStorage.getItem("glh_payment_account");
|
|
264
|
+
const ok = !!saved;
|
|
265
|
+
setHasAccount(ok);
|
|
266
|
+
if (ok && typeof onAccountCreated === "function") {
|
|
267
|
+
onAccountCreated(JSON.parse(saved));
|
|
268
|
+
}
|
|
269
|
+
} catch (e) {
|
|
270
|
+
// ignore
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
|
|
274
|
+
className: `glh-pay-centerWrap ${wrapperClassName}`
|
|
275
|
+
}, /*#__PURE__*/React.createElement("button", {
|
|
276
|
+
className: `glh-pay-btn ${buttonClassName}`,
|
|
277
|
+
onClick: () => setOpen(true),
|
|
278
|
+
type: "button"
|
|
279
|
+
}, hasAccount ? `${buttonText} ✓` : buttonText)), /*#__PURE__*/React.createElement(PaymentModal, {
|
|
280
|
+
open: open,
|
|
281
|
+
onClose: handleClose
|
|
282
|
+
}));
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
exports.AccountButton = AccountButton;
|
|
286
|
+
//# sourceMappingURL=index.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../src/components/PaymentModal.jsx","../src/components/AccountButton.jsx"],"sourcesContent":["import React, { useMemo, useState } from \"react\";\r\nimport \"./styles.css\";\r\n\r\nconst PRICE_PER_MONTH = 5;\r\n\r\nconst PLAN_LIST = [\r\n { key: \"monthly\", label: \"Monthly\", months: 1, enabled: false },\r\n { key: \"3m\", label: \"3 Months\", months: 3, enabled: false },\r\n { key: \"6m\", label: \"6 Months\", months: 6, enabled: true }, // ONLY enabled + default\r\n { key: \"1y\", label: \"Yearly\", months: 12, enabled: false },\r\n { key: \"3y\", label: \"3 Years\", months: 36, enabled: false }\r\n];\r\n\r\nexport function PaymentModal({ open, onClose }) {\r\n const defaultPlanKey = \"6m\";\r\n\r\n const [fullName, setFullName] = useState(\"\");\r\n const [email, setEmail] = useState(\"\");\r\n const [planKey, setPlanKey] = useState(defaultPlanKey);\r\n const [accountCreated, setAccountCreated] = useState(false);\r\n\r\n const selectedPlan = useMemo(() => {\r\n return PLAN_LIST.find((p) => p.key === planKey) || PLAN_LIST[2];\r\n }, [planKey]);\r\n\r\n const total = useMemo(() => selectedPlan.months * PRICE_PER_MONTH, [selectedPlan]);\r\n const discountPercent = 100;\r\n const discountAmount = total; // 100% discount\r\n const netPayable = 0; // always zero\r\n\r\n function handleBackdropClick(e) {\r\n if (e.target?.classList?.contains(\"glh-pay-backdrop\")) onClose?.();\r\n }\r\n\r\n function createAccountAndSubscribe() {\r\n // Frontend-only: store in localStorage so app can show \"created\" state later\r\n const payload = {\r\n createdAt: new Date().toISOString(),\r\n fullName,\r\n email,\r\n plan: selectedPlan,\r\n pricePerMonth: PRICE_PER_MONTH,\r\n total,\r\n discountPercent,\r\n discountAmount,\r\n netPayable\r\n };\r\n try {\r\n localStorage.setItem(\"glh_payment_account\", JSON.stringify(payload));\r\n setAccountCreated(true);\r\n } catch (err) {\r\n // ignore; still show UI success\r\n setAccountCreated(true);\r\n }\r\n }\r\n\r\n if (!open) return null;\r\n\r\n return (\r\n <div className=\"glh-pay-backdrop\" onMouseDown={handleBackdropClick} role=\"dialog\" aria-modal=\"true\">\r\n <div className=\"glh-pay-modal\" onMouseDown={(e) => e.stopPropagation()}>\r\n <div className=\"glh-pay-header\">\r\n <h3 className=\"glh-pay-title\">Create Payment Account</h3>\r\n <button className=\"glh-pay-close\" onClick={onClose} aria-label=\"Close\">✕</button>\r\n </div>\r\n\r\n <div className=\"glh-pay-body\">\r\n {!accountCreated ? (\r\n <>\r\n <div className=\"glh-pay-row\">\r\n <div>\r\n <div className=\"glh-pay-label\">Full Name</div>\r\n <input\r\n className=\"glh-pay-input\"\r\n value={fullName}\r\n onChange={(e) => setFullName(e.target.value)}\r\n placeholder=\"Enter your name\"\r\n />\r\n </div>\r\n\r\n <div>\r\n <div className=\"glh-pay-label\">Email</div>\r\n <input\r\n className=\"glh-pay-input\"\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n placeholder=\"Enter your email\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div className=\"glh-pay-label\" style={{ marginBottom: 8 }}>\r\n Subscription Plans (₹{PRICE_PER_MONTH} / month)\r\n </div>\r\n\r\n <div className=\"glh-pay-plans\">\r\n {PLAN_LIST.map((p) => {\r\n const disabled = !p.enabled;\r\n const selected = p.key === planKey;\r\n\r\n function pickPlan() {\r\n if (disabled) return;\r\n setPlanKey(p.key);\r\n }\r\n\r\n return (\r\n <div\r\n key={p.key}\r\n className={[\r\n \"glh-pay-plan\",\r\n disabled ? \"glh-pay-planDisabled\" : \"\",\r\n selected ? \"glh-pay-selected\" : \"\"\r\n ].join(\" \")}\r\n onClick={pickPlan}\r\n role=\"button\"\r\n tabIndex={disabled ? -1 : 0}\r\n onKeyDown={(e) => {\r\n if ((e.key === \"Enter\" || e.key === \" \") && !disabled) pickPlan();\r\n }}\r\n aria-disabled={disabled}\r\n aria-pressed={selected}\r\n >\r\n <div style={{ display: \"grid\", gap: 4 }}>\r\n <div style={{ fontWeight: 900 }}>{p.label}</div>\r\n <div style={{ fontSize: 12, color: \"rgba(0,0,0,0.65)\" }}>\r\n Duration: {p.months} month(s)\r\n </div>\r\n </div>\r\n\r\n <div style={{ display: \"flex\", gap: 8, alignItems: \"center\" }}>\r\n {p.enabled ? <span className=\"glh-pay-pill\">ENABLED</span> : <span className=\"glh-pay-pill\">DISABLED</span>}\r\n {selected ? <span className=\"glh-pay-pill\">SELECTED</span> : null}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n\r\n <div className=\"glh-pay-summary\">\r\n <div className=\"glh-pay-line\">\r\n <span>Total ({selectedPlan.months} × ₹{PRICE_PER_MONTH})</span>\r\n <span className=\"glh-pay-strong\">₹{total}</span>\r\n </div>\r\n <div className=\"glh-pay-line\">\r\n <span>Discount</span>\r\n <span className=\"glh-pay-strong\">{discountPercent}% (-₹{discountAmount})</span>\r\n </div>\r\n <div className=\"glh-pay-line\">\r\n <span className=\"glh-pay-strong\">Net Payable</span>\r\n <span className=\"glh-pay-strong\">₹{netPayable}</span>\r\n </div>\r\n </div>\r\n\r\n <div className=\"glh-pay-note\">\r\n Note: This package is frontend-only. Payment is always ₹0 because 100% discount is applied.\r\n </div>\r\n </>\r\n ) : (\r\n <div style={{ padding: 6 }}>\r\n <div style={{ fontWeight: 900, fontSize: 16, marginBottom: 8 }}>✅ Account Created</div>\r\n <div style={{ fontSize: 13, color: \"rgba(0,0,0,0.7)\" }}>\r\n Your subscription is ready with <b>100% discount</b>. Net payable is <b>₹0</b>.\r\n </div>\r\n\r\n <div className=\"glh-pay-summary\" style={{ marginTop: 14 }}>\r\n <div className=\"glh-pay-line\">\r\n <span>Selected Plan</span>\r\n <span className=\"glh-pay-strong\">{selectedPlan.label}</span>\r\n </div>\r\n <div className=\"glh-pay-line\">\r\n <span>Total</span>\r\n <span className=\"glh-pay-strong\">₹{total}</span>\r\n </div>\r\n <div className=\"glh-pay-line\">\r\n <span>Discount</span>\r\n <span className=\"glh-pay-strong\">100% (-₹{total})</span>\r\n </div>\r\n <div className=\"glh-pay-line\">\r\n <span className=\"glh-pay-strong\">Net Payable</span>\r\n <span className=\"glh-pay-strong\">₹0</span>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div className=\"glh-pay-footer\">\r\n {!accountCreated ? (\r\n <>\r\n <button className=\"glh-pay-secondary\" onClick={onClose}>Cancel</button>\r\n <button\r\n className=\"glh-pay-primary\"\r\n onClick={createAccountAndSubscribe}\r\n disabled={!fullName || !email}\r\n title={!fullName || !email ? \"Enter name & email\" : \"Create account\"}\r\n style={!fullName || !email ? { opacity: 0.6, cursor: \"not-allowed\" } : null}\r\n >\r\n Create Account\r\n </button>\r\n </>\r\n ) : (\r\n <button className=\"glh-pay-primary\" onClick={onClose}>Done</button>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import React, { useEffect, useState } from \"react\";\r\nimport { PaymentModal } from \"./PaymentModal.jsx\";\r\nimport \"./styles.css\";\r\n\r\n/**\r\n * AccountButton\r\n * - Place this component in the CENTER area of your navbar.\r\n * - It renders a button and a modal for account creation + subscription summary.\r\n */\r\nexport function AccountButton({\r\n buttonText = \"Account\",\r\n wrapperClassName = \"\",\r\n buttonClassName = \"\",\r\n onAccountCreated\r\n}) {\r\n const [open, setOpen] = useState(false);\r\n const [hasAccount, setHasAccount] = useState(false);\r\n\r\n useEffect(() => {\r\n try {\r\n const saved = localStorage.getItem(\"glh_payment_account\");\r\n setHasAccount(!!saved);\r\n } catch (e) {\r\n setHasAccount(false);\r\n }\r\n }, [open]);\r\n\r\n function handleClose() {\r\n setOpen(false);\r\n // refresh state after close\r\n try {\r\n const saved = localStorage.getItem(\"glh_payment_account\");\r\n const ok = !!saved;\r\n setHasAccount(ok);\r\n if (ok && typeof onAccountCreated === \"function\") {\r\n onAccountCreated(JSON.parse(saved));\r\n }\r\n } catch (e) {\r\n // ignore\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n <div className={`glh-pay-centerWrap ${wrapperClassName}`}>\r\n <button\r\n className={`glh-pay-btn ${buttonClassName}`}\r\n onClick={() => setOpen(true)}\r\n type=\"button\"\r\n >\r\n {hasAccount ? `${buttonText} ✓` : buttonText}\r\n </button>\r\n </div>\r\n\r\n <PaymentModal open={open} onClose={handleClose} />\r\n </>\r\n );\r\n}\r\n"],"names":["PRICE_PER_MONTH","PLAN_LIST","key","label","months","enabled","PaymentModal","open","onClose","defaultPlanKey","fullName","setFullName","useState","email","setEmail","planKey","setPlanKey","accountCreated","setAccountCreated","selectedPlan","useMemo","find","p","total","discountPercent","discountAmount","netPayable","handleBackdropClick","e","target","classList","contains","createAccountAndSubscribe","payload","createdAt","Date","toISOString","plan","pricePerMonth","localStorage","setItem","JSON","stringify","err","React","createElement","className","onMouseDown","role","stopPropagation","onClick","Fragment","value","onChange","placeholder","style","marginBottom","map","disabled","selected","pickPlan","join","tabIndex","onKeyDown","display","gap","fontWeight","fontSize","color","alignItems","padding","marginTop","title","opacity","cursor","AccountButton","buttonText","wrapperClassName","buttonClassName","onAccountCreated","setOpen","hasAccount","setHasAccount","useEffect","saved","getItem","handleClose","ok","parse","type"],"mappings":"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"}
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
import React, { useState, useMemo, useEffect } from 'react';
|
|
2
|
+
|
|
3
|
+
const PRICE_PER_MONTH = 5;
|
|
4
|
+
const PLAN_LIST = [{
|
|
5
|
+
key: "monthly",
|
|
6
|
+
label: "Monthly",
|
|
7
|
+
months: 1,
|
|
8
|
+
enabled: false
|
|
9
|
+
}, {
|
|
10
|
+
key: "3m",
|
|
11
|
+
label: "3 Months",
|
|
12
|
+
months: 3,
|
|
13
|
+
enabled: false
|
|
14
|
+
}, {
|
|
15
|
+
key: "6m",
|
|
16
|
+
label: "6 Months",
|
|
17
|
+
months: 6,
|
|
18
|
+
enabled: true
|
|
19
|
+
},
|
|
20
|
+
// ONLY enabled + default
|
|
21
|
+
{
|
|
22
|
+
key: "1y",
|
|
23
|
+
label: "Yearly",
|
|
24
|
+
months: 12,
|
|
25
|
+
enabled: false
|
|
26
|
+
}, {
|
|
27
|
+
key: "3y",
|
|
28
|
+
label: "3 Years",
|
|
29
|
+
months: 36,
|
|
30
|
+
enabled: false
|
|
31
|
+
}];
|
|
32
|
+
function PaymentModal({
|
|
33
|
+
open,
|
|
34
|
+
onClose
|
|
35
|
+
}) {
|
|
36
|
+
const defaultPlanKey = "6m";
|
|
37
|
+
const [fullName, setFullName] = useState("");
|
|
38
|
+
const [email, setEmail] = useState("");
|
|
39
|
+
const [planKey, setPlanKey] = useState(defaultPlanKey);
|
|
40
|
+
const [accountCreated, setAccountCreated] = useState(false);
|
|
41
|
+
const selectedPlan = useMemo(() => {
|
|
42
|
+
return PLAN_LIST.find(p => p.key === planKey) || PLAN_LIST[2];
|
|
43
|
+
}, [planKey]);
|
|
44
|
+
const total = useMemo(() => selectedPlan.months * PRICE_PER_MONTH, [selectedPlan]);
|
|
45
|
+
const discountPercent = 100;
|
|
46
|
+
const discountAmount = total; // 100% discount
|
|
47
|
+
const netPayable = 0; // always zero
|
|
48
|
+
|
|
49
|
+
function handleBackdropClick(e) {
|
|
50
|
+
if (e.target?.classList?.contains("glh-pay-backdrop")) onClose?.();
|
|
51
|
+
}
|
|
52
|
+
function createAccountAndSubscribe() {
|
|
53
|
+
// Frontend-only: store in localStorage so app can show "created" state later
|
|
54
|
+
const payload = {
|
|
55
|
+
createdAt: new Date().toISOString(),
|
|
56
|
+
fullName,
|
|
57
|
+
email,
|
|
58
|
+
plan: selectedPlan,
|
|
59
|
+
pricePerMonth: PRICE_PER_MONTH,
|
|
60
|
+
total,
|
|
61
|
+
discountPercent,
|
|
62
|
+
discountAmount,
|
|
63
|
+
netPayable
|
|
64
|
+
};
|
|
65
|
+
try {
|
|
66
|
+
localStorage.setItem("glh_payment_account", JSON.stringify(payload));
|
|
67
|
+
setAccountCreated(true);
|
|
68
|
+
} catch (err) {
|
|
69
|
+
// ignore; still show UI success
|
|
70
|
+
setAccountCreated(true);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
if (!open) return null;
|
|
74
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
75
|
+
className: "glh-pay-backdrop",
|
|
76
|
+
onMouseDown: handleBackdropClick,
|
|
77
|
+
role: "dialog",
|
|
78
|
+
"aria-modal": "true"
|
|
79
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
80
|
+
className: "glh-pay-modal",
|
|
81
|
+
onMouseDown: e => e.stopPropagation()
|
|
82
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
83
|
+
className: "glh-pay-header"
|
|
84
|
+
}, /*#__PURE__*/React.createElement("h3", {
|
|
85
|
+
className: "glh-pay-title"
|
|
86
|
+
}, "Create Payment Account"), /*#__PURE__*/React.createElement("button", {
|
|
87
|
+
className: "glh-pay-close",
|
|
88
|
+
onClick: onClose,
|
|
89
|
+
"aria-label": "Close"
|
|
90
|
+
}, "\u2715")), /*#__PURE__*/React.createElement("div", {
|
|
91
|
+
className: "glh-pay-body"
|
|
92
|
+
}, !accountCreated ? /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
|
|
93
|
+
className: "glh-pay-row"
|
|
94
|
+
}, /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("div", {
|
|
95
|
+
className: "glh-pay-label"
|
|
96
|
+
}, "Full Name"), /*#__PURE__*/React.createElement("input", {
|
|
97
|
+
className: "glh-pay-input",
|
|
98
|
+
value: fullName,
|
|
99
|
+
onChange: e => setFullName(e.target.value),
|
|
100
|
+
placeholder: "Enter your name"
|
|
101
|
+
})), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("div", {
|
|
102
|
+
className: "glh-pay-label"
|
|
103
|
+
}, "Email"), /*#__PURE__*/React.createElement("input", {
|
|
104
|
+
className: "glh-pay-input",
|
|
105
|
+
value: email,
|
|
106
|
+
onChange: e => setEmail(e.target.value),
|
|
107
|
+
placeholder: "Enter your email"
|
|
108
|
+
}))), /*#__PURE__*/React.createElement("div", {
|
|
109
|
+
className: "glh-pay-label",
|
|
110
|
+
style: {
|
|
111
|
+
marginBottom: 8
|
|
112
|
+
}
|
|
113
|
+
}, "Subscription Plans (\u20B9", PRICE_PER_MONTH, " / month)"), /*#__PURE__*/React.createElement("div", {
|
|
114
|
+
className: "glh-pay-plans"
|
|
115
|
+
}, PLAN_LIST.map(p => {
|
|
116
|
+
const disabled = !p.enabled;
|
|
117
|
+
const selected = p.key === planKey;
|
|
118
|
+
function pickPlan() {
|
|
119
|
+
if (disabled) return;
|
|
120
|
+
setPlanKey(p.key);
|
|
121
|
+
}
|
|
122
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
123
|
+
key: p.key,
|
|
124
|
+
className: ["glh-pay-plan", disabled ? "glh-pay-planDisabled" : "", selected ? "glh-pay-selected" : ""].join(" "),
|
|
125
|
+
onClick: pickPlan,
|
|
126
|
+
role: "button",
|
|
127
|
+
tabIndex: disabled ? -1 : 0,
|
|
128
|
+
onKeyDown: e => {
|
|
129
|
+
if ((e.key === "Enter" || e.key === " ") && !disabled) pickPlan();
|
|
130
|
+
},
|
|
131
|
+
"aria-disabled": disabled,
|
|
132
|
+
"aria-pressed": selected
|
|
133
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
134
|
+
style: {
|
|
135
|
+
display: "grid",
|
|
136
|
+
gap: 4
|
|
137
|
+
}
|
|
138
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
139
|
+
style: {
|
|
140
|
+
fontWeight: 900
|
|
141
|
+
}
|
|
142
|
+
}, p.label), /*#__PURE__*/React.createElement("div", {
|
|
143
|
+
style: {
|
|
144
|
+
fontSize: 12,
|
|
145
|
+
color: "rgba(0,0,0,0.65)"
|
|
146
|
+
}
|
|
147
|
+
}, "Duration: ", p.months, " month(s)")), /*#__PURE__*/React.createElement("div", {
|
|
148
|
+
style: {
|
|
149
|
+
display: "flex",
|
|
150
|
+
gap: 8,
|
|
151
|
+
alignItems: "center"
|
|
152
|
+
}
|
|
153
|
+
}, p.enabled ? /*#__PURE__*/React.createElement("span", {
|
|
154
|
+
className: "glh-pay-pill"
|
|
155
|
+
}, "ENABLED") : /*#__PURE__*/React.createElement("span", {
|
|
156
|
+
className: "glh-pay-pill"
|
|
157
|
+
}, "DISABLED"), selected ? /*#__PURE__*/React.createElement("span", {
|
|
158
|
+
className: "glh-pay-pill"
|
|
159
|
+
}, "SELECTED") : null));
|
|
160
|
+
})), /*#__PURE__*/React.createElement("div", {
|
|
161
|
+
className: "glh-pay-summary"
|
|
162
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
163
|
+
className: "glh-pay-line"
|
|
164
|
+
}, /*#__PURE__*/React.createElement("span", null, "Total (", selectedPlan.months, " \xD7 \u20B9", PRICE_PER_MONTH, ")"), /*#__PURE__*/React.createElement("span", {
|
|
165
|
+
className: "glh-pay-strong"
|
|
166
|
+
}, "\u20B9", total)), /*#__PURE__*/React.createElement("div", {
|
|
167
|
+
className: "glh-pay-line"
|
|
168
|
+
}, /*#__PURE__*/React.createElement("span", null, "Discount"), /*#__PURE__*/React.createElement("span", {
|
|
169
|
+
className: "glh-pay-strong"
|
|
170
|
+
}, discountPercent, "% (-\u20B9", discountAmount, ")")), /*#__PURE__*/React.createElement("div", {
|
|
171
|
+
className: "glh-pay-line"
|
|
172
|
+
}, /*#__PURE__*/React.createElement("span", {
|
|
173
|
+
className: "glh-pay-strong"
|
|
174
|
+
}, "Net Payable"), /*#__PURE__*/React.createElement("span", {
|
|
175
|
+
className: "glh-pay-strong"
|
|
176
|
+
}, "\u20B9", netPayable))), /*#__PURE__*/React.createElement("div", {
|
|
177
|
+
className: "glh-pay-note"
|
|
178
|
+
}, "Note: This package is frontend-only. Payment is always \u20B90 because 100% discount is applied.")) : /*#__PURE__*/React.createElement("div", {
|
|
179
|
+
style: {
|
|
180
|
+
padding: 6
|
|
181
|
+
}
|
|
182
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
183
|
+
style: {
|
|
184
|
+
fontWeight: 900,
|
|
185
|
+
fontSize: 16,
|
|
186
|
+
marginBottom: 8
|
|
187
|
+
}
|
|
188
|
+
}, "\u2705 Account Created"), /*#__PURE__*/React.createElement("div", {
|
|
189
|
+
style: {
|
|
190
|
+
fontSize: 13,
|
|
191
|
+
color: "rgba(0,0,0,0.7)"
|
|
192
|
+
}
|
|
193
|
+
}, "Your subscription is ready with ", /*#__PURE__*/React.createElement("b", null, "100% discount"), ". Net payable is ", /*#__PURE__*/React.createElement("b", null, "\u20B90"), "."), /*#__PURE__*/React.createElement("div", {
|
|
194
|
+
className: "glh-pay-summary",
|
|
195
|
+
style: {
|
|
196
|
+
marginTop: 14
|
|
197
|
+
}
|
|
198
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
199
|
+
className: "glh-pay-line"
|
|
200
|
+
}, /*#__PURE__*/React.createElement("span", null, "Selected Plan"), /*#__PURE__*/React.createElement("span", {
|
|
201
|
+
className: "glh-pay-strong"
|
|
202
|
+
}, selectedPlan.label)), /*#__PURE__*/React.createElement("div", {
|
|
203
|
+
className: "glh-pay-line"
|
|
204
|
+
}, /*#__PURE__*/React.createElement("span", null, "Total"), /*#__PURE__*/React.createElement("span", {
|
|
205
|
+
className: "glh-pay-strong"
|
|
206
|
+
}, "\u20B9", total)), /*#__PURE__*/React.createElement("div", {
|
|
207
|
+
className: "glh-pay-line"
|
|
208
|
+
}, /*#__PURE__*/React.createElement("span", null, "Discount"), /*#__PURE__*/React.createElement("span", {
|
|
209
|
+
className: "glh-pay-strong"
|
|
210
|
+
}, "100% (-\u20B9", total, ")")), /*#__PURE__*/React.createElement("div", {
|
|
211
|
+
className: "glh-pay-line"
|
|
212
|
+
}, /*#__PURE__*/React.createElement("span", {
|
|
213
|
+
className: "glh-pay-strong"
|
|
214
|
+
}, "Net Payable"), /*#__PURE__*/React.createElement("span", {
|
|
215
|
+
className: "glh-pay-strong"
|
|
216
|
+
}, "\u20B90"))))), /*#__PURE__*/React.createElement("div", {
|
|
217
|
+
className: "glh-pay-footer"
|
|
218
|
+
}, !accountCreated ? /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("button", {
|
|
219
|
+
className: "glh-pay-secondary",
|
|
220
|
+
onClick: onClose
|
|
221
|
+
}, "Cancel"), /*#__PURE__*/React.createElement("button", {
|
|
222
|
+
className: "glh-pay-primary",
|
|
223
|
+
onClick: createAccountAndSubscribe,
|
|
224
|
+
disabled: !fullName || !email,
|
|
225
|
+
title: !fullName || !email ? "Enter name & email" : "Create account",
|
|
226
|
+
style: !fullName || !email ? {
|
|
227
|
+
opacity: 0.6,
|
|
228
|
+
cursor: "not-allowed"
|
|
229
|
+
} : null
|
|
230
|
+
}, "Create Account")) : /*#__PURE__*/React.createElement("button", {
|
|
231
|
+
className: "glh-pay-primary",
|
|
232
|
+
onClick: onClose
|
|
233
|
+
}, "Done"))));
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* AccountButton
|
|
238
|
+
* - Place this component in the CENTER area of your navbar.
|
|
239
|
+
* - It renders a button and a modal for account creation + subscription summary.
|
|
240
|
+
*/
|
|
241
|
+
function AccountButton({
|
|
242
|
+
buttonText = "Account",
|
|
243
|
+
wrapperClassName = "",
|
|
244
|
+
buttonClassName = "",
|
|
245
|
+
onAccountCreated
|
|
246
|
+
}) {
|
|
247
|
+
const [open, setOpen] = useState(false);
|
|
248
|
+
const [hasAccount, setHasAccount] = useState(false);
|
|
249
|
+
useEffect(() => {
|
|
250
|
+
try {
|
|
251
|
+
const saved = localStorage.getItem("glh_payment_account");
|
|
252
|
+
setHasAccount(!!saved);
|
|
253
|
+
} catch (e) {
|
|
254
|
+
setHasAccount(false);
|
|
255
|
+
}
|
|
256
|
+
}, [open]);
|
|
257
|
+
function handleClose() {
|
|
258
|
+
setOpen(false);
|
|
259
|
+
// refresh state after close
|
|
260
|
+
try {
|
|
261
|
+
const saved = localStorage.getItem("glh_payment_account");
|
|
262
|
+
const ok = !!saved;
|
|
263
|
+
setHasAccount(ok);
|
|
264
|
+
if (ok && typeof onAccountCreated === "function") {
|
|
265
|
+
onAccountCreated(JSON.parse(saved));
|
|
266
|
+
}
|
|
267
|
+
} catch (e) {
|
|
268
|
+
// ignore
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
|
|
272
|
+
className: `glh-pay-centerWrap ${wrapperClassName}`
|
|
273
|
+
}, /*#__PURE__*/React.createElement("button", {
|
|
274
|
+
className: `glh-pay-btn ${buttonClassName}`,
|
|
275
|
+
onClick: () => setOpen(true),
|
|
276
|
+
type: "button"
|
|
277
|
+
}, hasAccount ? `${buttonText} ✓` : buttonText)), /*#__PURE__*/React.createElement(PaymentModal, {
|
|
278
|
+
open: open,
|
|
279
|
+
onClose: handleClose
|
|
280
|
+
}));
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
export { AccountButton };
|
|
284
|
+
//# sourceMappingURL=index.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../src/components/PaymentModal.jsx","../src/components/AccountButton.jsx"],"sourcesContent":["import React, { useMemo, useState } from \"react\";\r\nimport \"./styles.css\";\r\n\r\nconst PRICE_PER_MONTH = 5;\r\n\r\nconst PLAN_LIST = [\r\n { key: \"monthly\", label: \"Monthly\", months: 1, enabled: false },\r\n { key: \"3m\", label: \"3 Months\", months: 3, enabled: false },\r\n { key: \"6m\", label: \"6 Months\", months: 6, enabled: true }, // ONLY enabled + default\r\n { key: \"1y\", label: \"Yearly\", months: 12, enabled: false },\r\n { key: \"3y\", label: \"3 Years\", months: 36, enabled: false }\r\n];\r\n\r\nexport function PaymentModal({ open, onClose }) {\r\n const defaultPlanKey = \"6m\";\r\n\r\n const [fullName, setFullName] = useState(\"\");\r\n const [email, setEmail] = useState(\"\");\r\n const [planKey, setPlanKey] = useState(defaultPlanKey);\r\n const [accountCreated, setAccountCreated] = useState(false);\r\n\r\n const selectedPlan = useMemo(() => {\r\n return PLAN_LIST.find((p) => p.key === planKey) || PLAN_LIST[2];\r\n }, [planKey]);\r\n\r\n const total = useMemo(() => selectedPlan.months * PRICE_PER_MONTH, [selectedPlan]);\r\n const discountPercent = 100;\r\n const discountAmount = total; // 100% discount\r\n const netPayable = 0; // always zero\r\n\r\n function handleBackdropClick(e) {\r\n if (e.target?.classList?.contains(\"glh-pay-backdrop\")) onClose?.();\r\n }\r\n\r\n function createAccountAndSubscribe() {\r\n // Frontend-only: store in localStorage so app can show \"created\" state later\r\n const payload = {\r\n createdAt: new Date().toISOString(),\r\n fullName,\r\n email,\r\n plan: selectedPlan,\r\n pricePerMonth: PRICE_PER_MONTH,\r\n total,\r\n discountPercent,\r\n discountAmount,\r\n netPayable\r\n };\r\n try {\r\n localStorage.setItem(\"glh_payment_account\", JSON.stringify(payload));\r\n setAccountCreated(true);\r\n } catch (err) {\r\n // ignore; still show UI success\r\n setAccountCreated(true);\r\n }\r\n }\r\n\r\n if (!open) return null;\r\n\r\n return (\r\n <div className=\"glh-pay-backdrop\" onMouseDown={handleBackdropClick} role=\"dialog\" aria-modal=\"true\">\r\n <div className=\"glh-pay-modal\" onMouseDown={(e) => e.stopPropagation()}>\r\n <div className=\"glh-pay-header\">\r\n <h3 className=\"glh-pay-title\">Create Payment Account</h3>\r\n <button className=\"glh-pay-close\" onClick={onClose} aria-label=\"Close\">✕</button>\r\n </div>\r\n\r\n <div className=\"glh-pay-body\">\r\n {!accountCreated ? (\r\n <>\r\n <div className=\"glh-pay-row\">\r\n <div>\r\n <div className=\"glh-pay-label\">Full Name</div>\r\n <input\r\n className=\"glh-pay-input\"\r\n value={fullName}\r\n onChange={(e) => setFullName(e.target.value)}\r\n placeholder=\"Enter your name\"\r\n />\r\n </div>\r\n\r\n <div>\r\n <div className=\"glh-pay-label\">Email</div>\r\n <input\r\n className=\"glh-pay-input\"\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n placeholder=\"Enter your email\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div className=\"glh-pay-label\" style={{ marginBottom: 8 }}>\r\n Subscription Plans (₹{PRICE_PER_MONTH} / month)\r\n </div>\r\n\r\n <div className=\"glh-pay-plans\">\r\n {PLAN_LIST.map((p) => {\r\n const disabled = !p.enabled;\r\n const selected = p.key === planKey;\r\n\r\n function pickPlan() {\r\n if (disabled) return;\r\n setPlanKey(p.key);\r\n }\r\n\r\n return (\r\n <div\r\n key={p.key}\r\n className={[\r\n \"glh-pay-plan\",\r\n disabled ? \"glh-pay-planDisabled\" : \"\",\r\n selected ? \"glh-pay-selected\" : \"\"\r\n ].join(\" \")}\r\n onClick={pickPlan}\r\n role=\"button\"\r\n tabIndex={disabled ? -1 : 0}\r\n onKeyDown={(e) => {\r\n if ((e.key === \"Enter\" || e.key === \" \") && !disabled) pickPlan();\r\n }}\r\n aria-disabled={disabled}\r\n aria-pressed={selected}\r\n >\r\n <div style={{ display: \"grid\", gap: 4 }}>\r\n <div style={{ fontWeight: 900 }}>{p.label}</div>\r\n <div style={{ fontSize: 12, color: \"rgba(0,0,0,0.65)\" }}>\r\n Duration: {p.months} month(s)\r\n </div>\r\n </div>\r\n\r\n <div style={{ display: \"flex\", gap: 8, alignItems: \"center\" }}>\r\n {p.enabled ? <span className=\"glh-pay-pill\">ENABLED</span> : <span className=\"glh-pay-pill\">DISABLED</span>}\r\n {selected ? <span className=\"glh-pay-pill\">SELECTED</span> : null}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n\r\n <div className=\"glh-pay-summary\">\r\n <div className=\"glh-pay-line\">\r\n <span>Total ({selectedPlan.months} × ₹{PRICE_PER_MONTH})</span>\r\n <span className=\"glh-pay-strong\">₹{total}</span>\r\n </div>\r\n <div className=\"glh-pay-line\">\r\n <span>Discount</span>\r\n <span className=\"glh-pay-strong\">{discountPercent}% (-₹{discountAmount})</span>\r\n </div>\r\n <div className=\"glh-pay-line\">\r\n <span className=\"glh-pay-strong\">Net Payable</span>\r\n <span className=\"glh-pay-strong\">₹{netPayable}</span>\r\n </div>\r\n </div>\r\n\r\n <div className=\"glh-pay-note\">\r\n Note: This package is frontend-only. Payment is always ₹0 because 100% discount is applied.\r\n </div>\r\n </>\r\n ) : (\r\n <div style={{ padding: 6 }}>\r\n <div style={{ fontWeight: 900, fontSize: 16, marginBottom: 8 }}>✅ Account Created</div>\r\n <div style={{ fontSize: 13, color: \"rgba(0,0,0,0.7)\" }}>\r\n Your subscription is ready with <b>100% discount</b>. Net payable is <b>₹0</b>.\r\n </div>\r\n\r\n <div className=\"glh-pay-summary\" style={{ marginTop: 14 }}>\r\n <div className=\"glh-pay-line\">\r\n <span>Selected Plan</span>\r\n <span className=\"glh-pay-strong\">{selectedPlan.label}</span>\r\n </div>\r\n <div className=\"glh-pay-line\">\r\n <span>Total</span>\r\n <span className=\"glh-pay-strong\">₹{total}</span>\r\n </div>\r\n <div className=\"glh-pay-line\">\r\n <span>Discount</span>\r\n <span className=\"glh-pay-strong\">100% (-₹{total})</span>\r\n </div>\r\n <div className=\"glh-pay-line\">\r\n <span className=\"glh-pay-strong\">Net Payable</span>\r\n <span className=\"glh-pay-strong\">₹0</span>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div className=\"glh-pay-footer\">\r\n {!accountCreated ? (\r\n <>\r\n <button className=\"glh-pay-secondary\" onClick={onClose}>Cancel</button>\r\n <button\r\n className=\"glh-pay-primary\"\r\n onClick={createAccountAndSubscribe}\r\n disabled={!fullName || !email}\r\n title={!fullName || !email ? \"Enter name & email\" : \"Create account\"}\r\n style={!fullName || !email ? { opacity: 0.6, cursor: \"not-allowed\" } : null}\r\n >\r\n Create Account\r\n </button>\r\n </>\r\n ) : (\r\n <button className=\"glh-pay-primary\" onClick={onClose}>Done</button>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import React, { useEffect, useState } from \"react\";\r\nimport { PaymentModal } from \"./PaymentModal.jsx\";\r\nimport \"./styles.css\";\r\n\r\n/**\r\n * AccountButton\r\n * - Place this component in the CENTER area of your navbar.\r\n * - It renders a button and a modal for account creation + subscription summary.\r\n */\r\nexport function AccountButton({\r\n buttonText = \"Account\",\r\n wrapperClassName = \"\",\r\n buttonClassName = \"\",\r\n onAccountCreated\r\n}) {\r\n const [open, setOpen] = useState(false);\r\n const [hasAccount, setHasAccount] = useState(false);\r\n\r\n useEffect(() => {\r\n try {\r\n const saved = localStorage.getItem(\"glh_payment_account\");\r\n setHasAccount(!!saved);\r\n } catch (e) {\r\n setHasAccount(false);\r\n }\r\n }, [open]);\r\n\r\n function handleClose() {\r\n setOpen(false);\r\n // refresh state after close\r\n try {\r\n const saved = localStorage.getItem(\"glh_payment_account\");\r\n const ok = !!saved;\r\n setHasAccount(ok);\r\n if (ok && typeof onAccountCreated === \"function\") {\r\n onAccountCreated(JSON.parse(saved));\r\n }\r\n } catch (e) {\r\n // ignore\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n <div className={`glh-pay-centerWrap ${wrapperClassName}`}>\r\n <button\r\n className={`glh-pay-btn ${buttonClassName}`}\r\n onClick={() => setOpen(true)}\r\n type=\"button\"\r\n >\r\n {hasAccount ? `${buttonText} ✓` : buttonText}\r\n </button>\r\n </div>\r\n\r\n <PaymentModal open={open} onClose={handleClose} />\r\n </>\r\n );\r\n}\r\n"],"names":["PRICE_PER_MONTH","PLAN_LIST","key","label","months","enabled","PaymentModal","open","onClose","defaultPlanKey","fullName","setFullName","useState","email","setEmail","planKey","setPlanKey","accountCreated","setAccountCreated","selectedPlan","useMemo","find","p","total","discountPercent","discountAmount","netPayable","handleBackdropClick","e","target","classList","contains","createAccountAndSubscribe","payload","createdAt","Date","toISOString","plan","pricePerMonth","localStorage","setItem","JSON","stringify","err","React","createElement","className","onMouseDown","role","stopPropagation","onClick","Fragment","value","onChange","placeholder","style","marginBottom","map","disabled","selected","pickPlan","join","tabIndex","onKeyDown","display","gap","fontWeight","fontSize","color","alignItems","padding","marginTop","title","opacity","cursor","AccountButton","buttonText","wrapperClassName","buttonClassName","onAccountCreated","setOpen","hasAccount","setHasAccount","useEffect","saved","getItem","handleClose","ok","parse","type"],"mappings":"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"}
|
package/dist/styles.css
ADDED
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
.glh-pay-centerWrap {
|
|
2
|
+
width: 100%;
|
|
3
|
+
display: flex;
|
|
4
|
+
justify-content: center;
|
|
5
|
+
align-items: center;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
.glh-pay-btn {
|
|
9
|
+
-webkit-appearance: none;
|
|
10
|
+
-moz-appearance: none;
|
|
11
|
+
appearance: none;
|
|
12
|
+
border: 1px solid rgba(0,0,0,0.15);
|
|
13
|
+
background: #ffffff;
|
|
14
|
+
color: #111;
|
|
15
|
+
padding: 10px 16px;
|
|
16
|
+
border-radius: 10px;
|
|
17
|
+
font-weight: 600;
|
|
18
|
+
cursor: pointer;
|
|
19
|
+
transition: transform 0.06s ease, box-shadow 0.2s ease, background 0.2s ease;
|
|
20
|
+
box-shadow: 0 6px 18px rgba(0,0,0,0.06);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
.glh-pay-btn:active {
|
|
24
|
+
transform: scale(0.98);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.glh-pay-btn:hover {
|
|
28
|
+
background: #fafafa;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
.glh-pay-backdrop {
|
|
32
|
+
position: fixed;
|
|
33
|
+
inset: 0;
|
|
34
|
+
background: rgba(0,0,0,0.45);
|
|
35
|
+
display: flex;
|
|
36
|
+
align-items: center;
|
|
37
|
+
justify-content: center;
|
|
38
|
+
padding: 16px;
|
|
39
|
+
z-index: 9999;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
.glh-pay-modal {
|
|
43
|
+
width: 100%;
|
|
44
|
+
max-width: 520px;
|
|
45
|
+
background: #fff;
|
|
46
|
+
border-radius: 16px;
|
|
47
|
+
box-shadow: 0 20px 60px rgba(0,0,0,0.25);
|
|
48
|
+
overflow: hidden;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
.glh-pay-header {
|
|
52
|
+
padding: 16px 18px;
|
|
53
|
+
border-bottom: 1px solid rgba(0,0,0,0.08);
|
|
54
|
+
display: flex;
|
|
55
|
+
align-items: center;
|
|
56
|
+
justify-content: space-between;
|
|
57
|
+
gap: 12px;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
.glh-pay-title {
|
|
61
|
+
margin: 0;
|
|
62
|
+
font-size: 16px;
|
|
63
|
+
font-weight: 800;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.glh-pay-close {
|
|
67
|
+
border: none;
|
|
68
|
+
background: transparent;
|
|
69
|
+
cursor: pointer;
|
|
70
|
+
font-size: 18px;
|
|
71
|
+
line-height: 1;
|
|
72
|
+
padding: 6px 10px;
|
|
73
|
+
border-radius: 10px;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
.glh-pay-close:hover {
|
|
77
|
+
background: rgba(0,0,0,0.06);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
.glh-pay-body {
|
|
81
|
+
padding: 16px 18px;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
.glh-pay-row {
|
|
85
|
+
display: grid;
|
|
86
|
+
grid-template-columns: 1fr;
|
|
87
|
+
gap: 10px;
|
|
88
|
+
margin-bottom: 14px;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
.glh-pay-label {
|
|
92
|
+
font-size: 12px;
|
|
93
|
+
font-weight: 700;
|
|
94
|
+
color: rgba(0,0,0,0.7);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
.glh-pay-input {
|
|
98
|
+
width: 100%;
|
|
99
|
+
padding: 10px 12px;
|
|
100
|
+
border-radius: 10px;
|
|
101
|
+
border: 1px solid rgba(0,0,0,0.15);
|
|
102
|
+
outline: none;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
.glh-pay-input:focus {
|
|
106
|
+
border-color: rgba(0,0,0,0.35);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
.glh-pay-plans {
|
|
110
|
+
display: grid;
|
|
111
|
+
grid-template-columns: 1fr;
|
|
112
|
+
gap: 10px;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
.glh-pay-plan {
|
|
116
|
+
display: flex;
|
|
117
|
+
justify-content: space-between;
|
|
118
|
+
align-items: center;
|
|
119
|
+
gap: 12px;
|
|
120
|
+
padding: 12px 12px;
|
|
121
|
+
border-radius: 12px;
|
|
122
|
+
border: 1px solid rgba(0,0,0,0.12);
|
|
123
|
+
background: #fff;
|
|
124
|
+
cursor: pointer;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
.glh-pay-plan:hover {
|
|
128
|
+
background: #fafafa;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
.glh-pay-planDisabled {
|
|
132
|
+
opacity: 0.45;
|
|
133
|
+
cursor: not-allowed;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
.glh-pay-pill {
|
|
137
|
+
font-size: 11px;
|
|
138
|
+
font-weight: 800;
|
|
139
|
+
padding: 4px 8px;
|
|
140
|
+
border-radius: 999px;
|
|
141
|
+
background: rgba(0,0,0,0.06);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
.glh-pay-selected {
|
|
145
|
+
border-color: rgba(0,0,0,0.4);
|
|
146
|
+
box-shadow: 0 10px 22px rgba(0,0,0,0.08);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
.glh-pay-summary {
|
|
150
|
+
margin-top: 14px;
|
|
151
|
+
padding: 12px;
|
|
152
|
+
border-radius: 12px;
|
|
153
|
+
border: 1px dashed rgba(0,0,0,0.22);
|
|
154
|
+
background: rgba(0,0,0,0.02);
|
|
155
|
+
display: grid;
|
|
156
|
+
gap: 6px;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
.glh-pay-line {
|
|
160
|
+
display: flex;
|
|
161
|
+
justify-content: space-between;
|
|
162
|
+
gap: 10px;
|
|
163
|
+
font-size: 13px;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
.glh-pay-strong {
|
|
167
|
+
font-weight: 900;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
.glh-pay-footer {
|
|
171
|
+
padding: 14px 18px 18px;
|
|
172
|
+
border-top: 1px solid rgba(0,0,0,0.08);
|
|
173
|
+
display: flex;
|
|
174
|
+
gap: 10px;
|
|
175
|
+
justify-content: flex-end;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
.glh-pay-primary {
|
|
179
|
+
border: none;
|
|
180
|
+
background: #111;
|
|
181
|
+
color: #fff;
|
|
182
|
+
padding: 10px 14px;
|
|
183
|
+
border-radius: 12px;
|
|
184
|
+
font-weight: 800;
|
|
185
|
+
cursor: pointer;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
.glh-pay-primary:hover {
|
|
189
|
+
opacity: 0.92;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
.glh-pay-secondary {
|
|
193
|
+
border: 1px solid rgba(0,0,0,0.15);
|
|
194
|
+
background: #fff;
|
|
195
|
+
color: #111;
|
|
196
|
+
padding: 10px 14px;
|
|
197
|
+
border-radius: 12px;
|
|
198
|
+
font-weight: 800;
|
|
199
|
+
cursor: pointer;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
.glh-pay-note {
|
|
203
|
+
margin-top: 10px;
|
|
204
|
+
font-size: 12px;
|
|
205
|
+
color: rgba(0,0,0,0.65);
|
|
206
|
+
}
|
|
207
|
+
|
package/package.json
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@samsheena/payment-ui",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Frontend-only payment account + subscription UI (₹5/month) with 100% discount",
|
|
5
|
+
"main": "dist/index.cjs.js",
|
|
6
|
+
"module": "dist/index.esm.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"files": [
|
|
9
|
+
"dist"
|
|
10
|
+
],
|
|
11
|
+
"sideEffects": [
|
|
12
|
+
"*.css"
|
|
13
|
+
],
|
|
14
|
+
"scripts": {
|
|
15
|
+
"clean": "rimraf dist",
|
|
16
|
+
"build": "npm run clean && rollup -c rollup.config.cjs",
|
|
17
|
+
"dev": "rollup -c rollup.config.cjs -w",
|
|
18
|
+
"prepublishOnly": "npm run build"
|
|
19
|
+
},
|
|
20
|
+
|
|
21
|
+
"keywords": [
|
|
22
|
+
"react",
|
|
23
|
+
"subscription",
|
|
24
|
+
"payment",
|
|
25
|
+
"modal",
|
|
26
|
+
"navbar",
|
|
27
|
+
"frontend-only"
|
|
28
|
+
],
|
|
29
|
+
"author": "",
|
|
30
|
+
"license": "MIT",
|
|
31
|
+
"peerDependencies": {
|
|
32
|
+
"react": ">=17",
|
|
33
|
+
"react-dom": ">=17"
|
|
34
|
+
},
|
|
35
|
+
"devDependencies": {
|
|
36
|
+
"@babel/core": "^7.26.0",
|
|
37
|
+
"@babel/preset-react": "^7.26.0",
|
|
38
|
+
"@rollup/plugin-babel": "^6.0.4",
|
|
39
|
+
"@rollup/plugin-commonjs": "^28.0.2",
|
|
40
|
+
"@rollup/plugin-node-resolve": "^16.0.0",
|
|
41
|
+
"autoprefixer": "^10.4.20",
|
|
42
|
+
"postcss": "^8.4.49",
|
|
43
|
+
"rimraf": "^6.0.1",
|
|
44
|
+
"rollup": "^4.28.1",
|
|
45
|
+
"rollup-plugin-peer-deps-external": "^2.2.4",
|
|
46
|
+
"rollup-plugin-postcss": "^4.0.2",
|
|
47
|
+
"react": "^18.3.1",
|
|
48
|
+
"react-dom": "^18.3.1"
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|