diff --git a/src/hooks/useCategoriesByExpressionId.ts b/src/hooks/useCategoriesByExpressionId.ts index 97d18d5..31501a3 100644 --- a/src/hooks/useCategoriesByExpressionId.ts +++ b/src/hooks/useCategoriesByExpressionId.ts @@ -1,6 +1,9 @@ import { useLiveQuery } from "dexie-react-hooks"; import { database } from "../model"; +// TODO there may be a case here for reporting errors where relations exist +// but some referenced item does not exist in its table, maybe the +// return value should be { entries[], errors[] } export function useCategoriesByExpressionId(expression_id: number) { return useLiveQuery(() => { return database.expression_to_category diff --git a/src/hooks/useExpressionById.ts b/src/hooks/useExpressionById.ts index 636839f..08d371b 100644 --- a/src/hooks/useExpressionById.ts +++ b/src/hooks/useExpressionById.ts @@ -1,8 +1,16 @@ import { useLiveQuery } from "dexie-react-hooks"; -import { database } from "../model"; +import { database, ItemNotFoundError } from "../model"; export function useExpressionById(expression_id: number) { - return useLiveQuery(() => { - return database.expressions.where({ id: expression_id }).first(); - }, [expression_id]); + return useLiveQuery( + () => + database.expressions + .where({ id: expression_id }) + .toArray() + .then((result) => { + if (result.length === 0) return ItemNotFoundError; + return result[0]; + }), + [expression_id] + ); } diff --git a/src/hooks/useExpressionSetById.ts b/src/hooks/useExpressionSetById.ts index 63ce704..fe0d827 100644 --- a/src/hooks/useExpressionSetById.ts +++ b/src/hooks/useExpressionSetById.ts @@ -1,9 +1,16 @@ import { useLiveQuery } from "dexie-react-hooks"; -import { database } from "../model"; +import { database, ItemNotFoundError } from "../model"; export function useExpressionSetById(expression_set_id: number) { return useLiveQuery( - () => database.expression_sets.where({ id: expression_set_id }).first(), + () => + database.expression_sets + .where({ id: expression_set_id }) + .toArray() + .then((result) => { + if (result.length === 0) return ItemNotFoundError; + return result[0]; + }), [expression_set_id] ); } diff --git a/src/hooks/useExpressionsByExpressionSetId.ts b/src/hooks/useExpressionsByExpressionSetId.ts index 2af5d22..1628270 100644 --- a/src/hooks/useExpressionsByExpressionSetId.ts +++ b/src/hooks/useExpressionsByExpressionSetId.ts @@ -1,6 +1,9 @@ import { useLiveQuery } from "dexie-react-hooks"; import { database } from "../model"; +// TODO there may be a case here for reporting errors where relations exist +// but some referenced item does not exist in its table, maybe the +// return value should be { entries[], errors[] } export function useExpressionsByExpressionSetId(expression_set_id: number) { return useLiveQuery(() => { return database.expression_to_expression_set diff --git a/src/model/database.ts b/src/model/database.ts index f04a13d..ec7b7e2 100644 --- a/src/model/database.ts +++ b/src/model/database.ts @@ -14,6 +14,8 @@ export type IndexedExpression = WithId; export type IndexedExpressionSet = WithId; export type IndexedCategory = WithId; +export const ItemNotFoundError = Symbol(); + class Database extends Dexie { expressions!: Table; expression_sets!: Table; diff --git a/src/views/ExpressionCardListView/ExpressionCardListView.tsx b/src/views/ExpressionCardListView/ExpressionCardListView.tsx index c399bc8..e2e0603 100644 --- a/src/views/ExpressionCardListView/ExpressionCardListView.tsx +++ b/src/views/ExpressionCardListView/ExpressionCardListView.tsx @@ -14,8 +14,6 @@ export function ExpressionCardListView() { ); if (!expressions) return null; // LOADING - // TODO query error view? - if (!expressions.length) { return ; } diff --git a/src/views/ExpressionCardView/ExpressionCardView.tsx b/src/views/ExpressionCardView/ExpressionCardView.tsx index d737ee7..2bc545a 100644 --- a/src/views/ExpressionCardView/ExpressionCardView.tsx +++ b/src/views/ExpressionCardView/ExpressionCardView.tsx @@ -1,13 +1,16 @@ import { ExpressionCard } from "../../components"; import { ExpressionDescription } from "../../components/ExpressionDescription"; import { useExpressionById, useQueryExpressionId } from "../../hooks"; +import { ItemNotFoundError } from "../../model"; +import { ErrorView } from "../ErrorView"; export function ExpressionCardView() { const expression_id = useQueryExpressionId(); const expression = useExpressionById(expression_id); if (expression === undefined) return null; // LOADING - // TODO query error view? + if (expression === ItemNotFoundError) + return ; return (
diff --git a/src/views/ExpressionPracticeView/ExpressionPracticeView.tsx b/src/views/ExpressionPracticeView/ExpressionPracticeView.tsx index 1d8e27d..9a90839 100644 --- a/src/views/ExpressionPracticeView/ExpressionPracticeView.tsx +++ b/src/views/ExpressionPracticeView/ExpressionPracticeView.tsx @@ -14,9 +14,9 @@ export function ExpressionPracticeView() { const expression_set_id = useQueryExpressionSetId(); const filter_ids = useQueryExpressionIdFilters(); const expressions = useExpressionsByExpressionSetId(expression_set_id); + // TODO handle errors if (!expressions) return null; // LOADING - // TODO query error view? const filtered_expressions = expressions.filter( (expression) => !filter_ids.includes(expression.id!) diff --git a/src/views/ExpressionSetDetailsView/ExpressionSetDetailsView.tsx b/src/views/ExpressionSetDetailsView/ExpressionSetDetailsView.tsx index 825fab7..ab6c218 100644 --- a/src/views/ExpressionSetDetailsView/ExpressionSetDetailsView.tsx +++ b/src/views/ExpressionSetDetailsView/ExpressionSetDetailsView.tsx @@ -5,8 +5,9 @@ import { 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 = useQueryExpressionSetId(); @@ -14,7 +15,9 @@ export function ExpressionSetDetailsView() { const expressions = useExpressionsByExpressionSetId(expression_set_id); if (!expression_set || !expressions) return null; // LOADING - // TODO query error view? + if (expression_set === ItemNotFoundError) { + return ; + } return ( ; }