fix: remove LunaSea (#1759)
* refactor(lunasea-removal): remove LunaSea fixes #1756 * chore(localization): undo localization changes in favor of weblate
This commit is contained in:
@@ -83,13 +83,6 @@
|
|||||||
"enableMentions": true
|
"enableMentions": true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"lunasea": {
|
|
||||||
"enabled": false,
|
|
||||||
"types": 0,
|
|
||||||
"options": {
|
|
||||||
"webhookUrl": ""
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"slack": {
|
"slack": {
|
||||||
"enabled": false,
|
"enabled": false,
|
||||||
"types": 0,
|
"types": 0,
|
||||||
|
|||||||
@@ -1425,22 +1425,6 @@ components:
|
|||||||
type: boolean
|
type: boolean
|
||||||
token:
|
token:
|
||||||
type: string
|
type: string
|
||||||
LunaSeaSettings:
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
enabled:
|
|
||||||
type: boolean
|
|
||||||
example: false
|
|
||||||
types:
|
|
||||||
type: number
|
|
||||||
example: 2
|
|
||||||
options:
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
webhookUrl:
|
|
||||||
type: string
|
|
||||||
profileName:
|
|
||||||
type: string
|
|
||||||
NotificationEmailSettings:
|
NotificationEmailSettings:
|
||||||
type: object
|
type: object
|
||||||
properties:
|
properties:
|
||||||
@@ -3099,52 +3083,6 @@ paths:
|
|||||||
responses:
|
responses:
|
||||||
'204':
|
'204':
|
||||||
description: Test notification attempted
|
description: Test notification attempted
|
||||||
/settings/notifications/lunasea:
|
|
||||||
get:
|
|
||||||
summary: Get LunaSea notification settings
|
|
||||||
description: Returns current LunaSea notification settings in a JSON object.
|
|
||||||
tags:
|
|
||||||
- settings
|
|
||||||
responses:
|
|
||||||
'200':
|
|
||||||
description: Returned LunaSea settings
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: '#/components/schemas/LunaSeaSettings'
|
|
||||||
post:
|
|
||||||
summary: Update LunaSea notification settings
|
|
||||||
description: Updates LunaSea notification settings with the provided values.
|
|
||||||
tags:
|
|
||||||
- settings
|
|
||||||
requestBody:
|
|
||||||
required: true
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: '#/components/schemas/LunaSeaSettings'
|
|
||||||
responses:
|
|
||||||
'200':
|
|
||||||
description: 'Values were sucessfully updated'
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: '#/components/schemas/LunaSeaSettings'
|
|
||||||
/settings/notifications/lunasea/test:
|
|
||||||
post:
|
|
||||||
summary: Test LunaSea settings
|
|
||||||
description: Sends a test notification to the LunaSea agent.
|
|
||||||
tags:
|
|
||||||
- settings
|
|
||||||
requestBody:
|
|
||||||
required: true
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
$ref: '#/components/schemas/LunaSeaSettings'
|
|
||||||
responses:
|
|
||||||
'204':
|
|
||||||
description: Test notification attempted
|
|
||||||
/settings/notifications/pushbullet:
|
/settings/notifications/pushbullet:
|
||||||
get:
|
get:
|
||||||
summary: Get Pushbullet notification settings
|
summary: Get Pushbullet notification settings
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ import notificationManager from '@server/lib/notifications';
|
|||||||
import DiscordAgent from '@server/lib/notifications/agents/discord';
|
import DiscordAgent from '@server/lib/notifications/agents/discord';
|
||||||
import EmailAgent from '@server/lib/notifications/agents/email';
|
import EmailAgent from '@server/lib/notifications/agents/email';
|
||||||
import GotifyAgent from '@server/lib/notifications/agents/gotify';
|
import GotifyAgent from '@server/lib/notifications/agents/gotify';
|
||||||
import LunaSeaAgent from '@server/lib/notifications/agents/lunasea';
|
|
||||||
import NtfyAgent from '@server/lib/notifications/agents/ntfy';
|
import NtfyAgent from '@server/lib/notifications/agents/ntfy';
|
||||||
import PushbulletAgent from '@server/lib/notifications/agents/pushbullet';
|
import PushbulletAgent from '@server/lib/notifications/agents/pushbullet';
|
||||||
import PushoverAgent from '@server/lib/notifications/agents/pushover';
|
import PushoverAgent from '@server/lib/notifications/agents/pushover';
|
||||||
@@ -113,7 +112,6 @@ app
|
|||||||
new EmailAgent(),
|
new EmailAgent(),
|
||||||
new GotifyAgent(),
|
new GotifyAgent(),
|
||||||
new NtfyAgent(),
|
new NtfyAgent(),
|
||||||
new LunaSeaAgent(),
|
|
||||||
new PushbulletAgent(),
|
new PushbulletAgent(),
|
||||||
new PushoverAgent(),
|
new PushoverAgent(),
|
||||||
new SlackAgent(),
|
new SlackAgent(),
|
||||||
|
|||||||
@@ -1,133 +0,0 @@
|
|||||||
import { IssueStatus, IssueType } from '@server/constants/issue';
|
|
||||||
import { MediaStatus } from '@server/constants/media';
|
|
||||||
import type { NotificationAgentLunaSea } from '@server/lib/settings';
|
|
||||||
import { getSettings } from '@server/lib/settings';
|
|
||||||
import logger from '@server/logger';
|
|
||||||
import axios from 'axios';
|
|
||||||
import { hasNotificationType, Notification } from '..';
|
|
||||||
import type { NotificationAgent, NotificationPayload } from './agent';
|
|
||||||
import { BaseAgent } from './agent';
|
|
||||||
|
|
||||||
class LunaSeaAgent
|
|
||||||
extends BaseAgent<NotificationAgentLunaSea>
|
|
||||||
implements NotificationAgent
|
|
||||||
{
|
|
||||||
protected getSettings(): NotificationAgentLunaSea {
|
|
||||||
if (this.settings) {
|
|
||||||
return this.settings;
|
|
||||||
}
|
|
||||||
|
|
||||||
const settings = getSettings();
|
|
||||||
|
|
||||||
return settings.notifications.agents.lunasea;
|
|
||||||
}
|
|
||||||
|
|
||||||
private buildPayload(type: Notification, payload: NotificationPayload) {
|
|
||||||
return {
|
|
||||||
notification_type: Notification[type],
|
|
||||||
event: payload.event,
|
|
||||||
subject: payload.subject,
|
|
||||||
message: payload.message,
|
|
||||||
image: payload.image ?? null,
|
|
||||||
email: payload.notifyUser?.email,
|
|
||||||
username: payload.notifyUser?.displayName,
|
|
||||||
avatar: payload.notifyUser?.avatar,
|
|
||||||
media: payload.media
|
|
||||||
? {
|
|
||||||
media_type: payload.media.mediaType,
|
|
||||||
tmdbId: payload.media.tmdbId,
|
|
||||||
tvdbId: payload.media.tvdbId,
|
|
||||||
status: MediaStatus[payload.media.status],
|
|
||||||
status4k: MediaStatus[payload.media.status4k],
|
|
||||||
}
|
|
||||||
: null,
|
|
||||||
extra: payload.extra ?? [],
|
|
||||||
request: payload.request
|
|
||||||
? {
|
|
||||||
request_id: payload.request.id,
|
|
||||||
requestedBy_email: payload.request.requestedBy.email,
|
|
||||||
requestedBy_username: payload.request.requestedBy.displayName,
|
|
||||||
requestedBy_avatar: payload.request.requestedBy.avatar,
|
|
||||||
}
|
|
||||||
: null,
|
|
||||||
issue: payload.issue
|
|
||||||
? {
|
|
||||||
issue_id: payload.issue.id,
|
|
||||||
issue_type: IssueType[payload.issue.issueType],
|
|
||||||
issue_status: IssueStatus[payload.issue.status],
|
|
||||||
createdBy_email: payload.issue.createdBy.email,
|
|
||||||
createdBy_username: payload.issue.createdBy.displayName,
|
|
||||||
createdBy_avatar: payload.issue.createdBy.avatar,
|
|
||||||
}
|
|
||||||
: null,
|
|
||||||
comment: payload.comment
|
|
||||||
? {
|
|
||||||
comment_message: payload.comment.message,
|
|
||||||
commentedBy_email: payload.comment.user.email,
|
|
||||||
commentedBy_username: payload.comment.user.displayName,
|
|
||||||
commentedBy_avatar: payload.comment.user.avatar,
|
|
||||||
}
|
|
||||||
: null,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
public shouldSend(): boolean {
|
|
||||||
const settings = this.getSettings();
|
|
||||||
|
|
||||||
if (settings.enabled && settings.options.webhookUrl) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async send(
|
|
||||||
type: Notification,
|
|
||||||
payload: NotificationPayload
|
|
||||||
): Promise<boolean> {
|
|
||||||
const settings = this.getSettings();
|
|
||||||
|
|
||||||
if (
|
|
||||||
!payload.notifySystem ||
|
|
||||||
!hasNotificationType(type, settings.types ?? 0)
|
|
||||||
) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
logger.debug('Sending LunaSea notification', {
|
|
||||||
label: 'Notifications',
|
|
||||||
type: Notification[type],
|
|
||||||
subject: payload.subject,
|
|
||||||
});
|
|
||||||
|
|
||||||
try {
|
|
||||||
await axios.post(
|
|
||||||
settings.options.webhookUrl,
|
|
||||||
this.buildPayload(type, payload),
|
|
||||||
settings.options.profileName
|
|
||||||
? {
|
|
||||||
headers: {
|
|
||||||
Authorization: `Basic ${Buffer.from(
|
|
||||||
`${settings.options.profileName}:`
|
|
||||||
).toString('base64')}`,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
: undefined
|
|
||||||
);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
} catch (e) {
|
|
||||||
logger.error('Error sending LunaSea notification', {
|
|
||||||
label: 'Notifications',
|
|
||||||
type: Notification[type],
|
|
||||||
subject: payload.subject,
|
|
||||||
errorMessage: e.message,
|
|
||||||
response: e?.response?.data,
|
|
||||||
});
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export default LunaSeaAgent;
|
|
||||||
@@ -216,13 +216,6 @@ export interface NotificationAgentEmail extends NotificationAgentConfig {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface NotificationAgentLunaSea extends NotificationAgentConfig {
|
|
||||||
options: {
|
|
||||||
webhookUrl: string;
|
|
||||||
profileName?: string;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface NotificationAgentTelegram extends NotificationAgentConfig {
|
export interface NotificationAgentTelegram extends NotificationAgentConfig {
|
||||||
options: {
|
options: {
|
||||||
botUsername?: string;
|
botUsername?: string;
|
||||||
@@ -294,7 +287,6 @@ interface NotificationAgents {
|
|||||||
email: NotificationAgentEmail;
|
email: NotificationAgentEmail;
|
||||||
gotify: NotificationAgentGotify;
|
gotify: NotificationAgentGotify;
|
||||||
ntfy: NotificationAgentNtfy;
|
ntfy: NotificationAgentNtfy;
|
||||||
lunasea: NotificationAgentLunaSea;
|
|
||||||
pushbullet: NotificationAgentPushbullet;
|
pushbullet: NotificationAgentPushbullet;
|
||||||
pushover: NotificationAgentPushover;
|
pushover: NotificationAgentPushover;
|
||||||
slack: NotificationAgentSlack;
|
slack: NotificationAgentSlack;
|
||||||
@@ -430,13 +422,6 @@ class Settings {
|
|||||||
enableMentions: true,
|
enableMentions: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
lunasea: {
|
|
||||||
enabled: false,
|
|
||||||
types: 0,
|
|
||||||
options: {
|
|
||||||
webhookUrl: '',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
slack: {
|
slack: {
|
||||||
enabled: false,
|
enabled: false,
|
||||||
types: 0,
|
types: 0,
|
||||||
|
|||||||
14
server/lib/settings/migrations/0006_remove_lunasea.ts
Normal file
14
server/lib/settings/migrations/0006_remove_lunasea.ts
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
import type { AllSettings } from '@server/lib/settings';
|
||||||
|
|
||||||
|
const removeLunaSeaSetting = (settings: any): AllSettings => {
|
||||||
|
if (
|
||||||
|
settings.notifications &&
|
||||||
|
settings.notifications.agents &&
|
||||||
|
settings.notifications.agents.lunasea
|
||||||
|
) {
|
||||||
|
delete settings.notifications.agents.lunasea;
|
||||||
|
}
|
||||||
|
return settings;
|
||||||
|
};
|
||||||
|
|
||||||
|
export default removeLunaSeaSetting;
|
||||||
@@ -4,7 +4,6 @@ import type { NotificationAgent } from '@server/lib/notifications/agents/agent';
|
|||||||
import DiscordAgent from '@server/lib/notifications/agents/discord';
|
import DiscordAgent from '@server/lib/notifications/agents/discord';
|
||||||
import EmailAgent from '@server/lib/notifications/agents/email';
|
import EmailAgent from '@server/lib/notifications/agents/email';
|
||||||
import GotifyAgent from '@server/lib/notifications/agents/gotify';
|
import GotifyAgent from '@server/lib/notifications/agents/gotify';
|
||||||
import LunaSeaAgent from '@server/lib/notifications/agents/lunasea';
|
|
||||||
import NtfyAgent from '@server/lib/notifications/agents/ntfy';
|
import NtfyAgent from '@server/lib/notifications/agents/ntfy';
|
||||||
import PushbulletAgent from '@server/lib/notifications/agents/pushbullet';
|
import PushbulletAgent from '@server/lib/notifications/agents/pushbullet';
|
||||||
import PushoverAgent from '@server/lib/notifications/agents/pushover';
|
import PushoverAgent from '@server/lib/notifications/agents/pushover';
|
||||||
@@ -346,40 +345,6 @@ notificationRoutes.post('/webhook/test', async (req, res, next) => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
notificationRoutes.get('/lunasea', (_req, res) => {
|
|
||||||
const settings = getSettings();
|
|
||||||
|
|
||||||
res.status(200).json(settings.notifications.agents.lunasea);
|
|
||||||
});
|
|
||||||
|
|
||||||
notificationRoutes.post('/lunasea', async (req, res) => {
|
|
||||||
const settings = getSettings();
|
|
||||||
|
|
||||||
settings.notifications.agents.lunasea = req.body;
|
|
||||||
await settings.save();
|
|
||||||
|
|
||||||
res.status(200).json(settings.notifications.agents.lunasea);
|
|
||||||
});
|
|
||||||
|
|
||||||
notificationRoutes.post('/lunasea/test', async (req, res, next) => {
|
|
||||||
if (!req.user) {
|
|
||||||
return next({
|
|
||||||
status: 500,
|
|
||||||
message: 'User information is missing from the request.',
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const lunaseaAgent = new LunaSeaAgent(req.body);
|
|
||||||
if (await sendTestNotification(lunaseaAgent, req.user)) {
|
|
||||||
return res.status(204).send();
|
|
||||||
} else {
|
|
||||||
return next({
|
|
||||||
status: 500,
|
|
||||||
message: 'Failed to send web push notification.',
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
notificationRoutes.get('/gotify', (_req, res) => {
|
notificationRoutes.get('/gotify', (_req, res) => {
|
||||||
const settings = getSettings();
|
const settings = getSettings();
|
||||||
|
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
<svg viewBox="0 0 750 750" xmlns="http://www.w3.org/2000/svg"><g fill="currentColor"><path d="m554.69 180.46c-333.63 0-452.75 389.23-556.05 389.23 185.37 0 237.85-247.18 419.12-247.18l47.24-102.05z"/><path d="m749.31 375.08c0 107.48-87.14 194.61-194.62 194.61s-194.62-87.13-194.62-194.61 87.13-194.62 194.62-194.62c7.391-2e-3 14.776 0.412 22.12 1.24-78.731 10.172-136.59 78.893-133.2 158.2 3.393 79.313 66.907 142.84 146.22 146.25 79.311 3.411 148.05-54.43 158.24-133.16 0.826 7.331 1.24 14.703 1.24 22.08z"/></g></svg>
|
|
||||||
|
Before Width: | Height: | Size: 519 B |
@@ -1,272 +0,0 @@
|
|||||||
import Button from '@app/components/Common/Button';
|
|
||||||
import LoadingSpinner from '@app/components/Common/LoadingSpinner';
|
|
||||||
import NotificationTypeSelector from '@app/components/NotificationTypeSelector';
|
|
||||||
import globalMessages from '@app/i18n/globalMessages';
|
|
||||||
import defineMessages from '@app/utils/defineMessages';
|
|
||||||
import { ArrowDownOnSquareIcon, BeakerIcon } from '@heroicons/react/24/outline';
|
|
||||||
import axios from 'axios';
|
|
||||||
import { Field, Form, Formik } from 'formik';
|
|
||||||
import { useState } from 'react';
|
|
||||||
import { useIntl } from 'react-intl';
|
|
||||||
import { useToasts } from 'react-toast-notifications';
|
|
||||||
import useSWR from 'swr';
|
|
||||||
import * as Yup from 'yup';
|
|
||||||
|
|
||||||
const messages = defineMessages(
|
|
||||||
'components.Settings.Notifications.NotificationsLunaSea',
|
|
||||||
{
|
|
||||||
agentenabled: 'Enable Agent',
|
|
||||||
webhookUrl: 'Webhook URL',
|
|
||||||
webhookUrlTip:
|
|
||||||
'Your user- or device-based <LunaSeaLink>notification webhook URL</LunaSeaLink>',
|
|
||||||
validationWebhookUrl: 'You must provide a valid URL',
|
|
||||||
profileName: 'Profile Name',
|
|
||||||
profileNameTip:
|
|
||||||
'Only required if not using the <code>default</code> profile',
|
|
||||||
settingsSaved: 'LunaSea notification settings saved successfully!',
|
|
||||||
settingsFailed: 'LunaSea notification settings failed to save.',
|
|
||||||
toastLunaSeaTestSending: 'Sending LunaSea test notification…',
|
|
||||||
toastLunaSeaTestSuccess: 'LunaSea test notification sent!',
|
|
||||||
toastLunaSeaTestFailed: 'LunaSea test notification failed to send.',
|
|
||||||
validationTypes: 'You must select at least one notification type',
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
const NotificationsLunaSea = () => {
|
|
||||||
const intl = useIntl();
|
|
||||||
const { addToast, removeToast } = useToasts();
|
|
||||||
const [isTesting, setIsTesting] = useState(false);
|
|
||||||
const {
|
|
||||||
data,
|
|
||||||
error,
|
|
||||||
mutate: revalidate,
|
|
||||||
} = useSWR('/api/v1/settings/notifications/lunasea');
|
|
||||||
|
|
||||||
const NotificationsLunaSeaSchema = Yup.object().shape({
|
|
||||||
webhookUrl: Yup.string()
|
|
||||||
.when('enabled', {
|
|
||||||
is: true,
|
|
||||||
then: Yup.string()
|
|
||||||
.nullable()
|
|
||||||
.required(intl.formatMessage(messages.validationWebhookUrl)),
|
|
||||||
otherwise: Yup.string().nullable(),
|
|
||||||
})
|
|
||||||
.url(intl.formatMessage(messages.validationWebhookUrl)),
|
|
||||||
});
|
|
||||||
|
|
||||||
if (!data && !error) {
|
|
||||||
return <LoadingSpinner />;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
<Formik
|
|
||||||
initialValues={{
|
|
||||||
enabled: data.enabled,
|
|
||||||
types: data.types,
|
|
||||||
webhookUrl: data.options.webhookUrl,
|
|
||||||
profileName: data.options.profileName,
|
|
||||||
}}
|
|
||||||
validationSchema={NotificationsLunaSeaSchema}
|
|
||||||
onSubmit={async (values) => {
|
|
||||||
try {
|
|
||||||
await axios.post('/api/v1/settings/notifications/lunasea', {
|
|
||||||
enabled: values.enabled,
|
|
||||||
types: values.types,
|
|
||||||
options: {
|
|
||||||
webhookUrl: values.webhookUrl,
|
|
||||||
profileName: values.profileName,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
addToast(intl.formatMessage(messages.settingsSaved), {
|
|
||||||
appearance: 'success',
|
|
||||||
autoDismiss: true,
|
|
||||||
});
|
|
||||||
} catch (e) {
|
|
||||||
addToast(intl.formatMessage(messages.settingsFailed), {
|
|
||||||
appearance: 'error',
|
|
||||||
autoDismiss: true,
|
|
||||||
});
|
|
||||||
} finally {
|
|
||||||
revalidate();
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{({
|
|
||||||
errors,
|
|
||||||
touched,
|
|
||||||
isSubmitting,
|
|
||||||
values,
|
|
||||||
isValid,
|
|
||||||
setFieldValue,
|
|
||||||
setFieldTouched,
|
|
||||||
}) => {
|
|
||||||
const testSettings = async () => {
|
|
||||||
setIsTesting(true);
|
|
||||||
let toastId: string | undefined;
|
|
||||||
try {
|
|
||||||
addToast(
|
|
||||||
intl.formatMessage(messages.toastLunaSeaTestSending),
|
|
||||||
{
|
|
||||||
autoDismiss: false,
|
|
||||||
appearance: 'info',
|
|
||||||
},
|
|
||||||
(id) => {
|
|
||||||
toastId = id;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
await axios.post('/api/v1/settings/notifications/lunasea/test', {
|
|
||||||
enabled: true,
|
|
||||||
types: values.types,
|
|
||||||
options: {
|
|
||||||
webhookUrl: values.webhookUrl,
|
|
||||||
profileName: values.profileName,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
if (toastId) {
|
|
||||||
removeToast(toastId);
|
|
||||||
}
|
|
||||||
addToast(intl.formatMessage(messages.toastLunaSeaTestSuccess), {
|
|
||||||
autoDismiss: true,
|
|
||||||
appearance: 'success',
|
|
||||||
});
|
|
||||||
} catch (e) {
|
|
||||||
if (toastId) {
|
|
||||||
removeToast(toastId);
|
|
||||||
}
|
|
||||||
addToast(intl.formatMessage(messages.toastLunaSeaTestFailed), {
|
|
||||||
autoDismiss: true,
|
|
||||||
appearance: 'error',
|
|
||||||
});
|
|
||||||
} finally {
|
|
||||||
setIsTesting(false);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
|
||||||
<Form className="section">
|
|
||||||
<div className="form-row">
|
|
||||||
<label htmlFor="enabled" className="checkbox-label">
|
|
||||||
{intl.formatMessage(messages.agentenabled)}
|
|
||||||
<span className="label-required">*</span>
|
|
||||||
</label>
|
|
||||||
<div className="form-input-area">
|
|
||||||
<Field type="checkbox" id="enabled" name="enabled" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div className="form-row">
|
|
||||||
<label htmlFor="name" className="text-label">
|
|
||||||
{intl.formatMessage(messages.webhookUrl)}
|
|
||||||
<span className="label-required">*</span>
|
|
||||||
<span className="label-tip">
|
|
||||||
{intl.formatMessage(messages.webhookUrlTip, {
|
|
||||||
LunaSeaLink: (msg: React.ReactNode) => (
|
|
||||||
<a
|
|
||||||
href="https://docs.lunasea.app/lunasea/notifications/overseerr"
|
|
||||||
className="text-white transition duration-300 hover:underline"
|
|
||||||
target="_blank"
|
|
||||||
rel="noreferrer"
|
|
||||||
>
|
|
||||||
{msg}
|
|
||||||
</a>
|
|
||||||
),
|
|
||||||
})}
|
|
||||||
</span>
|
|
||||||
</label>
|
|
||||||
<div className="form-input-area">
|
|
||||||
<div className="form-input-field">
|
|
||||||
<Field
|
|
||||||
id="webhookUrl"
|
|
||||||
name="webhookUrl"
|
|
||||||
type="text"
|
|
||||||
inputMode="url"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
{errors.webhookUrl &&
|
|
||||||
touched.webhookUrl &&
|
|
||||||
typeof errors.webhookUrl === 'string' && (
|
|
||||||
<div className="error">{errors.webhookUrl}</div>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div className="form-row">
|
|
||||||
<label htmlFor="profileName" className="text-label">
|
|
||||||
{intl.formatMessage(messages.profileName)}
|
|
||||||
<span className="label-tip">
|
|
||||||
{intl.formatMessage(messages.profileNameTip, {
|
|
||||||
code: (msg: React.ReactNode) => (
|
|
||||||
<code className="bg-opacity-50">{msg}</code>
|
|
||||||
),
|
|
||||||
})}
|
|
||||||
</span>
|
|
||||||
</label>
|
|
||||||
<div className="form-input-area">
|
|
||||||
<div className="form-input-field">
|
|
||||||
<Field id="profileName" name="profileName" type="text" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<NotificationTypeSelector
|
|
||||||
currentTypes={values.enabled ? values.types : 0}
|
|
||||||
onUpdate={(newTypes) => {
|
|
||||||
setFieldValue('types', newTypes);
|
|
||||||
setFieldTouched('types');
|
|
||||||
|
|
||||||
if (newTypes) {
|
|
||||||
setFieldValue('enabled', true);
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
error={
|
|
||||||
values.enabled && !values.types && touched.types
|
|
||||||
? intl.formatMessage(messages.validationTypes)
|
|
||||||
: undefined
|
|
||||||
}
|
|
||||||
/>
|
|
||||||
<div className="actions">
|
|
||||||
<div className="flex justify-end">
|
|
||||||
<span className="ml-3 inline-flex rounded-md shadow-sm">
|
|
||||||
<Button
|
|
||||||
buttonType="warning"
|
|
||||||
disabled={isSubmitting || !isValid || isTesting}
|
|
||||||
onClick={(e) => {
|
|
||||||
e.preventDefault();
|
|
||||||
testSettings();
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<BeakerIcon />
|
|
||||||
<span>
|
|
||||||
{isTesting
|
|
||||||
? intl.formatMessage(globalMessages.testing)
|
|
||||||
: intl.formatMessage(globalMessages.test)}
|
|
||||||
</span>
|
|
||||||
</Button>
|
|
||||||
</span>
|
|
||||||
<span className="ml-3 inline-flex rounded-md shadow-sm">
|
|
||||||
<Button
|
|
||||||
buttonType="primary"
|
|
||||||
type="submit"
|
|
||||||
disabled={
|
|
||||||
isSubmitting ||
|
|
||||||
!isValid ||
|
|
||||||
isTesting ||
|
|
||||||
(values.enabled && !values.types)
|
|
||||||
}
|
|
||||||
>
|
|
||||||
<ArrowDownOnSquareIcon />
|
|
||||||
<span>
|
|
||||||
{isSubmitting
|
|
||||||
? intl.formatMessage(globalMessages.saving)
|
|
||||||
: intl.formatMessage(globalMessages.save)}
|
|
||||||
</span>
|
|
||||||
</Button>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</Form>
|
|
||||||
);
|
|
||||||
}}
|
|
||||||
</Formik>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
export default NotificationsLunaSea;
|
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
import DiscordLogo from '@app/assets/extlogos/discord.svg';
|
import DiscordLogo from '@app/assets/extlogos/discord.svg';
|
||||||
import GotifyLogo from '@app/assets/extlogos/gotify.svg';
|
import GotifyLogo from '@app/assets/extlogos/gotify.svg';
|
||||||
import LunaSeaLogo from '@app/assets/extlogos/lunasea.svg';
|
|
||||||
import NtfyLogo from '@app/assets/extlogos/ntfy.svg';
|
import NtfyLogo from '@app/assets/extlogos/ntfy.svg';
|
||||||
import PushbulletLogo from '@app/assets/extlogos/pushbullet.svg';
|
import PushbulletLogo from '@app/assets/extlogos/pushbullet.svg';
|
||||||
import PushoverLogo from '@app/assets/extlogos/pushover.svg';
|
import PushoverLogo from '@app/assets/extlogos/pushover.svg';
|
||||||
@@ -87,17 +86,6 @@ const SettingsNotifications = ({ children }: SettingsNotificationsProps) => {
|
|||||||
route: '/settings/notifications/ntfy',
|
route: '/settings/notifications/ntfy',
|
||||||
regex: /^\/settings\/notifications\/ntfy/,
|
regex: /^\/settings\/notifications\/ntfy/,
|
||||||
},
|
},
|
||||||
{
|
|
||||||
text: 'LunaSea',
|
|
||||||
content: (
|
|
||||||
<span className="flex items-center">
|
|
||||||
<LunaSeaLogo className="mr-2 h-4" />
|
|
||||||
LunaSea
|
|
||||||
</span>
|
|
||||||
),
|
|
||||||
route: '/settings/notifications/lunasea',
|
|
||||||
regex: /^\/settings\/notifications\/lunasea/,
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
text: 'Pushbullet',
|
text: 'Pushbullet',
|
||||||
content: (
|
content: (
|
||||||
|
|||||||
@@ -620,18 +620,6 @@
|
|||||||
"components.Settings.Notifications.NotificationsGotify.validationTypes": "You must select at least one notification type",
|
"components.Settings.Notifications.NotificationsGotify.validationTypes": "You must select at least one notification type",
|
||||||
"components.Settings.Notifications.NotificationsGotify.validationUrlRequired": "You must provide a valid URL",
|
"components.Settings.Notifications.NotificationsGotify.validationUrlRequired": "You must provide a valid URL",
|
||||||
"components.Settings.Notifications.NotificationsGotify.validationUrlTrailingSlash": "URL must not end in a trailing slash",
|
"components.Settings.Notifications.NotificationsGotify.validationUrlTrailingSlash": "URL must not end in a trailing slash",
|
||||||
"components.Settings.Notifications.NotificationsLunaSea.agentenabled": "Enable Agent",
|
|
||||||
"components.Settings.Notifications.NotificationsLunaSea.profileName": "Profile Name",
|
|
||||||
"components.Settings.Notifications.NotificationsLunaSea.profileNameTip": "Only required if not using the <code>default</code> profile",
|
|
||||||
"components.Settings.Notifications.NotificationsLunaSea.settingsFailed": "LunaSea notification settings failed to save.",
|
|
||||||
"components.Settings.Notifications.NotificationsLunaSea.settingsSaved": "LunaSea notification settings saved successfully!",
|
|
||||||
"components.Settings.Notifications.NotificationsLunaSea.toastLunaSeaTestFailed": "LunaSea test notification failed to send.",
|
|
||||||
"components.Settings.Notifications.NotificationsLunaSea.toastLunaSeaTestSending": "Sending LunaSea test notification…",
|
|
||||||
"components.Settings.Notifications.NotificationsLunaSea.toastLunaSeaTestSuccess": "LunaSea test notification sent!",
|
|
||||||
"components.Settings.Notifications.NotificationsLunaSea.validationTypes": "You must select at least one notification type",
|
|
||||||
"components.Settings.Notifications.NotificationsLunaSea.validationWebhookUrl": "You must provide a valid URL",
|
|
||||||
"components.Settings.Notifications.NotificationsLunaSea.webhookUrl": "Webhook URL",
|
|
||||||
"components.Settings.Notifications.NotificationsLunaSea.webhookUrlTip": "Your user- or device-based <LunaSeaLink>notification webhook URL</LunaSeaLink>",
|
|
||||||
"components.Settings.Notifications.NotificationsNtfy.agentenabled": "Enable Agent",
|
"components.Settings.Notifications.NotificationsNtfy.agentenabled": "Enable Agent",
|
||||||
"components.Settings.Notifications.NotificationsNtfy.ntfysettingsfailed": "Ntfy notification settings failed to save.",
|
"components.Settings.Notifications.NotificationsNtfy.ntfysettingsfailed": "Ntfy notification settings failed to save.",
|
||||||
"components.Settings.Notifications.NotificationsNtfy.ntfysettingssaved": "Ntfy notification settings saved successfully!",
|
"components.Settings.Notifications.NotificationsNtfy.ntfysettingssaved": "Ntfy notification settings saved successfully!",
|
||||||
|
|||||||
@@ -1,19 +0,0 @@
|
|||||||
import NotificationsLunaSea from '@app/components/Settings/Notifications/NotificationsLunaSea';
|
|
||||||
import SettingsLayout from '@app/components/Settings/SettingsLayout';
|
|
||||||
import SettingsNotifications from '@app/components/Settings/SettingsNotifications';
|
|
||||||
import useRouteGuard from '@app/hooks/useRouteGuard';
|
|
||||||
import { Permission } from '@app/hooks/useUser';
|
|
||||||
import type { NextPage } from 'next';
|
|
||||||
|
|
||||||
const NotificationsPage: NextPage = () => {
|
|
||||||
useRouteGuard(Permission.ADMIN);
|
|
||||||
return (
|
|
||||||
<SettingsLayout>
|
|
||||||
<SettingsNotifications>
|
|
||||||
<NotificationsLunaSea />
|
|
||||||
</SettingsNotifications>
|
|
||||||
</SettingsLayout>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
export default NotificationsPage;
|
|
||||||
Reference in New Issue
Block a user