From 0891b572777afa3d255554a67ef483254e66f001 Mon Sep 17 00:00:00 2001 From: Josiah South Date: Mon, 14 Mar 2022 18:35:52 -0500 Subject: [PATCH] Differentiate examples --- packages/app1/app.tsx | 20 ++++++---- packages/app1/styles.less | 7 +--- packages/app2/app.tsx | 27 +++++++++---- packages/store/app.ts | 40 ++++++++++++++----- .../types/{jsonPlaceholder.ts => Users.ts} | 7 +++- 5 files changed, 69 insertions(+), 32 deletions(-) rename packages/store/types/{jsonPlaceholder.ts => Users.ts} (76%) diff --git a/packages/app1/app.tsx b/packages/app1/app.tsx index 948de1d..fa11794 100644 --- a/packages/app1/app.tsx +++ b/packages/app1/app.tsx @@ -11,29 +11,33 @@ const Numbers = observer(() => { // this module is lazy loaded const [APIStore, setAPIStore] = React.useState(null); React.useEffect(() => { - APIStoreRuntime.then(module => setAPIStore(module.APIStoreInstance)); + APIStoreRuntime.then((module) => setAPIStore(module.APIStoreInstance)); }, []); return APIStore ? ( <>
-

Users App 1 (simple lazy fetch):

+

App1 (just display):

This component is rendered in the main application
- {APIStore.users.map(({ name, id, username }) => { + + + + + + + {APIStore.users.map(({ name, id, username, flags }) => { return ( - - + + + ); })}
UsernameFull NameIDFlag Count
{name}{id} {username}{name}{id}{flags}
-
"loading remote module..."}> diff --git a/packages/app1/styles.less b/packages/app1/styles.less index 49f0516..f407338 100644 --- a/packages/app1/styles.less +++ b/packages/app1/styles.less @@ -1,15 +1,12 @@ .users { &__container { - border-width: 3px; - border-style: solid; margin: 5px; padding: 12px; - &:first-child { - border-color: blue; - } &:last-child { border-color: red; + border-width: 3px; + border-style: solid; } } } diff --git a/packages/app2/app.tsx b/packages/app2/app.tsx index 42217d6..387c582 100644 --- a/packages/app2/app.tsx +++ b/packages/app2/app.tsx @@ -8,28 +8,39 @@ const APIStoreRuntime = import("store/Store"); export default observer(function App() { const [APIStore, setAPIStore] = React.useState(null); React.useEffect(() => { - APIStoreRuntime.then(module => setAPIStore(module.APIStoreInstance)); + APIStoreRuntime.then((module) => setAPIStore(module.APIStoreInstance)); }, []); return APIStore ? ( <>
-

Users App 2 (simple lazy fetch):

+

App2 (Modify Something):

This component is a Federated Module
- {APIStore.users.map(({ name, id, username }) => { + + + + + + + {APIStore.users.map(({ username, flags, id }) => { return ( - - + + + ); })}
UsernameIDFlagsAction
{name}{id} {username}{id}{flags} + {" "} + +
-
) : ( diff --git a/packages/store/app.ts b/packages/store/app.ts index 23e7690..319daa3 100644 --- a/packages/store/app.ts +++ b/packages/store/app.ts @@ -1,5 +1,11 @@ import axios, { AxiosInstance, AxiosRequestConfig } from "axios"; -import { action, configure, makeObservable, onBecomeObserved } from "mobx"; +import { + action, + computed, + configure, + makeObservable, + onBecomeObserved, +} from "mobx"; // without configuring enforceActions it would be possible to modify any observable from anywhere configure({ enforceActions: "observed" }); @@ -10,28 +16,42 @@ export class APIStore { constructor( axiosConf: AxiosRequestConfig = { baseURL: "https://jsonplaceholder.typicode.com", - auth: undefined + auth: undefined, } ) { makeObservable(this, { - users: true + users: true, }); // setup api that should be in it's own class this.api = axios.create(axiosConf); // setup lazy observables - onBecomeObserved(this, "users", this.getUsers); + onBecomeObserved(this, "users", this.handleBecomeObserved); } - users: User[] = []; + handleBecomeObserved = () => { + if (!this.users.length) { + this.getUsers(); + } + }; + + users: DemoUser[] = []; // async / await getUsers = action(async () => { const { data } = await this.api.get("/users"); - this.users = data; - // return data; + this.users = (data as DemoUser[]).map((user) => { + user.flags = 0; + return user; + }); }); - deleteLastUser = action(() => { - this.users.pop(); + deleteUser = action((userId: User["id"]) => { + this.users = this.users.filter((user) => user.id !== userId); + }); + addFlagToUser = action((userId: User["id"]) => { + const user = this.users.find((user) => user.id === userId); + if (user) { + user.flags++; + } }); // not using async/await is a little weirder @@ -44,4 +64,4 @@ export class APIStore { } // all references should point to this singleton (unless you want multiple stores). -export const APIStoreInstance = new APIStore(); \ No newline at end of file +export const APIStoreInstance = new APIStore(); diff --git a/packages/store/types/jsonPlaceholder.ts b/packages/store/types/Users.ts similarity index 76% rename from packages/store/types/jsonPlaceholder.ts rename to packages/store/types/Users.ts index 82e8872..5b1a360 100644 --- a/packages/store/types/jsonPlaceholder.ts +++ b/packages/store/types/Users.ts @@ -1,5 +1,5 @@ interface User { - id: 1; + id: number; name: string; username: string; email: string; @@ -14,3 +14,8 @@ interface User { }; }; } + + +interface DemoUser extends User { + flags: number +}; \ No newline at end of file