chatbot-template/components/chat-header.tsx

80 lines
2.7 KiB
TypeScript
Raw Normal View History

2025-03-17 16:58:22 -07:00
'use client';
2025-03-17 16:58:22 -07:00
import Link from 'next/link';
import { useRouter } from 'next/navigation';
import { useWindowSize } from 'usehooks-ts';
2025-03-17 16:58:22 -07:00
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';
2025-04-03 01:05:07 -07:00
import { type VisibilityType, VisibilitySelector } from './visibility-selector';
2025-04-25 23:40:15 -07:00
import type { Session } from 'next-auth';
function PureChatHeader({
chatId,
selectedVisibilityType,
isReadonly,
2025-04-25 23:40:15 -07:00
session,
}: {
chatId: string;
selectedVisibilityType: VisibilityType;
isReadonly: boolean;
2025-04-25 23:40:15 -07:00
session: Session;
}) {
2024-11-06 22:10:15 +03:00
const router = useRouter();
const { open } = useSidebar();
const { width: windowWidth } = useWindowSize();
return (
2025-09-09 15:44:07 -04:00
<header className="sticky top-0 flex items-center gap-2 bg-background px-2 py-1.5 md:px-2">
<SidebarToggle />
{(!open || windowWidth < 768) && (
<Button
variant="outline"
2025-09-09 15:44:07 -04:00
className="order-2 ml-auto px-2 md:order-1 md:ml-0 md:h-fit md:px-2"
onClick={() => {
router.push('/');
router.refresh();
}}
>
<PlusIcon />
<span className="md:sr-only">New Chat</span>
</Button>
)}
{!isReadonly && (
<VisibilitySelector
chatId={chatId}
selectedVisibilityType={selectedVisibilityType}
className="order-1 md:order-2"
/>
)}
<Button
2025-09-09 15:44:07 -04:00
className="order-3 hidden h-fit bg-zinc-900 px-2 py-1.5 text-zinc-50 hover:bg-zinc-800 md:ml-auto md:flex md:h-[34px] dark:bg-zinc-100 dark:text-zinc-900 dark:hover:bg-zinc-200"
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":"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
);
});