import { createSignal, createMemo, onMount, For } from "solid-js"
import {
useZoomImageWheel,
useZoomImageHover,
useZoomImageMove,
useZoomImageClick
} from "@zoom-image/solid"
type Tab = {
name: string
current: boolean
value: "wheel" | "hover" | "move" | "click"
}
function MultiZoom() {
const [tabs, setTabs] = createSignal<Tab[]>([
{ name: "Wheel", current: true, value: "wheel" },
{ name: "Hover", current: false, value: "hover" },
{ name: "Move", current: false, value: "move" },
{ name: "Click", current: false, value: "click" }
])
const zoomType = createMemo(() => tabs().find(tab => tab.current)!.value)
let imageWheelContainer: HTMLDivElement
let imageHoverContainer: HTMLDivElement
let imageMoveContainer: HTMLDivElement
let imageClickContainer: HTMLDivElement
let zoomTarget: HTMLDivElement
const { createZoomImage: createZoomImageWheel } = useZoomImageWheel()
const { createZoomImage: createZoomImageHover } = useZoomImageHover()
const { createZoomImage: createZoomImageMove } = useZoomImageMove()
const { createZoomImage: createZoomImageClick } = useZoomImageClick()
const processZoom = (type: Tab["value"]) => {
if (type === "wheel") {
createZoomImageWheel(imageWheelContainer)
}
if (type === "hover") {
createZoomImageHover(imageHoverContainer, {
zoomImageSource: "/image-large.jpg",
customZoom: { width: 300, height: 500 },
zoomTarget,
scale: 2
})
}
if (type === "move") {
createZoomImageMove(imageMoveContainer, {
zoomImageSource: "/image-large.jpg"
})
}
if (type === "click") {
createZoomImageClick(imageClickContainer, {
zoomImageSource: "/image-large.jpg"
})
}
}
onMount(() => processZoom(zoomType()))
const handleTabClick = (tab: Tab) => {
setTabs(tabs().map(t => ({
...t,
current: t.name === tab.name
})))
processZoom(tab.value)
}
return (
<div>
<nav class="flex gap-4 mb-4">
<For each={tabs()}>
{(tab) => (
<button
onClick={() => handleTabClick(tab)}
class={tab.current ? "active" : ""}
>
{tab.name}
</button>
)}
</For>
</nav>
{zoomType() === "wheel" && (
<div ref={imageWheelContainer} class="h-[300px] w-[200px]">
<img src="/image.jpg" alt="Wheel zoom" class="h-full w-full" />
</div>
)}
{zoomType() === "hover" && (
<div class="flex gap-4">
<div ref={imageHoverContainer} class="h-[300px] w-[200px]">
<img src="/image.jpg" alt="Hover zoom" class="h-full w-full" />
</div>
<div ref={zoomTarget}></div>
</div>
)}
{zoomType() === "move" && (
<div ref={imageMoveContainer} class="h-[300px] w-[200px] overflow-hidden">
<img src="/image.jpg" alt="Move zoom" class="h-full w-full" />
</div>
)}
{zoomType() === "click" && (
<div ref={imageClickContainer} class="h-[300px] w-[200px] overflow-hidden">
<img src="/image.jpg" alt="Click zoom" class="h-full w-full" />
</div>
)}
</div>
)
}