@parhelia/core 0.1.12269 → 0.1.12278
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/editor/ConcurrentUserLimitDialog.d.ts +1 -1
- package/dist/editor/ConcurrentUserLimitDialog.js +46 -40
- package/dist/editor/ConcurrentUserLimitDialog.js.map +1 -1
- package/dist/editor/MobileLayout.js +1 -1
- package/dist/editor/MobileLayout.js.map +1 -1
- package/dist/editor/client/EditorShell.js +6 -1
- package/dist/editor/client/EditorShell.js.map +1 -1
- package/dist/editor/settings/About.js +23 -8
- package/dist/editor/settings/About.js.map +1 -1
- package/dist/licensing/LicenseOverlay.js +1 -3
- package/dist/licensing/LicenseOverlay.js.map +1 -1
- package/dist/licensing/types.d.ts +2 -0
- package/dist/licensing/types.js.map +1 -1
- package/dist/revision.d.ts +2 -2
- package/dist/revision.js +2 -2
- package/package.json +1 -1
- package/styles.css +5 -0
|
@@ -7,5 +7,5 @@ interface ConcurrentUserLimitDialogProps {
|
|
|
7
7
|
message: string;
|
|
8
8
|
onRetry: () => void;
|
|
9
9
|
}
|
|
10
|
-
export declare function ConcurrentUserLimitDialog({ open, onOpenChange, sessionId, currentUsers, maxUsers, message, onRetry, }: ConcurrentUserLimitDialogProps): import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
export declare function ConcurrentUserLimitDialog({ open, onOpenChange, sessionId, currentUsers: initialCurrentUsers, maxUsers: initialMaxUsers, message: initialMessage, onRetry, }: ConcurrentUserLimitDialogProps): import("react/jsx-runtime").JSX.Element;
|
|
11
11
|
export {};
|
|
@@ -5,60 +5,66 @@ import { Button } from "../components/ui/button";
|
|
|
5
5
|
import { Users, RefreshCw, AlertCircle } from "lucide-react";
|
|
6
6
|
import { checkConnectionAvailability } from "./services/editService";
|
|
7
7
|
import { Spinner } from "./ui/Spinner";
|
|
8
|
-
export function ConcurrentUserLimitDialog({ open, onOpenChange, sessionId, currentUsers, maxUsers, message, onRetry, }) {
|
|
8
|
+
export function ConcurrentUserLimitDialog({ open, onOpenChange, sessionId, currentUsers: initialCurrentUsers, maxUsers: initialMaxUsers, message: initialMessage, onRetry, }) {
|
|
9
9
|
const [isChecking, setIsChecking] = useState(false);
|
|
10
10
|
const [isPolling, setIsPolling] = useState(false);
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
// Display counts updated from each poll so the dialog shows live numbers when a seat frees up
|
|
12
|
+
const [displayCurrentUsers, setDisplayCurrentUsers] = useState(initialCurrentUsers);
|
|
13
|
+
const [displayMaxUsers, setDisplayMaxUsers] = useState(initialMaxUsers);
|
|
14
|
+
const [displayMessage, setDisplayMessage] = useState(initialMessage);
|
|
15
|
+
// Sync display state from props when dialog opens (e.g. initial values)
|
|
13
16
|
useEffect(() => {
|
|
14
|
-
if (open
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
const result = await checkConnectionAvailability(sessionId);
|
|
19
|
-
if (result.allowed) {
|
|
20
|
-
// Seat became available!
|
|
21
|
-
clearInterval(interval);
|
|
22
|
-
setIsPolling(false);
|
|
23
|
-
setPollInterval(null);
|
|
24
|
-
onRetry();
|
|
25
|
-
onOpenChange(false);
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
catch (error) {
|
|
29
|
-
console.error("Error checking connection availability:", error);
|
|
30
|
-
}
|
|
31
|
-
}, 7500); // Check every 7.5 seconds
|
|
32
|
-
setPollInterval(interval);
|
|
33
|
-
return () => {
|
|
34
|
-
clearInterval(interval);
|
|
35
|
-
setIsPolling(false);
|
|
36
|
-
setPollInterval(null);
|
|
37
|
-
};
|
|
17
|
+
if (open) {
|
|
18
|
+
setDisplayCurrentUsers(initialCurrentUsers);
|
|
19
|
+
setDisplayMaxUsers(initialMaxUsers);
|
|
20
|
+
setDisplayMessage(initialMessage);
|
|
38
21
|
}
|
|
39
|
-
}, [open,
|
|
40
|
-
//
|
|
22
|
+
}, [open, initialCurrentUsers, initialMaxUsers, initialMessage]);
|
|
23
|
+
// Start polling when dialog opens. Update displayed count from each result so it stays current.
|
|
41
24
|
useEffect(() => {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
25
|
+
if (!open) {
|
|
26
|
+
setIsPolling(false);
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
setIsPolling(true);
|
|
30
|
+
const interval = setInterval(async () => {
|
|
31
|
+
try {
|
|
32
|
+
const result = await checkConnectionAvailability(sessionId);
|
|
33
|
+
if (result.currentUsers !== undefined)
|
|
34
|
+
setDisplayCurrentUsers(result.currentUsers);
|
|
35
|
+
if (result.maxUsers !== undefined)
|
|
36
|
+
setDisplayMaxUsers(result.maxUsers);
|
|
37
|
+
if (result.message !== undefined)
|
|
38
|
+
setDisplayMessage(result.message);
|
|
39
|
+
if (result.allowed) {
|
|
40
|
+
clearInterval(interval);
|
|
41
|
+
setIsPolling(false);
|
|
42
|
+
onRetry();
|
|
43
|
+
onOpenChange(false);
|
|
44
|
+
}
|
|
45
45
|
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
console.error("Error checking connection availability:", error);
|
|
48
|
+
}
|
|
49
|
+
}, 7500);
|
|
50
|
+
return () => {
|
|
51
|
+
clearInterval(interval);
|
|
46
52
|
};
|
|
47
|
-
}, [
|
|
53
|
+
}, [open, sessionId, onRetry, onOpenChange]);
|
|
48
54
|
const handleManualRetry = async () => {
|
|
49
55
|
setIsChecking(true);
|
|
50
56
|
try {
|
|
51
57
|
const result = await checkConnectionAvailability(sessionId);
|
|
58
|
+
if (result.currentUsers !== undefined)
|
|
59
|
+
setDisplayCurrentUsers(result.currentUsers);
|
|
60
|
+
if (result.maxUsers !== undefined)
|
|
61
|
+
setDisplayMaxUsers(result.maxUsers);
|
|
62
|
+
if (result.message !== undefined)
|
|
63
|
+
setDisplayMessage(result.message);
|
|
52
64
|
if (result.allowed) {
|
|
53
65
|
onRetry();
|
|
54
66
|
onOpenChange(false);
|
|
55
67
|
}
|
|
56
|
-
else {
|
|
57
|
-
// Update message if it changed
|
|
58
|
-
if (result.message) {
|
|
59
|
-
// Message will be updated by parent component
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
68
|
}
|
|
63
69
|
catch (error) {
|
|
64
70
|
console.error("Error checking connection availability:", error);
|
|
@@ -67,6 +73,6 @@ export function ConcurrentUserLimitDialog({ open, onOpenChange, sessionId, curre
|
|
|
67
73
|
setIsChecking(false);
|
|
68
74
|
}
|
|
69
75
|
};
|
|
70
|
-
return (_jsx(Dialog, { open: open, onOpenChange: onOpenChange, children: _jsxs(DialogContent, { className: "sm:max-w-[500px]", children: [_jsx(DialogHeader, { children: _jsxs("div", { className: "flex items-start gap-4", children: [_jsx("div", { className: "flex size-10 shrink-0 items-center justify-center rounded-full bg-amber-50 text-amber-600", children: _jsx(Users, { className: "size-5", strokeWidth: 2 }) }), _jsxs("div", { className: "flex flex-col gap-1 flex-1", children: [_jsx(DialogTitle, { className: "text-xl font-bold", children: "Concurrent User Limit Reached" }), _jsxs("div", { className: "text-sm leading-relaxed text-muted-foreground mt-1", children: [_jsx("p", { className: "mb-3", children:
|
|
76
|
+
return (_jsx(Dialog, { open: open, onOpenChange: onOpenChange, children: _jsxs(DialogContent, { className: "sm:max-w-[500px]", children: [_jsx(DialogHeader, { children: _jsxs("div", { className: "flex items-start gap-4", children: [_jsx("div", { className: "flex size-10 shrink-0 items-center justify-center rounded-full bg-amber-50 text-amber-600", children: _jsx(Users, { className: "size-5", strokeWidth: 2 }) }), _jsxs("div", { className: "flex flex-col gap-1 flex-1", children: [_jsx(DialogTitle, { className: "text-xl font-bold", children: "Concurrent User Limit Reached" }), _jsxs("div", { className: "text-sm leading-relaxed text-muted-foreground mt-1", children: [_jsx("p", { className: "mb-3", children: displayMessage }), _jsxs("div", { className: "flex items-center gap-2 text-amber-700 bg-amber-50 border border-amber-200 rounded-lg p-3", children: [_jsx(AlertCircle, { className: "size-4 shrink-0" }), _jsxs("span", { className: "text-xs", children: ["Currently ", displayCurrentUsers, " of ", displayMaxUsers, " user slots are in use."] })] })] })] })] }) }), _jsxs(DialogFooter, { className: "bg-gray-50/50 border-t px-6 py-4 sm:flex-row sm:justify-between", children: [_jsx("div", { className: "text-xs text-muted-foreground flex items-center gap-2 mb-3 sm:mb-0", children: isPolling && (_jsxs(_Fragment, { children: [_jsx(RefreshCw, { className: "size-3 animate-spin" }), _jsx("span", { children: "Checking for available seats..." })] })) }), _jsxs("div", { className: "flex gap-2 w-full sm:w-auto", children: [_jsx(Button, { variant: "outline", onClick: () => onOpenChange(false), disabled: isChecking, children: "Close" }), _jsx(Button, { onClick: handleManualRetry, disabled: isChecking, className: "min-w-[120px]", children: isChecking ? (_jsxs(_Fragment, { children: [_jsx(Spinner, { className: "mr-2 size-4" }), "Checking..."] })) : (_jsxs(_Fragment, { children: [_jsx(RefreshCw, { className: "mr-2 size-4" }), "Try Again"] })) })] })] })] }) }));
|
|
71
77
|
}
|
|
72
78
|
//# sourceMappingURL=ConcurrentUserLimitDialog.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConcurrentUserLimitDialog.js","sourceRoot":"","sources":["../../src/editor/ConcurrentUserLimitDialog.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACnD,OAAO,EACL,MAAM,EACN,aAAa,EACb,YAAY,EACZ,WAAW,EACX,YAAY,GACb,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAYvC,MAAM,UAAU,yBAAyB,CAAC,EACxC,IAAI,EACJ,YAAY,EACZ,SAAS,EACT,YAAY,
|
|
1
|
+
{"version":3,"file":"ConcurrentUserLimitDialog.js","sourceRoot":"","sources":["../../src/editor/ConcurrentUserLimitDialog.tsx"],"names":[],"mappings":"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"}
|
|
@@ -64,6 +64,6 @@ export function MobileLayout(props) {
|
|
|
64
64
|
});
|
|
65
65
|
}
|
|
66
66
|
return (_jsxs("div", { className: cn("flex flex-col select-none", className), "data-testid": "mobile-layout", children: [props.workspace?.titlebar, props.workspace?.toolbarFactory &&
|
|
67
|
-
props.workspace?.toolbarFactory(editContext), _jsx(Splitter, { panels: panels, direction: "vertical", className: "flex-1", localStorageKey: "mobile-layout-splitter" }), !props.workspace?.hideToolbar && (_jsx("div", { className: "flex flex-row items-center gap-1.5 border-r border-gray-200 bg-gray-50/50 p-1.5", children: _jsx(WorkspaceRailMobile, {}) }))] }));
|
|
67
|
+
props.workspace?.toolbarFactory(editContext), _jsx(Splitter, { panels: panels, direction: "vertical", className: "flex-1", localStorageKey: "mobile-layout-splitter" }), !props.workspace?.hideToolbar && (_jsx("div", { className: "flex flex-row items-center gap-1.5 border-r border-gray-200 bg-gray-50/50 p-1.5 pb-[max(0.375rem,env(safe-area-inset-bottom))]", "data-testid": "bottom-row", children: _jsx(WorkspaceRailMobile, {}) }))] }));
|
|
68
68
|
}
|
|
69
69
|
//# sourceMappingURL=MobileLayout.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MobileLayout.js","sourceRoot":"","sources":["../../src/editor/MobileLayout.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"MobileLayout.js","sourceRoot":"","sources":["../../src/editor/MobileLayout.tsx"],"names":[],"mappings":"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"}
|
|
@@ -897,10 +897,14 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
897
897
|
// messageHandler is defined after loadItem/loadHistory declarations to avoid temporal dead zones
|
|
898
898
|
const user = activeSessions.find((x) => x.sessionId === sessionId)?.user ||
|
|
899
899
|
userInfo.user;
|
|
900
|
-
// Self-heal if our session disappears (e.g., after HMR)
|
|
900
|
+
// Self-heal if our session disappears (e.g., after HMR). Skip when concurrent user limit
|
|
901
|
+
// is showing so we don't spam recovery attempts when the connection was rejected.
|
|
901
902
|
const missingSessionRecoveryTimerRef = useRef(null);
|
|
902
903
|
const missingSessionRecoveryAttemptsRef = useRef(0);
|
|
904
|
+
const concurrentUserLimitErrorRef = useRef(null);
|
|
903
905
|
useEffect(() => {
|
|
906
|
+
if (concurrentUserLimitErrorRef.current !== null)
|
|
907
|
+
return;
|
|
904
908
|
const hasMySession = activeSessions.some((s) => s.sessionId === sessionId);
|
|
905
909
|
if (hasMySession) {
|
|
906
910
|
// Reset recovery state when we see ourselves again
|
|
@@ -2368,6 +2372,7 @@ export function EditorShell({ configuration, className, item: loadItemDescriptor
|
|
|
2368
2372
|
});
|
|
2369
2373
|
// Concurrent user limit error state
|
|
2370
2374
|
const [concurrentUserLimitError, setConcurrentUserLimitError] = useState(null);
|
|
2375
|
+
concurrentUserLimitErrorRef.current = concurrentUserLimitError;
|
|
2371
2376
|
const handleRetryConnection = useCallback(() => {
|
|
2372
2377
|
setConcurrentUserLimitError(null);
|
|
2373
2378
|
// Force reconnection by triggering a new connection attempt
|