mirror of
https://github.com/danny-avila/LibreChat.git
synced 2025-12-21 10:50:14 +01:00
68 lines
2 KiB
TypeScript
68 lines
2 KiB
TypeScript
import { ChevronLeft, ChevronRight } from 'lucide-react';
|
|
import type { TMessageProps } from '~/common';
|
|
import { cn } from '~/utils';
|
|
|
|
type TSiblingSwitchProps = Pick<TMessageProps, 'siblingIdx' | 'siblingCount' | 'setSiblingIdx'>;
|
|
|
|
export default function SiblingSwitch({
|
|
siblingIdx,
|
|
siblingCount,
|
|
setSiblingIdx,
|
|
}: TSiblingSwitchProps) {
|
|
if (siblingIdx === undefined) {
|
|
return null;
|
|
} else if (siblingCount === undefined) {
|
|
return null;
|
|
}
|
|
|
|
const previous = () => {
|
|
setSiblingIdx && setSiblingIdx(siblingIdx - 1);
|
|
};
|
|
|
|
const next = () => {
|
|
setSiblingIdx && setSiblingIdx(siblingIdx + 1);
|
|
};
|
|
|
|
const buttonStyle = cn(
|
|
'hover-button rounded-lg p-1.5 text-text-secondary-alt transition-colors duration-200',
|
|
'hover:text-text-primary hover:bg-surface-hover',
|
|
'md:group-hover:visible md:group-focus-within:visible md:group-[.final-completion]:visible',
|
|
'focus-visible:ring-2 focus-visible:ring-black dark:focus-visible:ring-white focus-visible:outline-none',
|
|
);
|
|
|
|
return siblingCount > 1 ? (
|
|
<nav
|
|
className="visible flex items-center justify-center gap-2 self-center pt-0 text-xs"
|
|
aria-label="Sibling message navigation"
|
|
>
|
|
<button
|
|
className={buttonStyle}
|
|
type="button"
|
|
onClick={previous}
|
|
disabled={siblingIdx == 0}
|
|
aria-label="Previous sibling message"
|
|
aria-disabled={siblingIdx == 0}
|
|
>
|
|
<ChevronLeft size="19" aria-hidden="true" />
|
|
</button>
|
|
<span
|
|
className="flex-shrink-0 flex-grow tabular-nums"
|
|
aria-live="polite"
|
|
aria-atomic="true"
|
|
role="status"
|
|
>
|
|
{siblingIdx + 1} / {siblingCount}
|
|
</span>
|
|
<button
|
|
className={buttonStyle}
|
|
type="button"
|
|
onClick={next}
|
|
disabled={siblingIdx == siblingCount - 1}
|
|
aria-label="Next sibling message"
|
|
aria-disabled={siblingIdx == siblingCount - 1}
|
|
>
|
|
<ChevronRight size="19" aria-hidden="true" />
|
|
</button>
|
|
</nav>
|
|
) : null;
|
|
}
|