@pega/cosmos-react-social 9.0.0-build.9.8 → 9.0.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 (132) hide show
  1. package/lib/components/AISummary/AISummary.d.ts +10 -0
  2. package/lib/components/AISummary/AISummary.d.ts.map +1 -0
  3. package/lib/components/AISummary/AISummary.js +128 -0
  4. package/lib/components/AISummary/AISummary.js.map +1 -0
  5. package/lib/components/AISummary/index.d.ts +3 -0
  6. package/lib/components/AISummary/index.d.ts.map +1 -0
  7. package/lib/components/AISummary/index.js +2 -0
  8. package/lib/components/AISummary/index.js.map +1 -0
  9. package/lib/components/Chat/Chat.js +1 -1
  10. package/lib/components/Chat/Chat.js.map +1 -1
  11. package/lib/components/Chat/ChatBody.js +5 -5
  12. package/lib/components/Chat/ChatBody.js.map +1 -1
  13. package/lib/components/Chat/ChatComposer.d.ts +16 -2
  14. package/lib/components/Chat/ChatComposer.d.ts.map +1 -1
  15. package/lib/components/Chat/ChatSettingsPanel.d.ts.map +1 -1
  16. package/lib/components/Chat/ChatSettingsPanel.js +1 -1
  17. package/lib/components/Chat/ChatSettingsPanel.js.map +1 -1
  18. package/lib/components/Chat/ChatSettingsPanel.styles.d.ts +13 -9
  19. package/lib/components/Chat/ChatSettingsPanel.styles.d.ts.map +1 -1
  20. package/lib/components/Chat/ChatSettingsPanel.styles.js.map +1 -1
  21. package/lib/components/Chat/Message.styles.d.ts +28 -24
  22. package/lib/components/Chat/Message.styles.d.ts.map +1 -1
  23. package/lib/components/Chat/Message.styles.js +20 -1
  24. package/lib/components/Chat/Message.styles.js.map +1 -1
  25. package/lib/components/Chat/SuggestedReplyPicker.d.ts +7 -7
  26. package/lib/components/Chat/SuggestedReplyPicker.d.ts.map +1 -1
  27. package/lib/components/Chat/SystemMessage.d.ts +1 -1
  28. package/lib/components/Chat/SystemMessage.d.ts.map +1 -1
  29. package/lib/components/Chat/SystemMessage.js +4 -4
  30. package/lib/components/Chat/SystemMessage.js.map +1 -1
  31. package/lib/components/Email/Email.d.ts.map +1 -1
  32. package/lib/components/Email/Email.js +5 -5
  33. package/lib/components/Email/Email.js.map +1 -1
  34. package/lib/components/Email/Email.styles.d.ts +63 -53
  35. package/lib/components/Email/Email.styles.d.ts.map +1 -1
  36. package/lib/components/Email/Email.styles.js +2 -21
  37. package/lib/components/Email/Email.styles.js.map +1 -1
  38. package/lib/components/Email/Email.types.d.ts +11 -5
  39. package/lib/components/Email/Email.types.d.ts.map +1 -1
  40. package/lib/components/Email/Email.types.js.map +1 -1
  41. package/lib/components/Email/EmailComposer.d.ts +8 -5
  42. package/lib/components/Email/EmailComposer.d.ts.map +1 -1
  43. package/lib/components/Email/EmailComposer.js +86 -41
  44. package/lib/components/Email/EmailComposer.js.map +1 -1
  45. package/lib/components/Email/EmailConversation.d.ts +11 -7
  46. package/lib/components/Email/EmailConversation.d.ts.map +1 -1
  47. package/lib/components/Email/EmailConversation.js +2 -2
  48. package/lib/components/Email/EmailConversation.js.map +1 -1
  49. package/lib/components/Email/EmailNotificationPanel.d.ts.map +1 -1
  50. package/lib/components/Email/EmailNotificationPanel.js +5 -5
  51. package/lib/components/Email/EmailNotificationPanel.js.map +1 -1
  52. package/lib/components/Email/EmailShell.d.ts.map +1 -1
  53. package/lib/components/Email/EmailShell.js +7 -6
  54. package/lib/components/Email/EmailShell.js.map +1 -1
  55. package/lib/components/Email/EmailSummaryItem.d.ts +2 -2
  56. package/lib/components/Email/EmailSummaryItem.d.ts.map +1 -1
  57. package/lib/components/Email/EmailSummaryItem.js +6 -5
  58. package/lib/components/Email/EmailSummaryItem.js.map +1 -1
  59. package/lib/components/Email/EntityList.js +1 -1
  60. package/lib/components/Email/EntityList.js.map +1 -1
  61. package/lib/components/Email/utils/EntityHighlighter.d.ts +2 -3
  62. package/lib/components/Email/utils/EntityHighlighter.d.ts.map +1 -1
  63. package/lib/components/Email/utils/EntityHighlighter.js +10 -15
  64. package/lib/components/Email/utils/EntityHighlighter.js.map +1 -1
  65. package/lib/components/Feed/Feed.d.ts +3 -1
  66. package/lib/components/Feed/Feed.d.ts.map +1 -1
  67. package/lib/components/Feed/Feed.js +3 -3
  68. package/lib/components/Feed/Feed.js.map +1 -1
  69. package/lib/components/Feed/Feed.types.d.ts +11 -4
  70. package/lib/components/Feed/Feed.types.d.ts.map +1 -1
  71. package/lib/components/Feed/Feed.types.js.map +1 -1
  72. package/lib/components/Feed/FeedAttachments.d.ts +4 -2
  73. package/lib/components/Feed/FeedAttachments.d.ts.map +1 -1
  74. package/lib/components/Feed/FeedAttachments.js +2 -3
  75. package/lib/components/Feed/FeedAttachments.js.map +1 -1
  76. package/lib/components/Feed/FeedButton.d.ts +2 -2
  77. package/lib/components/Feed/FeedButton.d.ts.map +1 -1
  78. package/lib/components/Feed/FeedContentHeader.d.ts.map +1 -1
  79. package/lib/components/Feed/FeedContentHeader.js +14 -12
  80. package/lib/components/Feed/FeedContentHeader.js.map +1 -1
  81. package/lib/components/Feed/FeedCustomEditRegion.d.ts +1 -1
  82. package/lib/components/Feed/FeedCustomEditRegion.d.ts.map +1 -1
  83. package/lib/components/Feed/FeedCustomInputRegion.d.ts +1 -1
  84. package/lib/components/Feed/FeedCustomInputRegion.d.ts.map +1 -1
  85. package/lib/components/Feed/FeedEditRegion.d.ts.map +1 -1
  86. package/lib/components/Feed/FeedEditRegion.js +94 -6
  87. package/lib/components/Feed/FeedEditRegion.js.map +1 -1
  88. package/lib/components/Feed/FeedInputRegion.d.ts +1 -1
  89. package/lib/components/Feed/FeedInputRegion.d.ts.map +1 -1
  90. package/lib/components/Feed/FeedInputRegion.js +96 -7
  91. package/lib/components/Feed/FeedInputRegion.js.map +1 -1
  92. package/lib/components/Feed/FeedLikeButton.js +1 -1
  93. package/lib/components/Feed/FeedLikeButton.js.map +1 -1
  94. package/lib/components/Feed/FeedNewPost.d.ts +1 -1
  95. package/lib/components/Feed/FeedNewPost.d.ts.map +1 -1
  96. package/lib/components/Feed/FeedNewPost.js +2 -1
  97. package/lib/components/Feed/FeedNewPost.js.map +1 -1
  98. package/lib/components/Feed/FeedPost.d.ts +8 -3
  99. package/lib/components/Feed/FeedPost.d.ts.map +1 -1
  100. package/lib/components/Feed/FeedPost.js +58 -24
  101. package/lib/components/Feed/FeedPost.js.map +1 -1
  102. package/lib/components/Feed/FeedReply.d.ts +2 -1
  103. package/lib/components/Feed/FeedReply.d.ts.map +1 -1
  104. package/lib/components/Feed/FeedReply.js +4 -5
  105. package/lib/components/Feed/FeedReply.js.map +1 -1
  106. package/lib/components/Feed/FeedReplyInput.d.ts +1 -1
  107. package/lib/components/Feed/FeedReplyInput.d.ts.map +1 -1
  108. package/lib/components/Feed/FeedReplyInput.js +2 -2
  109. package/lib/components/Feed/FeedReplyInput.js.map +1 -1
  110. package/lib/components/Feed/FeedRichText.d.ts.map +1 -1
  111. package/lib/components/Feed/FeedRichText.js +5 -4
  112. package/lib/components/Feed/FeedRichText.js.map +1 -1
  113. package/lib/components/HashtagButton/HashtagButton.d.ts +1 -1
  114. package/lib/components/HashtagButton/HashtagButton.d.ts.map +1 -1
  115. package/lib/components/HashtagButton/HashtagButton.js +19 -2
  116. package/lib/components/HashtagButton/HashtagButton.js.map +1 -1
  117. package/lib/components/MentionButton/MentionButton.d.ts +1 -1
  118. package/lib/components/MentionButton/MentionButton.d.ts.map +1 -1
  119. package/lib/components/MentionButton/MentionButton.js +22 -5
  120. package/lib/components/MentionButton/MentionButton.js.map +1 -1
  121. package/lib/components/OpenGraphPreview/OpenGraphPreview.d.ts.map +1 -1
  122. package/lib/components/OpenGraphPreview/OpenGraphPreview.js +4 -1
  123. package/lib/components/OpenGraphPreview/OpenGraphPreview.js.map +1 -1
  124. package/lib/components/OpenGraphPreview/OpenGraphPreview.styles.d.ts +382 -10
  125. package/lib/components/OpenGraphPreview/OpenGraphPreview.styles.d.ts.map +1 -1
  126. package/lib/components/OpenGraphPreview/OpenGraphPreview.styles.js +1 -1
  127. package/lib/components/OpenGraphPreview/OpenGraphPreview.styles.js.map +1 -1
  128. package/lib/index.d.ts +2 -0
  129. package/lib/index.d.ts.map +1 -1
  130. package/lib/index.js +2 -0
  131. package/lib/index.js.map +1 -1
  132. package/package.json +6 -7
@@ -1,7 +1,8 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useContext, useEffect, useRef, useState } from 'react';
2
+ import { useContext, useEffect, useLayoutEffect, useRef, useState } from 'react';
3
3
  import styled, { css } from 'styled-components';
