| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 |
- import { ArrowDownIcon } from 'lucide-react'
- import type { ComponentProps } from 'react'
- import { useCallback } from 'react'
- import { Button, cn } from 'ui'
- import { StickToBottom, useStickToBottomContext } from 'use-stick-to-bottom'
- type ConversationProps = ComponentProps<typeof StickToBottom>
- type ConversationContentProps = ComponentProps<typeof StickToBottom.Content>
- type ConversationScrollButtonProps = ComponentProps<typeof Button>
- export const Conversation = ({ className, ...props }: ConversationProps) => (
- <StickToBottom
- className={cn('relative flex-1 overflow-y-auto', className)}
- initial="smooth"
- resize="smooth"
- role="log"
- {...props}
- />
- )
- export const ConversationContent = ({ className, ...props }: ConversationContentProps) => (
- <StickToBottom.Content className={cn('p-4', className)} {...props} />
- )
- export const ConversationScrollButton = ({
- className,
- ...props
- }: ConversationScrollButtonProps) => {
- const { isAtBottom, scrollToBottom } = useStickToBottomContext()
- const handleScrollToBottom = useCallback(() => {
- scrollToBottom()
- }, [scrollToBottom])
- return (
- !isAtBottom && (
- <Button
- className={cn('absolute bottom-4 left-[50%] translate-x-[-50%] rounded-full', className)}
- onClick={handleScrollToBottom}
- size="tiny"
- type="default"
- {...props}
- >
- <ArrowDownIcon className="size-4" />
- </Button>
- )
- )
- }
|