mirror of
https://github.com/OneUptime/oneuptime.git
synced 2026-04-06 08:42:13 +02:00
97 lines
2.5 KiB
TypeScript
97 lines
2.5 KiB
TypeScript
import API from "../../Utils/API/API";
|
|
import Query from "../../../Types/BaseDatabase/Query";
|
|
import ModelAPI, { RequestOptions } from "../../Utils/ModelAPI/ModelAPI";
|
|
import HeaderAlert, { HeaderAlertType } from "./HeaderAlert";
|
|
import BaseModel from "../../../Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel";
|
|
import { PromiseVoidFunction } from "../../../Types/FunctionTypes";
|
|
import IconProp from "../../../Types/Icon/IconProp";
|
|
import React, { ReactElement, useEffect, useState } from "react";
|
|
|
|
export interface ComponentProps<TBaseModel extends BaseModel> {
|
|
icon: IconProp;
|
|
modelType: { new (): TBaseModel };
|
|
singularName: string;
|
|
pluralName: string;
|
|
query: Query<TBaseModel>;
|
|
requestOptions?: RequestOptions | undefined;
|
|
onCountFetchInit?: (() => void) | undefined;
|
|
onClick?: (() => void) | undefined;
|
|
refreshToggle?: string | undefined;
|
|
className?: string | undefined;
|
|
alertType: HeaderAlertType;
|
|
tooltip?: string | undefined;
|
|
}
|
|
|
|
const HeaderModelAlert: <TBaseModel extends BaseModel>(
|
|
props: ComponentProps<TBaseModel>,
|
|
) => ReactElement = <TBaseModel extends BaseModel>(
|
|
props: ComponentProps<TBaseModel>,
|
|
): ReactElement => {
|
|
const [isLoading, setIsLoading] = useState<boolean>(true);
|
|
const [error, setError] = useState<string>("");
|
|
const [count, setCount] = useState<number>(0);
|
|
|
|
useEffect(() => {
|
|
fetchCount().catch((err: Error) => {
|
|
setError(API.getFriendlyMessage(err));
|
|
});
|
|
}, [props.refreshToggle]);
|
|
|
|
const fetchCount: PromiseVoidFunction = async (): Promise<void> => {
|
|
setError("");
|
|
setIsLoading(true);
|
|
|
|
if (props.onCountFetchInit) {
|
|
props.onCountFetchInit();
|
|
}
|
|
|
|
try {
|
|
const count: number = await ModelAPI.count<TBaseModel>({
|
|
modelType: props.modelType,
|
|
query: props.query,
|
|
requestOptions: props.requestOptions,
|
|
});
|
|
|
|
setCount(count);
|
|
} catch (err) {
|
|
setError(API.getFriendlyMessage(err));
|
|
}
|
|
|
|
setIsLoading(false);
|
|
};
|
|
|
|
useEffect(() => {
|
|
setIsLoading(true);
|
|
fetchCount().catch((err: Error) => {
|
|
setError(API.getFriendlyMessage(err));
|
|
});
|
|
setIsLoading(false);
|
|
}, []);
|
|
|
|
if (error) {
|
|
return <></>;
|
|
}
|
|
|
|
if (isLoading) {
|
|
return <></>;
|
|
}
|
|
|
|
if (count === 0) {
|
|
return <></>;
|
|
}
|
|
|
|
return (
|
|
<HeaderAlert
|
|
title={`${count}`}
|
|
suffix={`${count > 1 ? props.pluralName : props.singularName}`}
|
|
icon={props.icon}
|
|
onClick={props.onClick}
|
|
className={props.className}
|
|
alertType={props.alertType}
|
|
tooltip={props.tooltip}
|
|
/>
|
|
);
|
|
};
|
|
|
|
export default HeaderModelAlert;
|