Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | 19x 19x 19x 19x 19x 19x 19x 19x 19x 1x 10x 11x 11x 11x 11x 11x 11x 2x 2x 1x 1x 1x 1x 1x | import { ReactElement, useCallback } from "react";
import { useRouter } from "next/router";
import { EmbedModal } from "components";
import { CardType } from "components/CardContent";
import { useContextMenu, useToast, useTranslations } from "hooks";
import { menuContextStyles } from "styles/menuContextStyles";
import { ICardContentContextMenuData } from "types/contextMenu";
import { Modify } from "types/customTypes";
import { baseUrl, handleAsyncError, templateReplace } from "utils";
import {
follow,
followAlbums,
followPlaylist,
saveShowsToLibrary,
} from "utils/spotifyCalls";
import { Follow_type } from "utils/spotifyCalls/follow";
type SaveFunctionTypes =
| CardType.ALBUM
| CardType.PLAYLIST
| CardType.ARTIST
| CardType.SHOW;
type SaveFunctions = Modify<
Partial<Record<CardType, never>>,
Record<SaveFunctionTypes, (id: string) => Promise<boolean | null>>
>;
const saveFunctions: SaveFunctions = {
album: followAlbums,
show: saveShowsToLibrary,
artist: (id: string) => follow(Follow_type.Artist, id),
playlist: followPlaylist,
};
export interface ICardContentContextMenu {
data: ICardContentContextMenuData["data"];
}
export default function CardContentContextMenu({
data,
}: Readonly<ICardContentContextMenu>): ReactElement {
const { removeContextMenu, setModalData } = useContextMenu();
const router = useRouter();
const { addToast } = useToast();
const { translations } = useTranslations();
const saveFunction = saveFunctions[data.type];
const handleGoToClick = useCallback(async () => {
removeContextMenu();
await router.push(`${baseUrl}/${data.type || "track"}/${data.id}`);
}, [data.id, data.type, removeContextMenu, router]);
return (
<ul>
<li>
<button type="button" onClick={handleAsyncError(handleGoToClick)}>
Go to {data.type || "track"}
</button>
</li>
{data.type && data.type !== "genre" && data.id && (
<li>
<button
onClick={() => {
setModalData({
title: `Embed ${data.type}`,
modalElement: <EmbedModal type={data.type} id={data.id} />,
maxHeight: "100%",
});
removeContextMenu();
}}
>
Embed {data.type}
</button>
</li>
)}
{saveFunction && (
<li>
<button
type="button"
onClick={() => {
saveFunction(data.id);
addToast({
message: templateReplace(translations.toastMessages.addedTo, [
translations.contentType.library,
]),
variant: "success",
});
removeContextMenu();
}}
>
Save {data.type}
</button>
</li>
)}
<style jsx>{menuContextStyles}</style>
</ul>
);
}
|