From a993b8a488a09cd151a00fc8ef8c1d4a55a16b19 Mon Sep 17 00:00:00 2001 From: grimsi <9295182+grimsi@users.noreply.github.com> Date: Sat, 21 Sep 2024 19:24:43 +0200 Subject: [PATCH] Implement notification templates Refactor notification providers to be more expandable in the future Minor layout changes --- .run/Production build.run.xml | 24 ++++ .../administration/NotificationManagement.tsx | 132 ++++++++++++++---- .../administration/SsoManagement.tsx | 2 +- .../administration/withConfigPage.tsx | 9 +- .../components/general/CheckboxInput.tsx | 2 +- .../frontend/components/general/Input.tsx | 2 +- .../components/general/SelectInput.tsx | 2 +- .../gameyfin/config/ConfigProperties.kt | 38 ++++- .../gameyfin/config/entities/ConfigEntry.kt | 6 +- .../notifications/NotificationEndpoint.kt | 27 +--- .../notifications/NotificationService.kt | 22 +++ .../notifications/dto/EmailCredentialsDto.kt | 8 -- .../gameyfin/notifications/events/Events.kt | 13 ++ .../providers/AbstractNotificationProvider.kt | 20 +++ .../providers/EmailNotificationProvider.kt | 41 ++++++ 15 files changed, 276 insertions(+), 72 deletions(-) create mode 100644 .run/Production build.run.xml create mode 100644 src/main/kotlin/de/grimsi/gameyfin/notifications/NotificationService.kt delete mode 100644 src/main/kotlin/de/grimsi/gameyfin/notifications/dto/EmailCredentialsDto.kt create mode 100644 src/main/kotlin/de/grimsi/gameyfin/notifications/events/Events.kt create mode 100644 src/main/kotlin/de/grimsi/gameyfin/notifications/providers/AbstractNotificationProvider.kt create mode 100644 src/main/kotlin/de/grimsi/gameyfin/notifications/providers/EmailNotificationProvider.kt diff --git a/.run/Production build.run.xml b/.run/Production build.run.xml new file mode 100644 index 0000000..b8017b7 --- /dev/null +++ b/.run/Production build.run.xml @@ -0,0 +1,24 @@ + + + + + + + true + true + false + false + + + \ No newline at end of file diff --git a/src/main/frontend/components/administration/NotificationManagement.tsx b/src/main/frontend/components/administration/NotificationManagement.tsx index 76e8487..3d3db43 100644 --- a/src/main/frontend/components/administration/NotificationManagement.tsx +++ b/src/main/frontend/components/administration/NotificationManagement.tsx @@ -1,24 +1,38 @@ -import React from "react"; +import React, {useState} from "react"; import withConfigPage from "Frontend/components/administration/withConfigPage"; import * as Yup from 'yup'; import ConfigFormField from "Frontend/components/administration/ConfigFormField"; import Section from "Frontend/components/general/Section"; -import {Button, Input, Select, SelectItem} from "@nextui-org/react"; -import {NotificationEndpoint} from "Frontend/generated/endpoints"; -import EmailCredentialsDto from "Frontend/generated/de/grimsi/gameyfin/notifications/dto/EmailCredentialsDto"; +import { + Button, + Card, + Modal, + ModalBody, + ModalContent, + ModalFooter, + ModalHeader, + Textarea, + useDisclosure +} from "@nextui-org/react"; +import {ConfigEndpoint, NotificationEndpoint} from "Frontend/generated/endpoints"; import {toast} from "sonner"; +import ConfigEntryDto from "Frontend/generated/de/grimsi/gameyfin/config/dto/ConfigEntryDto"; +import {Pencil} from "@phosphor-icons/react"; -function NotificationManagementLayout({getConfig, formik}: any) { +function NotificationManagementLayout({getConfig, getConfigs, formik}: any) { - async function testMailSettings() { - const credentials: EmailCredentialsDto = { - host: formik.values.notifications.email.host, - port: formik.values.notifications.email.port, - username: formik.values.notifications.email.username, - password: formik.values.notifications.email.password + const {isOpen, onOpen, onOpenChange} = useDisclosure(); + const [selectedTemplate, setSelectedTemplate] = useState(null); + + async function verifyCredentials(provider: string) { + const credentials: Record = { + host: formik.values.notifications.providers.email.host, + port: formik.values.notifications.providers.email.port, + username: formik.values.notifications.providers.email.username, + password: formik.values.notifications.providers.email.password } - const areCredentialsValid = await NotificationEndpoint.verifyEmailCredentials(credentials); + const areCredentialsValid = await NotificationEndpoint.verifyCredentials(provider, credentials); if (areCredentialsValid) { toast.success("Credentials are valid") @@ -27,6 +41,19 @@ function NotificationManagementLayout({getConfig, formik}: any) { } } + async function openModal(template: ConfigEntryDto) { + let templateContent = await ConfigEndpoint.get(template.key); + setSelectedTemplate({ + ...template, + value: templateContent + }); + onOpen(); + } + + async function saveTemplate(template: ConfigEntryDto) { + await ConfigEndpoint.set(template.key, template.value); + } + return (
@@ -36,36 +63,83 @@ function NotificationManagementLayout({getConfig, formik}: any) {
- - - - - + formik.values.notifications.providers.email.host && + formik.values.notifications.providers.email.port && + formik.values.notifications.providers.email.username)}>Test
-
- {/* TODO: Evaluate need and options if need is given */} - - - +
+
+ {getConfigs("notifications.templates").map((template: ConfigEntryDto) => + + +

{template.description}

+
+ )} +
+ + + + {(onClose) => ( + <> + Edit {selectedTemplate?.description.toLowerCase()} + +