@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.
@@ -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
- const [pollInterval, setPollInterval] = useState(null);
12
- // Start polling when dialog opens
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 && !isPolling) {
15
- setIsPolling(true);
16
- const interval = setInterval(async () => {
17
- try {
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, isPolling, sessionId, onRetry, onOpenChange]);
40
- // Cleanup on unmount
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
- return () => {
43
- if (pollInterval) {
44
- clearInterval(pollInterval);
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
- }, [pollInterval]);
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: message }), _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 ", currentUsers, " of ", maxUsers, " 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"] })) })] })] })] }) }));
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,EACZ,QAAQ,EACR,OAAO,EACP,OAAO,GACwB;IAC/B,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAC9C,IAAI,CACL,CAAC;IAEF,kCAAkC;IAClC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACvB,YAAY,CAAC,IAAI,CAAC,CAAC;YACnB,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;gBACtC,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,MAAM,2BAA2B,CAAC,SAAS,CAAC,CAAC;oBAC5D,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;wBACnB,yBAAyB;wBACzB,aAAa,CAAC,QAAQ,CAAC,CAAC;wBACxB,YAAY,CAAC,KAAK,CAAC,CAAC;wBACpB,eAAe,CAAC,IAAI,CAAC,CAAC;wBACtB,OAAO,EAAE,CAAC;wBACV,YAAY,CAAC,KAAK,CAAC,CAAC;oBACtB,CAAC;gBACH,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,KAAK,CAAC,yCAAyC,EAAE,KAAK,CAAC,CAAC;gBAClE,CAAC;YACH,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,0BAA0B;YAEpC,eAAe,CAAC,QAAQ,CAAC,CAAC;YAE1B,OAAO,GAAG,EAAE;gBACV,aAAa,CAAC,QAAQ,CAAC,CAAC;gBACxB,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,eAAe,CAAC,IAAI,CAAC,CAAC;YACxB,CAAC,CAAC;QACJ,CAAC;IACH,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;IAExD,qBAAqB;IACrB,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,GAAG,EAAE;YACV,IAAI,YAAY,EAAE,CAAC;gBACjB,aAAa,CAAC,YAAY,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAEnB,MAAM,iBAAiB,GAAG,KAAK,IAAI,EAAE;QACnC,aAAa,CAAC,IAAI,CAAC,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,2BAA2B,CAAC,SAAS,CAAC,CAAC;YAC5D,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,OAAO,EAAE,CAAC;gBACV,YAAY,CAAC,KAAK,CAAC,CAAC;YACtB,CAAC;iBAAM,CAAC;gBACN,+BAA+B;gBAC/B,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;oBACnB,8CAA8C;gBAChD,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,yCAAyC,EAAE,KAAK,CAAC,CAAC;QAClE,CAAC;gBAAS,CAAC;YACT,aAAa,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,CACL,KAAC,MAAM,IAAC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,YAC5C,MAAC,aAAa,IAAC,SAAS,EAAC,kBAAkB,aACzC,KAAC,YAAY,cACX,eAAK,SAAS,EAAC,wBAAwB,aACrC,cAAK,SAAS,EAAC,2FAA2F,YACxG,KAAC,KAAK,IAAC,SAAS,EAAC,QAAQ,EAAC,WAAW,EAAE,CAAC,GAAI,GACxC,EACN,eAAK,SAAS,EAAC,4BAA4B,aACzC,KAAC,WAAW,IAAC,SAAS,EAAC,mBAAmB,8CAE5B,EACd,eAAK,SAAS,EAAC,oDAAoD,aACjE,YAAG,SAAS,EAAC,MAAM,YAAE,OAAO,GAAK,EACjC,eAAK,SAAS,EAAC,2FAA2F,aACxG,KAAC,WAAW,IAAC,SAAS,EAAC,iBAAiB,GAAG,EAC3C,gBAAM,SAAS,EAAC,SAAS,2BACZ,YAAY,UAAM,QAAQ,+BAEhC,IACH,IACF,IACF,IACF,GACO,EAEf,MAAC,YAAY,IAAC,SAAS,EAAC,iEAAiE,aACvF,cAAK,SAAS,EAAC,oEAAoE,YAChF,SAAS,IAAI,CACZ,8BACE,KAAC,SAAS,IAAC,SAAS,EAAC,qBAAqB,GAAG,EAC7C,6DAA4C,IAC3C,CACJ,GACG,EACN,eAAK,SAAS,EAAC,6BAA6B,aAC1C,KAAC,MAAM,IACL,OAAO,EAAC,SAAS,EACjB,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,EAClC,QAAQ,EAAE,UAAU,sBAGb,EACT,KAAC,MAAM,IACL,OAAO,EAAE,iBAAiB,EAC1B,QAAQ,EAAE,UAAU,EACpB,SAAS,EAAC,eAAe,YAExB,UAAU,CAAC,CAAC,CAAC,CACZ,8BACE,KAAC,OAAO,IAAC,SAAS,EAAC,aAAa,GAAG,mBAElC,CACJ,CAAC,CAAC,CAAC,CACF,8BACE,KAAC,SAAS,IAAC,SAAS,EAAC,aAAa,GAAG,iBAEpC,CACJ,GACM,IACL,IACO,IACD,GACT,CACV,CAAC;AACJ,CAAC"}
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