import { Box, List as MUIList, ListItem as MUIListItem } from '@mui/material'; import { FC, ReactElement } from 'react'; import FlexBox from './FlexBox'; import { BodyText, MonoText, SensitiveText } from './Text'; import disassembleCamel from '../lib/disassembleCamel'; const renderEntryValueWithMono: RenderFormValueFunction = ({ entry }) => ( {String(entry)} ); const renderEntryValueWithPassword: RenderFormValueFunction = (args) => { const { entry, key } = args; return /passw/i.test(key) ? ( {String(entry)} ) : ( renderEntryValueWithMono(args) ); }; const buildEntryList = ({ depth = 0, entries, getEntryLabel, getListProps, getListItemProps, listKey, maxDepth, renderEntry, renderEntryValue, skip, }: { depth?: number; entries: FormEntries; getEntryLabel: GetFormEntryLabelFunction; getListProps?: GetFormEntriesPropsFunction; getListItemProps?: GetFormEntryPropsFunction; listKey?: string; maxDepth: number; renderEntry: RenderFormEntryFunction; renderEntryValue: RenderFormValueFunction; skip: Exclude; }): ReactElement => { const result: ReactElement[] = []; Object.entries(entries).forEach(([itemKey, entry]) => { const itemId = `form-summary-entry-${itemKey}`; const nest = entry !== null && typeof entry === 'object'; const value = nest ? null : entry; const fnArgs: CommonFormEntryHandlerArgs = { depth, entry: value, key: itemKey, }; if (skip(({ key }) => !/confirm/i.test(key), fnArgs)) { result.push( {renderEntry({ depth, entry: value, getLabel: getEntryLabel, key: itemKey, nest, renderValue: renderEntryValue, })} , ); } if (nest && depth < maxDepth) { result.push( buildEntryList({ depth: depth + 1, entries: entry, getEntryLabel, listKey: itemKey, maxDepth, renderEntry, renderEntryValue, skip, }), ); } }); const listId = `form-summary-list-${listKey ?? 'root'}`; return ( {result} ); }; const FormSummary = ({ entries, getEntryLabel = ({ cap, key }) => cap(key), getListProps, getListItemProps, hasPassword, maxDepth = 3, renderEntry = ({ depth, entry, getLabel, key, nest, renderValue }) => ( {getLabel({ cap: disassembleCamel, depth, entry, key })} {!nest && renderValue({ depth, entry, key })} ), // Prop(s) that rely on other(s). renderEntryValue = (args) => { const { entry } = args; if (['', null, undefined].some((bad) => entry === bad)) { return none; } return hasPassword ? renderEntryValueWithPassword(args) : renderEntryValueWithMono(args); }, skip = (base, ...args) => base(...args), }: FormSummaryProps): ReturnType>> => buildEntryList({ entries, getEntryLabel, getListProps, getListItemProps, maxDepth, renderEntry, renderEntryValue, skip, }); export default FormSummary;