From 974f7901e67391f58270da393a0532cc58247930 Mon Sep 17 00:00:00 2001 From: Faisal Amir Date: Wed, 21 May 2025 23:45:49 +0700 Subject: [PATCH] feat: add assistant emoji picker --- web-app/package.json | 1 + web-app/src/containers/DropdownAssistant.tsx | 5 +- .../containers/dialogs/AddEditAssistant.tsx | 117 +++++++++++++++--- web-app/src/hooks/useAssistant.ts | 2 +- web-app/src/index.css | 10 +- web-app/src/routes/assistant.tsx | 3 + web-app/src/routes/settings/general.tsx | 6 - 7 files changed, 116 insertions(+), 28 deletions(-) diff --git a/web-app/package.json b/web-app/package.json index d54759b9e..d8838b344 100644 --- a/web-app/package.json +++ b/web-app/package.json @@ -37,6 +37,7 @@ "@uiw/react-textarea-code-editor": "^3.1.1", "class-variance-authority": "^0.7.1", "culori": "^4.0.1", + "emoji-picker-react": "^4.12.2", "fzf": "^0.5.2", "i18next": "^25.0.1", "katex": "^0.16.22", diff --git a/web-app/src/containers/DropdownAssistant.tsx b/web-app/src/containers/DropdownAssistant.tsx index 3c9b43936..d8702de92 100644 --- a/web-app/src/containers/DropdownAssistant.tsx +++ b/web-app/src/containers/DropdownAssistant.tsx @@ -36,6 +36,9 @@ const DropdownAssistant = () => { @@ -43,7 +46,6 @@ const DropdownAssistant = () => {
{ - console.log('edit clicked', selectedAssistant) if (selectedAssistant) { setEditingAssistantId(selectedAssistant.id) setDialogOpen(true) @@ -73,6 +75,7 @@ const DropdownAssistant = () => { updateCurrentThreadAssistant(assistant) }} > + {assistant?.avatar} {assistant.name} diff --git a/web-app/src/containers/dialogs/AddEditAssistant.tsx b/web-app/src/containers/dialogs/AddEditAssistant.tsx index 3f2736aea..bbc705b70 100644 --- a/web-app/src/containers/dialogs/AddEditAssistant.tsx +++ b/web-app/src/containers/dialogs/AddEditAssistant.tsx @@ -1,4 +1,4 @@ -import { useState, useEffect } from 'react' +import { useState, useEffect, useRef } from 'react' import { Dialog, DialogContent, @@ -9,6 +9,7 @@ import { import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { IconPlus, IconTrash, IconChevronDown } from '@tabler/icons-react' +import EmojiPicker, { EmojiClickData, Theme } from 'emoji-picker-react' import { Textarea } from '@/components/ui/textarea' @@ -18,6 +19,7 @@ import { DropdownMenuItem, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu' +import { useTheme } from '@/hooks/useTheme' interface AddEditAssistantProps { open: boolean @@ -43,9 +45,32 @@ export default function AddEditAssistant({ const [instructions, setInstructions] = useState( initialData?.instructions || '' ) + const { isDark } = useTheme() const [paramsKeys, setParamsKeys] = useState(['']) const [paramsValues, setParamsValues] = useState(['']) const [paramsTypes, setParamsTypes] = useState(['string']) + const [showEmojiPicker, setShowEmojiPicker] = useState(false) + const emojiPickerRef = useRef(null) + + // Handle click outside emoji picker + useEffect(() => { + const handleClickOutside = (event: MouseEvent) => { + if ( + emojiPickerRef.current && + !emojiPickerRef.current.contains(event.target as Node) + ) { + setShowEmojiPicker(false) + } + } + + if (showEmojiPicker) { + document.addEventListener('mousedown', handleClickOutside) + } + + return () => { + document.removeEventListener('mousedown', handleClickOutside) + } + }, [showEmojiPicker]) // Reset form when modal opens/closes or editing key changes useEffect(() => { @@ -189,26 +214,80 @@ export default function AddEditAssistant({
-
- - setName(e.target.value)} - placeholder="Enter name" - autoFocus - /> +
+
+ +
setShowEmojiPicker(!showEmojiPicker)} + > + {avatar || '😊'} +
+
+ { + setAvatar(emojiData.emoji) + setShowEmojiPicker(false) + }} + /> +
+
+ +
+ + setName(e.target.value)} + placeholder="Enter name" + autoFocus + /> +
-
- - setAvatar(e.target.value)} - placeholder="Enter avatar URL" - /> -
+ {/*
+ +
+
+ {avatar || '😊'} +
+
+ +
+ { + setAvatar(emojiData.emoji) + document + .getElementById('emoji-picker-container') + ?.classList.add('hidden') + }} + width={300} + height={400} + /> +
+
+
+
*/}