import { PlaylistsApiService } from '../services/api/playlists.service'; import { AuthorizationApiService } from '../services/api/authorization.service'; import { AsyncData } from '../runtime'; import type { Language } from '../runtime'; import type { IPlaylistCard, PaginatedResponse } from '../types'; /** * Плейлисты пользователя из общего состояния — того же, что наполняют и обновляют попапы * добавления и правки, поэтому созданное, переименованное и удалённое видно сразу. * Ручка под токеном, так что запрос уходит только с клиента и только для авторизованных; * `isLoaded` нужен, чтобы до ответа не мигало пустое состояние. */ export const useUserPlaylists = () => { const { locale } = useI18n(); const { isAuthorized } = useUser(AuthorizationApiService); const playlists = useState | null>(`data-${AsyncData.GetPlaylists}`, () => null); const { execute } = useApiAction(PlaylistsApiService.getUserPlaylists, true); const isLoaded = ref(!!playlists.value); onMounted(async () => { if (isAuthorized.value && !playlists.value) { await execute([ locale.value as Language ], AsyncData.GetPlaylists); } isLoaded.value = true; }); const { isPendingDelete } = usePlaylistDelete(); // Удаления с ещё не истёкшим окном отмены сервер пока отдаёт — прячем их здесь. const items = computed(() => (playlists.value?.items ?? []).filter(item => !isPendingDelete(item.id))); return { items, isLoaded, }; };