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';