MINOR: added check to append reserve-sidebar class to body (#18141)

* added check to append reserve-sidebar class to body

* added application value as dependency to re-run in case application refetch

* fix the unit test
This commit is contained in:
Ashish Gupta 2024-10-08 10:51:02 +05:30 committed by GitHub
parent 5c684e6276
commit 5e96ff470b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 36 additions and 80 deletions

View File

@ -16,7 +16,6 @@ import classNames from 'classnames';
import React, { FC } from 'react';
import { useTranslation } from 'react-i18next';
import { Thread, ThreadType } from '../../../generated/entity/feed/thread';
import { useReserveSidebar } from '../../../hooks/useReserveSidebar';
import Loader from '../../common/Loader/Loader';
import ActivityFeedEditor from '../ActivityFeedEditor/ActivityFeedEditor';
import FeedPanelBodyV1 from '../ActivityFeedPanel/FeedPanelBodyV1';
@ -34,7 +33,6 @@ const ActivityFeedDrawer: FC<ActivityFeedDrawerProps> = ({
className,
}) => {
const { t } = useTranslation();
const { isSidebarReserve } = useReserveSidebar();
const {
focusReplyEditor,
isDrawerLoading,
@ -73,12 +71,7 @@ const ActivityFeedDrawer: FC<ActivityFeedDrawerProps> = ({
{isDrawerLoading ? (
<Loader />
) : (
<Row
className={classNames({
['reserve-right-sidebar']: isSidebarReserve,
})}
gutter={[0, 16]}
id="feed-panel">
<Row gutter={[0, 16]} id="feed-panel">
<Col span={24}>
<FeedPanelBodyV1
isOpenInDrawer

View File

@ -25,6 +25,17 @@ jest.mock('../../hooks/useApplicationStore', () => {
};
});
jest.mock(
'../Settings/Applications/ApplicationsProvider/ApplicationsProvider',
() => {
return {
useApplicationsProvider: jest.fn(() => ({
applications: [],
})),
};
}
);
jest.mock('../../components/MyData/LeftSidebar/LeftSidebar.component', () =>
jest.fn().mockReturnValue(<p>Sidebar</p>)
);

View File

@ -17,20 +17,20 @@ import React, { useCallback, useEffect, useMemo } from 'react';
import { useTranslation } from 'react-i18next';
import { useLimitStore } from '../../context/LimitsProvider/useLimitsStore';
import { useApplicationStore } from '../../hooks/useApplicationStore';
import { useReserveSidebar } from '../../hooks/useReserveSidebar';
import { getLimitConfig } from '../../rest/limitsAPI';
import applicationRoutesClass from '../../utils/ApplicationRoutesClassBase';
import Appbar from '../AppBar/Appbar';
import { LimitBanner } from '../common/LimitBanner/LimitBanner';
import LeftSidebar from '../MyData/LeftSidebar/LeftSidebar.component';
import applicationsClassBase from '../Settings/Applications/AppDetails/ApplicationsClassBase';
import { useApplicationsProvider } from '../Settings/Applications/ApplicationsProvider/ApplicationsProvider';
import './app-container.less';
const AppContainer = () => {
const { i18n } = useTranslation();
const { Header, Sider, Content } = Layout;
const { currentUser } = useApplicationStore();
const { isSidebarReserve } = useReserveSidebar();
const { applications } = useApplicationsProvider();
const AuthenticatedRouter = applicationRoutesClass.getRouteElements();
const ApplicationExtras = applicationsClassBase.getApplicationExtension();
const isDirectionRTL = useMemo(() => i18n.dir() === 'rtl', [i18n]);
@ -46,19 +46,29 @@ const AppContainer = () => {
}
}, []);
const appendReserveRightSidebarClass = useCallback(() => {
const element = document.getElementsByTagName('body');
element[0].classList.add('reserve-right-sidebar');
}, []);
useEffect(() => {
if (currentUser?.id) {
fetchLimitConfig();
}
}, [currentUser?.id]);
useEffect(() => {
if (applicationsClassBase.isFloatingButtonPresent(applications)) {
appendReserveRightSidebarClass();
}
}, [applications]);
return (
<Layout>
<LimitBanner />
<Layout
className={classNames('app-container', {
['extra-banner']: Boolean(bannerDetails),
['reserve-right-sidebar']: isSidebarReserve,
})}>
<Sider
className={classNames('left-sidebar-col', {

View File

@ -12,7 +12,7 @@
*/
import { FC } from 'react';
import { AppType } from '../../../../generated/entity/applications/app';
import { App, AppType } from '../../../../generated/entity/applications/app';
import { getScheduleOptionsFromSchedules } from '../../../../utils/ScheduleUtils';
class ApplicationsClassBase {
@ -34,6 +34,16 @@ class ApplicationsClassBase {
return null;
}
public getFloatingApplicationEntityList(): string[] {
return [];
}
public isFloatingButtonPresent(applications: App[]) {
return applications.some((app) =>
this.getFloatingApplicationEntityList().includes(app.name)
);
}
public importAppScreenshot(screenshotName: string) {
return import(`../../../../assets/img/appScreenshots/${screenshotName}`);
}

View File

@ -1,36 +0,0 @@
/*
* Copyright 2024 Collate.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { renderHook } from '@testing-library/react-hooks';
import { useReserveSidebar } from './useReserveSidebar';
describe('useReserveSidebar', () => {
it('should return false when .floating-button-container is not present', () => {
const { result } = renderHook(() => useReserveSidebar());
expect(result.current.isSidebarReserve).toBe(false);
});
it('should return true when .floating-button-container is present', () => {
// Create a mock element and append it to the document body
const floatingButtonContainer = document.createElement('div');
floatingButtonContainer.className = 'floating-button-container';
document.body.appendChild(floatingButtonContainer);
const { result } = renderHook(() => useReserveSidebar());
expect(result.current.isSidebarReserve).toBe(true);
// Clean up the mock element
document.body.removeChild(floatingButtonContainer);
});
});

View File

@ -1,32 +0,0 @@
/*
* Copyright 2024 Collate.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { useEffect, useState } from 'react';
type ReserverSidebar = { isSidebarReserve: boolean };
/**
* @description Hook to get the if the sidebar should have some reserved space in case of floating button
* @returns {isSidebarReserve: boolean} - boolean value to check if the sidebar should have some reserved space
*/
export const useReserveSidebar = (): ReserverSidebar => {
const [isSidebarReserve, setIsSidebarReserve] = useState<boolean>(false);
useEffect(() => {
const element = document.querySelector('.floating-button-container');
setIsSidebarReserve(Boolean(element));
}, []);
return {
isSidebarReserve,
};
};