mirror of
https://github.com/apricote/Listory.git
synced 2026-01-13 21:21:02 +00:00
200 lines
4.8 KiB
TypeScript
200 lines
4.8 KiB
TypeScript
import { useCallback, useMemo } from "react";
|
|
import {
|
|
createApiToken,
|
|
getApiTokens,
|
|
getExtendedStreamingHistoryStatus,
|
|
getListensReport,
|
|
getRecentListens,
|
|
getTopAlbums,
|
|
getTopArtists,
|
|
getTopGenres,
|
|
getTopTracks,
|
|
importExtendedStreamingHistory,
|
|
revokeApiToken,
|
|
} from "../api/api";
|
|
import { ListenReportOptions } from "../api/entities/listen-report-options";
|
|
import { PaginationOptions } from "../api/entities/pagination-options";
|
|
import { TopAlbumsOptions } from "../api/entities/top-albums-options";
|
|
import { TopArtistsOptions } from "../api/entities/top-artists-options";
|
|
import { TopGenresOptions } from "../api/entities/top-genres-options";
|
|
import { TopTracksOptions } from "../api/entities/top-tracks-options";
|
|
import { useApiClient } from "./use-api-client";
|
|
import { useAsync } from "./use-async";
|
|
import { SpotifyExtendedStreamingHistoryItem } from "../api/entities/spotify-extended-streaming-history-item";
|
|
|
|
const INITIAL_EMPTY_ARRAY: [] = [];
|
|
Object.freeze(INITIAL_EMPTY_ARRAY);
|
|
|
|
export const useRecentListens = (options: PaginationOptions) => {
|
|
const { client } = useApiClient();
|
|
|
|
const fetchData = useMemo(
|
|
() => () => getRecentListens(options, client),
|
|
[options, client],
|
|
);
|
|
|
|
const {
|
|
value,
|
|
pending: isLoading,
|
|
error,
|
|
reload,
|
|
} = useAsync(fetchData, undefined);
|
|
|
|
const recentListens = value ? value.items : [];
|
|
const paginationMeta = value ? value.meta : undefined;
|
|
|
|
return { recentListens, paginationMeta, isLoading, error, reload };
|
|
};
|
|
|
|
export const useListensReport = (options: ListenReportOptions) => {
|
|
const { client } = useApiClient();
|
|
|
|
const fetchData = useMemo(
|
|
() => () => getListensReport(options, client),
|
|
[options, client],
|
|
);
|
|
|
|
const {
|
|
value: report,
|
|
pending: isLoading,
|
|
error,
|
|
} = useAsync(fetchData, INITIAL_EMPTY_ARRAY);
|
|
|
|
return { report, isLoading, error };
|
|
};
|
|
|
|
export const useTopArtists = (options: TopArtistsOptions) => {
|
|
const { client } = useApiClient();
|
|
|
|
const fetchData = useMemo(
|
|
() => () => getTopArtists(options, client),
|
|
[options, client],
|
|
);
|
|
|
|
const {
|
|
value: topArtists,
|
|
pending: isLoading,
|
|
error,
|
|
} = useAsync(fetchData, INITIAL_EMPTY_ARRAY);
|
|
|
|
return { topArtists, isLoading, error };
|
|
};
|
|
|
|
export const useTopAlbums = (options: TopAlbumsOptions) => {
|
|
const { client } = useApiClient();
|
|
|
|
const fetchData = useMemo(
|
|
() => () => getTopAlbums(options, client),
|
|
[options, client],
|
|
);
|
|
|
|
const {
|
|
value: topAlbums,
|
|
pending: isLoading,
|
|
error,
|
|
} = useAsync(fetchData, INITIAL_EMPTY_ARRAY);
|
|
|
|
return { topAlbums, isLoading, error };
|
|
};
|
|
|
|
export const useTopTracks = (options: TopTracksOptions) => {
|
|
const { client } = useApiClient();
|
|
|
|
const fetchData = useMemo(
|
|
() => () => getTopTracks(options, client),
|
|
[options, client],
|
|
);
|
|
|
|
const {
|
|
value: topTracks,
|
|
pending: isLoading,
|
|
error,
|
|
} = useAsync(fetchData, INITIAL_EMPTY_ARRAY);
|
|
|
|
return { topTracks, isLoading, error };
|
|
};
|
|
|
|
export const useTopGenres = (options: TopGenresOptions) => {
|
|
const { client } = useApiClient();
|
|
|
|
const fetchData = useMemo(
|
|
() => () => getTopGenres(options, client),
|
|
[options, client],
|
|
);
|
|
|
|
const {
|
|
value: topGenres,
|
|
pending: isLoading,
|
|
error,
|
|
} = useAsync(fetchData, INITIAL_EMPTY_ARRAY);
|
|
|
|
return { topGenres, isLoading, error };
|
|
};
|
|
|
|
export const useApiTokens = () => {
|
|
const { client } = useApiClient();
|
|
|
|
const fetchData = useMemo(() => () => getApiTokens(client), [client]);
|
|
|
|
const {
|
|
value: apiTokens,
|
|
pending: isLoading,
|
|
error,
|
|
reload,
|
|
} = useAsync(fetchData, INITIAL_EMPTY_ARRAY);
|
|
|
|
const createToken = useCallback(
|
|
async (description: string) => {
|
|
const apiToken = await createApiToken(description, client);
|
|
await reload();
|
|
|
|
return apiToken;
|
|
},
|
|
[client, reload],
|
|
);
|
|
|
|
const revokeToken = useCallback(
|
|
async (id: string) => {
|
|
await revokeApiToken(id, client);
|
|
await reload();
|
|
},
|
|
[client, reload],
|
|
);
|
|
|
|
return { apiTokens, isLoading, error, createToken, revokeToken };
|
|
};
|
|
|
|
export const useSpotifyImportExtendedStreamingHistory = () => {
|
|
const { client } = useApiClient();
|
|
|
|
const importHistory = useCallback(
|
|
async (listens: SpotifyExtendedStreamingHistoryItem[]) => {
|
|
return importExtendedStreamingHistory(listens, client);
|
|
},
|
|
[client]
|
|
);
|
|
|
|
const getStatus = useCallback(async () => {
|
|
return getExtendedStreamingHistoryStatus(client);
|
|
}, [client]);
|
|
|
|
return { importHistory, getStatus };
|
|
};
|
|
|
|
export const useSpotifyImportExtendedStreamingHistoryStatus = () => {
|
|
const { client } = useApiClient();
|
|
|
|
const fetchData = useMemo(
|
|
() => () => getExtendedStreamingHistoryStatus(client),
|
|
[client]
|
|
);
|
|
|
|
const {
|
|
value: importStatus,
|
|
pending: isLoading,
|
|
error,
|
|
reload,
|
|
} = useAsync(fetchData, { total: 0, imported: 0 });
|
|
|
|
return { importStatus, isLoading, error, reload };
|
|
};
|