Implemented types for notification templates (currently only MJML is used, but it's now easily expandable)

Added default templates
This commit is contained in:
grimsi
2024-09-24 14:26:21 +02:00
parent 8cf6236b1d
commit c0a790bda4
16 changed files with 222 additions and 41 deletions
@@ -7,6 +7,7 @@ import {
Button,
Card,
Chip,
Link,
Modal,
ModalBody,
ModalContent,
@@ -19,6 +20,7 @@ import {MessageTemplateEndpoint, NotificationEndpoint} from "Frontend/generated/
import {toast} from "sonner";
import {Pencil} from "@phosphor-icons/react";
import MessageTemplateDto from "Frontend/generated/de/grimsi/gameyfin/notifications/templates/MessageTemplateDto";
import TemplateType from "Frontend/generated/de/grimsi/gameyfin/notifications/templates/TemplateType";
function NotificationManagementLayout({getConfig, getConfigs, formik}: any) {
@@ -26,6 +28,7 @@ function NotificationManagementLayout({getConfig, getConfigs, formik}: any) {
const [availableTemplates, setAvailableTemplates] = useState<MessageTemplateDto[]>([]);
const [selectedTemplate, setSelectedTemplate] = useState<MessageTemplateDto | null>(null);
const [templateContent, setTemplateContent] = useState<string>("");
const [defaultPlaceholders, setDefaultPlaceholders] = useState<string[]>([]);
useEffect(() => {
MessageTemplateEndpoint.getAll().then((response: any) => {
@@ -53,7 +56,9 @@ function NotificationManagementLayout({getConfig, getConfigs, formik}: any) {
async function openModal(template: MessageTemplateDto) {
setSelectedTemplate(template);
let templateContent = await MessageTemplateEndpoint.read(template.key);
let templateContent = await MessageTemplateEndpoint.read(template.key, TemplateType.MJML);
let defaultPlaceholders = await MessageTemplateEndpoint.getDefaultPlaceholders(TemplateType.MJML);
setDefaultPlaceholders(defaultPlaceholders ? defaultPlaceholders as string[] : []);
if (templateContent === undefined) {
toast.error("Can't read template content");
@@ -65,7 +70,7 @@ function NotificationManagementLayout({getConfig, getConfigs, formik}: any) {
}
async function saveTemplate(template: MessageTemplateDto) {
await MessageTemplateEndpoint.save(template.key, templateContent);
await MessageTemplateEndpoint.save(template.key, TemplateType.MJML, templateContent);
}
return (
@@ -119,14 +124,40 @@ function NotificationManagementLayout({getConfig, getConfigs, formik}: any) {
<ModalHeader
className="flex flex-col gap-1">Edit {selectedTemplate?.name} Template</ModalHeader>
<ModalBody>
<div className="flex flex-row gap-2">
<p>Available placeholders:</p>
{selectedTemplate?.availablePlaceholders?.map((placeholder) =>
<Chip radius="sm"
key={placeholder}
color={templateContent.includes(`{${placeholder as string}}`) ? "success" : "danger"}
>{placeholder}</Chip>
)}
<div className="flex flex-row justify-between items-end">
<table cellPadding="4rem">
<tbody>
<tr>
<td>Required placeholders:</td>
<td>
<div className="flex flex-row gap-2">
{selectedTemplate?.availablePlaceholders?.map((placeholder) =>
<Chip radius="sm"
key={placeholder}
color={templateContent.includes(`{${placeholder as string}}`) ? "success" : "danger"}
>{placeholder}</Chip>
)}
</div>
</td>
</tr>
<tr>
<td>Optional placeholders:</td>
<td>
<div className="flex flex-row gap-2">
{defaultPlaceholders.map((placeholder) =>
<Chip radius="sm"
key={placeholder}
color={templateContent.includes(`{${placeholder as string}}`) ? "success" : "default"}
>{placeholder}</Chip>
)}
</div>
</td>
</tr>
</tbody>
</table>
<small className="text-right">Powered by <Link href="https://documentation.mjml.io/"
target="_blank">mjml.io</Link>
</small>
</div>
<Textarea
size="lg"