mirror of https://github.com/msgbyte/tailchat
				
				
				
			refactor(web): sidebar
							parent
							
								
									127b13d0c9
								
							
						
					
					
						commit
						402ddb9a68
					
				@ -0,0 +1,87 @@
 | 
			
		||||
import React from 'react';
 | 
			
		||||
import clsx, { ClassValue } from 'clsx';
 | 
			
		||||
import { Icon } from '@iconify/react';
 | 
			
		||||
import { Avatar } from '../../components/Avatar';
 | 
			
		||||
 | 
			
		||||
const SidebarItem: React.FC<{
 | 
			
		||||
  className?: ClassValue;
 | 
			
		||||
  icon?: React.ReactNode;
 | 
			
		||||
  action?: React.ReactNode;
 | 
			
		||||
}> = React.memo((props) => {
 | 
			
		||||
  return (
 | 
			
		||||
    <div
 | 
			
		||||
      className={clsx(
 | 
			
		||||
        'w-full hover:bg-white hover:bg-opacity-20 cursor-pointer text-white rounded px-2 h-11 flex items-center text-base group',
 | 
			
		||||
        props.className
 | 
			
		||||
      )}
 | 
			
		||||
    >
 | 
			
		||||
      <div className="flex h-8 items-center justify-center text-2xl w-8 mr-3">
 | 
			
		||||
        {props.icon}
 | 
			
		||||
      </div>
 | 
			
		||||
      <div className="flex-1">{props.children}</div>
 | 
			
		||||
      <div className="text-base p-1 cursor-pointer hidden opacity-70 group-hover:block hover:opacity-100">
 | 
			
		||||
        {props.action}
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
  );
 | 
			
		||||
});
 | 
			
		||||
SidebarItem.displayName = 'SidebarItem';
 | 
			
		||||
 | 
			
		||||
const SidebarSection: React.FC<{
 | 
			
		||||
  action: React.ReactNode;
 | 
			
		||||
}> = React.memo((props) => {
 | 
			
		||||
  return (
 | 
			
		||||
    <div className="h-10 text-white flex pt-4 px-2">
 | 
			
		||||
      <span className="flex-1 overflow-hidden overflow-ellipsis text-xs text-gray-300">
 | 
			
		||||
        {props.children}
 | 
			
		||||
      </span>
 | 
			
		||||
      <div className="text-base opacity-70 hover:opacity-100 cursor-pointer">
 | 
			
		||||
        {props.action}
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
  );
 | 
			
		||||
});
 | 
			
		||||
SidebarSection.displayName = 'SidebarSection';
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 侧边栏组件
 | 
			
		||||
 */
 | 
			
		||||
export const Sidebar: React.FC = React.memo(() => {
 | 
			
		||||
  return (
 | 
			
		||||
    <div className="w-60 bg-gray-800 p-2">
 | 
			
		||||
      {/* Sidebar */}
 | 
			
		||||
      <SidebarItem icon={<Icon icon="mdi-account-multiple" />}>
 | 
			
		||||
        好友
 | 
			
		||||
      </SidebarItem>
 | 
			
		||||
      <SidebarItem icon={<Icon icon="mdi-puzzle" />}>插件中心</SidebarItem>
 | 
			
		||||
 | 
			
		||||
      <SidebarSection action={<Icon icon="mdi-plus" />}>私信</SidebarSection>
 | 
			
		||||
 | 
			
		||||
      <SidebarItem
 | 
			
		||||
        icon={<Avatar name="用户" />}
 | 
			
		||||
        action={<Icon icon="mdi-close" />}
 | 
			
		||||
      >
 | 
			
		||||
        用户1
 | 
			
		||||
      </SidebarItem>
 | 
			
		||||
      <SidebarItem
 | 
			
		||||
        icon={<Avatar name="用户" />}
 | 
			
		||||
        action={<Icon icon="mdi-close" />}
 | 
			
		||||
      >
 | 
			
		||||
        用户1
 | 
			
		||||
      </SidebarItem>
 | 
			
		||||
      <SidebarItem
 | 
			
		||||
        icon={<Avatar name="用户" />}
 | 
			
		||||
        action={<Icon icon="mdi-close" />}
 | 
			
		||||
      >
 | 
			
		||||
        用户1
 | 
			
		||||
      </SidebarItem>
 | 
			
		||||
      <SidebarItem
 | 
			
		||||
        icon={<Avatar name="用户" />}
 | 
			
		||||
        action={<Icon icon="mdi-close" />}
 | 
			
		||||
      >
 | 
			
		||||
        用户1
 | 
			
		||||
      </SidebarItem>
 | 
			
		||||
    </div>
 | 
			
		||||
  );
 | 
			
		||||
});
 | 
			
		||||
Sidebar.displayName = 'Sidebar';
 | 
			
		||||
					Loading…
					
					
				
		Reference in New Issue