|
|
@@ -0,0 +1,46 @@
|
|
|
+import Notification, {
|
|
|
+ NotificationProps,
|
|
|
+} from '@/shared/components/notification'
|
|
|
+import { useEffect } from 'react'
|
|
|
+
|
|
|
+function elementIsInView(el: HTMLElement) {
|
|
|
+ const scroll = window.scrollY
|
|
|
+ const boundsTop = el.getBoundingClientRect().top + scroll
|
|
|
+
|
|
|
+ const viewport = {
|
|
|
+ top: scroll,
|
|
|
+ bottom: scroll + window.innerHeight,
|
|
|
+ }
|
|
|
+
|
|
|
+ const bounds = {
|
|
|
+ top: boundsTop,
|
|
|
+ bottom: boundsTop + el.clientHeight,
|
|
|
+ }
|
|
|
+
|
|
|
+ return (
|
|
|
+ (bounds.bottom >= viewport.top && bounds.bottom <= viewport.bottom) ||
|
|
|
+ (bounds.top <= viewport.bottom && bounds.top >= viewport.top)
|
|
|
+ )
|
|
|
+}
|
|
|
+
|
|
|
+function NotificationScrolledTo({ ...props }: NotificationProps) {
|
|
|
+ useEffect(() => {
|
|
|
+ if (props.id) {
|
|
|
+ const alert = document.getElementById(props.id)
|
|
|
+ if (alert && !elementIsInView(alert)) {
|
|
|
+ alert.scrollIntoView({ behavior: 'smooth' })
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, [props])
|
|
|
+
|
|
|
+ const notificationProps = { ...props }
|
|
|
+
|
|
|
+ if (!notificationProps.className) {
|
|
|
+ notificationProps.className = ''
|
|
|
+ }
|
|
|
+
|
|
|
+ notificationProps.className = `${notificationProps.className} notification-with-scroll-margin`
|
|
|
+
|
|
|
+ return <Notification {...notificationProps} />
|
|
|
+}
|
|
|
+export default NotificationScrolledTo
|