import { ElementType , useMemo, cloneElement } from 'react'; import dayjs from 'dayjs'; import { Card, CardContent } from '@availity/mui-card'; import { Typography } from '@availity/mui-typography'; import { StatusChip } from '@availity/mui-chip'; import { CircularProgress } from '@availity/mui-progress'; import Link from '@mui/material/Link'; import { FavoriteHeart } from '@availity/mui-favorites'; import { Grid, Box } from '@availity/mui-layout'; import MuiBox from '@mui/material/Box'; import { ListItem, ListItemText } from '@availity/mui-list'; import ReactMarkdown from 'react-markdown'; import { styled } from '@mui/material/styles'; import { useSpacesContext } from '../Spaces'; import { useLink } from './useLink'; import type { SpacesLinkWithSpace, SpacesLinkWithSpaceId, SpacesLinkVariants } from './spaces-link-types'; import { isFunction } from '../helpers'; const SpacesLinkContainer = styled(Box, { name: 'AvSpacesLink', slot: 'root' })({}) as typeof MuiBox; const DateInfo = styled(Grid, { name: 'AvSpacesLink', slot: 'AvDateInfo' })({}); const SpacesLinkFavoriteHeart = styled(FavoriteHeart, { name: 'AvSpacesLink', slot: 'AvFavoriteHeart' })({}); const IconLink = styled(Link, { name: 'AvSpacesLink', slot: 'IconLink' })({}); const getDisplayDate = (date: string | null | undefined) => dayjs(date).format('MM/DD/YYYY'); const getContainerTag = ( propTag: ElementType | undefined, variant: SpacesLinkVariants ) => { if (variant && variant !== 'default') return { card: Card, list: ListItem }[variant]; return propTag || 'div'; }; const getBodyTag = ( propTag: ElementType | undefined, variant: SpacesLinkVariants ) => { if (variant && variant !== 'default') return { card: CardContent, list: 'div' }[variant]; return propTag || 'div'; }; const getTitleTag = ( propTag: ElementType | undefined, variant: SpacesLinkVariants, showUrl?: boolean ) => { if (!showUrl) return Typography; if (variant && variant !== 'default') return Link; return propTag || Link; }; const getTextTag = ( propTag: ElementType | undefined, variant: SpacesLinkVariants ) => { if (variant && variant !== 'default') return { card: Typography, list: ListItemText }[variant]; return propTag || 'div'; }; export const SpacesLink = ({ spaceId, space: propSpace, className, children, favorite, icon: FileIcon, showName = true, showNew, showDate, stacked, body = true, description: showDescription, tag, bodyTag, titleTag, textTag, titleClassName, variant = 'default', loading: propsLoading, clientId: propsClientId, maxDescriptionWidth, style, linkAttributes, role, analytics, customBadgeText, customBadgeColor, idPrefix = '', ...rest }: SpacesLinkWithSpace | SpacesLinkWithSpaceId) => { const { loading } = useSpacesContext(); const isLoading = loading || propsLoading; const [linkSpace, props] = useLink(propSpace || spaceId, { clientId: propsClientId, linkAttributes }); const showUrl = !linkSpace?.isGhosted && !!linkSpace?.link?.url; const favoriteIcon = useMemo( () => linkSpace?.configurationId && favorite && ( e.stopPropagation()} /> ), [favorite, linkSpace?.configurationId, linkSpace?.name, idPrefix] ); const dateInfo = useMemo( () => (showNew || showDate) && ( {showNew && linkSpace?.isNew && ( )} {showDate && ( {getDisplayDate(linkSpace?.activeDate)} )} ), [linkSpace?.activeDate, linkSpace?.isNew, showDate, showNew, stacked, linkSpace?.configurationId, idPrefix] ); const customBadgeDisplay = useMemo( () => customBadgeText && ( ), [ customBadgeColor, customBadgeText, showDate, showNew, stacked, variant, linkSpace?.isNew, idPrefix, linkSpace?.configurationId, ] ); if (isLoading) { return ; } const Tag = getContainerTag(tag, variant); const BodyTag = getBodyTag(bodyTag, variant); const TitleTag = getTitleTag(titleTag, variant, showUrl); const TextTag = getTextTag(textTag, variant); const renderChildren = () => { if (children) { return isFunction(children) ? (() => children({ ...linkSpace, ...analytics, ...props, }))() : cloneElement(children, { role: 'link', tabIndex: 0, style: { cursor: showUrl ? 'pointer' : 'not-allowed' }, 'aria-label': linkSpace?.name, ...analytics, ...props, }); } }; return ( {!stacked &&
{favoriteIcon}
} {FileIcon && linkSpace?.url && linkSpace?.type?.toUpperCase() === 'FILE' ? ( ) : null} {children ? renderChildren() : body && ( {showName ? linkSpace?.name : undefined} {stacked && dateInfo} {showDescription && linkSpace?.description && ( {linkSpace?.description} )} {variant === 'card' && customBadgeDisplay} )} {variant !== 'card' && customBadgeDisplay} {!stacked && dateInfo}
); };