mirror of
https://github.com/CherryHQ/cherry-studio.git
synced 2026-01-08 14:29:15 +08:00
fix: tool permission card related
This commit is contained in:
parent
bf4ec23ef7
commit
d1d1dbc046
@ -1,9 +1,9 @@
|
|||||||
import type { PermissionUpdate } from '@anthropic-ai/claude-agent-sdk'
|
import type { PermissionUpdate } from '@anthropic-ai/claude-agent-sdk'
|
||||||
import { Button, Chip, ScrollShadow } from '@heroui/react'
|
|
||||||
import { loggerService } from '@logger'
|
import { loggerService } from '@logger'
|
||||||
import { useAppDispatch, useAppSelector } from '@renderer/store'
|
import { useAppDispatch, useAppSelector } from '@renderer/store'
|
||||||
import { selectPendingPermissionByToolName, toolPermissionsActions } from '@renderer/store/toolPermissions'
|
import { selectPendingPermissionByToolName, toolPermissionsActions } from '@renderer/store/toolPermissions'
|
||||||
import type { NormalToolResponse } from '@renderer/types'
|
import type { NormalToolResponse } from '@renderer/types'
|
||||||
|
import { Button, Tag } from 'antd'
|
||||||
import { ChevronDown, CirclePlay, CircleX } from 'lucide-react'
|
import { ChevronDown, CirclePlay, CircleX } from 'lucide-react'
|
||||||
import { useCallback, useEffect, useMemo, useState } from 'react'
|
import { useCallback, useEffect, useMemo, useState } from 'react'
|
||||||
import { useTranslation } from 'react-i18next'
|
import { useTranslation } from 'react-i18next'
|
||||||
@ -127,33 +127,36 @@ export function ToolPermissionRequestCard({ toolResponse }: Props) {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="flex flex-wrap items-center justify-end gap-2">
|
<div className="flex flex-wrap items-center justify-end gap-2">
|
||||||
<Chip color={isExpired ? 'danger' : 'warning'} size="sm" variant="flat">
|
<Tag color={isExpired ? 'error' : 'warning'}>
|
||||||
{isExpired
|
{isExpired
|
||||||
? t('agent.toolPermission.expired')
|
? t('agent.toolPermission.expired')
|
||||||
: t('agent.toolPermission.pending', { seconds: remainingSeconds })}
|
: t('agent.toolPermission.pending', { seconds: remainingSeconds })}
|
||||||
</Chip>
|
</Tag>
|
||||||
|
|
||||||
<div className="flex items-center gap-1">
|
<div className="flex items-center gap-1">
|
||||||
<Button
|
<Button
|
||||||
aria-label={t('agent.toolPermission.aria.denyRequest')}
|
aria-label={t('agent.toolPermission.aria.denyRequest')}
|
||||||
className="h-8"
|
className="h-8"
|
||||||
color="danger"
|
color="danger"
|
||||||
isDisabled={isSubmitting || isExpired}
|
disabled={isSubmitting || isExpired}
|
||||||
isLoading={isSubmittingDeny}
|
loading={isSubmittingDeny}
|
||||||
onPress={() => handleDecision('deny')}
|
onClick={() => handleDecision('deny')}
|
||||||
startContent={<CircleX size={16} />}
|
icon={<CircleX size={16} />}
|
||||||
variant="bordered">
|
iconPosition={'start'}
|
||||||
|
variant="outlined">
|
||||||
{t('agent.toolPermission.button.cancel')}
|
{t('agent.toolPermission.button.cancel')}
|
||||||
</Button>
|
</Button>
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
aria-label={t('agent.toolPermission.aria.allowRequest')}
|
aria-label={t('agent.toolPermission.aria.allowRequest')}
|
||||||
className="h-8 px-3"
|
className="h-8 px-3"
|
||||||
color="success"
|
color="primary"
|
||||||
isDisabled={isSubmitting || isExpired}
|
disabled={isSubmitting || isExpired}
|
||||||
isLoading={isSubmittingAllow}
|
loading={isSubmittingAllow}
|
||||||
onPress={() => handleDecision('allow')}
|
onClick={() => handleDecision('allow')}
|
||||||
startContent={<CirclePlay size={16} />}>
|
icon={<CirclePlay size={16} />}
|
||||||
|
iconPosition={'start'}
|
||||||
|
variant="solid">
|
||||||
{t('agent.toolPermission.button.run')}
|
{t('agent.toolPermission.button.run')}
|
||||||
</Button>
|
</Button>
|
||||||
|
|
||||||
@ -161,12 +164,12 @@ export function ToolPermissionRequestCard({ toolResponse }: Props) {
|
|||||||
aria-label={
|
aria-label={
|
||||||
showDetails ? t('agent.toolPermission.aria.hideDetails') : t('agent.toolPermission.aria.showDetails')
|
showDetails ? t('agent.toolPermission.aria.hideDetails') : t('agent.toolPermission.aria.showDetails')
|
||||||
}
|
}
|
||||||
className="h-8"
|
className="h-8 text-default-600 transition-colors hover:bg-default-200/50 hover:text-default-800"
|
||||||
isIconOnly
|
onClick={() => setShowDetails((value) => !value)}
|
||||||
onPress={() => setShowDetails((value) => !value)}
|
icon={<ChevronDown className={`transition-transform ${showDetails ? 'rotate-180' : ''}`} size={16} />}
|
||||||
variant="light">
|
variant="text"
|
||||||
<ChevronDown className={`transition-transform ${showDetails ? 'rotate-180' : ''}`} size={16} />
|
style={{ backgroundColor: 'transparent' }}
|
||||||
</Button>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -181,9 +184,9 @@ export function ToolPermissionRequestCard({ toolResponse }: Props) {
|
|||||||
<p className="mb-2 font-medium text-default-400 text-xs uppercase tracking-wide">
|
<p className="mb-2 font-medium text-default-400 text-xs uppercase tracking-wide">
|
||||||
{t('agent.toolPermission.inputPreview')}
|
{t('agent.toolPermission.inputPreview')}
|
||||||
</p>
|
</p>
|
||||||
<ScrollShadow className="max-h-48 font-mono text-xs" hideScrollBar>
|
<div className="max-h-[192px] overflow-auto font-mono text-xs">
|
||||||
<pre className="whitespace-pre-wrap break-all text-left">{request.inputPreview}</pre>
|
<pre className="whitespace-pre-wrap break-all p-2 text-left">{request.inputPreview}</pre>
|
||||||
</ScrollShadow>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{request.requiresPermissions && (
|
{request.requiresPermissions && (
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user