diff --git a/tranga-website/src/Components/Settings/NotificationConnectors.tsx b/tranga-website/src/Components/Settings/NotificationConnectors.tsx
new file mode 100644
index 0000000..90263fa
--- /dev/null
+++ b/tranga-website/src/Components/Settings/NotificationConnectors.tsx
@@ -0,0 +1,78 @@
+import {ReactNode, useContext, useState} from "react";
+import { ApiContext } from "../../apiClient/ApiContext";
+import {Button, Input, Modal, ModalDialog, Tab, TabList, TabPanel, Tabs} from "@mui/joy";
+import ModalClose from "@mui/joy/ModalClose";
+import {GotifyRecord, NtfyRecord, PushoverRecord} from "../../apiClient/data-contracts.ts";
+
+export default function ({open, setOpen} : {open: boolean, setOpen: (open: boolean) => void}) {
+
+ return (
+ setOpen(false)}>
+
+
+
+
+ Gotify
+ Ntfy
+ Pushover
+
+
+
+
+
+
+
+ );
+}
+
+function NotificationConnectorTab({ value, children, add }: { value: string, children: ReactNode, add: (data: any) => void }) {
+ return (
+
+ {children}
+
+
+ );
+}
+
+function Gotify() {
+ const Api = useContext(ApiContext);
+ const [gotifyData, setGotifyData] = useState({});
+
+ return (
+ Api.notificationConnectorGotifyUpdate(gotifyData)}>
+ setGotifyData({...gotifyData, name: e.target.value})} />
+ setGotifyData({...gotifyData, endpoint: e.target.value})} />
+ setGotifyData({...gotifyData, appToken: e.target.value})} />
+ setGotifyData({...gotifyData, priority: e.target.valueAsNumber})} />
+
+ );
+}
+
+function Ntfy() {
+ const Api = useContext(ApiContext);
+ const [ntfyData, setNtfyData] = useState({});
+
+ return (
+ Api.notificationConnectorNtfyUpdate(ntfyData)}>
+ setNtfyData({...ntfyData, name: e.target.value})} />
+ setNtfyData({...ntfyData, endpoint: e.target.value})} />
+ setNtfyData({...ntfyData, topic: e.target.value})} />
+ setNtfyData({...ntfyData, username: e.target.value})} />
+ setNtfyData({...ntfyData, password: e.target.value})} />
+ setNtfyData({...ntfyData, priority: e.target.valueAsNumber})} />
+
+ );
+}
+
+function Pushover() {
+ const Api = useContext(ApiContext);
+ const [pushoverData, setPushoverData] = useState({});
+
+ return (
+ Api.notificationConnectorPushoverUpdate(pushoverData)}>
+ setPushoverData({...pushoverData, name: e.target.value})} />
+ setPushoverData({...pushoverData, user: e.target.value})} />
+ setPushoverData({...pushoverData, appToken: e.target.value})} />
+
+ );
+}
\ No newline at end of file
diff --git a/tranga-website/src/Components/Settings/Settings.tsx b/tranga-website/src/Components/Settings/Settings.tsx
index 11a12a0..fb9cddb 100644
--- a/tranga-website/src/Components/Settings/Settings.tsx
+++ b/tranga-website/src/Components/Settings/Settings.tsx
@@ -15,6 +15,7 @@ import {createContext, Dispatch, useContext, useEffect, useState} from "react";
import {Article} from '@mui/icons-material';
import {TrangaSettings} from "../../apiClient/data-contracts.ts";
import {ApiContext} from "../../apiClient/ApiContext.tsx";
+import NotificationConnectors from "./NotificationConnectors.tsx";
export const SettingsContext = createContext({});
@@ -26,7 +27,6 @@ export default function Settings({setApiUri} : {setApiUri: Dispatch("neutral");
const timerRef = React.useRef>(undefined);
-
const [apiUriAccordionOpen, setApiUriAccordionOpen] = React.useState(true);
useEffect(() => {
@@ -44,6 +44,8 @@ export default function Settings({setApiUri} : {setApiUri: Dispatch
@@ -63,6 +65,10 @@ export default function Settings({setApiUri} : {setApiUri: Dispatch
+
+
+
+
Swagger Doc