import { Typography, styled } from '@mui/material'; import React from 'react'; import { Document, makeThumbnailUrl } from '../../accessor/document'; import {ComicReader} from './comic'; import {VideoReader} from './video' export interface PagePresenterProp{ doc:Document, className?:string } interface PagePresenter{ (prop:PagePresenterProp):JSX.Element } export const getPresenter = (content:Document):PagePresenter => { switch (content.content_type) { case "comic": return ComicReader; case "video": return VideoReader; } return ()=>Not implemented reader; } const BackgroundDiv = styled("div")({ height: '400px', width:'300px', backgroundColor:"#272733", display:"flex", alignItems:"center", justifyContent:"center"} ); import { useRef, useState, useEffect } from 'react'; import "./thumbnail.css" export function useIsElementInViewport(options?: IntersectionObserverInit) { const elementRef = useRef(null); const [isVisible, setIsVisible] = useState(false); const callback = (entries: IntersectionObserverEntry[]) => { const [entry] = entries; setIsVisible(entry.isIntersecting); }; useEffect(() => { const observer = new IntersectionObserver(callback, options); elementRef.current && observer.observe(elementRef.current); return () => observer.disconnect(); }, [elementRef, options]); return { elementRef, isVisible }; }; export function ThumbnailContainer(props:{ content:Document, className?:string, }){ const {elementRef, isVisible} = useIsElementInViewport({}); const [loaded, setLoaded] = useState(false); useEffect(()=>{ if(isVisible){ setLoaded(true); } },[isVisible]) const style = { maxHeight: '400px', maxWidth: 'min(400px, 100vw)', }; const thumbnailurl = makeThumbnailUrl(props.content); if(props.content.content_type === "video"){ return () } else return ( {loaded && } ) }