import type { KnowledgeSpace } from '@dify/contracts/knowledge-fs/types.gen' import { useTranslation } from 'react-i18next' import { useFormatTimeFromNow } from '@/hooks/use-format-time-from-now' import Link from '@/next/link' function getBuiltinIconName(iconRef: string | undefined) { if (!iconRef?.startsWith('builtin:')) return undefined return iconRef.slice('builtin:'.length).replaceAll('-', ' ') } export function KnowledgeSpaceCard({ knowledgeSpace }: { knowledgeSpace: KnowledgeSpace }) { const { t } = useTranslation('dataset') const { formatTimeFromNow } = useFormatTimeFromNow() const unavailable = t(($) => $['cornerLabel.unavailable']) const iconName = getBuiltinIconName(knowledgeSpace.iconRef) const updatedAt = Date.parse(knowledgeSpace.updatedAt) const formattedUpdatedAt = Number.isNaN(updatedAt) ? knowledgeSpace.updatedAt : formatTimeFromNow(updatedAt) return (
  • $['newKnowledge.cardType'])} title={iconName} className="flex size-10 shrink-0 items-center justify-center rounded-[10px] border-[0.5px] border-divider-regular bg-components-icon-bg-orange-dark-soft" > {iconName ? ( {iconName.charAt(0).toUpperCase()} ) : ( )}

    {knowledgeSpace.name}

    {t(($) => $['newKnowledge.cardType'])}

    {knowledgeSpace.description || t(($) => $['newKnowledge.noDescription'])}

    $['newKnowledge.tags'])}. ${unavailable}`} className="mt-1 flex min-w-0 items-center gap-1 px-4" > {t(($) => $['newKnowledge.tags'])} {unavailable}
    {t(($) => $['newKnowledge.documentsUnavailable'])} {t(($) => $['newKnowledge.appsUnavailable'])} / {t(($) => $['newKnowledge.updated'], { date: formattedUpdatedAt, })}
  • ) }