import React, { memo, useMemo, type ComponentPropsWithoutRef, type ReactNode } from 'react'; import { HiOutlineLogout } from 'react-icons/hi'; import { HiLockClosed, HiMiniArrowsPointingIn, HiOutlineIdentification, HiQuestionMarkCircle } from 'react-icons/hi2'; import { PiBrowser, PiBrowsersLight } from 'react-icons/pi'; import { VscClose, VscCloseAll, VscPrimitiveSquare } from 'react-icons/vsc'; import { Link } from 'react-router'; import { FloatingFocusManager, FloatingPortal, useTransitionStyles } from '@floating-ui/react'; import { getUserStore } from '@wener/console/console'; import { usePopover } from '@wener/console/floating'; import { getRootWindow, Window, type ReactWindow } from '@wener/console/window'; import clsx from 'clsx'; import { useStore } from 'zustand'; import { shallow } from 'zustand/shallow'; import { useStoreWithEqualityFn } from 'zustand/traditional'; // import { isDev } from '@/const'; import { isDev } from '../../../const'; import { cn } from '../../../utils/cn'; import { getAuthAction } from '../../user'; import { DockClock } from './DockClock'; import { DockUserAvatar } from './DockUserAvatar'; export const DockLayout: React.FC<{ children?: ReactNode; dock?: ReactNode }> = ({ children, dock = }) => { return (
{children}
); }; const UserAvatar = () => { const { id, loginName, fullName, photoUrl, avatarUrl = photoUrl } = useStore(getUserStore()); const hasNotification = false; const { signOut, signIn, lock, refreshProfile } = getAuthAction(); return (
{fullName}
{loginName && ( @{loginName} )}

); }; const Dock = memo(() => { return ( <>
); }); const WindowControlPopoverContent: React.FC> = (props) => { const root = getRootWindow(); // 避免单次操作内 layout 发生变化 const top = useMemo(() => root.top, []); const count = root.windows.length; return ( ); }; const WindowControl = memo(() => { const { refs, getFloatingProps, getReferenceProps, open, setOpen, floatingStyles, context, nodeId } = usePopover({ placement: 'left-start', }); const { isMounted, styles } = useTransitionStyles(context, { initial: { opacity: 0, transform: 'translateY(-10px)', }, close: { opacity: 0, transform: 'translateY(10px)', }, }); return ( <> {isMounted && (
{ setOpen(false); }} />
)} ); }); const WindowDock = memo<{ win: ReactWindow }>(({ win }) => { const iconClass = 'w-8 h-8 '; const { minimized, icon, title } = useStoreWithEqualityFn( win.store, ({ minimized, icon, title }) => { if (React.isValidElement(icon)) { icon = React.cloneElement(icon, { className: iconClass, } as any); } return { minimized, icon, title }; }, shallow, ); const { refs, open, context, floatingStyles, getFloatingProps, getReferenceProps } = usePopover({ hover: true, placement: 'left', }); return ( <> {open && (
{title}
)} ); }); const WindowDocks = memo(() => { const windows = useStoreWithEqualityFn(getRootWindow().store, (s) => s.windows, shallow); return (
{windows.map((win) => { return ; })}
); }); Dock.displayName = 'Dock';