diff --git a/app/src/main/frontend/components/general/cards/UserManagementCard.tsx b/app/src/main/frontend/components/general/cards/UserManagementCard.tsx index cd33c65..5521e35 100644 --- a/app/src/main/frontend/components/general/cards/UserManagementCard.tsx +++ b/app/src/main/frontend/components/general/cards/UserManagementCard.tsx @@ -1,6 +1,5 @@ import {Card, Dropdown, DropdownItem, DropdownMenu, DropdownTrigger, useDisclosure} from "@heroui/react"; import {DotsThreeVertical} from "@phosphor-icons/react"; -import {useAuth} from "Frontend/util/auth"; import {useEffect, useState} from "react"; import {MessageEndpoint, PasswordResetEndpoint, UserEndpoint} from "Frontend/generated/endpoints"; import {AvatarEndpoint} from "Frontend/endpoints/endpoints"; @@ -20,7 +19,6 @@ export function UserManagementCard({user}: { user: UserInfoDto }) { const [disabledKeys, setDisabledKeys] = useState([]); const [dropdownItems, setDropdownItems] = useState([]); const [passwordResetToken, setPasswordResetToken] = useState(); - const auth = useAuth(); useEffect(() => { setUserEnabled(user.enabled); diff --git a/app/src/main/frontend/components/general/modals/InviteUserModal.tsx b/app/src/main/frontend/components/general/modals/InviteUserModal.tsx index 13b5bdf..fd06199 100644 --- a/app/src/main/frontend/components/general/modals/InviteUserModal.tsx +++ b/app/src/main/frontend/components/general/modals/InviteUserModal.tsx @@ -1,6 +1,10 @@ import React, {useEffect, useState} from "react"; -import {addToast, Button, Input, Modal, ModalBody, ModalContent, ModalFooter, ModalHeader} from "@heroui/react"; -import {RegistrationEndpoint, UserEndpoint} from "Frontend/generated/endpoints"; +import {addToast, Button, Modal, ModalBody, ModalContent, ModalFooter, ModalHeader, Snippet} from "@heroui/react"; +import {MessageEndpoint, RegistrationEndpoint, UserEndpoint} from "Frontend/generated/endpoints"; +import TokenDto from "Frontend/generated/org/gameyfin/app/shared/token/TokenDto"; +import {Form, Formik, FormikErrors} from "formik"; +import Input from "Frontend/components/general/input/Input"; +import * as Yup from "yup"; interface InviteUserModalProps { isOpen: boolean; @@ -8,56 +12,88 @@ interface InviteUserModalProps { } export default function InviteUserModal({isOpen, onOpenChange}: InviteUserModalProps) { - const [email, setEmail] = useState(); - const [error, setError] = useState(); + const [token, setToken] = useState(null); + const [isMessageServiceEnabled, setIsMessageServiceEnabled] = useState(false); useEffect(() => { - setEmail(null); - setError(null); - }, []); + setToken(null); + MessageEndpoint.isEnabled().then(enabled => { + setIsMessageServiceEnabled(enabled); + }); + }, [isOpen]); - async function inviteUser(onClose: () => void) { + async function inviteUser(email: string, setErrors: (errors: FormikErrors) => void, onClose: () => void) { if (!email) return; if (await UserEndpoint.existsByMail(email)) { - setError("User with this email already exists"); + setErrors({email: "User with this email already exists"}); return; } - try { - await RegistrationEndpoint.createInvitation(email); - addToast({ - title: "Invitation sent", - description: "The user will receive an email with further instructions shortly.", - color: "success" - }); - onClose(); - } catch (e) { - setError("Failed to create invitation"); + if (!isMessageServiceEnabled) { + let token = await RegistrationEndpoint.createInvitation(email); + setToken(token); + return; } + + await RegistrationEndpoint.createInvitation(email); + addToast({ + title: "Invitation sent", + description: "The user will receive an email with further instructions shortly.", + color: "success" + }); + onClose(); } return ( - + {(onClose) => ( - <> - Invite a new user - -

Enter the email address of the user you want to invite:

- setEmail(e.target.value)} type="email"/> - {error && {error}} -
- - - - - + { + await inviteUser(values.email, setErrors, onClose); + }} + > + {(formik) => ( +
+ Invite a new user + +

Enter the email address of the user you want to invite:

+ + + {token && ( +
+

The user can accept the invitation using the following link:

+ + {`${document.baseURI}accept-invitation?token=${token.secret}`} + +
+ )} +
+ + + + +
+ )} +
)}