| 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; |
| } |
|
|