4
- import { Button, defaultThemeProp, Flex, Icon, Progress, useI18n, useLiveLog, useOuterEvent } from '@pega/cosmos-react-core';
4
+ import { AIRewrite, Button, defaultThemeProp, Flex, getActiveElement, Icon, isInstance, Progress, useAfterInitialEffect, useElement, useI18n, useLiveLog, useOuterEvent } from '@pega/cosmos-react-core';
5
+ import { extractMentions, restoreMentionPlaceholders } from '@pega/cosmos-react-rte';
5
6
  import FeedRichText from './FeedRichText';
6
7
  import { StyledActions } from './FeedInputRegion';
7
8
  import FeedButton from './FeedButton';
@@ -19,20 +20,43 @@ const StyledInputContainer = styled.div(({ theme }) => {
19
20
  });
20
21
  StyledInputContainer.defaultProps = defaultThemeProp;
21
22
  const FeedEditRegion = (props) => {
22
- const { variant, id, content, visibility, recipients = [], recipientInput, banners, progress, onEditSubmit, onEditCancel, emptyEditText, setEmptyEditText } = props;
23
+ const { defaultValue, variant, id, content, visibility, recipients = [], recipientInput, banners, progress, onRewriteClick, onEditSubmit, onEditCancel, emptyEditText, setEmptyEditText, onUnmount } = props;
23
24
  const t = useI18n();
24
25
  const { announcePolite } = useLiveLog();
25
26
  const { setShowSearchResults } = useContext(FeedContext);
26
27
  const rteRef = useRef(null);
27
28
  const editTextAreaRef = useRef(null);
29
+ const postButtonRef = useRef(null);
30
+ const isSubmitButtonClicked = useRef(false);
31
+ const previouslyFocusedElementRef = useRef(null);
32
+ const [aiButtonEl, setAIButtonEl] = useElement();
33
+ const [showAIPopover, setShowAIPopover] = useState(false);
34
+ const [isGenerating, setIsGenerating] = useState(false);
35
+ const [suggestion, setSuggestion] = useState(undefined);
36
+ const [hasSuggestionContent, setHasSuggestionContent] = useState(false);
37
+ const suggestionRteRef = useRef(null);
38
+ // Sync AI-generated suggestion into the suggestion FeedRichText whenever it changes
39
+ useEffect(() => {
40
+ if (suggestion !== undefined) {
41
+ suggestionRteRef.current?.clear();
42
+ suggestionRteRef.current?.insertMarkdown?.(suggestion);
43
+ setHasSuggestionContent(true);
44
+ }
45
+ else {
46
+ suggestionRteRef.current?.clear();
47
+ setHasSuggestionContent(false);
48
+ }
49
+ }, [suggestion]);
28
50
  const [contentModified, setContentModified] = useState(false);
29
51
  const [recipientsModified, setRecipientsModified] = useState(false);
52
+ const valueRef = useRef(defaultValue ?? content ?? '');
30
53
  const announceLabel = t(variant === 'post' ? 'feed_edit_posted' : 'feed_edit_commented');
31
54
  useOuterEvent('mousedown', [editTextAreaRef], () => {
32
55
  if (emptyEditText)
33
56
  onEditCancel?.(id);
34
57
  });
35
58
  const handleEdit = () => {
59
+ isSubmitButtonClicked.current = true;
36
60
  setShowSearchResults?.(false);
37
61
  if (!emptyEditText && (contentModified || recipientsModified)) {
38
62
  onEditSubmit({
@@ -44,6 +68,41 @@ const FeedEditRegion = (props) => {
44
68
  announcePolite({ message: announceLabel, type: 'success' });
45
69
  }
46
70
  };
71
+ const handleGenerate = (rewriteAction, additionalInstructions) => {
72
+ const originalContent = rteRef.current?.getPlainText() || '';
73
+ if (!originalContent)
74
+ return;
75
+ const { cleanText, mentionMap, userPlaceholders } = extractMentions(originalContent);
76
+ // Capture in closure so concurrent Generate calls don't corrupt each other's restore map
77
+ const capturedMentionMap = mentionMap;
78
+ const capturedUserPlaceholders = userPlaceholders;
79
+ setIsGenerating(true);
80
+ setSuggestion(undefined);
81
+ onRewriteClick?.(cleanText, rewriteAction, additionalInstructions, (rewrittenText) => {
82
+ const restoredText = restoreMentionPlaceholders(rewrittenText, capturedMentionMap, capturedUserPlaceholders);
83
+ setIsGenerating(false);
84
+ setSuggestion(restoredText.trim() ? restoredText : undefined);
85
+ }, true);
86
+ };
87
+ const handleApplyRewrite = () => {
88
+ const editedText = suggestionRteRef.current?.getPlainText() ?? suggestion ?? '';
89
+ rteRef.current?.insertMarkdown?.(editedText);
90
+ valueRef.current = editedText;
91
+ // Manually update states since programmatic updates might not trigger onChange
92
+ setEmptyEditText(editedText.trim() === '');
93
+ setContentModified(editedText !== content);
94
+ // Close popover and reset AI state
95
+ setShowAIPopover(false);
96
+ setSuggestion(undefined);
97
+ // Return focus to RTE
98
+ rteRef.current?.focus();
99
+ };
100
+ // If the API call fails, progress will flip back to false without calling the success callback
101
+ // Clear the loading state so the Generate button re-enables
102
+ useAfterInitialEffect(() => {
103
+ if (!progress)
104
+ setIsGenerating(false);
105
+ }, [progress]);
47
106
  const onKeyDown = (event) => {
48
107
  if ((event.metaKey || event.ctrlKey) && event.key === 'Enter')
49
108
  handleEdit();
@@ -53,6 +112,22 @@ const FeedEditRegion = (props) => {
53
112
  rteRef.current?.focus();
54
113
  }
55
114
  }, [rteRef]);
115
+ // Using layout effect to capture the focused element prior to editor taking focus.
116
+ useLayoutEffect(() => {
117
+ previouslyFocusedElementRef.current = getActiveElement();
118
+ return () => {
119
+ const el = previouslyFocusedElementRef.current;
120
+ if (isInstance(el, HTMLElement) && el.isConnected) {
121
+ el.focus();
122
+ }
123
+ };
124
+ }, []);
125
+ useEffect(() => {
126
+ if (banners && isSubmitButtonClicked.current && postButtonRef.current) {
127
+ postButtonRef.current.focus();
128
+ isSubmitButtonClicked.current = false;
129
+ }
130
+ }, [banners]);
56
131
  useEffect(() => {
57
132
  if (recipientInput) {
58
133
  if (recipients.length !== recipientInput.recipients.length) {
@@ -75,10 +150,23 @@ const FeedEditRegion = (props) => {
75
150
  }
76
151
  }, [recipients, recipientInput?.recipients]);
77
152
  const label = t(variant === 'post' ? 'feed_edit_post' : 'feed_edit_comment');
153
+ useEffect(() => {
154
+ return () => {
155
+ onUnmount?.(valueRef.current);
156
+ };
157
+ }, []);
78
158
  return (_jsxs(Flex, { container: { gap: 1, alignItems: 'end' }, children: [_jsxs(Flex, { as: StyledInputContainer, ref: editTextAreaRef, container: { direction: 'column', gap: 1 }, inert: progress ? '' : undefined, children: [banners, visibility === 'private' && !!recipientInput && (_jsx(FeedVisibilityControls, { visibilityMode: 'private', visibility: 'private', recipientInput: recipientInput })), _jsx(FeedRichText, { label: label, onChange: () => {
79
- setEmptyEditText(rteRef.current?.getPlainText().trim() === '');
80
- setContentModified(rteRef.current?.getPlainText() !== content);
81
- }, onKeyDown: onKeyDown, defaultValue: content, ref: rteRef }), _jsx(Progress, { visible: !!progress, focusOnVisible: true, placement: 'local', message: typeof progress === 'string' ? progress : undefined })] }), _jsxs(Flex, { as: StyledActions, container: { direction: 'column', gap: 0.25, pad: [0.25, 0] }, children: [_jsx(Button, { variant: 'simple', as: FeedButton, onClick: () => onEditCancel?.(id), icon: true, label: t('cancel'), children: _jsx(Icon, { name: 'times' }) }), _jsx(Button, { as: FeedButton, disabled: emptyEditText || (!contentModified && !recipientsModified) || !!progress, variant: 'simple', onClick: handleEdit, icon: true, label: t('update'), children: _jsx(Icon, { name: 'send' }) })] })] }));
159
+ const value = rteRef.current?.getPlainText();
160
+ setEmptyEditText(value?.trim() === '');
161
+ // TODO: onChange is running on mount. It shouldn't...
162
+ setContentModified(value !== content);
163
+ valueRef.current = value ?? '';
164
+ }, onKeyDown: onKeyDown, defaultValue: defaultValue, ref: rteRef }), _jsx(Progress, { visible: !!progress, focusOnVisible: true, placement: 'local', message: typeof progress === 'string' ? progress : undefined })] }), _jsxs(Flex, { as: StyledActions, container: { direction: 'column', gap: 0.25, pad: [0.25, 0] }, children: [_jsx(Button, { variant: 'simple', as: FeedButton, onClick: () => onEditCancel?.(id), icon: true, label: t('cancel'), children: _jsx(Icon, { name: 'times' }) }), onRewriteClick && (_jsx(Button, { variant: 'simple', disabled: emptyEditText || !!progress, as: FeedButton, onClick: () => setShowAIPopover(true), icon: true, label: t('ai_rewrite_title'), ref: setAIButtonEl, children: _jsx(Icon, { name: 'polaris' }) })), _jsx(Button, { as: FeedButton, disabled: emptyEditText || (!contentModified && !recipientsModified) || !!progress, variant: 'simple', onClick: handleEdit, icon: true, label: t('update'), ref: postButtonRef, children: _jsx(Icon, { name: 'send' }) })] }), aiButtonEl && showAIPopover && onRewriteClick && (_jsx(AIRewrite, { target: aiButtonEl, isGenerating: isGenerating, suggestion: hasSuggestionContent ? suggestion : undefined, onGenerate: handleGenerate, onSubmit: handleApplyRewrite, suggestionEditor: _jsx(FeedRichText, { ref: suggestionRteRef, label: t('ai_rewrite_result_label'), labelHidden: true, disabled: isGenerating || !suggestion?.trim(), readOnly: false, onChange: () => setHasSuggestionContent((suggestionRteRef.current?.getPlainText() ?? '').trim().length > 0) }), onCancel: () => {
165
+ setShowAIPopover(false);
166
+ setSuggestion(undefined);
167
+ setIsGenerating(false);
168
+ aiButtonEl.focus();
169
+ } }))] }));
82
170
  };
