mirror of
https://github.com/langgenius/dify.git
synced 2026-07-25 13:38:31 +08:00
68 lines
1.9 KiB
TypeScript
68 lines
1.9 KiB
TypeScript
import type { KbdColor } from '@langgenius/dify-ui/kbd'
|
|
import type { FormatDisplayOptions, Hotkey, IndividualKey } from '@tanstack/react-hotkeys'
|
|
import type { WorkflowCanvasShortcutId } from './definitions'
|
|
import { cn } from '@langgenius/dify-ui/cn'
|
|
import { Kbd, KbdGroup } from '@langgenius/dify-ui/kbd'
|
|
import { formatForDisplay } from '@tanstack/react-hotkeys'
|
|
import { getWorkflowCanvasShortcutDisplayKey } from './definitions'
|
|
|
|
type ShortcutKbdSource =
|
|
| { shortcut: WorkflowCanvasShortcutId; hotkey?: never; displayKey?: never }
|
|
| { shortcut?: never; hotkey: Hotkey; displayKey?: never }
|
|
| { shortcut?: never; hotkey?: never; displayKey: string }
|
|
|
|
type ShortcutKbdProps = ShortcutKbdSource & {
|
|
className?: string
|
|
textColor?: 'default' | 'secondary'
|
|
bgColor?: KbdColor
|
|
platform?: FormatDisplayOptions['platform']
|
|
}
|
|
|
|
const getDisplayKeys = (
|
|
hotkey: Hotkey | IndividualKey,
|
|
platform?: FormatDisplayOptions['platform'],
|
|
) => {
|
|
const displayOptions = platform ? { platform } : undefined
|
|
|
|
return hotkey
|
|
.split('+')
|
|
.filter(Boolean)
|
|
.map((key) => formatForDisplay(key, displayOptions))
|
|
}
|
|
|
|
export const ShortcutKbd = ({
|
|
shortcut,
|
|
hotkey,
|
|
displayKey,
|
|
className,
|
|
textColor = 'default',
|
|
bgColor = 'gray',
|
|
platform,
|
|
}: ShortcutKbdProps) => {
|
|
const shortcutDisplayKey =
|
|
hotkey ?? (shortcut ? getWorkflowCanvasShortcutDisplayKey(shortcut) : undefined)
|
|
|
|
const displayOptions = platform ? { platform } : undefined
|
|
const displayKeys = displayKey
|
|
? [formatForDisplay(displayKey, displayOptions)]
|
|
: shortcutDisplayKey
|
|
? getDisplayKeys(shortcutDisplayKey, platform)
|
|
: []
|
|
|
|
if (!displayKeys.length) return null
|
|
|
|
return (
|
|
<KbdGroup className={cn(className)}>
|
|
{displayKeys.map((key) => (
|
|
<Kbd
|
|
key={key}
|
|
color={bgColor}
|
|
className={cn(textColor === 'secondary' && 'text-text-tertiary')}
|
|
>
|
|
{key}
|
|
</Kbd>
|
|
))}
|
|
</KbdGroup>
|
|
)
|
|
}
|