diff --git a/src/views/ExpressionCardListView/ExpressionCardListView.tsx b/src/views/ExpressionCardListView/ExpressionCardListView.tsx
index ba5324e..e2e0603 100644
--- a/src/views/ExpressionCardListView/ExpressionCardListView.tsx
+++ b/src/views/ExpressionCardListView/ExpressionCardListView.tsx
@@ -1,13 +1,13 @@
import { useContext, useMemo } from "react";
import { ExpressionCard } from "../../components";
-import { useExpressions } from "../../hooks";
+import { useAllExpressions } from "../../hooks";
import { IndexedExpression } from "../../model";
import { AppPath, AppRouting } from "../../model/routing";
import { ErrorView } from "../ErrorView";
export function ExpressionCardListView() {
const { setRoute } = useContext(AppRouting);
- const expressions = useExpressions();
+ const expressions = useAllExpressions();
const expression_list = useMemo(
() => (expressions || []).concat().sort(sort_function),
[expressions]
@@ -27,7 +27,7 @@ export function ExpressionCardListView() {
onClick={() =>
setRoute({
path: AppPath.CardView,
- options: { expression_card_id: id },
+ options: { expression_id: id },
})
}
>
diff --git a/src/views/ExpressionCardView/ExpressionCardView.tsx b/src/views/ExpressionCardView/ExpressionCardView.tsx
index e250b99..2bc545a 100644
--- a/src/views/ExpressionCardView/ExpressionCardView.tsx
+++ b/src/views/ExpressionCardView/ExpressionCardView.tsx
@@ -1,12 +1,17 @@
import { ExpressionCard } from "../../components";
import { ExpressionDescription } from "../../components/ExpressionDescription";
-import { useExpressionById, useExpressionQueryId } from "../../hooks";
+import { useExpressionById, useQueryExpressionId } from "../../hooks";
+import { ItemNotFoundError } from "../../model";
import { ErrorView } from "../ErrorView";
export function ExpressionCardView() {
- const expression_id = useExpressionQueryId();
+ const expression_id = useQueryExpressionId();
const expression = useExpressionById(expression_id);
- if (!expression) return ;
+
+ if (expression === undefined) return null; // LOADING
+ if (expression === ItemNotFoundError)
+ return ;
+
return (
{
if (expression_set_id === 1) {
setRoute({
diff --git a/src/views/ExpressionPracticeView/ExpressionPracticeView.tsx b/src/views/ExpressionPracticeView/ExpressionPracticeView.tsx
index 09929e7..9a90839 100644
--- a/src/views/ExpressionPracticeView/ExpressionPracticeView.tsx
+++ b/src/views/ExpressionPracticeView/ExpressionPracticeView.tsx
@@ -1,9 +1,9 @@
import { useMemo } from "react";
import {
- useExpressionCategories,
- useExpressionFilterQueryIds,
- useExpressionSetQueryId,
- useExpressionsInSet,
+ useCategoriesByExpressionId,
+ useQueryExpressionIdFilters,
+ useQueryExpressionSetId,
+ useExpressionsByExpressionSetId,
} from "../../hooks";
import { IndexedExpression } from "../../model";
import { sample } from "../../util";
@@ -11,18 +11,13 @@ import { ErrorView } from "../ErrorView";
import { ExpressionPracticeCardView } from "./ExpressionPracticeCardView";
export function ExpressionPracticeView() {
- const expression_set_id = useExpressionSetQueryId();
- const filter_ids = useExpressionFilterQueryIds();
- const expressions = useExpressionsInSet(expression_set_id);
+ const expression_set_id = useQueryExpressionSetId();
+ const filter_ids = useQueryExpressionIdFilters();
+ const expressions = useExpressionsByExpressionSetId(expression_set_id);
+ // TODO handle errors
- // Fallback rendering for content not yet fetched
- if (!expressions) return null;
- if (!filter_ids) return null;
+ if (!expressions) return null; // LOADING
- // Fallback views for expression set content not found
- if (!expression_set_id) {
- return ;
- }
const filtered_expressions = expressions.filter(
(expression) => !filter_ids.includes(expression.id!)
);
@@ -45,7 +40,7 @@ function ExpressionPracticeViewImpl({
select_from_expressions: expressions,
}: ExpressionPracticeViewImplProps) {
const expression = useMemo(() => sample(expressions), [expressions]);
- const categories = useExpressionCategories(expression.id!);
+ const categories = useCategoriesByExpressionId(expression.id!);
if (!categories) return null; // Loading
// Delegate internal interaction state to next component so it resets
diff --git a/src/views/ExpressionPracticeView/PromoteExpressionButton.tsx b/src/views/ExpressionPracticeView/PromoteExpressionButton.tsx
index 83df99e..a065ca5 100644
--- a/src/views/ExpressionPracticeView/PromoteExpressionButton.tsx
+++ b/src/views/ExpressionPracticeView/PromoteExpressionButton.tsx
@@ -1,5 +1,5 @@
import { useCallback } from "react";
-import { useExpressionSetQueryId } from "../../hooks";
+import { useQueryExpressionSetId } from "../../hooks";
import { assignExpressionToSet, database, removeExpression } from "../../model";
export interface PromoteExpressionButtonProps {
@@ -12,7 +12,7 @@ export interface PromoteExpressionButtonProps {
export function PromoteExpressionButton({
expression_id,
}: PromoteExpressionButtonProps) {
- const expression_set_id = useExpressionSetQueryId();
+ const expression_set_id = useQueryExpressionSetId();
const handleClick = useCallback(async () => {
const existing_next_level = await database.expression_sets
.where({ id: expression_set_id + 1 })
diff --git a/src/views/ExpressionSetDetailsView/ExpressionSetDetailsView.tsx b/src/views/ExpressionSetDetailsView/ExpressionSetDetailsView.tsx
index 183c8d6..ab6c218 100644
--- a/src/views/ExpressionSetDetailsView/ExpressionSetDetailsView.tsx
+++ b/src/views/ExpressionSetDetailsView/ExpressionSetDetailsView.tsx
@@ -1,26 +1,24 @@
import { useContext } from "react";
import { ExpressionSetInfo } from "../../components";
import {
- useExpressionSet,
- useExpressionSetQueryId,
- useExpressionsInSet,
+ useExpressionSetById,
+ useQueryExpressionSetId,
+ useExpressionsByExpressionSetId,
} from "../../hooks";
-import { IndexedExpressionSet } from "../../model";
+import { IndexedExpressionSet, ItemNotFoundError } from "../../model";
import { AppPath, AppRouting } from "../../model/routing";
import { ErrorView } from "../ErrorView";
export function ExpressionSetDetailsView() {
- const expression_set_id = useExpressionSetQueryId();
- const expression_set = useExpressionSet(expression_set_id);
- const expressions = useExpressionsInSet(expression_set_id);
+ const expression_set_id = useQueryExpressionSetId();
+ const expression_set = useExpressionSetById(expression_set_id);
+ const expressions = useExpressionsByExpressionSetId(expression_set_id);
- // Fallback for expression set not found
- if (!expressions) return null;
- if (!expression_set) {
+ if (!expression_set || !expressions) return null; // LOADING
+ if (expression_set === ItemNotFoundError) {
return ;
}
- // Fallback for expression set empty
return (
);
diff --git a/src/views/ExpressionSetListView/ExpressionSetListView.tsx b/src/views/ExpressionSetListView/ExpressionSetListView.tsx
index bf935eb..38e3214 100644
--- a/src/views/ExpressionSetListView/ExpressionSetListView.tsx
+++ b/src/views/ExpressionSetListView/ExpressionSetListView.tsx
@@ -1,9 +1,10 @@
-import { useExpressionSets } from "../../hooks";
+import { useAllExpressionSets } from "../../hooks";
import { ErrorView } from "../ErrorView";
import { ExpressionSetLink } from "./ExpressionSetLink";
export function ExpressionSetListView() {
- const expression_sets = useExpressionSets();
+ const expression_sets = useAllExpressionSets();
+
if (!expression_sets) return null; // LOADING
if (!expression_sets.length) {
return ;