Yehoshua Sandler 7dd6de064f
Refactor Context Groups & Area Detection (#4)
* feat: make new connections

* refact: context groups | feat: area detection

and a bunch of small things. hate yourself for this massive commit
2023-09-02 10:58:38 -05:00

71 lines
2.0 KiB
TypeScript

'use client'
import React, { useEffect, useState } from 'react'
import { Group } from 'react-konva'
import { useProject } from '../../context/Project/provider'
import { entities } from '../../wailsjs/wailsjs/go/models'
import Area from './Area'
import ProcessedWord from './ProcessedWord'
import EditingWord from './EditingWord'
import { useStage } from './context/provider'
type Props = { scale: number }
const Areas = ({ scale }: Props) => {
const { getSelectedDocument, selectedAreaId, getProcessedAreaById } = useProject()
const { isProcessedWordsVisible } = useStage()
const areas = getSelectedDocument()?.areas || []
const [editingWord, setEditingWord] = useState<entities.ProcessedWord | null>(null)
const [selectedProcessedArea, setSelectedProcessedArea] = useState<entities.ProcessedArea | null>(null)
useEffect(() => {
if (!selectedAreaId) return setSelectedProcessedArea(null)
else {
getProcessedAreaById(selectedAreaId).then(res => {
if (res) setSelectedProcessedArea(res)
}).catch(err => {
console.warn('getProcessedAreaById', err)
setSelectedProcessedArea(null)
})
}
}, [selectedAreaId])
const renderEditingWord = () => {
if (!editingWord) return
return <EditingWord
scale={scale}
editingWord={editingWord}
setEditingWord={setEditingWord}
/>
}
const renderProcessedWords = () => {
if (!selectedProcessedArea) return <></>
const words = selectedProcessedArea.lines.map(l => l.words).flat()
return words.map((w, index) => <ProcessedWord
key={index}
area={selectedProcessedArea}
word={w}
scale={scale}
setEditingWord={setEditingWord}
/>)
}
const renderAreas = (areas: entities.Area[]) => areas.map((a, index) => {
return <Area key={index} area={a} isActive={a.id === selectedAreaId} />
})
return <Group>
{renderAreas(areas)}
{isProcessedWordsVisible ? renderProcessedWords() : <></>}
{isProcessedWordsVisible ? renderEditingWord() : <></>}
</Group>
}
export default Areas