mirror of
https://github.com/muerwre/vault-frontend.git
synced 2025-04-24 20:36:40 +07:00
102 lines
2.9 KiB
TypeScript
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 };
|