214 lines
7.0 KiB
TypeScript
214 lines
7.0 KiB
TypeScript
import useHotkey from "@/lib/hooks/use-hotkey"
|
|
import {
|
|
IconBrandGithub,
|
|
IconBrandX,
|
|
IconHelpCircle,
|
|
IconQuestionMark
|
|
} from "@tabler/icons-react"
|
|
import Link from "next/link"
|
|
import { FC, useState } from "react"
|
|
import {
|
|
DropdownMenu,
|
|
DropdownMenuContent,
|
|
DropdownMenuItem,
|
|
DropdownMenuLabel,
|
|
DropdownMenuSeparator,
|
|
DropdownMenuTrigger
|
|
} from "../ui/dropdown-menu"
|
|
import { Announcements } from "../utility/announcements"
|
|
|
|
import { useTranslation } from 'react-i18next'
|
|
|
|
interface ChatHelpProps {}
|
|
|
|
export const ChatHelp: FC<ChatHelpProps> = ({}) => {
|
|
|
|
const { t } = useTranslation()
|
|
|
|
useHotkey("/", () => setIsOpen(prevState => !prevState))
|
|
|
|
const [isOpen, setIsOpen] = useState(false)
|
|
|
|
return (
|
|
<DropdownMenu open={isOpen} onOpenChange={setIsOpen}>
|
|
<DropdownMenuTrigger asChild>
|
|
<IconQuestionMark className="bg-primary text-secondary size-[24px] cursor-pointer rounded-full p-0.5 opacity-60 hover:opacity-50 lg:size-[30px] lg:p-1" />
|
|
</DropdownMenuTrigger>
|
|
|
|
<DropdownMenuContent align="end">
|
|
<DropdownMenuLabel className="flex items-center justify-between">
|
|
<div className="flex space-x-2">
|
|
<Link
|
|
className="cursor-pointer hover:opacity-50"
|
|
href="https://x.com/JellyDropsLLC"
|
|
target="_blank"
|
|
rel="noopener noreferrer"
|
|
>
|
|
<IconBrandX />
|
|
</Link>
|
|
|
|
<Link
|
|
className="cursor-pointer hover:opacity-50"
|
|
href="https://github.com/JellyDropsLLC"
|
|
target="_blank"
|
|
rel="noopener noreferrer"
|
|
>
|
|
<IconBrandGithub />
|
|
</Link>
|
|
</div>
|
|
|
|
<div className="flex space-x-2">
|
|
<Announcements />
|
|
|
|
<Link
|
|
className="cursor-pointer hover:opacity-50"
|
|
href="/help"
|
|
target="_blank"
|
|
rel="noopener noreferrer"
|
|
>
|
|
<IconHelpCircle size={24} />
|
|
</Link>
|
|
</div>
|
|
</DropdownMenuLabel>
|
|
|
|
<DropdownMenuSeparator />
|
|
|
|
<DropdownMenuItem className="flex justify-between">
|
|
<div>{t("help.showHelp")}</div>
|
|
<div className="flex opacity-60">
|
|
<div className="min-w-[30px] rounded border-DEFAULT p-1 text-center">
|
|
⌘
|
|
</div>
|
|
<div className="min-w-[30px] rounded border-DEFAULT p-1 text-center">
|
|
Shift
|
|
</div>
|
|
<div className="min-w-[30px] rounded border-DEFAULT p-1 text-center">
|
|
/
|
|
</div>
|
|
</div>
|
|
</DropdownMenuItem>
|
|
|
|
<DropdownMenuItem className="flex justify-between">
|
|
<div>{t("help.showWorkspaces")}</div>
|
|
<div className="flex opacity-60">
|
|
<div className="min-w-[30px] rounded border-DEFAULT p-1 text-center">
|
|
⌘
|
|
</div>
|
|
<div className="min-w-[30px] rounded border-DEFAULT p-1 text-center">
|
|
Shift
|
|
</div>
|
|
<div className="min-w-[30px] rounded border-DEFAULT p-1 text-center">
|
|
;
|
|
</div>
|
|
</div>
|
|
</DropdownMenuItem>
|
|
|
|
<DropdownMenuItem className="flex w-[300px] justify-between">
|
|
<div>{t("help.newChat")}</div>
|
|
<div className="flex opacity-60">
|
|
<div className="min-w-[30px] rounded border-DEFAULT p-1 text-center">
|
|
⌘
|
|
</div>
|
|
<div className="min-w-[30px] rounded border-DEFAULT p-1 text-center">
|
|
Shift
|
|
</div>
|
|
<div className="min-w-[30px] rounded border-DEFAULT p-1 text-center">
|
|
O
|
|
</div>
|
|
</div>
|
|
</DropdownMenuItem>
|
|
|
|
<DropdownMenuItem className="flex justify-between">
|
|
<div>{t("help.focusChat")}</div>
|
|
<div className="flex opacity-60">
|
|
<div className="min-w-[30px] rounded border-DEFAULT p-1 text-center">
|
|
⌘
|
|
</div>
|
|
<div className="min-w-[30px] rounded border-DEFAULT p-1 text-center">
|
|
Shift
|
|
</div>
|
|
<div className="min-w-[30px] rounded border-DEFAULT p-1 text-center">
|
|
L
|
|
</div>
|
|
</div>
|
|
</DropdownMenuItem>
|
|
|
|
<DropdownMenuItem className="flex justify-between">
|
|
<div>{t("help.toggleFiles")}</div>
|
|
<div className="flex opacity-60">
|
|
<div className="min-w-[30px] rounded border-DEFAULT p-1 text-center">
|
|
⌘
|
|
</div>
|
|
<div className="min-w-[30px] rounded border-DEFAULT p-1 text-center">
|
|
Shift
|
|
</div>
|
|
<div className="min-w-[30px] rounded border-DEFAULT p-1 text-center">
|
|
F
|
|
</div>
|
|
</div>
|
|
</DropdownMenuItem>
|
|
|
|
<DropdownMenuItem className="flex justify-between">
|
|
<div>{t("help.toggleRetrieval")}</div>
|
|
<div className="flex opacity-60">
|
|
<div className="min-w-[30px] rounded border-DEFAULT p-1 text-center">
|
|
⌘
|
|
</div>
|
|
<div className="min-w-[30px] rounded border-DEFAULT p-1 text-center">
|
|
Shift
|
|
</div>
|
|
<div className="min-w-[30px] rounded border-DEFAULT p-1 text-center">
|
|
E
|
|
</div>
|
|
</div>
|
|
</DropdownMenuItem>
|
|
|
|
<DropdownMenuItem className="flex justify-between">
|
|
<div>{t("help.openSettings")}</div>
|
|
<div className="flex opacity-60">
|
|
<div className="min-w-[30px] rounded border-DEFAULT p-1 text-center">
|
|
⌘
|
|
</div>
|
|
<div className="min-w-[30px] rounded border-DEFAULT p-1 text-center">
|
|
Shift
|
|
</div>
|
|
<div className="min-w-[30px] rounded border-DEFAULT p-1 text-center">
|
|
I
|
|
</div>
|
|
</div>
|
|
</DropdownMenuItem>
|
|
|
|
<DropdownMenuItem className="flex justify-between">
|
|
<div>{t("help.openQuickSettings")}</div>
|
|
<div className="flex opacity-60">
|
|
<div className="min-w-[30px] rounded border-DEFAULT p-1 text-center">
|
|
⌘
|
|
</div>
|
|
<div className="min-w-[30px] rounded border-DEFAULT p-1 text-center">
|
|
Shift
|
|
</div>
|
|
<div className="min-w-[30px] rounded border-DEFAULT p-1 text-center">
|
|
P
|
|
</div>
|
|
</div>
|
|
</DropdownMenuItem>
|
|
|
|
<DropdownMenuItem className="flex justify-between">
|
|
<div>{t("help.toggleSidebar")}</div>
|
|
<div className="flex opacity-60">
|
|
<div className="min-w-[30px] rounded border-DEFAULT p-1 text-center">
|
|
⌘
|
|
</div>
|
|
<div className="min-w-[30px] rounded border-DEFAULT p-1 text-center">
|
|
Shift
|
|
</div>
|
|
<div className="min-w-[30px] rounded border-DEFAULT p-1 text-center">
|
|
S
|
|
</div>
|
|
</div>
|
|
</DropdownMenuItem>
|
|
</DropdownMenuContent>
|
|
</DropdownMenu>
|
|
)
|
|
}
|