aboutsummaryrefslogtreecommitdiffstats
path: root/src/ui/Discussion.js
diff options
context:
space:
mode:
authors-ol <s-ol@users.noreply.github.com>2021-02-05 20:02:29 +0000
committers-ol <s-ol@users.noreply.github.com>2021-02-05 20:02:29 +0000
commitc09cd48c9ade0095b63d26bf1db1288688d8612b (patch)
treedb9444598b0036ecc8f6945bff163ad575df2bfb /src/ui/Discussion.js
parentreimplement collapsing (diff)
downloadfedidag-c09cd48c9ade0095b63d26bf1db1288688d8612b.tar.gz
fedidag-c09cd48c9ade0095b63d26bf1db1288688d8612b.zip
factor out Discussion component
Diffstat (limited to 'src/ui/Discussion.js')
-rw-r--r--src/ui/Discussion.js80
1 files changed, 80 insertions, 0 deletions
diff --git a/src/ui/Discussion.js b/src/ui/Discussion.js
new file mode 100644
index 0000000..2cea1c1
--- /dev/null
+++ b/src/ui/Discussion.js
@@ -0,0 +1,80 @@
+import { h } from 'preact';
+import { useState, useEffect } from 'preact/hooks';
+import Layout from '../layout';
+import css from './css';
+import { Links } from './Links';
+import { Note } from './Note';
+
+css`
+article > div {
+ position: relative;
+}
+
+article > div > canvas {
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+}
+`;
+
+export const Discussion = ({ name, items, collapsed, toggleCollapsed }) => {
+ const [{ width, height, positions, links }, setState] = useState({
+ width: 0,
+ height: 0,
+ positions: {},
+ links: [],
+ });
+
+ const layout = new Layout();
+ const setNodeSize = layout.addNode.bind(layout);
+
+ useEffect(() => {
+ layout.render().then(setState);
+ }, [ items, collapsed ]);
+
+ return (
+ <article>
+ <h1>{name}</h1>
+ <div>
+ <Links width={width} height={height} links={links} />
+ <div>
+ {Object.values(items).map((item) => {
+ const isCollapsed = collapsed[item.id];
+ const hidden =
+ item.inReplyTo.every(p => collapsed[p.id])
+ && item.replies.every(c => collapsed[c.id]);
+ if (hidden)
+ return;
+
+ const onlyParent = item.inReplyTo.length === 1 && items[item.inReplyTo[0].id];
+
+ for (const reply of item.replies) {
+ if (isCollapsed && collapsed[reply.id])
+ continue;
+
+ layout.addLink(item.id, reply.id);
+ }
+
+ return (
+ <Note
+ {...item}
+ smallHeader={
+ onlyParent // only one parent post
+ && onlyParent.attributedTo === item.attributedTo // posted by same user
+ && onlyParent.published === item.published // in the same second
+ }
+ collapsed={isCollapsed}
+ position={positions[item.id]}
+ onHide={toggleCollapsed}
+ onSize={setNodeSize}
+ />
+ );
+ })}
+ </div>
+ </div>
+ </article>
+ );
+};
+