@solidxai/core-ui 0.1.7-beta.8 → 0.1.7-beta.9

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.
Files changed (122) hide show
  1. package/dist/components/common/GeneralSettings.d.ts.map +1 -1
  2. package/dist/components/common/GeneralSettings.js +68 -36
  3. package/dist/components/common/GeneralSettings.js.map +1 -1
  4. package/dist/components/common/GeneralSettings.tsx +81 -42
  5. package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.d.ts +27 -5
  6. package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.d.ts.map +1 -1
  7. package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.js +25 -37
  8. package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.js.map +1 -1
  9. package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.tsx +131 -52
  10. package/dist/components/core/chatter/SolidChatter.d.ts +2 -1
  11. package/dist/components/core/chatter/SolidChatter.d.ts.map +1 -1
  12. package/dist/components/core/chatter/SolidChatter.js +2 -2
  13. package/dist/components/core/chatter/SolidChatter.js.map +1 -1
  14. package/dist/components/core/chatter/SolidChatter.tsx +2 -1
  15. package/dist/components/core/chatter/SolidChatterHeader.d.ts +1 -0
  16. package/dist/components/core/chatter/SolidChatterHeader.d.ts.map +1 -1
  17. package/dist/components/core/chatter/SolidChatterHeader.js +3 -3
  18. package/dist/components/core/chatter/SolidChatterHeader.js.map +1 -1
  19. package/dist/components/core/chatter/SolidChatterHeader.tsx +4 -3
  20. package/dist/components/core/chatter/SolidMessageComposer.d.ts +2 -1
  21. package/dist/components/core/chatter/SolidMessageComposer.d.ts.map +1 -1
  22. package/dist/components/core/chatter/SolidMessageComposer.js +3 -1
  23. package/dist/components/core/chatter/SolidMessageComposer.js.map +1 -1
  24. package/dist/components/core/chatter/SolidMessageComposer.tsx +3 -1
  25. package/dist/components/core/common/SolidViewLayoutManager.d.ts +17 -0
  26. package/dist/components/core/common/SolidViewLayoutManager.d.ts.map +1 -1
  27. package/dist/components/core/common/SolidViewLayoutManager.js +58 -1
  28. package/dist/components/core/common/SolidViewLayoutManager.js.map +1 -1
  29. package/dist/components/core/common/SolidViewLayoutManager.ts +43 -2
  30. package/dist/components/core/extension/solid-core/chatterMessage/form/SolidChatterMessageCoModelEntityIdFormViewWidget.d.ts +3 -0
  31. package/dist/components/core/extension/solid-core/chatterMessage/form/SolidChatterMessageCoModelEntityIdFormViewWidget.d.ts.map +1 -0
  32. package/dist/components/core/extension/solid-core/chatterMessage/form/SolidChatterMessageCoModelEntityIdFormViewWidget.js +92 -0
  33. package/dist/components/core/extension/solid-core/chatterMessage/form/SolidChatterMessageCoModelEntityIdFormViewWidget.js.map +1 -0
  34. package/dist/components/core/extension/solid-core/chatterMessage/form/SolidChatterMessageCoModelEntityIdFormViewWidget.tsx +68 -0
  35. package/dist/components/core/extension/solid-core/chatterMessage/list/SolidChatterMessageCoModelEntityIdListViewWidget.d.ts +3 -0
  36. package/dist/components/core/extension/solid-core/chatterMessage/list/SolidChatterMessageCoModelEntityIdListViewWidget.d.ts.map +1 -0
  37. package/dist/components/core/extension/solid-core/chatterMessage/list/SolidChatterMessageCoModelEntityIdListViewWidget.js +87 -0
  38. package/dist/components/core/extension/solid-core/chatterMessage/list/SolidChatterMessageCoModelEntityIdListViewWidget.js.map +1 -0
  39. package/dist/components/core/extension/solid-core/chatterMessage/list/SolidChatterMessageCoModelEntityIdListViewWidget.tsx +70 -0
  40. package/dist/components/core/extension/solid-core/listOfValues/form/SolidLovTypeChangeFormEditWidget.d.ts +3 -0
  41. package/dist/components/core/extension/solid-core/listOfValues/form/SolidLovTypeChangeFormEditWidget.d.ts.map +1 -0
  42. package/dist/components/core/extension/solid-core/listOfValues/form/SolidLovTypeChangeFormEditWidget.js +111 -0
  43. package/dist/components/core/extension/solid-core/listOfValues/form/SolidLovTypeChangeFormEditWidget.js.map +1 -0
  44. package/dist/components/core/extension/solid-core/listOfValues/form/SolidLovTypeChangeFormEditWidget.tsx +122 -0
  45. package/dist/components/core/extension/solid-core/mqMessage/form/SolidMqMessageStageFormViewWIdget.d.ts +3 -0
  46. package/dist/components/core/extension/solid-core/mqMessage/form/SolidMqMessageStageFormViewWIdget.d.ts.map +1 -0
  47. package/dist/components/core/extension/solid-core/mqMessage/form/SolidMqMessageStageFormViewWIdget.js +10 -0
  48. package/dist/components/core/extension/solid-core/mqMessage/form/SolidMqMessageStageFormViewWIdget.js.map +1 -0
  49. package/dist/components/core/extension/solid-core/mqMessage/form/SolidMqMessageStageFormViewWIdget.tsx +21 -0
  50. package/dist/components/core/extension/solid-core/mqMessage/form/mqMessageOnFormLoadHandler.d.ts +8 -0
  51. package/dist/components/core/extension/solid-core/mqMessage/form/mqMessageOnFormLoadHandler.d.ts.map +1 -0
  52. package/dist/components/core/extension/solid-core/mqMessage/form/mqMessageOnFormLoadHandler.js +62 -0
  53. package/dist/components/core/extension/solid-core/mqMessage/form/mqMessageOnFormLoadHandler.js.map +1 -0
  54. package/dist/components/core/extension/solid-core/mqMessage/form/mqMessageOnFormLoadHandler.tsx +27 -0
  55. package/dist/components/core/extension/solid-core/mqMessage/list/SolidMqMessageStageListViewWidget.d.ts +3 -0
  56. package/dist/components/core/extension/solid-core/mqMessage/list/SolidMqMessageStageListViewWidget.d.ts.map +1 -0
  57. package/dist/components/core/extension/solid-core/mqMessage/list/SolidMqMessageStageListViewWidget.js +8 -0
  58. package/dist/components/core/extension/solid-core/mqMessage/list/SolidMqMessageStageListViewWidget.js.map +1 -0
  59. package/dist/components/core/extension/solid-core/mqMessage/list/SolidMqMessageStageListViewWidget.tsx +15 -0
  60. package/dist/components/core/extension/solid-core/mqMessage/list/SolidMqMessagesSummarizeListHeaderAction.d.ts +3 -0
  61. package/dist/components/core/extension/solid-core/mqMessage/list/SolidMqMessagesSummarizeListHeaderAction.d.ts.map +1 -0
  62. package/dist/components/core/extension/solid-core/mqMessage/list/SolidMqMessagesSummarizeListHeaderAction.js +158 -0
  63. package/dist/components/core/extension/solid-core/mqMessage/list/SolidMqMessagesSummarizeListHeaderAction.js.map +1 -0
  64. package/dist/components/core/extension/solid-core/mqMessage/list/SolidMqMessagesSummarizeListHeaderAction.tsx +185 -0
  65. package/dist/components/core/extension/solid-core/mqMessage/ui/MqMessageStageBadge.d.ts +17 -0
  66. package/dist/components/core/extension/solid-core/mqMessage/ui/MqMessageStageBadge.d.ts.map +1 -0
  67. package/dist/components/core/extension/solid-core/mqMessage/ui/MqMessageStageBadge.js +52 -0
  68. package/dist/components/core/extension/solid-core/mqMessage/ui/MqMessageStageBadge.js.map +1 -0
  69. package/dist/components/core/extension/solid-core/mqMessage/ui/MqMessageStageBadge.tsx +83 -0
  70. package/dist/components/core/locales/SolidChatterLocaleTabView.d.ts.map +1 -1
  71. package/dist/components/core/locales/SolidChatterLocaleTabView.js +7 -5
  72. package/dist/components/core/locales/SolidChatterLocaleTabView.js.map +1 -1
  73. package/dist/components/core/locales/SolidChatterLocaleTabView.tsx +3 -0
  74. package/dist/components/core/users/ApiKeysTab/ApiKeysTab.css +38 -0
  75. package/dist/components/core/users/ApiKeysTab/ApiKeysTab.d.ts +1 -0
  76. package/dist/components/core/users/ApiKeysTab/ApiKeysTab.d.ts.map +1 -1
  77. package/dist/components/core/users/ApiKeysTab/ApiKeysTab.js +4 -3
  78. package/dist/components/core/users/ApiKeysTab/ApiKeysTab.js.map +1 -1
  79. package/dist/components/core/users/ApiKeysTab/ApiKeysTab.tsx +13 -3
  80. package/dist/components/core/users/ApiKeysTab/GenerateApiKeyModal.d.ts +2 -1
  81. package/dist/components/core/users/ApiKeysTab/GenerateApiKeyModal.d.ts.map +1 -1
  82. package/dist/components/core/users/ApiKeysTab/GenerateApiKeyModal.js +6 -5
  83. package/dist/components/core/users/ApiKeysTab/GenerateApiKeyModal.js.map +1 -1
  84. package/dist/components/core/users/ApiKeysTab/GenerateApiKeyModal.tsx +6 -7
  85. package/dist/components/core/users/CreateUser.d.ts.map +1 -1
  86. package/dist/components/core/users/CreateUser.js +89 -35
  87. package/dist/components/core/users/CreateUser.js.map +1 -1
  88. package/dist/components/core/users/CreateUser.tsx +291 -165
  89. package/dist/components/layout/SolidAiStudioLayout.d.ts.map +1 -1
  90. package/dist/components/layout/SolidAiStudioLayout.js +123 -8
  91. package/dist/components/layout/SolidAiStudioLayout.js.map +1 -1
  92. package/dist/components/layout/SolidAiStudioLayout.tsx +70 -6
  93. package/dist/helpers/registry.d.ts.map +1 -1
  94. package/dist/helpers/registry.js +10 -6
  95. package/dist/helpers/registry.js.map +1 -1
  96. package/dist/helpers/registry.ts +11 -7
  97. package/dist/index.d.ts +3 -0
  98. package/dist/index.d.ts.map +1 -1
  99. package/dist/index.js +3 -0
  100. package/dist/index.js.map +1 -1
  101. package/dist/index.ts +11 -0
  102. package/dist/redux/api/apiKeyApi.d.ts +8 -1
  103. package/dist/redux/api/apiKeyApi.d.ts.map +1 -1
  104. package/dist/redux/api/apiKeyApi.js +12 -1
  105. package/dist/redux/api/apiKeyApi.js.map +1 -1
  106. package/dist/redux/api/apiKeyApi.ts +9 -0
  107. package/dist/redux/store/defaultStoreConfig.d.ts +16 -1
  108. package/dist/redux/store/defaultStoreConfig.d.ts.map +1 -1
  109. package/dist/redux/store/defaultStoreConfig.js +3 -1
  110. package/dist/redux/store/defaultStoreConfig.js.map +1 -1
  111. package/dist/redux/store/defaultStoreConfig.ts +3 -1
  112. package/dist/routes/guards/GuestGuard.d.ts +2 -0
  113. package/dist/routes/guards/GuestGuard.d.ts.map +1 -0
  114. package/dist/routes/guards/GuestGuard.js +23 -0
  115. package/dist/routes/guards/GuestGuard.js.map +1 -0
  116. package/dist/routes/guards/GuestGuard.tsx +24 -0
  117. package/dist/routes/solidRoutes.d.ts.map +1 -1
  118. package/dist/routes/solidRoutes.js +2 -1
  119. package/dist/routes/solidRoutes.js.map +1 -1
  120. package/dist/routes/solidRoutes.tsx +2 -1
  121. package/dist/types/solid-core.d.ts +1 -0
  122. package/package.json +1 -1
