Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion src/hooks.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import React from 'react';

export const useIsDocumentHidden = () => {
const [isDocumentHidden, setIsDocumentHidden] = React.useState(document.hidden);
const [isDocumentHidden, setIsDocumentHidden] = React.useState(false);

React.useEffect(() => {
setIsDocumentHidden(document.hidden);
const callback = () => {
setIsDocumentHidden(document.hidden);
};
Expand Down
42 changes: 18 additions & 24 deletions src/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -628,17 +628,9 @@ const Toaster = React.forwardRef<HTMLElement, ToasterProps>(function Toaster(pro
const [heights, setHeights] = React.useState<HeightT[]>([]);
const [expanded, setExpanded] = React.useState(false);
const [interacting, setInteracting] = React.useState(false);
const [actualTheme, setActualTheme] = React.useState(
theme !== 'system'
? theme
: typeof window !== 'undefined'
? window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches
? 'dark'
: 'light'
: 'light',
);
const [actualTheme, setActualTheme] = React.useState(theme !== 'system' ? theme : 'light');

const listRef = React.useRef<HTMLOListElement>(null);
const listRefs = React.useRef<Array<HTMLOListElement | null>>([]);
const hotkeyLabel = hotkey.join('+').replace(/Key/g, '').replace(/Digit/g, '');
const lastFocusedElementRef = React.useRef<HTMLElement>(null);
const isFocusWithinRef = React.useRef(false);
Expand Down Expand Up @@ -683,7 +675,7 @@ const Toaster = React.forwardRef<HTMLElement, ToasterProps>(function Toaster(pro
});
});
});
}, [toasts]);
}, []);

React.useEffect(() => {
if (theme !== 'system') {
Expand Down Expand Up @@ -743,12 +735,16 @@ const Toaster = React.forwardRef<HTMLElement, ToasterProps>(function Toaster(pro

if (isHotkeyPressed) {
setExpanded(true);
listRef.current?.focus();
const firstValidList = listRefs.current.find((el) => el);
firstValidList?.focus();
}

if (
event.code === 'Escape' &&
(document.activeElement === listRef.current || listRef.current?.contains(document.activeElement))
(document.activeElement === null ||
listRefs.current.some(
(listRef) => listRef === document.activeElement || listRef?.contains(document.activeElement),
))
) {
setExpanded(false);
}
Expand All @@ -759,16 +755,14 @@ const Toaster = React.forwardRef<HTMLElement, ToasterProps>(function Toaster(pro
}, [hotkey]);

React.useEffect(() => {
if (listRef.current) {
return () => {
if (lastFocusedElementRef.current) {
lastFocusedElementRef.current.focus({ preventScroll: true });
lastFocusedElementRef.current = null;
isFocusWithinRef.current = false;
}
};
}
}, [listRef.current]);
return () => {
if (lastFocusedElementRef.current) {
lastFocusedElementRef.current.focus({ preventScroll: true });
lastFocusedElementRef.current = null;
isFocusWithinRef.current = false;
}
};
}, []);

return (
// Remove item from normal navigation flow, only available via hotkey
Expand All @@ -792,7 +786,7 @@ const Toaster = React.forwardRef<HTMLElement, ToasterProps>(function Toaster(pro
key={position}
dir={dir === 'auto' ? getDocumentDirection() : dir}
tabIndex={-1}
ref={listRef}
ref={(el) => (listRefs.current[index] = el)}
className={className}
data-sonner-toaster
data-sonner-theme={actualTheme}
Expand Down