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