83
171
  export default FeedEditRegion;
84
172
  //# sourceMappingURL=FeedEditRegion.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FeedEditRegion.js","sourceRoot":"","sources":["../../../src/components/Feed/FeedEditRegion.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useContext, useEffect, useRef, useState } from 'react';\nimport type { FC, KeyboardEvent } from 'react';\nimport styled, { css } from 'styled-components';\n\nimport {\n Button,\n defaultThemeProp,\n Flex,\n Icon,\n Progress,\n useI18n,\n useLiveLog,\n useOuterEvent\n} from '@pega/cosmos-react-core';\nimport type { RichTextEditorState } from '@pega/cosmos-react-rte';\n\nimport FeedRichText from './FeedRichText';\nimport type { FeedEditRegionProps, RecipientMenuItem } from './Feed.types';\nimport { StyledActions } from './FeedInputRegion';\nimport FeedButton from './FeedButton';\nimport { FeedContext } from './Feed.context';\nimport FeedVisibilityControls from './FeedVisibilityControls';\n\nconst StyledInputContainer = styled.div(({ theme }) => {\n return css`\n width: calc(100% - (${theme.base.spacing} + ${theme.base['hit-area']['mouse-min']}));\n position: relative;\n\n @media (pointer: coarse) {\n width: calc(100% - (${theme.base.spacing} + ${theme.base['hit-area']['finger-min']}));\n }\n `;\n});\n\nStyledInputContainer.defaultProps = defaultThemeProp;\n\nconst FeedEditRegion: FC<FeedEditRegionProps> = (props: FeedEditRegionProps) => {\n const {\n variant,\n id,\n content,\n visibility,\n recipients = [],\n recipientInput,\n banners,\n progress,\n onEditSubmit,\n onEditCancel,\n emptyEditText,\n setEmptyEditText\n } = props;\n\n const t = useI18n();\n const { announcePolite } = useLiveLog();\n const { setShowSearchResults } = useContext(FeedContext);\n const rteRef = useRef<RichTextEditorState>(null);\n const editTextAreaRef = useRef<HTMLDivElement>(null);\n\n const [contentModified, setContentModified] = useState(false);\n const [recipientsModified, setRecipientsModified] = useState(false);\n\n const announceLabel = t(variant === 'post' ? 'feed_edit_posted' : 'feed_edit_commented');\n\n useOuterEvent('mousedown', [editTextAreaRef], () => {\n if (emptyEditText) onEditCancel?.(id);\n });\n\n const handleEdit = () => {\n setShowSearchResults?.(false);\n if (!emptyEditText && (contentModified || recipientsModified)) {\n onEditSubmit({\n id,\n value: rteRef.current?.getPlainText() || '',\n visibility,\n recipients: recipientInput?.recipients ?? recipients\n });\n announcePolite({ message: announceLabel, type: 'success' });\n }\n };\n\n const onKeyDown = (event: KeyboardEvent) => {\n if ((event.metaKey || event.ctrlKey) && event.key === 'Enter') handleEdit();\n };\n\n useEffect(() => {\n if (rteRef.current) {\n rteRef.current?.focus();\n }\n }, [rteRef]);\n\n useEffect(() => {\n if (recipientInput) {\n if (recipients.length !== recipientInput.recipients.length) {\n setRecipientsModified(true);\n } else {\n const recipientIntersection: RecipientMenuItem[] = [];\n recipients.forEach(recipient => {\n if (recipientInput.recipients.find(r => r.id === recipient.id)) {\n recipientIntersection.push(recipient);\n }\n });\n\n if (recipientIntersection.length !== recipientInput.recipients.length) {\n setRecipientsModified(true);\n } else {\n setRecipientsModified(false);\n }\n }\n }\n }, [recipients, recipientInput?.recipients]);\n\n const label = t(variant === 'post' ? 'feed_edit_post' : 'feed_edit_comment');\n\n return (\n <Flex container={{ gap: 1, alignItems: 'end' }}>\n <Flex\n as={StyledInputContainer}\n ref={editTextAreaRef}\n container={{ direction: 'column', gap: 1 }}\n inert={progress ? '' : undefined}\n >\n {banners}\n\n {visibility === 'private' && !!recipientInput && (\n <FeedVisibilityControls\n visibilityMode='private'\n visibility='private'\n recipientInput={recipientInput}\n />\n )}\n\n <FeedRichText\n label={label}\n onChange={() => {\n setEmptyEditText(rteRef.current?.getPlainText().trim() === '');\n setContentModified(rteRef.current?.getPlainText() !== content);\n }}\n onKeyDown={onKeyDown}\n defaultValue={content}\n ref={rteRef}\n />\n\n <Progress\n visible={!!progress}\n focusOnVisible\n placement='local'\n message={typeof progress === 'string' ? progress : undefined}\n />\n </Flex>\n <Flex as={StyledActions} container={{ direction: 'column', gap: 0.25, pad: [0.25, 0] }}>\n <Button\n variant='simple'\n as={FeedButton}\n onClick={() => onEditCancel?.(id)}\n icon\n label={t('cancel')}\n >\n <Icon name='times' />\n </Button>\n\n <Button\n as={FeedButton}\n disabled={emptyEditText || (!contentModified && !recipientsModified) || !!progress}\n variant='simple'\n onClick={handleEdit}\n icon\n label={t('update')}\n >\n <Icon name='send' />\n </Button>\n </Flex>\n </Flex>\n );\n};\n\nexport default FeedEditRegion;\n"]}
