frontend/src/providers/pond/grainBagAPI.tsx
2026-03-04 12:51:10 -06:00

171 lines
5.1 KiB
TypeScript

import { useHTTP } from "hooks";
import React, { createContext, PropsWithChildren, useContext } from "react";
import { pond } from "protobuf-ts/pond";
import { pondURL } from "./pond";
import { AxiosResponse } from "axios";
import { useGlobalState } from "providers";
export interface IGrainBagInterface {
addGrainBag: (
name: string,
settings: pond.GrainBagSettings,
otherTeam?: string
) => Promise<AxiosResponse<pond.AddGrainBagResponse>>;
listGrainBags: (
limit: number,
offset: number,
order?: "asc" | "desc",
orderBy?: string,
search?: string,
keys?: string[],
types?: string[],
numerical?: boolean,
otherTeam?: string
) => Promise<AxiosResponse<pond.ListGrainBagsResponse>>;
updateGrainBag: (
key: string,
name: string,
settings: pond.GrainBagSettings,
otherTeam?: string
) => Promise<AxiosResponse<pond.UpdateGrainBagResponse>>;
bulkUpdateGrainBags: (
bags: pond.GrainBag[],
otherTeam?: string
) => Promise<AxiosResponse<pond.BulkGrainBagUpdateResponse>>;
getGrainBag: (key: string, otherTeam?: string) => Promise<AxiosResponse<pond.GetGrainBagResponse>>;
removeGrainBag: (key: string, otherTeam?: string) => Promise<AxiosResponse<pond.RemoveGrainBagResponse>>;
listHistory: (
id: string,
limit: number,
offset: number,
start?: string,
end?: string,
otherTeam?: string
) => Promise<AxiosResponse<pond.ListGrainBagHistoryResponse>>;
}
export const GrainBagAPIcontext = createContext<IGrainBagInterface>({} as IGrainBagInterface);
interface Props {}
export default function GrainBagProvider(props: PropsWithChildren<Props>) {
const { children } = props;
const { get, del, post, put } = useHTTP();
const [{ as }] = useGlobalState();
const addGrainBag = (name: string, settings: pond.GrainBagSettings, otherTeam?: string) => {
const view = otherTeam ? otherTeam : as
if (view) {
return post<pond.AddGrainBagResponse>(
pondURL("/grainbags?name=" + name + "&as=" + view),
settings
);
}
return post<pond.AddGrainBagResponse>(pondURL("/grainbags?name=" + name), settings);
};
const listGrainBags = (
limit: number,
offset: number,
order?: "asc" | "desc",
orderBy?: string,
search?: string,
keys?: string[],
types?: string[],
numerical?: boolean,
otherTeam?: string
) => {
let asText = "";
const view = otherTeam ? otherTeam : as
if (view) asText = "&as=" + view;
return get<pond.ListGrainBagsResponse>(
pondURL(
"/grainbags?limit=" +
limit +
"&offset=" +
offset +
("&order=" + (order ? order : "asc")) +
("&by=" + (orderBy ? orderBy : "key")) +
(numerical ? "&numerical=true" : "") +
(search ? "&search=" + search : "") +
(keys ? "&keys=" + keys.toString() : "") +
(types ? "&types=" + types.toString() : "") +
asText
)
);
};
const updateGrainBag = (key: string, name: string, settings: pond.GrainBagSettings, otherTeam?: string) => {
const view = otherTeam ? otherTeam : as
if (view) {
return put<pond.UpdateGrainBagResponse>(
pondURL("/grainbags/" + key + "?as=" + view + "&name=" + name),
settings
);
}
return put<pond.UpdateGrainBagResponse>(
pondURL("/grainbags/" + key + "?name=" + name),
settings
);
};
const bulkUpdateGrainBags = (bags: pond.GrainBag[], otherTeam?: string) => {
const view = otherTeam ? otherTeam : as
if (view)
return put<pond.BulkGrainBagUpdateResponse>(pondURL("/bulkGrainBags/update?as=" + view), {
bags: bags
});
return put<pond.BulkGrainBagUpdateResponse>(pondURL("/bulkGrainBags/update"), { bags: bags });
};
const removeGrainBag = (key: string, otherTeam?: string) => {
const view = otherTeam ? otherTeam : as
if (view) {
return del<pond.RemoveGrainBagResponse>(pondURL("/grainbags/" + key + "?as=" + view));
}
return del<pond.RemoveGrainBagResponse>(pondURL("/grainbags/" + key));
};
const getGrainBag = (key: string, otherTeam?: string) => {
const view = otherTeam ? otherTeam : as
if (view) {
return get<pond.GetGrainBagResponse>(pondURL("/grainbags/" + key + "?as=" + view));
}
return get<pond.GetGrainBagResponse>(pondURL("/grainbags/" + key));
};
const listHistory = (id: string, limit: number, offset: number, start?: string, end?: string, otherTeam?: string) => {
const view = otherTeam ? otherTeam : as
let url = pondURL(
"/grainbags/" +
id +
"/history?limit=" +
limit +
"&offset=" +
offset +
(start && "&start=" + start) +
(end && "&end=" + end)
)
if (view) {
url = url + "&as=" + view
}
return get<pond.ListGrainBagHistoryResponse>(url);
};
return (
<GrainBagAPIcontext.Provider
value={{
addGrainBag,
listGrainBags,
updateGrainBag,
bulkUpdateGrainBags,
removeGrainBag,
getGrainBag,
listHistory
}}>
{children}
</GrainBagAPIcontext.Provider>
);
}
export const useGrainBagAPI = () => useContext(GrainBagAPIcontext);