query.js 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. import { addDatabaseChangeListener } from "expo-sqlite";
  2. import { useEffect, useState } from "react";
  3. import { is } from "../entity.js";
  4. import { SQL } from "../sql/sql.js";
  5. import { getTableConfig, getViewConfig, SQLiteTable, SQLiteView } from "../sqlite-core/index.js";
  6. import { SQLiteRelationalQuery } from "../sqlite-core/query-builders/query.js";
  7. import { Subquery } from "../subquery.js";
  8. const useLiveQuery = (query, deps = []) => {
  9. const [data, setData] = useState(
  10. is(query, SQLiteRelationalQuery) && query.mode === "first" ? void 0 : []
  11. );
  12. const [error, setError] = useState();
  13. const [updatedAt, setUpdatedAt] = useState();
  14. useEffect(() => {
  15. const entity = is(query, SQLiteRelationalQuery) ? query.table : query.config.table;
  16. if (is(entity, Subquery) || is(entity, SQL)) {
  17. setError(new Error("Selecting from subqueries and SQL are not supported in useLiveQuery"));
  18. return;
  19. }
  20. let listener;
  21. const handleData = (data2) => {
  22. setData(data2);
  23. setUpdatedAt(/* @__PURE__ */ new Date());
  24. };
  25. query.then(handleData).catch(setError);
  26. if (is(entity, SQLiteTable) || is(entity, SQLiteView)) {
  27. const config = is(entity, SQLiteTable) ? getTableConfig(entity) : getViewConfig(entity);
  28. listener = addDatabaseChangeListener(({ tableName }) => {
  29. if (config.name === tableName) {
  30. query.then(handleData).catch(setError);
  31. }
  32. });
  33. }
  34. return () => {
  35. listener?.remove();
  36. };
  37. }, deps);
  38. return {
  39. data,
  40. error,
  41. updatedAt
  42. };
  43. };
  44. export {
  45. useLiveQuery
  46. };
  47. //# sourceMappingURL=query.js.map