2023-01-06 22:46:07 +01:00
|
|
|
import { useMantineTheme } from '@mantine/core';
|
|
|
|
|
import create from 'zustand';
|
|
|
|
|
|
|
|
|
|
export const useGridstackStore = create<GridstackStoreType>((set, get) => ({
|
|
|
|
|
mainAreaWidth: null,
|
|
|
|
|
currentShapeSize: null,
|
|
|
|
|
setMainAreaWidth: (w: number) =>
|
|
|
|
|
set((v) => ({ ...v, mainAreaWidth: w, currentShapeSize: getCurrentShapeSize(w) })),
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
interface GridstackStoreType {
|
|
|
|
|
mainAreaWidth: null | number;
|
|
|
|
|
currentShapeSize: null | 'sm' | 'md' | 'lg';
|
|
|
|
|
setMainAreaWidth: (width: number) => void;
|
|
|
|
|
}
|
|
|
|
|
|
2023-01-11 20:37:46 +01:00
|
|
|
export const useNamedWrapperColumnCount = (): 'small' | 'medium' | 'large' | null => {
|
2023-01-06 22:46:07 +01:00
|
|
|
const mainAreaWidth = useGridstackStore((x) => x.mainAreaWidth);
|
|
|
|
|
const { sm, xl } = useMantineTheme().breakpoints;
|
|
|
|
|
if (!mainAreaWidth) return null;
|
|
|
|
|
|
2023-01-11 20:37:46 +01:00
|
|
|
if (mainAreaWidth >= xl) return 'large';
|
|
|
|
|
|
|
|
|
|
if (mainAreaWidth >= sm) return 'medium';
|
2023-01-06 22:46:07 +01:00
|
|
|
|
2023-01-11 20:37:46 +01:00
|
|
|
return 'small';
|
|
|
|
|
};
|
2023-01-06 22:46:07 +01:00
|
|
|
|
2023-01-11 20:37:46 +01:00
|
|
|
export const useWrapperColumnCount = () => {
|
|
|
|
|
switch (useNamedWrapperColumnCount()) {
|
|
|
|
|
case 'large':
|
2023-01-14 22:51:39 +01:00
|
|
|
return 12;
|
2023-01-11 20:37:46 +01:00
|
|
|
case 'medium':
|
2023-01-14 22:51:39 +01:00
|
|
|
return 6;
|
2023-01-11 20:37:46 +01:00
|
|
|
case 'small':
|
|
|
|
|
return 3;
|
|
|
|
|
default:
|
|
|
|
|
return null;
|
|
|
|
|
}
|
2023-01-06 22:46:07 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
function getCurrentShapeSize(size: number) {
|
|
|
|
|
return size >= 1400 ? 'lg' : size >= 768 ? 'md' : 'sm';
|
|
|
|
|
}
|