2025-05-18 14:03:18 -07:00
|
|
|
import { debounce } from 'lodash';
|
2024-02-16 13:37:49 -08:00
|
|
|
import { useCallback, useEffect, useRef, useState } from 'react';
|
2025-05-18 14:03:18 -07:00
|
|
|
|
2024-02-16 13:37:49 -08:00
|
|
|
import { api } from '/@/renderer/api';
|
2024-03-31 17:47:17 -07:00
|
|
|
import { toast } from '/@/renderer/components';
|
2025-05-18 14:03:18 -07:00
|
|
|
import { useCurrentServer } from '/@/renderer/store';
|
2025-05-20 19:23:36 -07:00
|
|
|
import { SongListSort, SortOrder } from '/@/shared/types/domain-types';
|
|
|
|
|
import { AuthState, ServerListItem, ServerType } from '/@/shared/types/types';
|
2024-02-16 13:37:49 -08:00
|
|
|
|
|
|
|
|
export const useServerAuthenticated = () => {
|
2025-05-20 19:23:36 -07:00
|
|
|
const priorServerId = useRef<string | undefined>(undefined);
|
2024-02-16 13:37:49 -08:00
|
|
|
const server = useCurrentServer();
|
|
|
|
|
const [ready, setReady] = useState(
|
|
|
|
|
server?.type === ServerType.NAVIDROME ? AuthState.LOADING : AuthState.VALID,
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
const authenticateNavidrome = useCallback(async (server: ServerListItem) => {
|
|
|
|
|
// This trick works because navidrome-api.ts will internally check for authentication
|
|
|
|
|
// failures and try to log in again (where available). So, all that's necessary is
|
|
|
|
|
// making one request first
|
|
|
|
|
try {
|
|
|
|
|
await api.controller.getSongList({
|
|
|
|
|
apiClientProps: { server },
|
|
|
|
|
query: {
|
|
|
|
|
limit: 1,
|
|
|
|
|
sortBy: SongListSort.NAME,
|
|
|
|
|
sortOrder: SortOrder.ASC,
|
|
|
|
|
startIndex: 0,
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
setReady(AuthState.VALID);
|
|
|
|
|
} catch (error) {
|
2024-03-31 17:47:17 -07:00
|
|
|
toast.error({ message: (error as Error).message });
|
2024-02-16 13:37:49 -08:00
|
|
|
setReady(AuthState.INVALID);
|
|
|
|
|
}
|
|
|
|
|
}, []);
|
|
|
|
|
|
|
|
|
|
const debouncedAuth = debounce((server: ServerListItem) => {
|
|
|
|
|
authenticateNavidrome(server).catch(console.error);
|
|
|
|
|
}, 300);
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
if (priorServerId.current !== server?.id) {
|
|
|
|
|
priorServerId.current = server?.id || '';
|
|
|
|
|
|
|
|
|
|
if (server?.type === ServerType.NAVIDROME) {
|
|
|
|
|
setReady(AuthState.LOADING);
|
|
|
|
|
debouncedAuth(server);
|
|
|
|
|
} else {
|
|
|
|
|
setReady(AuthState.VALID);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}, [debouncedAuth, server]);
|
|
|
|
|
|
|
|
|
|
return ready;
|
|
|
|
|
};
|