From 46b1124c7df4c87fcc2eb8bac0ad8713c4807211 Mon Sep 17 00:00:00 2001 From: William Stein Date: Sun, 13 Oct 2024 14:54:08 +0000 Subject: [PATCH] chat: fix Message component to use standard style --- src/packages/frontend/chat/chat-log.tsx | 5 - src/packages/frontend/chat/message.tsx | 208 ++++++++---------- .../frame-editors/chat-editor/search.tsx | 35 ++- .../chat-editor/use-search-index.ts | 5 +- 4 files changed, 122 insertions(+), 131 deletions(-) diff --git a/src/packages/frontend/chat/chat-log.tsx b/src/packages/frontend/chat/chat-log.tsx index 7820a74a6a..d3b5c3133c 100644 --- a/src/packages/frontend/chat/chat-log.tsx +++ b/src/packages/frontend/chat/chat-log.tsx @@ -544,11 +544,6 @@ export function MessageList({ sortedDates, messages, )} - is_next_sender={isNextMessageSender( - index, - sortedDates, - messages, - )} show_avatar={!isNextMessageSender(index, sortedDates, messages)} mode={mode} get_user_name={(account_id: string | undefined) => diff --git a/src/packages/frontend/chat/message.tsx b/src/packages/frontend/chat/message.tsx index c63fd7a83f..e83073333b 100644 --- a/src/packages/frontend/chat/message.tsx +++ b/src/packages/frontend/chat/message.tsx @@ -108,7 +108,6 @@ interface Props { path?: string; font_size: number; is_prev_sender?: boolean; - is_next_sender?: boolean; show_avatar?: boolean; mode: Mode; selectedHashtags?: Set; @@ -128,20 +127,29 @@ interface Props { selected?: boolean; } -export default function Message(props: Readonly) { - const { - is_folded, - is_thread_body, - is_thread, - message, - messages, - mode, - project_id, - font_size, - selected, - costEstimate, - } = props; - +export default function Message({ + index, + actions, + get_user_name, + messages, + message, + account_id, + user_map, + project_id, + path, + font_size, + is_prev_sender, + show_avatar, + mode, + selectedHashtags, + scroll_into_view, + allowReply, + is_thread, + is_folded, + is_thread_body, + costEstimate, + selected, +}: Props) { const showAISummarize = redux .getStore("projects") .hasLanguageModelEnabled(project_id, "chat-summarize"); @@ -174,29 +182,27 @@ export default function Message(props: Readonly) { const history_size = useMemo(() => message.get("history").size, [message]); const isEditing = useMemo( - () => is_editing(message, props.account_id), - [message, props.account_id], + () => is_editing(message, account_id), + [message, account_id], ); const editor_name = useMemo(() => { - return props.get_user_name( - message.get("history")?.first()?.get("author_id"), - ); + return get_user_name(message.get("history")?.first()?.get("author_id")); }, [message]); const reverseRowOrdering = - !is_thread_body && sender_is_viewer(props.account_id, message); + !is_thread_body && sender_is_viewer(account_id, message); const submitMentionsRef = useRef(); const [replying, setReplying] = useState(() => { - if (!props.allowReply) { + if (!allowReply) { return false; } const replyDate = -getThreadRootDate({ date, messages }); - const draft = props.actions?.syncdb?.get_one({ + const draft = actions?.syncdb?.get_one({ event: "draft", - sender_id: props.account_id, + sender_id: account_id, date: replyDate, }); if (draft == null) { @@ -210,10 +216,10 @@ export default function Message(props: Readonly) { return true; }); useEffect(() => { - if (!props.allowReply) { + if (!allowReply) { setReplying(false); } - }, [props.allowReply]); + }, [allowReply]); const [autoFocusReply, setAutoFocusReply] = useState(false); const [autoFocusEdit, setAutoFocusEdit] = useState(false); @@ -221,12 +227,12 @@ export default function Message(props: Readonly) { const replyMessageRef = useRef(""); const replyMentionsRef = useRef(); - const is_viewers_message = sender_is_viewer(props.account_id, message); + const is_viewers_message = sender_is_viewer(account_id, message); const verb = show_history ? "Hide" : "Show"; const isLLMThread = useMemo( - () => props.actions?.isLanguageModelThread(message.get("date")), - [message, props.actions != null], + () => actions?.isLanguageModelThread(message.get("date")), + [message, actions != null], ); const msgWrittenByLLM = useMemo(() => { @@ -236,7 +242,7 @@ export default function Message(props: Readonly) { useLayoutEffect(() => { if (replying) { - props.scroll_into_view?.(); + scroll_into_view?.(); } }, [replying]); @@ -244,7 +250,7 @@ export default function Message(props: Readonly) { let text; const other_editors = message .get("editing") - .remove(props.account_id) + .remove(account_id) // @ts-ignore – not sure why this error shows up .keySeq(); if (is_editing) { @@ -252,7 +258,7 @@ export default function Message(props: Readonly) { // This user and someone else is also editing text = ( <> - {`WARNING: ${props.get_user_name( + {`WARNING: ${get_user_name( other_editors.first(), )} is also editing this! `} Simultaneous editing of messages is not supported. @@ -273,7 +279,7 @@ export default function Message(props: Readonly) { } else { if (other_editors.size === 1) { // One person is editing - text = `${props.get_user_name( + text = `${get_user_name( other_editors.first(), )} is editing this message`; } else if (other_editors.size > 1) { @@ -330,30 +336,26 @@ export default function Message(props: Readonly) { } function edit_message() { - if ( - props.project_id == null || - props.path == null || - props.actions == null - ) { + if (project_id == null || path == null || actions == null) { // no editing functionality or not in a project with a path. return; } - props.actions.setEditing(message, true); + actions.setEditing(message, true); setAutoFocusEdit(true); - props.scroll_into_view?.(); + scroll_into_view?.(); } function avatar_column() { const sender_id = message.get("sender_id"); let style: CSSProperties = {}; - if (!props.is_prev_sender) { + if (!is_prev_sender) { style.marginTop = "22px"; } else { style.marginTop = "5px"; } if (!is_thread_body) { - if (sender_is_viewer(props.account_id, message)) { + if (sender_is_viewer(account_id, message)) { style.marginLeft = AVATAR_MARGIN_LEFTRIGHT; } else { style.marginRight = AVATAR_MARGIN_LEFTRIGHT; @@ -363,7 +365,7 @@ export default function Message(props: Readonly) { return (
- {sender_id != null && props.show_avatar ? ( + {sender_id != null && show_avatar ? ( ) : undefined}
@@ -376,19 +378,17 @@ export default function Message(props: Readonly) { let value = newest_content(message); const { background, color, lighten, message_class } = message_colors( - props.account_id, + account_id, message, ); - const font_size = `${props.font_size}px`; - - if (props.show_avatar) { + if (show_avatar) { marginBottom = "1vh"; } else { marginBottom = "3px"; } - if (!props.is_prev_sender && is_viewers_message) { + if (!is_prev_sender && is_viewers_message) { marginTop = MARGIN_TOP_VIEWER; } else { marginTop = "5px"; @@ -401,7 +401,7 @@ export default function Message(props: Readonly) { borderRadius: "5px", marginBottom, marginTop, - fontSize: font_size, + fontSize: `${font_size}px`, padding: selected ? "6px" : "9px", ...(mode === "sidechat" ? { marginLeft: "5px", marginRight: "5px" } @@ -411,7 +411,7 @@ export default function Message(props: Readonly) { const mainXS = mode === "standalone" ? 20 : 22; const showEditButton = Date.now() - date < SHOW_EDIT_BUTTON_MS; - const feedback = message.getIn(["feedback", props.account_id]); + const feedback = message.getIn(["feedback", account_id]); const otherFeedback = isLLMThread && msgWrittenByLLM ? 0 : (message.get("feedback")?.size ?? 0); const showOtherFeedback = otherFeedback > 0; @@ -463,7 +463,7 @@ export default function Message(props: Readonly) { }} type="text" size="small" - onClick={() => props.actions?.setEditing(message, true)} + onClick={() => actions?.setEditing(message, true)} > Edit @@ -478,8 +478,8 @@ export default function Message(props: Readonly) { title="Delete this message" description="Are you sure you want to delete this message?" onConfirm={() => { - props.actions?.setEditing(message, true); - setTimeout(() => props.actions?.sendEdit(message, ""), 1); + actions?.setEditing(message, true); + setTimeout(() => actions?.sendEdit(message, ""), 1); }} > {showAISummarize && is_thread ? ( - + ) : undefined} ); @@ -934,7 +914,7 @@ export default function Message(props: Readonly) { type="text" icon={} onClick={() => - props.actions?.toggleFoldThread(message.get("date"), props.index) + actions?.toggleFoldThread(message.get("date"), index) } > Unfold @@ -968,9 +948,7 @@ export default function Message(props: Readonly) { + + } style={{ fontSize: font_size }} > - + (null); const [error, setError] = useState(""); const { val: refresh, inc: doRefresh } = useCounter(); + const [indexTime, setIndexTime] = useState(0); useEffect(() => { (async () => { try { setError(""); + const t0 = Date.now(); const index = new SearchIndex({ actions }); await index.init(); setIndex(index); + setIndexTime(Date.now() - t0); } catch (err) { setError(`${err}`); } })(); }, [project_id, path, refresh]); - return { index, error, doRefresh, setError }; + return { index, error, doRefresh, setError, indexTime }; } class SearchIndex {