@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.
- package/lib/components/AISummary/AISummary.d.ts +10 -0
- package/lib/components/AISummary/AISummary.d.ts.map +1 -0
- package/lib/components/AISummary/AISummary.js +128 -0
- package/lib/components/AISummary/AISummary.js.map +1 -0
- package/lib/components/AISummary/index.d.ts +3 -0
- package/lib/components/AISummary/index.d.ts.map +1 -0
- package/lib/components/AISummary/index.js +2 -0
- package/lib/components/AISummary/index.js.map +1 -0
- package/lib/components/Chat/Chat.js +1 -1
- package/lib/components/Chat/Chat.js.map +1 -1
- package/lib/components/Chat/ChatBody.js +5 -5
- package/lib/components/Chat/ChatBody.js.map +1 -1
- package/lib/components/Chat/ChatComposer.d.ts +16 -2
- package/lib/components/Chat/ChatComposer.d.ts.map +1 -1
- package/lib/components/Chat/ChatSettingsPanel.d.ts.map +1 -1
- package/lib/components/Chat/ChatSettingsPanel.js +1 -1
- package/lib/components/Chat/ChatSettingsPanel.js.map +1 -1
- package/lib/components/Chat/ChatSettingsPanel.styles.d.ts +13 -9
- package/lib/components/Chat/ChatSettingsPanel.styles.d.ts.map +1 -1
- package/lib/components/Chat/ChatSettingsPanel.styles.js.map +1 -1
- package/lib/components/Chat/Message.styles.d.ts +28 -24
- package/lib/components/Chat/Message.styles.d.ts.map +1 -1
- package/lib/components/Chat/Message.styles.js +20 -1
- package/lib/components/Chat/Message.styles.js.map +1 -1
- package/lib/components/Chat/SuggestedReplyPicker.d.ts +7 -7
- package/lib/components/Chat/SuggestedReplyPicker.d.ts.map +1 -1
- package/lib/components/Chat/SystemMessage.d.ts +1 -1
- package/lib/components/Chat/SystemMessage.d.ts.map +1 -1
- package/lib/components/Chat/SystemMessage.js +4 -4
- package/lib/components/Chat/SystemMessage.js.map +1 -1
- package/lib/components/Email/Email.d.ts.map +1 -1
- package/lib/components/Email/Email.js +5 -5
- package/lib/components/Email/Email.js.map +1 -1
- package/lib/components/Email/Email.styles.d.ts +63 -53
- package/lib/components/Email/Email.styles.d.ts.map +1 -1
- package/lib/components/Email/Email.styles.js +2 -21
- package/lib/components/Email/Email.styles.js.map +1 -1
- package/lib/components/Email/Email.types.d.ts +11 -5
- package/lib/components/Email/Email.types.d.ts.map +1 -1
- package/lib/components/Email/Email.types.js.map +1 -1
- package/lib/components/Email/EmailComposer.d.ts +8 -5
- package/lib/components/Email/EmailComposer.d.ts.map +1 -1
- package/lib/components/Email/EmailComposer.js +86 -41
- package/lib/components/Email/EmailComposer.js.map +1 -1
- package/lib/components/Email/EmailConversation.d.ts +11 -7
- package/lib/components/Email/EmailConversation.d.ts.map +1 -1
- package/lib/components/Email/EmailConversation.js +2 -2
- package/lib/components/Email/EmailConversation.js.map +1 -1
- package/lib/components/Email/EmailNotificationPanel.d.ts.map +1 -1
- package/lib/components/Email/EmailNotificationPanel.js +5 -5
- package/lib/components/Email/EmailNotificationPanel.js.map +1 -1
- package/lib/components/Email/EmailShell.d.ts.map +1 -1
- package/lib/components/Email/EmailShell.js +7 -6
- package/lib/components/Email/EmailShell.js.map +1 -1
- package/lib/components/Email/EmailSummaryItem.d.ts +2 -2
- package/lib/components/Email/EmailSummaryItem.d.ts.map +1 -1
- package/lib/components/Email/EmailSummaryItem.js +6 -5
- package/lib/components/Email/EmailSummaryItem.js.map +1 -1
- package/lib/components/Email/EntityList.js +1 -1
- package/lib/components/Email/EntityList.js.map +1 -1
- package/lib/components/Email/utils/EntityHighlighter.d.ts +2 -3
- package/lib/components/Email/utils/EntityHighlighter.d.ts.map +1 -1
- package/lib/components/Email/utils/EntityHighlighter.js +10 -15
- package/lib/components/Email/utils/EntityHighlighter.js.map +1 -1
- package/lib/components/Feed/Feed.d.ts +3 -1
- package/lib/components/Feed/Feed.d.ts.map +1 -1
- package/lib/components/Feed/Feed.js +3 -3
- package/lib/components/Feed/Feed.js.map +1 -1
- package/lib/components/Feed/Feed.types.d.ts +11 -4
- package/lib/components/Feed/Feed.types.d.ts.map +1 -1
- package/lib/components/Feed/Feed.types.js.map +1 -1
- package/lib/components/Feed/FeedAttachments.d.ts +4 -2
- package/lib/components/Feed/FeedAttachments.d.ts.map +1 -1
- package/lib/components/Feed/FeedAttachments.js +2 -3
- package/lib/components/Feed/FeedAttachments.js.map +1 -1
- package/lib/components/Feed/FeedButton.d.ts +2 -2
- package/lib/components/Feed/FeedButton.d.ts.map +1 -1
- package/lib/components/Feed/FeedContentHeader.d.ts.map +1 -1
- package/lib/components/Feed/FeedContentHeader.js +14 -12
- package/lib/components/Feed/FeedContentHeader.js.map +1 -1
- package/lib/components/Feed/FeedCustomEditRegion.d.ts +1 -1
- package/lib/components/Feed/FeedCustomEditRegion.d.ts.map +1 -1
- package/lib/components/Feed/FeedCustomInputRegion.d.ts +1 -1
- package/lib/components/Feed/FeedCustomInputRegion.d.ts.map +1 -1
- package/lib/components/Feed/FeedEditRegion.d.ts.map +1 -1
- package/lib/components/Feed/FeedEditRegion.js +94 -6
- package/lib/components/Feed/FeedEditRegion.js.map +1 -1
- package/lib/components/Feed/FeedInputRegion.d.ts +1 -1
- package/lib/components/Feed/FeedInputRegion.d.ts.map +1 -1
- package/lib/components/Feed/FeedInputRegion.js +96 -7
- package/lib/components/Feed/FeedInputRegion.js.map +1 -1
- package/lib/components/Feed/FeedLikeButton.js +1 -1
- package/lib/components/Feed/FeedLikeButton.js.map +1 -1
- package/lib/components/Feed/FeedNewPost.d.ts +1 -1
- package/lib/components/Feed/FeedNewPost.d.ts.map +1 -1
- package/lib/components/Feed/FeedNewPost.js +2 -1
- package/lib/components/Feed/FeedNewPost.js.map +1 -1
- package/lib/components/Feed/FeedPost.d.ts +8 -3
- package/lib/components/Feed/FeedPost.d.ts.map +1 -1
- package/lib/components/Feed/FeedPost.js +58 -24
- package/lib/components/Feed/FeedPost.js.map +1 -1
- package/lib/components/Feed/FeedReply.d.ts +2 -1
- package/lib/components/Feed/FeedReply.d.ts.map +1 -1
- package/lib/components/Feed/FeedReply.js +4 -5
- package/lib/components/Feed/FeedReply.js.map +1 -1
- package/lib/components/Feed/FeedReplyInput.d.ts +1 -1
- package/lib/components/Feed/FeedReplyInput.d.ts.map +1 -1
- package/lib/components/Feed/FeedReplyInput.js +2 -2
- package/lib/components/Feed/FeedReplyInput.js.map +1 -1
- package/lib/components/Feed/FeedRichText.d.ts.map +1 -1
- package/lib/components/Feed/FeedRichText.js +5 -4
- package/lib/components/Feed/FeedRichText.js.map +1 -1
- package/lib/components/HashtagButton/HashtagButton.d.ts +1 -1
- package/lib/components/HashtagButton/HashtagButton.d.ts.map +1 -1
- package/lib/components/HashtagButton/HashtagButton.js +19 -2
- package/lib/components/HashtagButton/HashtagButton.js.map +1 -1
- package/lib/components/MentionButton/MentionButton.d.ts +1 -1
- package/lib/components/MentionButton/MentionButton.d.ts.map +1 -1
- package/lib/components/MentionButton/MentionButton.js +22 -5
- package/lib/components/MentionButton/MentionButton.js.map +1 -1
- package/lib/components/OpenGraphPreview/OpenGraphPreview.d.ts.map +1 -1
- package/lib/components/OpenGraphPreview/OpenGraphPreview.js +4 -1
- package/lib/components/OpenGraphPreview/OpenGraphPreview.js.map +1 -1
- package/lib/components/OpenGraphPreview/OpenGraphPreview.styles.d.ts +382 -10
- package/lib/components/OpenGraphPreview/OpenGraphPreview.styles.d.ts.map +1 -1
- package/lib/components/OpenGraphPreview/OpenGraphPreview.styles.js +1 -1
- package/lib/components/OpenGraphPreview/OpenGraphPreview.styles.js.map +1 -1
- package/lib/index.d.ts +2 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +2 -0
- package/lib/index.js.map +1 -1
- 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
|
-
|
|
80
|
-
|
|
81
|
-
|
|
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":";AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEhE,OAAO,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EACL,MAAM,EACN,gBAAgB,EAChB,IAAI,EACJ,IAAI,EACJ,QAAQ,EACR,OAAO,EACP,UAAU,EACV,aAAa,EACd,MAAM,yBAAyB,CAAC;AAGjC,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAE1C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,UAAU,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,sBAAsB,MAAM,0BAA0B,CAAC;AAE9D,MAAM,oBAAoB,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;IACpD,OAAO,GAAG,CAAA;0BACc,KAAK,CAAC,IAAI,CAAC,OAAO,MAAM,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,WAAW,CAAC;;;;4BAIzD,KAAK,CAAC,IAAI,CAAC,OAAO,MAAM,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC;;GAErF,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,oBAAoB,CAAC,YAAY,GAAG,gBAAgB,CAAC;AAErD,MAAM,cAAc,GAA4B,CAAC,KAA0B,EAAE,EAAE;IAC7E,MAAM,EACJ,OAAO,EACP,EAAE,EACF,OAAO,EACP,UAAU,EACV,UAAU,GAAG,EAAE,EACf,cAAc,EACd,OAAO,EACP,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,gBAAgB,EACjB,GAAG,KAAK,CAAC;IAEV,MAAM,CAAC,GAAG,OAAO,EAAE,CAAC;IACpB,MAAM,EAAE,cAAc,EAAE,GAAG,UAAU,EAAE,CAAC;IACxC,MAAM,EAAE,oBAAoB,EAAE,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,MAAM,CAAsB,IAAI,CAAC,CAAC;IACjD,MAAM,eAAe,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAErD,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9D,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEpE,MAAM,aAAa,GAAG,CAAC,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC;IAEzF,aAAa,CAAC,WAAW,EAAE,CAAC,eAAe,CAAC,EAAE,GAAG,EAAE;QACjD,IAAI,aAAa;YAAE,YAAY,EAAE,CAAC,EAAE,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,GAAG,EAAE;QACtB,oBAAoB,EAAE,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAI,CAAC,aAAa,IAAI,CAAC,eAAe,IAAI,kBAAkB,CAAC,EAAE,CAAC;YAC9D,YAAY,CAAC;gBACX,EAAE;gBACF,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE;gBAC3C,UAAU;gBACV,UAAU,EAAE,cAAc,EAAE,UAAU,IAAI,UAAU;aACrD,CAAC,CAAC;YACH,cAAc,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,CAAC,KAAoB,EAAE,EAAE;QACzC,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO;YAAE,UAAU,EAAE,CAAC;IAC9E,CAAC,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,cAAc,EAAE,CAAC;YACnB,IAAI,UAAU,CAAC,MAAM,KAAK,cAAc,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;gBAC3D,qBAAqB,CAAC,IAAI,CAAC,CAAC;YAC9B,CAAC;iBAAM,CAAC;gBACN,MAAM,qBAAqB,GAAwB,EAAE,CAAC;gBACtD,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;oBAC7B,IAAI,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC;wBAC/D,qBAAqB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBACxC,CAAC;gBACH,CAAC,CAAC,CAAC;gBAEH,IAAI,qBAAqB,CAAC,MAAM,KAAK,cAAc,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;oBACtE,qBAAqB,CAAC,IAAI,CAAC,CAAC;gBAC9B,CAAC;qBAAM,CAAC;oBACN,qBAAqB,CAAC,KAAK,CAAC,CAAC;gBAC/B,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC,EAAE,CAAC,UAAU,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC,CAAC;IAE7C,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC;IAE7E,OAAO,CACL,MAAC,IAAI,IAAC,SAAS,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,aAC5C,MAAC,IAAI,IACH,EAAE,EAAE,oBAAoB,EACxB,GAAG,EAAE,eAAe,EACpB,SAAS,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,EAC1C,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,aAE/B,OAAO,EAEP,UAAU,KAAK,SAAS,IAAI,CAAC,CAAC,cAAc,IAAI,CAC/C,KAAC,sBAAsB,IACrB,cAAc,EAAC,SAAS,EACxB,UAAU,EAAC,SAAS,EACpB,cAAc,EAAE,cAAc,GAC9B,CACH,EAED,KAAC,YAAY,IACX,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,GAAG,EAAE;4BACb,gBAAgB,CAAC,MAAM,CAAC,OAAO,EAAE,YAAY,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;4BAC/D,kBAAkB,CAAC,MAAM,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,OAAO,CAAC,CAAC;wBACjE,CAAC,EACD,SAAS,EAAE,SAAS,EACpB,YAAY,EAAE,OAAO,EACrB,GAAG,EAAE,MAAM,GACX,EAEF,KAAC,QAAQ,IACP,OAAO,EAAE,CAAC,CAAC,QAAQ,EACnB,cAAc,QACd,SAAS,EAAC,OAAO,EACjB,OAAO,EAAE,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,GAC5D,IACG,EACP,MAAC,IAAI,IAAC,EAAE,EAAE,aAAa,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,aACpF,KAAC,MAAM,IACL,OAAO,EAAC,QAAQ,EAChB,EAAE,EAAE,UAAU,EACd,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,EACjC,IAAI,QACJ,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,YAElB,KAAC,IAAI,IAAC,IAAI,EAAC,OAAO,GAAG,GACd,EAET,KAAC,MAAM,IACL,EAAE,EAAE,UAAU,EACd,QAAQ,EAAE,aAAa,IAAI,CAAC,CAAC,eAAe,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,QAAQ,EAClF,OAAO,EAAC,QAAQ,EAChB,OAAO,EAAE,UAAU,EACnB,IAAI,QACJ,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,YAElB,KAAC,IAAI,IAAC,IAAI,EAAC,MAAM,GAAG,GACb,IACJ,IACF,CACR,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,cAAc,CAAC","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").
|
|
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;
|
|
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
|
-
|
|
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":";AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAE3E,OAAO,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EACL,MAAM,EACN,IAAI,EACJ,MAAM,EACN,KAAK,EACL,OAAO,EACP,eAAe,EACf,OAAO,EACP,gBAAgB,EAChB,UAAU,EACV,wBAAwB,EACxB,IAAI,EACJ,gBAAgB,EAChB,MAAM,EACP,MAAM,yBAAyB,CAAC;AAEjC,OAAO,cAAc,MAAM,8DAA8D,CAAC;AAE1F,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,UAAU,MAAM,cAAc,CAAC;AACtC,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAG5C,MAAM,gBAAgB,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;IAC5D,OAAO,GAAG,CAAA;;;;;0BAKc,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC;;;;;;oBAMjC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,cAAc,CAAC;uBACpC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,cAAc,CAAC;qBACzC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,cAAc,CAAC;sBACtC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,cAAc,CAAC;;;;;;;;oBAQzC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,cAAc,CAAC;;GAExD,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,gBAAgB,CAAC,YAAY,GAAG,gBAAgB,CAAC;AAcjD,MAAM,cAAc,GAA2C,UAAU,CAAC,SAAS,cAAc,CAC/F,KAAK,EACL,GAA2B;IAE3B,MAAM,EACJ,EAAE,EACF,KAAK,EACL,SAAS,GAAG,CAAC,EACb,KAAK,GAAG,EAAE,EACV,WAAW,EACX,sBAAsB,EACtB,eAAe,EACf,YAAY,EACb,GAAG,KAAK,CAAC;IACV,MAAM,CAAC,GAAG,OAAO,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,GAAG,gBAAgB,EAAE,CAAC;IACtC,MAAM,EAAE,MAAM,EAAE,GAAG,eAAe,EAAE,CAAC;IACrC,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;IAC3D,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAC/C,MAAM,aAAa,GAAG,MAAM,EAAoC,CAAC;IACjE,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC;IAE7B,SAAS,CAAC,GAAG,EAAE;QACb,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC;YAC5B,KAAK,EAAE,SAAS;YAChB,OAAO,EAAE,CAAC,CAAC,eAAe,CAAC;YAC3B,SAAS,EAAE,KAAK;YAChB,UAAU,EAAE,eAAe;YAC3B,OAAO,EAAE,YAAY;SACtB,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,eAAe,EAAE,YAAY,CAAC,CAAC,CAAC;IAEtD,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,EAAE;QACnC,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;QACvD,OAAO;YACL,SAAS,EAAE,SAAS;gBAClB,CAAC,CAAC,GAAG,CAAC,CAAC,eAAe,CAAC,IAAI,wBAAwB,CAAC,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE;oBACtE,KAAK,EAAE,SAAS;iBACjB,CAAC,EAAE;gBACN,CAAC,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;YAC3D,KAAK,EAAE,wBAAwB,CAAC,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE;gBACpD,KAAK,EAAE,SAAS;gBAChB,SAAS,EAAE,IAAI;aAChB,CAAC;SACH,CAAC;IACJ,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;IAEvB,MAAM,gBAAgB,GAAG,GAAG,EAAE;QAC5B,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjB,aAAa,CAAC,OAAO,GAAG,MAAM,CAAC,aAAa,EAAE;gBAC5C,KAAK,EAAE,SAAS;gBAChB,OAAO,EAAE,CAAC,CAAC,eAAe,CAAC;gBAC3B,SAAS,EAAE,KAAK;gBAChB,UAAU,EAAE,eAAe;gBAC3B,OAAO,EAAE,YAAY;aACtB,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,sBAAsB,EAAE,EAAE,CAAC;QAC7B,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,CACL,MAAC,IAAI,IAAC,SAAS,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,QAAQ,EAAE,aACjD,KAAC,MAAM,IACL,OAAO,EAAC,QAAQ,EAChB,IAAI,QACJ,OAAO,QACP,EAAE,EAAE,UAAU,EACd,OAAO,EAAE,GAAG,EAAE;oBACZ,MAAM,IAAI,GAAG;wBACX,EAAE,EAAE,YAAY,CAAC,QAAQ;wBACzB,OAAO,EAAE,YAAY,CAAC,QAAQ;wBAC9B,SAAS,EAAE,YAAY,CAAC,IAAI;wBAC5B,MAAM,EAAE,CACN,KAAC,MAAM,IAAC,IAAI,EAAC,GAAG,EAAC,QAAQ,EAAE,YAAY,CAAC,SAAS,EAAE,IAAI,EAAE,YAAY,CAAC,QAAQ,GAAI,CACnF;qBACF,CAAC;oBACF,WAAW,CAAC;wBACV,EAAE;wBACF,IAAI;qBACL,CAAC,CAAC;gBACL,CAAC,EACD,UAAU,EAAE,KAAK,EACjB,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,sBAC1C,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,EACzD,GAAG,EAAE,GAAG,YAER,KAAC,IAAI,IAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,WAAW,GAAI,GAChD,EACR,SAAS,GAAG,CAAC,IAAI,CAChB,8BACE,KAAC,gBAAgB,IACf,GAAG,EAAE,UAAU,EACf,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EACzC,OAAO,EAAE,gBAAgB,EACzB,OAAO,EAAE,sBAAsB,EAC/B,WAAW,EAAE,sBAAsB,gBACvB,eAAe,CAAC,SAAS,EACrC,QAAQ,EAAE,CAAC,YAEX,KAAC,KAAK,IACJ,EAAE,EAAE,WAAW,gBACH,CAAC,CAAC,iBAAiB,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,YAElE,SAAS,GACJ,GACS,EACnB,KAAC,OAAO,IAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAC,MAAM,EAAC,SAAS,EAAC,MAAM,EAAC,cAAc,EAAE,KAAK,YAC9E,eAAe,CAAC,KAAK,IAAI,CAAC,CAAC,iBAAiB,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,GACzE,IACT,CACJ,IACI,CACR,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,eAAe,cAAc,CAAC","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
|
|
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").
|
|
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,
|
|
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: {
|