Skip to content

Instantly share code, notes, and snippets.

@satansdeer
Created August 5, 2023 09:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save satansdeer/247a57c9530b15b1029a26f4a1090710 to your computer and use it in GitHub Desktop.
Save satansdeer/247a57c9530b15b1029a26f4a1090710 to your computer and use it in GitHub Desktop.
import { useState } from "react";
import { NodeData } from "../utils/types";
import { useFocusedNodeIndex } from "./useFocusedNodeIndex";
import { Cover } from "./Cover";
import { Spacer } from "./Spacer";
import { BasicNode } from "../Node/BasicNode";
import { Title } from "./Title";
import { nanoid } from "nanoid";
export const Page = () => {
const [nodes, setNodes] = useState<NodeData[]>([]);
const [title, setTitle] = useState("Default Title");
const [focusedNodeIndex, setFocusedNodeIndex] = useFocusedNodeIndex({
nodes,
});
const addNode = (node: NodeData, index: number) => {
const newNodes = [...nodes];
newNodes.splice(index, 0, node);
setNodes(newNodes);
};
const removeNodeByIndex = (index: number) => {
const newNodes = [...nodes];
newNodes.splice(index, 1);
setNodes(newNodes);
};
const changeNodeValue = (index: number, value: string) => {
const newNodes = [...nodes];
newNodes[index].value = value;
setNodes(newNodes);
};
return (
<>
<Cover />
<div>
<Title addNode={addNode} title={title} changePageTitle={setTitle} />
{nodes.map((node, index) => (
<BasicNode
key={node.id}
node={node}
isFocused={focusedNodeIndex === index}
updateFocusedIndex={setFocusedNodeIndex}
index={index}
addNode={addNode}
removeNodeByIndex={removeNodeByIndex}
changeNodeValue={changeNodeValue}
/>
))}
<Spacer
handleClick={() => {
addNode({ type: "text", value: "", id: nanoid() }, nodes.length);
}}
showHint={!nodes.length}
/>
</div>
</>
);
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment