PromucFlow_constructor/app/client/src/pages/Editor/MainContainerLayoutControl.tsx
albinAppsmith fbc3bd663b
feat: Migrate design system components import to design-system repo - I (#15562)
* Icon component deleted and changed the imports in refrence places

* design system package version changed

* import changes

* Delete TextInput.tsx

* Change imports

* Change single named import

* Update package

* Update package

* Delete ScrollIndicator.tsx

* Change imports

* Icon import completed

* Event type added

* Changed Button component imports

* import change button

* Button onclick type fix

* Label with Tooltip import changes

* Changed breadcrumbs import

* EmojiPicker and Emoji Reaction import changes

* AppIcon import change

* import bug fix

* Menu Item import chnages

* Icon selector imports changed

* Delete LabelWithTooltip.tsx

* Change imports across the app

* Update package version

* Update version number for design-system

* Delete Checkbox.tsx

* Remove the exports

* Add lock file for ds package update

* Change imports

* default import -> named

* Update release version

* Make arg type explicit

* Updated design-system to latest release

* Missing file mysteriously comes back and is updated accordingly

* changes design-system package version

* Add types to arguments in the onChange for text input

* onBlur type fix

* Search component in property pane

* WDS button changes reverted

* package version bumped

* conflict fix

* Remove Dropdown, change imports

* Category import fix

* fix: table icon size import

* Bump version of design system package

* Yarn lock

Co-authored-by: Tanvi Bhakta <tanvibhakta@gmail.com>
2022-08-22 10:39:39 +05:30

157 lines
4.2 KiB
TypeScript

import classNames from "classnames";
import { useDispatch } from "react-redux";
import React, { useMemo, useCallback } from "react";
import {
getCurrentApplicationId,
getCurrentApplicationLayout,
} from "selectors/editorSelectors";
import { useSelector } from "store";
import { Colors } from "constants/Colors";
import {
AppLayoutConfig,
SupportedLayouts,
} from "reducers/entityReducers/pageListReducer";
import { TooltipComponent, Icon, IconName, IconSize } from "design-system";
import { updateApplicationLayout } from "actions/applicationActions";
interface AppsmithLayoutConfigOption {
name: string;
type: SupportedLayouts;
icon?: IconName;
}
export const AppsmithDefaultLayout: AppLayoutConfig = {
type: "FLUID",
};
const AppsmithLayouts: AppsmithLayoutConfigOption[] = [
{
name: "Fluid Width",
type: "FLUID",
icon: "fluid",
},
{
name: "Desktop",
type: "DESKTOP",
icon: "desktop",
},
{
name: "Tablet(Large)",
type: "TABLET_LARGE",
icon: "tablet",
},
{
name: "Tablet",
type: "TABLET",
icon: "tablet",
},
{
name: "Mobile Device",
type: "MOBILE",
icon: "mobile",
},
];
export function MainContainerLayoutControl() {
const dispatch = useDispatch();
const appId = useSelector(getCurrentApplicationId);
const appLayout = useSelector(getCurrentApplicationLayout);
const buttonRefs: Array<HTMLButtonElement | null> = [];
/**
* return selected layout index. if there is no app
* layout, use the default one ( fluid )
*/
const selectedIndex = useMemo(() => {
return AppsmithLayouts.findIndex(
(each) => each.type === (appLayout?.type || AppsmithDefaultLayout.type),
);
}, [appLayout]);
const [focusedIndex, setFocusedIndex] = React.useState(selectedIndex);
/**
* updates the app layout
*
* @param layoutConfig
*/
const updateAppLayout = useCallback(
(layoutConfig: AppLayoutConfig) => {
const { type } = layoutConfig;
dispatch(
updateApplicationLayout(appId || "", {
appLayout: {
type,
},
}),
);
},
[dispatch, appLayout],
);
const handleKeyDown = (event: React.KeyboardEvent, index: number) => {
if (!buttonRefs.length) return;
switch (event.key) {
case "ArrowRight":
case "Right":
const rightIndex = index === buttonRefs.length - 1 ? 0 : index + 1;
buttonRefs[rightIndex]?.focus();
setFocusedIndex(rightIndex);
break;
case "ArrowLeft":
case "Left":
const leftIndex = index === 0 ? buttonRefs.length - 1 : index - 1;
buttonRefs[leftIndex]?.focus();
setFocusedIndex(leftIndex);
break;
}
};
return (
<div className="space-y-2 t--layout-control-wrapper">
<div
className="flex justify-around"
onBlur={() => setFocusedIndex(selectedIndex)}
>
{AppsmithLayouts.map((layoutOption: any, index: number) => {
return (
<TooltipComponent
className="flex-grow"
content={layoutOption.name}
key={layoutOption.name}
position={
index === AppsmithLayouts.length - 1 ? "bottom-right" : "bottom"
}
>
<button
className={classNames({
"border-transparent border flex items-center justify-center p-2 flex-grow focus:bg-gray-200": true,
"bg-white border-gray-300": selectedIndex === index,
"bg-gray-100 hover:bg-gray-200": selectedIndex !== index,
})}
onClick={() => {
updateAppLayout(layoutOption);
setFocusedIndex(index);
}}
onKeyDown={(event) => handleKeyDown(event, index)}
ref={(input) => buttonRefs.push(input)}
tabIndex={index === focusedIndex ? 0 : -1}
>
<Icon
fillColor={Colors.BLACK}
name={layoutOption.icon}
size={layoutOption.iconSize || IconSize.MEDIUM}
/>
</button>
</TooltipComponent>
);
})}
</div>
</div>
);
}