mirror of
https://github.com/wu736139669/hapi.git
synced 2026-08-09 07:29:51 +00:00
feat(web): drag-and-drop files onto chat panel to add as attachments (#936)
* feat(web): drag-and-drop files onto chat panel to add as attachments Closes #935 Adds a `useDragOver` hook that detects when a file is being dragged over the browser window and suppresses the browser's default file-open behaviour for drops outside the accept zone. A new `DragDropZone` component wraps the inner `AssistantRuntimeProvider` content in `SessionChat`. It shows a semi-transparent overlay (dashed border + "Drop to attach" label) on the right-side chat panel as soon as any file drag is detected — regardless of where the pointer is on the page. Dropping on the right panel adds the files as composer attachments via the existing `api.composer().addAttachment()` path. Drops on the left sidebar are suppressed (no navigation, no attachment). via [HAPI](https://hapi.run) Co-Authored-By: HAPI <noreply@hapi.run> * fix(web): disable drag-drop zone when pendingSchedule is active The backend rejects requests with both scheduledAt and attachments. DragDropZone now respects pendingSchedule the same way paste and the attach button do — disabled=true suppresses the overlay, sets dropEffect='none', and skips addAttachment on drop. via [HAPI](https://hapi.run) Co-Authored-By: HAPI <noreply@hapi.run> * fix(web): harden drag-drop default-action handling Address HAPI Bot review on #936: - useDragOver: cancel the browser's default file-open/navigation on the document-level `drop` event for file payloads, not only on `dragover`. Preventing default on `dragover` alone still lets the browser open a file dropped outside any zone (e.g. the sidebar), which could unload the app. - DragDropZone: only preventDefault when the drop payload actually contains files, so non-file drops (e.g. dragging selected text into the composer) keep their default browser behaviour. Add regression tests for both. via [HAPI](https://hapi.run) Co-Authored-By: HAPI <noreply@hapi.run> Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * fix(web): use Simplified Chinese for composer.dropToAttach in zh-CN Address HAPI Bot review on #936: the new zh-CN string used Traditional Chinese forms (放開以附加檔案) in the Simplified Chinese locale, which is inconsistent with neighbouring keys (e.g. composer.attach = 添加文件). Use 松开以添加文件 to match. via [HAPI](https://hapi.run) Co-Authored-By: HAPI <noreply@hapi.run> Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> --------- Co-authored-by: HAPI <noreply@hapi.run> Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
co-authored by
HAPI
Claude Opus 4.8
parent
b1910b6b2e
commit
a0259b531e
@@ -1,6 +1,7 @@
|
||||
import { useCallback, useEffect, useMemo, useRef, useState } from 'react'
|
||||
import { useNavigate } from '@tanstack/react-router'
|
||||
import { AssistantRuntimeProvider, useAssistantApi, useAssistantState } from '@assistant-ui/react'
|
||||
import { DragDropZone } from '@/components/AssistantChat/DragDropZone'
|
||||
import type { ApiClient } from '@/api/client'
|
||||
import type {
|
||||
AttachmentMetadata,
|
||||
@@ -1137,7 +1138,8 @@ function SessionChatInner(props: SessionChatProps) {
|
||||
|
||||
<AssistantRuntimeProvider runtime={runtime}>
|
||||
<ShareSeedConsumer sessionId={props.session.id} sessionActive={props.session.active} />
|
||||
<div className="relative flex min-h-0 flex-1 flex-col">
|
||||
<DragDropZone disabled={sessionInactive || props.isSending || pendingSchedule != null}>
|
||||
|
||||
<HappyThread
|
||||
// Key with prefix: different components under the same session
|
||||
// (thread, scratchlist, composer) must have distinct keys to avoid
|
||||
@@ -1337,7 +1339,7 @@ function SessionChatInner(props: SessionChatProps) {
|
||||
sendError={props.sendError ?? null}
|
||||
onClearSendError={props.onClearSendError}
|
||||
/>
|
||||
</div>
|
||||
</DragDropZone>
|
||||
</AssistantRuntimeProvider>
|
||||
|
||||
{/* Voice session component - renders nothing but initializes voice backend */}
|
||||
|
||||
Reference in New Issue
Block a user