1
+ {"version":3,"file":"FeedEditRegion.js","sourceRoot":"","sources":["../../../src/components/Feed/FeedEditRegion.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useContext, useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport type { FC, KeyboardEvent } from 'react';\nimport styled, { css } from 'styled-components';\n\nimport {\n AIRewrite,\n Button,\n defaultThemeProp,\n Flex,\n getActiveElement,\n Icon,\n isInstance,\n Progress,\n useAfterInitialEffect,\n useElement,\n useI18n,\n useLiveLog,\n useOuterEvent\n} from '@pega/cosmos-react-core';\nimport type { AIAction } from '@pega/cosmos-react-core';\nimport { extractMentions, restoreMentionPlaceholders } from '@pega/cosmos-react-rte';\nimport type { RichTextEditorState } from '@pega/cosmos-react-rte';\n\nimport FeedRichText from './FeedRichText';\nimport type { FeedEditRegionProps, RecipientMenuItem } from './Feed.types';\nimport { StyledActions } from './FeedInputRegion';\nimport FeedButton from './FeedButton';\nimport { FeedContext } from './Feed.context';\nimport FeedVisibilityControls from './FeedVisibilityControls';\n\nconst StyledInputContainer = styled.div(({ theme }) => {\n return css`\n width: calc(100% - (${theme.base.spacing} + ${theme.base['hit-area']['mouse-min']}));\n position: relative;\n\n @media (pointer: coarse) {\n width: calc(100% - (${theme.base.spacing} + ${theme.base['hit-area']['finger-min']}));\n }\n `;\n});\n\nStyledInputContainer.defaultProps = defaultThemeProp;\n\nconst FeedEditRegion: FC<FeedEditRegionProps> = (props: FeedEditRegionProps) => {\n const {\n defaultValue,\n variant,\n id,\n content,\n visibility,\n recipients = [],\n recipientInput,\n banners,\n progress,\n onRewriteClick,\n onEditSubmit,\n onEditCancel,\n emptyEditText,\n setEmptyEditText,\n onUnmount\n } = props;\n\n const t = useI18n();\n const { announcePolite } = useLiveLog();\n const { setShowSearchResults } = useContext(FeedContext);\n const rteRef = useRef<RichTextEditorState>(null);\n const editTextAreaRef = useRef<HTMLDivElement>(null);\n const postButtonRef = useRef<HTMLButtonElement>(null);\n const isSubmitButtonClicked = useRef(false);\n const previouslyFocusedElementRef = useRef<Element | null>(null);\n const [aiButtonEl, setAIButtonEl] = useElement<HTMLButtonElement>();\n const [showAIPopover, setShowAIPopover] = useState(false);\n const [isGenerating, setIsGenerating] = useState(false);\n const [suggestion, setSuggestion] = useState<string | undefined>(undefined);\n const [hasSuggestionContent, setHasSuggestionContent] = useState(false);\n const suggestionRteRef = useRef<RichTextEditorState>(null);\n\n // Sync AI-generated suggestion into the suggestion FeedRichText whenever it changes\n useEffect(() => {\n if (suggestion !== undefined) {\n suggestionRteRef.current?.clear();\n suggestionRteRef.current?.insertMarkdown?.(suggestion);\n setHasSuggestionContent(true);\n } else {\n suggestionRteRef.current?.clear();\n setHasSuggestionContent(false);\n }\n }, [suggestion]);\n\n const [contentModified, setContentModified] = useState(false);\n const [recipientsModified, setRecipientsModified] = useState(false);\n\n const valueRef = useRef(defaultValue ?? content ?? '');\n\n const announceLabel = t(variant === 'post' ? 'feed_edit_posted' : 'feed_edit_commented');\n\n useOuterEvent('mousedown', [editTextAreaRef], () => {\n if (emptyEditText) onEditCancel?.(id);\n });\n\n const handleEdit = () => {\n isSubmitButtonClicked.current = true;\n setShowSearchResults?.(false);\n if (!emptyEditText && (contentModified || recipientsModified)) {\n onEditSubmit({\n id,\n value: rteRef.current?.getPlainText() || '',\n visibility,\n recipients: recipientInput?.recipients ?? recipients\n });\n announcePolite({ message: announceLabel, type: 'success' });\n }\n };\n\n const handleGenerate = (rewriteAction: AIAction, additionalInstructions: string) => {\n const originalContent = rteRef.current?.getPlainText() || '';\n if (!originalContent) return;\n\n const { cleanText, mentionMap, userPlaceholders } = extractMentions(originalContent);\n\n // Capture in closure so concurrent Generate calls don't corrupt each other's restore map\n const capturedMentionMap = mentionMap;\n const capturedUserPlaceholders = userPlaceholders;\n\n setIsGenerating(true);\n setSuggestion(undefined);\n\n onRewriteClick?.(\n cleanText,\n rewriteAction,\n additionalInstructions,\n (rewrittenText: string) => {\n const restoredText = restoreMentionPlaceholders(\n rewrittenText,\n capturedMentionMap,\n capturedUserPlaceholders\n );\n setIsGenerating(false);\n setSuggestion(restoredText.trim() ? restoredText : undefined);\n },\n true\n );\n };\n\n const handleApplyRewrite = () => {\n const editedText = suggestionRteRef.current?.getPlainText() ?? suggestion ?? '';\n rteRef.current?.insertMarkdown?.(editedText);\n valueRef.current = editedText;\n\n // Manually update states since programmatic updates might not trigger onChange\n setEmptyEditText(editedText.trim() === '');\n setContentModified(editedText !== content);\n\n // Close popover and reset AI state\n setShowAIPopover(false);\n setSuggestion(undefined);\n\n // Return focus to RTE\n rteRef.current?.focus();\n };\n\n // If the API call fails, progress will flip back to false without calling the success callback\n // Clear the loading state so the Generate button re-enables\n useAfterInitialEffect(() => {\n if (!progress) setIsGenerating(false);\n }, [progress]);\n\n const onKeyDown = (event: KeyboardEvent) => {\n if ((event.metaKey || event.ctrlKey) && event.key === 'Enter') handleEdit();\n };\n\n useEffect(() => {\n if (rteRef.current) {\n rteRef.current?.focus();\n }\n }, [rteRef]);\n\n // Using layout effect to capture the focused element prior to editor taking focus.\n useLayoutEffect(() => {\n previouslyFocusedElementRef.current = getActiveElement();\n\n return () => {\n const el = previouslyFocusedElementRef.current;\n if (isInstance(el, HTMLElement) && el.isConnected) {\n el.focus();\n }\n };\n }, []);\n\n useEffect(() => {\n if (banners && isSubmitButtonClicked.current && postButtonRef.current) {\n postButtonRef.current.focus();\n isSubmitButtonClicked.current = false;\n }\n }, [banners]);\n\n useEffect(() => {\n if (recipientInput) {\n if (recipients.length !== recipientInput.recipients.length) {\n setRecipientsModified(true);\n } else {\n const recipientIntersection: RecipientMenuItem[] = [];\n recipients.forEach(recipient => {\n if (recipientInput.recipients.find(r => r.id === recipient.id)) {\n recipientIntersection.push(recipient);\n }\n });\n\n if (recipientIntersection.length !== recipientInput.recipients.length) {\n setRecipientsModified(true);\n } else {\n setRecipientsModified(false);\n }\n }\n }\n }, [recipients, recipientInput?.recipients]);\n\n const label = t(variant === 'post' ? 'feed_edit_post' : 'feed_edit_comment');\n\n useEffect(() => {\n return () => {\n onUnmount?.(valueRef.current);\n };\n }, []);\n\n return (\n <Flex container={{ gap: 1, alignItems: 'end' }}>\n <Flex\n as={StyledInputContainer}\n ref={editTextAreaRef}\n container={{ direction: 'column', gap: 1 }}\n inert={progress ? '' : undefined}\n >\n {banners}\n\n {visibility === 'private' && !!recipientInput && (\n <FeedVisibilityControls\n visibilityMode='private'\n visibility='private'\n recipientInput={recipientInput}\n />\n )}\n\n <FeedRichText\n label={label}\n onChange={() => {\n const value = rteRef.current?.getPlainText();\n setEmptyEditText(value?.trim() === '');\n // TODO: onChange is running on mount. It shouldn't...\n setContentModified(value !== content);\n valueRef.current = value ?? '';\n }}\n onKeyDown={onKeyDown}\n defaultValue={defaultValue}\n ref={rteRef}\n />\n\n <Progress\n visible={!!progress}\n focusOnVisible\n placement='local'\n message={typeof progress === 'string' ? progress : undefined}\n />\n </Flex>\n <Flex as={StyledActions} container={{ direction: 'column', gap: 0.25, pad: [0.25, 0] }}>\n <Button\n variant='simple'\n as={FeedButton}\n onClick={() => onEditCancel?.(id)}\n icon\n label={t('cancel')}\n >\n <Icon name='times' />\n </Button>\n\n {/* AI Rewrite Button */}\n {onRewriteClick && (\n <Button\n variant='simple'\n disabled={emptyEditText || !!progress}\n as={FeedButton}\n onClick={() => setShowAIPopover(true)}\n icon\n label={t('ai_rewrite_title')}\n ref={setAIButtonEl}\n >\n <Icon name='polaris' />\n </Button>\n )}\n\n <Button\n as={FeedButton}\n disabled={emptyEditText || (!contentModified && !recipientsModified) || !!progress}\n variant='simple'\n onClick={handleEdit}\n icon\n label={t('update')}\n ref={postButtonRef}\n >\n <Icon name='send' />\n </Button>\n </Flex>\n\n {/* AI Rewrite Popover */}\n {aiButtonEl && showAIPopover && onRewriteClick && (\n <AIRewrite\n target={aiButtonEl}\n isGenerating={isGenerating}\n suggestion={hasSuggestionContent ? suggestion : undefined}\n onGenerate={handleGenerate}\n onSubmit={handleApplyRewrite}\n suggestionEditor={\n <FeedRichText\n ref={suggestionRteRef}\n label={t('ai_rewrite_result_label')}\n labelHidden\n disabled={isGenerating || !suggestion?.trim()}\n readOnly={false}\n onChange={() =>\n setHasSuggestionContent(\n (suggestionRteRef.current?.getPlainText() ?? '').trim().length > 0\n )\n }\n />\n }\n onCancel={() => {\n setShowAIPopover(false);\n setSuggestion(undefined);\n setIsGenerating(false);\n aiButtonEl.focus();\n }}\n />\n )}\n </Flex>\n );\n};\n\nexport default FeedEditRegion;\n"]}
@@ -1,7 +1,7 @@
1
1
  import type { FC } from 'react';
2
2
  import type { ForwardProps } from '@pega/cosmos-react-core';
3
3
  import type { FeedInputRegionProps } from './Feed.types';
4
- export declare const StyledActions: import("styled-components").StyledComponent<"div", import("styled-components").DefaultTheme, {}, never>;
4
+ export declare const StyledActions: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, never>> & string;
5
5
  declare const FeedInputRegion: FC<ForwardProps & FeedInputRegionProps>;
6
6
  export default FeedInputRegion;
7
7
  //# sourceMappingURL=FeedInputRegion.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"FeedInputRegion.d.ts","sourceRoot":"","sources":["../../../src/components/Feed/FeedInputRegion.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAA6B,MAAM,OAAO,CAAC;AAgB3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAM5D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAgBzD,eAAO,MAAM,aAAa,yGAIzB,CAAC;AAQF,QAAA,MAAM,eAAe,EAAE,EAAE,CAAC,YAAY,GAAG,oBAAoB,CA8K5D,CAAC;AAEF,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"FeedInputRegion.d.ts","sourceRoot":"","sources":["../../../src/components/Feed/FeedInputRegion.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAA6B,MAAM,OAAO,CAAC;AAmB3D,OAAO,KAAK,EAAY,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAQtE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAgBzD,eAAO,MAAM,aAAa,6NAIzB,CAAC;AAQF,QAAA,MAAM,eAAe,EAAE,EAAE,CAAC,YAAY,GAAG,oBAAoB,CA4U5D,CAAC;AAEF,eAAe,eAAe,CAAC"}
@@ -1,7 +1,8 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
- import { useContext, useRef, useState } from 'react';
2
+ import { useContext, useEffect, useLayoutEffect, useRef, useState } from 'react';
3
3
  import styled, { css } from 'styled-components';
4
- import { Avatar, Button, defaultThemeProp, Flex, Icon, Progress, useAfterInitialEffect, useElement, useI18n, useLiveLog, usePrevious } from '@pega/cosmos-react-core';
4
+ import { AIRewrite, Avatar, Button, defaultThemeProp, Flex, getActiveElement, Icon, isInstance, Progress, useAfterInitialEffect, useElement, useI18n, useLiveLog, usePrevious } from '@pega/cosmos-react-core';
5
+ import { extractMentions, restoreMentionPlaceholders } from '@pega/cosmos-react-rte';
5
6
  import { FeedContext } from './Feed.context';
6
7
  import FeedAttachments from './FeedAttachments';
7
8
  import FeedButton from './FeedButton';
@@ -27,15 +28,37 @@ const HiddenFileInput = styled.input `
27
28
  display: none;
28
29
  `;
29
30
  const FeedInputRegion = (props) => {
30
- const { variant, id, banners, progress, attachments = [], onFilesAdded, onSubmit, rteRef, recipients, postType, postTypeMenu, visibility, visibilityControl } = props;
31
+ const { defaultValue, variant, id, banners, progress, onRewriteClick, attachments = [], onFilesAdded, onSubmit, rteRef, recipients, postType, postTypeMenu, visibility, visibilityControl, onUnmount } = props;
31
32
  const t = useI18n();
32
33
  const { announcePolite } = useLiveLog();
33
34
  const { setShowSearchResults } = useContext(FeedContext);
34
35
  const { avatarSrc, fullname, username, userStatus } = useContext(FeedContext).userInfo;
35
36
  const [emptyText, setEmptyText] = useState(true);
36
37
  const [attachmentEl, setAttachmentEl] = useElement();
38
+ const [aiButtonEl, setAIButtonEl] = useElement();
39
+ const [showAIPopover, setShowAIPopover] = useState(false);
40
+ const [isGenerating, setIsGenerating] = useState(false);
41
+ const [suggestion, setSuggestion] = useState(undefined);
42
+ const [hasSuggestionContent, setHasSuggestionContent] = useState(false);
43
+ const suggestionRteRef = useRef(null);
44
+ // Sync AI-generated suggestion into the suggestion FeedRichText whenever it changes
45
+ useEffect(() => {
46
+ if (suggestion !== undefined) {
47
+ suggestionRteRef.current?.clear();
48
+ suggestionRteRef.current?.insertMarkdown?.(suggestion);
49
+ setHasSuggestionContent(true);
50
+ }
51
+ else {
52
+ suggestionRteRef.current?.clear();
53
+ setHasSuggestionContent(false);
54
+ }
55
+ }, [suggestion]);
37
56
  const prevAttachments = usePrevious(attachments);
38
57
  const suppressNextAnnouncement = useRef(false);
58
+ const postButtonRef = useRef(null);
59
+ const isSubmitButtonClicked = useRef(false);
60
+ const previouslyFocusedElementRef = useRef(null);
61
+ const valueRef = useRef(defaultValue ?? '');
39
62
  const handleSubmit = () => {
40
63
  setShowSearchResults?.(false);
41
64
  if ((!emptyText || attachments.length > 0) && attachments.every(x => !x.error)) {
@@ -48,18 +71,73 @@ const FeedInputRegion = (props) => {
48
71
  visibility,
49
72
  recipients: variant === 'post' ? recipients : undefined,
50
73
  clear: () => {
74
+ // Clear the RTE content and reset focus state
51
75
  rteRef.current?.clear();
76
+ rteRef.current?.focus();
77
+ isSubmitButtonClicked.current = false;
52
78
  }
53
79
  });
54
80
  suppressNextAnnouncement.current = true;
81
+ isSubmitButtonClicked.current = true;
55
82
  }
56
83
  };