@@ -1,12 +1,50 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ var __generator = (this && this.__generator) || function (thisArg, body) {
11
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
12
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
13
+ function verb(n) { return function (v) { return step([n, v]); }; }
14
+ function step(op) {
15
+ if (f) throw new TypeError("Generator is already executing.");
16
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
17
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
18
+ if (y = 0, t) op = [op[0] & 2, t.value];
19
+ switch (op[0]) {
20
+ case 0: case 1: t = op; break;
21
+ case 4: _.label++; return { value: op[1], done: false };
22
+ case 5: _.label++; y = op[1]; op = [0]; continue;
23
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
24
+ default:
25
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
26
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
27
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
28
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
29
+ if (t[2]) _.ops.pop();
30
+ _.trys.pop(); continue;
31
+ }
32
+ op = body.call(thisArg, _);
33
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
34
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
35
+ }
36
+ };
1
37
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
38
  import { useEffect, useRef, useState } from "react";
3
39
  import { useDispatch, useSelector } from "react-redux";
4
40
  import { useNavigate, useLocation } from "react-router-dom";
5
41
  import { exitStudioMode, setStudioView } from "../../redux/features/solidStudioSlice";
42
+ import { showToast } from "../../redux/features/toastSlice";
6
43
  import { useSession } from "../../hooks/useSession";
7
- import { signOut } from "../../adapters/auth/index";
44
+ import { getSession, signOut } from "../../adapters/auth/index";
8
45
  import { createPortal } from "react-dom";
9
46
  import { env } from "../../adapters/env";
47
+ import { ERROR_MESSAGES } from "../../constants/error-messages";
10
48
  // ── Icons ──────────────────────────────────────────────────────────────────────
11
49
  var DotsIcon = function () { return (_jsxs("svg", { width: "15", height: "15", viewBox: "0 0 16 16", fill: "currentColor", "aria-hidden": "true", children: [_jsx("circle", { cx: "8", cy: "3", r: "1.3" }), _jsx("circle", { cx: "8", cy: "8", r: "1.3" }), _jsx("circle", { cx: "8", cy: "13", r: "1.3" })] })); };
12
50
  var PreviewIcon = function () { return (_jsxs("svg", { width: "13", height: "13", viewBox: "0 0 14 14", fill: "none", "aria-hidden": "true", children: [_jsx("path", { d: "M1 7s2.5-5 6-5 6 5 6 5-2.5 5-6 5-6-5-6-5Z", stroke: "currentColor", strokeWidth: "1.3", strokeLinejoin: "round" }), _jsx("circle", { cx: "7", cy: "7", r: "1.8", stroke: "currentColor", strokeWidth: "1.3" })] })); };
