Skip to content

Commit

Permalink
Merge pull request #5732 from thornbill/search-param-hook
Browse files Browse the repository at this point in the history
Fix dashboard user page crash
  • Loading branch information
thornbill authored Jul 10, 2024
2 parents 21ced03 + c89846c commit 2d2d5be
Show file tree
Hide file tree
Showing 8 changed files with 155 additions and 35 deletions.
21 changes: 13 additions & 8 deletions src/apps/dashboard/routes/users/access.tsx
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
import type { UserDto } from '@jellyfin/sdk/lib/generated-client';
import React, { FunctionComponent, useCallback, useEffect, useState, useRef } from 'react';
import { useSearchParams } from 'react-router-dom';

import loading from '../../../../components/loading/loading';
import libraryMenu from '../../../../scripts/libraryMenu';
import globalize from '../../../../scripts/globalize';
import toast from '../../../../components/toast/toast';
import SectionTabs from '../../../../components/dashboard/users/SectionTabs';
import ButtonElement from '../../../../elements/ButtonElement';
import { getParameterByName } from '../../../../utils/url';
import SectionTitleContainer from '../../../../elements/SectionTitleContainer';
import AccessContainer from '../../../../components/dashboard/users/AccessContainer';
import CheckBoxElement from '../../../../elements/CheckBoxElement';
Expand All @@ -21,6 +21,8 @@ type ItemsArr = {
};

