import EmbyLogo from '@app/assets/services/emby.svg'; import JellyfinLogo from '@app/assets/services/jellyfin.svg'; import PlexLogo from '@app/assets/services/plex.svg'; import AppDataWarning from '@app/components/AppDataWarning'; import Button from '@app/components/Common/Button'; import ImageFader from '@app/components/Common/ImageFader'; import PageTitle from '@app/components/Common/PageTitle'; import LanguagePicker from '@app/components/Layout/LanguagePicker'; import SettingsJellyfin from '@app/components/Settings/SettingsJellyfin'; import SettingsPlex from '@app/components/Settings/SettingsPlex'; import SettingsServices from '@app/components/Settings/SettingsServices'; import SetupSteps from '@app/components/Setup/SetupSteps'; import useLocale from '@app/hooks/useLocale'; import useSettings from '@app/hooks/useSettings'; import defineMessages from '@app/utils/defineMessages'; import { MediaServerType } from '@server/constants/server'; import Image from 'next/image'; import { useRouter } from 'next/router'; import { useEffect, useState } from 'react'; import { useIntl } from 'react-intl'; import useSWR, { mutate } from 'swr'; import SetupLogin from './SetupLogin'; const messages = defineMessages('components.Setup', { welcome: 'Welcome to Jellyseerr', subtitle: 'Get started by choosing your media server', configjellyfin: 'Configure Jellyfin', configplex: 'Configure Plex', configemby: 'Configure Emby', setup: 'Setup', finish: 'Finish Setup', finishing: 'Finishing…', continue: 'Continue', servertype: 'Choose Server Type', signin: 'Sign In', configuremediaserver: 'Configure Media Server', configureservices: 'Configure Services', }); const Setup = () => { const intl = useIntl(); const [isUpdating, setIsUpdating] = useState(false); const [currentStep, setCurrentStep] = useState(1); const [mediaServerSettingsComplete, setMediaServerSettingsComplete] = useState(false); const [mediaServerType, setMediaServerType] = useState( MediaServerType.NOT_CONFIGURED ); const router = useRouter(); const { locale } = useLocale(); const settings = useSettings(); const finishSetup = async () => { setIsUpdating(true); const res = await fetch('/api/v1/settings/initialize', { method: 'POST', headers: { 'Content-Type': 'application/json', }, }); if (!res.ok) throw new Error(); const data: { initialized: boolean } = await res.json(); setIsUpdating(false); if (data.initialized) { const mainRes = await fetch('/api/v1/settings/main', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ locale }), }); if (!mainRes.ok) throw new Error(); mutate('/api/v1/settings/public'); router.push('/'); } }; const { data: backdrops } = useSWR('/api/v1/backdrops', { refreshInterval: 0, refreshWhenHidden: false, revalidateOnFocus: false, }); useEffect(() => { if (settings.currentSettings.initialized) { router.push('/'); } if ( settings.currentSettings.mediaServerType !== MediaServerType.NOT_CONFIGURED ) { setCurrentStep(3); setMediaServerType(settings.currentSettings.mediaServerType); } }, [ settings.currentSettings.mediaServerType, settings.currentSettings.initialized, router, ]); if (settings.currentSettings.initialized) return <>; return (
`https://image.tmdb.org/t/p/original${backdrop}` ) ?? [] } />
Logo
{currentStep === 1 && (
{intl.formatMessage(messages.welcome)}
{intl.formatMessage(messages.subtitle)}
)} {currentStep === 2 && ( { setMediaServerType(MediaServerType.NOT_CONFIGURED); setCurrentStep(1); }} onComplete={() => setCurrentStep(3)} /> )} {currentStep === 3 && (
{mediaServerType === MediaServerType.PLEX ? ( setMediaServerSettingsComplete(true)} /> ) : ( setMediaServerSettingsComplete(true)} /> )}
)} {currentStep === 4 && (
)}
); }; export default Setup;