Add abort signal to hooks

This commit is contained in:
viown
2024-12-20 23:47:15 +03:00
parent fee9b12f1b
commit b0c9e11404
13 changed files with 40 additions and 110 deletions

View File

@@ -2,14 +2,10 @@ import { Api } from '@jellyfin/sdk';
import { useQuery } from '@tanstack/react-query';
import { useApi } from 'hooks/useApi';
import { getSessionApi } from '@jellyfin/sdk/lib/utils/api/session-api';
import type { AxiosRequestConfig } from 'axios';
const fetchAuthProviders = async (api?: Api) => {
if (!api) {
console.error('[useAuthProvider] No Api instance available');
return;
}
const response = await getSessionApi(api).getAuthProviders();
const fetchAuthProviders = async (api: Api, options?: AxiosRequestConfig) => {
const response = await getSessionApi(api).getAuthProviders(options);
return response.data;
};
@@ -19,7 +15,7 @@ export const useAuthProviders = () => {
return useQuery({
queryKey: [ 'AuthProviders' ],
queryFn: () => fetchAuthProviders(api),
queryFn: ({ signal }) => fetchAuthProviders(api!, { signal }),
enabled: !!api
});
};

View File

@@ -3,14 +3,10 @@ import { useQuery } from '@tanstack/react-query';
import { useApi } from 'hooks/useApi';
import { getChannelsApi } from '@jellyfin/sdk/lib/utils/api/channels-api';
import { ChannelsApiGetChannelsRequest } from '@jellyfin/sdk/lib/generated-client/api/channels-api';
import type { AxiosRequestConfig } from 'axios';
const fetchChannels = async (api?: Api, params?: ChannelsApiGetChannelsRequest) => {
if (!api) {
console.error('[useAuthProvider] No Api instance available');
return;
}
const response = await getChannelsApi(api).getChannels(params);
const fetchChannels = async (api: Api, params?: ChannelsApiGetChannelsRequest, options?: AxiosRequestConfig) => {
const response = await getChannelsApi(api).getChannels(params, options);
return response.data;
};
@@ -20,7 +16,7 @@ export const useChannels = (params?: ChannelsApiGetChannelsRequest) => {
return useQuery({
queryKey: [ 'Channels' ],
queryFn: () => fetchChannels(api, params),
queryFn: ({ signal }) => fetchChannels(api!, params, { signal }),
enabled: !!api
});
};

View File

@@ -1,4 +1,4 @@
import { UserApiCreateUserByNameRequest } from '@jellyfin/sdk/lib/generated-client';
import { UserApiCreateUserByNameRequest } from '@jellyfin/sdk/lib/generated-client/api/user-api';
import { getUserApi } from '@jellyfin/sdk/lib/utils/api/user-api';
import { useMutation } from '@tanstack/react-query';
import { useApi } from 'hooks/useApi';
@@ -8,7 +8,6 @@ export const useCreateUser = () => {
return useMutation({
mutationFn: (params: UserApiCreateUserByNameRequest) => (
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
getUserApi(api!)
.createUserByName(params)
)

View File

@@ -1,4 +1,4 @@
import { UserApiDeleteUserRequest } from '@jellyfin/sdk/lib/generated-client';
import { UserApiDeleteUserRequest } from '@jellyfin/sdk/lib/generated-client/api/user-api';
import { getUserApi } from '@jellyfin/sdk/lib/utils/api/user-api';
import { useMutation } from '@tanstack/react-query';
import { useApi } from 'hooks/useApi';
@@ -10,7 +10,6 @@ export const useDeleteUser = () => {
return useMutation({
mutationFn: (params: UserApiDeleteUserRequest) => (
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
getUserApi(api!)
.deleteUser(params)
),

View File

@@ -3,14 +3,10 @@ import { LibraryApiGetMediaFoldersRequest } from '@jellyfin/sdk/lib/generated-cl
import { getLibraryApi } from '@jellyfin/sdk/lib/utils/api/library-api';
import { useQuery } from '@tanstack/react-query';
import { useApi } from 'hooks/useApi';
import type { AxiosRequestConfig } from 'axios';
const fetchLibraryMediaFolders = async (api?: Api, params?: LibraryApiGetMediaFoldersRequest) => {
if (!api) {
console.error('[useLibraryMediaFolders] no Api instance available');
return;
}
const response = await getLibraryApi(api).getMediaFolders(params);
const fetchLibraryMediaFolders = async (api: Api, params?: LibraryApiGetMediaFoldersRequest, options?: AxiosRequestConfig) => {
const response = await getLibraryApi(api).getMediaFolders(params, options);
return response.data;
};
@@ -20,7 +16,7 @@ export const useLibraryMediaFolders = (params?: LibraryApiGetMediaFoldersRequest
return useQuery({
queryKey: ['LibraryMediaFolders'],
queryFn: () => fetchLibraryMediaFolders(api, params),
queryFn: ({ signal }) => fetchLibraryMediaFolders(api!, params, { signal }),
enabled: !!api
});
};

View File

@@ -2,15 +2,11 @@ import { Api } from '@jellyfin/sdk';
import { useQuery } from '@tanstack/react-query';
import { useApi } from 'hooks/useApi';
import { getConfigurationApi } from '@jellyfin/sdk/lib/utils/api/configuration-api';
import { NetworkConfiguration } from '@jellyfin/sdk/lib/generated-client';
import type { AxiosRequestConfig } from 'axios';
import type { NetworkConfiguration } from '@jellyfin/sdk/lib/generated-client/models/network-configuration';
const fetchNetworkConfig = async (api?: Api) => {
if (!api) {
console.error('[useAuthProvider] No Api instance available');
return;
}
const response = await getConfigurationApi(api).getNamedConfiguration({ key: 'network' });
const fetchNetworkConfig = async (api: Api, options?: AxiosRequestConfig) => {
const response = await getConfigurationApi(api).getNamedConfiguration({ key: 'network' }, options);
return response.data as NetworkConfiguration;
};
@@ -20,7 +16,7 @@ export const useNetworkConfig = () => {
return useQuery({
queryKey: [ 'NetConfig' ],
queryFn: () => fetchNetworkConfig(api),
queryFn: ({ signal }) => fetchNetworkConfig(api!, { signal }),
enabled: !!api
});
};

View File

@@ -2,14 +2,10 @@ import { Api } from '@jellyfin/sdk';
import { getLocalizationApi } from '@jellyfin/sdk/lib/utils/api/localization-api';
import { useQuery } from '@tanstack/react-query';
import { useApi } from 'hooks/useApi';
import type { AxiosRequestConfig } from 'axios';
const fetchParentalRatings = async (api?: Api) => {
if (!api) {
console.error('[useLibraryMediaFolders] no Api instance available');
return;
}
const response = await getLocalizationApi(api).getParentalRatings();
const fetchParentalRatings = async (api: Api, options?: AxiosRequestConfig) => {
const response = await getLocalizationApi(api).getParentalRatings(options);
return response.data;
};
@@ -19,7 +15,7 @@ export const useParentalRatings = () => {
return useQuery({
queryKey: ['ParentalRatings'],
queryFn: () => fetchParentalRatings(api),
queryFn: ({ signal }) => fetchParentalRatings(api!, { signal }),
enabled: !!api
});
};

View File

@@ -2,14 +2,10 @@ import { Api } from '@jellyfin/sdk';
import { useQuery } from '@tanstack/react-query';
import { useApi } from 'hooks/useApi';
import { getSessionApi } from '@jellyfin/sdk/lib/utils/api/session-api';
import type { AxiosRequestConfig } from 'axios';
const fetchPasswordResetProviders = async (api?: Api) => {
if (!api) {
console.error('[useAuthProvider] No Api instance available');
return;
}
const response = await getSessionApi(api).getPasswordResetProviders();
const fetchPasswordResetProviders = async (api: Api, options?: AxiosRequestConfig) => {
const response = await getSessionApi(api).getPasswordResetProviders(options);
return response.data;
};
@@ -19,7 +15,7 @@ export const usePasswordResetProviders = () => {
return useQuery({
queryKey: [ 'PasswordResetProviders' ],
queryFn: () => fetchPasswordResetProviders(api),
queryFn: ({ signal }) => fetchPasswordResetProviders(api!, { signal }),
enabled: !!api
});
};

View File

@@ -1,4 +1,4 @@
import { UserApiUpdateUserRequest } from '@jellyfin/sdk/lib/generated-client';
import { UserApiUpdateUserRequest } from '@jellyfin/sdk/lib/generated-client/api/user-api';
import { getUserApi } from '@jellyfin/sdk/lib/utils/api/user-api';
import { useMutation } from '@tanstack/react-query';
import { useApi } from 'hooks/useApi';
@@ -10,7 +10,6 @@ export const useUpdateUser = () => {
return useMutation({
mutationFn: (params: UserApiUpdateUserRequest) => (
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
getUserApi(api!)
.updateUser(params)
),

View File

@@ -1,4 +1,4 @@
import { UserApiUpdateUserPolicyRequest } from '@jellyfin/sdk/lib/generated-client';
import { UserApiUpdateUserPolicyRequest } from '@jellyfin/sdk/lib/generated-client/api/user-api';
import { getUserApi } from '@jellyfin/sdk/lib/utils/api/user-api';
import { useMutation } from '@tanstack/react-query';
import { useApi } from 'hooks/useApi';
@@ -10,7 +10,7 @@ export const useUpdateUserPolicy = () => {
return useMutation({
mutationFn: (params: UserApiUpdateUserPolicyRequest) => (
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
getUserApi(api!)
.updateUserPolicy(params)
),

View File

@@ -1,23 +1,14 @@
import { Api } from '@jellyfin/sdk';
import { UserApiGetUserByIdRequest } from '@jellyfin/sdk/lib/generated-client';
import { UserApiGetUserByIdRequest } from '@jellyfin/sdk/lib/generated-client/api/user-api';
import { getUserApi } from '@jellyfin/sdk/lib/utils/api/user-api';
import { useQuery } from '@tanstack/react-query';
import { useApi } from 'hooks/useApi';
import type { AxiosRequestConfig } from 'axios';
export const QUERY_KEY = 'User';
const fetchUser = async (api?: Api, params?: UserApiGetUserByIdRequest) => {
if (!api) {
console.error('[useUser] No Api instance available');
return;
}
if (!params) {
console.error('[useUser] Missing request params');
return;
}
const response = await getUserApi(api).getUserById(params);
const fetchUser = async (api: Api, params: UserApiGetUserByIdRequest, options?: AxiosRequestConfig) => {
const response = await getUserApi(api).getUserById(params, options);
return response.data;
};
@@ -27,7 +18,7 @@ export const useUser = (params?: UserApiGetUserByIdRequest) => {
return useQuery({
queryKey: [ QUERY_KEY, params?.userId ],
queryFn: () => fetchUser(api, params),
queryFn: ({ signal }) => fetchUser(api!, params!, { signal }),
enabled: !!api && !!params
});
};

View File

@@ -1,7 +1,6 @@
import React, { useCallback, useEffect, useRef, useState } from 'react';
import Dashboard from '../../../../utils/dashboard';
import globalize from '../../../../lib/globalize';
import dom from 'utils/dom';
import confirm from '../../../../components/confirm/confirm';
import UserCardBox from '../../../../components/dashboard/users/UserCardBox';
import SectionTitleContainer from '../../../../elements/SectionTitleContainer';
@@ -16,6 +15,7 @@ import Toast from 'apps/dashboard/components/Toast';
import { useUsers } from 'hooks/useUsers';
import Loading from 'components/loading/LoadingComponent';
import { useDeleteUser } from 'apps/dashboard/features/users/api/useDeleteUser';
import dom from 'utils/dom';
type MenuEntry = {
name?: string;

View File

@@ -7,18 +7,14 @@ import Dashboard from '../../../../utils/dashboard';
import globalize from '../../../../lib/globalize';
import { appHost } from '../../../../components/apphost';
import confirm from '../../../../components/confirm/confirm';
import Button from '../../../../elements/emby-button/Button';
import UserPasswordForm from '../../../../components/dashboard/users/UserPasswordForm';
import toast from '../../../../components/toast/toast';
import Page from '../../../../components/Page';
<<<<<<< HEAD
import { AppFeature } from 'constants/appFeature';
=======
import { useUser } from 'apps/dashboard/features/users/api/useUser';
import Loading from 'components/loading/LoadingComponent';
import loading from 'components/loading/loading';
import { queryClient } from 'utils/query/queryClient';
>>>>>>> 9445839e9 (Move user pages to TS SDK)
import UserPasswordForm from 'components/dashboard/users/UserPasswordForm';
import Page from 'components/Page';
import Loading from 'components/loading/LoadingComponent';
import Button from 'elements/emby-button/Button';
const UserProfile: FunctionComponent = () => {
const [ searchParams ] = useSearchParams();
@@ -42,41 +38,11 @@ const UserProfile: FunctionComponent = () => {
void libraryMenu.then(menu => menu.setTitle(user.Name));
<<<<<<< HEAD
setUserName(user.Name);
void libraryMenu.then(menu => menu.setTitle(user.Name));
let imageUrl = 'assets/img/avatar.png';
if (user.PrimaryImageTag) {
imageUrl = window.ApiClient.getUserImageUrl(user.Id, {
tag: user.PrimaryImageTag,
type: 'Primary'
});
}
const userImage = (page.querySelector('#image') as HTMLDivElement);
userImage.style.backgroundImage = 'url(' + imageUrl + ')';
Dashboard.getCurrentUser().then(function (loggedInUser: UserDto) {
if (!user.Policy) {
throw new Error('Unexpected null user.Policy');
}
if (user.PrimaryImageTag) {
(page.querySelector('#btnAddImage') as HTMLButtonElement).classList.add('hide');
(page.querySelector('#btnDeleteImage') as HTMLButtonElement).classList.remove('hide');
} else if (appHost.supports(AppFeature.FileInput) && (loggedInUser?.Policy?.IsAdministrator || user.Policy.EnableUserPreferenceAccess)) {
(page.querySelector('#btnDeleteImage') as HTMLButtonElement).classList.add('hide');
(page.querySelector('#btnAddImage') as HTMLButtonElement).classList.remove('hide');
}
}).catch(err => {
console.error('[userprofile] failed to get current user', err);
=======
let imageUrl = 'assets/img/avatar.png';
if (user.PrimaryImageTag) {
imageUrl = window.ApiClient.getUserImageUrl(user.Id, {
tag: user.PrimaryImageTag,
type: 'Primary'
>>>>>>> 9445839e9 (Move user pages to TS SDK)
});
}
const userImage = (page.querySelector('#image') as HTMLDivElement);