mirror of
https://github.com/Unleash/unleash.git
synced 2024-10-28 19:06:12 +01:00
a113f9c2c0
### What This PR updates the example for the hook to use the export format that is recommended in the ADR we've written on export types.
91 lines
2.5 KiB
Markdown
91 lines
2.5 KiB
Markdown
---
|
|
title: "ADR: Preferred data mutation method"
|
|
---
|
|
|
|
## Background
|
|
|
|
Because our product is open-core, we have complexities and needs for our SaaS platform that are not compatible with the needs of our open-source product. We have found a need to standardise how we fetch data from APIs, in order to reduce complexity and simplify the data fetching process.
|
|
|
|
## Decision
|
|
|
|
We have decided to standardise data-fetching and error handling by implementing a top level `useAPI` hook that will take care of formatting the
|
|
request in the correct way adding the basePath if unleash is hosted on a subpath, wrap with error handlers and return the data in a consistent way.
|
|
|
|
Example:
|
|
|
|
```tsx
|
|
import { ITagPayload } from 'interfaces/tags';
|
|
import useAPI from '../useApi/useApi';
|
|
|
|
export const useTagTypesApi = () => {
|
|
const { makeRequest, createRequest, errors, loading } = useAPI({
|
|
propagateErrors: true,
|
|
});
|
|
|
|
const createTag = async (payload: ITagPayload) => {
|
|
const path = `api/admin/tag-types`;
|
|
const req = createRequest(path, {
|
|
method: 'POST',
|
|
body: JSON.stringify(payload),
|
|
});
|
|
|
|
try {
|
|
const res = await makeRequest(req.caller, req.id);
|
|
|
|
return res;
|
|
} catch (e) {
|
|
throw e;
|
|
}
|
|
};
|
|
|
|
const validateTagName = async (name: string) => {
|
|
const path = `api/admin/tag-types/validate`;
|
|
const req = createRequest(path, {
|
|
method: 'POST',
|
|
body: JSON.stringify({ name }),
|
|
});
|
|
try {
|
|
const res = await makeRequest(req.caller, req.id);
|
|
return res;
|
|
} catch (e) {
|
|
throw e;
|
|
}
|
|
};
|
|
const updateTagType = async (tagName: string, payload: ITagPayload) => {
|
|
const path = `api/admin/tag-types/${tagName}`;
|
|
const req = createRequest(path, {
|
|
method: 'PUT',
|
|
body: JSON.stringify(payload),
|
|
});
|
|
|
|
try {
|
|
const res = await makeRequest(req.caller, req.id);
|
|
return res;
|
|
} catch (e) {
|
|
throw e;
|
|
}
|
|
};
|
|
|
|
const deleteTagType = async (tagName: string) => {
|
|
const path = `api/admin/tag-types/${tagName}`;
|
|
const req = createRequest(path, { method: 'DELETE' });
|
|
|
|
try {
|
|
const res = await makeRequest(req.caller, req.id);
|
|
return res;
|
|
} catch (e) {
|
|
throw e;
|
|
}
|
|
};
|
|
|
|
return {
|
|
createTag,
|
|
validateTagName,
|
|
updateTagType,
|
|
deleteTagType,
|
|
errors,
|
|
loading,
|
|
};
|
|
};
|
|
```
|