import React, { useState } from 'react' import { isResourceHost, isResourceList, IResourceLike, IResource, } from '@designable/core' import { isFn } from '@designable/shared' import { observer } from '@formily/reactive-react' import { usePrefix } from '../../hooks' import { IconWidget } from '../IconWidget' import { TextWidget } from '../TextWidget' import cls from 'classnames' import './styles.less' export type SourceMapper = (resource: IResource) => React.ReactChild export interface IResourceWidgetProps { title: React.ReactNode sources?: IResourceLike[] className?: string defaultExpand?: boolean children?: SourceMapper | React.ReactElement } export const ResourceWidget: React.FC = observer( (props) => { const prefix = usePrefix('resource') const [expand, setExpand] = useState(props.defaultExpand) const renderNode = (source: IResource) => { const { node, icon, title, thumb, span } = source return (
{thumb && } {icon && React.isValidElement(icon) ? ( <>{icon} ) : ( )} { {title || node.children[0]?.getMessage('title')} }
) } const sources = props.sources.reduce((buf, source) => { if (isResourceList(source)) { return buf.concat(source) } else if (isResourceHost(source)) { return buf.concat(source.Resource) } return buf }, []) const remainItems = sources.reduce((length, source) => { return length + (source.span ?? 1) }, 0) % 3 return (
{ e.stopPropagation() e.preventDefault() setExpand(!expand) }} >
{props.title}
{sources.map(isFn(props.children) ? props.children : renderNode)} {remainItems ? (
) : null}
) } ) ResourceWidget.defaultProps = { defaultExpand: true, }