Skip to content

Commit 3e4265c

Browse files
author
nebarf
committed
Merge branch 'main' of github.com:nebarf/react-http-fetch into tests
2 parents 127ec34 + 07c6b79 commit 3e4265c

File tree

11 files changed

+125
-53
lines changed

11 files changed

+125
-53
lines changed

CONTRIBUTING.md

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,16 @@ Contributing
2828
```sh
2929
$ yarn link react-http-fetch
3030
```
31-
7. Link react peer deps to local library
31+
6. Link react and react-dom:
32+
```sh
33+
$ yarn --cwd node_modules/react link
34+
$ yarn --cwd node_modules/react-dom link
35+
```
36+
7. Link react peer deps to local library:
3237
```sh
3338
$ cd ../react-http-fetch
34-
$ npm link ../react-http-fetch-sandbox/node_modules/react
35-
$ npm link ../react-http-fetch-sandbox/node_modules/react-dom
39+
$ yarn link react
40+
$ yarn link react-dom
3641
```
3742
8. Start library build in watch mode:
3843
```sh

README.md

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ Just follow links below to get an overview of library features.
4343
- [Abortable request return](#abortable-request-return)
4444
- [Example – Abortable request](#example--abortable-request)
4545
- [Example – Get request](#example--get-request)
46+
- [Example – Http context](#example--http-context)
4647
- [Request hooks](#request-hooks)
4748
- [Http request hook params](#http-request-hook-params)
4849
- [Http request hook return](#http-request-hook-return)
@@ -182,6 +183,7 @@ The complete *public API* exposed by the hook:
182183
| baseUrlOverride | string | The base url of the request. If provided, it would override the [provider](#provider) base url.
183184
| relativeUrl | string | The url relative to the base one (e.g. posts/1).
184185
| parser | [HttpResponseParser](src/client/types.ts) | An optional response parser that would override the [provider](#provider) global one. |
186+
| context | [HttpContext](src/client/http-context.ts) | An optional context that carries arbitrary user defined data. See examples.|
185187
| requestOptions | [HttpRequestOptions](./src/client/types.ts) | The options carried by the fetch request. |
186188

187189
### Request return
@@ -285,6 +287,49 @@ function App() {
285287
export default App;
286288
```
287289

290+
### Example – Http context
291+
```js
292+
import React, { useEffect } from 'react';
293+
import {
294+
useHttpClient,
295+
useHttpEvent,
296+
RequestStartedEvent,
297+
HttpContextToken,
298+
HttpContext, } from 'react-http-fetch';
299+
300+
const showGlobalLoader = new HttpContextToken(true);
301+
const reqContext = new HttpContext().set(showGlobalLoader, false);
302+
303+
function App() {
304+
const { request } = useHttpClient();
305+
306+
useHttpEvent(RequestStartedEvent, (payload) => {
307+
console.log('Show global loader:', payload.context.get(showGlobalLoader));
308+
});
309+
310+
useEffect(
311+
() => {
312+
const fetchTodo = async () => {
313+
await request({
314+
baseUrlOverride: 'https://jsonplaceholder.typicode.com',
315+
relativeUrl: 'todos/1',
316+
context: reqContext,
317+
});
318+
};
319+
320+
fetchTodo();
321+
},
322+
[request]
323+
);
324+
325+
return (
326+
<h1>Http Context</h1>
327+
);
328+
}
329+
330+
export default App;
331+
```
332+
288333
<br>
289334

