85 lines
3.1 KiB
TypeScript
85 lines
3.1 KiB
TypeScript
'use client';
|
|
|
|
import Link from 'next/link';
|
|
import { useRouter } from 'next/navigation';
|
|
import { useWindowSize } from 'usehooks-ts';
|
|
|
|
import { SidebarToggle } from '@/components/sidebar-toggle';
|
|
import { Button } from '@/components/ui/button';
|
|
import { PlusIcon, VercelIcon } from './icons';
|
|
import { useSidebar } from './ui/sidebar';
|
|
import { memo } from 'react';
|
|
import { Tooltip, TooltipContent, TooltipTrigger } from './ui/tooltip';
|
|
import { type VisibilityType, VisibilitySelector } from './visibility-selector';
|
|
import type { Session } from 'next-auth';
|
|
|
|
function PureChatHeader({
|
|
chatId,
|
|
selectedVisibilityType,
|
|
isReadonly,
|
|
session,
|
|
}: {
|
|
chatId: string;
|
|
selectedVisibilityType: VisibilityType;
|
|
isReadonly: boolean;
|
|
session: Session;
|
|
}) {
|
|
const router = useRouter();
|
|
const { open } = useSidebar();
|
|
|
|
const { width: windowWidth } = useWindowSize();
|
|
|
|
return (
|
|
<header className="flex sticky top-0 bg-background py-1.5 items-center px-2 md:px-2 gap-2">
|
|
<SidebarToggle />
|
|
|
|
{(!open || windowWidth < 768) && (
|
|
<Tooltip>
|
|
<TooltipTrigger asChild>
|
|
<Button
|
|
variant="outline"
|
|
className="order-2 md:order-1 md:px-2 px-2 md:h-fit ml-auto md:ml-0"
|
|
onClick={() => {
|
|
router.push('/');
|
|
router.refresh();
|
|
}}
|
|
>
|
|
<PlusIcon />
|
|
<span className="md:sr-only">New Chat</span>
|
|
</Button>
|
|
</TooltipTrigger>
|
|
<TooltipContent>New Chat</TooltipContent>
|
|
</Tooltip>
|
|
)}
|
|
|
|
{!isReadonly && (
|
|
<VisibilitySelector
|
|
chatId={chatId}
|
|
selectedVisibilityType={selectedVisibilityType}
|
|
className="order-1 md:order-2"
|
|
/>
|
|
)}
|
|
|
|
<Button
|
|
className="bg-zinc-900 dark:bg-zinc-100 hover:bg-zinc-800 dark:hover:bg-zinc-200 text-zinc-50 dark:text-zinc-900 hidden md:flex py-1.5 px-2 h-fit md:h-[34px] order-3 md:ml-auto"
|
|
asChild
|
|
>
|
|
<Link
|
|
href={`https://vercel.com/new/clone?repository-url=https://github.com/vercel/ai-chatbot&env=AUTH_SECRET&envDescription=Learn more about how to get the API Keys for the application&envLink=https://github.com/vercel/ai-chatbot/blob/main/.env.example&demo-title=AI Chatbot&demo-description=An Open-Source AI Chatbot Template Built With Next.js and the AI SDK by Vercel.&demo-url=https://chat.vercel.ai&products=[{"type":"integration","protocol":"ai","productSlug":"grok","integrationSlug":"xai"},{"type":"integration","protocol":"storage","productSlug":"neon","integrationSlug":"neon"},{"type":"integration","protocol":"storage","productSlug":"upstash-kv","integrationSlug":"upstash"},{"type":"blob"}]`}
|
|
target="_noblank"
|
|
>
|
|
<VercelIcon size={16} />
|
|
Deploy with Vercel
|
|
</Link>
|
|
</Button>
|
|
</header>
|
|
);
|
|
}
|
|
|
|
export const ChatHeader = memo(PureChatHeader, (prevProps, nextProps) => {
|
|
return (
|
|
prevProps.chatId === nextProps.chatId &&
|
|
prevProps.selectedVisibilityType === nextProps.selectedVisibilityType &&
|
|
prevProps.isReadonly === nextProps.isReadonly
|
|
);
|
|
});
|