@fluid-app/portal-sdk 0.1.243 → 0.1.245
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/{AppDownloadScreen-DQR40F0y.mjs → AppDownloadScreen-DPnbWP5G.mjs} +1 -1
- package/dist/{AppDownloadScreen-DQR40F0y.mjs.map → AppDownloadScreen-DPnbWP5G.mjs.map} +1 -1
- package/dist/{AppDownloadScreen-BXnl23_d.cjs → AppDownloadScreen-Og_iMsw5.cjs} +1 -1
- package/dist/{AppDownloadScreen-BXnl23_d.cjs.map → AppDownloadScreen-Og_iMsw5.cjs.map} +1 -1
- package/dist/{AppNavigationContext-C1-hd9Rw.cjs → AppNavigationContext-BDs1cOuG.cjs} +1 -1
- package/dist/{AppNavigationContext-C1-hd9Rw.cjs.map → AppNavigationContext-BDs1cOuG.cjs.map} +1 -1
- package/dist/{AppNavigationContext-Dvc0yoZF.mjs → AppNavigationContext-DNod9mf6.mjs} +1 -1
- package/dist/{AppNavigationContext-Dvc0yoZF.mjs.map → AppNavigationContext-DNod9mf6.mjs.map} +1 -1
- package/dist/{ContactsScreen-Cj0_VI0d.cjs → ContactsScreen-CZ2hrMqf.cjs} +6 -6
- package/dist/{ContactsScreen-Cj0_VI0d.cjs.map → ContactsScreen-CZ2hrMqf.cjs.map} +1 -1
- package/dist/{ContactsScreen-CMBERzKU.mjs → ContactsScreen-DuhDzRtI.mjs} +6 -6
- package/dist/{ContactsScreen-CMBERzKU.mjs.map → ContactsScreen-DuhDzRtI.mjs.map} +1 -1
- package/dist/{ContactsScreen-CH_P8WxC.cjs → ContactsScreen-Dv1SJNBo.cjs} +5 -5
- package/dist/{InfiniteScrollSentinel-DeIL8UkW.cjs → InfiniteScrollSentinel-BaPx1tjC.cjs} +1 -1
- package/dist/{InfiniteScrollSentinel-DeIL8UkW.cjs.map → InfiniteScrollSentinel-BaPx1tjC.cjs.map} +1 -1
- package/dist/{InfiniteScrollSentinel-B_clNL9Y.mjs → InfiniteScrollSentinel-D0XRJi51.mjs} +1 -1
- package/dist/{InfiniteScrollSentinel-B_clNL9Y.mjs.map → InfiniteScrollSentinel-D0XRJi51.mjs.map} +1 -1
- package/dist/{MessagingScreen-KYx6DSMx.cjs → MessagingScreen-BwI0RShj.cjs} +3 -3
- package/dist/{MessagingScreen-vb5P-7jP.mjs → MessagingScreen-DiSZ7fyd.mjs} +3 -3
- package/dist/{MessagingScreen-vb5P-7jP.mjs.map → MessagingScreen-DiSZ7fyd.mjs.map} +1 -1
- package/dist/{MessagingScreen-CCbgNRp1.cjs → MessagingScreen-WCeHWGlX.cjs} +5 -5
- package/dist/{MessagingScreen-CCbgNRp1.cjs.map → MessagingScreen-WCeHWGlX.cjs.map} +1 -1
- package/dist/{MySiteScreen-B_16cPgD.cjs → MySiteScreen-Bdd7a6Hy.cjs} +3 -2
- package/dist/MySiteScreen-CK84vXa9.mjs +301 -0
- package/dist/MySiteScreen-CK84vXa9.mjs.map +1 -0
- package/dist/MySiteScreen-zfajm9da.cjs +309 -0
- package/dist/MySiteScreen-zfajm9da.cjs.map +1 -0
- package/dist/{OrdersScreen-Cuch7aki.cjs → OrdersScreen-BLs1xTv7.cjs} +4 -4
- package/dist/{OrdersScreen-DPcp2dLW.cjs → OrdersScreen-BbS7Alby.cjs} +86 -41
- package/dist/OrdersScreen-BbS7Alby.cjs.map +1 -0
- package/dist/{OrdersScreen-BV3vJ7xy.mjs → OrdersScreen-b-ZC4_NI.mjs} +86 -41
- package/dist/OrdersScreen-b-ZC4_NI.mjs.map +1 -0
- package/dist/{PortalProductsApiProvider-BIZg_c4Y.mjs → PortalProductsApiProvider-BFdHFvog.mjs} +1 -1
- package/dist/{PortalProductsApiProvider-BIZg_c4Y.mjs.map → PortalProductsApiProvider-BFdHFvog.mjs.map} +1 -1
- package/dist/{PortalProductsApiProvider-DL8nl7To.cjs → PortalProductsApiProvider-CkS7OIGt.cjs} +1 -1
- package/dist/{PortalProductsApiProvider-DL8nl7To.cjs.map → PortalProductsApiProvider-CkS7OIGt.cjs.map} +1 -1
- package/dist/{ProfileScreen-BT0iys-q.cjs → ProfileScreen-BfvdQa0q.cjs} +114 -33
- package/dist/ProfileScreen-BfvdQa0q.cjs.map +1 -0
- package/dist/{ProfileScreen-CZAIUM2a.mjs → ProfileScreen-CRLf8oDe.mjs} +116 -35
- package/dist/ProfileScreen-CRLf8oDe.mjs.map +1 -0
- package/dist/{ProfileScreen-CKcdtroU.cjs → ProfileScreen-Za3ZIWPO.cjs} +4 -2
- package/dist/{SearchSort-CeJqRK2c.cjs → SearchSort-BP2ktxyN.cjs} +1 -1
- package/dist/{SearchSort-CeJqRK2c.cjs.map → SearchSort-BP2ktxyN.cjs.map} +1 -1
- package/dist/{SearchSort-CFHU38Er.mjs → SearchSort-CokMCrhy.mjs} +1 -1
- package/dist/{SearchSort-CFHU38Er.mjs.map → SearchSort-CokMCrhy.mjs.map} +1 -1
- package/dist/{ShareablesScreen-sieWBlAl.mjs → ShareablesScreen-BZZ-RT71.mjs} +8 -8
- package/dist/{ShareablesScreen-sieWBlAl.mjs.map → ShareablesScreen-BZZ-RT71.mjs.map} +1 -1
- package/dist/{ShareablesScreen-A69L0Nok.cjs → ShareablesScreen-BxOKbuuU.cjs} +20 -20
- package/dist/{ShareablesScreen-A69L0Nok.cjs.map → ShareablesScreen-BxOKbuuU.cjs.map} +1 -1
- package/dist/{ShareablesScreen-BUYG-mjj.cjs → ShareablesScreen-CsDxLODp.cjs} +7 -7
- package/dist/{ShopScreen-sLUTgIcQ.mjs → ShopScreen-BG1pxd2D.mjs} +4 -4
- package/dist/{ShopScreen-sLUTgIcQ.mjs.map → ShopScreen-BG1pxd2D.mjs.map} +1 -1
- package/dist/{ShopScreen-DVpCo-OV.cjs → ShopScreen-BigHJ5wE.cjs} +3 -3
- package/dist/{ShopScreen-Dm85_rMp.cjs → ShopScreen-S6rBaoWM.cjs} +4 -4
- package/dist/{ShopScreen-Dm85_rMp.cjs.map → ShopScreen-S6rBaoWM.cjs.map} +1 -1
- package/dist/{SubscriptionsScreen-DrDSwMXS.cjs → SubscriptionsScreen-B88_dLfE.cjs} +9 -9
- package/dist/{SubscriptionsScreen-DrDSwMXS.cjs.map → SubscriptionsScreen-B88_dLfE.cjs.map} +1 -1
- package/dist/{SubscriptionsScreen-CXM2zmF7.mjs → SubscriptionsScreen-DK9-h3Cz.mjs} +8 -8
- package/dist/{SubscriptionsScreen-CXM2zmF7.mjs.map → SubscriptionsScreen-DK9-h3Cz.mjs.map} +1 -1
- package/dist/{SubscriptionsScreen-t5wtDGfB.cjs → SubscriptionsScreen-dhnfYn4L.cjs} +5 -5
- package/dist/{UpgradeScreen-DUvg-WZv.cjs → UpgradeScreen-Bl9lb32K.cjs} +1 -1
- package/dist/{UpgradeScreen-DAKe_hiv.cjs → UpgradeScreen-C-hFDAR2.cjs} +1 -1
- package/dist/{UpgradeScreen-DAKe_hiv.cjs.map → UpgradeScreen-C-hFDAR2.cjs.map} +1 -1
- package/dist/{UpgradeScreen-DnGnWVTf.mjs → UpgradeScreen-X6j0_625.mjs} +1 -1
- package/dist/{UpgradeScreen-DnGnWVTf.mjs.map → UpgradeScreen-X6j0_625.mjs.map} +1 -1
- package/dist/{MySiteScreen-CUyJteDm.cjs → components-BKADyCYp.cjs} +42 -466
- package/dist/components-BKADyCYp.cjs.map +1 -0
- package/dist/{MySiteScreen-CN0ZDBgy.mjs → components-CjgEvBYG.mjs} +6 -470
- package/dist/components-CjgEvBYG.mjs.map +1 -0
- package/dist/{dist-PbA1vxAz.mjs → dist-BstXVe25.mjs} +1 -1
- package/dist/{dist-PbA1vxAz.mjs.map → dist-BstXVe25.mjs.map} +1 -1
- package/dist/{dist-o2cjwzIa.mjs → dist-CTLDCXCc.mjs} +2 -2
- package/dist/{dist-o2cjwzIa.mjs.map → dist-CTLDCXCc.mjs.map} +1 -1
- package/dist/{dist-BQZkLGL6.cjs → dist-DJAHGHHi.cjs} +1 -19
- package/dist/{dist-BQZkLGL6.cjs.map → dist-DJAHGHHi.cjs.map} +1 -1
- package/dist/{dist-DbRTQ2QF.cjs → dist-D_3_ZuC5.cjs} +1 -1
- package/dist/{dist-DbRTQ2QF.cjs.map → dist-D_3_ZuC5.cjs.map} +1 -1
- package/dist/{dist-myuZC8sf.cjs → dist-vhBaFZ9L.cjs} +2 -2
- package/dist/{dist-myuZC8sf.cjs.map → dist-vhBaFZ9L.cjs.map} +1 -1
- package/dist/{es-UfEBhcZD.cjs → es-B5heQ57j.cjs} +1 -1
- package/dist/{es-UfEBhcZD.cjs.map → es-B5heQ57j.cjs.map} +1 -1
- package/dist/{fluid-pay-api-adapter-eNT8m0xB.mjs → fluid-pay-api-adapter-CJ7-I8k-.mjs} +673 -381
- package/dist/fluid-pay-api-adapter-CJ7-I8k-.mjs.map +1 -0
- package/dist/{fluid-pay-api-adapter-BszgrFL6.cjs → fluid-pay-api-adapter-D63KLi5c.cjs} +700 -378
- package/dist/fluid-pay-api-adapter-D63KLi5c.cjs.map +1 -0
- package/dist/{format-CytB2M00.cjs → format-CLUjV1oR.cjs} +1 -1
- package/dist/{format-CytB2M00.cjs.map → format-CLUjV1oR.cjs.map} +1 -1
- package/dist/index.cjs +51 -116
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +50 -115
- package/dist/index.mjs.map +1 -1
- package/dist/{order-status-badge-DHyaK6mU.cjs → order-status-badge-BKvLeVsM.cjs} +3 -3
- package/dist/{order-status-badge-DHyaK6mU.cjs.map → order-status-badge-BKvLeVsM.cjs.map} +1 -1
- package/dist/{order-status-badge-Dmo8lLnt.mjs → order-status-badge-xuJ732eH.mjs} +3 -3
- package/dist/{order-status-badge-Dmo8lLnt.mjs.map → order-status-badge-xuJ732eH.mjs.map} +1 -1
- package/dist/{query-keys-oQKvV4jp.mjs → query-keys-8SVs82aF.mjs} +1 -1
- package/dist/{query-keys-elu0svUd.cjs.map → query-keys-8SVs82aF.mjs.map} +1 -1
- package/dist/{query-keys-elu0svUd.cjs → query-keys-e9EEoWxN.cjs} +1 -1
- package/dist/{query-keys-oQKvV4jp.mjs.map → query-keys-e9EEoWxN.cjs.map} +1 -1
- package/dist/{sortable.esm-C8G00cCP.mjs → sortable.esm-C8riJ_zv.mjs} +2 -14
- package/dist/{sortable.esm-C8G00cCP.mjs.map → sortable.esm-C8riJ_zv.mjs.map} +1 -1
- package/dist/{use-account-C1X-VLY-.cjs → use-account-D6Z9hkDX.cjs} +2 -2
- package/dist/{use-account-C1X-VLY-.cjs.map → use-account-D6Z9hkDX.cjs.map} +1 -1
- package/dist/{use-account-C76sphlu.mjs → use-account-DsTz5BlS.mjs} +2 -2
- package/dist/{use-account-C76sphlu.mjs.map → use-account-DsTz5BlS.mjs.map} +1 -1
- package/package.json +10 -9
- package/styles/packages.css +1 -0
- package/dist/MySiteScreen-CN0ZDBgy.mjs.map +0 -1
- package/dist/MySiteScreen-CUyJteDm.cjs.map +0 -1
- package/dist/OrdersScreen-BV3vJ7xy.mjs.map +0 -1
- package/dist/OrdersScreen-DPcp2dLW.cjs.map +0 -1
- package/dist/ProfileScreen-BT0iys-q.cjs.map +0 -1
- package/dist/ProfileScreen-CZAIUM2a.mjs.map +0 -1
- package/dist/fluid-pay-api-adapter-BszgrFL6.cjs.map +0 -1
- package/dist/fluid-pay-api-adapter-eNT8m0xB.mjs.map +0 -1
|
@@ -2,7 +2,8 @@ require("./chunk-9hOWP6kD.cjs");
|
|
|
2
2
|
require("./mysite-api-context-Dz4lI5Xd.cjs");
|
|
3
3
|
require("./src-uhf6Szlw.cjs");
|
|
4
4
|
require("./ScreenHeaderContext-oIu5Bvhs.cjs");
|
|
5
|
-
require("./dist-
|
|
6
|
-
|
|
5
|
+
require("./dist-DJAHGHHi.cjs");
|
|
6
|
+
require("./components-BKADyCYp.cjs");
|
|
7
|
+
const require_MySiteScreen = require("./MySiteScreen-zfajm9da.cjs");
|
|
7
8
|
exports.MySiteScreen = require_MySiteScreen.MySiteScreen;
|
|
8
9
|
exports.mySiteScreenPropertySchema = require_MySiteScreen.mySiteScreenPropertySchema;
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
import { r as __exportAll } from "./es-BXxGlAp6.mjs";
|
|
2
|
+
import { b as fluidToast, dn as BreadcrumbLink, fn as BreadcrumbList, ln as Breadcrumb, mn as BreadcrumbSeparator, pn as BreadcrumbPage, un as BreadcrumbItem } from "./src-pgBBOcJa.mjs";
|
|
3
|
+
import { r as useScreenHeaderBreadcrumbs } from "./ScreenHeaderContext-Cemdo7bM.mjs";
|
|
4
|
+
import { n as useAppNavigation } from "./AppNavigationContext-DNod9mf6.mjs";
|
|
5
|
+
import { b as usePortalMySiteThemes, w as usePortalUpdateSettings, y as usePortalMySiteProfile } from "./sortable.esm-C8riJ_zv.mjs";
|
|
6
|
+
import { a as MySiteLinkCard, c as getPreviewClassName, i as MySitePhonePreview, n as PortalButtonsEditor, o as MySiteVisitorDetailsCard, r as MySiteThemeEditor, s as getContentClassName, t as PortalFavoritesEditor } from "./components-CjgEvBYG.mjs";
|
|
7
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
8
|
+
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
9
|
+
import { ChevronRight, LayoutGrid, Link2, Palette, User } from "lucide-react";
|
|
10
|
+
//#region src/screens/MySiteScreen/MySiteMainView.tsx
|
|
11
|
+
const navigationItems = [
|
|
12
|
+
{
|
|
13
|
+
label: "Profile",
|
|
14
|
+
slug: "profile",
|
|
15
|
+
icon: User
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
label: "Theme",
|
|
19
|
+
key: "theme",
|
|
20
|
+
icon: Palette
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
label: "MySite Content",
|
|
24
|
+
key: "content",
|
|
25
|
+
icon: LayoutGrid
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
label: "Buttons",
|
|
29
|
+
key: "buttons",
|
|
30
|
+
icon: Link2
|
|
31
|
+
}
|
|
32
|
+
];
|
|
33
|
+
function defaultToast(message, type) {
|
|
34
|
+
fluidToast({
|
|
35
|
+
title: message,
|
|
36
|
+
type
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
function MySiteMainView({ editingSection, animPhase, showEditContent, onEditSection, onBackClick }) {
|
|
40
|
+
const { navigate } = useAppNavigation();
|
|
41
|
+
const { data: profile, isLoading: isProfileLoading } = usePortalMySiteProfile();
|
|
42
|
+
const { data: themes = [] } = usePortalMySiteThemes();
|
|
43
|
+
const updateSettingsMutation = usePortalUpdateSettings();
|
|
44
|
+
const [previewKey, setPreviewKey] = useState(0);
|
|
45
|
+
const refreshPreview = useCallback(() => setPreviewKey((k) => k + 1), []);
|
|
46
|
+
const [selectedThemeId, setSelectedThemeId] = useState(null);
|
|
47
|
+
const resolvedThemeId = selectedThemeId ?? profile?.theme_id ?? themes.find((t) => t.name === "Default")?.id ?? themes[0]?.id ?? null;
|
|
48
|
+
const themeName = themes.find((t) => t.id === resolvedThemeId)?.name ?? "Default";
|
|
49
|
+
const mysiteUrl = profile?.mysite_url ?? "";
|
|
50
|
+
const displayUrl = mysiteUrl ? mysiteUrl.replace(/^https?:\/\//, "") : "";
|
|
51
|
+
const views = profile?.mysite_views ?? 0;
|
|
52
|
+
const leads = profile?.mysite_leads ?? 0;
|
|
53
|
+
const handleSelectTheme = useCallback((theme) => {
|
|
54
|
+
if (theme.id === resolvedThemeId) return;
|
|
55
|
+
const previousThemeId = selectedThemeId;
|
|
56
|
+
setSelectedThemeId(theme.id);
|
|
57
|
+
updateSettingsMutation.mutate({ theme_id: theme.id }, {
|
|
58
|
+
onSuccess: () => {
|
|
59
|
+
defaultToast(`Theme changed to "${theme.name}"`, "success");
|
|
60
|
+
refreshPreview();
|
|
61
|
+
},
|
|
62
|
+
onError: () => {
|
|
63
|
+
setSelectedThemeId(previousThemeId);
|
|
64
|
+
defaultToast("Failed to update theme", "error");
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
}, [
|
|
68
|
+
resolvedThemeId,
|
|
69
|
+
selectedThemeId,
|
|
70
|
+
updateSettingsMutation,
|
|
71
|
+
refreshPreview
|
|
72
|
+
]);
|
|
73
|
+
const handleUpdateSlug = useCallback(async (slug) => {
|
|
74
|
+
await new Promise((resolve, reject) => {
|
|
75
|
+
updateSettingsMutation.mutate({ slug }, {
|
|
76
|
+
onSuccess: () => resolve(),
|
|
77
|
+
onError: () => reject(/* @__PURE__ */ new Error("Failed"))
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
}, [updateSettingsMutation]);
|
|
81
|
+
const handlePreview = useCallback(() => {
|
|
82
|
+
if (mysiteUrl) window.open(`${mysiteUrl}?preview=true`, "_blank");
|
|
83
|
+
}, [mysiteUrl]);
|
|
84
|
+
const sectionLabel = useMemo(() => {
|
|
85
|
+
if (editingSection === "theme") return "Theme";
|
|
86
|
+
if (editingSection === "buttons") return "Buttons";
|
|
87
|
+
if (editingSection === "content") return "MySite Content";
|
|
88
|
+
return "";
|
|
89
|
+
}, [editingSection]);
|
|
90
|
+
if (isProfileLoading) return /* @__PURE__ */ jsxs("div", {
|
|
91
|
+
className: "flex h-full flex-col overflow-y-auto px-2 py-6 2xl:flex-row 2xl:overflow-hidden",
|
|
92
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
93
|
+
className: "w-full px-4 2xl:w-2/3 2xl:shrink-0",
|
|
94
|
+
children: /* @__PURE__ */ jsxs("div", {
|
|
95
|
+
className: "flex flex-col gap-5",
|
|
96
|
+
children: [
|
|
97
|
+
/* @__PURE__ */ jsx("div", { className: "bg-muted h-7 w-32 animate-pulse rounded-md" }),
|
|
98
|
+
/* @__PURE__ */ jsx("div", { className: "bg-muted h-20 w-full animate-pulse rounded-lg" }),
|
|
99
|
+
/* @__PURE__ */ jsx("div", { className: "bg-muted h-16 w-full animate-pulse rounded-lg" }),
|
|
100
|
+
/* @__PURE__ */ jsx("div", { className: "bg-muted h-40 w-full animate-pulse rounded-lg" })
|
|
101
|
+
]
|
|
102
|
+
})
|
|
103
|
+
}), /* @__PURE__ */ jsx("div", {
|
|
104
|
+
className: "w-full shrink-0 overflow-y-hidden px-4 pt-5 2xl:w-1/3 2xl:pt-0",
|
|
105
|
+
children: /* @__PURE__ */ jsxs("div", {
|
|
106
|
+
className: "bg-muted flex h-full flex-col items-center gap-4 rounded-xl p-5",
|
|
107
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
108
|
+
className: "flex w-full items-center justify-between",
|
|
109
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
110
|
+
className: "space-y-1",
|
|
111
|
+
children: [/* @__PURE__ */ jsx("div", { className: "bg-background/50 h-3 w-24 animate-pulse rounded" }), /* @__PURE__ */ jsx("div", { className: "bg-background/50 h-4 w-28 animate-pulse rounded" })]
|
|
112
|
+
}), /* @__PURE__ */ jsx("div", { className: "bg-background/50 h-8 w-20 animate-pulse rounded-md" })]
|
|
113
|
+
}), /* @__PURE__ */ jsx("div", { className: "bg-background/50 h-[490px] w-[260px] animate-pulse rounded-[36px] sm:h-[600px] sm:w-[320px]" })]
|
|
114
|
+
})
|
|
115
|
+
})]
|
|
116
|
+
});
|
|
117
|
+
const contentAnimClassName = getContentClassName(animPhase);
|
|
118
|
+
const previewAnimClassName = getPreviewClassName(animPhase);
|
|
119
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
120
|
+
className: "flex h-full flex-col overflow-y-auto px-2 py-6 2xl:flex-row 2xl:overflow-hidden",
|
|
121
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
122
|
+
className: `w-full px-4 2xl:w-2/3 2xl:shrink-0 ${contentAnimClassName}`,
|
|
123
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
124
|
+
className: "flex min-w-0 flex-col gap-5 2xl:h-full 2xl:overflow-y-auto",
|
|
125
|
+
children: showEditContent && editingSection === "theme" ? /* @__PURE__ */ jsx(MySiteThemeEditor, {
|
|
126
|
+
themes,
|
|
127
|
+
selectedThemeId: resolvedThemeId,
|
|
128
|
+
onSelectTheme: handleSelectTheme,
|
|
129
|
+
isPending: updateSettingsMutation.isPending,
|
|
130
|
+
onBack: onBackClick
|
|
131
|
+
}) : showEditContent && editingSection === "buttons" ? /* @__PURE__ */ jsx(PortalButtonsEditor, {
|
|
132
|
+
onBack: onBackClick,
|
|
133
|
+
onRefreshPreview: refreshPreview,
|
|
134
|
+
onToast: defaultToast
|
|
135
|
+
}) : showEditContent && editingSection === "content" ? /* @__PURE__ */ jsx(PortalFavoritesEditor, {
|
|
136
|
+
onBack: onBackClick,
|
|
137
|
+
onRefreshPreview: refreshPreview,
|
|
138
|
+
onToast: defaultToast
|
|
139
|
+
}) : /* @__PURE__ */ jsxs(Fragment$1, { children: [
|
|
140
|
+
/* @__PURE__ */ jsxs("div", {
|
|
141
|
+
className: "flex items-center gap-2",
|
|
142
|
+
children: [/* @__PURE__ */ jsx("h1", {
|
|
143
|
+
className: "text-foreground text-xl font-bold",
|
|
144
|
+
children: "MySite"
|
|
145
|
+
}), animPhase !== "idle" && sectionLabel && /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(ChevronRight, { className: "text-muted-foreground h-4 w-4" }), /* @__PURE__ */ jsx("span", {
|
|
146
|
+
className: "text-foreground text-xl font-bold",
|
|
147
|
+
children: sectionLabel
|
|
148
|
+
})] })]
|
|
149
|
+
}),
|
|
150
|
+
/* @__PURE__ */ jsx(MySiteVisitorDetailsCard, {
|
|
151
|
+
views,
|
|
152
|
+
leads
|
|
153
|
+
}),
|
|
154
|
+
/* @__PURE__ */ jsx(MySiteLinkCard, {
|
|
155
|
+
mysiteUrl,
|
|
156
|
+
displayUrl,
|
|
157
|
+
onUpdateSlug: handleUpdateSlug,
|
|
158
|
+
onToast: defaultToast
|
|
159
|
+
}),
|
|
160
|
+
/* @__PURE__ */ jsx("div", {
|
|
161
|
+
className: "border-border bg-card divide-border divide-y overflow-hidden rounded-lg border",
|
|
162
|
+
children: navigationItems.map((item) => {
|
|
163
|
+
const Icon = item.icon;
|
|
164
|
+
return /* @__PURE__ */ jsxs("button", {
|
|
165
|
+
type: "button",
|
|
166
|
+
onClick: "slug" in item ? () => navigate(item.slug) : () => onEditSection(item.key),
|
|
167
|
+
className: "group hover:bg-muted flex w-full items-center gap-2.5 px-3 py-2.5 transition-colors text-left cursor-pointer",
|
|
168
|
+
children: [
|
|
169
|
+
/* @__PURE__ */ jsx("div", {
|
|
170
|
+
className: "bg-muted text-foreground flex h-7 w-7 shrink-0 items-center justify-center rounded-full",
|
|
171
|
+
children: /* @__PURE__ */ jsx(Icon, { className: "h-3.5 w-3.5" })
|
|
172
|
+
}),
|
|
173
|
+
/* @__PURE__ */ jsx("span", {
|
|
174
|
+
className: "text-foreground flex-1 text-sm font-medium",
|
|
175
|
+
children: item.label
|
|
176
|
+
}),
|
|
177
|
+
/* @__PURE__ */ jsx(ChevronRight, { className: "text-muted-foreground h-3 w-3 shrink-0 transition-transform group-hover:translate-x-0.5" })
|
|
178
|
+
]
|
|
179
|
+
}, item.label);
|
|
180
|
+
})
|
|
181
|
+
})
|
|
182
|
+
] })
|
|
183
|
+
})
|
|
184
|
+
}), /* @__PURE__ */ jsx("div", {
|
|
185
|
+
className: `w-full shrink-0 overflow-y-hidden px-4 pt-5 2xl:w-1/3 2xl:pt-0 ${previewAnimClassName}`,
|
|
186
|
+
children: /* @__PURE__ */ jsx(MySitePhonePreview, {
|
|
187
|
+
mysiteUrl,
|
|
188
|
+
themeName,
|
|
189
|
+
previewKey,
|
|
190
|
+
isUpdating: updateSettingsMutation.isPending,
|
|
191
|
+
onPreview: handlePreview
|
|
192
|
+
})
|
|
193
|
+
})]
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
//#endregion
|
|
197
|
+
//#region src/screens/MySiteScreen/use-mysite-editing-section.ts
|
|
198
|
+
function useMySiteEditingSection() {
|
|
199
|
+
const [animPhase, setAnimPhase] = useState("idle");
|
|
200
|
+
const [editingSection, setEditingSection] = useState(null);
|
|
201
|
+
const timeoutsRef = useRef([]);
|
|
202
|
+
useEffect(() => {
|
|
203
|
+
const ref = timeoutsRef;
|
|
204
|
+
return () => ref.current.forEach(clearTimeout);
|
|
205
|
+
}, []);
|
|
206
|
+
const cancelScheduled = useCallback(() => {
|
|
207
|
+
timeoutsRef.current.forEach(clearTimeout);
|
|
208
|
+
timeoutsRef.current = [];
|
|
209
|
+
}, []);
|
|
210
|
+
const schedule = useCallback((phase, delay) => {
|
|
211
|
+
const id = setTimeout(() => setAnimPhase(phase), delay);
|
|
212
|
+
timeoutsRef.current.push(id);
|
|
213
|
+
}, []);
|
|
214
|
+
return {
|
|
215
|
+
editingSection,
|
|
216
|
+
animPhase,
|
|
217
|
+
showEditContent: [
|
|
218
|
+
"slide",
|
|
219
|
+
"fade-in",
|
|
220
|
+
"editing",
|
|
221
|
+
"exit-fade-out",
|
|
222
|
+
"exit-slide"
|
|
223
|
+
].includes(animPhase),
|
|
224
|
+
handleEditSection: useCallback((section) => {
|
|
225
|
+
cancelScheduled();
|
|
226
|
+
setEditingSection(section);
|
|
227
|
+
setAnimPhase("fade-out");
|
|
228
|
+
schedule("slide", 300);
|
|
229
|
+
schedule("fade-in", 800);
|
|
230
|
+
schedule("editing", 1100);
|
|
231
|
+
}, [cancelScheduled, schedule]),
|
|
232
|
+
handleBackClick: useCallback(() => {
|
|
233
|
+
cancelScheduled();
|
|
234
|
+
setAnimPhase("exit-fade-out");
|
|
235
|
+
schedule("exit-slide", 300);
|
|
236
|
+
schedule("exit-fade-in", 800);
|
|
237
|
+
const id = setTimeout(() => {
|
|
238
|
+
setAnimPhase("idle");
|
|
239
|
+
setEditingSection(null);
|
|
240
|
+
}, 1100);
|
|
241
|
+
timeoutsRef.current.push(id);
|
|
242
|
+
}, [cancelScheduled, schedule])
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
//#endregion
|
|
246
|
+
//#region src/screens/MySiteScreen/index.tsx
|
|
247
|
+
var MySiteScreen_exports = /* @__PURE__ */ __exportAll({
|
|
248
|
+
MySiteScreen: () => MySiteScreen,
|
|
249
|
+
mySiteScreenPropertySchema: () => mySiteScreenPropertySchema
|
|
250
|
+
});
|
|
251
|
+
function MySiteScreen({ background, textColor, accentColor, padding, borderRadius, ...divProps }) {
|
|
252
|
+
const { editingSection, animPhase, showEditContent, handleEditSection, handleBackClick } = useMySiteEditingSection();
|
|
253
|
+
const sectionLabel = useMemo(() => {
|
|
254
|
+
if (editingSection === "theme") return "Theme";
|
|
255
|
+
if (editingSection === "buttons") return "Buttons";
|
|
256
|
+
if (editingSection === "content") return "MySite Content";
|
|
257
|
+
return null;
|
|
258
|
+
}, [editingSection]);
|
|
259
|
+
const handleRootCrumbClick = useCallback((e) => {
|
|
260
|
+
e.preventDefault();
|
|
261
|
+
if (editingSection !== null) handleBackClick();
|
|
262
|
+
}, [editingSection, handleBackClick]);
|
|
263
|
+
useScreenHeaderBreadcrumbs(useMemo(() => /* @__PURE__ */ jsx(Breadcrumb, { children: /* @__PURE__ */ jsxs(BreadcrumbList, {
|
|
264
|
+
className: "text-lg",
|
|
265
|
+
children: [/* @__PURE__ */ jsx(BreadcrumbItem, { children: sectionLabel ? /* @__PURE__ */ jsx(BreadcrumbLink, {
|
|
266
|
+
href: "#",
|
|
267
|
+
onClick: handleRootCrumbClick,
|
|
268
|
+
children: "My Site"
|
|
269
|
+
}) : /* @__PURE__ */ jsx(BreadcrumbPage, {
|
|
270
|
+
className: "font-semibold",
|
|
271
|
+
children: "My Site"
|
|
272
|
+
}) }), sectionLabel && /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(BreadcrumbSeparator, {}), /* @__PURE__ */ jsx(BreadcrumbItem, { children: /* @__PURE__ */ jsx(BreadcrumbPage, {
|
|
273
|
+
className: "font-semibold",
|
|
274
|
+
children: sectionLabel
|
|
275
|
+
}) })] })]
|
|
276
|
+
}) }), [sectionLabel, handleRootCrumbClick]));
|
|
277
|
+
return /* @__PURE__ */ jsx("div", {
|
|
278
|
+
...divProps,
|
|
279
|
+
className: `h-full ${divProps.className ?? ""}`,
|
|
280
|
+
children: /* @__PURE__ */ jsx(MySiteMainView, {
|
|
281
|
+
editingSection,
|
|
282
|
+
animPhase,
|
|
283
|
+
showEditContent,
|
|
284
|
+
onEditSection: handleEditSection,
|
|
285
|
+
onBackClick: handleBackClick
|
|
286
|
+
})
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
const mySiteScreenPropertySchema = {
|
|
290
|
+
widgetType: "MySiteScreen",
|
|
291
|
+
displayName: "My Site Screen",
|
|
292
|
+
tabsConfig: [{
|
|
293
|
+
id: "styling",
|
|
294
|
+
label: "Styling"
|
|
295
|
+
}],
|
|
296
|
+
fields: []
|
|
297
|
+
};
|
|
298
|
+
//#endregion
|
|
299
|
+
export { MySiteScreen_exports as n, mySiteScreenPropertySchema as r, MySiteScreen as t };
|
|
300
|
+
|
|
301
|
+
//# sourceMappingURL=MySiteScreen-CK84vXa9.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MySiteScreen-CK84vXa9.mjs","names":[],"sources":["../src/screens/MySiteScreen/MySiteMainView.tsx","../src/screens/MySiteScreen/use-mysite-editing-section.ts","../src/screens/MySiteScreen/index.tsx"],"sourcesContent":["import { useCallback, useMemo, useState } from \"react\";\nimport {\n usePortalMySiteProfile,\n usePortalMySiteThemes,\n usePortalUpdateSettings,\n} from \"@fluid-app/mysite-ui/portal/hooks/use-mysite-portal\";\nimport type { MySiteTheme } from \"@fluid-app/mysite-core/mysite-api-types\";\nimport {\n type AnimPhase,\n type EditingSection,\n getContentClassName,\n getPreviewClassName,\n MySiteVisitorDetailsCard,\n MySitePhonePreview,\n MySiteLinkCard,\n MySiteThemeEditor,\n PortalButtonsEditor,\n PortalFavoritesEditor,\n} from \"@fluid-app/mysite-ui/portal/components\";\nimport { ChevronRight, User, Link2, Palette, LayoutGrid } from \"lucide-react\";\nimport { fluidToast } from \"@fluid-app/ui-primitives\";\nimport { useAppNavigation } from \"../../shell/AppNavigationContext\";\n\ntype NavActionItem = {\n label: string;\n key: Exclude<EditingSection, null>;\n icon: typeof User;\n};\ntype NavLinkItem = {\n label: string;\n slug: string;\n icon: typeof User;\n};\ntype NavItem = NavActionItem | NavLinkItem;\n\nconst navigationItems: NavItem[] = [\n { label: \"Profile\", slug: \"profile\", icon: User },\n { label: \"Theme\", key: \"theme\", icon: Palette },\n { label: \"MySite Content\", key: \"content\", icon: LayoutGrid },\n { label: \"Buttons\", key: \"buttons\", icon: Link2 },\n];\n\nfunction defaultToast(message: string, type: \"success\" | \"error\") {\n fluidToast({ title: message, type });\n}\n\nexport interface MySiteMainViewProps {\n editingSection: EditingSection;\n animPhase: AnimPhase;\n showEditContent: boolean;\n onEditSection: (section: EditingSection) => void;\n onBackClick: () => void;\n}\n\nexport function MySiteMainView({\n editingSection,\n animPhase,\n showEditContent,\n onEditSection,\n onBackClick,\n}: MySiteMainViewProps): React.JSX.Element {\n const { navigate } = useAppNavigation();\n const { data: profile, isLoading: isProfileLoading } =\n usePortalMySiteProfile();\n const { data: themes = [] } = usePortalMySiteThemes();\n const updateSettingsMutation = usePortalUpdateSettings();\n\n const [previewKey, setPreviewKey] = useState(0);\n const refreshPreview = useCallback(() => setPreviewKey((k) => k + 1), []);\n\n const [selectedThemeId, setSelectedThemeId] = useState<number | null>(null);\n\n const resolvedThemeId =\n selectedThemeId ??\n profile?.theme_id ??\n themes.find((t) => t.name === \"Default\")?.id ??\n themes[0]?.id ??\n null;\n\n const currentTheme = themes.find((t) => t.id === resolvedThemeId);\n const themeName = currentTheme?.name ?? \"Default\";\n\n const mysiteUrl = profile?.mysite_url ?? \"\";\n const displayUrl = mysiteUrl ? mysiteUrl.replace(/^https?:\\/\\//, \"\") : \"\";\n const views = profile?.mysite_views ?? 0;\n const leads = profile?.mysite_leads ?? 0;\n\n const handleSelectTheme = useCallback(\n (theme: MySiteTheme) => {\n if (theme.id === resolvedThemeId) return;\n const previousThemeId = selectedThemeId;\n setSelectedThemeId(theme.id);\n updateSettingsMutation.mutate(\n { theme_id: theme.id },\n {\n onSuccess: () => {\n defaultToast(`Theme changed to \"${theme.name}\"`, \"success\");\n refreshPreview();\n },\n onError: () => {\n setSelectedThemeId(previousThemeId);\n defaultToast(\"Failed to update theme\", \"error\");\n },\n },\n );\n },\n [resolvedThemeId, selectedThemeId, updateSettingsMutation, refreshPreview],\n );\n\n const handleUpdateSlug = useCallback(\n async (slug: string) => {\n await new Promise<void>((resolve, reject) => {\n updateSettingsMutation.mutate(\n { slug },\n {\n onSuccess: () => resolve(),\n onError: () => reject(new Error(\"Failed\")),\n },\n );\n });\n },\n [updateSettingsMutation],\n );\n\n const handlePreview = useCallback(() => {\n if (mysiteUrl) window.open(`${mysiteUrl}?preview=true`, \"_blank\");\n }, [mysiteUrl]);\n\n const sectionLabel = useMemo(() => {\n if (editingSection === \"theme\") return \"Theme\";\n if (editingSection === \"buttons\") return \"Buttons\";\n if (editingSection === \"content\") return \"MySite Content\";\n return \"\";\n }, [editingSection]);\n\n if (isProfileLoading) {\n return (\n <div className=\"flex h-full flex-col overflow-y-auto px-2 py-6 2xl:flex-row 2xl:overflow-hidden\">\n <div className=\"w-full px-4 2xl:w-2/3 2xl:shrink-0\">\n <div className=\"flex flex-col gap-5\">\n <div className=\"bg-muted h-7 w-32 animate-pulse rounded-md\" />\n <div className=\"bg-muted h-20 w-full animate-pulse rounded-lg\" />\n <div className=\"bg-muted h-16 w-full animate-pulse rounded-lg\" />\n <div className=\"bg-muted h-40 w-full animate-pulse rounded-lg\" />\n </div>\n </div>\n <div className=\"w-full shrink-0 overflow-y-hidden px-4 pt-5 2xl:w-1/3 2xl:pt-0\">\n <div className=\"bg-muted flex h-full flex-col items-center gap-4 rounded-xl p-5\">\n <div className=\"flex w-full items-center justify-between\">\n <div className=\"space-y-1\">\n <div className=\"bg-background/50 h-3 w-24 animate-pulse rounded\" />\n <div className=\"bg-background/50 h-4 w-28 animate-pulse rounded\" />\n </div>\n <div className=\"bg-background/50 h-8 w-20 animate-pulse rounded-md\" />\n </div>\n <div className=\"bg-background/50 h-[490px] w-[260px] animate-pulse rounded-[36px] sm:h-[600px] sm:w-[320px]\" />\n </div>\n </div>\n </div>\n );\n }\n\n const contentAnimClassName = getContentClassName(animPhase);\n const previewAnimClassName = getPreviewClassName(animPhase);\n\n return (\n <div className=\"flex h-full flex-col overflow-y-auto px-2 py-6 2xl:flex-row 2xl:overflow-hidden\">\n {/* Content column */}\n <div\n className={`w-full px-4 2xl:w-2/3 2xl:shrink-0 ${contentAnimClassName}`}\n >\n <div className=\"flex min-w-0 flex-col gap-5 2xl:h-full 2xl:overflow-y-auto\">\n {showEditContent && editingSection === \"theme\" ? (\n <MySiteThemeEditor\n themes={themes}\n selectedThemeId={resolvedThemeId}\n onSelectTheme={handleSelectTheme}\n isPending={updateSettingsMutation.isPending}\n onBack={onBackClick}\n />\n ) : showEditContent && editingSection === \"buttons\" ? (\n <PortalButtonsEditor\n onBack={onBackClick}\n onRefreshPreview={refreshPreview}\n onToast={defaultToast}\n />\n ) : showEditContent && editingSection === \"content\" ? (\n <PortalFavoritesEditor\n onBack={onBackClick}\n onRefreshPreview={refreshPreview}\n onToast={defaultToast}\n />\n ) : (\n <>\n {/* Header with optional back-to-section label */}\n <div className=\"flex items-center gap-2\">\n <h1 className=\"text-foreground text-xl font-bold\">MySite</h1>\n {animPhase !== \"idle\" && sectionLabel && (\n <>\n <ChevronRight className=\"text-muted-foreground h-4 w-4\" />\n <span className=\"text-foreground text-xl font-bold\">\n {sectionLabel}\n </span>\n </>\n )}\n </div>\n\n <MySiteVisitorDetailsCard views={views} leads={leads} />\n\n <MySiteLinkCard\n mysiteUrl={mysiteUrl}\n displayUrl={displayUrl}\n onUpdateSlug={handleUpdateSlug}\n onToast={defaultToast}\n />\n\n <div className=\"border-border bg-card divide-border divide-y overflow-hidden rounded-lg border\">\n {navigationItems.map((item) => {\n const Icon = item.icon;\n const rowClassName =\n \"group hover:bg-muted flex w-full items-center gap-2.5 px-3 py-2.5 transition-colors text-left cursor-pointer\";\n const onClick =\n \"slug\" in item\n ? () => navigate(item.slug)\n : () => onEditSection(item.key);\n\n return (\n <button\n key={item.label}\n type=\"button\"\n onClick={onClick}\n className={rowClassName}\n >\n <div className=\"bg-muted text-foreground flex h-7 w-7 shrink-0 items-center justify-center rounded-full\">\n <Icon className=\"h-3.5 w-3.5\" />\n </div>\n <span className=\"text-foreground flex-1 text-sm font-medium\">\n {item.label}\n </span>\n <ChevronRight className=\"text-muted-foreground h-3 w-3 shrink-0 transition-transform group-hover:translate-x-0.5\" />\n </button>\n );\n })}\n </div>\n </>\n )}\n </div>\n </div>\n\n {/* Preview column */}\n <div\n className={`w-full shrink-0 overflow-y-hidden px-4 pt-5 2xl:w-1/3 2xl:pt-0 ${previewAnimClassName}`}\n >\n <MySitePhonePreview\n mysiteUrl={mysiteUrl}\n themeName={themeName}\n previewKey={previewKey}\n isUpdating={updateSettingsMutation.isPending}\n onPreview={handlePreview}\n />\n </div>\n </div>\n );\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n type AnimPhase,\n type EditingSection,\n FADE_MS,\n SLIDE_MS,\n} from \"@fluid-app/mysite-ui/portal/components\";\n\nexport interface MySiteEditingSectionState {\n editingSection: EditingSection;\n animPhase: AnimPhase;\n showEditContent: boolean;\n handleEditSection: (section: EditingSection) => void;\n handleBackClick: () => void;\n}\n\nexport function useMySiteEditingSection(): MySiteEditingSectionState {\n const [animPhase, setAnimPhase] = useState<AnimPhase>(\"idle\");\n const [editingSection, setEditingSection] = useState<EditingSection>(null);\n const timeoutsRef = useRef<ReturnType<typeof setTimeout>[]>([]);\n\n useEffect(() => {\n const ref = timeoutsRef;\n return () => ref.current.forEach(clearTimeout);\n }, []);\n\n const cancelScheduled = useCallback(() => {\n timeoutsRef.current.forEach(clearTimeout);\n timeoutsRef.current = [];\n }, []);\n\n const schedule = useCallback((phase: AnimPhase, delay: number) => {\n const id = setTimeout(() => setAnimPhase(phase), delay);\n timeoutsRef.current.push(id);\n }, []);\n\n const showEditContent = [\n \"slide\",\n \"fade-in\",\n \"editing\",\n \"exit-fade-out\",\n \"exit-slide\",\n ].includes(animPhase);\n\n const handleEditSection = useCallback(\n (section: EditingSection) => {\n cancelScheduled();\n setEditingSection(section);\n setAnimPhase(\"fade-out\");\n schedule(\"slide\", FADE_MS);\n schedule(\"fade-in\", FADE_MS + SLIDE_MS);\n schedule(\"editing\", FADE_MS + SLIDE_MS + FADE_MS);\n },\n [cancelScheduled, schedule],\n );\n\n const handleBackClick = useCallback(() => {\n cancelScheduled();\n setAnimPhase(\"exit-fade-out\");\n schedule(\"exit-slide\", FADE_MS);\n schedule(\"exit-fade-in\", FADE_MS + SLIDE_MS);\n const id = setTimeout(\n () => {\n setAnimPhase(\"idle\");\n setEditingSection(null);\n },\n FADE_MS + SLIDE_MS + FADE_MS,\n );\n timeoutsRef.current.push(id);\n }, [cancelScheduled, schedule]);\n\n return {\n editingSection,\n animPhase,\n showEditContent,\n handleEditSection,\n handleBackClick,\n };\n}\n","import React, { useCallback, useMemo } from \"react\";\nimport {\n Breadcrumb,\n BreadcrumbList,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbPage,\n BreadcrumbSeparator,\n} from \"@fluid-app/ui-primitives\";\nimport { useScreenHeaderBreadcrumbs } from \"@fluid-app/portal-react/shell/ScreenHeaderContext\";\nimport type { WidgetPropertySchema } from \"../../registries/property-schema-types\";\nimport { MySiteMainView } from \"./MySiteMainView\";\nimport { useMySiteEditingSection } from \"./use-mysite-editing-section\";\nimport type { MySiteScreenProps } from \"./types\";\n\nexport type { MySiteScreenProps } from \"./types\";\nexport type { MeProfile } from \"./types\";\n\nexport function MySiteScreen({\n /* eslint-disable @typescript-eslint/no-unused-vars -- destructured to exclude from divProps spread */\n background,\n textColor,\n accentColor,\n padding,\n borderRadius,\n /* eslint-enable @typescript-eslint/no-unused-vars */\n ...divProps\n}: MySiteScreenProps): React.JSX.Element {\n const {\n editingSection,\n animPhase,\n showEditContent,\n handleEditSection,\n handleBackClick,\n } = useMySiteEditingSection();\n\n const sectionLabel = useMemo(() => {\n if (editingSection === \"theme\") return \"Theme\";\n if (editingSection === \"buttons\") return \"Buttons\";\n if (editingSection === \"content\") return \"MySite Content\";\n return null;\n }, [editingSection]);\n\n const handleRootCrumbClick = useCallback(\n (e: React.MouseEvent) => {\n e.preventDefault();\n if (editingSection !== null) handleBackClick();\n },\n [editingSection, handleBackClick],\n );\n\n const headerBreadcrumbs = useMemo(\n () => (\n <Breadcrumb>\n <BreadcrumbList className=\"text-lg\">\n <BreadcrumbItem>\n {sectionLabel ? (\n <BreadcrumbLink href=\"#\" onClick={handleRootCrumbClick}>\n My Site\n </BreadcrumbLink>\n ) : (\n <BreadcrumbPage className=\"font-semibold\">My Site</BreadcrumbPage>\n )}\n </BreadcrumbItem>\n {sectionLabel && (\n <>\n <BreadcrumbSeparator />\n <BreadcrumbItem>\n <BreadcrumbPage className=\"font-semibold\">\n {sectionLabel}\n </BreadcrumbPage>\n </BreadcrumbItem>\n </>\n )}\n </BreadcrumbList>\n </Breadcrumb>\n ),\n [sectionLabel, handleRootCrumbClick],\n );\n useScreenHeaderBreadcrumbs(headerBreadcrumbs);\n\n return (\n <div {...divProps} className={`h-full ${divProps.className ?? \"\"}`}>\n <MySiteMainView\n editingSection={editingSection}\n animPhase={animPhase}\n showEditContent={showEditContent}\n onEditSection={handleEditSection}\n onBackClick={handleBackClick}\n />\n </div>\n );\n}\n\nexport const mySiteScreenPropertySchema: WidgetPropertySchema = {\n widgetType: \"MySiteScreen\",\n displayName: \"My Site Screen\",\n tabsConfig: [{ id: \"styling\", label: \"Styling\" }],\n fields: [],\n} as const satisfies WidgetPropertySchema;\n"],"mappings":"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"}
|
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
const require_chunk = require("./chunk-9hOWP6kD.cjs");
|
|
2
|
+
const require_src = require("./src-uhf6Szlw.cjs");
|
|
3
|
+
const require_ScreenHeaderContext = require("./ScreenHeaderContext-oIu5Bvhs.cjs");
|
|
4
|
+
const require_AppNavigationContext = require("./AppNavigationContext-BDs1cOuG.cjs");
|
|
5
|
+
const require_dist = require("./dist-DJAHGHHi.cjs");
|
|
6
|
+
const require_components = require("./components-BKADyCYp.cjs");
|
|
7
|
+
let react = require("react");
|
|
8
|
+
react = require_chunk.__toESM(react);
|
|
9
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
10
|
+
let lucide_react = require("lucide-react");
|
|
11
|
+
//#region src/screens/MySiteScreen/MySiteMainView.tsx
|
|
12
|
+
const navigationItems = [
|
|
13
|
+
{
|
|
14
|
+
label: "Profile",
|
|
15
|
+
slug: "profile",
|
|
16
|
+
icon: lucide_react.User
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
label: "Theme",
|
|
20
|
+
key: "theme",
|
|
21
|
+
icon: lucide_react.Palette
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
label: "MySite Content",
|
|
25
|
+
key: "content",
|
|
26
|
+
icon: lucide_react.LayoutGrid
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
label: "Buttons",
|
|
30
|
+
key: "buttons",
|
|
31
|
+
icon: lucide_react.Link2
|
|
32
|
+
}
|
|
33
|
+
];
|
|
34
|
+
function defaultToast(message, type) {
|
|
35
|
+
require_src.fluidToast({
|
|
36
|
+
title: message,
|
|
37
|
+
type
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
function MySiteMainView({ editingSection, animPhase, showEditContent, onEditSection, onBackClick }) {
|
|
41
|
+
const { navigate } = require_AppNavigationContext.useAppNavigation();
|
|
42
|
+
const { data: profile, isLoading: isProfileLoading } = require_dist.usePortalMySiteProfile();
|
|
43
|
+
const { data: themes = [] } = require_dist.usePortalMySiteThemes();
|
|
44
|
+
const updateSettingsMutation = require_dist.usePortalUpdateSettings();
|
|
45
|
+
const [previewKey, setPreviewKey] = (0, react.useState)(0);
|
|
46
|
+
const refreshPreview = (0, react.useCallback)(() => setPreviewKey((k) => k + 1), []);
|
|
47
|
+
const [selectedThemeId, setSelectedThemeId] = (0, react.useState)(null);
|
|
48
|
+
const resolvedThemeId = selectedThemeId ?? profile?.theme_id ?? themes.find((t) => t.name === "Default")?.id ?? themes[0]?.id ?? null;
|
|
49
|
+
const themeName = themes.find((t) => t.id === resolvedThemeId)?.name ?? "Default";
|
|
50
|
+
const mysiteUrl = profile?.mysite_url ?? "";
|
|
51
|
+
const displayUrl = mysiteUrl ? mysiteUrl.replace(/^https?:\/\//, "") : "";
|
|
52
|
+
const views = profile?.mysite_views ?? 0;
|
|
53
|
+
const leads = profile?.mysite_leads ?? 0;
|
|
54
|
+
const handleSelectTheme = (0, react.useCallback)((theme) => {
|
|
55
|
+
if (theme.id === resolvedThemeId) return;
|
|
56
|
+
const previousThemeId = selectedThemeId;
|
|
57
|
+
setSelectedThemeId(theme.id);
|
|
58
|
+
updateSettingsMutation.mutate({ theme_id: theme.id }, {
|
|
59
|
+
onSuccess: () => {
|
|
60
|
+
defaultToast(`Theme changed to "${theme.name}"`, "success");
|
|
61
|
+
refreshPreview();
|
|
62
|
+
},
|
|
63
|
+
onError: () => {
|
|
64
|
+
setSelectedThemeId(previousThemeId);
|
|
65
|
+
defaultToast("Failed to update theme", "error");
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
}, [
|
|
69
|
+
resolvedThemeId,
|
|
70
|
+
selectedThemeId,
|
|
71
|
+
updateSettingsMutation,
|
|
72
|
+
refreshPreview
|
|
73
|
+
]);
|
|
74
|
+
const handleUpdateSlug = (0, react.useCallback)(async (slug) => {
|
|
75
|
+
await new Promise((resolve, reject) => {
|
|
76
|
+
updateSettingsMutation.mutate({ slug }, {
|
|
77
|
+
onSuccess: () => resolve(),
|
|
78
|
+
onError: () => reject(/* @__PURE__ */ new Error("Failed"))
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
}, [updateSettingsMutation]);
|
|
82
|
+
const handlePreview = (0, react.useCallback)(() => {
|
|
83
|
+
if (mysiteUrl) window.open(`${mysiteUrl}?preview=true`, "_blank");
|
|
84
|
+
}, [mysiteUrl]);
|
|
85
|
+
const sectionLabel = (0, react.useMemo)(() => {
|
|
86
|
+
if (editingSection === "theme") return "Theme";
|
|
87
|
+
if (editingSection === "buttons") return "Buttons";
|
|
88
|
+
if (editingSection === "content") return "MySite Content";
|
|
89
|
+
return "";
|
|
90
|
+
}, [editingSection]);
|
|
91
|
+
if (isProfileLoading) return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
92
|
+
className: "flex h-full flex-col overflow-y-auto px-2 py-6 2xl:flex-row 2xl:overflow-hidden",
|
|
93
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
94
|
+
className: "w-full px-4 2xl:w-2/3 2xl:shrink-0",
|
|
95
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
96
|
+
className: "flex flex-col gap-5",
|
|
97
|
+
children: [
|
|
98
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { className: "bg-muted h-7 w-32 animate-pulse rounded-md" }),
|
|
99
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { className: "bg-muted h-20 w-full animate-pulse rounded-lg" }),
|
|
100
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { className: "bg-muted h-16 w-full animate-pulse rounded-lg" }),
|
|
101
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { className: "bg-muted h-40 w-full animate-pulse rounded-lg" })
|
|
102
|
+
]
|
|
103
|
+
})
|
|
104
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
105
|
+
className: "w-full shrink-0 overflow-y-hidden px-4 pt-5 2xl:w-1/3 2xl:pt-0",
|
|
106
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
107
|
+
className: "bg-muted flex h-full flex-col items-center gap-4 rounded-xl p-5",
|
|
108
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
109
|
+
className: "flex w-full items-center justify-between",
|
|
110
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
111
|
+
className: "space-y-1",
|
|
112
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { className: "bg-background/50 h-3 w-24 animate-pulse rounded" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { className: "bg-background/50 h-4 w-28 animate-pulse rounded" })]
|
|
113
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { className: "bg-background/50 h-8 w-20 animate-pulse rounded-md" })]
|
|
114
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { className: "bg-background/50 h-[490px] w-[260px] animate-pulse rounded-[36px] sm:h-[600px] sm:w-[320px]" })]
|
|
115
|
+
})
|
|
116
|
+
})]
|
|
117
|
+
});
|
|
118
|
+
const contentAnimClassName = require_components.getContentClassName(animPhase);
|
|
119
|
+
const previewAnimClassName = require_components.getPreviewClassName(animPhase);
|
|
120
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
121
|
+
className: "flex h-full flex-col overflow-y-auto px-2 py-6 2xl:flex-row 2xl:overflow-hidden",
|
|
122
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
123
|
+
className: `w-full px-4 2xl:w-2/3 2xl:shrink-0 ${contentAnimClassName}`,
|
|
124
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
125
|
+
className: "flex min-w-0 flex-col gap-5 2xl:h-full 2xl:overflow-y-auto",
|
|
126
|
+
children: showEditContent && editingSection === "theme" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_components.MySiteThemeEditor, {
|
|
127
|
+
themes,
|
|
128
|
+
selectedThemeId: resolvedThemeId,
|
|
129
|
+
onSelectTheme: handleSelectTheme,
|
|
130
|
+
isPending: updateSettingsMutation.isPending,
|
|
131
|
+
onBack: onBackClick
|
|
132
|
+
}) : showEditContent && editingSection === "buttons" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_components.PortalButtonsEditor, {
|
|
133
|
+
onBack: onBackClick,
|
|
134
|
+
onRefreshPreview: refreshPreview,
|
|
135
|
+
onToast: defaultToast
|
|
136
|
+
}) : showEditContent && editingSection === "content" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_components.PortalFavoritesEditor, {
|
|
137
|
+
onBack: onBackClick,
|
|
138
|
+
onRefreshPreview: refreshPreview,
|
|
139
|
+
onToast: defaultToast
|
|
140
|
+
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
|
|
141
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
142
|
+
className: "flex items-center gap-2",
|
|
143
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h1", {
|
|
144
|
+
className: "text-foreground text-xl font-bold",
|
|
145
|
+
children: "MySite"
|
|
146
|
+
}), animPhase !== "idle" && sectionLabel && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.ChevronRight, { className: "text-muted-foreground h-4 w-4" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
147
|
+
className: "text-foreground text-xl font-bold",
|
|
148
|
+
children: sectionLabel
|
|
149
|
+
})] })]
|
|
150
|
+
}),
|
|
151
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_components.MySiteVisitorDetailsCard, {
|
|
152
|
+
views,
|
|
153
|
+
leads
|
|
154
|
+
}),
|
|
155
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_components.MySiteLinkCard, {
|
|
156
|
+
mysiteUrl,
|
|
157
|
+
displayUrl,
|
|
158
|
+
onUpdateSlug: handleUpdateSlug,
|
|
159
|
+
onToast: defaultToast
|
|
160
|
+
}),
|
|
161
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
162
|
+
className: "border-border bg-card divide-border divide-y overflow-hidden rounded-lg border",
|
|
163
|
+
children: navigationItems.map((item) => {
|
|
164
|
+
const Icon = item.icon;
|
|
165
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
166
|
+
type: "button",
|
|
167
|
+
onClick: "slug" in item ? () => navigate(item.slug) : () => onEditSection(item.key),
|
|
168
|
+
className: "group hover:bg-muted flex w-full items-center gap-2.5 px-3 py-2.5 transition-colors text-left cursor-pointer",
|
|
169
|
+
children: [
|
|
170
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
171
|
+
className: "bg-muted text-foreground flex h-7 w-7 shrink-0 items-center justify-center rounded-full",
|
|
172
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Icon, { className: "h-3.5 w-3.5" })
|
|
173
|
+
}),
|
|
174
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
175
|
+
className: "text-foreground flex-1 text-sm font-medium",
|
|
176
|
+
children: item.label
|
|
177
|
+
}),
|
|
178
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.ChevronRight, { className: "text-muted-foreground h-3 w-3 shrink-0 transition-transform group-hover:translate-x-0.5" })
|
|
179
|
+
]
|
|
180
|
+
}, item.label);
|
|
181
|
+
})
|
|
182
|
+
})
|
|
183
|
+
] })
|
|
184
|
+
})
|
|
185
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
186
|
+
className: `w-full shrink-0 overflow-y-hidden px-4 pt-5 2xl:w-1/3 2xl:pt-0 ${previewAnimClassName}`,
|
|
187
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_components.MySitePhonePreview, {
|
|
188
|
+
mysiteUrl,
|
|
189
|
+
themeName,
|
|
190
|
+
previewKey,
|
|
191
|
+
isUpdating: updateSettingsMutation.isPending,
|
|
192
|
+
onPreview: handlePreview
|
|
193
|
+
})
|
|
194
|
+
})]
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
//#endregion
|
|
198
|
+
//#region src/screens/MySiteScreen/use-mysite-editing-section.ts
|
|
199
|
+
function useMySiteEditingSection() {
|
|
200
|
+
const [animPhase, setAnimPhase] = (0, react.useState)("idle");
|
|
201
|
+
const [editingSection, setEditingSection] = (0, react.useState)(null);
|
|
202
|
+
const timeoutsRef = (0, react.useRef)([]);
|
|
203
|
+
(0, react.useEffect)(() => {
|
|
204
|
+
const ref = timeoutsRef;
|
|
205
|
+
return () => ref.current.forEach(clearTimeout);
|
|
206
|
+
}, []);
|
|
207
|
+
const cancelScheduled = (0, react.useCallback)(() => {
|
|
208
|
+
timeoutsRef.current.forEach(clearTimeout);
|
|
209
|
+
timeoutsRef.current = [];
|
|
210
|
+
}, []);
|
|
211
|
+
const schedule = (0, react.useCallback)((phase, delay) => {
|
|
212
|
+
const id = setTimeout(() => setAnimPhase(phase), delay);
|
|
213
|
+
timeoutsRef.current.push(id);
|
|
214
|
+
}, []);
|
|
215
|
+
return {
|
|
216
|
+
editingSection,
|
|
217
|
+
animPhase,
|
|
218
|
+
showEditContent: [
|
|
219
|
+
"slide",
|
|
220
|
+
"fade-in",
|
|
221
|
+
"editing",
|
|
222
|
+
"exit-fade-out",
|
|
223
|
+
"exit-slide"
|
|
224
|
+
].includes(animPhase),
|
|
225
|
+
handleEditSection: (0, react.useCallback)((section) => {
|
|
226
|
+
cancelScheduled();
|
|
227
|
+
setEditingSection(section);
|
|
228
|
+
setAnimPhase("fade-out");
|
|
229
|
+
schedule("slide", 300);
|
|
230
|
+
schedule("fade-in", 800);
|
|
231
|
+
schedule("editing", 1100);
|
|
232
|
+
}, [cancelScheduled, schedule]),
|
|
233
|
+
handleBackClick: (0, react.useCallback)(() => {
|
|
234
|
+
cancelScheduled();
|
|
235
|
+
setAnimPhase("exit-fade-out");
|
|
236
|
+
schedule("exit-slide", 300);
|
|
237
|
+
schedule("exit-fade-in", 800);
|
|
238
|
+
const id = setTimeout(() => {
|
|
239
|
+
setAnimPhase("idle");
|
|
240
|
+
setEditingSection(null);
|
|
241
|
+
}, 1100);
|
|
242
|
+
timeoutsRef.current.push(id);
|
|
243
|
+
}, [cancelScheduled, schedule])
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
//#endregion
|
|
247
|
+
//#region src/screens/MySiteScreen/index.tsx
|
|
248
|
+
function MySiteScreen({ background, textColor, accentColor, padding, borderRadius, ...divProps }) {
|
|
249
|
+
const { editingSection, animPhase, showEditContent, handleEditSection, handleBackClick } = useMySiteEditingSection();
|
|
250
|
+
const sectionLabel = (0, react.useMemo)(() => {
|
|
251
|
+
if (editingSection === "theme") return "Theme";
|
|
252
|
+
if (editingSection === "buttons") return "Buttons";
|
|
253
|
+
if (editingSection === "content") return "MySite Content";
|
|
254
|
+
return null;
|
|
255
|
+
}, [editingSection]);
|
|
256
|
+
const handleRootCrumbClick = (0, react.useCallback)((e) => {
|
|
257
|
+
e.preventDefault();
|
|
258
|
+
if (editingSection !== null) handleBackClick();
|
|
259
|
+
}, [editingSection, handleBackClick]);
|
|
260
|
+
require_ScreenHeaderContext.useScreenHeaderBreadcrumbs((0, react.useMemo)(() => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_src.Breadcrumb, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_src.BreadcrumbList, {
|
|
261
|
+
className: "text-lg",
|
|
262
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_src.BreadcrumbItem, { children: sectionLabel ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_src.BreadcrumbLink, {
|
|
263
|
+
href: "#",
|
|
264
|
+
onClick: handleRootCrumbClick,
|
|
265
|
+
children: "My Site"
|
|
266
|
+
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_src.BreadcrumbPage, {
|
|
267
|
+
className: "font-semibold",
|
|
268
|
+
children: "My Site"
|
|
269
|
+
}) }), sectionLabel && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_src.BreadcrumbSeparator, {}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_src.BreadcrumbItem, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_src.BreadcrumbPage, {
|
|
270
|
+
className: "font-semibold",
|
|
271
|
+
children: sectionLabel
|
|
272
|
+
}) })] })]
|
|
273
|
+
}) }), [sectionLabel, handleRootCrumbClick]));
|
|
274
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
275
|
+
...divProps,
|
|
276
|
+
className: `h-full ${divProps.className ?? ""}`,
|
|
277
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(MySiteMainView, {
|
|
278
|
+
editingSection,
|
|
279
|
+
animPhase,
|
|
280
|
+
showEditContent,
|
|
281
|
+
onEditSection: handleEditSection,
|
|
282
|
+
onBackClick: handleBackClick
|
|
283
|
+
})
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
const mySiteScreenPropertySchema = {
|
|
287
|
+
widgetType: "MySiteScreen",
|
|
288
|
+
displayName: "My Site Screen",
|
|
289
|
+
tabsConfig: [{
|
|
290
|
+
id: "styling",
|
|
291
|
+
label: "Styling"
|
|
292
|
+
}],
|
|
293
|
+
fields: []
|
|
294
|
+
};
|
|
295
|
+
//#endregion
|
|
296
|
+
Object.defineProperty(exports, "MySiteScreen", {
|
|
297
|
+
enumerable: true,
|
|
298
|
+
get: function() {
|
|
299
|
+
return MySiteScreen;
|
|
300
|
+
}
|
|
301
|
+
});
|
|
302
|
+
Object.defineProperty(exports, "mySiteScreenPropertySchema", {
|
|
303
|
+
enumerable: true,
|
|
304
|
+
get: function() {
|
|
305
|
+
return mySiteScreenPropertySchema;
|
|
306
|
+
}
|
|
307
|
+
});
|
|
308
|
+
|
|
309
|
+
//# sourceMappingURL=MySiteScreen-zfajm9da.cjs.map
|