akanjs 2.0.5 → 2.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.ko.md +1 -1
- package/README.md +1 -1
- package/cli/application/application.command.ts +4 -1
- package/cli/application/application.runner.ts +6 -8
- package/cli/build.ts +3 -1
- package/cli/cloud/cloud.runner.ts +7 -8
- package/cli/index.js +288 -115
- package/cli/library/library.runner.ts +2 -2
- package/cli/module/module.runner.ts +2 -2
- package/cli/npmRegistry.ts +13 -0
- package/cli/openBrowser.ts +15 -0
- package/cli/pluralizeName.ts +5 -0
- package/cli/scalar/scalar.prompt.ts +2 -2
- package/cli/scalar/scalar.runner.ts +2 -2
- package/cli/semver.ts +18 -0
- package/cli/templates/lib/sig.ts +2 -2
- package/cli/workspace/workspace.runner.ts +3 -3
- package/client/cookie.ts +10 -15
- package/common/index.ts +1 -0
- package/common/jwtDecode.ts +17 -0
- package/constant/serialize.ts +1 -1
- package/devkit/akanApp/akanApp.host.ts +46 -9
- package/devkit/akanConfig/akanConfig.ts +2 -1
- package/devkit/capacitor.base.config.ts +18 -4
- package/devkit/capacitorApp.ts +118 -64
- package/devkit/incrementalBuilder/incrementalBuilder.host.ts +83 -9
- package/devkit/mobile/mobileTarget.ts +2 -1
- package/devkit/scanInfo.ts +1 -0
- package/document/dataLoader.ts +140 -6
- package/document/database.ts +1 -1
- package/package.json +7 -13
- package/server/akanApp.ts +250 -44
- package/server/di/diLifecycle.ts +1 -1
- package/server/processMetricsCollector.ts +79 -1
- package/server/proxy/localeWebProxy.ts +29 -12
- package/server/resolver/database.resolver.ts +82 -31
- package/server/resolver/signal.resolver.ts +67 -28
- package/service/ipcTypes.ts +5 -0
- package/service/predefinedAdaptor/database.adaptor.ts +95 -27
- package/service/predefinedAdaptor/solidSqlite.ts +7 -7
- package/service/predefinedAdaptor/storage.adaptor.ts +35 -9
- package/service/serviceModule.ts +1 -6
- package/signal/base.signal.ts +1 -1
- package/signal/index.ts +1 -0
- package/signal/middleware.ts +5 -1
- package/signal/signalContext.ts +85 -31
- package/signal/signalRegistry.ts +35 -10
- package/signal/trace.ts +279 -0
- package/types/cli/npmRegistry.d.ts +1 -0
- package/types/cli/openBrowser.d.ts +1 -0
- package/types/cli/pluralizeName.d.ts +1 -0
- package/types/cli/semver.d.ts +1 -0
- package/types/client/cookie.d.ts +6 -1
- package/types/common/index.d.ts +1 -0
- package/types/common/jwtDecode.d.ts +2 -0
- package/types/devkit/capacitorApp.d.ts +14 -5
- package/types/devkit/incrementalBuilder/incrementalBuilder.host.d.ts +9 -5
- package/types/document/dataLoader.d.ts +21 -2
- package/types/document/database.d.ts +1 -1
- package/types/server/processMetricsCollector.d.ts +2 -0
- package/types/service/ipcTypes.d.ts +5 -0
- package/types/service/predefinedAdaptor/database.adaptor.d.ts +26 -32
- package/types/service/predefinedAdaptor/solidSqlite.d.ts +3 -3
- package/types/service/predefinedAdaptor/storage.adaptor.d.ts +8 -2
- package/types/service/serviceModule.d.ts +1 -1
- package/types/signal/index.d.ts +1 -0
- package/types/signal/signalContext.d.ts +4 -1
- package/types/signal/signalRegistry.d.ts +25 -4
- package/types/signal/trace.d.ts +97 -0
- package/types/ui/Signal/style.d.ts +15 -0
- package/ui/Signal/Arg.tsx +22 -15
- package/ui/Signal/Doc.tsx +30 -24
- package/ui/Signal/Listener.tsx +15 -39
- package/ui/Signal/Message.tsx +32 -50
- package/ui/Signal/Object.tsx +16 -13
- package/ui/Signal/PubSub.tsx +29 -47
- package/ui/Signal/Response.tsx +7 -17
- package/ui/Signal/RestApi.tsx +41 -57
- package/ui/Signal/WebSocket.tsx +1 -1
- package/ui/Signal/style.ts +36 -0
- package/webkit/useCsrValues.ts +147 -37
package/ui/Signal/RestApi.tsx
CHANGED
|
@@ -12,6 +12,7 @@ import { Signal } from ".";
|
|
|
12
12
|
import Arg from "./Arg";
|
|
13
13
|
import { getExampleData } from "./makeExample";
|
|
14
14
|
import Response from "./Response";
|
|
15
|
+
import { getEndpointBadgeClassName, getGuardBadgeClassName, signalUi } from "./style";
|
|
15
16
|
|
|
16
17
|
type RestApiFetchFn = (
|
|
17
18
|
...args: [...args: unknown[], option: { token?: string; crystalize?: boolean }]
|
|
@@ -100,55 +101,38 @@ const RestApiEndpoint = ({
|
|
|
100
101
|
const [viewStatus, setViewStatus] = useState<"doc" | "test">("doc");
|
|
101
102
|
const path = FetchClient.makeHttpUrl(endpointKey, endpoint, signalPrefix, new Map());
|
|
102
103
|
return (
|
|
103
|
-
<div className=
|
|
104
|
-
<input type="checkbox"
|
|
104
|
+
<div className={signalUi.endpointCard}>
|
|
105
|
+
<input type="checkbox" defaultChecked={open} />
|
|
105
106
|
<div className="collapse-title">
|
|
106
|
-
<div className="flex items-center gap-
|
|
107
|
-
<div className={
|
|
108
|
-
|
|
109
|
-
</div>
|
|
110
|
-
{path} <span className="text-lg">({l._(`${refName}.signal.${endpointKey}`)})</span>
|
|
107
|
+
<div className="flex flex-wrap items-center gap-2">
|
|
108
|
+
<div className={getEndpointBadgeClassName(endpoint.type)}>{endpoint.type === "query" ? "GET" : "POST"}</div>
|
|
109
|
+
<div className="font-bold text-lg">{path}</div>
|
|
110
|
+
<div className="text-base-content/70 text-sm">{l._(`${refName}.signal.${endpointKey}`)}</div>
|
|
111
111
|
</div>
|
|
112
112
|
</div>
|
|
113
|
-
<div className=
|
|
114
|
-
<div className="
|
|
115
|
-
<div className=
|
|
116
|
-
<hr className="my-2 border-[0.1px] border-gray-400" />
|
|
113
|
+
<div className={signalUi.endpointContent}>
|
|
114
|
+
<div className="rounded-xl bg-base-100 p-3">
|
|
115
|
+
<div className={signalUi.sectionTitle}>Description</div>
|
|
117
116
|
{endpoint.guards?.some((guard) => guard !== "None") ? (
|
|
118
|
-
<div className="flex items-center gap-2
|
|
119
|
-
-
|
|
117
|
+
<div className="mt-2 flex flex-wrap items-center gap-2 font-normal text-sm">
|
|
118
|
+
<span className="text-base-content/70">Guards</span>
|
|
120
119
|
{endpoint.guards.map((guard) => (
|
|
121
|
-
<span
|
|
122
|
-
className={`badge ${
|
|
123
|
-
guard === "Public"
|
|
124
|
-
? "badge-success"
|
|
125
|
-
: guard === "SuperAdmin"
|
|
126
|
-
? "badge-error"
|
|
127
|
-
: guard === "Admin"
|
|
128
|
-
? "badge-error"
|
|
129
|
-
: guard === "User"
|
|
130
|
-
? "badge-accent"
|
|
131
|
-
: guard === "Owner"
|
|
132
|
-
? "badge-accent"
|
|
133
|
-
: guard === "Every"
|
|
134
|
-
? "badge-warning"
|
|
135
|
-
: ""
|
|
136
|
-
}`}
|
|
137
|
-
key={guard}
|
|
138
|
-
>
|
|
120
|
+
<span className={getGuardBadgeClassName(guard)} key={guard}>
|
|
139
121
|
{guard}
|
|
140
122
|
</span>
|
|
141
123
|
))}
|
|
142
124
|
</div>
|
|
143
125
|
) : null}
|
|
144
|
-
<div className="
|
|
126
|
+
<div className="mt-2 font-normal text-base-content/70 text-sm">
|
|
127
|
+
{l._(`${refName}.signal.${endpointKey}.desc`)}
|
|
128
|
+
</div>
|
|
145
129
|
</div>
|
|
146
|
-
<div className="
|
|
130
|
+
<div className="join w-fit">
|
|
147
131
|
<button
|
|
148
132
|
onClick={() => {
|
|
149
133
|
setViewStatus("doc");
|
|
150
134
|
}}
|
|
151
|
-
className={`btn
|
|
135
|
+
className={`btn join-item btn-sm ${viewStatus === "doc" ? "btn-primary" : "btn-outline"}`}
|
|
152
136
|
>
|
|
153
137
|
<AiOutlineFileWord className="text-xl" /> View Doc
|
|
154
138
|
</button>
|
|
@@ -156,7 +140,7 @@ const RestApiEndpoint = ({
|
|
|
156
140
|
onClick={() => {
|
|
157
141
|
setViewStatus("test");
|
|
158
142
|
}}
|
|
159
|
-
className={`btn
|
|
143
|
+
className={`btn join-item btn-sm ${viewStatus === "test" ? "btn-primary" : "btn-outline"}`}
|
|
160
144
|
>
|
|
161
145
|
<AiOutlineApi className="text-xl" /> Restful API
|
|
162
146
|
</button>
|
|
@@ -195,32 +179,32 @@ const RestApiInterface = ({ refName, endpointKey, endpoint }: RestApiInterfacePr
|
|
|
195
179
|
<div className="flex w-full flex-col gap-4">
|
|
196
180
|
{uploadArgs.length ? (
|
|
197
181
|
<div>
|
|
198
|
-
<div className=
|
|
199
|
-
<div className=
|
|
182
|
+
<div className={signalUi.sectionTitle}>Form data upload</div>
|
|
183
|
+
<div className={signalUi.tablePanel}>
|
|
200
184
|
<Arg.Table refName={refName} endpointKey={endpointKey} args={uploadArgs} />
|
|
201
185
|
</div>
|
|
202
186
|
</div>
|
|
203
187
|
) : null}
|
|
204
188
|
{paramArgs.length ? (
|
|
205
189
|
<div>
|
|
206
|
-
<div className=
|
|
207
|
-
<div className=
|
|
190
|
+
<div className={signalUi.sectionTitle}>Parameters</div>
|
|
191
|
+
<div className={signalUi.tablePanel}>
|
|
208
192
|
<Arg.Table refName={refName} endpointKey={endpointKey} args={paramArgs} />
|
|
209
193
|
</div>
|
|
210
194
|
</div>
|
|
211
195
|
) : null}
|
|
212
196
|
{searchArgs.length ? (
|
|
213
197
|
<div>
|
|
214
|
-
<div className=
|
|
215
|
-
<div className=
|
|
198
|
+
<div className={signalUi.sectionTitle}>Query</div>
|
|
199
|
+
<div className={signalUi.tablePanel}>
|
|
216
200
|
<Arg.Table refName={refName} endpointKey={endpointKey} args={searchArgs} />
|
|
217
201
|
</div>
|
|
218
202
|
</div>
|
|
219
203
|
) : null}
|
|
220
204
|
{bodyArgs.length ? (
|
|
221
205
|
<div>
|
|
222
|
-
<div className=
|
|
223
|
-
<div className=
|
|
206
|
+
<div className={signalUi.sectionTitle}>Body</div>
|
|
207
|
+
<div className={signalUi.tablePanel}>
|
|
224
208
|
<Arg.Table refName={refName} endpointKey={endpointKey} args={bodyArgs} />
|
|
225
209
|
</div>
|
|
226
210
|
</div>
|
|
@@ -228,14 +212,14 @@ const RestApiInterface = ({ refName, endpointKey, endpoint }: RestApiInterfacePr
|
|
|
228
212
|
<div className="font-bold text-lg">
|
|
229
213
|
<div className="flex w-full flex-col gap-2 rounded-md font-normal md:flex-row">
|
|
230
214
|
<div className="w-full md:w-1/2">
|
|
231
|
-
<div className=
|
|
232
|
-
<div className="max-h-72 overflow-auto rounded-
|
|
215
|
+
<div className={signalUi.sectionTitle}>Response Type</div>
|
|
216
|
+
<div className="max-h-72 overflow-auto rounded-xl bg-base-100 p-4 md:h-72">
|
|
233
217
|
Returns: <Signal.Object.Type objRef={returnRef} arrDepth={endpoint.returns.arrDepth ?? 0} />
|
|
234
218
|
{isReturnModelType ? <Signal.Object.Detail objRef={returnRef as ConstantCls} /> : null}
|
|
235
219
|
</div>
|
|
236
220
|
</div>
|
|
237
221
|
<div className="w-full md:w-1/2">
|
|
238
|
-
<div className=
|
|
222
|
+
<div className={signalUi.sectionTitle}>Response Example</div>
|
|
239
223
|
<Response.Example endpoint={endpoint} />
|
|
240
224
|
</div>
|
|
241
225
|
</div>
|
|
@@ -313,8 +297,8 @@ const RestApiTry = ({ signalPrefix, refName, endpointKey, endpoint, fetch, httpU
|
|
|
313
297
|
};
|
|
314
298
|
return (
|
|
315
299
|
<div className="flex w-full flex-col gap-4">
|
|
316
|
-
<div className="flex items-center gap-2
|
|
317
|
-
<div className=
|
|
300
|
+
<div className="flex flex-wrap items-center gap-2 rounded-xl bg-base-100 p-3">
|
|
301
|
+
<div className={signalUi.sectionTitle}>Request URL</div>
|
|
318
302
|
<Copy text={`${httpUri ?? ""}${requestPath}`}>
|
|
319
303
|
<button className="btn btn-sm btn-outline">
|
|
320
304
|
{requestPath} <AiOutlineCopy />
|
|
@@ -323,7 +307,7 @@ const RestApiTry = ({ signalPrefix, refName, endpointKey, endpoint, fetch, httpU
|
|
|
323
307
|
</div>
|
|
324
308
|
{uploadArgs.length ? (
|
|
325
309
|
<div>
|
|
326
|
-
<div className=
|
|
310
|
+
<div className={signalUi.sectionTitle}>Form data upload</div>
|
|
327
311
|
{uploadArgs.map((arg) => (
|
|
328
312
|
<Arg.FormData
|
|
329
313
|
key={arg.name}
|
|
@@ -338,8 +322,8 @@ const RestApiTry = ({ signalPrefix, refName, endpointKey, endpoint, fetch, httpU
|
|
|
338
322
|
</div>
|
|
339
323
|
) : null}
|
|
340
324
|
{paramArgs.length ? (
|
|
341
|
-
<div className=
|
|
342
|
-
<div className=
|
|
325
|
+
<div className={signalUi.sectionPanel}>
|
|
326
|
+
<div className={signalUi.sectionTitle}>Parameters</div>
|
|
343
327
|
{paramArgs.map((arg, idx) => (
|
|
344
328
|
<Arg.Param
|
|
345
329
|
key={idx}
|
|
@@ -354,8 +338,8 @@ const RestApiTry = ({ signalPrefix, refName, endpointKey, endpoint, fetch, httpU
|
|
|
354
338
|
</div>
|
|
355
339
|
) : null}
|
|
356
340
|
{queryArgs.length ? (
|
|
357
|
-
<div>
|
|
358
|
-
<div className=
|
|
341
|
+
<div className={signalUi.sectionPanel}>
|
|
342
|
+
<div className={signalUi.sectionTitle}>Queries</div>
|
|
359
343
|
{queryArgs.map((arg, idx) => (
|
|
360
344
|
<Arg.Query
|
|
361
345
|
key={idx}
|
|
@@ -371,17 +355,17 @@ const RestApiTry = ({ signalPrefix, refName, endpointKey, endpoint, fetch, httpU
|
|
|
371
355
|
) : null}
|
|
372
356
|
{bodyArgs.length ? (
|
|
373
357
|
<div>
|
|
374
|
-
<div className=
|
|
358
|
+
<div className={signalUi.sectionTitle}>Body</div>
|
|
375
359
|
<Arg.Json value={bodyRequest} onChange={setBodyRequest} />
|
|
376
360
|
</div>
|
|
377
361
|
) : null}
|
|
378
|
-
<div
|
|
379
|
-
<button className="btn w-full
|
|
362
|
+
<div>
|
|
363
|
+
<button className="btn btn-primary w-full" onClick={() => void onSend()}>
|
|
380
364
|
<AiOutlineSend className="-mt-0.5" /> Send Request
|
|
381
365
|
</button>
|
|
382
366
|
</div>
|
|
383
367
|
<div>
|
|
384
|
-
<div className=
|
|
368
|
+
<div className={signalUi.sectionTitle}>Response</div>
|
|
385
369
|
<Response.Result status={response.status} data={response.data as object} />
|
|
386
370
|
</div>
|
|
387
371
|
</div>
|
package/ui/Signal/WebSocket.tsx
CHANGED
|
@@ -23,7 +23,7 @@ const WebSocketEndpoints = ({ refName, fetch, openAll }: WebSocketEndpointsProps
|
|
|
23
23
|
return false;
|
|
24
24
|
});
|
|
25
25
|
return (
|
|
26
|
-
<div>
|
|
26
|
+
<div className="flex flex-col gap-2">
|
|
27
27
|
{endpointEntries.map(([endpointKey, endpoint], idx) => {
|
|
28
28
|
if (endpoint.type === "pubsub") {
|
|
29
29
|
return (
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
export const signalUi = {
|
|
4
|
+
sectionTitle: "font-extrabold text-lg",
|
|
5
|
+
sectionDescription: "text-base-content/70 text-sm",
|
|
6
|
+
sectionPanel: "rounded-xl bg-base-100 p-3",
|
|
7
|
+
endpointCard: "collapse-arrow collapse my-2 bg-base-200",
|
|
8
|
+
endpointContent: "collapse-content flex w-full flex-col gap-4 bg-base-100/60",
|
|
9
|
+
tablePanel: "overflow-x-auto rounded-xl bg-base-100 p-3",
|
|
10
|
+
inputRow: "flex w-full flex-col gap-2 py-2 md:flex-row md:items-center",
|
|
11
|
+
inputLabel: "w-full font-semibold text-base-content/70 text-sm md:w-36",
|
|
12
|
+
codePanel:
|
|
13
|
+
"textarea min-h-[300px] w-full rounded-xl border border-base-300 bg-base-100 p-4 font-normal text-sm text-base-content",
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export const getEndpointBadgeClassName = (type: string) =>
|
|
17
|
+
type === "query" || type === "pubsub" ? "badge badge-primary" : "badge badge-secondary";
|
|
18
|
+
|
|
19
|
+
export const getGuardBadgeClassName = (guard: string) =>
|
|
20
|
+
guard === "Public" ? "badge badge-primary" : guard === "None" ? "badge" : "badge badge-secondary";
|
|
21
|
+
|
|
22
|
+
export const getStatusBadgeClassName = (status: string) =>
|
|
23
|
+
status === "error"
|
|
24
|
+
? "badge badge-error"
|
|
25
|
+
: status === "success" || status === "listening"
|
|
26
|
+
? "badge badge-primary"
|
|
27
|
+
: "badge badge-outline";
|
|
28
|
+
|
|
29
|
+
export const getStatusTextareaClassName = (status: string) =>
|
|
30
|
+
status === "error"
|
|
31
|
+
? "border-error text-error"
|
|
32
|
+
: status === "success" || status === "listening"
|
|
33
|
+
? "border-primary"
|
|
34
|
+
: status === "loading"
|
|
35
|
+
? "textarea-disabled"
|
|
36
|
+
: "";
|
package/webkit/useCsrValues.ts
CHANGED
|
@@ -21,6 +21,8 @@ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
|
21
21
|
import { useHistory } from "./useHistory";
|
|
22
22
|
import { useLocation } from "./useLocation";
|
|
23
23
|
|
|
24
|
+
const linearEasing = (t: number) => t;
|
|
25
|
+
|
|
24
26
|
const useNoneTrans = ({ clientHeight, location, prevLocation }: RouteState): UseCsrTransition => {
|
|
25
27
|
const transDirection = "none";
|
|
26
28
|
const transUnit = useSpringValue(0, { config: { clamp: true } });
|
|
@@ -107,19 +109,15 @@ const useFadeTrans = ({ clientHeight, location, prevLocation, onBack, history }:
|
|
|
107
109
|
|
|
108
110
|
useEffect(() => {
|
|
109
111
|
onBack.current.fade = async () => {
|
|
110
|
-
|
|
111
|
-
if (startValue) await transUnit.start(startValue);
|
|
112
|
+
await transUnit.start(transUnitRange[0]);
|
|
112
113
|
};
|
|
113
114
|
}, []);
|
|
114
115
|
useEffect(() => {
|
|
115
116
|
if (history.current.type === "forward") {
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
const endValue = transUnitRange[1];
|
|
119
|
-
if (endValue) void transUnit.start(endValue, { config: { duration: 150 } });
|
|
117
|
+
void transUnit.start(transUnitRange[0], { immediate: true });
|
|
118
|
+
void transUnit.start(transUnitRange[1], { config: { duration: 150 } });
|
|
120
119
|
} else {
|
|
121
|
-
|
|
122
|
-
if (endValue) void transUnit.start(endValue, { immediate: true });
|
|
120
|
+
void transUnit.start(transUnitRange[1], { immediate: true });
|
|
123
121
|
return;
|
|
124
122
|
}
|
|
125
123
|
}, [location.pathname]);
|
|
@@ -173,9 +171,11 @@ const useFadeTrans = ({ clientHeight, location, prevLocation, onBack, history }:
|
|
|
173
171
|
height: transProgress.to([0, 1], [prevPageState.topInset, pageState.topInset]),
|
|
174
172
|
},
|
|
175
173
|
contentStyle: {
|
|
174
|
+
top: transProgress.to([0, 1], [0, -(pageState.bottomInset - prevPageState.bottomInset) * 2]),
|
|
176
175
|
opacity: transProgress.to((progress) => progress),
|
|
177
176
|
},
|
|
178
177
|
prevContentStyle: {
|
|
178
|
+
top: transProgress.to([0, 1], [0, -(pageState.bottomInset - prevPageState.bottomInset) * 2]),
|
|
179
179
|
opacity: transProgress.to((progress) => 1 - progress),
|
|
180
180
|
},
|
|
181
181
|
},
|
|
@@ -191,11 +191,143 @@ const useFadeTrans = ({ clientHeight, location, prevLocation, onBack, history }:
|
|
|
191
191
|
),
|
|
192
192
|
},
|
|
193
193
|
contentStyle: {
|
|
194
|
-
top: transProgress.to(
|
|
194
|
+
top: transProgress.to(
|
|
195
|
+
[0, 1],
|
|
196
|
+
[
|
|
197
|
+
0,
|
|
198
|
+
0,
|
|
199
|
+
],
|
|
200
|
+
),
|
|
195
201
|
opacity: transProgress.to((progress) => progress),
|
|
202
|
+
|
|
203
|
+
transformOrigin: "top",
|
|
204
|
+
},
|
|
205
|
+
prevContentStyle: {
|
|
206
|
+
|
|
207
|
+
height: transProgress.to(
|
|
208
|
+
[0, 1],
|
|
209
|
+
[
|
|
210
|
+
prevPageState.bottomInset ? -(pageState.bottomInset - prevPageState.bottomInset) : 0,
|
|
211
|
+
pageState.bottomInset ? -(pageState.bottomInset - prevPageState.bottomInset) : 0,
|
|
212
|
+
],
|
|
213
|
+
),
|
|
214
|
+
opacity: transProgress.to((progress) => 1 - progress),
|
|
215
|
+
transformOrigin: "top",
|
|
216
|
+
},
|
|
217
|
+
},
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
const useCsrTransition: UseCsrTransition = {
|
|
221
|
+
...csrTranstionStyles,
|
|
222
|
+
pageBind: () => ({}),
|
|
223
|
+
pageClassName: "",
|
|
224
|
+
transDirection,
|
|
225
|
+
transUnitRange,
|
|
226
|
+
transUnit,
|
|
227
|
+
transPercent,
|
|
228
|
+
transProgress,
|
|
229
|
+
};
|
|
230
|
+
return useCsrTransition;
|
|
231
|
+
};
|
|
232
|
+
|
|
233
|
+
const useScaleOutTrans = ({ clientHeight, location, prevLocation, onBack, history }: RouteState): UseCsrTransition => {
|
|
234
|
+
const transDirection = "none";
|
|
235
|
+
const transUnit = useSpringValue(1, { config: { clamp: true } });
|
|
236
|
+
const transUnitRange = useMemo(() => [0, 1], []);
|
|
237
|
+
const transProgress = transUnit.to((unit) => unit);
|
|
238
|
+
const transPercent = transUnit.to([0, 1], [0, 100], "clamp");
|
|
239
|
+
const pageState = location.pathRoute.pageState;
|
|
240
|
+
const prevPageState = prevLocation?.pathRoute.pageState ?? defaultPageState;
|
|
241
|
+
|
|
242
|
+
useEffect(() => {
|
|
243
|
+
onBack.current.scaleOut = async () => {
|
|
244
|
+
await transUnit.start(transUnitRange[0]);
|
|
245
|
+
};
|
|
246
|
+
}, []);
|
|
247
|
+
useEffect(() => {
|
|
248
|
+
if (history.current.type === "forward") {
|
|
249
|
+
void transUnit.start(transUnitRange[0], { immediate: true });
|
|
250
|
+
void transUnit.start(transUnitRange[1], { config: { duration: 180 } });
|
|
251
|
+
} else {
|
|
252
|
+
void transUnit.start(transUnitRange[1], { immediate: true });
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
}, [location.pathname]);
|
|
256
|
+
|
|
257
|
+
const csrTranstionStyles: CsrTransitionStyles = {
|
|
258
|
+
topSafeArea: {
|
|
259
|
+
containerStyle: {
|
|
260
|
+
height: transProgress.to([0, 1], [prevPageState.topSafeArea, pageState.topSafeArea]),
|
|
261
|
+
},
|
|
262
|
+
},
|
|
263
|
+
bottomSafeArea: {
|
|
264
|
+
containerStyle: {
|
|
265
|
+
top: transProgress.to(
|
|
266
|
+
[0, 1],
|
|
267
|
+
[clientHeight - prevPageState.bottomSafeArea, clientHeight - pageState.bottomSafeArea],
|
|
268
|
+
),
|
|
269
|
+
height: transProgress.to([0, 1], [prevPageState.bottomSafeArea, pageState.bottomSafeArea]),
|
|
270
|
+
},
|
|
271
|
+
},
|
|
272
|
+
page: {
|
|
273
|
+
containerStyle: {
|
|
274
|
+
transform: transProgress.to((progress) => `scale(${0.96 + progress * 0.04})`),
|
|
275
|
+
},
|
|
276
|
+
contentStyle: {
|
|
277
|
+
paddingTop: pageState.topSafeArea + pageState.topInset,
|
|
278
|
+
paddingBottom: pageState.bottomInset + pageState.bottomSafeArea,
|
|
279
|
+
opacity: transProgress,
|
|
280
|
+
height: clientHeight,
|
|
281
|
+
},
|
|
282
|
+
},
|
|
283
|
+
prevPage: {
|
|
284
|
+
containerStyle: {
|
|
285
|
+
paddingTop: prevPageState.topSafeArea + prevPageState.topInset,
|
|
286
|
+
transform: transProgress.to((progress) => `scale(${1 - progress * 0.04})`),
|
|
287
|
+
},
|
|
288
|
+
contentStyle: {
|
|
289
|
+
opacity: transProgress.to((progress) => 1 - progress / 2),
|
|
290
|
+
},
|
|
291
|
+
},
|
|
292
|
+
topInset: {
|
|
293
|
+
containerStyle: {
|
|
294
|
+
top: transProgress.to([0, 1], [prevPageState.topSafeArea, pageState.topSafeArea]),
|
|
295
|
+
height: transProgress.to([0, 1], [prevPageState.topInset, pageState.topInset]),
|
|
296
|
+
},
|
|
297
|
+
contentStyle: {
|
|
298
|
+
opacity: transProgress,
|
|
299
|
+
},
|
|
300
|
+
prevContentStyle: {
|
|
301
|
+
opacity: transProgress.to((progress) => 1 - progress),
|
|
302
|
+
},
|
|
303
|
+
},
|
|
304
|
+
topLeftAction: {
|
|
305
|
+
containerStyle: {
|
|
306
|
+
top: transProgress.to([0, 1], [prevPageState.topSafeArea, pageState.topSafeArea]),
|
|
307
|
+
height: transProgress.to([0, 1], [prevPageState.topInset, pageState.topInset]),
|
|
308
|
+
},
|
|
309
|
+
contentStyle: {
|
|
310
|
+
opacity: transProgress,
|
|
311
|
+
},
|
|
312
|
+
prevContentStyle: {
|
|
313
|
+
opacity: transProgress.to((progress) => 1 - progress),
|
|
314
|
+
},
|
|
315
|
+
},
|
|
316
|
+
bottomInset: {
|
|
317
|
+
containerStyle: {
|
|
318
|
+
height: transProgress.to([0, 1], [prevPageState.bottomInset, pageState.bottomInset]),
|
|
319
|
+
top: transProgress.to(
|
|
320
|
+
[0, 1],
|
|
321
|
+
[
|
|
322
|
+
clientHeight - prevPageState.bottomInset - prevPageState.bottomSafeArea,
|
|
323
|
+
clientHeight - pageState.bottomInset - pageState.bottomSafeArea,
|
|
324
|
+
],
|
|
325
|
+
),
|
|
326
|
+
},
|
|
327
|
+
contentStyle: {
|
|
328
|
+
opacity: transProgress,
|
|
196
329
|
},
|
|
197
330
|
prevContentStyle: {
|
|
198
|
-
top: transProgress.to([0, 1], [0, -(pageState.bottomInset - prevPageState.bottomInset) * 2]),
|
|
199
331
|
opacity: transProgress.to((progress) => 1 - progress),
|
|
200
332
|
},
|
|
201
333
|
},
|
|
@@ -337,28 +469,10 @@ const useStackTrans = ({
|
|
|
337
469
|
),
|
|
338
470
|
},
|
|
339
471
|
contentStyle: {
|
|
340
|
-
top: transProgress.to(
|
|
341
|
-
[0, 1],
|
|
342
|
-
[
|
|
343
|
-
0,
|
|
344
|
-
0,
|
|
345
|
-
],
|
|
346
|
-
),
|
|
347
472
|
opacity: transProgress.to((progress) => progress),
|
|
348
|
-
|
|
349
|
-
transformOrigin: "top",
|
|
350
473
|
},
|
|
351
474
|
prevContentStyle: {
|
|
352
|
-
|
|
353
|
-
height: transProgress.to(
|
|
354
|
-
[0, 1],
|
|
355
|
-
[
|
|
356
|
-
prevPageState.bottomInset ? -(pageState.bottomInset - prevPageState.bottomInset) : 0,
|
|
357
|
-
pageState.bottomInset ? -(pageState.bottomInset - prevPageState.bottomInset) : 0,
|
|
358
|
-
],
|
|
359
|
-
),
|
|
360
475
|
opacity: transProgress.to((progress) => 1 - progress),
|
|
361
|
-
transformOrigin: "top",
|
|
362
476
|
},
|
|
363
477
|
},
|
|
364
478
|
};
|
|
@@ -388,7 +502,7 @@ const useBottomUpTrans = ({
|
|
|
388
502
|
const transUnit = useSpringValue(0, { config: { clamp: true } });
|
|
389
503
|
const transUnitRange = useMemo(() => [clientHeight, 0], []);
|
|
390
504
|
const transUnitReversed = transUnit.to((unit) => transUnitRange[0] - unit);
|
|
391
|
-
const transUnitRangeReversed = useMemo(() => [0,
|
|
505
|
+
const transUnitRangeReversed = useMemo(() => [0, clientHeight], []);
|
|
392
506
|
const transProgress = transUnitReversed.to(transUnitRangeReversed, [0, 1], "clamp");
|
|
393
507
|
const transPercent = transUnitReversed.to(transUnitRangeReversed, [0, 100], "clamp");
|
|
394
508
|
const initThreshold = useMemo(() => Math.floor(clientWidth / 3), []);
|
|
@@ -397,13 +511,13 @@ const useBottomUpTrans = ({
|
|
|
397
511
|
const prevPageState = prevLocation?.pathRoute.pageState ?? defaultPageState;
|
|
398
512
|
useEffect(() => {
|
|
399
513
|
onBack.current.bottomUp = async () => {
|
|
400
|
-
await transUnit.start(transUnitRange[0]);
|
|
514
|
+
await transUnit.start(transUnitRange[0], { config: { duration: 220, easing: linearEasing } });
|
|
401
515
|
};
|
|
402
516
|
}, []);
|
|
403
517
|
useEffect(() => {
|
|
404
518
|
if (history.current.type === "forward") {
|
|
405
519
|
void transUnit.start(transUnitRange[0], { immediate: true });
|
|
406
|
-
void transUnit.start(transUnitRange[1], { config: { duration:
|
|
520
|
+
void transUnit.start(transUnitRange[1], { config: { duration: 220, easing: linearEasing } });
|
|
407
521
|
} else {
|
|
408
522
|
void transUnit.start(transUnitRange[1], { immediate: true });
|
|
409
523
|
return;
|
|
@@ -495,14 +609,9 @@ const useBottomUpTrans = ({
|
|
|
495
609
|
),
|
|
496
610
|
},
|
|
497
611
|
contentStyle: {
|
|
498
|
-
top: transProgress.to(
|
|
499
|
-
[0, 1],
|
|
500
|
-
[0, prevPageState.bottomInset ? -(pageState.bottomInset - prevPageState.bottomInset) : 0],
|
|
501
|
-
),
|
|
502
612
|
opacity: transProgress.to((progress) => progress),
|
|
503
613
|
},
|
|
504
614
|
prevContentStyle: {
|
|
505
|
-
top: transProgress.to([0, 1], [0, -(pageState.bottomInset - prevPageState.bottomInset)]),
|
|
506
615
|
opacity: transProgress.to((progress) => 1 - progress),
|
|
507
616
|
},
|
|
508
617
|
},
|
|
@@ -625,6 +734,7 @@ export const useCsrValues = (rootRouteGuide: RouteGuide, pathRoutes: PathRoute[]
|
|
|
625
734
|
};
|
|
626
735
|
const useNonTransition = useNoneTrans(routeState);
|
|
627
736
|
const useFadeTransition = useFadeTrans(routeState);
|
|
737
|
+
const useScaleOutTransition = useScaleOutTrans(routeState);
|
|
628
738
|
const useStackTransition = useStackTrans(routeState);
|
|
629
739
|
const useBottomUpTransition = useBottomUpTrans(routeState);
|
|
630
740
|
const useCsrTransitionMap: { [key in TransitionType]: UseCsrTransition } = {
|
|
@@ -632,7 +742,7 @@ export const useCsrValues = (rootRouteGuide: RouteGuide, pathRoutes: PathRoute[]
|
|
|
632
742
|
fade: useFadeTransition,
|
|
633
743
|
stack: useStackTransition,
|
|
634
744
|
bottomUp: useBottomUpTransition,
|
|
635
|
-
scaleOut:
|
|
745
|
+
scaleOut: useScaleOutTransition,
|
|
636
746
|
};
|
|
637
747
|
|
|
638
748
|
useEffect(() => {
|