fix:网页面板下,右侧pin的面板拖拽事件丢失问题

pull/146/head
oath 3 years ago
parent 23b1a851a9
commit 2421475d27

@ -212,6 +212,7 @@ export {
useHasGroupPermission,
} from './redux/hooks/useGroupPermission';
export { useUserInfo, useUserId } from './redux/hooks/useUserInfo';
export { useDragstatus, updateDragStatus } from './redux/hooks/usePanel'
export { useInboxList, useInboxItem } from './redux/hooks/useInbox';
export { useUnread } from './redux/hooks/useUnread';
export {

@ -0,0 +1,27 @@
import { useAppSelector ,useAppDispatch} from './useAppSelector';
import {dragActions} from '../slices/drag'
import { useMemoizedFn } from '../..';
/**
*
*/
export function useDragstatus():boolean {
return useAppSelector((state) => state.drag.isDraging ?? []);
}
export function updateDragStatus(){
const dispatch = useAppDispatch();
const setStatus = useMemoizedFn(
(status:boolean) => {
dispatch(dragActions.setDragStatus(status))}
);
/**
*
*/
const updateStatus= useMemoizedFn((status: boolean) => {
setStatus(status);
});
return updateStatus ;
}

@ -0,0 +1,29 @@
import { createSlice, PayloadAction } from '@reduxjs/toolkit';
export interface DragState {
/**
*
*/
isDraging:boolean
}
const initialState: DragState = {
isDraging: false,
};
const globalSlice = createSlice({
name: 'global',
initialState,
reducers: {
setDragStatus(
state,
action: PayloadAction<DragState['isDraging']>
) {
state.isDraging = action.payload;
},
},
});
export const dragActions = globalSlice.actions;
export const dragReducer = globalSlice.reducer;

@ -4,6 +4,7 @@ import { chatReducer } from './chat';
import { groupReducer } from './group';
import { uiReducer } from './ui';
import { globalReducer } from './global';
import { dragReducer } from './drag'
export const appReducer = combineReducers({
global: globalReducer,
@ -11,6 +12,7 @@ export const appReducer = combineReducers({
chat: chatReducer,
group: groupReducer,
ui: uiReducer,
drag:dragReducer
});
export type AppState = ReturnType<typeof appReducer>;
@ -20,3 +22,4 @@ export { userActions } from './user';
export { chatActions } from './chat';
export { groupActions } from './group';
export { uiActions } from './ui';
export {dragActions} from './drag'

@ -1,9 +1,10 @@
import clsx from 'clsx';
import React, { PropsWithChildren } from 'react';
import Split from 'react-split';
import { useStorage } from 'tailchat-shared';
import { useStorage, updateDragStatus} from 'tailchat-shared';
import './SplitPanel.less';
/**
* Reference: https://split.js.org/#/
*/
@ -13,11 +14,17 @@ interface SplitPanelProps extends PropsWithChildren {
}
export const SplitPanel: React.FC<SplitPanelProps> = React.memo((props) => {
const [sizes, { save: saveSizes }] = useStorage('pin-sizes', [90, 10]);
const updateStatus = updateDragStatus()
const handleDragEnd = (sizes: number[]) => {
saveSizes(sizes);
updateStatus(false)
};
const handleDragEnter = ()=>{
updateStatus(true)
}
return (
<Split
className={clsx('split', props.className)}
@ -25,6 +32,7 @@ export const SplitPanel: React.FC<SplitPanelProps> = React.memo((props) => {
minSize={250}
expandToMin={true}
onDragEnd={handleDragEnd}
onDragStart={handleDragEnter}
>
{props.children}
</Split>

@ -1,8 +1,10 @@
import React, { useEffect, useRef, useState } from 'react';
import { t } from 'tailchat-shared';
import React, { useEffect, useMemo, useRef, useState } from 'react';
import { t , useDragstatus } from 'tailchat-shared';
import { withKeepAliveOverlay } from './KeepAliveOverlay';
import { Loading } from './Loading';
interface WebviewProps {
className?: string;
style?: React.CSSProperties;
@ -15,17 +17,19 @@ interface WebviewProps {
export const Webview: React.FC<WebviewProps> = (props) => {
const ref = useRef<HTMLIFrameElement>(null);
const [spinning, setSpinning] = useState(true);
const status = useDragstatus()
useEffect(() => {
const callback = () => {
setSpinning(false);
};
ref.current?.addEventListener('load', callback);
return () => {
ref.current?.removeEventListener('load', callback);
};
}, []);
const pointerEvents =useMemo(()=>{
return status ? 'none' : 'auto'
},[status])
return (
<Loading
@ -33,7 +37,7 @@ export const Webview: React.FC<WebviewProps> = (props) => {
className="w-full h-full"
tip={t('加载网页中...')}
>
<iframe ref={ref} className="w-full h-full" src={props.url} />
<iframe ref={ref} style={{pointerEvents}} className="w-full h-full" src={props.url} />
</Loading>
);
};

Loading…
Cancel
Save