Path: blob/master/src/packages/frontend/editors/slate/elements/heading/toggle.tsx
1698 views
/*1* This file is part of CoCalc: Copyright © 2020 Sagemath, Inc.2* License: MS-RSL – see LICENSE.md for details3*/45import React, { CSSProperties as CSS, useEffect, useState } from "react";6import { Icon } from "@cocalc/frontend/components/icon";7import { useSlate } from "../hooks";8import { Heading } from "./index";910const TOGGLE_STYLE = {11cursor: "pointer",12width: "1em",13display: "inline-block",14marginLeft: "-3em",15paddingRight: "3em",16color: "#666",17fontSize: "12pt",18} as CSS;1920interface Props {21element: Heading;22}2324export const HeadingToggle: React.FC<Props> = ({ element }) => {25const editor = useSlate();26const [collapsed, setCollapsed] = useState<boolean>(27editor.collapsedSections.has(element)28);2930useEffect(() => {31// check this every time editor changes, e.g., when user uses32// keyboard shortcut to change collapsedSections we have to33// handle that here. TODO: editor.collapsedSections is not34// in immer object, so we can't update only when it changes.35if (!!editor.collapsedSections.get(element) !== collapsed) {36setCollapsed(!collapsed);37}38}, [element, editor.ticks]);3940const toggle = () => {41if (collapsed) {42editor.collapsedSections.delete(element);43} else {44editor.collapsedSections.set(element, true);45}46setCollapsed(!collapsed);47editor.updateHiddenChildren();48};4950return (51<span52style={TOGGLE_STYLE}53onClick={toggle}54title={"Toggle collapse section (Control+Q)"}55>56<span style={{ float: "right" }}>57<Icon name={collapsed ? "chevron-right" : "chevron-down"} />58</span>59</span>60);61};626364