import { ComponentType } from 'react'; import { useTheme } from '@emotion/react'; import styled from '@emotion/styled'; import { IconComponent, IconPlus } from 'twenty-ui'; import { SettingsListSkeletonCard } from '@/settings/components/SettingsListSkeletonCard'; import { Card } from '@/ui/layout/card/components/Card'; import { CardFooter } from '@/ui/layout/card/components/CardFooter'; import { SettingsListItemCardContent } from './SettingsListItemCardContent'; const StyledFooter = styled(CardFooter)` align-items: center; display: flex; padding: ${({ theme }) => theme.spacing(1)}; `; const StyledButton = styled.button` align-items: center; background: ${({ theme }) => theme.background.primary}; border: none; border-radius: ${({ theme }) => theme.border.radius.sm}; color: ${({ theme }) => theme.font.color.secondary}; gap: ${({ theme }) => theme.spacing(2)}; padding: 0 ${({ theme }) => theme.spacing(1)}; padding-left: ${({ theme }) => theme.spacing(2)}; cursor: pointer; display: flex; flex: 1 0 0; height: ${({ theme }) => theme.spacing(8)}; width: 100%; &:hover { background: ${({ theme }) => theme.background.transparent.light}; } `; type SettingsListCardProps = { items: ListItem[]; getItemLabel: (item: ListItem) => string; hasFooter?: boolean; isLoading?: boolean; onRowClick?: (item: ListItem) => void; RowIcon?: IconComponent; RowRightComponent: ComponentType<{ item: ListItem }>; footerButtonLabel?: string; onFooterButtonClick?: () => void; }; export const SettingsListCard = < ListItem extends { id: string } = { id: string; }, >({ items, getItemLabel, hasFooter, isLoading, onRowClick, RowIcon, RowRightComponent, onFooterButtonClick, footerButtonLabel, }: SettingsListCardProps) => { const theme = useTheme(); if (isLoading === true) return ; return ( {items.map((item, index) => ( } divider={index < items.length - 1} onClick={() => onRowClick?.(item)} /> ))} {hasFooter && ( {footerButtonLabel} )} ); };