@recats/cdeebee 2.3.1 → 2.3.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/dist/actions.d.ts +24 -0
- package/dist/cdeebee.js +1175 -0
- package/dist/cdeebee.umd.cjs +3 -0
- package/dist/definition.d.ts +208 -0
- package/dist/helpers.d.ts +22 -0
- package/dist/index.d.ts +6 -0
- package/dist/reducer.d.ts +8 -0
- package/dist/request.d.ts +8 -0
- package/package.json +6 -2
- package/.editorconfig +0 -8
- package/.travis.yml +0 -17
- package/eslint.config.mjs +0 -26
- package/lib/actions.ts +0 -65
- package/lib/definition.ts +0 -250
- package/lib/helpers.ts +0 -138
- package/lib/index.ts +0 -26
- package/lib/reducer.ts +0 -93
- package/lib/request.ts +0 -200
- package/tsconfig.json +0 -13
- package/tslint.json +0 -20
- package/vite.config.mjs +0 -26
package/lib/definition.ts
DELETED
|
@@ -1,250 +0,0 @@
|
|
|
1
|
-
import { Dispatch } from 'redux';
|
|
2
|
-
|
|
3
|
-
export enum cdeebeeTypes {
|
|
4
|
-
CDEEBEE_REQUESTMANAGER_SHIFT = '@@cdeebee/REQUESTMANAGER_SHIFT',
|
|
5
|
-
CDEEBEE_REQUESTMANAGER_SET = '@@cdeebee/REQUESTMANAGER_SET',
|
|
6
|
-
CDEEBEE_ERRORHANDLER_SET = '@@cdeebee/ERRORHANDLER_SET',
|
|
7
|
-
|
|
8
|
-
CDEEBEE_ENTITY_CHANGE_FIELD = '@@cdeebee/ENTITY_CHANGE_FIELD',
|
|
9
|
-
CDEEBEE_ENTITY_UNSAFE_UPDATE_STORE = '@@cdeebee/ENTITY_UNSAFE_UPDATE_STORE',
|
|
10
|
-
CDEEBEE_RESET_ENTITY = '@@cdeebee/RESET_ENTITY',
|
|
11
|
-
CDEEBEE_SET_ENTITY = '@@cdeebee/SET_ENTITY',
|
|
12
|
-
CDEEBEEE_UPDATE = '@@cdeebee/UPDATE',
|
|
13
|
-
CDEEBEEE_DROP = '@@cdeebee/DROP',
|
|
14
|
-
CDEEBEEE_DROP_PATH = '@@cdeebee/DROP_PATH',
|
|
15
|
-
|
|
16
|
-
CDEEBEE_INTERNAL_ERROR = '@@cdeebee/INTERNAL_ERROR',
|
|
17
|
-
CDEEBEE_REQUEST_ABORTED = '@@cdeebee/REQUEST_ABORTED',
|
|
18
|
-
|
|
19
|
-
CDEEBEEE_DROP_REQUEST_BY_API_URL = '@@cdeebee/DROP_REQUEST_BY_API_URL',
|
|
20
|
-
CDEEBEEE_DROP_ERROR_BY_API_URL = '@@cdeebee/DROP_ERROR_BY_API_URL',
|
|
21
|
-
|
|
22
|
-
CHANGE_ROUTE = '@@router/LOCATION_CHANGE',
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export enum cdeebeeEntityState {
|
|
26
|
-
NEW = 'NEW',
|
|
27
|
-
EDITING = 'EDITING',
|
|
28
|
-
NORMAL = 'NORMAL',
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export enum cdeebeeMergeStrategy {
|
|
32
|
-
merge = 'merge',
|
|
33
|
-
replace = 'replace',
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export type IDefaultOption = {
|
|
37
|
-
headers?: object;
|
|
38
|
-
files?: File[];
|
|
39
|
-
fileKey?: string;
|
|
40
|
-
bodyKey?: string;
|
|
41
|
-
primaryKey?: string;
|
|
42
|
-
responseKeyCode?: string;
|
|
43
|
-
requestCancel?: boolean;
|
|
44
|
-
updateStore?: boolean;
|
|
45
|
-
mergeListStrategy?: { [key: string]: cdeebeeMergeStrategy };
|
|
46
|
-
normalize?: (t: any) => void;
|
|
47
|
-
preUpdate?: (payload: object) => void;
|
|
48
|
-
postUpdate?: (payload: object) => void;
|
|
49
|
-
preError?: (payload: object) => void;
|
|
50
|
-
postError?: (payload: object) => void;
|
|
51
|
-
method?: 'POST' | 'GET' | 'PUT' | 'DELETE';
|
|
52
|
-
globalErrorHandler?: (
|
|
53
|
-
error: object,
|
|
54
|
-
request: object,
|
|
55
|
-
meta: { requestStartTime: Date, requestEndTime: Date, requestID: string }
|
|
56
|
-
)
|
|
57
|
-
=> (dispatch: Dispatch, getState: () => object)
|
|
58
|
-
=> void;
|
|
59
|
-
};
|
|
60
|
-
|
|
61
|
-
export type IResponsePropObject = {
|
|
62
|
-
requestID: string;
|
|
63
|
-
controller: AbortController;
|
|
64
|
-
updateStore: boolean;
|
|
65
|
-
data: object;
|
|
66
|
-
requestCancel: boolean;
|
|
67
|
-
requestApi: string;
|
|
68
|
-
response: {
|
|
69
|
-
[params: string]: unknown,
|
|
70
|
-
};
|
|
71
|
-
requestStartTime?: Date;
|
|
72
|
-
mergeListStrategy?: { [key: string]: cdeebeeMergeStrategy };
|
|
73
|
-
normalize?: (t: any) => void;
|
|
74
|
-
preUpdate?: (payload: object) => void;
|
|
75
|
-
postUpdate?: (payload: object) => void;
|
|
76
|
-
preError?: (payload: object) => void;
|
|
77
|
-
postError?: (payload: object) => void;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
export interface IRequestOptions extends IDefaultOption {
|
|
81
|
-
api: string;
|
|
82
|
-
data?: object;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
export interface IEntity {
|
|
86
|
-
__entity?: { __state: cdeebeeEntityState; };
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
export type cdeebeeValueList = {
|
|
90
|
-
key: (string | number)[];
|
|
91
|
-
value: any;
|
|
92
|
-
};
|
|
93
|
-
|
|
94
|
-
export type cdeebeActiveRequest = {
|
|
95
|
-
api: string;
|
|
96
|
-
requestCancel: object;
|
|
97
|
-
controller: {
|
|
98
|
-
abort: () => void;
|
|
99
|
-
};
|
|
100
|
-
};
|
|
101
|
-
|
|
102
|
-
export type EntityID = string | number;
|
|
103
|
-
|
|
104
|
-
// tslint:disable-next-line:class-name
|
|
105
|
-
export interface cdeebeeIActions {
|
|
106
|
-
dropRequestByApiUrl: (api: string) => void;
|
|
107
|
-
dropErrorsByApiUrl: (api: string) => void;
|
|
108
|
-
dropCdeebeePath: (path: (string | number)[]) => void;
|
|
109
|
-
|
|
110
|
-
setKeyValue: (
|
|
111
|
-
entityList: string, entityID: EntityID, valueList: cdeebeeValueList[],
|
|
112
|
-
) => void;
|
|
113
|
-
unsafe_updateStore: (entityList: string, entityID: EntityID, value: any) => void;
|
|
114
|
-
|
|
115
|
-
commitEntity: (entityList: string, entityID: EntityID, entity: object) => void;
|
|
116
|
-
resetEntity: (entityList: string, entityID: EntityID) => void;
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
export type ActionCreator<A> = (...args: any[]) => A;
|
|
120
|
-
|
|
121
|
-
export class CdeebeeRequest {
|
|
122
|
-
public requestObject: any;
|
|
123
|
-
|
|
124
|
-
// @ts-expect-error okok
|
|
125
|
-
constructor(
|
|
126
|
-
defaultRequest: object,
|
|
127
|
-
options: {
|
|
128
|
-
fileKey?: string,
|
|
129
|
-
bodyKey?: string,
|
|
130
|
-
method?: string,
|
|
131
|
-
primaryKey?: string,
|
|
132
|
-
normalize?: (data: object) => object,
|
|
133
|
-
mergeListStrategy?: { [key: string]: cdeebeeMergeStrategy },
|
|
134
|
-
responseKeyCode?: string,
|
|
135
|
-
header?: object,
|
|
136
|
-
},
|
|
137
|
-
);
|
|
138
|
-
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
export interface CDEEBEERequestManager {
|
|
142
|
-
readonly type: cdeebeeTypes.CDEEBEE_REQUESTMANAGER_SET;
|
|
143
|
-
readonly payload: object;
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
export interface CDEEBEERequestShift {
|
|
147
|
-
readonly type: cdeebeeTypes.CDEEBEE_REQUESTMANAGER_SHIFT;
|
|
148
|
-
readonly payload?: any;
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
export interface CDEEBEEUpdate {
|
|
152
|
-
readonly type: cdeebeeTypes.CDEEBEEE_UPDATE;
|
|
153
|
-
readonly payload: { api: string, cleanResponse: object };
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
export interface CDEEBEEErrorSet {
|
|
157
|
-
readonly type: cdeebeeTypes.CDEEBEE_ERRORHANDLER_SET;
|
|
158
|
-
readonly payload: { api: string, cleanResponse: object };
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
export interface CDEEBEEChangeRoute {
|
|
162
|
-
readonly type?: any;
|
|
163
|
-
readonly payload?: any;
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
export type IRequestAction =
|
|
167
|
-
| CDEEBEERequestManager
|
|
168
|
-
| CDEEBEERequestShift
|
|
169
|
-
| CDEEBEEUpdate
|
|
170
|
-
| CDEEBEEErrorSet
|
|
171
|
-
| CDEEBEEChangeRoute
|
|
172
|
-
;
|
|
173
|
-
|
|
174
|
-
export interface IRequestState {
|
|
175
|
-
activeRequest: cdeebeActiveRequest[];
|
|
176
|
-
requestByApiUrl: object;
|
|
177
|
-
errorHandler: object;
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
export interface CDEEBEEUpadte {
|
|
181
|
-
readonly type: cdeebeeTypes.CDEEBEEE_UPDATE;
|
|
182
|
-
readonly payload: {
|
|
183
|
-
response: object;
|
|
184
|
-
};
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
export interface CDEEBEEChangeField {
|
|
188
|
-
readonly type: cdeebeeTypes.CDEEBEE_ENTITY_CHANGE_FIELD;
|
|
189
|
-
readonly payload: {
|
|
190
|
-
valueList: cdeebeeValueList[],
|
|
191
|
-
entityList: string,
|
|
192
|
-
entityID: number | string,
|
|
193
|
-
};
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
export interface CDEEBEESetEntity {
|
|
197
|
-
readonly type: cdeebeeTypes.CDEEBEE_SET_ENTITY;
|
|
198
|
-
readonly payload: {
|
|
199
|
-
entityList: string,
|
|
200
|
-
entityID: number | string,
|
|
201
|
-
entity: any,
|
|
202
|
-
};
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
export interface CDEEBEEUnsafeUpdateStore {
|
|
206
|
-
readonly type: cdeebeeTypes.CDEEBEE_ENTITY_UNSAFE_UPDATE_STORE;
|
|
207
|
-
readonly payload: {
|
|
208
|
-
entityList: string,
|
|
209
|
-
entityID: number | string,
|
|
210
|
-
value: any;
|
|
211
|
-
};
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
export interface CDEEBEEResetEntity {
|
|
215
|
-
readonly type: cdeebeeTypes.CDEEBEE_RESET_ENTITY;
|
|
216
|
-
readonly payload: {
|
|
217
|
-
entityList: string,
|
|
218
|
-
entityID: number | string,
|
|
219
|
-
};
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
export interface CDEEBEEDrop {
|
|
223
|
-
readonly type: cdeebeeTypes.CDEEBEEE_DROP;
|
|
224
|
-
readonly payload?: any;
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
export interface CDEEBEEDropPath {
|
|
228
|
-
readonly type: cdeebeeTypes.CDEEBEEE_DROP_PATH;
|
|
229
|
-
readonly payload: { path: (string | number)[] };
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
export type ICdeebee =
|
|
233
|
-
| CDEEBEEUpadte
|
|
234
|
-
| CDEEBEEChangeField
|
|
235
|
-
| CDEEBEESetEntity
|
|
236
|
-
| CDEEBEEResetEntity
|
|
237
|
-
| CDEEBEEDrop
|
|
238
|
-
| CDEEBEEDropPath
|
|
239
|
-
| CDEEBEEUnsafeUpdateStore
|
|
240
|
-
;
|
|
241
|
-
|
|
242
|
-
export interface IDefaultNormalize {
|
|
243
|
-
response: {
|
|
244
|
-
responseStatus: string,
|
|
245
|
-
[params: string]: any,
|
|
246
|
-
};
|
|
247
|
-
cdeebee: object;
|
|
248
|
-
primaryKey: string;
|
|
249
|
-
mergeListStrategy: { [key: string]: cdeebeeMergeStrategy };
|
|
250
|
-
}
|
package/lib/helpers.ts
DELETED
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
/* tslint:disable max-line-length */
|
|
2
|
-
import { assocPath, mergeDeepRight, omit } from 'ramda';
|
|
3
|
-
import {
|
|
4
|
-
cdeebeActiveRequest,
|
|
5
|
-
cdeebeeEntityState,
|
|
6
|
-
cdeebeeMergeStrategy,
|
|
7
|
-
cdeebeeValueList,
|
|
8
|
-
IDefaultNormalize,
|
|
9
|
-
IEntity
|
|
10
|
-
} from './definition';
|
|
11
|
-
|
|
12
|
-
const omitKeys = <T>(entity: T): T & any => omit<T, any>(['__entity', '__state'], entity);
|
|
13
|
-
|
|
14
|
-
export const dropRequestFromArray = (activeRequest: cdeebeActiveRequest[]): cdeebeActiveRequest[] => (
|
|
15
|
-
activeRequest.filter(q => {
|
|
16
|
-
if (q.requestCancel) {
|
|
17
|
-
requestCancel(q);
|
|
18
|
-
return false;
|
|
19
|
-
}
|
|
20
|
-
return true;
|
|
21
|
-
})
|
|
22
|
-
);
|
|
23
|
-
|
|
24
|
-
export const requestCancel = (request: cdeebeActiveRequest): void => {
|
|
25
|
-
if (request.controller && request.controller.abort instanceof Function) {
|
|
26
|
-
request.controller.abort();
|
|
27
|
-
}
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
export const checkNetworkActivity = (activeRequest: cdeebeActiveRequest[], apiUrl: string | string[]): boolean => {
|
|
31
|
-
if (!apiUrl || activeRequest.length === 0) {
|
|
32
|
-
return false;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
const apiUrlList = apiUrl instanceof Array ? apiUrl : [apiUrl];
|
|
36
|
-
const activeLinks: any = activeRequest.map(q => q.api);
|
|
37
|
-
for (let i = 0; i < apiUrlList.length; i += 1) {
|
|
38
|
-
if (activeLinks.includes(apiUrlList[i])) {
|
|
39
|
-
return true;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
return false;
|
|
44
|
-
};
|
|
45
|
-
|
|
46
|
-
export const getSubEntity = <T>(entity: T & IEntity): { __state: cdeebeeEntityState } | (T & IEntity) => Object.prototype.hasOwnProperty.call(entity, '__entity') ? entity.__entity! : entity;
|
|
47
|
-
|
|
48
|
-
export const getEntityState = <T>(entity: T & IEntity): cdeebeeEntityState => {
|
|
49
|
-
// @ts-expect-error okok
|
|
50
|
-
const entityState = entity?.__entity?.__state || entity?.__state;
|
|
51
|
-
if (!entityState) {
|
|
52
|
-
return cdeebeeEntityState.NORMAL;
|
|
53
|
-
}
|
|
54
|
-
return entityState;
|
|
55
|
-
};
|
|
56
|
-
|
|
57
|
-
export const insertEntity = (entity: { __state: string }) => {
|
|
58
|
-
entity.__state = cdeebeeEntityState.NEW;
|
|
59
|
-
return entity;
|
|
60
|
-
};
|
|
61
|
-
|
|
62
|
-
export const commitEntity = <T>(entity: T & IEntity): T => {
|
|
63
|
-
const state = getEntityState(entity);
|
|
64
|
-
if (state === cdeebeeEntityState.NORMAL) {
|
|
65
|
-
// tslint:disable-next-line
|
|
66
|
-
console.warn('commit works only in editing and new states');
|
|
67
|
-
return entity;
|
|
68
|
-
}
|
|
69
|
-
return omitKeys<T>(entity);
|
|
70
|
-
};
|
|
71
|
-
|
|
72
|
-
export const resetEntity = <T>(entity: T & IEntity): T => {
|
|
73
|
-
const state = getEntityState(entity);
|
|
74
|
-
if (state === cdeebeeEntityState.NORMAL) {
|
|
75
|
-
// tslint:disable-next-line
|
|
76
|
-
console.warn('reset works only in editing and new states');
|
|
77
|
-
return entity;
|
|
78
|
-
}
|
|
79
|
-
return omitKeys<T>(entity);
|
|
80
|
-
};
|
|
81
|
-
|
|
82
|
-
export const editEntity = (store: IEntity & { [key: string]: any }, list: string, id: number | string) => {
|
|
83
|
-
const arrayList = store[list];
|
|
84
|
-
const state = getEntityState(arrayList[id]);
|
|
85
|
-
|
|
86
|
-
if (state === cdeebeeEntityState.EDITING) {
|
|
87
|
-
return store;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
const newReturnStore = assocPath([list, id, '__entity'], arrayList[id], store);
|
|
91
|
-
return assocPath([list, id, '__entity', '__state'], cdeebeeEntityState.EDITING, newReturnStore);
|
|
92
|
-
};
|
|
93
|
-
|
|
94
|
-
export const batchingUpdate = (
|
|
95
|
-
state: object,
|
|
96
|
-
valueList: cdeebeeValueList[],
|
|
97
|
-
prePath?: (string | number)[],
|
|
98
|
-
) => {
|
|
99
|
-
const prePathEnity = prePath ? prePath : [];
|
|
100
|
-
|
|
101
|
-
let returnState: object = state;
|
|
102
|
-
|
|
103
|
-
for (let i = 0; i < valueList.length; i++) {
|
|
104
|
-
const arr = valueList[i];
|
|
105
|
-
returnState = assocPath([...prePathEnity, ...arr.key], arr.value, returnState);
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
return returnState;
|
|
109
|
-
};
|
|
110
|
-
|
|
111
|
-
export const defaultNormalize: (d: IDefaultNormalize) => object = (
|
|
112
|
-
{
|
|
113
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
114
|
-
response: { responseStatus, ...response },
|
|
115
|
-
cdeebee, mergeListStrategy, primaryKey,
|
|
116
|
-
},
|
|
117
|
-
) => {
|
|
118
|
-
const keys = Object.keys(response);
|
|
119
|
-
for (const key of keys) {
|
|
120
|
-
const newStorageData: any = {};
|
|
121
|
-
if (response[key] instanceof Object && Object.prototype.hasOwnProperty.call(response[key], primaryKey)) {
|
|
122
|
-
for (const element of response[key].data) {
|
|
123
|
-
newStorageData[element[response[key][primaryKey]]] = element;
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
if (mergeListStrategy[key] === cdeebeeMergeStrategy.replace) {
|
|
127
|
-
response[key] = newStorageData;
|
|
128
|
-
} else {
|
|
129
|
-
// @ts-expect-error okok
|
|
130
|
-
response[key] = mergeDeepRight(cdeebee[key], newStorageData);
|
|
131
|
-
}
|
|
132
|
-
} else if (response[key] === null || response[key] === undefined || typeof response[key] === 'string') {
|
|
133
|
-
response = omit([key], response);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
return response;
|
|
138
|
-
};
|
package/lib/index.ts
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { cdeebee, requestManager } from './reducer';
|
|
2
|
-
import CdeebeeRequest from './request';
|
|
3
|
-
import * as cdeebeeHelpers from './helpers';
|
|
4
|
-
import {
|
|
5
|
-
cdeebeeTypes,
|
|
6
|
-
cdeebeeMergeStrategy,
|
|
7
|
-
cdeebeeEntityState,
|
|
8
|
-
type cdeebeeValueList,
|
|
9
|
-
type cdeebeActiveRequest,
|
|
10
|
-
type cdeebeeIActions,
|
|
11
|
-
} from './definition';
|
|
12
|
-
import * as cdeebeeActions from './actions';
|
|
13
|
-
|
|
14
|
-
export {
|
|
15
|
-
cdeebeeValueList,
|
|
16
|
-
cdeebee,
|
|
17
|
-
cdeebeeHelpers,
|
|
18
|
-
requestManager,
|
|
19
|
-
CdeebeeRequest,
|
|
20
|
-
cdeebeeTypes,
|
|
21
|
-
cdeebeeEntityState,
|
|
22
|
-
cdeebeeMergeStrategy,
|
|
23
|
-
cdeebeeActions,
|
|
24
|
-
cdeebeActiveRequest,
|
|
25
|
-
cdeebeeIActions,
|
|
26
|
-
};
|
package/lib/reducer.ts
DELETED
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
slice, assocPath, omit, dissoc,
|
|
3
|
-
} from 'ramda';
|
|
4
|
-
|
|
5
|
-
import { cdeebeeTypes } from './index';
|
|
6
|
-
|
|
7
|
-
import {
|
|
8
|
-
batchingUpdate, dropRequestFromArray, editEntity, resetEntity,
|
|
9
|
-
} from './helpers';
|
|
10
|
-
|
|
11
|
-
import { ICdeebee, IRequestAction, IRequestState, cdeebeActiveRequest } from './definition';
|
|
12
|
-
|
|
13
|
-
export const INITIAL_STORAGE: any = {};
|
|
14
|
-
|
|
15
|
-
export const cdeebee = (state: any = INITIAL_STORAGE, action: ICdeebee) => {
|
|
16
|
-
const { type, payload } = action;
|
|
17
|
-
|
|
18
|
-
switch (type) {
|
|
19
|
-
case cdeebeeTypes.CDEEBEEE_UPDATE:
|
|
20
|
-
return { ...state, ...payload.response };
|
|
21
|
-
case cdeebeeTypes.CDEEBEE_ENTITY_CHANGE_FIELD: {
|
|
22
|
-
const objCreate = editEntity(state, payload.entityList, payload.entityID);
|
|
23
|
-
return batchingUpdate(objCreate, payload.valueList, [payload.entityList, payload.entityID, '__entity']);
|
|
24
|
-
}
|
|
25
|
-
case cdeebeeTypes.CDEEBEE_ENTITY_UNSAFE_UPDATE_STORE:
|
|
26
|
-
return assocPath([payload.entityList, payload.entityID], payload.value, state);
|
|
27
|
-
case cdeebeeTypes.CDEEBEE_SET_ENTITY:
|
|
28
|
-
return assocPath([payload.entityList, payload.entityID], payload.entity, state);
|
|
29
|
-
case cdeebeeTypes.CDEEBEE_RESET_ENTITY: {
|
|
30
|
-
const entityList = state[payload.entityList];
|
|
31
|
-
return assocPath(
|
|
32
|
-
[payload.entityList, payload.entityID],
|
|
33
|
-
resetEntity(entityList[payload.entityID]),
|
|
34
|
-
state,
|
|
35
|
-
);
|
|
36
|
-
}
|
|
37
|
-
case cdeebeeTypes.CDEEBEEE_DROP:
|
|
38
|
-
return INITIAL_STORAGE;
|
|
39
|
-
case cdeebeeTypes.CDEEBEEE_DROP_PATH:
|
|
40
|
-
return omit(payload.path as string[], state);
|
|
41
|
-
default:
|
|
42
|
-
return state;
|
|
43
|
-
}
|
|
44
|
-
};
|
|
45
|
-
|
|
46
|
-
const INITIAL_REQUEST: IRequestState = {
|
|
47
|
-
activeRequest: [],
|
|
48
|
-
requestByApiUrl: {},
|
|
49
|
-
errorHandler: {},
|
|
50
|
-
};
|
|
51
|
-
|
|
52
|
-
export const requestManager = (state: IRequestState = INITIAL_REQUEST, action: IRequestAction) => {
|
|
53
|
-
const { type, payload } = action;
|
|
54
|
-
switch (type) {
|
|
55
|
-
case cdeebeeTypes.CDEEBEE_REQUESTMANAGER_SET:
|
|
56
|
-
return { ...state, activeRequest: [...state.activeRequest, payload] };
|
|
57
|
-
case cdeebeeTypes.CDEEBEE_REQUESTMANAGER_SHIFT:
|
|
58
|
-
return { ...state, activeRequest: slice(1, Infinity, state.activeRequest) };
|
|
59
|
-
case cdeebeeTypes.CDEEBEEE_UPDATE:
|
|
60
|
-
return {
|
|
61
|
-
...state,
|
|
62
|
-
requestByApiUrl: {
|
|
63
|
-
...state.requestByApiUrl,
|
|
64
|
-
[payload.api]: payload.cleanResponse,
|
|
65
|
-
},
|
|
66
|
-
};
|
|
67
|
-
case cdeebeeTypes.CDEEBEEE_DROP_REQUEST_BY_API_URL:
|
|
68
|
-
return {
|
|
69
|
-
...state,
|
|
70
|
-
requestByApiUrl: dissoc<any, any>(payload.api, state.requestByApiUrl),
|
|
71
|
-
};
|
|
72
|
-
case cdeebeeTypes.CDEEBEEE_DROP_ERROR_BY_API_URL:
|
|
73
|
-
return {
|
|
74
|
-
...state,
|
|
75
|
-
errorHandler: dissoc<any, any>(payload.api, state.errorHandler),
|
|
76
|
-
};
|
|
77
|
-
case cdeebeeTypes.CDEEBEE_ERRORHANDLER_SET:
|
|
78
|
-
return {
|
|
79
|
-
...state,
|
|
80
|
-
errorHandler: {
|
|
81
|
-
...state.errorHandler,
|
|
82
|
-
[payload.api]: payload.cleanResponse,
|
|
83
|
-
},
|
|
84
|
-
};
|
|
85
|
-
case cdeebeeTypes.CDEEBEE_INTERNAL_ERROR:
|
|
86
|
-
return { ...state, activeRequest: [], requestByApiUrl: {} };
|
|
87
|
-
|
|
88
|
-
case cdeebeeTypes.CHANGE_ROUTE:
|
|
89
|
-
return { ...INITIAL_REQUEST, activeRequest: dropRequestFromArray((state.activeRequest as cdeebeActiveRequest[])) };
|
|
90
|
-
default:
|
|
91
|
-
return state;
|
|
92
|
-
}
|
|
93
|
-
};
|
package/lib/request.ts
DELETED
|
@@ -1,200 +0,0 @@
|
|
|
1
|
-
import 'abortcontroller-polyfill/dist/abortcontroller-polyfill-only';
|
|
2
|
-
// @ts-expect-error okok
|
|
3
|
-
import { fetch as fetchPolyfill } from 'whatwg-fetch';
|
|
4
|
-
import { Dispatch } from 'redux';
|
|
5
|
-
|
|
6
|
-
import { mergeDeepRight } from 'ramda';
|
|
7
|
-
|
|
8
|
-
import { defaultNormalize } from './helpers';
|
|
9
|
-
|
|
10
|
-
import { cdeebeeTypes, IDefaultOption, IRequestOptions, IResponsePropObject } from './definition';
|
|
11
|
-
|
|
12
|
-
let responsePosition: Record<string, IResponsePropObject> = {};
|
|
13
|
-
|
|
14
|
-
const abortableFetch = typeof window !== 'undefined' ? (('signal' in new Request('')) ? window.fetch : fetchPolyfill) : fetch;
|
|
15
|
-
|
|
16
|
-
// tslint:disable-next-line
|
|
17
|
-
export default class requestManager {
|
|
18
|
-
public requestObject: object;
|
|
19
|
-
private options: IDefaultOption;
|
|
20
|
-
|
|
21
|
-
constructor(requestObject: object, options: IDefaultOption) {
|
|
22
|
-
this.requestObject = requestObject;
|
|
23
|
-
this.options = {
|
|
24
|
-
fileKey: 'files',
|
|
25
|
-
bodyKey: 'body',
|
|
26
|
-
method: 'POST',
|
|
27
|
-
primaryKey: 'primaryKey',
|
|
28
|
-
normalize: defaultNormalize,
|
|
29
|
-
responseKeyCode: 'responseStatus',
|
|
30
|
-
headers: { 'content-type': 'application/json' },
|
|
31
|
-
...options,
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
public send = (rq: IRequestOptions) => async (dispatch: Dispatch, getState: () => any) => {
|
|
36
|
-
const {
|
|
37
|
-
api,
|
|
38
|
-
preUpdate,
|
|
39
|
-
postUpdate,
|
|
40
|
-
preError,
|
|
41
|
-
postError,
|
|
42
|
-
data,
|
|
43
|
-
files,
|
|
44
|
-
requestCancel = true,
|
|
45
|
-
updateStore = true,
|
|
46
|
-
fileKey = this.options.fileKey,
|
|
47
|
-
primaryKey = this.options.primaryKey,
|
|
48
|
-
bodyKey = this.options.bodyKey,
|
|
49
|
-
method = this.options.method,
|
|
50
|
-
normalize = this.options.normalize,
|
|
51
|
-
mergeListStrategy = this.options.mergeListStrategy,
|
|
52
|
-
headers = this.options.headers,
|
|
53
|
-
responseKeyCode = this.options.responseKeyCode,
|
|
54
|
-
} = mergeDeepRight(this.requestObject, rq);
|
|
55
|
-
|
|
56
|
-
const requestID = Math.random().toString(36).substr(2);
|
|
57
|
-
const requestStartTime = new Date();
|
|
58
|
-
|
|
59
|
-
try {
|
|
60
|
-
let body: any = JSON.stringify({ ...data, requestID });
|
|
61
|
-
|
|
62
|
-
const controller = new AbortController();
|
|
63
|
-
const { signal } = controller;
|
|
64
|
-
|
|
65
|
-
dispatch({
|
|
66
|
-
type: cdeebeeTypes.CDEEBEE_REQUESTMANAGER_SET,
|
|
67
|
-
payload: { requestID, api, controller, data, requestCancel, requestStartTime, requestEndTime: undefined },
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
if (files) {
|
|
71
|
-
const formData = new FormData();
|
|
72
|
-
for (let i = 0; i < files.length; i += 1) {
|
|
73
|
-
if (fileKey) {
|
|
74
|
-
formData.append(fileKey, files[i]);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
if (bodyKey) {
|
|
79
|
-
formData.append(bodyKey, body);
|
|
80
|
-
}
|
|
81
|
-
body = formData;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
const responseData = await (await abortableFetch(api, {
|
|
85
|
-
method,
|
|
86
|
-
signal,
|
|
87
|
-
headers: { 'ui-request-id': requestID, ...headers },
|
|
88
|
-
body,
|
|
89
|
-
})).json();
|
|
90
|
-
|
|
91
|
-
if (responseData) {
|
|
92
|
-
responsePosition = Object.assign(
|
|
93
|
-
{
|
|
94
|
-
[requestID]: {
|
|
95
|
-
requestID,
|
|
96
|
-
response: responseData,
|
|
97
|
-
requestApi: api,
|
|
98
|
-
requestStartTime,
|
|
99
|
-
preUpdate,
|
|
100
|
-
postUpdate,
|
|
101
|
-
normalize,
|
|
102
|
-
preError,
|
|
103
|
-
postError,
|
|
104
|
-
mergeListStrategy,
|
|
105
|
-
updateStore,
|
|
106
|
-
data,
|
|
107
|
-
requestCancel,
|
|
108
|
-
controller,
|
|
109
|
-
} as IResponsePropObject,
|
|
110
|
-
} as Record<string, IResponsePropObject>,
|
|
111
|
-
responsePosition,
|
|
112
|
-
);
|
|
113
|
-
|
|
114
|
-
while (responsePosition[getState().requestManager.activeRequest?.[0]?.requestID]) {
|
|
115
|
-
const processID = getState().requestManager.activeRequest[0].requestID;
|
|
116
|
-
const responsePropsObject: IResponsePropObject = responsePosition[processID];
|
|
117
|
-
|
|
118
|
-
if (responseKeyCode && responsePropsObject.response[responseKeyCode] === 0) {
|
|
119
|
-
if (responsePropsObject.preUpdate) {
|
|
120
|
-
responsePropsObject.preUpdate(responsePropsObject.response);
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
if (responsePropsObject.updateStore) {
|
|
124
|
-
dispatch({
|
|
125
|
-
type: cdeebeeTypes.CDEEBEEE_UPDATE,
|
|
126
|
-
payload: {
|
|
127
|
-
response: responsePropsObject.normalize instanceof Function && responsePropsObject.normalize({
|
|
128
|
-
response: responsePropsObject.response,
|
|
129
|
-
cdeebee: getState().cdeebee,
|
|
130
|
-
mergeListStrategy: responsePropsObject.mergeListStrategy,
|
|
131
|
-
primaryKey,
|
|
132
|
-
}),
|
|
133
|
-
cleanResponse: responsePropsObject.response,
|
|
134
|
-
api: responsePropsObject.requestApi,
|
|
135
|
-
mergeListStrategy: responsePropsObject.mergeListStrategy,
|
|
136
|
-
}
|
|
137
|
-
});
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
if (responsePropsObject.postUpdate) {
|
|
141
|
-
responsePropsObject.postUpdate(responsePropsObject.response);
|
|
142
|
-
}
|
|
143
|
-
} else {
|
|
144
|
-
if (responsePropsObject.preError) {
|
|
145
|
-
responsePropsObject.preError(responsePropsObject.response);
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
dispatch({
|
|
149
|
-
type: cdeebeeTypes.CDEEBEE_ERRORHANDLER_SET,
|
|
150
|
-
payload: { api: responsePropsObject.requestApi, cleanResponse: responsePropsObject.response },
|
|
151
|
-
});
|
|
152
|
-
|
|
153
|
-
if (responsePropsObject.postError) {
|
|
154
|
-
responsePropsObject.postError(responseData);
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
dispatch({
|
|
159
|
-
type: cdeebeeTypes.CDEEBEE_REQUESTMANAGER_SHIFT,
|
|
160
|
-
payload: {
|
|
161
|
-
requestID: responsePropsObject.requestID,
|
|
162
|
-
api: responsePropsObject.requestApi,
|
|
163
|
-
controller: responsePropsObject.controller,
|
|
164
|
-
data: responsePropsObject.data,
|
|
165
|
-
requestCancel: responsePropsObject.requestCancel,
|
|
166
|
-
requestStartTime: responsePropsObject.requestStartTime,
|
|
167
|
-
requestEndTime: new Date(),
|
|
168
|
-
}
|
|
169
|
-
});
|
|
170
|
-
|
|
171
|
-
delete responsePosition[processID];
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
} catch (error: any) {
|
|
175
|
-
if (error.name === 'AbortError') {
|
|
176
|
-
dispatch({ type: cdeebeeTypes.CDEEBEE_REQUEST_ABORTED, payload: { requestID, api } });
|
|
177
|
-
} else {
|
|
178
|
-
const requestEndTime = new Date();
|
|
179
|
-
dispatch({
|
|
180
|
-
type: cdeebeeTypes.CDEEBEE_INTERNAL_ERROR,
|
|
181
|
-
payload: { requestStartTime, requestEndTime, requestID, api },
|
|
182
|
-
});
|
|
183
|
-
// tslint:disable-next-line
|
|
184
|
-
console.warn('@@makeRequest-error', error);
|
|
185
|
-
// tslint:disable-next-line
|
|
186
|
-
console.warn('@@makeRequest-object', mergeDeepRight(this.requestObject, rq));
|
|
187
|
-
// tslint:disable-next-line
|
|
188
|
-
console.warn('@@makeRequest-info', { requestStartTime, requestEndTime, requestID });
|
|
189
|
-
|
|
190
|
-
if (Object.prototype.hasOwnProperty.call(this.options, 'globalErrorHandler') && this.options.globalErrorHandler instanceof Function) {
|
|
191
|
-
this.options.globalErrorHandler(
|
|
192
|
-
error,
|
|
193
|
-
mergeDeepRight(this.requestObject, rq),
|
|
194
|
-
{ requestStartTime, requestEndTime, requestID }
|
|
195
|
-
)(dispatch, getState);
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
};
|
|
200
|
-
}
|