+
diff --git a/src/logics/conversation.ts b/src/logics/conversation.ts
index f3c8e7b4..b4add50a 100644
--- a/src/logics/conversation.ts
+++ b/src/logics/conversation.ts
@@ -10,7 +10,7 @@ import type { HandlerPayload, PromptResponse } from '@/types/provider'
import type { Conversation } from '@/types/conversation'
import type { ErrorMessage, Message } from '@/types/message'
-export const handlePrompt = async(conversation: Conversation, prompt: string, signal?: AbortSignal) => {
+export const handlePrompt = async(conversation: Conversation, prompt?: string, signal?: AbortSignal) => {
const generalSettings = getGeneralSettings()
const bot = getBotMetaById(conversation.bot)
const [providerId, botId] = conversation.bot.split(':')
@@ -22,13 +22,14 @@ export const handlePrompt = async(conversation: Conversation, prompt: string, si
if (bot.type !== 'chat_continuous')
clearMessagesByConversationId(conversation.id)
-
- pushMessageByConversationId(conversation.id, {
- id: `${conversation.id}:user:${Date.now()}`,
- role: 'user',
- content: prompt,
- dateTime: new Date().getTime(),
- })
+ if (prompt) {
+ pushMessageByConversationId(conversation.id, {
+ id: `${conversation.id}:user:${Date.now()}`,
+ role: 'user',
+ content: prompt,
+ dateTime: new Date().getTime(),
+ })
+ }
setLoadingStateByConversationId(conversation.id, true)
let providerResponse: PromptResponse
@@ -85,7 +86,7 @@ export const handlePrompt = async(conversation: Conversation, prompt: string, si
// Update conversation title
if (providerResponse && bot.type === 'chat_continuous' && !conversation.name) {
- const inputText = conversation.systemInfo || prompt
+ const inputText = conversation.systemInfo || prompt!
const rapidPayload = generateRapidProviderPayload(promptHelper.summarizeText(inputText), provider.id)
const generatedTitle = await getProviderResponse(provider.id, rapidPayload).catch(() => {}) as string || inputText
updateConversationById(conversation.id, {
@@ -128,7 +129,7 @@ export const callProviderHandler = async(providerId: string, payload: HandlerPay
let response: PromptResponse
if (payload.botId === 'temp')
- response = await provider.handleRapidPrompt?.(payload.prompt, payload.globalSettings)
+ response = await provider.handleRapidPrompt?.(payload.prompt!, payload.globalSettings)
else
response = await provider.handlePrompt?.(payload, signal)
diff --git a/src/stores/messages.ts b/src/stores/messages.ts
index b7a22703..418b5cf6 100644
--- a/src/stores/messages.ts
+++ b/src/stores/messages.ts
@@ -73,3 +73,31 @@ export const deleteMessageByConversationId = action(
})
},
)
+
+export const spliceMessageByConversationId = action(
+ conversationMessagesMap,
+ 'spliceMessagesByConversationId',
+ (map, id: string, payload: MessageInstance) => {
+ const oldMessages = map.get()[id] || []
+ const currentIndex = oldMessages.findIndex(message => message.id === payload.id)
+ map.setKey(id, [...oldMessages.slice(0, currentIndex + 1)])
+ db.setItem(id, [...oldMessages.slice(0, currentIndex + 1)])
+ updateConversationById(id, {
+ lastUseTime: Date.now(),
+ })
+ },
+)
+
+export const spliceUpdateMessageByConversationId = action(
+ conversationMessagesMap,
+ 'spliceMessagesByConversationId',
+ (map, id: string, payload: MessageInstance) => {
+ const oldMessages = map.get()[id] || []
+ const currentIndex = oldMessages.findIndex(message => message.id === payload.id)
+ map.setKey(id, [...oldMessages.slice(0, currentIndex), payload])
+ db.setItem(id, [...oldMessages.slice(0, currentIndex), payload])
+ updateConversationById(id, {
+ lastUseTime: Date.now(),
+ })
+ },
+)
diff --git a/src/stores/settings.ts b/src/stores/settings.ts
index f4d78720..fbb542e2 100644
--- a/src/stores/settings.ts
+++ b/src/stores/settings.ts
@@ -1,10 +1,11 @@
-import { action, map } from 'nanostores'
+import { action, atom, map } from 'nanostores'
import { db } from './storage/settings'
import { getProviderById, providerMetaList } from './provider'
import type { SettingsPayload } from '@/types/provider'
import type { GeneralSettings } from '@/types/app'
export const providerSettingsMap = map>({})
+export const globalAbortController = atom(null)
export const rebuildSettingsStore = async() => {
const exportData = await db.exportData()
diff --git a/src/types/provider.ts b/src/types/provider.ts
index 87245093..dbabea99 100644
--- a/src/types/provider.ts
+++ b/src/types/provider.ts
@@ -34,7 +34,7 @@ export interface HandlerPayload {
botId: string
globalSettings: SettingsPayload
botSettings: SettingsPayload
- prompt: string
+ prompt?: string
messages: Message[]
}
From a699aac21e3bbe719ede5f20db1b125347025a53 Mon Sep 17 00:00:00 2001
From: yzh990918 <251205668@qq.com>
Date: Mon, 8 May 2023 17:07:24 +0800
Subject: [PATCH 05/16] feat: add Index props
---
src/components/main/Continuous.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/components/main/Continuous.tsx b/src/components/main/Continuous.tsx
index 8f516136..8357a849 100644
--- a/src/components/main/Continuous.tsx
+++ b/src/components/main/Continuous.tsx
@@ -45,7 +45,7 @@ export default (props: Props) => {
conversationId={props.conversationId}
message={message}
handleStreaming={handleStreamableTextUpdate}
- // index={index()}
+ index={index()}
/>
)}
From 01c7e8dbc1edaf31011ee9019cc9719d9ab9fc09 Mon Sep 17 00:00:00 2001
From: yzh990918 <251205668@qq.com>
Date: Mon, 8 May 2023 18:20:07 +0800
Subject: [PATCH 06/16] feat: add useClickOutside hooks, hidden dropmenu when
clickOutside
---
src/components/main/MessageItem.tsx | 5 +++--
src/components/ui/base/DropdownMenu.tsx | 14 +++++++++++---
src/hooks/index.ts | 1 +
src/hooks/useClickOutside.ts | 25 +++++++++++++++++++++++++
4 files changed, 40 insertions(+), 5 deletions(-)
create mode 100644 src/hooks/useClickOutside.ts
diff --git a/src/components/main/MessageItem.tsx b/src/components/main/MessageItem.tsx
index 4e4bbe6c..0feaf8d6 100644
--- a/src/components/main/MessageItem.tsx
+++ b/src/components/main/MessageItem.tsx
@@ -1,5 +1,5 @@
import { For, Show } from 'solid-js/web'
-import { createSignal } from 'solid-js'
+import { createSignal, onCleanup } from 'solid-js'
import { useStore } from '@nanostores/solid'
import { useClipboardCopy } from '@/hooks'
import { deleteMessageByConversationId, spliceMessageByConversationId, spliceUpdateMessageByConversationId } from '@/stores/messages'
@@ -20,12 +20,12 @@ interface Props {
}
export default (props: Props) => {
+ let inputRef: HTMLTextAreaElement
const $conversationMap = useStore(conversationMap)
const [showRawCode, setShowRawCode] = createSignal(false)
const [copied, setCopied] = createSignal(false)
const [isEditing, setIsEditing] = createSignal(false)
- let inputRef: HTMLTextAreaElement
const [inputPrompt, setInputPrompt] = createSignal(props.message.content)
const currentConversation = () => {
@@ -38,6 +38,7 @@ export default (props: Props) => {
setCopied(Iscopied())
setTimeout(() => setCopied(false), 1000)
}
+
const handleDeleteMessageItem = () => {
deleteMessageByConversationId(props.conversationId, props.message)
}
diff --git a/src/components/ui/base/DropdownMenu.tsx b/src/components/ui/base/DropdownMenu.tsx
index a2ab1396..e8ad0ca4 100644
--- a/src/components/ui/base/DropdownMenu.tsx
+++ b/src/components/ui/base/DropdownMenu.tsx
@@ -2,7 +2,8 @@ import * as menu from '@zag-js/menu'
import { normalizeProps, useMachine } from '@zag-js/solid'
import { Show, children, createEffect, createMemo, createUniqueId } from 'solid-js'
import { Dynamic, For, Portal, spread } from 'solid-js/web'
-import type { JSX, JSXElement } from 'solid-js'
+import { useClickOutside } from '@/hooks'
+import type { Accessor, JSX, JSXElement } from 'solid-js'
export interface MenuItem {
id: string
@@ -16,6 +17,7 @@ export interface MenuItem {
interface Props {
children: JSX.Element
menuList: MenuItem[]
+ close?: () => Accessor
}
export const DropDownMenu = (props: Props) => {
@@ -31,6 +33,7 @@ export const DropDownMenu = (props: Props) => {
},
}),
)
+ let dropDownMenuRef: HTMLDivElement
const api = createMemo(() => menu.connect(state, send, normalizeProps))
@@ -45,15 +48,20 @@ export const DropDownMenu = (props: Props) => {
createEffect(() => {
// https://github.com/chakra-ui/zag/issues/595
api().setPositioning({})
+
+ dropDownMenuRef = document.getElementById('DropDownMenuRef') as HTMLDivElement
+ useClickOutside(dropDownMenuRef, () => {
+ api().close()
+ })
})
return (
-
+