fix(Map): Fixed problem with windows. (#140)

* fix(Map): Fixed problem with windows.

* fix(Core): Added min heigth for body

---------

Co-authored-by: achichenkov <aleksei.chichenkov@telleqt.ai>
Co-authored-by: Dmitry Popov <dmitriypopovsamara@gmail.com>
This commit is contained in:
Aleksei Chichenkov
2025-02-01 23:34:08 +03:00
committed by GitHub
parent cd0b4b0fc9
commit 04f3fec0c0
5 changed files with 59 additions and 18 deletions

View File

@@ -76,14 +76,22 @@ export const WindowWrapper = ({ onResize, onDrag, ...window }: WindowWrapperProp
</div>
);
};
export type ViewPortProps = { w: number; h: number };
export type WindowsManagerOnChange = (props: { windows: WindowProps[]; viewPort: ViewPortProps }) => void;
type WindowManagerProps = {
windows: WindowProps[];
viewPort?: ViewPortProps;
dragSelector?: string;
onChange?(windows: WindowProps[]): void;
onChange?: WindowsManagerOnChange;
};
export const WindowManager: React.FC<WindowManagerProps> = ({ windows: initialWindows, dragSelector, onChange }) => {
export const WindowManager: React.FC<WindowManagerProps> = ({
windows: initialWindows,
viewPort,
dragSelector,
onChange,
}) => {
const [windows, setWindows] = useState(
initialWindows.map((window, index) => ({
...window,
@@ -91,6 +99,16 @@ export const WindowManager: React.FC<WindowManagerProps> = ({ windows: initialWi
})),
);
const refPrevSize = useRef({ w: 0, h: 0 });
useEffect(() => {
if (!viewPort) {
return;
}
refPrevSize.current = viewPort;
}, [viewPort]);
useEffect(() => {
setWindows(initialWindows.slice(0));
}, [initialWindows]);
@@ -102,14 +120,15 @@ export const WindowManager: React.FC<WindowManagerProps> = ({ windows: initialWi
const startMousePositionRef = useRef<{ x: number; y: number }>({ x: 0, y: 0 });
const startWindowStateRef = useRef<{ x: number; y: number; width: number; height: number }>(DefaultWindowState);
const ref = useRef({ windows, onChange });
ref.current = { windows, onChange };
const refPrevSize = useRef({ w: 0, h: 0 });
const ref = useRef({ windows, viewPort, onChange });
ref.current = { windows, viewPort, onChange };
const onDebouncedChange = useMemo(() => {
return debounce(() => {
ref.current.onChange?.(ref.current.windows);
ref.current.onChange?.({
windows: ref.current.windows,
viewPort: refPrevSize.current,
});
}, 20);
}, []);
@@ -336,7 +355,7 @@ export const WindowManager: React.FC<WindowManagerProps> = ({ windows: initialWi
// Handle resize of the container and reposition windows
useEffect(() => {
if (containerRef.current) {
if (ref.current.viewPort == null && containerRef.current) {
refPrevSize.current = { w: containerRef.current.clientWidth, h: containerRef.current.clientHeight };
}
@@ -384,10 +403,14 @@ export const WindowManager: React.FC<WindowManagerProps> = ({ windows: initialWi
next.position.y = container.clientHeight - next.size.height - SNAP_GAP;
}
if (next.position.y < 0) {
if (next.position.y < SNAP_GAP) {
next.position.y = 0;
}
if (next.position.x < SNAP_GAP) {
next.position.x = SNAP_GAP;
}
return next;
});
});