mirror of https://github.com/msgbyte/tailchat
				
				
				
			refactor: 抽象面板包装器逻辑,使其可以方便复用
							parent
							
								
									d8b73722d5
								
							
						
					
					
						commit
						8c1cd74355
					
				@ -0,0 +1,63 @@
 | 
			
		||||
import React, { useState } from 'react';
 | 
			
		||||
import { PanelCommonHeader } from '../common/Header';
 | 
			
		||||
import { Icon } from '@iconify/react';
 | 
			
		||||
import { Button } from 'antd';
 | 
			
		||||
import clsx from 'clsx';
 | 
			
		||||
 | 
			
		||||
interface RightPanelType {
 | 
			
		||||
  name: string;
 | 
			
		||||
  panel: React.ReactNode;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 面板通用包装器
 | 
			
		||||
 */
 | 
			
		||||
interface CommonPanelWrapperProps {
 | 
			
		||||
  header: React.ReactNode;
 | 
			
		||||
  actions: (
 | 
			
		||||
    setRightPanel: (info: RightPanelType) => void
 | 
			
		||||
  ) => React.ReactElement[];
 | 
			
		||||
}
 | 
			
		||||
export const CommonPanelWrapper: React.FC<CommonPanelWrapperProps> = React.memo(
 | 
			
		||||
  (props) => {
 | 
			
		||||
    const [rightPanel, setRightPanel] = useState<RightPanelType>();
 | 
			
		||||
 | 
			
		||||
    return (
 | 
			
		||||
      <div className="w-full h-full flex">
 | 
			
		||||
        {/* 主面板 */}
 | 
			
		||||
        <div className="flex flex-col overflow-hidden flex-1">
 | 
			
		||||
          <PanelCommonHeader actions={props.actions(setRightPanel)}>
 | 
			
		||||
            {props.header}
 | 
			
		||||
          </PanelCommonHeader>
 | 
			
		||||
          <div className="flex-1 overflow-hidden">{props.children}</div>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        {/* 右侧面板 */}
 | 
			
		||||
        <div
 | 
			
		||||
          className={clsx(
 | 
			
		||||
            'transition-all overflow-hidden border-l border-black border-opacity-20',
 | 
			
		||||
            {
 | 
			
		||||
              'w-96 mobile:w-full': rightPanel,
 | 
			
		||||
              'w-0': !rightPanel,
 | 
			
		||||
            }
 | 
			
		||||
          )}
 | 
			
		||||
        >
 | 
			
		||||
          <PanelCommonHeader
 | 
			
		||||
            actions={[
 | 
			
		||||
              // 关闭按钮
 | 
			
		||||
              <Button
 | 
			
		||||
                key="close"
 | 
			
		||||
                icon={<Icon className="anticon text-2xl" icon="mdi:close" />}
 | 
			
		||||
                onClick={() => setRightPanel(undefined)}
 | 
			
		||||
              />,
 | 
			
		||||
            ]}
 | 
			
		||||
          >
 | 
			
		||||
            {rightPanel?.name}
 | 
			
		||||
          </PanelCommonHeader>
 | 
			
		||||
          {rightPanel?.panel}
 | 
			
		||||
        </div>
 | 
			
		||||
      </div>
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
);
 | 
			
		||||
CommonPanelWrapper.displayName = 'CommonPanelWrapper';
 | 
			
		||||
					Loading…
					
					
				
		Reference in New Issue