import { InboxInIcon } from '@heroicons/react/solid'; import axios from 'axios'; import React, { useState } from 'react'; import { defineMessages, useIntl } from 'react-intl'; import { useToasts } from 'react-toast-notifications'; import useSWR from 'swr'; import useSettings from '../../hooks/useSettings'; import globalMessages from '../../i18n/globalMessages'; import Alert from '../Common/Alert'; import Modal from '../Common/Modal'; interface JellyfinImportProps { onCancel?: () => void; onComplete?: () => void; } const messages = defineMessages({ importfromJellyfin: 'Import {mediaServerName} Users', importfromJellyfinerror: 'Something went wrong while importing {mediaServerName} users.', importedfromJellyfin: '{userCount} {mediaServerName} {userCount, plural, one {user} other {users}} imported successfully!', user: 'User', noJellyfinuserstoimport: 'There are no {mediaServerName} users to import.', newJellyfinsigninenabled: 'The Enable New {mediaServerName} Sign-In setting is currently enabled. {mediaServerName} users with library access do not need to be imported in order to sign in.', }); const JellyfinImportModal: React.FC = ({ onCancel, onComplete, }) => { const intl = useIntl(); const settings = useSettings(); const { addToast } = useToasts(); const [isImporting, setImporting] = useState(false); const [selectedUsers, setSelectedUsers] = useState([]); const { data, error } = useSWR< { id: string; title: string; username: string; email: string; thumb: string; }[] >(`/api/v1/settings/jellyfin/users`, { revalidateOnMount: true, }); const importUsers = async () => { setImporting(true); try { const { data: createdUsers } = await axios.post( '/api/v1/user/import-from-jellyfin', { jellyfinUserIds: selectedUsers } ); if (!createdUsers.length) { throw new Error('No users were imported from Jellyfin.'); } addToast( intl.formatMessage(messages.importedfromJellyfin, { userCount: createdUsers.length, strong: function strong(msg) { return {msg}; }, mediaServerName: process.env.JELLYFIN_TYPE == 'emby' ? 'Emby' : 'Jellyfin', }), { autoDismiss: true, appearance: 'success', } ); if (onComplete) { onComplete(); } } catch (e) { addToast( intl.formatMessage(messages.importfromJellyfinerror, { mediaServerName: process.env.JELLYFIN_TYPE == 'emby' ? 'Emby' : 'Jellyfin', }), { autoDismiss: true, appearance: 'error', } ); } finally { setImporting(false); } }; const isSelectedUser = (JellyfinId: string): boolean => selectedUsers.includes(JellyfinId); const isAllUsers = (): boolean => selectedUsers.length === data?.length; const toggleUser = (JellyfinId: string): void => { if (selectedUsers.includes(JellyfinId)) { setSelectedUsers((users) => users.filter((user) => user !== JellyfinId)); } else { setSelectedUsers((users) => [...users, JellyfinId]); } }; const toggleAllUsers = (): void => { if (data && selectedUsers.length >= 0 && !isAllUsers()) { setSelectedUsers(data.map((user) => user.id)); } else { setSelectedUsers([]); } }; return ( } onOk={() => { importUsers(); }} okDisabled={isImporting || !selectedUsers.length} okText={intl.formatMessage( isImporting ? globalMessages.importing : globalMessages.import )} onCancel={onCancel} > {data?.length ? ( <> {settings.currentSettings.newPlexLogin && ( {msg} ); }, })} type="info" /> )}
{data?.map((user) => ( ))}
toggleAllUsers()} onKeyDown={(e) => { if (e.key === 'Enter' || e.key === 'Space') { toggleAllUsers(); } }} className="relative inline-flex h-5 w-10 flex-shrink-0 cursor-pointer items-center justify-center pt-2 focus:outline-none" > {intl.formatMessage(messages.user)}
toggleUser(user.id)} onKeyDown={(e) => { if (e.key === 'Enter' || e.key === 'Space') { toggleUser(user.id); } }} className="relative inline-flex h-5 w-10 flex-shrink-0 cursor-pointer items-center justify-center pt-2 focus:outline-none" >
{user.username}
{/* {user.username && user.username.toLowerCase() !== user.email && (
{user.email}
)} */}
) : ( )}
); }; export default JellyfinImportModal;