@@ -19,6 +57,7 @@ var FrontendIcon = function () { return (_jsxs("svg", { width: "16", height: "16
19
57
  // Mount this ONCE at the app root via AppEventListener.
20
58
  // When studio mode is off it renders nothing.
21
59
  export function SolidStudio() {
60
+ var _this = this;
22
61
  var isStudioMode = useSelector(function (state) { var _a, _b; return (_b = (_a = state.solidStudio) === null || _a === void 0 ? void 0 : _a.isStudioMode) !== null && _b !== void 0 ? _b : false; });
23
62
  var studioView = useSelector(function (state) { var _a, _b; return (_b = (_a = state.solidStudio) === null || _a === void 0 ? void 0 : _a.studioView) !== null && _b !== void 0 ? _b : null; });
24
63
  var dispatch = useDispatch();
@@ -26,9 +65,10 @@ export function SolidStudio() {
26
65
  var _a = useLocation(), pathname = _a.pathname, search = _a.search;
27
66
  var isPreviewMode = new URLSearchParams(search).get("preview") === "true" || (typeof sessionStorage !== "undefined" && sessionStorage.getItem("solid-preview") === "true");
28
67
  var isPreviewable = pathname !== "/studio" && pathname !== "/landing";
29
- var status = useSession().status;
68
+ var _b = useSession(), data = _b.data, status = _b.status;
30
69
  var isAuthenticated = status === "authenticated";
31
- var _b = useState(false), isMenuOpen = _b[0], setIsMenuOpen = _b[1];
70
+ var _c = useState(false), isMenuOpen = _c[0], setIsMenuOpen = _c[1];
71
+ var _d = useState(false), isChatRedirecting = _d[0], setIsChatRedirecting = _d[1];
32
72
  var menuRef = useRef(null);
33
73
  // Close the 3-dot menu when clicking outside
34
74
  useEffect(function () {
@@ -59,11 +99,86 @@ export function SolidStudio() {
59
99
  dispatch(setStudioView(view));
60
100
  navigate(view === "backend" ? "/admin" : "/landing");
61
101
  };
62
- var studioUI = (_jsx("div", { className: "solid-studio-island", style: { zIndex: "var(--z-studio)" }, children: _jsxs("div", { className: "solid-studio-island-inner", children: [_jsx("button", { type: "button", className: "solid-studio-island-btn".concat(studioView === "backend" ? " active" : ""), onClick: function () { return handleViewSwitch("backend"); }, "aria-label": "Backend studio", children: _jsx(BackendIcon, {}) }), _jsx("button", { type: "button", className: "solid-studio-island-btn".concat(studioView === "frontend" ? " active" : ""), onClick: function () { return handleViewSwitch("frontend"); }, "aria-label": "Frontend studio", children: _jsx(FrontendIcon, {}) }), _jsx("button", { type: "button", className: "solid-studio-island-btn", onClick: function () {
63
- var aiUrl = env("VITE_SOLIDX_AI_URL");
64
- if (aiUrl)
65
- window.open(aiUrl, "_blank");
66
- }, "aria-label": "AI chat", children: _jsx(ChatIcon, {}) }), _jsxs("div", { className: "solid-studio-island-menu", ref: menuRef, children: [_jsx("button", { type: "button", className: "solid-studio-island-btn".concat(isMenuOpen ? " active" : ""), onClick: function () { return setIsMenuOpen(function (o) { return !o; }); }, "aria-label": "Studio options", children: _jsx(DotsIcon, {}) }), isMenuOpen && (_jsxs("div", { className: "solid-studio-island-dropdown", children: [isPreviewable && (_jsxs("button", { type: "button", className: "solid-studio-island-dropdown-item", onClick: function () {
102
+ var handleAiChatClick = function () { return __awaiter(_this, void 0, void 0, function () {
103
+ var aiUrl, session, accessToken, apiBaseUrl, response, detail, errorPayload, _a, payload, ssoCode, redirectUrl, error_1, detail;
104
+ var _b, _c, _d, _e, _f, _g;
105
+ return __generator(this, function (_h) {
106
+ switch (_h.label) {
107
+ case 0:
108
+ if (isChatRedirecting)
109
+ return [2 /*return*/];
110
+ aiUrl = env("VITE_SOLIDX_AI_URL");
111
+ if (!aiUrl)
112
+ return [2 /*return*/];
113
+ setIsChatRedirecting(true);
114
+ _h.label = 1;
115
+ case 1:
116
+ _h.trys.push([1, 10, 11, 12]);
117
+ return [4 /*yield*/, getSession()];
118
+ case 2:
119
+ session = _h.sent();
120
+ accessToken = ((_b = session === null || session === void 0 ? void 0 : session.user) === null || _b === void 0 ? void 0 : _b.accessToken) || ((_c = data === null || data === void 0 ? void 0 : data.user) === null || _c === void 0 ? void 0 : _c.accessToken);
121
+ if (!accessToken)
122
+ return [2 /*return*/];
123
+ apiBaseUrl = env("API_URL", "http://localhost:8080").replace(/\/+$/, "");
124
+ return [4 /*yield*/, fetch("".concat(apiBaseUrl, "/api/iam/sso/code"), {
125
+ method: "POST",
126
+ headers: {
127
+ accept: "*/*",
128
+ Authorization: "Bearer ".concat(accessToken),
129
+ },
130
+ body: "",
131
+ })];
132
+ case 3:
133
+ response = _h.sent();
134
+ if (!!response.ok) return [3 /*break*/, 8];
135
+ detail = "Failed to fetch ssoCode (".concat(response.status, ")");
136
+ _h.label = 4;
137
+ case 4:
138
+ _h.trys.push([4, 6, , 7]);
139
+ return [4 /*yield*/, response.json()];
140
+ case 5:
141
+ errorPayload = _h.sent();
142
+ detail =
143
+ (errorPayload === null || errorPayload === void 0 ? void 0 : errorPayload.message) ||
144
+ ((_d = errorPayload === null || errorPayload === void 0 ? void 0 : errorPayload.error) === null || _d === void 0 ? void 0 : _d.message) ||
145
+ ((_e = errorPayload === null || errorPayload === void 0 ? void 0 : errorPayload.data) === null || _e === void 0 ? void 0 : _e.message) ||
146
+ detail;
147
+ return [3 /*break*/, 7];
148
+ case 6:
149
+ _a = _h.sent();
150
+ return [3 /*break*/, 7];
151
+ case 7: throw new Error(detail);
152
+ case 8: return [4 /*yield*/, response.json()];
153
+ case 9:
154
+ payload = _h.sent();
155
+ ssoCode = (_f = payload === null || payload === void 0 ? void 0 : payload.ssoCode) !== null && _f !== void 0 ? _f : (_g = payload === null || payload === void 0 ? void 0 : payload.data) === null || _g === void 0 ? void 0 : _g.ssoCode;
156
+ if (!ssoCode) {
157
+ throw new Error("ssoCode missing in response");
158
+ }
159
+ redirectUrl = new URL(aiUrl, window.location.origin);
160
+ redirectUrl.searchParams.set("ssoCode", String(ssoCode));
161
+ window.open(redirectUrl.toString(), "_blank");
162
+ return [3 /*break*/, 12];
163
+ case 10:
164
+ error_1 = _h.sent();
165
+ detail = error_1 instanceof Error ? error_1.message : ERROR_MESSAGES.SOMETHING_WRONG;
166
+ dispatch(showToast({
167
+ severity: "error",
168
+ summary: ERROR_MESSAGES.ERROR,
169
+ detail: detail,
170
+ life: 4000,
171
+ }));
172
+ console.error("Failed to open AI chat with ssoCode:", error_1);
173
+ return [3 /*break*/, 12];
174
+ case 11:
175
+ setIsChatRedirecting(false);
176
+ return [7 /*endfinally*/];
177
+ case 12: return [2 /*return*/];
178
+ }
179
+ });
180
+ }); };
181
+ var studioUI = (_jsx("div", { className: "solid-studio-island", style: { zIndex: "var(--z-studio)" }, children: _jsxs("div", { className: "solid-studio-island-inner", children: [_jsx("button", { type: "button", className: "solid-studio-island-btn".concat(studioView === "backend" ? " active" : ""), onClick: function () { return handleViewSwitch("backend"); }, "aria-label": "Backend studio", children: _jsx(BackendIcon, {}) }), _jsx("button", { type: "button", className: "solid-studio-island-btn".concat(studioView === "frontend" ? " active" : ""), onClick: function () { return handleViewSwitch("frontend"); }, "aria-label": "Frontend studio", children: _jsx(FrontendIcon, {}) }), _jsx("button", { type: "button", className: "solid-studio-island-btn", onClick: handleAiChatClick, disabled: isChatRedirecting, "aria-busy": isChatRedirecting, "aria-label": "AI chat", children: _jsx(ChatIcon, {}) }), _jsxs("div", { className: "solid-studio-island-menu", ref: menuRef, children: [_jsx("button", { type: "button", className: "solid-studio-island-btn".concat(isMenuOpen ? " active" : ""), onClick: function () { return setIsMenuOpen(function (o) { return !o; }); }, "aria-label": "Studio options", children: _jsx(DotsIcon, {}) }), isMenuOpen && (_jsxs("div", { className: "solid-studio-island-dropdown", children: [isPreviewable && (_jsxs("button", { type: "button", className: "solid-studio-island-dropdown-item", onClick: function () {
67
182
  setIsMenuOpen(false);
68
183
  var params = new URLSearchParams(search);
69
184
  params.set("preview", "true");
@@ -1 +1 @@
1
- {"version":3,"file":"SolidAiStudioLayout.js","sourceRoot":"","sources":["../../../src/components/layout/SolidAiStudioLayout.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useEffect, useRef, useState } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { useNavigate, useLocation } from \"react-router-dom\";\nimport { exitStudioMode, setStudioView, type StudioView } from \"../../redux/features/solidStudioSlice\";\nimport { useSession } from \"../../hooks/useSession\";\nimport { signOut } from \"../../adapters/auth/index\";\nimport { createPortal } from \"react-dom\";\nimport { env } from \"../../adapters/env\";\n\n// ── Icons ──────────────────────────────────────────────────────────────────────\n\nconst DotsIcon = () => (\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\n <circle cx=\"8\" cy=\"3\" r=\"1.3\" />\n <circle cx=\"8\" cy=\"8\" r=\"1.3\" />\n <circle cx=\"8\" cy=\"13\" r=\"1.3\" />\n </svg>\n);\n\nconst PreviewIcon = () => (\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M1 7s2.5-5 6-5 6 5 6 5-2.5 5-6 5-6-5-6-5Z\" stroke=\"currentColor\" strokeWidth=\"1.3\" strokeLinejoin=\"round\" />\n <circle cx=\"7\" cy=\"7\" r=\"1.8\" stroke=\"currentColor\" strokeWidth=\"1.3\" />\n </svg>\n);\n\nconst LogoutIcon = () => (\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M5 2H2.5A1.5 1.5 0 0 0 1 3.5v7A1.5 1.5 0 0 0 2.5 12H5\" stroke=\"currentColor\" strokeWidth=\"1.3\" strokeLinecap=\"round\" />\n <path d=\"M9 4l3 3-3 3M12 7H5\" stroke=\"currentColor\" strokeWidth=\"1.3\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nexport const ChatIcon = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n </svg>\n);\n\nconst BackendIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <rect x=\"2.2\" y=\"3\" width=\"11.6\" height=\"4\" rx=\"1\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <rect x=\"2.2\" y=\"9\" width=\"11.6\" height=\"4\" rx=\"1\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <circle cx=\"4.5\" cy=\"5\" r=\"0.7\" fill=\"currentColor\" />\n <circle cx=\"4.5\" cy=\"11\" r=\"0.7\" fill=\"currentColor\" />\n </svg>\n);\n\nconst FrontendIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <rect x=\"1.8\" y=\"2\" width=\"12.4\" height=\"9.5\" rx=\"1.5\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <path d=\"M6 13.5 5 15h6l-1-1.5\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M5.5 5 7.5 7l-2 2\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"m10.5 5 2 2-2 2\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\n// ── SolidStudio ────────────────────────────────────────────────────────────────\n// Single component that renders both the Studio header and the AI panel.\n// Mount this ONCE at the app root via AppEventListener.\n// When studio mode is off it renders nothing.\n\nexport function SolidStudio() {\n const isStudioMode = useSelector((state: any) => state.solidStudio?.isStudioMode ?? false);\n const studioView = useSelector((state: any) => state.solidStudio?.studioView ?? null) as StudioView;\n const dispatch = useDispatch();\n const navigate = useNavigate();\n const { pathname, search } = useLocation();\n const isPreviewMode = new URLSearchParams(search).get(\"preview\") === \"true\" || (typeof sessionStorage !== \"undefined\" && sessionStorage.getItem(\"solid-preview\") === \"true\");\n const isPreviewable = pathname !== \"/studio\" && pathname !== \"/landing\";\n const { status } = useSession();\n const isAuthenticated = status === \"authenticated\";\n const [isMenuOpen, setIsMenuOpen] = useState(false);\n const menuRef = useRef<HTMLDivElement>(null);\n\n // Close the 3-dot menu when clicking outside\n useEffect(() => {\n if (!isMenuOpen) return;\n const handler = (e: MouseEvent) => {\n if (menuRef.current && !menuRef.current.contains(e.target as Node)) {\n setIsMenuOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [isMenuOpen]);\n\n // Auto-exit studio if the user logs out\n useEffect(() => {\n if (status === \"unauthenticated\" && isStudioMode) {\n dispatch(exitStudioMode());\n }\n }, [status, isStudioMode, dispatch]);\n\n if (!isStudioMode || !isAuthenticated || isPreviewMode) return null;\n\n const handleLogout = () => {\n setIsMenuOpen(false);\n dispatch(exitStudioMode());\n signOut({ callbackUrl: \"/auth/login\" });\n };\n\n const handleViewSwitch = (view: StudioView) => {\n dispatch(setStudioView(view));\n navigate(view === \"backend\" ? \"/admin\" : \"/landing\");\n };\n\n const studioUI = (\n <div className=\"solid-studio-island\" style={{ zIndex: \"var(--z-studio)\" }}>\n <div className=\"solid-studio-island-inner\">\n <button\n type=\"button\"\n className={`solid-studio-island-btn${studioView === \"backend\" ? \" active\" : \"\"}`}\n onClick={() => handleViewSwitch(\"backend\")}\n aria-label=\"Backend studio\"\n >\n <BackendIcon />\n </button>\n <button\n type=\"button\"\n className={`solid-studio-island-btn${studioView === \"frontend\" ? \" active\" : \"\"}`}\n onClick={() => handleViewSwitch(\"frontend\")}\n aria-label=\"Frontend studio\"\n >\n <FrontendIcon />\n </button>\n <button\n type=\"button\"\n className=\"solid-studio-island-btn\"\n onClick={() => {\n const aiUrl = env(\"VITE_SOLIDX_AI_URL\");\n if (aiUrl) window.open(aiUrl, \"_blank\");\n }}\n aria-label=\"AI chat\"\n >\n <ChatIcon />\n </button>\n <div className=\"solid-studio-island-menu\" ref={menuRef}>\n <button\n type=\"button\"\n className={`solid-studio-island-btn${isMenuOpen ? \" active\" : \"\"}`}\n onClick={() => setIsMenuOpen((o) => !o)}\n aria-label=\"Studio options\"\n >\n <DotsIcon />\n </button>\n {isMenuOpen && (\n <div className=\"solid-studio-island-dropdown\">\n {isPreviewable && (\n <button\n type=\"button\"\n className=\"solid-studio-island-dropdown-item\"\n onClick={() => {\n setIsMenuOpen(false);\n const params = new URLSearchParams(search);\n params.set(\"preview\", \"true\");\n window.open(`${pathname}?${params.toString()}`, \"_blank\");\n }}\n >\n <PreviewIcon />\n Preview page\n </button>\n )}\n <button\n type=\"button\"\n className=\"solid-studio-island-dropdown-item danger\"\n onClick={handleLogout}\n >\n <LogoutIcon />\n Logout\n </button>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n\n return typeof document !== \"undefined\" ? createPortal(studioUI, document.body) : null;\n}\n\n// ── PreviewModePersist ─────────────────────────────────────────────────────────\n// Mount once at the app root alongside SolidStudio.\n// sessionStorage is tab-scoped, so preview opened in a new tab stays isolated.\n// Closing the tab is the natural way to exit preview mode.\n\nconst PREVIEW_KEY = \"solid-preview\";\n\nexport function PreviewModePersist() {\n const { pathname, search } = useLocation();\n const navigate = useNavigate();\n\n // Activate: when URL has ?preview=true, store it in sessionStorage for this tab\n useEffect(() => {\n const params = new URLSearchParams(search);\n if (params.get(\"preview\") === \"true\") {\n sessionStorage.setItem(PREVIEW_KEY, \"true\");\n }\n }, [search]);\n\n // Persist: re-inject ?preview=true on every navigation if it was set\n useEffect(() => {\n if (sessionStorage.getItem(PREVIEW_KEY) !== \"true\") return;\n const params = new URLSearchParams(search);\n if (params.get(\"preview\") === \"true\") return;\n params.set(\"preview\", \"true\");\n navigate({ pathname, search: `?${params.toString()}` }, { replace: true });\n }, [pathname, search, navigate]);\n\n return null;\n}\n\n// ── SolidStudioWrapper ─────────────────────────────────────────────────────────\n// Kept for backwards compatibility. Now a pure pass-through.\nexport function SolidStudioWrapper({ children }: { children: React.ReactNode }) {\n return <>{children}</>;\n}\n\n// Legacy aliases\nexport const SolidAiStudioLayout = SolidStudioWrapper;\nexport const SolidStudioPanel = SolidStudio;\n"]}
1
+ {"version":3,"file":"SolidAiStudioLayout.js","sourceRoot":"","sources":["../../../src/components/layout/SolidAiStudioLayout.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAc,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,aAAa,EAAmB,MAAM,uCAAuC,CAAC;AACvG,OAAO,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAEhE,kFAAkF;AAElF,IAAM,QAAQ,GAAG,cAAM,OAAA,CACrB,eAAK,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,cAAc,iBAAa,MAAM,aACpF,iBAAQ,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,CAAC,EAAC,KAAK,GAAG,EAChC,iBAAQ,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,CAAC,EAAC,KAAK,GAAG,EAChC,iBAAQ,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,IAAI,EAAC,CAAC,EAAC,KAAK,GAAG,IAC7B,CACP,EANsB,CAMtB,CAAC;AAEF,IAAM,WAAW,GAAG,cAAM,OAAA,CACxB,eAAK,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,MAAM,iBAAa,MAAM,aAC5E,eAAM,CAAC,EAAC,2CAA2C,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAC,KAAK,EAAC,cAAc,EAAC,OAAO,GAAG,EACrH,iBAAQ,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,CAAC,EAAC,KAAK,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAC,KAAK,GAAG,IACpE,CACP,EALyB,CAKzB,CAAC;AAEF,IAAM,UAAU,GAAG,cAAM,OAAA,CACvB,eAAK,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,MAAM,iBAAa,MAAM,aAC5E,eAAM,CAAC,EAAC,uDAAuD,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAC,KAAK,EAAC,aAAa,EAAC,OAAO,GAAG,EAChI,eAAM,CAAC,EAAC,qBAAqB,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAC,KAAK,EAAC,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,GAAG,IACjH,CACP,EALwB,CAKxB,CAAC;AAEF,MAAM,CAAC,IAAM,QAAQ,GAAG,cAAM,OAAA,CAC5B,cAAK,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAC,KAAK,EAAC,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,YAC9I,eAAM,CAAC,EAAC,+DAA+D,GAAG,GACtE,CACP,EAJ6B,CAI7B,CAAC;AAEF,IAAM,WAAW,GAAG,cAAM,OAAA,CACxB,eAAK,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,MAAM,iBAAa,MAAM,aAC5E,eAAM,CAAC,EAAC,KAAK,EAAC,CAAC,EAAC,GAAG,EAAC,KAAK,EAAC,MAAM,EAAC,MAAM,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAC,KAAK,GAAG,EAC7F,eAAM,CAAC,EAAC,KAAK,EAAC,CAAC,EAAC,GAAG,EAAC,KAAK,EAAC,MAAM,EAAC,MAAM,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAC,KAAK,GAAG,EAC7F,iBAAQ,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,GAAG,EAAC,CAAC,EAAC,KAAK,EAAC,IAAI,EAAC,cAAc,GAAG,EACtD,iBAAQ,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,IAAI,EAAC,CAAC,EAAC,KAAK,EAAC,IAAI,EAAC,cAAc,GAAG,IACnD,CACP,EAPyB,CAOzB,CAAC;AAEF,IAAM,YAAY,GAAG,cAAM,OAAA,CACzB,eAAK,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,MAAM,iBAAa,MAAM,aAC5E,eAAM,CAAC,EAAC,KAAK,EAAC,CAAC,EAAC,GAAG,EAAC,KAAK,EAAC,MAAM,EAAC,MAAM,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAC,KAAK,GAAG,EACjG,eAAM,CAAC,EAAC,uBAAuB,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAC,KAAK,EAAC,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,GAAG,EACvH,eAAM,CAAC,EAAC,mBAAmB,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAC,KAAK,EAAC,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,GAAG,EACnH,eAAM,CAAC,EAAC,iBAAiB,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAC,KAAK,EAAC,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,GAAG,IAC7G,CACP,EAP0B,CAO1B,CAAC;AAEF,kFAAkF;AAClF,yEAAyE;AACzE,wDAAwD;AACxD,8CAA8C;AAE9C,MAAM,UAAU,WAAW;IAA3B,iBAmLC;IAlLC,IAAM,YAAY,GAAG,WAAW,CAAC,UAAC,KAAU,gBAAK,OAAA,MAAA,MAAA,KAAK,CAAC,WAAW,0CAAE,YAAY,mCAAI,KAAK,CAAA,EAAA,CAAC,CAAC;IAC3F,IAAM,UAAU,GAAG,WAAW,CAAC,UAAC,KAAU,gBAAK,OAAA,MAAA,MAAA,KAAK,CAAC,WAAW,0CAAE,UAAU,mCAAI,IAAI,CAAA,EAAA,CAAe,CAAC;IACpG,IAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,IAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IACzB,IAAA,KAAuB,WAAW,EAAE,EAAlC,QAAQ,cAAA,EAAE,MAAM,YAAkB,CAAC;IAC3C,IAAM,aAAa,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,MAAM,IAAI,CAAC,OAAO,cAAc,KAAK,WAAW,IAAI,cAAc,CAAC,OAAO,CAAC,eAAe,CAAC,KAAK,MAAM,CAAC,CAAC;IAC7K,IAAM,aAAa,GAAG,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,UAAU,CAAC;IAClE,IAAA,KAAmB,UAAU,EAAE,EAA7B,IAAI,UAAA,EAAE,MAAM,YAAiB,CAAC;IACtC,IAAM,eAAe,GAAG,MAAM,KAAK,eAAe,CAAC;IAC7C,IAAA,KAA8B,QAAQ,CAAC,KAAK,CAAC,EAA5C,UAAU,QAAA,EAAE,aAAa,QAAmB,CAAC;IAC9C,IAAA,KAA4C,QAAQ,CAAC,KAAK,CAAC,EAA1D,iBAAiB,QAAA,EAAE,oBAAoB,QAAmB,CAAC;IAClE,IAAM,OAAO,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAE7C,6CAA6C;IAC7C,SAAS,CAAC;QACR,IAAI,CAAC,UAAU;YAAE,OAAO;QACxB,IAAM,OAAO,GAAG,UAAC,CAAa;YAC5B,IAAI,OAAO,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAc,CAAC,EAAE;gBAClE,aAAa,CAAC,KAAK,CAAC,CAAC;aACtB;QACH,CAAC,CAAC;QACF,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAChD,OAAO,cAAM,OAAA,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,OAAO,CAAC,EAAlD,CAAkD,CAAC;IAClE,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAEjB,wCAAwC;IACxC,SAAS,CAAC;QACR,IAAI,MAAM,KAAK,iBAAiB,IAAI,YAAY,EAAE;YAChD,QAAQ,CAAC,cAAc,EAAE,CAAC,CAAC;SAC5B;IACH,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC;IAErC,IAAI,CAAC,YAAY,IAAI,CAAC,eAAe,IAAI,aAAa;QAAE,OAAO,IAAI,CAAC;IAEpE,IAAM,YAAY,GAAG;QACnB,aAAa,CAAC,KAAK,CAAC,CAAC;QACrB,QAAQ,CAAC,cAAc,EAAE,CAAC,CAAC;QAC3B,OAAO,CAAC,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC,CAAC;IAC1C,CAAC,CAAC;IAEF,IAAM,gBAAgB,GAAG,UAAC,IAAgB;QACxC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9B,QAAQ,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IACvD,CAAC,CAAC;IAEF,IAAM,iBAAiB,GAAG;;;;;;oBACxB,IAAI,iBAAiB;wBAAE,sBAAO;oBAExB,KAAK,GAAG,GAAG,CAAC,oBAAoB,CAAC,CAAC;oBACxC,IAAI,CAAC,KAAK;wBAAE,sBAAO;oBAEnB,oBAAoB,CAAC,IAAI,CAAC,CAAC;;;;oBAET,qBAAM,UAAU,EAAE,EAAA;;oBAA5B,OAAO,GAAG,SAAkB;oBAC5B,WAAW,GAAG,CAAA,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI,0CAAE,WAAW,MAAI,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,IAAI,0CAAE,WAAW,CAAA,CAAC;oBAC1E,IAAI,CAAC,WAAW;wBAAE,sBAAO;oBAEnB,UAAU,GAAG,GAAG,CAAC,SAAS,EAAE,uBAAuB,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;oBAC9D,qBAAM,KAAK,CAAC,UAAG,UAAU,sBAAmB,EAAE;4BAC7D,MAAM,EAAE,MAAM;4BACd,OAAO,EAAE;gCACP,MAAM,EAAE,KAAK;gCACb,aAAa,EAAE,iBAAU,WAAW,CAAE;6BACvC;4BACD,IAAI,EAAE,EAAE;yBACT,CAAC,EAAA;;oBAPI,QAAQ,GAAG,SAOf;yBAEE,CAAC,QAAQ,CAAC,EAAE,EAAZ,wBAAY;oBACV,MAAM,GAAG,mCAA4B,QAAQ,CAAC,MAAM,MAAG,CAAC;;;;oBAErC,qBAAM,QAAQ,CAAC,IAAI,EAAE,EAAA;;oBAApC,YAAY,GAAG,SAAqB;oBAC1C,MAAM;wBACJ,CAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,OAAO;6BACrB,MAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,KAAK,0CAAE,OAAO,CAAA;6BAC5B,MAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,IAAI,0CAAE,OAAO,CAAA;4BAC3B,MAAM,CAAC;;;;;wBAIX,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;wBAGV,qBAAM,QAAQ,CAAC,IAAI,EAAE,EAAA;;oBAA/B,OAAO,GAAG,SAAqB;oBAC/B,OAAO,GAAG,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,mCAAI,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI,0CAAE,OAAO,CAAC;oBAC3D,IAAI,CAAC,OAAO,EAAE;wBACZ,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;qBAChD;oBAEK,WAAW,GAAG,IAAI,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;oBAC3D,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;oBACzD,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,QAAQ,CAAC,CAAC;;;;oBAExC,MAAM,GAAG,OAAK,YAAY,KAAK,CAAC,CAAC,CAAC,OAAK,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,eAAe,CAAC;oBACvF,QAAQ,CACN,SAAS,CAAC;wBACR,QAAQ,EAAE,OAAO;wBACjB,OAAO,EAAE,cAAc,CAAC,KAAK;wBAC7B,MAAM,QAAA;wBACN,IAAI,EAAE,IAAI;qBACX,CAAC,CACH,CAAC;oBACF,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,OAAK,CAAC,CAAC;;;oBAE7D,oBAAoB,CAAC,KAAK,CAAC,CAAC;;;;;SAE/B,CAAC;IAEF,IAAM,QAAQ,GAAG,CACf,cAAK,SAAS,EAAC,qBAAqB,EAAC,KAAK,EAAE,EAAE,MAAM,EAAE,iBAAiB,EAAE,YACvE,eAAK,SAAS,EAAC,2BAA2B,aACxC,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,iCAA0B,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAE,EAChF,OAAO,EAAE,cAAM,OAAA,gBAAgB,CAAC,SAAS,CAAC,EAA3B,CAA2B,gBAC/B,gBAAgB,YAE3B,KAAC,WAAW,KAAG,GACR,EACT,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,iCAA0B,UAAU,KAAK,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAE,EACjF,OAAO,EAAE,cAAM,OAAA,gBAAgB,CAAC,UAAU,CAAC,EAA5B,CAA4B,gBAChC,iBAAiB,YAE5B,KAAC,YAAY,KAAG,GACT,EACT,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,yBAAyB,EACnC,OAAO,EAAE,iBAAiB,EAC1B,QAAQ,EAAE,iBAAiB,eAChB,iBAAiB,gBACjB,SAAS,YAEpB,KAAC,QAAQ,KAAG,GACL,EACT,eAAK,SAAS,EAAC,0BAA0B,EAAC,GAAG,EAAE,OAAO,aACpD,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,iCAA0B,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAE,EAClE,OAAO,EAAE,cAAM,OAAA,aAAa,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,CAAC,EAAF,CAAE,CAAC,EAAxB,CAAwB,gBAC5B,gBAAgB,YAE3B,KAAC,QAAQ,KAAG,GACL,EACR,UAAU,IAAI,CACb,eAAK,SAAS,EAAC,8BAA8B,aAC1C,aAAa,IAAI,CAChB,kBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,mCAAmC,EAC7C,OAAO,EAAE;wCACP,aAAa,CAAC,KAAK,CAAC,CAAC;wCACrB,IAAM,MAAM,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC;wCAC3C,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;wCAC9B,MAAM,CAAC,IAAI,CAAC,UAAG,QAAQ,cAAI,MAAM,CAAC,QAAQ,EAAE,CAAE,EAAE,QAAQ,CAAC,CAAC;oCAC5D,CAAC,aAED,KAAC,WAAW,KAAG,oBAER,CACV,EACD,kBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,0CAA0C,EACpD,OAAO,EAAE,YAAY,aAErB,KAAC,UAAU,KAAG,cAEP,IACL,CACP,IACG,IACF,GACF,CACP,CAAC;IAEF,OAAO,OAAO,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACxF,CAAC;AAED,kFAAkF;AAClF,oDAAoD;AACpD,+EAA+E;AAC/E,2DAA2D;AAE3D,IAAM,WAAW,GAAG,eAAe,CAAC;AAEpC,MAAM,UAAU,kBAAkB;IAC1B,IAAA,KAAuB,WAAW,EAAE,EAAlC,QAAQ,cAAA,EAAE,MAAM,YAAkB,CAAC;IAC3C,IAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAE/B,gFAAgF;IAChF,SAAS,CAAC;QACR,IAAM,MAAM,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,MAAM,EAAE;YACpC,cAAc,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;SAC7C;IACH,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,qEAAqE;IACrE,SAAS,CAAC;QACR,IAAI,cAAc,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,MAAM;YAAE,OAAO;QAC3D,IAAM,MAAM,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,MAAM;YAAE,OAAO;QAC7C,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC9B,QAAQ,CAAC,EAAE,QAAQ,UAAA,EAAE,MAAM,EAAE,WAAI,MAAM,CAAC,QAAQ,EAAE,CAAE,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7E,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEjC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,kFAAkF;AAClF,6DAA6D;AAC7D,MAAM,UAAU,kBAAkB,CAAC,EAA2C;QAAzC,QAAQ,cAAA;IAC3C,OAAO,4BAAG,QAAQ,GAAI,CAAC;AACzB,CAAC;AAED,iBAAiB;AACjB,MAAM,CAAC,IAAM,mBAAmB,GAAG,kBAAkB,CAAC;AACtD,MAAM,CAAC,IAAM,gBAAgB,GAAG,WAAW,CAAC","sourcesContent":["import React, { useEffect, useRef, useState } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { useNavigate, useLocation } from \"react-router-dom\";\nimport { exitStudioMode, setStudioView, type StudioView } from \"../../redux/features/solidStudioSlice\";\nimport { showToast } from \"../../redux/features/toastSlice\";\nimport { useSession } from \"../../hooks/useSession\";\nimport { getSession, signOut } from \"../../adapters/auth/index\";\nimport { createPortal } from \"react-dom\";\nimport { env } from \"../../adapters/env\";\nimport { ERROR_MESSAGES } from \"../../constants/error-messages\";\n\n// ── Icons ──────────────────────────────────────────────────────────────────────\n\nconst DotsIcon = () => (\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\n <circle cx=\"8\" cy=\"3\" r=\"1.3\" />\n <circle cx=\"8\" cy=\"8\" r=\"1.3\" />\n <circle cx=\"8\" cy=\"13\" r=\"1.3\" />\n </svg>\n);\n\nconst PreviewIcon = () => (\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M1 7s2.5-5 6-5 6 5 6 5-2.5 5-6 5-6-5-6-5Z\" stroke=\"currentColor\" strokeWidth=\"1.3\" strokeLinejoin=\"round\" />\n <circle cx=\"7\" cy=\"7\" r=\"1.8\" stroke=\"currentColor\" strokeWidth=\"1.3\" />\n </svg>\n);\n\nconst LogoutIcon = () => (\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M5 2H2.5A1.5 1.5 0 0 0 1 3.5v7A1.5 1.5 0 0 0 2.5 12H5\" stroke=\"currentColor\" strokeWidth=\"1.3\" strokeLinecap=\"round\" />\n <path d=\"M9 4l3 3-3 3M12 7H5\" stroke=\"currentColor\" strokeWidth=\"1.3\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nexport const ChatIcon = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n </svg>\n);\n\nconst BackendIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <rect x=\"2.2\" y=\"3\" width=\"11.6\" height=\"4\" rx=\"1\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <rect x=\"2.2\" y=\"9\" width=\"11.6\" height=\"4\" rx=\"1\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <circle cx=\"4.5\" cy=\"5\" r=\"0.7\" fill=\"currentColor\" />\n <circle cx=\"4.5\" cy=\"11\" r=\"0.7\" fill=\"currentColor\" />\n </svg>\n);\n\nconst FrontendIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <rect x=\"1.8\" y=\"2\" width=\"12.4\" height=\"9.5\" rx=\"1.5\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <path d=\"M6 13.5 5 15h6l-1-1.5\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M5.5 5 7.5 7l-2 2\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"m10.5 5 2 2-2 2\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\n// ── SolidStudio ────────────────────────────────────────────────────────────────\n// Single component that renders both the Studio header and the AI panel.\n// Mount this ONCE at the app root via AppEventListener.\n// When studio mode is off it renders nothing.\n\nexport function SolidStudio() {\n const isStudioMode = useSelector((state: any) => state.solidStudio?.isStudioMode ?? false);\n const studioView = useSelector((state: any) => state.solidStudio?.studioView ?? null) as StudioView;\n const dispatch = useDispatch();\n const navigate = useNavigate();\n const { pathname, search } = useLocation();\n const isPreviewMode = new URLSearchParams(search).get(\"preview\") === \"true\" || (typeof sessionStorage !== \"undefined\" && sessionStorage.getItem(\"solid-preview\") === \"true\");\n const isPreviewable = pathname !== \"/studio\" && pathname !== \"/landing\";\n const { data, status } = useSession();\n const isAuthenticated = status === \"authenticated\";\n const [isMenuOpen, setIsMenuOpen] = useState(false);\n const [isChatRedirecting, setIsChatRedirecting] = useState(false);\n const menuRef = useRef<HTMLDivElement>(null);\n\n // Close the 3-dot menu when clicking outside\n useEffect(() => {\n if (!isMenuOpen) return;\n const handler = (e: MouseEvent) => {\n if (menuRef.current && !menuRef.current.contains(e.target as Node)) {\n setIsMenuOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [isMenuOpen]);\n\n // Auto-exit studio if the user logs out\n useEffect(() => {\n if (status === \"unauthenticated\" && isStudioMode) {\n dispatch(exitStudioMode());\n }\n }, [status, isStudioMode, dispatch]);\n\n if (!isStudioMode || !isAuthenticated || isPreviewMode) return null;\n\n const handleLogout = () => {\n setIsMenuOpen(false);\n dispatch(exitStudioMode());\n signOut({ callbackUrl: \"/auth/login\" });\n };\n\n const handleViewSwitch = (view: StudioView) => {\n dispatch(setStudioView(view));\n navigate(view === \"backend\" ? \"/admin\" : \"/landing\");\n };\n\n const handleAiChatClick = async () => {\n if (isChatRedirecting) return;\n\n const aiUrl = env(\"VITE_SOLIDX_AI_URL\");\n if (!aiUrl) return;\n\n setIsChatRedirecting(true);\n try {\n const session = await getSession();\n const accessToken = session?.user?.accessToken || data?.user?.accessToken;\n if (!accessToken) return;\n\n const apiBaseUrl = env(\"API_URL\", \"http://localhost:8080\").replace(/\\/+$/, \"\");\n const response = await fetch(`${apiBaseUrl}/api/iam/sso/code`, {\n method: \"POST\",\n headers: {\n accept: \"*/*\",\n Authorization: `Bearer ${accessToken}`,\n },\n body: \"\",\n });\n\n if (!response.ok) {\n let detail = `Failed to fetch ssoCode (${response.status})`;\n try {\n const errorPayload = await response.json();\n detail =\n errorPayload?.message ||\n errorPayload?.error?.message ||\n errorPayload?.data?.message ||\n detail;\n } catch {\n // no-op: keep default message\n }\n throw new Error(detail);\n }\n\n const payload = await response.json();\n const ssoCode = payload?.ssoCode ?? payload?.data?.ssoCode;\n if (!ssoCode) {\n throw new Error(\"ssoCode missing in response\");\n }\n\n const redirectUrl = new URL(aiUrl, window.location.origin);\n redirectUrl.searchParams.set(\"ssoCode\", String(ssoCode));\n window.open(redirectUrl.toString(), \"_blank\");\n } catch (error) {\n const detail = error instanceof Error ? error.message : ERROR_MESSAGES.SOMETHING_WRONG;\n dispatch(\n showToast({\n severity: \"error\",\n summary: ERROR_MESSAGES.ERROR,\n detail,\n life: 4000,\n })\n );\n console.error(\"Failed to open AI chat with ssoCode:\", error);\n } finally {\n setIsChatRedirecting(false);\n }\n };\n\n const studioUI = (\n <div className=\"solid-studio-island\" style={{ zIndex: \"var(--z-studio)\" }}>\n <div className=\"solid-studio-island-inner\">\n <button\n type=\"button\"\n className={`solid-studio-island-btn${studioView === \"backend\" ? \" active\" : \"\"}`}\n onClick={() => handleViewSwitch(\"backend\")}\n aria-label=\"Backend studio\"\n >\n <BackendIcon />\n </button>\n <button\n type=\"button\"\n className={`solid-studio-island-btn${studioView === \"frontend\" ? \" active\" : \"\"}`}\n onClick={() => handleViewSwitch(\"frontend\")}\n aria-label=\"Frontend studio\"\n >\n <FrontendIcon />\n </button>\n <button\n type=\"button\"\n className=\"solid-studio-island-btn\"\n onClick={handleAiChatClick}\n disabled={isChatRedirecting}\n aria-busy={isChatRedirecting}\n aria-label=\"AI chat\"\n >\n <ChatIcon />\n </button>\n <div className=\"solid-studio-island-menu\" ref={menuRef}>\n <button\n type=\"button\"\n className={`solid-studio-island-btn${isMenuOpen ? \" active\" : \"\"}`}\n onClick={() => setIsMenuOpen((o) => !o)}\n aria-label=\"Studio options\"\n >\n <DotsIcon />\n </button>\n {isMenuOpen && (\n <div className=\"solid-studio-island-dropdown\">\n {isPreviewable && (\n <button\n type=\"button\"\n className=\"solid-studio-island-dropdown-item\"\n onClick={() => {\n setIsMenuOpen(false);\n const params = new URLSearchParams(search);\n params.set(\"preview\", \"true\");\n window.open(`${pathname}?${params.toString()}`, \"_blank\");\n }}\n >\n <PreviewIcon />\n Preview page\n </button>\n )}\n <button\n type=\"button\"\n className=\"solid-studio-island-dropdown-item danger\"\n onClick={handleLogout}\n >\n <LogoutIcon />\n Logout\n </button>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n\n return typeof document !== \"undefined\" ? createPortal(studioUI, document.body) : null;\n}\n\n// ── PreviewModePersist ─────────────────────────────────────────────────────────\n// Mount once at the app root alongside SolidStudio.\n// sessionStorage is tab-scoped, so preview opened in a new tab stays isolated.\n// Closing the tab is the natural way to exit preview mode.\n\nconst PREVIEW_KEY = \"solid-preview\";\n\nexport function PreviewModePersist() {\n const { pathname, search } = useLocation();\n const navigate = useNavigate();\n\n // Activate: when URL has ?preview=true, store it in sessionStorage for this tab\n useEffect(() => {\n const params = new URLSearchParams(search);\n if (params.get(\"preview\") === \"true\") {\n sessionStorage.setItem(PREVIEW_KEY, \"true\");\n }\n }, [search]);\n\n // Persist: re-inject ?preview=true on every navigation if it was set\n useEffect(() => {\n if (sessionStorage.getItem(PREVIEW_KEY) !== \"true\") return;\n const params = new URLSearchParams(search);\n if (params.get(\"preview\") === \"true\") return;\n params.set(\"preview\", \"true\");\n navigate({ pathname, search: `?${params.toString()}` }, { replace: true });\n }, [pathname, search, navigate]);\n\n return null;\n}\n\n// ── SolidStudioWrapper ─────────────────────────────────────────────────────────\n// Kept for backwards compatibility. Now a pure pass-through.\nexport function SolidStudioWrapper({ children }: { children: React.ReactNode }) {\n return <>{children}</>;\n}\n\n// Legacy aliases\nexport const SolidAiStudioLayout = SolidStudioWrapper;\nexport const SolidStudioPanel = SolidStudio;\n"]}
@@ -2,10 +2,12 @@ import React, { useEffect, useRef, useState } from "react";
2
2
  import { useDispatch, useSelector } from "react-redux";
3
3
  import { useNavigate, useLocation } from "react-router-dom";
4
4
  import { exitStudioMode, setStudioView, type StudioView } from "../../redux/features/solidStudioSlice";
5
+ import { showToast } from "../../redux/features/toastSlice";
5
6
  import { useSession } from "../../hooks/useSession";
6
- import { signOut } from "../../adapters/auth/index";
7
+ import { getSession, signOut } from "../../adapters/auth/index";
7
8
  import { createPortal } from "react-dom";
8
9
  import { env } from "../../adapters/env";
10
+ import { ERROR_MESSAGES } from "../../constants/error-messages";
9
11
 
10
12
  // ── Icons ──────────────────────────────────────────────────────────────────────
11
13
 
@@ -68,9 +70,10 @@ export function SolidStudio() {
68
70
  const { pathname, search } = useLocation();
69
71
  const isPreviewMode = new URLSearchParams(search).get("preview") === "true" || (typeof sessionStorage !== "undefined" && sessionStorage.getItem("solid-preview") === "true");
70
72
  const isPreviewable = pathname !== "/studio" && pathname !== "/landing";
71
- const { status } = useSession();
73
+ const { data, status } = useSession();
72
74
  const isAuthenticated = status === "authenticated";
73
75
  const [isMenuOpen, setIsMenuOpen] = useState(false);
76
+ const [isChatRedirecting, setIsChatRedirecting] = useState(false);
74
77
  const menuRef = useRef<HTMLDivElement>(null);
75
78
 
76
79
  // Close the 3-dot menu when clicking outside
@@ -105,6 +108,68 @@ export function SolidStudio() {
105
108
  navigate(view === "backend" ? "/admin" : "/landing");
106
109
  };
107
110
 
111
+ const handleAiChatClick = async () => {
112
+ if (isChatRedirecting) return;
113
+
114
+ const aiUrl = env("VITE_SOLIDX_AI_URL");
115
+ if (!aiUrl) return;
116
+
117
+ setIsChatRedirecting(true);
118
+ try {
119
+ const session = await getSession();
120
+ const accessToken = session?.user?.accessToken || data?.user?.accessToken;
121
+ if (!accessToken) return;
122
+
123
+ const apiBaseUrl = env("API_URL", "http://localhost:8080").replace(/\/+$/, "");
124
+ const response = await fetch(`${apiBaseUrl}/api/iam/sso/code`, {
125
+ method: "POST",
126
+ headers: {
127
+ accept: "*/*",
128
+ Authorization: `Bearer ${accessToken}`,
129
+ },
130
+ body: "",
131
+ });
132
+
133
+ if (!response.ok) {
134
+ let detail = `Failed to fetch ssoCode (${response.status})`;
135
+ try {
136
+ const errorPayload = await response.json();
137
+ detail =
138
+ errorPayload?.message ||
139
+ errorPayload?.error?.message ||
140
+ errorPayload?.data?.message ||
141
+ detail;
142
+ } catch {
143
+ // no-op: keep default message
144
+ }
145
+ throw new Error(detail);
146
+ }
147
+
148
+ const payload = await response.json();
149
+ const ssoCode = payload?.ssoCode ?? payload?.data?.ssoCode;
150
+ if (!ssoCode) {
151
+ throw new Error("ssoCode missing in response");
152
+ }
153
+
154
+ const redirectUrl = new URL(aiUrl, window.location.origin);
155
+ redirectUrl.searchParams.set("ssoCode", String(ssoCode));
156
+ window.open(redirectUrl.toString(), "_blank");
157
+ } catch (error) {
158
+ const detail = error instanceof Error ? error.message : ERROR_MESSAGES.SOMETHING_WRONG;
159
+ dispatch(
160
+ showToast({
161
+ severity: "error",
162
+ summary: ERROR_MESSAGES.ERROR,
163
+ detail,
164
+ life: 4000,
165
+ })
166
+ );
167
+ console.error("Failed to open AI chat with ssoCode:", error);
168
+ } finally {
169
+ setIsChatRedirecting(false);
170
+ }
171
+ };
172
+
108
173
  const studioUI = (
109
174
  <div className="solid-studio-island" style={{ zIndex: "var(--z-studio)" }}>
110
175
  <div className="solid-studio-island-inner">
@@ -127,10 +192,9 @@ export function SolidStudio() {
127
192
  <button
128
193
  type="button"
129
194
  className="solid-studio-island-btn"
130
- onClick={() => {
131
- const aiUrl = env("VITE_SOLIDX_AI_URL");
132
- if (aiUrl) window.open(aiUrl, "_blank");
133
- }}
195
+ onClick={handleAiChatClick}
196
+ disabled={isChatRedirecting}
197
+ aria-busy={isChatRedirecting}
134
198
  aria-label="AI chat"
135
199
  >
136
200
  <ChatIcon />
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/helpers/registry.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,MAAM,OAAO,CAAC;AAkD1B,OAAO,EAGH,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC7B,MAAM,6BAA6B,CAAC;AA6BrC,eAAO,MAAM,0BAA0B,SAAU,MAAM,aAAa,MAAM,aAAa,CAAC,GAAG,CAAC,QAAQ,sBAAsB,YAAW,MAAM,EAAE,cAAkB,MAAM,SAMpK,CAAC;AAEF,eAAO,MAAM,yBAAyB,SAAU,MAAM,gBAAgB,GAAG,EAAE,KAAK,GAAG,QAAQ,qBAAqB,SAE/G,CAAC;AAEF,eAAO,MAAM,qBAAqB,SAAU,MAAM,KAAG,MAAM,aAAa,CAAC,GAAG,CAAC,GAAG,IAM/E,CAAC;AAEF,eAAO,MAAM,sBAAsB,SAAU,sBAAsB,cAAa,MAAM,KAAQ,MAAM,EAAE,GAAG,EASxG,CAAC;AAEF,eAAO,MAAM,oBAAoB,SAAU,MAAM,eA7C/B,GAAG,EAAE,KAAK,GA+C3B,CAAC"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/helpers/registry.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,MAAM,OAAO,CAAC;AA0D1B,OAAO,EAGH,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC7B,MAAM,6BAA6B,CAAC;AAwBrC,eAAO,MAAM,0BAA0B,SAAU,MAAM,aAAa,MAAM,aAAa,CAAC,GAAG,CAAC,QAAQ,sBAAsB,YAAW,MAAM,EAAE,cAAkB,MAAM,SAMpK,CAAC;AAEF,eAAO,MAAM,yBAAyB,SAAU,MAAM,gBAAgB,GAAG,EAAE,KAAK,GAAG,QAAQ,qBAAqB,SAE/G,CAAC;AAEF,eAAO,MAAM,qBAAqB,SAAU,MAAM,KAAG,MAAM,aAAa,CAAC,GAAG,CAAC,GAAG,IAM/E,CAAC;AAEF,eAAO,MAAM,sBAAsB,SAAU,sBAAsB,cAAa,MAAM,KAAQ,MAAM,EAAE,GAAG,EASxG,CAAC;AAEF,eAAO,MAAM,oBAAoB,SAAU,MAAM,eA7C/B,GAAG,EAAE,KAAK,GA+C3B,CAAC"}
@@ -51,12 +51,14 @@ import dashboardQuestionFieldChangeHandler from "../components/core/extension/so
51
51
  import dashboardQuestionOnFormLoadHandler from "../components/core/extension/solid-core/dashboard/dashboardQuestionOnFormLoadHandler";
52
52
  import MqMessageKanbanCardWidget from "../components/core/extension/solid-core/mqMessage/kanban/MqMessageKanbanCardWidget";
53
53
  import MediaCardWidget from "../components/core/extension/solid-core/media/card/MediaCardWidget";
54
+ import { SolidChatterMessageCoModelEntityIdListViewWidget } from "../components/core/extension/solid-core/chatterMessage/list/SolidChatterMessageCoModelEntityIdListViewWidget";
55
+ import { SolidMqMessageStageListViewWidget } from "../components/core/extension/solid-core/mqMessage/list/SolidMqMessageStageListViewWidget";
56
+ import { SolidMqMessagesSummarizeListHeaderAction } from "../components/core/extension/solid-core/mqMessage/list/SolidMqMessagesSummarizeListHeaderAction";
57
+ import { SolidChatterMessageCoModelEntityIdFormViewWidget } from "../components/core/extension/solid-core/chatterMessage/form/SolidChatterMessageCoModelEntityIdFormViewWidget";
58
+ import { SolidLovTypeChangeFormEditWidget } from "../components/core/extension/solid-core/listOfValues/form/SolidLovTypeChangeFormEditWidget";
59
+ import mqMessageOnFormLoadHandler from "../components/core/extension/solid-core/mqMessage/form/mqMessageOnFormLoadHandler";
60
+ import { SolidMqMessageStageFormViewWIdget } from "../components/core/extension/solid-core/mqMessage/form/SolidMqMessageStageFormViewWIdget";
54
61
  import { ExtensionComponentTypes, ExtensionFunctionTypes, } from "../types/extension-registry";
55
- import { SolidChatterMessageCoModelEntityIdFormViewWidget } from "../components/core/form/fields/widgets/SolidChatterMessageCoModelEntityIdFormViewWidget";
56
- import { SolidChatterMessageCoModelEntityIdListViewWidget } from "../components/core/list/widgets/SolidChatterMessageCoModelEntityIdListViewWidget";
57
- import { SolidMqMessageStageListViewWidget } from "../components/core/list/widgets/SolidMqMessageStageListViewWidget";
58
- import { SolidLovTypeChangeFormEditWidget } from "../components/core/form/fields/widgets/SolidLovTypeChangeFormEditWidget";
59
- import { SolidSummarizeListHeaderActionMqMessages } from "../components/core/list/widgets/SolidSummarizeListHeaderActionMqMessages";
60
62
  var extensionRegistry = {
61
63
  components: {},
62
64
  functions: {},
@@ -123,7 +125,7 @@ registerExtensionComponent('DefaultDateListWidget', DefaultDateListWidget, Exten
123
125
  // - datetime
124
126
  registerExtensionComponent("SolidChatterMessageCoModelEntityIdListViewWidget", SolidChatterMessageCoModelEntityIdListViewWidget, ExtensionComponentTypes.list_field_widget);
125
127
  registerExtensionComponent("SolidMqMessageStageListViewWidget", SolidMqMessageStageListViewWidget, ExtensionComponentTypes.list_field_widget);
126
- registerExtensionComponent("SolidSummarizeListHeaderActionMqMessages", SolidSummarizeListHeaderActionMqMessages, ExtensionComponentTypes.list_header_action);
128
+ registerExtensionComponent("SolidMqMessagesSummarizeListHeaderAction", SolidMqMessagesSummarizeListHeaderAction, ExtensionComponentTypes.list_header_action);
127
129
  // ...
128
130
  // 2. form view field edit widget
129
131
  // - shortText
@@ -257,6 +259,7 @@ registerExtensionComponent("RolePermissionsManyToManyFieldWidget", RolePermissio
257
259
  // Solid Google Material Symbols Icon
258
260
  registerExtensionComponent("SolidIconEditWidget", SolidIconEditWidget, ExtensionComponentTypes.form_field_edit_widget);
259
261
  registerExtensionComponent("SolidIconViewWidget", SolidIconViewWidget, ExtensionComponentTypes.form_field_view_widget);
262
+ registerExtensionComponent("SolidMqMessageStageFormViewWIdget", SolidMqMessageStageFormViewWIdget, ExtensionComponentTypes.form_field_view_widget);
260
263
  // Kanban
261
264
  registerExtensionComponent("MqMessageKanbanCardWidget", MqMessageKanbanCardWidget, ExtensionComponentTypes.kanban_card_widget);
262
265
  registerExtensionComponent("MediaCardWidget", MediaCardWidget, ExtensionComponentTypes.card_widget);
@@ -273,4 +276,5 @@ registerExtensionFunction("dashboardQuestionOnFormLoadHandler", dashboardQuestio
273
276
  // on change of module, apply a where clause on the model & field fields..
274
277
  // on change of model, apply a where clause on the field field...
275
278
  registerExtensionFunction("modelSequenceFormViewChangeHandler", hanldeModelSequenceFormViewChange, ExtensionFunctionTypes.onFieldChange);
279
+ registerExtensionFunction("mqMessageOnFormLoadHandler", mqMessageOnFormLoadHandler, ExtensionFunctionTypes.onFormLoad);
276
280
  //# sourceMappingURL=registry.js.map