♻️(frontend) replace useModal hook
useModal hook does not use useCallback for its methods that creates useless rerenders.
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
import { Modal, ModalProps, ModalSize } from '@openfun/cunningham-react';
|
import { Modal, ModalSize } from '@openfun/cunningham-react';
|
||||||
import Image from 'next/image';
|
import Image from 'next/image';
|
||||||
import { useRouter } from 'next/navigation';
|
import { useRouter } from 'next/navigation';
|
||||||
import { useMemo, useState } from 'react';
|
import { useMemo, useState } from 'react';
|
||||||
@@ -19,7 +19,10 @@ import EmptySearchIcon from '../assets/illustration-docs-empty.png';
|
|||||||
|
|
||||||
import { DocSearchItem } from './DocSearchItem';
|
import { DocSearchItem } from './DocSearchItem';
|
||||||
|
|
||||||
type DocSearchModalProps = ModalProps & {};
|
type DocSearchModalProps = {
|
||||||
|
onClose: () => void;
|
||||||
|
isOpen: boolean;
|
||||||
|
};
|
||||||
|
|
||||||
export const DocSearchModal = ({ ...modalProps }: DocSearchModalProps) => {
|
export const DocSearchModal = ({ ...modalProps }: DocSearchModalProps) => {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ export const LeftPanelTargetFilters = () => {
|
|||||||
const onSelectQuery = (query: DocDefaultFilter) => {
|
const onSelectQuery = (query: DocDefaultFilter) => {
|
||||||
const params = new URLSearchParams(searchParams);
|
const params = new URLSearchParams(searchParams);
|
||||||
params.set('target', query);
|
params.set('target', query);
|
||||||
router.replace(`${pathname}?${params.toString()}`);
|
router.push(`${pathname}?${params.toString()}`);
|
||||||
togglePanel();
|
togglePanel();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { usePathname } from 'next/navigation';
|
import { usePathname } from 'next/navigation';
|
||||||
import { useCallback, useEffect } from 'react';
|
import { useEffect } from 'react';
|
||||||
import { createGlobalStyle, css } from 'styled-components';
|
import { createGlobalStyle, css } from 'styled-components';
|
||||||
|
|
||||||
import { Box, SeparatedSection } from '@/components';
|
import { Box, SeparatedSection } from '@/components';
|
||||||
@@ -30,13 +30,9 @@ export const LeftPanel = () => {
|
|||||||
const colors = theme.colorsTokens();
|
const colors = theme.colorsTokens();
|
||||||
const spacings = theme.spacingsTokens();
|
const spacings = theme.spacingsTokens();
|
||||||
|
|
||||||
const toggle = useCallback(() => {
|
|
||||||
togglePanel(false);
|
|
||||||
}, [togglePanel]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
toggle();
|
togglePanel(false);
|
||||||
}, [pathname, toggle]);
|
}, [pathname, togglePanel]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { Button, ModalSize, useModal } from '@openfun/cunningham-react';
|
import { Button } from '@openfun/cunningham-react';
|
||||||
import { t } from 'i18next';
|
import { t } from 'i18next';
|
||||||
import { useRouter } from 'next/navigation';
|
import { useRouter } from 'next/navigation';
|
||||||
import { PropsWithChildren } from 'react';
|
import { PropsWithChildren, useCallback, useState } from 'react';
|
||||||
|
|
||||||
import { Box, Icon, SeparatedSection } from '@/components';
|
import { Box, Icon, SeparatedSection } from '@/components';
|
||||||
import { useCreateDoc } from '@/docs/doc-management';
|
import { useCreateDoc } from '@/docs/doc-management';
|
||||||
@@ -13,17 +13,24 @@ import { useLeftPanelStore } from '../stores';
|
|||||||
|
|
||||||
export const LeftPanelHeader = ({ children }: PropsWithChildren) => {
|
export const LeftPanelHeader = ({ children }: PropsWithChildren) => {
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const searchModal = useModal();
|
|
||||||
const { authenticated } = useAuth();
|
const { authenticated } = useAuth();
|
||||||
useCmdK(() => {
|
const [isSearchModalOpen, setIsSearchModalOpen] = useState(false);
|
||||||
|
|
||||||
|
const openSearchModal = useCallback(() => {
|
||||||
const isEditorToolbarOpen =
|
const isEditorToolbarOpen =
|
||||||
document.getElementsByClassName('bn-formatting-toolbar').length > 0;
|
document.getElementsByClassName('bn-formatting-toolbar').length > 0;
|
||||||
if (isEditorToolbarOpen) {
|
if (isEditorToolbarOpen) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
searchModal.open();
|
setIsSearchModalOpen(true);
|
||||||
});
|
}, []);
|
||||||
|
|
||||||
|
const closeSearchModal = useCallback(() => {
|
||||||
|
setIsSearchModalOpen(false);
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
useCmdK(openSearchModal);
|
||||||
const { togglePanel } = useLeftPanelStore();
|
const { togglePanel } = useLeftPanelStore();
|
||||||
|
|
||||||
const { mutate: createDoc } = useCreateDoc({
|
const { mutate: createDoc } = useCreateDoc({
|
||||||
@@ -64,7 +71,7 @@ export const LeftPanelHeader = ({ children }: PropsWithChildren) => {
|
|||||||
/>
|
/>
|
||||||
{authenticated && (
|
{authenticated && (
|
||||||
<Button
|
<Button
|
||||||
onClick={searchModal.open}
|
onClick={openSearchModal}
|
||||||
size="medium"
|
size="medium"
|
||||||
color="tertiary-text"
|
color="tertiary-text"
|
||||||
icon={
|
icon={
|
||||||
@@ -80,8 +87,8 @@ export const LeftPanelHeader = ({ children }: PropsWithChildren) => {
|
|||||||
</SeparatedSection>
|
</SeparatedSection>
|
||||||
{children}
|
{children}
|
||||||
</Box>
|
</Box>
|
||||||
{searchModal.isOpen && (
|
{isSearchModalOpen && (
|
||||||
<DocSearchModal {...searchModal} size={ModalSize.LARGE} />
|
<DocSearchModal onClose={closeSearchModal} isOpen={isSearchModalOpen} />
|
||||||
)}
|
)}
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user