From 43ec075a32e33ee5adcff8f60a6f9f86ddbd5b7f Mon Sep 17 00:00:00 2001 From: dswbx Date: Thu, 12 Dec 2024 10:01:05 +0100 Subject: [PATCH 1/6] reworked api to return a custom promise to extract request info --- app/__test__/api/ModuleApi.spec.ts | 96 +++++++++++++++++++ app/__test__/api/api.spec.ts | 15 --- app/src/modules/ModuleApi.ts | 147 +++++++++++++++++------------ 3 files changed, 185 insertions(+), 73 deletions(-) create mode 100644 app/__test__/api/ModuleApi.spec.ts delete mode 100644 app/__test__/api/api.spec.ts diff --git a/app/__test__/api/ModuleApi.spec.ts b/app/__test__/api/ModuleApi.spec.ts new file mode 100644 index 0000000..caa42d0 --- /dev/null +++ b/app/__test__/api/ModuleApi.spec.ts @@ -0,0 +1,96 @@ +import { describe, expect, it } from "bun:test"; +import { Hono } from "hono"; +import { secureRandomString } from "../../src/core/utils"; +import { ModuleApi } from "../../src/modules"; + +class Api extends ModuleApi { + _getUrl(path: string) { + return this.getUrl(path); + } +} + +const host = "http://localhost"; + +describe("ModuleApi", () => { + it("resolves options correctly", () => { + const api = new Api({ host }); + expect(api.options).toEqual({ host }); + }); + + it("returns correct url from path", () => { + const api = new Api({ host }); + expect(api._getUrl("/test")).toEqual("http://localhost/test"); + expect(api._getUrl("test")).toEqual("http://localhost/test"); + expect(api._getUrl("test/")).toEqual("http://localhost/test"); + expect(api._getUrl("//test?foo=1")).toEqual("http://localhost/test?foo=1"); + }); + + it("fetches endpoint", async () => { + const app = new Hono().get("/endpoint", (c) => c.json({ foo: "bar" })); + const api = new Api({ host }); + api.fetcher = app.request as typeof fetch; + + const res = await api.get("/endpoint"); + expect(res.res.ok).toEqual(true); + expect(res.res.status).toEqual(200); + expect(res.data).toEqual({ foo: "bar" }); + expect(res.body).toEqual({ foo: "bar" }); + }); + + it("has accessible request", async () => { + const app = new Hono().get("/endpoint", (c) => c.json({ foo: "bar" })); + const api = new Api({ host }); + api.fetcher = app.request as typeof fetch; + + const promise = api.get("/endpoint"); + expect(promise.request).toBeDefined(); + expect(promise.request.url).toEqual("http://localhost/endpoint"); + + expect((await promise).body).toEqual({ foo: "bar" }); + }); + + it("adds token to headers when given in options", () => { + const token = secureRandomString(20); + const api = new Api({ host, token, token_transport: "header" }); + + expect(api.get("/").request.headers.get("Authorization")).toEqual(`Bearer ${token}`); + }); + + it("sets header to accept json", () => { + const api = new Api({ host }); + expect(api.get("/").request.headers.get("Accept")).toEqual("application/json"); + }); + + it("adds additional headers from options", () => { + const headers = new Headers({ + "X-Test": "123" + }); + const api = new Api({ host, headers }); + expect(api.get("/").request.headers.get("X-Test")).toEqual("123"); + }); + + it("uses basepath & removes trailing slash", () => { + const api = new Api({ host, basepath: "/api" }); + expect(api.get("/").request.url).toEqual("http://localhost/api"); + }); + + it("uses search params", () => { + const api = new Api({ host }); + const search = new URLSearchParams({ + foo: "bar" + }); + expect(api.get("/", search).request.url).toEqual("http://localhost/?" + search.toString()); + }); + + it("resolves method shortcut fns correctly", () => { + const api = new Api({ host }); + expect(api.get("/").request.method).toEqual("GET"); + expect(api.post("/").request.method).toEqual("POST"); + expect(api.put("/").request.method).toEqual("PUT"); + expect(api.patch("/").request.method).toEqual("PATCH"); + expect(api.delete("/").request.method).toEqual("DELETE"); + }); + + // @todo: test error response + // @todo: test method shortcut functions +}); diff --git a/app/__test__/api/api.spec.ts b/app/__test__/api/api.spec.ts deleted file mode 100644 index 9c2a61b..0000000 --- a/app/__test__/api/api.spec.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { describe, test } from "bun:test"; -import { DataApi } from "../../src/modules/data/api/DataApi"; - -describe("Api", async () => { - test("...", async () => { - /*const dataApi = new DataApi({ - host: "https://dev-config-soma.bknd.run" - }); - - const one = await dataApi.readOne("users", 1); - const many = await dataApi.readMany("users", { limit: 2 }); - console.log("one", one); - console.log("many", many);*/ - }); -}); diff --git a/app/src/modules/ModuleApi.ts b/app/src/modules/ModuleApi.ts index 541505b..68f0627 100644 --- a/app/src/modules/ModuleApi.ts +++ b/app/src/modules/ModuleApi.ts @@ -18,7 +18,11 @@ export type ApiResponse = { res: Response; }; -export abstract class ModuleApi { +export type TInput = string | (string | number | PrimaryFieldType)[]; + +export abstract class ModuleApi { + fetcher = fetch; + constructor(protected readonly _options: Partial = {}) {} protected getDefaultOptions(): Partial { @@ -35,14 +39,15 @@ export abstract class ModuleApi { } protected getUrl(path: string) { - return this.options.host + (this.options.basepath + "/" + path).replace(/\/\//g, "/"); + const basepath = this.options.basepath ?? ""; + return this.options.host + (basepath + "/" + path).replace(/\/{2,}/g, "/").replace(/\/$/, ""); } - protected async request( - _input: string | (string | number | PrimaryFieldType)[], + protected request( + _input: TInput, _query?: Record | URLSearchParams, _init?: RequestInit - ): Promise> { + ): FetchPromise> { const method = _init?.method ?? "GET"; const input = Array.isArray(_input) ? _input.join("/") : _input; let url = this.getUrl(input); @@ -78,14 +83,70 @@ export abstract class ModuleApi { } } - //console.log("url", url); - const res = await fetch(url, { + const request = new Request(url, { ..._init, method, body, headers }); + return new FetchPromise(request, this.fetcher); + } + + get( + _input: TInput, + _query?: Record | URLSearchParams, + _init?: RequestInit + ) { + return this.request(_input, _query, { + ..._init, + method: "GET" + }); + } + + post(_input: TInput, body?: any, _init?: RequestInit) { + return this.request(_input, undefined, { + ..._init, + body, + method: "POST" + }); + } + + patch(_input: TInput, body?: any, _init?: RequestInit) { + return this.request(_input, undefined, { + ..._init, + body, + method: "PATCH" + }); + } + + put(_input: TInput, body?: any, _init?: RequestInit) { + return this.request(_input, undefined, { + ..._init, + body, + method: "PUT" + }); + } + + delete(_input: TInput, _init?: RequestInit) { + return this.request(_input, undefined, { + ..._init, + method: "DELETE" + }); + } +} + +class FetchPromise implements Promise { + // @ts-ignore + [Symbol.toStringTag]: "FetchPromise"; + + constructor( + public request: Request, + protected fetcher = fetch + ) {} + + async execute() { + const res = await this.fetcher(this.request); let resBody: any; let resData: any; @@ -108,60 +169,30 @@ export abstract class ModuleApi { }; } - protected async get( - _input: string | (string | number | PrimaryFieldType)[], - _query?: Record | URLSearchParams, - _init?: RequestInit - ) { - return this.request(_input, _query, { - ..._init, - method: "GET" - }); + // biome-ignore lint/suspicious/noThenProperty: it's a promise :) + then( + onfulfilled?: ((value: T) => TResult1 | PromiseLike) | null | undefined, + onrejected?: ((reason: any) => TResult2 | PromiseLike) | null | undefined + ): Promise { + return this.execute().then(onfulfilled as any, onrejected); } - protected async post( - _input: string | (string | number | PrimaryFieldType)[], - body?: any, - _init?: RequestInit - ) { - return this.request(_input, undefined, { - ..._init, - body, - method: "POST" - }); + catch( + onrejected?: ((reason: any) => TResult | PromiseLike) | null | undefined + ): Promise { + return this.then(undefined, onrejected); } - protected async patch( - _input: string | (string | number | PrimaryFieldType)[], - body?: any, - _init?: RequestInit - ) { - return this.request(_input, undefined, { - ..._init, - body, - method: "PATCH" - }); - } - - protected async put( - _input: string | (string | number | PrimaryFieldType)[], - body?: any, - _init?: RequestInit - ) { - return this.request(_input, undefined, { - ..._init, - body, - method: "PUT" - }); - } - - protected async delete( - _input: string | (string | number | PrimaryFieldType)[], - _init?: RequestInit - ) { - return this.request(_input, undefined, { - ..._init, - method: "DELETE" - }); + finally(onfinally?: (() => void) | null | undefined): Promise { + return this.then( + (value) => { + onfinally?.(); + return value; + }, + (reason) => { + onfinally?.(); + throw reason; + } + ); } } From 9d9aa7b7a54fe87a5c9367305323f502a5054bef Mon Sep 17 00:00:00 2001 From: dswbx Date: Thu, 12 Dec 2024 10:37:52 +0100 Subject: [PATCH 2/6] added useApi and useApiQuery to work seamlessly with SWR (tbc) --- app/package.json | 13 ++++++------ app/src/auth/api/AuthApi.ts | 4 ++-- app/src/data/api/DataApi.ts | 14 ++++++------- app/src/media/api/MediaApi.ts | 8 ++++---- app/src/modules/ModuleApi.ts | 14 +++++++++---- app/src/ui/client/index.ts | 1 + app/src/ui/client/use-api.ts | 18 +++++++++++++++++ app/src/ui/routes/test/index.tsx | 4 +++- app/src/ui/routes/test/tests/swr-and-api.tsx | 20 +++++++++++++++++++ bun.lockb | Bin 811408 -> 811840 bytes 10 files changed, 72 insertions(+), 24 deletions(-) create mode 100644 app/src/ui/client/use-api.ts create mode 100644 app/src/ui/routes/test/tests/swr-and-api.tsx diff --git a/app/package.json b/app/package.json index ada105a..46054e4 100644 --- a/app/package.json +++ b/app/package.json @@ -22,18 +22,19 @@ }, "license": "FSL-1.1-MIT", "dependencies": { + "@cfworker/json-schema": "^2.0.1", "@libsql/client": "^0.14.0", - "@tanstack/react-form": "0.19.2", "@sinclair/typebox": "^0.32.34", + "@tanstack/react-form": "0.19.2", + "aws4fetch": "^1.0.18", + "dayjs": "^1.11.13", + "fast-xml-parser": "^4.4.0", + "hono": "^4.6.12", "kysely": "^0.27.4", "liquidjs": "^10.15.0", "lodash-es": "^4.17.21", - "hono": "^4.6.12", - "fast-xml-parser": "^4.4.0", - "@cfworker/json-schema": "^2.0.1", - "dayjs": "^1.11.13", "oauth4webapi": "^2.11.1", - "aws4fetch": "^1.0.18" + "swr": "^2.2.5" }, "devDependencies": { "@aws-sdk/client-s3": "^3.613.0", diff --git a/app/src/auth/api/AuthApi.ts b/app/src/auth/api/AuthApi.ts index df7ffb0..8c2fe8b 100644 --- a/app/src/auth/api/AuthApi.ts +++ b/app/src/auth/api/AuthApi.ts @@ -29,11 +29,11 @@ export class AuthApi extends ModuleApi { return res; } - async me() { + me() { return this.get<{ user: SafeUser | null }>(["me"]); } - async strategies() { + strategies() { return this.get>(["strategies"]); } diff --git a/app/src/data/api/DataApi.ts b/app/src/data/api/DataApi.ts index 0fa6d3e..967a5f1 100644 --- a/app/src/data/api/DataApi.ts +++ b/app/src/data/api/DataApi.ts @@ -15,7 +15,7 @@ export class DataApi extends ModuleApi { }; } - async readOne( + readOne( entity: string, id: PrimaryFieldType, query: Partial> = {} @@ -23,14 +23,14 @@ export class DataApi extends ModuleApi { return this.get>([entity, id], query); } - async readMany(entity: string, query: Partial = {}) { + readMany(entity: string, query: Partial = {}) { return this.get>( [entity], query ?? this.options.defaultQuery ); } - async readManyByReference( + readManyByReference( entity: string, id: PrimaryFieldType, reference: string, @@ -42,19 +42,19 @@ export class DataApi extends ModuleApi { ); } - async createOne(entity: string, input: EntityData) { + createOne(entity: string, input: EntityData) { return this.post>([entity], input); } - async updateOne(entity: string, id: PrimaryFieldType, input: EntityData) { + updateOne(entity: string, id: PrimaryFieldType, input: EntityData) { return this.patch>([entity, id], input); } - async deleteOne(entity: string, id: PrimaryFieldType) { + deleteOne(entity: string, id: PrimaryFieldType) { return this.delete>([entity, id]); } - async count(entity: string, where: RepoQuery["where"] = {}) { + count(entity: string, where: RepoQuery["where"] = {}) { return this.post>( [entity, "fn", "count"], where diff --git a/app/src/media/api/MediaApi.ts b/app/src/media/api/MediaApi.ts index c69c952..121c2fc 100644 --- a/app/src/media/api/MediaApi.ts +++ b/app/src/media/api/MediaApi.ts @@ -10,11 +10,11 @@ export class MediaApi extends ModuleApi { }; } - async getFiles() { + getFiles() { return this.get(["files"]); } - async getFile(filename: string) { + getFile(filename: string) { return this.get(["file", filename]); } @@ -32,13 +32,13 @@ export class MediaApi extends ModuleApi { }); } - async uploadFile(file: File) { + uploadFile(file: File) { const formData = new FormData(); formData.append("file", file); return this.post(["upload"], formData); } - async deleteFile(filename: string) { + deleteFile(filename: string) { return this.delete(["file", filename]); } } diff --git a/app/src/modules/ModuleApi.ts b/app/src/modules/ModuleApi.ts index 68f0627..5094abf 100644 --- a/app/src/modules/ModuleApi.ts +++ b/app/src/modules/ModuleApi.ts @@ -21,7 +21,7 @@ export type ApiResponse = { export type TInput = string | (string | number | PrimaryFieldType)[]; export abstract class ModuleApi { - fetcher = fetch; + protected fetcher?: typeof fetch; constructor(protected readonly _options: Partial = {}) {} @@ -136,17 +136,18 @@ export abstract class ModuleApi implements Promise { +export class FetchPromise> implements Promise { // @ts-ignore [Symbol.toStringTag]: "FetchPromise"; constructor( public request: Request, - protected fetcher = fetch + protected fetcher?: typeof fetch ) {} async execute() { - const res = await this.fetcher(this.request); + const fetcher = this.fetcher ?? fetch; + const res = await fetcher(this.request); let resBody: any; let resData: any; @@ -195,4 +196,9 @@ class FetchPromise implements Promise { } ); } + + getKey(): string { + const url = new URL(this.request.url); + return url.pathname + url.search; + } } diff --git a/app/src/ui/client/index.ts b/app/src/ui/client/index.ts index 30bb77f..9a22c49 100644 --- a/app/src/ui/client/index.ts +++ b/app/src/ui/client/index.ts @@ -6,5 +6,6 @@ export { useBaseUrl } from "./ClientProvider"; +export { useApi, useApiQuery } from "./use-api"; export { useAuth } from "./schema/auth/use-auth"; export { Api } from "../../Api"; diff --git a/app/src/ui/client/use-api.ts b/app/src/ui/client/use-api.ts new file mode 100644 index 0000000..e22de44 --- /dev/null +++ b/app/src/ui/client/use-api.ts @@ -0,0 +1,18 @@ +import type { Api } from "Api"; +import type { FetchPromise } from "modules/ModuleApi"; +import useSWR, { type SWRConfiguration } from "swr"; +import { useClient } from "ui/client/ClientProvider"; + +export const useApi = () => { + const client = useClient(); + return client.api; +}; + +export const useApiQuery = ( + fn: (api: Api) => FetchPromise, + options?: SWRConfiguration & { enabled?: boolean } +) => { + const api = useApi(); + const p = fn(api); + return useSWR(options?.enabled === false ? null : p.getKey(), () => p, options); +}; diff --git a/app/src/ui/routes/test/index.tsx b/app/src/ui/routes/test/index.tsx index 9cc89d4..a303ccd 100644 --- a/app/src/ui/routes/test/index.tsx +++ b/app/src/ui/routes/test/index.tsx @@ -1,5 +1,6 @@ import AppShellAccordionsTest from "ui/routes/test/tests/appshell-accordions-test"; import SwaggerTest from "ui/routes/test/tests/swagger-test"; +import SWRAndAPI from "ui/routes/test/tests/swr-and-api"; import { Route, useParams } from "wouter"; import { Empty } from "../../components/display/Empty"; import { Link } from "../../components/wouter/Link"; @@ -37,7 +38,8 @@ const tests = { EntityFieldsForm, FlowsTest, AppShellAccordionsTest, - SwaggerTest + SwaggerTest, + SWRAndAPI } as const; export default function TestRoutes() { diff --git a/app/src/ui/routes/test/tests/swr-and-api.tsx b/app/src/ui/routes/test/tests/swr-and-api.tsx new file mode 100644 index 0000000..a4808ea --- /dev/null +++ b/app/src/ui/routes/test/tests/swr-and-api.tsx @@ -0,0 +1,20 @@ +import { useState } from "react"; +import { useApiQuery } from "ui/client"; +import { Scrollable } from "ui/layouts/AppShell/AppShell"; + +export default function SWRAndAPI() { + const [enabled, setEnabled] = useState(false); + const { data, error, isLoading } = useApiQuery(({ data }) => data.readMany("posts"), { + enabled, + revalidateOnFocus: true + }); + + return ( + + + {error &&
failed to load
} + {isLoading &&
loading...
} + {data &&
{JSON.stringify(data, null, 2)}
} +
+ ); +} diff --git a/bun.lockb b/bun.lockb index 4edbd2759fd3df359bbb4ce0193a19b657c2945a..8a89fbc6f95d69a892f7daccf28d28530f4845e4 100755 GIT binary patch delta 114784 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 O<;E__y+U%k>;4aa42Ej} delta 115082 zcmeFad32P;{_Wk}Nkca?3IZyVf=mVo0v!y4%%ciw00D&%0tpZx2|)(2iOA%@)MDW* zDhhZw8aXJ66DkNIDtZu5Q4mo;QKKT@_PHu!q$I$f3q*W zf={3Omkg>KSUtCBYRhV|cdPa9l9!pDF&X{Y*L^-x%(@P&4nFdd&ld(?*lckuSOY#3 ztPJ)c-PvI3>#;u7>qKjA_4z77$7hes&mHgcC2#ZjYQoP2l`RoG2mFR~!o8rX*$h?# z*MVn&kAW)ZUa&k^8B{ZVdBdj5c*~Z11*rV>#`=8ae7>%;hVJnBsv-;k5oRU6Z8QAf z^qS|{3cjTv^)qXeE#QWU1(P%Le7<$>#G0PdF>qvOZ0tEdMW6rBHajCfKQlkW=i4#G z_I6r&4xRJ))(~HXQtksQfeRgO`q>g~^L)forvNW27B)lY(&h)$o|j^j=Cgi`oxJjzJW)r{tLRw zL!X?TlbP2GT_XX{m^gl7*E|B5>G_$y4n(K{@KJf`V|>S4fwR806R;mtKenLDp!R}l zz=k8S>9y*Nto^O6uRJIN34Ld0<~6wLUj=7sXMGQsVSViI9Z>x__>Irk7H_Yszh{+_E>8NzAv0UX8gpF>ErW#7ZEQz ztOlxidx+OCjLDpkKW##WZ*2a=32iWhY3S#ozeqDK0y)+Ui{P@9=YFwzFOe3;Mri!GJdbQb>UjZEkSjo8c6!+tbr7y3Os+6 zl%3xbUK#!Y6`uz-4*R`%4T1IG--c`jbIRF*Zi8!LcZ2G{OD_I#Pz{_4sv%jRy8jC0 z%AOtpEBRvApI9G{sTvo?@1K7T4x z?fa#I%~-y=ZOAdWjIxNnXv_*hHDo3}Q2Jk;Yurcv*_mJb-+1%b(%NmKJ|DL*4?R7)k*;&GH z)0$g+99DjAheNP3dsGuNwluYXxxZLL|P^PmGlpC4i z(q)1gxqe_&EnnNl7Q7TxOXDL^jRbYzmqz@)3&GbxrEig93rMDcs^BKL7SDg0lCMbD zg!nf>H7o{d%BNiDk9s|L?*dynUwMv7Pm6M9;gz_A3EYGrC=AQ!NHHa|M&L$I}Ym<^64OFN3Of^u#<)6d76l z2H57VM%S7-0@wI-g3Dr>f*Q9vplbi_ayu^jES8(q>{7eKwT$In(5Uy9*H|Y~&GmYH zn(h5+P}$Qq*`4l0FI)W2gZ#dR==Th^`Idm%fE&gRTu>wW5wV(_mq9J$V?(T!ybXHR z1FDmcIb1i)4#Emh3wV*kxu8m&0%|TsWsb_6z~pcsO}Zf~eR4Ls#(4ign~qbg62xw} zuzs}b2s=QTQ_{VGd;zYWtfWmEs5?Ln{GN2bcQncyX$|WcxGX=G;rF!yv%#idLZ;t$ zF}QD(HR!(RTDqIy>SKW`Z#c+=Trg|#7@ME~^w#|S_9!uVqCGwLjkRk~H@k7RZDwq& zov$0RvNN)n_nYA|qkG3$^I8CEXr_a*gB9bgJ}GZvM$-6+WAaF^A<6_bBzc*W^QKWw zW?mjg(NUT0Vw)P&2v?eD2O$_c(4a=N^CauuT7$|nGTqwTlN0PTZO*mR^b{ytS`KQ+ zMyD5erzvbPC!OiIoAk25JMt~IpKOQZ2v`q2x4^c213Vet7-agRv+f|H=A=4;7H#qk zwjn{dIRws4`0+gnli^4@3XhqY_;LC zt#9CJM}mvr0hhCT2$Z{@2g*r3w7||x6jXeMSWHG4z>~jN=o~vtg}HiO?^+emUBl?uH;1u)XdIV zW*d@lm(5q~_&&Hgwi%S^9Yk093zmc33DhK@mX!t7fS*B4>DR_qoRKlHKtAe0*Mr*k z*ajZKgp_ahz}V8p-$cKD*k;eko{&8$JwN|rxJ+{gsNyOrgfHk0s zo0OE3K8bZcZ>7!mF{t?b{Jd;r-{f@8F?{0rRNwUR*|9&G)KCBXaoe)11?AV)>|?jc@vW@JsgVFG&Q)Xa=@^oLhlYhDIwQWt=lgP9KVLA7mctgva_bB{e? zOE~~4)oxI+8~+h|zG>TN^?zD99n=6!$ecQPY`)JYR3qMh(oWEG4j%$FLGwXP&?JY~ zf->Q*pe(QjD9g&vO3zbo-v5_1gmqv&^gBU(LUh&?0&?Vo9j1b^{kotWdxFCw>uf`I zf~xp=P!&E3s=|d1r-53Fqa5}J)sXfM8#}B4R+UMoZM0Jtf7+ub2b#3AUa%u`J*a6I zzRX^Z&!J};$Z`&Spayisi+1WyFp@I$NfYxYvr{sy9BHQUaO)+TZwzJ2a&O2>pD-qt zdGXc$;j!l~ZWO)hb?X$`fg0hFJh(_|+uB#p@ertv$Cu1sy>#4r$2Xby8jpMViCe7M z409OYcHA};8=h1vdcih3cn9CKect78JE%Uc-)`Fw_d}yHr;MM-^!B05vxqO4kUcs( zbCmDnw=AEz!;Wn(s4-((^z5qd+t%7Tfzl6xESu=89`D%BUku8hRDajncsnZ4puGy$ z?EVwftTsWH*}l5d#>X98+~dbRbbJqud+PXJ8sB4Yd{5RS2S-3XiF?-Rui23}kBVdk zlk&3jb66m8j~e%wf88J~7nO=%1PEx<0I&X^Z~TCqQWVoz$fkWnL1_MlDo!)JCXK7dQ# z4cEeb1yltqK<)nB4p|Q!O|TD#%DM*j{=!c2@-Mh7X}8YL${r`@IrU3x17krId@-m6 z@C7Iz{qMsTn;fy2mpLYLD*3jcEBye{X(4q3yC9!ZOo>l&9kiR+0rj^1!#M~6Az+ggW%$`}5@;!seXYE3##b2Cu(m6JXu zJ0m?mHZi$Yt+S6?tqiENlaj_~=VVXzb&ah^ZsZTfwk0>}eC0_yDCZU0`rkZZ>)!;b zyo{{$@#7fOF%R0uJI|u4zKMD1s6O9ivE)`YqVY}U^yXq)IdMX!9?be`|7!W#S1qoA ztMmsQpO&6ChE2zJ;5R$g?}3`)jPcn8GKFc$DHBxNJan1B7+=6^ML&?^Ms!wBf51Cu zTny^`Q4iGcUP=N@<;Fn3oBK(4pvl>pdGTlH1qrsG5up6a+Qfjj8^z0M84P&C-ko@r z+o_B#HwCUCtxEY#5-6j)D{L$L5tLQk49Ym; z6=de*WKO2X)yfAvBmSeDO+S%z%6~xxTTcb>9Qlp46f84sRx#jt&WGS?;Q~<0Fy6Cx zkA|bG!iy>gynOj^H8egF@g8n-@oB_s;tyA`J?{=z!|~F-b5zlksOLEbc)UncncwY)Tq2nw$b}zn_Ab19W%48kUy_wM;@Ithp{Aoq9Q#>%RUp-{ji83df4;?@vBEZWqg!g*S-YT)Ep8oLv$qwlW}6CvZ0LO-jn2$T}@K$5vlqZ&dN~>=^H%jL+9SmfN;Q^siq7r7#$3X8uJ1Z_8*7 zia*@Qj{Xu*-SmTM{%wshT5twjn9{^{V;o%Fcn7ZZuYg)aL!I6WWcZ>b1r4Mk?Nzgy z*$k<0Ez=vAcCEJ2=~J>ZCQitonlrwYPPKmAtY#@cT^j{oNL*~wP0mZ7l9`vEc~Nt_ zc-{oHXf}WpdT^tQF9)iCM<_rA-VUmQ zJW%JH7UWk?@1r8+I{{bvA;in!bqD32+Jcp}+_UqOy#1~rf-+?1r|0FRPxDoVYe
~uNl`Qv;O;9fDHs>#gPv&4Mgs9rYvF{d{jYp(&jDMu49CUbI90hh-3cf<#K z+x!WnuS{NA3oCfsv4oK6NcP<<&H+v*EP<*7?PEFjr-la-x|G7p#flb2 z!i!<49?M-C32cAW9Ifr|81TJjn%41m40n3X=j%aiqA3phQxajVV>xS6!_N^?E`O|O zQzY;ssq2#Zme+m0OHj{>CC`lnUxQs1Te~qeeD-FauNS&cdbkj#yk4rn=FR4)^7^*; zd;`4_lV?Q2`LOoNVUm*qDT%P|CaJDJHTWaJ9%gMNfBVoIK3`j}(4xhWz@#@!)A|(i zG-?M=EuJ3blxZIVIaPMtCU;h$zH|&ZM_9aXU*cVgEOWrKa zqOd+Caob?FYf4#lyU*9HBrXls&SS~NlLL__&)>6#m z-s?{Zy=zA;7)xFd3D1S4*p&A~!Y{$>{3KJuk1$Oyy?-I%Pcu!L_&Wuj-f6}*p(8)- zw9|w&6-N9i<_M9&iSJRiIo5*i8}Oj@WGN` z_#i<|Px+Xp_WZr9ByaFEb;DpOureC-z@2-|nwA*SX4ETUIk8lKOVcFT-zmKFLp$Om zWBijpiqENLF%xzLMI_1=!|PxzZSjjD;e)WwFy@r18+>dnx{N7$koksnC$6%p4sD0Y zGEUoA*?sYnidk{FkwIif$7dut>-!LgvX&hGovG;NECeT1r&iG|-A3D@0kTW0Nj zBCI2EL787*?S9iVLXIj2>=>0bxn%<>Ay}H~FvaKlBjHU@6&H?aX$L>Erf%Dx3hPQ- z1+O_b!IEL+Oma1ffw`r{09HR}t2jM?<5AQ2+c-AMEn<58GWm-QB0OLOE>Mk?cw6>-Egdo@f}K=JoP0w)fcHL3oNT7Ib{eeR2r zr1K-eKVThWNw=o@JDAn&S-Q7;X^ysMl){I7zH2ChvA;bM9u1Re;yD&Zf)BvD#*Xby z4IDUZj&>k*t0UI+SBMqOjs#{LF=IQTmOW~R&vr8d*2ODB)4viX)3oGI7i+cKvZA~ziyEYOY3)4ih5~fG|mzpMB8N!+0 znz3CO@VaKT=!EagQE2$J?|i<&q%9jOx;f%M&t!LFHnNNPs^5zDMS|O5?PF_Cq=w6W z@AKuw69;3k6mzVrpWWmKpKnw=B3$`LpYQrO3+BLjc-hwxlDW}JX73oxjT!91U?XhN?-LvnFD#t&lbs;1xxpM*7Zn}cK&VyhSYc}TXz3K;rYG#cl#dlZ7734p z$w~vJcmS&d)=x|}8~hR0(W}zm%B=3qC`>#_nO=PE>_~V8Y+y+{PQWI_nLpF4?&I&| zzswu~!b^U((@(j3BjI;o>NM*F#~A*_#^H(BXnVrs(#puB0y}>(P5Ut=&3=uacBt1s z+N|!!{`5NHC9$=yrG`%slE?J6uW-t5&SS=Mw?qOr{$|!(j(dIqmEl;J8vcfmts?p6 zNU-VeJlim9`!Hqq5R|+09Cq+1%=SK<`iIYVB@wLJ9g*;@Fs%>o_>}P0A3pQMmHrO? zn&!xrboDx)KR$<8Yz(Gtv@$v1 z_x1Ora3R5-WKHl+iMwE_aptdLvah0m83~kba;{>B{(xY|SkBVaV6{ZQZ(uBEUTSbY zp(|oZGg8AJ5b8*7eE9rG=(?cav!4>L7km?iy^C{Y(=vX~0vO80k>C_qA8*iJA*8YK zd;3L|vhnh8*x@T+T7Z>fx$`1{+sc|XY0TMXROkQZMZ(oWe&?p-m~IIBeIsH?3sQr- z30<#HxJ@}*gSEZ8VLiMQpAs5qQ~}!P&6>p8h@|S*_;+gLNzTecimA8HDhe z3sM6sDwv~#y_MeNTE=Z?MZfP-lXNWu|9M5T=2}{NO(nnQAm|?(=Y24lh-Xm2A7LY6 zYwu|v;_<&4z^=tUeFRoAsKKkMxN5_95t6U*o1!2)HtZ_pF~x0RRjJu4q4@qt_(sQQ zIR5h)n3fY;>-I>v!dbR1Hk;QN)U(XdVKnncR2crcFi=&b=VV^L**=e-YVM- z)2z^pu0&R==8qp*7DoL2O!oB*#5}~7v7Fme!_N}BhSaRdeUb1v)os^sOAAsGA??kv z!C2X1>E6JF-zM0{RyHRRta%P;WOU(c2&wnJSkdzgBur+*%K11F{2G>`RQ?90Njmjk zTf^@gV3N`)dJVxVZSWMq%Wben&5~e@U|*|#La?_DHmc><&4d!d;|X@7E*8wXNcbt3 zZHL^-NtoQX&pSQ%yPG2!RDbKaGNGIuso^gOX|Sq#XY8wZ!&7@6^Kxq>xD?h(ODp_3 zAj^29*>q0O9t?g!k;kz9scUW9PE2ijBsdS2 z8asARYWRIZ@?tCiY@=EoJHBPSBl-0vdkkCD;W}o`80@&VIRXu*)wQ;T!IfaR#>5Gh?&yH!ol0Ewinu!P~&|+}w5)`CpvhsgzJV+XmJJuDLf% z^T9}RJGvX@d1RCO1U10&yc&vIWAT@|4#zkx248^nHaS!Lss5nJp33SUkxJ`K&Q#rR z30~<%1}n5@J$k|LP=c~u4vn~w6)^7z$#UXJ3@qK|=+i+Hlaoz3PZCVC!Sg$69#mg2 zhv0Apzt&1)Q84^JhiPTJe%OE8VDExlKFzi*J2Is70&8JUeZ1*7*G zx;Z^c`uPDtS3&KbeqXk&b}m7e_Dh1aOa1KAD?WbVCkSf6s^}JGM4`V|xKnTILitq( zQ@#bJQ)gnVXk#Rt(8tDM4)Y_NGqZ1I%|4ANJN3lyk1&~!$3pY^+BI8p+zIbPu{J~z z;X(cEdS_SP!ZgF2?|(cJJ^<6Pi|0`6_~&14;{skohQU+|{(m={FHARc8j06vd4=D* zX8KL?W!NQ5J!Bnxf$6|{dIy&igtRLqco)Y0SC-U_xjhQ&?Ui2qZX|H*O0#Az3*-9! zY=WqMQ(OTL@itVG$GPsyl+Xa{W7z(=;|wyZ=V9c_5U&&4Ucyu_oYZE-LaBK7a@c4r!z}v7m7+PNfWL(B7U>cv!^RyUXH^4 z?)m2JC>lCDSX*JTA8QApbZdO9@dc6KDA-l@F6$d~8-;@&8BGd1iUcy$xCX}!mqq$*}umaeS67~*E`@gNP{usM?F=X5?{s|l9&FEQK zwgh`Om;_VD?D^&?m^y9QewepMXvYm+lI{16)D1kejF7g)(}Q^gMJtzufn~KAYlqf8 zIa&qN`KOG@eV)YzllQ}UtcQ)WaUst{{smKSyvHiRO5-u6*fAbu4rlOvx--IEF}byNkORUeV7K*b~2c6o58K1KIa9PCJCQ? z59>`Vc8qKE;K|JOh$!#@51cqxxsXIrZUB?C>XPjK6GPz8R*-RfiN|L-H&tPePXekdsBm-5#lnAr)x3Oje~c?%7$5otTSD& zo8l8G6Z$7?6lHP3!&#pdwGD;w_<0n}nu8usJO=CPJ+?SPNW*GPAuWsRt6@QZ5{iUVzH#Tslh8}Ga+8+eL@q=+MXEl zE%9D4jKQns_MXAzQHpgn9cPf7Qf2Ky5i=N+ZOmFC8$Q$6Ye8)l9@D+B(k}w@H2rD}@bHs^IU0#+qY;$T^?$j!AmZhK6`$ys*G-O5Q36 zo_{N8yETwHn01k?S|mT)hO{!v1$JDq1R#hn?DLg@I|+BZ|f z#|UZp(`?QsotN1Qqjf(9<{SvVt@d5EXtw)znP!;vv3d;t6HE=ae!IW1p204VRj_Wv zkx%=>@=`SfC&SvCwO`;h2&q%H=J4HixmtE5Oa^AzTA1}O@=yn0I^=r3AlT#{7QJ>f zf3{iuJcjTfg1T4M+cfsVbY=*c-2GhTvNw`q@V$2Yyg3alxz`-s$O-NPROb9&?L+t3 z-Gf6kZlo(r%h<9dFpYs_`~Jk5++RAb;7@E5OntTa%0FQJmt|M~iQW4rcJNQE*@LC? z<^PFo{1Z!fsC3G{Fu6k4hd;61e`2*)lunre>sFHQ@jtPz{=`~5TsmbwO#3g7uCSut zVAgo`5UJ-Q@%>(p6r(VCavaG6SPD$-^lU0v^HFvU?+Tx;kk<~%3qA!+V4TQ-ldJnk5x4>LV^1TZ4 z3`u8-(9e#YK0UR1JZ_`1HvEo|z7As+m-I?s7><&}a z_J}mcF`IHTOpWxu;t2bnuq((ezEqg@MfL_RFg(-H*Gb>Ad+}y>A1iMOr;I4HWYvbZ!Ia$Y=M~r5Dy$3Z3QLJ4-Ip4iL8z5NfwgN*(;fbs!e5}Y zAYY`&|zY(PoMK2O^_mrZ#$OqXGg1wMb;9DNtpa{OOB5>Y?G!`9meKx{KBQW7EQ zo?P!4o~w|}Z*n{HYKxdR0G|-L&I_eJ>-P=yLU(x~JbbX2&|q`yU7lU^-oRF5gZC5U zCL{G*f_!zOV5jFwf{O_95{1-#r-RL&$9q}zhSR~X@vYBOgzQSz-t!GiHsLe5=P;X1Uvy74O!A{R z1DGO%CV4E8d!a5Tdq9ns>?PhCXMJ_B2fscWQHuvNTEweHu**0pTw?0&_4m^EQ+r91 z{<7Vsd3v%X;x95s5Ch-8Y?^+^Jhga5kGGOOWMmc+9BP9{2&UU$pG|r`=OuWYV1^g; zmouwB@<-W!ntbekIlS>z*KS?c11DZJP4{v4&41nQ=k{8+8>Y>Z)mIn^C2zLoe|qhV zL6M1Z)#16z2AH0~veIsegl^tqH)YTDn0hz(!}?K*XZQNr-!KW`&>MC;_SSRgCYVmB zr=R}6f}-yLJ;xb31=C6Bbo}L8<0lMl^>bnJD%M5)+c7)kk!`kYdqhZtalORpend#7 zfGg$7RPjwaGxWZYBL_^bl=BNG(P=Op`$OJ-T?~_Bu)e3wcFVYoP|7rzEP{(BE_MfO zuvb^Zx9oOrjtaXg{mlzcm^hga5ngfudE zt!uEsw{5$_UX4Rxy_72W2q6v~^z$1+GE483itzAvN*{`zgAF4NXQj7A-gVyCK7WI0 zQ)CRVfZZ^Sft}M4_cMb#t)1HA)iju%yp=P#`Z@!qykT!tTD)h^q!rbZPzrt6*EFH-+)Ti~S(-Uhoec5F@i5CLycy)EXVU8S2j1!gBt z+t2eb@B3j>q~#3rzU(o%x^!Orfjw6<8|+&XVLBl50stAGg4uR3HsR22`{=~BcnWMp zNpC)Y-702sFT`)|Vc+s*l1S zC-Ii+7CI1idL2FrQ!Um)wtwpPP4>#wA*a*+(ydz!vvn%2`~mxT%g*vlSeEjc;yFwb zY-&j<*L`NE)7H@7V7wHK+gzBv?udO3)5Lo#Fx>d_(xWjSc6u~EfsOWR(3lQCWNnjt zKcDn54 z9JNO$%VxpUBlbg#{9VV0qwDp)vbAt<Go=K?W@TY=8n^FE$bg;$`D6ym??L!1)N}K|im^CmNiM*DM_cK&f&3j52-ltf4u?`h|9LMp&}Fdlvzrp*J3 zpcxf@vT>Gmam+i|2dBbXo1FKsZ$kR|qM~=At$M%Qi|)Vz=>TF26c zsaxJw7Os5K=HuHeCN~2nJGD=f*TFQxybHcD68avdHoD`6ZY-y4N!Cop!rb~`wcO|8 zyj2O0r<-%(FLoNePKCz6RHSXr zL;qj_x_Iw7e)vn62H0~M3C(`>$Hpz~5T5v}+lpevk3_=1!n_&wE>k)^mJ9IQ;5Ykt zxvI`>!S7*xybE0W-{bB;4-^0lC>ieqC~6_@ z4>RmrCg2tx?e*Vgnp6pN3hqFhVR9-4QiHw927K3g!SGuIwe9g-;nS2*DBw9!&%Fin zV0?c}hQRwFGnRe?>xBdQMjI*o1VQa`p1}nZ`I%@Z?;g~ZkaX4;ZxP%MlMA57jNDr= zJ^l}vqLw%}p4s~b#E#vb8oY^6Z|~9S8-(=jq0c0j38a+eSEjn{nUb%AmZ9i&MuAN6 zelgpg?iB;xd4Xj~O)Fs5JLvR%5GHF3nB*qZdr2h**Bq-rFP0P3NQS&c^f64QGMg?O zsca)1odMN$<>-gdtDxSx4PIP@3ca0Z0wERYl06Oe{Ee;qxJ@@Bm4}{9Y6hbIxn^}u zOyf}1fPIRhoyDJIn$!w(@{c#!wMeqT9DxPOpKXrT!qQ&g*CWlT!0Tz~C`=olH$?Vv zM74nTzbvw=X&6jv(__JVVBRSu_yM7A-g)KX>NW+lelzd1!qi@@dq%|nkjXxu)}269 zl~~E*h*@=hph|4&(w5tzajSHrBSL#NXDDW_ApP;7>2C%~NVj|3SDUs^0_erot8LUw|3yD*Vkp-Hi%M|tv2 zNZGloJRb@7;a9WDj^pLY>r$BZM9=&9-!w<+(aHe7o3&rT%Ro9f#xtZBBB4T<3Ojv@ z*^Hv4%I3?$EzfUl?ZVZ7T@SM_&&j#0gsJyztDJCl!&J3Bl~m?OuzK>r8|1tq`Vp+B zx1+S;SGj5~%i?^0N?Dl9%zpRsP-DC`iY!WHriA!ut~Ug+~^*uW_M#9_l_%-SEg9I`qnWqC-+8zlVKfAPA7IMLTZ_HNWWUSb<=38tIZS>9>k7|gzuuB&lZesrwfSXWsH(+YtY!S-QRZup7&~AZJDdP(tUSM})Vqz`{x~uAg2_Qp(42^WkvY;5hjlE;G)-o0 zU)J2ZW^99g9)JzBNx2$ETG$csTHv2;nzW+c*OP4raUsjuq4^E79Ib8Sldwy@r)WpK z5HFzwFT8}A)9WbVafCGZeA}9dalyQ_;cp3PaBUe$t*O*|Q(_t++ZcKgd>95J-fI|T_#L&iCS9aQ!R)b0w)HQV);FsbANCVW^Xzpo+^U@`#vAjw zFl*YHfwy6Ht!nBjU1}T2*5$gJh z8NCa$5BICJx0B2IS{w%H!%$!lPPJ*FlH_$8y7 z#-a4Lln`WyN94(t!$y{{pJAh6_B1`BQ^0)%tg(C@=0=u$l`gY3>ZJ^hg~b3;;j-Or2ROU1%m=`<@vw>1WNW+|%Eghd$oCS` zVBvw-pQ`t8v+CVh2f$i-yK3bBWHh7Oe!~0?0-fNQerqOx5Z9k}*24=$CmcxLrg{c_(4DxH3 zh7qSoTuL8XA=}Z~h(FI{_rP_$g{UF2V|z|t*CwOebhtm%JAdkT6aM8UyJw(N!rs1t zShEEk!e{rh8wKmg?Jr!ktO#Z`LIiY6P*s(tC3WlPnPQFLDn#X`J z`_13?gfwso-uKXD(`>&>^7$w6`xvIZ-9T$Y-WP}A*)V&!(QL*zh1*V9*rn z>q?k9M^||h@V!C&UWV&h1+#hpgToAqc6*ka|!`g#a zT^sOC_P*WRLTD_y-F8|I!8ggb2A2}b^So^0Q0re<;CwYV9yZm>`8gqV!PeGznDuJ5 zoLgc1zyKfpA)ygo`C4U{UKiiY)WXFu`98br{shy!(NRvY*IXa)oevc zcf(Xd8I#+V3vremmXZY!oPojwElf>#BMV11zeBicww)XAf)&hwVJ!Hkb%f*&a4*c+ zF~>;7g{#e2yDB(0>1(`vsBE3{EhmfjV73!l$@RwBgI}WeQcCzbs7hscStJH#T?Y;! zaA@4KYtjQlszose-0@UJSSFlhG`2m#l6Mxju6HY%R zkg(~-V$A6E;11=&!tTH4hl|%J71g`*A1C^zQix<{_H+THM#pr*V;s0{_ zsMm7!DB1NusG+_DRF6A>8j;JubHITvelVzyP{Co2mqwLyy^9|Ss+bOwxcY+#e11joX{&@DUKv{%`rTzz0)MNZn0jpiQze9E8pTw)Y^`Q9kU>Wcg zm#-As^}oqQ{2i+0uMscY460{aT>8=|{S6nt6;zV9Tsol|@SfvBHEeex{a4042&&*i zmp~}}Bd70k{1eCbgO!Q@7F0n$g8Gz3^|pnBBYVGB^{E&)|= zTTmaNcso$#T?Q&$H&FSzgZc>J=lFUMP)mEc2oFupje#1TZ|vuyuW-?&QQ7)CU8wp7 zfokt{P8X^@BS6)k4yrwwpz@D#dKRcpDfHHcC#ZmNBoIz;356d=yjE+Q4= zNarhXd@87lrh!T~!{JPaQ5Qc8R0HNaz5rAMZU@z|C63?e;+KH|*}riK?sEwqbO|0( z0^%Qb`bto9y4vYaI9v;=Xa91z(djROYS3m-4cY4SHyyqOMwQ^-1k}S_pj!H&!%v;Q z-|<7BK0>Ac0@P4{>vW+i`rhGj(6a@{e+Jco-yH_ZGX6@CNb^--5L5%ofhwq?!z!RM zR&%@tsC=~?Ki}~>4(ov`ufF3Kf-3JK#~XvR!PmSj<4@SvhCiyH9atXh2C9JWphoC& z7e4@0#z9~uFcVa|(M}%^s-lUY%FB0rioKqP(we&B^Uv! zhZ9`^)d)w!G(nUN4s^F&`U+4IGP@n%DssYctd>b9U04nS2 z{E;ne1y%l=j=v4I*ZMEV8d8EvT1yULZj5 zwQ;;ODt%jY)$ax3sECNmP#V?4_D&b70sQ~%yox(Hyv$)|P#>Yvb#+{*^1FdD%06N0 zSI@6-3H!T0QLAQ3*z3OnwxH=Q z!wgUr&vyJ4hjTzxxB%2gs0wa%`a-Aw9cm;NyZ91}x{P;%YSFze!T%1`fCovZiXQ@1 z@WU>jQ1OpBUK*8d6}s}RcJWaKWMuyU)#HDGDqsVsgwKKc2*sawxY6MYpbCD;@s~lB z_o~xh2lXk9l6F`<>IGE5I|!=aT~PczP!0LO>AOLFgi5!^@xMbg;3F3=tP20y?=gZ)Uma8fE&|n|rcQ4L>dO_M z7x)V*VGEbAC8!=khYo`fMrZR=Wfh^tOvAjmr40)Bg_DllO^N z#s7BcgyOp#FO5pS$Hnh8rxpatNA&>XTbK0z1GIziKdD%Q`-|(#uMU56_`AbD9D2ta z(hD^UZ@e9<8U6R`1vkgD89gPq0-;xcxlu?E_CS^xp<)lItEq;SLy$$tpe5{ z$iANeWm6kLef}F%g)fm$4SX3?xtlXuVHd}Rs;(QTap(=Inm!Ku zI_w8(Ap3(lxC{c-ydf1BP-PhE5)N|-N4NwT4o8D(=y*`+b3j!*5!6Sh3i6#^04m)S zP!&xBHKw`p9jbymUA$0ynd3r@$UUGM_5i4;HT+S! zC!GFd)Co_4+W0rQh|Nyl;_wYn4cg{#JE;BpBTyfqI`Rpq3O{rBg~OvR{urnRd;@Ak zqd&Tc6QG7hw**xb05#X;K=q_DsEkz{uMVn!^FXD$5LCsDK+SP;$6JBQ9|83ds-c%! zJ?iV^5_AJqKrc`qp%V55B@O0}3LXxs;!IHSS)dv`7Su;5JqJ{SCpcXwKGAU@|4;&F z5dtdk1{YBp)u0(p7pj08K{aHy)Bh)^2F_J^ml2ppKo#BQ3KXhGcQ`Io#S0x5Dt@ta z(_txY5$0R!qJ=8%F2{vRz8q9BcRRf_D*j${wd(S>HjNIzY=UDfo%A7mr$sdZ*jadD*YQS zej6zMrb{Q(4DWPYC>#F3>HC~sf>8wZY`=>TR)hcOxKJZ-((%7T<^P3v`KdB`n(`k| z4J}K&Iu>^6qVa%GEv@7tN~1DVL08XefGVh_OD9wV&I8rZx}eHw04iNWP#>Z6rj83K zH|o2XfD$G-Y;GfbEkS)sqbg{PE=+OpLh<&X8rsq6LY3ReaiONTm(zQDI`gl9de9Hl zYQD;gu&4sAhO6g8K=oj_ix;ZGbWrI=I?Ql53gkau9)DEv45!}+s=g@bJ((?Z5jRU9 z;ueQETJP{#Q0Ku- zF1|FXA+I`Js43V2s-kV6;@@<*9n?oC{Vm7AsAsjiUBn(2AymS>j+aKYe81EG4wdhK zix-N2=J@}LG&f+9OrWl5Zvr82G`=9QM&Yo-qb{>hg?$BTsr}^m2~fTM+3{aMeM+N7 z=MQw1>*up$e|xxKIXqmeZ>{U8r<59T)md+H$ z7A{$7JR7}>OV=G#HGLfpaQZc1bM%`*^=B@q^>7=gak<^$9S#@jA5&6=i=D6p)JLca z45$L`1J(WqK^63nU=Wsu$ed{o&3XVGb+UY-n zauvUUD)4uwm*K#s^dV4s7?cTC1C_ousE<(PHv~1Z(WV46)Ga}dX}Ua^Px_^4%A1ebi*AljcV8kbd{H7(?xw_T|%J>%mGz#uG34S3dloO1(O|4 zap|YK^nZsc?2svKHG7j3Yh28&3C#m!K}TPi;hNeiA%Q3 zMGK|h1FF6EIbEpY?|1y~Q2yZw7cW%)wV=v-+VOum{#+FnkqUesLAVjrN2r5o`Us`}3skx5LF$S6o+Y4`zX+<}O*X>!n&WRczRlrw zP#>YvzvH-2xE}tFFf;l;orShs8u3etK`hxE}tFSJh{&b(g8m#g~bS%+4EdNMRPwP|2%VKW5OUa|9OPVUqD!3?tTFwWh26G z5^giSUqm=8VeN|ucbHQWmcM{--Af3I%--h^dcBCy;dz85X7x)5CnZ#T86jq_eHmfZ zO9;!9VwowDF!*JJ>aQRell}@q=oN&`67DutHz910P_PN%Ub6|of1j!KDsaEa6+B?J z2_7`{UjrU8(*!HbPQk;b$?L!)rcm&x*(+FSk~dTAp4Ziq%@q5%IUr&FW`yor5LTNd zTM$yVARL$Qgz5YS!eI$3-#}PviX|+610iiI!jopjR)k(#5rW$gip+p*2qz`1m$1(G z-$Yoo4I%SQg!QIK!r(U%s&7Yl)}(Jo2yI8$Ea5p*^(}-A5(?fz*l0FM$a)K*;SPis zP3{i5^pe>oc-ho{8+gS`6Kpa&1+SVW?*OlvLc!~1uVAxDeiztc76{%j2LxM9yPd!` zvqZo@EFjo!I==_JW$qU2FvWtmP4D-CcgzaGyXKT&ry1~X;61Zi@V@cy0{(5T73?xa zfEm0?ef@xj?>6ZlsIMQWuM+l}s=L)!2?e_mJ~EpmWbIa8_aN*uxqA?5?m^fk;Zsw8 zFTz#{bM_(}Fgqno-HXuXLxh8-@I!>gA0ix*aL6Qogs?}#vX2nHGzTQi{|KS`#|THv zl8+HmK1Mh$;VaX5AHrb?EB7HBGsO~???XuY1mRn=;uC~kpCAN3MJP4{K1DbwVZDSO zjDJ7Es!tIz_ahuPMG^+@N2q=P;e<&)fDk%>uvx+>Q}r{14H61IL-@sPl92ToLc@ay zznR>F2sIBP>_Q0q5il2go-ojCl``jZlK9Qe&q*@%bA&dB5E4w`A%w<<5DrNQn&dAK z_DERv1wvVKK*Ibl5W0Vf5H?G`L`eA(;kbnIrt@Kh!xB~=MyP0tB`iOTkah&2vRQEi zq1O?F;8BFCX24N|lM>cTINSKYLRfVaA@eJQ>ZVA-;I9y>e~nPXq<@VN`Wj)ggj%NR zF@y~g3XUP1XEsU5I)>2j8-&^>_Zx(o-yrOgP}kJ|7GbM|Io~4GH#;Rv{T89kcL*1n z!tW3oe}`~LLPL{WjIc+-vSNfr=75Cx#R%QMM`&V}e2PdtR5(-Wtq?%0dy#menIGJ3V%Up{0qV%3EfTduLyf2Ec+Fqr#T>D{;vq#e?#bPmi&g0@*Bc& z34KlH-w_T=Sou4`<)&D|^4}5C{y@0WtoQ?=*B=QLmjx61`UflUm=BN?rW~YRyL4-DC5Hd_*8HC1V5DrPmfQ0#F z5xR#EvdxkZLP`kXxP)=0a~R>Ugq2~098)Y|c^DzB9KuAiq8vi6atOil2)SlJd4!V^ z)=S7Y{t5`I$|Gb}KqxRp5(Za5s9q7_29sV9Ayg4zvxI4;Y9)jX5(+9I%rKiIWK}|F zSQ%la$*qh~vogXi2~ktO3c^+ibE+T|nw=7+R!OX6+Ez{M!#`$GSQVjhRZ<+PN{Trq z`7DGz5|*8XFwY#2F#jxs?q?$`FiXxxNI4tfxP;qG=V}OtC9JH5aEB?Du)G>VT6Kg) zW<_;`UeytT=O8RG1I|G>DPg^YnDN&@Sal9UW(|a8rbxoz8VJ>EA{dii6CqR+VY7t0 zP1Rb7gZ%gK?+*d@noR3kDCJ$=GR8(UI$^dSyBffr4GVz2~U{LbrB9rSXmcgttpnUye>jo zJ%lICih2mW>LCQ{BNUkd^$|`=STA9n@n3+jsy;&I1qka+k%Yk)AXL8);aQV@AwuXv zgv}D3GgTWPY>-gU0AZuqBq6H-Lc@j#FPhwj2sIlb?2_=Zseci|Rta-1LfB+>N|<^P zLYqbiubIL|2#p&d9FnlvBsWIbBVk!%gg49q3G*8xbZ>&N%`9nxkkSO_@v*kOt#EN_aC)(qhtv!WS7uVx6rixGC30T&~jl(1gH`^KMyu-gU0^uXGNkUc&goZ5<_L9gk_f?d}$6yn12aE_tpqU%#zj! zDXkHXOZdukZi8@G!pb%X$4s$=UPHc8036ro`%!fz%w z6`^J-!Y+is9|`7y_KBP}q|9kg62IBmo+MM-Bedy&kYEZsAT;iPa7aSXBzHvEBVk!b zgtF#eR5ZmBmS2XD))}F)SDUvX_D?;^d2sKQ4H-u0(gv}CanX26pHgrp@ zV1~{LcIKLsSYAgCsaf4o8}vx*rz1xXgql6bx2p&F>YDmJ5w=R0(-Wb-*(qUaPlPtT z5H2)@y$~ArLO3L$p-JwIut&nO-UyA%0SWVaBXsYB(8Mh1gOJh(;kblmrgL9}!xC2Z zMMyHm5|;NxNb85t!mQ|r(5oLp@N$G?GvIQBlM>cTxWxFcKv;D-Lgp0+ZA_7b!B-$u zzY-y0(yv4aU5T(+LOWBnKf(qH1^p3H%_a$1{Sg`tKo8iej?2))gcG=!8i zgyRzWn$80e4og@$5aDuDEMfUTgtS2jSDF=r5PA(l2o6RVUPQ6LiHgCgG~AmgwPO#%@VFPRfi&MkWerbVW`<8A!{f?!(j;5ncQIr zHHRVWk}%xVzYbxmggMtCq??@*re258=6Zw-Q+Pc>D7-u@CBOI2nG94ku6iZm1j*vDIVWL?v5~0^fgkT0jt{ISl za8km03Hio93Sm_SLgpxh0#hVm@F;}pnFu$S^h|_MCcViN>m|gDe59(wAl#nm=&`Tdd)@%-h!~x47dg1q=fYn-Z%a^2&-;E$ee?)%M?i% zJO`orT!h^weJ(<1F2ZIBdrj4O2pc36%tQFdY?6>Q524|FgncG=K0?j;2)iVFYU(dQ z*eYSp0)zu*r-Z2s5Zc^|aL^RqiqQC0ghLVzndI9L_DEQE8^V|7fQ0$CA#}eT;fPss zJ3`9s2*)LSWjf!1a9G01I}nbUVhPLdKuBAN@U2;~5TVyXgy15CVl!Y7!bu71CH!Fg zixE~WLdaZiO^;lLV_t=hR}E!!XXJklYAG#9tq3t zLMUqvAoxS3o%w&rJMZ|YipF1W0!ubP=wJebj?~agP^y4{(u?#iNPq~4G!Yj>nt(_h zLhrq|5RfJyAktKN?}T2YL_qHI-OSO*tH1kx?!Eur{p88adCtt7IWu$m7J@)CRzXq| zt00-FG?^f|iBb?`9w zG=euwTLr-;MnQ;4J)Iz`;)|gv=laH9Zt$G5Zu`HQ8rU@x3#&t~054c5_6c z?@X=hEJRK-XqMJ>mey4ww<$VX>nbsEHX@I?C^39CqUsz(J~MU>B76?wu|xq=X)fZ1 z#QeF4F!MlS@?1otd5FSh_B=%Oc?kD>L{U?3KH{0gdWqu3ZvkS_d_;!@h>~WtM3V)G z^a~NCP1}VC&qBm*i83bjBE&|CUW*WKn;jCJ79nykMwBx>79)ZeBaTW`Fxi(N_DT#{ zf~aJUNc3HTD7h3-*$i5W$h#DARidgXx(snbV&XDHHFHs7_%cM*<%k+)>~ci-a?bHG zZ{-~CeN$-#;)cY$6^L5qfyCq$PKr8a_DZ^^u8C7n&(vE*P~R+8(7^buCTM7yDrjU@ zEBL?!t|4e_+A3&bViYtrsn-%TGZ6}!n;i;Tn2>b@Elm#vt;{|Jtxfjz1Z_+|1#Qg{ z1?^0}4Fv7YAO#Rhz{SeY4&oPOPjbI+2lLS z77Qm0fm=x8*@B4Ng6L;rBsOkwTC%^1*ox@1l@tfIl45`f*@g(-h8VC7;WhgZegjSR z?F55NKLuZ!BMSJr%^d_^nL!GM=-0LA>Kznb_IvtmSiBhiec}&Im7R%en(&>JI(;Xl zjx@15Nqa-0)-J?o6SWI5c^BfP#28a!H=_D(#PZ#Uu_jL9nMBJU5aZ3_9}tUvKm_eU zOf*gRAe!t!Y>_Y~a4*8M7ZJG^5oKZ|HcEuAr44PHz7YFf`3E|_z^MF z?336l5w;&O+w|Ly=(`_rR${Kn_Y)%TPl(Y!A?BNt5+@|e9Y8EJBMu;jA3)rZSZvB1 zM1&tiOh1TNYGNgBNYpxnSZ<;YAtoO}yp&jJY8*yXKa5y@7_r*KNj#Hic?7Z6EIxu* zbOaIfGh)4I`ZJ=*&xkD&(I)U0gy$DT@g!wAcmhn z+>zL4%A7=mpF~VQiP&#qC2mO6I)yl3qD~m!Y(2%ntm4%eJ>);N?bPiE+O(>LX5tIxN1&HoRBDY8FAf= zxQrNn8F5D<)|9z|2)}}ueg$#M#7f+dsC5-_$3$I4OumYEDRIx#xQ3{H4YB+h;(>{i zcqY;EI^vO8d>ygqIwI%>;<0IZ1JUFLVvEF66Bvu|#3CYN5pgC)VxvUpO~i8(aTC$$ zCgOm^OA~Sn5qt|V;FeAh+~&tyIzf;LyG;^5)9*G(`rbyIl}Kdr-9hBNgBX1W;Wj5F zPDqryiwH0y?jnZYMck1HG-d7~!tWub-$Nubu@W~VYTZW!nW+1S$@dX2B~qFi4-nNK zAeKKsq&9I9&m>wtM5Hx~A0ie#L{}w1pbEb{Dz494H05uBsNNf zK1O6R5swj_9wQD&gqn~ih~OuP0Z$NF%|3~}5@Amf*-gKvh`vt|XC-o)e9sVhpCLv+ zL*zCmB~D0`i$mlwBjOOl;}CZw@|iNfBf@`2O#dBGz{E=2kf`+>5oV&EBPKsbyp$+x zYP>*He}P#30#Ve&Nj#Hi`4UmwEPjbt^b!&D2co2D`Uj%PABZgyrA^=~gy$6^@)e?t ziILcdm>BBj9AaXGyYa+M?x2YWm?~#N{M@vKpPRPuLsT&PB=$;#`6DWse*TEQ{)n>@ zl})}xh`fmqqZ1*jnv)VIB+4a5R5K$IBZenN+>xkZ%D55XZp3sq;(Ze{+43F4(h9aAF!Q9S^$JOEM8#7R7pXz4*TFpE8iMIJ;@Afl0J8i;5Th}a_0*aRj; zc#SJ%p~(=iT}-UR4T)N* z5s@Y;HDYpV#7l{8rbZe>^)!g(X%Ib3oWwJUmT3_^&Em9(MQIU1=@7k4({zX?=@45a z`sjz(X^-^oH1~F+3yUj>HI4CKDn& z6JmNM#7Gk>aYLe3X2fU{l^HQPGvcMh7*it@Q9Tr~T;qDIiIaFH(J~8Syjh$Du_y~7 zC@W&3X_^($Br9TzgfW5H5T0y^$ZUux6C<%vA~ZW^3JQPDqq1g4kn5 z6hRCxg195G&y*>O2rr75UKFw4#7f+ds8tMcz(f^8OfH6aDRIcuD2}LJ9I?DO;)scp zcqY-Z1mYL7xCCNR2}Dpy#8K06;0MBg%qvl5q0zPAv0-$IOj3vtz)lsF+# z?rp?%GvaN;@V60nBw|gOvWW1qi0Ne!w@j?W4T)Oi5O+*eImG00h?f%gOpWr0>g5s3 z%Of6`IEiNxEh``%nZ*?liz*<3Dk2`6rWFxQDk8Q>JT-xp5S~hi$V!Mf6C<%vBJ>@^ za})6nqSHHw0}?MyNM%HDWyFBWZcaXum>(;SJ%p|ud1Ohhe2r&@>u5}_ufHX^t-VnA&~RLbGIBc|6!6fm(8HzaB`K!lm7 z28hWG5HBSPn;H!f)f*y~H$)UQaT3oYS~fxyH;Wq~7BxZyeSj!wntp(2@&RItL}?S) z7~yG*h-{1~V`3yWN`y8+ylo*J3HKKZJ#PZgNdL~ZdnMBJrhz4eH8^oeEh@iHJMy6?7M3c6N zEfS4QU^|4T9U`(FqN$0I*eDU&9?{%Hv`2Jmk2oOF(u9172>uW;;6p@fvrl5LL|6wz zThp%tqHhPpS&8;0Uq?jVj)>765gp7)i4zj#K00`tJi2)|08zQ(HVn8>9*X)zn zD-qTmG061mj_BJRaaLlm$=3ssw+CW$55y32QsRU}xla(o%!p4A!#_dXkr-jh^hAXB zL`?6A7-?c9Zb;Pn6fxRFeTta;DdMHX7*nGcqIxgH@?MCsCQjm+M9bcY@n&&v#G>Aa zpgxF+rfDBUlRk(o62=7fMR@umBKsnuOpL@viO_zCsV1TyqEkP2Q1pR*?nA{UEqAwY z7v0I1dz&7gxf_h1^;u$f^e(<%*Bps*H;-;J(A~sO|I7MmR?<&@pIgT-PjuV0?gG5yD0=idcTT?y2QTph zZ7$cq_FW?ib?zDerup`l&A}*lE3@jUyOSBU!R>M9y~fwEs!|nHV8~}o^10N%WqNd- zpLR)5QA0&nnKsMZiTyV`h;9|*PU`1g`Gjv3Rx$m3^}4-@qTf8lSAj?GIOlHQ{%Z~6 z*YofHRp2_`ntiv&oyy<8=+5Ya``l~%J1$dCnt_wuT@#jJX039kie7ifJ*0-R(C*8UH{c1!{KkYu` z&p{;eocnG6y;Gx?oOAbfyH71A%b$%B^l^v2pYn+VSIi16ffZ_h9yd@`s-*^`EVfb+f;}zC3;4A;MrneQcroCmlZhG@`>Nsi*oG?<#lEz?_Nw zT^X5KF1p7v_elT0rVZ1V<6HB&JG1*$8vpn@^*3$CyAwx`df}eN09fx%Yz{}cTg11H zRxn(7f_jJf>kDQF4k7e)!k)zP*{?9I)_SY5zbn+%sof{t`tz_)mQnqv0u|$*cPE58~V_UrHJ$$ z?JWK9tdi@uc&B zD>mIMTYNEGtT{R|AWylwcGg@wt0c4h^zGxk=GkIP5!X-P>b1b8D^0wtDKjb{4^I)= zjtWTY?O{_au_@jrg??*T3()V^-&f_|W)30b% z0b|`2oa$N?CR-PaQw86JYAjek$8^i*`1Ei!CK_6K$0n?fJ529t0O-eXneD0pCv1;D z!l{Dq!6}>WH=HW-KAg8szkjO**M#dfZ*rXS)`DBUpY0{0AIMd$Yr|8UFpW)E2lu;m zX|1b^du|t^AJf%B>cI<}E`v>1ANSHa{n)M++yH#vX;0t{wwW6;;jb^c=amtsR&NA> zth$DLC{BI%0SvbVmaqjj#*MH}KftSnGy&(QW=r8z!KUyT=~Pa5ynDyhj0r7-J-+KL zq-HjU{?s6ZP`}ix0$aelb}ZDlt|hL9DLRJD`F%U9p`F#5S$VB%gwyidKuYWM!@nxF zEu=AnR75&EtErvUo>{k*k5@BW#D~PcwyuRu*8$hj9H9trdKJm56|+>@NALzNCt+Kg zyc6;4HeEZMN{fKJ)_rKxb;dPhW^O{~=ZU)zFKZXCpDI?Cu23-Ed0ih_8Hs#h3+!aw z$2g9-zE^~G-IzKWuUwt2>(2BE$PZnt>p@&ys+WEnS;c$;`UMufB60c=XcuQrt`1gy zid4lug^#T3ZCx*1C+qs+w1xGCZn!YQ&#mi2yt{P+acb4Ra8WxRUW0L}Og}j8`!Nn8 zUm>;N&tN+V3lZu#p@jY6d+UZ-$ElBNB~E+i;nocxzS=Higmquw)>!v7PRn4OU2U!N zj;+gx6nHMVzeqa81(Z~dVP!2LcW6AY9e0aY`P)D?^-uL zKAqP!R0+sjf^ecuIE;8YTbW7m30=c+>8+b=-3VL;>!#SeU*ob`H`Th4xaM|qpJv@C zTq_U9&{9OETREDz%RCszhH-(Nn+`2AnWd~_;EHt%aazf5p|xG1#kPpCxV!XuCBh}v zjU!%&J$rS+rPhrnUf8;2)=j|KU&r*imLoNGCc@LC{NuICCY(e(&brms8QkyIt+8%0 zE}VU2O~SR-MG@C8)7BzfhtrBofiu=^@Hqy_ROBTqH`;{LaF?yygi{5l!&RJKTW}f@ zGvJzaTW#K%xLE79+jO&Vx2)S?-E7>izMp0!^1YRFh#ytSymneQm$>tD#=ESWhZ|=L z+-==_+<2T0OF!UL=>_nKO}EdcTZrpwo%cs87a{d?*Lv-@ZZYvpI30q1vTh0SQ0orh zGBCXqvRHT7rdx)~fz#`Xb<2rwV328lbv533T`QP~*2v>^%_dw)T>A~ZuH)2qt6&Y0 zR)n!O-D=_mwVJ$cTDOMy8@P6ax2#)B{2qDR6W+Gvts{QlpAAE=yEfr^;!!5`BsPpG zS}3pkc2+d;k8m9bA6U1M_*?W=N5Y5J#SpK9>qPj-x=q9z*k1k3y3M$%xCp|>)_q5u zYZq4+?Y*8L`EzZ7;>fOqFA=KOR#<5Zd}ZA>+;r>wXi!DBgO1}mN;p4Yzk_&f&`UpN zukyYJ{c4I{Zk*ed3Bkl}E0fv+cj5M!awgynuZ}Xwt^R@dL6XV^;nXL4;IPe}%DTO{ zW7eg`Y1#YWq;=_W+R^+7r>qOXX`n$ap$ee zicvA^Q3<5X;Zn@&ga z8`c%TX}ym@taV}59mn0YuCR3{aF`NylI&3u}8 zKHR5-rET6b#HXa-AFsD;-m}D~;dJzW+vYt-e2z_5&ga-$o=48N2`eDgTNhxFb(L|d z;6?Zp*PHNNoGN$;`dL@ay34q@ApY^HZp*tu{2WfZfSNYlRpLK5rxCS~YQk%v-#gSP zK^>d$I`MV5F9_>ecY}CO9QAkAvw35Q_esu=BoQ{S?k4f!q#I1w$mYF8{61?rgwXqe zmA9FwK|;M6+st=}-=n}`giUb)gm>XSPA^@rsuk|RL+jewy!UZaal;AQ+q@5m8=J0k zd^)e|Au=N+k0k7hRDq8mGj0@Nq;mC!o=8iwaceCyZE?F}E@#=2fQ{u^S z69{`)_l$U8V%l#qkx!6s5XM1A4#hfx>M}!>`5ii0_cc!4^jzK^3r5*=FL1A{8*SZ7 z+)Wk2>l^F-Abt!thj5H8%2ePhSYk7ewN6W)Yu$L8*$+1nH=pzqtn9ESAD~NyN*jebMqpDmA{*AY8 zqjf296ReBDsWPc>6Rq2f)25voHwpJW@ogUZpJ`Vb{!O-WI|;R-X>n23?X(4^!%eYn zw{^M@)3-e6wFk$fD+B+AShv?YU7QWT>BzFrx?r6xePQK~R)*m8Gg(TwAE(M>#MQ#> zA$}0Ypm$}$1u`)8`UR&o&Wzh^-BDX!C~iA$AM=k{mj#y?=lv0R+{&!TDCB;eZa*;T z%ErHGIK56!8vgKtvh4W<-`rJ?yPmWa9-=qdAJe9v@19Nc!T8(jz?eF zc^62p?#jcg5x4`yuh=ql`T7oxaS(SErv}Q0^TX*7cmt<>Reqemb@ya7>~t~zgZbzGnc^aw$5W+Nt}*H=P4-Ax>7hDkK~eC zR~om%=1qpvg2QnutxI9kmBIDb&zN2!K}suiF8GH%ETppTZQLu|Wzwa#j=Q10pM1W9 zOM_GMm&4^Hot#d@)iULA`K;54IFqgl{0pXprAu7pcuozBFy5xj#- zY+W9kw=&LcT>+fdxC$=7x-tTyLc$#8jjPe0!|Bl4>!~vkKVEA-pA?qrej}a>uTbeUoPdoMZt*cLb5rt?6Ueh|A z%`aBLylPq35Vthmz3r-PWh3M=o4Jm4Jm_&Px0&l&*BG|}lKPpga{_XB^?P*Mnd`7b z;A+OdBRK8M8{(9`IdT2Yop$CQ*mNz3AF!^mbuDrF9X-98Sl0@-5vQGgQ|nq2-xTk> zu4YK}NE_s4o3N#IZE@dO*T%YbIPFq&#AuJxm~Ky8zYM4YMrWJuL*g^6i^MVM>cGF5 z)_v?t$Clj@se`wUEIn+(kBGM=p?3PZtR--D;$K6YcKSW7iy+?2x=(Rxtq9)Tb;GRdi&I|h*@wqFud5#uv)RpS&pyH?{ET=hoc8Qr;sNv?HE}(=KWVaqXhymN|Vll!1pr0+!i>D zcxCHWST`J39;ZF_O6x`te?fuTV{6}|1%FNarFCm?8b>2>*~qIM_IezDF7GHN-au-P zy%j^?8qL2wWY(T|n|0q1*Fv---j35k#t_#+R^Thttk^H%?tQmiQLp+7a$2 zByf%6Uxh&S?AjClWaW6`y7!{J-T~_-5MPDU&g`Id6N&%8;A%s7$ht|yx8k(VIE+(e z4DoH&{bJKi#%;Im*FX*dOuM4^m&jaP$R1sTR{NM^HvLrM3vt@V9Jg*7@kQ31ux>hT zE>8QHlQ=cd4C302XqTXSgaodc{Huu5macn*a4RKzx#2#vNZ?Hi(7D_pQ8Z3tWV& zY27_r;9^{EoVK_JI8|l|@i(oDvw4@|@>-|MGbUZj_?OSR=QwSV%W-%0bI#ga^)OU& z1@U{up!acMu6;4I0=AXU_RGWHgoLXTG@f|pA)oE?IwZt`MwY7TF zA+?ZoOz3B7HLfz+gzJgxx7PR$xkdLEzfSzaX5ttDJSah(DoA z)LrFqI^Eh$T)P%^R}Gu)2jYE5r`LNrATsUR!$18xy!!Bc>-G}Y=AL0M=++v`08A3-P3?Uu;slgk61 z`gz-vwHY*r7I1{7J`TUbb9ezq*iruq`=J_J$B&e$Hy9j%gK!A+=7OVe435JII0>iV z44j2?Z~-pCW#EklXVW563h4~Ra5NAR2JwJM-N3cabIER=)tNzAcT z0jGk3iHAT&$Yi#x4tS$!X`<=j4M+*Ev^^90fj=aI#NdW!%$o+&VFt{ESug=6LO19R zJ>U})wubw{^@%nFy)mIS)Px$K->ggxX(1h?hXb4i9E8KL7?!|Nmvzk+TO=%#=!__>&OU4%=Z zi}Gu59dt2%3vR<*(1o}zydT12(6#kbcm{FsJLuY4ZzcExUI8Z%=9jersdEoyVi*hu z-Jcr?-@z8x3Vq>==#X^*WBhCAd9fZ3cLY5W)+68u=mM?bXBt3{b}zwYxB^$<8r*v;p})4Pk@PVg6WemnD|$a zn}xgygNT0#zcTMA9D}s@bf9OndM5h@WP;2P3Rxg)@;qDt5J?HiAUOmF%2v^T)^#FPT41h0S5Y&O35D0&; z@xFrRa05ocZWsdjAPfq!1!i*7SXGFmKm@{k_O?GTy$ANfGFT2PVHM1S1@JQrgh*%% zO`sgCppjO>Dp(C`U@feJxiAmrgMl&dt?nx8*PTZ&az7;0ljg=y2ns_HxJS3%hpTW6 zuEPz8g`02-Zo?V)hK3yh??3?vgF^Vikd1hD$N{+^H@vCsHV@>5RFE3dfF4mlfQRr1 z9>WvRQ|f0B2YM3yE9gW}Cw^Bz4~ehAbyIXxKw8sqQ$Q~7DW+erBD)B6`uzj!fxWN~ zegvI@>k4Wtj00Wt>LOPcwY@-B(0XpGdm7b1_c1~sBV>gfkP~u2Zb%BrV4#OLX6jb= zB+#ww$uI?`LUeTM%>lfxSx^7;ux}6SgCF4#=n3A>a1`|9?l_zPJ+adhIz5ro12{c! z(*rg=Ji7vVQl=+kdPt>*QaK@txE?&s1U*<<0K;KO3dUe9BDJ9ol!teqGE{-8P!zI3 zcE|y#Asy)9(PMZ5KR`5WVhndAtj9K29~wbc;b!;_*1}?F39Vok70_>Z zM?(yZh2Ol?>@kE;XeKBP`5_Brg$$sJB0Z}~1b;B*rqZ`R6SjvZ#GiuB?R75y0$#!& z@CtO=K8IGB4Y#S_O*k%?w*(sL%6Kl!11}5&-I(|ibPr1RoODC%9Y_!PAU}jbAt($* zp%|0^J-L`}mTwK1>K((Wp`Jz?r{-O3nEq%0JI z!jK!@gj}He#hsxGbcOdBV(%~#D#B={Cqpf$10R4tBm&*W)ot4(pj)-NlR5%gKuc%^ zO`x1aMJNLs=ziT^J;*q03+^lO|med`O)vyS@fia*PPP)M~9GXE3XbGucCWB*^iP#ZP-1{>f_Y>&;WDJaeCa{ar zcZ069(t|GbLP3{p*!YulIAuNJ-pmHi5 z`-tdX)jM>2WvBvSPze0M9}+=ga6=LZfQ)dN{yPb0;4GYn<8T%Bz+TWTs%@|a@f@ksvAU5ozC!)P7YR5fhiO= z9)`eB_#AXCtZQFg>+0He4uv#?M$iPBLNjOyt)Mlufp*XyBA_#Lfvyk#%UPozsrkp$dK#7a8is)v20|OqrDsQI21m&AGaP~q zFc^lwAm;UkP7ndjH9T6tP-YH;;n10BU5ZA+$FQ3%VjpaWF`zfMSA`nzArsoJ~)|;g#!&I0KbD%l9Z@oFXA=GACPc#pM9wwfL z3-BEDV0sAQXNpH>-yM+CFRU|d(hc-ZP5ly+-gNmrEC;=@@(uC?LkMK#TT%k*G@XGi z!?u43rFSg$g?`YAVs(?^9gcH%IZ+%47g&``a0Qyfmn0bsO~~66{HbM++0wF(?jc;Ut^IDL4&hlA1Jo1Kw-u)#wJQT9Pf38LDK_r<58$i#`oyGlUQZsyCKzHwc zhKb%FrS}_M2fZ0cZ~nOn=h(pX2A>=ZExlJ~Dt$E#=EEY;W6R#q4?cr!R7tmbcR+on z&(b;PU^i^A=v^^uLGOg&oiAQjNj8i=&=B+%ml2SRHn>MG-G`A(-({ZO!7>H(Zj?!o zAM}P3J%AIp$a4qoDlgoJ2k;Ocf!<(p1KLsMBf7W*{j=JitvG;4QqVg~T=0_4dJY=3 z(^!+~5Cu~}Zz|E7ND{8;hfM#*yvHyTZo?%GN5^0@@%bm3eyLxbMHpf@aRr&mT1ehGRLg6=KqUgG;u6ZGB!-QWy@ zXo!JLupJUZ6ik7EFce0B9>G_Es^ABD)Xrmcuj?KQy9>AAHr#>l$>6N~_tbYMIF00Z zb^o_?zaFvck$OU}N9WFv{GRwO_~&6n�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 From 50c5adce0c7c1ec983e459e25ee2ea0502442312 Mon Sep 17 00:00:00 2001 From: dswbx Date: Thu, 12 Dec 2024 17:00:10 +0100 Subject: [PATCH 3/6] added useEntity and useEntityQuery hooks --- app/src/data/server/data-query-impl.ts | 2 +- app/src/modules/ModuleApi.ts | 31 ++- app/src/ui/client/ClientProvider.tsx | 2 - app/src/ui/client/api/use-api.ts | 30 +++ app/src/ui/client/api/use-data.ts | 37 ++++ app/src/ui/client/api/use-entity.ts | 76 +++++++ app/src/ui/client/index.ts | 4 +- app/src/ui/client/use-api.ts | 18 -- app/src/ui/routes/test/index.tsx | 4 +- app/src/ui/routes/test/tests/swr-and-api.tsx | 39 +++- .../ui/routes/test/tests/swr-and-data-api.tsx | 55 +++++ docs/mint.json | 2 +- docs/react.mdx | 194 ++++++++++++++++++ 13 files changed, 456 insertions(+), 38 deletions(-) create mode 100644 app/src/ui/client/api/use-api.ts create mode 100644 app/src/ui/client/api/use-data.ts create mode 100644 app/src/ui/client/api/use-entity.ts delete mode 100644 app/src/ui/client/use-api.ts create mode 100644 app/src/ui/routes/test/tests/swr-and-data-api.tsx create mode 100644 docs/react.mdx diff --git a/app/src/data/server/data-query-impl.ts b/app/src/data/server/data-query-impl.ts index 329a3cc..a85ac77 100644 --- a/app/src/data/server/data-query-impl.ts +++ b/app/src/data/server/data-query-impl.ts @@ -72,6 +72,6 @@ export const querySchema = Type.Object( } ); -export type RepoQueryIn = Simplify>; +export type RepoQueryIn = Static; export type RepoQuery = Required>; export const defaultQuerySchema = Value.Default(querySchema, {}) as RepoQuery; diff --git a/app/src/modules/ModuleApi.ts b/app/src/modules/ModuleApi.ts index 5094abf..2473f0d 100644 --- a/app/src/modules/ModuleApi.ts +++ b/app/src/modules/ModuleApi.ts @@ -90,7 +90,9 @@ export abstract class ModuleApi( @@ -142,11 +144,13 @@ export class FetchPromise> implements Promise { constructor( public request: Request, - protected fetcher?: typeof fetch + protected options?: { + fetcher?: typeof fetch; + } ) {} - async execute() { - const fetcher = this.fetcher ?? fetch; + async execute(): Promise { + const fetcher = this.options?.fetcher ?? fetch; const res = await fetcher(this.request); let resBody: any; let resData: any; @@ -167,7 +171,7 @@ export class FetchPromise> implements Promise { body: resBody, data: resData, res - }; + } as T; } // biome-ignore lint/suspicious/noThenProperty: it's a promise :) @@ -197,8 +201,21 @@ export class FetchPromise> implements Promise { ); } - getKey(): string { + path(): string { const url = new URL(this.request.url); - return url.pathname + url.search; + return url.pathname; + } + + key(options?: { search: boolean }): string { + const url = new URL(this.request.url); + return options?.search !== false ? this.path() + url.search : this.path(); + } + + keyArray(options?: { search: boolean }): string[] { + const url = new URL(this.request.url); + const path = this.path().split("/"); + return (options?.search !== false ? [...path, url.searchParams.toString()] : path).filter( + Boolean + ); } } diff --git a/app/src/ui/client/ClientProvider.tsx b/app/src/ui/client/ClientProvider.tsx index 21544ca..1101b21 100644 --- a/app/src/ui/client/ClientProvider.tsx +++ b/app/src/ui/client/ClientProvider.tsx @@ -80,8 +80,6 @@ export const useClient = () => { if (!context) { throw new Error("useClient must be used within a ClientProvider"); } - - console.log("useClient", context.baseUrl); return context.client; }; diff --git a/app/src/ui/client/api/use-api.ts b/app/src/ui/client/api/use-api.ts new file mode 100644 index 0000000..ae8e345 --- /dev/null +++ b/app/src/ui/client/api/use-api.ts @@ -0,0 +1,30 @@ +import type { Api } from "Api"; +import type { FetchPromise } from "modules/ModuleApi"; +import useSWR, { type SWRConfiguration, useSWRConfig } from "swr"; +import { useClient } from "ui/client/ClientProvider"; + +export const useApi = () => { + const client = useClient(); + return client.api; +}; + +export const useApiQuery = any = (data: Data) => Data>( + fn: (api: Api) => FetchPromise, + options?: SWRConfiguration & { enabled?: boolean; refine?: RefineFn } +) => { + const api = useApi(); + const promise = fn(api); + const refine = options?.refine ?? ((data: Data) => data); + const fetcher = () => promise.execute().then(refine); + const key = promise.key(); + + type RefinedData = RefineFn extends (data: Data) => infer R ? R : Data; + + const swr = useSWR(options?.enabled === false ? null : key, fetcher, options); + return { + ...swr, + promise, + key, + api + }; +}; diff --git a/app/src/ui/client/api/use-data.ts b/app/src/ui/client/api/use-data.ts new file mode 100644 index 0000000..46cc81a --- /dev/null +++ b/app/src/ui/client/api/use-data.ts @@ -0,0 +1,37 @@ +import type { DataApi } from "data/api/DataApi"; +import { useApi } from "ui/client"; + +type OmitFirstArg = F extends (x: any, ...args: infer P) => any + ? (...args: P) => ReturnType + : never; + +/** + * Maps all DataApi functions and omits + * the first argument "entity" for convenience + * @param entity + */ +export const useData = (entity: string) => { + const api = useApi().data; + const methods = [ + "readOne", + "readMany", + "readManyByReference", + "createOne", + "updateOne", + "deleteOne" + ] as const; + + return methods.reduce( + (acc, method) => { + // @ts-ignore + acc[method] = (...params) => { + // @ts-ignore + return api[method](entity, ...params); + }; + return acc; + }, + {} as { + [K in (typeof methods)[number]]: OmitFirstArg<(typeof api)[K]>; + } + ); +}; diff --git a/app/src/ui/client/api/use-entity.ts b/app/src/ui/client/api/use-entity.ts new file mode 100644 index 0000000..3169bc2 --- /dev/null +++ b/app/src/ui/client/api/use-entity.ts @@ -0,0 +1,76 @@ +import type { PrimaryFieldType } from "core"; +import { objectTransform } from "core/utils"; +import type { EntityData, RepoQuery } from "data"; +import useSWR, { type SWRConfiguration } from "swr"; +import { useApi } from "ui/client"; + +export const useEntity = < + Entity extends string, + Id extends PrimaryFieldType | undefined = undefined +>( + entity: Entity, + id?: Id +) => { + const api = useApi().data; + + return { + create: async (input: EntityData) => { + const res = await api.createOne(entity, input); + return res.data; + }, + read: async (query: Partial = {}) => { + const res = id ? await api.readOne(entity, id!, query) : await api.readMany(entity, query); + return res.data; + }, + update: async (input: Partial, _id: PrimaryFieldType | undefined = id) => { + if (!_id) { + throw new Error("id is required"); + } + const res = await api.updateOne(entity, _id, input); + return res.data; + }, + _delete: async (_id: PrimaryFieldType | undefined = id) => { + if (!_id) { + throw new Error("id is required"); + } + + const res = await api.deleteOne(entity, _id); + return res.data; + } + }; +}; + +export const useEntityQuery = < + Entity extends string, + Id extends PrimaryFieldType | undefined = undefined +>( + entity: Entity, + id?: Id, + query?: Partial, + options?: SWRConfiguration +) => { + const api = useApi().data; + const key = [...(api.options?.basepath?.split("/") ?? []), entity, ...(id ? [id] : [])].filter( + Boolean + ); + const { read, ...actions } = useEntity(entity, id) as any; + const fetcher = id ? () => read(query) : () => null; + const swr = useSWR(id ? key : null, fetcher, options); + + const mapped = objectTransform(actions, (action) => { + if (action === "read") return; + + return async (...args) => { + return swr.mutate(async () => { + const res = await action(...args); + return res; + }); + }; + }) as Omit>, "read">; + + return { + ...swr, + ...mapped, + key + }; +}; diff --git a/app/src/ui/client/index.ts b/app/src/ui/client/index.ts index 9a22c49..9bbdd65 100644 --- a/app/src/ui/client/index.ts +++ b/app/src/ui/client/index.ts @@ -6,6 +6,8 @@ export { useBaseUrl } from "./ClientProvider"; -export { useApi, useApiQuery } from "./use-api"; +export * from "./api/use-api"; +export * from "./api/use-data"; +export * from "./api/use-entity"; export { useAuth } from "./schema/auth/use-auth"; export { Api } from "../../Api"; diff --git a/app/src/ui/client/use-api.ts b/app/src/ui/client/use-api.ts deleted file mode 100644 index e22de44..0000000 --- a/app/src/ui/client/use-api.ts +++ /dev/null @@ -1,18 +0,0 @@ -import type { Api } from "Api"; -import type { FetchPromise } from "modules/ModuleApi"; -import useSWR, { type SWRConfiguration } from "swr"; -import { useClient } from "ui/client/ClientProvider"; - -export const useApi = () => { - const client = useClient(); - return client.api; -}; - -export const useApiQuery = ( - fn: (api: Api) => FetchPromise, - options?: SWRConfiguration & { enabled?: boolean } -) => { - const api = useApi(); - const p = fn(api); - return useSWR(options?.enabled === false ? null : p.getKey(), () => p, options); -}; diff --git a/app/src/ui/routes/test/index.tsx b/app/src/ui/routes/test/index.tsx index a303ccd..5c758b1 100644 --- a/app/src/ui/routes/test/index.tsx +++ b/app/src/ui/routes/test/index.tsx @@ -1,6 +1,7 @@ import AppShellAccordionsTest from "ui/routes/test/tests/appshell-accordions-test"; import SwaggerTest from "ui/routes/test/tests/swagger-test"; import SWRAndAPI from "ui/routes/test/tests/swr-and-api"; +import SwrAndDataApi from "ui/routes/test/tests/swr-and-data-api"; import { Route, useParams } from "wouter"; import { Empty } from "../../components/display/Empty"; import { Link } from "../../components/wouter/Link"; @@ -39,7 +40,8 @@ const tests = { FlowsTest, AppShellAccordionsTest, SwaggerTest, - SWRAndAPI + SWRAndAPI, + SwrAndDataApi } as const; export default function TestRoutes() { diff --git a/app/src/ui/routes/test/tests/swr-and-api.tsx b/app/src/ui/routes/test/tests/swr-and-api.tsx index a4808ea..53c632e 100644 --- a/app/src/ui/routes/test/tests/swr-and-api.tsx +++ b/app/src/ui/routes/test/tests/swr-and-api.tsx @@ -1,20 +1,45 @@ -import { useState } from "react"; +import { useEffect, useState } from "react"; import { useApiQuery } from "ui/client"; import { Scrollable } from "ui/layouts/AppShell/AppShell"; export default function SWRAndAPI() { - const [enabled, setEnabled] = useState(false); - const { data, error, isLoading } = useApiQuery(({ data }) => data.readMany("posts"), { - enabled, + const [text, setText] = useState(""); + const { data, ...r } = useApiQuery((api) => api.data.readOne("comments", 1), { + refine: (data) => data.data, revalidateOnFocus: true }); + const comment = data ? data : null; + + useEffect(() => { + setText(comment?.content ?? ""); + }, [comment]); return ( - - {error &&

failed to load
} - {isLoading &&
loading...
} +
{JSON.stringify(r.promise.keyArray({ search: false }))}
+ {r.error &&
failed to load
} + {r.isLoading &&
loading...
} {data &&
{JSON.stringify(data, null, 2)}
} + {data && ( +
{ + e.preventDefault(); + if (!comment) return; + + await r.mutate(async () => { + const res = await r.api.data.updateOne("comments", comment.id, { + content: text + }); + return res.data; + }); + + return false; + }} + > + setText(e.target.value)} /> + +
+ )} ); } diff --git a/app/src/ui/routes/test/tests/swr-and-data-api.tsx b/app/src/ui/routes/test/tests/swr-and-data-api.tsx new file mode 100644 index 0000000..7c2e2a6 --- /dev/null +++ b/app/src/ui/routes/test/tests/swr-and-data-api.tsx @@ -0,0 +1,55 @@ +import { useEffect, useState } from "react"; +import { useEntity, useEntityQuery } from "ui/client/api/use-entity"; +import { Scrollable } from "ui/layouts/AppShell/AppShell"; + +export default function SwrAndDataApi() { + return ( +
+ + +
+ ); +} + +function QueryDataApi() { + const [text, setText] = useState(""); + const { data, update, ...r } = useEntityQuery("comments", 1, {}); + const comment = data ? data : null; + + useEffect(() => { + setText(comment?.content ?? ""); + }, [comment]); + + return ( + +
{JSON.stringify(r.key)}
+ {r.error &&
failed to load
} + {r.isLoading &&
loading...
} + {data &&
{JSON.stringify(data, null, 2)}
} + {data && ( +
{ + e.preventDefault(); + if (!comment) return; + await update({ content: text }); + return false; + }} + > + setText(e.target.value)} /> + +
+ )} +
+ ); +} + +function DirectDataApi() { + const [data, setData] = useState(); + const { create, read, update, _delete } = useEntity("comments", 1); + + useEffect(() => { + read().then(setData); + }, []); + + return
{JSON.stringify(data, null, 2)}
; +} diff --git a/docs/mint.json b/docs/mint.json index 5be4fbe..69cde17 100644 --- a/docs/mint.json +++ b/docs/mint.json @@ -61,7 +61,7 @@ "navigation": [ { "group": "Getting Started", - "pages": ["introduction", "setup", "sdk", "cli"] + "pages": ["introduction", "setup", "sdk", "react", "cli"] }, { "group": "Modules", diff --git a/docs/react.mdx b/docs/react.mdx new file mode 100644 index 0000000..1c30c2c --- /dev/null +++ b/docs/react.mdx @@ -0,0 +1,194 @@ +--- +title: 'SDK (React)' +description: 'Use the bknd SDK for React' +--- + +For all SDK options targeting React, you always have 2 options: +1. use simple hooks which are solely based on the [API](/sdk) +2. use the query hook that makes wraps the API in [SWR](https://swr.vercel.app/) + +To use the simple hook that returns the Api, you can use: +```tsx +import { useApi } from "bknd/client"; + +export default function App() { + const api = useApi(); + // ... +} +``` + +## `useApiQuery([selector], [options])` +This hook wraps the API class in an SWR hook for convenience. You can use any API endpoint +supported, like so: +```tsx +import { useApiQuery } from "bknd/client"; + +export default function App() { + const { data, ...swr } = useApiQuery((api) => api.data.readMany("comments")); + + if (swr.error) return
Error
+ if (swr.isLoading) return
Loading...
+ + return
{JSON.stringify(data, null, 2)}
+} +``` + +### Props +* `selector: (api: Api) => FetchPromise` + + The first parameter is a selector function that provides an Api instance and expects an + endpoint function to be returned. + +* `options`: optional object that inherits from `SWRConfiguration` + + ```ts + type Options = SWRConfiguration & { + enabled?: boolean; + refine?: (data: Data) => Data | any; + } + ``` + + * `enabled`: Determines whether this hook should trigger a fetch of the data or not. + * `refine`: Optional refinement that is called after a response from the API has been + received. Useful to omit irrelevant data from the response (see example below). + +### Using mutations +To query and mutate data using this hook, you can leverage the parameters returned. In the +following example we'll also use a `refine` function as well as `revalidateOnFocus` (option from +`SWRConfiguration`) so that our data keeps updating on window focus change. + +```tsx +import { useState } from "react"; +import { useApiQuery } from "bknd/client"; + +export default function App() { + const [text, setText] = useState(""); + const { data, api, mutate, ...q } = useApiQuery( + (api) => api.data.readOne("comments", 1), + { + // filter to a subset of the response + refine: (data) => data.data, + revalidateOnFocus: true + } + ); + + const comment = data ? data : null; + + useEffect(() => { + setText(comment?.content ?? ""); + }, [comment]); + + if (q.error) return
Error
+ if (q.isLoading) return
Loading...
+ + return ( +
{ + e.preventDefault(); + if (!comment) return; + + // this will automatically revalidate the query + await mutate(async () => { + const res = await api.data.updateOne("comments", comment.id, { + content: text + }); + return res.data; + }); + + return false; + }} + > + setText(e.target.value)} /> + +
+ ); +} +``` + +## `useEntity()` +This hook wraps the endpoints of `DataApi` and returns CRUD options as parameters: +```tsx +import { useState } from "react", +import { useEntity } from "bknd/client"; + +export default function App() { + const [data, setData] = useState(); + const { create, read, update, _delete } = useEntity("comments", 1); + + useEffect(() => { + read().then(setData); + }, []); + + return
{JSON.stringify(data, null, 2)}
+} +``` +If you only supply the entity name as string without an ID, the `read` method will fetch a list +of entities instead of a single entry. + +### Props +Following props are available when using `useEntityQuery([entity], [id?])`: +- `entity: string`: Specify the table name of the entity +- `id?: number | string`: If an id given, it will fetch a single entry, otherwise a list + +### Returned actions +The following actions are returned from this hook: +- `create: (input: object)`: Create a new entry +- `read: (query: Partial = {})`: If an id was given, +it returns a single item, otherwise a list +- `update: (input: object, id?: number | string)`: If an id was given, the id parameter is +optional. Updates the given entry partially. +- `_delete: (id?: number | string)`: If an id was given, the id parameter is +optional. Deletes the given entry. + +## `useEntityQuery()` +This hook wraps the actions from `useEntity` around `SWR`. The previous example would look like +this: +```tsx +import { useState } from "react", +import { useEntityQuery } from "bknd/client"; + +export default function App() { + const { data } = useEntityQuery("comments", 1); + + return
{JSON.stringify(data, null, 2)}
+} +``` + +### Using mutations +All actions returned from `useEntityQuery` are conveniently wrapped around the `mutate` function, +so you don't have think about this: +```tsx +import { useState } from "react"; +import { useEntityQuery } from "bknd/client"; + +export default function App() { + const [text, setText] = useState(""); + const { data, update, ...q } = useEntityQuery("comments", 1); + + const comment = data ? data : null; + + useEffect(() => { + setText(comment?.content ?? ""); + }, [comment]); + + if (q.error) return
Error
+ if (q.isLoading) return
Loading...
+ + return ( +
{ + e.preventDefault(); + if (!comment) return; + + // this will automatically revalidate the query + await update({ content: text }); + + return false; + }} + > + setText(e.target.value)} /> + +
+ ); +} +``` From 8c91dff94d6081f79c2993110fb8abd1ef572ec6 Mon Sep 17 00:00:00 2001 From: dswbx Date: Fri, 13 Dec 2024 16:24:55 +0100 Subject: [PATCH 4/6] updated admin to use swr hooks instead of react-query --- app/src/auth/api/AuthApi.ts | 4 +- app/src/data/helper.ts | 8 +- app/src/modules/ModuleApi.ts | 70 ++++++++++++--- app/src/modules/SystemApi.ts | 25 +++--- app/src/modules/server/SystemController.ts | 20 ++++- app/src/ui/Admin.tsx | 42 ++++++++- app/src/ui/client/BkndProvider.tsx | 19 ++-- app/src/ui/client/api/use-api.ts | 11 ++- app/src/ui/client/api/use-entity.ts | 72 ++++++++++++--- app/src/ui/client/schema/actions.ts | 49 +++++------ app/src/ui/client/utils/AppQueryClient.ts | 10 +-- app/src/ui/components/display/Logo.tsx | 14 +-- app/src/ui/components/table/DataTable.tsx | 17 ++-- app/src/ui/layouts/AppShell/AppShell.tsx | 6 +- app/src/ui/layouts/AppShell/Header.tsx | 2 +- .../fields/EntityRelationalFormField.tsx | 88 +++++-------------- .../ui/modules/data/hooks/useEntityForm.tsx | 10 +-- app/src/ui/routes/data/data.$entity.$id.tsx | 58 ++++++------ .../ui/routes/data/data.$entity.create.tsx | 44 +++++----- app/src/ui/routes/data/data.$entity.index.tsx | 86 +++++++++--------- 20 files changed, 380 insertions(+), 275 deletions(-) diff --git a/app/src/auth/api/AuthApi.ts b/app/src/auth/api/AuthApi.ts index 8c2fe8b..7b43d6d 100644 --- a/app/src/auth/api/AuthApi.ts +++ b/app/src/auth/api/AuthApi.ts @@ -15,7 +15,7 @@ export class AuthApi extends ModuleApi { async loginWithPassword(input: any) { const res = await this.post(["password", "login"], input); - if (res.res.ok && res.body.token) { + if (res.ok && res.body.token) { await this.options.onTokenUpdate?.(res.body.token); } return res; @@ -23,7 +23,7 @@ export class AuthApi extends ModuleApi { async registerWithPassword(input: any) { const res = await this.post(["password", "register"], input); - if (res.res.ok && res.body.token) { + if (res.ok && res.body.token) { await this.options.onTokenUpdate?.(res.body.token); } return res; diff --git a/app/src/data/helper.ts b/app/src/data/helper.ts index 481ab0f..74497b0 100644 --- a/app/src/data/helper.ts +++ b/app/src/data/helper.ts @@ -18,6 +18,7 @@ export function getChangeSet( data: EntityData, fields: Field[] ): EntityData { + //console.log("getChangeSet", formData, data); return transform( formData, (acc, _value, key) => { @@ -26,11 +27,12 @@ export function getChangeSet( if (!field || field.isVirtual()) return; const value = _value === "" ? null : _value; - const newValue = field.getValue(value, "submit"); + // normalize to null if undefined + const newValue = field.getValue(value, "submit") || null; // @todo: add typing for "action" if (action === "create" || newValue !== data[key]) { acc[key] = newValue; - console.log("changed", { + /*console.log("changed", { key, value, valueType: typeof value, @@ -38,7 +40,7 @@ export function getChangeSet( newValue, new: value, sent: acc[key] - }); + });*/ } else { //console.log("no change", key, value, data[key]); } diff --git a/app/src/modules/ModuleApi.ts b/app/src/modules/ModuleApi.ts index 2473f0d..cfeac86 100644 --- a/app/src/modules/ModuleApi.ts +++ b/app/src/modules/ModuleApi.ts @@ -1,4 +1,4 @@ -import type { PrimaryFieldType } from "core"; +import { type PrimaryFieldType, isDebug } from "core"; import { encodeSearch } from "core/utils"; export type { PrimaryFieldType }; @@ -10,6 +10,7 @@ export type BaseModuleApiOptions = { token_transport?: "header" | "cookie" | "none"; }; +/** @deprecated */ export type ApiResponse = { success: boolean; status: number; @@ -47,7 +48,7 @@ export abstract class ModuleApi | URLSearchParams, _init?: RequestInit - ): FetchPromise> { + ): FetchPromise> { const method = _init?.method ?? "GET"; const input = Array.isArray(_input) ? _input.join("/") : _input; let url = this.getUrl(input); @@ -138,6 +139,58 @@ export abstract class ModuleApi = Data & { + raw: Response; + res: Response; + data: Data; + body: Body; + ok: boolean; + status: number; + toJSON(): Data; +}; + +export function createResponseProxy( + raw: Response, + body: Body, + data?: Data +): ResponseObject { + const actualData = data ?? (body as unknown as Data); + const _props = ["raw", "body", "ok", "status", "res", "data", "toJSON"]; + + return new Proxy(actualData as any, { + get(target, prop, receiver) { + if (prop === "raw" || prop === "res") return raw; + if (prop === "body") return body; + if (prop === "data") return data; + if (prop === "ok") return raw.ok; + if (prop === "status") return raw.status; + if (prop === "toJSON") { + return () => target; + } + return Reflect.get(target, prop, receiver); + }, + has(target, prop) { + if (_props.includes(prop as string)) { + return true; + } + return Reflect.has(target, prop); + }, + ownKeys(target) { + return Array.from(new Set([...Reflect.ownKeys(target), ..._props])); + }, + getOwnPropertyDescriptor(target, prop) { + if (_props.includes(prop as string)) { + return { + configurable: true, + enumerable: true, + value: Reflect.get({ raw, body, ok: raw.ok, status: raw.status }, prop) + }; + } + return Reflect.getOwnPropertyDescriptor(target, prop); + } + }) as ResponseObject; +} + export class FetchPromise> implements Promise { // @ts-ignore [Symbol.toStringTag]: "FetchPromise"; @@ -149,7 +202,10 @@ export class FetchPromise> implements Promise { } ) {} - async execute(): Promise { + async execute(): Promise> { + // delay in dev environment + isDebug() && (await new Promise((resolve) => setTimeout(resolve, 200))); + const fetcher = this.options?.fetcher ?? fetch; const res = await fetcher(this.request); let resBody: any; @@ -165,13 +221,7 @@ export class FetchPromise> implements Promise { resBody = await res.text(); } - return { - success: res.ok, - status: res.status, - body: resBody, - data: resData, - res - } as T; + return createResponseProxy(res, resBody, resData); } // biome-ignore lint/suspicious/noThenProperty: it's a promise :) diff --git a/app/src/modules/SystemApi.ts b/app/src/modules/SystemApi.ts index 1d226c6..2451b78 100644 --- a/app/src/modules/SystemApi.ts +++ b/app/src/modules/SystemApi.ts @@ -1,3 +1,4 @@ +import type { ConfigUpdateResponse } from "modules/server/SystemController"; import { ModuleApi } from "./ModuleApi"; import type { ModuleConfigs, ModuleKey, ModuleSchemas } from "./ModuleManager"; @@ -15,37 +16,37 @@ export class SystemApi extends ModuleApi { }; } - async readSchema(options?: { config?: boolean; secrets?: boolean }) { - return await this.get("schema", { + readSchema(options?: { config?: boolean; secrets?: boolean }) { + return this.get("schema", { config: options?.config ? 1 : 0, secrets: options?.secrets ? 1 : 0 }); } - async setConfig( + setConfig( module: Module, value: ModuleConfigs[Module], force?: boolean ) { - return await this.post( + return this.post( ["config", "set", module].join("/") + `?force=${force ? 1 : 0}`, value ); } - async addConfig(module: Module, path: string, value: any) { - return await this.post(["config", "add", module, path], value); + addConfig(module: Module, path: string, value: any) { + return this.post(["config", "add", module, path], value); } - async patchConfig(module: Module, path: string, value: any) { - return await this.patch(["config", "patch", module, path], value); + patchConfig(module: Module, path: string, value: any) { + return this.patch(["config", "patch", module, path], value); } - async overwriteConfig(module: Module, path: string, value: any) { - return await this.put(["config", "overwrite", module, path], value); + overwriteConfig(module: Module, path: string, value: any) { + return this.put(["config", "overwrite", module, path], value); } - async removeConfig(module: Module, path: string) { - return await this.delete(["config", "remove", module, path]); + removeConfig(module: Module, path: string) { + return this.delete(["config", "remove", module, path]); } } diff --git a/app/src/modules/server/SystemController.ts b/app/src/modules/server/SystemController.ts index 93d7cfb..a9fb8d3 100644 --- a/app/src/modules/server/SystemController.ts +++ b/app/src/modules/server/SystemController.ts @@ -1,18 +1,32 @@ /// +import type { App } from "App"; import type { ClassController } from "core"; import { tbValidator as tb } from "core"; import { StringEnum, Type, TypeInvalidError } from "core/utils"; import { type Context, Hono } from "hono"; -import { MODULE_NAMES, type ModuleKey, getDefaultConfig } from "modules/ModuleManager"; +import { + MODULE_NAMES, + type ModuleConfigs, + type ModuleKey, + getDefaultConfig +} from "modules/ModuleManager"; import * as SystemPermissions from "modules/permissions"; import { generateOpenAPI } from "modules/server/openapi"; -import type { App } from "../../App"; const booleanLike = Type.Transform(Type.String()) .Decode((v) => v === "1") .Encode((v) => (v ? "1" : "0")); +export type ConfigUpdate = { + success: true; + module: Key; + config: ModuleConfigs[Key]; +}; +export type ConfigUpdateResponse = + | ConfigUpdate + | { success: false; type: "type-invalid" | "error" | "unknown"; error?: any; errors?: any }; + export class SystemController implements ClassController { constructor(private readonly app: App) {} @@ -60,7 +74,7 @@ export class SystemController implements ClassController { } ); - async function handleConfigUpdateResponse(c: Context, cb: () => Promise) { + async function handleConfigUpdateResponse(c: Context, cb: () => Promise) { try { return c.json(await cb(), { status: 202 }); } catch (e) { diff --git a/app/src/ui/Admin.tsx b/app/src/ui/Admin.tsx index df69242..bdfe5bc 100644 --- a/app/src/ui/Admin.tsx +++ b/app/src/ui/Admin.tsx @@ -3,6 +3,8 @@ import { Notifications } from "@mantine/notifications"; import type { ModuleConfigs } from "modules"; import React from "react"; import { BkndProvider, useBknd } from "ui/client/bknd"; +import { Logo } from "ui/components/display/Logo"; +import * as AppShell from "ui/layouts/AppShell/AppShell"; import { FlashMessage } from "ui/modules/server/FlashMessage"; import { ClientProvider, type ClientProviderProps } from "./client"; import { createMantineTheme } from "./lib/mantine/theme"; @@ -21,7 +23,7 @@ export default function Admin({ config }: BkndAdminProps) { const Component = ( - + }> ); @@ -51,3 +53,41 @@ function AdminInternal() { ); } + +const Skeleton = ({ theme = "light" }: { theme?: string }) => { + return ( +
+ +
+
+ +
+ + +
+
+
+
+
+ +
+ Loading +
+
+
+
+ ); +}; diff --git a/app/src/ui/client/BkndProvider.tsx b/app/src/ui/client/BkndProvider.tsx index cbb6a39..3b26d26 100644 --- a/app/src/ui/client/BkndProvider.tsx +++ b/app/src/ui/client/BkndProvider.tsx @@ -1,5 +1,10 @@ import { getDefaultConfig, getDefaultSchema } from "modules/ModuleManager"; import { createContext, startTransition, useContext, useEffect, useRef, useState } from "react"; +import { Logo } from "ui/components/display/Logo"; +import { Link } from "ui/components/wouter/Link"; +import * as AppShell from "ui/layouts/AppShell/AppShell"; +import { HeaderNavigation } from "ui/layouts/AppShell/Header"; +import { Root } from "ui/routes/root"; import type { ModuleConfigs, ModuleSchemas } from "../../modules"; import { useClient } from "./ClientProvider"; import { type TSchemaActions, getSchemaActions } from "./schema/actions"; @@ -22,8 +27,12 @@ export type { TSchemaActions }; export function BkndProvider({ includeSecrets = false, adminOverride, - children -}: { includeSecrets?: boolean; children: any } & Pick) { + children, + fallback = null +}: { includeSecrets?: boolean; children: any; fallback?: React.ReactNode } & Pick< + BkndContext, + "adminOverride" +>) { const [withSecrets, setWithSecrets] = useState(includeSecrets); const [schema, setSchema] = useState>(); @@ -37,7 +46,7 @@ export function BkndProvider({ async function fetchSchema(_includeSecrets: boolean = false, force?: boolean) { if (withSecrets && !force) return; - const { body, res } = await client.api.system.readSchema({ + const res = await client.api.system.readSchema({ config: true, secrets: _includeSecrets }); @@ -57,7 +66,7 @@ export function BkndProvider({ } const schema = res.ok - ? body + ? res.body : ({ version: 0, schema: getDefaultSchema(), @@ -89,7 +98,7 @@ export function BkndProvider({ fetchSchema(includeSecrets); }, []); - if (!fetched || !schema) return null; + if (!fetched || !schema) return fallback; const app = new AppReduced(schema?.config as any); const actions = getSchemaActions({ client, setSchema, reloadSchema }); diff --git a/app/src/ui/client/api/use-api.ts b/app/src/ui/client/api/use-api.ts index ae8e345..754ef7d 100644 --- a/app/src/ui/client/api/use-api.ts +++ b/app/src/ui/client/api/use-api.ts @@ -1,6 +1,6 @@ import type { Api } from "Api"; -import type { FetchPromise } from "modules/ModuleApi"; -import useSWR, { type SWRConfiguration, useSWRConfig } from "swr"; +import type { FetchPromise, ResponseObject } from "modules/ModuleApi"; +import useSWR, { type SWRConfiguration } from "swr"; import { useClient } from "ui/client/ClientProvider"; export const useApi = () => { @@ -8,13 +8,16 @@ export const useApi = () => { return client.api; }; -export const useApiQuery = any = (data: Data) => Data>( +export const useApiQuery = < + Data, + RefineFn extends (data: ResponseObject) => any = (data: ResponseObject) => Data +>( fn: (api: Api) => FetchPromise, options?: SWRConfiguration & { enabled?: boolean; refine?: RefineFn } ) => { const api = useApi(); const promise = fn(api); - const refine = options?.refine ?? ((data: Data) => data); + const refine = options?.refine ?? ((data: ResponseObject) => data); const fetcher = () => promise.execute().then(refine); const key = promise.key(); diff --git a/app/src/ui/client/api/use-entity.ts b/app/src/ui/client/api/use-entity.ts index 3169bc2..4482c12 100644 --- a/app/src/ui/client/api/use-entity.ts +++ b/app/src/ui/client/api/use-entity.ts @@ -1,9 +1,20 @@ import type { PrimaryFieldType } from "core"; import { objectTransform } from "core/utils"; import type { EntityData, RepoQuery } from "data"; +import type { ResponseObject } from "modules/ModuleApi"; import useSWR, { type SWRConfiguration } from "swr"; import { useApi } from "ui/client"; +export class UseEntityApiError extends Error { + constructor( + public payload: Payload, + public response: Response, + message?: string + ) { + super(message ?? "UseEntityApiError"); + } +} + export const useEntity = < Entity extends string, Id extends PrimaryFieldType | undefined = undefined @@ -16,18 +27,27 @@ export const useEntity = < return { create: async (input: EntityData) => { const res = await api.createOne(entity, input); - return res.data; + if (!res.ok) { + throw new UseEntityApiError(res.data, res.res, "Failed to create entity"); + } + return res; }, read: async (query: Partial = {}) => { const res = id ? await api.readOne(entity, id!, query) : await api.readMany(entity, query); - return res.data; + if (!res.ok) { + throw new UseEntityApiError(res.data, res.res, "Failed to read entity"); + } + return res; }, update: async (input: Partial, _id: PrimaryFieldType | undefined = id) => { if (!_id) { throw new Error("id is required"); } const res = await api.updateOne(entity, _id, input); - return res.data; + if (!res.ok) { + throw new UseEntityApiError(res.data, res.res, "Failed to update entity"); + } + return res; }, _delete: async (_id: PrimaryFieldType | undefined = id) => { if (!_id) { @@ -35,7 +55,10 @@ export const useEntity = < } const res = await api.deleteOne(entity, _id); - return res.data; + if (!res.ok) { + throw new UseEntityApiError(res.data, res.res, "Failed to delete entity"); + } + return res; } }; }; @@ -47,24 +70,30 @@ export const useEntityQuery = < entity: Entity, id?: Id, query?: Partial, - options?: SWRConfiguration + options?: SWRConfiguration & { enabled?: boolean } ) => { const api = useApi().data; - const key = [...(api.options?.basepath?.split("/") ?? []), entity, ...(id ? [id] : [])].filter( - Boolean - ); + const key = + options?.enabled !== false + ? [...(api.options?.basepath?.split("/") ?? []), entity, ...(id ? [id] : [])].filter( + Boolean + ) + : null; const { read, ...actions } = useEntity(entity, id) as any; - const fetcher = id ? () => read(query) : () => null; - const swr = useSWR(id ? key : null, fetcher, options); + const fetcher = () => read(query); + + type T = Awaited>; + const swr = useSWR(key, fetcher, { + revalidateOnFocus: false, + keepPreviousData: false, + ...options + }); const mapped = objectTransform(actions, (action) => { if (action === "read") return; return async (...args) => { - return swr.mutate(async () => { - const res = await action(...args); - return res; - }); + return swr.mutate(action(...args)) as any; }; }) as Omit>, "read">; @@ -74,3 +103,18 @@ export const useEntityQuery = < key }; }; + +export const useEntityMutate = < + Entity extends string, + Id extends PrimaryFieldType | undefined = undefined +>( + entity: Entity, + id?: Id, + options?: SWRConfiguration +) => { + const { data, ...$q } = useEntityQuery(entity, id, undefined, { + ...options, + enabled: false + }); + return $q; +}; diff --git a/app/src/ui/client/schema/actions.ts b/app/src/ui/client/schema/actions.ts index c03d4b0..9bed2c4 100644 --- a/app/src/ui/client/schema/actions.ts +++ b/app/src/ui/client/schema/actions.ts @@ -1,6 +1,8 @@ import { type NotificationData, notifications } from "@mantine/notifications"; import { ucFirst } from "core/utils"; -import type { ApiResponse, ModuleConfigs } from "../../../modules"; +import type { ModuleConfigs } from "modules"; +import type { ResponseObject } from "modules/ModuleApi"; +import type { ConfigUpdateResponse } from "modules/server/SystemController"; import type { AppQueryClient } from "../utils/AppQueryClient"; export type SchemaActionsProps = { @@ -14,10 +16,10 @@ export type TSchemaActions = ReturnType; export function getSchemaActions({ client, setSchema, reloadSchema }: SchemaActionsProps) { const api = client.api; - async function handleConfigUpdate( + async function handleConfigUpdate( action: string, - module: string, - res: ApiResponse, + module: Module, + res: ResponseObject>, path?: string ): Promise { const base: Partial = { @@ -26,7 +28,7 @@ export function getSchemaActions({ client, setSchema, reloadSchema }: SchemaActi autoClose: 3000 }; - if (res.res.ok && res.body.success) { + if (res.success === true) { console.log("update config", action, module, path, res.body); if (res.body.success) { setSchema((prev) => { @@ -35,7 +37,7 @@ export function getSchemaActions({ client, setSchema, reloadSchema }: SchemaActi ...prev, config: { ...prev.config, - [module]: res.body.config + [module]: res.config } }; }); @@ -47,18 +49,18 @@ export function getSchemaActions({ client, setSchema, reloadSchema }: SchemaActi color: "blue", message: `Operation ${action.toUpperCase()} at ${module}${path ? "." + path : ""}` }); - return true; + } else { + notifications.show({ + ...base, + title: `Config Update failed: ${ucFirst(module)}${path ? "." + path : ""}`, + color: "red", + withCloseButton: true, + autoClose: false, + message: res.error ?? "Failed to complete config update" + }); } - notifications.show({ - ...base, - title: `Config Update failed: ${ucFirst(module)}${path ? "." + path : ""}`, - color: "red", - withCloseButton: true, - autoClose: false, - message: res.body.error ?? "Failed to complete config update" - }); - return false; + return res.success; } return { @@ -72,7 +74,7 @@ export function getSchemaActions({ client, setSchema, reloadSchema }: SchemaActi return await handleConfigUpdate("set", module, res); }, patch: async ( - module: keyof ModuleConfigs, + module: Module, path: string, value: any ): Promise => { @@ -80,25 +82,18 @@ export function getSchemaActions({ client, setSchema, reloadSchema }: SchemaActi return await handleConfigUpdate("patch", module, res, path); }, overwrite: async ( - module: keyof ModuleConfigs, + module: Module, path: string, value: any ) => { const res = await api.system.overwriteConfig(module, path, value); return await handleConfigUpdate("overwrite", module, res, path); }, - add: async ( - module: keyof ModuleConfigs, - path: string, - value: any - ) => { + add: async (module: Module, path: string, value: any) => { const res = await api.system.addConfig(module, path, value); return await handleConfigUpdate("add", module, res, path); }, - remove: async ( - module: keyof ModuleConfigs, - path: string - ) => { + remove: async (module: Module, path: string) => { const res = await api.system.removeConfig(module, path); return await handleConfigUpdate("remove", module, res, path); } diff --git a/app/src/ui/client/utils/AppQueryClient.ts b/app/src/ui/client/utils/AppQueryClient.ts index 8eecf9e..239bd93 100644 --- a/app/src/ui/client/utils/AppQueryClient.ts +++ b/app/src/ui/client/utils/AppQueryClient.ts @@ -36,12 +36,10 @@ export class AppQueryClient { state: (): (AuthResponse & { verified: boolean }) | undefined => { return this.api.getAuthState() as any; }, - login: async (data: { email: string; password: string }): Promise< - ApiResponse - > => { + login: async (data: { email: string; password: string }) => { return await this.api.auth.loginWithPassword(data); }, - register: async (data: any): Promise> => { + register: async (data: any) => { return await this.api.auth.registerWithPassword(data); }, logout: async () => { @@ -57,7 +55,7 @@ export class AppQueryClient { //console.log("verifiying"); const res = await this.api.auth.me(); //console.log("verifying result", res); - if (!res.res.ok || !res.body.user) { + if (!res.ok || !res.body.user) { throw new Error(); } @@ -90,7 +88,7 @@ export class AppQueryClient { typeof filename === "string" ? filename : filename.path ); - if (res.res.ok) { + if (res.ok) { queryClient.invalidateQueries({ queryKey: ["data", "entity", "media"] }); return true; } diff --git a/app/src/ui/components/display/Logo.tsx b/app/src/ui/components/display/Logo.tsx index 89ad5bd..806ee6d 100644 --- a/app/src/ui/components/display/Logo.tsx +++ b/app/src/ui/components/display/Logo.tsx @@ -1,9 +1,13 @@ -import { useBknd } from "../../client/BkndProvider"; +import { useBknd } from "ui/client/bknd"; -export function Logo({ scale = 0.2, fill }: { scale?: number; fill?: string }) { - const { app } = useBknd(); - const theme = app.getAdminConfig().color_scheme; - const svgFill = fill ? fill : theme === "light" ? "black" : "white"; +export function Logo({ + scale = 0.2, + fill, + theme = "light" +}: { scale?: number; fill?: string; theme?: string }) { + const $bknd = useBknd(); + const _theme = theme ?? $bknd?.app?.getAdminConfig().color_scheme ?? "light"; + const svgFill = fill ? fill : _theme === "light" ? "black" : "white"; const dim = { width: Math.round(578 * scale), diff --git a/app/src/ui/components/table/DataTable.tsx b/app/src/ui/components/table/DataTable.tsx index 3ee0b6e..8aa664f 100644 --- a/app/src/ui/components/table/DataTable.tsx +++ b/app/src/ui/components/table/DataTable.tsx @@ -29,7 +29,7 @@ export const Check = () => { }; export type DataTableProps = { - data: Data[]; + data: Data[] | null; // "null" implies loading columns?: string[]; checkable?: boolean; onClickRow?: (row: Data) => void; @@ -71,10 +71,10 @@ export function DataTable = Record renderValue, onClickNew }: DataTableProps) { - total = total || data.length; + total = total || data?.length || 0; page = page || 1; - const select = columns && columns.length > 0 ? columns : Object.keys(data[0] || {}); + const select = columns && columns.length > 0 ? columns : Object.keys(data?.[0] || {}); const pages = Math.max(Math.ceil(total / perPage), 1); const CellRender = renderValue || CellValue; @@ -129,7 +129,9 @@ export function DataTable = Record
- No data to show + + {Array.isArray(data) ? "No data to show" : "Loading..."} +
@@ -188,7 +190,12 @@ export function DataTable = Record
- +
{perPageOptions && ( diff --git a/app/src/ui/layouts/AppShell/AppShell.tsx b/app/src/ui/layouts/AppShell/AppShell.tsx index 003aba4..e61e1d5 100644 --- a/app/src/ui/layouts/AppShell/AppShell.tsx +++ b/app/src/ui/layouts/AppShell/AppShell.tsx @@ -1,14 +1,12 @@ -import { useClickOutside, useDisclosure, useHotkeys, useViewportSize } from "@mantine/hooks"; +import { useClickOutside, useHotkeys } from "@mantine/hooks"; import * as ScrollArea from "@radix-ui/react-scroll-area"; import { IconChevronDown, IconChevronUp } from "@tabler/icons-react"; -import { ucFirst } from "core/utils"; import { throttle } from "lodash-es"; -import { type ComponentProps, createContext, useContext, useEffect, useRef, useState } from "react"; +import { type ComponentProps, useEffect, useRef, useState } from "react"; import type { IconType } from "react-icons"; import { twMerge } from "tailwind-merge"; import { IconButton } from "ui/components/buttons/IconButton"; import { AppShellProvider, useAppShell } from "ui/layouts/AppShell/use-appshell"; -import { Link } from "wouter"; import { useEvent } from "../../hooks/use-event"; export function Root({ children }) { diff --git a/app/src/ui/layouts/AppShell/Header.tsx b/app/src/ui/layouts/AppShell/Header.tsx index e7154e6..754eed6 100644 --- a/app/src/ui/layouts/AppShell/Header.tsx +++ b/app/src/ui/layouts/AppShell/Header.tsx @@ -24,7 +24,7 @@ import { useNavigate } from "ui/lib/routes"; import { useLocation } from "wouter"; import { NavLink } from "./AppShell"; -function HeaderNavigation() { +export function HeaderNavigation() { const [location, navigate] = useLocation(); const items: { diff --git a/app/src/ui/modules/data/components/fields/EntityRelationalFormField.tsx b/app/src/ui/modules/data/components/fields/EntityRelationalFormField.tsx index 8a42699..cb8c16e 100644 --- a/app/src/ui/modules/data/components/fields/EntityRelationalFormField.tsx +++ b/app/src/ui/modules/data/components/fields/EntityRelationalFormField.tsx @@ -4,7 +4,7 @@ import { ucFirst } from "core/utils"; import type { EntityData, RelationField } from "data"; import { useEffect, useRef, useState } from "react"; import { TbEye } from "react-icons/tb"; -import { useClient } from "ui/client"; +import { useClient, useEntityQuery } from "ui/client"; import { useBknd } from "ui/client/bknd"; import { Button } from "ui/components/buttons/Button"; import * as Formy from "ui/components/form/Formy"; @@ -31,25 +31,21 @@ export function EntityRelationalFormField({ const { app } = useBknd(); const entity = app.entity(field.target())!; const [query, setQuery] = useState({ limit: 10, page: 1, perPage: 10 }); - const [location, navigate] = useLocation(); + const [, navigate] = useLocation(); const ref = useRef(null); const client = useClient(); - const container = useEntities( - field.target(), - { - limit: query.limit, - offset: (query.page - 1) * query.limit - //select: entity.getSelect(undefined, "form") - }, - { enabled: true } - ); + const $q = useEntityQuery(field.target(), undefined, { + limit: query.limit, + offset: (query.page - 1) * query.limit + }); const [_value, _setValue] = useState<{ id: number | undefined; [key: string]: any }>(); const referenceField = data?.[field.reference()]; const relationalField = data?.[field.name]; useEffect(() => { - _setValue(data?.[field.reference()]); + const value = data?.[field.reference()]; + _setValue(value); }, [referenceField]); useEffect(() => { @@ -57,62 +53,40 @@ export function EntityRelationalFormField({ const rel_value = field.target(); if (!rel_value || !relationalField) return; - console.log("-- need to fetch", field.target(), relationalField); const fetched = await client.api.data.readOne(field.target(), relationalField); - if (fetched.res.ok && fetched.data) { + if (fetched.ok && fetched.data) { _setValue(fetched.data as any); } - console.log("-- fetched", fetched); - - console.log("relation", { - referenceField, - relationalField, - data, - field, - entity - }); })(); }, [relationalField]); - /*const initialValue: { id: number | undefined; [key: string]: any } = data?.[ - field.reference() - ] ?? { - id: data?.[field.name], - };*/ - function handleViewItem(e: React.MouseEvent) { e.preventDefault(); e.stopPropagation(); - console.log("yo"); if (_value) { navigate(routes.data.entity.edit(entity.name, _value.id as any)); } } - /*console.log( - "relationfield:data", - { _value, initialValue }, - data, - field.reference(), - entity, - //container.entity, - //data[field.reference()], - data?.[field.name], - field, - );*/ - // fix missing value on fields that are required useEffect(() => { if (field.isRequired() && !fieldApi.state.value) { - fieldApi.setValue(container.data?.[0]?.id); + const firstValue = $q.data?.[0]; + if (!firstValue) return; + + console.warn("setting first value because field is required", field.name, firstValue.id); + fieldApi.setValue(firstValue.id); + _setValue(firstValue as any); } - }, [container.data]); + }, [$q.data]); + + const fetching = $q.isLoading || $q.isValidating; return ( {field.getLabel()}
( - {/* - {container.data ? ( - <> - {emptyOption} - {!field.isRequired() && emptyOption} - {container.data?.map(renderRow)} - - ) : ( - - )} - */} ); } diff --git a/app/src/ui/modules/data/hooks/useEntityForm.tsx b/app/src/ui/modules/data/hooks/useEntityForm.tsx index 7b991ea..45432d7 100644 --- a/app/src/ui/modules/data/hooks/useEntityForm.tsx +++ b/app/src/ui/modules/data/hooks/useEntityForm.tsx @@ -19,18 +19,16 @@ export function useEntityForm({ // @todo: check if virtual must be filtered const fields = entity.getFillableFields(action, true); - console.log("useEntityForm:data", data); - // filter defaultValues to only contain fillable fields const defaultValues = getDefaultValues(fields, data); - console.log("useEntityForm:defaultValues", data); + //console.log("useEntityForm", { data, defaultValues }); const Form = useForm({ defaultValues, validators: { onSubmitAsync: async ({ value }): Promise => { try { - console.log("validating", value, entity.isValidData(value, action)); + //console.log("validating", value, entity.isValidData(value, action)); entity.isValidData(value, action, true); return undefined; } catch (e) { @@ -40,7 +38,7 @@ export function useEntityForm({ } }, onSubmit: async ({ value, formApi }) => { - console.log("onSubmit", value); + //console.log("onSubmit", value); if (!entity.isValidData(value, action)) { console.error("invalid data", value); return; @@ -49,7 +47,7 @@ export function useEntityForm({ if (!data) return; const changeSet = getChangeSet(action, value, data, fields); - console.log("changesSet", action, changeSet); + //console.log("changesSet", action, changeSet, { data }); // only submit change set if there were changes await onSubmitted?.(Object.keys(changeSet).length === 0 ? undefined : changeSet); diff --git a/app/src/ui/routes/data/data.$entity.$id.tsx b/app/src/ui/routes/data/data.$entity.$id.tsx index 20349e6..7b6fcf0 100644 --- a/app/src/ui/routes/data/data.$entity.$id.tsx +++ b/app/src/ui/routes/data/data.$entity.$id.tsx @@ -2,12 +2,11 @@ import { ucFirst } from "core/utils"; import type { Entity, EntityData, EntityRelation } from "data"; import { Fragment, useState } from "react"; import { TbDots } from "react-icons/tb"; -import { useClient } from "ui/client"; +import { useClient, useEntityQuery } from "ui/client"; import { useBkndData } from "ui/client/schema/data/use-bknd-data"; import { Button } from "ui/components/buttons/Button"; import { IconButton } from "ui/components/buttons/IconButton"; import { Dropdown } from "ui/components/overlay/Dropdown"; -import { useEntity } from "ui/container"; import { useBrowserTitle } from "ui/hooks/use-browser-title"; import * as AppShell from "ui/layouts/AppShell/AppShell"; import { Breadcrumbs2 } from "ui/layouts/AppShell/Breadcrumbs2"; @@ -25,22 +24,23 @@ export function DataEntityUpdate({ params }) { const [navigate] = useNavigate(); useBrowserTitle(["Data", entity.label, `#${entityId}`]); const targetRelations = relations.listableRelationsOf(entity); - //console.log("targetRelations", targetRelations, relations.relationsOf(entity)); - // filter out polymorphic for now - //.filter((r) => r.type() !== "poly"); + const local_relation_refs = relations .sourceRelationsOf(entity) ?.map((r) => r.other(entity).reference); - const container = useEntity(entity.name, entityId, { - fetch: { - query: { - with: local_relation_refs - } + const $q = useEntityQuery( + entity.name, + entityId, + { + with: local_relation_refs + }, + { + revalidateOnFocus: false } - }); + ); - function goBack(state?: Record) { + function goBack() { window.history.go(-1); } @@ -52,43 +52,39 @@ export function DataEntityUpdate({ params }) { return; } - const res = await container.actions.update(changeSet); - console.log("update:res", res); - if (res.data?.error) { - setError(res.data.error); - } else { - error && setError(null); + try { + await $q.update(changeSet); + if (error) setError(null); goBack(); + } catch (e) { + setError(e instanceof Error ? e.message : "Failed to update"); } } async function handleDelete() { if (confirm("Are you sure to delete?")) { - const res = await container.actions.remove(); - if (res.error) { - setError(res.error); - } else { - error && setError(null); + try { + await $q._delete(); + if (error) setError(null); goBack(); + } catch (e) { + setError(e instanceof Error ? e.message : "Failed to delete"); } } } + const data = $q.data; const { Form, handleSubmit } = useEntityForm({ action: "update", entity, - initialData: container.data, + initialData: $q.data?.toJSON(), onSubmitted }); - //console.log("form.data", Form.state.values, container.data); const makeKey = (key: string | number = "") => `${params.entity.name}_${entityId}_${String(key)}`; - const fieldsDisabled = - container.raw.fetch?.isLoading || - container.status.fetch.isUpdating || - Form.state.isSubmitting; + const fieldsDisabled = $q.isLoading || $q.isValidating || Form.state.isSubmitting; return ( @@ -103,7 +99,7 @@ export function DataEntityUpdate({ params }) { onClick: () => { bkndModals.open("debug", { data: { - data: container.data as any, + data: data as any, entity: entity.toJSON(), schema: entity.toSchema(true), form: Form.state.values, @@ -165,7 +161,7 @@ export function DataEntityUpdate({ params }) { entityId={entityId} handleSubmit={handleSubmit} fieldsDisabled={fieldsDisabled} - data={container.data ?? undefined} + data={data ?? undefined} Form={Form} action="update" className="flex flex-grow flex-col gap-3 p-3" diff --git a/app/src/ui/routes/data/data.$entity.create.tsx b/app/src/ui/routes/data/data.$entity.create.tsx index 3d3a09a..3df30db 100644 --- a/app/src/ui/routes/data/data.$entity.create.tsx +++ b/app/src/ui/routes/data/data.$entity.create.tsx @@ -1,15 +1,16 @@ import { Type } from "core/utils"; import { useState } from "react"; +import { useEntityMutate, useEntityQuery } from "ui/client"; +import { useBknd } from "ui/client/BkndProvider"; +import { Button } from "ui/components/buttons/Button"; +import { type EntityData, useEntity } from "ui/container"; +import { useBrowserTitle } from "ui/hooks/use-browser-title"; +import { useSearch } from "ui/hooks/use-search"; +import * as AppShell from "ui/layouts/AppShell/AppShell"; +import { Breadcrumbs2 } from "ui/layouts/AppShell/Breadcrumbs2"; +import { routes } from "ui/lib/routes"; import { EntityForm } from "ui/modules/data/components/EntityForm"; import { useEntityForm } from "ui/modules/data/hooks/useEntityForm"; -import { useBknd } from "../../client/BkndProvider"; -import { Button } from "../../components/buttons/Button"; -import { type EntityData, useEntity } from "../../container"; -import { useBrowserTitle } from "../../hooks/use-browser-title"; -import { useSearch } from "../../hooks/use-search"; -import * as AppShell from "../../layouts/AppShell/AppShell"; -import { Breadcrumbs2 } from "../../layouts/AppShell/Breadcrumbs2"; -import { routes } from "../../lib/routes"; export function DataEntityCreate({ params }) { const { app } = useBknd(); @@ -17,40 +18,37 @@ export function DataEntityCreate({ params }) { const [error, setError] = useState(null); useBrowserTitle(["Data", entity.label, "Create"]); - const container = useEntity(entity.name); + const $q = useEntityMutate(entity.name); + // @todo: use entity schema for prefilling const search = useSearch(Type.Object({}), {}); - console.log("search", search.value); - function goBack(state?: Record) { + function goBack() { window.history.go(-1); } async function onSubmitted(changeSet?: EntityData) { console.log("create:changeSet", changeSet); - //return; - const res = await container.actions.create(changeSet); - console.log("create:res", res); - if (res.data?.error) { - setError(res.data.error); - } else { - error && setError(null); + if (!changeSet) return; + + try { + await $q.create(changeSet); + if (error) setError(null); // @todo: navigate to created? goBack(); + } catch (e) { + setError(e instanceof Error ? e.message : "Failed to create"); } } - const { Form, handleSubmit, values } = useEntityForm({ + const { Form, handleSubmit } = useEntityForm({ action: "create", entity, initialData: search.value, onSubmitted }); - const fieldsDisabled = - container.raw.fetch?.isLoading || - container.status.fetch.isUpdating || - Form.state.isSubmitting; + const fieldsDisabled = $q.isLoading || $q.isValidating || Form.state.isSubmitting; return ( <> diff --git a/app/src/ui/routes/data/data.$entity.index.tsx b/app/src/ui/routes/data/data.$entity.index.tsx index 13b81b3..831e5ff 100644 --- a/app/src/ui/routes/data/data.$entity.index.tsx +++ b/app/src/ui/routes/data/data.$entity.index.tsx @@ -1,12 +1,12 @@ import { Type } from "core/utils"; import { querySchema } from "data"; import { TbDots } from "react-icons/tb"; +import { useApiQuery } from "ui/client"; import { useBkndData } from "ui/client/schema/data/use-bknd-data"; import { Button } from "ui/components/buttons/Button"; import { IconButton } from "ui/components/buttons/IconButton"; import { Message } from "ui/components/display/Message"; import { Dropdown } from "ui/components/overlay/Dropdown"; -import { EntitiesContainer } from "ui/container"; import { useBrowserTitle } from "ui/hooks/use-browser-title"; import { useSearch } from "ui/hooks/use-search"; import * as AppShell from "ui/layouts/AppShell/AppShell"; @@ -25,19 +25,33 @@ const searchSchema = Type.Composite( { additionalProperties: false } ); +const PER_PAGE_OPTIONS = [5, 10, 25]; + export function DataEntityList({ params }) { - const { $data, relations } = useBkndData(); - const entity = $data.entity(params.entity as string); + const { $data } = useBkndData(); + const entity = $data.entity(params.entity as string)!; + useBrowserTitle(["Data", entity?.label ?? params.entity]); const [navigate] = useNavigate(); const search = useSearch(searchSchema, { select: entity?.getSelect(undefined, "table") ?? [], sort: entity?.getDefaultSort() }); - console.log("search", search.value); - useBrowserTitle(["Data", entity?.label ?? params.entity]); - const PER_PAGE_OPTIONS = [5, 10, 25]; - //console.log("search", search.value); + const $q = useApiQuery( + (api) => + api.data.readMany(entity.name, { + select: search.value.select, + limit: search.value.perPage, + offset: (search.value.page - 1) * search.value.perPage, + sort: search.value.sort + }), + { + revalidateOnFocus: true, + keepPreviousData: true + } + ); + const data = $q.data?.data; + const meta = $q.data?.body.meta; function handleClickRow(row: Record) { if (entity) navigate(routes.data.entity.edit(entity.name, row.id)); @@ -65,6 +79,8 @@ export function DataEntityList({ params }) { return ; } + const isUpdating = $q.isLoading && $q.isValidating; + return ( <>
*/} - - {(params) => { - if (params.status.fetch.isLoading) { - return null; - } - - const isUpdating = params.status.fetch.isUpdating; - - return ( -
- -
- ); - }} -
+ +
From 1631bbb7544ca452385e0e5c2fb6111cb2b9f757 Mon Sep 17 00:00:00 2001 From: dswbx Date: Fri, 13 Dec 2024 17:36:09 +0100 Subject: [PATCH 5/6] replaced all react-query usages with new hooks + removed react-query --- app/package.json | 2 - app/src/Api.ts | 35 ++- app/src/ui/client/BkndProvider.tsx | 15 +- app/src/ui/client/ClientProvider.tsx | 53 ++--- app/src/ui/client/api/use-api.ts | 21 +- app/src/ui/client/api/use-entity.ts | 1 + app/src/ui/client/index.ts | 2 +- app/src/ui/client/schema/actions.ts | 8 +- app/src/ui/client/schema/auth/use-auth.ts | 65 +++--- .../ui/client/schema/auth/use-bknd-auth.ts | 3 +- app/src/ui/client/schema/flows/use-flows.ts | 2 - app/src/ui/client/utils/AppQueryClient.ts | 216 ------------------ app/src/ui/container/EntitiesContainer.tsx | 95 -------- app/src/ui/container/EntityContainer.tsx | 136 ----------- app/src/ui/container/index.ts | 2 - app/src/ui/index.ts | 10 - .../ui/modules/data/components/EntityForm.tsx | 19 +- .../fields/EntityRelationalFormField.tsx | 6 +- app/src/ui/routes/auth/auth.index.tsx | 16 +- app/src/ui/routes/data/data.$entity.$id.tsx | 25 +- .../ui/routes/data/data.$entity.create.tsx | 4 +- app/src/ui/routes/media/_media.root.tsx | 41 ++-- app/src/ui/routes/root.tsx | 15 +- 23 files changed, 148 insertions(+), 644 deletions(-) delete mode 100644 app/src/ui/client/utils/AppQueryClient.ts delete mode 100644 app/src/ui/container/EntitiesContainer.tsx delete mode 100644 app/src/ui/container/EntityContainer.tsx delete mode 100644 app/src/ui/container/index.ts diff --git a/app/package.json b/app/package.json index 46054e4..34a5e12 100644 --- a/app/package.json +++ b/app/package.json @@ -55,8 +55,6 @@ "@radix-ui/react-scroll-area": "^1.2.0", "@rjsf/core": "^5.22.2", "@tabler/icons-react": "3.18.0", - "@tanstack/react-query": "^5.59.16", - "@tanstack/react-query-devtools": "^5.59.16", "@types/node": "^22.10.0", "@types/react": "^18.3.12", "@types/react-dom": "^18.3.1", diff --git a/app/src/Api.ts b/app/src/Api.ts index d94aff9..5196622 100644 --- a/app/src/Api.ts +++ b/app/src/Api.ts @@ -1,3 +1,4 @@ +import type { SafeUser } from "auth"; import { AuthApi } from "auth/api/AuthApi"; import { DataApi } from "data/api/DataApi"; import { decode } from "hono/jwt"; @@ -5,7 +6,7 @@ import { omit } from "lodash-es"; import { MediaApi } from "media/api/MediaApi"; import { SystemApi } from "modules/SystemApi"; -export type TApiUser = object; +export type TApiUser = SafeUser; declare global { interface Window { @@ -24,6 +25,12 @@ export type ApiOptions = { localStorage?: boolean; }; +export type AuthState = { + token?: string; + user?: TApiUser; + verified: boolean; +}; + export class Api { private token?: string; private user?: TApiUser; @@ -50,6 +57,10 @@ export class Api { this.buildApis(); } + get baseUrl() { + return this.options.host; + } + get tokenKey() { return this.options.key ?? "auth"; } @@ -85,7 +96,11 @@ export class Api { updateToken(token?: string, rebuild?: boolean) { this.token = token; - this.user = token ? omit(decode(token).payload as any, ["iat", "iss", "exp"]) : undefined; + if (token) { + this.user = omit(decode(token).payload as any, ["iat", "iss", "exp"]) as any; + } else { + this.user = undefined; + } if (this.options.localStorage) { const key = this.tokenKey; @@ -105,7 +120,7 @@ export class Api { return this; } - getAuthState() { + getAuthState(): AuthState { return { token: this.token, user: this.user, @@ -113,6 +128,20 @@ export class Api { }; } + async verifyAuth() { + try { + const res = await this.auth.me(); + if (!res.ok || !res.body.user) { + throw new Error(); + } + + this.markAuthVerified(true); + } catch (e) { + this.markAuthVerified(false); + this.updateToken(undefined); + } + } + getUser(): TApiUser | null { return this.user || null; } diff --git a/app/src/ui/client/BkndProvider.tsx b/app/src/ui/client/BkndProvider.tsx index 3b26d26..4f5293f 100644 --- a/app/src/ui/client/BkndProvider.tsx +++ b/app/src/ui/client/BkndProvider.tsx @@ -1,12 +1,7 @@ +import type { ModuleConfigs, ModuleSchemas } from "modules"; import { getDefaultConfig, getDefaultSchema } from "modules/ModuleManager"; import { createContext, startTransition, useContext, useEffect, useRef, useState } from "react"; -import { Logo } from "ui/components/display/Logo"; -import { Link } from "ui/components/wouter/Link"; -import * as AppShell from "ui/layouts/AppShell/AppShell"; -import { HeaderNavigation } from "ui/layouts/AppShell/Header"; -import { Root } from "ui/routes/root"; -import type { ModuleConfigs, ModuleSchemas } from "../../modules"; -import { useClient } from "./ClientProvider"; +import { useApi } from "ui/client"; import { type TSchemaActions, getSchemaActions } from "./schema/actions"; import { AppReduced } from "./utils/AppReduced"; @@ -38,7 +33,7 @@ export function BkndProvider({ useState>(); const [fetched, setFetched] = useState(false); const errorShown = useRef(); - const client = useClient(); + const api = useApi(); async function reloadSchema() { await fetchSchema(includeSecrets, true); @@ -46,7 +41,7 @@ export function BkndProvider({ async function fetchSchema(_includeSecrets: boolean = false, force?: boolean) { if (withSecrets && !force) return; - const res = await client.api.system.readSchema({ + const res = await api.system.readSchema({ config: true, secrets: _includeSecrets }); @@ -100,7 +95,7 @@ export function BkndProvider({ if (!fetched || !schema) return fallback; const app = new AppReduced(schema?.config as any); - const actions = getSchemaActions({ client, setSchema, reloadSchema }); + const actions = getSchemaActions({ api, setSchema, reloadSchema }); return ( diff --git a/app/src/ui/client/ClientProvider.tsx b/app/src/ui/client/ClientProvider.tsx index 1101b21..6e13bfb 100644 --- a/app/src/ui/client/ClientProvider.tsx +++ b/app/src/ui/client/ClientProvider.tsx @@ -1,22 +1,10 @@ -import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; -import type { TApiUser } from "Api"; +import { Api, type ApiOptions, type TApiUser } from "Api"; import { createContext, useContext, useEffect, useState } from "react"; -//import { useBkndWindowContext } from "ui/client/BkndProvider"; -import { AppQueryClient } from "./utils/AppQueryClient"; -const ClientContext = createContext<{ baseUrl: string; client: AppQueryClient }>({ +const ClientContext = createContext<{ baseUrl: string; api: Api }>({ baseUrl: undefined } as any); -export const queryClient = new QueryClient({ - defaultOptions: { - queries: { - retry: false, - refetchOnWindowFocus: false - } - } -}); - export type ClientProviderProps = { children?: any; baseUrl?: string; @@ -49,47 +37,34 @@ export const ClientProvider = ({ children, baseUrl, user }: ClientProviderProps) return null; // or a loader/spinner if desired } - //console.log("client provider11 with", { baseUrl, fallback: actualBaseUrl, user }); - const client = createClient(actualBaseUrl, user ?? winCtx.user); + const api = new Api({ host: actualBaseUrl, user: user ?? winCtx.user }); return ( - - - {children} - - + + {children} + ); }; -export function createClient(baseUrl: string, user?: object) { - return new AppQueryClient(baseUrl, user); -} - -export function createOrUseClient(baseUrl: string) { +export const useApi = (host?: ApiOptions["host"]) => { const context = useContext(ClientContext); - if (!context) { - console.warn("createOrUseClient returned a new client"); - return createClient(baseUrl); + if (host && host !== context.baseUrl) { + return new Api({ host }); } - return context.client; -} - -export const useClient = () => { - const context = useContext(ClientContext); - if (!context) { - throw new Error("useClient must be used within a ClientProvider"); - } - return context.client; + return context.api; }; +/** + * @deprecated use useApi().baseUrl instead + */ export const useBaseUrl = () => { const context = useContext(ClientContext); return context.baseUrl; }; type BkndWindowContext = { - user?: object; + user?: TApiUser; logout_route: string; }; export function useBkndWindowContext(): BkndWindowContext { diff --git a/app/src/ui/client/api/use-api.ts b/app/src/ui/client/api/use-api.ts index 754ef7d..6d75f82 100644 --- a/app/src/ui/client/api/use-api.ts +++ b/app/src/ui/client/api/use-api.ts @@ -1,12 +1,7 @@ import type { Api } from "Api"; import type { FetchPromise, ResponseObject } from "modules/ModuleApi"; -import useSWR, { type SWRConfiguration } from "swr"; -import { useClient } from "ui/client/ClientProvider"; - -export const useApi = () => { - const client = useClient(); - return client.api; -}; +import useSWR, { type SWRConfiguration, useSWRConfig } from "swr"; +import { useApi } from "ui/client"; export const useApiQuery = < Data, @@ -21,7 +16,7 @@ export const useApiQuery = < const fetcher = () => promise.execute().then(refine); const key = promise.key(); - type RefinedData = RefineFn extends (data: Data) => infer R ? R : Data; + type RefinedData = RefineFn extends (data: ResponseObject) => infer R ? R : Data; const swr = useSWR(options?.enabled === false ? null : key, fetcher, options); return { @@ -31,3 +26,13 @@ export const useApiQuery = < api }; }; + +export const useInvalidate = () => { + const mutate = useSWRConfig().mutate; + const api = useApi(); + + return async (arg?: string | ((api: Api) => FetchPromise)) => { + if (!arg) return async () => mutate(""); + return mutate(typeof arg === "string" ? arg : arg(api).key()); + }; +}; diff --git a/app/src/ui/client/api/use-entity.ts b/app/src/ui/client/api/use-entity.ts index 4482c12..23be395 100644 --- a/app/src/ui/client/api/use-entity.ts +++ b/app/src/ui/client/api/use-entity.ts @@ -100,6 +100,7 @@ export const useEntityQuery = < return { ...swr, ...mapped, + api, key }; }; diff --git a/app/src/ui/client/index.ts b/app/src/ui/client/index.ts index 9bbdd65..792f884 100644 --- a/app/src/ui/client/index.ts +++ b/app/src/ui/client/index.ts @@ -2,7 +2,7 @@ export { ClientProvider, useBkndWindowContext, type ClientProviderProps, - useClient, + useApi, useBaseUrl } from "./ClientProvider"; diff --git a/app/src/ui/client/schema/actions.ts b/app/src/ui/client/schema/actions.ts index 9bed2c4..cebc137 100644 --- a/app/src/ui/client/schema/actions.ts +++ b/app/src/ui/client/schema/actions.ts @@ -1,21 +1,19 @@ import { type NotificationData, notifications } from "@mantine/notifications"; +import type { Api } from "Api"; import { ucFirst } from "core/utils"; import type { ModuleConfigs } from "modules"; import type { ResponseObject } from "modules/ModuleApi"; import type { ConfigUpdateResponse } from "modules/server/SystemController"; -import type { AppQueryClient } from "../utils/AppQueryClient"; export type SchemaActionsProps = { - client: AppQueryClient; + api: Api; setSchema: React.Dispatch>; reloadSchema: () => Promise; }; export type TSchemaActions = ReturnType; -export function getSchemaActions({ client, setSchema, reloadSchema }: SchemaActionsProps) { - const api = client.api; - +export function getSchemaActions({ api, setSchema, reloadSchema }: SchemaActionsProps) { async function handleConfigUpdate( action: string, module: Module, diff --git a/app/src/ui/client/schema/auth/use-auth.ts b/app/src/ui/client/schema/auth/use-auth.ts index 405e140..fd2ec84 100644 --- a/app/src/ui/client/schema/auth/use-auth.ts +++ b/app/src/ui/client/schema/auth/use-auth.ts @@ -1,15 +1,8 @@ -import { Api } from "Api"; +import { Api, type AuthState } from "Api"; import type { AuthResponse } from "auth"; import type { AppAuthSchema } from "auth/auth-schema"; -import type { ApiResponse } from "modules/ModuleApi"; import { useEffect, useState } from "react"; -import { - createClient, - createOrUseClient, - queryClient, - useBaseUrl, - useClient -} from "../../ClientProvider"; +import { useApi, useInvalidate } from "ui/client"; type LoginData = { email: string; @@ -18,55 +11,54 @@ type LoginData = { }; type UseAuth = { - data: (AuthResponse & { verified: boolean }) | undefined; - user: AuthResponse["user"] | undefined; - token: AuthResponse["token"] | undefined; + data: AuthState | undefined; + user: AuthState["user"] | undefined; + token: AuthState["token"] | undefined; verified: boolean; - login: (data: LoginData) => Promise>; - register: (data: LoginData) => Promise>; + login: (data: LoginData) => Promise; + register: (data: LoginData) => Promise; logout: () => void; verify: () => void; setToken: (token: string) => void; }; -// @todo: needs to use a specific auth endpoint to get strategy information export const useAuth = (options?: { baseUrl?: string }): UseAuth => { - const ctxBaseUrl = useBaseUrl(); - //const client = useClient(); - const client = createOrUseClient(options?.baseUrl ? options?.baseUrl : ctxBaseUrl); - const authState = client.auth().state(); + const api = useApi(options?.baseUrl); + const invalidate = useInvalidate(); + const authState = api.getAuthState(); const [authData, setAuthData] = useState(authState); const verified = authState?.verified ?? false; + function updateAuthState() { + setAuthData(api.getAuthState()); + } + async function login(input: LoginData) { - const res = await client.auth().login(input); - if (res.res.ok && res.data && "user" in res.data) { - setAuthData(res.data); - } - return res; + const res = await api.auth.loginWithPassword(input); + updateAuthState(); + return res.data; } async function register(input: LoginData) { - const res = await client.auth().register(input); - if (res.res.ok && res.data && "user" in res.data) { - setAuthData(res.data); - } - return res; + const res = await api.auth.registerWithPassword(input); + updateAuthState(); + return res.data; } function setToken(token: string) { - setAuthData(client.auth().setToken(token) as any); + api.updateToken(token); + updateAuthState(); } async function logout() { - await client.auth().logout(); + await api.updateToken(undefined); setAuthData(undefined); - queryClient.clear(); + invalidate(); } async function verify() { - await client.auth().verify(); - setAuthData(client.auth().state()); + await api.verifyAuth(); + updateAuthState(); } return { @@ -87,10 +79,7 @@ export const useAuthStrategies = (options?: { baseUrl?: string }): Partial { const [data, setData] = useState(); - const ctxBaseUrl = useBaseUrl(); - const api = new Api({ - host: options?.baseUrl ? options?.baseUrl : ctxBaseUrl - }); + const api = useApi(options?.baseUrl); useEffect(() => { (async () => { diff --git a/app/src/ui/client/schema/auth/use-bknd-auth.ts b/app/src/ui/client/schema/auth/use-bknd-auth.ts index 26b8720..a3bb003 100644 --- a/app/src/ui/client/schema/auth/use-bknd-auth.ts +++ b/app/src/ui/client/schema/auth/use-bknd-auth.ts @@ -1,8 +1,7 @@ import { useBknd } from "ui/client/bknd"; export function useBkndAuth() { - //const client = useClient(); - const { config, app, schema, actions: bkndActions } = useBknd(); + const { config, schema, actions: bkndActions } = useBknd(); const actions = { roles: { diff --git a/app/src/ui/client/schema/flows/use-flows.ts b/app/src/ui/client/schema/flows/use-flows.ts index cdaa220..554a028 100644 --- a/app/src/ui/client/schema/flows/use-flows.ts +++ b/app/src/ui/client/schema/flows/use-flows.ts @@ -1,10 +1,8 @@ import { type Static, parse } from "core/utils"; import { type TAppFlowSchema, flowSchema } from "flows/flows-schema"; import { useBknd } from "../../BkndProvider"; -import { useClient } from "../../ClientProvider"; export function useFlows() { - const client = useClient(); const { config, app, actions: bkndActions } = useBknd(); const actions = { diff --git a/app/src/ui/client/utils/AppQueryClient.ts b/app/src/ui/client/utils/AppQueryClient.ts deleted file mode 100644 index 239bd93..0000000 --- a/app/src/ui/client/utils/AppQueryClient.ts +++ /dev/null @@ -1,216 +0,0 @@ -import { - type QueryObserverOptions, - type UseQueryResult, - keepPreviousData, - useMutation, - useQuery -} from "@tanstack/react-query"; -import type { AuthResponse } from "auth"; -import type { EntityData, RepoQuery, RepositoryResponse } from "data"; -import { Api } from "../../../Api"; -import type { ApiResponse } from "../../../modules/ModuleApi"; -import { queryClient } from "../ClientProvider"; - -export class AppQueryClient { - api: Api; - constructor( - public baseUrl: string, - user?: object - ) { - this.api = new Api({ - host: baseUrl, - user - }); - } - - queryOptions(options?: Partial): Partial { - return { - staleTime: 1000 * 60 * 5, - placeholderData: keepPreviousData, - ...options - }; - } - - auth = () => { - return { - state: (): (AuthResponse & { verified: boolean }) | undefined => { - return this.api.getAuthState() as any; - }, - login: async (data: { email: string; password: string }) => { - return await this.api.auth.loginWithPassword(data); - }, - register: async (data: any) => { - return await this.api.auth.registerWithPassword(data); - }, - logout: async () => { - this.api.updateToken(undefined); - return true; - }, - setToken: (token) => { - this.api.updateToken(token); - return this.api.getAuthState(); - }, - verify: async () => { - try { - //console.log("verifiying"); - const res = await this.api.auth.me(); - //console.log("verifying result", res); - if (!res.ok || !res.body.user) { - throw new Error(); - } - - this.api.markAuthVerified(true); - } catch (e) { - this.api.markAuthVerified(false); - this.api.updateToken(undefined); - } - } - }; - }; - - media = (options?: Partial) => { - const queryOptions = this.queryOptions(options); - return { - api: () => { - return this.api.media; - }, - list: (query: Partial = { limit: 10 }): UseQueryResult => { - return useQuery({ - ...(queryOptions as any), // @todo: fix typing - queryKey: ["data", "entity", "media", { query }], - queryFn: async () => { - return await this.api.data.readMany("media", query); - } - }); - }, - deleteFile: async (filename: string | { path: string }) => { - const res = await this.api.media.deleteFile( - typeof filename === "string" ? filename : filename.path - ); - - if (res.ok) { - queryClient.invalidateQueries({ queryKey: ["data", "entity", "media"] }); - return true; - } - - return false; - } - }; - }; - - query = (options?: Partial) => { - const queryOptions = this.queryOptions(options); - return { - data: { - entity: (name: string) => { - return { - readOne: ( - id: number, - query: Partial> = {} - ): any => { - return useQuery({ - ...queryOptions, - queryKey: ["data", "entity", name, id, { query }], - queryFn: async () => { - return await this.api.data.readOne(name, id, query); - } - }); - }, - readMany: ( - query: Partial = { limit: 10, offset: 0 } - ): UseQueryResult => { - return useQuery({ - ...(queryOptions as any), // @todo: fix typing - queryKey: ["data", "entity", name, { query }], - queryFn: async () => { - return await this.api.data.readMany(name, query); - } - }); - }, - readManyByReference: ( - id: number, - reference: string, - referenced_entity?: string, // required for query invalidation - query: Partial = { limit: 10, offset: 0 } - ): UseQueryResult> => { - return useQuery({ - ...(queryOptions as any), // @todo: fix typing - queryKey: [ - "data", - "entity", - referenced_entity ?? reference, - { name, id, reference, query } - ], - queryFn: async () => { - return await this.api.data.readManyByReference( - name, - id, - reference, - query - ); - } - }); - }, - count: ( - where: RepoQuery["where"] = {} - ): UseQueryResult> => { - return useQuery({ - ...(queryOptions as any), // @todo: fix typing - queryKey: ["data", "entity", name, "fn", "count", { where }], - queryFn: async () => { - return await this.api.data.count(name, where); - } - }); - } - }; - } - } - }; - }; - - // @todo: centralize, improve - __invalidate = (...args: any[]) => { - console.log("___invalidate", ["data", "entity", ...args]); - queryClient.invalidateQueries({ queryKey: ["data", "entity", ...args] }); - }; - - // @todo: must return response... why? - mutation = { - data: { - entity: (name: string) => { - return { - update: (id: number): any => { - return useMutation({ - mutationFn: async (input: EntityData) => { - return await this.api.data.updateOne(name, id, input); - }, - onSuccess: async () => { - await queryClient.invalidateQueries({ queryKey: ["data", "entity", name] }); - } - }); - }, - create: (): any => { - return useMutation({ - mutationFn: async (input: EntityData) => { - return await this.api.data.createOne(name, input); - }, - onSuccess: () => { - queryClient.invalidateQueries({ queryKey: ["data", "entity", name] }); - } - }); - }, - delete: (id: number): any => { - return useMutation({ - mutationFn: async () => { - return await this.api.data.deleteOne(name, id); - }, - onSuccess: () => { - queryClient.invalidateQueries({ queryKey: ["data", "entity", name] }); - } - }); - } - }; - } - } - }; -} diff --git a/app/src/ui/container/EntitiesContainer.tsx b/app/src/ui/container/EntitiesContainer.tsx deleted file mode 100644 index 3814c10..0000000 --- a/app/src/ui/container/EntitiesContainer.tsx +++ /dev/null @@ -1,95 +0,0 @@ -import type { UseQueryOptions, UseQueryResult } from "@tanstack/react-query"; -import type { RepositoryResponse } from "data"; -import type { RepoQuery } from "data"; -import { useClient } from "../client"; -import { type EntityData, type QueryStatus, getStatus } from "./EntityContainer"; - -export type RenderParams = { - data: Data[] | undefined; - meta: RepositoryResponse["meta"] | undefined; - status: { - fetch: QueryStatus; - }; - raw: { - fetch: UseQueryResult; - }; - actions: { - create(obj: any): any; - update(id: number, obj: any): any; - }; -}; - -export type EntitiesContainerProps = { - entity: string; - query?: Partial; - queryOptions?: Partial; -}; - -export function useEntities( - entity: string, - query?: Partial, - queryOptions?: Partial -): RenderParams { - const client = useClient(); - let data: any = null; - let meta: any = null; - - const fetchQuery = client.query(queryOptions).data.entity(entity).readMany(query); - const createMutation = client.mutation.data.entity(entity).create(); - const updateMutation = (id: number) => client.mutation.data.entity(entity).update(id); - - if (fetchQuery?.isSuccess) { - meta = fetchQuery.data?.body.meta; - data = fetchQuery.data?.body.data; - } - - function create(obj: any) { - // biome-ignore lint/suspicious/noAsyncPromiseExecutor: - return new Promise(async (resolve, reject) => { - await createMutation?.mutate(obj, { - onSuccess: resolve, - onError: reject - }); - }); - } - - function update(id: number, obj: any) { - // biome-ignore lint/suspicious/noAsyncPromiseExecutor: - return new Promise(async (resolve, reject) => { - await updateMutation(id).mutate(obj, { - onSuccess: resolve, - onError: reject - }); - }); - } - - return { - data, - meta, - actions: { - create, - update - // remove - }, - status: { - fetch: getStatus(fetchQuery) - }, - raw: { - fetch: fetchQuery - } - }; -} - -export function EntitiesContainer({ - entity, - query, - queryOptions, - children -}: EntitiesContainerProps & { - children(params: RenderParams): any; -}) { - const params = useEntities(entity, query, queryOptions); - return children(params as any); -} - -export const Entities = EntitiesContainer; diff --git a/app/src/ui/container/EntityContainer.tsx b/app/src/ui/container/EntityContainer.tsx deleted file mode 100644 index da27a71..0000000 --- a/app/src/ui/container/EntityContainer.tsx +++ /dev/null @@ -1,136 +0,0 @@ -import type { UseQueryResult } from "@tanstack/react-query"; -import type { RepoQuery } from "data"; -import { useClient } from "../client"; - -export type EntityData = Record; - -export type EntityContainerRenderParams = { - data: Data | null; - client: ReturnType; - initialValues: object; - raw: { - fetch?: UseQueryResult; - }; - status: { - fetch: QueryStatus; - }; - actions: { - create(obj: any): any; - update(obj: any): any; - remove(): any; - }; -}; - -export type MutationStatus = { - isLoading: boolean; - isSuccess: boolean; - isError: boolean; -}; - -export type QueryStatus = MutationStatus & { - isUpdating: boolean; -}; - -export function getStatus(query?: UseQueryResult): QueryStatus { - return { - isLoading: query ? query.isPending : false, - isUpdating: query ? !query.isInitialLoading && query.isFetching : false, - isSuccess: query ? query.isSuccess : false, - isError: query ? query.isError : false - }; -} - -export type EntityContainerProps = { - entity: string; - id?: number; -}; - -type FetchOptions = { - disabled?: boolean; - query?: Partial>; -}; - -// @todo: add option to disable fetches (for form updates) -// @todo: must return a way to indicate error! -export function useEntity( - entity: string, - id?: number, - options?: { fetch?: FetchOptions } -): EntityContainerRenderParams { - const client = useClient(); - let data: any = null; - - const fetchQuery = id - ? client.query().data.entity(entity).readOne(id, options?.fetch?.query) - : undefined; - const createMutation = id ? null : client.mutation.data.entity(entity).create(); - const updateMutation = id ? client.mutation.data.entity(entity).update(id) : undefined; - const deleteMutation = id ? client.mutation.data.entity(entity).delete(id) : undefined; - - if (fetchQuery?.isSuccess) { - data = fetchQuery.data?.body.data; - } - - const initialValues = { one: 1 }; - - function create(obj: any) { - // biome-ignore lint/suspicious/noAsyncPromiseExecutor: - return new Promise(async (resolve, reject) => { - await createMutation?.mutate(obj, { - onSuccess: resolve, - onError: reject - }); - }); - } - - function update(obj: any) { - // biome-ignore lint/suspicious/noAsyncPromiseExecutor: - return new Promise(async (resolve, reject) => { - //await new Promise((r) => setTimeout(r, 4000)); - await updateMutation?.mutate(obj, { - onSuccess: resolve, - onError: reject - }); - }); - } - - function remove() { - // biome-ignore lint/suspicious/noAsyncPromiseExecutor: - return new Promise(async (resolve, reject) => { - //await new Promise((r) => setTimeout(r, 4000)); - await deleteMutation?.mutate(undefined, { - onSuccess: resolve, - onError: reject - }); - }); - } - - return { - data, - client, - initialValues, - actions: { - create, - update, - remove - }, - status: { - fetch: getStatus(fetchQuery) - //update: getMutationStatus(updateMutation), - }, - raw: { - fetch: fetchQuery - } - }; -} - -export function EntityContainer({ - entity, - id, - children -}: EntityContainerProps & { children(params: EntityContainerRenderParams): any }) { - const params = useEntity(entity, id); - return children(params); -} - -export const Entity = EntityContainer; diff --git a/app/src/ui/container/index.ts b/app/src/ui/container/index.ts deleted file mode 100644 index a427a24..0000000 --- a/app/src/ui/container/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./EntitiesContainer"; -export * from "./EntityContainer"; diff --git a/app/src/ui/index.ts b/app/src/ui/index.ts index 7b3c676..92a9c97 100644 --- a/app/src/ui/index.ts +++ b/app/src/ui/index.ts @@ -1,11 +1 @@ export { default as Admin, type BkndAdminProps } from "./Admin"; -export { - EntitiesContainer, - useEntities, - type EntitiesContainerProps -} from "./container/EntitiesContainer"; -export { - EntityContainer, - useEntity, - type EntityContainerProps -} from "./container/EntityContainer"; diff --git a/app/src/ui/modules/data/components/EntityForm.tsx b/app/src/ui/modules/data/components/EntityForm.tsx index 40147b0..131bd61 100644 --- a/app/src/ui/modules/data/components/EntityForm.tsx +++ b/app/src/ui/modules/data/components/EntityForm.tsx @@ -10,7 +10,7 @@ import { } from "data"; import { MediaField } from "media/MediaField"; import { type ComponentProps, Suspense } from "react"; -import { useClient } from "ui/client"; +import { useApi, useBaseUrl, useInvalidate } from "ui/client"; import { JsonEditor } from "ui/components/code/JsonEditor"; import * as Formy from "ui/components/form/Formy"; import { FieldLabel } from "ui/components/form/Formy"; @@ -215,7 +215,9 @@ function EntityMediaFormField({ }) { if (!entityId) return; - const client = useClient(); + const api = useApi(); + const baseUrl = useBaseUrl(); + const invalidate = useInvalidate(); const value = formApi.useStore((state) => { const val = state.values[field.name]; if (!val || typeof val === "undefined") return []; @@ -227,22 +229,21 @@ function EntityMediaFormField({ value.length === 0 ? [] : mediaItemsToFileStates(value, { - baseUrl: client.baseUrl, + baseUrl: api.baseUrl, overrides: { state: "uploaded" } }); const getUploadInfo = useEvent(() => { - const api = client.media().api(); return { - url: api.getEntityUploadUrl(entity.name, entityId, field.name), - headers: api.getUploadHeaders(), + url: api.media.getEntityUploadUrl(entity.name, entityId, field.name), + headers: api.media.getUploadHeaders(), method: "POST" }; }); - const handleDelete = useEvent(async (file) => { - client.__invalidate(entity.name, entityId); - return await client.media().deleteFile(file); + const handleDelete = useEvent(async (file: FileState) => { + invalidate((api) => api.data.readOne(entity.name, entityId)); + return api.media.deleteFile(file.path); }); return ( diff --git a/app/src/ui/modules/data/components/fields/EntityRelationalFormField.tsx b/app/src/ui/modules/data/components/fields/EntityRelationalFormField.tsx index cb8c16e..861bc24 100644 --- a/app/src/ui/modules/data/components/fields/EntityRelationalFormField.tsx +++ b/app/src/ui/modules/data/components/fields/EntityRelationalFormField.tsx @@ -4,12 +4,11 @@ import { ucFirst } from "core/utils"; import type { EntityData, RelationField } from "data"; import { useEffect, useRef, useState } from "react"; import { TbEye } from "react-icons/tb"; -import { useClient, useEntityQuery } from "ui/client"; +import { useEntityQuery } from "ui/client"; import { useBknd } from "ui/client/bknd"; import { Button } from "ui/components/buttons/Button"; import * as Formy from "ui/components/form/Formy"; import { Popover } from "ui/components/overlay/Popover"; -import { useEntities } from "ui/container"; import { routes } from "ui/lib/routes"; import { useLocation } from "wouter"; import { EntityTable } from "../EntityTable"; @@ -33,7 +32,6 @@ export function EntityRelationalFormField({ const [query, setQuery] = useState({ limit: 10, page: 1, perPage: 10 }); const [, navigate] = useLocation(); const ref = useRef(null); - const client = useClient(); const $q = useEntityQuery(field.target(), undefined, { limit: query.limit, offset: (query.page - 1) * query.limit @@ -53,7 +51,7 @@ export function EntityRelationalFormField({ const rel_value = field.target(); if (!rel_value || !relationalField) return; - const fetched = await client.api.data.readOne(field.target(), relationalField); + const fetched = await $q.api.readOne(field.target(), relationalField); if (fetched.ok && fetched.data) { _setValue(fetched.data as any); } diff --git a/app/src/ui/routes/auth/auth.index.tsx b/app/src/ui/routes/auth/auth.index.tsx index ae7b9f0..21eace5 100644 --- a/app/src/ui/routes/auth/auth.index.tsx +++ b/app/src/ui/routes/auth/auth.index.tsx @@ -1,25 +1,19 @@ -import { useClient } from "ui/client"; +import { useApiQuery } from "ui/client"; import { useBknd } from "ui/client/bknd"; import { useBkndAuth } from "ui/client/schema/auth/use-bknd-auth"; +import { ButtonLink, type ButtonLinkProps } from "ui/components/buttons/Button"; import { Alert } from "ui/components/display/Alert"; +import * as AppShell from "ui/layouts/AppShell/AppShell"; import { routes } from "ui/lib/routes"; -import { - Button, - ButtonLink, - type ButtonLinkProps, - type ButtonProps -} from "../../components/buttons/Button"; -import * as AppShell from "../../layouts/AppShell/AppShell"; export function AuthIndex() { - const client = useClient(); const { app } = useBknd(); const { config: { roles, strategies, entity_name, enabled } } = useBkndAuth(); const users_entity = entity_name; - const query = client.query().data.entity("users").count(); - const usersTotal = query.data?.body.count ?? 0; + const $q = useApiQuery((api) => api.data.count(users_entity)); + const usersTotal = $q.data?.count ?? 0; const rolesTotal = Object.keys(roles ?? {}).length ?? 0; const strategiesTotal = Object.keys(strategies ?? {}).length ?? 0; diff --git a/app/src/ui/routes/data/data.$entity.$id.tsx b/app/src/ui/routes/data/data.$entity.$id.tsx index 7b6fcf0..09cd38a 100644 --- a/app/src/ui/routes/data/data.$entity.$id.tsx +++ b/app/src/ui/routes/data/data.$entity.$id.tsx @@ -1,8 +1,8 @@ import { ucFirst } from "core/utils"; -import type { Entity, EntityData, EntityRelation } from "data"; +import type { Entity, EntityData, EntityRelation, RepoQuery } from "data"; import { Fragment, useState } from "react"; import { TbDots } from "react-icons/tb"; -import { useClient, useEntityQuery } from "ui/client"; +import { useApiQuery, useEntityQuery } from "ui/client"; import { useBkndData } from "ui/client/schema/data/use-bknd-data"; import { Button } from "ui/components/buttons/Button"; import { IconButton } from "ui/components/buttons/IconButton"; @@ -232,18 +232,17 @@ function EntityDetailInner({ relation: EntityRelation; }) { const other = relation.other(entity); - const client = useClient(); const [navigate] = useNavigate(); - const search = { + const search: Partial = { select: other.entity.getSelect(undefined, "table"), limit: 10, offset: 0 }; - const query = client - .query() - .data.entity(entity.name) - .readManyByReference(id, other.reference, other.entity.name, search); + // @todo: add custom key for invalidation + const $q = useApiQuery((api) => + api.data.readManyByReference(entity.name, id, other.reference, search) + ); function handleClickRow(row: Record) { navigate(routes.data.entity.edit(other.entity.name, row.id)); @@ -262,12 +261,11 @@ function EntityDetailInner({ } } - if (query.isPending) { + if (!$q.data) { return null; } - const isUpdating = query.isInitialLoading || query.isFetching; - //console.log("query", query, search.select); + const isUpdating = $q.isValidating || $q.isLoading; return (
diff --git a/app/src/ui/routes/data/data.$entity.create.tsx b/app/src/ui/routes/data/data.$entity.create.tsx index 3df30db..5b16b64 100644 --- a/app/src/ui/routes/data/data.$entity.create.tsx +++ b/app/src/ui/routes/data/data.$entity.create.tsx @@ -1,9 +1,9 @@ import { Type } from "core/utils"; +import type { EntityData } from "data"; import { useState } from "react"; -import { useEntityMutate, useEntityQuery } from "ui/client"; +import { useEntityMutate } from "ui/client"; import { useBknd } from "ui/client/BkndProvider"; import { Button } from "ui/components/buttons/Button"; -import { type EntityData, useEntity } from "ui/container"; import { useBrowserTitle } from "ui/hooks/use-browser-title"; import { useSearch } from "ui/hooks/use-search"; import * as AppShell from "ui/layouts/AppShell/AppShell"; diff --git a/app/src/ui/routes/media/_media.root.tsx b/app/src/ui/routes/media/_media.root.tsx index 2b23bb6..dcb70d8 100644 --- a/app/src/ui/routes/media/_media.root.tsx +++ b/app/src/ui/routes/media/_media.root.tsx @@ -1,16 +1,17 @@ import { IconPhoto } from "@tabler/icons-react"; +import type { MediaFieldSchema } from "modules"; import { TbSettings } from "react-icons/tb"; -import { Dropzone } from "ui/modules/media/components/dropzone/Dropzone"; +import { useApi, useBaseUrl, useEntityQuery } from "ui/client"; +import { useBknd } from "ui/client/BkndProvider"; +import { IconButton } from "ui/components/buttons/IconButton"; +import { Empty } from "ui/components/display/Empty"; +import { Link } from "ui/components/wouter/Link"; +import { useBrowserTitle } from "ui/hooks/use-browser-title"; +import { useEvent } from "ui/hooks/use-event"; +import * as AppShell from "ui/layouts/AppShell/AppShell"; +import { Dropzone, type FileState } from "ui/modules/media/components/dropzone/Dropzone"; import { mediaItemsToFileStates } from "ui/modules/media/helper"; import { useLocation } from "wouter"; -import { useClient } from "../../client"; -import { useBknd } from "../../client/BkndProvider"; -import { IconButton } from "../../components/buttons/IconButton"; -import { Empty } from "../../components/display/Empty"; -import { Link } from "../../components/wouter/Link"; -import { useBrowserTitle } from "../../hooks/use-browser-title"; -import { useEvent } from "../../hooks/use-event"; -import * as AppShell from "../../layouts/AppShell/AppShell"; export function MediaRoot({ children }) { const { app, config } = useBknd(); @@ -62,32 +63,30 @@ export function MediaRoot({ children }) { // @todo: add infinite load export function MediaEmpty() { useBrowserTitle(["Media"]); - const client = useClient(); - const query = client.media().list({ limit: 50 }); + const baseUrl = useBaseUrl(); + const api = useApi(); + const $q = useEntityQuery("media", undefined, { limit: 50 }); const getUploadInfo = useEvent((file) => { - const api = client.media().api(); return { - url: api.getFileUploadUrl(file), - headers: api.getUploadHeaders(), + url: api.media.getFileUploadUrl(file), + headers: api.media.getUploadHeaders(), method: "POST" }; }); - const handleDelete = useEvent(async (file) => { - return await client.media().deleteFile(file); + const handleDelete = useEvent(async (file: FileState) => { + return api.media.deleteFile(file.path); }); - const media = query.data?.data || []; - const initialItems = mediaItemsToFileStates(media, { baseUrl: client.baseUrl }); - - console.log("initialItems", initialItems); + const media = ($q.data || []) as MediaFieldSchema[]; + const initialItems = mediaItemsToFileStates(media, { baseUrl }); return (
null; /*!isDebug() - ? () => null // Render nothing in production - : lazy(() => - import("@tanstack/react-query-devtools").then((res) => ({ - default: res.ReactQueryDevtools, - })), - );*/ - export const Root = ({ children }) => { const { verify } = useAuth(); @@ -26,10 +17,6 @@ export const Root = ({ children }) => { {children} - - - - ); }; From c4138ef8238780ce8b063e5181b7c9d583d6d05b Mon Sep 17 00:00:00 2001 From: dswbx Date: Wed, 18 Dec 2024 08:41:11 +0100 Subject: [PATCH 6/6] updated plasmic package to work with new hooks + added example --- .gitignore | 1 + app/package.json | 2 +- app/src/modules/SystemApi.ts | 4 + app/src/ui/client/ClientProvider.tsx | 38 ++--- app/src/ui/lib/mantine/theme.ts | 2 +- bun.lockb | Bin 811840 -> 1084120 bytes examples/plasmic/.gitignore | 1 + examples/plasmic/next-env.d.ts | 5 + examples/plasmic/next.config.ts | 8 + examples/plasmic/package.json | 26 +++ examples/plasmic/postcss.config.mjs | 8 + .../plasmic/src/pages/[[...catchall]].tsx | 78 +++++++++ examples/plasmic/src/pages/_app.tsx | 11 ++ examples/plasmic/src/pages/_document.tsx | 13 ++ .../plasmic/src/pages/admin/[[...admin]].tsx | 25 +++ examples/plasmic/src/pages/api/[...route].ts | 16 ++ examples/plasmic/src/pages/plasmic-host.tsx | 7 + examples/plasmic/src/pages/test.tsx | 6 + examples/plasmic/src/plasmic-init.ts | 17 ++ examples/plasmic/src/styles/globals.css | 3 + examples/plasmic/tailwind.config.ts | 18 +++ examples/plasmic/tsconfig.json | 23 +++ packages/plasmic/components/WouterLink.tsx | 23 --- packages/plasmic/index.ts | 4 - packages/plasmic/loader.tsx | 109 ------------- packages/plasmic/package.json | 61 +++++--- .../plasmic/{ => src}/components/Image.tsx | 46 ++++-- .../{ => src}/components/LazyRender.tsx | 40 +++-- .../{ => src}/components/data/BkndData.tsx | 148 +++++++----------- .../plasmic/{ => src}/components/index.ts | 1 - .../{ => src}/contexts/BkndContext.tsx | 52 +++--- packages/plasmic/{ => src}/contexts/index.ts | 0 packages/plasmic/src/index.ts | 17 ++ packages/plasmic/tsconfig.json | 12 +- 34 files changed, 491 insertions(+), 334 deletions(-) create mode 100644 examples/plasmic/.gitignore create mode 100644 examples/plasmic/next-env.d.ts create mode 100644 examples/plasmic/next.config.ts create mode 100644 examples/plasmic/package.json create mode 100644 examples/plasmic/postcss.config.mjs create mode 100644 examples/plasmic/src/pages/[[...catchall]].tsx create mode 100644 examples/plasmic/src/pages/_app.tsx create mode 100644 examples/plasmic/src/pages/_document.tsx create mode 100644 examples/plasmic/src/pages/admin/[[...admin]].tsx create mode 100644 examples/plasmic/src/pages/api/[...route].ts create mode 100644 examples/plasmic/src/pages/plasmic-host.tsx create mode 100644 examples/plasmic/src/pages/test.tsx create mode 100644 examples/plasmic/src/plasmic-init.ts create mode 100644 examples/plasmic/src/styles/globals.css create mode 100644 examples/plasmic/tailwind.config.ts create mode 100644 examples/plasmic/tsconfig.json delete mode 100644 packages/plasmic/components/WouterLink.tsx delete mode 100644 packages/plasmic/index.ts delete mode 100644 packages/plasmic/loader.tsx rename packages/plasmic/{ => src}/components/Image.tsx (86%) rename packages/plasmic/{ => src}/components/LazyRender.tsx (73%) rename packages/plasmic/{ => src}/components/data/BkndData.tsx (67%) rename packages/plasmic/{ => src}/components/index.ts (73%) rename packages/plasmic/{ => src}/contexts/BkndContext.tsx (76%) rename packages/plasmic/{ => src}/contexts/index.ts (100%) create mode 100644 packages/plasmic/src/index.ts diff --git a/.gitignore b/.gitignore index 9727332..2232350 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,7 @@ packages/media/.env **/*/.env **/*/.dev.vars **/*/.wrangler +**/*/*.tgz **/*/vite.config.ts.timestamp* .history **/*/.db/* diff --git a/app/package.json b/app/package.json index 34a5e12..fb02b8e 100644 --- a/app/package.json +++ b/app/package.json @@ -3,7 +3,7 @@ "type": "module", "sideEffects": false, "bin": "./dist/cli/index.js", - "version": "0.3.3", + "version": "0.3.4-alpha1", "scripts": { "build:all": "bun run build && bun run build:cli", "dev": "vite", diff --git a/app/src/modules/SystemApi.ts b/app/src/modules/SystemApi.ts index 2451b78..3241141 100644 --- a/app/src/modules/SystemApi.ts +++ b/app/src/modules/SystemApi.ts @@ -16,6 +16,10 @@ export class SystemApi extends ModuleApi { }; } + readConfig() { + return this.get<{ version: number } & ModuleConfigs>("config"); + } + readSchema(options?: { config?: boolean; secrets?: boolean }) { return this.get("schema", { config: options?.config ? 1 : 0, diff --git a/app/src/ui/client/ClientProvider.tsx b/app/src/ui/client/ClientProvider.tsx index 6e13bfb..4fd6719 100644 --- a/app/src/ui/client/ClientProvider.tsx +++ b/app/src/ui/client/ClientProvider.tsx @@ -12,44 +12,38 @@ export type ClientProviderProps = { }; export const ClientProvider = ({ children, baseUrl, user }: ClientProviderProps) => { - const [actualBaseUrl, setActualBaseUrl] = useState(null); + //const [actualBaseUrl, setActualBaseUrl] = useState(null); const winCtx = useBkndWindowContext(); + const _ctx_baseUrl = useBaseUrl(); + let actualBaseUrl = baseUrl ?? _ctx_baseUrl ?? ""; try { - const _ctx_baseUrl = useBaseUrl(); - if (_ctx_baseUrl) { - console.warn("wrapped many times"); - setActualBaseUrl(_ctx_baseUrl); + if (!baseUrl) { + if (_ctx_baseUrl) { + actualBaseUrl = _ctx_baseUrl; + console.warn("wrapped many times, take from context", actualBaseUrl); + } else if (typeof window !== "undefined") { + actualBaseUrl = window.location.origin; + console.log("setting from window", actualBaseUrl); + } } } catch (e) { - console.error("error", e); - } - - useEffect(() => { - // Only set base URL if running on the client side - if (typeof window !== "undefined") { - setActualBaseUrl(baseUrl || window.location.origin); - } - }, [baseUrl]); - - if (!actualBaseUrl) { - // Optionally, return a fallback during SSR rendering - return null; // or a loader/spinner if desired + console.error("error .....", e); } const api = new Api({ host: actualBaseUrl, user: user ?? winCtx.user }); return ( - + {children} ); }; -export const useApi = (host?: ApiOptions["host"]) => { +export const useApi = (host?: ApiOptions["host"]): Api => { const context = useContext(ClientContext); - if (host && host !== context.baseUrl) { - return new Api({ host }); + if (!context?.api || (host && host.length > 0 && host !== context.baseUrl)) { + return new Api({ host: host ?? "" }); } return context.api; diff --git a/app/src/ui/lib/mantine/theme.ts b/app/src/ui/lib/mantine/theme.ts index 0dfe287..e880b9d 100644 --- a/app/src/ui/lib/mantine/theme.ts +++ b/app/src/ui/lib/mantine/theme.ts @@ -15,7 +15,7 @@ import { } from "@mantine/core"; import { twMerge } from "tailwind-merge"; -// default: https://github.com/mantinedev/mantine/blob/master/src/mantine-core/src/core/MantineProvider/default-theme.ts +// default: https://github.com/mantinedev/mantine/blob/master/packages/%40mantine/core/src/core/MantineProvider/default-theme.ts export function createMantineTheme(scheme: "light" | "dark"): { theme: ReturnType; diff --git a/bun.lockb b/bun.lockb index 8a89fbc6f95d69a892f7daccf28d28530f4845e4..26c68430654f936168f156103b2580d019f12d4e 100755 GIT binary patch delta 320091 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�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 diff --git a/examples/plasmic/.gitignore b/examples/plasmic/.gitignore new file mode 100644 index 0000000..d0d878e --- /dev/null +++ b/examples/plasmic/.gitignore @@ -0,0 +1 @@ +.next \ No newline at end of file diff --git a/examples/plasmic/next-env.d.ts b/examples/plasmic/next-env.d.ts new file mode 100644 index 0000000..a4a7b3f --- /dev/null +++ b/examples/plasmic/next-env.d.ts @@ -0,0 +1,5 @@ +/// +/// + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/pages/building-your-application/configuring/typescript for more information. diff --git a/examples/plasmic/next.config.ts b/examples/plasmic/next.config.ts new file mode 100644 index 0000000..3915163 --- /dev/null +++ b/examples/plasmic/next.config.ts @@ -0,0 +1,8 @@ +import type { NextConfig } from "next"; + +const nextConfig: NextConfig = { + /* config options here */ + reactStrictMode: true, +}; + +export default nextConfig; diff --git a/examples/plasmic/package.json b/examples/plasmic/package.json new file mode 100644 index 0000000..d530a6c --- /dev/null +++ b/examples/plasmic/package.json @@ -0,0 +1,26 @@ +{ + "name": "plasmic-nextjs", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@plasmicapp/loader-nextjs": "^1.0.409", + "bknd": "workspace:*", + "@bknd/plasmic": "workspace:*", + "next": "15.0.4", + "react": "^18.3.1", + "react-dom": "^18.3.1" + }, + "devDependencies": { + "typescript": "^5", + "@types/node": "^20", + "@types/react": "^19", + "@types/react-dom": "^19", + "postcss": "^8" + } +} diff --git a/examples/plasmic/postcss.config.mjs b/examples/plasmic/postcss.config.mjs new file mode 100644 index 0000000..1a69fd2 --- /dev/null +++ b/examples/plasmic/postcss.config.mjs @@ -0,0 +1,8 @@ +/** @type {import('postcss-load-config').Config} */ +const config = { + plugins: { + tailwindcss: {}, + }, +}; + +export default config; diff --git a/examples/plasmic/src/pages/[[...catchall]].tsx b/examples/plasmic/src/pages/[[...catchall]].tsx new file mode 100644 index 0000000..4de4a49 --- /dev/null +++ b/examples/plasmic/src/pages/[[...catchall]].tsx @@ -0,0 +1,78 @@ +import { PLASMIC } from "@/plasmic-init"; +import { + type ComponentRenderData, + PlasmicComponent, + PlasmicRootProvider, + extractPlasmicQueryData +} from "@plasmicapp/loader-nextjs"; +import type { GetServerSideProps } from "next"; +// biome-ignore lint/suspicious/noShadowRestrictedNames: +import Error from "next/error"; +import { useRouter } from "next/router"; +import * as React from "react"; + +export const getServerSideProps: GetServerSideProps = async (context) => { + const { catchall } = context.params ?? {}; + + // Convert the catchall param into a path string + const plasmicPath = + typeof catchall === "string" + ? catchall + : Array.isArray(catchall) + ? `/${catchall.join("/")}` + : "/"; + const plasmicData = await PLASMIC.maybeFetchComponentData(plasmicPath); + if (!plasmicData) { + // This is some non-Plasmic catch-all page + return { + props: {} + }; + } + + // This is a path that Plasmic knows about. + const pageMeta = plasmicData.entryCompMetas[0]; + + // Cache the necessary data fetched for the page. + const queryCache = await extractPlasmicQueryData( + + {/* @ts-ignore */} + + + ); + + // Pass the data in as props. + return { + props: { plasmicData, queryCache } + }; +}; + +export default function CatchallPage(props: { + plasmicData?: ComponentRenderData; + queryCache?: Record; +}) { + const { plasmicData, queryCache } = props; + const router = useRouter(); + if (!plasmicData || plasmicData.entryCompMetas.length === 0) { + return ; + } + const pageMeta = plasmicData.entryCompMetas[0]; + return ( + // Pass in the data fetched in getStaticProps as prefetchedData + + {/* @ts-ignore */} + + + ); +} diff --git a/examples/plasmic/src/pages/_app.tsx b/examples/plasmic/src/pages/_app.tsx new file mode 100644 index 0000000..80eb165 --- /dev/null +++ b/examples/plasmic/src/pages/_app.tsx @@ -0,0 +1,11 @@ +import "@/styles/globals.css"; +import { ClientProvider } from "bknd/client"; +import type { AppProps } from "next/app"; + +export default function App({ Component, pageProps }: AppProps) { + return ( + + + + ); +} diff --git a/examples/plasmic/src/pages/_document.tsx b/examples/plasmic/src/pages/_document.tsx new file mode 100644 index 0000000..628a733 --- /dev/null +++ b/examples/plasmic/src/pages/_document.tsx @@ -0,0 +1,13 @@ +import { Html, Head, Main, NextScript } from "next/document"; + +export default function Document() { + return ( + + + +
+ + + + ); +} diff --git a/examples/plasmic/src/pages/admin/[[...admin]].tsx b/examples/plasmic/src/pages/admin/[[...admin]].tsx new file mode 100644 index 0000000..fb28734 --- /dev/null +++ b/examples/plasmic/src/pages/admin/[[...admin]].tsx @@ -0,0 +1,25 @@ +// pages/admin/[[...admin]].tsx +import { withApi } from "bknd/adapter/nextjs"; +import dynamic from "next/dynamic"; +import "bknd/dist/styles.css"; + +/*export const config = { + runtime: "experimental-edge" +}*/ + +const Admin = dynamic(() => import("bknd/ui").then((mod) => mod.Admin), { + ssr: false, +}); + +export const getServerSideProps = withApi(async (context) => { + return { + props: { + user: context.api.getUser(), + }, + }; +}); + +export default function AdminPage() { + if (typeof document === "undefined") return null; + return ; +} diff --git a/examples/plasmic/src/pages/api/[...route].ts b/examples/plasmic/src/pages/api/[...route].ts new file mode 100644 index 0000000..f296f98 --- /dev/null +++ b/examples/plasmic/src/pages/api/[...route].ts @@ -0,0 +1,16 @@ +import { serve } from "bknd/adapter/nextjs"; + +export const config = { + runtime: "edge", + unstable_allowDynamic: ["**/*.js"] +}; + +export default serve({ + connection: { + type: "libsql", + config: { + url: process.env.DB_URL!, + authToken: process.env.DB_TOKEN! + } + } +}); diff --git a/examples/plasmic/src/pages/plasmic-host.tsx b/examples/plasmic/src/pages/plasmic-host.tsx new file mode 100644 index 0000000..7dac28d --- /dev/null +++ b/examples/plasmic/src/pages/plasmic-host.tsx @@ -0,0 +1,7 @@ +import * as React from 'react'; +import { PlasmicCanvasHost } from '@plasmicapp/loader-nextjs'; +import { PLASMIC } from '@/plasmic-init'; + +export default function PlasmicHost() { + return PLASMIC && ; +} \ No newline at end of file diff --git a/examples/plasmic/src/pages/test.tsx b/examples/plasmic/src/pages/test.tsx new file mode 100644 index 0000000..5b66ecc --- /dev/null +++ b/examples/plasmic/src/pages/test.tsx @@ -0,0 +1,6 @@ +import { useApi } from "bknd/client"; + +export default function Test() { + const api = useApi(undefined); + return
{api.baseUrl}
; +} diff --git a/examples/plasmic/src/plasmic-init.ts b/examples/plasmic/src/plasmic-init.ts new file mode 100644 index 0000000..9c77d9d --- /dev/null +++ b/examples/plasmic/src/plasmic-init.ts @@ -0,0 +1,17 @@ +import { initPlasmicLoader } from "@plasmicapp/loader-nextjs"; +import { loader } from "@bknd/plasmic"; + +export const PLASMIC = initPlasmicLoader({ + projects: [ + { + id: process.env.PLASMIC_ID!, + token: process.env.PLASMIC_TOKEN!, + } + ], + preview: true, //process.env.NODE_ENV === "development", +}) + +loader(PLASMIC); +/* +PLASMIC.registerComponent(BkndData, BkndDataMeta); +PLASMIC.registerGlobalContext(BkndContext, BkndContextMeta as any);*/ diff --git a/examples/plasmic/src/styles/globals.css b/examples/plasmic/src/styles/globals.css new file mode 100644 index 0000000..b5c61c9 --- /dev/null +++ b/examples/plasmic/src/styles/globals.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/examples/plasmic/tailwind.config.ts b/examples/plasmic/tailwind.config.ts new file mode 100644 index 0000000..109807b --- /dev/null +++ b/examples/plasmic/tailwind.config.ts @@ -0,0 +1,18 @@ +import type { Config } from "tailwindcss"; + +export default { + content: [ + "./src/pages/**/*.{js,ts,jsx,tsx,mdx}", + "./src/components/**/*.{js,ts,jsx,tsx,mdx}", + "./src/app/**/*.{js,ts,jsx,tsx,mdx}", + ], + theme: { + extend: { + colors: { + background: "var(--background)", + foreground: "var(--foreground)", + }, + }, + }, + plugins: [], +} satisfies Config; diff --git a/examples/plasmic/tsconfig.json b/examples/plasmic/tsconfig.json new file mode 100644 index 0000000..ecf7ecf --- /dev/null +++ b/examples/plasmic/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "target": "ES2017", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "noImplicitAny": false, + "paths": { + "@/*": ["./src/*"] + } + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], + "exclude": ["node_modules"] +} diff --git a/packages/plasmic/components/WouterLink.tsx b/packages/plasmic/components/WouterLink.tsx deleted file mode 100644 index a7472dc..0000000 --- a/packages/plasmic/components/WouterLink.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import type { CodeComponentMeta } from "@plasmicapp/host"; -import { Link } from "wouter"; - -export function WouterLink({ href, className, children, ...props }) { - return ( - - {children} - - ); -} - -export const WouterLinkMeta: CodeComponentMeta = { - name: "WouterLink", - importPath: import.meta.dir, - props: { - href: { - type: "href", - }, - children: { - type: "slot", - }, - }, -}; diff --git a/packages/plasmic/index.ts b/packages/plasmic/index.ts deleted file mode 100644 index 05e7de8..0000000 --- a/packages/plasmic/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export { loader as loadBkndComponents, CatchAllPage, createWouterPlasmicApp } from "./loader"; - -export * from "./components"; -export * from "./contexts"; diff --git a/packages/plasmic/loader.tsx b/packages/plasmic/loader.tsx deleted file mode 100644 index f81547f..0000000 --- a/packages/plasmic/loader.tsx +++ /dev/null @@ -1,109 +0,0 @@ -import { PlasmicCanvasHost, type registerComponent } from "@plasmicapp/host"; -import { - type ComponentRenderData, - PlasmicComponent, - type PlasmicComponentLoader, - PlasmicRootProvider -} from "@plasmicapp/loader-react"; -import { forwardRef, useEffect, useState } from "react"; -import { Link, Route, Router, Switch } from "wouter"; -import { - BkndData, - BkndDataMeta, - Image, - ImageMeta, - LazyRender, - LazyRenderMeta, - WouterLink, - WouterLinkMeta -} from "./components"; -import { BkndContext, BkndContextMeta } from "./contexts"; - -export function loader(PLASMIC: PlasmicComponentLoader) { - PLASMIC.registerComponent(BkndData, BkndDataMeta); - PLASMIC.registerComponent(WouterLink, WouterLinkMeta); - PLASMIC.registerComponent(Image, ImageMeta); - PLASMIC.registerComponent(LazyRender, LazyRenderMeta); - PLASMIC.registerGlobalContext(BkndContext, BkndContextMeta as any); -} - -const CustomLink = forwardRef((props, ref) => { - //console.log("rendering custom link", props); - //return null; - if ("data-replace" in props) { - return
; - } - //return ; - // @ts-ignore it's because of the link - return ; -}); - -const Wrapper = ({ children }) => { - return ( -
-
{children}
-
- ); -}; - -export function CatchAllPage({ - PLASMIC, - prefix = "" -}: { PLASMIC: PlasmicComponentLoader; prefix?: string }) { - const [loading, setLoading] = useState(true); - const [pageData, setPageData] = useState(null); - - //const params = useParams(); - const pathname = location.pathname.replace(prefix, ""); - const path = pathname.length === 0 ? "/" : pathname; - //console.log("path", path, params); - useEffect(() => { - async function load() { - const pageData = await PLASMIC.maybeFetchComponentData(path); - //console.log("pageData", pageData); - setPageData(pageData); - setLoading(false); - } - load(); - }, []); - - if (loading) { - return Loading ...; - } - if (!pageData) { - return Not found; - } - - const pageMeta = pageData.entryCompMetas[0]; - - // The page will already be cached from the `load` call above. - return ( - - - - ); -} - -export function createWouterPlasmicApp(PLASMIC: PlasmicComponentLoader, prefix = "") { - return function App() { - return ( - - - - } - /> - - - ); - }; -} diff --git a/packages/plasmic/package.json b/packages/plasmic/package.json index 2ad935c..8d128c5 100644 --- a/packages/plasmic/package.json +++ b/packages/plasmic/package.json @@ -1,5 +1,6 @@ { "name": "@bknd/plasmic", + "version": "0.3.4-alpha1", "type": "module", "sideEffects": false, "scripts": { @@ -8,41 +9,61 @@ "build:only": "rm -rf dist && bun tsup", "types": "bun tsc -p tsconfig.json --noEmit --skipLibCheck", "build:types": "bun tsc --emitDeclarationOnly", - "updater": "bun x npm-check-updates -ui" + "updater": "bun x npm-check-updates -ui", + "pack": "rm -rf *.tgz && npm pack && mv *.tgz latest.tgz", + "prepublishOnly": "bun run build" }, - "dependencies": { - "wouter": "^3.3.5" + "publishConfig": { + "access": "public" }, + "dependencies": {}, "devDependencies": { "@types/bun": "latest", + "bknd": "workspace:*", + "tsdx": "^0.14.1", "typescript": "^5.0.0" }, "peerDependencies": { - "@plasmicapp/host": ">=1.0.0", - "bknd": "workspace:*", + "bknd": "*", "react": ">=18", - "react-dom": ">=18" + "react-dom": ">=18", + "@plasmicapp/host": ">=1.0.0", + "@plasmicapp/query": ">=0.1.0" }, "tsup": { - "entry": ["index.ts"], - "minify": true, + "entry": [ + "src/index.ts" + ], + "minify": false, "clean": true, - "external": ["react", "react-dom", "@plasmicapp/host", "@plasmicapp/loader-react", "@plasmicapp/loader-core"], - "format": ["esm"], + "external": [ + "react", + "react-dom", + "@plasmicapp/host", + "@plasmicapp/query", + "swr" + ], + "format": [ + "esm", + "cjs" + ], "platform": "browser", - "shims": true, "bundle": true, "metafile": true, - "splitting": false, + "splitting": true, "sourceMap": true, "outDir": "dist" }, - "exports": { - ".": { - "types": "./dist/index.d.ts", - "import": "./dist/index.js", - "require": "./dist/index.js" - } - }, - "files": ["dist"] + "types": "dist/index.d.ts", + "module": "dist/index.js", + "main": "dist/index.cjs", + "files": [ + "dist", + "README.md", + "!dist/*.tsbuildinfo", + "!dist/*.map", + "!dist/**/*.map", + "!dist/metafile*", + "!dist/**/metafile*" + ] } diff --git a/packages/plasmic/components/Image.tsx b/packages/plasmic/src/components/Image.tsx similarity index 86% rename from packages/plasmic/components/Image.tsx rename to packages/plasmic/src/components/Image.tsx index 5c02e68..9c50439 100644 --- a/packages/plasmic/components/Image.tsx +++ b/packages/plasmic/src/components/Image.tsx @@ -1,6 +1,7 @@ -"use client"; - import type { CodeComponentMeta } from "@plasmicapp/host"; +import registerComponent, { type ComponentMeta } from "@plasmicapp/host/registerComponent"; +// biome-ignore lint/style/useImportType: +import React from "react"; //import { PlasmicCanvasContext } from "@plasmicapp/loader-react"; import { useContext, useEffect, useRef, useState } from "react"; @@ -39,7 +40,7 @@ function numeric(value: number | string): number { function getDimensionDefaults( width: number | string | undefined, height: number | string | undefined, - ratio: number | undefined, + ratio: number | undefined ) { let _width = width; let _height = height; @@ -61,7 +62,7 @@ function getDimensionDefaults( function getPlaceholderStyle( width: number | string | undefined, height: number | string | undefined, - ratio: number | undefined, + ratio: number | undefined ) { let paddingBottom = 0; if (width && height) { @@ -73,7 +74,7 @@ function getPlaceholderStyle( } return { - paddingBottom: paddingBottom + "%", + paddingBottom: paddingBottom + "%" }; } @@ -126,7 +127,7 @@ export const Image: React.FC = ({ } }); }, - { threshold: loadTreshold }, + { threshold: loadTreshold } ); if (imgRef.current) { observer.observe(imgRef.current); @@ -150,7 +151,7 @@ export const Image: React.FC = ({ const { width: _width, height: _height, - ratio: _ratio, + ratio: _ratio } = getDimensionDefaults(width, height, ratio); const imgStyle: any = { @@ -163,7 +164,7 @@ export const Image: React.FC = ({ height: "auto", //height: _height || "auto", //height: !transitioned ? _height || "auto" : "auto", - opacity: forceLoad || loaded ? 1 : 0, + opacity: forceLoad || loaded ? 1 : 0 }; const placeholderStyle: any = { @@ -174,7 +175,7 @@ export const Image: React.FC = ({ width: _width || "100%", height: 0, //height: transitioned ? "auto" : 0, - ...getPlaceholderStyle(_width, _height, _ratio), + ...getPlaceholderStyle(_width, _height, _ratio) }; const wrapperStyle: any = { @@ -186,7 +187,7 @@ export const Image: React.FC = ({ lineHeight: 0, //height: _height, maxWidth: "100%", - maxHeight: "100%", + maxHeight: "100%" }; if (loaded) { wrapperStyle.height = "auto"; @@ -213,13 +214,24 @@ export const Image: React.FC = ({ ); }; -export const ImageMeta: CodeComponentMeta> = { +export function registerImage( + loader?: { registerComponent: typeof registerComponent }, + customMeta?: ComponentMeta +) { + if (loader) { + loader.registerComponent(Image, customMeta ?? ImageMeta); + } else { + registerComponent(Image, customMeta ?? ImageMeta); + } +} + +export const ImageMeta: CodeComponentMeta = { name: "ImageLazy", - importPath: import.meta.dir, + importPath: "@bknd/plasmic", props: { src: { type: "imageUrl", - displayName: "Image", + displayName: "Image" }, alt: "string", width: "number", @@ -230,14 +242,14 @@ export const ImageMeta: CodeComponentMeta> = { //backgroundColor: "color", transitionSpeed: { type: "number", - helpText: "How fast image should fade in. Default is 200 (ms).", + helpText: "How fast image should fade in. Default is 200 (ms)." }, loadTreshold: { type: "number", displayName: "Treshold", //defaultValue: 0.1, helpText: - "Number between 0 and 1. Default is 0.1. Determines how much of the image must be in viewport before it gets loaded", - }, - }, + "Number between 0 and 1. Default is 0.1. Determines how much of the image must be in viewport before it gets loaded" + } + } }; diff --git a/packages/plasmic/components/LazyRender.tsx b/packages/plasmic/src/components/LazyRender.tsx similarity index 73% rename from packages/plasmic/components/LazyRender.tsx rename to packages/plasmic/src/components/LazyRender.tsx index 2de5e06..a49e3a3 100644 --- a/packages/plasmic/components/LazyRender.tsx +++ b/packages/plasmic/src/components/LazyRender.tsx @@ -1,4 +1,7 @@ import type { CodeComponentMeta } from "@plasmicapp/host"; +import registerComponent, { type ComponentMeta } from "@plasmicapp/host/registerComponent"; +// biome-ignore lint/style/useImportType: +import React from "react"; import { useEffect, useRef, useState } from "react"; interface LazyRenderProps { @@ -22,7 +25,7 @@ export const LazyRender: React.FC = ({ threshold = 0.1, delay = 0, fallback = , - onBecomesVisible, + onBecomesVisible }) => { const [isVisible, setIsVisible] = useState(forceLoad); const ref = useRef(null); @@ -43,7 +46,7 @@ export const LazyRender: React.FC = ({ } const observerOptions: IntersectionObserverInit = { - threshold: threshold < 1 ? threshold : 0.1, + threshold: threshold < 1 ? threshold : 0.1 }; const observerCallback: IntersectionObserverCallback = (entries) => { @@ -74,38 +77,49 @@ export const LazyRender: React.FC = ({ ); }; -export const LazyRenderMeta: CodeComponentMeta> = { +export function registerLazyRender( + loader?: { registerComponent: typeof registerComponent }, + customMeta?: ComponentMeta +) { + if (loader) { + loader.registerComponent(LazyRender, customMeta ?? LazyRenderMeta); + } else { + registerComponent(LazyRender, customMeta ?? LazyRenderMeta); + } +} + +export const LazyRenderMeta: CodeComponentMeta = { name: "LazyRender", - importPath: import.meta.dir, + importPath: "@bknd/plasmic", props: { forceLoad: { type: "boolean", - defaultValue: false, + defaultValue: false }, forceFallback: { type: "boolean", - defaultValue: false, + defaultValue: false }, threshold: { type: "number", - defaultValue: 0.1, + defaultValue: 0.1 }, fallback: { - type: "slot", + type: "slot" //allowedComponents: ["*"], }, delay: { type: "number", - defaultValue: 0, + defaultValue: 0 }, onBecomesVisible: { type: "code", - lang: "javascript", + lang: "javascript" }, children: { - type: "slot", + type: "slot" //allowedComponents: ["*"], - }, - }, + } + } }; diff --git a/packages/plasmic/components/data/BkndData.tsx b/packages/plasmic/src/components/data/BkndData.tsx similarity index 67% rename from packages/plasmic/components/data/BkndData.tsx rename to packages/plasmic/src/components/data/BkndData.tsx index f5fef9d..6f2068c 100644 --- a/packages/plasmic/components/data/BkndData.tsx +++ b/packages/plasmic/src/components/data/BkndData.tsx @@ -1,11 +1,13 @@ -import { type CodeComponentMeta, DataProvider, usePlasmicCanvasContext } from "@plasmicapp/host"; +import { DataProvider, usePlasmicCanvasContext } from "@plasmicapp/host"; +import registerComponent, { type ComponentMeta } from "@plasmicapp/host/registerComponent"; +import { usePlasmicQueryData } from "@plasmicapp/query"; +import { useApi, useEntityQuery } from "bknd/client"; import type { RepoQuery } from "bknd/data"; -import { useEntities, useEntity } from "bknd/ui"; -import { encodeSearch } from "bknd/utils"; -import { useContext, useEffect, useState } from "react"; +// biome-ignore lint/style/useImportType: +import React from "react"; import { usePlasmicBkndContext } from "../../contexts/BkndContext"; -type BkndEntitiesProps = { +type BkndDataProps = { children?: React.ReactNode; loading?: React.ReactNode; error?: React.ReactNode; @@ -23,10 +25,11 @@ type BkndEntitiesProps = { dataName?: string; entityId?: number; entity?: string; + select?: string[]; sortBy: string; sortDir: "asc" | "desc"; where?: string; - mode?: "fetch" | "react-query"; + mode?: "fetch" | "swr"; noLayout?: boolean; preview?: boolean; previewSlot?: "loading" | "error" | "empty"; @@ -61,11 +64,13 @@ export function BkndData({ sortBy = "id", sortDir = "asc", mode = "fetch", + select = [], noLayout, preview, previewSlot, ...props -}: BkndEntitiesProps) { +}: BkndDataProps) { + //console.log("--bknd data"); const inEditor = !!usePlasmicCanvasContext(); const plasmicContext = usePlasmicBkndContext(); @@ -100,6 +105,7 @@ export function BkndData({ } const query = { + select: select.length > 0 ? select : undefined, limit: entityId ? undefined : limit, offset: entityId ? undefined : offset, where: _where, @@ -108,7 +114,7 @@ export function BkndData({ join: joinRefs }; - console.log("---context", plasmicContext); + //console.log("---context", plasmicContext); if (plasmicContext.appConfig?.data?.entities) { const { entities, relations } = plasmicContext.appConfig.data; console.log("entities", entities); @@ -149,8 +155,7 @@ export function BkndData({ children }; - const Component = - mode === "react-query" ? : ; + const Component = mode === "swr" ? : ; return noLayout ? Component :
{Component}
; } @@ -175,32 +180,19 @@ const ModeFetch = ({ entity, query }: ModeProps) => { - const [data, setData] = useState([]); - const [isLoading, setLoading] = useState(true); - const [hasError, setError] = useState(); - const plasmicContext = usePlasmicBkndContext(); - const basepath = "/api/data"; - const path = entityId ? `${basepath}/${entity}/${entityId}` : `${basepath}/${entity}`; - console.log("query", path, query); - const url = `${plasmicContext.baseUrl}${path}?${encodeSearch(query)}`; - useEffect(() => { - (async () => { - try { - const res = await fetch(url); - const result = (await res.json()) as any; - //console.log("result", result); - setData(result.data); - setLoading(false); - setError(undefined); - } catch (e) { - console.error(e); - setError(String(e)); - setLoading(false); - } - })(); - }, [url]); + const api = useApi(); + const endpoint = entityId + ? api.data.readOne(entity, entityId, query) + : api.data.readMany(entity, query); - console.log("--data", { name: dataName ?? entity ?? "data", data, isLoading, hasError }); + const { + data, + error: hasError, + isLoading + } = usePlasmicQueryData(endpoint.key(), async () => { + const res = await endpoint.execute(); + return res.data; + }); if (isLoading) { return ; @@ -213,7 +205,6 @@ const ModeFetch = ({ if (data.length === 0) { return ; } - console.log("--here1"); return ( @@ -222,85 +213,48 @@ const ModeFetch = ({ ); }; -const ModeReactQuery = (props: ModeProps) => { - return props.entityId ? ( - - ) : ( - - ); -}; +const ModeSWR = ({ children, loading, error, dataName, entityId, empty, entity }: ModeProps) => { + const $q = useEntityQuery(entity, entityId); -const ModeReactQuerySingle = ({ - children, - loading, - error, - dataName, - entityId, - empty, - entity -}: ModeProps) => { - const container = useEntity(entity, entityId); - const { isLoading, isError } = container.status.fetch; - - if (isLoading) { + if ($q.isLoading) { return ; } - if (isError) { + if ($q.error) { return ; } - if (!container.data) { + if (!$q.data) { return ; } return ( - + {children} ); }; -const ModeReactQueryMultiple = ({ - children, - loading, - error, - empty, - dataName, - entity, - query -}: ModeProps) => { - const container = useEntities(entity, query); - const { isLoading, isError } = container.status.fetch; - - if (isLoading) { - return ; +export function registerBkndData( + loader?: { registerComponent: typeof registerComponent }, + customMeta?: ComponentMeta +) { + if (loader) { + loader.registerComponent(BkndData, customMeta ?? BkndDataMeta); + } else { + registerComponent(BkndData, customMeta ?? BkndDataMeta); } +} - if (isError) { - return ; - } - - if (!container.data || container.data.length === 0) { - return ; - } - - return ( - - {children} - - ); -}; - -export const BkndDataMeta: CodeComponentMeta> = { +export const BkndDataMeta: ComponentMeta = { name: "BKND Data", section: "BKND", - importPath: import.meta.dir, + importPath: "@bknd/plasmic", providesData: true, props: { entity: { type: "choice", - options: (props, ctx) => ctx.entities + options: (props, ctx) => ctx?.entities ?? [] }, dataName: { type: "string" @@ -308,6 +262,10 @@ export const BkndDataMeta: CodeComponentMeta ctx?.fields ?? [] + }, limit: { type: "number", defaultValue: 10, @@ -326,13 +284,13 @@ export const BkndDataMeta: CodeComponentMeta ctx.references + options: (props, ctx) => ctx?.references ?? [] }, joinRefs: { displayName: "Join", type: "choice", multiSelect: true, - options: (props, ctx) => ctx.references + options: (props, ctx) => ctx?.references ?? [] }, where: { type: "code", @@ -340,7 +298,7 @@ export const BkndDataMeta: CodeComponentMeta ctx.fields + options: (props, ctx) => ctx?.fields ?? [] }, sortDir: { type: "choice", @@ -361,7 +319,7 @@ export const BkndDataMeta: CodeComponentMeta +import React from "react"; import { createContext, useContext, useEffect, useMemo, useState } from "react"; // Users will be able to set these props in Studio. @@ -18,17 +24,6 @@ type BkndContextProps = { const BkndContextContext = createContext({} as any); -function getBaseUrlFromWindow() { - if (typeof window === "undefined") { - return ""; - } - - const protocol = window.location.protocol; - const host = window.location.host; - - return `${protocol}//${host}`; -} - // @todo: it's an issue that we need auth, so we cannot make baseurl adjustable (maybe add an option to useAuth with a specific base url?) export const BkndContext = ({ children, @@ -36,19 +31,15 @@ export const BkndContext = ({ initialAuth }: React.PropsWithChildren) => { const auth = useAuth(); - const baseurl = useBaseUrl(); + const baseurl = baseUrl ?? useBaseUrl(); + const api = useApi({ host: baseurl }); const [data, setData] = useState({ baseUrl: baseurl, - /*baseUrl: (baseUrl && baseUrl.length > 0 ? baseUrl : getBaseUrlFromWindow()).replace( - /\/+$/, - "" - ),*/ auth: auth ?? initialAuth, appConfig: undefined }); const inEditor = !!usePlasmicCanvasContext(); - console.log("context:user", data); useEffect(() => { setData((prev) => ({ ...prev, auth: auth })); @@ -57,8 +48,10 @@ export const BkndContext = ({ useEffect(() => { (async () => { if (inEditor) { - const res = await fetch(`${baseurl}/api/system/config`); - const result = (await res.json()) as BkndGlobalContextProps["appConfig"]; + const result = await api.system.readConfig(); + + /*const res = await fetch(`${baseurl}/api/system/config`); + const result = (await res.json()) as BkndGlobalContextProps["appConfig"];*/ console.log("appconfig", result); setData((prev) => ({ ...prev, appConfig: result })); } @@ -101,13 +94,12 @@ export const BkndContext = ({ [baseUrl] ); - console.log("plasmic.bknd.context", data); + console.log("plasmic.bknd.context", { baseUrl }); return ( - {/*{children}*/} - {children} + {children} @@ -119,8 +111,20 @@ export function usePlasmicBkndContext() { return context; } -export const BkndContextMeta = { +export function registerBkndContext( + loader?: { registerGlobalContext: typeof registerGlobalContext }, + customMeta?: GlobalContextMeta +) { + if (loader) { + loader.registerGlobalContext(BkndContext, customMeta ?? BkndContextMeta); + } else { + registerGlobalContext(BkndContext, customMeta ?? BkndContextMeta); + } +} + +export const BkndContextMeta: GlobalContextMeta = { name: "BkndContext", + importPath: "@bknd/plasmic", props: { baseUrl: { type: "string" }, initialAuth: { type: "object" } }, providesData: true, globalActions: { diff --git a/packages/plasmic/contexts/index.ts b/packages/plasmic/src/contexts/index.ts similarity index 100% rename from packages/plasmic/contexts/index.ts rename to packages/plasmic/src/contexts/index.ts diff --git a/packages/plasmic/src/index.ts b/packages/plasmic/src/index.ts new file mode 100644 index 0000000..2f57de8 --- /dev/null +++ b/packages/plasmic/src/index.ts @@ -0,0 +1,17 @@ +import type { registerComponent, registerGlobalContext } from "@plasmicapp/host"; +import { registerImage } from "./components/Image"; +import { registerLazyRender } from "./components/LazyRender"; +import { registerBkndData } from "./components/data/BkndData"; +import { registerBkndContext } from "./contexts/BkndContext"; + +export function registerAll(loader?: { + registerComponent: typeof registerComponent; + registerGlobalContext: typeof registerGlobalContext; +}) { + registerBkndData(loader); + registerBkndContext(loader); + registerImage(loader); + registerLazyRender(loader); +} + +export { registerBkndData, registerBkndContext }; diff --git a/packages/plasmic/tsconfig.json b/packages/plasmic/tsconfig.json index 7f2aec6..d8a2e77 100644 --- a/packages/plasmic/tsconfig.json +++ b/packages/plasmic/tsconfig.json @@ -4,19 +4,23 @@ "lib": ["ESNext", "DOM"], "target": "ESNext", "module": "ESNext", - "jsx": "react-jsx", + "jsx": "react", "allowJs": true, "moduleResolution": "bundler", "allowImportingTsExtensions": false, "verbatimModuleSyntax": true, "strict": true, "outDir": "dist", + "declarationDir": "dist", "declaration": true, "skipLibCheck": true, "noFallthroughCasesInSwitch": true, "noImplicitAny": false, - "noPropertyAccessFromIndexSignature": false + "noPropertyAccessFromIndexSignature": false, + "rootDir": "src", + "baseUrl": "src", + "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo" }, - "include": ["index.ts", "loader.tsx", "components", "contexts"], - "exclude": ["@bknd/app", "@bknd/core", "dist", "node_modules", "build.ts"] + "include": ["src/**/*"], + "exclude": ["bknd", "dist", "node_modules"] }