@burdenoff/microfe-kadaikodi 2026.719.3 → 2026.723.1
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/dist/kadaikodi/components/InvestmentMarketplaceGate.d.ts +13 -0
- package/dist/kadaikodi/components/InvestmentMarketplaceGate.d.ts.map +1 -0
- package/dist/kadaikodi/components/InvestmentMarketplaceGate.js +23 -0
- package/dist/kadaikodi/components/InvestmentMarketplaceGate.js.map +1 -0
- package/dist/kadaikodi/components/index.d.ts +1 -0
- package/dist/kadaikodi/components/index.d.ts.map +1 -1
- package/dist/kadaikodi/constants/featureFlags.d.ts +23 -0
- package/dist/kadaikodi/constants/featureFlags.d.ts.map +1 -0
- package/dist/kadaikodi/constants/featureFlags.js +6 -0
- package/dist/kadaikodi/constants/featureFlags.js.map +1 -0
- package/dist/kadaikodi/hooks/useKadaikodiApi.d.ts.map +1 -1
- package/dist/kadaikodi/hooks/useKadaikodiApi.js +18 -9
- package/dist/kadaikodi/hooks/useKadaikodiApi.js.map +1 -1
- package/dist/kadaikodi/pages/cart-owner/InvestmentListingPage.d.ts.map +1 -1
- package/dist/kadaikodi/pages/cart-owner/InvestmentListingPage.js +135 -126
- package/dist/kadaikodi/pages/cart-owner/InvestmentListingPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/SavedAddressesPage.js +1 -1
- package/dist/kadaikodi/pages/customer/SavedAddressesPage.js.map +1 -1
- package/dist/kadaikodi/pages/investor/InvestmentDetailsPage.d.ts.map +1 -1
- package/dist/kadaikodi/pages/investor/InvestmentDetailsPage.js +171 -166
- package/dist/kadaikodi/pages/investor/InvestmentDetailsPage.js.map +1 -1
- package/dist/kadaikodi/pages/investor/InvestmentOpportunitiesPage.d.ts.map +1 -1
- package/dist/kadaikodi/pages/investor/InvestmentOpportunitiesPage.js +220 -217
- package/dist/kadaikodi/pages/investor/InvestmentOpportunitiesPage.js.map +1 -1
- package/package.json +1 -1
|
@@ -5,17 +5,18 @@ import { useCreateInvestmentOpportunity as r, useProviders as i } from "../../ho
|
|
|
5
5
|
import { formatCurrency as a } from "../../utils/formatters.js";
|
|
6
6
|
import { ProgressRing as o } from "../../components/viz/ProgressRing.js";
|
|
7
7
|
import "../../components/viz/index.js";
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
8
|
+
import { useInvestmentMarketplaceEnabled as s } from "../../components/InvestmentMarketplaceGate.js";
|
|
9
|
+
import { useMemo as c, useState as l } from "react";
|
|
10
|
+
import { CalendarClock as u, CheckCircle2 as d, IndianRupee as f, TrendingUp as p } from "lucide-react";
|
|
11
|
+
import { jsx as m, jsxs as h } from "react/jsx-runtime";
|
|
11
12
|
//#region src/kadaikodi/pages/cart-owner/InvestmentListingPage.tsx
|
|
12
|
-
var
|
|
13
|
+
var g = [
|
|
13
14
|
"LOW",
|
|
14
15
|
"MEDIUM",
|
|
15
16
|
"HIGH"
|
|
16
17
|
];
|
|
17
|
-
function
|
|
18
|
-
let { navigateTo:
|
|
18
|
+
function _() {
|
|
19
|
+
let { navigateTo: _, currentUser: v } = e(), { data: y = [], isLoading: b } = i(), x = c(() => y.find((e) => e.ownerId === v?.id) ?? y[0], [y, v?.id]), S = r(), C = s(), [w, T] = l({
|
|
19
20
|
title: "",
|
|
20
21
|
description: "",
|
|
21
22
|
targetAmount: "",
|
|
@@ -23,177 +24,177 @@ function g() {
|
|
|
23
24
|
expectedReturnsPct: "",
|
|
24
25
|
lockInMonths: "",
|
|
25
26
|
riskLevel: "MEDIUM"
|
|
26
|
-
}), [
|
|
27
|
+
}), [E, D] = l(""), [O, k] = l(null), A = (e, t) => T((n) => ({
|
|
27
28
|
...n,
|
|
28
29
|
[e]: t
|
|
29
|
-
})),
|
|
30
|
-
return
|
|
30
|
+
})), j = "w-full rounded-lg border border-border-subtle bg-bg-canvas px-3 py-2 text-sm text-text-primary outline-none focus:border-border-strong";
|
|
31
|
+
return b ? /* @__PURE__ */ m(t, {
|
|
31
32
|
title: "List for Investment",
|
|
32
33
|
description: "Raise growth capital from the marketplace",
|
|
33
|
-
children: /* @__PURE__ */
|
|
34
|
+
children: /* @__PURE__ */ h("div", {
|
|
34
35
|
className: "animate-pulse space-y-4",
|
|
35
36
|
children: [
|
|
36
|
-
/* @__PURE__ */
|
|
37
|
-
/* @__PURE__ */
|
|
38
|
-
/* @__PURE__ */
|
|
37
|
+
/* @__PURE__ */ m("div", { className: "h-10 rounded-lg bg-bg-sunken" }),
|
|
38
|
+
/* @__PURE__ */ m("div", { className: "h-10 rounded-lg bg-bg-sunken" }),
|
|
39
|
+
/* @__PURE__ */ m("div", { className: "h-10 rounded-lg bg-bg-sunken" })
|
|
39
40
|
]
|
|
40
41
|
})
|
|
41
|
-
}) :
|
|
42
|
+
}) : x ? C ? /* @__PURE__ */ m(t, {
|
|
42
43
|
title: "List for Investment",
|
|
43
|
-
description: `Raise growth capital for ${
|
|
44
|
-
children: /* @__PURE__ */
|
|
44
|
+
description: `Raise growth capital for ${x.name}`,
|
|
45
|
+
children: /* @__PURE__ */ h("div", {
|
|
45
46
|
className: "mx-auto max-w-5xl space-y-6",
|
|
46
|
-
children: [
|
|
47
|
+
children: [O && /* @__PURE__ */ h("div", {
|
|
47
48
|
className: "flex items-center gap-2 rounded-lg border border-status-success-text/30 bg-status-success-bg-subtle p-4",
|
|
48
49
|
children: [
|
|
49
|
-
/* @__PURE__ */
|
|
50
|
-
/* @__PURE__ */
|
|
50
|
+
/* @__PURE__ */ m(d, { className: "h-5 w-5 text-status-success-text" }),
|
|
51
|
+
/* @__PURE__ */ h("div", {
|
|
51
52
|
className: "flex-1",
|
|
52
|
-
children: [/* @__PURE__ */
|
|
53
|
+
children: [/* @__PURE__ */ m("p", {
|
|
53
54
|
className: "text-sm font-medium text-text-primary",
|
|
54
55
|
children: "Opportunity published"
|
|
55
|
-
}), /* @__PURE__ */
|
|
56
|
+
}), /* @__PURE__ */ h("p", {
|
|
56
57
|
className: "text-xs text-text-secondary",
|
|
57
58
|
children: [
|
|
58
59
|
"“",
|
|
59
|
-
|
|
60
|
+
O.title,
|
|
60
61
|
"” is now live in the Investor section for backers to fund."
|
|
61
62
|
]
|
|
62
63
|
})]
|
|
63
64
|
}),
|
|
64
|
-
/* @__PURE__ */
|
|
65
|
+
/* @__PURE__ */ m("button", {
|
|
65
66
|
type: "button",
|
|
66
|
-
onClick: () =>
|
|
67
|
+
onClick: () => _("/investor/opportunities"),
|
|
67
68
|
className: "rounded-lg border border-border-default bg-bg-surface px-3 py-1.5 text-xs font-medium text-text-secondary hover:bg-bg-sunken",
|
|
68
69
|
children: "View in Investor"
|
|
69
70
|
})
|
|
70
71
|
]
|
|
71
|
-
}), /* @__PURE__ */
|
|
72
|
+
}), /* @__PURE__ */ h("div", {
|
|
72
73
|
className: "grid grid-cols-1 gap-6 lg:grid-cols-[1fr_20rem]",
|
|
73
|
-
children: [/* @__PURE__ */
|
|
74
|
+
children: [/* @__PURE__ */ h("div", {
|
|
74
75
|
className: "rounded-2xl border border-border-subtle bg-bg-surface p-6",
|
|
75
|
-
children: [/* @__PURE__ */
|
|
76
|
+
children: [/* @__PURE__ */ h("div", {
|
|
76
77
|
className: "mb-4 flex items-center gap-2",
|
|
77
|
-
children: [/* @__PURE__ */
|
|
78
|
+
children: [/* @__PURE__ */ m(f, { className: "h-5 w-5 text-accent-primary" }), /* @__PURE__ */ m("h3", {
|
|
78
79
|
className: "text-base font-semibold text-text-primary",
|
|
79
80
|
children: "Opportunity details"
|
|
80
81
|
})]
|
|
81
|
-
}), /* @__PURE__ */
|
|
82
|
+
}), /* @__PURE__ */ h("div", {
|
|
82
83
|
className: "space-y-4",
|
|
83
84
|
children: [
|
|
84
|
-
/* @__PURE__ */
|
|
85
|
+
/* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("label", {
|
|
85
86
|
className: "mb-1 block text-sm font-medium text-text-secondary",
|
|
86
87
|
children: "Title"
|
|
87
|
-
}), /* @__PURE__ */
|
|
88
|
-
className:
|
|
89
|
-
value:
|
|
90
|
-
onChange: (e) =>
|
|
88
|
+
}), /* @__PURE__ */ m("input", {
|
|
89
|
+
className: j,
|
|
90
|
+
value: w.title,
|
|
91
|
+
onChange: (e) => A("title", e.target.value),
|
|
91
92
|
placeholder: "Expand to 3 locations"
|
|
92
93
|
})] }),
|
|
93
|
-
/* @__PURE__ */
|
|
94
|
+
/* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("label", {
|
|
94
95
|
className: "mb-1 block text-sm font-medium text-text-secondary",
|
|
95
96
|
children: "Description"
|
|
96
|
-
}), /* @__PURE__ */
|
|
97
|
-
className:
|
|
97
|
+
}), /* @__PURE__ */ m("textarea", {
|
|
98
|
+
className: j,
|
|
98
99
|
rows: 3,
|
|
99
|
-
value:
|
|
100
|
-
onChange: (e) =>
|
|
100
|
+
value: w.description,
|
|
101
|
+
onChange: (e) => A("description", e.target.value),
|
|
101
102
|
placeholder: "How the capital will be used and why backers should fund it."
|
|
102
103
|
})] }),
|
|
103
|
-
/* @__PURE__ */
|
|
104
|
+
/* @__PURE__ */ h("div", {
|
|
104
105
|
className: "grid grid-cols-1 gap-4 sm:grid-cols-2",
|
|
105
106
|
children: [
|
|
106
|
-
/* @__PURE__ */
|
|
107
|
+
/* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("label", {
|
|
107
108
|
className: "mb-1 block text-sm font-medium text-text-secondary",
|
|
108
109
|
children: "Target amount (₹)"
|
|
109
|
-
}), /* @__PURE__ */
|
|
110
|
+
}), /* @__PURE__ */ m("input", {
|
|
110
111
|
type: "number",
|
|
111
112
|
min: "0",
|
|
112
|
-
className:
|
|
113
|
-
value:
|
|
114
|
-
onChange: (e) =>
|
|
113
|
+
className: j,
|
|
114
|
+
value: w.targetAmount,
|
|
115
|
+
onChange: (e) => A("targetAmount", e.target.value),
|
|
115
116
|
placeholder: "500000"
|
|
116
117
|
})] }),
|
|
117
|
-
/* @__PURE__ */
|
|
118
|
+
/* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("label", {
|
|
118
119
|
className: "mb-1 block text-sm font-medium text-text-secondary",
|
|
119
120
|
children: "Minimum investment (₹)"
|
|
120
|
-
}), /* @__PURE__ */
|
|
121
|
+
}), /* @__PURE__ */ m("input", {
|
|
121
122
|
type: "number",
|
|
122
123
|
min: "0",
|
|
123
|
-
className:
|
|
124
|
-
value:
|
|
125
|
-
onChange: (e) =>
|
|
124
|
+
className: j,
|
|
125
|
+
value: w.minimumInvestment,
|
|
126
|
+
onChange: (e) => A("minimumInvestment", e.target.value),
|
|
126
127
|
placeholder: "5000"
|
|
127
128
|
})] }),
|
|
128
|
-
/* @__PURE__ */
|
|
129
|
+
/* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("label", {
|
|
129
130
|
className: "mb-1 block text-sm font-medium text-text-secondary",
|
|
130
131
|
children: "Expected returns (% p.a.)"
|
|
131
|
-
}), /* @__PURE__ */
|
|
132
|
+
}), /* @__PURE__ */ m("input", {
|
|
132
133
|
type: "number",
|
|
133
134
|
min: "0",
|
|
134
|
-
className:
|
|
135
|
-
value:
|
|
136
|
-
onChange: (e) =>
|
|
135
|
+
className: j,
|
|
136
|
+
value: w.expectedReturnsPct,
|
|
137
|
+
onChange: (e) => A("expectedReturnsPct", e.target.value),
|
|
137
138
|
placeholder: "18"
|
|
138
139
|
})] }),
|
|
139
|
-
/* @__PURE__ */
|
|
140
|
+
/* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("label", {
|
|
140
141
|
className: "mb-1 block text-sm font-medium text-text-secondary",
|
|
141
142
|
children: "Lock-in (months)"
|
|
142
|
-
}), /* @__PURE__ */
|
|
143
|
+
}), /* @__PURE__ */ m("input", {
|
|
143
144
|
type: "number",
|
|
144
145
|
min: "0",
|
|
145
|
-
className:
|
|
146
|
-
value:
|
|
147
|
-
onChange: (e) =>
|
|
146
|
+
className: j,
|
|
147
|
+
value: w.lockInMonths,
|
|
148
|
+
onChange: (e) => A("lockInMonths", e.target.value),
|
|
148
149
|
placeholder: "12"
|
|
149
150
|
})] })
|
|
150
151
|
]
|
|
151
152
|
}),
|
|
152
|
-
/* @__PURE__ */
|
|
153
|
+
/* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("label", {
|
|
153
154
|
className: "mb-1 block text-sm font-medium text-text-secondary",
|
|
154
155
|
children: "Risk level"
|
|
155
|
-
}), /* @__PURE__ */
|
|
156
|
+
}), /* @__PURE__ */ m("div", {
|
|
156
157
|
className: "flex gap-2",
|
|
157
|
-
children:
|
|
158
|
+
children: g.map((e) => /* @__PURE__ */ m("button", {
|
|
158
159
|
type: "button",
|
|
159
|
-
onClick: () =>
|
|
160
|
-
className: "rounded-lg border px-4 py-2 text-sm font-medium transition " + (
|
|
160
|
+
onClick: () => A("riskLevel", e),
|
|
161
|
+
className: "rounded-lg border px-4 py-2 text-sm font-medium transition " + (w.riskLevel === e ? "border-accent-primary bg-accent-primary/10 text-accent-primary" : "border-border-subtle bg-bg-canvas text-text-secondary hover:bg-bg-sunken"),
|
|
161
162
|
children: e.charAt(0) + e.slice(1).toLowerCase()
|
|
162
163
|
}, e))
|
|
163
164
|
})] }),
|
|
164
|
-
|
|
165
|
+
E && /* @__PURE__ */ m("p", {
|
|
165
166
|
className: "text-sm text-status-error-text",
|
|
166
|
-
children:
|
|
167
|
+
children: E
|
|
167
168
|
}),
|
|
168
|
-
/* @__PURE__ */
|
|
169
|
+
/* @__PURE__ */ h("div", {
|
|
169
170
|
className: "flex items-center justify-end gap-3 pt-2",
|
|
170
|
-
children: [/* @__PURE__ */
|
|
171
|
+
children: [/* @__PURE__ */ m("button", {
|
|
171
172
|
type: "button",
|
|
172
|
-
onClick: () =>
|
|
173
|
+
onClick: () => _("/cart-owner/dashboard"),
|
|
173
174
|
className: "rounded-lg border border-border-default bg-bg-surface px-5 py-2.5 text-sm font-medium text-text-secondary hover:bg-bg-sunken",
|
|
174
175
|
children: "Cancel"
|
|
175
|
-
}), /* @__PURE__ */
|
|
176
|
+
}), /* @__PURE__ */ h("button", {
|
|
176
177
|
type: "button",
|
|
177
178
|
onClick: () => {
|
|
178
|
-
if (
|
|
179
|
-
let e = Number(
|
|
180
|
-
if (!
|
|
181
|
-
if (!(e > 0)) return
|
|
182
|
-
if (!(t > 0) || t > e) return
|
|
183
|
-
if (!(n >= 0)) return
|
|
184
|
-
if (!(r > 0)) return
|
|
185
|
-
|
|
186
|
-
providerId:
|
|
187
|
-
title:
|
|
188
|
-
description:
|
|
179
|
+
if (D(""), !x) return;
|
|
180
|
+
let e = Number(w.targetAmount), t = Number(w.minimumInvestment), n = Number(w.expectedReturnsPct), r = Number(w.lockInMonths);
|
|
181
|
+
if (!w.title.trim()) return D("Give your opportunity a title.");
|
|
182
|
+
if (!(e > 0)) return D("Enter a valid target amount.");
|
|
183
|
+
if (!(t > 0) || t > e) return D("Minimum investment must be positive and ≤ target.");
|
|
184
|
+
if (!(n >= 0)) return D("Enter a valid expected return %.");
|
|
185
|
+
if (!(r > 0)) return D("Enter a lock-in period in months.");
|
|
186
|
+
S.mutate({
|
|
187
|
+
providerId: x.id,
|
|
188
|
+
title: w.title.trim(),
|
|
189
|
+
description: w.description.trim() || void 0,
|
|
189
190
|
targetAmount: e,
|
|
190
191
|
minimumInvestment: t,
|
|
191
192
|
expectedReturnsPct: n,
|
|
192
193
|
lockInMonths: r,
|
|
193
|
-
riskLevel:
|
|
194
|
+
riskLevel: w.riskLevel
|
|
194
195
|
}, {
|
|
195
196
|
onSuccess: (e) => {
|
|
196
|
-
|
|
197
|
+
k({ title: e.title }), T((e) => ({
|
|
197
198
|
...e,
|
|
198
199
|
title: "",
|
|
199
200
|
description: "",
|
|
@@ -203,123 +204,131 @@ function g() {
|
|
|
203
204
|
lockInMonths: ""
|
|
204
205
|
}));
|
|
205
206
|
},
|
|
206
|
-
onError: (e) =>
|
|
207
|
+
onError: (e) => D(e instanceof Error ? e.message : "Could not publish the opportunity.")
|
|
207
208
|
});
|
|
208
209
|
},
|
|
209
|
-
disabled:
|
|
210
|
+
disabled: S.isPending,
|
|
210
211
|
className: "inline-flex items-center gap-2 rounded-lg bg-action-primary-bg px-5 py-2.5 text-sm font-semibold text-action-primary-text transition hover:bg-action-primary-bg-hover disabled:opacity-60",
|
|
211
|
-
children: [/* @__PURE__ */ p
|
|
212
|
+
children: [/* @__PURE__ */ m(p, { className: "h-4 w-4" }), S.isPending ? "Publishing…" : "Publish opportunity"]
|
|
212
213
|
})]
|
|
213
214
|
})
|
|
214
215
|
]
|
|
215
216
|
})]
|
|
216
|
-
}), /* @__PURE__ */
|
|
217
|
+
}), /* @__PURE__ */ h("aside", {
|
|
217
218
|
className: "h-fit rounded-2xl border border-border-subtle bg-bg-surface p-6 lg:sticky lg:top-6",
|
|
218
219
|
children: [
|
|
219
|
-
/* @__PURE__ */
|
|
220
|
+
/* @__PURE__ */ m("h3", {
|
|
220
221
|
className: "text-sm font-semibold text-text-primary",
|
|
221
|
-
children:
|
|
222
|
+
children: w.title.trim() || "Your opportunity"
|
|
222
223
|
}),
|
|
223
|
-
/* @__PURE__ */
|
|
224
|
+
/* @__PURE__ */ m("p", {
|
|
224
225
|
className: "mt-1 line-clamp-2 text-xs text-text-secondary",
|
|
225
|
-
children:
|
|
226
|
+
children: w.description.trim() || `Raise growth capital for ${x.name}.`
|
|
226
227
|
}),
|
|
227
|
-
/* @__PURE__ */
|
|
228
|
+
/* @__PURE__ */ h("div", {
|
|
228
229
|
className: "mt-5 flex flex-col items-center",
|
|
229
|
-
children: [/* @__PURE__ */
|
|
230
|
+
children: [/* @__PURE__ */ m(o, {
|
|
230
231
|
value: 0,
|
|
231
|
-
max: Math.max(Number(
|
|
232
|
+
max: Math.max(Number(w.targetAmount) || 0, 1),
|
|
232
233
|
label: "0%",
|
|
233
234
|
caption: "funded",
|
|
234
235
|
size: 120
|
|
235
|
-
}), /* @__PURE__ */
|
|
236
|
+
}), /* @__PURE__ */ h("p", {
|
|
236
237
|
className: "mt-3 text-center text-sm text-text-secondary",
|
|
237
238
|
children: [
|
|
238
|
-
/* @__PURE__ */
|
|
239
|
+
/* @__PURE__ */ m("span", {
|
|
239
240
|
className: "font-semibold text-text-primary",
|
|
240
241
|
children: "₹0"
|
|
241
242
|
}),
|
|
242
243
|
" of",
|
|
243
244
|
" ",
|
|
244
|
-
/* @__PURE__ */
|
|
245
|
+
/* @__PURE__ */ m("span", {
|
|
245
246
|
className: "font-semibold text-text-primary",
|
|
246
|
-
children: Number(
|
|
247
|
+
children: Number(w.targetAmount) > 0 ? a(Number(w.targetAmount), { minimumFractionDigits: 0 }) : "—"
|
|
247
248
|
}),
|
|
248
249
|
" ",
|
|
249
250
|
"raised"
|
|
250
251
|
]
|
|
251
252
|
})]
|
|
252
253
|
}),
|
|
253
|
-
/* @__PURE__ */
|
|
254
|
+
/* @__PURE__ */ h("div", {
|
|
254
255
|
className: "mt-5 grid grid-cols-2 gap-3",
|
|
255
|
-
children: [/* @__PURE__ */
|
|
256
|
+
children: [/* @__PURE__ */ h("div", {
|
|
256
257
|
className: "rounded-lg border border-border-subtle bg-bg-canvas p-3",
|
|
257
258
|
children: [
|
|
258
|
-
/* @__PURE__ */
|
|
259
|
+
/* @__PURE__ */ h("div", {
|
|
259
260
|
className: "flex items-center gap-1.5 text-xs text-text-secondary",
|
|
260
|
-
children: [/* @__PURE__ */ p
|
|
261
|
+
children: [/* @__PURE__ */ m(p, { className: "h-3.5 w-3.5" }), "Returns"]
|
|
261
262
|
}),
|
|
262
|
-
/* @__PURE__ */
|
|
263
|
+
/* @__PURE__ */ m("p", {
|
|
263
264
|
className: "mt-1 text-lg font-semibold text-text-primary",
|
|
264
|
-
children:
|
|
265
|
+
children: w.expectedReturnsPct ? `${Number(w.expectedReturnsPct)}%` : "—"
|
|
265
266
|
}),
|
|
266
|
-
/* @__PURE__ */
|
|
267
|
+
/* @__PURE__ */ m("p", {
|
|
267
268
|
className: "text-[11px] text-text-muted",
|
|
268
269
|
children: "expected p.a."
|
|
269
270
|
})
|
|
270
271
|
]
|
|
271
|
-
}), /* @__PURE__ */
|
|
272
|
+
}), /* @__PURE__ */ h("div", {
|
|
272
273
|
className: "rounded-lg border border-border-subtle bg-bg-canvas p-3",
|
|
273
274
|
children: [
|
|
274
|
-
/* @__PURE__ */
|
|
275
|
+
/* @__PURE__ */ h("div", {
|
|
275
276
|
className: "flex items-center gap-1.5 text-xs text-text-secondary",
|
|
276
|
-
children: [/* @__PURE__ */
|
|
277
|
+
children: [/* @__PURE__ */ m(u, { className: "h-3.5 w-3.5" }), "Lock-in"]
|
|
277
278
|
}),
|
|
278
|
-
/* @__PURE__ */
|
|
279
|
+
/* @__PURE__ */ m("p", {
|
|
279
280
|
className: "mt-1 text-lg font-semibold text-text-primary",
|
|
280
|
-
children:
|
|
281
|
+
children: w.lockInMonths ? Number(w.lockInMonths) : "—"
|
|
281
282
|
}),
|
|
282
|
-
/* @__PURE__ */
|
|
283
|
+
/* @__PURE__ */ m("p", {
|
|
283
284
|
className: "text-[11px] text-text-muted",
|
|
284
285
|
children: "months"
|
|
285
286
|
})
|
|
286
287
|
]
|
|
287
288
|
})]
|
|
288
289
|
}),
|
|
289
|
-
/* @__PURE__ */
|
|
290
|
+
/* @__PURE__ */ h("div", {
|
|
290
291
|
className: "mt-3 flex items-center justify-between rounded-lg border border-border-subtle bg-bg-canvas p-3",
|
|
291
|
-
children: [/* @__PURE__ */
|
|
292
|
+
children: [/* @__PURE__ */ m("span", {
|
|
292
293
|
className: "text-xs text-text-secondary",
|
|
293
294
|
children: "Min. investment"
|
|
294
|
-
}), /* @__PURE__ */
|
|
295
|
+
}), /* @__PURE__ */ m("span", {
|
|
295
296
|
className: "text-sm font-semibold text-text-primary",
|
|
296
|
-
children: Number(
|
|
297
|
+
children: Number(w.minimumInvestment) > 0 ? a(Number(w.minimumInvestment), { minimumFractionDigits: 0 }) : "—"
|
|
297
298
|
})]
|
|
298
299
|
}),
|
|
299
|
-
/* @__PURE__ */
|
|
300
|
+
/* @__PURE__ */ h("div", {
|
|
300
301
|
className: "mt-3 flex items-center justify-between rounded-lg border border-border-subtle bg-bg-canvas p-3",
|
|
301
|
-
children: [/* @__PURE__ */
|
|
302
|
+
children: [/* @__PURE__ */ m("span", {
|
|
302
303
|
className: "text-xs text-text-secondary",
|
|
303
304
|
children: "Risk level"
|
|
304
|
-
}), /* @__PURE__ */
|
|
305
|
+
}), /* @__PURE__ */ m("span", {
|
|
305
306
|
className: "text-sm font-semibold text-text-primary",
|
|
306
|
-
children:
|
|
307
|
+
children: w.riskLevel.charAt(0) + w.riskLevel.slice(1).toLowerCase()
|
|
307
308
|
})]
|
|
308
309
|
})
|
|
309
310
|
]
|
|
310
311
|
})]
|
|
311
312
|
})]
|
|
312
313
|
})
|
|
313
|
-
}) : /* @__PURE__ */
|
|
314
|
+
}) : /* @__PURE__ */ m(t, {
|
|
315
|
+
title: "List for Investment",
|
|
316
|
+
description: "Raise growth capital from the marketplace",
|
|
317
|
+
children: /* @__PURE__ */ m(n, {
|
|
318
|
+
icon: /* @__PURE__ */ m(p, { className: "h-8 w-8" }),
|
|
319
|
+
title: "Investment marketplace coming soon",
|
|
320
|
+
description: "We're finishing the regulatory groundwork for the investment marketplace. You'll be able to list your cart for funding as soon as it opens in this workspace."
|
|
321
|
+
})
|
|
322
|
+
}) : /* @__PURE__ */ m(t, {
|
|
314
323
|
title: "List for Investment",
|
|
315
324
|
description: "Raise growth capital from the marketplace",
|
|
316
|
-
children: /* @__PURE__ */
|
|
317
|
-
icon: /* @__PURE__ */ p
|
|
325
|
+
children: /* @__PURE__ */ m(n, {
|
|
326
|
+
icon: /* @__PURE__ */ m(p, { className: "h-8 w-8" }),
|
|
318
327
|
title: "Set up your cart first",
|
|
319
328
|
description: "Create and configure your service provider before listing it for investment.",
|
|
320
|
-
action: /* @__PURE__ */
|
|
329
|
+
action: /* @__PURE__ */ m("button", {
|
|
321
330
|
type: "button",
|
|
322
|
-
onClick: () =>
|
|
331
|
+
onClick: () => _("/cart-owner/dashboard"),
|
|
323
332
|
className: "inline-flex items-center gap-2 rounded-lg bg-action-primary-bg px-5 py-2.5 text-sm font-semibold text-action-primary-text hover:bg-action-primary-bg-hover",
|
|
324
333
|
children: "Go to Dashboard"
|
|
325
334
|
})
|
|
@@ -327,6 +336,6 @@ function g() {
|
|
|
327
336
|
});
|
|
328
337
|
}
|
|
329
338
|
//#endregion
|
|
330
|
-
export {
|
|
339
|
+
export { _ as InvestmentListingPage };
|
|
331
340
|
|
|
332
341
|
//# sourceMappingURL=InvestmentListingPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InvestmentListingPage.js","names":[],"sources":["../../../../src/kadaikodi/pages/cart-owner/InvestmentListingPage.tsx"],"sourcesContent":["/**\n * InvestmentListingPage — cart-owner lists their business for investment.\n *\n * Publishes a real KadaikodiInvestmentOpportunity (target, minimum, expected\n * returns, lock-in, risk) that then appears in the Investor section. Wired to\n * the live kadaikodiCreateInvestmentOpportunity mutation.\n */\nimport { useMemo, useState } from 'react';\nimport { TrendingUp, CheckCircle2, IndianRupee, CalendarClock } from 'lucide-react';\nimport { PageLayout } from '../../components/PageLayout';\nimport { EmptyState } from '../../components/EmptyState';\nimport { ProgressRing } from '../../components/viz';\nimport { useKadaikodi } from '../../context/KadaikodiContext';\nimport { useProviders, useCreateInvestmentOpportunity } from '../../hooks/useKadaikodiApi';\nimport { formatCurrency } from '../../utils/formatters';\n\nconst RISKS = ['LOW', 'MEDIUM', 'HIGH'] as const;\n\nexport function InvestmentListingPage() {\n const { navigateTo, currentUser } = useKadaikodi();\n const { data: providers = [], isLoading } = useProviders();\n const myProvider = useMemo(\n () => providers.find((p) => p.ownerId === currentUser?.id) ?? providers[0],\n [providers, currentUser?.id]\n );\n const createOpportunity = useCreateInvestmentOpportunity();\n\n const [form, setForm] = useState({\n title: '',\n description: '',\n targetAmount: '',\n minimumInvestment: '',\n expectedReturnsPct: '',\n lockInMonths: '',\n riskLevel: 'MEDIUM' as (typeof RISKS)[number],\n });\n const [error, setError] = useState('');\n const [created, setCreated] = useState<{ title: string } | null>(null);\n\n const set = (k: keyof typeof form, v: string) => setForm((f) => ({ ...f, [k]: v }));\n\n const inputCls =\n 'w-full rounded-lg border border-border-subtle bg-bg-canvas px-3 py-2 text-sm text-text-primary outline-none focus:border-border-strong';\n\n const submit = () => {\n setError('');\n if (!myProvider) return;\n const target = Number(form.targetAmount);\n const minimum = Number(form.minimumInvestment);\n const returns = Number(form.expectedReturnsPct);\n const lock = Number(form.lockInMonths);\n if (!form.title.trim()) return setError('Give your opportunity a title.');\n if (!(target > 0)) return setError('Enter a valid target amount.');\n if (!(minimum > 0) || minimum > target)\n return setError('Minimum investment must be positive and ≤ target.');\n if (!(returns >= 0)) return setError('Enter a valid expected return %.');\n if (!(lock > 0)) return setError('Enter a lock-in period in months.');\n createOpportunity.mutate(\n {\n providerId: myProvider.id,\n title: form.title.trim(),\n description: form.description.trim() || undefined,\n targetAmount: target,\n minimumInvestment: minimum,\n expectedReturnsPct: returns,\n lockInMonths: lock,\n riskLevel: form.riskLevel,\n },\n {\n onSuccess: (opp) => {\n setCreated({ title: opp.title });\n setForm((f) => ({\n ...f,\n title: '',\n description: '',\n targetAmount: '',\n minimumInvestment: '',\n expectedReturnsPct: '',\n lockInMonths: '',\n }));\n },\n onError: (e) =>\n setError(e instanceof Error ? e.message : 'Could not publish the opportunity.'),\n }\n );\n };\n\n if (isLoading) {\n return (\n <PageLayout\n title=\"List for Investment\"\n description=\"Raise growth capital from the marketplace\"\n >\n <div className=\"animate-pulse space-y-4\">\n <div className=\"h-10 rounded-lg bg-bg-sunken\" />\n <div className=\"h-10 rounded-lg bg-bg-sunken\" />\n <div className=\"h-10 rounded-lg bg-bg-sunken\" />\n </div>\n </PageLayout>\n );\n }\n\n if (!myProvider) {\n return (\n <PageLayout\n title=\"List for Investment\"\n description=\"Raise growth capital from the marketplace\"\n >\n <EmptyState\n icon={<TrendingUp className=\"h-8 w-8\" />}\n title=\"Set up your cart first\"\n description=\"Create and configure your service provider before listing it for investment.\"\n action={\n <button\n type=\"button\"\n onClick={() => navigateTo('/cart-owner/dashboard')}\n className=\"inline-flex items-center gap-2 rounded-lg bg-action-primary-bg px-5 py-2.5 text-sm font-semibold text-action-primary-text hover:bg-action-primary-bg-hover\"\n >\n Go to Dashboard\n </button>\n }\n />\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"List for Investment\"\n description={`Raise growth capital for ${myProvider.name}`}\n >\n <div className=\"mx-auto max-w-5xl space-y-6\">\n {created && (\n <div className=\"flex items-center gap-2 rounded-lg border border-status-success-text/30 bg-status-success-bg-subtle p-4\">\n <CheckCircle2 className=\"h-5 w-5 text-status-success-text\" />\n <div className=\"flex-1\">\n <p className=\"text-sm font-medium text-text-primary\">Opportunity published</p>\n <p className=\"text-xs text-text-secondary\">\n “{created.title}” is now live in the Investor section for backers to fund.\n </p>\n </div>\n <button\n type=\"button\"\n onClick={() => navigateTo('/investor/opportunities')}\n className=\"rounded-lg border border-border-default bg-bg-surface px-3 py-1.5 text-xs font-medium text-text-secondary hover:bg-bg-sunken\"\n >\n View in Investor\n </button>\n </div>\n )}\n\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-[1fr_20rem]\">\n <div className=\"rounded-2xl border border-border-subtle bg-bg-surface p-6\">\n <div className=\"mb-4 flex items-center gap-2\">\n <IndianRupee className=\"h-5 w-5 text-accent-primary\" />\n <h3 className=\"text-base font-semibold text-text-primary\">Opportunity details</h3>\n </div>\n <div className=\"space-y-4\">\n <div>\n <label className=\"mb-1 block text-sm font-medium text-text-secondary\">Title</label>\n <input\n className={inputCls}\n value={form.title}\n onChange={(e) => set('title', e.target.value)}\n placeholder=\"Expand to 3 locations\"\n />\n </div>\n <div>\n <label className=\"mb-1 block text-sm font-medium text-text-secondary\">\n Description\n </label>\n <textarea\n className={inputCls}\n rows={3}\n value={form.description}\n onChange={(e) => set('description', e.target.value)}\n placeholder=\"How the capital will be used and why backers should fund it.\"\n />\n </div>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n <div>\n <label className=\"mb-1 block text-sm font-medium text-text-secondary\">\n Target amount (₹)\n </label>\n <input\n type=\"number\"\n min=\"0\"\n className={inputCls}\n value={form.targetAmount}\n onChange={(e) => set('targetAmount', e.target.value)}\n placeholder=\"500000\"\n />\n </div>\n <div>\n <label className=\"mb-1 block text-sm font-medium text-text-secondary\">\n Minimum investment (₹)\n </label>\n <input\n type=\"number\"\n min=\"0\"\n className={inputCls}\n value={form.minimumInvestment}\n onChange={(e) => set('minimumInvestment', e.target.value)}\n placeholder=\"5000\"\n />\n </div>\n <div>\n <label className=\"mb-1 block text-sm font-medium text-text-secondary\">\n Expected returns (% p.a.)\n </label>\n <input\n type=\"number\"\n min=\"0\"\n className={inputCls}\n value={form.expectedReturnsPct}\n onChange={(e) => set('expectedReturnsPct', e.target.value)}\n placeholder=\"18\"\n />\n </div>\n <div>\n <label className=\"mb-1 block text-sm font-medium text-text-secondary\">\n Lock-in (months)\n </label>\n <input\n type=\"number\"\n min=\"0\"\n className={inputCls}\n value={form.lockInMonths}\n onChange={(e) => set('lockInMonths', e.target.value)}\n placeholder=\"12\"\n />\n </div>\n </div>\n <div>\n <label className=\"mb-1 block text-sm font-medium text-text-secondary\">\n Risk level\n </label>\n <div className=\"flex gap-2\">\n {RISKS.map((r) => (\n <button\n key={r}\n type=\"button\"\n onClick={() => set('riskLevel', r)}\n className={\n 'rounded-lg border px-4 py-2 text-sm font-medium transition ' +\n (form.riskLevel === r\n ? 'border-accent-primary bg-accent-primary/10 text-accent-primary'\n : 'border-border-subtle bg-bg-canvas text-text-secondary hover:bg-bg-sunken')\n }\n >\n {r.charAt(0) + r.slice(1).toLowerCase()}\n </button>\n ))}\n </div>\n </div>\n\n {error && <p className=\"text-sm text-status-error-text\">{error}</p>}\n\n <div className=\"flex items-center justify-end gap-3 pt-2\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/cart-owner/dashboard')}\n className=\"rounded-lg border border-border-default bg-bg-surface px-5 py-2.5 text-sm font-medium text-text-secondary hover:bg-bg-sunken\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={submit}\n disabled={createOpportunity.isPending}\n className=\"inline-flex items-center gap-2 rounded-lg bg-action-primary-bg px-5 py-2.5 text-sm font-semibold text-action-primary-text transition hover:bg-action-primary-bg-hover disabled:opacity-60\"\n >\n <TrendingUp className=\"h-4 w-4\" />\n {createOpportunity.isPending ? 'Publishing…' : 'Publish opportunity'}\n </button>\n </div>\n </div>\n </div>\n\n {/* Live funding preview — mirrors exactly what backers will see */}\n <aside className=\"h-fit rounded-2xl border border-border-subtle bg-bg-surface p-6 lg:sticky lg:top-6\">\n <h3 className=\"text-sm font-semibold text-text-primary\">\n {form.title.trim() || 'Your opportunity'}\n </h3>\n <p className=\"mt-1 line-clamp-2 text-xs text-text-secondary\">\n {form.description.trim() || `Raise growth capital for ${myProvider.name}.`}\n </p>\n\n <div className=\"mt-5 flex flex-col items-center\">\n <ProgressRing\n value={0}\n max={Math.max(Number(form.targetAmount) || 0, 1)}\n label=\"0%\"\n caption=\"funded\"\n size={120}\n />\n <p className=\"mt-3 text-center text-sm text-text-secondary\">\n <span className=\"font-semibold text-text-primary\">₹0</span> of{' '}\n <span className=\"font-semibold text-text-primary\">\n {Number(form.targetAmount) > 0\n ? formatCurrency(Number(form.targetAmount), { minimumFractionDigits: 0 })\n : '—'}\n </span>{' '}\n raised\n </p>\n </div>\n\n <div className=\"mt-5 grid grid-cols-2 gap-3\">\n <div className=\"rounded-lg border border-border-subtle bg-bg-canvas p-3\">\n <div className=\"flex items-center gap-1.5 text-xs text-text-secondary\">\n <TrendingUp className=\"h-3.5 w-3.5\" />\n Returns\n </div>\n <p className=\"mt-1 text-lg font-semibold text-text-primary\">\n {form.expectedReturnsPct ? `${Number(form.expectedReturnsPct)}%` : '—'}\n </p>\n <p className=\"text-[11px] text-text-muted\">expected p.a.</p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-canvas p-3\">\n <div className=\"flex items-center gap-1.5 text-xs text-text-secondary\">\n <CalendarClock className=\"h-3.5 w-3.5\" />\n Lock-in\n </div>\n <p className=\"mt-1 text-lg font-semibold text-text-primary\">\n {form.lockInMonths ? Number(form.lockInMonths) : '—'}\n </p>\n <p className=\"text-[11px] text-text-muted\">months</p>\n </div>\n </div>\n\n <div className=\"mt-3 flex items-center justify-between rounded-lg border border-border-subtle bg-bg-canvas p-3\">\n <span className=\"text-xs text-text-secondary\">Min. investment</span>\n <span className=\"text-sm font-semibold text-text-primary\">\n {Number(form.minimumInvestment) > 0\n ? formatCurrency(Number(form.minimumInvestment), { minimumFractionDigits: 0 })\n : '—'}\n </span>\n </div>\n\n <div className=\"mt-3 flex items-center justify-between rounded-lg border border-border-subtle bg-bg-canvas p-3\">\n <span className=\"text-xs text-text-secondary\">Risk level</span>\n <span className=\"text-sm font-semibold text-text-primary\">\n {form.riskLevel.charAt(0) + form.riskLevel.slice(1).toLowerCase()}\n </span>\n </div>\n </aside>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"InvestmentListingPage.js","names":[],"sources":["../../../../src/kadaikodi/pages/cart-owner/InvestmentListingPage.tsx"],"sourcesContent":["/**\n * InvestmentListingPage — cart-owner lists their business for investment.\n *\n * Publishes a real KadaikodiInvestmentOpportunity (target, minimum, expected\n * returns, lock-in, risk) that then appears in the Investor section. Wired to\n * the live kadaikodiCreateInvestmentOpportunity mutation.\n */\nimport { useMemo, useState } from 'react';\nimport { TrendingUp, CheckCircle2, IndianRupee, CalendarClock } from 'lucide-react';\nimport { PageLayout } from '../../components/PageLayout';\nimport { EmptyState } from '../../components/EmptyState';\nimport { useInvestmentMarketplaceEnabled } from '../../components/InvestmentMarketplaceGate';\nimport { ProgressRing } from '../../components/viz';\nimport { useKadaikodi } from '../../context/KadaikodiContext';\nimport { useProviders, useCreateInvestmentOpportunity } from '../../hooks/useKadaikodiApi';\nimport { formatCurrency } from '../../utils/formatters';\n\nconst RISKS = ['LOW', 'MEDIUM', 'HIGH'] as const;\n\nexport function InvestmentListingPage() {\n const { navigateTo, currentUser } = useKadaikodi();\n const { data: providers = [], isLoading } = useProviders();\n const myProvider = useMemo(\n () => providers.find((p) => p.ownerId === currentUser?.id) ?? providers[0],\n [providers, currentUser?.id]\n );\n const createOpportunity = useCreateInvestmentOpportunity();\n const investmentMarketplaceEnabled = useInvestmentMarketplaceEnabled();\n\n const [form, setForm] = useState({\n title: '',\n description: '',\n targetAmount: '',\n minimumInvestment: '',\n expectedReturnsPct: '',\n lockInMonths: '',\n riskLevel: 'MEDIUM' as (typeof RISKS)[number],\n });\n const [error, setError] = useState('');\n const [created, setCreated] = useState<{ title: string } | null>(null);\n\n const set = (k: keyof typeof form, v: string) => setForm((f) => ({ ...f, [k]: v }));\n\n const inputCls =\n 'w-full rounded-lg border border-border-subtle bg-bg-canvas px-3 py-2 text-sm text-text-primary outline-none focus:border-border-strong';\n\n const submit = () => {\n setError('');\n if (!myProvider) return;\n const target = Number(form.targetAmount);\n const minimum = Number(form.minimumInvestment);\n const returns = Number(form.expectedReturnsPct);\n const lock = Number(form.lockInMonths);\n if (!form.title.trim()) return setError('Give your opportunity a title.');\n if (!(target > 0)) return setError('Enter a valid target amount.');\n if (!(minimum > 0) || minimum > target)\n return setError('Minimum investment must be positive and ≤ target.');\n if (!(returns >= 0)) return setError('Enter a valid expected return %.');\n if (!(lock > 0)) return setError('Enter a lock-in period in months.');\n createOpportunity.mutate(\n {\n providerId: myProvider.id,\n title: form.title.trim(),\n description: form.description.trim() || undefined,\n targetAmount: target,\n minimumInvestment: minimum,\n expectedReturnsPct: returns,\n lockInMonths: lock,\n riskLevel: form.riskLevel,\n },\n {\n onSuccess: (opp) => {\n setCreated({ title: opp.title });\n setForm((f) => ({\n ...f,\n title: '',\n description: '',\n targetAmount: '',\n minimumInvestment: '',\n expectedReturnsPct: '',\n lockInMonths: '',\n }));\n },\n onError: (e) =>\n setError(e instanceof Error ? e.message : 'Could not publish the opportunity.'),\n }\n );\n };\n\n if (isLoading) {\n return (\n <PageLayout\n title=\"List for Investment\"\n description=\"Raise growth capital from the marketplace\"\n >\n <div className=\"animate-pulse space-y-4\">\n <div className=\"h-10 rounded-lg bg-bg-sunken\" />\n <div className=\"h-10 rounded-lg bg-bg-sunken\" />\n <div className=\"h-10 rounded-lg bg-bg-sunken\" />\n </div>\n </PageLayout>\n );\n }\n\n if (!myProvider) {\n return (\n <PageLayout\n title=\"List for Investment\"\n description=\"Raise growth capital from the marketplace\"\n >\n <EmptyState\n icon={<TrendingUp className=\"h-8 w-8\" />}\n title=\"Set up your cart first\"\n description=\"Create and configure your service provider before listing it for investment.\"\n action={\n <button\n type=\"button\"\n onClick={() => navigateTo('/cart-owner/dashboard')}\n className=\"inline-flex items-center gap-2 rounded-lg bg-action-primary-bg px-5 py-2.5 text-sm font-semibold text-action-primary-text hover:bg-action-primary-bg-hover\"\n >\n Go to Dashboard\n </button>\n }\n />\n </PageLayout>\n );\n }\n\n if (!investmentMarketplaceEnabled) {\n return (\n <PageLayout\n title=\"List for Investment\"\n description=\"Raise growth capital from the marketplace\"\n >\n <EmptyState\n icon={<TrendingUp className=\"h-8 w-8\" />}\n title=\"Investment marketplace coming soon\"\n description=\"We're finishing the regulatory groundwork for the investment marketplace. You'll be able to list your cart for funding as soon as it opens in this workspace.\"\n />\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"List for Investment\"\n description={`Raise growth capital for ${myProvider.name}`}\n >\n <div className=\"mx-auto max-w-5xl space-y-6\">\n {created && (\n <div className=\"flex items-center gap-2 rounded-lg border border-status-success-text/30 bg-status-success-bg-subtle p-4\">\n <CheckCircle2 className=\"h-5 w-5 text-status-success-text\" />\n <div className=\"flex-1\">\n <p className=\"text-sm font-medium text-text-primary\">Opportunity published</p>\n <p className=\"text-xs text-text-secondary\">\n “{created.title}” is now live in the Investor section for backers to fund.\n </p>\n </div>\n <button\n type=\"button\"\n onClick={() => navigateTo('/investor/opportunities')}\n className=\"rounded-lg border border-border-default bg-bg-surface px-3 py-1.5 text-xs font-medium text-text-secondary hover:bg-bg-sunken\"\n >\n View in Investor\n </button>\n </div>\n )}\n\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-[1fr_20rem]\">\n <div className=\"rounded-2xl border border-border-subtle bg-bg-surface p-6\">\n <div className=\"mb-4 flex items-center gap-2\">\n <IndianRupee className=\"h-5 w-5 text-accent-primary\" />\n <h3 className=\"text-base font-semibold text-text-primary\">Opportunity details</h3>\n </div>\n <div className=\"space-y-4\">\n <div>\n <label className=\"mb-1 block text-sm font-medium text-text-secondary\">Title</label>\n <input\n className={inputCls}\n value={form.title}\n onChange={(e) => set('title', e.target.value)}\n placeholder=\"Expand to 3 locations\"\n />\n </div>\n <div>\n <label className=\"mb-1 block text-sm font-medium text-text-secondary\">\n Description\n </label>\n <textarea\n className={inputCls}\n rows={3}\n value={form.description}\n onChange={(e) => set('description', e.target.value)}\n placeholder=\"How the capital will be used and why backers should fund it.\"\n />\n </div>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n <div>\n <label className=\"mb-1 block text-sm font-medium text-text-secondary\">\n Target amount (₹)\n </label>\n <input\n type=\"number\"\n min=\"0\"\n className={inputCls}\n value={form.targetAmount}\n onChange={(e) => set('targetAmount', e.target.value)}\n placeholder=\"500000\"\n />\n </div>\n <div>\n <label className=\"mb-1 block text-sm font-medium text-text-secondary\">\n Minimum investment (₹)\n </label>\n <input\n type=\"number\"\n min=\"0\"\n className={inputCls}\n value={form.minimumInvestment}\n onChange={(e) => set('minimumInvestment', e.target.value)}\n placeholder=\"5000\"\n />\n </div>\n <div>\n <label className=\"mb-1 block text-sm font-medium text-text-secondary\">\n Expected returns (% p.a.)\n </label>\n <input\n type=\"number\"\n min=\"0\"\n className={inputCls}\n value={form.expectedReturnsPct}\n onChange={(e) => set('expectedReturnsPct', e.target.value)}\n placeholder=\"18\"\n />\n </div>\n <div>\n <label className=\"mb-1 block text-sm font-medium text-text-secondary\">\n Lock-in (months)\n </label>\n <input\n type=\"number\"\n min=\"0\"\n className={inputCls}\n value={form.lockInMonths}\n onChange={(e) => set('lockInMonths', e.target.value)}\n placeholder=\"12\"\n />\n </div>\n </div>\n <div>\n <label className=\"mb-1 block text-sm font-medium text-text-secondary\">\n Risk level\n </label>\n <div className=\"flex gap-2\">\n {RISKS.map((r) => (\n <button\n key={r}\n type=\"button\"\n onClick={() => set('riskLevel', r)}\n className={\n 'rounded-lg border px-4 py-2 text-sm font-medium transition ' +\n (form.riskLevel === r\n ? 'border-accent-primary bg-accent-primary/10 text-accent-primary'\n : 'border-border-subtle bg-bg-canvas text-text-secondary hover:bg-bg-sunken')\n }\n >\n {r.charAt(0) + r.slice(1).toLowerCase()}\n </button>\n ))}\n </div>\n </div>\n\n {error && <p className=\"text-sm text-status-error-text\">{error}</p>}\n\n <div className=\"flex items-center justify-end gap-3 pt-2\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/cart-owner/dashboard')}\n className=\"rounded-lg border border-border-default bg-bg-surface px-5 py-2.5 text-sm font-medium text-text-secondary hover:bg-bg-sunken\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={submit}\n disabled={createOpportunity.isPending}\n className=\"inline-flex items-center gap-2 rounded-lg bg-action-primary-bg px-5 py-2.5 text-sm font-semibold text-action-primary-text transition hover:bg-action-primary-bg-hover disabled:opacity-60\"\n >\n <TrendingUp className=\"h-4 w-4\" />\n {createOpportunity.isPending ? 'Publishing…' : 'Publish opportunity'}\n </button>\n </div>\n </div>\n </div>\n\n {/* Live funding preview — mirrors exactly what backers will see */}\n <aside className=\"h-fit rounded-2xl border border-border-subtle bg-bg-surface p-6 lg:sticky lg:top-6\">\n <h3 className=\"text-sm font-semibold text-text-primary\">\n {form.title.trim() || 'Your opportunity'}\n </h3>\n <p className=\"mt-1 line-clamp-2 text-xs text-text-secondary\">\n {form.description.trim() || `Raise growth capital for ${myProvider.name}.`}\n </p>\n\n <div className=\"mt-5 flex flex-col items-center\">\n <ProgressRing\n value={0}\n max={Math.max(Number(form.targetAmount) || 0, 1)}\n label=\"0%\"\n caption=\"funded\"\n size={120}\n />\n <p className=\"mt-3 text-center text-sm text-text-secondary\">\n <span className=\"font-semibold text-text-primary\">₹0</span> of{' '}\n <span className=\"font-semibold text-text-primary\">\n {Number(form.targetAmount) > 0\n ? formatCurrency(Number(form.targetAmount), { minimumFractionDigits: 0 })\n : '—'}\n </span>{' '}\n raised\n </p>\n </div>\n\n <div className=\"mt-5 grid grid-cols-2 gap-3\">\n <div className=\"rounded-lg border border-border-subtle bg-bg-canvas p-3\">\n <div className=\"flex items-center gap-1.5 text-xs text-text-secondary\">\n <TrendingUp className=\"h-3.5 w-3.5\" />\n Returns\n </div>\n <p className=\"mt-1 text-lg font-semibold text-text-primary\">\n {form.expectedReturnsPct ? `${Number(form.expectedReturnsPct)}%` : '—'}\n </p>\n <p className=\"text-[11px] text-text-muted\">expected p.a.</p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-canvas p-3\">\n <div className=\"flex items-center gap-1.5 text-xs text-text-secondary\">\n <CalendarClock className=\"h-3.5 w-3.5\" />\n Lock-in\n </div>\n <p className=\"mt-1 text-lg font-semibold text-text-primary\">\n {form.lockInMonths ? Number(form.lockInMonths) : '—'}\n </p>\n <p className=\"text-[11px] text-text-muted\">months</p>\n </div>\n </div>\n\n <div className=\"mt-3 flex items-center justify-between rounded-lg border border-border-subtle bg-bg-canvas p-3\">\n <span className=\"text-xs text-text-secondary\">Min. investment</span>\n <span className=\"text-sm font-semibold text-text-primary\">\n {Number(form.minimumInvestment) > 0\n ? formatCurrency(Number(form.minimumInvestment), { minimumFractionDigits: 0 })\n : '—'}\n </span>\n </div>\n\n <div className=\"mt-3 flex items-center justify-between rounded-lg border border-border-subtle bg-bg-canvas p-3\">\n <span className=\"text-xs text-text-secondary\">Risk level</span>\n <span className=\"text-sm font-semibold text-text-primary\">\n {form.riskLevel.charAt(0) + form.riskLevel.slice(1).toLowerCase()}\n </span>\n </div>\n </aside>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;;;;AAiBA,IAAM,IAAQ;CAAC;CAAO;CAAU;CAAO;AAEvC,SAAgB,IAAwB;CACtC,IAAM,EAAE,eAAY,mBAAgB,GAAc,EAC5C,EAAE,MAAM,IAAY,EAAE,EAAE,iBAAc,GAAc,EACpD,IAAa,QACX,EAAU,MAAM,MAAM,EAAE,YAAY,GAAa,GAAG,IAAI,EAAU,IACxE,CAAC,GAAW,GAAa,GAAG,CAC7B,EACK,IAAoB,GAAgC,EACpD,IAA+B,GAAiC,EAEhE,CAAC,GAAM,KAAW,EAAS;EAC/B,OAAO;EACP,aAAa;EACb,cAAc;EACd,mBAAmB;EACnB,oBAAoB;EACpB,cAAc;EACd,WAAW;EACZ,CAAC,EACI,CAAC,GAAO,KAAY,EAAS,GAAG,EAChC,CAAC,GAAS,KAAc,EAAmC,KAAK,EAEhE,KAAO,GAAsB,MAAc,GAAS,OAAO;EAAE,GAAG;GAAI,IAAI;EAAG,EAAE,EAE7E,IACJ;AAmGF,QAtDI,IAEA,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,OAAD,EAAK,WAAU,gCAAiC,CAAA;IAChD,kBAAC,OAAD,EAAK,WAAU,gCAAiC,CAAA;IAChD,kBAAC,OAAD,EAAK,WAAU,gCAAiC,CAAA;IAC5C;;EACK,CAAA,GAIZ,IAwBA,IAgBH,kBAAC,GAAD;EACE,OAAM;EACN,aAAa,4BAA4B,EAAW;YAEpD,kBAAC,OAAD;GAAK,WAAU;aAAf,CACG,KACC,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,GAAD,EAAc,WAAU,oCAAqC,CAAA;KAC7D,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,KAAD;OAAG,WAAU;iBAAwC;OAAyB,CAAA,EAC9E,kBAAC,KAAD;OAAG,WAAU;iBAAb;QAA2C;QACvC,EAAQ;QAAM;QACd;SACA;;KACN,kBAAC,UAAD;MACE,MAAK;MACL,eAAe,EAAW,0BAA0B;MACpD,WAAU;gBACX;MAEQ,CAAA;KACL;OAGR,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD,EAAa,WAAU,+BAAgC,CAAA,EACvD,kBAAC,MAAD;OAAI,WAAU;iBAA4C;OAAwB,CAAA,CAC9E;SACN,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;QAAO,WAAU;kBAAqD;QAAa,CAAA,EACnF,kBAAC,SAAD;QACE,WAAW;QACX,OAAO,EAAK;QACZ,WAAW,MAAM,EAAI,SAAS,EAAE,OAAO,MAAM;QAC7C,aAAY;QACZ,CAAA,CACE,EAAA,CAAA;OACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;QAAO,WAAU;kBAAqD;QAE9D,CAAA,EACR,kBAAC,YAAD;QACE,WAAW;QACX,MAAM;QACN,OAAO,EAAK;QACZ,WAAW,MAAM,EAAI,eAAe,EAAE,OAAO,MAAM;QACnD,aAAY;QACZ,CAAA,CACE,EAAA,CAAA;OACN,kBAAC,OAAD;QAAK,WAAU;kBAAf;SACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;UAAO,WAAU;oBAAqD;UAE9D,CAAA,EACR,kBAAC,SAAD;UACE,MAAK;UACL,KAAI;UACJ,WAAW;UACX,OAAO,EAAK;UACZ,WAAW,MAAM,EAAI,gBAAgB,EAAE,OAAO,MAAM;UACpD,aAAY;UACZ,CAAA,CACE,EAAA,CAAA;SACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;UAAO,WAAU;oBAAqD;UAE9D,CAAA,EACR,kBAAC,SAAD;UACE,MAAK;UACL,KAAI;UACJ,WAAW;UACX,OAAO,EAAK;UACZ,WAAW,MAAM,EAAI,qBAAqB,EAAE,OAAO,MAAM;UACzD,aAAY;UACZ,CAAA,CACE,EAAA,CAAA;SACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;UAAO,WAAU;oBAAqD;UAE9D,CAAA,EACR,kBAAC,SAAD;UACE,MAAK;UACL,KAAI;UACJ,WAAW;UACX,OAAO,EAAK;UACZ,WAAW,MAAM,EAAI,sBAAsB,EAAE,OAAO,MAAM;UAC1D,aAAY;UACZ,CAAA,CACE,EAAA,CAAA;SACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;UAAO,WAAU;oBAAqD;UAE9D,CAAA,EACR,kBAAC,SAAD;UACE,MAAK;UACL,KAAI;UACJ,WAAW;UACX,OAAO,EAAK;UACZ,WAAW,MAAM,EAAI,gBAAgB,EAAE,OAAO,MAAM;UACpD,aAAY;UACZ,CAAA,CACE,EAAA,CAAA;SACF;;OACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;QAAO,WAAU;kBAAqD;QAE9D,CAAA,EACR,kBAAC,OAAD;QAAK,WAAU;kBACZ,EAAM,KAAK,MACV,kBAAC,UAAD;SAEE,MAAK;SACL,eAAe,EAAI,aAAa,EAAE;SAClC,WACE,iEACC,EAAK,cAAc,IAChB,mEACA;mBAGL,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,aAAa;SAChC,EAXF,EAWE,CACT;QACE,CAAA,CACF,EAAA,CAAA;OAEL,KAAS,kBAAC,KAAD;QAAG,WAAU;kBAAkC;QAAU,CAAA;OAEnE,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,UAAD;SACE,MAAK;SACL,eAAe,EAAW,wBAAwB;SAClD,WAAU;mBACX;SAEQ,CAAA,EACT,kBAAC,UAAD;SACE,MAAK;SACL,eA/OK;AAEnB,cADA,EAAS,GAAG,EACR,CAAC,EAAY;UACjB,IAAM,IAAS,OAAO,EAAK,aAAa,EAClC,IAAU,OAAO,EAAK,kBAAkB,EACxC,IAAU,OAAO,EAAK,mBAAmB,EACzC,IAAO,OAAO,EAAK,aAAa;AACtC,cAAI,CAAC,EAAK,MAAM,MAAM,CAAE,QAAO,EAAS,iCAAiC;AACzE,cAAI,EAAE,IAAS,GAAI,QAAO,EAAS,+BAA+B;AAClE,cAAI,EAAE,IAAU,MAAM,IAAU,EAC9B,QAAO,EAAS,oDAAoD;AACtE,cAAI,EAAE,KAAW,GAAI,QAAO,EAAS,mCAAmC;AACxE,cAAI,EAAE,IAAO,GAAI,QAAO,EAAS,oCAAoC;AACrE,YAAkB,OAChB;WACE,YAAY,EAAW;WACvB,OAAO,EAAK,MAAM,MAAM;WACxB,aAAa,EAAK,YAAY,MAAM,IAAI,KAAA;WACxC,cAAc;WACd,mBAAmB;WACnB,oBAAoB;WACpB,cAAc;WACd,WAAW,EAAK;WACjB,EACD;WACE,YAAY,MAAQ;AAElB,YADA,EAAW,EAAE,OAAO,EAAI,OAAO,CAAC,EAChC,GAAS,OAAO;aACd,GAAG;aACH,OAAO;aACP,aAAa;aACb,cAAc;aACd,mBAAmB;aACnB,oBAAoB;aACpB,cAAc;aACf,EAAE;;WAEL,UAAU,MACR,EAAS,aAAa,QAAQ,EAAE,UAAU,qCAAqC;WAClF,CACF;;SAwMa,UAAU,EAAkB;SAC5B,WAAU;mBAJZ,CAME,kBAAC,GAAD,EAAY,WAAU,WAAY,CAAA,EACjC,EAAkB,YAAY,gBAAgB,sBACxC;WACL;;OACF;QACF;QAGN,kBAAC,SAAD;KAAO,WAAU;eAAjB;MACE,kBAAC,MAAD;OAAI,WAAU;iBACX,EAAK,MAAM,MAAM,IAAI;OACnB,CAAA;MACL,kBAAC,KAAD;OAAG,WAAU;iBACV,EAAK,YAAY,MAAM,IAAI,4BAA4B,EAAW,KAAK;OACtE,CAAA;MAEJ,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,GAAD;QACE,OAAO;QACP,KAAK,KAAK,IAAI,OAAO,EAAK,aAAa,IAAI,GAAG,EAAE;QAChD,OAAM;QACN,SAAQ;QACR,MAAM;QACN,CAAA,EACF,kBAAC,KAAD;QAAG,WAAU;kBAAb;SACE,kBAAC,QAAD;UAAM,WAAU;oBAAkC;UAAS,CAAA;;SAAI;SAC/D,kBAAC,QAAD;UAAM,WAAU;oBACb,OAAO,EAAK,aAAa,GAAG,IACzB,EAAe,OAAO,EAAK,aAAa,EAAE,EAAE,uBAAuB,GAAG,CAAC,GACvE;UACC,CAAA;SAAC;SAAI;SAEV;UACA;;MAEN,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,OAAD;QAAK,WAAU;kBAAf;SACE,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,GAAD,EAAY,WAAU,eAAgB,CAAA,EAAA,UAElC;;SACN,kBAAC,KAAD;UAAG,WAAU;oBACV,EAAK,qBAAqB,GAAG,OAAO,EAAK,mBAAmB,CAAC,KAAK;UACjE,CAAA;SACJ,kBAAC,KAAD;UAAG,WAAU;oBAA8B;UAAiB,CAAA;SACxD;WACN,kBAAC,OAAD;QAAK,WAAU;kBAAf;SACE,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,GAAD,EAAe,WAAU,eAAgB,CAAA,EAAA,UAErC;;SACN,kBAAC,KAAD;UAAG,WAAU;oBACV,EAAK,eAAe,OAAO,EAAK,aAAa,GAAG;UAC/C,CAAA;SACJ,kBAAC,KAAD;UAAG,WAAU;oBAA8B;UAAU,CAAA;SACjD;UACF;;MAEN,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,QAAD;QAAM,WAAU;kBAA8B;QAAsB,CAAA,EACpE,kBAAC,QAAD;QAAM,WAAU;kBACb,OAAO,EAAK,kBAAkB,GAAG,IAC9B,EAAe,OAAO,EAAK,kBAAkB,EAAE,EAAE,uBAAuB,GAAG,CAAC,GAC5E;QACC,CAAA,CACH;;MAEN,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,QAAD;QAAM,WAAU;kBAA8B;QAAiB,CAAA,EAC/D,kBAAC,QAAD;QAAM,WAAU;kBACb,EAAK,UAAU,OAAO,EAAE,GAAG,EAAK,UAAU,MAAM,EAAE,CAAC,aAAa;QAC5D,CAAA,CACH;;MACA;OACJ;MACF;;EACK,CAAA,GA3OX,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,GAAD;GACE,MAAM,kBAAC,GAAD,EAAY,WAAU,WAAY,CAAA;GACxC,OAAM;GACN,aAAY;GACZ,CAAA;EACS,CAAA,GAjCb,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,GAAD;GACE,MAAM,kBAAC,GAAD,EAAY,WAAU,WAAY,CAAA;GACxC,OAAM;GACN,aAAY;GACZ,QACE,kBAAC,UAAD;IACE,MAAK;IACL,eAAe,EAAW,wBAAwB;IAClD,WAAU;cACX;IAEQ,CAAA;GAEX,CAAA;EACS,CAAA"}
|
|
@@ -242,7 +242,7 @@ function k() {
|
|
|
242
242
|
l.length,
|
|
243
243
|
" saved ",
|
|
244
244
|
l.length === 1 ? "address" : "addresses",
|
|
245
|
-
l.some((e) => e.isDefault) ? ` · default set to ${l.find((e) => e.isDefault)?.nickname
|
|
245
|
+
l.some((e) => e.isDefault) ? ` · default set to ${l.find((e) => e.isDefault)?.nickname || "one address"}` : " · no default set yet"
|
|
246
246
|
] })]
|
|
247
247
|
})
|
|
248
248
|
}),
|