Skip to content

Commit 45bad96

Browse files
committed
fix: some optimize
Signed-off-by: Innei <[email protected]>
1 parent 493546f commit 45bad96

File tree

7 files changed

+54
-22
lines changed

7 files changed

+54
-22
lines changed

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
"@vercel/analytics": "1.1.1",
4949
"@vercel/postgres": "0.5.0",
5050
"axios": "1.6.0",
51+
"bypass-vue-devtools": "0.0.6",
5152
"clsx": "2.0.0",
5253
"daisyui": "3.9.4",
5354
"dayjs": "1.11.10",

pnpm-lock.yaml

+7
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/app/InitInClient.ts

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
'use client'
2+
3+
import { useEffect } from 'react'
4+
import { cheatVueDevtools } from 'bypass-vue-devtools'
5+
6+
import { init } from './init'
7+
8+
init()
9+
10+
export const InitInClient = () => {
11+
useEffect(() => {
12+
cheatVueDevtools()
13+
}, [])
14+
return null
15+
}

src/app/init.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
import dayjs from "dayjs"
1+
import dayjs from 'dayjs'
2+
23
import 'dayjs/locale/zh-cn'
34

45
export const init = () => {
56
dayjs.locale('zh-cn')
6-
}
7+
}

src/app/layout.tsx

+2
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import { queries } from '~/queries/definition'
2323
import { Providers } from '../providers/root'
2424
import { Analyze } from './analyze'
2525
import { init } from './init'
26+
import { InitInClient } from './InitInClient'
2627

2728
const { version } = PKG
2829
init()
@@ -162,6 +163,7 @@ export default async function RootLayout(props: Props) {
162163
</Providers>
163164
<ToastContainer />
164165
<ScrollTop />
166+
<InitInClient />
165167
</body>
166168
</html>
167169
<Analytics />

src/components/ui/theme-switcher/ThemeSwitcher.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
'use client'
22

33
import { useCallback } from 'react'
4+
import { flushSync } from 'react-dom'
45
import { atom } from 'jotai'
56
import { useTheme } from 'next-themes'
67
import { tv } from 'tailwind-variants'
@@ -146,8 +147,7 @@ const ButtonGroup = () => {
146147

147148
document
148149
.startViewTransition(() => {
149-
setTheme(theme)
150-
return Promise.resolve()
150+
flushSync(() => setTheme(theme))
151151
})
152152
?.ready.then(() => {
153153
if (mousePosition.x === 0) return

src/providers/root/modal-stack-provider.tsx

+24-18
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ import { CloseIcon } from '~/components/icons/close'
2020
import { DialogOverlay } from '~/components/ui/dialog/DialogOverlay'
2121
import { Divider } from '~/components/ui/divider'
2222
import { microReboundPreset } from '~/constants/spring'
23-
import { useEventCallback } from '~/hooks/common/use-event-callback'
2423
import { useIsClient } from '~/hooks/common/use-is-client'
24+
import { useIsUnMounted } from '~/hooks/common/use-is-unmounted'
2525
import { stopPropagation } from '~/lib/dom'
2626
import { clsxm } from '~/lib/helper'
2727
import { jotaiStore } from '~/lib/store'
@@ -55,23 +55,26 @@ export const useModalStack = () => {
5555
const id = useId()
5656
const currentCount = useRef(0)
5757
return {
58-
present(props: ModalProps & { id?: string }) {
59-
const modalId = `${id}-${currentCount.current++}`
60-
jotaiStore.set(modalStackAtom, (p) => {
61-
const modalProps = {
62-
...props,
63-
id: props.id ?? modalId,
64-
}
65-
modalIdToPropsMap[modalProps.id] = modalProps
66-
return p.concat(modalProps)
67-
})
68-
69-
return () => {
58+
present: useCallback(
59+
(props: ModalProps & { id?: string }) => {
60+
const modalId = `${id}-${currentCount.current++}`
7061
jotaiStore.set(modalStackAtom, (p) => {
71-
return p.filter((item) => item.id !== modalId)
62+
const modalProps = {
63+
...props,
64+
id: props.id ?? modalId,
65+
}
66+
modalIdToPropsMap[modalProps.id] = modalProps
67+
return p.concat(modalProps)
7268
})
73-
}
74-
},
69+
70+
return () => {
71+
jotaiStore.set(modalStackAtom, (p) => {
72+
return p.filter((item) => item.id !== modalId)
73+
})
74+
}
75+
},
76+
[id],
77+
),
7578

7679
...actions,
7780
}
@@ -136,11 +139,11 @@ const Modal: Component<{
136139
index: number
137140
}> = memo(function Modal({ item, index }) {
138141
const setStack = useSetAtom(modalStackAtom)
139-
const close = useEventCallback(() => {
142+
const close = useCallback(() => {
140143
setStack((p) => {
141144
return p.filter((modal) => modal.id !== item.id)
142145
})
143-
})
146+
}, [item.id, setStack])
144147

145148
const onClose = useCallback(
146149
(open: boolean): void => {
@@ -170,6 +173,8 @@ const Modal: Component<{
170173
},
171174
[close],
172175
)
176+
177+
const isUnmounted = useIsUnMounted()
173178
const noticeModal = useCallback(() => {
174179
animateController
175180
.start({
@@ -179,6 +184,7 @@ const Modal: Component<{
179184
},
180185
})
181186
.then(() => {
187+
if (isUnmounted.current) return
182188
animateController.start({
183189
scale: 1,
184190
})

0 commit comments

Comments
 (0)