84
+ const handleGenerate = (rewriteAction, additionalInstructions) => {
85
+ const originalContent = rteRef.current?.getPlainText() || '';
86
+ if (!originalContent)
87
+ return;
88
+ const { cleanText, mentionMap, userPlaceholders } = extractMentions(originalContent);
89
+ // Capture in closure so concurrent Generate calls don't corrupt each other's restore map
90
+ const capturedMentionMap = mentionMap;
91
+ const capturedUserPlaceholders = userPlaceholders;
92
+ setIsGenerating(true);
93
+ setSuggestion(undefined);
94
+ onRewriteClick?.(cleanText, rewriteAction, additionalInstructions, (rewrittenText) => {
95
+ const restoredText = restoreMentionPlaceholders(rewrittenText, capturedMentionMap, capturedUserPlaceholders);
96
+ setIsGenerating(false);
97
+ setSuggestion(restoredText.trim() ? restoredText : undefined);
98
+ }, false);
99
+ };
100
+ const handleApplyRewrite = () => {
101
+ const editedText = suggestionRteRef.current?.getPlainText() ?? suggestion ?? '';
102
+ rteRef.current?.insertMarkdown?.(editedText);
103
+ valueRef.current = editedText;
104
+ // Manually update state since programmatic updates might not trigger onChange
105
+ setEmptyText(editedText.trim() === '');
106
+ // Close popover and reset AI state
107
+ setShowAIPopover(false);
108
+ setSuggestion(undefined);
109
+ // Return focus to RTE
110
+ rteRef.current?.focus();
111
+ };
112
+ // If the API call fails, progress will flip back to false without calling the success callback
113
+ // Clear the loading state so the Generate button re-enables
114
+ useAfterInitialEffect(() => {
115
+ if (!progress)
116
+ setIsGenerating(false);
117
+ }, [progress]);
57
118
  const onKeyDown = (event) => {
58
119
  if ((event.metaKey || event.ctrlKey) && event.key === 'Enter')
59
120
  handleSubmit();
60
121
  };
61
122
  const inputLabel = postType?.label || t(variant === 'post' ? 'feed_new_post' : 'feed_new_comment');
62
123
  const submitLabel = t(variant === 'post' ? 'feed_new_post_submit' : 'feed_new_comment_submit');
124
+ // Using layout effect to capture the focused element prior to editor taking focus.
125
+ useLayoutEffect(() => {
126
+ previouslyFocusedElementRef.current = getActiveElement();
127
+ return () => {
128
+ // For reply variant, restore focus to the element that was previously focused
129
+ const el = previouslyFocusedElementRef.current;
130
+ if (variant === 'reply' && isInstance(el, HTMLElement) && el.isConnected) {
131
+ el.focus();
132
+ }
133
+ };
134
+ }, []);
135
+ useEffect(() => {
136
+ if (banners && isSubmitButtonClicked.current && postButtonRef.current) {
137
+ postButtonRef.current.focus();
138
+ isSubmitButtonClicked.current = false;
139
+ }
140
+ }, [banners]);
63
141
  useAfterInitialEffect(() => {
64
142
  if (!prevAttachments)
65
143
  return;
@@ -74,18 +152,24 @@ const FeedInputRegion = (props) => {
74
152
  }
75
153
  suppressNextAnnouncement.current = false;
76
154
  }, [attachments.length]);
155
+ useEffect(() => {
156
+ return () => {
157
+ onUnmount?.(valueRef.current);
158
+ };
159
+ }, []);
77
160
  return (_jsxs(_Fragment, { children: [_jsxs(Flex, { container: { alignItems: 'start' }, children: [_jsx(StyledAvatar, { name: fullname, size: variant === 'post' ? 'l' : 'm', imageSrc: avatarSrc, status: userStatus }), _jsxs(Flex, { as: StyledContent, container: {
78
161
  direction: 'column',
79
162
  gap: variant === 'post' ? 0.5 : 0,
80
163
  pad: [0.5, 0.5, 0.5, 1]
81
- }, inert: progress ? '' : undefined, children: [(!!visibilityControl || !!banners) && postTypeMenu, banners, visibilityControl, _jsx(FeedRichText, { label: !!postTypeMenu && !visibilityControl && !banners ? postTypeMenu : inputLabel, onChange: () => {
164
+ }, inert: progress ? '' : undefined, children: [(!!visibilityControl || !!banners) && postTypeMenu, banners, visibilityControl, _jsx(FeedRichText, { defaultValue: defaultValue, label: !!postTypeMenu && !visibilityControl && !banners ? postTypeMenu : inputLabel, onChange: () => {
82
165
  setEmptyText(rteRef.current?.getPlainText().trim() === '');
166
+ valueRef.current = rteRef.current?.getPlainText() ?? '';
83
167
  }, onKeyDown: onKeyDown, ref: rteRef }), _jsx(Progress, { visible: !!progress, focusOnVisible: true, placement: 'local', message: typeof progress === 'string' ? progress : undefined })] }), _jsxs(Flex, { as: StyledActions, container: { direction: 'column', gap: 0.25, pad: [0.75, 0, 0.75, 0.5] }, item: { alignSelf: 'end' }, children: [onFilesAdded && (_jsx(Button, { variant: 'simple', disabled: !!progress, as: FeedButton, onClick: () => {
84
168
  setShowSearchResults?.(false);
85
169
  attachmentEl?.click();
86
- }, icon: true, label: t('feed_attach_files'), children: _jsx(Icon, { name: 'paper-clip' }) })), !progress && (_jsx(Button, { as: FeedButton, disabled: (emptyText && attachments.length === 0) ||
170
+ }, icon: true, label: t('feed_attach_files'), children: _jsx(Icon, { name: 'paper-clip' }) })), onRewriteClick && (_jsx(Button, { variant: 'simple', disabled: emptyText || !!progress, as: FeedButton, onClick: () => setShowAIPopover(true), icon: true, label: t('ai_rewrite_title'), ref: setAIButtonEl, children: _jsx(Icon, { name: 'polaris' }) })), !progress && (_jsx(Button, { as: FeedButton, disabled: (emptyText && attachments.length === 0) ||
87
171
  attachments.some(x => x.error) ||
88
- !!progress, variant: 'simple', onClick: handleSubmit, icon: true, label: submitLabel, children: _jsx(Icon, { name: 'send' }) }))] }), _jsx(HiddenFileInput, { ref: setAttachmentEl, type: 'file', multiple: true, tabIndex: -1, onChange: () => {
172
+ !!progress, variant: 'simple', onClick: handleSubmit, icon: true, label: submitLabel, ref: postButtonRef, children: _jsx(Icon, { name: 'send' }) }))] }), _jsx(HiddenFileInput, { ref: setAttachmentEl, type: 'file', multiple: true, tabIndex: -1, onChange: () => {
89
173
  if (attachmentEl?.files) {
90
174
  onFilesAdded?.(Array.from(attachmentEl?.files));
91
175
  }
@@ -93,7 +177,12 @@ const FeedInputRegion = (props) => {
93
177
  // Must trick input to believe there is no value when activated so that the same file may be added consecutively.
94
178
  onClick: (event) => {
95
179
  event.target.value = '';
96
- } })] }), _jsx(FeedAttachments, { variant: variant, attachments: attachments, disabled: !!progress })] }));
180
+ } })] }), _jsx(FeedAttachments, { variant: variant, attachments: attachments, disabled: !!progress }), aiButtonEl && showAIPopover && onRewriteClick && (_jsx(AIRewrite, { target: aiButtonEl, isGenerating: isGenerating, suggestion: hasSuggestionContent ? suggestion : undefined, onGenerate: handleGenerate, onSubmit: handleApplyRewrite, suggestionEditor: _jsx(FeedRichText, { ref: suggestionRteRef, label: t('ai_rewrite_result_label'), labelHidden: true, disabled: isGenerating || !suggestion?.trim(), readOnly: false, onChange: () => setHasSuggestionContent((suggestionRteRef.current?.getPlainText() ?? '').trim().length > 0) }), onCancel: () => {
181
+ setShowAIPopover(false);
182
+ setSuggestion(undefined);
183
+ setIsGenerating(false);
184
+ aiButtonEl.focus();
185
+ } }))] }));
97
186
  };
98
187
  export default FeedInputRegion;
