Commits
Art Lowel authored a4a747e922b
38 38 | (source: Observable<RequestEntry>): Observable<ResponseState> => |
39 39 | source.pipe( |
40 40 | filter((entry: RequestEntry) => hasValue(entry) && hasValue(entry.response)), |
41 41 | map((entry: RequestEntry) => entry.response) |
42 42 | ); |
43 43 | |
44 44 | export const sendRequest = (requestService: RequestService) => |
45 45 | (source: Observable<RestRequest>): Observable<RestRequest> => |
46 46 | source.pipe(tap((request: RestRequest) => requestService.send(request))); |
47 47 | |
48 - | export const getRemoteDataPayload = () => |
49 - | <T>(source: Observable<RemoteData<T>>): Observable<T> => |
48 + | export const getRemoteDataPayload = <T>() => |
49 + | (source: Observable<RemoteData<T>>): Observable<T> => |
50 50 | source.pipe(map((remoteData: RemoteData<T>) => remoteData.payload)); |
51 51 | |
52 - | export const getPaginatedListPayload = () => |
53 - | <T>(source: Observable<PaginatedList<T>>): Observable<T[]> => |
52 + | export const getPaginatedListPayload = <T>() => |
53 + | (source: Observable<PaginatedList<T>>): Observable<T[]> => |
54 54 | source.pipe(map((list: PaginatedList<T>) => list.page)); |
55 55 | |
56 - | export const getAllCompletedRemoteData = () => |
57 - | <T>(source: Observable<RemoteData<T>>): Observable<RemoteData<T>> => |
56 + | export const getAllCompletedRemoteData = <T>() => |
57 + | (source: Observable<RemoteData<T>>): Observable<RemoteData<T>> => |
58 58 | source.pipe(filter((rd: RemoteData<T>) => hasValue(rd) && rd.hasCompleted)); |
59 59 | |
60 - | export const getFirstCompletedRemoteData = () => |
61 - | <T>(source: Observable<RemoteData<T>>): Observable<RemoteData<T>> => |
60 + | export const getFirstCompletedRemoteData = <T>() => |
61 + | (source: Observable<RemoteData<T>>): Observable<RemoteData<T>> => |
62 62 | source.pipe(getAllCompletedRemoteData(), take(1)); |
63 63 | |
64 - | export const takeUntilCompletedRemoteData = () => |
65 - | <T>(source: Observable<RemoteData<T>>): Observable<RemoteData<T>> => |
64 + | export const takeUntilCompletedRemoteData = <T>() => |
65 + | (source: Observable<RemoteData<T>>): Observable<RemoteData<T>> => |
66 66 | source.pipe(takeWhile((rd: RemoteData<T>) => hasNoValue(rd) || rd.isLoading, true)); |
67 67 | |
68 - | export const getFirstSucceededRemoteData = () => |
69 - | <T>(source: Observable<RemoteData<T>>): Observable<RemoteData<T>> => |
68 + | export const getFirstSucceededRemoteData = <T>() => |
69 + | (source: Observable<RemoteData<T>>): Observable<RemoteData<T>> => |
70 70 | source.pipe(filter((rd: RemoteData<T>) => rd.hasSucceeded), take(1)); |
71 71 | |
72 - | export const getFirstSucceededRemoteWithNotEmptyData = () => |
73 - | <T>(source: Observable<RemoteData<T>>): Observable<RemoteData<T>> => |
72 + | export const getFirstSucceededRemoteWithNotEmptyData = <T>() => |
73 + | (source: Observable<RemoteData<T>>): Observable<RemoteData<T>> => |
74 74 | source.pipe(find((rd: RemoteData<T>) => rd.hasSucceeded && isNotEmpty(rd.payload))); |
75 75 | |
76 76 | /** |
77 77 | * Get the first successful remotely retrieved object |
78 78 | * |
79 79 | * You usually don't want to use this, it is a code smell. |
80 80 | * Work with the RemoteData object instead, that way you can |
81 81 | * handle loading and errors correctly. |
82 82 | * |
83 83 | * These operators were created as a first step in refactoring |
84 84 | * out all the instances where this is used incorrectly. |
85 85 | */ |
86 - | export const getFirstSucceededRemoteDataPayload = () => |
87 - | <T>(source: Observable<RemoteData<T>>): Observable<T> => |
86 + | export const getFirstSucceededRemoteDataPayload = <T>() => |
87 + | (source: Observable<RemoteData<T>>): Observable<T> => |
88 88 | source.pipe( |
89 89 | getFirstSucceededRemoteData(), |
90 90 | getRemoteDataPayload() |
91 91 | ); |
92 92 | |
93 93 | /** |
94 94 | * Get the first successful remotely retrieved object with not empty payload |
95 95 | * |
96 96 | * You usually don't want to use this, it is a code smell. |
97 97 | * Work with the RemoteData object instead, that way you can |
98 98 | * handle loading and errors correctly. |
99 99 | * |
100 100 | * These operators were created as a first step in refactoring |
101 101 | * out all the instances where this is used incorrectly. |
102 102 | */ |
103 - | export const getFirstSucceededRemoteDataWithNotEmptyPayload = () => |
104 - | <T>(source: Observable<RemoteData<T>>): Observable<T> => |
103 + | export const getFirstSucceededRemoteDataWithNotEmptyPayload = <T>() => |
104 + | (source: Observable<RemoteData<T>>): Observable<T> => |
105 105 | source.pipe( |
106 106 | getFirstSucceededRemoteWithNotEmptyData(), |
107 107 | getRemoteDataPayload() |
108 108 | ); |
109 109 | |
110 110 | /** |
111 111 | * Get the all successful remotely retrieved objects |
112 112 | * |
113 113 | * You usually don't want to use this, it is a code smell. |
114 114 | * Work with the RemoteData object instead, that way you can |
115 115 | * handle loading and errors correctly. |
116 116 | * |
117 117 | * These operators were created as a first step in refactoring |
118 118 | * out all the instances where this is used incorrectly. |
119 119 | */ |
120 - | export const getAllSucceededRemoteDataPayload = () => |
121 - | <T>(source: Observable<RemoteData<T>>): Observable<T> => |
120 + | export const getAllSucceededRemoteDataPayload = <T>() => |
121 + | (source: Observable<RemoteData<T>>): Observable<T> => |
122 122 | source.pipe( |
123 123 | getAllSucceededRemoteData(), |
124 124 | getRemoteDataPayload() |
125 125 | ); |
126 126 | |
127 127 | /** |
128 128 | * Get the first successful remotely retrieved paginated list |
129 129 | * as an array |
130 130 | * |
131 131 | * You usually don't want to use this, it is a code smell. |
132 132 | * Work with the RemoteData object instead, that way you can |
133 133 | * handle loading and errors correctly. |
134 134 | * |
135 135 | * You also don't want to ignore pagination and simply use the |
136 136 | * page as an array. |
137 137 | * |
138 138 | * These operators were created as a first step in refactoring |
139 139 | * out all the instances where this is used incorrectly. |
140 140 | */ |
141 - | export const getFirstSucceededRemoteListPayload = () => |
142 - | <T>(source: Observable<RemoteData<PaginatedList<T>>>): Observable<T[]> => |
141 + | export const getFirstSucceededRemoteListPayload = <T>() => |
142 + | (source: Observable<RemoteData<PaginatedList<T>>>): Observable<T[]> => |
143 143 | source.pipe( |
144 144 | getFirstSucceededRemoteData(), |
145 145 | getRemoteDataPayload(), |
146 146 | getPaginatedListPayload() |
147 147 | ); |
148 148 | |
149 149 | /** |
150 150 | * Get all successful remotely retrieved paginated lists |
151 151 | * as arrays |
152 152 | * |
153 153 | * You usually don't want to use this, it is a code smell. |
154 154 | * Work with the RemoteData object instead, that way you can |
155 155 | * handle loading and errors correctly. |
156 156 | * |
157 157 | * You also don't want to ignore pagination and simply use the |
158 158 | * page as an array. |
159 159 | * |
160 160 | * These operators were created as a first step in refactoring |
161 161 | * out all the instances where this is used incorrectly. |
162 162 | */ |
163 - | export const getAllSucceededRemoteListPayload = () => |
164 - | <T>(source: Observable<RemoteData<PaginatedList<T>>>): Observable<T[]> => |
163 + | export const getAllSucceededRemoteListPayload = <T>() => |
164 + | (source: Observable<RemoteData<PaginatedList<T>>>): Observable<T[]> => |
165 165 | source.pipe( |
166 166 | getAllSucceededRemoteData(), |
167 167 | getRemoteDataPayload(), |
168 168 | getPaginatedListPayload() |
169 169 | ); |
170 170 | |
171 171 | /** |
172 172 | * Operator that checks if a remote data object returned a 401 or 404 error |
173 173 | * When it does contain such an error, it will redirect the user to the related error page, without altering the current URL |
174 174 | * @param router The router used to navigate to a new page |
175 175 | * @param authService Service to check if the user is authenticated |
176 176 | */ |
177 - | export const redirectOn4xx = (router: Router, authService: AuthService) => |
178 - | <T>(source: Observable<RemoteData<T>>): Observable<RemoteData<T>> => |
177 + | export const redirectOn4xx = <T>(router: Router, authService: AuthService) => |
178 + | (source: Observable<RemoteData<T>>): Observable<RemoteData<T>> => |
179 179 | observableCombineLatest(source, authService.isAuthenticated()).pipe( |
180 180 | map(([rd, isAuthenticated]: [RemoteData<T>, boolean]) => { |
181 181 | if (rd.hasFailed) { |
182 182 | if (rd.statusCode === 404) { |
183 183 | router.navigateByUrl(getPageNotFoundRoute(), {skipLocationChange: true}); |
184 184 | } else if (rd.statusCode === 403 || rd.statusCode === 401) { |
185 185 | if (isAuthenticated) { |
186 186 | router.navigateByUrl(getForbiddenRoute(), {skipLocationChange: true}); |
187 187 | } else { |
188 188 | authService.setRedirectUrl(router.url); |
222 222 | * user accepts the agreement. |
223 223 | */ |
224 224 | export const returnEndUserAgreementUrlTreeOnFalse = (router: Router, redirect: string) => |
225 225 | (source: Observable<boolean>): Observable<boolean | UrlTree> => |
226 226 | source.pipe( |
227 227 | map((hasAgreed: boolean) => { |
228 228 | const queryParams = { redirect: encodeURIComponent(redirect) }; |
229 229 | return hasAgreed ? hasAgreed : router.createUrlTree([getEndUserAgreementPath()], { queryParams }); |
230 230 | })); |
231 231 | |
232 - | export const getFinishedRemoteData = () => |
233 - | <T>(source: Observable<RemoteData<T>>): Observable<RemoteData<T>> => |
232 + | export const getFinishedRemoteData = <T>() => |
233 + | (source: Observable<RemoteData<T>>): Observable<RemoteData<T>> => |
234 234 | source.pipe(find((rd: RemoteData<T>) => !rd.isLoading)); |
235 235 | |
236 - | export const getAllSucceededRemoteData = () => |
237 - | <T>(source: Observable<RemoteData<T>>): Observable<RemoteData<T>> => |
236 + | export const getAllSucceededRemoteData = <T>() => |
237 + | (source: Observable<RemoteData<T>>): Observable<RemoteData<T>> => |
238 238 | source.pipe(filter((rd: RemoteData<T>) => rd.hasSucceeded)); |
239 239 | |
240 - | export const toDSpaceObjectListRD = () => |
241 - | <T extends DSpaceObject>(source: Observable<RemoteData<PaginatedList<SearchResult<T>>>>): Observable<RemoteData<PaginatedList<T>>> => |
240 + | export const toDSpaceObjectListRD = <T extends DSpaceObject>() => |
241 + | (source: Observable<RemoteData<PaginatedList<SearchResult<T>>>>): Observable<RemoteData<PaginatedList<T>>> => |
242 242 | source.pipe( |
243 243 | filter((rd: RemoteData<PaginatedList<SearchResult<T>>>) => rd.hasSucceeded), |
244 244 | map((rd: RemoteData<PaginatedList<SearchResult<T>>>) => { |
245 245 | const dsoPage: T[] = rd.payload.page.filter((result) => hasValue(result)).map((searchResult: SearchResult<T>) => searchResult.indexableObject); |
246 246 | const payload = Object.assign(rd.payload, { page: dsoPage }) as PaginatedList<T>; |
247 247 | return Object.assign(rd, { payload: payload }); |
248 248 | }) |
249 249 | ); |
250 250 | |
251 251 | /** |