const UserLibraryAccess: FunctionComponent = () => {
const [ searchParams ] = useSearchParams();
const userId = searchParams.get('userId');
const [ userName, setUserName ] = useState('');
const [channelsItems, setChannelsItems] = useState<ItemsArr[]>([]);
const [mediaFoldersItems, setMediaFoldersItems] = useState<ItemsArr[]>([]);
Expand All @@ -37,7 +39,7 @@ const UserLibraryAccess: FunctionComponent = () => {
const page = element.current;

if (!page) {
console.error('Unexpected null reference');
console.error('[userlibraryaccess] Unexpected null page reference');
return;
}

Expand All @@ -64,7 +66,7 @@ const UserLibraryAccess: FunctionComponent = () => {
const page = element.current;

if (!page) {
console.error('Unexpected null reference');
console.error('[userlibraryaccess] Unexpected null page reference');
return;
}

Expand Down Expand Up @@ -97,7 +99,7 @@ const UserLibraryAccess: FunctionComponent = () => {
const page = element.current;

if (!page) {
console.error('Unexpected null reference');
console.error('[userlibraryaccess] Unexpected null page reference');
return;
}

Expand Down Expand Up @@ -138,7 +140,6 @@ const UserLibraryAccess: FunctionComponent = () => {

const loadData = useCallback(() => {
loading.show();
const userId = getParameterByName('userId');
const promise1 = userId ? window.ApiClient.getUser(userId) : Promise.resolve({ Configuration: {} });
const promise2 = window.ApiClient.getJSON(window.ApiClient.getUrl('Library/MediaFolders', {
IsHidden: false
Expand All @@ -150,21 +151,25 @@ const UserLibraryAccess: FunctionComponent = () => {
}).catch(err => {
console.error('[userlibraryaccess] failed to load data', err);
});
}, [loadUser]);
}, [loadUser, userId]);

useEffect(() => {
const page = element.current;

if (!page) {
console.error('Unexpected null reference');
console.error('[userlibraryaccess] Unexpected null page reference');
return;
}

loadData();

const onSubmit = (e: Event) => {
if (!userId) {
console.error('[userlibraryaccess] missing user id');
return;
}

loading.show();
const userId = getParameterByName('userId');
window.ApiClient.getUser(userId).then(function (result) {
saveUser(result);
}).catch(err => {
Expand Down
32 changes: 21 additions & 11 deletions src/apps/dashboard/routes/users/parentalcontrol.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import type { AccessSchedule, ParentalRating, UserDto } from '@jellyfin/sdk/lib/generated-client';
import { DynamicDayOfWeek } from '@jellyfin/sdk/lib/generated-client/models/dynamic-day-of-week';
import React, { FunctionComponent, useCallback, useEffect, useState, useRef } from 'react';
import escapeHTML from 'escape-html';
import React, { FunctionComponent, useCallback, useEffect, useState, useRef } from 'react';
import { useSearchParams } from 'react-router-dom';

import globalize from '../../../../scripts/globalize';
import LibraryMenu from '../../../../scripts/libraryMenu';
Expand All @@ -12,7 +13,6 @@ import SectionTitleContainer from '../../../../elements/SectionTitleContainer';
import SectionTabs from '../../../../components/dashboard/users/SectionTabs';
import loading from '../../../../components/loading/loading';
import toast from '../../../../components/toast/toast';
import { getParameterByName } from '../../../../utils/url';
import CheckBoxElement from '../../../../elements/CheckBoxElement';
import SelectElement from '../../../../elements/SelectElement';
import Page from '../../../../components/Page';
Expand Down Expand Up @@ -57,6 +57,8 @@ function handleSaveUser(
}

const UserParentalControl: FunctionComponent = () => {
const [ searchParams ] = useSearchParams();
const userId = searchParams.get('userId');
const [ userName, setUserName ] = useState('');
const [ parentalRatings, setParentalRatings ] = useState<ParentalRating[]>([]);
const [ unratedItems, setUnratedItems ] = useState<UnratedItem[]>([]);
Expand Down Expand Up @@ -95,7 +97,7 @@ const UserParentalControl: FunctionComponent = () => {
const page = element.current;

if (!page) {
console.error('Unexpected null reference');
console.error('[userparentalcontrol] Unexpected null page reference');
return;
}

Expand Down Expand Up @@ -144,7 +146,7 @@ const UserParentalControl: FunctionComponent = () => {
const page = element.current;

if (!page) {
console.error('Unexpected null reference');
console.error('[userparentalcontrol] Unexpected null page reference');
return;
}

Expand All @@ -165,7 +167,7 @@ const UserParentalControl: FunctionComponent = () => {
const page = element.current;

if (!page) {
console.error('Unexpected null reference');
console.error('[userparentalcontrol] Unexpected null page reference');
return;
}

Expand All @@ -186,7 +188,7 @@ const UserParentalControl: FunctionComponent = () => {
const page = element.current;

if (!page) {
console.error('Unexpected null reference');
console.error('[userparentalcontrol] Unexpected null page reference');
return;
}

Expand All @@ -208,7 +210,7 @@ const UserParentalControl: FunctionComponent = () => {
const page = element.current;

if (!page) {
console.error('Unexpected null reference');
console.error('[userparentalcontrol] Unexpected null page reference');
return;
}

Expand Down Expand Up @@ -241,22 +243,26 @@ const UserParentalControl: FunctionComponent = () => {
}, [loadAllowedTags, loadBlockedTags, loadUnratedItems, populateRatings, renderAccessSchedule]);

const loadData = useCallback(() => {
if (!userId) {
console.error('[userparentalcontrol.loadData] missing user id');
return;
}

loading.show();
const userId = getParameterByName('userId');
const promise1 = window.ApiClient.getUser(userId);
const promise2 = window.ApiClient.getParentalRatings();
Promise.all([promise1, promise2]).then(function (responses) {
loadUser(responses[0], responses[1]);
}).catch(err => {
console.error('[userparentalcontrol] failed to load data', err);
});
}, [loadUser]);
}, [loadUser, userId]);

useEffect(() => {
const page = element.current;

if (!page) {
console.error('Unexpected null reference');
console.error('[userparentalcontrol] Unexpected null page reference');
return;
}

Expand Down Expand Up @@ -344,8 +350,12 @@ const UserParentalControl: FunctionComponent = () => {
const saveUser = handleSaveUser(page, getSchedulesFromPage, getAllowedTagsFromPage, getBlockedTagsFromPage, onSaveComplete);

const onSubmit = (e: Event) => {
if (!userId) {
console.error('[userparentalcontrol.onSubmit] missing user id');
return;
}

loading.show();
const userId = getParameterByName('userId');
window.ApiClient.getUser(userId).then(function (result) {
saveUser(result);
}).catch(err => {
Expand Down
10 changes: 8 additions & 2 deletions src/apps/dashboard/routes/users/password.tsx
Original file line number Diff line number Diff line change
@@ -1,17 +1,23 @@
import React, { FunctionComponent, useCallback, useEffect, useState } from 'react';
import { useSearchParams } from 'react-router-dom';

import SectionTabs from '../../../../components/dashboard/users/SectionTabs';
import UserPasswordForm from '../../../../components/dashboard/users/UserPasswordForm';
import { getParameterByName } from '../../../../utils/url';
import SectionTitleContainer from '../../../../elements/SectionTitleContainer';
import Page from '../../../../components/Page';
import loading from '../../../../components/loading/loading';

const UserPassword: FunctionComponent = () => {
const userId = getParameterByName('userId');
const [ searchParams ] = useSearchParams();
const userId = searchParams.get('userId');
const [ userName, setUserName ] = useState('');

const loadUser = useCallback(() => {
if (!userId) {
console.error('[userpassword] missing user id');
return;
}

loading.show();
window.ApiClient.getUser(userId).then(function (user) {
if (!user.Name) {
Expand Down
12 changes: 7 additions & 5 deletions src/apps/dashboard/routes/users/profile.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import type { SyncPlayUserAccessType, UserDto } from '@jellyfin/sdk/lib/generated-client';
import React, { FunctionComponent, useCallback, useEffect, useState, useRef } from 'react';
import escapeHTML from 'escape-html';
import React, { FunctionComponent, useCallback, useEffect, useState, useRef } from 'react';
import { useSearchParams } from 'react-router-dom';

import Dashboard from '../../../../utils/dashboard';
import globalize from '../../../../scripts/globalize';
Expand All @@ -13,7 +14,6 @@ import SectionTitleContainer from '../../../../elements/SectionTitleContainer';
import SectionTabs from '../../../../components/dashboard/users/SectionTabs';
import loading from '../../../../components/loading/loading';
import toast from '../../../../components/toast/toast';
import { getParameterByName } from '../../../../utils/url';
import SelectElement from '../../../../elements/SelectElement';
import Page from '../../../../components/Page';

Expand Down Expand Up @@ -41,6 +41,8 @@ function onSaveComplete() {
}

const UserEdit: FunctionComponent = () => {
const [ searchParams ] = useSearchParams();
const userId = searchParams.get('userId');
const [ userName, setUserName ] = useState('');
const [ deleteFoldersAccess, setDeleteFoldersAccess ] = useState<ResetProvider[]>([]);
const [ authProviders, setAuthProviders ] = useState<AuthProvider[]>([]);
Expand All @@ -57,7 +59,7 @@ const UserEdit: FunctionComponent = () => {
};

const getUser = () => {
const userId = getParameterByName('userId');
if (!userId) throw new Error('missing user id');
return window.ApiClient.getUser(userId);
};

Expand Down Expand Up @@ -144,7 +146,7 @@ const UserEdit: FunctionComponent = () => {
const page = element.current;

if (!page) {
console.error('Unexpected null reference');
console.error('[useredit] Unexpected null page reference');
return;
}

Expand Down Expand Up @@ -217,7 +219,7 @@ const UserEdit: FunctionComponent = () => {
const page = element.current;

if (!page) {
console.error('Unexpected null reference');
console.error('[useredit] Unexpected null page reference');
return;
}

Expand Down
24 changes: 20 additions & 4 deletions src/apps/stable/routes/user/userprofile.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import type { UserDto } from '@jellyfin/sdk/lib/generated-client';
import { ImageType } from '@jellyfin/sdk/lib/generated-client/models/image-type';
import React, { FunctionComponent, useEffect, useState, useRef, useCallback } from 'react';
import { useSearchParams } from 'react-router-dom';

import Dashboard from '../../../../utils/dashboard';
import globalize from '../../../../scripts/globalize';
Expand All @@ -11,11 +12,11 @@ import ButtonElement from '../../../../elements/ButtonElement';
import UserPasswordForm from '../../../../components/dashboard/users/UserPasswordForm';
import loading from '../../../../components/loading/loading';
import toast from '../../../../components/toast/toast';
import { getParameterByName } from '../../../../utils/url';
import Page from '../../../../components/Page';

const UserProfile: FunctionComponent = () => {
const userId = getParameterByName('userId');
const [ searchParams ] = useSearchParams();
const userId = searchParams.get('userId');
const [ userName, setUserName ] = useState('');

const element = useRef<HTMLDivElement>(null);
Expand All @@ -24,7 +25,12 @@ const UserProfile: FunctionComponent = () => {
const page = element.current;

if (!page) {
console.error('Unexpected null reference');
console.error('[userprofile] Unexpected null page reference');
return;
}

if (!userId) {
console.error('[userprofile] missing user id');
return;
}

Expand Down Expand Up @@ -72,7 +78,7 @@ const UserProfile: FunctionComponent = () => {
const page = element.current;

if (!page) {
console.error('Unexpected null reference');
console.error('[userprofile] Unexpected null page reference');
return;
}

Expand Down Expand Up @@ -110,6 +116,11 @@ const UserProfile: FunctionComponent = () => {
reader.onerror = onFileReaderError;
reader.onabort = onFileReaderAbort;
reader.onload = () => {
if (!userId) {
console.error('[userprofile] missing user id');
return;
}

userImage.style.backgroundImage = 'url(' + reader.result + ')';
window.ApiClient.uploadUserImage(userId, ImageType.Primary, file).then(function () {
loading.hide();
Expand All @@ -123,6 +134,11 @@ const UserProfile: FunctionComponent = () => {
};

(page.querySelector('#btnDeleteImage') as HTMLButtonElement).addEventListener('click', function () {
if (!userId) {
console.error('[userprofile] missing user id');
return;
}

confirm(
globalize.translate('DeleteImageConfirmation'),
globalize.translate('DeleteImage')
Expand Down
Loading

0 comments on commit 2d2d5be

Please sign in to comment.