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 (
);
};
const UserAvatar = () => {
const { id, loginName, fullName, photoUrl, avatarUrl = photoUrl } = useStore(getUserStore());
const hasNotification = false;
const { signOut, signIn, lock, refreshProfile } = getAuthAction();
return (
{fullName}
{loginName && (
@{loginName}
)}
-
-
-
{isDev() && (
-
)}
);
};
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';