akanjs 2.3.5-rc.1 → 2.3.5-rc.3
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/fetch/fetchType/buildFetch.type.ts +8 -2
- package/fetch/fetchType/endpointFetch.type.ts +35 -14
- package/fetch/fetchType/sliceFetch.type.ts +42 -48
- package/fetch/types.ts +4 -17
- package/package.json +1 -1
- package/types/fetch/fetchType/buildFetch.type.d.ts +3 -2
- package/types/fetch/fetchType/endpointFetch.type.d.ts +17 -5
- package/types/fetch/fetchType/sliceFetch.type.d.ts +6 -6
- package/types/fetch/types.d.ts +2 -9
- package/ui/InfiniteScroll.tsx +31 -5
|
@@ -18,10 +18,16 @@ export type FetchProxySignalInput<
|
|
|
18
18
|
|
|
19
19
|
export type FetchSignalInput = FetchProxySignalInput | DatabaseSignal | ServiceSignal;
|
|
20
20
|
|
|
21
|
+
type MergeFetchParts<First, Second> = [First] extends [never]
|
|
22
|
+
? Second
|
|
23
|
+
: [Second] extends [never]
|
|
24
|
+
? First
|
|
25
|
+
: Assign<First, Second>;
|
|
26
|
+
|
|
21
27
|
export type FetchTypeOfSignal<Signal extends FetchSignalInput> = Signal extends { _FetchType: infer FetchType }
|
|
22
28
|
? FetchType
|
|
23
29
|
: Signal extends DatabaseSignal<infer _IntlCls, infer EndpCls, infer SlceCls, infer _SrvrCls>
|
|
24
|
-
? GetFetchTypeFromEndpoint<EndpCls, SlceCls
|
|
30
|
+
? MergeFetchParts<GetFetchTypeFromEndpoint<EndpCls, SlceCls>, GetFetchTypeFromSlice<SlceCls>>
|
|
25
31
|
: Signal extends ServiceSignal<infer _IntlCls, infer EndpCls, infer _SrvrCls>
|
|
26
32
|
? GetFetchTypeFromEndpoint<EndpCls>
|
|
27
33
|
: unknown;
|
|
@@ -41,7 +47,7 @@ type MergeDirectFetchTypes<
|
|
|
41
47
|
> = Signals extends readonly [infer First extends FetchSignalInput, ...infer Rest extends readonly FetchSignalInput[]]
|
|
42
48
|
? First extends { _FetchType: unknown }
|
|
43
49
|
? MergeDirectFetchTypes<Rest, Acc>
|
|
44
|
-
: MergeDirectFetchTypes<Rest,
|
|
50
|
+
: MergeDirectFetchTypes<Rest, MergeFetchParts<Acc, FetchTypeOfSignal<First>>>
|
|
45
51
|
: Acc;
|
|
46
52
|
|
|
47
53
|
export type MergeAllFetchTypes<Signals extends readonly FetchSignalInput[]> =
|
|
@@ -65,33 +65,53 @@ type PubsubSubscribeFn<E, Context> = (
|
|
|
65
65
|
]
|
|
66
66
|
) => () => void;
|
|
67
67
|
|
|
68
|
-
type PrimaryFetchFn<E, Context
|
|
69
|
-
|
|
68
|
+
type PrimaryFetchFn<E, Context, ReqType = EndpInfoReqType<E>> =
|
|
69
|
+
ReqType extends "query" | "mutation"
|
|
70
70
|
? QueryOrMutationFetchFn<E, Context>
|
|
71
|
-
:
|
|
71
|
+
: ReqType extends "message"
|
|
72
72
|
? MessageEmitFn<E, Context>
|
|
73
73
|
: never;
|
|
74
74
|
|
|
75
|
+
type UploadLikeArg = FileList | File | File[];
|
|
76
|
+
type HasUploadLikeArg<Args extends readonly unknown[]> = Extract<Args[number], UploadLikeArg> extends never ? false : true;
|
|
77
|
+
type RestApiArg<Arg> = Arg extends FileList ? FileList : Arg extends File | File[] ? FileList : Arg;
|
|
78
|
+
type RestApiArgs<Args extends readonly unknown[]> = {
|
|
79
|
+
[K in keyof Args]: RestApiArg<Args[K]>;
|
|
80
|
+
};
|
|
81
|
+
type UploadRestApiFetchFn<E, Context> = (
|
|
82
|
+
...args: [...RestApiArgs<EndpInfoArgs<E>>, fetchPolicy?: FetchPolicy]
|
|
83
|
+
) => Promise<EndpInfoReturns<E, Context>>;
|
|
84
|
+
|
|
75
85
|
type PrimaryFetchType<EInfoObj extends { [key: string]: EndpointInfo }, Context> = {
|
|
76
|
-
[K in keyof EInfoObj as EndpInfoReqType<EInfoObj[K]
|
|
77
|
-
?
|
|
78
|
-
:
|
|
86
|
+
[K in keyof EInfoObj as Extract<EndpInfoReqType<EInfoObj[K]>, "query" | "mutation" | "message"> extends never
|
|
87
|
+
? never
|
|
88
|
+
: K]: PrimaryFetchFn<EInfoObj[K], Context>;
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
type UploadRestApiFetchType<EInfoObj extends { [key: string]: EndpointInfo }, Context> = {
|
|
92
|
+
[K in keyof EInfoObj as Extract<EndpInfoReqType<EInfoObj[K]>, "mutation"> extends never
|
|
93
|
+
? never
|
|
94
|
+
: HasUploadLikeArg<EndpInfoArgs<EInfoObj[K]>> extends true
|
|
95
|
+
? K extends string
|
|
96
|
+
? `${K}RestApi`
|
|
97
|
+
: never
|
|
98
|
+
: never]: UploadRestApiFetchFn<EInfoObj[K], Context>;
|
|
79
99
|
};
|
|
80
100
|
|
|
81
101
|
type PubsubFetchType<EInfoObj extends { [key: string]: EndpointInfo }, Context> = {
|
|
82
|
-
[K in keyof EInfoObj as EndpInfoReqType<EInfoObj[K]> extends
|
|
83
|
-
?
|
|
102
|
+
[K in keyof EInfoObj as Extract<EndpInfoReqType<EInfoObj[K]>, "pubsub"> extends never
|
|
103
|
+
? never
|
|
104
|
+
: K extends string
|
|
84
105
|
? `subscribe${Capitalize<K>}`
|
|
85
|
-
: never
|
|
86
|
-
: never]: PubsubSubscribeFn<EInfoObj[K], Context>;
|
|
106
|
+
: never]: PubsubSubscribeFn<EInfoObj[K], Context>;
|
|
87
107
|
};
|
|
88
108
|
|
|
89
109
|
type MessageListenFetchType<EInfoObj extends { [key: string]: EndpointInfo }, Context> = {
|
|
90
|
-
[K in keyof EInfoObj as EndpInfoReqType<EInfoObj[K]> extends
|
|
91
|
-
?
|
|
110
|
+
[K in keyof EInfoObj as Extract<EndpInfoReqType<EInfoObj[K]>, "message"> extends never
|
|
111
|
+
? never
|
|
112
|
+
: K extends string
|
|
92
113
|
? `listen${Capitalize<K>}`
|
|
93
|
-
: never
|
|
94
|
-
: never]: MessageListenFn<EInfoObj[K], Context>;
|
|
114
|
+
: never]: MessageListenFn<EInfoObj[K], Context>;
|
|
95
115
|
};
|
|
96
116
|
|
|
97
117
|
export type GetFetchTypeFromEndpoint<
|
|
@@ -100,5 +120,6 @@ export type GetFetchTypeFromEndpoint<
|
|
|
100
120
|
_EndpointInfoObj extends { [key: string]: EndpointInfo } = EndpCls[typeof ENDPOINT_META],
|
|
101
121
|
_ReturnContext = EndpointReturnContextOf<SlceCls>,
|
|
102
122
|
> = PrimaryFetchType<_EndpointInfoObj, _ReturnContext> &
|
|
123
|
+
UploadRestApiFetchType<_EndpointInfoObj, _ReturnContext> &
|
|
103
124
|
PubsubFetchType<_EndpointInfoObj, _ReturnContext> &
|
|
104
125
|
MessageListenFetchType<_EndpointInfoObj, _ReturnContext>;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { GetStateObject, SLICE_META } from "akanjs/base";
|
|
2
2
|
import type { FetchPolicy } from "akanjs/common";
|
|
3
|
-
import type {
|
|
4
|
-
import type {
|
|
3
|
+
import type { DefaultOf, ProtoFile, PurifiedModel } from "akanjs/constant";
|
|
4
|
+
import type { ExtractSort, FilterInstance } from "akanjs/document";
|
|
5
5
|
import type { SliceCls, SliceInfo, SliceInfoArgs } from "akanjs/signal";
|
|
6
6
|
import type { ClientEdit, ClientInit, ClientView, EditReturn, InitReturn, ViewReturn } from "./appliedReturn.type";
|
|
7
7
|
|
|
@@ -16,12 +16,12 @@ export type SliceFetchDescriptor<
|
|
|
16
16
|
Full = unknown,
|
|
17
17
|
Light = unknown,
|
|
18
18
|
Insight = unknown,
|
|
19
|
-
PurifiedInput =
|
|
20
|
-
DefaultInput =
|
|
21
|
-
StateLight =
|
|
22
|
-
StateInsight =
|
|
19
|
+
PurifiedInput = unknown,
|
|
20
|
+
DefaultInput = unknown,
|
|
21
|
+
StateLight = unknown,
|
|
22
|
+
StateInsight = unknown,
|
|
23
23
|
Filter extends FilterInstance = FilterInstance,
|
|
24
|
-
Sort =
|
|
24
|
+
Sort = unknown,
|
|
25
25
|
> = {
|
|
26
26
|
sliceMap: SliceMap;
|
|
27
27
|
refName: RefName;
|
|
@@ -38,25 +38,21 @@ export type SliceFetchDescriptor<
|
|
|
38
38
|
sort: Sort;
|
|
39
39
|
};
|
|
40
40
|
|
|
41
|
-
export type SliceFetchDescriptorOf<SlceCls extends SliceCls> =
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
SlceCls["srv"]["db"]["_Sort"]
|
|
57
|
-
>
|
|
58
|
-
: never
|
|
59
|
-
: never;
|
|
41
|
+
export type SliceFetchDescriptorOf<SlceCls extends SliceCls> = SliceFetchDescriptor<
|
|
42
|
+
SlceCls[typeof SLICE_META],
|
|
43
|
+
SlceCls["baseName"],
|
|
44
|
+
SlceCls["srv"]["cnst"]["_CapitalizedRefName"],
|
|
45
|
+
SlceCls["srv"]["cnst"]["_Input"],
|
|
46
|
+
SlceCls["srv"]["cnst"]["_Full"],
|
|
47
|
+
SlceCls["srv"]["cnst"]["_Light"],
|
|
48
|
+
SlceCls["srv"]["cnst"]["_Insight"],
|
|
49
|
+
SlceCls["srv"]["cnst"]["_PurifiedInput"],
|
|
50
|
+
SlceCls["srv"]["cnst"]["_DefaultInput"],
|
|
51
|
+
GetStateObject<LightWithId<SlceCls["srv"]["cnst"]["_Light"]>>,
|
|
52
|
+
GetStateObject<SlceCls["srv"]["cnst"]["_Insight"]>,
|
|
53
|
+
SlceCls["srv"]["db"]["_Filter"],
|
|
54
|
+
SlceCls["srv"]["db"]["_Sort"]
|
|
55
|
+
>;
|
|
60
56
|
|
|
61
57
|
type _SliceMap<D extends SliceFetchDescriptor> = D["sliceMap"];
|
|
62
58
|
type _RefName<D extends SliceFetchDescriptor> = D["refName"];
|
|
@@ -134,27 +130,25 @@ type SliceGetInitFetch<D extends SliceFetchDescriptor> = {
|
|
|
134
130
|
>;
|
|
135
131
|
};
|
|
136
132
|
|
|
137
|
-
export type GetFetchTypeFromSliceDescriptor<Descriptor> =
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
>
|
|
157
|
-
: never;
|
|
133
|
+
export type GetFetchTypeFromSliceDescriptor<Descriptor extends SliceFetchDescriptor> = SliceListFetch<Descriptor> &
|
|
134
|
+
SliceInsightFetch<Descriptor> &
|
|
135
|
+
SliceInitFetch<Descriptor> &
|
|
136
|
+
SliceGetInitFetch<Descriptor> &
|
|
137
|
+
RawBaseSliceFetchType<
|
|
138
|
+
_RefName<Descriptor>,
|
|
139
|
+
_Input<Descriptor>,
|
|
140
|
+
_Full<Descriptor>,
|
|
141
|
+
_Light<Descriptor>,
|
|
142
|
+
_Cap<Descriptor>,
|
|
143
|
+
_PurifiedInput<Descriptor>
|
|
144
|
+
> &
|
|
145
|
+
AppliedBaseSliceFetchType<
|
|
146
|
+
_RefName<Descriptor>,
|
|
147
|
+
_Input<Descriptor>,
|
|
148
|
+
_Full<Descriptor>,
|
|
149
|
+
_Cap<Descriptor>,
|
|
150
|
+
_PurifiedInput<Descriptor>
|
|
151
|
+
>;
|
|
158
152
|
|
|
159
153
|
export type GetFetchTypeFromSlice<SlceCls extends SliceCls> = GetFetchTypeFromSliceDescriptor<
|
|
160
154
|
SliceFetchDescriptorOf<SlceCls>
|
|
@@ -180,7 +174,7 @@ type RawBaseSliceFetchType<
|
|
|
180
174
|
fetchPolicy?: FetchPolicy,
|
|
181
175
|
) => Promise<Full>;
|
|
182
176
|
} & {
|
|
183
|
-
[K in `remove${_CapitalizedRefName}`]: (id: string, fetchPolicy?: FetchPolicy) => Promise<
|
|
177
|
+
[K in `remove${_CapitalizedRefName}`]: (id: string, fetchPolicy?: FetchPolicy) => Promise<Full>;
|
|
184
178
|
};
|
|
185
179
|
|
|
186
180
|
type AppliedBaseSliceFetchType<
|
package/fetch/types.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { type
|
|
2
|
-
import type { DatabaseSignal } from "akanjs/signal";
|
|
1
|
+
import { type Environment, getEnv } from "akanjs/base";
|
|
3
2
|
import type { SliceMeta } from "./fetchType/appliedReturn.type";
|
|
4
3
|
|
|
5
4
|
/** Account data made available to services for the current app/environment. */
|
|
@@ -12,18 +11,6 @@ export const getDefaultAccount = (): Account => {
|
|
|
12
11
|
return { appName: env.appName, environment: env.environment };
|
|
13
12
|
};
|
|
14
13
|
|
|
15
|
-
type
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
? SliceMetaObj
|
|
19
|
-
: Signal extends DatabaseSignal<infer _IntlCls, infer _EndpCls, infer SlceCls, infer _SrvrCls>
|
|
20
|
-
? {
|
|
21
|
-
[K in `${SlceCls["baseName"]}${Capitalize<keyof SlceCls[typeof SLICE_META] & string>}`]: SliceMeta;
|
|
22
|
-
}
|
|
23
|
-
: Record<never, never>;
|
|
24
|
-
export type GetSliceMetaObjFromDatabaseSignals<
|
|
25
|
-
Signals extends readonly unknown[],
|
|
26
|
-
Acc extends Record<string, SliceMeta> = Record<never, never>,
|
|
27
|
-
> = Signals extends readonly [infer First, ...infer Rest]
|
|
28
|
-
? GetSliceMetaObjFromDatabaseSignals<Rest, Assign<Acc, GetSliceMetaObjFromSignal<First>>>
|
|
29
|
-
: Acc;
|
|
14
|
+
export type GetSliceMetaObjFromDatabaseSignals<Signals extends readonly unknown[]> = Signals extends readonly []
|
|
15
|
+
? Record<never, never>
|
|
16
|
+
: Record<string, SliceMeta>;
|
package/package.json
CHANGED
|
@@ -12,15 +12,16 @@ export type FetchProxySignalInput<FetchType = unknown, SliceMetaObj extends Reco
|
|
|
12
12
|
_SliceMetaObj: SliceMetaObj;
|
|
13
13
|
};
|
|
14
14
|
export type FetchSignalInput = FetchProxySignalInput | DatabaseSignal | ServiceSignal;
|
|
15
|
+
type MergeFetchParts<First, Second> = [First] extends [never] ? Second : [Second] extends [never] ? First : Assign<First, Second>;
|
|
15
16
|
export type FetchTypeOfSignal<Signal extends FetchSignalInput> = Signal extends {
|
|
16
17
|
_FetchType: infer FetchType;
|
|
17
|
-
} ? FetchType : Signal extends DatabaseSignal<infer _IntlCls, infer EndpCls, infer SlceCls, infer _SrvrCls> ? GetFetchTypeFromEndpoint<EndpCls, SlceCls
|
|
18
|
+
} ? FetchType : Signal extends DatabaseSignal<infer _IntlCls, infer EndpCls, infer SlceCls, infer _SrvrCls> ? MergeFetchParts<GetFetchTypeFromEndpoint<EndpCls, SlceCls>, GetFetchTypeFromSlice<SlceCls>> : Signal extends ServiceSignal<infer _IntlCls, infer EndpCls, infer _SrvrCls> ? GetFetchTypeFromEndpoint<EndpCls> : unknown;
|
|
18
19
|
type MergeProxyFetchTypes<Signals extends readonly FetchSignalInput[], Acc = Record<never, never>> = Signals extends readonly [infer First extends FetchSignalInput, ...infer Rest extends readonly FetchSignalInput[]] ? First extends {
|
|
19
20
|
_FetchType: infer FetchType;
|
|
20
21
|
} ? MergeProxyFetchTypes<Rest, Assign<Acc, FetchType>> : MergeProxyFetchTypes<Rest, Acc> : Acc;
|
|
21
22
|
type MergeDirectFetchTypes<Signals extends readonly FetchSignalInput[], Acc = Record<never, never>> = Signals extends readonly [infer First extends FetchSignalInput, ...infer Rest extends readonly FetchSignalInput[]] ? First extends {
|
|
22
23
|
_FetchType: unknown;
|
|
23
|
-
} ? MergeDirectFetchTypes<Rest, Acc> : MergeDirectFetchTypes<Rest,
|
|
24
|
+
} ? MergeDirectFetchTypes<Rest, Acc> : MergeDirectFetchTypes<Rest, MergeFetchParts<Acc, FetchTypeOfSignal<First>>> : Acc;
|
|
24
25
|
export type MergeAllFetchTypes<Signals extends readonly FetchSignalInput[]> = MergeProxyFetchTypes<Signals> extends infer ProxyFetch ? MergeDirectFetchTypes<Signals> extends infer DirectFetch ? Assign<ProxyFetch, DirectFetch> : never : never;
|
|
25
26
|
export type FetchClientType<Signals extends readonly FetchSignalInput[]> = FetchProxy<MergeAllFetchTypes<Signals>, GetSliceMetaObjFromDatabaseSignals<Signals>>;
|
|
26
27
|
export {};
|
|
@@ -18,23 +18,35 @@ type PubsubSubscribeFn<E, Context> = (...args: [
|
|
|
18
18
|
handleEvent: (data: EndpInfoReturns<E, Context>) => PromiseOrObject<void>,
|
|
19
19
|
options?: FetchPolicy
|
|
20
20
|
]) => () => void;
|
|
21
|
-
type PrimaryFetchFn<E, Context
|
|
21
|
+
type PrimaryFetchFn<E, Context, ReqType = EndpInfoReqType<E>> = ReqType extends "query" | "mutation" ? QueryOrMutationFetchFn<E, Context> : ReqType extends "message" ? MessageEmitFn<E, Context> : never;
|
|
22
|
+
type UploadLikeArg = FileList | File | File[];
|
|
23
|
+
type HasUploadLikeArg<Args extends readonly unknown[]> = Extract<Args[number], UploadLikeArg> extends never ? false : true;
|
|
24
|
+
type RestApiArg<Arg> = Arg extends FileList ? FileList : Arg extends File | File[] ? FileList : Arg;
|
|
25
|
+
type RestApiArgs<Args extends readonly unknown[]> = {
|
|
26
|
+
[K in keyof Args]: RestApiArg<Args[K]>;
|
|
27
|
+
};
|
|
28
|
+
type UploadRestApiFetchFn<E, Context> = (...args: [...RestApiArgs<EndpInfoArgs<E>>, fetchPolicy?: FetchPolicy]) => Promise<EndpInfoReturns<E, Context>>;
|
|
22
29
|
type PrimaryFetchType<EInfoObj extends {
|
|
23
30
|
[key: string]: EndpointInfo;
|
|
24
31
|
}, Context> = {
|
|
25
|
-
[K in keyof EInfoObj as EndpInfoReqType<EInfoObj[K]
|
|
32
|
+
[K in keyof EInfoObj as Extract<EndpInfoReqType<EInfoObj[K]>, "query" | "mutation" | "message"> extends never ? never : K]: PrimaryFetchFn<EInfoObj[K], Context>;
|
|
33
|
+
};
|
|
34
|
+
type UploadRestApiFetchType<EInfoObj extends {
|
|
35
|
+
[key: string]: EndpointInfo;
|
|
36
|
+
}, Context> = {
|
|
37
|
+
[K in keyof EInfoObj as Extract<EndpInfoReqType<EInfoObj[K]>, "mutation"> extends never ? never : HasUploadLikeArg<EndpInfoArgs<EInfoObj[K]>> extends true ? K extends string ? `${K}RestApi` : never : never]: UploadRestApiFetchFn<EInfoObj[K], Context>;
|
|
26
38
|
};
|
|
27
39
|
type PubsubFetchType<EInfoObj extends {
|
|
28
40
|
[key: string]: EndpointInfo;
|
|
29
41
|
}, Context> = {
|
|
30
|
-
[K in keyof EInfoObj as EndpInfoReqType<EInfoObj[K]
|
|
42
|
+
[K in keyof EInfoObj as Extract<EndpInfoReqType<EInfoObj[K]>, "pubsub"> extends never ? never : K extends string ? `subscribe${Capitalize<K>}` : never]: PubsubSubscribeFn<EInfoObj[K], Context>;
|
|
31
43
|
};
|
|
32
44
|
type MessageListenFetchType<EInfoObj extends {
|
|
33
45
|
[key: string]: EndpointInfo;
|
|
34
46
|
}, Context> = {
|
|
35
|
-
[K in keyof EInfoObj as EndpInfoReqType<EInfoObj[K]
|
|
47
|
+
[K in keyof EInfoObj as Extract<EndpInfoReqType<EInfoObj[K]>, "message"> extends never ? never : K extends string ? `listen${Capitalize<K>}` : never]: MessageListenFn<EInfoObj[K], Context>;
|
|
36
48
|
};
|
|
37
49
|
export type GetFetchTypeFromEndpoint<EndpCls extends EndpointCls, SlceCls extends SliceCls | never = never, _EndpointInfoObj extends {
|
|
38
50
|
[key: string]: EndpointInfo;
|
|
39
|
-
} = EndpCls[typeof ENDPOINT_META], _ReturnContext = EndpointReturnContextOf<SlceCls>> = PrimaryFetchType<_EndpointInfoObj, _ReturnContext> & PubsubFetchType<_EndpointInfoObj, _ReturnContext> & MessageListenFetchType<_EndpointInfoObj, _ReturnContext>;
|
|
51
|
+
} = EndpCls[typeof ENDPOINT_META], _ReturnContext = EndpointReturnContextOf<SlceCls>> = PrimaryFetchType<_EndpointInfoObj, _ReturnContext> & UploadRestApiFetchType<_EndpointInfoObj, _ReturnContext> & PubsubFetchType<_EndpointInfoObj, _ReturnContext> & MessageListenFetchType<_EndpointInfoObj, _ReturnContext>;
|
|
40
52
|
export {};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { GetStateObject, SLICE_META } from "akanjs/base";
|
|
2
2
|
import type { FetchPolicy } from "akanjs/common";
|
|
3
|
-
import type {
|
|
4
|
-
import type {
|
|
3
|
+
import type { DefaultOf, ProtoFile, PurifiedModel } from "akanjs/constant";
|
|
4
|
+
import type { ExtractSort, FilterInstance } from "akanjs/document";
|
|
5
5
|
import type { SliceCls, SliceInfo, SliceInfoArgs } from "akanjs/signal";
|
|
6
6
|
import type { ClientEdit, ClientInit, ClientView, EditReturn, InitReturn, ViewReturn } from "./appliedReturn.type";
|
|
7
7
|
type SliceInfoMap = {
|
|
@@ -12,7 +12,7 @@ type LightWithId<Light> = Light extends {
|
|
|
12
12
|
} ? Light : {
|
|
13
13
|
id: string;
|
|
14
14
|
};
|
|
15
|
-
export type SliceFetchDescriptor<SliceMap extends SliceInfoMap = SliceInfoMap, RefName extends string = string, CapRefName extends string = Capitalize<RefName>, Input = unknown, Full = unknown, Light = unknown, Insight = unknown, PurifiedInput =
|
|
15
|
+
export type SliceFetchDescriptor<SliceMap extends SliceInfoMap = SliceInfoMap, RefName extends string = string, CapRefName extends string = Capitalize<RefName>, Input = unknown, Full = unknown, Light = unknown, Insight = unknown, PurifiedInput = unknown, DefaultInput = unknown, StateLight = unknown, StateInsight = unknown, Filter extends FilterInstance = FilterInstance, Sort = unknown> = {
|
|
16
16
|
sliceMap: SliceMap;
|
|
17
17
|
refName: RefName;
|
|
18
18
|
capRefName: CapRefName;
|
|
@@ -27,7 +27,7 @@ export type SliceFetchDescriptor<SliceMap extends SliceInfoMap = SliceInfoMap, R
|
|
|
27
27
|
filter: Filter;
|
|
28
28
|
sort: Sort;
|
|
29
29
|
};
|
|
30
|
-
export type SliceFetchDescriptorOf<SlceCls extends SliceCls> =
|
|
30
|
+
export type SliceFetchDescriptorOf<SlceCls extends SliceCls> = SliceFetchDescriptor<SlceCls[typeof SLICE_META], SlceCls["baseName"], SlceCls["srv"]["cnst"]["_CapitalizedRefName"], SlceCls["srv"]["cnst"]["_Input"], SlceCls["srv"]["cnst"]["_Full"], SlceCls["srv"]["cnst"]["_Light"], SlceCls["srv"]["cnst"]["_Insight"], SlceCls["srv"]["cnst"]["_PurifiedInput"], SlceCls["srv"]["cnst"]["_DefaultInput"], GetStateObject<LightWithId<SlceCls["srv"]["cnst"]["_Light"]>>, GetStateObject<SlceCls["srv"]["cnst"]["_Insight"]>, SlceCls["srv"]["db"]["_Filter"], SlceCls["srv"]["db"]["_Sort"]>;
|
|
31
31
|
type _SliceMap<D extends SliceFetchDescriptor> = D["sliceMap"];
|
|
32
32
|
type _RefName<D extends SliceFetchDescriptor> = D["refName"];
|
|
33
33
|
type _Cap<D extends SliceFetchDescriptor> = D["capRefName"];
|
|
@@ -61,7 +61,7 @@ type SliceInitFetch<D extends SliceFetchDescriptor> = {
|
|
|
61
61
|
type SliceGetInitFetch<D extends SliceFetchDescriptor> = {
|
|
62
62
|
[Suffix in keyof _SliceMap<D> as Suffix extends string ? `get${_Cap<D>}Init${Capitalize<Suffix>}` : never]: (...args: [...SliceInfoArgs<_SliceMap<D>[Suffix]>, option?: _SliceFetchInitOption<D>]) => ClientInit<_RefName<D>, _Light<D>, _Insight<D>, SliceInfoArgs<_SliceMap<D>[Suffix]>, _Filter<D>, _Cap<D>, _StateLight<D>, _StateInsight<D>, _Sort<D>>;
|
|
63
63
|
};
|
|
64
|
-
export type GetFetchTypeFromSliceDescriptor<Descriptor
|
|
64
|
+
export type GetFetchTypeFromSliceDescriptor<Descriptor extends SliceFetchDescriptor> = SliceListFetch<Descriptor> & SliceInsightFetch<Descriptor> & SliceInitFetch<Descriptor> & SliceGetInitFetch<Descriptor> & RawBaseSliceFetchType<_RefName<Descriptor>, _Input<Descriptor>, _Full<Descriptor>, _Light<Descriptor>, _Cap<Descriptor>, _PurifiedInput<Descriptor>> & AppliedBaseSliceFetchType<_RefName<Descriptor>, _Input<Descriptor>, _Full<Descriptor>, _Cap<Descriptor>, _PurifiedInput<Descriptor>>;
|
|
65
65
|
export type GetFetchTypeFromSlice<SlceCls extends SliceCls> = GetFetchTypeFromSliceDescriptor<SliceFetchDescriptorOf<SlceCls>>;
|
|
66
66
|
type RawBaseSliceFetchType<RefName extends string, Input, Full, Light, _CapitalizedRefName extends string = Capitalize<RefName>, _PurifiedInput = PurifiedModel<Input>> = {
|
|
67
67
|
[K in RefName]: (id: string, fetchPolicy?: FetchPolicy) => Promise<Full>;
|
|
@@ -72,7 +72,7 @@ type RawBaseSliceFetchType<RefName extends string, Input, Full, Light, _Capitali
|
|
|
72
72
|
} & {
|
|
73
73
|
[K in `update${_CapitalizedRefName}`]: (id: string, input: _PurifiedInput, fetchPolicy?: FetchPolicy) => Promise<Full>;
|
|
74
74
|
} & {
|
|
75
|
-
[K in `remove${_CapitalizedRefName}`]: (id: string, fetchPolicy?: FetchPolicy) => Promise<
|
|
75
|
+
[K in `remove${_CapitalizedRefName}`]: (id: string, fetchPolicy?: FetchPolicy) => Promise<Full>;
|
|
76
76
|
};
|
|
77
77
|
type AppliedBaseSliceFetchType<RefName extends string, Input, Full, _CapitalizedRefName extends string = Capitalize<RefName>, _PurifiedInput = PurifiedModel<Input>> = {
|
|
78
78
|
[K in `view${_CapitalizedRefName}`]: (id: string, option?: FetchPolicy) => Promise<ViewReturn<RefName, Full>>;
|
package/types/fetch/types.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { type
|
|
2
|
-
import type { DatabaseSignal } from "akanjs/signal";
|
|
1
|
+
import { type Environment } from "akanjs/base";
|
|
3
2
|
import type { SliceMeta } from "./fetchType/appliedReturn.type";
|
|
4
3
|
/** Account data made available to services for the current app/environment. */
|
|
5
4
|
export type Account<AddData = unknown> = {
|
|
@@ -7,10 +6,4 @@ export type Account<AddData = unknown> = {
|
|
|
7
6
|
environment: Environment;
|
|
8
7
|
} & AddData;
|
|
9
8
|
export declare const getDefaultAccount: () => Account;
|
|
10
|
-
type
|
|
11
|
-
_SliceMetaObj: infer SliceMetaObj extends Record<string, SliceMeta>;
|
|
12
|
-
} ? SliceMetaObj : Signal extends DatabaseSignal<infer _IntlCls, infer _EndpCls, infer SlceCls, infer _SrvrCls> ? {
|
|
13
|
-
[K in `${SlceCls["baseName"]}${Capitalize<keyof SlceCls[typeof SLICE_META] & string>}`]: SliceMeta;
|
|
14
|
-
} : Record<never, never>;
|
|
15
|
-
export type GetSliceMetaObjFromDatabaseSignals<Signals extends readonly unknown[], Acc extends Record<string, SliceMeta> = Record<never, never>> = Signals extends readonly [infer First, ...infer Rest] ? GetSliceMetaObjFromDatabaseSignals<Rest, Assign<Acc, GetSliceMetaObjFromSignal<First>>> : Acc;
|
|
16
|
-
export {};
|
|
9
|
+
export type GetSliceMetaObjFromDatabaseSignals<Signals extends readonly unknown[]> = Signals extends readonly [] ? Record<never, never> : Record<string, SliceMeta>;
|
package/ui/InfiniteScroll.tsx
CHANGED
|
@@ -22,6 +22,7 @@ export const InfiniteScroll = ({
|
|
|
22
22
|
reverse,
|
|
23
23
|
}: InfiniteScrollProps) => {
|
|
24
24
|
const [isFetching, setIsFetching] = useState(false);
|
|
25
|
+
const isFetchingRef = useRef(false);
|
|
25
26
|
const target = useRef<HTMLDivElement>(null);
|
|
26
27
|
const page = useRef<number>(currentPage);
|
|
27
28
|
const totalPages = Math.ceil(total / (itemsPerPage || 1));
|
|
@@ -38,14 +39,39 @@ export const InfiniteScroll = ({
|
|
|
38
39
|
}, []);
|
|
39
40
|
|
|
40
41
|
const fetchMoreItems = async () => {
|
|
41
|
-
if (
|
|
42
|
+
if (isFetchingRef.current) return;
|
|
42
43
|
const nextPage = page.current + 1;
|
|
43
44
|
if (nextPage > totalPages) return;
|
|
45
|
+
|
|
46
|
+
const scroller = reverse ? document.scrollingElement : null;
|
|
47
|
+
const prevScrollHeight = scroller?.scrollHeight ?? 0;
|
|
48
|
+
const prevScrollTop = scroller?.scrollTop ?? 0;
|
|
49
|
+
|
|
50
|
+
isFetchingRef.current = true;
|
|
44
51
|
setIsFetching(true);
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
52
|
+
try {
|
|
53
|
+
await onAddPage(nextPage);
|
|
54
|
+
onPageSelect(nextPage);
|
|
55
|
+
page.current = nextPage;
|
|
56
|
+
|
|
57
|
+
const restoreScroll = () => {
|
|
58
|
+
if (scroller) {
|
|
59
|
+
scroller.scrollTop = prevScrollTop + (scroller.scrollHeight - prevScrollHeight);
|
|
60
|
+
}
|
|
61
|
+
isFetchingRef.current = false;
|
|
62
|
+
setIsFetching(false);
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
if (typeof requestAnimationFrame === "function") {
|
|
66
|
+
requestAnimationFrame(restoreScroll);
|
|
67
|
+
} else {
|
|
68
|
+
restoreScroll();
|
|
69
|
+
}
|
|
70
|
+
} catch (error) {
|
|
71
|
+
isFetchingRef.current = false;
|
|
72
|
+
setIsFetching(false);
|
|
73
|
+
throw error;
|
|
74
|
+
}
|
|
49
75
|
};
|
|
50
76
|
|
|
51
77
|
return (
|