99
188
  //# sourceMappingURL=FeedInputRegion.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FeedInputRegion.js","sourceRoot":"","sources":["../../../src/components/Feed/FeedInputRegion.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useContext, useRef, useState } from 'react';\nimport type { FC, KeyboardEvent, MouseEvent } from 'react';\nimport styled, { css } from 'styled-components';\n\nimport {\n Avatar,\n Button,\n defaultThemeProp,\n Flex,\n Icon,\n Progress,\n useAfterInitialEffect,\n useElement,\n useI18n,\n useLiveLog,\n usePrevious\n} from '@pega/cosmos-react-core';\nimport type { ForwardProps } from '@pega/cosmos-react-core';\n\nimport { FeedContext } from './Feed.context';\nimport FeedAttachments from './FeedAttachments';\nimport FeedButton from './FeedButton';\nimport FeedRichText from './FeedRichText';\nimport type { FeedInputRegionProps } from './Feed.types';\n\nconst StyledAvatar = styled(Avatar)(({ theme }) => {\n return css`\n margin-block-start: calc(0.5 * ${theme.base.spacing});\n `;\n});\n\nStyledAvatar.defaultProps = defaultThemeProp;\n\nconst StyledContent = styled.div`\n width: 100%;\n overflow-y: hidden;\n position: relative;\n`;\n\nexport const StyledActions = styled.div`\n ${FeedButton} + ${FeedButton} {\n margin-inline-start: 0;\n }\n`;\n\nStyledActions.defaultProps = defaultThemeProp;\n\nconst HiddenFileInput = styled.input`\n display: none;\n`;\n\nconst FeedInputRegion: FC<ForwardProps & FeedInputRegionProps> = (\n props: ForwardProps & FeedInputRegionProps\n) => {\n const {\n variant,\n id,\n banners,\n progress,\n attachments = [],\n onFilesAdded,\n onSubmit,\n rteRef,\n recipients,\n postType,\n postTypeMenu,\n visibility,\n visibilityControl\n } = props;\n\n const t = useI18n();\n const { announcePolite } = useLiveLog();\n const { setShowSearchResults } = useContext(FeedContext);\n const { avatarSrc, fullname, username, userStatus } = useContext(FeedContext).userInfo;\n\n const [emptyText, setEmptyText] = useState(true);\n const [attachmentEl, setAttachmentEl] = useElement<HTMLInputElement>();\n const prevAttachments = usePrevious(attachments);\n const suppressNextAnnouncement = useRef(false);\n\n const handleSubmit = () => {\n setShowSearchResults?.(false);\n if ((!emptyText || attachments.length > 0) && attachments.every(x => !x.error)) {\n onSubmit({\n id,\n value: rteRef.current?.getPlainText() || '',\n attachments: attachments || [],\n username,\n postType,\n visibility,\n recipients: variant === 'post' ? recipients : undefined,\n clear: () => {\n rteRef.current?.clear();\n }\n });\n suppressNextAnnouncement.current = true;\n }\n };\n\n const onKeyDown = (event: KeyboardEvent) => {\n if ((event.metaKey || event.ctrlKey) && event.key === 'Enter') handleSubmit();\n };\n\n const inputLabel =\n postType?.label || t(variant === 'post' ? 'feed_new_post' : 'feed_new_comment');\n const submitLabel = t(variant === 'post' ? 'feed_new_post_submit' : 'feed_new_comment_submit');\n\n useAfterInitialEffect(() => {\n if (!prevAttachments) return;\n\n if (prevAttachments.length !== attachments.length && !suppressNextAnnouncement.current) {\n const difference = attachments.length - prevAttachments.length;\n const absoluteDifference = Math.abs(difference);\n announcePolite({\n message: t(\n `feed_attachments_${difference > 0 ? 'added' : 'removed'}`,\n [absoluteDifference],\n {\n count: absoluteDifference\n }\n )\n });\n }\n suppressNextAnnouncement.current = false;\n }, [attachments.length]);\n\n return (\n <>\n <Flex container={{ alignItems: 'start' }}>\n <StyledAvatar\n name={fullname}\n size={variant === 'post' ? 'l' : 'm'}\n imageSrc={avatarSrc}\n status={userStatus}\n />\n\n <Flex\n as={StyledContent}\n container={{\n direction: 'column',\n gap: variant === 'post' ? 0.5 : 0,\n pad: [0.5, 0.5, 0.5, 1]\n }}\n inert={progress ? '' : undefined}\n >\n {(!!visibilityControl || !!banners) && postTypeMenu}\n {banners}\n {visibilityControl}\n\n <FeedRichText\n label={!!postTypeMenu && !visibilityControl && !banners ? postTypeMenu : inputLabel}\n onChange={() => {\n setEmptyText(rteRef.current?.getPlainText().trim() === '');\n }}\n onKeyDown={onKeyDown}\n ref={rteRef}\n />\n\n <Progress\n visible={!!progress}\n focusOnVisible\n placement='local'\n message={typeof progress === 'string' ? progress : undefined}\n />\n </Flex>\n\n <Flex\n as={StyledActions}\n container={{ direction: 'column', gap: 0.25, pad: [0.75, 0, 0.75, 0.5] }}\n item={{ alignSelf: 'end' }}\n >\n {onFilesAdded && (\n <Button\n variant='simple'\n disabled={!!progress}\n as={FeedButton}\n onClick={() => {\n setShowSearchResults?.(false);\n attachmentEl?.click();\n }}\n icon\n label={t('feed_attach_files')}\n >\n <Icon name='paper-clip' />\n </Button>\n )}\n\n {!progress && (\n <Button\n as={FeedButton}\n disabled={\n (emptyText && attachments.length === 0) ||\n attachments.some(x => x.error) ||\n !!progress\n }\n variant='simple'\n onClick={handleSubmit}\n icon\n label={submitLabel}\n >\n <Icon name='send' />\n </Button>\n )}\n </Flex>\n\n <HiddenFileInput\n ref={setAttachmentEl}\n type='file'\n multiple\n tabIndex={-1}\n onChange={() => {\n if (attachmentEl?.files) {\n onFilesAdded?.(Array.from(attachmentEl?.files));\n }\n }}\n // Must trick input to believe there is no value when activated so that the same file may be added consecutively.\n onClick={(event: MouseEvent) => {\n (event.target as HTMLInputElement).value = '';\n }}\n />\n </Flex>\n\n <FeedAttachments variant={variant} attachments={attachments} disabled={!!progress} />\n </>\n );\n};\n\nexport default FeedInputRegion;\n"]}
