From e39f77c8b37dfbb32291989f4ae08f9a74217d37 Mon Sep 17 00:00:00 2001
From: lingdocs <71590811+lingdocs@users.noreply.github.com>
Date: Sat, 11 Jun 2022 13:42:50 -0400
Subject: [PATCH] create EP picker
---
package.json | 2 +-
src/components/ep-explorer/EPExplorer.tsx | 111 ++++---------------
src/components/ep-explorer/EPPicker.tsx | 124 ++++++++++++++++++++++
src/components/ep-explorer/eps-reducer.ts | 2 +-
src/library.ts | 2 +
5 files changed, 150 insertions(+), 91 deletions(-)
create mode 100644 src/components/ep-explorer/EPPicker.tsx
diff --git a/package.json b/package.json
index ae464bd..d6c0fa1 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "@lingdocs/pashto-inflector",
- "version": "2.8.7",
+ "version": "2.8.8",
"author": "lingdocs.com",
"description": "A Pashto inflection and verb conjugation engine, inculding React components for displaying Pashto text, inflections, and conjugations",
"homepage": "https://verbs.lingdocs.com",
diff --git a/src/components/ep-explorer/EPExplorer.tsx b/src/components/ep-explorer/EPExplorer.tsx
index 995670e..cb0386c 100644
--- a/src/components/ep-explorer/EPExplorer.tsx
+++ b/src/components/ep-explorer/EPExplorer.tsx
@@ -1,19 +1,17 @@
import * as T from "../../types";
import useStickyState, { useStickyReducer } from "../../lib/useStickyState";
-import NPPicker from "../np-picker/NPPicker";
-import EquativePicker from "./EquativePicker";
import EPDisplay from "./EPDisplay";
import ButtonSelect from "../ButtonSelect";
-import EqCompPicker from "./eq-comp-picker/EqCompPicker";
import EqChartsDisplay from "./EqChartsDisplay";
import epsReducer from "./eps-reducer";
import { useEffect, useRef, useState } from "react";
import { completeEPSelection } from "../../lib/phrase-building/render-ep";
import { makeEPSBlocks } from "../../lib/phrase-building/blocks-utils";
-import APPicker from "../ap-picker/APPicker";
+import EquativePicker from "./EquativePicker";
import autoAnimate from "@formkit/auto-animate";
// @ts-ignore
import LZString from "lz-string";
+import EPPicker from "./EPPicker";
const phraseURLParam = "EPhrase";
const blankEps: T.EPSelectionState = {
@@ -35,14 +33,11 @@ const blankEps: T.EPSelectionState = {
function EPExplorer(props: {
opts: T.TextOptions,
entryFeeder: T.EntryFeeder,
-} & ({
- eps: T.EPSelectionState,
- onChange: (eps: T.EPSelectionState) => void,
-} | {})) {
+}) {
const [mode, setMode] = useStickyState<"charts" | "phrases">("charts", "EPExplorerMode");
const [eps, adjustEps] = useStickyReducer(
epsReducer,
- "eps" in props ? props.eps : blankEps,
+ blankEps,
"EPState7",
flashMessage,
);
@@ -63,6 +58,9 @@ function EPExplorer(props: {
}
// eslint-disable-next-line
}, []);
+ function handleEpsChange(e: T.EPSelectionState) {
+ adjustEps({ type: "load EPS", payload: e });
+ }
function flashMessage(msg: string) {
setAlert(msg);
setTimeout(() => {
@@ -114,86 +112,21 @@ function EPExplorer(props: {
}
- {mode === "phrases" &&
adjustEps({ type: "insert new AP" })}>+ AP
}
-
- {mode === "phrases" && <>
- {eps.blocks.map(({ block, key }, i) => (
-
-
- {i > 0 ?
adjustEps({ type: "shift block", payload: { index: i, direction: "back" }})}
- >
-
-
:
}
- {i < eps.blocks.length - 1 ?
adjustEps({ type: "shift block", payload: { index: i, direction: "forward" }})}
- >
-
-
:
}
-
- {block && block.type === "subjectSelection"
- ?
Subject}
- entryFeeder={props.entryFeeder}
- np={block.selection}
- counterPart={undefined}
- role="subject"
- onChange={payload => adjustEps({ type: "set subject", payload })}
- opts={props.opts}
- />
- :
adjustEps({ type: "set AP", payload: { index: i, AP } })}
- onRemove={() => adjustEps({ type: "remove AP", payload: i })}
- />}
-
- ))}
-
-
Predicate
-
- adjustEps({ type: "set predicate type", payload })}
- />
-
- {eps.predicate.type === "NP" ?
adjustEps({ type: "set predicate NP", payload })}
- opts={props.opts}
- /> : adjustEps({ type: "set predicate comp", payload })}
- opts={props.opts}
- entryFeeder={props.entryFeeder}
- />}
-
- >}
-
-
Equative
-
adjustEps({ type: "set equative", payload })}
- hideNegative={mode === "charts"}
- />
-
-
+ {mode === "phrases" &&
+ }
+ {mode === "charts" &&
+
Equative
+
adjustEps({ type: "set equative", payload })}
+ hideNegative={false}
+ />
+ }
{mode === "charts" && }
{mode === "phrases" && void,
+ entryFeeder: T.EntryFeeder,
+}) {
+ const parent = useRef(null);
+ const [alert, setAlert] = useState("");
+ useEffect(() => {
+ parent.current && autoAnimate(parent.current);
+ }, [parent]);
+ function adjustEps(action: EpsReducerAction) {
+ onChange(epsReducer(eps, action, handleAlert));
+ }
+ function handleAlert(msg: string) {
+ setAlert(msg);
+ setTimeout(() => {
+ setAlert(undefined);
+ }, 1500);
+ }
+ const phraseIsComplete = !!completeEPSelection(eps);
+ return
+
adjustEps({ type: "insert new AP" })}>+ AP
+
+ {eps.blocks.map(({ block, key }, i) => (
+
+
+ {i > 0 ?
adjustEps({ type: "shift block", payload: { index: i, direction: "back" }})}
+ >
+
+
:
}
+ {i < eps.blocks.length - 1 ?
adjustEps({ type: "shift block", payload: { index: i, direction: "forward" }})}
+ >
+
+
:
}
+
+ {block && block.type === "subjectSelection"
+ ?
Subject}
+ entryFeeder={entryFeeder}
+ np={block.selection}
+ counterPart={undefined}
+ role="subject"
+ onChange={payload => adjustEps({ type: "set subject", payload })}
+ opts={opts}
+ />
+ :
adjustEps({ type: "set AP", payload: { index: i, AP } })}
+ onRemove={() => adjustEps({ type: "remove AP", payload: i })}
+ />}
+
+ ))}
+
+
Predicate
+
+ adjustEps({ type: "set predicate type", payload })}
+ />
+
+ {eps.predicate.type === "NP" ?
adjustEps({ type: "set predicate NP", payload })}
+ opts={opts}
+ /> : adjustEps({ type: "set predicate comp", payload })}
+ opts={opts}
+ entryFeeder={entryFeeder}
+ />}
+
+
+
Equative
+
adjustEps({ type: "set equative", payload })}
+ hideNegative={false}
+ />
+
+
+ {alert &&
+ {alert}
+
}
+ ;
+}
+
+export default EPPicker;
\ No newline at end of file
diff --git a/src/components/ep-explorer/eps-reducer.ts b/src/components/ep-explorer/eps-reducer.ts
index 9e7f891..1707b41 100644
--- a/src/components/ep-explorer/eps-reducer.ts
+++ b/src/components/ep-explorer/eps-reducer.ts
@@ -7,7 +7,7 @@ import { isUnisexNounEntry } from "../../lib/type-predicates";
import { checkEPForMiniPronounsError } from "../../lib/phrase-building/compile";
import { adjustSubjectSelection, getSubjectSelection, insertNewAP, removeAP, setAP, shiftBlock } from "../../lib/phrase-building/blocks-utils";
-type EpsReducerAction = {
+export type EpsReducerAction = {
type: "set predicate type",
payload: "NP" | "Complement",
} | {
diff --git a/src/library.ts b/src/library.ts
index 4631083..144a6d2 100644
--- a/src/library.ts
+++ b/src/library.ts
@@ -149,6 +149,7 @@ import {
renderAPSelection,
} from "./lib/phrase-building/render-ap";
import NPPicker from "./components/np-picker/NPPicker";
+import EPPicker from "./components/ep-explorer/EPPicker";
import EPExplorer from "./components/ep-explorer/EPExplorer";
import shuffleArray from "./lib/shuffle-array";
import defaultTextOptions from "./lib/default-text-options";
@@ -253,6 +254,7 @@ export {
APBlock,
Block,
EPDisplay,
+ EPPicker,
// OTHER
typePredicates,
grammarUnits,