mirror of https://github.com/msgbyte/tailchat
				
				
				
			
			You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			93 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			TypeScript
		
	
			
		
		
	
	
			93 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			TypeScript
		
	
import React, { useCallback, useEffect, useRef, useState } from 'react';
 | 
						|
import {
 | 
						|
  useGroupInfo,
 | 
						|
  GroupPanel as GroupPanelInfo,
 | 
						|
  t,
 | 
						|
  modifyGroupField,
 | 
						|
  useAsyncRequest,
 | 
						|
  showToasts,
 | 
						|
} from 'tailchat-shared';
 | 
						|
import { Button } from 'antd';
 | 
						|
import _isEqual from 'lodash/isEqual';
 | 
						|
import { GroupPanelTree } from './GroupPanelTree';
 | 
						|
import { FullModalCommonTitle } from '@/components/FullModal/CommonTitle';
 | 
						|
import { closeModal, openModal } from '@/components/Modal';
 | 
						|
import { ModalCreateGroupPanel } from '../../CreateGroupPanel';
 | 
						|
 | 
						|
export const GroupPanel: React.FC<{
 | 
						|
  groupId: string;
 | 
						|
}> = React.memo((props) => {
 | 
						|
  const groupId = props.groupId;
 | 
						|
  const groupInfo = useGroupInfo(groupId);
 | 
						|
  const groupPanels = groupInfo?.panels ?? [];
 | 
						|
  const [editingGroupPanels, setEditingGroupPanels] = useState(groupPanels);
 | 
						|
  const isEditingRef = useRef(false);
 | 
						|
 | 
						|
  useEffect(() => {
 | 
						|
    // 如果不处于编辑状态, 则一直更新最新的面板
 | 
						|
    if (isEditingRef.current === true) {
 | 
						|
      return;
 | 
						|
    }
 | 
						|
 | 
						|
    setEditingGroupPanels(groupPanels);
 | 
						|
  }, [groupPanels]);
 | 
						|
 | 
						|
  const handleChange = useCallback((newGroupPanels: GroupPanelInfo[]) => {
 | 
						|
    isEditingRef.current = true;
 | 
						|
    setEditingGroupPanels(newGroupPanels);
 | 
						|
  }, []);
 | 
						|
 | 
						|
  const [{ loading }, handleSave] = useAsyncRequest(async () => {
 | 
						|
    await modifyGroupField(groupId, 'panels', editingGroupPanels);
 | 
						|
    isEditingRef.current = false;
 | 
						|
    showToasts(t('保存成功'), 'success');
 | 
						|
  }, [editingGroupPanels]);
 | 
						|
 | 
						|
  const handleReset = useCallback(() => {
 | 
						|
    setEditingGroupPanels(groupPanels);
 | 
						|
    isEditingRef.current = false;
 | 
						|
  }, [groupPanels]);
 | 
						|
 | 
						|
  const handleOpenCreatePanelModal = useCallback(() => {
 | 
						|
    const key = openModal(
 | 
						|
      <ModalCreateGroupPanel
 | 
						|
        groupId={groupId}
 | 
						|
        onCreateSuccess={() => {
 | 
						|
          closeModal(key);
 | 
						|
          isEditingRef.current = false;
 | 
						|
        }}
 | 
						|
      />
 | 
						|
    );
 | 
						|
  }, []);
 | 
						|
 | 
						|
  return (
 | 
						|
    <div>
 | 
						|
      <FullModalCommonTitle
 | 
						|
        extra={
 | 
						|
          <Button type="primary" onClick={handleOpenCreatePanelModal}>
 | 
						|
            {t('创建面板')}
 | 
						|
          </Button>
 | 
						|
        }
 | 
						|
      >
 | 
						|
        {t('面板管理')}
 | 
						|
      </FullModalCommonTitle>
 | 
						|
 | 
						|
      <GroupPanelTree
 | 
						|
        groupId={groupId}
 | 
						|
        groupPanels={editingGroupPanels}
 | 
						|
        onChange={handleChange}
 | 
						|
      />
 | 
						|
 | 
						|
      {!_isEqual(groupPanels, editingGroupPanels) && (
 | 
						|
        <div className="space-x-1 mt-2">
 | 
						|
          <Button type="primary" loading={loading} onClick={handleSave}>
 | 
						|
            {t('保存')}
 | 
						|
          </Button>
 | 
						|
          <Button onClick={handleReset}>{t('重置')}</Button>
 | 
						|
        </div>
 | 
						|
      )}
 | 
						|
    </div>
 | 
						|
  );
 | 
						|
});
 | 
						|
GroupPanel.displayName = 'GroupPanel';
 |