Skip to content

Commit e1c0adc

Browse files
committed
incorporate hooks from @wq/react and @wq/app
1 parent ba4d3f2 commit e1c0adc

File tree

8 files changed

+362
-17
lines changed

8 files changed

+362
-17
lines changed

packages/model/src/Root.js

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { Fragment } from "react";
2+
import { withWQ } from "@wq/react";
3+
import { useModelInstance, useModel, useModelConfig } from "./hooks.js";
4+
5+
export default withWQ(Fragment, {
6+
name: "Root",
7+
defaults: {
8+
components: {
9+
useModelInstance,
10+
useModel,
11+
useModelConfig,
12+
},
13+
},
14+
});

packages/model/src/hooks.js

+49
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import { useMemo } from "react";
2+
import { useSelector } from "react-redux";
3+
import * as ReduxORM from "redux-orm";
4+
import { useStore } from "@wq/store";
5+
6+
const { createSelector } = ReduxORM;
7+
8+
export function useModelInstance(name) {
9+
const store = useStore(),
10+
model = store.plugins.orm.models[name];
11+
12+
if (!model) {
13+
throw new Error(`Unknown model name ${name}`);
14+
}
15+
}
16+
17+
// Extracted from @wq/react/src/hooks.js
18+
export function useModel(name, filter) {
19+
const model = useModelInstance(name),
20+
selector = useMemo(() => {
21+
let selector;
22+
if (
23+
typeof filter === "function" ||
24+
(typeof filter === "object" && !Array.isArray(filter))
25+
) {
26+
// Filter by query
27+
selector = createSelector(model.orm, (session) =>
28+
model.getQuerySet(session).filter(filter).toRefArray()
29+
);
30+
} else if (filter) {
31+
// Filter by id (default ModelSelectorSpec behavior)
32+
selector = (state) =>
33+
createSelector(model.orm[name])(state, filter);
34+
} else {
35+
// All objects (use getQuerySet() to leverage config.ordering)
36+
selector = createSelector(model.orm, (session) =>
37+
model.getQuerySet(session).toRefArray()
38+
);
39+
}
40+
return selector;
41+
}, [model, filter]);
42+
43+
return useSelector(selector);
44+
}
45+
46+
export function useModelConfig(name) {
47+
const model = useModelInstance(name);
48+
return model.config;
49+
}

packages/model/src/index.js

+15-13
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
import { Model, model as createModel, getRootFields } from "./model.js";
2+
import { Root } from "./Root.js";
3+
import { useModelInstance, useModel, useModelConfig } from "./hooks.js";
24

35
const orm = {
46
// Plugin attributes
57
name: "orm",
68
type: "orm",
7-
init() {
8-
for (const conf of Object.values(this.app.config.pages)) {
9+
init(config) {
10+
for (const conf of Object.values(config?.pages || [])) {
911
if (!conf.list) {
1012
continue;
1113
}
@@ -15,9 +17,6 @@ const orm = {
1517
this._orm = model.orm;
1618
}
1719
}
18-
this.app.models = this.models;
19-
this.app.prefetchAll = (message) => this.prefetchAll(message);
20-
this.app.resetAll = () => this.reset();
2120
},
2221
actions: {
2322
reset() {
@@ -34,20 +33,23 @@ const orm = {
3433

3534
// Custom attributes
3635
models: {},
37-
async prefetchAll(message) {
38-
if (message) {
39-
this.app.spin.start(message);
40-
}
36+
async prefetchAll() {
4137
const result = await Promise.all(
4238
Object.values(this.models).map((model) => model.prefetch())
4339
);
44-
if (message) {
45-
this.app.spin.stop(message);
46-
}
4740
return result;
4841
},
4942
};
5043

5144
export default orm;
5245

53-
export { Model, createModel, createModel as model, getRootFields };
46+
export {
47+
Model,
48+
createModel,
49+
createModel as model,
50+
getRootFields,
51+
Root,
52+
useModelInstance,
53+
useModel,
54+
useModelConfig,
55+
};

packages/outbox/index.js

-3
This file was deleted.

packages/outbox/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"version": "2.1.0",
44
"description": "A simple model API for working with stored lists",
55
"type": "module",
6-
"main": "index.js",
6+
"main": "src/index.js",
77
"scripts": {
88
"test": "cd ../../ && npm run jest packages/outbox",
99
"prettier": "cd ../../ && npm run prettier -- --write packages/outbox/",

packages/outbox/src/Root.js

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { Fragment } from "react";
2+
import { withWQ } from "@wq/react";
3+
import { useSubmitForm, useOutbox, useUnsynced, useList } from "./hooks.js";
4+
5+
export default withWQ(Fragment, {
6+
name: "Root",
7+
defaults: {
8+
components: {
9+
useSubmitForm,
10+
useOutbox,
11+
useUnsynced,
12+
useList,
13+
},
14+
},
15+
});

0 commit comments

Comments
 (0)