import {
Box,
List as MUIList,
ListItem as MUIListItem,
capitalize,
} from '@mui/material';
import { FC, ReactElement } from 'react';
import FlexBox from './FlexBox';
import { BodyText, MonoText, SensitiveText } from './Text';
const capEntryLabel: CapFormEntryLabel = (value) => {
const spaced = value.replace(/([a-z\d])([A-Z])/g, '$1 $2');
const lcased = spaced.toLowerCase();
return capitalize(lcased);
};
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,
}: {
depth?: number;
entries: FormEntries;
getEntryLabel: GetFormEntryLabelFunction;
getListProps?: GetFormEntriesPropsFunction;
getListItemProps?: GetFormEntryPropsFunction;
listKey?: string;
maxDepth: number;
renderEntry: RenderFormEntryFunction;
renderEntryValue: RenderFormValueFunction;
}): 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;
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,
}),
);
}
});
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: capEntryLabel, 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);
},
}: FormSummaryProps): ReturnType>> =>
buildEntryList({
entries,
getEntryLabel,
getListProps,
getListItemProps,
maxDepth,
renderEntry,
renderEntryValue,
});
export default FormSummary;