Files
web/apps/scandic-web/app/[lang]/(live)/error.tsx
Joakim Jäderberg daf765f3d5 Merged in feature/wrap-logging (pull request #2511)
Feature/wrap logging

* feat: change all logging to go through our own logger function so that we can control log levels

* move packages/trpc to using our own logger

* merge


Approved-by: Linus Flood
2025-07-03 12:37:04 +00:00

75 lines
2.0 KiB
TypeScript

"use client"
import * as Sentry from "@sentry/nextjs"
import { useParams, useRouter, useSearchParams } from "next/navigation"
import { startTransition, useEffect, useRef } from "react"
import { useIntl } from "react-intl"
import { logger } from "@scandic-hotels/common/logger"
import { SESSION_EXPIRED } from "@scandic-hotels/trpc/errors"
import { login } from "@/constants/routes/handleAuth"
import { env } from "@/env/client"
import styles from "./error.module.css"
import type { LangParams } from "@/types/params"
export default function Error({
error,
reset,
}: {
error: Error & { digest?: string }
reset: () => void
}) {
const intl = useIntl()
const params = useParams<LangParams>()
const router = useRouter()
const searchParams = useSearchParams()
const currentSearchParamsRef = useRef<string>(undefined)
const isFirstLoadRef = useRef<boolean>(true)
useEffect(() => {
if (!error) return
if (error.message === SESSION_EXPIRED) {
const loginUrl = login[params.lang]
window.location.assign(loginUrl)
return
}
logger.error("(live)/error", error)
Sentry.captureException(error)
}, [error, params.lang])
useEffect(() => {
// This is to reset the error and refresh the page when the search params change, to support the booking widget that is using router.push to navigate to the booking flow page
const currentSearchParams = searchParams.toString()
if (
currentSearchParamsRef.current !== currentSearchParams &&
!isFirstLoadRef.current
) {
startTransition(() => {
reset()
router.refresh()
})
}
isFirstLoadRef.current = false
currentSearchParamsRef.current = currentSearchParams
}, [searchParams, reset, router])
return (
<section className={styles.layout}>
<div className={styles.content}>
{intl.formatMessage({
defaultMessage: "Something went wrong!",
})}
{env.NEXT_PUBLIC_NODE_ENV === "development" && (
<pre>{error.stack || error.message}</pre>
)}
</div>
</section>
)
}