Skip to content

Commit cb3f9bb

Browse files
authored
perf(ui): do not re-animate drawer on re-render, reduce useEffects (#12743)
Previously, every time the drawer re-rendered a new entry animation may be triggered. This PR fixes this by setting the open state to `modalState[slug]?.isOpen` instead of `false`. Additionally, I was able to simplify this component while maintaining functionality. Got rid of one `useEffect` and one `useState` call. The remaining useEffect also runs less often (previously, it ran every time `modalState` changed => it re-ran if _any_ modal opened or closed, not just the current one)
1 parent 192cc97 commit cb3f9bb

File tree

1 file changed

+4
-7
lines changed

1 file changed

+4
-7
lines changed

packages/ui/src/elements/Drawer/index.tsx

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
'use client'
22
import { Modal, useModal } from '@faceless-ui/modal'
3-
import React, { createContext, use, useCallback, useEffect, useState } from 'react'
3+
import React, { createContext, use, useCallback, useLayoutEffect, useState } from 'react'
44

55
import type { Props, TogglerProps } from './types.js'
66

@@ -58,14 +58,11 @@ export const Drawer: React.FC<Props> = ({
5858
const { closeModal, modalState } = useModal()
5959
const drawerDepth = useDrawerDepth()
6060

61-
const [isOpen, setIsOpen] = useState(false)
62-
const [animateIn, setAnimateIn] = useState(false)
61+
const isOpen = !!modalState[slug]?.isOpen
6362

64-
useEffect(() => {
65-
setIsOpen(modalState[slug]?.isOpen)
66-
}, [slug, modalState])
63+
const [animateIn, setAnimateIn] = useState(isOpen)
6764

68-
useEffect(() => {
65+
useLayoutEffect(() => {
6966
setAnimateIn(isOpen)
7067
}, [isOpen])
7168

0 commit comments

Comments
 (0)