diff --git a/client/src/Router.tsx b/client/src/Router.tsx index e2d90110..ceff3f26 100644 --- a/client/src/Router.tsx +++ b/client/src/Router.tsx @@ -12,6 +12,7 @@ import { ImportFromFloxPage } from './pages/import/ImportFromFloxPage'; import { ImportFromGoodreadsPage } from './pages/import/ImportFromGoodreadsPage'; import { ImportFromSimklPage } from './pages/import/ImportFromSimklPage'; import { ImportFromTraktPage } from './pages/import/ImportFromTraktPage'; +import { ImportFromCsvPage } from './pages/import/ImportFromCsvPage'; import { ImportPage } from './pages/ImportPage'; import { JellyfinIntegrationPage } from './pages/integrations/JellyfinIntegrationPage'; import { KodiIntegrationPage } from './pages/integrations/KodiIntegrationPage'; @@ -159,6 +160,10 @@ export const router = createBrowserRouter([ path: '/import/mediatracker', element: , }, + { + path: '/import/csv', + element: , + }, { path: '/integrations', element: , diff --git a/client/src/pages/ImportFromFilePage.tsx b/client/src/pages/ImportFromFilePage.tsx index 00faddda..a19b02f2 100644 --- a/client/src/pages/ImportFromFilePage.tsx +++ b/client/src/pages/ImportFromFilePage.tsx @@ -61,7 +61,8 @@ export const ImportFormFilePage: FC<{ /> {importFromFile.isError && (
- Unexpected file format + Unexpected file format
+
{ importFromFile.variables?.source == 'CSV' ? importFromFile.error.message : "" }
)} {file && ( diff --git a/client/src/pages/ImportPage.tsx b/client/src/pages/ImportPage.tsx index 24713a81..5c7f6bcf 100644 --- a/client/src/pages/ImportPage.tsx +++ b/client/src/pages/ImportPage.tsx @@ -27,6 +27,7 @@ export const ImportPage: FC = () => { + ); diff --git a/client/src/pages/SearchPage.tsx b/client/src/pages/SearchPage.tsx index 31da8855..d92e69aa 100644 --- a/client/src/pages/SearchPage.tsx +++ b/client/src/pages/SearchPage.tsx @@ -55,6 +55,7 @@ const SearchPageImpl: FC<{ mediaType: MediaType }> = (props) => { narrator: ['audiobook'], tmdbId: ['movie', 'tv'], imdbId: ['movie', 'tv'], + igdbId: ['video_game'] }); const [query, setQuery] = useState({ @@ -63,6 +64,7 @@ const SearchPageImpl: FC<{ mediaType: MediaType }> = (props) => { narrator: searchParams.get('narrator'), imdbId: searchParams.get('imdbId'), tmdbId: parseInt(searchParams.get('tmdbId') || '') || null, + igdbId: parseInt(searchParams.get('igdbId') || '') || null, }); const searchQuery = trpc.search.search.useQuery( @@ -106,6 +108,7 @@ const SearchPageImpl: FC<{ mediaType: MediaType }> = (props) => { narrator: string; imdbId: string; tmdbId: string; + igdbId: string; }> className="flex flex-col gap-5 md:flex-row" validation={ @@ -120,9 +123,10 @@ const SearchPageImpl: FC<{ mediaType: MediaType }> = (props) => { }, } : undefined - } + } initialValues={{ tmdbId: query.tmdbId?.toString() || undefined, + igdbId: query.igdbId?.toString() || undefined, author: query.author || undefined, imdbId: query.imdbId || undefined, narrator: query.narrator || undefined, @@ -137,6 +141,9 @@ const SearchPageImpl: FC<{ mediaType: MediaType }> = (props) => { data.tmdbId?.length > 0 ? !isNaN(parseInt(data.tmdbId || '')) : false, + data.igdbId?.length > 0 + ? !isNaN(parseInt(data.igdbId || '')) + : false, data.imdbId, ].filter(Boolean).length === 0 ) { @@ -152,6 +159,7 @@ const SearchPageImpl: FC<{ mediaType: MediaType }> = (props) => { narrator: data.narrator || null, imdbId: data.imdbId || null, tmdbId: parseInt(data.tmdbId || '') || null, + igdbId: parseInt(data.igdbId || '') || null, }; setQuery(newQuery); @@ -171,7 +179,7 @@ const SearchPageImpl: FC<{ mediaType: MediaType }> = (props) => { = (props) => { narrator: null, query: null, tmdbId: null, + igdbId: null, }); }} /> @@ -190,7 +199,7 @@ const SearchPageImpl: FC<{ mediaType: MediaType }> = (props) => { {canUse('author') && ( = (props) => { {canUse('narrator') && ( = (props) => { {canUse('tmdbId') && ( = (props) => { {canUse('imdbId') && ( )} + {canUse('igdbId') && ( + + )} +