import React, { forwardRef, type ReactNode } from 'react'; import { createPolymorphicComponent } from '../../utils/create-polymorphic-component'; import { ChevronLeftIcon, ChevronRightIcon, DoubleArrowLeftIcon, DoubleArrowRightIcon } from '../icons'; import { usePaginationContext } from './pagination-context'; import { PaginationControl, type PaginationControlProps } from './pagination-control'; export interface CreateEdgeComponent { icon: ReactNode; name: string; action: 'onNext' | 'onPrevious' | 'onFirst' | 'onLast'; type: 'next' | 'previous'; } export interface PaginationEdgeProps extends PaginationControlProps { icon?: ReactNode; } export function createEdgeComponent({ icon: defaultIcon, name, action, type }: CreateEdgeComponent) { const Component = forwardRef((props, ref) => { const { icon = defaultIcon, ...others } = props; const ctx = usePaginationContext(); const disabled = type === 'next' ? ctx.active === ctx.total : ctx.active === 1; return ( {icon} ); }); Component.displayName = name; return createPolymorphicComponent<'button', PaginationEdgeProps>(Component); } export const PaginationNext = createEdgeComponent({ icon: , name: 'PaginationNext', action: 'onNext', type: 'next', }); export const PaginationPrevious = createEdgeComponent({ icon: , name: 'PaginationPrevious', action: 'onPrevious', type: 'previous', }); export const PaginationFirst = createEdgeComponent({ icon: , name: 'PaginationFirst', action: 'onFirst', type: 'previous', }); export const PaginationLast = createEdgeComponent({ icon: , name: 'PaginationLast', action: 'onLast', type: 'next', });