-
-
Notifications
You must be signed in to change notification settings - Fork 19
/
Copy pathui-scroll.datasource.ts
76 lines (64 loc) · 2.46 KB
/
ui-scroll.datasource.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
import { BehaviorSubject, Subject } from 'rxjs';
import {
makeDatasource,
AdapterPropName,
EMPTY_ITEM,
IDatasource,
IDatasourceConstructed,
IReactivePropConfig,
IAdapterConfig,
IAdapterItem,
IAdapter,
} from './vscroll';
interface IReactiveOverride<Item = unknown> {
init$: Subject<boolean>;
isLoading$: Subject<boolean>;
loopPending$: Subject<boolean>;
firstVisible$: BehaviorSubject<IAdapterItem<Item>>;
lastVisible$: BehaviorSubject<IAdapterItem<Item>>;
bof$: Subject<boolean>;
eof$: Subject<boolean>;
}
type _Omit<T, K> = Pick<T, Exclude<keyof T, K>>;
interface IAngularAdapter<Data = unknown>
extends _Omit<IAdapter<Data>, keyof IReactiveOverride<Data>>, IReactiveOverride<Data> { }
interface IAngularDatasource<Data = unknown> extends _Omit<IDatasource<Data>, 'adapter'> {
adapter?: IAngularAdapter<Data>;
}
interface IAngularDatasourceConstructed<Data = unknown> extends _Omit<IDatasourceConstructed<Data>, 'adapter'> {
adapter: IAngularAdapter<Data>;
}
const getBooleanSubjectPropConfig = (): IReactivePropConfig => ({
source: new Subject<boolean>(),
emit: (source, value) => (source as Subject<boolean>).next(value as boolean)
});
const getItemBehaviorSubjectPropConfig = (): IReactivePropConfig => ({
source: new BehaviorSubject<IAdapterItem>(EMPTY_ITEM),
emit: (source, value) => (source as BehaviorSubject<IAdapterItem>).next(value as IAdapterItem)
});
const getAdapterConfig = (): IAdapterConfig => ({
mock: false,
reactive: {
[AdapterPropName.init$]: getBooleanSubjectPropConfig(),
[AdapterPropName.isLoading$]: getBooleanSubjectPropConfig(),
[AdapterPropName.loopPending$]: getBooleanSubjectPropConfig(),
[AdapterPropName.firstVisible$]: getItemBehaviorSubjectPropConfig(),
[AdapterPropName.lastVisible$]: getItemBehaviorSubjectPropConfig(),
[AdapterPropName.bof$]: getBooleanSubjectPropConfig(),
[AdapterPropName.eof$]: getBooleanSubjectPropConfig(),
}
});
const makeAngularDatasource = () => class <T = unknown> implements IAngularDatasourceConstructed<T> {
get: IAngularDatasource<T>['get'];
settings?: IAngularDatasource<T>['settings'];
devSettings?: IAngularDatasource<T>['devSettings'];
adapter: IAngularAdapter<T>;
constructor(_ds: IAngularDatasource<T>) { }
};
const AngularDatasource =
makeDatasource(getAdapterConfig) as unknown as ReturnType<typeof makeAngularDatasource>;
export {
IAngularAdapter as IAdapter,
IAngularDatasource as IDatasource,
AngularDatasource as Datasource,
};