import React, { useEffect, useState } from "react"; import { average } from "color.js"; import { imageUrl, type SearchResponse } from "api/api"; import ImageDropHandler from "~/components/ImageDropHandler"; import { Edit, ImageIcon, Merge, Plus, Trash } from "lucide-react"; import { useAppContext } from "~/providers/AppProvider"; import MergeModal from "~/components/modals/MergeModal"; import ImageReplaceModal from "~/components/modals/ImageReplaceModal"; import DeleteModal from "~/components/modals/DeleteModal"; import RenameModal from "~/components/modals/EditModal/EditModal"; import EditModal from "~/components/modals/EditModal/EditModal"; import AddListenModal from "~/components/modals/AddListenModal"; import MbzIcon from "~/components/icons/MbzIcon"; import { Link } from "react-router"; export type MergeFunc = ( from: number, to: number, replaceImage: boolean ) => Promise; export type MergeSearchCleanerFunc = ( r: SearchResponse, id: number ) => SearchResponse; interface Props { type: "Track" | "Album" | "Artist"; title: string; img: string; id: number; rank: number; musicbrainzId: string; imgItemId: number; mergeFunc: MergeFunc; mergeCleanerFunc: MergeSearchCleanerFunc; children: React.ReactNode; subContent: React.ReactNode; } export default function MediaLayout(props: Props) { const [bgColor, setBgColor] = useState("(--color-bg)"); const [mergeModalOpen, setMergeModalOpen] = useState(false); const [deleteModalOpen, setDeleteModalOpen] = useState(false); const [imageModalOpen, setImageModalOpen] = useState(false); const [renameModalOpen, setRenameModalOpen] = useState(false); const [addListenModalOpen, setAddListenModalOpen] = useState(false); const { user } = useAppContext(); useEffect(() => { average(imageUrl(props.img, "small"), { amount: 1 }).then((color) => { setBgColor(`rgba(${color[0]},${color[1]},${color[2]},0.4)`); }); }, [props.img]); const replaceImageCallback = () => { window.location.reload(); }; const title = `${props.title} - Koito`; const mobileIconSize = 22; const normalIconSize = 30; let vw = Math.max( document.documentElement.clientWidth || 0, window.innerWidth || 0 ); let iconSize = vw > 768 ? normalIconSize : mobileIconSize; console.log("MBZ:", props.musicbrainzId); return (
{title}
{props.title}

{props.type}

{props.title} {" "} #{props.rank}

{props.subContent}
{props.musicbrainzId && ( )} {user && ( <> {props.type === "Track" && ( <> )} {props.type !== "Track" && ( )} )}
{props.children}
); }