diff --git a/package-lock.json b/package-lock.json
index 04a8fb604..0adadd2ab 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -12,10 +12,11 @@
"@react-email/components": "0.0.19",
"@react-email/render": "0.0.15",
"@resvg/resvg-js": "2.6.2",
- "@tabnews/forms": "0.4.0",
- "@tabnews/helpers": "0.4.0",
- "@tabnews/infra": "0.0.6",
- "@tabnews/ui": "0.6.0",
+ "@tabnews/forms": "0.4.1",
+ "@tabnews/helpers": "0.4.1",
+ "@tabnews/hooks": "0.1.7",
+ "@tabnews/infra": "0.0.7",
+ "@tabnews/ui": "0.6.2",
"@upstash/ratelimit": "2.0.5",
"@upstash/redis": "1.34.9",
"async-retry": "1.3.3",
@@ -3803,9 +3804,9 @@
}
},
"node_modules/@tabnews/eslint-plugin-primer-react/node_modules/brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -3842,13 +3843,13 @@
}
},
"node_modules/@tabnews/forms": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/@tabnews/forms/-/forms-0.4.0.tgz",
- "integrity": "sha512-IE9OdiH/OMTPyUKw5/3bVflgi+hUQNRbBLQ3xIVQqB9DC+NDq3HtPohASsnzPTHahmbmQpZbGK53tk4AdWtp+w==",
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@tabnews/forms/-/forms-0.4.1.tgz",
+ "integrity": "sha512-Mo4K7slBAFrYIdGttMcA12Dcud7ab05fV/fY5svfufLQJ3zCQG5nQvvaTxby2S+eQJ2P6Q846bUPNZV5smI8qw==",
"license": "MIT",
"dependencies": {
- "@tabnews/helpers": "^0.4.0",
- "@tabnews/hooks": "^0.1.6",
+ "@tabnews/helpers": "^0.4.1",
+ "@tabnews/hooks": "^0.1.7",
"validation-br": "^1.5.2"
},
"peerDependencies": {
@@ -3856,39 +3857,39 @@
}
},
"node_modules/@tabnews/helpers": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/@tabnews/helpers/-/helpers-0.4.0.tgz",
- "integrity": "sha512-LnSLhsP0gaG3ujN1jIdIhCoOKmkQvkQHlrIxzJJWjnf6fxpmAMRE7IwUtXGWzg84Bad89qDeJR71EhYcZT/iEA==",
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@tabnews/helpers/-/helpers-0.4.1.tgz",
+ "integrity": "sha512-WJW+w7GpNLZrctJ0CWs/yrBTEmEJhZVf3Ii+sTNIg1r7W0Uckl8+RqoL3RwlgHacI4OCT2nkKh5mLj2UyiQL/g==",
"license": "MIT"
},
"node_modules/@tabnews/hooks": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/@tabnews/hooks/-/hooks-0.1.6.tgz",
- "integrity": "sha512-LGmnR1cDIO/Tuhg6A/0T7HNwBB+5SBTX2yJx0MPUUjlYVNYShyFULpYnksQCPkyJqC45sPyfB/D+W27Jp0LiHA==",
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/@tabnews/hooks/-/hooks-0.1.7.tgz",
+ "integrity": "sha512-xBIdybYjoqUKHTA2ZufbbaHrkbwry4JkwlK2Qoz0duF1P1dbHSzgiU1f/lgSw7gFvUnbvQI55ylSAEzDL44/NQ==",
"license": "MIT",
"dependencies": {
- "@tabnews/helpers": "^0.4.0"
+ "@tabnews/helpers": "^0.4.1"
},
"peerDependencies": {
"react": "^18.2.0"
}
},
"node_modules/@tabnews/infra": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/@tabnews/infra/-/infra-0.0.6.tgz",
- "integrity": "sha512-DZNG55N3AMFu9HKSBdrDIlFbQevVzjmzMYnTs5Vzmj1Mg2Qk7LKFIsfWV5yEipxaRyP2nuum3RLUkvRq1MYCgA==",
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/@tabnews/infra/-/infra-0.0.7.tgz",
+ "integrity": "sha512-1iRRKC3rs/sIsrl8lyqEqqfh+yQbH0G5SqSap3RBiq2EvRR13IJty180+IOkXmgSMcODQooCrvJZKG8sZUa3AQ==",
"license": "MIT",
"dependencies": {
"@axiomhq/js": "1.3.1",
- "@tabnews/helpers": "^0.4.0",
+ "@tabnews/helpers": "^0.4.1",
"@vercel/functions": "2.1.0",
"pino": "9.7.0"
}
},
"node_modules/@tabnews/ui": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/@tabnews/ui/-/ui-0.6.0.tgz",
- "integrity": "sha512-eBlJpF77DZxBsBQ1wAezjXnp9dyCtpmlkP3UxkIgcPn122VO8dX07jMX+nXWIE+PfGsx8l+Y/RJ4Pmfe7LdBqg==",
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/@tabnews/ui/-/ui-0.6.2.tgz",
+ "integrity": "sha512-3qbEuihm6qGCbT7OT6RHCWZwISltL/+O6lImt6ieCsL13G++EzHuAPzzQ34OsTH9RaCvhj0sdiLHZsw2hhDbFQ==",
"license": "MIT",
"dependencies": {
"@bytemd/plugin-breaks": "^1.22.0",
@@ -4469,10 +4470,11 @@
}
},
"node_modules/@typescript-eslint/eslint-plugin/node_modules/brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0"
}
@@ -4602,10 +4604,11 @@
}
},
"node_modules/@typescript-eslint/parser/node_modules/brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0"
}
@@ -4775,10 +4778,11 @@
}
},
"node_modules/@typescript-eslint/type-utils/node_modules/brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0"
}
@@ -4852,10 +4856,11 @@
}
},
"node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
"dev": true,
+ "license": "MIT",
"peer": true,
"dependencies": {
"balanced-match": "^1.0.0"
@@ -5851,10 +5856,11 @@
}
},
"node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "version": "1.1.12",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
+ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
@@ -6422,10 +6428,11 @@
}
},
"node_modules/commitizen": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/commitizen/-/commitizen-4.3.0.tgz",
- "integrity": "sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw==",
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/commitizen/-/commitizen-4.3.1.tgz",
+ "integrity": "sha512-gwAPAVTy/j5YcOOebcCRIijn+mSjWJC+IYKivTu6aG8Ei/scoXgfsMRnuAk6b0GRste2J4NGxVdMN3ZpfNaVaw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"cachedir": "2.3.0",
"cz-conventional-changelog": "3.3.0",
@@ -7779,9 +7786,9 @@
}
},
"node_modules/editorconfig/node_modules/brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
"license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0"
@@ -11256,9 +11263,9 @@
}
},
"node_modules/js-beautify/node_modules/brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
"license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0"
@@ -13434,9 +13441,9 @@
}
},
"node_modules/node-pg-migrate/node_modules/brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
"license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0"
@@ -14705,9 +14712,9 @@
}
},
"node_modules/react-email/node_modules/brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -16973,10 +16980,11 @@
}
},
"node_modules/test-exclude/node_modules/brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0"
}
@@ -17617,10 +17625,11 @@
}
},
"node_modules/typescript-eslint/node_modules/brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0"
}
diff --git a/package.json b/package.json
index 49f6578d5..976900a20 100644
--- a/package.json
+++ b/package.json
@@ -3,10 +3,11 @@
"@react-email/components": "0.0.19",
"@react-email/render": "0.0.15",
"@resvg/resvg-js": "2.6.2",
- "@tabnews/forms": "0.4.0",
- "@tabnews/helpers": "0.4.0",
- "@tabnews/infra": "0.0.6",
- "@tabnews/ui": "0.6.0",
+ "@tabnews/forms": "0.4.1",
+ "@tabnews/helpers": "0.4.1",
+ "@tabnews/hooks": "0.1.7",
+ "@tabnews/infra": "0.0.7",
+ "@tabnews/ui": "0.6.2",
"@upstash/ratelimit": "2.0.5",
"@upstash/redis": "1.34.9",
"async-retry": "1.3.3",
diff --git a/pages/[username]/[slug]/index.public.js b/pages/[username]/[slug]/index.public.js
index 61599c7a5..d3825a2f4 100644
--- a/pages/[username]/[slug]/index.public.js
+++ b/pages/[username]/[slug]/index.public.js
@@ -1,4 +1,5 @@
import { truncate } from '@tabnews/helpers';
+import { useTreeCollapse } from '@tabnews/hooks';
import { getStaticPropsRevalidate } from 'next-swr';
import { useEffect, useState } from 'react';
import useSWR from 'swr';
@@ -11,10 +12,11 @@ import authorization from 'models/authorization.js';
import content from 'models/content.js';
import removeMarkdown from 'models/remove-markdown.js';
import user from 'models/user.js';
-import { useCollapse } from 'pages/interface';
+
+const initialRenderIntent = 100;
+const renderIncrement = 50;
export default function Post({ contentFound, rootContentFound, parentContentFound, contentMetadata }) {
- const [childrenToShow, setChildrenToShow] = useState(108);
const [showConfetti, setShowConfetti] = useState(false);
const {
@@ -29,8 +31,6 @@ export default function Post({ contentFound, rootContentFound, parentContentFoun
);
useEffect(() => {
- setChildrenToShow(Math.ceil(window.innerHeight / 10));
-
const justPublishedNewRootContent = localStorage.getItem('justPublishedNewRootContent');
if (justPublishedNewRootContent) {
@@ -105,11 +105,9 @@ export default function Post({ contentFound, rootContentFound, parentContentFoun
@@ -193,28 +191,22 @@ function InReplyToLinks({ content, parentContent, rootContent }) {
);
}
-function RenderChildrenTree({ childrenList, pageRootOwnerId, renderIntent, renderIncrement, rootContent }) {
- const { childrenState, handleCollapse, handleExpand } = useCollapse({ childrenList, renderIntent, renderIncrement });
-
- return childrenState.map((child) => {
- const {
- children,
- children_deep_count,
- groupedCount,
- id,
- owner_id,
- owner_username,
- renderIntent,
- renderShowMore,
- slug,
- status,
- } = child;
+function RenderChildrenTree({ childrenList, pageRootOwnerId, renderIntent, rootContent }) {
+ const { nodeStates, handleCollapse, handleExpand } = useTreeCollapse({
+ nodes: childrenList,
+ totalBudget: renderIntent,
+ additionalBudget: renderIncrement,
+ });
+
+ return nodeStates.map((child) => {
+ const { children, children_deep_count, collapsedSize, expandedSize, id, owner_id, owner_username, slug, status } =
+ child;
const isPublished = status === 'published';
- const labelShowMore = Math.min(groupedCount, renderIncrement) || '';
+ const labelShowMore = Math.min(collapsedSize, renderIncrement) || '';
const plural = labelShowMore != 1 ? 's' : '';
const isPageRootOwner = pageRootOwnerId === owner_id;
- if (!renderIntent && !renderShowMore) return null;
+ if (!expandedSize && !collapsedSize) return null;
if (!isPublished && !children_deep_count) return null;
return (
@@ -226,7 +218,7 @@ function RenderChildrenTree({ childrenList, pageRootOwnerId, renderIntent, rende
mt: 3,
}}
key={id}>
- {renderIntent ? (
+ {expandedSize ? (
<>
0 && (
)}
@@ -316,7 +306,7 @@ function RenderChildrenTree({ childrenList, pageRootOwnerId, renderIntent, rende
) : (
)}
diff --git a/pages/interface/hooks/useCollapse/index.js b/pages/interface/hooks/useCollapse/index.js
deleted file mode 100644
index 47deb9ac5..000000000
--- a/pages/interface/hooks/useCollapse/index.js
+++ /dev/null
@@ -1,166 +0,0 @@
-import { useState } from 'react';
-
-export default function useCollapse({
- childrenDeepCount = 0,
- childrenList,
- renderIntent = 20,
- renderIncrement = 10,
- minimalSubTree = 3,
-}) {
- const [childrenState, setChildrenState] = useState(() =>
- computeStates({
- children: childrenList,
- renderIntent,
- childrenDeepCount,
- minimalSubTree,
- }),
- );
-
- function handleExpand(id) {
- setChildrenState((lastState) => {
- const childIndex = lastState.findIndex((child) => child.id === id);
- let grouperIndex = childIndex;
- const childrenToExpand = [];
-
- while (lastState[grouperIndex]?.renderIntent === 0) {
- childrenToExpand.push(lastState[grouperIndex]);
- grouperIndex += 1;
- }
-
- return [
- ...lastState.slice(0, childIndex),
- ...computeStates({
- children: childrenToExpand,
- renderIntent: renderIncrement,
- childrenDeepCount: lastState[childIndex].groupedCount,
- }),
- ...lastState.slice(grouperIndex),
- ];
- });
- }
-
- function handleCollapse(id) {
- setChildrenState((lastState) => {
- const childIndex = lastState.findIndex((child) => child.id === id);
- const children = [...lastState];
-
- if (childIndex < 0) return children;
-
- children[childIndex].renderIntent = 0;
- children[childIndex].renderShowMore = true;
-
- if (lastState[childIndex + 1]?.renderIntent === 0) {
- children[childIndex].groupedCount += lastState[childIndex + 1].groupedCount;
- children[childIndex + 1].renderShowMore = false;
- }
-
- let groupedIndex = childIndex - 1;
-
- while (lastState[groupedIndex]?.renderIntent === 0) {
- if (groupedIndex === childIndex - 1) {
- children[childIndex].renderShowMore = false;
- }
-
- children[groupedIndex].groupedCount += children[childIndex].groupedCount;
- groupedIndex -= 1;
- }
-
- return children;
- });
- }
-
- return {
- childrenState,
- handleCollapse,
- handleExpand,
- };
-}
-
-function computeStates({ children, renderIntent, childrenDeepCount, lastState = [], minimalSubTree = 3 }) {
- if (!children?.length && childrenDeepCount === 0) return [];
-
- let remaining = renderIntent;
- let treeIntent = minimalSubTree;
- let grouperIndex = null;
- let groupedCount = 0;
- let deltaIndex = 0;
-
- const newStates = children.map((child, index) => {
- if (lastState.length > 0) {
- if (lastState[index + deltaIndex]?.id === child.id && child.id) {
- const childLastState = lastState[index + deltaIndex];
- remaining -= childLastState.renderIntent;
- if (childLastState.renderShowMore) grouperIndex = index;
- if (childLastState.renderIntent) grouperIndex = null;
-
- return { ...childLastState, ...child };
- }
-
- // in case any child has changed order
- const childLastStateIndex = lastState.findIndex((childLastState) => childLastState.id === child.id && child.id);
-
- if (childLastStateIndex > -1) {
- deltaIndex = childLastStateIndex - index;
- remaining -= lastState[childLastStateIndex].renderIntent;
- if (lastState[childLastStateIndex].renderShowMore) grouperIndex = index;
- if (lastState[childLastStateIndex].renderIntent) grouperIndex = null;
-
- return { ...lastState[childLastStateIndex], ...child };
- }
- }
-
- if (remaining > 0) {
- if (remaining < treeIntent) {
- treeIntent = remaining;
- }
- const renderIntent = treeIntent > child.children_deep_count ? 1 + child.children_deep_count : treeIntent;
- remaining -= renderIntent;
-
- return {
- ...child,
- renderIntent: renderIntent,
- groupedCount: 1 + child.children_deep_count,
- renderShowMore: false,
- };
- }
-
- if (grouperIndex === null) {
- grouperIndex = index;
- remaining -= 1;
-
- return {
- ...child,
- renderIntent: 0,
- groupedCount: 1 + child.children_deep_count,
- renderShowMore: true,
- };
- }
-
- groupedCount += 1 + child.children_deep_count;
-
- return {
- ...child,
- renderIntent: 0,
- groupedCount: 1 + child.children_deep_count,
- renderShowMore: false,
- };
- });
-
- for (const child of newStates) {
- if (remaining < 1) break;
-
- if (child.groupedCount - child.renderIntent > remaining) {
- child.renderIntent += remaining;
- remaining = 0;
- } else {
- remaining -= child.groupedCount - child.renderIntent;
- child.renderIntent = child.groupedCount;
- }
- }
-
- if (grouperIndex !== null) {
- newStates[grouperIndex].groupedCount += groupedCount;
- }
-
- return newStates;
-}
diff --git a/pages/interface/index.js b/pages/interface/index.js
index 92dc06535..9961bda2c 100644
--- a/pages/interface/index.js
+++ b/pages/interface/index.js
@@ -1,6 +1,5 @@
export { default as Analytics } from './components/Analytics';
export { DefaultHead, default as Head } from './components/Head';
-export { default as useCollapse } from './hooks/useCollapse';
export { default as useMediaQuery } from './hooks/useMediaQuery';
export { UserProvider, default as useUser } from './hooks/useUser';
export { default as suggestEmail } from './utils/email-suggestion';