1
0
Fork 0
mirror of https://github.com/muerwre/vault-frontend.git synced 2025-04-24 20:36:40 +07:00
vault-frontend/src/components/flow/FlowCell/index.tsx
2022-01-07 18:32:22 +07:00

102 lines
2.9 KiB
TypeScript

import React, { FC } from "react";
import styles from "./styles.module.scss";
import { NavLink } from "react-router-dom";
import { CellShade } from "~/components/flow/CellShade";
import { FlowDisplay, INode } from "~/redux/types";
import { FlowCellText } from "~/components/flow/FlowCellText";
import classNames from "classnames";
import { FlowCellMenu } from "~/components/flow/FlowCellMenu";
import { useFlowCellControls } from "~/hooks/flow/useFlowCellControls";
import { useClickOutsideFocus } from "~/hooks/dom/useClickOutsideFocus";
import { MenuDots } from "~/components/common/MenuDots";
import { FlowCellImage } from "~/components/flow/FlowCellImage";
interface Props {
id: INode['id'];
to: string;
title: string;
image?: string;
color?: string;
text?: string;
flow: FlowDisplay;
canEdit?: boolean;
onChangeCellView: (id: INode['id'], flow: FlowDisplay) => void;
}
const FlowCell: FC<Props> = ({
id,
color,
to,
image,
flow,
text,
title,
canEdit = false,
onChangeCellView,
}) => {
const withText =
((!!flow.display && flow.display !== 'single') || !image) && flow.show_description && !!text;
const {
hasDescription,
setViewHorizontal,
setViewVertical,
setViewQuadro,
setViewSingle,
toggleViewDescription,
} = useFlowCellControls(id, text, flow, onChangeCellView);
const { isActive: isMenuActive, activate, ref, deactivate } = useClickOutsideFocus();
return (
<div className={classNames(styles.cell, styles[flow.display || 'single'])} ref={ref as any}>
{canEdit && !isMenuActive && (
<div className={styles.menu}>
<MenuDots onClick={activate} />
</div>
)}
{canEdit && isMenuActive && (
<div className={styles.display_modal}>
<FlowCellMenu
onClose={deactivate}
currentView={flow.display}
descriptionEnabled={flow.show_description}
hasDescription={hasDescription}
setViewHorizontal={setViewHorizontal}
setViewQuadro={setViewQuadro}
setViewSingle={setViewSingle}
setViewVertical={setViewVertical}
toggleViewDescription={toggleViewDescription}
/>
</div>
)}
<NavLink className={styles.link} to={to}>
{withText && (
<FlowCellText className={styles.text} heading={<h4 className={styles.title}>{title}</h4>}>
{text!}
</FlowCellText>
)}
{image && (
<FlowCellImage
src={image}
height={400}
className={styles.thumb}
style={{ backgroundColor: color }}
/>
)}
<CellShade color={color} className={styles.shade} size={withText ? 15 : 50} />
{!withText && (
<div className={styles.title_wrapper}>
<h4 className={styles.title}>{title}</h4>
</div>
)}
</NavLink>
</div>
);
};
export { FlowCell };