pull/146/merge
oath_liu 3 years ago committed by GitHub
commit fdc90bd0cc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -216,6 +216,7 @@ export {
useHasGroupPanelPermission, useHasGroupPanelPermission,
} from './redux/hooks/useGroupPermission'; } from './redux/hooks/useGroupPermission';
export { useUserInfo, useUserId } from './redux/hooks/useUserInfo'; export { useUserInfo, useUserId } from './redux/hooks/useUserInfo';
export { useDragstatus, updateDragStatus } from './redux/hooks/usePanel'
export { useInboxList, useInboxItem } from './redux/hooks/useInbox'; export { useInboxList, useInboxItem } from './redux/hooks/useInbox';
export { useUnread } from './redux/hooks/useUnread'; export { useUnread } from './redux/hooks/useUnread';
export { 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 { groupReducer } from './group';
import { uiReducer } from './ui'; import { uiReducer } from './ui';
import { globalReducer } from './global'; import { globalReducer } from './global';
import { dragReducer } from './drag'
export const appReducer = combineReducers({ export const appReducer = combineReducers({
global: globalReducer, global: globalReducer,
@ -11,6 +12,7 @@ export const appReducer = combineReducers({
chat: chatReducer, chat: chatReducer,
group: groupReducer, group: groupReducer,
ui: uiReducer, ui: uiReducer,
drag:dragReducer
}); });
export type AppState = ReturnType<typeof appReducer>; export type AppState = ReturnType<typeof appReducer>;
@ -20,3 +22,4 @@ export { userActions } from './user';
export { chatActions } from './chat'; export { chatActions } from './chat';
export { groupActions } from './group'; export { groupActions } from './group';
export { uiActions } from './ui'; export { uiActions } from './ui';
export {dragActions} from './drag'

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

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

Loading…
Cancel
Save