mirror of
https://github.com/jeffvli/feishin.git
synced 2026-07-02 08:39:55 +02:00
137 lines
4.3 KiB
TypeScript
137 lines
4.3 KiB
TypeScript
import { useMutation, useQueryClient } from '@tanstack/react-query';
|
|
import { t } from 'i18next';
|
|
import { useCallback } from 'react';
|
|
|
|
import { api } from '/@/renderer/api';
|
|
import { usePlayerEvents } from '/@/renderer/features/player/audio-player/hooks/use-player-events';
|
|
import { usePlayer } from '/@/renderer/features/player/context/player-context';
|
|
import { songsQueries } from '/@/renderer/features/songs/api/songs-api';
|
|
import {
|
|
setTimestamp,
|
|
useCurrentServerId,
|
|
usePlayerStore,
|
|
useTimestampStoreBase,
|
|
} from '/@/renderer/store';
|
|
import { toast } from '/@/shared/components/toast/toast';
|
|
|
|
export const useQueueRestoreTimestamp = () => {
|
|
const player = usePlayerStore();
|
|
|
|
usePlayerEvents(
|
|
{
|
|
onQueueRestored: (properties) => {
|
|
const { position } = properties;
|
|
|
|
setTimeout(() => {
|
|
setTimestamp(position);
|
|
player.mediaSeekToTimestamp(position);
|
|
}, 100);
|
|
},
|
|
},
|
|
[],
|
|
);
|
|
};
|
|
|
|
export const QueueRestoreTimestampHook = () => {
|
|
useQueueRestoreTimestamp();
|
|
return null;
|
|
};
|
|
|
|
export const useSaveQueue = () => {
|
|
const serverId = useCurrentServerId();
|
|
|
|
const mutation = useMutation({
|
|
mutationFn: async () => {
|
|
if (!serverId) {
|
|
throw new Error(t('error.serverRequired', { postProcess: 'sentenceCase' }));
|
|
}
|
|
|
|
const { player, queue } = usePlayerStore.getState();
|
|
let uniqueIds: string[] = [];
|
|
|
|
if (queue.shuffled.length > 0) {
|
|
for (const shuffledIndex of queue.shuffled) {
|
|
uniqueIds.push(queue.default[shuffledIndex]);
|
|
}
|
|
} else {
|
|
uniqueIds = queue.default;
|
|
}
|
|
|
|
const songs: string[] = [];
|
|
|
|
if (uniqueIds.length > 0) {
|
|
for (const song of uniqueIds) {
|
|
if (queue.songs[song]._serverId !== serverId) {
|
|
toast.error({
|
|
message: t('error.multipleServerSaveQueueError', {
|
|
postProcess: 'sentenceCase',
|
|
}),
|
|
title: t('error.genericError', { postProcess: 'sentenceCase' }),
|
|
});
|
|
|
|
throw new Error(
|
|
`${t('error.multipleServerSaveQueueError', { postProcess: 'sentenceCase' })}`,
|
|
);
|
|
}
|
|
|
|
songs?.push(queue.songs[song].id);
|
|
}
|
|
}
|
|
|
|
try {
|
|
await api.controller.savePlayQueue({
|
|
apiClientProps: { serverId },
|
|
query: {
|
|
currentIndex: queue.default.length > 0 ? player.index : undefined,
|
|
positionMs: useTimestampStoreBase.getState().timestamp * 1000,
|
|
songs,
|
|
},
|
|
});
|
|
|
|
toast.success({
|
|
message: t('form.saveQueue.success', { postProcess: 'sentenceCase' }),
|
|
});
|
|
} catch (error) {
|
|
toast.error({
|
|
message: (error as Error).message,
|
|
title: t('error.saveQueueFailed', { postProcess: 'sentenceCase' }),
|
|
});
|
|
throw error;
|
|
}
|
|
},
|
|
});
|
|
|
|
return mutation;
|
|
};
|
|
|
|
export const useRestoreQueue = () => {
|
|
const serverId = useCurrentServerId();
|
|
const player = usePlayer();
|
|
const queryClient = useQueryClient();
|
|
|
|
const handleRestoreQueue = useCallback(async () => {
|
|
if (!serverId) return;
|
|
|
|
try {
|
|
const queue = await queryClient.fetchQuery(
|
|
songsQueries.getQueue({ query: {}, serverId }),
|
|
);
|
|
|
|
if (queue) {
|
|
player.setQueue(
|
|
queue.entry,
|
|
queue.currentIndex,
|
|
queue.positionMs !== undefined ? queue.positionMs / 1000 : undefined,
|
|
);
|
|
}
|
|
} catch (error) {
|
|
toast.error({
|
|
message: (error as Error).message,
|
|
title: t('error.genericError', { postProcess: 'sentenceCase' }),
|
|
});
|
|
}
|
|
}, [player, queryClient, serverId]);
|
|
|
|
return handleRestoreQueue;
|
|
};
|