/* eslint-disable dot-notation */ import React, { createRef, FC, useContext, useEffect, useRef, useState } from 'react' import { createPortal } from 'react-dom' import { observer } from 'mobx-react' import classNames from 'classnames' import Context from '../context/browser' import { pages } from '../v_browser' import WindowWrapper from './window_wrapper' import Delete from '../../../svg/vbrowser-tab-delete.svg' import Left from '../../../svg/vbrowser-tab-left.svg' import Right from '../../../svg/vbrowser-tab-right.svg' import { clamp, throttle } from 'lodash' import BrowserWindowContext from '../context/browserWindow' import './style.less' const VBrowserContainer: FC<{ className?: string }> = observer( ({ className, ...props }) => { const containerRef = createRef() const browser = useContext(Context) // const leftInterval = useRef() // const rightInterval = useRef() const [state, setState] = useState({ scrollLeft: 0, scrollWidth: 0, width: 0 }) useEffect(() => { const container = containerRef.current if (container) { container.appendChild(browser['_portal']) } browser.mounted = true }, []) // #region Tabs滚动处理 useEffect(() => { const wrapper: HTMLDivElement | null = document.querySelector( '.v-browser-tabs-items' ) if (!wrapper) return const onScroll = throttle(() => { setState({ width: wrapper.getBoundingClientRect().width, scrollWidth: wrapper.scrollWidth, scrollLeft: wrapper.scrollLeft, }) }, 20) wrapper.addEventListener('scroll', onScroll) onScroll() return () => { wrapper.removeEventListener('scroll', onScroll) } }, [browser.windows.length]) const _handleScroll = (offset: number) => { const wrapper = document.querySelector('.v-browser-tabs-items') if (!wrapper) return wrapper.scrollTo({ left: clamp(wrapper.scrollLeft + offset, 0, wrapper.scrollWidth), behavior: 'smooth', }) } // #endregion const portal = useRef( createPortal( pages.map((page, i) => { return ( ) }), browser['_portal'] ) ) const ignored = browser.props.ignoredPath?.find((p) => typeof p === 'string' ? p === browser.activeWindow?.path : p.test(browser.activeWindow?.path!) ) return (
{ e.stopPropagation() _handleScroll(-160) }} // onMouseEnter={() => { // leftInterval.current = setInterval(() => { // _handleScroll(-1) // }, 0) as any // }} // onMouseLeave={() => { // clearInterval(leftInterval.current) // }} >
{browser.windows.map((w, i) => { return ( <>
browser.switchWindow(w)} >
{w.faviconURL && ( )} {w.title || '-'}
{ e.stopPropagation() browser.close(w) }} />
) })}
{ e.stopPropagation() _handleScroll(160) }} // onMouseEnter={() => { // rightInterval.current = setInterval(() => { // _handleScroll(+1) // }, 0) as any // }} // onMouseLeave={() => { // clearInterval(rightInterval.current) // }} >
{portal.current}
) } ) export default VBrowserContainer