{"version":3,"file":"index-BiPjtzCf.mjs","sources":["../../src/renderers/Mobi/index.tsx"],"sourcesContent":["import {\n  useEffect,\n  useRef,\n  useState,\n  useCallback,\n  useImperativeHandle,\n  forwardRef,\n} from 'react';\nimport { X, ChevronLeft, ChevronRight, Maximize2, Minimize2, List } from 'lucide-react';\nimport 'foliate-js/view.js';\nimport type { FoliateView, TocItem } from 'foliate-js/view.js';\nimport { useTranslator } from '../../i18n/LocaleContext';\nimport { useFetcher } from '../../RequestContext';\nimport { RendererError } from '../RendererError';\nimport type { RendererHandle } from '../base.types';\nimport type { ToolbarGroup } from '../toolbar.types';\n\nconst READER_CSS = `\n  @namespace epub \"http://www.idpf.org/2007/ops\";\n  html { color-scheme: light; }\n  body {\n    background: #ffffff !important;\n    color: #1a1a1a !important;\n    font-family: \"Noto Serif SC\", \"Source Han Serif SC\", Georgia, \"Times New Roman\", serif !important;\n    font-size: 16px !important;\n    line-height: 2 !important;\n    max-width: 100% !important;\n    box-sizing: border-box !important;\n    word-break: break-word !important;\n    overflow-wrap: break-word !important;\n  }\n  p, li, blockquote, dd { line-height: 2; text-align: justify; }\n  p { text-indent: 2em; margin: 0.8em 0; }\n  h1 { text-align: center; margin: 1.5em 0 1em; }\n  h2 { margin: 1.2em 0 0.8em; }\n  h3 { margin: 1em 0 0.6em; }\n  img { max-width: 100% !important; height: auto !important; }\n  a { color: #2563eb; text-decoration: none; }\n  pre { white-space: pre-wrap !important; }\n`;\n\nconst A4_WIDTH = 794;\n\nexport interface MobiRendererHandle extends RendererHandle {\n  prevPage: () => void;\n  nextPage: () => void;\n  toggleFullWidth: () => void;\n  toggleToc: () => void;\n}\n\ninterface MobiRendererProps {\n  url: string;\n}\n\nexport const MobiRenderer = forwardRef<MobiRendererHandle, MobiRendererProps>(\n  ({ url }, ref) => {\n    const t = useTranslator();\n    const fetcher = useFetcher();\n    const hostRef = useRef<HTMLDivElement>(null);\n    const viewRef = useRef<FoliateView | null>(null);\n\n    // 模拟 epub.js 的 locations 显示\n    const totalLocationsRef = useRef(1);\n\n    // 内部状态管理\n    const [loading, setLoading] = useState(true);\n    const [error, setError] = useState<string | null>(null);\n    const [toc, setToc] = useState<TocItem[]>([]);\n    const [showToc, setShowToc] = useState(false);\n    const [activeTocHref, setActiveTocHref] = useState<string>('');\n    const [isFullWidth, setIsFullWidth] = useState(false);\n    const [currentChapter, setCurrentChapter] = useState(0);\n    const [totalChapters, setTotalChapters] = useState(0);\n    const isFullWidthRef = useRef(false);\n    isFullWidthRef.current = isFullWidth;\n\n    const reportProgress = useCallback((current: number, total: number) => {\n      if (total > 0) totalLocationsRef.current = total;\n      setCurrentChapter(Math.max(1, current + 1));\n      setTotalChapters(totalLocationsRef.current);\n    }, []);\n\n    const handlePrev = useCallback(() => {\n      const view = viewRef.current;\n      if (!view) return;\n      view.prev().catch(() => {});\n    }, []);\n\n    const handleNext = useCallback(() => {\n      const view = viewRef.current;\n      if (!view) return;\n      view.next().catch(() => {});\n    }, []);\n\n    const toggleToc = useCallback(() => setShowToc((prev) => !prev), []);\n\n    const toggleFullWidth = useCallback(() => {\n      const newVal = !isFullWidthRef.current;\n      setIsFullWidth(newVal);\n      // 宽度改变后 paginator 需要重新分页\n      const view = viewRef.current;\n      if (!view) return;\n      const renderer = (view as unknown as { renderer?: HTMLElement }).renderer;\n      if (renderer) {\n        renderer.setAttribute('max-inline-size', newVal ? '9999' : '720');\n      }\n    }, []);\n\n    // 事件发射器：用于通知主组件工具栏状态变化\n    const listenersRef = useRef<Set<() => void>>(new Set());\n    const notifyToolbarChange = useCallback(() => {\n      listenersRef.current.forEach(listener => listener());\n    }, []);\n\n    // 监听影响工具栏的状态变化\n    useEffect(() => {\n      notifyToolbarChange();\n    }, [currentChapter, notifyToolbarChange]);\n\n    useEffect(() => {\n      notifyToolbarChange();\n    }, [totalChapters, notifyToolbarChange]);\n\n    useEffect(() => {\n      notifyToolbarChange();\n    }, [isFullWidth, notifyToolbarChange]);\n\n    useEffect(() => {\n      notifyToolbarChange();\n    }, [toc.length, notifyToolbarChange]);\n\n    // 工具栏配置\n    const getToolbarGroups = useCallback((): ToolbarGroup[] => [\n      {\n        items: [\n          { type: 'button', icon: <List className=\"rfp-w-4 rfp-h-4\" />, tooltip: t('toolbar.toc'), action: toggleToc, disabled: toc.length === 0, active: showToc },\n        ],\n      },\n      {\n        items: [\n          { type: 'button', icon: <ChevronLeft className=\"rfp-w-4 rfp-h-4\" />, tooltip: t('toolbar.prev_page'), action: handlePrev, disabled: currentChapter <= 1 },\n          { type: 'text', content: `${currentChapter} / ${totalChapters}`, minWidth: '4rem' },\n          { type: 'button', icon: <ChevronRight className=\"rfp-w-4 rfp-h-4\" />, tooltip: t('toolbar.next_page'), action: handleNext, disabled: currentChapter >= totalChapters },\n        ],\n      },\n      {\n        items: [\n          { type: 'button', icon: isFullWidth ? <Minimize2 className=\"rfp-w-4 rfp-h-4\" /> : <Maximize2 className=\"rfp-w-4 rfp-h-4\" />, tooltip: isFullWidth ? t('toolbar.normal_width') : t('toolbar.full_width'), action: toggleFullWidth, active: isFullWidth },\n        ],\n      },\n    ], [currentChapter, totalChapters, isFullWidth, showToc, toc.length, t, handlePrev, handleNext, toggleToc, toggleFullWidth]);\n\n    const handleTocClick = useCallback((href: string) => {\n      setActiveTocHref(href);\n      setShowToc(false);\n      viewRef.current?.goTo(href).catch(() => {});\n    }, []);\n\n    useImperativeHandle(ref, () => ({\n      getToolbarGroups,\n      onToolbarChange: (listener: () => void) => {\n        listenersRef.current.add(listener);\n        return () => listenersRef.current.delete(listener);\n      },\n      prevPage: handlePrev,\n      nextPage: handleNext,\n      toggleFullWidth,\n      toggleToc,\n    }), [getToolbarGroups, handlePrev, handleNext, toggleFullWidth, toggleToc]);\n\n    // 吞掉 foliate-js paginator 卸载/切换窗口期由 ResizeObserver 触发的 uncaught error。\n    // 上游 bug：Paginator.destroy 里 unobserve 目标错了（unobserve(this) 而非 unobserve(container)），\n    // observer 从未真正解除，view 已经半 destroy 时仍会触发一次 render，此时 #view / iframe body 已 null。\n    // 已知触发：\n    //   - \"Cannot destructure property 'style' of 'el' as it is null\" (setStylesImportant)\n    //   - \"Failed to execute 'getComputedStyle' on 'Window': parameter 1 is not of type 'Element'\" (#replaceBackground)\n    useEffect(() => {\n      const handler = (e: ErrorEvent) => {\n        if (e.filename?.includes('paginator')) {\n          e.preventDefault();\n        }\n      };\n      window.addEventListener('error', handler);\n      return () => window.removeEventListener('error', handler);\n    }, []);\n\n    useEffect(() => {\n      const host = hostRef.current;\n      // 只有 URL 有效时才加载（避免空字符串或已 revoke 的 blob URL）\n      if (!host || !url) return;\n\n      let cancelled = false;\n      let view: FoliateView | null = null;\n      let progressReported = false;\n      // 多 section 文件的页码累加器：记录各 section 的实际页数\n      const sectionPagesMap = new Map<number, number>();\n\n      const load = async () => {\n        if (cancelled) return;\n\n        setLoading(true);\n        setError(null);\n        setToc([]);\n        setShowToc(false);\n        setActiveTocHref('');\n        host.replaceChildren();\n\n        try {\n          view = document.createElement('foliate-view') as FoliateView;\n          host.appendChild(view);\n          viewRef.current = view;\n\n          // 先注册事件\n          view.addEventListener('relocate', (e: Event) => {\n            const detail = (e as CustomEvent).detail;\n            if (!detail) return;\n\n            const currentView = viewRef.current;\n            const sectionCount = currentView?.book?.sections.length ?? 0;\n            const renderer = (currentView as unknown as {\n              renderer?: {\n                page?: number;\n                pages?: number;\n                getContents?: () => Array<{ index: number }>;\n              };\n            } | null)?.renderer;\n\n            // 用 Paginator 的 page/pages 得到精确翻页数：\n            // - 单 section：pages - 2 就是全书总页数\n            // - 多 section：记录已翻过的 section 的 pages，累加得到全书页码\n            const sectionIdx = renderer?.getContents?.()[0]?.index ?? -1;\n            if (\n              renderer\n              && typeof renderer.page === 'number'\n              && typeof renderer.pages === 'number'\n              && renderer.pages > 2\n              && sectionIdx >= 0\n            ) {\n              progressReported = true;\n              const curSectionPages = renderer.pages - 2;\n              // 更新当前 section 的实际页数（每次进入该 section 都刷新，防止首次未 render 完整）\n              sectionPagesMap.set(sectionIdx, curSectionPages);\n\n              // 累加已确知的前置 section pages\n              let pagesBefore = 0;\n              for (let i = 0; i < sectionIdx; i++) {\n                pagesBefore += sectionPagesMap.get(i) ?? 0;\n              }\n              const currentPage = pagesBefore + Math.min(curSectionPages, Math.max(1, renderer.page));\n\n              // total 策略：\n              // - 单 section：pages - 2 就是全书精确页数\n              // - 多 section：用\"当前 section 字符/页数比\"外推未访问 section 的 pages。\n              //   同一本书字体、行距、页宽恒定，比率稳定，比 SectionProgress 字符估算准得多。\n              //   翻到末页（fraction ≈ 1）时用 currentPage 覆盖，得到真实总数。\n              const atEnd = (detail.fraction ?? 0) >= 0.999;\n              let total: number;\n              if (sectionCount === 1) {\n                total = curSectionPages;\n              } else if (atEnd) {\n                total = currentPage;\n              } else {\n                const sections = currentView?.book?.sections ?? [];\n                const curSize = (sections[sectionIdx] as { size?: number } | undefined)?.size ?? 0;\n                const ratio = curSize > 0 ? curSectionPages / curSize : 0;\n                let est = 0;\n                for (let i = 0; i < sectionCount; i++) {\n                  if (sectionPagesMap.has(i)) {\n                    est += sectionPagesMap.get(i)!;\n                  } else {\n                    const s = (sections[i] as { size?: number } | undefined)?.size ?? 0;\n                    est += Math.max(1, Math.round(s * ratio));\n                  }\n                }\n                total = Math.max(currentPage, est);\n              }\n\n              reportProgress(currentPage - 1, total);\n              const tocItem = detail.tocItem as { href?: string } | undefined;\n              if (tocItem?.href) setActiveTocHref(tocItem.href);\n              return;\n            }\n\n            // 兜底：SectionProgress.location（基于字符数估算）\n            const loc = detail.location as { current?: number; total?: number } | undefined;\n            if (loc && typeof loc.current === 'number' && typeof loc.total === 'number') {\n              progressReported = true;\n              // 当翻到末尾时（fraction 达到 1 表示全书 100%），用 current + 1 作为实际可达的 total，\n              // 覆盖 SectionProgress 基于字符数向上取整的估算值（会高估）\n              const atEnd = (detail.fraction ?? 0) >= 0.999;\n              const actualTotal = atEnd ? loc.current + 1 : loc.total;\n              reportProgress(loc.current, actualTotal);\n            } else {\n              // fallback：用 section 级别估算\n              const sections = viewRef.current?.book?.sections ?? [];\n              const idx = detail.index ?? 0;\n              const frac = detail.fraction ?? 0;\n              const total = Math.max(sections.length, 1);\n              const current = Math.round((idx + frac) / total * total);\n              reportProgress(current, total);\n            }\n            const tocItem = detail.tocItem as { href?: string } | undefined;\n            if (tocItem?.href) {\n              setActiveTocHref(tocItem.href);\n            }\n          });\n\n          const res = await fetcher(url);\n          if (cancelled) return;\n          if (!res.ok) throw new Error(`请求失败: ${res.status}`);\n          const blob = await res.blob();\n          if (cancelled) return;\n          let name = 'book.mobi';\n          try {\n            const u = new URL(url, window.location.href);\n            const base = u.pathname.split('/').pop();\n            if (base) name = decodeURIComponent(base);\n          } catch { /* blob: URL */ }\n          const file = new File([blob], name);\n\n          await view.open(file);\n          if (cancelled) { view.book?.destroy?.(); return; }\n\n          // 配置 paginator：paginated 模式（默认），带动画\n          const renderer = (view as unknown as { renderer: HTMLElement & {\n            setStyles?: (css: string) => void;\n            next?: () => Promise<void>;\n          } }).renderer;\n\n          if (renderer) {\n            // flow=\"paginated\" 是默认值，不需要显式设置\n            renderer.setAttribute('animated', '');\n            renderer.setAttribute('max-inline-size', '720');\n            renderer.setAttribute('margin', '48');\n            renderer.setAttribute('gap', '5%');\n            // 必须调 next() 渲染首页\n            await renderer.next?.();\n            // setStyles 依赖 view.document 存在，必须在 next() 触发首次渲染后调用\n            renderer.setStyles?.(READER_CSS);\n          }\n          if (cancelled) return;\n\n          setToc(view.book?.toc ?? []);\n          setLoading(false);\n          // 只在 relocate 事件从未报告 progress 时使用 sections.length 作为 fallback，\n          // 避免覆盖 SectionProgress 报告的更准确的 total（通常在首页 render 时通过 relocate 已报告）\n          if (!progressReported) {\n            reportProgress(0, view.book?.sections.length ?? 1);\n          }\n        } catch (err) {\n          // MOBI/EPUB 加载错误通常是文件损坏或 DRM 保护，用 warn 级别记录\n          console.warn('[MobiRenderer] Failed to load ebook:', err instanceof Error ? err.message : String(err));\n          if (!cancelled) {\n            setError(t('mobi.load_failed'));\n            setLoading(false);\n          }\n        }\n      };\n\n      // 延迟到 microtask 队列执行，让 StrictMode 的第一次 cleanup 有机会取消，\n      // 避免两个并发的 view.open() 污染 foliate-js MOBI 解析器内部状态\n      Promise.resolve().then(load);\n\n      return () => {\n        cancelled = true;\n        try { (view as unknown as { close?: () => void })?.close?.(); } catch { /* ignore */ }\n        try { view?.book?.destroy?.(); } catch { /* ignore */ }\n        if (view && view.parentNode === host) {\n          try { host.removeChild(view); } catch { /* ignore */ }\n        }\n        if (viewRef.current === view) viewRef.current = null;\n      };\n    }, [url, reportProgress, t]);\n\n    const isActive = useCallback(\n      (href: string | undefined) => !!href && href === activeTocHref,\n      [activeTocHref]\n    );\n\n    const renderTocItems = (items: TocItem[], depth = 0) => (\n      <ul style={{ listStyle: 'none', padding: 0, margin: depth > 0 ? '0 0 0 16px' : 0 }}>\n        {items.map((item, i) => (\n          <li key={`${item.href ?? item.label}-${i}`}>\n            {item.href ? (\n              <button\n                onClick={() => handleTocClick(item.href!)}\n                className={`rfp-w-full rfp-text-left rfp-py-2 rfp-px-3 rfp-text-sm rfp-rounded rfp-transition-all rfp-truncate ${\n                  isActive(item.href)\n                    ? 'rfp-text-fg-primary rfp-bg-surface-3 rfp-font-medium'\n                    : 'rfp-text-fg-secondary hover:rfp-text-fg-primary hover:rfp-bg-surface-2'\n                }`}\n                title={item.label}\n              >\n                {item.label?.trim()}\n              </button>\n            ) : (\n              <div className=\"rfp-w-full rfp-py-2 rfp-px-3 rfp-text-sm rfp-text-fg-tertiary rfp-truncate\">\n                {item.label?.trim()}\n              </div>\n            )}\n            {item.subitems && item.subitems.length > 0 && renderTocItems(item.subitems, depth + 1)}\n          </li>\n        ))}\n      </ul>\n    );\n\n    return (\n      <div className=\"rfp-relative rfp-w-full rfp-h-full rfp-flex rfp-justify-center rfp-bg-surface-1 rfp-overflow-hidden\">\n        {error && <RendererError message={error} />}\n\n        {loading && !error && (\n          <div className=\"rfp-absolute rfp-inset-0 rfp-flex rfp-items-center rfp-justify-center rfp-z-10\">\n            <div className=\"rfp-w-12 rfp-h-12 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n          </div>\n        )}\n\n        {/* 目录侧栏 */}\n        {toc.length > 0 && (\n          <div\n            className=\"rfp-absolute rfp-inset-0 rfp-z-20 rfp-flex rfp-transition-opacity rfp-duration-300\"\n            style={{ opacity: showToc ? 1 : 0, pointerEvents: showToc ? 'auto' : 'none' }}\n          >\n            <div\n              className=\"rfp-w-72 rfp-max-w-[80%] rfp-h-full rfp-bg-surface-overlay rfp-backdrop-blur-xl rfp-border-r rfp-border-line-weak rfp-flex rfp-flex-col rfp-shadow-2xl rfp-transition-transform rfp-duration-300\"\n              style={{ transform: showToc ? 'translateX(0)' : 'translateX(-100%)' }}\n            >\n              <div className=\"rfp-flex rfp-items-center rfp-justify-between rfp-px-4 rfp-py-3 rfp-border-b rfp-border-line-weak rfp-flex-shrink-0\">\n                <span className=\"rfp-text-fg-primary rfp-font-medium rfp-text-sm\">{t('toolbar.toc')}</span>\n                <button\n                  onClick={() => setShowToc(false)}\n                  className=\"rfp-text-fg-tertiary hover:rfp-text-fg-primary rfp-transition-colors\"\n                >\n                  <X className=\"rfp-w-4 rfp-h-4\" />\n                </button>\n              </div>\n              <div className=\"rfp-flex-1 rfp-overflow-y-auto rfp-py-4 rfp-px-1\">\n                {renderTocItems(toc)}\n              </div>\n            </div>\n            <div\n              className=\"rfp-flex-1 rfp-transition-opacity rfp-duration-300\"\n              style={{ background: showToc ? 'rgba(0,0,0,0.3)' : 'transparent' }}\n              onClick={() => setShowToc(false)}\n            />\n          </div>\n        )}\n\n        {!error && (\n          <div\n            ref={hostRef}\n            className=\"rfp-h-full rfp-bg-surface-toolbar rfp-shadow-lg\"\n            style={{\n              width: isFullWidth ? '100%' : `${A4_WIDTH}px`,\n              maxWidth: '100%',\n              transition: 'width 0.3s ease',\n            }}\n          />\n        )}\n      </div>\n    );\n  }\n);\n\nMobiRenderer.displayName = 'MobiRenderer';\n"],"names":["READER_CSS","A4_WIDTH","MobiRenderer","forwardRef","url","ref","t","useTranslator","fetcher","useFetcher","hostRef","useRef","viewRef","totalLocationsRef","loading","setLoading","useState","error","setError","toc","setToc","showToc","setShowToc","activeTocHref","setActiveTocHref","isFullWidth","setIsFullWidth","currentChapter","setCurrentChapter","totalChapters","setTotalChapters","isFullWidthRef","reportProgress","useCallback","current","total","handlePrev","view","handleNext","toggleToc","prev","toggleFullWidth","newVal","renderer","listenersRef","notifyToolbarChange","listener","useEffect","getToolbarGroups","List","jsx","ChevronLeft","ChevronRight","Minimize2","Maximize2","handleTocClick","href","_a","useImperativeHandle","handler","e","host","cancelled","progressReported","sectionPagesMap","load","detail","currentView","sectionCount","sectionIdx","curSectionPages","pagesBefore","i","currentPage","atEnd","sections","_d","curSize","_e","ratio","est","s","_f","tocItem","loc","actualTotal","_h","_g","idx","frac","res","blob","name","base","file","_b","_c","err","isActive","renderTocItems","items","depth","item","jsxs","RendererError","X"],"mappings":"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"}