posthog-js 1.371.3 → 1.372.0

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 (45) hide show
  1. package/dist/array.full.es5.js +1 -1
  2. package/dist/array.full.js +1 -1
  3. package/dist/array.full.no-external.js +1 -1
  4. package/dist/array.js +1 -1
  5. package/dist/array.no-external.js +1 -1
  6. package/dist/conversations.js +1 -1
  7. package/dist/conversations.js.map +1 -1
  8. package/dist/customizations.full.js +1 -1
  9. package/dist/default-extensions.js +1 -1
  10. package/dist/extension-bundles.js +1 -1
  11. package/dist/lazy-recorder.js +1 -1
  12. package/dist/main.js +1 -1
  13. package/dist/module.full.js +1 -1
  14. package/dist/module.full.no-external.js +1 -1
  15. package/dist/module.js +1 -1
  16. package/dist/module.no-external.js +1 -1
  17. package/dist/module.slim.js +1 -1
  18. package/dist/module.slim.no-external.js +1 -1
  19. package/dist/posthog-recorder.js +1 -1
  20. package/dist/posthog-recorder.js.map +1 -1
  21. package/dist/src/extensions/conversations/external/components/ConversationsWidget.d.ts +9 -3
  22. package/dist/src/extensions/conversations/external/components/MessagesView.d.ts +3 -1
  23. package/dist/src/extensions/conversations/external/components/NewConversationButton.d.ts +12 -0
  24. package/dist/src/extensions/conversations/external/components/styles.d.ts +15 -0
  25. package/dist/src/extensions/conversations/external/index.d.ts +8 -1
  26. package/lib/package.json +1 -1
  27. package/lib/src/extensions/conversations/external/components/ConversationsWidget.d.ts +9 -3
  28. package/lib/src/extensions/conversations/external/components/ConversationsWidget.js +18 -10
  29. package/lib/src/extensions/conversations/external/components/ConversationsWidget.js.map +1 -1
  30. package/lib/src/extensions/conversations/external/components/MessagesView.d.ts +3 -1
  31. package/lib/src/extensions/conversations/external/components/MessagesView.js +3 -2
  32. package/lib/src/extensions/conversations/external/components/MessagesView.js.map +1 -1
  33. package/lib/src/extensions/conversations/external/components/NewConversationButton.d.ts +12 -0
  34. package/lib/src/extensions/conversations/external/components/NewConversationButton.js +18 -0
  35. package/lib/src/extensions/conversations/external/components/NewConversationButton.js.map +1 -0
  36. package/lib/src/extensions/conversations/external/components/TicketListView.js +2 -5
  37. package/lib/src/extensions/conversations/external/components/TicketListView.js.map +1 -1
  38. package/lib/src/extensions/conversations/external/components/styles.d.ts +15 -0
  39. package/lib/src/extensions/conversations/external/components/styles.js +15 -0
  40. package/lib/src/extensions/conversations/external/components/styles.js.map +1 -1
  41. package/lib/src/extensions/conversations/external/index.d.ts +8 -1
  42. package/lib/src/extensions/conversations/external/index.js +115 -25
  43. package/lib/src/extensions/conversations/external/index.js.map +1 -1
  44. package/lib/tsconfig.tsbuildinfo +1 -1
  45. package/package.json +6 -6
