import React, { useState } from "react"; import CardText from "./atoms/Text"; import CardTime from "./atoms/Time"; import CardButton from "./atoms/Button"; import CardCaret from "./atoms/Caret"; import CardCustom from "./atoms/CustomField"; import CardMedia from "./atoms/Media"; import { makeNiceDate, isEmptyString } from "../../common/utilities"; import hash from "object-hash"; export const generateCardLayout = { basic: ({ event }) => { return [ [ { kind: "date", title: "Incident Date", value: event.datetime || event.date || ``, }, { kind: "text", title: "Location", value: event.location || `—`, }, ], [{ kind: "line-break", times: 0.4 }], [ { kind: "text", title: "Summary", value: event.description || ``, scaleFont: 1.1, }, ], ]; }, sourced: ({ event }) => { return [ [ { kind: "date", title: "Incident Date", value: event.datetime || event.date || ``, }, { kind: "text", title: "Location", value: event.location || `—`, }, ], [ { kind: "text", title: "Summary", value: event.description || ``, scaleFont: 1.1, }, ], ...event.sources.flatMap((source, idx) => [ [ { kind: "text", title: `Source ${idx}`, value: source.description || ``, scaleFont: 1.1, }, ], source.paths.map((p) => ({ kind: "media", title: "Media", value: [{ src: p, title: null }], })), ]), ]; }, }; export const Card = ({ content = [], isLoading = true, onSelect = () => {}, sources = [], isSelected = false, language = "en-US", }) => { const [isOpen, setIsOpen] = useState(false); const toggle = () => setIsOpen(!isOpen); // NB: should be internationalized. const renderTime = (field) => ( ); const renderCaret = () => sources.length === 0 && ( toggle()} isOpen={isOpen} /> ); const renderMedia = ({ media, idx }) => { return ; }; function renderField(field) { switch (field.kind) { case "media": return (
{field.value.map((media, idx) => { return renderMedia({ media, idx }); })}
); case "line": return (

); case "line-break": return (
); case "item": // this is like a span return null; case "markdown": return ; case "tag": return (
{field.value}
); case "button": return (
{field.title &&

{field.title}

} {/*
*/} {field.value.map((t, idx) => ( ))} {/*
*/}
); case "text": return !isEmptyString(field.value) && ; case "date": return renderTime(field); case "links": return (
{field.title &&

{field.title}

}
{field.value.map(({ text, href }, idx) => ( {text} ))}
); case "list": // Only render if some of the list's strings are non-empty const shouldFieldRender = !!field.value.length && !!field.value.filter((s) => !isEmptyString(s)).length; return shouldFieldRender ? ( //
{field.title &&

{field.title}

}
{field.value.map((t, idx) => ( ))}
) : null; default: return null; } } function renderRow(row) { return (
{row.map((field) => ( {renderField(field)} ))}
); } // TODO: render afterCaret appropriately from props sources = []; return (
  • {content.map((row) => renderRow(row))} {isOpen && (
    {sources.map(() => (
    ))}
    )} {sources.length > 0 ? renderCaret() : null}
  • ); };