Spaces:
Sleeping
Sleeping
| import { ThemeProvider } from "@emotion/react"; | |
| import { Grid } from "@mui/material"; | |
| import { enqueueSnackbar } from "notistack"; | |
| import { useEffect, useState } from "react"; | |
| import { buildTheme } from "../../infrastructure/theme/theme"; | |
| import baseUrl from "../../services/api/api.config"; | |
| import postData from "../../services/api/base"; | |
| import BarPlot from "../BarPlot"; | |
| import { SemanticDifferencesContext } from "../Context/WordsContext"; | |
| import DimensionsList from "../DimensionList"; | |
| import IntroSemantic from "../IntroSemantic"; | |
| import ScatterDicionary from "../ScatterDicionary"; | |
| import WordCard from "../WordCard"; | |
| export default function SemanticDifferences() { | |
| const [SemanticDifferencesWords, setSemanticDifferencesWords] = useState([]); | |
| const [selectedDimensions, setSelectedDimensions] = useState([0, 0]); | |
| const [wordOne, setWordOne] = useState(""); | |
| const [wordTwo, setWordTwo] = useState(""); | |
| const [variance, setVariance] = useState({ | |
| variances: new Array(50).fill(0), | |
| dimensions: [1, 2, 3], | |
| }); | |
| const onChangeWordOne = (event) => { | |
| const newWordOne = event.target.value; | |
| setWordOne(newWordOne); | |
| }; | |
| const onChangeWordTwo = (event) => { | |
| const newWordTwo = event.target.value; | |
| setWordTwo(newWordTwo); | |
| }; | |
| const handleDimensionClick = (dimension) => { | |
| setSelectedDimensions((prev) => { | |
| if (prev.includes(dimension)) { | |
| return prev.filter((dim) => dim !== dimension); | |
| } else if (prev.length < 2) { | |
| return [...prev, dimension]; | |
| } else { | |
| return [prev[1], dimension]; | |
| } | |
| }); | |
| }; | |
| const onPressButton = async () => { | |
| const url = `/add-difference-semantic-words`; | |
| const data = { | |
| word1: wordOne, | |
| word2: wordTwo, | |
| }; | |
| if (!wordOne.trim() || !wordTwo.trim()) { | |
| enqueueSnackbar("Please enter both words with at least 1 character", { | |
| variant: "alert", | |
| }); | |
| return; | |
| } | |
| postData(url, data) | |
| .catch((error) => { | |
| enqueueSnackbar(error.detail || error.message, { | |
| variant: "error", | |
| }); | |
| }) | |
| .then(fetchSemanticDifferenceWords) | |
| .then(fetchEmebedding); | |
| setWordOne(""); | |
| setWordTwo(""); | |
| }; | |
| const fetchSemanticDifferenceWords = async () => { | |
| const url = `${baseUrl}/difference-semantic-words`; | |
| const response = await fetch(url); | |
| const SemanticDifferencesWords = await response.json(); | |
| setSemanticDifferencesWords(SemanticDifferencesWords.data); | |
| }; | |
| const fetchEmebedding = async () => { | |
| const url = `${baseUrl}/get-embedding-difference`; | |
| const response = await fetch(url); | |
| const embeddingResponse = await response.json(); | |
| setVariance(embeddingResponse.data.variance); | |
| setSelectedDimensions( | |
| embeddingResponse.data.top_variance_dims.slice(0, 2).map((d) => d + 1) | |
| ); | |
| if (!embeddingResponse.success) { | |
| enqueueSnackbar("Not enough word to create variance"); | |
| } | |
| }; | |
| const deleteSemanticDifferenceWord = async (id) => { | |
| const url = `${baseUrl}/delete-difference-semantic-words/${id}`; | |
| await fetch(url, { | |
| method: "DELETE", | |
| headers: { "Content-Type": "application/json" }, | |
| }); | |
| await fetchSemanticDifferenceWords(); | |
| await fetchEmebedding(); | |
| }; | |
| useEffect(() => { | |
| fetchSemanticDifferenceWords(); | |
| }, []); | |
| console.log(variance); | |
| return ( | |
| <> | |
| <SemanticDifferencesContext.Provider | |
| value={{ SemanticDifferencesWords, setSemanticDifferencesWords }} | |
| > | |
| <ThemeProvider theme={buildTheme()}> | |
| <Grid> | |
| <IntroSemantic | |
| wordOne={wordOne} | |
| wordTwo={wordTwo} | |
| onChangeWordOne={onChangeWordOne} | |
| onChangeWordTwo={onChangeWordTwo} | |
| onPressButton={onPressButton} | |
| /> | |
| </Grid> | |
| <Grid container mt={2} textAlign={"center"} spacing={2}> | |
| <Grid item xs={9}> | |
| <BarPlot variance={variance} /> | |
| </Grid> | |
| <Grid item xs={3}> | |
| {Object.entries(SemanticDifferencesWords).map(([key, value]) => ( | |
| <Grid item key={value.id} mb={1} ml={4}> | |
| <WordCard | |
| word={key} | |
| id={value.id} | |
| deleteWord={deleteSemanticDifferenceWord} | |
| /> | |
| </Grid> | |
| ))} | |
| </Grid> | |
| </Grid> | |
| <DimensionsList | |
| embedding={variance} | |
| selectedDimensions={selectedDimensions} | |
| onDimensionClick={handleDimensionClick} | |
| /> | |
| <Grid item xs={12} container> | |
| <ScatterDicionary | |
| words={SemanticDifferencesWords} | |
| x={selectedDimensions[0]} | |
| y={selectedDimensions[1]} | |
| /> | |
| </Grid> | |
| </ThemeProvider> | |
| </SemanticDifferencesContext.Provider> | |
| </> | |
| ); | |
| } | |