@@ -12,7 +12,7 @@ interface WidgetProps {
12
12
  isIdentityMode?: boolean;
13
13
  initialView?: WidgetView;
14
14
  initialTickets?: Ticket[];
15
- hasMultipleTickets?: boolean;
15
+ showTicketList?: boolean;
16
16
  onSendMessage: (message: string) => Promise<void>;
17
17
  onStateChange?: (state: ConversationsWidgetState) => void;
18
18
  onIdentify?: (traits: UserProvidedTraits) => void;
@@ -36,7 +36,8 @@ interface WidgetState {
36
36
  formEmailError: string | null;
37
37
  userTraits: UserProvidedTraits | null;
38
38
  unreadCount: number;
39
- hasMultipleTickets: boolean;
39
+ showTicketList: boolean;
40
+ isCurrentTicketResolved: boolean;
40
41
  isIdentityMode: boolean;
41
42
  restoreEmail: string;
42
43
  restoreEmailError: string | null;
@@ -100,7 +101,12 @@ export declare class ConversationsWidget extends Component<WidgetProps, WidgetSt
100
101
  /**
101
102
  * Update the tickets list (called by manager during polling)
102
103
  */
103
- updateTickets(tickets: Ticket[]): void;
104
+ updateTickets(tickets: Ticket[], showTicketList: boolean): void;
105
+ /**
106
+ * Set whether the current ticket (if any) is in the resolved state.
107
+ * Called by the manager whenever the current ticket or tickets list changes.
108
+ */
109
+ setCurrentTicketResolved(resolved: boolean): void;
104
110
  /**
105
111
  * Set the current view (tickets list or messages)
106
112
  */
@@ -9,11 +9,13 @@ interface MessagesViewProps {
9
9
  inputValue: string;
10
10
  isLoading: boolean;
11
11
  error: string | null;
12
+ isResolved: boolean;
12
13
  onInputChange: (e: Event) => void;
13
14
  onKeyDown: (e: KeyboardEvent) => void;
14
15
  onSendMessage: () => void;
16
+ onStartNewConversation: () => void;
15
17
  messagesEndRef: (el: HTMLDivElement | null) => void;
16
18
  inputRef: (el: HTMLTextAreaElement | null) => void;
17
19
  }
18
- export declare function MessagesView({ styles, primaryColor, placeholderText, messages, inputValue, isLoading, error, onInputChange, onKeyDown, onSendMessage, messagesEndRef, inputRef, }: MessagesViewProps): h.JSX.Element;
20
+ export declare function MessagesView({ styles, primaryColor, placeholderText, messages, inputValue, isLoading, error, isResolved, onInputChange, onKeyDown, onSendMessage, onStartNewConversation, messagesEndRef, inputRef, }: MessagesViewProps): h.JSX.Element;
19
21
  export {};
@@ -0,0 +1,12 @@
1
+ import { FunctionComponent } from 'preact';
2
+ import { getStyles } from './styles';
3
+ interface NewConversationButtonProps {
4
+ styles: ReturnType<typeof getStyles>;
5
+ onClick: () => void;
6
+ }
7
+ /**
8
+ * Primary CTA used anywhere the user can start a fresh conversation —
9
+ * the bottom of the ticket list and the resolved-state banner in the message view.
10
+ */
11
+ export declare const NewConversationButton: FunctionComponent<NewConversationButtonProps>;
12
+ export {};
@@ -283,6 +283,21 @@ export declare const getStyles: (primaryColor: string, position?: WidgetPosition
283
283
  alignItems: string;
284
284
  flexShrink: number;
285
285
  };
286
+ resolvedBanner: {
287
+ paddingTop: string;
288
+ background: string;
289
+ borderTop: string;
290
+ display: string;
291
+ flexDirection: "column";
292
+ flexShrink: number;
293
+ };
294
+ resolvedBannerText: {
295
+ padding: string;
296
+ fontSize: string;
297
+ color: string;
298
+ textAlign: "center";
299
+ lineHeight: number;
300
+ };
286
301
  input: {
287
302
  flex: number;
288
303
  maxHeight: string;
@@ -23,7 +23,7 @@ export declare class ConversationsManager implements ConversationsManagerInterfa
23
23
  private _initializeWidgetPromise;
24
24
  private _currentView;
25
25
  private _tickets;
26
- private _hasMultipleTickets;
26
+ private _showTicketList;
27
27
  constructor(config: ConversationsRemoteConfig, _posthog: PostHog);
28
28
  /**
29
29
  * Send a message programmatically via the API
@@ -105,6 +105,13 @@ export declare class ConversationsManager implements ConversationsManagerInterfa
105
105
  * Load tickets list from API
106
106
  */
107
107
  private _loadTickets;
108
+ private _computeShowTicketList;
109
+ private _isCurrentTicketResolved;
110
+ /**
111
+ * Patch the local _tickets cache with a new status for a given ticket and push
112
+ * any UI-relevant changes (resolved lock + list visibility) to the widget.
113
+ */
114
+ private _applyTicketStatusUpdate;
108
115
  /**
109
116
  * Main poll function that polls based on current view
110
117
  */
package/lib/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "posthog-js",
3
- "version": "1.371.3",
3
+ "version": "1.372.0",
4
4
  "description": "Posthog-js allows you to automatically capture usage and send events to PostHog.",
5
5
  "repository": "https://github.com/PostHog/posthog-js",
6
6
  "author": "engineering@posthog.com",
@@ -12,7 +12,7 @@ interface WidgetProps {
12
12
  isIdentityMode?: boolean;
13
13
  initialView?: WidgetView;
14
14
  initialTickets?: Ticket[];
15
- hasMultipleTickets?: boolean;
15
+ showTicketList?: boolean;
16
16
  onSendMessage: (message: string) => Promise<void>;
17
17
  onStateChange?: (state: ConversationsWidgetState) => void;
18
18
  onIdentify?: (traits: UserProvidedTraits) => void;
@@ -36,7 +36,8 @@ interface WidgetState {
36
36
  formEmailError: string | null;
37
37
  userTraits: UserProvidedTraits | null;
38
38
  unreadCount: number;
39
- hasMultipleTickets: boolean;
39
+ showTicketList: boolean;
40
+ isCurrentTicketResolved: boolean;
40
41
  isIdentityMode: boolean;
41
42
  restoreEmail: string;
42
43
  restoreEmailError: string | null;
@@ -100,7 +101,12 @@ export declare class ConversationsWidget extends Component<WidgetProps, WidgetSt
100
101
  /**
101
102
  * Update the tickets list (called by manager during polling)
102
103
  */
103
- updateTickets(tickets: Ticket[]): void;
104
+ updateTickets(tickets: Ticket[], showTicketList: boolean): void;
105
+ /**
106
+ * Set whether the current ticket (if any) is in the resolved state.
107
+ * Called by the manager whenever the current ticket or tickets list changes.
108
+ */
109
+ setCurrentTicketResolved(resolved: boolean): void;
104
110
  /**
105
111
  * Set the current view (tickets list or messages)
106
112
  */
@@ -144,7 +144,7 @@ var ConversationsWidget = /** @class */ (function (_super) {
144
144
  }
145
145
  };
146
146
  _this._handleCloseRestoreRequest = function () {
147
- var returnView = _this.state.hasMultipleTickets ? 'tickets' : 'messages';
147
+ var returnView = _this.state.showTicketList ? 'tickets' : 'messages';
148
148
  _this.setState({ view: returnView, restoreEmailError: null, restoreRequestSuccess: false });
149
149
  if (_this.props.onViewChange) {
150
150
  _this.props.onViewChange(returnView);
@@ -199,7 +199,7 @@ var ConversationsWidget = /** @class */ (function (_super) {
199
199
  traits.email = formEmail.trim();
200
200
  }
201
201
  // Navigate to appropriate view after identification
202
- var nextView = _this.state.hasMultipleTickets ? 'tickets' : 'messages';
202
+ var nextView = _this.state.showTicketList ? 'tickets' : 'messages';
203
203
  // Update state and notify parent
204
204
  _this.setState({
205
205
  userTraits: traits,
@@ -325,7 +325,8 @@ var ConversationsWidget = /** @class */ (function (_super) {
325
325
  formEmailError: null,
326
326
  userTraits: userTraits,
327
327
  unreadCount: 0,
328
- hasMultipleTickets: props.hasMultipleTickets || false,
328
+ showTicketList: props.showTicketList || false,
329
+ isCurrentTicketResolved: false,
329
330
  isIdentityMode: isIdentityMode,
330
331
  restoreEmail: (userTraits === null || userTraits === void 0 ? void 0 : userTraits.email) || '',
331
332
  restoreEmailError: null,
@@ -444,7 +445,7 @@ var ConversationsWidget = /** @class */ (function (_super) {
444
445
  */
445
446
  ConversationsWidget.prototype.setUserIdentified = function () {
446
447
  if (this.state.view === 'identification') {
447
- var nextView = this.state.hasMultipleTickets ? 'tickets' : 'messages';
448
+ var nextView = this.state.showTicketList ? 'tickets' : 'messages';
448
449
  this.setState({ view: nextView });
449
450
  if (this.props.onViewChange) {
450
451
  this.props.onViewChange(nextView);
@@ -460,13 +461,20 @@ var ConversationsWidget = /** @class */ (function (_super) {
460
461
  /**
461
462
  * Update the tickets list (called by manager during polling)
462
463
  */
463
- ConversationsWidget.prototype.updateTickets = function (tickets) {
464
+ ConversationsWidget.prototype.updateTickets = function (tickets, showTicketList) {
464
465
  this.setState({
465
466
  tickets: tickets,
466
467
  ticketsLoading: false,
467
- hasMultipleTickets: tickets.length > 1,
468
+ showTicketList: showTicketList,
468
469
  });
469
470
  };
471
+ /**
472
+ * Set whether the current ticket (if any) is in the resolved state.
473
+ * Called by the manager whenever the current ticket or tickets list changes.
474
+ */
475
+ ConversationsWidget.prototype.setCurrentTicketResolved = function (resolved) {
476
+ this.setState({ isCurrentTicketResolved: resolved });
477
+ };
470
478
  /**
471
479
  * Set the current view (tickets list or messages)
472
480
  */
@@ -500,7 +508,7 @@ var ConversationsWidget = /** @class */ (function (_super) {
500
508
  prevState.view === 'restore_request' ||
501
509
  prevState.view === 'messages';
502
510
  if (viewNeedsReset) {
503
- nextView = prevState.hasMultipleTickets ? 'tickets' : 'messages';
511
+ nextView = prevState.showTicketList ? 'tickets' : 'messages';
504
512
  update.view = nextView;
505
513
  }
506
514
  return update;
@@ -536,7 +544,7 @@ var ConversationsWidget = /** @class */ (function (_super) {
536
544
  };
537
545
  ConversationsWidget.prototype._renderMessages = function (styles, primaryColor, placeholderText) {
538
546
  var _this = this;
539
- return ((0, jsx_runtime_1.jsx)(MessagesView_1.MessagesView, { styles: styles, primaryColor: primaryColor, placeholderText: placeholderText, messages: this.state.messages, inputValue: this.state.inputValue, isLoading: this.state.isLoading, error: this.state.error, onInputChange: this._handleInputChange, onKeyDown: this._handleKeyPress, onSendMessage: this._handleSendMessage, messagesEndRef: function (el) {
547
+ return ((0, jsx_runtime_1.jsx)(MessagesView_1.MessagesView, { styles: styles, primaryColor: primaryColor, placeholderText: placeholderText, messages: this.state.messages, inputValue: this.state.inputValue, isLoading: this.state.isLoading, error: this.state.error, isResolved: this.state.isCurrentTicketResolved, onInputChange: this._handleInputChange, onKeyDown: this._handleKeyPress, onSendMessage: this._handleSendMessage, onStartNewConversation: this._handleNewConversation, messagesEndRef: function (el) {
540
548
  _this._messagesEndRef = el;
541
549
  }, inputRef: function (el) {
542
550
  _this._inputRef = el;
@@ -588,8 +596,8 @@ var ConversationsWidget = /** @class */ (function (_super) {
588
596
  }
589
597
  // Open state
590
598
  var windowStyle = __assign(__assign({}, styles.window), styles.windowOpen);
591
- // Show back button in message view when there are multiple tickets or in restore request view
592
- var showBackButton = (view === 'messages' && this.state.hasMultipleTickets) || view === 'restore_request';
599
+ // Show back button in message view when the ticket list is available, or in restore request view
600
+ var showBackButton = (view === 'messages' && this.state.showTicketList) || view === 'restore_request';
593
601
  // Show recover footer only in tickets and messages views, and not in identity mode
594
602
  var showRecoverFooter = !this.state.isIdentityMode && (view === 'tickets' || view === 'messages');
595
603
  return ((0, jsx_runtime_1.jsx)("div", { style: styles.widget, children: (0, jsx_runtime_1.jsxs)("div", { style: windowStyle, children: [(0, jsx_runtime_1.jsxs)("div", { style: styles.header, children: [(0, jsx_runtime_1.jsxs)("div", { style: showBackButton ? styles.headerWithBack : styles.headerTitle, children: [showBackButton && this._renderBackButton(styles), (0, jsx_runtime_1.jsx)("span", { style: styles.headerTitle, children: this._getTitle(view) })] }), (0, jsx_runtime_1.jsx)("div", { style: styles.headerActions, children: (0, jsx_runtime_1.jsx)(CloseChatButton_1.CloseChatButton, { primaryColor: primaryColor, handleClose: this._handleClose }) })] }), this._renderViewContent(styles, primaryColor, placeholderText), showRecoverFooter && ((0, jsx_runtime_1.jsxs)("div", { style: styles.recoverFooter, children: ["Don't see your previous tickets?", ' ', (0, jsx_runtime_1.jsx)("button", { type: "button", style: styles.recoverFooterLink, onClick: this._handleOpenRestoreRequest, children: "Recover them here" })] }))] }) }));
@@ -1 +1 @@
1
- {"version":3,"file":"ConversationsWidget.js","sourceRoot":"","sources":["../../../../../../src/extensions/conversations/external/components/ConversationsWidget.tsx"],"names":[],"mappings":"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","sourcesContent":["// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport { h, Component } from 'preact'\nimport {\n ConversationsRemoteConfig,\n Message,\n ConversationsWidgetState,\n RequestRestoreLinkResponse,\n UserProvidedTraits,\n Ticket,\n} from '../../../../posthog-conversations-types'\nimport { createLogger } from '../../../../utils/logger'\nimport { getStyles } from './styles'\nimport { OpenChatButton } from './OpenChatButton'\nimport { CloseChatButton } from './CloseChatButton'\nimport { TicketListView } from './TicketListView'\nimport { IdentificationFormView } from './IdentificationFormView'\nimport { RestoreRequestView } from './RestoreRequestView'\nimport { MessagesView } from './MessagesView'\n\nconst logger = createLogger('[ConversationsWidget]')\n\n/**\n * Type for the current view in the widget\n */\nexport type WidgetView = 'tickets' | 'messages' | 'restore_request' | 'identification'\n\ninterface WidgetProps {\n config: ConversationsRemoteConfig\n initialState?: ConversationsWidgetState\n initialUserTraits?: UserProvidedTraits | null\n isUserIdentified?: boolean\n isIdentityMode?: boolean\n initialView?: WidgetView\n initialTickets?: Ticket[]\n hasMultipleTickets?: boolean\n onSendMessage: (message: string) => Promise<void>\n onStateChange?: (state: ConversationsWidgetState) => void\n onIdentify?: (traits: UserProvidedTraits) => void\n onRequestRestoreLink?: (email: string) => Promise<RequestRestoreLinkResponse>\n onSelectTicket?: (ticketId: string) => void\n onNewConversation?: () => void\n onBackToTickets?: () => void\n onViewChange?: (view: WidgetView) => void\n}\n\ninterface WidgetState {\n state: ConversationsWidgetState\n view: WidgetView\n messages: Message[]\n tickets: Ticket[]\n ticketsLoading: boolean\n inputValue: string\n isLoading: boolean\n error: string | null\n formName: string\n formEmail: string\n formEmailError: string | null\n userTraits: UserProvidedTraits | null\n unreadCount: number\n hasMultipleTickets: boolean\n isIdentityMode: boolean\n restoreEmail: string\n restoreEmailError: string | null\n restoreRequestLoading: boolean\n restoreRequestSuccess: boolean\n}\n\nexport class ConversationsWidget extends Component<WidgetProps, WidgetState> {\n private _messagesEndRef: HTMLDivElement | null = null\n private _inputRef: HTMLTextAreaElement | null = null\n\n constructor(props: WidgetProps) {\n super(props)\n\n const isIdentityMode = props.isIdentityMode || false\n\n // Determine if we need to show the identification form\n const userTraits = props.initialUserTraits || null\n const needsIdentification = this._needsIdentification(\n props.config,\n userTraits,\n props.isUserIdentified,\n isIdentityMode\n )\n\n // If identification is needed, start with that view; otherwise use the provided initial view\n const initialView = needsIdentification ? 'identification' : props.initialView || 'messages'\n\n this.state = {\n state: props.initialState || 'closed',\n view: initialView,\n messages: [],\n tickets: props.initialTickets || [],\n ticketsLoading: false,\n inputValue: '',\n isLoading: false,\n error: null,\n formName: userTraits?.name || '',\n formEmail: userTraits?.email || '',\n formEmailError: null,\n userTraits,\n unreadCount: 0,\n hasMultipleTickets: props.hasMultipleTickets || false,\n isIdentityMode,\n restoreEmail: userTraits?.email || '',\n restoreEmailError: null,\n restoreRequestLoading: false,\n restoreRequestSuccess: false,\n }\n }\n\n /**\n * Check if we need to show the identification form\n */\n private _needsIdentification(\n config: ConversationsRemoteConfig,\n traits: UserProvidedTraits | null,\n isUserIdentified?: boolean,\n isIdentityMode?: boolean\n ): boolean {\n // Server-verified identity mode -- identity is already established\n if (isIdentityMode) {\n return false\n }\n\n // If user is already identified via PostHog, no form needed\n // They've called posthog.identify() so we have their identity\n if (isUserIdentified) {\n return false\n }\n\n // If requireEmail is not set, no identification needed\n if (!config.requireEmail) {\n return false\n }\n\n // If we already have an email, no form needed\n if (traits?.email) {\n return false\n }\n\n return true\n }\n\n componentDidMount() {\n // Add greeting message if no messages exist and we're in message view\n if (this.state.view === 'messages' && this.state.messages.length === 0 && this.props.config.greetingText) {\n this._addGreetingMessage()\n }\n }\n\n componentDidUpdate(_prevProps: WidgetProps, prevState: WidgetState) {\n // Scroll to bottom when messages change\n if (this.state.messages.length !== prevState.messages.length) {\n this._scrollToBottom()\n }\n\n // Notify parent of state changes\n if (this.state.state !== prevState.state && this.props.onStateChange) {\n this.props.onStateChange(this.state.state)\n }\n\n // Focus input and scroll to bottom when opening\n if (this.state.state === 'open' && prevState.state !== 'open') {\n this._focusInput()\n this._scrollToBottom()\n }\n }\n\n private _addGreetingMessage() {\n const greetingMessage: Message = {\n id: 'greeting',\n content: this.props.config.greetingText || 'Hi! How can we help?',\n author_type: 'AI',\n author_name: 'Support',\n created_at: new Date().toISOString(),\n is_private: false,\n }\n this.setState({ messages: [greetingMessage] })\n }\n\n private _scrollToBottom() {\n if (this._messagesEndRef) {\n this._messagesEndRef.scrollIntoView({ behavior: 'smooth' })\n }\n }\n\n private _focusInput() {\n if (this._inputRef) {\n this._inputRef.focus()\n }\n }\n\n private _handleToggleOpen = () => {\n this.setState((prevState) => ({\n state: prevState.state === 'open' ? 'closed' : 'open',\n }))\n }\n\n private _handleClose = () => {\n this.setState({ state: 'closed' })\n }\n\n private _handleSelectTicket = (ticketId: string) => {\n if (this.props.onSelectTicket) {\n this.props.onSelectTicket(ticketId)\n }\n }\n\n private _handleNewConversation = () => {\n if (this.props.onNewConversation) {\n this.props.onNewConversation()\n }\n }\n\n private _handleBackToTickets = () => {\n if (this.props.onBackToTickets) {\n this.props.onBackToTickets()\n }\n }\n\n private _handleOpenRestoreRequest = () => {\n this.setState((prevState) => ({\n view: 'restore_request',\n restoreEmail: prevState.restoreEmail || prevState.userTraits?.email || '',\n restoreEmailError: null,\n restoreRequestSuccess: false,\n }))\n if (this.props.onViewChange) {\n this.props.onViewChange('restore_request')\n }\n }\n\n private _handleCloseRestoreRequest = () => {\n const returnView = this.state.hasMultipleTickets ? 'tickets' : 'messages'\n this.setState({ view: returnView, restoreEmailError: null, restoreRequestSuccess: false })\n if (this.props.onViewChange) {\n this.props.onViewChange(returnView)\n }\n }\n\n private _handleInputChange = (e: Event) => {\n const target = e.target as HTMLTextAreaElement\n this.setState({ inputValue: target.value })\n }\n\n private _handleKeyPress = (e: KeyboardEvent) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n this._handleSendMessage()\n }\n }\n\n // Identification form handlers\n private _handleFormNameChange = (e: Event) => {\n const target = e.target as HTMLInputElement\n this.setState({ formName: target.value })\n }\n\n private _handleFormEmailChange = (e: Event) => {\n const target = e.target as HTMLInputElement\n this.setState({ formEmail: target.value, formEmailError: null })\n }\n\n private _handleRestoreEmailChange = (e: Event) => {\n const target = e.target as HTMLInputElement\n this.setState({\n restoreEmail: target.value,\n restoreEmailError: null,\n restoreRequestSuccess: false,\n })\n }\n\n private _validateEmail(email: string): boolean {\n // Basic email validation\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n return emailRegex.test(email)\n }\n\n private _handleFormSubmit = (e: Event) => {\n e.preventDefault()\n\n const { formEmail, formName } = this.state\n const { config, onIdentify } = this.props\n\n // Validate email if required\n if (config.requireEmail && !formEmail.trim()) {\n this.setState({ formEmailError: 'Email is required' })\n return\n }\n\n if (formEmail.trim() && !this._validateEmail(formEmail.trim())) {\n this.setState({ formEmailError: 'Please enter a valid email address' })\n return\n }\n\n // Create traits object\n const traits: UserProvidedTraits = {}\n if (formName.trim()) {\n traits.name = formName.trim()\n }\n if (formEmail.trim()) {\n traits.email = formEmail.trim()\n }\n\n // Navigate to appropriate view after identification\n const nextView = this.state.hasMultipleTickets ? 'tickets' : 'messages'\n\n // Update state and notify parent\n this.setState({\n userTraits: traits,\n view: nextView,\n })\n\n if (onIdentify) {\n onIdentify(traits)\n }\n\n if (this.props.onViewChange) {\n this.props.onViewChange(nextView)\n }\n }\n\n private _handleRestoreRequestSubmit = async (e: Event) => {\n e.preventDefault()\n\n if (!this.props.onRequestRestoreLink) {\n return\n }\n\n const email = this.state.restoreEmail.trim()\n if (!email) {\n this.setState({ restoreEmailError: 'Email is required' })\n return\n }\n\n if (!this._validateEmail(email)) {\n this.setState({ restoreEmailError: 'Please enter a valid email address' })\n return\n }\n\n this.setState({\n restoreRequestLoading: true,\n restoreEmailError: null,\n })\n\n try {\n await this.props.onRequestRestoreLink(email)\n this.setState({\n restoreRequestLoading: false,\n restoreRequestSuccess: true,\n })\n } catch (error) {\n logger.error('Failed to request restore link', error)\n this.setState({\n restoreRequestLoading: false,\n restoreEmailError: error instanceof Error ? error.message : 'Failed to request restore link',\n })\n }\n }\n\n private _handleSendMessage = async () => {\n const { inputValue } = this.state\n const trimmedMessage = inputValue.trim()\n\n if (!trimmedMessage) {\n return\n }\n\n // Add user message to UI immediately\n const userMessage: Message = {\n id: `temp-${Date.now()}`,\n content: trimmedMessage,\n author_type: 'customer',\n author_name: 'You',\n created_at: new Date().toISOString(),\n is_private: false,\n }\n\n this.setState({\n messages: [...this.state.messages, userMessage],\n inputValue: '',\n isLoading: true,\n error: null,\n })\n\n try {\n await this.props.onSendMessage(trimmedMessage)\n // Success - message will be updated via addMessage()\n this.setState({ isLoading: false })\n } catch (error) {\n logger.error('Failed to send message', error)\n this.setState((prevState) => ({\n isLoading: false,\n error: error instanceof Error ? error.message : 'Failed to send message',\n messages: prevState.messages.filter((m) => m.id !== userMessage.id),\n }))\n }\n }\n\n /**\n * Public method to add messages from outside\n */\n addMessages(messages: Message[]) {\n this.setState((prevState) => {\n // Filter out duplicates\n const existingIds = new Set(prevState.messages.map((m) => m.id))\n const newMessages = messages.filter((m) => !existingIds.has(m.id))\n\n if (newMessages.length > 0) {\n return {\n messages: [...prevState.messages, ...newMessages],\n }\n }\n return null\n })\n }\n\n /**\n * Public method to show the widget\n */\n show() {\n this.setState({ state: 'open' })\n }\n\n /**\n * Public method to hide the widget\n */\n hide() {\n this.setState({ state: 'closed' })\n }\n\n /**\n * Get user traits (either provided via form or from props)\n */\n getUserTraits(): UserProvidedTraits | null {\n return this.state.userTraits\n }\n\n /**\n * Called when user identifies via posthog.identify()\n * Navigates away from identification form since we now know who they are\n */\n setUserIdentified(): void {\n if (this.state.view === 'identification') {\n const nextView = this.state.hasMultipleTickets ? 'tickets' : 'messages'\n this.setState({ view: nextView })\n if (this.props.onViewChange) {\n this.props.onViewChange(nextView)\n }\n }\n }\n\n /**\n * Set the unread message count (called by manager)\n */\n setUnreadCount(count: number): void {\n this.setState({ unreadCount: count })\n }\n\n /**\n * Update the tickets list (called by manager during polling)\n */\n updateTickets(tickets: Ticket[]): void {\n this.setState({\n tickets,\n ticketsLoading: false,\n hasMultipleTickets: tickets.length > 1,\n })\n }\n\n /**\n * Set the current view (tickets list or messages)\n */\n setView(view: WidgetView): void {\n this.setState({ view })\n if (this.props.onViewChange) {\n this.props.onViewChange(view)\n }\n }\n\n /**\n * Get the current view\n */\n getView(): WidgetView {\n return this.state.view\n }\n\n /**\n * Set tickets loading state\n */\n setTicketsLoading(loading: boolean): void {\n this.setState({ ticketsLoading: loading })\n }\n\n /**\n * Update identity mode state (called by manager on setIdentity/clearIdentity)\n */\n setIdentityMode(isIdentityMode: boolean): void {\n let nextView: WidgetView | undefined\n this.setState(\n (prevState) => {\n const update: Partial<WidgetState> = { isIdentityMode }\n const viewNeedsReset =\n prevState.view === 'identification' ||\n prevState.view === 'restore_request' ||\n prevState.view === 'messages'\n if (viewNeedsReset) {\n nextView = prevState.hasMultipleTickets ? 'tickets' : 'messages'\n update.view = nextView\n }\n return update as WidgetState\n },\n () => {\n if (nextView && this.props.onViewChange) {\n this.props.onViewChange(nextView)\n }\n }\n )\n }\n\n /**\n * Clear messages (used when switching tickets or starting new conversation)\n * @param addGreeting - If true, adds the greeting message after clearing\n */\n clearMessages(addGreeting: boolean = false): void {\n this.setState({ messages: [] }, () => {\n if (addGreeting && this.props.config.greetingText) {\n this._addGreetingMessage()\n }\n })\n }\n\n private _renderIdentificationForm(styles: ReturnType<typeof getStyles>) {\n return (\n <IdentificationFormView\n config={this.props.config}\n styles={styles}\n formName={this.state.formName}\n formEmail={this.state.formEmail}\n formEmailError={this.state.formEmailError}\n onNameChange={this._handleFormNameChange}\n onEmailChange={this._handleFormEmailChange}\n onSubmit={this._handleFormSubmit}\n />\n )\n }\n\n private _renderBackButton(styles: ReturnType<typeof getStyles>) {\n const onClick =\n this.state.view === 'restore_request' ? this._handleCloseRestoreRequest : this._handleBackToTickets\n return (\n <button style={styles.backButton} onClick={onClick} aria-label=\"Back to conversations\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <polyline points=\"15 18 9 12 15 6\" />\n </svg>\n </button>\n )\n }\n\n private _renderTicketList(styles: ReturnType<typeof getStyles>) {\n const { tickets, ticketsLoading } = this.state\n\n return (\n <TicketListView\n tickets={tickets}\n isLoading={ticketsLoading}\n styles={styles}\n onSelectTicket={this._handleSelectTicket}\n onNewConversation={this._handleNewConversation}\n onOpenRestoreRequest={this._handleOpenRestoreRequest}\n />\n )\n }\n\n private _renderMessages(styles: ReturnType<typeof getStyles>, primaryColor: string, placeholderText: string) {\n return (\n <MessagesView\n styles={styles}\n primaryColor={primaryColor}\n placeholderText={placeholderText}\n messages={this.state.messages}\n inputValue={this.state.inputValue}\n isLoading={this.state.isLoading}\n error={this.state.error}\n onInputChange={this._handleInputChange}\n onKeyDown={this._handleKeyPress}\n onSendMessage={this._handleSendMessage}\n messagesEndRef={(el) => {\n this._messagesEndRef = el\n }}\n inputRef={(el) => {\n this._inputRef = el\n }}\n />\n )\n }\n\n private _renderRestoreRequestView(styles: ReturnType<typeof getStyles>) {\n return (\n <RestoreRequestView\n styles={styles}\n restoreEmail={this.state.restoreEmail}\n restoreEmailError={this.state.restoreEmailError}\n restoreRequestLoading={this.state.restoreRequestLoading}\n restoreRequestSuccess={this.state.restoreRequestSuccess}\n onEmailChange={this._handleRestoreEmailChange}\n onSubmit={this._handleRestoreRequestSubmit}\n />\n )\n }\n\n /**\n * Get the title for the current view\n */\n private _getTitle(view: WidgetView): string {\n switch (view) {\n case 'tickets':\n return 'Conversations'\n case 'restore_request':\n return 'Restore conversations'\n case 'identification':\n return 'Support Chat'\n case 'messages':\n return 'Support Chat'\n }\n }\n\n /**\n * Render the content for the current view\n */\n private _renderViewContent(\n styles: ReturnType<typeof getStyles>,\n primaryColor: string,\n placeholderText: string\n ): h.JSX.Element {\n switch (this.state.view) {\n case 'identification':\n return this._renderIdentificationForm(styles)\n case 'restore_request':\n return this._renderRestoreRequestView(styles)\n case 'tickets':\n return this._renderTicketList(styles)\n case 'messages':\n return this._renderMessages(styles, primaryColor, placeholderText)\n }\n }\n\n render() {\n const { config } = this.props\n const { state, view } = this.state\n const primaryColor = config.color || '#5375ff'\n const widgetPosition = config.widgetPosition || 'bottom_right'\n const placeholderText = config.placeholderText || 'Type your message...'\n const styles = getStyles(primaryColor, widgetPosition)\n\n // Button only (closed state)\n if (state === 'closed') {\n return (\n <OpenChatButton\n primaryColor={primaryColor}\n position={widgetPosition}\n handleToggleOpen={this._handleToggleOpen}\n unreadCount={this.state.unreadCount}\n />\n )\n }\n\n // Open state\n const windowStyle = {\n ...styles.window,\n ...styles.windowOpen,\n }\n\n // Show back button in message view when there are multiple tickets or in restore request view\n const showBackButton = (view === 'messages' && this.state.hasMultipleTickets) || view === 'restore_request'\n\n // Show recover footer only in tickets and messages views, and not in identity mode\n const showRecoverFooter = !this.state.isIdentityMode && (view === 'tickets' || view === 'messages')\n\n return (\n <div style={styles.widget}>\n <div style={windowStyle}>\n <div style={styles.header}>\n <div style={showBackButton ? styles.headerWithBack : styles.headerTitle}>\n {showBackButton && this._renderBackButton(styles)}\n <span style={styles.headerTitle}>{this._getTitle(view)}</span>\n </div>\n <div style={styles.headerActions}>\n <CloseChatButton primaryColor={primaryColor} handleClose={this._handleClose} />\n </div>\n </div>\n\n {this._renderViewContent(styles, primaryColor, placeholderText)}\n\n {showRecoverFooter && (\n <div style={styles.recoverFooter}>\n Don't see your previous tickets?{' '}\n <button\n type=\"button\"\n style={styles.recoverFooterLink}\n onClick={this._handleOpenRestoreRequest}\n >\n Recover them here\n </button>\n </div>\n )}\n </div>\n </div>\n )\n }\n}\n"]}
1
+ {"version":3,"file":"ConversationsWidget.js","sourceRoot":"","sources":["../../../../../../src/extensions/conversations/external/components/ConversationsWidget.tsx"],"names":[],"mappings":"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","sourcesContent":["// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport { h, Component } from 'preact'\nimport {\n ConversationsRemoteConfig,\n Message,\n ConversationsWidgetState,\n RequestRestoreLinkResponse,\n UserProvidedTraits,\n Ticket,\n} from '../../../../posthog-conversations-types'\nimport { createLogger } from '../../../../utils/logger'\nimport { getStyles } from './styles'\nimport { OpenChatButton } from './OpenChatButton'\nimport { CloseChatButton } from './CloseChatButton'\nimport { TicketListView } from './TicketListView'\nimport { IdentificationFormView } from './IdentificationFormView'\nimport { RestoreRequestView } from './RestoreRequestView'\nimport { MessagesView } from './MessagesView'\n\nconst logger = createLogger('[ConversationsWidget]')\n\n/**\n * Type for the current view in the widget\n */\nexport type WidgetView = 'tickets' | 'messages' | 'restore_request' | 'identification'\n\ninterface WidgetProps {\n config: ConversationsRemoteConfig\n initialState?: ConversationsWidgetState\n initialUserTraits?: UserProvidedTraits | null\n isUserIdentified?: boolean\n isIdentityMode?: boolean\n initialView?: WidgetView\n initialTickets?: Ticket[]\n showTicketList?: boolean\n onSendMessage: (message: string) => Promise<void>\n onStateChange?: (state: ConversationsWidgetState) => void\n onIdentify?: (traits: UserProvidedTraits) => void\n onRequestRestoreLink?: (email: string) => Promise<RequestRestoreLinkResponse>\n onSelectTicket?: (ticketId: string) => void\n onNewConversation?: () => void\n onBackToTickets?: () => void\n onViewChange?: (view: WidgetView) => void\n}\n\ninterface WidgetState {\n state: ConversationsWidgetState\n view: WidgetView\n messages: Message[]\n tickets: Ticket[]\n ticketsLoading: boolean\n inputValue: string\n isLoading: boolean\n error: string | null\n formName: string\n formEmail: string\n formEmailError: string | null\n userTraits: UserProvidedTraits | null\n unreadCount: number\n showTicketList: boolean\n isCurrentTicketResolved: boolean\n isIdentityMode: boolean\n restoreEmail: string\n restoreEmailError: string | null\n restoreRequestLoading: boolean\n restoreRequestSuccess: boolean\n}\n\nexport class ConversationsWidget extends Component<WidgetProps, WidgetState> {\n private _messagesEndRef: HTMLDivElement | null = null\n private _inputRef: HTMLTextAreaElement | null = null\n\n constructor(props: WidgetProps) {\n super(props)\n\n const isIdentityMode = props.isIdentityMode || false\n\n // Determine if we need to show the identification form\n const userTraits = props.initialUserTraits || null\n const needsIdentification = this._needsIdentification(\n props.config,\n userTraits,\n props.isUserIdentified,\n isIdentityMode\n )\n\n // If identification is needed, start with that view; otherwise use the provided initial view\n const initialView = needsIdentification ? 'identification' : props.initialView || 'messages'\n\n this.state = {\n state: props.initialState || 'closed',\n view: initialView,\n messages: [],\n tickets: props.initialTickets || [],\n ticketsLoading: false,\n inputValue: '',\n isLoading: false,\n error: null,\n formName: userTraits?.name || '',\n formEmail: userTraits?.email || '',\n formEmailError: null,\n userTraits,\n unreadCount: 0,\n showTicketList: props.showTicketList || false,\n isCurrentTicketResolved: false,\n isIdentityMode,\n restoreEmail: userTraits?.email || '',\n restoreEmailError: null,\n restoreRequestLoading: false,\n restoreRequestSuccess: false,\n }\n }\n\n /**\n * Check if we need to show the identification form\n */\n private _needsIdentification(\n config: ConversationsRemoteConfig,\n traits: UserProvidedTraits | null,\n isUserIdentified?: boolean,\n isIdentityMode?: boolean\n ): boolean {\n // Server-verified identity mode -- identity is already established\n if (isIdentityMode) {\n return false\n }\n\n // If user is already identified via PostHog, no form needed\n // They've called posthog.identify() so we have their identity\n if (isUserIdentified) {\n return false\n }\n\n // If requireEmail is not set, no identification needed\n if (!config.requireEmail) {\n return false\n }\n\n // If we already have an email, no form needed\n if (traits?.email) {\n return false\n }\n\n return true\n }\n\n componentDidMount() {\n // Add greeting message if no messages exist and we're in message view\n if (this.state.view === 'messages' && this.state.messages.length === 0 && this.props.config.greetingText) {\n this._addGreetingMessage()\n }\n }\n\n componentDidUpdate(_prevProps: WidgetProps, prevState: WidgetState) {\n // Scroll to bottom when messages change\n if (this.state.messages.length !== prevState.messages.length) {\n this._scrollToBottom()\n }\n\n // Notify parent of state changes\n if (this.state.state !== prevState.state && this.props.onStateChange) {\n this.props.onStateChange(this.state.state)\n }\n\n // Focus input and scroll to bottom when opening\n if (this.state.state === 'open' && prevState.state !== 'open') {\n this._focusInput()\n this._scrollToBottom()\n }\n }\n\n private _addGreetingMessage() {\n const greetingMessage: Message = {\n id: 'greeting',\n content: this.props.config.greetingText || 'Hi! How can we help?',\n author_type: 'AI',\n author_name: 'Support',\n created_at: new Date().toISOString(),\n is_private: false,\n }\n this.setState({ messages: [greetingMessage] })\n }\n\n private _scrollToBottom() {\n if (this._messagesEndRef) {\n this._messagesEndRef.scrollIntoView({ behavior: 'smooth' })\n }\n }\n\n private _focusInput() {\n if (this._inputRef) {\n this._inputRef.focus()\n }\n }\n\n private _handleToggleOpen = () => {\n this.setState((prevState) => ({\n state: prevState.state === 'open' ? 'closed' : 'open',\n }))\n }\n\n private _handleClose = () => {\n this.setState({ state: 'closed' })\n }\n\n private _handleSelectTicket = (ticketId: string) => {\n if (this.props.onSelectTicket) {\n this.props.onSelectTicket(ticketId)\n }\n }\n\n private _handleNewConversation = () => {\n if (this.props.onNewConversation) {\n this.props.onNewConversation()\n }\n }\n\n private _handleBackToTickets = () => {\n if (this.props.onBackToTickets) {\n this.props.onBackToTickets()\n }\n }\n\n private _handleOpenRestoreRequest = () => {\n this.setState((prevState) => ({\n view: 'restore_request',\n restoreEmail: prevState.restoreEmail || prevState.userTraits?.email || '',\n restoreEmailError: null,\n restoreRequestSuccess: false,\n }))\n if (this.props.onViewChange) {\n this.props.onViewChange('restore_request')\n }\n }\n\n private _handleCloseRestoreRequest = () => {\n const returnView = this.state.showTicketList ? 'tickets' : 'messages'\n this.setState({ view: returnView, restoreEmailError: null, restoreRequestSuccess: false })\n if (this.props.onViewChange) {\n this.props.onViewChange(returnView)\n }\n }\n\n private _handleInputChange = (e: Event) => {\n const target = e.target as HTMLTextAreaElement\n this.setState({ inputValue: target.value })\n }\n\n private _handleKeyPress = (e: KeyboardEvent) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n this._handleSendMessage()\n }\n }\n\n // Identification form handlers\n private _handleFormNameChange = (e: Event) => {\n const target = e.target as HTMLInputElement\n this.setState({ formName: target.value })\n }\n\n private _handleFormEmailChange = (e: Event) => {\n const target = e.target as HTMLInputElement\n this.setState({ formEmail: target.value, formEmailError: null })\n }\n\n private _handleRestoreEmailChange = (e: Event) => {\n const target = e.target as HTMLInputElement\n this.setState({\n restoreEmail: target.value,\n restoreEmailError: null,\n restoreRequestSuccess: false,\n })\n }\n\n private _validateEmail(email: string): boolean {\n // Basic email validation\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n return emailRegex.test(email)\n }\n\n private _handleFormSubmit = (e: Event) => {\n e.preventDefault()\n\n const { formEmail, formName } = this.state\n const { config, onIdentify } = this.props\n\n // Validate email if required\n if (config.requireEmail && !formEmail.trim()) {\n this.setState({ formEmailError: 'Email is required' })\n return\n }\n\n if (formEmail.trim() && !this._validateEmail(formEmail.trim())) {\n this.setState({ formEmailError: 'Please enter a valid email address' })\n return\n }\n\n // Create traits object\n const traits: UserProvidedTraits = {}\n if (formName.trim()) {\n traits.name = formName.trim()\n }\n if (formEmail.trim()) {\n traits.email = formEmail.trim()\n }\n\n // Navigate to appropriate view after identification\n const nextView = this.state.showTicketList ? 'tickets' : 'messages'\n\n // Update state and notify parent\n this.setState({\n userTraits: traits,\n view: nextView,\n })\n\n if (onIdentify) {\n onIdentify(traits)\n }\n\n if (this.props.onViewChange) {\n this.props.onViewChange(nextView)\n }\n }\n\n private _handleRestoreRequestSubmit = async (e: Event) => {\n e.preventDefault()\n\n if (!this.props.onRequestRestoreLink) {\n return\n }\n\n const email = this.state.restoreEmail.trim()\n if (!email) {\n this.setState({ restoreEmailError: 'Email is required' })\n return\n }\n\n if (!this._validateEmail(email)) {\n this.setState({ restoreEmailError: 'Please enter a valid email address' })\n return\n }\n\n this.setState({\n restoreRequestLoading: true,\n restoreEmailError: null,\n })\n\n try {\n await this.props.onRequestRestoreLink(email)\n this.setState({\n restoreRequestLoading: false,\n restoreRequestSuccess: true,\n })\n } catch (error) {\n logger.error('Failed to request restore link', error)\n this.setState({\n restoreRequestLoading: false,\n restoreEmailError: error instanceof Error ? error.message : 'Failed to request restore link',\n })\n }\n }\n\n private _handleSendMessage = async () => {\n const { inputValue } = this.state\n const trimmedMessage = inputValue.trim()\n\n if (!trimmedMessage) {\n return\n }\n\n // Add user message to UI immediately\n const userMessage: Message = {\n id: `temp-${Date.now()}`,\n content: trimmedMessage,\n author_type: 'customer',\n author_name: 'You',\n created_at: new Date().toISOString(),\n is_private: false,\n }\n\n this.setState({\n messages: [...this.state.messages, userMessage],\n inputValue: '',\n isLoading: true,\n error: null,\n })\n\n try {\n await this.props.onSendMessage(trimmedMessage)\n // Success - message will be updated via addMessage()\n this.setState({ isLoading: false })\n } catch (error) {\n logger.error('Failed to send message', error)\n this.setState((prevState) => ({\n isLoading: false,\n error: error instanceof Error ? error.message : 'Failed to send message',\n messages: prevState.messages.filter((m) => m.id !== userMessage.id),\n }))\n }\n }\n\n /**\n * Public method to add messages from outside\n */\n addMessages(messages: Message[]) {\n this.setState((prevState) => {\n // Filter out duplicates\n const existingIds = new Set(prevState.messages.map((m) => m.id))\n const newMessages = messages.filter((m) => !existingIds.has(m.id))\n\n if (newMessages.length > 0) {\n return {\n messages: [...prevState.messages, ...newMessages],\n }\n }\n return null\n })\n }\n\n /**\n * Public method to show the widget\n */\n show() {\n this.setState({ state: 'open' })\n }\n\n /**\n * Public method to hide the widget\n */\n hide() {\n this.setState({ state: 'closed' })\n }\n\n /**\n * Get user traits (either provided via form or from props)\n */\n getUserTraits(): UserProvidedTraits | null {\n return this.state.userTraits\n }\n\n /**\n * Called when user identifies via posthog.identify()\n * Navigates away from identification form since we now know who they are\n */\n setUserIdentified(): void {\n if (this.state.view === 'identification') {\n const nextView = this.state.showTicketList ? 'tickets' : 'messages'\n this.setState({ view: nextView })\n if (this.props.onViewChange) {\n this.props.onViewChange(nextView)\n }\n }\n }\n\n /**\n * Set the unread message count (called by manager)\n */\n setUnreadCount(count: number): void {\n this.setState({ unreadCount: count })\n }\n\n /**\n * Update the tickets list (called by manager during polling)\n */\n updateTickets(tickets: Ticket[], showTicketList: boolean): void {\n this.setState({\n tickets,\n ticketsLoading: false,\n showTicketList,\n })\n }\n\n /**\n * Set whether the current ticket (if any) is in the resolved state.\n * Called by the manager whenever the current ticket or tickets list changes.\n */\n setCurrentTicketResolved(resolved: boolean): void {\n this.setState({ isCurrentTicketResolved: resolved })\n }\n\n /**\n * Set the current view (tickets list or messages)\n */\n setView(view: WidgetView): void {\n this.setState({ view })\n if (this.props.onViewChange) {\n this.props.onViewChange(view)\n }\n }\n\n /**\n * Get the current view\n */\n getView(): WidgetView {\n return this.state.view\n }\n\n /**\n * Set tickets loading state\n */\n setTicketsLoading(loading: boolean): void {\n this.setState({ ticketsLoading: loading })\n }\n\n /**\n * Update identity mode state (called by manager on setIdentity/clearIdentity)\n */\n setIdentityMode(isIdentityMode: boolean): void {\n let nextView: WidgetView | undefined\n this.setState(\n (prevState) => {\n const update: Partial<WidgetState> = { isIdentityMode }\n const viewNeedsReset =\n prevState.view === 'identification' ||\n prevState.view === 'restore_request' ||\n prevState.view === 'messages'\n if (viewNeedsReset) {\n nextView = prevState.showTicketList ? 'tickets' : 'messages'\n update.view = nextView\n }\n return update as WidgetState\n },\n () => {\n if (nextView && this.props.onViewChange) {\n this.props.onViewChange(nextView)\n }\n }\n )\n }\n\n /**\n * Clear messages (used when switching tickets or starting new conversation)\n * @param addGreeting - If true, adds the greeting message after clearing\n */\n clearMessages(addGreeting: boolean = false): void {\n this.setState({ messages: [] }, () => {\n if (addGreeting && this.props.config.greetingText) {\n this._addGreetingMessage()\n }\n })\n }\n\n private _renderIdentificationForm(styles: ReturnType<typeof getStyles>) {\n return (\n <IdentificationFormView\n config={this.props.config}\n styles={styles}\n formName={this.state.formName}\n formEmail={this.state.formEmail}\n formEmailError={this.state.formEmailError}\n onNameChange={this._handleFormNameChange}\n onEmailChange={this._handleFormEmailChange}\n onSubmit={this._handleFormSubmit}\n />\n )\n }\n\n private _renderBackButton(styles: ReturnType<typeof getStyles>) {\n const onClick =\n this.state.view === 'restore_request' ? this._handleCloseRestoreRequest : this._handleBackToTickets\n return (\n <button style={styles.backButton} onClick={onClick} aria-label=\"Back to conversations\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <polyline points=\"15 18 9 12 15 6\" />\n </svg>\n </button>\n )\n }\n\n private _renderTicketList(styles: ReturnType<typeof getStyles>) {\n const { tickets, ticketsLoading } = this.state\n\n return (\n <TicketListView\n tickets={tickets}\n isLoading={ticketsLoading}\n styles={styles}\n onSelectTicket={this._handleSelectTicket}\n onNewConversation={this._handleNewConversation}\n onOpenRestoreRequest={this._handleOpenRestoreRequest}\n />\n )\n }\n\n private _renderMessages(styles: ReturnType<typeof getStyles>, primaryColor: string, placeholderText: string) {\n return (\n <MessagesView\n styles={styles}\n primaryColor={primaryColor}\n placeholderText={placeholderText}\n messages={this.state.messages}\n inputValue={this.state.inputValue}\n isLoading={this.state.isLoading}\n error={this.state.error}\n isResolved={this.state.isCurrentTicketResolved}\n onInputChange={this._handleInputChange}\n onKeyDown={this._handleKeyPress}\n onSendMessage={this._handleSendMessage}\n onStartNewConversation={this._handleNewConversation}\n messagesEndRef={(el) => {\n this._messagesEndRef = el\n }}\n inputRef={(el) => {\n this._inputRef = el\n }}\n />\n )\n }\n\n private _renderRestoreRequestView(styles: ReturnType<typeof getStyles>) {\n return (\n <RestoreRequestView\n styles={styles}\n restoreEmail={this.state.restoreEmail}\n restoreEmailError={this.state.restoreEmailError}\n restoreRequestLoading={this.state.restoreRequestLoading}\n restoreRequestSuccess={this.state.restoreRequestSuccess}\n onEmailChange={this._handleRestoreEmailChange}\n onSubmit={this._handleRestoreRequestSubmit}\n />\n )\n }\n\n /**\n * Get the title for the current view\n */\n private _getTitle(view: WidgetView): string {\n switch (view) {\n case 'tickets':\n return 'Conversations'\n case 'restore_request':\n return 'Restore conversations'\n case 'identification':\n return 'Support Chat'\n case 'messages':\n return 'Support Chat'\n }\n }\n\n /**\n * Render the content for the current view\n */\n private _renderViewContent(\n styles: ReturnType<typeof getStyles>,\n primaryColor: string,\n placeholderText: string\n ): h.JSX.Element {\n switch (this.state.view) {\n case 'identification':\n return this._renderIdentificationForm(styles)\n case 'restore_request':\n return this._renderRestoreRequestView(styles)\n case 'tickets':\n return this._renderTicketList(styles)\n case 'messages':\n return this._renderMessages(styles, primaryColor, placeholderText)\n }\n }\n\n render() {\n const { config } = this.props\n const { state, view } = this.state\n const primaryColor = config.color || '#5375ff'\n const widgetPosition = config.widgetPosition || 'bottom_right'\n const placeholderText = config.placeholderText || 'Type your message...'\n const styles = getStyles(primaryColor, widgetPosition)\n\n // Button only (closed state)\n if (state === 'closed') {\n return (\n <OpenChatButton\n primaryColor={primaryColor}\n position={widgetPosition}\n handleToggleOpen={this._handleToggleOpen}\n unreadCount={this.state.unreadCount}\n />\n )\n }\n\n // Open state\n const windowStyle = {\n ...styles.window,\n ...styles.windowOpen,\n }\n\n // Show back button in message view when the ticket list is available, or in restore request view\n const showBackButton = (view === 'messages' && this.state.showTicketList) || view === 'restore_request'\n\n // Show recover footer only in tickets and messages views, and not in identity mode\n const showRecoverFooter = !this.state.isIdentityMode && (view === 'tickets' || view === 'messages')\n\n return (\n <div style={styles.widget}>\n <div style={windowStyle}>\n <div style={styles.header}>\n <div style={showBackButton ? styles.headerWithBack : styles.headerTitle}>\n {showBackButton && this._renderBackButton(styles)}\n <span style={styles.headerTitle}>{this._getTitle(view)}</span>\n </div>\n <div style={styles.headerActions}>\n <CloseChatButton primaryColor={primaryColor} handleClose={this._handleClose} />\n </div>\n </div>\n\n {this._renderViewContent(styles, primaryColor, placeholderText)}\n\n {showRecoverFooter && (\n <div style={styles.recoverFooter}>\n Don't see your previous tickets?{' '}\n <button\n type=\"button\"\n style={styles.recoverFooterLink}\n onClick={this._handleOpenRestoreRequest}\n >\n Recover them here\n </button>\n </div>\n )}\n </div>\n </div>\n )\n }\n}\n"]}
@@ -9,11 +9,13 @@ interface MessagesViewProps {
9
9
  inputValue: string;
10
10
  isLoading: boolean;
11
11
  error: string | null;
12
+ isResolved: boolean;
12
13
  onInputChange: (e: Event) => void;
13
14
  onKeyDown: (e: KeyboardEvent) => void;
14
15
  onSendMessage: () => void;
16
+ onStartNewConversation: () => void;
15
17
  messagesEndRef: (el: HTMLDivElement | null) => void;
16
18
  inputRef: (el: HTMLTextAreaElement | null) => void;
17
19
  }
18
- export declare function MessagesView({ styles, primaryColor, placeholderText, messages, inputValue, isLoading, error, onInputChange, onKeyDown, onSendMessage, messagesEndRef, inputRef, }: MessagesViewProps): h.JSX.Element;
20
+ export declare function MessagesView({ styles, primaryColor, placeholderText, messages, inputValue, isLoading, error, isResolved, onInputChange, onKeyDown, onSendMessage, onStartNewConversation, messagesEndRef, inputRef, }: MessagesViewProps): h.JSX.Element;
19
21
  export {};
@@ -15,6 +15,7 @@ exports.MessagesView = MessagesView;
15
15
  var jsx_runtime_1 = require("preact/jsx-runtime");
16
16
  var SendMessageButton_1 = require("./SendMessageButton");
17
17
  var RichContent_1 = require("./RichContent");
18
+ var NewConversationButton_1 = require("./NewConversationButton");
18
19
  var utils_1 = require("./utils");
19
20
  function MessageBubble(_a) {
20
21
  var message = _a.message, styles = _a.styles, primaryColor = _a.primaryColor;
@@ -24,7 +25,7 @@ function MessageBubble(_a) {
24
25
  return ((0, jsx_runtime_1.jsxs)("div", { style: messageStyle, children: [!isCustomer && message.author_name && (0, jsx_runtime_1.jsx)("div", { style: styles.messageAuthor, children: message.author_name }), (0, jsx_runtime_1.jsx)("div", { style: contentStyle, children: (0, jsx_runtime_1.jsx)(RichContent_1.RichContent, { richContent: message.rich_content, content: message.content, isCustomer: isCustomer, primaryColor: primaryColor }) }), (0, jsx_runtime_1.jsx)("div", { style: styles.messageTime, children: (0, utils_1.formatRelativeTime)(message.created_at) })] }, message.id));
25
26
  }
26
27
  function MessagesView(_a) {
27
- var styles = _a.styles, primaryColor = _a.primaryColor, placeholderText = _a.placeholderText, messages = _a.messages, inputValue = _a.inputValue, isLoading = _a.isLoading, error = _a.error, onInputChange = _a.onInputChange, onKeyDown = _a.onKeyDown, onSendMessage = _a.onSendMessage, messagesEndRef = _a.messagesEndRef, inputRef = _a.inputRef;
28
- return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)("div", { style: styles.messages, children: [messages.map(function (message) { return ((0, jsx_runtime_1.jsx)(MessageBubble, { message: message, styles: styles, primaryColor: primaryColor }, message.id)); }), (0, jsx_runtime_1.jsx)("div", { ref: messagesEndRef })] }), error && (0, jsx_runtime_1.jsx)("div", { style: styles.error, children: error }), (0, jsx_runtime_1.jsxs)("div", { style: styles.inputContainer, children: [(0, jsx_runtime_1.jsx)("textarea", { ref: inputRef, style: styles.input, placeholder: placeholderText, value: inputValue, onInput: onInputChange, onKeyDown: onKeyDown, rows: 1, disabled: isLoading }), (0, jsx_runtime_1.jsx)(SendMessageButton_1.SendMessageButton, { primaryColor: primaryColor, inputValue: inputValue, isLoading: isLoading, handleSendMessage: onSendMessage })] })] }));
28
+ var styles = _a.styles, primaryColor = _a.primaryColor, placeholderText = _a.placeholderText, messages = _a.messages, inputValue = _a.inputValue, isLoading = _a.isLoading, error = _a.error, isResolved = _a.isResolved, onInputChange = _a.onInputChange, onKeyDown = _a.onKeyDown, onSendMessage = _a.onSendMessage, onStartNewConversation = _a.onStartNewConversation, messagesEndRef = _a.messagesEndRef, inputRef = _a.inputRef;
29
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)("div", { style: styles.messages, children: [messages.map(function (message) { return ((0, jsx_runtime_1.jsx)(MessageBubble, { message: message, styles: styles, primaryColor: primaryColor }, message.id)); }), (0, jsx_runtime_1.jsx)("div", { ref: messagesEndRef })] }), error && (0, jsx_runtime_1.jsx)("div", { style: styles.error, children: error }), isResolved ? ((0, jsx_runtime_1.jsxs)("div", { style: styles.resolvedBanner, children: [(0, jsx_runtime_1.jsx)("div", { style: styles.resolvedBannerText, children: "This conversation was resolved." }), (0, jsx_runtime_1.jsx)(NewConversationButton_1.NewConversationButton, { styles: styles, onClick: onStartNewConversation })] })) : ((0, jsx_runtime_1.jsxs)("div", { style: styles.inputContainer, children: [(0, jsx_runtime_1.jsx)("textarea", { ref: inputRef, style: styles.input, placeholder: placeholderText, value: inputValue, onInput: onInputChange, onKeyDown: onKeyDown, rows: 1, disabled: isLoading }), (0, jsx_runtime_1.jsx)(SendMessageButton_1.SendMessageButton, { primaryColor: primaryColor, inputValue: inputValue, isLoading: isLoading, handleSendMessage: onSendMessage })] }))] }));
29
30
  }
30
31
  //# sourceMappingURL=MessagesView.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MessagesView.js","sourceRoot":"","sources":["../../../../../../src/extensions/conversations/external/components/MessagesView.tsx"],"names":[],"mappings":";;;;;;;;;;;;;AA0DA,oCA6CC;;AAnGD,yDAAuD;AACvD,6CAA2C;AAC3C,iCAA4C;AAiB5C,SAAS,aAAa,CAAC,EAQtB;QAPG,OAAO,aAAA,EACP,MAAM,YAAA,EACN,YAAY,kBAAA;IAMZ,IAAM,UAAU,GAAG,OAAO,CAAC,WAAW,KAAK,UAAU,CAAA;IACrD,IAAM,YAAY,yBACX,MAAM,CAAC,OAAO,GACd,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CACjE,CAAA;IACD,IAAM,YAAY,yBACX,MAAM,CAAC,cAAc,GACrB,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAC/E,CAAA;IAED,OAAO,CACH,iCAAsB,KAAK,EAAE,YAAY,aACpC,CAAC,UAAU,IAAI,OAAO,CAAC,WAAW,IAAI,gCAAK,KAAK,EAAE,MAAM,CAAC,aAAa,YAAG,OAAO,CAAC,WAAW,GAAO,EACpG,gCAAK,KAAK,EAAE,YAAY,YACpB,uBAAC,yBAAW,IACR,WAAW,EAAE,OAAO,CAAC,YAAY,EACjC,OAAO,EAAE,OAAO,CAAC,OAAO,EACxB,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,YAAY,GAC5B,GACA,EACN,gCAAK,KAAK,EAAE,MAAM,CAAC,WAAW,YAAG,IAAA,0BAAkB,EAAC,OAAO,CAAC,UAAU,CAAC,GAAO,KAVxE,OAAO,CAAC,EAAE,CAWd,CACT,CAAA;AACL,CAAC;AAED,SAAgB,YAAY,CAAC,EAaT;QAZhB,MAAM,YAAA,EACN,YAAY,kBAAA,EACZ,eAAe,qBAAA,EACf,QAAQ,cAAA,EACR,UAAU,gBAAA,EACV,SAAS,eAAA,EACT,KAAK,WAAA,EACL,aAAa,mBAAA,EACb,SAAS,eAAA,EACT,aAAa,mBAAA,EACb,cAAc,oBAAA,EACd,QAAQ,cAAA;IAER,OAAO,CACH,6DACI,iCAAK,KAAK,EAAE,MAAM,CAAC,QAAQ,aACtB,QAAQ,CAAC,GAAG,CAAC,UAAC,OAAO,IAAK,OAAA,CACvB,uBAAC,aAAa,IAAkB,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,IAAxE,OAAO,CAAC,EAAE,CAAkE,CACnG,EAF0B,CAE1B,CAAC,EACF,gCAAK,GAAG,EAAE,cAAc,GAAI,IAC1B,EAEL,KAAK,IAAI,gCAAK,KAAK,EAAE,MAAM,CAAC,KAAK,YAAG,KAAK,GAAO,EAEjD,iCAAK,KAAK,EAAE,MAAM,CAAC,cAAc,aAC7B,qCACI,GAAG,EAAE,QAAQ,EACb,KAAK,EAAE,MAAM,CAAC,KAAK,EACnB,WAAW,EAAE,eAAe,EAC5B,KAAK,EAAE,UAAU,EACjB,OAAO,EAAE,aAAa,EACtB,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,CAAC,EACP,QAAQ,EAAE,SAAS,GACrB,EACF,uBAAC,qCAAiB,IACd,YAAY,EAAE,YAAY,EAC1B,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,SAAS,EACpB,iBAAiB,EAAE,aAAa,GAClC,IACA,IACP,CACN,CAAA;AACL,CAAC","sourcesContent":["// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport { h, Fragment } from 'preact'\nimport { Message } from '../../../../posthog-conversations-types'\nimport { getStyles } from './styles'\nimport { SendMessageButton } from './SendMessageButton'\nimport { RichContent } from './RichContent'\nimport { formatRelativeTime } from './utils'\n\ninterface MessagesViewProps {\n styles: ReturnType<typeof getStyles>\n primaryColor: string\n placeholderText: string\n messages: Message[]\n inputValue: string\n isLoading: boolean\n error: string | null\n onInputChange: (e: Event) => void\n onKeyDown: (e: KeyboardEvent) => void\n onSendMessage: () => void\n messagesEndRef: (el: HTMLDivElement | null) => void\n inputRef: (el: HTMLTextAreaElement | null) => void\n}\n\nfunction MessageBubble({\n message,\n styles,\n primaryColor,\n}: {\n message: Message\n styles: ReturnType<typeof getStyles>\n primaryColor: string\n}) {\n const isCustomer = message.author_type === 'customer'\n const messageStyle = {\n ...styles.message,\n ...(isCustomer ? styles.messageCustomer : styles.messageAgent),\n }\n const contentStyle = {\n ...styles.messageContent,\n ...(isCustomer ? styles.messageContentCustomer : styles.messageContentAgent),\n }\n\n return (\n <div key={message.id} style={messageStyle}>\n {!isCustomer && message.author_name && <div style={styles.messageAuthor}>{message.author_name}</div>}\n <div style={contentStyle}>\n <RichContent\n richContent={message.rich_content}\n content={message.content}\n isCustomer={isCustomer}\n primaryColor={primaryColor}\n />\n </div>\n <div style={styles.messageTime}>{formatRelativeTime(message.created_at)}</div>\n </div>\n )\n}\n\nexport function MessagesView({\n styles,\n primaryColor,\n placeholderText,\n messages,\n inputValue,\n isLoading,\n error,\n onInputChange,\n onKeyDown,\n onSendMessage,\n messagesEndRef,\n inputRef,\n}: MessagesViewProps) {\n return (\n <>\n <div style={styles.messages}>\n {messages.map((message) => (\n <MessageBubble key={message.id} message={message} styles={styles} primaryColor={primaryColor} />\n ))}\n <div ref={messagesEndRef} />\n </div>\n\n {error && <div style={styles.error}>{error}</div>}\n\n <div style={styles.inputContainer}>\n <textarea\n ref={inputRef}\n style={styles.input}\n placeholder={placeholderText}\n value={inputValue}\n onInput={onInputChange}\n onKeyDown={onKeyDown}\n rows={1}\n disabled={isLoading}\n />\n <SendMessageButton\n primaryColor={primaryColor}\n inputValue={inputValue}\n isLoading={isLoading}\n handleSendMessage={onSendMessage}\n />\n </div>\n </>\n )\n}\n"]}
1
+ {"version":3,"file":"MessagesView.js","sourceRoot":"","sources":["../../../../../../src/extensions/conversations/external/components/MessagesView.tsx"],"names":[],"mappings":"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","sourcesContent":["// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport { h, Fragment } from 'preact'\nimport { Message } from '../../../../posthog-conversations-types'\nimport { getStyles } from './styles'\nimport { SendMessageButton } from './SendMessageButton'\nimport { RichContent } from './RichContent'\nimport { NewConversationButton } from './NewConversationButton'\nimport { formatRelativeTime } from './utils'\n\ninterface MessagesViewProps {\n styles: ReturnType<typeof getStyles>\n primaryColor: string\n placeholderText: string\n messages: Message[]\n inputValue: string\n isLoading: boolean\n error: string | null\n isResolved: boolean\n onInputChange: (e: Event) => void\n onKeyDown: (e: KeyboardEvent) => void\n onSendMessage: () => void\n onStartNewConversation: () => void\n messagesEndRef: (el: HTMLDivElement | null) => void\n inputRef: (el: HTMLTextAreaElement | null) => void\n}\n\nfunction MessageBubble({\n message,\n styles,\n primaryColor,\n}: {\n message: Message\n styles: ReturnType<typeof getStyles>\n primaryColor: string\n}) {\n const isCustomer = message.author_type === 'customer'\n const messageStyle = {\n ...styles.message,\n ...(isCustomer ? styles.messageCustomer : styles.messageAgent),\n }\n const contentStyle = {\n ...styles.messageContent,\n ...(isCustomer ? styles.messageContentCustomer : styles.messageContentAgent),\n }\n\n return (\n <div key={message.id} style={messageStyle}>\n {!isCustomer && message.author_name && <div style={styles.messageAuthor}>{message.author_name}</div>}\n <div style={contentStyle}>\n <RichContent\n richContent={message.rich_content}\n content={message.content}\n isCustomer={isCustomer}\n primaryColor={primaryColor}\n />\n </div>\n <div style={styles.messageTime}>{formatRelativeTime(message.created_at)}</div>\n </div>\n )\n}\n\nexport function MessagesView({\n styles,\n primaryColor,\n placeholderText,\n messages,\n inputValue,\n isLoading,\n error,\n isResolved,\n onInputChange,\n onKeyDown,\n onSendMessage,\n onStartNewConversation,\n messagesEndRef,\n inputRef,\n}: MessagesViewProps) {\n return (\n <>\n <div style={styles.messages}>\n {messages.map((message) => (\n <MessageBubble key={message.id} message={message} styles={styles} primaryColor={primaryColor} />\n ))}\n <div ref={messagesEndRef} />\n </div>\n\n {error && <div style={styles.error}>{error}</div>}\n\n {isResolved ? (\n <div style={styles.resolvedBanner}>\n <div style={styles.resolvedBannerText}>This conversation was resolved.</div>\n <NewConversationButton styles={styles} onClick={onStartNewConversation} />\n </div>\n ) : (\n <div style={styles.inputContainer}>\n <textarea\n ref={inputRef}\n style={styles.input}\n placeholder={placeholderText}\n value={inputValue}\n onInput={onInputChange}\n onKeyDown={onKeyDown}\n rows={1}\n disabled={isLoading}\n />\n <SendMessageButton\n primaryColor={primaryColor}\n inputValue={inputValue}\n isLoading={isLoading}\n handleSendMessage={onSendMessage}\n />\n </div>\n )}\n </>\n )\n}\n"]}
@@ -0,0 +1,12 @@
1
+ import { FunctionComponent } from 'preact';
2
+ import { getStyles } from './styles';
3
+ interface NewConversationButtonProps {
4
+ styles: ReturnType<typeof getStyles>;
5
+ onClick: () => void;
6
+ }
7
+ /**
8
+ * Primary CTA used anywhere the user can start a fresh conversation —
9
+ * the bottom of the ticket list and the resolved-state banner in the message view.
10
+ */
11
+ export declare const NewConversationButton: FunctionComponent<NewConversationButtonProps>;
12
+ export {};
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NewConversationButton = void 0;
4
+ var jsx_runtime_1 = require("preact/jsx-runtime");
5
+ /**
6
+ * Primary CTA used anywhere the user can start a fresh conversation —
7
+ * the bottom of the ticket list and the resolved-state banner in the message view.
8
+ */
9
+ var NewConversationButton = function (_a) {
10
+ var styles = _a.styles, onClick = _a.onClick;
11
+ return ((0, jsx_runtime_1.jsxs)("button", { type: "button", style: styles.newConversationButton, onClick: onClick, onMouseEnter: function (e) {
12
+ e.currentTarget.style.opacity = '0.9';
13
+ }, onMouseLeave: function (e) {
14
+ e.currentTarget.style.opacity = '1';
15
+ }, children: [(0, jsx_runtime_1.jsxs)("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", style: { marginRight: '8px' }, children: [(0, jsx_runtime_1.jsx)("line", { x1: "12", y1: "5", x2: "12", y2: "19" }), (0, jsx_runtime_1.jsx)("line", { x1: "5", y1: "12", x2: "19", y2: "12" })] }), "New conversation"] }));
16
+ };
17
+ exports.NewConversationButton = NewConversationButton;
18
+ //# sourceMappingURL=NewConversationButton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NewConversationButton.js","sourceRoot":"","sources":["../../../../../../src/extensions/conversations/external/components/NewConversationButton.tsx"],"names":[],"mappings":";;;;AASA;;;GAGG;AACI,IAAM,qBAAqB,GAAkD,UAAC,EAAmB;QAAjB,MAAM,YAAA,EAAE,OAAO,aAAA;IAAO,OAAA,CACzG,oCACI,IAAI,EAAC,QAAQ,EACb,KAAK,EAAE,MAAM,CAAC,qBAAqB,EACnC,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,UAAC,CAAC;YACZ,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,GAAG,KAAK,CAAA;QACzC,CAAC,EACD,YAAY,EAAE,UAAC,CAAC;YACZ,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,CAAA;QACvC,CAAC,aAED,iCACI,KAAK,EAAC,IAAI,EACV,MAAM,EAAC,IAAI,EACX,OAAO,EAAC,WAAW,EACnB,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,cAAc,EACrB,WAAW,EAAC,GAAG,EACf,KAAK,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,aAE7B,iCAAM,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,GAAG,EACvC,iCAAM,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,GAAG,IACrC,wBAED,CACZ;AA1B4G,CA0B5G,CAAA;AA1BY,QAAA,qBAAqB,yBA0BjC","sourcesContent":["// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport { h, FunctionComponent } from 'preact'\nimport { getStyles } from './styles'\n\ninterface NewConversationButtonProps {\n styles: ReturnType<typeof getStyles>\n onClick: () => void\n}\n\n/**\n * Primary CTA used anywhere the user can start a fresh conversation —\n * the bottom of the ticket list and the resolved-state banner in the message view.\n */\nexport const NewConversationButton: FunctionComponent<NewConversationButtonProps> = ({ styles, onClick }) => (\n <button\n type=\"button\"\n style={styles.newConversationButton}\n onClick={onClick}\n onMouseEnter={(e) => {\n e.currentTarget.style.opacity = '0.9'\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.opacity = '1'\n }}\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n style={{ marginRight: '8px' }}\n >\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\" />\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\n </svg>\n New conversation\n </button>\n)\n"]}
@@ -28,6 +28,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
28
28
  exports.TicketListView = void 0;
29
29
  var jsx_runtime_1 = require("preact/jsx-runtime");
30
30
  var TicketListItem_1 = require("./TicketListItem");
31
+ var NewConversationButton_1 = require("./NewConversationButton");
31
32
  /**
32
33
  * Loading state component
33
34
  */
@@ -69,11 +70,7 @@ var TicketListView = function (_a) {
69
70
  var dateB = new Date(b.last_message_at || b.created_at).getTime();
70
71
  return dateB - dateA; // Descending order (newest first)
71
72
  })
72
- .map(function (ticket) { return ((0, jsx_runtime_1.jsx)(TicketListItem_1.TicketListItem, { ticket: ticket, styles: styles, onClick: onSelectTicket }, "".concat(ticket.id, "-").concat(ticket.last_message_at || ticket.created_at, "-").concat(ticket.unread_count))); }) }), (0, jsx_runtime_1.jsxs)("button", { style: styles.newConversationButton, onClick: onNewConversation, onMouseEnter: function (e) {
73
- e.currentTarget.style.opacity = '0.9';
74
- }, onMouseLeave: function (e) {
75
- e.currentTarget.style.opacity = '1';
76
- }, children: [(0, jsx_runtime_1.jsxs)("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", style: { marginRight: '8px' }, children: [(0, jsx_runtime_1.jsx)("line", { x1: "12", y1: "5", x2: "12", y2: "19" }), (0, jsx_runtime_1.jsx)("line", { x1: "5", y1: "12", x2: "19", y2: "12" })] }), "New conversation"] })] }));
73
+ .map(function (ticket) { return ((0, jsx_runtime_1.jsx)(TicketListItem_1.TicketListItem, { ticket: ticket, styles: styles, onClick: onSelectTicket }, "".concat(ticket.id, "-").concat(ticket.last_message_at || ticket.created_at, "-").concat(ticket.unread_count))); }) }), (0, jsx_runtime_1.jsx)(NewConversationButton_1.NewConversationButton, { styles: styles, onClick: onNewConversation })] }));
77
74
  };
78
75
  exports.TicketListView = TicketListView;
79
76
  //# sourceMappingURL=TicketListView.js.map