Skip to content

Commit 2ed7547

Browse files
committed
Add AppMessageToolbar component to LayoutRenderer.jsx
1 parent f37a2fb commit 2ed7547

File tree

1 file changed

+38
-0
lines changed

1 file changed

+38
-0
lines changed

llmstack/client/src/components/apps/renderer/LayoutRenderer.jsx

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import {
1515
Collapse,
1616
Container,
1717
Grid,
18+
IconButton,
1819
Paper,
1920
Stack,
2021
Typography,
@@ -49,6 +50,29 @@ import "./LayoutRenderer.css";
4950

5051
const liquidEngine = new Liquid();
5152

53+
const AppMessageToolbar = ({ message }) => {
54+
return (
55+
<Box
56+
sx={{
57+
display: "flex",
58+
justifyContent: "space-between",
59+
alignItems: "center",
60+
padding: "3px 0",
61+
position: "absolute",
62+
bottom: 0,
63+
right: 0,
64+
}}
65+
>
66+
<IconButton
67+
onClick={() => navigator.clipboard.writeText(message.content)}
68+
sx={{ color: "#999" }}
69+
>
70+
<ContentCopyOutlined fontSize="small" />
71+
</IconButton>
72+
</Box>
73+
);
74+
};
75+
5276
const PromptlyAppInputForm = memo(
5377
({ workflow, runApp, submitButtonOptions, sx, clearOnSubmit = false }) => {
5478
const appRunData = useRecoilValue(appRunDataState);
@@ -221,6 +245,8 @@ const UserMessage = memo(
221245
const AppMessage = memo(
222246
(props) => {
223247
const { message, workflow, assistantImage } = props;
248+
const [showToolbar, setShowToolbar] = useState(false);
249+
224250
return (
225251
<Box
226252
sx={{
@@ -235,7 +261,13 @@ const AppMessage = memo(
235261
className={
236262
workflow ? "layout-workflow-output" : "layout-chat_message_from_app"
237263
}
264+
sx={{
265+
position: "relative",
266+
}}
267+
onMouseEnter={() => setShowToolbar(true)}
268+
onMouseLeave={() => setShowToolbar(false)}
238269
>
270+
{showToolbar && <AppMessageToolbar message={message} />}
239271
<LayoutRenderer>{message.content || ""}</LayoutRenderer>
240272
</Box>
241273
</Box>
@@ -249,6 +281,8 @@ const AppMessage = memo(
249281
const AgentMessage = memo(
250282
(props) => {
251283
const { message, workflow, assistantImage } = props;
284+
const [showToolbar, setShowToolbar] = useState(false);
285+
252286
return (
253287
<Box
254288
sx={{
@@ -264,12 +298,16 @@ const AgentMessage = memo(
264298
workflow ? "layout-workflow-output" : "layout-chat_message_from_app"
265299
}
266300
sx={{
301+
position: "relative",
267302
color:
268303
message?.subType === "agent-step-error"
269304
? "red !important"
270305
: "inherit",
271306
}}
307+
onMouseEnter={() => setShowToolbar(true)}
308+
onMouseLeave={() => setShowToolbar(false)}
272309
>
310+
{showToolbar && <AppMessageToolbar message={message} />}
273311
<LayoutRenderer>{message.content || ""}</LayoutRenderer>
274312
</Box>
275313
</Box>

0 commit comments

Comments
 (0)