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, 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/RenameModal"; export type MergeFunc = (from: number, to: number) => Promise export type MergeSearchCleanerFunc = (r: SearchResponse, id: number) => SearchResponse interface Props { type: "Track" | "Album" | "Artist" title: string img: string id: 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 { 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 return (
{title}
{props.title}

{props.type}

{props.title}

{props.subContent}
{ user &&
}
{props.children}
); }