snort/packages/app/src/Element/Collapsed.tsx

58 lines
1.5 KiB
TypeScript
Raw Normal View History

2023-02-09 22:22:16 +00:00
import { useState, ReactNode } from "react";
2023-10-16 14:48:56 +00:00
import classNames from "classnames";
2023-02-06 21:42:47 +00:00
2023-03-02 17:47:02 +00:00
import Icon from "Icons/Icon";
2023-09-28 09:26:10 +00:00
import ShowMore from "Element/Event/ShowMore";
2023-02-06 21:42:47 +00:00
interface CollapsedProps {
text?: string;
children: ReactNode;
collapsed: boolean;
setCollapsed(b: boolean): void;
2023-02-06 21:42:47 +00:00
}
2023-02-09 12:26:54 +00:00
const Collapsed = ({ text, children, collapsed, setCollapsed }: CollapsedProps) => {
2023-02-06 21:42:47 +00:00
return collapsed ? (
<div className="collapsed">
<ShowMore text={text} onClick={() => setCollapsed(false)} />
</div>
) : (
<div className="uncollapsed">{children}</div>
);
};
2023-02-06 21:42:47 +00:00
2023-02-09 11:24:15 +00:00
interface CollapsedIconProps {
icon: ReactNode;
collapsed: boolean;
}
export const CollapsedIcon = ({ icon, collapsed }: CollapsedIconProps) => {
return collapsed ? <div className="collapsed">{icon}</div> : <div className="uncollapsed">{icon}</div>;
2023-02-09 11:24:15 +00:00
};
2023-02-09 22:22:16 +00:00
interface CollapsedSectionProps {
title: ReactNode;
children: ReactNode;
2023-04-21 20:55:04 +00:00
className?: string;
2023-02-09 22:22:16 +00:00
}
2023-04-21 20:55:04 +00:00
export const CollapsedSection = ({ title, children, className }: CollapsedSectionProps) => {
2023-02-09 22:22:16 +00:00
const [collapsed, setCollapsed] = useState(true);
const icon = (
2023-10-16 14:48:56 +00:00
<div className={classNames("collapse-icon", { flip: !collapsed })}>
2023-04-21 20:55:04 +00:00
<Icon name="arrowFront" />
2023-02-09 22:22:16 +00:00
</div>
);
return (
<>
2023-10-16 14:48:56 +00:00
<div className={classNames("collapsable-section", className)} onClick={() => setCollapsed(!collapsed)}>
2023-04-21 20:55:04 +00:00
{title}
<CollapsedIcon icon={icon} collapsed={collapsed} />
</div>
2023-04-21 20:55:04 +00:00
{!collapsed && children}
</>
2023-02-09 22:22:16 +00:00
);
};
export default Collapsed;