1
+ {"version":3,"file":"FeedInputRegion.js","sourceRoot":"","sources":["../../../src/components/Feed/FeedInputRegion.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useContext, useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport type { FC, KeyboardEvent, MouseEvent } from 'react';\nimport styled, { css } from 'styled-components';\n\nimport {\n AIRewrite,\n Avatar,\n Button,\n defaultThemeProp,\n Flex,\n getActiveElement,\n Icon,\n isInstance,\n Progress,\n useAfterInitialEffect,\n useElement,\n useI18n,\n useLiveLog,\n usePrevious\n} from '@pega/cosmos-react-core';\nimport type { AIAction, ForwardProps } from '@pega/cosmos-react-core';\nimport { extractMentions, restoreMentionPlaceholders } from '@pega/cosmos-react-rte';\nimport type { RichTextEditorState } from '@pega/cosmos-react-rte';\n\nimport { FeedContext } from './Feed.context';\nimport FeedAttachments from './FeedAttachments';\nimport FeedButton from './FeedButton';\nimport FeedRichText from './FeedRichText';\nimport type { FeedInputRegionProps } from './Feed.types';\n\nconst StyledAvatar = styled(Avatar)(({ theme }) => {\n return css`\n margin-block-start: calc(0.5 * ${theme.base.spacing});\n `;\n});\n\nStyledAvatar.defaultProps = defaultThemeProp;\n\nconst StyledContent = styled.div`\n width: 100%;\n overflow-y: hidden;\n position: relative;\n`;\n\nexport const StyledActions = styled.div`\n ${FeedButton} + ${FeedButton} {\n margin-inline-start: 0;\n }\n`;\n\nStyledActions.defaultProps = defaultThemeProp;\n\nconst HiddenFileInput = styled.input`\n display: none;\n`;\n\nconst FeedInputRegion: FC<ForwardProps & FeedInputRegionProps> = (\n props: ForwardProps & FeedInputRegionProps\n) => {\n const {\n defaultValue,\n variant,\n id,\n banners,\n progress,\n onRewriteClick,\n attachments = [],\n onFilesAdded,\n onSubmit,\n rteRef,\n recipients,\n postType,\n postTypeMenu,\n visibility,\n visibilityControl,\n onUnmount\n } = props;\n\n const t = useI18n();\n const { announcePolite } = useLiveLog();\n const { setShowSearchResults } = useContext(FeedContext);\n const { avatarSrc, fullname, username, userStatus } = useContext(FeedContext).userInfo;\n\n const [emptyText, setEmptyText] = useState(true);\n const [attachmentEl, setAttachmentEl] = useElement<HTMLInputElement>();\n const [aiButtonEl, setAIButtonEl] = useElement<HTMLButtonElement>();\n const [showAIPopover, setShowAIPopover] = useState(false);\n const [isGenerating, setIsGenerating] = useState(false);\n const [suggestion, setSuggestion] = useState<string | undefined>(undefined);\n const [hasSuggestionContent, setHasSuggestionContent] = useState(false);\n const suggestionRteRef = useRef<RichTextEditorState>(null);\n\n // Sync AI-generated suggestion into the suggestion FeedRichText whenever it changes\n useEffect(() => {\n if (suggestion !== undefined) {\n suggestionRteRef.current?.clear();\n suggestionRteRef.current?.insertMarkdown?.(suggestion);\n setHasSuggestionContent(true);\n } else {\n suggestionRteRef.current?.clear();\n setHasSuggestionContent(false);\n }\n }, [suggestion]);\n const prevAttachments = usePrevious(attachments);\n const suppressNextAnnouncement = useRef(false);\n const postButtonRef = useRef<HTMLButtonElement>(null);\n const isSubmitButtonClicked = useRef(false);\n const previouslyFocusedElementRef = useRef<Element | null>(null);\n const valueRef = useRef(defaultValue ?? '');\n\n const handleSubmit = () => {\n setShowSearchResults?.(false);\n\n if ((!emptyText || attachments.length > 0) && attachments.every(x => !x.error)) {\n onSubmit({\n id,\n value: rteRef.current?.getPlainText() || '',\n attachments: attachments || [],\n username,\n postType,\n visibility,\n recipients: variant === 'post' ? recipients : undefined,\n clear: () => {\n // Clear the RTE content and reset focus state\n rteRef.current?.clear();\n rteRef.current?.focus();\n isSubmitButtonClicked.current = false;\n }\n });\n suppressNextAnnouncement.current = true;\n isSubmitButtonClicked.current = true;\n }\n };\n\n const handleGenerate = (rewriteAction: AIAction, additionalInstructions: string) => {\n const originalContent = rteRef.current?.getPlainText() || '';\n if (!originalContent) return;\n\n const { cleanText, mentionMap, userPlaceholders } = extractMentions(originalContent);\n\n // Capture in closure so concurrent Generate calls don't corrupt each other's restore map\n const capturedMentionMap = mentionMap;\n const capturedUserPlaceholders = userPlaceholders;\n\n setIsGenerating(true);\n setSuggestion(undefined);\n\n onRewriteClick?.(\n cleanText,\n rewriteAction,\n additionalInstructions,\n (rewrittenText: string) => {\n const restoredText = restoreMentionPlaceholders(\n rewrittenText,\n capturedMentionMap,\n capturedUserPlaceholders\n );\n setIsGenerating(false);\n setSuggestion(restoredText.trim() ? restoredText : undefined);\n },\n false\n );\n };\n\n const handleApplyRewrite = () => {\n const editedText = suggestionRteRef.current?.getPlainText() ?? suggestion ?? '';\n rteRef.current?.insertMarkdown?.(editedText);\n valueRef.current = editedText;\n\n // Manually update state since programmatic updates might not trigger onChange\n setEmptyText(editedText.trim() === '');\n\n // Close popover and reset AI state\n setShowAIPopover(false);\n setSuggestion(undefined);\n\n // Return focus to RTE\n rteRef.current?.focus();\n };\n\n // If the API call fails, progress will flip back to false without calling the success callback\n // Clear the loading state so the Generate button re-enables\n useAfterInitialEffect(() => {\n if (!progress) setIsGenerating(false);\n }, [progress]);\n\n const onKeyDown = (event: KeyboardEvent) => {\n if ((event.metaKey || event.ctrlKey) && event.key === 'Enter') handleSubmit();\n };\n\n const inputLabel =\n postType?.label || t(variant === 'post' ? 'feed_new_post' : 'feed_new_comment');\n const submitLabel = t(variant === 'post' ? 'feed_new_post_submit' : 'feed_new_comment_submit');\n\n // Using layout effect to capture the focused element prior to editor taking focus.\n useLayoutEffect(() => {\n previouslyFocusedElementRef.current = getActiveElement();\n\n return () => {\n // For reply variant, restore focus to the element that was previously focused\n\n const el = previouslyFocusedElementRef.current;\n if (variant === 'reply' && isInstance(el, HTMLElement) && el.isConnected) {\n el.focus();\n }\n };\n }, []);\n\n useEffect(() => {\n if (banners && isSubmitButtonClicked.current && postButtonRef.current) {\n postButtonRef.current.focus();\n isSubmitButtonClicked.current = false;\n }\n }, [banners]);\n\n useAfterInitialEffect(() => {\n if (!prevAttachments) return;\n\n if (prevAttachments.length !== attachments.length && !suppressNextAnnouncement.current) {\n const difference = attachments.length - prevAttachments.length;\n const absoluteDifference = Math.abs(difference);\n announcePolite({\n message: t(\n `feed_attachments_${difference > 0 ? 'added' : 'removed'}`,\n [absoluteDifference],\n {\n count: absoluteDifference\n }\n )\n });\n }\n suppressNextAnnouncement.current = false;\n }, [attachments.length]);\n\n useEffect(() => {\n return () => {\n onUnmount?.(valueRef.current);\n };\n }, []);\n\n return (\n <>\n <Flex container={{ alignItems: 'start' }}>\n <StyledAvatar\n name={fullname}\n size={variant === 'post' ? 'l' : 'm'}\n imageSrc={avatarSrc}\n status={userStatus}\n />\n\n <Flex\n as={StyledContent}\n container={{\n direction: 'column',\n gap: variant === 'post' ? 0.5 : 0,\n pad: [0.5, 0.5, 0.5, 1]\n }}\n inert={progress ? '' : undefined}\n >\n {(!!visibilityControl || !!banners) && postTypeMenu}\n {banners}\n {visibilityControl}\n\n <FeedRichText\n defaultValue={defaultValue}\n label={!!postTypeMenu && !visibilityControl && !banners ? postTypeMenu : inputLabel}\n onChange={() => {\n setEmptyText(rteRef.current?.getPlainText().trim() === '');\n valueRef.current = rteRef.current?.getPlainText() ?? '';\n }}\n onKeyDown={onKeyDown}\n ref={rteRef}\n />\n\n <Progress\n visible={!!progress}\n focusOnVisible\n placement='local'\n message={typeof progress === 'string' ? progress : undefined}\n />\n </Flex>\n\n <Flex\n as={StyledActions}\n container={{ direction: 'column', gap: 0.25, pad: [0.75, 0, 0.75, 0.5] }}\n item={{ alignSelf: 'end' }}\n >\n {onFilesAdded && (\n <Button\n variant='simple'\n disabled={!!progress}\n as={FeedButton}\n onClick={() => {\n setShowSearchResults?.(false);\n attachmentEl?.click();\n }}\n icon\n label={t('feed_attach_files')}\n >\n <Icon name='paper-clip' />\n </Button>\n )}\n\n {/* AI Rewrite Button */}\n {onRewriteClick && (\n <Button\n variant='simple'\n disabled={emptyText || !!progress}\n as={FeedButton}\n onClick={() => setShowAIPopover(true)}\n icon\n label={t('ai_rewrite_title')}\n ref={setAIButtonEl}\n >\n <Icon name='polaris' />\n </Button>\n )}\n\n {!progress && (\n <Button\n as={FeedButton}\n disabled={\n (emptyText && attachments.length === 0) ||\n attachments.some(x => x.error) ||\n !!progress\n }\n variant='simple'\n onClick={handleSubmit}\n icon\n label={submitLabel}\n ref={postButtonRef}\n >\n <Icon name='send' />\n </Button>\n )}\n </Flex>\n\n <HiddenFileInput\n ref={setAttachmentEl}\n type='file'\n multiple\n tabIndex={-1}\n onChange={() => {\n if (attachmentEl?.files) {\n onFilesAdded?.(Array.from(attachmentEl?.files));\n }\n }}\n // Must trick input to believe there is no value when activated so that the same file may be added consecutively.\n onClick={(event: MouseEvent) => {\n (event.target as HTMLInputElement).value = '';\n }}\n />\n </Flex>\n\n <FeedAttachments variant={variant} attachments={attachments} disabled={!!progress} />\n\n {/* AI Rewrite Popover */}\n {aiButtonEl && showAIPopover && onRewriteClick && (\n <AIRewrite\n target={aiButtonEl}\n isGenerating={isGenerating}\n suggestion={hasSuggestionContent ? suggestion : undefined}\n onGenerate={handleGenerate}\n onSubmit={handleApplyRewrite}\n suggestionEditor={\n <FeedRichText\n ref={suggestionRteRef}\n label={t('ai_rewrite_result_label')}\n labelHidden\n disabled={isGenerating || !suggestion?.trim()}\n readOnly={false}\n onChange={() =>\n setHasSuggestionContent(\n (suggestionRteRef.current?.getPlainText() ?? '').trim().length > 0\n )\n }\n />\n }\n onCancel={() => {\n setShowAIPopover(false);\n setSuggestion(undefined);\n setIsGenerating(false);\n aiButtonEl.focus();\n }}\n />\n )}\n </>\n );\n};\n\nexport default FeedInputRegion;\n"]}
@@ -15,7 +15,7 @@ const InlineBareButton = styled(BareRoleButton)(({ theme }) => {
15
15
  border-radius: calc(${theme.base['border-radius']} * 9999);
16
16
 
17
17
  &:hover {
18
- ::before {
18
+ &::before {
19
19
  content: '';
20
20
  position: absolute;
21
21
  top: calc(${theme.components.button['border-width']} * -1);
@@ -1 +1 @@
1
- {"version":3,"file":"FeedLikeButton.js","sourceRoot":"","sources":["../../../src/components/Feed/FeedLikeButton.tsx"],"names":[],"mappings":"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","sourcesContent":["import { forwardRef, useContext, useMemo, useRef, useEffect } from 'react';\nimport type { FC, Ref } from 'react';\nimport styled, { css } from 'styled-components';\n\nimport {\n Button,\n Icon,\n Avatar,\n Count,\n Tooltip,\n useModalManager,\n useI18n,\n useConfiguration,\n useElement,\n formatListToLocaleString,\n Flex,\n defaultThemeProp,\n useUID\n} from '@pega/cosmos-react-core';\nimport type { ForwardProps, ModalMethods } from '@pega/cosmos-react-core';\nimport BareRoleButton from '@pega/cosmos-react-core/lib/components/Button/BareRoleButton';\n\nimport { FeedContext } from './Feed.context';\nimport FeedButton from './FeedButton';\nimport FeedModalList from './FeedModalList';\nimport type { FeedPostBaseProps, FeedModalListProps } from './Feed.types';\n\nconst InlineBareButton = styled(BareRoleButton)(({ theme }) => {\n return css`\n position: relative;\n display: inline-block;\n line-height: 1;\n outline: none;\n border-radius: calc(${theme.base['border-radius']} * 9999);\n\n &:hover {\n ::before {\n content: '';\n position: absolute;\n top: calc(${theme.components.button['border-width']} * -1);\n bottom: calc(${theme.components.button['border-width']} * -1);\n left: calc(${theme.components.button['border-width']} * -1);\n right: calc(${theme.components.button['border-width']} * -1);\n border-radius: inherit;\n background-color: currentColor;\n opacity: 0.15;\n }\n }\n\n &:focus {\n box-shadow: ${theme.components.button['focus-shadow']};\n }\n `;\n});\n\nInlineBareButton.defaultProps = defaultThemeProp;\n\ntype FeedLikeButtonProps = Pick<\n FeedPostBaseProps,\n | 'id'\n | 'liked'\n | 'likeCount'\n | 'likes'\n | 'onLikeClick'\n | 'onLikeCountInteraction'\n | 'onLoadMoreLikes'\n | 'likesLoading'\n>;\n\nconst FeedLikeButton: FC<FeedLikeButtonProps & ForwardProps> = forwardRef(function FeedLikeButton(\n props,\n ref: Ref<HTMLButtonElement>\n) {\n const {\n id,\n liked,\n likeCount = 0,\n likes = [],\n onLikeClick,\n onLikeCountInteraction,\n onLoadMoreLikes,\n likesLoading\n } = props;\n const t = useI18n();\n const { locale } = useConfiguration();\n const { create } = useModalManager();\n const { userInfo: loggedInUser } = useContext(FeedContext);\n const [countEl, setCountEl] = useElement(null);\n const likesModalRef = useRef<ModalMethods<FeedModalListProps>>();\n const likeCountId = useUID();\n\n useEffect(() => {\n likesModalRef.current?.update({\n count: likeCount,\n heading: t('feed_liked_by'),\n listItems: likes,\n onLoadMore: onLoadMoreLikes,\n loading: likesLoading\n });\n }, [likeCount, likes, onLoadMoreLikes, likesLoading]);\n\n const likesAttributes = useMemo(() => {\n const likesList = likes.map(x => x.primary.toString());\n return {\n ariaLabel: likeCount\n ? `${t('feed_liked_by')} ${formatListToLocaleString(likesList, t, locale, {\n count: likeCount\n })}`\n : t('feed_post_likes', [likeCount], { count: likeCount }),\n label: formatListToLocaleString(likesList, t, locale, {\n count: likeCount,\n separator: '\\n'\n })\n };\n }, [likes, likeCount]);\n\n const onLikeCountClick = () => {\n if (likes.length) {\n likesModalRef.current = create(FeedModalList, {\n count: likeCount,\n heading: t('feed_liked_by'),\n listItems: likes,\n onLoadMore: onLoadMoreLikes,\n loading: likesLoading\n });\n } else {\n onLikeCountInteraction?.();\n }\n };\n\n return (\n <Flex container={{ gap: 0.5, alignItems: 'center' }}>\n <Button\n variant='simple'\n icon\n compact\n as={FeedButton}\n onClick={() => {\n const user = {\n id: loggedInUser.username,\n primary: loggedInUser.fullname,\n secondary: loggedInUser.meta,\n visual: (\n <Avatar size='m' imageSrc={loggedInUser.avatarSrc} name={loggedInUser.fullname} />\n )\n };\n onLikeClick({\n id,\n user\n });\n }}\n emphasized={liked}\n label={liked ? t('feed_unlike_label') : t('feed_like_label')}\n aria-describedby={likeCount > 0 ? likeCountId : undefined}\n ref={ref}\n >\n <Icon name={liked ? 'thumbs-up-solid' : 'thumbs-up'} />\n </Button>\n {likeCount > 0 && (\n <>\n <InlineBareButton\n ref={setCountEl}\n role={likes.length ? 'button' : undefined}\n onClick={onLikeCountClick}\n onFocus={onLikeCountInteraction}\n onMouseOver={onLikeCountInteraction}\n aria-label={likesAttributes.ariaLabel}\n tabIndex={0}\n >\n <Count\n id={likeCountId}\n aria-label={t('feed_post_likes', [likeCount], { count: likeCount })}\n >\n {likeCount}\n </Count>\n </InlineBareButton>\n <Tooltip target={countEl} showDelay='none' hideDelay='none' describeTarget={false}>\n {likesAttributes.label || t('feed_post_likes', [likeCount], { count: likeCount })}\n </Tooltip>\n </>\n )}\n </Flex>\n );\n});\n\nexport default FeedLikeButton;\n"]}
1
+ {"version":3,"file":"FeedLikeButton.js","sourceRoot":"","sources":["../../../src/components/Feed/FeedLikeButton.tsx"],"names":[],"mappings":"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","sourcesContent":["import { forwardRef, useContext, useMemo, useRef, useEffect } from 'react';\nimport type { FC, Ref } from 'react';\nimport styled, { css } from 'styled-components';\n\nimport {\n Button,\n Icon,\n Avatar,\n Count,\n Tooltip,\n useModalManager,\n useI18n,\n useConfiguration,\n useElement,\n formatListToLocaleString,\n Flex,\n defaultThemeProp,\n useUID\n} from '@pega/cosmos-react-core';\nimport type { ForwardProps, ModalMethods } from '@pega/cosmos-react-core';\nimport BareRoleButton from '@pega/cosmos-react-core/lib/components/Button/BareRoleButton';\n\nimport { FeedContext } from './Feed.context';\nimport FeedButton from './FeedButton';\nimport FeedModalList from './FeedModalList';\nimport type { FeedPostBaseProps, FeedModalListProps } from './Feed.types';\n\nconst InlineBareButton = styled(BareRoleButton)(({ theme }) => {\n return css`\n position: relative;\n display: inline-block;\n line-height: 1;\n outline: none;\n border-radius: calc(${theme.base['border-radius']} * 9999);\n\n &:hover {\n &::before {\n content: '';\n position: absolute;\n top: calc(${theme.components.button['border-width']} * -1);\n bottom: calc(${theme.components.button['border-width']} * -1);\n left: calc(${theme.components.button['border-width']} * -1);\n right: calc(${theme.components.button['border-width']} * -1);\n border-radius: inherit;\n background-color: currentColor;\n opacity: 0.15;\n }\n }\n\n &:focus {\n box-shadow: ${theme.components.button['focus-shadow']};\n }\n `;\n});\n\nInlineBareButton.defaultProps = defaultThemeProp;\n\ntype FeedLikeButtonProps = Pick<\n FeedPostBaseProps,\n | 'id'\n | 'liked'\n | 'likeCount'\n | 'likes'\n | 'onLikeClick'\n | 'onLikeCountInteraction'\n | 'onLoadMoreLikes'\n | 'likesLoading'\n>;\n\nconst FeedLikeButton: FC<FeedLikeButtonProps & ForwardProps> = forwardRef(function FeedLikeButton(\n props,\n ref: Ref<HTMLButtonElement>\n) {\n const {\n id,\n liked,\n likeCount = 0,\n likes = [],\n onLikeClick,\n onLikeCountInteraction,\n onLoadMoreLikes,\n likesLoading\n } = props;\n const t = useI18n();\n const { locale } = useConfiguration();\n const { create } = useModalManager();\n const { userInfo: loggedInUser } = useContext(FeedContext);\n const [countEl, setCountEl] = useElement(null);\n const likesModalRef = useRef<ModalMethods<FeedModalListProps>>();\n const likeCountId = useUID();\n\n useEffect(() => {\n likesModalRef.current?.update({\n count: likeCount,\n heading: t('feed_liked_by'),\n listItems: likes,\n onLoadMore: onLoadMoreLikes,\n loading: likesLoading\n });\n }, [likeCount, likes, onLoadMoreLikes, likesLoading]);\n\n const likesAttributes = useMemo(() => {\n const likesList = likes.map(x => x.primary.toString());\n return {\n ariaLabel: likeCount\n ? `${t('feed_liked_by')} ${formatListToLocaleString(likesList, t, locale, {\n count: likeCount\n })}`\n : t('feed_post_likes', [likeCount], { count: likeCount }),\n label: formatListToLocaleString(likesList, t, locale, {\n count: likeCount,\n separator: '\\n'\n })\n };\n }, [likes, likeCount]);\n\n const onLikeCountClick = () => {\n if (likes.length) {\n likesModalRef.current = create(FeedModalList, {\n count: likeCount,\n heading: t('feed_liked_by'),\n listItems: likes,\n onLoadMore: onLoadMoreLikes,\n loading: likesLoading\n });\n } else {\n onLikeCountInteraction?.();\n }\n };\n\n return (\n <Flex container={{ gap: 0.5, alignItems: 'center' }}>\n <Button\n variant='simple'\n icon\n compact\n as={FeedButton}\n onClick={() => {\n const user = {\n id: loggedInUser.username,\n primary: loggedInUser.fullname,\n secondary: loggedInUser.meta,\n visual: (\n <Avatar size='m' imageSrc={loggedInUser.avatarSrc} name={loggedInUser.fullname} />\n )\n };\n onLikeClick({\n id,\n user\n });\n }}\n emphasized={liked}\n label={liked ? t('feed_unlike_label') : t('feed_like_label')}\n aria-describedby={likeCount > 0 ? likeCountId : undefined}\n ref={ref}\n >\n <Icon name={liked ? 'thumbs-up-solid' : 'thumbs-up'} />\n </Button>\n {likeCount > 0 && (\n <>\n <InlineBareButton\n ref={setCountEl}\n role={likes.length ? 'button' : undefined}\n onClick={onLikeCountClick}\n onFocus={onLikeCountInteraction}\n onMouseOver={onLikeCountInteraction}\n aria-label={likesAttributes.ariaLabel}\n tabIndex={0}\n >\n <Count\n id={likeCountId}\n aria-label={t('feed_post_likes', [likeCount], { count: likeCount })}\n >\n {likeCount}\n </Count>\n </InlineBareButton>\n <Tooltip target={countEl} showDelay='none' hideDelay='none' describeTarget={false}>\n {likesAttributes.label || t('feed_post_likes', [likeCount], { count: likeCount })}\n </Tooltip>\n </>\n )}\n </Flex>\n );\n});\n\nexport default FeedLikeButton;\n"]}
@@ -1,6 +1,6 @@
1
1
  import type { FC } from 'react';
2
2
  import type { FeedNewPostProps } from './Feed.types';
3
- export declare const StyledFeedNewPost: import("styled-components").StyledComponent<"div", import("styled-components").DefaultTheme, {}, never>;
3
+ export declare const StyledFeedNewPost: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, never>> & string;
4
4
  declare const FeedNewPost: FC<FeedNewPostProps>;
5
5
  export default FeedNewPost;
6
6
  //# sourceMappingURL=FeedNewPost.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"FeedNewPost.d.ts","sourceRoot":"","sources":["../../../src/components/Feed/FeedNewPost.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAiBhC,OAAO,KAAK,EAAE,gBAAgB,EAAoC,MAAM,cAAc,CAAC;AAMvF,eAAO,MAAM,iBAAiB,yGAAe,CAAC;AAQ9C,QAAA,MAAM,WAAW,EAAE,EAAE,CAAC,gBAAgB,CA8GrC,CAAC;AAEF,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"FeedNewPost.d.ts","sourceRoot":"","sources":["../../../src/components/Feed/FeedNewPost.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAiBhC,OAAO,KAAK,EAAE,gBAAgB,EAAoC,MAAM,cAAc,CAAC;AAMvF,eAAO,MAAM,iBAAiB,6NAAe,CAAC;AAQ9C,QAAA,MAAM,WAAW,EAAE,EAAE,CAAC,gBAAgB,CAiHrC,CAAC;AAEF,eAAe,WAAW,CAAC"}
@@ -14,7 +14,7 @@ const StyledMenuButton = styled.button `
14
14
  width: fit-content;
15
15
  `;
16
16
  const FeedNewPost = (props) => {
17
- const { id: newPostId, banners, progress, defaultConfig, customConfig, postType, postTypes = [], visibilityMode = 'public', recipientInput, onPostTypeChange, ...restProps } = props;
17
+ const { id: newPostId, banners, progress, onRewriteClick, defaultConfig, customConfig, postType, postTypes = [], visibilityMode = 'public', recipientInput, onPostTypeChange, ...restProps } = props;
18
18
  const t = useI18n();
19
19
  const rteRef = useRef(null);
20
20
  const [postTypeMenuItems, setPostTypeMenuItems] = useState(postTypes.map(type => ({ ...type, primary: type.label, selected: type.id === postType?.id })));
@@ -37,6 +37,7 @@ const FeedNewPost = (props) => {
37
37
  id: newPostId,
38
38
  banners,
39
39
  progress,
40
+ onRewriteClick,
40
41
  recipients: recipientInput?.recipients ?? [],
41
42
  postType,
42
43
  postTypeMenu: postType && postTypes.length > 1 ? (_jsx("h3", { children: _jsx(MenuButton, { as: StyledMenuButton, text: postType.label, variant: 'link', showArrow: true, "aria-label": `${t('feed_post_type')} - ${postType.label}`, menu: {