fix: flat absolute routes + declare api.cal.com egress (2.0.7)
Register the chi routes as flat absolute paths (httpBase+"/slots" …) instead of a nested r.Route mount: the wasm host forwards the full original path with no prefix strip, so the nested mount's RoutePath rebasing never matched and 404'd the entire HTTP surface. Declare allowed_hosts = ["api.cal.com"] so the ADR-0023 install consent dialog asks the admin to grant egress; without it every Cal.com call was denied at runtime (ABI_ERROR_CODE_EGRESS_DENIED, no egress grant). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
5a138b9ac8
commit
bd7f9fad15
52
handler.go
52
handler.go
@ -300,34 +300,34 @@ func NewCalcomRouter(deps plugin.CoreServices) http.Handler {
|
||||
h.blockConfig = publishedBlockResolver{source: deps.Content}
|
||||
}
|
||||
|
||||
// Routes are registered ABSOLUTE: the wasm host forwards the full request
|
||||
// path (no prefix strip), so relative registrations never match — the
|
||||
// 2.0.0–2.0.2 regression that 404'd the plugin's entire HTTP surface.
|
||||
// Mirrors testplugin's httpBase convention.
|
||||
r.Route(httpBase, func(r chi.Router) {
|
||||
// Public booking endpoints — reachable by anonymous visitors.
|
||||
r.Get("/slots", h.HandleGetSlots)
|
||||
r.Get("/form", h.HandleGetForm)
|
||||
r.Post("/book", h.HandleCreateBooking)
|
||||
r.Post("/cancel", h.HandleCancelBooking)
|
||||
r.Get("/reset", h.HandleReset)
|
||||
r.Get("/date-grid", h.HandleGetDateGrid)
|
||||
// Routes are registered ABSOLUTE on a flat chi router: the wasm host forwards
|
||||
// the FULL original path (r.URL.Path, no prefix strip), so the guest matches
|
||||
// on the complete path. A nested r.Route(httpBase, …) instead relies on chi
|
||||
// Mount's RoutePath rebasing, which the raw-path forwarder never populates —
|
||||
// mirror testplugin's httpBase convention (flat + absolute) so the surface
|
||||
// resolves regardless of how the host mounts the forwarder.
|
||||
// Public booking endpoints — reachable by anonymous visitors.
|
||||
r.Get(httpBase+"/slots", h.HandleGetSlots)
|
||||
r.Get(httpBase+"/form", h.HandleGetForm)
|
||||
r.Post(httpBase+"/book", h.HandleCreateBooking)
|
||||
r.Post(httpBase+"/cancel", h.HandleCancelBooking)
|
||||
r.Get(httpBase+"/reset", h.HandleReset)
|
||||
r.Get(httpBase+"/date-grid", h.HandleGetDateGrid)
|
||||
|
||||
// Webhook receiver — HMAC-verified inside the handler, so no admin gate.
|
||||
wh := NewWebhookHandler(settings, slog.Default())
|
||||
r.Post("/webhook", wh.Handle)
|
||||
// Webhook receiver — HMAC-verified inside the handler, so no admin gate.
|
||||
wh := NewWebhookHandler(settings, slog.Default())
|
||||
r.Post(httpBase+"/webhook", wh.Handle)
|
||||
|
||||
// Admin endpoints — gated by requireAdmin. The plugin HTTP mount has no
|
||||
// outer admin middleware, so this is the only line keeping the API key
|
||||
// + webhook secret + Cal.com proxy out of attackers' hands.
|
||||
r.Group(func(admin chi.Router) {
|
||||
admin.Use(requireAdmin)
|
||||
admin.Get("/settings", h.HandleGetSettings)
|
||||
admin.Post("/settings", h.HandleSaveSettings)
|
||||
admin.Post("/settings/rotate-webhook-secret", h.HandleRotateWebhookSecret)
|
||||
admin.Post("/test", h.HandleTestConnection)
|
||||
admin.Get("/event-types", h.HandleListEventTypes)
|
||||
})
|
||||
// Admin endpoints — gated by requireAdmin. The plugin HTTP mount has no
|
||||
// outer admin middleware, so this is the only line keeping the API key
|
||||
// + webhook secret + Cal.com proxy out of attackers' hands.
|
||||
r.Group(func(admin chi.Router) {
|
||||
admin.Use(requireAdmin)
|
||||
admin.Get(httpBase+"/settings", h.HandleGetSettings)
|
||||
admin.Post(httpBase+"/settings", h.HandleSaveSettings)
|
||||
admin.Post(httpBase+"/settings/rotate-webhook-secret", h.HandleRotateWebhookSecret)
|
||||
admin.Post(httpBase+"/test", h.HandleTestConnection)
|
||||
admin.Get(httpBase+"/event-types", h.HandleListEventTypes)
|
||||
})
|
||||
|
||||
return r
|
||||
|
||||
@ -8,3 +8,4 @@ kind = "plugin"
|
||||
categories = ["forms"]
|
||||
tags = ["calcom", "booking", "calendar", "scheduling", "appointments"]
|
||||
private = true
|
||||
allowed_hosts = ["api.cal.com"]
|
||||
|
||||
@ -1,351 +1,573 @@
|
||||
import { importShared } from './__federation_fn_import-hlt2XzeI.js';
|
||||
import { j as jsxRuntimeExports } from './jsx-runtime-CvJTHeKY.js';
|
||||
import { importShared } from "./__federation_fn_import-hlt2XzeI.js";
|
||||
import { j as jsxRuntimeExports } from "./jsx-runtime-CvJTHeKY.js";
|
||||
|
||||
const {useCallback,useEffect,useState} = await importShared('react');
|
||||
const { useCallback, useEffect, useState } = await importShared("react");
|
||||
|
||||
const {Alert,AlertDescription,Button,Card,CardContent,CardDescription,CardHeader,CardTitle,Tabs,TabsContent,TabsList,TabsTrigger,Input,Label,Textarea,Switch,Select,SelectContent,SelectItem,SelectTrigger,SelectValue,Settings,Edit3,CheckCircle2,XCircle,Loader2,Key,AlertCircle,ExternalLink,RefreshCw,t} = await importShared('@block-ninja/ui');
|
||||
const {
|
||||
Alert,
|
||||
AlertDescription,
|
||||
Button,
|
||||
Card,
|
||||
CardContent,
|
||||
CardDescription,
|
||||
CardHeader,
|
||||
CardTitle,
|
||||
Tabs,
|
||||
TabsContent,
|
||||
TabsList,
|
||||
TabsTrigger,
|
||||
Input,
|
||||
Label,
|
||||
Textarea,
|
||||
Switch,
|
||||
Select,
|
||||
SelectContent,
|
||||
SelectItem,
|
||||
SelectTrigger,
|
||||
SelectValue,
|
||||
Settings,
|
||||
Edit3,
|
||||
CheckCircle2,
|
||||
XCircle,
|
||||
Loader2,
|
||||
Key,
|
||||
AlertCircle,
|
||||
ExternalLink,
|
||||
RefreshCw,
|
||||
t,
|
||||
} = await importShared("@block-ninja/ui");
|
||||
|
||||
function renderConnectedAccount(apiKeyConfigured, calcomUsername) {
|
||||
if (apiKeyConfigured === false) {
|
||||
return /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground", children: t("calcom.editor.connectedAs.noKey", "Configure the API key in plugin settings to connect an account.") });
|
||||
}
|
||||
if (calcomUsername) {
|
||||
return /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm font-mono", children: calcomUsername });
|
||||
}
|
||||
return /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground", children: t("calcom.editor.connectedAs.resolving", "Resolving account from API key…") });
|
||||
if (apiKeyConfigured === false) {
|
||||
return /* @__PURE__ */ jsxRuntimeExports.jsx("p", {
|
||||
className: "text-xs text-muted-foreground",
|
||||
children: t("calcom.editor.connectedAs.noKey", "Configure the API key in plugin settings to connect an account."),
|
||||
});
|
||||
}
|
||||
if (calcomUsername) {
|
||||
return /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm font-mono", children: calcomUsername });
|
||||
}
|
||||
return /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground", children: t("calcom.editor.connectedAs.resolving", "Resolving account from API key…") });
|
||||
}
|
||||
function CalcomBlockEditor({ content, onChange }) {
|
||||
const [activeTab, setActiveTab] = useState("config");
|
||||
const [apiKeyConfigured, setApiKeyConfigured] = useState(null);
|
||||
const [calcomUsername, setCalcomUsername] = useState("");
|
||||
const [eventTypes, setEventTypes] = useState([]);
|
||||
const [loadingEventTypes, setLoadingEventTypes] = useState(false);
|
||||
const [fetchFailed, setFetchFailed] = useState(false);
|
||||
const [retryCounter, setRetryCounter] = useState(0);
|
||||
const handleFieldChange = useCallback(
|
||||
(field, value) => {
|
||||
onChange({ ...content, [field]: value });
|
||||
},
|
||||
[content, onChange]
|
||||
);
|
||||
const getString = (field, defaultValue = "") => {
|
||||
return content[field] || defaultValue;
|
||||
};
|
||||
const getNumber = (field, defaultValue = 0) => {
|
||||
const val = content[field];
|
||||
if (typeof val === "number") return val;
|
||||
if (typeof val === "string") return parseInt(val, 10) || defaultValue;
|
||||
return defaultValue;
|
||||
};
|
||||
const getBool = (field, defaultValue = false) => {
|
||||
const val = content[field];
|
||||
if (typeof val === "boolean") return val;
|
||||
return defaultValue;
|
||||
};
|
||||
const eventTypeSlug = getString("eventTypeSlug");
|
||||
useEffect(() => {
|
||||
fetch(`/api/plugins/calcomblock/settings`).then((r) => r.json()).then((d) => {
|
||||
setApiKeyConfigured(!!d.api_key_configured);
|
||||
setCalcomUsername(d.username ?? "");
|
||||
}).catch(() => setApiKeyConfigured(false));
|
||||
}, []);
|
||||
useEffect(() => {
|
||||
if (calcomUsername && content.username !== calcomUsername) {
|
||||
onChange({ ...content, username: calcomUsername });
|
||||
}
|
||||
}, [calcomUsername, content, onChange]);
|
||||
useEffect(() => {
|
||||
if (!apiKeyConfigured) {
|
||||
setEventTypes([]);
|
||||
setFetchFailed(false);
|
||||
return;
|
||||
}
|
||||
const timer = setTimeout(() => {
|
||||
setLoadingEventTypes(true);
|
||||
setFetchFailed(false);
|
||||
fetch(`/api/plugins/calcomblock/event-types?username=${encodeURIComponent(calcomUsername)}`).then((r) => r.json()).then((d) => {
|
||||
if (d.success) {
|
||||
setEventTypes(d.event_types ?? []);
|
||||
} else {
|
||||
setEventTypes([]);
|
||||
setFetchFailed(true);
|
||||
}
|
||||
}).catch(() => {
|
||||
setEventTypes([]);
|
||||
setFetchFailed(true);
|
||||
}).finally(() => setLoadingEventTypes(false));
|
||||
}, 300);
|
||||
return () => clearTimeout(timer);
|
||||
}, [apiKeyConfigured, calcomUsername, retryCounter]);
|
||||
const handleRetry = useCallback(() => {
|
||||
setRetryCounter((n) => n + 1);
|
||||
}, []);
|
||||
const selectPlaceholder = (() => {
|
||||
if (apiKeyConfigured === false) {
|
||||
return /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "inline-flex items-center gap-1.5 text-muted-foreground", children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(Key, { className: "h-3 w-3" }),
|
||||
t("calcom.editor.eventType.placeholder.noApiKey", "Configure API key first")
|
||||
] });
|
||||
}
|
||||
if (loadingEventTypes) {
|
||||
return /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "inline-flex items-center gap-1.5 text-muted-foreground", children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(Loader2, { className: "h-3 w-3 animate-spin" }),
|
||||
t("calcom.editor.eventType.placeholder.loading", "Loading…")
|
||||
] });
|
||||
}
|
||||
if (!calcomUsername) {
|
||||
return /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "inline-flex items-center gap-1.5 text-muted-foreground", children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(Loader2, { className: "h-3 w-3 animate-spin" }),
|
||||
t("calcom.editor.eventType.placeholder.resolvingUser", "Resolving account…")
|
||||
] });
|
||||
}
|
||||
if (eventTypes.length === 0) {
|
||||
return /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "inline-flex items-center gap-1.5 text-muted-foreground", children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(XCircle, { className: "h-3 w-3" }),
|
||||
t("calcom.editor.eventType.placeholder.noEventTypes", "No event types found")
|
||||
] });
|
||||
}
|
||||
return t("calcom.editor.eventType.placeholder.select", "Select event type");
|
||||
})();
|
||||
const apiKeyReady = apiKeyConfigured === true;
|
||||
const usernameReady = calcomUsername.length > 0;
|
||||
const eventTypeReady = eventTypeSlug.length > 0;
|
||||
const canOpenInCalcom = usernameReady && eventTypeReady;
|
||||
const renderStatusRow = (ok, label, action) => /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 text-sm", children: [
|
||||
ok ? /* @__PURE__ */ jsxRuntimeExports.jsx(CheckCircle2, { className: "h-4 w-4 text-primary", "aria-hidden": "true" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(XCircle, { className: "h-4 w-4 text-destructive", "aria-hidden": "true" }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: ok ? "text-foreground" : "text-muted-foreground", children: label }),
|
||||
action ? /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "ml-auto", children: action }) : null
|
||||
] });
|
||||
return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "space-y-4", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Tabs, { value: activeTab, onValueChange: setActiveTab, children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(TabsList, { className: "grid w-full grid-cols-2", children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(TabsTrigger, { value: "config", className: "gap-2", children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(Settings, { className: "h-4 w-4" }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: t("calcom.editor.tab.configuration", "Configuration") })
|
||||
] }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(TabsTrigger, { value: "content", className: "gap-2", children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(Edit3, { className: "h-4 w-4" }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: t("calcom.editor.tab.content", "Content") })
|
||||
] })
|
||||
] }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(TabsContent, { value: "config", className: "space-y-4 mt-4", children: [
|
||||
apiKeyConfigured === false && /* @__PURE__ */ jsxRuntimeExports.jsx(Alert, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs(AlertDescription, { children: [
|
||||
t("calcom.editor.alert.apiKeyMissing.prefix", "Configure your Cal.com API key in"),
|
||||
" ",
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("a", { href: "/admin/plugins?plugin=calcomblock", className: "text-primary hover:underline", children: t("calcom.editor.alert.apiKeyMissing.linkLabel", "plugin settings") }),
|
||||
" ",
|
||||
t("calcom.editor.alert.apiKeyMissing.suffix", "to enable the event-type dropdown.")
|
||||
] }) }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(Card, { children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(CardHeader, { children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(CardTitle, { className: "text-base", children: t("calcom.editor.section.config.title", "Cal.com Settings") }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(CardDescription, { children: t("calcom.editor.section.config.description", "Connect to your Cal.com account and select an event type") })
|
||||
] }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(CardContent, { className: "space-y-4", children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-2", children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(Label, { children: t("calcom.editor.connectedAs.label", "Connected Account") }),
|
||||
renderConnectedAccount(apiKeyConfigured, calcomUsername)
|
||||
] }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-2", children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(Label, { htmlFor: "eventTypeSlug", children: [
|
||||
t("calcom.editor.eventType.label", "Event Type"),
|
||||
" ",
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-destructive", children: "*" })
|
||||
] }),
|
||||
fetchFailed ? /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
||||
Input,
|
||||
{
|
||||
id: "eventTypeSlug",
|
||||
value: eventTypeSlug,
|
||||
onChange: (e) => handleFieldChange("eventTypeSlug", e.target.value),
|
||||
placeholder: t("calcom.editor.eventType.fallbackPlaceholder", "30min"),
|
||||
className: "flex-1"
|
||||
}
|
||||
),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
||||
Button,
|
||||
{
|
||||
type: "button",
|
||||
size: "sm",
|
||||
variant: "outline",
|
||||
action: "retry",
|
||||
entity: "event-types",
|
||||
onClick: handleRetry,
|
||||
disabled: loadingEventTypes,
|
||||
"aria-label": t("calcom.editor.eventType.retryAria", "Retry loading event types"),
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(RefreshCw, { className: `h-4 w-4 ${loadingEventTypes ? "animate-spin" : ""}`, "aria-hidden": "true" }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "ml-1", children: t("calcom.editor.eventType.retryLabel", "Retry") })
|
||||
]
|
||||
}
|
||||
)
|
||||
] }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(Alert, { variant: "destructive", children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(AlertCircle, { className: "h-4 w-4", "aria-hidden": "true" }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(AlertDescription, { children: t("calcom.editor.eventType.fetchFailed", "Couldn't load event types from Cal.com. Enter the slug manually or retry.") })
|
||||
] })
|
||||
] }) : /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
||||
Select,
|
||||
{
|
||||
value: eventTypeSlug,
|
||||
onValueChange: (v) => handleFieldChange("eventTypeSlug", v),
|
||||
disabled: loadingEventTypes || !apiKeyConfigured || eventTypes.length === 0,
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, { "aria-label": t("calcom.editor.eventType.label", "Event Type"), children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectValue, { placeholder: selectPlaceholder }) }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(SelectContent, { children: eventTypes.map((et) => /* @__PURE__ */ jsxRuntimeExports.jsxs(SelectItem, { value: et.slug, children: [
|
||||
et.title,
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-muted-foreground", children: [
|
||||
" ",
|
||||
"(",
|
||||
et.slug,
|
||||
" · ",
|
||||
et.lengthInMinutes,
|
||||
"m)"
|
||||
] })
|
||||
] }, et.id)) })
|
||||
]
|
||||
}
|
||||
),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground", children: t("calcom.editor.eventType.help", "Fetched from your Cal.com account") })
|
||||
] })
|
||||
] }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-2", children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(Label, { htmlFor: "weeksToShow", children: t("calcom.editor.weeksToShow.label", "Weeks to Display") }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(Select, { value: String(getNumber("weeksToShow", 2)), onValueChange: (v) => handleFieldChange("weeksToShow", parseInt(v, 10)), children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, { "aria-label": t("calcom.editor.weeksToShow.label", "Weeks to Display"), children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectValue, { placeholder: t("calcom.editor.weeksToShow.placeholder", "Select weeks") }) }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(SelectContent, { children: [1, 2, 3, 4, 5, 6, 7, 8].map((n) => /* @__PURE__ */ jsxRuntimeExports.jsxs(SelectItem, { value: String(n), children: [
|
||||
n,
|
||||
" ",
|
||||
n > 1 ? t("calcom.editor.weeksToShow.unitPlural", "weeks") : t("calcom.editor.weeksToShow.unitSingular", "week")
|
||||
] }, n)) })
|
||||
] }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground", children: t("calcom.editor.weeksToShow.help", "How many weeks of dates to show in the calendar") })
|
||||
] }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between rounded-lg border p-3", children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-0.5", children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(Label, { children: t("calcom.editor.showTimezone.label", "Show Timezone Selector") }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground", children: t("calcom.editor.showTimezone.help", "Show a label above the date grid indicating which timezone times are displayed in.") })
|
||||
] }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
||||
Switch,
|
||||
{
|
||||
checked: getBool("showTimezone", true),
|
||||
onCheckedChange: (v) => handleFieldChange("showTimezone", v),
|
||||
"aria-label": t("calcom.editor.showTimezone.label", "Show Timezone Selector")
|
||||
}
|
||||
)
|
||||
] }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between rounded-lg border p-3", children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-0.5", children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(Label, { children: t("calcom.editor.captchaEnabled.label", "Enable captcha") }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground", children: t("calcom.editor.captchaEnabled.help", "Require visitors to solve a privacy-friendly proof-of-work captcha before booking (spam protection).") })
|
||||
] }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
||||
Switch,
|
||||
{
|
||||
checked: getBool("captchaEnabled", false),
|
||||
onCheckedChange: (v) => handleFieldChange("captchaEnabled", v),
|
||||
"aria-label": t("calcom.editor.captchaEnabled.label", "Enable captcha")
|
||||
}
|
||||
)
|
||||
] })
|
||||
] })
|
||||
] }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(Card, { children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(CardHeader, { children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(CardTitle, { className: "text-base", children: t("calcom.editor.status.title", "Configuration status") }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(CardDescription, { children: t("calcom.editor.status.description", "Quick check of the values needed before this block renders bookings.") })
|
||||
] }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(CardContent, { className: "space-y-2", children: [
|
||||
renderStatusRow(
|
||||
apiKeyReady,
|
||||
t("calcom.editor.status.apiKey", "API key configured"),
|
||||
!apiKeyReady ? /* @__PURE__ */ jsxRuntimeExports.jsx("a", { href: "/admin/plugins?plugin=calcomblock", className: "text-xs text-primary hover:underline", children: t("calcom.editor.status.apiKey.configureLink", "Configure") }) : null
|
||||
),
|
||||
renderStatusRow(usernameReady, t("calcom.editor.status.username", "Account resolved")),
|
||||
renderStatusRow(eventTypeReady, t("calcom.editor.status.eventType", "Event type selected")),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 text-sm", children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "inline-flex h-4 w-4 items-center justify-center text-muted-foreground", children: "·" }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-muted-foreground", children: t("calcom.editor.status.eventTypesAvailable", "{count} event types available").replace("{count}", String(eventTypes.length)) })
|
||||
] }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "pt-2", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
|
||||
Button,
|
||||
{
|
||||
type: "button",
|
||||
size: "sm",
|
||||
variant: "outline",
|
||||
action: "open",
|
||||
entity: "calcom-page",
|
||||
asChild: canOpenInCalcom,
|
||||
disabled: !canOpenInCalcom,
|
||||
"aria-label": t("calcom.editor.status.openExternalAria", "Open Cal.com booking page in a new tab"),
|
||||
children: canOpenInCalcom ? /* @__PURE__ */ jsxRuntimeExports.jsxs("a", { href: `https://cal.com/${calcomUsername}/${eventTypeSlug}`, target: "_blank", rel: "noopener noreferrer", children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(ExternalLink, { className: "h-4 w-4", "aria-hidden": "true" }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "ml-1", children: t("calcom.editor.status.openExternal", "Open in Cal.com") })
|
||||
] }) : /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(ExternalLink, { className: "h-4 w-4", "aria-hidden": "true" }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "ml-1", children: t("calcom.editor.status.openExternal", "Open in Cal.com") })
|
||||
] })
|
||||
}
|
||||
) })
|
||||
] })
|
||||
] })
|
||||
] }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(TabsContent, { value: "content", className: "space-y-4 mt-4", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Card, { children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(CardHeader, { children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(CardTitle, { className: "text-base", children: t("calcom.editor.section.content.title", "Widget Content") }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(CardDescription, { children: t("calcom.editor.section.content.description", "Customize the text shown in the booking widget") })
|
||||
] }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(CardContent, { className: "space-y-4", children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-2", children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(Label, { htmlFor: "title", children: t("calcom.editor.title.label", "Title") }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
||||
Input,
|
||||
{
|
||||
id: "title",
|
||||
value: getString("title"),
|
||||
onChange: (e) => handleFieldChange("title", e.target.value),
|
||||
placeholder: t("calcom.editor.title.placeholder", "Book a Meeting")
|
||||
}
|
||||
),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground", children: t("calcom.editor.title.help", "Main heading shown above the calendar") })
|
||||
] }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-2", children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(Label, { htmlFor: "description", children: t("calcom.editor.description.label", "Description") }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
||||
Textarea,
|
||||
{
|
||||
id: "description",
|
||||
value: getString("description"),
|
||||
onChange: (e) => handleFieldChange("description", e.target.value),
|
||||
placeholder: t("calcom.editor.description.placeholder", "Choose a convenient time for your consultation..."),
|
||||
rows: 3
|
||||
}
|
||||
),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground", children: t("calcom.editor.description.help", "Optional text shown below the title") })
|
||||
] }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-2", children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(Label, { htmlFor: "unavailableMessage", children: t("calcom.editor.unavailableMessage.label", "Booking unavailable message") }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
||||
Textarea,
|
||||
{
|
||||
id: "unavailableMessage",
|
||||
value: getString("unavailableMessage"),
|
||||
onChange: (e) => handleFieldChange("unavailableMessage", e.target.value),
|
||||
placeholder: t(
|
||||
"calcom.editor.unavailableMessage.placeholder",
|
||||
"Sorry — we couldn't complete your booking online. Please use our contact form and we'll get you booked in."
|
||||
),
|
||||
rows: 3
|
||||
}
|
||||
),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground", children: t("calcom.editor.unavailableMessage.help", "Shown if an online booking can't be completed. Leave blank to use the default.") })
|
||||
] })
|
||||
] })
|
||||
] }) })
|
||||
] }) });
|
||||
const [activeTab, setActiveTab] = useState("config");
|
||||
const [apiKeyConfigured, setApiKeyConfigured] = useState(null);
|
||||
const [calcomUsername, setCalcomUsername] = useState("");
|
||||
const [eventTypes, setEventTypes] = useState([]);
|
||||
const [loadingEventTypes, setLoadingEventTypes] = useState(false);
|
||||
const [fetchFailed, setFetchFailed] = useState(false);
|
||||
const [retryCounter, setRetryCounter] = useState(0);
|
||||
const handleFieldChange = useCallback(
|
||||
(field, value) => {
|
||||
onChange({ ...content, [field]: value });
|
||||
},
|
||||
[content, onChange],
|
||||
);
|
||||
const getString = (field, defaultValue = "") => {
|
||||
return content[field] || defaultValue;
|
||||
};
|
||||
const getNumber = (field, defaultValue = 0) => {
|
||||
const val = content[field];
|
||||
if (typeof val === "number") return val;
|
||||
if (typeof val === "string") return parseInt(val, 10) || defaultValue;
|
||||
return defaultValue;
|
||||
};
|
||||
const getBool = (field, defaultValue = false) => {
|
||||
const val = content[field];
|
||||
if (typeof val === "boolean") return val;
|
||||
return defaultValue;
|
||||
};
|
||||
const eventTypeSlug = getString("eventTypeSlug");
|
||||
useEffect(() => {
|
||||
fetch(`/api/plugins/calcomblock/settings`)
|
||||
.then((r) => r.json())
|
||||
.then((d) => {
|
||||
setApiKeyConfigured(!!d.api_key_configured);
|
||||
setCalcomUsername(d.username ?? "");
|
||||
})
|
||||
.catch(() => setApiKeyConfigured(false));
|
||||
}, []);
|
||||
useEffect(() => {
|
||||
if (calcomUsername && content.username !== calcomUsername) {
|
||||
onChange({ ...content, username: calcomUsername });
|
||||
}
|
||||
}, [calcomUsername, content, onChange]);
|
||||
useEffect(() => {
|
||||
if (!apiKeyConfigured) {
|
||||
setEventTypes([]);
|
||||
setFetchFailed(false);
|
||||
return;
|
||||
}
|
||||
const timer = setTimeout(() => {
|
||||
setLoadingEventTypes(true);
|
||||
setFetchFailed(false);
|
||||
fetch(`/api/plugins/calcomblock/event-types?username=${encodeURIComponent(calcomUsername)}`)
|
||||
.then((r) => r.json())
|
||||
.then((d) => {
|
||||
if (d.success) {
|
||||
setEventTypes(d.event_types ?? []);
|
||||
} else {
|
||||
setEventTypes([]);
|
||||
setFetchFailed(true);
|
||||
}
|
||||
})
|
||||
.catch(() => {
|
||||
setEventTypes([]);
|
||||
setFetchFailed(true);
|
||||
})
|
||||
.finally(() => setLoadingEventTypes(false));
|
||||
}, 300);
|
||||
return () => clearTimeout(timer);
|
||||
}, [apiKeyConfigured, calcomUsername, retryCounter]);
|
||||
const handleRetry = useCallback(() => {
|
||||
setRetryCounter((n) => n + 1);
|
||||
}, []);
|
||||
const selectPlaceholder = (() => {
|
||||
if (apiKeyConfigured === false) {
|
||||
return /* @__PURE__ */ jsxRuntimeExports.jsxs("span", {
|
||||
className: "inline-flex items-center gap-1.5 text-muted-foreground",
|
||||
children: [/* @__PURE__ */ jsxRuntimeExports.jsx(Key, { className: "h-3 w-3" }), t("calcom.editor.eventType.placeholder.noApiKey", "Configure API key first")],
|
||||
});
|
||||
}
|
||||
if (loadingEventTypes) {
|
||||
return /* @__PURE__ */ jsxRuntimeExports.jsxs("span", {
|
||||
className: "inline-flex items-center gap-1.5 text-muted-foreground",
|
||||
children: [/* @__PURE__ */ jsxRuntimeExports.jsx(Loader2, { className: "h-3 w-3 animate-spin" }), t("calcom.editor.eventType.placeholder.loading", "Loading…")],
|
||||
});
|
||||
}
|
||||
if (!calcomUsername) {
|
||||
return /* @__PURE__ */ jsxRuntimeExports.jsxs("span", {
|
||||
className: "inline-flex items-center gap-1.5 text-muted-foreground",
|
||||
children: [/* @__PURE__ */ jsxRuntimeExports.jsx(Loader2, { className: "h-3 w-3 animate-spin" }), t("calcom.editor.eventType.placeholder.resolvingUser", "Resolving account…")],
|
||||
});
|
||||
}
|
||||
if (eventTypes.length === 0) {
|
||||
return /* @__PURE__ */ jsxRuntimeExports.jsxs("span", {
|
||||
className: "inline-flex items-center gap-1.5 text-muted-foreground",
|
||||
children: [/* @__PURE__ */ jsxRuntimeExports.jsx(XCircle, { className: "h-3 w-3" }), t("calcom.editor.eventType.placeholder.noEventTypes", "No event types found")],
|
||||
});
|
||||
}
|
||||
return t("calcom.editor.eventType.placeholder.select", "Select event type");
|
||||
})();
|
||||
const apiKeyReady = apiKeyConfigured === true;
|
||||
const usernameReady = calcomUsername.length > 0;
|
||||
const eventTypeReady = eventTypeSlug.length > 0;
|
||||
const canOpenInCalcom = usernameReady && eventTypeReady;
|
||||
const renderStatusRow = (ok, label, action) =>
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", {
|
||||
className: "flex items-center gap-2 text-sm",
|
||||
children: [
|
||||
ok ?
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(CheckCircle2, { "className": "h-4 w-4 text-primary", "aria-hidden": "true" })
|
||||
: /* @__PURE__ */ jsxRuntimeExports.jsx(XCircle, { "className": "h-4 w-4 text-destructive", "aria-hidden": "true" }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: ok ? "text-foreground" : "text-muted-foreground", children: label }),
|
||||
action ? /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "ml-auto", children: action }) : null,
|
||||
],
|
||||
});
|
||||
return /* @__PURE__ */ jsxRuntimeExports.jsx("div", {
|
||||
className: "space-y-4",
|
||||
children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Tabs, {
|
||||
value: activeTab,
|
||||
onValueChange: setActiveTab,
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(TabsList, {
|
||||
className: "grid w-full grid-cols-2",
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(TabsTrigger, {
|
||||
value: "config",
|
||||
className: "gap-2",
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(Settings, { className: "h-4 w-4" }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: t("calcom.editor.tab.configuration", "Configuration") }),
|
||||
],
|
||||
}),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(TabsTrigger, {
|
||||
value: "content",
|
||||
className: "gap-2",
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(Edit3, { className: "h-4 w-4" }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: t("calcom.editor.tab.content", "Content") }),
|
||||
],
|
||||
}),
|
||||
],
|
||||
}),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(TabsContent, {
|
||||
value: "config",
|
||||
className: "space-y-4 mt-4",
|
||||
children: [
|
||||
apiKeyConfigured === false &&
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(Alert, {
|
||||
children: /* @__PURE__ */ jsxRuntimeExports.jsxs(AlertDescription, {
|
||||
children: [
|
||||
t("calcom.editor.alert.apiKeyMissing.prefix", "Configure your Cal.com API key in"),
|
||||
" ",
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("a", {
|
||||
href: "/admin/plugins?plugin=calcomblock",
|
||||
className: "text-primary hover:underline",
|
||||
children: t("calcom.editor.alert.apiKeyMissing.linkLabel", "plugin settings"),
|
||||
}),
|
||||
" ",
|
||||
t("calcom.editor.alert.apiKeyMissing.suffix", "to enable the event-type dropdown."),
|
||||
],
|
||||
}),
|
||||
}),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(Card, {
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(CardHeader, {
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(CardTitle, { className: "text-base", children: t("calcom.editor.section.config.title", "Cal.com Settings") }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(CardDescription, {
|
||||
children: t("calcom.editor.section.config.description", "Connect to your Cal.com account and select an event type"),
|
||||
}),
|
||||
],
|
||||
}),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(CardContent, {
|
||||
className: "space-y-4",
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", {
|
||||
className: "space-y-2",
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(Label, { children: t("calcom.editor.connectedAs.label", "Connected Account") }),
|
||||
renderConnectedAccount(apiKeyConfigured, calcomUsername),
|
||||
],
|
||||
}),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", {
|
||||
className: "space-y-2",
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(Label, {
|
||||
htmlFor: "eventTypeSlug",
|
||||
children: [
|
||||
t("calcom.editor.eventType.label", "Event Type"),
|
||||
" ",
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-destructive", children: "*" }),
|
||||
],
|
||||
}),
|
||||
fetchFailed ?
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, {
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", {
|
||||
className: "flex items-center gap-2",
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(Input, {
|
||||
id: "eventTypeSlug",
|
||||
value: eventTypeSlug,
|
||||
onChange: (e) => handleFieldChange("eventTypeSlug", e.target.value),
|
||||
placeholder: t("calcom.editor.eventType.fallbackPlaceholder", "30min"),
|
||||
className: "flex-1",
|
||||
}),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(Button, {
|
||||
"type": "button",
|
||||
"size": "sm",
|
||||
"variant": "outline",
|
||||
"action": "retry",
|
||||
"entity": "event-types",
|
||||
"onClick": handleRetry,
|
||||
"disabled": loadingEventTypes,
|
||||
"aria-label": t("calcom.editor.eventType.retryAria", "Retry loading event types"),
|
||||
"children": [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(RefreshCw, {
|
||||
"className": `h-4 w-4 ${loadingEventTypes ? "animate-spin" : ""}`,
|
||||
"aria-hidden": "true",
|
||||
}),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("span", {
|
||||
className: "ml-1",
|
||||
children: t("calcom.editor.eventType.retryLabel", "Retry"),
|
||||
}),
|
||||
],
|
||||
}),
|
||||
],
|
||||
}),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(Alert, {
|
||||
variant: "destructive",
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(AlertCircle, { "className": "h-4 w-4", "aria-hidden": "true" }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(AlertDescription, {
|
||||
children: t("calcom.editor.eventType.fetchFailed", "Couldn't load event types from Cal.com. Enter the slug manually or retry."),
|
||||
}),
|
||||
],
|
||||
}),
|
||||
],
|
||||
})
|
||||
: /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, {
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(Select, {
|
||||
value: eventTypeSlug,
|
||||
onValueChange: (v) => handleFieldChange("eventTypeSlug", v),
|
||||
disabled: loadingEventTypes || !apiKeyConfigured || eventTypes.length === 0,
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, {
|
||||
"aria-label": t("calcom.editor.eventType.label", "Event Type"),
|
||||
"children": /* @__PURE__ */ jsxRuntimeExports.jsx(SelectValue, { placeholder: selectPlaceholder }),
|
||||
}),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(SelectContent, {
|
||||
children: eventTypes.map((et) =>
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
||||
SelectItem,
|
||||
{
|
||||
value: et.slug,
|
||||
children: [
|
||||
et.title,
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs("span", {
|
||||
className: "text-muted-foreground",
|
||||
children: [" ", "(", et.slug, " · ", et.lengthInMinutes, "m)"],
|
||||
}),
|
||||
],
|
||||
},
|
||||
et.id,
|
||||
),
|
||||
),
|
||||
}),
|
||||
],
|
||||
}),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("p", {
|
||||
className: "text-xs text-muted-foreground",
|
||||
children: t("calcom.editor.eventType.help", "Fetched from your Cal.com account"),
|
||||
}),
|
||||
],
|
||||
}),
|
||||
],
|
||||
}),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", {
|
||||
className: "space-y-2",
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(Label, { htmlFor: "weeksToShow", children: t("calcom.editor.weeksToShow.label", "Weeks to Display") }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(Select, {
|
||||
value: String(getNumber("weeksToShow", 2)),
|
||||
onValueChange: (v) => handleFieldChange("weeksToShow", parseInt(v, 10)),
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, {
|
||||
"aria-label": t("calcom.editor.weeksToShow.label", "Weeks to Display"),
|
||||
"children": /* @__PURE__ */ jsxRuntimeExports.jsx(SelectValue, { placeholder: t("calcom.editor.weeksToShow.placeholder", "Select weeks") }),
|
||||
}),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(SelectContent, {
|
||||
children: [1, 2, 3, 4, 5, 6, 7, 8].map((n) =>
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
||||
SelectItem,
|
||||
{
|
||||
value: String(n),
|
||||
children: [
|
||||
n,
|
||||
" ",
|
||||
n > 1 ? t("calcom.editor.weeksToShow.unitPlural", "weeks") : t("calcom.editor.weeksToShow.unitSingular", "week"),
|
||||
],
|
||||
},
|
||||
n,
|
||||
),
|
||||
),
|
||||
}),
|
||||
],
|
||||
}),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("p", {
|
||||
className: "text-xs text-muted-foreground",
|
||||
children: t("calcom.editor.weeksToShow.help", "How many weeks of dates to show in the calendar"),
|
||||
}),
|
||||
],
|
||||
}),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", {
|
||||
className: "flex items-center justify-between rounded-lg border p-3",
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", {
|
||||
className: "space-y-0.5",
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(Label, { children: t("calcom.editor.showTimezone.label", "Show Timezone Selector") }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("p", {
|
||||
className: "text-xs text-muted-foreground",
|
||||
children: t("calcom.editor.showTimezone.help", "Show a label above the date grid indicating which timezone times are displayed in."),
|
||||
}),
|
||||
],
|
||||
}),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(Switch, {
|
||||
"checked": getBool("showTimezone", true),
|
||||
"onCheckedChange": (v) => handleFieldChange("showTimezone", v),
|
||||
"aria-label": t("calcom.editor.showTimezone.label", "Show Timezone Selector"),
|
||||
}),
|
||||
],
|
||||
}),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", {
|
||||
className: "flex items-center justify-between rounded-lg border p-3",
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", {
|
||||
className: "space-y-0.5",
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(Label, { children: t("calcom.editor.captchaEnabled.label", "Enable captcha") }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("p", {
|
||||
className: "text-xs text-muted-foreground",
|
||||
children: t(
|
||||
"calcom.editor.captchaEnabled.help",
|
||||
"Require visitors to solve a privacy-friendly proof-of-work captcha before booking (spam protection).",
|
||||
),
|
||||
}),
|
||||
],
|
||||
}),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(Switch, {
|
||||
"checked": getBool("captchaEnabled", false),
|
||||
"onCheckedChange": (v) => handleFieldChange("captchaEnabled", v),
|
||||
"aria-label": t("calcom.editor.captchaEnabled.label", "Enable captcha"),
|
||||
}),
|
||||
],
|
||||
}),
|
||||
],
|
||||
}),
|
||||
],
|
||||
}),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(Card, {
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(CardHeader, {
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(CardTitle, { className: "text-base", children: t("calcom.editor.status.title", "Configuration status") }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(CardDescription, {
|
||||
children: t("calcom.editor.status.description", "Quick check of the values needed before this block renders bookings."),
|
||||
}),
|
||||
],
|
||||
}),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(CardContent, {
|
||||
className: "space-y-2",
|
||||
children: [
|
||||
renderStatusRow(
|
||||
apiKeyReady,
|
||||
t("calcom.editor.status.apiKey", "API key configured"),
|
||||
!apiKeyReady ?
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("a", {
|
||||
href: "/admin/plugins?plugin=calcomblock",
|
||||
className: "text-xs text-primary hover:underline",
|
||||
children: t("calcom.editor.status.apiKey.configureLink", "Configure"),
|
||||
})
|
||||
: null,
|
||||
),
|
||||
renderStatusRow(usernameReady, t("calcom.editor.status.username", "Account resolved")),
|
||||
renderStatusRow(eventTypeReady, t("calcom.editor.status.eventType", "Event type selected")),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", {
|
||||
className: "flex items-center gap-2 text-sm",
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "inline-flex h-4 w-4 items-center justify-center text-muted-foreground", children: "·" }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("span", {
|
||||
className: "text-muted-foreground",
|
||||
children: t("calcom.editor.status.eventTypesAvailable", "{count} event types available").replace("{count}", String(eventTypes.length)),
|
||||
}),
|
||||
],
|
||||
}),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("div", {
|
||||
className: "pt-2",
|
||||
children: /* @__PURE__ */ jsxRuntimeExports.jsx(Button, {
|
||||
"type": "button",
|
||||
"size": "sm",
|
||||
"variant": "outline",
|
||||
"action": "open",
|
||||
"entity": "calcom-page",
|
||||
"asChild": canOpenInCalcom,
|
||||
"disabled": !canOpenInCalcom,
|
||||
"aria-label": t("calcom.editor.status.openExternalAria", "Open Cal.com booking page in a new tab"),
|
||||
"children":
|
||||
canOpenInCalcom ?
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs("a", {
|
||||
href: `https://cal.com/${calcomUsername}/${eventTypeSlug}`,
|
||||
target: "_blank",
|
||||
rel: "noopener noreferrer",
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(ExternalLink, { "className": "h-4 w-4", "aria-hidden": "true" }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("span", {
|
||||
className: "ml-1",
|
||||
children: t("calcom.editor.status.openExternal", "Open in Cal.com"),
|
||||
}),
|
||||
],
|
||||
})
|
||||
: /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, {
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(ExternalLink, { "className": "h-4 w-4", "aria-hidden": "true" }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("span", {
|
||||
className: "ml-1",
|
||||
children: t("calcom.editor.status.openExternal", "Open in Cal.com"),
|
||||
}),
|
||||
],
|
||||
}),
|
||||
}),
|
||||
}),
|
||||
],
|
||||
}),
|
||||
],
|
||||
}),
|
||||
],
|
||||
}),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(TabsContent, {
|
||||
value: "content",
|
||||
className: "space-y-4 mt-4",
|
||||
children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Card, {
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(CardHeader, {
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(CardTitle, { className: "text-base", children: t("calcom.editor.section.content.title", "Widget Content") }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(CardDescription, {
|
||||
children: t("calcom.editor.section.content.description", "Customize the text shown in the booking widget"),
|
||||
}),
|
||||
],
|
||||
}),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(CardContent, {
|
||||
className: "space-y-4",
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", {
|
||||
className: "space-y-2",
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(Label, { htmlFor: "title", children: t("calcom.editor.title.label", "Title") }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(Input, {
|
||||
id: "title",
|
||||
value: getString("title"),
|
||||
onChange: (e) => handleFieldChange("title", e.target.value),
|
||||
placeholder: t("calcom.editor.title.placeholder", "Book a Meeting"),
|
||||
}),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("p", {
|
||||
className: "text-xs text-muted-foreground",
|
||||
children: t("calcom.editor.title.help", "Main heading shown above the calendar"),
|
||||
}),
|
||||
],
|
||||
}),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", {
|
||||
className: "space-y-2",
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(Label, { htmlFor: "description", children: t("calcom.editor.description.label", "Description") }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(Textarea, {
|
||||
id: "description",
|
||||
value: getString("description"),
|
||||
onChange: (e) => handleFieldChange("description", e.target.value),
|
||||
placeholder: t("calcom.editor.description.placeholder", "Choose a convenient time for your consultation..."),
|
||||
rows: 3,
|
||||
}),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("p", {
|
||||
className: "text-xs text-muted-foreground",
|
||||
children: t("calcom.editor.description.help", "Optional text shown below the title"),
|
||||
}),
|
||||
],
|
||||
}),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", {
|
||||
className: "space-y-2",
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(Label, {
|
||||
htmlFor: "unavailableMessage",
|
||||
children: t("calcom.editor.unavailableMessage.label", "Booking unavailable message"),
|
||||
}),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(Textarea, {
|
||||
id: "unavailableMessage",
|
||||
value: getString("unavailableMessage"),
|
||||
onChange: (e) => handleFieldChange("unavailableMessage", e.target.value),
|
||||
placeholder: t(
|
||||
"calcom.editor.unavailableMessage.placeholder",
|
||||
"Sorry — we couldn't complete your booking online. Please use our contact form and we'll get you booked in.",
|
||||
),
|
||||
rows: 3,
|
||||
}),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("p", {
|
||||
className: "text-xs text-muted-foreground",
|
||||
children: t("calcom.editor.unavailableMessage.help", "Shown if an online booking can't be completed. Leave blank to use the default."),
|
||||
}),
|
||||
],
|
||||
}),
|
||||
],
|
||||
}),
|
||||
],
|
||||
}),
|
||||
}),
|
||||
],
|
||||
}),
|
||||
});
|
||||
}
|
||||
|
||||
export { CalcomBlockEditor as default };
|
||||
|
||||
@ -1,384 +1,619 @@
|
||||
import { importShared } from './__federation_fn_import-hlt2XzeI.js';
|
||||
import { j as jsxRuntimeExports } from './jsx-runtime-CvJTHeKY.js';
|
||||
import { importShared } from "./__federation_fn_import-hlt2XzeI.js";
|
||||
import { j as jsxRuntimeExports } from "./jsx-runtime-CvJTHeKY.js";
|
||||
|
||||
const {useState,useCallback,useEffect} = await importShared('react');
|
||||
const { useState, useCallback, useEffect } = await importShared("react");
|
||||
|
||||
const {Card,CardContent,CardDescription,CardHeader,CardTitle,Input,Label,Button,Alert,AlertDescription,Badge,ScrollArea,Loader2,CheckCircle2,XCircle,AlertCircle,Eye,EyeOff,Key,Zap,Settings,Send,Copy,RefreshCw,toast,t,useAlertDialog} = await importShared('@block-ninja/ui');
|
||||
const {
|
||||
Card,
|
||||
CardContent,
|
||||
CardDescription,
|
||||
CardHeader,
|
||||
CardTitle,
|
||||
Input,
|
||||
Label,
|
||||
Button,
|
||||
Alert,
|
||||
AlertDescription,
|
||||
Badge,
|
||||
ScrollArea,
|
||||
Loader2,
|
||||
CheckCircle2,
|
||||
XCircle,
|
||||
AlertCircle,
|
||||
Eye,
|
||||
EyeOff,
|
||||
Key,
|
||||
Zap,
|
||||
Settings,
|
||||
Send,
|
||||
Copy,
|
||||
RefreshCw,
|
||||
toast,
|
||||
t,
|
||||
useAlertDialog,
|
||||
} = await importShared("@block-ninja/ui");
|
||||
|
||||
const copyToClipboard = async (text) => {
|
||||
if (!text) return;
|
||||
try {
|
||||
await navigator.clipboard.writeText(text);
|
||||
toast.success(t("calcom.settings.copied", "Copied to clipboard"));
|
||||
} catch (_error) {
|
||||
toast.error(t("calcom.settings.copyFailed", "Could not copy to clipboard"));
|
||||
}
|
||||
if (!text) return;
|
||||
try {
|
||||
await navigator.clipboard.writeText(text);
|
||||
toast.success(t("calcom.settings.copied", "Copied to clipboard"));
|
||||
} catch (_error) {
|
||||
toast.error(t("calcom.settings.copyFailed", "Could not copy to clipboard"));
|
||||
}
|
||||
};
|
||||
const formatRelativeTime = (iso) => {
|
||||
const parsed = Date.parse(iso);
|
||||
if (Number.isNaN(parsed)) return iso;
|
||||
const diffMs = Date.now() - parsed;
|
||||
const minutes = Math.round(diffMs / 6e4);
|
||||
if (minutes < 1) return t("calcom.settings.relative.justNow", "just now");
|
||||
if (minutes < 60) {
|
||||
return minutes === 1 ? t("calcom.settings.relative.minute", "1 minute ago") : t("calcom.settings.relative.minutes", "{count} minutes ago").replace("{count}", String(minutes));
|
||||
}
|
||||
const hours = Math.round(minutes / 60);
|
||||
if (hours < 24) {
|
||||
return hours === 1 ? t("calcom.settings.relative.hour", "1 hour ago") : t("calcom.settings.relative.hours", "{count} hours ago").replace("{count}", String(hours));
|
||||
}
|
||||
const days = Math.round(hours / 24);
|
||||
return days === 1 ? t("calcom.settings.relative.day", "1 day ago") : t("calcom.settings.relative.days", "{count} days ago").replace("{count}", String(days));
|
||||
const parsed = Date.parse(iso);
|
||||
if (Number.isNaN(parsed)) return iso;
|
||||
const diffMs = Date.now() - parsed;
|
||||
const minutes = Math.round(diffMs / 6e4);
|
||||
if (minutes < 1) return t("calcom.settings.relative.justNow", "just now");
|
||||
if (minutes < 60) {
|
||||
return minutes === 1 ? t("calcom.settings.relative.minute", "1 minute ago") : t("calcom.settings.relative.minutes", "{count} minutes ago").replace("{count}", String(minutes));
|
||||
}
|
||||
const hours = Math.round(minutes / 60);
|
||||
if (hours < 24) {
|
||||
return hours === 1 ? t("calcom.settings.relative.hour", "1 hour ago") : t("calcom.settings.relative.hours", "{count} hours ago").replace("{count}", String(hours));
|
||||
}
|
||||
const days = Math.round(hours / 24);
|
||||
return days === 1 ? t("calcom.settings.relative.day", "1 day ago") : t("calcom.settings.relative.days", "{count} days ago").replace("{count}", String(days));
|
||||
};
|
||||
function CalcomSettings({ pluginName }) {
|
||||
const { confirm } = useAlertDialog();
|
||||
const [apiKey, setApiKey] = useState("");
|
||||
const [showApiKey, setShowApiKey] = useState(false);
|
||||
const [loading, setLoading] = useState(true);
|
||||
const [saving, setSaving] = useState(false);
|
||||
const [testing, setTesting] = useState(false);
|
||||
const [rotating, setRotating] = useState(false);
|
||||
const [showSecret, setShowSecret] = useState(false);
|
||||
const [settings, setSettings] = useState(null);
|
||||
const [testResult, setTestResult] = useState(null);
|
||||
const [saveMessage, setSaveMessage] = useState(null);
|
||||
const baseUrl = `/api/plugins/${pluginName}`;
|
||||
const loadSettings = useCallback(async () => {
|
||||
try {
|
||||
const res = await fetch(`${baseUrl}/settings`);
|
||||
if (res.ok) {
|
||||
const data = await res.json();
|
||||
setSettings(data);
|
||||
}
|
||||
} catch (_error) {
|
||||
console.error("Failed to load settings");
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
}, [baseUrl]);
|
||||
useEffect(() => {
|
||||
loadSettings();
|
||||
}, [loadSettings]);
|
||||
const handleSave = async () => {
|
||||
if (!apiKey.trim()) {
|
||||
setSaveMessage({ type: "error", text: t("calcom.settings.apiKey.errorEmpty", "Please enter an API key") });
|
||||
return;
|
||||
}
|
||||
setSaving(true);
|
||||
setSaveMessage(null);
|
||||
setTestResult(null);
|
||||
try {
|
||||
const res = await fetch(`${baseUrl}/settings`, {
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/json" },
|
||||
body: JSON.stringify({ api_key: apiKey })
|
||||
});
|
||||
if (res.ok) {
|
||||
await loadSettings();
|
||||
setApiKey("");
|
||||
setSaveMessage({ type: "success", text: t("calcom.settings.apiKey.saved", "API key saved successfully") });
|
||||
} else {
|
||||
const text = await res.text();
|
||||
setSaveMessage({ type: "error", text: text || t("calcom.settings.apiKey.saveFailed", "Failed to save API key") });
|
||||
}
|
||||
} catch (_error) {
|
||||
setSaveMessage({ type: "error", text: t("calcom.settings.serverError", "Failed to connect to server") });
|
||||
} finally {
|
||||
setSaving(false);
|
||||
}
|
||||
};
|
||||
const handleTest = async () => {
|
||||
setTesting(true);
|
||||
setTestResult(null);
|
||||
try {
|
||||
const res = await fetch(`${baseUrl}/test`, { method: "POST" });
|
||||
const data = await res.json();
|
||||
setTestResult(data);
|
||||
} catch (_error) {
|
||||
setTestResult({ success: false, error: t("calcom.settings.serverError", "Failed to connect to server") });
|
||||
} finally {
|
||||
setTesting(false);
|
||||
}
|
||||
};
|
||||
const handleClear = async () => {
|
||||
setSaving(true);
|
||||
setSaveMessage(null);
|
||||
try {
|
||||
const res = await fetch(`${baseUrl}/settings`, {
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/json" },
|
||||
body: JSON.stringify({ api_key: "" })
|
||||
});
|
||||
if (res.ok) {
|
||||
await loadSettings();
|
||||
setTestResult(null);
|
||||
setSaveMessage({ type: "success", text: t("calcom.settings.apiKey.removed", "API key removed") });
|
||||
}
|
||||
} catch (_error) {
|
||||
setSaveMessage({ type: "error", text: t("calcom.settings.apiKey.clearFailed", "Failed to clear API key") });
|
||||
} finally {
|
||||
setSaving(false);
|
||||
}
|
||||
};
|
||||
const handleRotate = async () => {
|
||||
const confirmed = await confirm({
|
||||
title: t("calcom.settings.webhook.rotateConfirmTitle", "Rotate webhook secret?"),
|
||||
message: t("calcom.settings.webhook.rotateConfirmMessage", "This invalidates the existing secret immediately. You'll need to update Cal.com to keep webhooks flowing."),
|
||||
confirmLabel: t("calcom.settings.webhook.rotateConfirmLabel", "Rotate"),
|
||||
variant: "destructive"
|
||||
});
|
||||
if (!confirmed) return;
|
||||
setRotating(true);
|
||||
setSaveMessage(null);
|
||||
try {
|
||||
const res = await fetch(`${baseUrl}/settings/rotate-webhook-secret`, { method: "POST" });
|
||||
if (res.ok) {
|
||||
const data = await res.json();
|
||||
setSettings((prev) => prev ? { ...prev, webhook_secret_masked: data.webhook_secret_masked, webhook_secret_configured: true } : prev);
|
||||
const successMsg = t("calcom.settings.webhook.rotated", "Webhook secret rotated. Update it in Cal.com.");
|
||||
setSaveMessage({ type: "success", text: successMsg });
|
||||
toast.success(successMsg);
|
||||
} else {
|
||||
setSaveMessage({ type: "error", text: t("calcom.settings.webhook.rotateFailed", "Failed to rotate webhook secret") });
|
||||
}
|
||||
} catch (_error) {
|
||||
setSaveMessage({ type: "error", text: t("calcom.settings.serverError", "Failed to connect to server") });
|
||||
} finally {
|
||||
setRotating(false);
|
||||
}
|
||||
};
|
||||
if (loading) {
|
||||
return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center justify-center py-8", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Loader2, { className: "h-6 w-6 animate-spin text-muted-foreground" }) });
|
||||
}
|
||||
const apiKeyVisibilityLabel = showApiKey ? t("calcom.settings.toggleVisibility.hide", "Hide") : t("calcom.settings.toggleVisibility.show", "Show");
|
||||
const secretVisibilityLabel = showSecret ? t("calcom.settings.toggleVisibility.hide", "Hide") : t("calcom.settings.toggleVisibility.show", "Show");
|
||||
return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-6", children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs("h2", { className: "text-xl font-semibold flex items-center gap-2", children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(Settings, { className: "h-5 w-5" }),
|
||||
t("calcom.settings.heading", "Cal.com Integration")
|
||||
] }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-muted-foreground", children: t("calcom.settings.headingDescription", "Configure your Cal.com API key to enable booking functionality") })
|
||||
] }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(Card, { children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(CardHeader, { children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(CardTitle, { className: "text-base flex items-center gap-2", children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(Key, { className: "h-4 w-4" }),
|
||||
t("calcom.settings.apiKey.title", "API Key Status")
|
||||
] }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(CardDescription, { children: t("calcom.settings.apiKey.description", "Your Cal.com API key is required for the booking widget to function") })
|
||||
] }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(CardContent, { className: "space-y-4", children: [
|
||||
settings?.api_key_configured ? /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between rounded-lg border bg-muted/30 p-3", children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-3", children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(Badge, { variant: "default", className: "gap-1.5", children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(CheckCircle2, { className: "h-3.5 w-3.5" }),
|
||||
t("calcom.settings.apiKey.configuredLabel", "Configured")
|
||||
] }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground font-mono", children: settings.api_key_masked || t("calcom.settings.apiKey.maskedFallback", "***configured***") })
|
||||
] }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(Button, { action: "delete", entity: "plugin-setting", variant: "ghost", size: "sm", onClick: handleClear, disabled: saving, children: t("calcom.settings.apiKey.remove", "Remove") })
|
||||
] }) : /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-3 rounded-lg border bg-muted/30 p-3", children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(Badge, { variant: "outline", className: "gap-1.5", children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(XCircle, { className: "h-3.5 w-3.5" }),
|
||||
t("calcom.settings.apiKey.notConfiguredLabel", "Not configured")
|
||||
] }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground", children: t("calcom.settings.apiKey.notConfiguredHelp", "Enter your Cal.com API key below to enable booking") })
|
||||
] }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-2", children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(Label, { htmlFor: "apiKey", children: settings?.api_key_configured ? t("calcom.settings.apiKey.updateLabel", "Update API Key") : t("calcom.settings.apiKey.label", "API Key") }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex gap-2", children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "relative flex-1", children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
||||
Input,
|
||||
{
|
||||
id: "apiKey",
|
||||
type: showApiKey ? "text" : "password",
|
||||
value: apiKey,
|
||||
onChange: (e) => setApiKey(e.target.value),
|
||||
placeholder: t("calcom.settings.apiKey.placeholder", "cal_live_..."),
|
||||
className: "pr-10"
|
||||
}
|
||||
),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
||||
Button,
|
||||
{
|
||||
type: "button",
|
||||
variant: "ghost",
|
||||
action: "toggle",
|
||||
entity: "api-key-visibility",
|
||||
onClick: () => setShowApiKey(!showApiKey),
|
||||
"aria-label": apiKeyVisibilityLabel,
|
||||
className: "absolute right-3 top-1/2 -translate-y-1/2 h-auto p-0 text-muted-foreground hover:bg-transparent hover:text-foreground",
|
||||
children: showApiKey ? /* @__PURE__ */ jsxRuntimeExports.jsx(EyeOff, { className: "h-4 w-4" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(Eye, { className: "h-4 w-4" })
|
||||
}
|
||||
)
|
||||
] }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(Button, { action: "save", entity: "plugin-setting", onClick: handleSave, disabled: saving || !apiKey.trim(), children: saving ? /* @__PURE__ */ jsxRuntimeExports.jsx(Loader2, { className: "h-4 w-4 animate-spin" }) : t("calcom.settings.apiKey.save", "Save") })
|
||||
] }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-xs text-muted-foreground", children: [
|
||||
t("calcom.settings.apiKey.helpPrefix", "Get your API key from"),
|
||||
" ",
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("a", { href: "https://app.cal.com/settings/developer/api-keys", target: "_blank", rel: "noopener noreferrer", className: "text-primary hover:underline", children: t("calcom.settings.apiKey.helpLink", "Cal.com API Settings") })
|
||||
] })
|
||||
] }),
|
||||
saveMessage && /* @__PURE__ */ jsxRuntimeExports.jsx(Alert, { variant: saveMessage.type === "error" ? "destructive" : "default", children: /* @__PURE__ */ jsxRuntimeExports.jsx(AlertDescription, { children: saveMessage.text }) })
|
||||
] })
|
||||
] }),
|
||||
settings?.api_key_configured && /* @__PURE__ */ jsxRuntimeExports.jsxs(Card, { children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(CardHeader, { children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(CardTitle, { className: "text-base flex items-center gap-2", children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(Zap, { className: "h-4 w-4" }),
|
||||
t("calcom.settings.test.title", "Test Connection")
|
||||
] }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(CardDescription, { children: t("calcom.settings.test.description", "Verify your API key works and see available event types") })
|
||||
] }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(CardContent, { className: "space-y-4", children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(Button, { action: "settings", entity: "plugin-connection", onClick: handleTest, disabled: testing, children: testing ? /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin" }),
|
||||
t("calcom.settings.test.testing", "Testing...")
|
||||
] }) : t("calcom.settings.test.button", "Test Connection") }),
|
||||
testResult && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "space-y-3", children: testResult.success ? /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(Alert, { children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(CheckCircle2, { className: "h-4 w-4 text-success" }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(AlertDescription, { className: "ml-2", children: [
|
||||
t("calcom.settings.test.successPrefix", "Connection successful! Found"),
|
||||
" ",
|
||||
testResult.event_types?.length || 0,
|
||||
" ",
|
||||
t("calcom.settings.test.successSuffix", "event types.")
|
||||
] })
|
||||
] }),
|
||||
testResult.event_types && testResult.event_types.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsx(ScrollArea, { className: "max-h-96 rounded-lg border", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("table", { className: "w-full text-sm", children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("thead", { className: "bg-muted", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("tr", { children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("th", { className: "text-left px-3 py-2 font-medium", children: t("calcom.settings.test.tableEventType", "Event Type") }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("th", { className: "text-left px-3 py-2 font-medium", children: t("calcom.settings.test.tableSlug", "Slug") })
|
||||
] }) }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("tbody", { children: testResult.event_types.map((et) => /* @__PURE__ */ jsxRuntimeExports.jsxs("tr", { className: "border-t", children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "px-3 py-2", children: et.title }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "px-3 py-2 font-mono text-xs", children: et.slug })
|
||||
] }, et.id)) })
|
||||
] }) })
|
||||
] }) : /* @__PURE__ */ jsxRuntimeExports.jsxs(Alert, { variant: "destructive", children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(XCircle, { className: "h-4 w-4" }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(AlertDescription, { className: "ml-2", children: testResult.error || t("calcom.settings.test.failure", "Connection failed") })
|
||||
] }) })
|
||||
] })
|
||||
] }),
|
||||
settings?.api_key_configured && /* @__PURE__ */ jsxRuntimeExports.jsxs(Card, { children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(CardHeader, { children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(CardTitle, { className: "text-base flex items-center gap-2", children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(Send, { className: "h-4 w-4" }),
|
||||
t("calcom.settings.webhook.title", "Webhook")
|
||||
] }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(CardDescription, { children: t("calcom.settings.webhook.description", "Configure this URL in Cal.com → Settings → Developer → Webhooks to receive booking events.") })
|
||||
] }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(CardContent, { className: "space-y-4", children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-2", children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(Label, { htmlFor: "webhookUrl", children: t("calcom.settings.webhook.urlLabel", "Webhook URL") }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex gap-2", children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(Input, { id: "webhookUrl", readOnly: true, value: settings?.webhook_url || "", className: "flex-1 font-mono text-xs" }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
||||
Button,
|
||||
{
|
||||
action: "copy",
|
||||
entity: "webhook-url",
|
||||
variant: "outline",
|
||||
size: "sm",
|
||||
"aria-label": t("calcom.settings.webhook.copyUrl", "Copy webhook URL"),
|
||||
onClick: () => copyToClipboard(settings?.webhook_url || ""),
|
||||
children: /* @__PURE__ */ jsxRuntimeExports.jsx(Copy, { className: "h-4 w-4" })
|
||||
}
|
||||
)
|
||||
] })
|
||||
] }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-2", children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(Label, { htmlFor: "webhookSecret", children: t("calcom.settings.webhook.secretLabel", "Webhook Secret") }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex gap-2", children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "relative flex-1", children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
||||
Input,
|
||||
{
|
||||
id: "webhookSecret",
|
||||
type: showSecret ? "text" : "password",
|
||||
readOnly: true,
|
||||
value: settings?.webhook_secret_masked || t("calcom.settings.webhook.secretNotConfigured", "Not configured"),
|
||||
className: "pr-10 font-mono text-xs"
|
||||
}
|
||||
),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
||||
Button,
|
||||
{
|
||||
type: "button",
|
||||
variant: "ghost",
|
||||
action: "toggle",
|
||||
entity: "webhook-secret-visibility",
|
||||
onClick: () => setShowSecret(!showSecret),
|
||||
"aria-label": secretVisibilityLabel,
|
||||
className: "absolute right-3 top-1/2 -translate-y-1/2 h-auto p-0 text-muted-foreground hover:bg-transparent hover:text-foreground",
|
||||
children: showSecret ? /* @__PURE__ */ jsxRuntimeExports.jsx(EyeOff, { className: "h-4 w-4" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(Eye, { className: "h-4 w-4" })
|
||||
}
|
||||
)
|
||||
] }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
||||
Button,
|
||||
{
|
||||
action: "copy",
|
||||
entity: "webhook-secret",
|
||||
variant: "outline",
|
||||
size: "sm",
|
||||
"aria-label": t("calcom.settings.webhook.copySecret", "Copy webhook secret"),
|
||||
onClick: () => copyToClipboard(settings?.webhook_secret_masked || ""),
|
||||
children: /* @__PURE__ */ jsxRuntimeExports.jsx(Copy, { className: "h-4 w-4" })
|
||||
}
|
||||
),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
||||
Button,
|
||||
{
|
||||
action: "rotate",
|
||||
entity: "webhook-secret",
|
||||
variant: "outline",
|
||||
size: "sm",
|
||||
"aria-label": t("calcom.settings.webhook.rotate", "Rotate webhook secret"),
|
||||
onClick: handleRotate,
|
||||
disabled: rotating,
|
||||
children: rotating ? /* @__PURE__ */ jsxRuntimeExports.jsx(Loader2, { className: "h-4 w-4 animate-spin" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(RefreshCw, { className: "h-4 w-4" })
|
||||
}
|
||||
)
|
||||
] }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground", children: t(
|
||||
"calcom.settings.webhook.secretHelp",
|
||||
"Cal.com displays the secret only once. Regenerating invalidates the previous value immediately — update it in Cal.com after rotating."
|
||||
) })
|
||||
] }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm", children: settings?.last_event_at ? /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 text-foreground", children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(CheckCircle2, { className: "h-4 w-4 text-success" }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs("span", { children: [
|
||||
t("calcom.settings.webhook.lastEventPrefix", "Last event"),
|
||||
" ",
|
||||
formatRelativeTime(settings.last_event_at),
|
||||
settings.last_event_type && /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
|
||||
" — ",
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("code", { className: "font-mono text-xs", children: settings.last_event_type })
|
||||
] })
|
||||
] })
|
||||
] }) : /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 text-muted-foreground", children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(AlertCircle, { className: "h-4 w-4" }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: t("calcom.settings.webhook.waitingForEvent", "Status: Waiting for first event") })
|
||||
] }) })
|
||||
] })
|
||||
] }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(Card, { children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(CardHeader, { children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(CardTitle, { className: "text-base", children: t("calcom.settings.docs.title", "Documentation") }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(CardDescription, { children: t("calcom.settings.docs.description", "Reference material for working with the Cal.com plugin.") })
|
||||
] }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(CardContent, { className: "space-y-2 text-sm", children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("a", { href: "https://cal.com/docs/api-reference/v2", target: "_blank", rel: "noopener noreferrer", className: "text-primary hover:underline block", children: t("calcom.settings.docs.calcomApi", "Cal.com API documentation") }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("a", { href: "/admin/docs/calcom-plugin", target: "_blank", rel: "noopener noreferrer", className: "text-primary hover:underline block", children: t("calcom.settings.docs.pluginGuide", "BlockNinja plugin guide") })
|
||||
] })
|
||||
] })
|
||||
] });
|
||||
const { confirm } = useAlertDialog();
|
||||
const [apiKey, setApiKey] = useState("");
|
||||
const [showApiKey, setShowApiKey] = useState(false);
|
||||
const [loading, setLoading] = useState(true);
|
||||
const [saving, setSaving] = useState(false);
|
||||
const [testing, setTesting] = useState(false);
|
||||
const [rotating, setRotating] = useState(false);
|
||||
const [showSecret, setShowSecret] = useState(false);
|
||||
const [settings, setSettings] = useState(null);
|
||||
const [testResult, setTestResult] = useState(null);
|
||||
const [saveMessage, setSaveMessage] = useState(null);
|
||||
const baseUrl = `/api/plugins/${pluginName}`;
|
||||
const loadSettings = useCallback(async () => {
|
||||
try {
|
||||
const res = await fetch(`${baseUrl}/settings`);
|
||||
if (res.ok) {
|
||||
const data = await res.json();
|
||||
setSettings(data);
|
||||
}
|
||||
} catch (_error) {
|
||||
console.error("Failed to load settings");
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
}, [baseUrl]);
|
||||
useEffect(() => {
|
||||
loadSettings();
|
||||
}, [loadSettings]);
|
||||
const handleSave = async () => {
|
||||
if (!apiKey.trim()) {
|
||||
setSaveMessage({ type: "error", text: t("calcom.settings.apiKey.errorEmpty", "Please enter an API key") });
|
||||
return;
|
||||
}
|
||||
setSaving(true);
|
||||
setSaveMessage(null);
|
||||
setTestResult(null);
|
||||
try {
|
||||
const res = await fetch(`${baseUrl}/settings`, {
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/json" },
|
||||
body: JSON.stringify({ api_key: apiKey }),
|
||||
});
|
||||
if (res.ok) {
|
||||
await loadSettings();
|
||||
setApiKey("");
|
||||
setSaveMessage({ type: "success", text: t("calcom.settings.apiKey.saved", "API key saved successfully") });
|
||||
} else {
|
||||
const text = await res.text();
|
||||
setSaveMessage({ type: "error", text: text || t("calcom.settings.apiKey.saveFailed", "Failed to save API key") });
|
||||
}
|
||||
} catch (_error) {
|
||||
setSaveMessage({ type: "error", text: t("calcom.settings.serverError", "Failed to connect to server") });
|
||||
} finally {
|
||||
setSaving(false);
|
||||
}
|
||||
};
|
||||
const handleTest = async () => {
|
||||
setTesting(true);
|
||||
setTestResult(null);
|
||||
try {
|
||||
const res = await fetch(`${baseUrl}/test`, { method: "POST" });
|
||||
const data = await res.json();
|
||||
setTestResult(data);
|
||||
} catch (_error) {
|
||||
setTestResult({ success: false, error: t("calcom.settings.serverError", "Failed to connect to server") });
|
||||
} finally {
|
||||
setTesting(false);
|
||||
}
|
||||
};
|
||||
const handleClear = async () => {
|
||||
setSaving(true);
|
||||
setSaveMessage(null);
|
||||
try {
|
||||
const res = await fetch(`${baseUrl}/settings`, {
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/json" },
|
||||
body: JSON.stringify({ api_key: "" }),
|
||||
});
|
||||
if (res.ok) {
|
||||
await loadSettings();
|
||||
setTestResult(null);
|
||||
setSaveMessage({ type: "success", text: t("calcom.settings.apiKey.removed", "API key removed") });
|
||||
}
|
||||
} catch (_error) {
|
||||
setSaveMessage({ type: "error", text: t("calcom.settings.apiKey.clearFailed", "Failed to clear API key") });
|
||||
} finally {
|
||||
setSaving(false);
|
||||
}
|
||||
};
|
||||
const handleRotate = async () => {
|
||||
const confirmed = await confirm({
|
||||
title: t("calcom.settings.webhook.rotateConfirmTitle", "Rotate webhook secret?"),
|
||||
message: t("calcom.settings.webhook.rotateConfirmMessage", "This invalidates the existing secret immediately. You'll need to update Cal.com to keep webhooks flowing."),
|
||||
confirmLabel: t("calcom.settings.webhook.rotateConfirmLabel", "Rotate"),
|
||||
variant: "destructive",
|
||||
});
|
||||
if (!confirmed) return;
|
||||
setRotating(true);
|
||||
setSaveMessage(null);
|
||||
try {
|
||||
const res = await fetch(`${baseUrl}/settings/rotate-webhook-secret`, { method: "POST" });
|
||||
if (res.ok) {
|
||||
const data = await res.json();
|
||||
setSettings((prev) => (prev ? { ...prev, webhook_secret_masked: data.webhook_secret_masked, webhook_secret_configured: true } : prev));
|
||||
const successMsg = t("calcom.settings.webhook.rotated", "Webhook secret rotated. Update it in Cal.com.");
|
||||
setSaveMessage({ type: "success", text: successMsg });
|
||||
toast.success(successMsg);
|
||||
} else {
|
||||
setSaveMessage({ type: "error", text: t("calcom.settings.webhook.rotateFailed", "Failed to rotate webhook secret") });
|
||||
}
|
||||
} catch (_error) {
|
||||
setSaveMessage({ type: "error", text: t("calcom.settings.serverError", "Failed to connect to server") });
|
||||
} finally {
|
||||
setRotating(false);
|
||||
}
|
||||
};
|
||||
if (loading) {
|
||||
return /* @__PURE__ */ jsxRuntimeExports.jsx("div", {
|
||||
className: "flex items-center justify-center py-8",
|
||||
children: /* @__PURE__ */ jsxRuntimeExports.jsx(Loader2, { className: "h-6 w-6 animate-spin text-muted-foreground" }),
|
||||
});
|
||||
}
|
||||
const apiKeyVisibilityLabel = showApiKey ? t("calcom.settings.toggleVisibility.hide", "Hide") : t("calcom.settings.toggleVisibility.show", "Show");
|
||||
const secretVisibilityLabel = showSecret ? t("calcom.settings.toggleVisibility.hide", "Hide") : t("calcom.settings.toggleVisibility.show", "Show");
|
||||
return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", {
|
||||
className: "space-y-6",
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", {
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs("h2", {
|
||||
className: "text-xl font-semibold flex items-center gap-2",
|
||||
children: [/* @__PURE__ */ jsxRuntimeExports.jsx(Settings, { className: "h-5 w-5" }), t("calcom.settings.heading", "Cal.com Integration")],
|
||||
}),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("p", {
|
||||
className: "text-sm text-muted-foreground",
|
||||
children: t("calcom.settings.headingDescription", "Configure your Cal.com API key to enable booking functionality"),
|
||||
}),
|
||||
],
|
||||
}),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(Card, {
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(CardHeader, {
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(CardTitle, {
|
||||
className: "text-base flex items-center gap-2",
|
||||
children: [/* @__PURE__ */ jsxRuntimeExports.jsx(Key, { className: "h-4 w-4" }), t("calcom.settings.apiKey.title", "API Key Status")],
|
||||
}),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(CardDescription, {
|
||||
children: t("calcom.settings.apiKey.description", "Your Cal.com API key is required for the booking widget to function"),
|
||||
}),
|
||||
],
|
||||
}),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(CardContent, {
|
||||
className: "space-y-4",
|
||||
children: [
|
||||
settings?.api_key_configured ?
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", {
|
||||
className: "flex items-center justify-between rounded-lg border bg-muted/30 p-3",
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", {
|
||||
className: "flex items-center gap-3",
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(Badge, {
|
||||
variant: "default",
|
||||
className: "gap-1.5",
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(CheckCircle2, { className: "h-3.5 w-3.5" }),
|
||||
t("calcom.settings.apiKey.configuredLabel", "Configured"),
|
||||
],
|
||||
}),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("p", {
|
||||
className: "text-xs text-muted-foreground font-mono",
|
||||
children: settings.api_key_masked || t("calcom.settings.apiKey.maskedFallback", "***configured***"),
|
||||
}),
|
||||
],
|
||||
}),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(Button, {
|
||||
action: "delete",
|
||||
entity: "plugin-setting",
|
||||
variant: "ghost",
|
||||
size: "sm",
|
||||
onClick: handleClear,
|
||||
disabled: saving,
|
||||
children: t("calcom.settings.apiKey.remove", "Remove"),
|
||||
}),
|
||||
],
|
||||
})
|
||||
: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", {
|
||||
className: "flex items-center gap-3 rounded-lg border bg-muted/30 p-3",
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(Badge, {
|
||||
variant: "outline",
|
||||
className: "gap-1.5",
|
||||
children: [/* @__PURE__ */ jsxRuntimeExports.jsx(XCircle, { className: "h-3.5 w-3.5" }), t("calcom.settings.apiKey.notConfiguredLabel", "Not configured")],
|
||||
}),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("p", {
|
||||
className: "text-xs text-muted-foreground",
|
||||
children: t("calcom.settings.apiKey.notConfiguredHelp", "Enter your Cal.com API key below to enable booking"),
|
||||
}),
|
||||
],
|
||||
}),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", {
|
||||
className: "space-y-2",
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(Label, {
|
||||
htmlFor: "apiKey",
|
||||
children: settings?.api_key_configured ? t("calcom.settings.apiKey.updateLabel", "Update API Key") : t("calcom.settings.apiKey.label", "API Key"),
|
||||
}),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", {
|
||||
className: "flex gap-2",
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", {
|
||||
className: "relative flex-1",
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(Input, {
|
||||
id: "apiKey",
|
||||
type: showApiKey ? "text" : "password",
|
||||
value: apiKey,
|
||||
onChange: (e) => setApiKey(e.target.value),
|
||||
placeholder: t("calcom.settings.apiKey.placeholder", "cal_live_..."),
|
||||
className: "pr-10",
|
||||
}),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(Button, {
|
||||
"type": "button",
|
||||
"variant": "ghost",
|
||||
"action": "toggle",
|
||||
"entity": "api-key-visibility",
|
||||
"onClick": () => setShowApiKey(!showApiKey),
|
||||
"aria-label": apiKeyVisibilityLabel,
|
||||
"className": "absolute right-3 top-1/2 -translate-y-1/2 h-auto p-0 text-muted-foreground hover:bg-transparent hover:text-foreground",
|
||||
"children":
|
||||
showApiKey ?
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(EyeOff, { className: "h-4 w-4" })
|
||||
: /* @__PURE__ */ jsxRuntimeExports.jsx(Eye, { className: "h-4 w-4" }),
|
||||
}),
|
||||
],
|
||||
}),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(Button, {
|
||||
action: "save",
|
||||
entity: "plugin-setting",
|
||||
onClick: handleSave,
|
||||
disabled: saving || !apiKey.trim(),
|
||||
children: saving ? /* @__PURE__ */ jsxRuntimeExports.jsx(Loader2, { className: "h-4 w-4 animate-spin" }) : t("calcom.settings.apiKey.save", "Save"),
|
||||
}),
|
||||
],
|
||||
}),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs("p", {
|
||||
className: "text-xs text-muted-foreground",
|
||||
children: [
|
||||
t("calcom.settings.apiKey.helpPrefix", "Get your API key from"),
|
||||
" ",
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("a", {
|
||||
href: "https://app.cal.com/settings/developer/api-keys",
|
||||
target: "_blank",
|
||||
rel: "noopener noreferrer",
|
||||
className: "text-primary hover:underline",
|
||||
children: t("calcom.settings.apiKey.helpLink", "Cal.com API Settings"),
|
||||
}),
|
||||
],
|
||||
}),
|
||||
],
|
||||
}),
|
||||
saveMessage &&
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(Alert, {
|
||||
variant: saveMessage.type === "error" ? "destructive" : "default",
|
||||
children: /* @__PURE__ */ jsxRuntimeExports.jsx(AlertDescription, { children: saveMessage.text }),
|
||||
}),
|
||||
],
|
||||
}),
|
||||
],
|
||||
}),
|
||||
settings?.api_key_configured &&
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(Card, {
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(CardHeader, {
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(CardTitle, {
|
||||
className: "text-base flex items-center gap-2",
|
||||
children: [/* @__PURE__ */ jsxRuntimeExports.jsx(Zap, { className: "h-4 w-4" }), t("calcom.settings.test.title", "Test Connection")],
|
||||
}),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(CardDescription, { children: t("calcom.settings.test.description", "Verify your API key works and see available event types") }),
|
||||
],
|
||||
}),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(CardContent, {
|
||||
className: "space-y-4",
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(Button, {
|
||||
action: "settings",
|
||||
entity: "plugin-connection",
|
||||
onClick: handleTest,
|
||||
disabled: testing,
|
||||
children:
|
||||
testing ?
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, {
|
||||
children: [/* @__PURE__ */ jsxRuntimeExports.jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin" }), t("calcom.settings.test.testing", "Testing...")],
|
||||
})
|
||||
: t("calcom.settings.test.button", "Test Connection"),
|
||||
}),
|
||||
testResult &&
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("div", {
|
||||
className: "space-y-3",
|
||||
children:
|
||||
testResult.success ?
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, {
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(Alert, {
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(CheckCircle2, { className: "h-4 w-4 text-success" }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(AlertDescription, {
|
||||
className: "ml-2",
|
||||
children: [
|
||||
t("calcom.settings.test.successPrefix", "Connection successful! Found"),
|
||||
" ",
|
||||
testResult.event_types?.length || 0,
|
||||
" ",
|
||||
t("calcom.settings.test.successSuffix", "event types."),
|
||||
],
|
||||
}),
|
||||
],
|
||||
}),
|
||||
testResult.event_types &&
|
||||
testResult.event_types.length > 0 &&
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(ScrollArea, {
|
||||
className: "max-h-96 rounded-lg border",
|
||||
children: /* @__PURE__ */ jsxRuntimeExports.jsxs("table", {
|
||||
className: "w-full text-sm",
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("thead", {
|
||||
className: "bg-muted",
|
||||
children: /* @__PURE__ */ jsxRuntimeExports.jsxs("tr", {
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("th", {
|
||||
className: "text-left px-3 py-2 font-medium",
|
||||
children: t("calcom.settings.test.tableEventType", "Event Type"),
|
||||
}),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("th", {
|
||||
className: "text-left px-3 py-2 font-medium",
|
||||
children: t("calcom.settings.test.tableSlug", "Slug"),
|
||||
}),
|
||||
],
|
||||
}),
|
||||
}),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("tbody", {
|
||||
children: testResult.event_types.map((et) =>
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
||||
"tr",
|
||||
{
|
||||
className: "border-t",
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "px-3 py-2", children: et.title }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("td", {
|
||||
className: "px-3 py-2 font-mono text-xs",
|
||||
children: et.slug,
|
||||
}),
|
||||
],
|
||||
},
|
||||
et.id,
|
||||
),
|
||||
),
|
||||
}),
|
||||
],
|
||||
}),
|
||||
}),
|
||||
],
|
||||
})
|
||||
: /* @__PURE__ */ jsxRuntimeExports.jsxs(Alert, {
|
||||
variant: "destructive",
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(XCircle, { className: "h-4 w-4" }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(AlertDescription, {
|
||||
className: "ml-2",
|
||||
children: testResult.error || t("calcom.settings.test.failure", "Connection failed"),
|
||||
}),
|
||||
],
|
||||
}),
|
||||
}),
|
||||
],
|
||||
}),
|
||||
],
|
||||
}),
|
||||
settings?.api_key_configured &&
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(Card, {
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(CardHeader, {
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(CardTitle, {
|
||||
className: "text-base flex items-center gap-2",
|
||||
children: [/* @__PURE__ */ jsxRuntimeExports.jsx(Send, { className: "h-4 w-4" }), t("calcom.settings.webhook.title", "Webhook")],
|
||||
}),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(CardDescription, {
|
||||
children: t("calcom.settings.webhook.description", "Configure this URL in Cal.com → Settings → Developer → Webhooks to receive booking events."),
|
||||
}),
|
||||
],
|
||||
}),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(CardContent, {
|
||||
className: "space-y-4",
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", {
|
||||
className: "space-y-2",
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(Label, { htmlFor: "webhookUrl", children: t("calcom.settings.webhook.urlLabel", "Webhook URL") }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", {
|
||||
className: "flex gap-2",
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(Input, {
|
||||
id: "webhookUrl",
|
||||
readOnly: true,
|
||||
value: settings?.webhook_url || "",
|
||||
className: "flex-1 font-mono text-xs",
|
||||
}),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(Button, {
|
||||
"action": "copy",
|
||||
"entity": "webhook-url",
|
||||
"variant": "outline",
|
||||
"size": "sm",
|
||||
"aria-label": t("calcom.settings.webhook.copyUrl", "Copy webhook URL"),
|
||||
"onClick": () => copyToClipboard(settings?.webhook_url || ""),
|
||||
"children": /* @__PURE__ */ jsxRuntimeExports.jsx(Copy, { className: "h-4 w-4" }),
|
||||
}),
|
||||
],
|
||||
}),
|
||||
],
|
||||
}),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", {
|
||||
className: "space-y-2",
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(Label, { htmlFor: "webhookSecret", children: t("calcom.settings.webhook.secretLabel", "Webhook Secret") }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", {
|
||||
className: "flex gap-2",
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", {
|
||||
className: "relative flex-1",
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(Input, {
|
||||
id: "webhookSecret",
|
||||
type: showSecret ? "text" : "password",
|
||||
readOnly: true,
|
||||
value: settings?.webhook_secret_masked || t("calcom.settings.webhook.secretNotConfigured", "Not configured"),
|
||||
className: "pr-10 font-mono text-xs",
|
||||
}),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(Button, {
|
||||
"type": "button",
|
||||
"variant": "ghost",
|
||||
"action": "toggle",
|
||||
"entity": "webhook-secret-visibility",
|
||||
"onClick": () => setShowSecret(!showSecret),
|
||||
"aria-label": secretVisibilityLabel,
|
||||
"className": "absolute right-3 top-1/2 -translate-y-1/2 h-auto p-0 text-muted-foreground hover:bg-transparent hover:text-foreground",
|
||||
"children":
|
||||
showSecret ?
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(EyeOff, { className: "h-4 w-4" })
|
||||
: /* @__PURE__ */ jsxRuntimeExports.jsx(Eye, { className: "h-4 w-4" }),
|
||||
}),
|
||||
],
|
||||
}),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(Button, {
|
||||
"action": "copy",
|
||||
"entity": "webhook-secret",
|
||||
"variant": "outline",
|
||||
"size": "sm",
|
||||
"aria-label": t("calcom.settings.webhook.copySecret", "Copy webhook secret"),
|
||||
"onClick": () => copyToClipboard(settings?.webhook_secret_masked || ""),
|
||||
"children": /* @__PURE__ */ jsxRuntimeExports.jsx(Copy, { className: "h-4 w-4" }),
|
||||
}),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(Button, {
|
||||
"action": "rotate",
|
||||
"entity": "webhook-secret",
|
||||
"variant": "outline",
|
||||
"size": "sm",
|
||||
"aria-label": t("calcom.settings.webhook.rotate", "Rotate webhook secret"),
|
||||
"onClick": handleRotate,
|
||||
"disabled": rotating,
|
||||
"children":
|
||||
rotating ?
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(Loader2, { className: "h-4 w-4 animate-spin" })
|
||||
: /* @__PURE__ */ jsxRuntimeExports.jsx(RefreshCw, { className: "h-4 w-4" }),
|
||||
}),
|
||||
],
|
||||
}),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("p", {
|
||||
className: "text-xs text-muted-foreground",
|
||||
children: t(
|
||||
"calcom.settings.webhook.secretHelp",
|
||||
"Cal.com displays the secret only once. Regenerating invalidates the previous value immediately — update it in Cal.com after rotating.",
|
||||
),
|
||||
}),
|
||||
],
|
||||
}),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("div", {
|
||||
className: "text-sm",
|
||||
children:
|
||||
settings?.last_event_at ?
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", {
|
||||
className: "flex items-center gap-2 text-foreground",
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(CheckCircle2, { className: "h-4 w-4 text-success" }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs("span", {
|
||||
children: [
|
||||
t("calcom.settings.webhook.lastEventPrefix", "Last event"),
|
||||
" ",
|
||||
formatRelativeTime(settings.last_event_at),
|
||||
settings.last_event_type &&
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, {
|
||||
children: [
|
||||
" — ",
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("code", { className: "font-mono text-xs", children: settings.last_event_type }),
|
||||
],
|
||||
}),
|
||||
],
|
||||
}),
|
||||
],
|
||||
})
|
||||
: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", {
|
||||
className: "flex items-center gap-2 text-muted-foreground",
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(AlertCircle, { className: "h-4 w-4" }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: t("calcom.settings.webhook.waitingForEvent", "Status: Waiting for first event") }),
|
||||
],
|
||||
}),
|
||||
}),
|
||||
],
|
||||
}),
|
||||
],
|
||||
}),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(Card, {
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(CardHeader, {
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(CardTitle, { className: "text-base", children: t("calcom.settings.docs.title", "Documentation") }),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx(CardDescription, { children: t("calcom.settings.docs.description", "Reference material for working with the Cal.com plugin.") }),
|
||||
],
|
||||
}),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsxs(CardContent, {
|
||||
className: "space-y-2 text-sm",
|
||||
children: [
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("a", {
|
||||
href: "https://cal.com/docs/api-reference/v2",
|
||||
target: "_blank",
|
||||
rel: "noopener noreferrer",
|
||||
className: "text-primary hover:underline block",
|
||||
children: t("calcom.settings.docs.calcomApi", "Cal.com API documentation"),
|
||||
}),
|
||||
/* @__PURE__ */ jsxRuntimeExports.jsx("a", {
|
||||
href: "/admin/docs/calcom-plugin",
|
||||
target: "_blank",
|
||||
rel: "noopener noreferrer",
|
||||
className: "text-primary hover:underline block",
|
||||
children: t("calcom.settings.docs.pluginGuide", "BlockNinja plugin guide"),
|
||||
}),
|
||||
],
|
||||
}),
|
||||
],
|
||||
}),
|
||||
],
|
||||
});
|
||||
}
|
||||
|
||||
export { CalcomSettings as default };
|
||||
|
||||
639
web/dist/assets/__federation_fn_import-hlt2XzeI.js
vendored
639
web/dist/assets/__federation_fn_import-hlt2XzeI.js
vendored
@ -27,399 +27,366 @@ const xRange = `^${gtlt}\\s*${xRangePlain}$`;
|
||||
const comparator = `^${gtlt}\\s*(${fullPlain})$|^$`;
|
||||
const gte0 = "^\\s*>=\\s*0.0.0\\s*$";
|
||||
function parseRegex(source) {
|
||||
return new RegExp(source);
|
||||
return new RegExp(source);
|
||||
}
|
||||
function isXVersion(version) {
|
||||
return !version || version.toLowerCase() === "x" || version === "*";
|
||||
return !version || version.toLowerCase() === "x" || version === "*";
|
||||
}
|
||||
function pipe(...fns) {
|
||||
return (x) => {
|
||||
return fns.reduce((v, f) => f(v), x);
|
||||
};
|
||||
return (x) => {
|
||||
return fns.reduce((v, f) => f(v), x);
|
||||
};
|
||||
}
|
||||
function extractComparator(comparatorString) {
|
||||
return comparatorString.match(parseRegex(comparator));
|
||||
return comparatorString.match(parseRegex(comparator));
|
||||
}
|
||||
function combineVersion(major, minor, patch, preRelease2) {
|
||||
const mainVersion2 = `${major}.${minor}.${patch}`;
|
||||
if (preRelease2) {
|
||||
return `${mainVersion2}-${preRelease2}`;
|
||||
}
|
||||
return mainVersion2;
|
||||
const mainVersion2 = `${major}.${minor}.${patch}`;
|
||||
if (preRelease2) {
|
||||
return `${mainVersion2}-${preRelease2}`;
|
||||
}
|
||||
return mainVersion2;
|
||||
}
|
||||
function parseHyphen(range) {
|
||||
return range.replace(
|
||||
parseRegex(hyphenRange),
|
||||
(_range, from, fromMajor, fromMinor, fromPatch, _fromPreRelease, _fromBuild, to, toMajor, toMinor, toPatch, toPreRelease) => {
|
||||
if (isXVersion(fromMajor)) {
|
||||
from = "";
|
||||
} else if (isXVersion(fromMinor)) {
|
||||
from = `>=${fromMajor}.0.0`;
|
||||
} else if (isXVersion(fromPatch)) {
|
||||
from = `>=${fromMajor}.${fromMinor}.0`;
|
||||
} else {
|
||||
from = `>=${from}`;
|
||||
}
|
||||
if (isXVersion(toMajor)) {
|
||||
to = "";
|
||||
} else if (isXVersion(toMinor)) {
|
||||
to = `<${+toMajor + 1}.0.0-0`;
|
||||
} else if (isXVersion(toPatch)) {
|
||||
to = `<${toMajor}.${+toMinor + 1}.0-0`;
|
||||
} else if (toPreRelease) {
|
||||
to = `<=${toMajor}.${toMinor}.${toPatch}-${toPreRelease}`;
|
||||
} else {
|
||||
to = `<=${to}`;
|
||||
}
|
||||
return `${from} ${to}`.trim();
|
||||
}
|
||||
);
|
||||
return range.replace(parseRegex(hyphenRange), (_range, from, fromMajor, fromMinor, fromPatch, _fromPreRelease, _fromBuild, to, toMajor, toMinor, toPatch, toPreRelease) => {
|
||||
if (isXVersion(fromMajor)) {
|
||||
from = "";
|
||||
} else if (isXVersion(fromMinor)) {
|
||||
from = `>=${fromMajor}.0.0`;
|
||||
} else if (isXVersion(fromPatch)) {
|
||||
from = `>=${fromMajor}.${fromMinor}.0`;
|
||||
} else {
|
||||
from = `>=${from}`;
|
||||
}
|
||||
if (isXVersion(toMajor)) {
|
||||
to = "";
|
||||
} else if (isXVersion(toMinor)) {
|
||||
to = `<${+toMajor + 1}.0.0-0`;
|
||||
} else if (isXVersion(toPatch)) {
|
||||
to = `<${toMajor}.${+toMinor + 1}.0-0`;
|
||||
} else if (toPreRelease) {
|
||||
to = `<=${toMajor}.${toMinor}.${toPatch}-${toPreRelease}`;
|
||||
} else {
|
||||
to = `<=${to}`;
|
||||
}
|
||||
return `${from} ${to}`.trim();
|
||||
});
|
||||
}
|
||||
function parseComparatorTrim(range) {
|
||||
return range.replace(parseRegex(comparatorTrim), "$1$2$3");
|
||||
return range.replace(parseRegex(comparatorTrim), "$1$2$3");
|
||||
}
|
||||
function parseTildeTrim(range) {
|
||||
return range.replace(parseRegex(tildeTrim), "$1~");
|
||||
return range.replace(parseRegex(tildeTrim), "$1~");
|
||||
}
|
||||
function parseCaretTrim(range) {
|
||||
return range.replace(parseRegex(caretTrim), "$1^");
|
||||
return range.replace(parseRegex(caretTrim), "$1^");
|
||||
}
|
||||
function parseCarets(range) {
|
||||
return range.trim().split(/\s+/).map((rangeVersion) => {
|
||||
return rangeVersion.replace(
|
||||
parseRegex(caret),
|
||||
(_, major, minor, patch, preRelease2) => {
|
||||
if (isXVersion(major)) {
|
||||
return "";
|
||||
} else if (isXVersion(minor)) {
|
||||
return `>=${major}.0.0 <${+major + 1}.0.0-0`;
|
||||
} else if (isXVersion(patch)) {
|
||||
if (major === "0") {
|
||||
return `>=${major}.${minor}.0 <${major}.${+minor + 1}.0-0`;
|
||||
} else {
|
||||
return `>=${major}.${minor}.0 <${+major + 1}.0.0-0`;
|
||||
}
|
||||
} else if (preRelease2) {
|
||||
if (major === "0") {
|
||||
if (minor === "0") {
|
||||
return `>=${major}.${minor}.${patch}-${preRelease2} <${major}.${minor}.${+patch + 1}-0`;
|
||||
} else {
|
||||
return `>=${major}.${minor}.${patch}-${preRelease2} <${major}.${+minor + 1}.0-0`;
|
||||
}
|
||||
} else {
|
||||
return `>=${major}.${minor}.${patch}-${preRelease2} <${+major + 1}.0.0-0`;
|
||||
}
|
||||
} else {
|
||||
if (major === "0") {
|
||||
if (minor === "0") {
|
||||
return `>=${major}.${minor}.${patch} <${major}.${minor}.${+patch + 1}-0`;
|
||||
} else {
|
||||
return `>=${major}.${minor}.${patch} <${major}.${+minor + 1}.0-0`;
|
||||
}
|
||||
}
|
||||
return `>=${major}.${minor}.${patch} <${+major + 1}.0.0-0`;
|
||||
}
|
||||
}
|
||||
);
|
||||
}).join(" ");
|
||||
return range
|
||||
.trim()
|
||||
.split(/\s+/)
|
||||
.map((rangeVersion) => {
|
||||
return rangeVersion.replace(parseRegex(caret), (_, major, minor, patch, preRelease2) => {
|
||||
if (isXVersion(major)) {
|
||||
return "";
|
||||
} else if (isXVersion(minor)) {
|
||||
return `>=${major}.0.0 <${+major + 1}.0.0-0`;
|
||||
} else if (isXVersion(patch)) {
|
||||
if (major === "0") {
|
||||
return `>=${major}.${minor}.0 <${major}.${+minor + 1}.0-0`;
|
||||
} else {
|
||||
return `>=${major}.${minor}.0 <${+major + 1}.0.0-0`;
|
||||
}
|
||||
} else if (preRelease2) {
|
||||
if (major === "0") {
|
||||
if (minor === "0") {
|
||||
return `>=${major}.${minor}.${patch}-${preRelease2} <${major}.${minor}.${+patch + 1}-0`;
|
||||
} else {
|
||||
return `>=${major}.${minor}.${patch}-${preRelease2} <${major}.${+minor + 1}.0-0`;
|
||||
}
|
||||
} else {
|
||||
return `>=${major}.${minor}.${patch}-${preRelease2} <${+major + 1}.0.0-0`;
|
||||
}
|
||||
} else {
|
||||
if (major === "0") {
|
||||
if (minor === "0") {
|
||||
return `>=${major}.${minor}.${patch} <${major}.${minor}.${+patch + 1}-0`;
|
||||
} else {
|
||||
return `>=${major}.${minor}.${patch} <${major}.${+minor + 1}.0-0`;
|
||||
}
|
||||
}
|
||||
return `>=${major}.${minor}.${patch} <${+major + 1}.0.0-0`;
|
||||
}
|
||||
});
|
||||
})
|
||||
.join(" ");
|
||||
}
|
||||
function parseTildes(range) {
|
||||
return range.trim().split(/\s+/).map((rangeVersion) => {
|
||||
return rangeVersion.replace(
|
||||
parseRegex(tilde),
|
||||
(_, major, minor, patch, preRelease2) => {
|
||||
if (isXVersion(major)) {
|
||||
return "";
|
||||
} else if (isXVersion(minor)) {
|
||||
return `>=${major}.0.0 <${+major + 1}.0.0-0`;
|
||||
} else if (isXVersion(patch)) {
|
||||
return `>=${major}.${minor}.0 <${major}.${+minor + 1}.0-0`;
|
||||
} else if (preRelease2) {
|
||||
return `>=${major}.${minor}.${patch}-${preRelease2} <${major}.${+minor + 1}.0-0`;
|
||||
}
|
||||
return `>=${major}.${minor}.${patch} <${major}.${+minor + 1}.0-0`;
|
||||
}
|
||||
);
|
||||
}).join(" ");
|
||||
return range
|
||||
.trim()
|
||||
.split(/\s+/)
|
||||
.map((rangeVersion) => {
|
||||
return rangeVersion.replace(parseRegex(tilde), (_, major, minor, patch, preRelease2) => {
|
||||
if (isXVersion(major)) {
|
||||
return "";
|
||||
} else if (isXVersion(minor)) {
|
||||
return `>=${major}.0.0 <${+major + 1}.0.0-0`;
|
||||
} else if (isXVersion(patch)) {
|
||||
return `>=${major}.${minor}.0 <${major}.${+minor + 1}.0-0`;
|
||||
} else if (preRelease2) {
|
||||
return `>=${major}.${minor}.${patch}-${preRelease2} <${major}.${+minor + 1}.0-0`;
|
||||
}
|
||||
return `>=${major}.${minor}.${patch} <${major}.${+minor + 1}.0-0`;
|
||||
});
|
||||
})
|
||||
.join(" ");
|
||||
}
|
||||
function parseXRanges(range) {
|
||||
return range.split(/\s+/).map((rangeVersion) => {
|
||||
return rangeVersion.trim().replace(
|
||||
parseRegex(xRange),
|
||||
(ret, gtlt2, major, minor, patch, preRelease2) => {
|
||||
const isXMajor = isXVersion(major);
|
||||
const isXMinor = isXMajor || isXVersion(minor);
|
||||
const isXPatch = isXMinor || isXVersion(patch);
|
||||
if (gtlt2 === "=" && isXPatch) {
|
||||
gtlt2 = "";
|
||||
}
|
||||
preRelease2 = "";
|
||||
if (isXMajor) {
|
||||
if (gtlt2 === ">" || gtlt2 === "<") {
|
||||
return "<0.0.0-0";
|
||||
} else {
|
||||
return "*";
|
||||
}
|
||||
} else if (gtlt2 && isXPatch) {
|
||||
if (isXMinor) {
|
||||
minor = 0;
|
||||
}
|
||||
patch = 0;
|
||||
if (gtlt2 === ">") {
|
||||
gtlt2 = ">=";
|
||||
if (isXMinor) {
|
||||
major = +major + 1;
|
||||
minor = 0;
|
||||
patch = 0;
|
||||
} else {
|
||||
minor = +minor + 1;
|
||||
patch = 0;
|
||||
}
|
||||
} else if (gtlt2 === "<=") {
|
||||
gtlt2 = "<";
|
||||
if (isXMinor) {
|
||||
major = +major + 1;
|
||||
} else {
|
||||
minor = +minor + 1;
|
||||
}
|
||||
}
|
||||
if (gtlt2 === "<") {
|
||||
preRelease2 = "-0";
|
||||
}
|
||||
return `${gtlt2 + major}.${minor}.${patch}${preRelease2}`;
|
||||
} else if (isXMinor) {
|
||||
return `>=${major}.0.0${preRelease2} <${+major + 1}.0.0-0`;
|
||||
} else if (isXPatch) {
|
||||
return `>=${major}.${minor}.0${preRelease2} <${major}.${+minor + 1}.0-0`;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
);
|
||||
}).join(" ");
|
||||
return range
|
||||
.split(/\s+/)
|
||||
.map((rangeVersion) => {
|
||||
return rangeVersion.trim().replace(parseRegex(xRange), (ret, gtlt2, major, minor, patch, preRelease2) => {
|
||||
const isXMajor = isXVersion(major);
|
||||
const isXMinor = isXMajor || isXVersion(minor);
|
||||
const isXPatch = isXMinor || isXVersion(patch);
|
||||
if (gtlt2 === "=" && isXPatch) {
|
||||
gtlt2 = "";
|
||||
}
|
||||
preRelease2 = "";
|
||||
if (isXMajor) {
|
||||
if (gtlt2 === ">" || gtlt2 === "<") {
|
||||
return "<0.0.0-0";
|
||||
} else {
|
||||
return "*";
|
||||
}
|
||||
} else if (gtlt2 && isXPatch) {
|
||||
if (isXMinor) {
|
||||
minor = 0;
|
||||
}
|
||||
patch = 0;
|
||||
if (gtlt2 === ">") {
|
||||
gtlt2 = ">=";
|
||||
if (isXMinor) {
|
||||
major = +major + 1;
|
||||
minor = 0;
|
||||
patch = 0;
|
||||
} else {
|
||||
minor = +minor + 1;
|
||||
patch = 0;
|
||||
}
|
||||
} else if (gtlt2 === "<=") {
|
||||
gtlt2 = "<";
|
||||
if (isXMinor) {
|
||||
major = +major + 1;
|
||||
} else {
|
||||
minor = +minor + 1;
|
||||
}
|
||||
}
|
||||
if (gtlt2 === "<") {
|
||||
preRelease2 = "-0";
|
||||
}
|
||||
return `${gtlt2 + major}.${minor}.${patch}${preRelease2}`;
|
||||
} else if (isXMinor) {
|
||||
return `>=${major}.0.0${preRelease2} <${+major + 1}.0.0-0`;
|
||||
} else if (isXPatch) {
|
||||
return `>=${major}.${minor}.0${preRelease2} <${major}.${+minor + 1}.0-0`;
|
||||
}
|
||||
return ret;
|
||||
});
|
||||
})
|
||||
.join(" ");
|
||||
}
|
||||
function parseStar(range) {
|
||||
return range.trim().replace(parseRegex(star), "");
|
||||
return range.trim().replace(parseRegex(star), "");
|
||||
}
|
||||
function parseGTE0(comparatorString) {
|
||||
return comparatorString.trim().replace(parseRegex(gte0), "");
|
||||
return comparatorString.trim().replace(parseRegex(gte0), "");
|
||||
}
|
||||
function compareAtom(rangeAtom, versionAtom) {
|
||||
rangeAtom = +rangeAtom || rangeAtom;
|
||||
versionAtom = +versionAtom || versionAtom;
|
||||
if (rangeAtom > versionAtom) {
|
||||
return 1;
|
||||
}
|
||||
if (rangeAtom === versionAtom) {
|
||||
return 0;
|
||||
}
|
||||
return -1;
|
||||
rangeAtom = +rangeAtom || rangeAtom;
|
||||
versionAtom = +versionAtom || versionAtom;
|
||||
if (rangeAtom > versionAtom) {
|
||||
return 1;
|
||||
}
|
||||
if (rangeAtom === versionAtom) {
|
||||
return 0;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
function comparePreRelease(rangeAtom, versionAtom) {
|
||||
const { preRelease: rangePreRelease } = rangeAtom;
|
||||
const { preRelease: versionPreRelease } = versionAtom;
|
||||
if (rangePreRelease === void 0 && !!versionPreRelease) {
|
||||
return 1;
|
||||
}
|
||||
if (!!rangePreRelease && versionPreRelease === void 0) {
|
||||
return -1;
|
||||
}
|
||||
if (rangePreRelease === void 0 && versionPreRelease === void 0) {
|
||||
return 0;
|
||||
}
|
||||
for (let i = 0, n = rangePreRelease.length; i <= n; i++) {
|
||||
const rangeElement = rangePreRelease[i];
|
||||
const versionElement = versionPreRelease[i];
|
||||
if (rangeElement === versionElement) {
|
||||
continue;
|
||||
}
|
||||
if (rangeElement === void 0 && versionElement === void 0) {
|
||||
return 0;
|
||||
}
|
||||
if (!rangeElement) {
|
||||
return 1;
|
||||
}
|
||||
if (!versionElement) {
|
||||
return -1;
|
||||
}
|
||||
return compareAtom(rangeElement, versionElement);
|
||||
}
|
||||
return 0;
|
||||
const { preRelease: rangePreRelease } = rangeAtom;
|
||||
const { preRelease: versionPreRelease } = versionAtom;
|
||||
if (rangePreRelease === void 0 && !!versionPreRelease) {
|
||||
return 1;
|
||||
}
|
||||
if (!!rangePreRelease && versionPreRelease === void 0) {
|
||||
return -1;
|
||||
}
|
||||
if (rangePreRelease === void 0 && versionPreRelease === void 0) {
|
||||
return 0;
|
||||
}
|
||||
for (let i = 0, n = rangePreRelease.length; i <= n; i++) {
|
||||
const rangeElement = rangePreRelease[i];
|
||||
const versionElement = versionPreRelease[i];
|
||||
if (rangeElement === versionElement) {
|
||||
continue;
|
||||
}
|
||||
if (rangeElement === void 0 && versionElement === void 0) {
|
||||
return 0;
|
||||
}
|
||||
if (!rangeElement) {
|
||||
return 1;
|
||||
}
|
||||
if (!versionElement) {
|
||||
return -1;
|
||||
}
|
||||
return compareAtom(rangeElement, versionElement);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
function compareVersion(rangeAtom, versionAtom) {
|
||||
return compareAtom(rangeAtom.major, versionAtom.major) || compareAtom(rangeAtom.minor, versionAtom.minor) || compareAtom(rangeAtom.patch, versionAtom.patch) || comparePreRelease(rangeAtom, versionAtom);
|
||||
return (
|
||||
compareAtom(rangeAtom.major, versionAtom.major) ||
|
||||
compareAtom(rangeAtom.minor, versionAtom.minor) ||
|
||||
compareAtom(rangeAtom.patch, versionAtom.patch) ||
|
||||
comparePreRelease(rangeAtom, versionAtom)
|
||||
);
|
||||
}
|
||||
function eq(rangeAtom, versionAtom) {
|
||||
return rangeAtom.version === versionAtom.version;
|
||||
return rangeAtom.version === versionAtom.version;
|
||||
}
|
||||
function compare(rangeAtom, versionAtom) {
|
||||
switch (rangeAtom.operator) {
|
||||
case "":
|
||||
case "=":
|
||||
return eq(rangeAtom, versionAtom);
|
||||
case ">":
|
||||
return compareVersion(rangeAtom, versionAtom) < 0;
|
||||
case ">=":
|
||||
return eq(rangeAtom, versionAtom) || compareVersion(rangeAtom, versionAtom) < 0;
|
||||
case "<":
|
||||
return compareVersion(rangeAtom, versionAtom) > 0;
|
||||
case "<=":
|
||||
return eq(rangeAtom, versionAtom) || compareVersion(rangeAtom, versionAtom) > 0;
|
||||
case void 0: {
|
||||
return true;
|
||||
}
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
switch (rangeAtom.operator) {
|
||||
case "":
|
||||
case "=":
|
||||
return eq(rangeAtom, versionAtom);
|
||||
case ">":
|
||||
return compareVersion(rangeAtom, versionAtom) < 0;
|
||||
case ">=":
|
||||
return eq(rangeAtom, versionAtom) || compareVersion(rangeAtom, versionAtom) < 0;
|
||||
case "<":
|
||||
return compareVersion(rangeAtom, versionAtom) > 0;
|
||||
case "<=":
|
||||
return eq(rangeAtom, versionAtom) || compareVersion(rangeAtom, versionAtom) > 0;
|
||||
case void 0: {
|
||||
return true;
|
||||
}
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
function parseComparatorString(range) {
|
||||
return pipe(
|
||||
parseCarets,
|
||||
parseTildes,
|
||||
parseXRanges,
|
||||
parseStar
|
||||
)(range);
|
||||
return pipe(parseCarets, parseTildes, parseXRanges, parseStar)(range);
|
||||
}
|
||||
function parseRange(range) {
|
||||
return pipe(
|
||||
parseHyphen,
|
||||
parseComparatorTrim,
|
||||
parseTildeTrim,
|
||||
parseCaretTrim
|
||||
)(range.trim()).split(/\s+/).join(" ");
|
||||
return pipe(parseHyphen, parseComparatorTrim, parseTildeTrim, parseCaretTrim)(range.trim()).split(/\s+/).join(" ");
|
||||
}
|
||||
function satisfy(version, range) {
|
||||
if (!version) {
|
||||
return false;
|
||||
}
|
||||
const parsedRange = parseRange(range);
|
||||
const parsedComparator = parsedRange.split(" ").map((rangeVersion) => parseComparatorString(rangeVersion)).join(" ");
|
||||
const comparators = parsedComparator.split(/\s+/).map((comparator2) => parseGTE0(comparator2));
|
||||
const extractedVersion = extractComparator(version);
|
||||
if (!extractedVersion) {
|
||||
return false;
|
||||
}
|
||||
const [
|
||||
,
|
||||
versionOperator,
|
||||
,
|
||||
versionMajor,
|
||||
versionMinor,
|
||||
versionPatch,
|
||||
versionPreRelease
|
||||
] = extractedVersion;
|
||||
const versionAtom = {
|
||||
version: combineVersion(
|
||||
versionMajor,
|
||||
versionMinor,
|
||||
versionPatch,
|
||||
versionPreRelease
|
||||
),
|
||||
major: versionMajor,
|
||||
minor: versionMinor,
|
||||
patch: versionPatch,
|
||||
preRelease: versionPreRelease == null ? void 0 : versionPreRelease.split(".")
|
||||
};
|
||||
for (const comparator2 of comparators) {
|
||||
const extractedComparator = extractComparator(comparator2);
|
||||
if (!extractedComparator) {
|
||||
return false;
|
||||
}
|
||||
const [
|
||||
,
|
||||
rangeOperator,
|
||||
,
|
||||
rangeMajor,
|
||||
rangeMinor,
|
||||
rangePatch,
|
||||
rangePreRelease
|
||||
] = extractedComparator;
|
||||
const rangeAtom = {
|
||||
operator: rangeOperator,
|
||||
version: combineVersion(
|
||||
rangeMajor,
|
||||
rangeMinor,
|
||||
rangePatch,
|
||||
rangePreRelease
|
||||
),
|
||||
major: rangeMajor,
|
||||
minor: rangeMinor,
|
||||
patch: rangePatch,
|
||||
preRelease: rangePreRelease == null ? void 0 : rangePreRelease.split(".")
|
||||
};
|
||||
if (!compare(rangeAtom, versionAtom)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
if (!version) {
|
||||
return false;
|
||||
}
|
||||
const parsedRange = parseRange(range);
|
||||
const parsedComparator = parsedRange
|
||||
.split(" ")
|
||||
.map((rangeVersion) => parseComparatorString(rangeVersion))
|
||||
.join(" ");
|
||||
const comparators = parsedComparator.split(/\s+/).map((comparator2) => parseGTE0(comparator2));
|
||||
const extractedVersion = extractComparator(version);
|
||||
if (!extractedVersion) {
|
||||
return false;
|
||||
}
|
||||
const [, versionOperator, , versionMajor, versionMinor, versionPatch, versionPreRelease] = extractedVersion;
|
||||
const versionAtom = {
|
||||
version: combineVersion(versionMajor, versionMinor, versionPatch, versionPreRelease),
|
||||
major: versionMajor,
|
||||
minor: versionMinor,
|
||||
patch: versionPatch,
|
||||
preRelease: versionPreRelease == null ? void 0 : versionPreRelease.split("."),
|
||||
};
|
||||
for (const comparator2 of comparators) {
|
||||
const extractedComparator = extractComparator(comparator2);
|
||||
if (!extractedComparator) {
|
||||
return false;
|
||||
}
|
||||
const [, rangeOperator, , rangeMajor, rangeMinor, rangePatch, rangePreRelease] = extractedComparator;
|
||||
const rangeAtom = {
|
||||
operator: rangeOperator,
|
||||
version: combineVersion(rangeMajor, rangeMinor, rangePatch, rangePreRelease),
|
||||
major: rangeMajor,
|
||||
minor: rangeMinor,
|
||||
patch: rangePatch,
|
||||
preRelease: rangePreRelease == null ? void 0 : rangePreRelease.split("."),
|
||||
};
|
||||
if (!compare(rangeAtom, versionAtom)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
const currentImports = {};
|
||||
|
||||
// eslint-disable-next-line no-undef
|
||||
const moduleMap = {'react':{get:()=>()=>__federation_import(new URL('__federation_shared_react-DoKb58Ht.js', import.meta.url).href),import:true},'react-dom':{get:()=>()=>__federation_import(new URL('__federation_shared_react-dom-DU2-P0kt.js', import.meta.url).href),import:true},'@block-ninja/ui':{get:()=>()=>__federation_import(new URL('__federation_shared_@block-ninja/ui-C3CAr7wz.js', import.meta.url).href),import:true}};
|
||||
const moduleMap = {
|
||||
"react": { get: () => () => __federation_import(new URL("__federation_shared_react-DoKb58Ht.js", import.meta.url).href), import: true },
|
||||
"react-dom": { get: () => () => __federation_import(new URL("__federation_shared_react-dom-DU2-P0kt.js", import.meta.url).href), import: true },
|
||||
"@block-ninja/ui": { get: () => () => __federation_import(new URL("__federation_shared_@block-ninja/ui-C3CAr7wz.js", import.meta.url).href), import: true },
|
||||
};
|
||||
const moduleCache = Object.create(null);
|
||||
async function importShared(name, shareScope = 'default') {
|
||||
return moduleCache[name]
|
||||
? new Promise((r) => r(moduleCache[name]))
|
||||
: (await getSharedFromRuntime(name, shareScope)) || getSharedFromLocal(name)
|
||||
async function importShared(name, shareScope = "default") {
|
||||
return moduleCache[name] ? new Promise((r) => r(moduleCache[name])) : (await getSharedFromRuntime(name, shareScope)) || getSharedFromLocal(name);
|
||||
}
|
||||
// eslint-disable-next-line
|
||||
async function __federation_import(name) {
|
||||
currentImports[name] ??= import(name);
|
||||
return currentImports[name]
|
||||
currentImports[name] ??= import(name);
|
||||
return currentImports[name];
|
||||
}
|
||||
async function getSharedFromRuntime(name, shareScope) {
|
||||
let module = null;
|
||||
if (globalThis?.__federation_shared__?.[shareScope]?.[name]) {
|
||||
const versionObj = globalThis.__federation_shared__[shareScope][name];
|
||||
const requiredVersion = moduleMap[name]?.requiredVersion;
|
||||
const hasRequiredVersion = !!requiredVersion;
|
||||
if (hasRequiredVersion) {
|
||||
const versionKey = Object.keys(versionObj).find((version) =>
|
||||
satisfy(version, requiredVersion)
|
||||
);
|
||||
if (versionKey) {
|
||||
const versionValue = versionObj[versionKey];
|
||||
module = await (await versionValue.get())();
|
||||
} else {
|
||||
console.log(
|
||||
`provider support ${name}(${versionKey}) is not satisfied requiredVersion(\${moduleMap[name].requiredVersion})`
|
||||
);
|
||||
}
|
||||
} else {
|
||||
const versionKey = Object.keys(versionObj)[0];
|
||||
const versionValue = versionObj[versionKey];
|
||||
module = await (await versionValue.get())();
|
||||
}
|
||||
}
|
||||
if (module) {
|
||||
return flattenModule(module, name)
|
||||
}
|
||||
let module = null;
|
||||
if (globalThis?.__federation_shared__?.[shareScope]?.[name]) {
|
||||
const versionObj = globalThis.__federation_shared__[shareScope][name];
|
||||
const requiredVersion = moduleMap[name]?.requiredVersion;
|
||||
const hasRequiredVersion = !!requiredVersion;
|
||||
if (hasRequiredVersion) {
|
||||
const versionKey = Object.keys(versionObj).find((version) => satisfy(version, requiredVersion));
|
||||
if (versionKey) {
|
||||
const versionValue = versionObj[versionKey];
|
||||
module = await (await versionValue.get())();
|
||||
} else {
|
||||
console.log(`provider support ${name}(${versionKey}) is not satisfied requiredVersion(\${moduleMap[name].requiredVersion})`);
|
||||
}
|
||||
} else {
|
||||
const versionKey = Object.keys(versionObj)[0];
|
||||
const versionValue = versionObj[versionKey];
|
||||
module = await (await versionValue.get())();
|
||||
}
|
||||
}
|
||||
if (module) {
|
||||
return flattenModule(module, name);
|
||||
}
|
||||
}
|
||||
async function getSharedFromLocal(name) {
|
||||
if (moduleMap[name]?.import) {
|
||||
let module = await (await moduleMap[name].get())();
|
||||
return flattenModule(module, name)
|
||||
} else {
|
||||
console.error(
|
||||
`consumer config import=false,so cant use callback shared module`
|
||||
);
|
||||
}
|
||||
if (moduleMap[name]?.import) {
|
||||
let module = await (await moduleMap[name].get())();
|
||||
return flattenModule(module, name);
|
||||
} else {
|
||||
console.error(`consumer config import=false,so cant use callback shared module`);
|
||||
}
|
||||
}
|
||||
function flattenModule(module, name) {
|
||||
// use a shared module which export default a function will getting error 'TypeError: xxx is not a function'
|
||||
if (typeof module.default === 'function') {
|
||||
Object.keys(module).forEach((key) => {
|
||||
if (key !== 'default') {
|
||||
module.default[key] = module[key];
|
||||
}
|
||||
});
|
||||
moduleCache[name] = module.default;
|
||||
return module.default
|
||||
}
|
||||
if (module.default) module = Object.assign({}, module.default, module);
|
||||
moduleCache[name] = module;
|
||||
return module
|
||||
// use a shared module which export default a function will getting error 'TypeError: xxx is not a function'
|
||||
if (typeof module.default === "function") {
|
||||
Object.keys(module).forEach((key) => {
|
||||
if (key !== "default") {
|
||||
module.default[key] = module[key];
|
||||
}
|
||||
});
|
||||
moduleCache[name] = module.default;
|
||||
return module.default;
|
||||
}
|
||||
if (module.default) module = Object.assign({}, module.default, module);
|
||||
moduleCache[name] = module;
|
||||
return module;
|
||||
}
|
||||
|
||||
export { importShared, getSharedFromLocal as importSharedLocal, getSharedFromRuntime as importSharedRuntime };
|
||||
|
||||
File diff suppressed because one or more lines are too long
@ -1,7 +1,7 @@
|
||||
import { g as getDefaultExportFromCjs } from './_commonjsHelpers-B85MJLTf.js';
|
||||
import { r as requireReact } from './index-DQGM2Mpm.js';
|
||||
import { g as getDefaultExportFromCjs } from "./_commonjsHelpers-B85MJLTf.js";
|
||||
import { r as requireReact } from "./index-DQGM2Mpm.js";
|
||||
|
||||
var reactExports = requireReact();
|
||||
const index = /*@__PURE__*/getDefaultExportFromCjs(reactExports);
|
||||
const index = /*@__PURE__*/ getDefaultExportFromCjs(reactExports);
|
||||
|
||||
export { index as default };
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
import { g as getDefaultExportFromCjs } from './_commonjsHelpers-B85MJLTf.js';
|
||||
import { r as requireReactDom } from './index-eoEhLOdg.js';
|
||||
import { g as getDefaultExportFromCjs } from "./_commonjsHelpers-B85MJLTf.js";
|
||||
import { r as requireReactDom } from "./index-eoEhLOdg.js";
|
||||
|
||||
var reactDomExports = requireReactDom();
|
||||
const index = /*@__PURE__*/getDefaultExportFromCjs(reactDomExports);
|
||||
const index = /*@__PURE__*/ getDefaultExportFromCjs(reactDomExports);
|
||||
|
||||
export { index as default };
|
||||
|
||||
4
web/dist/assets/_commonjsHelpers-B85MJLTf.js
vendored
4
web/dist/assets/_commonjsHelpers-B85MJLTf.js
vendored
@ -1,5 +1,5 @@
|
||||
function getDefaultExportFromCjs (x) {
|
||||
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
|
||||
function getDefaultExportFromCjs(x) {
|
||||
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x;
|
||||
}
|
||||
|
||||
export { getDefaultExportFromCjs as g };
|
||||
|
||||
25686
web/dist/assets/blocknote-editor-inner-TDURYXE3-M26_XwGL.js
vendored
25686
web/dist/assets/blocknote-editor-inner-TDURYXE3-M26_XwGL.js
vendored
File diff suppressed because it is too large
Load Diff
115869
web/dist/assets/index-BSkdT-DR.js
vendored
115869
web/dist/assets/index-BSkdT-DR.js
vendored
File diff suppressed because one or more lines are too long
36995
web/dist/assets/index-Bs--Ol2m.js
vendored
36995
web/dist/assets/index-Bs--Ol2m.js
vendored
File diff suppressed because it is too large
Load Diff
115
web/dist/assets/index-Coq9nAfE.js
vendored
115
web/dist/assets/index-Coq9nAfE.js
vendored
@ -1,5 +1,5 @@
|
||||
import { importShared } from './__federation_fn_import-hlt2XzeI.js';
|
||||
import { X as requireShim } from './index-Bs--Ol2m.js';
|
||||
import { importShared } from "./__federation_fn_import-hlt2XzeI.js";
|
||||
import { X as requireShim } from "./index-Bs--Ol2m.js";
|
||||
|
||||
/**
|
||||
* @license lucide-react v0.468.0 - ISC
|
||||
@ -9,9 +9,13 @@ import { X as requireShim } from './index-Bs--Ol2m.js';
|
||||
*/
|
||||
|
||||
const toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase();
|
||||
const mergeClasses = (...classes) => classes.filter((className, index, array) => {
|
||||
return Boolean(className) && className.trim() !== "" && array.indexOf(className) === index;
|
||||
}).join(" ").trim();
|
||||
const mergeClasses = (...classes) =>
|
||||
classes
|
||||
.filter((className, index, array) => {
|
||||
return Boolean(className) && className.trim() !== "" && array.indexOf(className) === index;
|
||||
})
|
||||
.join(" ")
|
||||
.trim();
|
||||
|
||||
/**
|
||||
* @license lucide-react v0.468.0 - ISC
|
||||
@ -21,15 +25,15 @@ const mergeClasses = (...classes) => classes.filter((className, index, array) =>
|
||||
*/
|
||||
|
||||
var defaultAttributes = {
|
||||
xmlns: "http://www.w3.org/2000/svg",
|
||||
width: 24,
|
||||
height: 24,
|
||||
viewBox: "0 0 24 24",
|
||||
fill: "none",
|
||||
stroke: "currentColor",
|
||||
strokeWidth: 2,
|
||||
strokeLinecap: "round",
|
||||
strokeLinejoin: "round"
|
||||
xmlns: "http://www.w3.org/2000/svg",
|
||||
width: 24,
|
||||
height: 24,
|
||||
viewBox: "0 0 24 24",
|
||||
fill: "none",
|
||||
stroke: "currentColor",
|
||||
strokeWidth: 2,
|
||||
strokeLinecap: "round",
|
||||
strokeLinejoin: "round",
|
||||
};
|
||||
|
||||
/**
|
||||
@ -39,38 +43,24 @@ var defaultAttributes = {
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
const {forwardRef: forwardRef$1,createElement: createElement$1} = await importShared('react');
|
||||
const { forwardRef: forwardRef$1, createElement: createElement$1 } = await importShared("react");
|
||||
|
||||
const Icon = forwardRef$1(
|
||||
({
|
||||
color = "currentColor",
|
||||
size = 24,
|
||||
strokeWidth = 2,
|
||||
absoluteStrokeWidth,
|
||||
className = "",
|
||||
children,
|
||||
iconNode,
|
||||
...rest
|
||||
}, ref) => {
|
||||
return createElement$1(
|
||||
"svg",
|
||||
{
|
||||
ref,
|
||||
...defaultAttributes,
|
||||
width: size,
|
||||
height: size,
|
||||
stroke: color,
|
||||
strokeWidth: absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size) : strokeWidth,
|
||||
className: mergeClasses("lucide", className),
|
||||
...rest
|
||||
},
|
||||
[
|
||||
...iconNode.map(([tag, attrs]) => createElement$1(tag, attrs)),
|
||||
...Array.isArray(children) ? children : [children]
|
||||
]
|
||||
);
|
||||
}
|
||||
);
|
||||
const Icon = forwardRef$1(({ color = "currentColor", size = 24, strokeWidth = 2, absoluteStrokeWidth, className = "", children, iconNode, ...rest }, ref) => {
|
||||
return createElement$1(
|
||||
"svg",
|
||||
{
|
||||
ref,
|
||||
...defaultAttributes,
|
||||
width: size,
|
||||
height: size,
|
||||
stroke: color,
|
||||
strokeWidth: absoluteStrokeWidth ? (Number(strokeWidth) * 24) / Number(size) : strokeWidth,
|
||||
className: mergeClasses("lucide", className),
|
||||
...rest,
|
||||
},
|
||||
[...iconNode.map(([tag, attrs]) => createElement$1(tag, attrs)), ...(Array.isArray(children) ? children : [children])],
|
||||
);
|
||||
});
|
||||
|
||||
/**
|
||||
* @license lucide-react v0.468.0 - ISC
|
||||
@ -79,19 +69,19 @@ const Icon = forwardRef$1(
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
const {forwardRef,createElement} = await importShared('react');
|
||||
const { forwardRef, createElement } = await importShared("react");
|
||||
|
||||
const createLucideIcon = (iconName, iconNode) => {
|
||||
const Component = forwardRef(
|
||||
({ className, ...props }, ref) => createElement(Icon, {
|
||||
ref,
|
||||
iconNode,
|
||||
className: mergeClasses(`lucide-${toKebabCase(iconName)}`, className),
|
||||
...props
|
||||
})
|
||||
);
|
||||
Component.displayName = `${iconName}`;
|
||||
return Component;
|
||||
const Component = forwardRef(({ className, ...props }, ref) =>
|
||||
createElement(Icon, {
|
||||
ref,
|
||||
iconNode,
|
||||
className: mergeClasses(`lucide-${toKebabCase(iconName)}`, className),
|
||||
...props,
|
||||
}),
|
||||
);
|
||||
Component.displayName = `${iconName}`;
|
||||
return Component;
|
||||
};
|
||||
|
||||
/**
|
||||
@ -101,14 +91,13 @@ const createLucideIcon = (iconName, iconNode) => {
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
|
||||
const List = createLucideIcon("List", [
|
||||
["path", { d: "M3 12h.01", key: "nlz23k" }],
|
||||
["path", { d: "M3 18h.01", key: "1tta3j" }],
|
||||
["path", { d: "M3 6h.01", key: "1rqtza" }],
|
||||
["path", { d: "M8 12h13", key: "1za7za" }],
|
||||
["path", { d: "M8 18h13", key: "1lx6n3" }],
|
||||
["path", { d: "M8 6h13", key: "ik3vkj" }]
|
||||
["path", { d: "M3 12h.01", key: "nlz23k" }],
|
||||
["path", { d: "M3 18h.01", key: "1tta3j" }],
|
||||
["path", { d: "M3 6h.01", key: "1rqtza" }],
|
||||
["path", { d: "M8 12h13", key: "1za7za" }],
|
||||
["path", { d: "M8 18h13", key: "1lx6n3" }],
|
||||
["path", { d: "M8 6h13", key: "ik3vkj" }],
|
||||
]);
|
||||
|
||||
var shimExports = requireShim();
|
||||
|
||||
1117
web/dist/assets/index-D75C7LcR.js
vendored
1117
web/dist/assets/index-D75C7LcR.js
vendored
File diff suppressed because it is too large
Load Diff
338
web/dist/assets/index-DQGM2Mpm.js
vendored
338
web/dist/assets/index-DQGM2Mpm.js
vendored
@ -1,4 +1,4 @@
|
||||
var react = {exports: {}};
|
||||
var react = { exports: {} };
|
||||
|
||||
var react_production_min = {};
|
||||
|
||||
@ -14,36 +14,332 @@ var react_production_min = {};
|
||||
|
||||
var hasRequiredReact_production_min;
|
||||
|
||||
function requireReact_production_min () {
|
||||
function requireReact_production_min() {
|
||||
if (hasRequiredReact_production_min) return react_production_min;
|
||||
hasRequiredReact_production_min = 1;
|
||||
var l=Symbol.for("react.element"),n=Symbol.for("react.portal"),p=Symbol.for("react.fragment"),q=Symbol.for("react.strict_mode"),r=Symbol.for("react.profiler"),t=Symbol.for("react.provider"),u=Symbol.for("react.context"),v=Symbol.for("react.forward_ref"),w=Symbol.for("react.suspense"),x=Symbol.for("react.memo"),y=Symbol.for("react.lazy"),z=Symbol.iterator;function A(a){if(null===a||"object"!==typeof a)return null;a=z&&a[z]||a["@@iterator"];return "function"===typeof a?a:null}
|
||||
var B={isMounted:function(){return false},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},C=Object.assign,D={};function E(a,b,e){this.props=a;this.context=b;this.refs=D;this.updater=e||B;}E.prototype.isReactComponent={};
|
||||
E.prototype.setState=function(a,b){if("object"!==typeof a&&"function"!==typeof a&&null!=a)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,a,b,"setState");};E.prototype.forceUpdate=function(a){this.updater.enqueueForceUpdate(this,a,"forceUpdate");};function F(){}F.prototype=E.prototype;function G(a,b,e){this.props=a;this.context=b;this.refs=D;this.updater=e||B;}var H=G.prototype=new F;
|
||||
H.constructor=G;C(H,E.prototype);H.isPureReactComponent=true;var I=Array.isArray,J=Object.prototype.hasOwnProperty,K={current:null},L={key:true,ref:true,__self:true,__source:true};
|
||||
function M(a,b,e){var d,c={},k=null,h=null;if(null!=b)for(d in void 0!==b.ref&&(h=b.ref),void 0!==b.key&&(k=""+b.key),b)J.call(b,d)&&!L.hasOwnProperty(d)&&(c[d]=b[d]);var g=arguments.length-2;if(1===g)c.children=e;else if(1<g){for(var f=Array(g),m=0;m<g;m++)f[m]=arguments[m+2];c.children=f;}if(a&&a.defaultProps)for(d in g=a.defaultProps,g) void 0===c[d]&&(c[d]=g[d]);return {$$typeof:l,type:a,key:k,ref:h,props:c,_owner:K.current}}
|
||||
function N(a,b){return {$$typeof:l,type:a.type,key:b,ref:a.ref,props:a.props,_owner:a._owner}}function O(a){return "object"===typeof a&&null!==a&&a.$$typeof===l}function escape(a){var b={"=":"=0",":":"=2"};return "$"+a.replace(/[=:]/g,function(a){return b[a]})}var P=/\/+/g;function Q(a,b){return "object"===typeof a&&null!==a&&null!=a.key?escape(""+a.key):b.toString(36)}
|
||||
function R(a,b,e,d,c){var k=typeof a;if("undefined"===k||"boolean"===k)a=null;var h=false;if(null===a)h=true;else switch(k){case "string":case "number":h=true;break;case "object":switch(a.$$typeof){case l:case n:h=true;}}if(h)return h=a,c=c(h),a=""===d?"."+Q(h,0):d,I(c)?(e="",null!=a&&(e=a.replace(P,"$&/")+"/"),R(c,b,e,"",function(a){return a})):null!=c&&(O(c)&&(c=N(c,e+(!c.key||h&&h.key===c.key?"":(""+c.key).replace(P,"$&/")+"/")+a)),b.push(c)),1;h=0;d=""===d?".":d+":";if(I(a))for(var g=0;g<a.length;g++){k=
|
||||
a[g];var f=d+Q(k,g);h+=R(k,b,e,f,c);}else if(f=A(a),"function"===typeof f)for(a=f.call(a),g=0;!(k=a.next()).done;)k=k.value,f=d+Q(k,g++),h+=R(k,b,e,f,c);else if("object"===k)throw b=String(a),Error("Objects are not valid as a React child (found: "+("[object Object]"===b?"object with keys {"+Object.keys(a).join(", ")+"}":b)+"). If you meant to render a collection of children, use an array instead.");return h}
|
||||
function S(a,b,e){if(null==a)return a;var d=[],c=0;R(a,d,"","",function(a){return b.call(e,a,c++)});return d}function T(a){if(-1===a._status){var b=a._result;b=b();b.then(function(b){if(0===a._status||-1===a._status)a._status=1,a._result=b;},function(b){if(0===a._status||-1===a._status)a._status=2,a._result=b;});-1===a._status&&(a._status=0,a._result=b);}if(1===a._status)return a._result.default;throw a._result;}
|
||||
var U={current:null},V={transition:null},W={ReactCurrentDispatcher:U,ReactCurrentBatchConfig:V,ReactCurrentOwner:K};function X(){throw Error("act(...) is not supported in production builds of React.");}
|
||||
react_production_min.Children={map:S,forEach:function(a,b,e){S(a,function(){b.apply(this,arguments);},e);},count:function(a){var b=0;S(a,function(){b++;});return b},toArray:function(a){return S(a,function(a){return a})||[]},only:function(a){if(!O(a))throw Error("React.Children.only expected to receive a single React element child.");return a}};react_production_min.Component=E;react_production_min.Fragment=p;react_production_min.Profiler=r;react_production_min.PureComponent=G;react_production_min.StrictMode=q;react_production_min.Suspense=w;
|
||||
react_production_min.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=W;react_production_min.act=X;
|
||||
react_production_min.cloneElement=function(a,b,e){if(null===a||void 0===a)throw Error("React.cloneElement(...): The argument must be a React element, but you passed "+a+".");var d=C({},a.props),c=a.key,k=a.ref,h=a._owner;if(null!=b){ void 0!==b.ref&&(k=b.ref,h=K.current);void 0!==b.key&&(c=""+b.key);if(a.type&&a.type.defaultProps)var g=a.type.defaultProps;for(f in b)J.call(b,f)&&!L.hasOwnProperty(f)&&(d[f]=void 0===b[f]&&void 0!==g?g[f]:b[f]);}var f=arguments.length-2;if(1===f)d.children=e;else if(1<f){g=Array(f);
|
||||
for(var m=0;m<f;m++)g[m]=arguments[m+2];d.children=g;}return {$$typeof:l,type:a.type,key:c,ref:k,props:d,_owner:h}};react_production_min.createContext=function(a){a={$$typeof:u,_currentValue:a,_currentValue2:a,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null};a.Provider={$$typeof:t,_context:a};return a.Consumer=a};react_production_min.createElement=M;react_production_min.createFactory=function(a){var b=M.bind(null,a);b.type=a;return b};react_production_min.createRef=function(){return {current:null}};
|
||||
react_production_min.forwardRef=function(a){return {$$typeof:v,render:a}};react_production_min.isValidElement=O;react_production_min.lazy=function(a){return {$$typeof:y,_payload:{_status:-1,_result:a},_init:T}};react_production_min.memo=function(a,b){return {$$typeof:x,type:a,compare:void 0===b?null:b}};react_production_min.startTransition=function(a){var b=V.transition;V.transition={};try{a();}finally{V.transition=b;}};react_production_min.unstable_act=X;react_production_min.useCallback=function(a,b){return U.current.useCallback(a,b)};react_production_min.useContext=function(a){return U.current.useContext(a)};
|
||||
react_production_min.useDebugValue=function(){};react_production_min.useDeferredValue=function(a){return U.current.useDeferredValue(a)};react_production_min.useEffect=function(a,b){return U.current.useEffect(a,b)};react_production_min.useId=function(){return U.current.useId()};react_production_min.useImperativeHandle=function(a,b,e){return U.current.useImperativeHandle(a,b,e)};react_production_min.useInsertionEffect=function(a,b){return U.current.useInsertionEffect(a,b)};react_production_min.useLayoutEffect=function(a,b){return U.current.useLayoutEffect(a,b)};
|
||||
react_production_min.useMemo=function(a,b){return U.current.useMemo(a,b)};react_production_min.useReducer=function(a,b,e){return U.current.useReducer(a,b,e)};react_production_min.useRef=function(a){return U.current.useRef(a)};react_production_min.useState=function(a){return U.current.useState(a)};react_production_min.useSyncExternalStore=function(a,b,e){return U.current.useSyncExternalStore(a,b,e)};react_production_min.useTransition=function(){return U.current.useTransition()};react_production_min.version="18.3.1";
|
||||
var l = Symbol.for("react.element"),
|
||||
n = Symbol.for("react.portal"),
|
||||
p = Symbol.for("react.fragment"),
|
||||
q = Symbol.for("react.strict_mode"),
|
||||
r = Symbol.for("react.profiler"),
|
||||
t = Symbol.for("react.provider"),
|
||||
u = Symbol.for("react.context"),
|
||||
v = Symbol.for("react.forward_ref"),
|
||||
w = Symbol.for("react.suspense"),
|
||||
x = Symbol.for("react.memo"),
|
||||
y = Symbol.for("react.lazy"),
|
||||
z = Symbol.iterator;
|
||||
function A(a) {
|
||||
if (null === a || "object" !== typeof a) return null;
|
||||
a = (z && a[z]) || a["@@iterator"];
|
||||
return "function" === typeof a ? a : null;
|
||||
}
|
||||
var B = {
|
||||
isMounted: function () {
|
||||
return false;
|
||||
},
|
||||
enqueueForceUpdate: function () {},
|
||||
enqueueReplaceState: function () {},
|
||||
enqueueSetState: function () {},
|
||||
},
|
||||
C = Object.assign,
|
||||
D = {};
|
||||
function E(a, b, e) {
|
||||
this.props = a;
|
||||
this.context = b;
|
||||
this.refs = D;
|
||||
this.updater = e || B;
|
||||
}
|
||||
E.prototype.isReactComponent = {};
|
||||
E.prototype.setState = function (a, b) {
|
||||
if ("object" !== typeof a && "function" !== typeof a && null != a)
|
||||
throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");
|
||||
this.updater.enqueueSetState(this, a, b, "setState");
|
||||
};
|
||||
E.prototype.forceUpdate = function (a) {
|
||||
this.updater.enqueueForceUpdate(this, a, "forceUpdate");
|
||||
};
|
||||
function F() {}
|
||||
F.prototype = E.prototype;
|
||||
function G(a, b, e) {
|
||||
this.props = a;
|
||||
this.context = b;
|
||||
this.refs = D;
|
||||
this.updater = e || B;
|
||||
}
|
||||
var H = (G.prototype = new F());
|
||||
H.constructor = G;
|
||||
C(H, E.prototype);
|
||||
H.isPureReactComponent = true;
|
||||
var I = Array.isArray,
|
||||
J = Object.prototype.hasOwnProperty,
|
||||
K = { current: null },
|
||||
L = { key: true, ref: true, __self: true, __source: true };
|
||||
function M(a, b, e) {
|
||||
var d,
|
||||
c = {},
|
||||
k = null,
|
||||
h = null;
|
||||
if (null != b) for (d in (void 0 !== b.ref && (h = b.ref), void 0 !== b.key && (k = "" + b.key), b)) J.call(b, d) && !L.hasOwnProperty(d) && (c[d] = b[d]);
|
||||
var g = arguments.length - 2;
|
||||
if (1 === g) c.children = e;
|
||||
else if (1 < g) {
|
||||
for (var f = Array(g), m = 0; m < g; m++) f[m] = arguments[m + 2];
|
||||
c.children = f;
|
||||
}
|
||||
if (a && a.defaultProps) for (d in ((g = a.defaultProps), g)) void 0 === c[d] && (c[d] = g[d]);
|
||||
return { $$typeof: l, type: a, key: k, ref: h, props: c, _owner: K.current };
|
||||
}
|
||||
function N(a, b) {
|
||||
return { $$typeof: l, type: a.type, key: b, ref: a.ref, props: a.props, _owner: a._owner };
|
||||
}
|
||||
function O(a) {
|
||||
return "object" === typeof a && null !== a && a.$$typeof === l;
|
||||
}
|
||||
function escape(a) {
|
||||
var b = { "=": "=0", ":": "=2" };
|
||||
return (
|
||||
"$" +
|
||||
a.replace(/[=:]/g, function (a) {
|
||||
return b[a];
|
||||
})
|
||||
);
|
||||
}
|
||||
var P = /\/+/g;
|
||||
function Q(a, b) {
|
||||
return "object" === typeof a && null !== a && null != a.key ? escape("" + a.key) : b.toString(36);
|
||||
}
|
||||
function R(a, b, e, d, c) {
|
||||
var k = typeof a;
|
||||
if ("undefined" === k || "boolean" === k) a = null;
|
||||
var h = false;
|
||||
if (null === a) h = true;
|
||||
else
|
||||
switch (k) {
|
||||
case "string":
|
||||
case "number":
|
||||
h = true;
|
||||
break;
|
||||
case "object":
|
||||
switch (a.$$typeof) {
|
||||
case l:
|
||||
case n:
|
||||
h = true;
|
||||
}
|
||||
}
|
||||
if (h)
|
||||
return (
|
||||
(h = a),
|
||||
(c = c(h)),
|
||||
(a = "" === d ? "." + Q(h, 0) : d),
|
||||
I(c) ?
|
||||
((e = ""),
|
||||
null != a && (e = a.replace(P, "$&/") + "/"),
|
||||
R(c, b, e, "", function (a) {
|
||||
return a;
|
||||
}))
|
||||
: null != c && (O(c) && (c = N(c, e + (!c.key || (h && h.key === c.key) ? "" : ("" + c.key).replace(P, "$&/") + "/") + a)), b.push(c)),
|
||||
1
|
||||
);
|
||||
h = 0;
|
||||
d = "" === d ? "." : d + ":";
|
||||
if (I(a))
|
||||
for (var g = 0; g < a.length; g++) {
|
||||
k = a[g];
|
||||
var f = d + Q(k, g);
|
||||
h += R(k, b, e, f, c);
|
||||
}
|
||||
else if (((f = A(a)), "function" === typeof f)) for (a = f.call(a), g = 0; !(k = a.next()).done; ) ((k = k.value), (f = d + Q(k, g++)), (h += R(k, b, e, f, c)));
|
||||
else if ("object" === k)
|
||||
throw (
|
||||
(b = String(a)),
|
||||
Error(
|
||||
"Objects are not valid as a React child (found: " +
|
||||
("[object Object]" === b ? "object with keys {" + Object.keys(a).join(", ") + "}" : b) +
|
||||
"). If you meant to render a collection of children, use an array instead.",
|
||||
)
|
||||
);
|
||||
return h;
|
||||
}
|
||||
function S(a, b, e) {
|
||||
if (null == a) return a;
|
||||
var d = [],
|
||||
c = 0;
|
||||
R(a, d, "", "", function (a) {
|
||||
return b.call(e, a, c++);
|
||||
});
|
||||
return d;
|
||||
}
|
||||
function T(a) {
|
||||
if (-1 === a._status) {
|
||||
var b = a._result;
|
||||
b = b();
|
||||
b.then(
|
||||
function (b) {
|
||||
if (0 === a._status || -1 === a._status) ((a._status = 1), (a._result = b));
|
||||
},
|
||||
function (b) {
|
||||
if (0 === a._status || -1 === a._status) ((a._status = 2), (a._result = b));
|
||||
},
|
||||
);
|
||||
-1 === a._status && ((a._status = 0), (a._result = b));
|
||||
}
|
||||
if (1 === a._status) return a._result.default;
|
||||
throw a._result;
|
||||
}
|
||||
var U = { current: null },
|
||||
V = { transition: null },
|
||||
W = { ReactCurrentDispatcher: U, ReactCurrentBatchConfig: V, ReactCurrentOwner: K };
|
||||
function X() {
|
||||
throw Error("act(...) is not supported in production builds of React.");
|
||||
}
|
||||
react_production_min.Children = {
|
||||
map: S,
|
||||
forEach: function (a, b, e) {
|
||||
S(
|
||||
a,
|
||||
function () {
|
||||
b.apply(this, arguments);
|
||||
},
|
||||
e,
|
||||
);
|
||||
},
|
||||
count: function (a) {
|
||||
var b = 0;
|
||||
S(a, function () {
|
||||
b++;
|
||||
});
|
||||
return b;
|
||||
},
|
||||
toArray: function (a) {
|
||||
return (
|
||||
S(a, function (a) {
|
||||
return a;
|
||||
}) || []
|
||||
);
|
||||
},
|
||||
only: function (a) {
|
||||
if (!O(a)) throw Error("React.Children.only expected to receive a single React element child.");
|
||||
return a;
|
||||
},
|
||||
};
|
||||
react_production_min.Component = E;
|
||||
react_production_min.Fragment = p;
|
||||
react_production_min.Profiler = r;
|
||||
react_production_min.PureComponent = G;
|
||||
react_production_min.StrictMode = q;
|
||||
react_production_min.Suspense = w;
|
||||
react_production_min.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = W;
|
||||
react_production_min.act = X;
|
||||
react_production_min.cloneElement = function (a, b, e) {
|
||||
if (null === a || void 0 === a) throw Error("React.cloneElement(...): The argument must be a React element, but you passed " + a + ".");
|
||||
var d = C({}, a.props),
|
||||
c = a.key,
|
||||
k = a.ref,
|
||||
h = a._owner;
|
||||
if (null != b) {
|
||||
void 0 !== b.ref && ((k = b.ref), (h = K.current));
|
||||
void 0 !== b.key && (c = "" + b.key);
|
||||
if (a.type && a.type.defaultProps) var g = a.type.defaultProps;
|
||||
for (f in b) J.call(b, f) && !L.hasOwnProperty(f) && (d[f] = void 0 === b[f] && void 0 !== g ? g[f] : b[f]);
|
||||
}
|
||||
var f = arguments.length - 2;
|
||||
if (1 === f) d.children = e;
|
||||
else if (1 < f) {
|
||||
g = Array(f);
|
||||
for (var m = 0; m < f; m++) g[m] = arguments[m + 2];
|
||||
d.children = g;
|
||||
}
|
||||
return { $$typeof: l, type: a.type, key: c, ref: k, props: d, _owner: h };
|
||||
};
|
||||
react_production_min.createContext = function (a) {
|
||||
a = { $$typeof: u, _currentValue: a, _currentValue2: a, _threadCount: 0, Provider: null, Consumer: null, _defaultValue: null, _globalName: null };
|
||||
a.Provider = { $$typeof: t, _context: a };
|
||||
return (a.Consumer = a);
|
||||
};
|
||||
react_production_min.createElement = M;
|
||||
react_production_min.createFactory = function (a) {
|
||||
var b = M.bind(null, a);
|
||||
b.type = a;
|
||||
return b;
|
||||
};
|
||||
react_production_min.createRef = function () {
|
||||
return { current: null };
|
||||
};
|
||||
react_production_min.forwardRef = function (a) {
|
||||
return { $$typeof: v, render: a };
|
||||
};
|
||||
react_production_min.isValidElement = O;
|
||||
react_production_min.lazy = function (a) {
|
||||
return { $$typeof: y, _payload: { _status: -1, _result: a }, _init: T };
|
||||
};
|
||||
react_production_min.memo = function (a, b) {
|
||||
return { $$typeof: x, type: a, compare: void 0 === b ? null : b };
|
||||
};
|
||||
react_production_min.startTransition = function (a) {
|
||||
var b = V.transition;
|
||||
V.transition = {};
|
||||
try {
|
||||
a();
|
||||
} finally {
|
||||
V.transition = b;
|
||||
}
|
||||
};
|
||||
react_production_min.unstable_act = X;
|
||||
react_production_min.useCallback = function (a, b) {
|
||||
return U.current.useCallback(a, b);
|
||||
};
|
||||
react_production_min.useContext = function (a) {
|
||||
return U.current.useContext(a);
|
||||
};
|
||||
react_production_min.useDebugValue = function () {};
|
||||
react_production_min.useDeferredValue = function (a) {
|
||||
return U.current.useDeferredValue(a);
|
||||
};
|
||||
react_production_min.useEffect = function (a, b) {
|
||||
return U.current.useEffect(a, b);
|
||||
};
|
||||
react_production_min.useId = function () {
|
||||
return U.current.useId();
|
||||
};
|
||||
react_production_min.useImperativeHandle = function (a, b, e) {
|
||||
return U.current.useImperativeHandle(a, b, e);
|
||||
};
|
||||
react_production_min.useInsertionEffect = function (a, b) {
|
||||
return U.current.useInsertionEffect(a, b);
|
||||
};
|
||||
react_production_min.useLayoutEffect = function (a, b) {
|
||||
return U.current.useLayoutEffect(a, b);
|
||||
};
|
||||
react_production_min.useMemo = function (a, b) {
|
||||
return U.current.useMemo(a, b);
|
||||
};
|
||||
react_production_min.useReducer = function (a, b, e) {
|
||||
return U.current.useReducer(a, b, e);
|
||||
};
|
||||
react_production_min.useRef = function (a) {
|
||||
return U.current.useRef(a);
|
||||
};
|
||||
react_production_min.useState = function (a) {
|
||||
return U.current.useState(a);
|
||||
};
|
||||
react_production_min.useSyncExternalStore = function (a, b, e) {
|
||||
return U.current.useSyncExternalStore(a, b, e);
|
||||
};
|
||||
react_production_min.useTransition = function () {
|
||||
return U.current.useTransition();
|
||||
};
|
||||
react_production_min.version = "18.3.1";
|
||||
return react_production_min;
|
||||
}
|
||||
|
||||
var hasRequiredReact;
|
||||
|
||||
function requireReact () {
|
||||
function requireReact() {
|
||||
if (hasRequiredReact) return react.exports;
|
||||
hasRequiredReact = 1;
|
||||
{
|
||||
react.exports = requireReact_production_min();
|
||||
react.exports = requireReact_production_min();
|
||||
}
|
||||
return react.exports;
|
||||
}
|
||||
|
||||
7940
web/dist/assets/index-eoEhLOdg.js
vendored
7940
web/dist/assets/index-eoEhLOdg.js
vendored
File diff suppressed because it is too large
Load Diff
33
web/dist/assets/jsx-runtime-CvJTHeKY.js
vendored
33
web/dist/assets/jsx-runtime-CvJTHeKY.js
vendored
@ -1,6 +1,6 @@
|
||||
import { r as requireReact } from './index-DQGM2Mpm.js';
|
||||
import { r as requireReact } from "./index-DQGM2Mpm.js";
|
||||
|
||||
var jsxRuntime = {exports: {}};
|
||||
var jsxRuntime = { exports: {} };
|
||||
|
||||
var reactJsxRuntime_production_min = {};
|
||||
|
||||
@ -16,21 +16,40 @@ var reactJsxRuntime_production_min = {};
|
||||
|
||||
var hasRequiredReactJsxRuntime_production_min;
|
||||
|
||||
function requireReactJsxRuntime_production_min () {
|
||||
function requireReactJsxRuntime_production_min() {
|
||||
if (hasRequiredReactJsxRuntime_production_min) return reactJsxRuntime_production_min;
|
||||
hasRequiredReactJsxRuntime_production_min = 1;
|
||||
var f=requireReact(),k=Symbol.for("react.element"),l=Symbol.for("react.fragment"),m=Object.prototype.hasOwnProperty,n=f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:true,ref:true,__self:true,__source:true};
|
||||
function q(c,a,g){var b,d={},e=null,h=null;void 0!==g&&(e=""+g);void 0!==a.key&&(e=""+a.key);void 0!==a.ref&&(h=a.ref);for(b in a)m.call(a,b)&&!p.hasOwnProperty(b)&&(d[b]=a[b]);if(c&&c.defaultProps)for(b in a=c.defaultProps,a) void 0===d[b]&&(d[b]=a[b]);return {$$typeof:k,type:c,key:e,ref:h,props:d,_owner:n.current}}reactJsxRuntime_production_min.Fragment=l;reactJsxRuntime_production_min.jsx=q;reactJsxRuntime_production_min.jsxs=q;
|
||||
var f = requireReact(),
|
||||
k = Symbol.for("react.element"),
|
||||
l = Symbol.for("react.fragment"),
|
||||
m = Object.prototype.hasOwnProperty,
|
||||
n = f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,
|
||||
p = { key: true, ref: true, __self: true, __source: true };
|
||||
function q(c, a, g) {
|
||||
var b,
|
||||
d = {},
|
||||
e = null,
|
||||
h = null;
|
||||
void 0 !== g && (e = "" + g);
|
||||
void 0 !== a.key && (e = "" + a.key);
|
||||
void 0 !== a.ref && (h = a.ref);
|
||||
for (b in a) m.call(a, b) && !p.hasOwnProperty(b) && (d[b] = a[b]);
|
||||
if (c && c.defaultProps) for (b in ((a = c.defaultProps), a)) void 0 === d[b] && (d[b] = a[b]);
|
||||
return { $$typeof: k, type: c, key: e, ref: h, props: d, _owner: n.current };
|
||||
}
|
||||
reactJsxRuntime_production_min.Fragment = l;
|
||||
reactJsxRuntime_production_min.jsx = q;
|
||||
reactJsxRuntime_production_min.jsxs = q;
|
||||
return reactJsxRuntime_production_min;
|
||||
}
|
||||
|
||||
var hasRequiredJsxRuntime;
|
||||
|
||||
function requireJsxRuntime () {
|
||||
function requireJsxRuntime() {
|
||||
if (hasRequiredJsxRuntime) return jsxRuntime.exports;
|
||||
hasRequiredJsxRuntime = 1;
|
||||
{
|
||||
jsxRuntime.exports = requireReactJsxRuntime_production_min();
|
||||
jsxRuntime.exports = requireReactJsxRuntime_production_min();
|
||||
}
|
||||
return jsxRuntime.exports;
|
||||
}
|
||||
|
||||
25040
web/dist/assets/markdown-editor-inner-UDKJCI6H-CeENUUs8.js
vendored
25040
web/dist/assets/markdown-editor-inner-UDKJCI6H-CeENUUs8.js
vendored
File diff suppressed because one or more lines are too long
5156
web/dist/assets/module-CfopjtOo.js
vendored
5156
web/dist/assets/module-CfopjtOo.js
vendored
File diff suppressed because one or more lines are too long
82
web/dist/assets/native-DB2Z31Rx.js
vendored
82
web/dist/assets/native-DB2Z31Rx.js
vendored
File diff suppressed because one or more lines are too long
154
web/dist/assets/remoteEntry.js
vendored
154
web/dist/assets/remoteEntry.js
vendored
@ -1,84 +1,88 @@
|
||||
const currentImports = {};
|
||||
const exportSet = new Set(['Module', '__esModule', 'default', '_export_sfc']);
|
||||
let moduleMap = {
|
||||
"./editor":()=>{
|
||||
dynamicLoadingCss(["style-Bs2zy9jQ.css"], false, './editor');
|
||||
return __federation_import('./__federation_expose_Editor-DbTTOPh9.js').then(module =>Object.keys(module).every(item => exportSet.has(item)) ? () => module.default : () => module)},
|
||||
"./settings":()=>{
|
||||
dynamicLoadingCss(["style-Bs2zy9jQ.css"], false, './settings');
|
||||
return __federation_import('./__federation_expose_Settings-C7jFM1o4.js').then(module =>Object.keys(module).every(item => exportSet.has(item)) ? () => module.default : () => module)},};
|
||||
const seen = {};
|
||||
const dynamicLoadingCss = (cssFilePaths, dontAppendStylesToHead, exposeItemName) => {
|
||||
const metaUrl = import.meta.url;
|
||||
if (typeof metaUrl === 'undefined') {
|
||||
console.warn('The remote style takes effect only when the build.target option in the vite.config.ts file is higher than that of "es2020".');
|
||||
return;
|
||||
}
|
||||
const exportSet = new Set(["Module", "__esModule", "default", "_export_sfc"]);
|
||||
let moduleMap = {
|
||||
"./editor": () => {
|
||||
dynamicLoadingCss(["style-Bs2zy9jQ.css"], false, "./editor");
|
||||
return __federation_import("./__federation_expose_Editor-DbTTOPh9.js").then((module) => (Object.keys(module).every((item) => exportSet.has(item)) ? () => module.default : () => module));
|
||||
},
|
||||
"./settings": () => {
|
||||
dynamicLoadingCss(["style-Bs2zy9jQ.css"], false, "./settings");
|
||||
return __federation_import("./__federation_expose_Settings-C7jFM1o4.js").then((module) => (Object.keys(module).every((item) => exportSet.has(item)) ? () => module.default : () => module));
|
||||
},
|
||||
};
|
||||
const seen = {};
|
||||
const dynamicLoadingCss = (cssFilePaths, dontAppendStylesToHead, exposeItemName) => {
|
||||
const metaUrl = import.meta.url;
|
||||
if (typeof metaUrl === "undefined") {
|
||||
console.warn('The remote style takes effect only when the build.target option in the vite.config.ts file is higher than that of "es2020".');
|
||||
return;
|
||||
}
|
||||
|
||||
const curUrl = metaUrl.substring(0, metaUrl.lastIndexOf('remoteEntry.js'));
|
||||
const base = '/';
|
||||
'assets';
|
||||
const curUrl = metaUrl.substring(0, metaUrl.lastIndexOf("remoteEntry.js"));
|
||||
const base = "/";
|
||||
("assets");
|
||||
|
||||
cssFilePaths.forEach(cssPath => {
|
||||
let href = '';
|
||||
const baseUrl = base || curUrl;
|
||||
if (baseUrl) {
|
||||
const trimmer = {
|
||||
trailing: (path) => (path.endsWith('/') ? path.slice(0, -1) : path),
|
||||
leading: (path) => (path.startsWith('/') ? path.slice(1) : path)
|
||||
};
|
||||
const isAbsoluteUrl = (url) => url.startsWith('http') || url.startsWith('//');
|
||||
cssFilePaths.forEach((cssPath) => {
|
||||
let href = "";
|
||||
const baseUrl = base || curUrl;
|
||||
if (baseUrl) {
|
||||
const trimmer = {
|
||||
trailing: (path) => (path.endsWith("/") ? path.slice(0, -1) : path),
|
||||
leading: (path) => (path.startsWith("/") ? path.slice(1) : path),
|
||||
};
|
||||
const isAbsoluteUrl = (url) => url.startsWith("http") || url.startsWith("//");
|
||||
|
||||
const cleanBaseUrl = trimmer.trailing(baseUrl);
|
||||
const cleanCssPath = trimmer.leading(cssPath);
|
||||
const cleanCurUrl = trimmer.trailing(curUrl);
|
||||
const cleanBaseUrl = trimmer.trailing(baseUrl);
|
||||
const cleanCssPath = trimmer.leading(cssPath);
|
||||
const cleanCurUrl = trimmer.trailing(curUrl);
|
||||
|
||||
if (isAbsoluteUrl(baseUrl)) {
|
||||
href = [cleanBaseUrl, cleanCssPath].filter(Boolean).join('/');
|
||||
} else {
|
||||
if (cleanCurUrl.includes(cleanBaseUrl)) {
|
||||
href = [cleanCurUrl, cleanCssPath].filter(Boolean).join('/');
|
||||
} else {
|
||||
href = [cleanCurUrl + cleanBaseUrl, cleanCssPath].filter(Boolean).join('/');
|
||||
}
|
||||
}
|
||||
} else {
|
||||
href = cssPath;
|
||||
}
|
||||
|
||||
if (dontAppendStylesToHead) {
|
||||
const key = 'css__calcomblock__' + exposeItemName;
|
||||
window[key] = window[key] || [];
|
||||
window[key].push(href);
|
||||
return;
|
||||
}
|
||||
if (isAbsoluteUrl(baseUrl)) {
|
||||
href = [cleanBaseUrl, cleanCssPath].filter(Boolean).join("/");
|
||||
} else {
|
||||
if (cleanCurUrl.includes(cleanBaseUrl)) {
|
||||
href = [cleanCurUrl, cleanCssPath].filter(Boolean).join("/");
|
||||
} else {
|
||||
href = [cleanCurUrl + cleanBaseUrl, cleanCssPath].filter(Boolean).join("/");
|
||||
}
|
||||
}
|
||||
} else {
|
||||
href = cssPath;
|
||||
}
|
||||
|
||||
if (href in seen) return;
|
||||
seen[href] = true;
|
||||
if (dontAppendStylesToHead) {
|
||||
const key = "css__calcomblock__" + exposeItemName;
|
||||
window[key] = window[key] || [];
|
||||
window[key].push(href);
|
||||
return;
|
||||
}
|
||||
|
||||
const element = document.createElement('link');
|
||||
element.rel = 'stylesheet';
|
||||
element.href = href;
|
||||
document.head.appendChild(element);
|
||||
});
|
||||
};
|
||||
async function __federation_import(name) {
|
||||
currentImports[name] ??= import(name);
|
||||
return currentImports[name]
|
||||
} const get =(module) => {
|
||||
if(!moduleMap[module]) throw new Error('Can not find remote module ' + module)
|
||||
return moduleMap[module]();
|
||||
};
|
||||
const init =(shareScope) => {
|
||||
globalThis.__federation_shared__= globalThis.__federation_shared__|| {};
|
||||
Object.entries(shareScope).forEach(([key, value]) => {
|
||||
for (const [versionKey, versionValue] of Object.entries(value)) {
|
||||
const scope = versionValue.scope || 'default';
|
||||
globalThis.__federation_shared__[scope] = globalThis.__federation_shared__[scope] || {};
|
||||
const shared= globalThis.__federation_shared__[scope];
|
||||
(shared[key] = shared[key]||{})[versionKey] = versionValue;
|
||||
}
|
||||
});
|
||||
};
|
||||
if (href in seen) return;
|
||||
seen[href] = true;
|
||||
|
||||
const element = document.createElement("link");
|
||||
element.rel = "stylesheet";
|
||||
element.href = href;
|
||||
document.head.appendChild(element);
|
||||
});
|
||||
};
|
||||
async function __federation_import(name) {
|
||||
currentImports[name] ??= import(name);
|
||||
return currentImports[name];
|
||||
}
|
||||
const get = (module) => {
|
||||
if (!moduleMap[module]) throw new Error("Can not find remote module " + module);
|
||||
return moduleMap[module]();
|
||||
};
|
||||
const init = (shareScope) => {
|
||||
globalThis.__federation_shared__ = globalThis.__federation_shared__ || {};
|
||||
Object.entries(shareScope).forEach(([key, value]) => {
|
||||
for (const [versionKey, versionValue] of Object.entries(value)) {
|
||||
const scope = versionValue.scope || "default";
|
||||
globalThis.__federation_shared__[scope] = globalThis.__federation_shared__[scope] || {};
|
||||
const shared = globalThis.__federation_shared__[scope];
|
||||
(shared[key] = shared[key] || {})[versionKey] = versionValue;
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
export { dynamicLoadingCss, get, init };
|
||||
|
||||
1029
web/dist/assets/style-Bs2zy9jQ.css
vendored
1029
web/dist/assets/style-Bs2zy9jQ.css
vendored
File diff suppressed because one or more lines are too long
141
web/dist/assets/with-selector-B2V6shWK.js
vendored
141
web/dist/assets/with-selector-B2V6shWK.js
vendored
@ -1,7 +1,7 @@
|
||||
import { r as requireReact } from './index-DQGM2Mpm.js';
|
||||
import { X as requireShim } from './index-Bs--Ol2m.js';
|
||||
import { r as requireReact } from "./index-DQGM2Mpm.js";
|
||||
import { X as requireShim } from "./index-Bs--Ol2m.js";
|
||||
|
||||
var withSelector = {exports: {}};
|
||||
var withSelector = { exports: {} };
|
||||
|
||||
var withSelector_production = {};
|
||||
|
||||
@ -17,93 +17,84 @@ var withSelector_production = {};
|
||||
|
||||
var hasRequiredWithSelector_production;
|
||||
|
||||
function requireWithSelector_production () {
|
||||
function requireWithSelector_production() {
|
||||
if (hasRequiredWithSelector_production) return withSelector_production;
|
||||
hasRequiredWithSelector_production = 1;
|
||||
var React = requireReact(),
|
||||
shim = requireShim();
|
||||
shim = requireShim();
|
||||
function is(x, y) {
|
||||
return (x === y && (0 !== x || 1 / x === 1 / y)) || (x !== x && y !== y);
|
||||
return (x === y && (0 !== x || 1 / x === 1 / y)) || (x !== x && y !== y);
|
||||
}
|
||||
var objectIs = "function" === typeof Object.is ? Object.is : is,
|
||||
useSyncExternalStore = shim.useSyncExternalStore,
|
||||
useRef = React.useRef,
|
||||
useEffect = React.useEffect,
|
||||
useMemo = React.useMemo,
|
||||
useDebugValue = React.useDebugValue;
|
||||
withSelector_production.useSyncExternalStoreWithSelector = function (
|
||||
subscribe,
|
||||
getSnapshot,
|
||||
getServerSnapshot,
|
||||
selector,
|
||||
isEqual
|
||||
) {
|
||||
var instRef = useRef(null);
|
||||
if (null === instRef.current) {
|
||||
var inst = { hasValue: false, value: null };
|
||||
instRef.current = inst;
|
||||
} else inst = instRef.current;
|
||||
instRef = useMemo(
|
||||
function () {
|
||||
function memoizedSelector(nextSnapshot) {
|
||||
if (!hasMemo) {
|
||||
hasMemo = true;
|
||||
memoizedSnapshot = nextSnapshot;
|
||||
nextSnapshot = selector(nextSnapshot);
|
||||
if (void 0 !== isEqual && inst.hasValue) {
|
||||
var currentSelection = inst.value;
|
||||
if (isEqual(currentSelection, nextSnapshot))
|
||||
return (memoizedSelection = currentSelection);
|
||||
}
|
||||
return (memoizedSelection = nextSnapshot);
|
||||
}
|
||||
currentSelection = memoizedSelection;
|
||||
if (objectIs(memoizedSnapshot, nextSnapshot)) return currentSelection;
|
||||
var nextSelection = selector(nextSnapshot);
|
||||
if (void 0 !== isEqual && isEqual(currentSelection, nextSelection))
|
||||
return (memoizedSnapshot = nextSnapshot), currentSelection;
|
||||
memoizedSnapshot = nextSnapshot;
|
||||
return (memoizedSelection = nextSelection);
|
||||
}
|
||||
var hasMemo = false,
|
||||
memoizedSnapshot,
|
||||
memoizedSelection,
|
||||
maybeGetServerSnapshot =
|
||||
void 0 === getServerSnapshot ? null : getServerSnapshot;
|
||||
return [
|
||||
function () {
|
||||
return memoizedSelector(getSnapshot());
|
||||
},
|
||||
null === maybeGetServerSnapshot
|
||||
? void 0
|
||||
: function () {
|
||||
return memoizedSelector(maybeGetServerSnapshot());
|
||||
}
|
||||
];
|
||||
},
|
||||
[getSnapshot, getServerSnapshot, selector, isEqual]
|
||||
);
|
||||
var value = useSyncExternalStore(subscribe, instRef[0], instRef[1]);
|
||||
useEffect(
|
||||
function () {
|
||||
inst.hasValue = true;
|
||||
inst.value = value;
|
||||
},
|
||||
[value]
|
||||
);
|
||||
useDebugValue(value);
|
||||
return value;
|
||||
useSyncExternalStore = shim.useSyncExternalStore,
|
||||
useRef = React.useRef,
|
||||
useEffect = React.useEffect,
|
||||
useMemo = React.useMemo,
|
||||
useDebugValue = React.useDebugValue;
|
||||
withSelector_production.useSyncExternalStoreWithSelector = function (subscribe, getSnapshot, getServerSnapshot, selector, isEqual) {
|
||||
var instRef = useRef(null);
|
||||
if (null === instRef.current) {
|
||||
var inst = { hasValue: false, value: null };
|
||||
instRef.current = inst;
|
||||
} else inst = instRef.current;
|
||||
instRef = useMemo(
|
||||
function () {
|
||||
function memoizedSelector(nextSnapshot) {
|
||||
if (!hasMemo) {
|
||||
hasMemo = true;
|
||||
memoizedSnapshot = nextSnapshot;
|
||||
nextSnapshot = selector(nextSnapshot);
|
||||
if (void 0 !== isEqual && inst.hasValue) {
|
||||
var currentSelection = inst.value;
|
||||
if (isEqual(currentSelection, nextSnapshot)) return (memoizedSelection = currentSelection);
|
||||
}
|
||||
return (memoizedSelection = nextSnapshot);
|
||||
}
|
||||
currentSelection = memoizedSelection;
|
||||
if (objectIs(memoizedSnapshot, nextSnapshot)) return currentSelection;
|
||||
var nextSelection = selector(nextSnapshot);
|
||||
if (void 0 !== isEqual && isEqual(currentSelection, nextSelection)) return ((memoizedSnapshot = nextSnapshot), currentSelection);
|
||||
memoizedSnapshot = nextSnapshot;
|
||||
return (memoizedSelection = nextSelection);
|
||||
}
|
||||
var hasMemo = false,
|
||||
memoizedSnapshot,
|
||||
memoizedSelection,
|
||||
maybeGetServerSnapshot = void 0 === getServerSnapshot ? null : getServerSnapshot;
|
||||
return [
|
||||
function () {
|
||||
return memoizedSelector(getSnapshot());
|
||||
},
|
||||
null === maybeGetServerSnapshot ? void 0 : (
|
||||
function () {
|
||||
return memoizedSelector(maybeGetServerSnapshot());
|
||||
}
|
||||
),
|
||||
];
|
||||
},
|
||||
[getSnapshot, getServerSnapshot, selector, isEqual],
|
||||
);
|
||||
var value = useSyncExternalStore(subscribe, instRef[0], instRef[1]);
|
||||
useEffect(
|
||||
function () {
|
||||
inst.hasValue = true;
|
||||
inst.value = value;
|
||||
},
|
||||
[value],
|
||||
);
|
||||
useDebugValue(value);
|
||||
return value;
|
||||
};
|
||||
return withSelector_production;
|
||||
}
|
||||
|
||||
var hasRequiredWithSelector;
|
||||
|
||||
function requireWithSelector () {
|
||||
function requireWithSelector() {
|
||||
if (hasRequiredWithSelector) return withSelector.exports;
|
||||
hasRequiredWithSelector = 1;
|
||||
{
|
||||
withSelector.exports = requireWithSelector_production();
|
||||
withSelector.exports = requireWithSelector_production();
|
||||
}
|
||||
return withSelector.exports;
|
||||
}
|
||||
|
||||
2
web/dist/index.html
vendored
2
web/dist/index.html
vendored
@ -2,7 +2,7 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>CalcomBlock Plugin</title>
|
||||
<link rel="stylesheet" crossorigin href="/assets/style-Bs2zy9jQ.css">
|
||||
<link rel="stylesheet" crossorigin href="/assets/style-Bs2zy9jQ.css" />
|
||||
</head>
|
||||
<body>
|
||||
<!-- This is a placeholder for Module Federation remote entry -->
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user