From 4e5e93ac37fece6576abfdd0672c6a49408ecdd4 Mon Sep 17 00:00:00 2001 From: Dev Agrawal Date: Thu, 25 Jun 2026 15:56:51 -0500 Subject: [PATCH] presenve v2 --- packages/presence/src/index.ts | 53 ++++++++++++---------------------- 1 file changed, 18 insertions(+), 35 deletions(-) diff --git a/packages/presence/src/index.ts b/packages/presence/src/index.ts index 8d8b84a83..6f51fdbd3 100644 --- a/packages/presence/src/index.ts +++ b/packages/presence/src/index.ts @@ -47,11 +47,9 @@ function createPresenceBase( "enterDuration" in options ? options.enterDuration : options.transitionDuration, ); - const initialSource = untrack(source); - const initialState = options.initialEnter ? false : initialSource; - const [isVisible, setIsVisible] = createSignal(initialState, INTERNAL_OPTIONS); - const [isMounted, setIsMounted] = createSignal(initialSource, INTERNAL_OPTIONS); - const [hasEntered, setHasEntered] = createSignal(initialState, INTERNAL_OPTIONS); + const [isVisible, setIsVisible] = createSignal((prev = !options.initialEnter) => source() ? prev : false, INTERNAL_OPTIONS); + const [isMounted, setIsMounted] = createSignal(source, INTERNAL_OPTIONS); + const [hasEntered, setHasEntered] = createSignal((prev = !options.initialEnter) => source() ? prev : false, INTERNAL_OPTIONS); const isExiting = createMemo(() => isMounted() && !source()); const isEntering = createMemo(() => source() && !hasEntered()); @@ -60,11 +58,7 @@ function createPresenceBase( createEffect( () => source(), isActive => { - if (isActive) { - setIsMounted(true); - } else { - setHasEntered(false); - setIsVisible(false); + if (!isActive) { const timeoutId = setTimeout(() => setIsMounted(false), exitDuration()); return () => clearTimeout(timeoutId); } @@ -143,32 +137,21 @@ export function createPresence( item: Accessor, options: Options, ): PresenceResult { - const initial = untrack(item); - const [mountedItem, setMountedItem] = createSignal(initial as Exclude, INTERNAL_OPTIONS); - const [shouldBeMounted, setShouldBeMounted] = createSignal(itemShouldBeMounted(initial), INTERNAL_OPTIONS); - const { isMounted, ...rest } = createPresenceBase(shouldBeMounted, options); + const mountedItem = createMemo((prev) => { + if (prev !== item() && !isMounted() && itemShouldBeMounted(item())) { + return item() + } + return prev + }); + + const shouldBeMounted = createMemo(() => { + if (mountedItem() !== item() && isMounted()) { + return false; + } + return itemShouldBeMounted(item()) + }); - createEffect( - () => ({ - currentItem: item(), - mounted: mountedItem(), - isM: isMounted(), - }), - ({ currentItem, mounted, isM }) => { - if (mounted !== currentItem) { - if (isM) { - setShouldBeMounted(false); - } else if (itemShouldBeMounted(currentItem)) { - setMountedItem(currentItem as Exclude); - setShouldBeMounted(true); - } - } else if (!itemShouldBeMounted(currentItem)) { - setShouldBeMounted(false); - } else if (itemShouldBeMounted(currentItem)) { - setShouldBeMounted(true); - } - }, - ); + const { isMounted, ...rest } = createPresenceBase(shouldBeMounted, options); return { ...rest,