summaryrefslogtreecommitdiff
path: root/src/zoom/Paragraph.tsx
blob: 285aab4b3694f2b1326864850368df530d96f570 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
import React, { memo, useCallback, useEffect, useState } from "react";
import { motion } from "motion/react";
import type { ViewProps, LoadingStatus } from "./logic/types";
import { NLP } from "sortug-ai";
import Sentence from "./Sentence";
import { paragraphVariants, createHoverEffect } from "./animations";
import { useZoom } from "./hooks/useZoom";

function Paragraph({ rawText, context, idx, doc, stanza }: ViewProps) {
  const filterSegs = useCallback(() => {}, [rawText, doc.segments]);
  useEffect(() => {
    const relevantSegs = doc.segments.filter((seg) =>
      rawText.includes(seg.text),
    );
    setSegs(relevantSegs);
  }, [filterSegs]);
  console.log(rawText);
  console.log(doc.segments.length);
  const [segs, setSegs] = useState<NLP.Spacy.Sentence[]>([]);

  console.log(segs.length);
  const { viewState, handleElementClick } = useZoom();
  const { level, pIndex } = viewState;
  const selected = pIndex === idx;
  const isFocused = level === "paragraph" && selected;

  // State for sentences
  const [loading, setLoading] = useState<LoadingStatus>("pending");

  return (
    <>
      <motion.div
        key={idx + rawText}
        className={`paragraph-wrapper ${selected ? "selected" : ""}`}
        custom={selected}
        variants={paragraphVariants}
        initial="text"
        animate={level}
        onClick={(e) => handleElementClick(e, idx)}
        whileHover={
          level === "text"
            ? createHoverEffect(level, "text", "255, 255, 200")
            : {}
        }
      >
        {loading === "loading" && <div className="spinner" />}
        {level === "text" || !selected || segs.length === 0 ? (
          <p className="paragraph">{rawText}</p>
        ) : (
          <div className="sentences-container">
            {segs.map((sentence, sentIdx) => (
              <Sentence
                key={sentence.text + sentIdx}
                idx={sentIdx}
                rawText={sentence.text}
                spacy={sentence}
                context={{
                  idx: sentIdx,
                  parentText: rawText,
                  segmented: segs.map((s) => s.text),
                }}
                doc={doc}
                stanza={stanza}
                stanzas={stanza?.segments[sentIdx]}
              />
            ))}
          </div>
        )}
      </motion.div>
    </>
  );
}

export default memo(Paragraph);