Skip to content

Commit

Permalink
That should wrap this issue; need to move on
Browse files Browse the repository at this point in the history
  • Loading branch information
ineshbose committed Feb 17, 2022
1 parent 2a9e733 commit 2472193
Show file tree
Hide file tree
Showing 24 changed files with 481 additions and 410 deletions.
2 changes: 1 addition & 1 deletion docs/pyproject.toml
Expand Up @@ -13,7 +13,7 @@ packages = [
# python = "^3.6"

mkdocs = "^1.2.3"
mkdocs-material = "^8.1.11"
mkdocs-material = "^8.2.1"
mkdocs-material-extensions = "^1.0.3"

[tool.poetry.dev-dependencies]
Expand Down
2 changes: 1 addition & 1 deletion package.json
Expand Up @@ -33,7 +33,7 @@
"eslint docs --fix"
],
"**/pyproject.toml": [
"poetry update"
"poetry update && git add poetry.lock"
]
}
}
110 changes: 103 additions & 7 deletions poetry.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

88 changes: 87 additions & 1 deletion src/app/api/index.ts
@@ -1,6 +1,92 @@
import axios from 'axios';
import axios, { Method } from 'axios';
import { API_BASE } from 'react-native-dotenv';
import { CreateData, FetchData, GenericModel, UpdateData } from '../types/api';

type UnrequiredGM = Partial<GenericModel>;
type Methods = Extract<Uppercase<Method>, 'GET' | 'POST' | 'PATCH' | 'DELETE'>;
type ReturnAPI<
T extends UnrequiredGM = GenericModel,
M extends Methods = 'GET'
> = M extends 'GET' ? T[] : M extends 'POST' | 'PATCH' ? T : never;
type RequiredAPI<
T extends GenericModel = GenericModel,
M extends Methods = 'GET'
> = M extends 'GET'
? undefined
: M extends 'PATCH' | 'DELETE'
? UpdateData<T>
: CreateData<T>;

export const axiosInstance = axios.create({
baseURL: API_BASE,
});

export async function getData<T extends GenericModel = GenericModel>(
path: string
) {
const response = await axiosInstance.get<FetchData<T>>(path);
return 'results' in response.data ? response.data.results : response.data;
}

export async function createData<T extends GenericModel = GenericModel>(
path: string,
data: CreateData<T>
) {
const response = await axiosInstance.post<T>(path, data);
return response.data;
}

export async function updateData<T extends GenericModel = GenericModel>(
path: string,
method: Extract<Methods, 'PATCH' | 'DELETE'>,
data: UpdateData<T>
) {
const { id } = data;
const url = `${path}${id}/`;
const response = await axiosInstance.request<T>({
method,
url,
data,
});
return response.data;
}

// export async function makeRequest<T extends GenericModel = GenericModel>(
// path: string,
// method: 'GET'
// ): Promise<T[]>;
// export async function makeRequest<T extends GenericModel = GenericModel>(
// path: string,
// method: 'POST',
// data: CreateData<T>
// ): Promise<T>;
// export async function makeRequest<T extends GenericModel = GenericModel>(
// path: string,
// method: 'PATCH' | 'DELETE',
// data: UpdateData<T>
// ): Promise<T>;
export async function makeRequest<
T extends GenericModel = GenericModel,
M extends Methods = 'GET'
>(
path: string,
method: M = <M>'GET',
data: RequiredAPI<T, M> | any = undefined
): Promise<ReturnAPI<T, M>> {
try {
if (method === 'PATCH' || method === 'DELETE') {
return (await updateData<T>(
path,
method,
data as UpdateData<T>
)) as ReturnAPI<T, M>;
} else if (method === 'POST') {
// eslint-disable-next-line prettier/prettier
return (await createData<T>(path, data as CreateData<T>)) as ReturnAPI<T, M>;
} else {
return (await getData<T>(path)) as ReturnAPI<T, M>;
}
} catch (e) {
throw axios.isAxiosError(e) ? e.response?.data : e;
}
}

0 comments on commit 2472193

Please sign in to comment.