mirror of
https://github.com/aljazceru/rabbit.git
synced 2025-12-17 05:54:19 +01:00
104 lines
2.4 KiB
TypeScript
104 lines
2.4 KiB
TypeScript
import { Component, createSignal, Show } from 'solid-js';
|
|
|
|
import SafeLink from '@/components/utils/SafeLink';
|
|
import { fixUrl } from '@/utils/imageUrl';
|
|
|
|
type ImageDisplayProps = {
|
|
url: string;
|
|
initialHidden: boolean;
|
|
};
|
|
|
|
const ImageDisplay: Component<ImageDisplayProps> = (props) => {
|
|
let imageRef: HTMLImageElement | undefined;
|
|
let canvasRef: HTMLCanvasElement | undefined;
|
|
|
|
const [hidden, setHidden] = createSignal(props.initialHidden);
|
|
const [playing, setPlaying] = createSignal(true);
|
|
|
|
// const isGIF = () => props.url.match(/\.gif/i);
|
|
|
|
const play = () => {
|
|
setPlaying(true);
|
|
};
|
|
|
|
/*
|
|
const stop = () => {
|
|
if (canvasRef == null || imageRef == null) return;
|
|
canvasRef.width = imageRef.width;
|
|
canvasRef.height = imageRef.height;
|
|
canvasRef
|
|
.getContext('2d')
|
|
?.drawImage(
|
|
imageRef,
|
|
0,
|
|
0,
|
|
imageRef.naturalWidth,
|
|
imageRef.naturalHeight,
|
|
0,
|
|
0,
|
|
imageRef.width,
|
|
imageRef.height,
|
|
);
|
|
setPlaying(false);
|
|
};
|
|
*/
|
|
|
|
return (
|
|
<Show
|
|
when={!hidden()}
|
|
fallback={
|
|
<button
|
|
class="rounded bg-stone-300 p-3 text-xs text-stone-600 hover:shadow"
|
|
onClick={() => setHidden(false)}
|
|
>
|
|
画像を展開する
|
|
</button>
|
|
}
|
|
>
|
|
<SafeLink class="my-2 block" href={props.url}>
|
|
<img
|
|
ref={imageRef}
|
|
class="max-h-64 max-w-full rounded object-contain shadow hover:shadow-md"
|
|
classList={{
|
|
'inline-block': playing(),
|
|
hidden: !playing(),
|
|
}}
|
|
src={playing() ? fixUrl(props.url) : undefined}
|
|
alt={props.url}
|
|
/>
|
|
<canvas
|
|
ref={canvasRef}
|
|
class="inline-block max-h-64 max-w-full rounded object-contain shadow hover:shadow-md"
|
|
classList={{
|
|
'w-0': playing(),
|
|
'h-0': playing(),
|
|
'w-auto': !playing(),
|
|
'h-auto': !playing(),
|
|
}}
|
|
onClick={(ev) => {
|
|
ev.preventDefault();
|
|
play();
|
|
}}
|
|
/>
|
|
</SafeLink>
|
|
{/*
|
|
<Show when={isGIF()}>
|
|
<button
|
|
class=""
|
|
onClick={() => {
|
|
if (playing()) stop();
|
|
else play();
|
|
}}
|
|
>
|
|
<Show when={!playing()} fallback="⏸">
|
|
▶
|
|
</Show>
|
|
</button>
|
|
</Show>
|
|
*/}
|
|
</Show>
|
|
);
|
|
};
|
|
|
|
export default ImageDisplay;
|