Skip to content

Commit 4de8a40

Browse files
committed
feat: add single message share logic
1 parent 017055d commit 4de8a40

File tree

3 files changed

+26
-6
lines changed

3 files changed

+26
-6
lines changed

src/components/header/ConversationMessageShareButton.tsx

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,25 @@
11
import { useStore } from '@nanostores/solid'
22
import { currentConversationId } from '@/stores/conversation'
33
import { showShareModal } from '@/stores/ui'
4+
import { getMessagesByConversationId, updateMessage } from '@/stores/messages'
45

56
export default () => {
67
const $currentConversationId = useStore(currentConversationId)
8+
const handleShareContext = () => {
9+
const messages = getMessagesByConversationId($currentConversationId())
10+
messages.forEach((message) => {
11+
updateMessage($currentConversationId(), message.id, { isSelected: true },
12+
)
13+
})
14+
showShareModal.set(true)
15+
}
716

817
return (
918
<>
1019
{$currentConversationId() && (
1120
<div
1221
class="fcc p-2 rounded-md text-xl hv-foreground"
13-
onClick={() => { showShareModal.set(true) }}
22+
onClick={() => { handleShareContext() }}
1423
>
1524
<div i-carbon-export />
1625
</div>

src/components/main/MessageItem.tsx

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ import { For, Show } from 'solid-js/web'
22
import { createSignal } from 'solid-js'
33
import { useStore } from '@nanostores/solid'
44
import { useClipboardCopy } from '@/hooks'
5-
import { deleteMessageByConversationId, spliceMessageByConversationId, spliceUpdateMessageByConversationId } from '@/stores/messages'
6-
import { conversationMap } from '@/stores/conversation'
5+
import { deleteMessageByConversationId, getMessagesByConversationId, spliceMessageByConversationId, spliceUpdateMessageByConversationId, updateMessage } from '@/stores/messages'
6+
import { conversationMap, currentConversationId } from '@/stores/conversation'
77
import { handlePrompt } from '@/logics/conversation'
8-
import { scrollController } from '@/stores/ui'
8+
import { scrollController, showShareModal } from '@/stores/ui'
99
import { globalAbortController } from '@/stores/settings'
1010
import StreamableText from '../StreamableText'
1111
import { DropDownMenu, Tooltip } from '../ui/base'
@@ -23,6 +23,7 @@ interface Props {
2323
export default (props: Props) => {
2424
let inputRef: HTMLTextAreaElement
2525
const $conversationMap = useStore(conversationMap)
26+
const $currentConversationId = useStore(currentConversationId)
2627

2728
const [showRawCode, setShowRawCode] = createSignal(false)
2829
const [copied, setCopied] = createSignal(false)
@@ -58,6 +59,15 @@ export default (props: Props) => {
5859
inputRef.focus()
5960
}
6061

62+
const handleShareMessageItem = () => {
63+
const messages = getMessagesByConversationId($currentConversationId())
64+
messages.forEach((message) => {
65+
updateMessage($currentConversationId(), message.id, { isSelected: props.message.id === message.id },
66+
)
67+
})
68+
showShareModal.set(true)
69+
}
70+
6171
const handleSend = () => {
6272
if (!inputRef.value)
6373
return
@@ -80,7 +90,7 @@ export default (props: Props) => {
8090
{ id: 'edit', label: 'Edit message', icon: 'i-carbon:edit', role: 'user', action: handleEditMessageItem },
8191
{ id: 'copy', label: 'Copy message', icon: 'i-carbon-copy', role: 'all', action: handleCopyMessageItem },
8292
{ id: 'delete', label: 'Delete message', icon: 'i-carbon-trash-can', role: 'all', action: handleDeleteMessageItem },
83-
{ id: 'share', label: 'Share message', icon: 'i-carbon:export', role: 'all' },
93+
{ id: 'share', label: 'Share message', icon: 'i-carbon:export', role: 'all', action: handleShareMessageItem },
8494
])
8595

8696
if (props.message.role === 'user')

src/stores/messages.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
import { action, map } from 'nanostores'
1+
import { action, atom, map } from 'nanostores'
22
import { conversationMessagesMapData } from './tests/message.mock'
33
import { db } from './storage/message'
44
import { updateConversationById } from './conversation'
55
import type { MessageInstance } from '@/types/message'
66

77
export const conversationMessagesMap = map<Record<string, MessageInstance[]>>({})
8+
export const shareMessageIds = atom<string[]>([])
89

910
export const rebuildMessagesStore = async() => {
1011
const data = await db.exportData() || {}

0 commit comments

Comments
 (0)