<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: nhtanvir93</title>
    <description>The latest articles on DEV Community by nhtanvir93 (@nhtanvir93).</description>
    <link>https://dev.to/nhtanvir93</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1338163%2F8b2a8799-d65e-435d-a32e-fb6009d87645.png</url>
      <title>DEV Community: nhtanvir93</title>
      <link>https://dev.to/nhtanvir93</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nhtanvir93"/>
    <language>en</language>
    <item>
      <title>Can't get node index for which overflow happend, always get 0 index as overflow inded</title>
      <dc:creator>nhtanvir93</dc:creator>
      <pubDate>Fri, 08 Mar 2024 10:46:52 +0000</pubDate>
      <link>https://dev.to/nhtanvir93/cant-get-node-index-for-which-overflow-happend-always-get-0-index-as-overflow-inded-c2l</link>
      <guid>https://dev.to/nhtanvir93/cant-get-node-index-for-which-overflow-happend-always-get-0-index-as-overflow-inded-c2l</guid>
      <description>&lt;p&gt;Basically, I want to create next element while overflow happened for a element, here previewNodes is basically html element list array.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F79hf6zrpbd4wbxh4ul8f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F79hf6zrpbd4wbxh4ul8f.png" alt="Image description" width="800" height="374"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PreviewNode.tsx&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React, { ReactNode, useEffect, useRef, useState } from 'react';
import IPageNode from '../../interfaces/IPageNode';
import IPreviewNode from '../../interfaces/IPreviewNode';
import styles from './PreviewNode.module.css';

interface IProps {
    pageIndex: number;
    pageNode: IPageNode;
    onOverflow: (index: number, pageIndex: number) =&amp;gt; void;
}

const PreviewNode = ({ pageIndex, pageNode, onOverflow }: IProps) =&amp;gt; {
    const [validPreviewNodes, setValidPreviewNodes] = useState&amp;lt;IPreviewNode[]&amp;gt;([]);

    const pageRef = useRef(null);

    useEffect(() =&amp;gt; {
        setValidPreviewNodes([ ...pageNode.containingPreviewNodes ]);
    }, [ pageNode ]);

    const isOverflown = () =&amp;gt; {
        if(pageRef.current === null) return false;

        const page = pageRef.current as Element;

        return page.scrollHeight &amp;gt; page.clientHeight || page.scrollWidth &amp;gt; page.clientWidth;
    };

    const checkOverflow = (index: number) =&amp;gt; {
        if(pageNode.endPreviewNodeIndex === -1 &amp;amp;&amp;amp; isOverflown())
            onOverflow(index, pageIndex);
    };

    return (
        &amp;lt;div ref={ pageRef } className={ styles.previewNode }&amp;gt;
            &amp;lt;div className="ql-snow"&amp;gt;
                &amp;lt;div
                    className="ql-editor p-0"
                    dangerouslySetInnerHTML={{ __html: validPreviewNodes.map((node, index) =&amp;gt; {
                        checkOverflow(index);
                        return node.nodeContent;
                    }).join('') }}
                /&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
    );
};

export default PreviewNode;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;PreviewNodes.tsx&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React, { useEffect, useState } from "react";
import IPreviewNode from "../../interfaces/IPreviewNode";
import IPreviewNodeDiff from "../../interfaces/IPreviewNodeDiff";
import PreviewNode from "../PreviewNode";
import IPageNode from "../../interfaces/IPageNode";

interface IProps {
    previewNodes: IPreviewNode[];
    previewNodesDiff: IPreviewNodeDiff;
}

const PreviewNodes = ({ previewNodes, previewNodesDiff }: IProps) =&amp;gt; {
    const [pageNodes, setPageNodes] = useState&amp;lt;IPageNode[]&amp;gt;([]);

    const handleOverflow = (endNodeIndex, pageIndex) =&amp;gt; {
        console.log('HandleOverflow', 'pageIndex', pageIndex, 'endNodeIndex', endNodeIndex);
        const newPageNodes = pageNodes.map((pageNode, index) =&amp;gt; {
            if(index !== pageIndex)
                return pageNode;

            return {
                ...pageNode,
                endPreviewNodeIndex: endNodeIndex,
                containingPreviewNodes:
                    previewNodes.filter(
                        (previewNode, filterIndex) =&amp;gt;
                            filterIndex &amp;gt;= pageNode.startPreviewNodeIndex &amp;amp;&amp;amp; filterIndex &amp;lt; endNodeIndex
                    )
            };
        });

        setPageNodes(newPageNodes);
    };

    const checkAndModifyPageNodes = () =&amp;gt; {
        if(pageNodes.length === 0 &amp;amp;&amp;amp; previewNodes.length &amp;gt; 0) {
            let pageNode: IPageNode = {
                startPreviewNodeIndex: 0,
                endPreviewNodeIndex: -1,
                containingPreviewNodes: [ ...previewNodes ]
            };

            setPageNodes([ pageNode ]);
        } else if(pageNodes.length &amp;gt; 0 &amp;amp;&amp;amp; previewNodes.length &amp;gt; 0 &amp;amp;&amp;amp; pageNodes[pageNodes.length - 1].endPreviewNodeIndex !== -1) {
            const lastPageNode = pageNodes[pageNodes.length - 1];

            let possibleNodes =
                previewNodes.filter((possibleNode, index) =&amp;gt; index &amp;gt;= lastPageNode.startPreviewNodeIndex &amp;amp;&amp;amp; index &amp;lt;= lastPageNode.endPreviewNodeIndex);

            let pageNode: IPageNode = {
                ...lastPageNode,
                containingPreviewNodes: possibleNodes
            };

            setPageNodes([ ...pageNodes, pageNode ]);
        }
        else if(pageNodes.length &amp;gt; 0) {
            const lastPageNode = pageNodes[pageNodes.length - 1];

            const currentPossibleNodes
                = previewNodes.filter((previewNode, index) =&amp;gt; index &amp;gt;= lastPageNode.startPreviewNodeIndex);

            let modifiedPageNode: IPageNode = {
                ...lastPageNode,
                containingPreviewNodes: currentPossibleNodes
            };

            const possiblePageNodes = pageNodes.map((pageNode, index) =&amp;gt; {
                if(index &amp;lt; pageNodes.length - 1)
                    return pageNode;

                return modifiedPageNode;
            });

            setPageNodes(possiblePageNodes);
        }
    };

    useEffect(() =&amp;gt; {
        checkAndModifyPageNodes();
    }, [ previewNodes ]);

    return (
        &amp;lt;div&amp;gt;
            { pageNodes.map(
                (pageNode, index) =&amp;gt;
                    &amp;lt;PreviewNode
                        key={ 'preview-' + index }
                        pageIndex={ index }
                        pageNode={ pageNode }
                        onOverflow={ (endNodeIndex, pageIndex) =&amp;gt; handleOverflow(endNodeIndex, pageIndex) }
                    /&amp;gt;)
            }
        &amp;lt;/div&amp;gt;
    );
};

export default PreviewNodes;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>react</category>
    </item>
  </channel>
</rss>
