ghost-portal/packages/react-components/src/ExpanderScroll.tsx
Jaco 2bf56dbf11
Adjust styled injection (final round) (#8814)
* Adjust styled injection (final round)

* Fix (some) build issues

* Fix (some more) build errors

* ... it builds (... ship it!)
2023-01-15 19:53:55 +02:00

71 lines
1.7 KiB
TypeScript

// Copyright 2017-2023 @polkadot/react-components authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type { Props as ExpanderProps } from './Expander';
import React, { useCallback, useMemo } from 'react';
import styled from 'styled-components';
import Expander from './Expander';
import Table from './Table';
interface Props extends ExpanderProps {
empty?: string;
renderChildren?: (() => React.ReactNode[] | undefined | null) | null;
}
function mapRow (row: React.ReactNode, key: number): React.ReactNode {
return (
<tr key={key}>
<td>{row}</td>
</tr>
);
}
function ExpanderScroll ({ children, className, empty, renderChildren, summary }: Props): React.ReactElement<Props> {
const hasContent = useMemo(
() => !!(renderChildren || children),
[children, renderChildren]
);
const innerRender = useCallback(
(): React.ReactNode => (renderChildren || children) && (
<div className='tableContainer'>
<Table
empty={empty}
isInline
>
{renderChildren
? renderChildren()?.map(mapRow)
: Array.isArray(children)
? children.map(mapRow)
: <tr><td>{children}</td></tr>
}
</Table>
</div>
),
[children, empty, renderChildren]
);
return (
<StyledExpander
className={className}
renderChildren={hasContent ? innerRender : undefined}
summary={summary}
/>
);
}
const StyledExpander = styled(Expander)`
.tableContainer {
overflow-y: scroll;
display: block;
margin: 0 0 0 auto;
max-height: 13.75rem;
max-width: 25rem;
overflow-x: hidden;
}
`;
export default React.memo(ExpanderScroll);