290335
## Request hooks
@@ -296,6 +341,7 @@ The library provides a hook `useHttpRequest` managing the state of the http requ
296341
| baseUrlOverride | string | The base url of the request. If provided, it would override the [provider](#provider) base url.
297342
| relativeUrl | string | The url relative to the base one (e.g. posts/1).
298343
| parser | [HttpResponseParser](src/client/types.ts) | An optional response parser that would override the [provider](#provider) global one. |
344+
| context | [HttpContext](src/client/http-context.ts) | An optional context that carries arbitrary user defined data. See examples.|
299345
| requestOptions | [HttpRequestOptions](./src/client/types.ts) | The options carried by the fetch request. |
300346
| initialData | any | The value that the state assumes initially before the request is send. |
301347
| fetchOnBootstrap | boolean | Tell if the fetch must be triggered automatically when mounting the component or not. In the second case we would like to have a manual fetch, this is optained by a request function returned by the hook. |

src/client/http-context.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
export class HttpContextToken<ValueT> {
2+
constructor(public readonly defaultValue: ValueT) {}
3+
}
4+
5+
export class HttpContext {
6+
private readonly map = new Map<HttpContextToken<unknown>, unknown>();
7+
8+
set<T>(token: HttpContextToken<T>, value: T): HttpContext {
9+
this.map.set(token, value);
10+
return this;
11+
}
12+
13+
get<T>(token: HttpContextToken<T>): T | undefined {
14+
if (!this.map.has(token)) {
15+
return token.defaultValue;
16+
}
17+
return this.map.get(token) as T;
18+
}
19+
20+
delete(token: HttpContextToken<unknown>): HttpContext {
21+
this.map.delete(token);
22+
return this;
23+
}
24+
25+
has(token: HttpContextToken<unknown>): boolean {
26+
return this.map.has(token);
27+
}
28+
29+
keys(): IterableIterator<HttpContextToken<unknown>> {
30+
return this.map.keys();
31+
}
32+
}

src/client/http-request.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { HttpMethod } from '../enum';
2+
import { HttpContext, HttpContextToken } from './http-context';
23

34
export interface HttpRequestProps<HttpRequestBodyT> {
45
baseUrl: string;
@@ -10,6 +11,7 @@ export interface HttpRequestProps<HttpRequestBodyT> {
1011
queryParams?: Record<string, string>;
1112
relativeUrl: string;
1213
signal?: AbortSignal;
14+
context?: HttpContext;
1315
}
1416

1517
export class HttpRequest<HttpRequestBodyT> implements HttpRequestProps<HttpRequestBodyT> {
@@ -60,6 +62,11 @@ export class HttpRequest<HttpRequestBodyT> implements HttpRequestProps<HttpReque
6062
*/
6163
private _signal?: AbortSignal;
6264

65+
/**
66+
* The request context storing arbitrary user defined data.
67+
*/
68+
private _context?: HttpContext;
69+
6370
constructor(requestOpts: HttpRequestProps<HttpRequestBodyT>) {
6471
const {
6572
baseUrl,
@@ -71,6 +78,7 @@ export class HttpRequest<HttpRequestBodyT> implements HttpRequestProps<HttpReque
7178
queryParams,
7279
relativeUrl,
7380
signal,
81+
context,
7482
} = requestOpts;
7583

7684
this._baseUrl = baseUrl;
@@ -82,6 +90,7 @@ export class HttpRequest<HttpRequestBodyT> implements HttpRequestProps<HttpReque
8290
this._queryParams = queryParams;
8391
this._relativeUrl = relativeUrl;
8492
this._signal = signal;
93+
this._context = context;
8594
}
8695

8796
get baseUrl(): string {
@@ -138,4 +147,14 @@ export class HttpRequest<HttpRequestBodyT> implements HttpRequestProps<HttpReque
138147
}
139148
return `${this.url}?${this.serializedQueryParams}`;
140149
}
150+
151+
get context(): HttpContext | undefined {
152+
return this._context;
153+
}
154+
155+
getContextValue<ContextTokenValueT>(
156+
token: HttpContextToken<ContextTokenValueT>
157+
): ContextTokenValueT | undefined {
158+
return this.context ? this.context.get(token) : undefined;
159+
}
141160
}

src/client/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
export * from './use-http-client';
22
export * from './types';
33
export * from './http-request';
4+
export * from './http-context';

src/client/types.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { HttpMethod } from '../enum';
2+
import { HttpContext } from './http-context';
23

34
export interface UseHttpClientParams {
45
baseUrl: string;
@@ -13,6 +14,7 @@ export interface PerformHttpRequestParams<HttpRequestBodyT> {
1314
relativeUrl: string;
1415
parser: HttpResponseParser;
1516
baseUrlOverride: string;
17+
context: HttpContext;
1618
requestOptions: Partial<HttpRequestOptions<HttpRequestBodyT>>;
1719
}
1820

src/client/use-http-client.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ export const useHttpClient = (): UseHttpClientReturn => {
3232
baseUrlOverride,
3333
parser,
3434
relativeUrl,
35+
context,
3536
requestOptions,
3637
}: Partial<PerformHttpRequestParams<HttpRequestBodyT>>): Promise<HttpResponseT> => {
3738
/**
@@ -69,6 +70,7 @@ export const useHttpClient = (): UseHttpClientReturn => {
6970
body: body || undefined,
7071
baseUrl: computedBaseUrl,
7172
relativeUrl: relativeUrl || '',
73+
context,
7274
});
7375

7476
/**
@@ -160,6 +162,7 @@ export const useHttpClient = (): UseHttpClientReturn => {
160162
parser,
161163
relativeUrl,
162164
requestOptions,
165+
context,
163166
}: Partial<
164167
PerformHttpRequestParams<HttpRequestBodyT>
165168
>): AbortableHttpRequestReturn<HttpResponseT> => {
@@ -170,6 +173,7 @@ export const useHttpClient = (): UseHttpClientReturn => {
170173
baseUrlOverride,
171174
parser,
172175
relativeUrl,
176+
context,
173177
requestOptions: {
174178
...requestOptions,
175179
signal,

src/index.ts

Lines changed: 7 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,7 @@
1-
export { HttpCacheEntry, HttpCacheStore } from './cache';
2-
export {
3-
AbortableHttpRequestReturn,
4-
HttpClientAbortableRequest,
5-
HttpClientRequest,
6-
HttpRequest,
7-
HttpRequestOptions,
8-
HttpRequestProps,
9-
HttpResponseParser,
10-
PerformHttpRequestParams,
11-
UseHttpClientParams,
12-
UseHttpClientReturn,
13-
useHttpClient,
14-
} from './client';
15-
export {
16-
HttpClientConfig,
17-
HttpClientConfigProvider,
18-
HttpClientContext,
19-
HttpClientContextProps,
20-
HttpClientProviderConfig,
21-
HttpClientProviderProps,
22-
HttpRequestBodySerializer,
23-
ReqBodySerializerReturn,
24-
defaultClientProps,
25-
defaultHttpReqConfig,
26-
httpResponseParser,
27-
serializeRequestBody,
28-
useHttpClientConfig,
29-
} from './config';
30-
export { HttpMethod, HttpStatusCode } from './enum';
31-
export { HttpError } from './errors';
32-
export {
33-
RequestErroredEvent,
34-
RequestStartedEvent,
35-
RequestSuccededEvent,
36-
RequestSuccededEventPayload,
37-
useHttpEvent,
38-
} from './events-manager';
39-
export {
40-
useHttpDelete,
41-
useHttpGet,
42-
useHttpPatch,
43-
useHttpPost,
44-
useHttpPut,
45-
useHttpRequest,
46-
UseHttpAbortableRequestReturn,
47-
UseHttpRequestParams,
48-
UseHttpRequestReturn,
49-
} from './request';
1+
export * from './cache';
2+
export * from './client';
3+
export * from './config';
4+
export * from './enum';
5+
export * from './errors';
6+
export * from './events-manager';
7+
export * from './request';

src/request/types.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { HttpRequestOptions, HttpResponseParser } from '../client';
2+
import { HttpContext } from '../client/http-context';
23
import { HttpRequestState } from './state-reducer';
34

45
export interface UseHttpRequestParams<InitialDataT, HttpRequestBodyT> {
@@ -8,6 +9,7 @@ export interface UseHttpRequestParams<InitialDataT, HttpRequestBodyT> {
89
requestOptions: Partial<HttpRequestOptions<HttpRequestBodyT>>;
910
initialData: InitialDataT;
1011
fetchOnBootstrap: boolean;
12+
context: HttpContext;
1113
}
1214

1315
export interface UseHttpAbortableRequestReturn<HttpResponseT> {

src/request/use-http-request.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ export const useHttpRequest = <HttpResponseT, HttpRequestBodyT = unknown>(
4646
parser: params.parser,
4747
relativeUrl: params.relativeUrl,
4848
requestOptions: params.requestOptions,
49+
context: params.context,
4950
}),
5051
[params],
5152
fastCompare
@@ -59,12 +60,13 @@ export const useHttpRequest = <HttpResponseT, HttpRequestBodyT = unknown>(
5960
source: Partial<PerformHttpRequestParams<HttpRequestBodyT>>,
6061
override: Partial<PerformHttpRequestParams<HttpRequestBodyT>>
6162
): Partial<PerformHttpRequestParams<HttpRequestBodyT>> => {
62-
const { baseUrlOverride, parser, relativeUrl, requestOptions } = override;
63+
const { baseUrlOverride, parser, relativeUrl, requestOptions, context } = override;
6364

6465
return {
6566
baseUrlOverride: baseUrlOverride || source.baseUrlOverride,
6667
parser: parser || source.parser,
6768
relativeUrl: relativeUrl || source.relativeUrl,
69+
context: context || source.context,
6870
requestOptions: {
6971
body: requestOptions?.body || source.requestOptions?.body,
7072
credentials: requestOptions?.credentials || source.requestOptions?.credentials,

0 commit comments

Comments
 (0)