| import React from 'react'; |
| import { motion } from 'framer-motion'; |
| import { TooltipAnchor } from '@librechat/client'; |
| import { MessageCircleDashed } from 'lucide-react'; |
| import { useRecoilState, useRecoilCallback } from 'recoil'; |
| import { useChatContext } from '~/Providers'; |
| import { useLocalize } from '~/hooks'; |
| import { cn } from '~/utils'; |
| import store from '~/store'; |
|
|
| export function TemporaryChat() { |
| const localize = useLocalize(); |
| const [isTemporary, setIsTemporary] = useRecoilState(store.isTemporary); |
| const { conversation, isSubmitting } = useChatContext(); |
|
|
| const temporaryBadge = { |
| id: 'temporary', |
| icon: MessageCircleDashed, |
| label: 'com_ui_temporary' as const, |
| atom: store.isTemporary, |
| isAvailable: true, |
| }; |
|
|
| const handleBadgeToggle = useRecoilCallback( |
| () => () => { |
| setIsTemporary(!isTemporary); |
| }, |
| [isTemporary], |
| ); |
|
|
| if ( |
| (Array.isArray(conversation?.messages) && conversation.messages.length >= 1) || |
| isSubmitting |
| ) { |
| return null; |
| } |
|
|
| return ( |
| <div className="relative flex flex-wrap items-center gap-2"> |
| <TooltipAnchor |
| description={localize(temporaryBadge.label)} |
| render={ |
| <button |
| onClick={handleBadgeToggle} |
| aria-label={localize(temporaryBadge.label)} |
| className={cn( |
| 'inline-flex size-10 flex-shrink-0 items-center justify-center rounded-xl border border-border-light text-text-primary transition-all ease-in-out hover:bg-surface-tertiary', |
| isTemporary |
| ? 'bg-surface-active shadow-md' |
| : 'bg-transparent shadow-sm hover:bg-surface-hover hover:shadow-md', |
| 'active:shadow-inner', |
| )} |
| > |
| {temporaryBadge.icon && ( |
| <temporaryBadge.icon |
| className={cn('relative h-5 w-5 md:h-4 md:w-4', !temporaryBadge.label && 'mx-auto')} |
| /> |
| )} |
| </button> |
| } |
| /> |
| </div> |
| ); |
| } |
|
|