Skip to content

Commit 65f7874

Browse files
committed
refactor: reorganize AI landing page constants and extract SuggestionPill interface
- Move aiLandingPagePrompts.ts to src/constants/pages/ directory - Create dedicated aiWelcomePage.constants.ts for initialPillsCount - Extract SuggestionPill interface to src/interfaces/components/ - Add barrel exports in new pages/ index.ts - Update imports in constants/index.ts and E2E tests This improves code organization by separating page-specific constants into their own directory and moving the interface to the proper interfaces folder following project conventions.
1 parent f416cf1 commit 65f7874

File tree

10 files changed

+41
-98
lines changed

10 files changed

+41
-98
lines changed

.github/workflows/build_test_and_release.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,7 @@ jobs:
183183
run: |
184184
git submodule update --remote
185185
npm run type-check
186+
npm run type-check
186187
npm run lint:ci
187188
npm run build
188189
echo '!dist' >> .gitignore

e2e/project/aiChat.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { expect, test } from "../fixtures";
2-
import { initialPillsCount } from "@src/constants/aiLandingPagePrompts";
2+
import { initialPillsCount } from "@constants/pages/aiWelcomePage.constants";
33

44
test.describe("AI Chat and Iframe Communication Suite", () => {
55
test.beforeEach(async ({ page }) => {

src/constants/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,4 +121,4 @@ export {
121121
export { defaultCodeFixSuggestion, defaultSuggestionAction } from "@constants/monacoEditor.constants";
122122
export { fileTreeColors } from "@constants/components/fileTree.constants";
123123
export { defaultTimezone, defaultTimezoneValue } from "@constants/timezone.constants";
124-
export { initialPillsCount, createAiLandingPagePrompts } from "@constants/aiLandingPagePrompts";
124+
export { createAiLandingPagePrompts, initialPillsCount } from "@constants/pages";

src/constants/aiLandingPagePrompts.ts renamed to src/constants/pages/aiLandingPagePrompts.ts

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,4 @@
1-
export interface SuggestionPill {
2-
title: string;
3-
text: string;
4-
}
5-
6-
export const initialPillsCount = 5;
1+
import { SuggestionPill } from "@src/interfaces/components";
72

83
export const createAiLandingPagePrompts = (tAi: (key: string) => string): SuggestionPill[] => [
94
{
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export const initialPillsCount = 5;

src/constants/pages/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export { initialPillsCount } from "./aiWelcomePage.constants";
2+
export { createAiLandingPagePrompts } from "./aiLandingPagePrompts";
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
export interface SuggestionPill {
2+
title: string;
3+
text: string;
4+
}

src/interfaces/components/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,3 +143,4 @@ export type {
143143
export type { SkeletonLoaderProps } from "./skeleton.interface";
144144
// Integration component interfaces
145145
export * from "./integrations";
146+
export type { SuggestionPill } from "./aiSuggestionPill.interface";

src/locales/en/services/translation.json

Lines changed: 7 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -119,49 +119,31 @@
119119
"errorRemovingUserToOrganization": "Removing user from organization failed",
120120
"errorRemovingUserToOrganizationExtended": "Removing user from organization failed, organization ID: {{organizationId}}, error: {{error}}",
121121
"errorUpdatingUserToOrganizationExtended": "Updating user to organization failed, organization ID: {{organizationId}}, error: {{error}}",
122-
"debug": {
122+
"errors": {
123123
"iframeComm": {
124-
"settingIframeReference": "Setting iframe reference",
125-
"destroyingService": "Destroying service - cleaning up all resources",
126-
"resettingService": "Resetting service for navigation",
127-
"initiatingHandshake": "Initiating handshake with iframe",
128-
"handshakeMessageSent": "Handshake message sent",
129-
"alreadyConnected": "Already connected, returning",
130-
"noConnectionPromiseExists": "No connection promise exists, trying to initiate handshake",
131-
"waitingForConnection": "Waiting for connection promise to resolve",
132-
"messageQueueFull": "Message queue full ({{maxQueueSize}}), dropping oldest messages",
133-
"postingMessageToChatbot": "Posting message to chatbot at origin {{origin}}: {{message}}",
134-
"duplicateRequestForResource": "Duplicate request for resource {{resource}}, waiting for existing request",
135124
"invalidOrigin": "Invalid origin: {{origin}}, expected: {{expectedOrigin}}",
136125
"invalidMessageFormat": "Invalid message format",
137-
"failedToSendEvent": "Failed to send event {{eventName}} to chatbot iframe: {{error}}. This is expected if chatbot is not open.",
138126
"iframeRemovedFromDOM": "Iframe removed from DOM - resetting service",
139-
"sendingCodeSuggestionAccepted": "Sending code suggestion accepted for file {{fileName}}, operation: {{operation}}",
140-
"sendingCodeSuggestionRejected": "Sending code suggestion rejected for file {{fileName}}, operation: {{operation}}, reason: {{reason}}",
141-
"sendingDatadogSessionId": "Sending Datadog session ID: {{sessionId}}",
142-
"sendingDatadogViewId": "Sending Datadog view ID: {{viewId}}",
143-
"errorParsingIframeOrigin": "Error parsing iframe origin URL: {{error}}"
144-
}
145-
},
146-
"errors": {
147-
"iframeComm": {
148127
"failedToSendHandshakeMessage": "Failed to send handshake message: {{error}}",
149128
"queueProcessingExceeded": "Queue processing exceeded max attempts ({{maxAttempts}}), clearing queue",
129+
"errorParsingIframeOrigin": "Error parsing iframe origin URL: {{error}}",
150130
"errorProcessingIncomingMessage": "Error processing incoming message: {{error}}",
151131
"errorImportingStoreForVarUpdatedHandling": "Error importing store for var updated handling: {{error}}",
132+
"messageQueueFull": "Message queue full ({{maxQueueSize}}), dropping oldest messages",
152133
"failedToDownloadFile": "Failed to download file {{filename}}: {{error}}",
134+
"failedToSendEvent": "Failed to send event {{eventName}} to chatbot iframe: {{error}}. This is expected if chatbot is not open.",
153135
"failedToDownloadChatFile": "Failed to download chat file {{filename}}: {{error}}",
136+
"duplicateRequestForResource": "Duplicate request for resource {{resource}}, waiting for existing request",
154137
"iframeReferenceNotSet": "Iframe reference not set",
155138
"noConnectionAttemptInProgress": "No connection attempt in progress",
139+
"noConnectionPromiseExists": "No connection promise exists, trying to initiate handshake",
156140
"iframeContentWindowNotAvailable": "Iframe contentWindow is not available",
157141
"requestTimeoutForResource": "Request timeout for resource: {{resource}}",
158-
"invalidMessageReceivedOrSourceMismatch": "Invalid message received or source mismatch: {{message}}",
159-
"errorImportingStoreForFileContentHandling": "Error importing store for file content handling: {{error}}",
160142
"errorImportingStoreForDiagramDisplayHandling": "Error importing store for diagram display handling: {{error}}",
161143
"serviceDestroyedDuringNavigation": "Service destroyed during navigation",
162144
"serviceResetDuringNavigation": "Service reset during navigation",
163145
"errorImportingDatadogUtils": "Error importing Datadog utils: {{error}}",
164146
"errorNavigatingToBilling": "Error navigating to billing: {{error}}"
165147
}
166148
}
167-
}
149+
}

src/services/iframeComm.service.ts

Lines changed: 22 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ const parseOrigin = (url: string | undefined, errorContext?: string): string =>
6363
return url.replace(/\/$/, "");
6464
} catch (error) {
6565
if (errorContext) {
66-
LoggerService.debug(namespaces.iframeCommService, `${errorContext}: ${url}: ${error}`);
66+
LoggerService.error(namespaces.iframeCommService, `${errorContext}: ${url}: ${error}`);
6767
}
6868

6969
return "";
@@ -136,9 +136,9 @@ class IframeCommService {
136136
mutations.forEach((mutation) => {
137137
if (mutation.type === "childList" && this.iframeRef) {
138138
if (!document.contains(this.iframeRef)) {
139-
LoggerService.debug(
139+
LoggerService.warn(
140140
namespaces.iframeCommService,
141-
t("debug.iframeComm.iframeRemovedFromDOM", { ns: "services" })
141+
t("errors.iframeComm.iframeRemovedFromDOM", { ns: "services" })
142142
);
143143
this.reset();
144144
this.iframeRef = null;
@@ -164,8 +164,6 @@ class IframeCommService {
164164
}
165165

166166
public destroy(): void {
167-
LoggerService.debug(namespaces.iframeCommService, t("debug.iframeComm.destroyingService", { ns: "services" }));
168-
169167
window.removeEventListener("message", this.handleIncomingMessages);
170168

171169
this.mutationObserver?.disconnect();
@@ -188,8 +186,6 @@ class IframeCommService {
188186
}
189187

190188
public reset(): void {
191-
LoggerService.debug(namespaces.iframeCommService, t("debug.iframeComm.resettingService", { ns: "services" }));
192-
193189
this.isConnected = false;
194190
this.connectionPromise = null;
195191
this.connectionResolve = null;
@@ -226,12 +222,8 @@ class IframeCommService {
226222

227223
try {
228224
await this.sendMessage(handshakeMessage);
229-
LoggerService.debug(
230-
namespaces.iframeCommService,
231-
t("debug.iframeComm.handshakeMessageSent", { ns: "services" })
232-
);
233225
} catch (error) {
234-
LoggerService.debug(
226+
LoggerService.error(
235227
namespaces.iframeCommService,
236228
t("errors.iframeComm.failedToSendHandshakeMessage", { ns: "services", error })
237229
);
@@ -253,17 +245,13 @@ class IframeCommService {
253245

254246
public async waitForConnection(): Promise<void> {
255247
if (this.isConnected) {
256-
LoggerService.debug(
257-
namespaces.iframeCommService,
258-
t("debug.iframeComm.alreadyConnected", { ns: "services" })
259-
);
260248
return Promise.resolve();
261249
}
262250

263251
if (!this.connectionPromise) {
264-
LoggerService.debug(
252+
LoggerService.error(
265253
namespaces.iframeCommService,
266-
t("debug.iframeComm.noConnectionPromiseExists", { ns: "services" })
254+
t("errors.iframeComm.noConnectionPromiseExists", { ns: "services" })
267255
);
268256
if (this.iframeRef) {
269257
await this.initiateHandshake();
@@ -274,10 +262,6 @@ class IframeCommService {
274262
}
275263
}
276264

277-
LoggerService.debug(
278-
namespaces.iframeCommService,
279-
t("debug.iframeComm.waitingForConnection", { ns: "services" })
280-
);
281265
return (
282266
this.connectionPromise ||
283267
Promise.reject(new Error(t("errors.iframeComm.noConnectionAttemptInProgress", { ns: "services" })))
@@ -301,9 +285,9 @@ class IframeCommService {
301285
message.type !== MessageTypes.HANDSHAKE_ACK
302286
) {
303287
if (this.messageQueue.length >= this.maxQueueSize) {
304-
LoggerService.debug(
288+
LoggerService.error(
305289
namespaces.iframeCommService,
306-
t("debug.iframeComm.messageQueueFull", { ns: "services", maxQueueSize: this.maxQueueSize })
290+
t("errors.iframeComm.messageQueueFull", { ns: "services", maxQueueSize: this.maxQueueSize })
307291
);
308292
this.messageQueue = this.messageQueue.slice(-(this.maxQueueSize - 1));
309293
}
@@ -317,14 +301,6 @@ class IframeCommService {
317301

318302
if (this.iframeRef.contentWindow) {
319303
const targetOrigin = this.getTargetOrigin();
320-
LoggerService.debug(
321-
namespaces.iframeCommService,
322-
t("debug.iframeComm.postingMessageToChatbot", {
323-
ns: "services",
324-
origin: targetOrigin,
325-
message: JSON.stringify(messageToSend),
326-
})
327-
);
328304
this.iframeRef.contentWindow.postMessage(messageToSend, targetOrigin);
329305
} else {
330306
throw new Error(t("errors.iframeComm.iframeContentWindowNotAvailable", { ns: "services" }));
@@ -338,7 +314,7 @@ class IframeCommService {
338314

339315
this.queueProcessCount++;
340316
if (this.queueProcessCount > this.maxQueueProcessAttempts) {
341-
LoggerService.debug(
317+
LoggerService.error(
342318
namespaces.iframeCommService,
343319
t("errors.iframeComm.queueProcessingExceeded", {
344320
ns: "services",
@@ -405,9 +381,9 @@ class IframeCommService {
405381
}
406382
this.sendEvent(eventName, payload);
407383
} catch (error) {
408-
LoggerService.debug(
384+
LoggerService.error(
409385
namespaces.iframeCommService,
410-
t("debug.iframeComm.failedToSendEvent", {
386+
t("errors.iframeComm.failedToSendEvent", {
411387
ns: "services",
412388
eventName,
413389
error: (error as Error).message,
@@ -431,15 +407,6 @@ class IframeCommService {
431407
},
432408
};
433409

434-
LoggerService.debug(
435-
namespaces.iframeCommService,
436-
t("debug.iframeComm.sendingCodeSuggestionAccepted", {
437-
ns: "services",
438-
fileName,
439-
operation,
440-
})
441-
);
442-
443410
this.sendMessage(message);
444411
}
445412

@@ -460,16 +427,6 @@ class IframeCommService {
460427
},
461428
};
462429

463-
LoggerService.debug(
464-
namespaces.iframeCommService,
465-
t("debug.iframeComm.sendingCodeSuggestionRejected", {
466-
ns: "services",
467-
fileName,
468-
operation,
469-
reason,
470-
})
471-
);
472-
473430
this.sendMessage(message);
474431
}
475432

@@ -519,7 +476,7 @@ class IframeCommService {
519476
return undefined;
520477
})
521478
.catch((error) => {
522-
LoggerService.debug(
479+
LoggerService.error(
523480
namespaces.iframeCommService,
524481
t("errors.iframeComm.errorImportingDatadogUtils", {
525482
ns: "services",
@@ -537,9 +494,9 @@ class IframeCommService {
537494
const existingRequest = Array.from(this.pendingRequests.values()).find((req) => req.resource === resource);
538495

539496
if (existingRequest) {
540-
LoggerService.debug(
497+
LoggerService.warn(
541498
namespaces.iframeCommService,
542-
t("debug.iframeComm.duplicateRequestForResource", {
499+
t("errors.iframeComm.duplicateRequestForResource", {
543500
ns: "services",
544501
resource,
545502
})
@@ -645,7 +602,7 @@ class IframeCommService {
645602
if (this.iframeRef?.src) {
646603
const iframeOrigin = parseOrigin(
647604
this.iframeRef.src,
648-
t("debug.iframeComm.errorParsingIframeOrigin", {
605+
t("errors.iframeComm.errorParsingIframeOrigin", {
649606
ns: "services",
650607
iframeRefSrc: this.iframeRef.src,
651608
})
@@ -671,22 +628,22 @@ class IframeCommService {
671628
}
672629

673630
private logInvalidOrigin(eventOrigin: string, messageData: unknown): void {
674-
LoggerService.debug(
631+
LoggerService.error(
675632
namespaces.iframeCommService,
676-
t("debug.iframeComm.invalidOrigin", {
633+
t("errors.iframeComm.invalidOrigin", {
677634
ns: "services",
678635
origin: eventOrigin,
679636
expectedOrigin: this.expectedOrigin || aiChatbotOrigin,
680637
})
681638
);
682639
try {
683640
const raw = messageData as Record<string, unknown>;
684-
LoggerService.debug(
641+
LoggerService.error(
685642
namespaces.iframeCommService,
686643
`Filtered message due to origin mismatch: type=${String(raw?.type)} source=${String(raw?.source)}`
687644
);
688645
} catch (error) {
689-
LoggerService.debug(
646+
LoggerService.error(
690647
namespaces.iframeCommService,
691648
`Filtered message due to origin mismatch: error extracting type/source ${error}`
692649
);
@@ -711,9 +668,9 @@ class IframeCommService {
711668
}
712669

713670
if (!isValidAkbotMessage(event.data)) {
714-
LoggerService.debug(
671+
LoggerService.error(
715672
namespaces.iframeCommService,
716-
t("debug.iframeComm.invalidMessageFormat", { ns: "services" })
673+
t("errors.iframeComm.invalidMessageFormat", { ns: "services" })
717674
);
718675
return;
719676
}
@@ -733,7 +690,7 @@ class IframeCommService {
733690
.filter((listener) => listener.type === message.type)
734691
.forEach((listener) => listener.callback(message));
735692
} catch (error) {
736-
LoggerService.debug(
693+
LoggerService.error(
737694
namespaces.iframeCommService,
738695
t("errors.iframeComm.errorProcessingIncomingMessage", {
739696
ns: "services",

0 commit comments

Comments
 (0)