import { DatabaseUpgradeStatus } from '@supabase/shared-types/out/events' import dayjs from 'dayjs' import { X } from 'lucide-react' import { useEffect, useState } from 'react' import { SupportCategories } from '@supabase/shared-types/out/constants' import { useParams } from 'common' import { SupportLink } from 'components/interfaces/Support/SupportLink' import { useProjectUpgradingStatusQuery } from 'data/config/project-upgrade-status-query' import { IS_PLATFORM } from 'lib/constants' import { Alert, Button } from 'ui' import { InlineLink } from './InlineLink' // [Joshen] Think twice about the category though - it doesn't correspond export const ProjectUpgradeFailedBanner = () => { const { ref } = useParams() const { data } = useProjectUpgradingStatusQuery({ projectRef: ref }, { enabled: IS_PLATFORM }) const { status, initiated_at, latest_status_at, error } = data?.databaseUpgradeStatus ?? {} const key = `supabase-upgrade-${ref}-${initiated_at}` const [hasDismissed, setHasDismissed] = useState(false) useEffect(() => { setHasDismissed(localStorage?.getItem(key) === 'true') }, [key]) const isFailed = status === DatabaseUpgradeStatus.Failed const initiatedAt = dayjs .utc(initiated_at ?? 0) .tz(dayjs.tz.guess()) .format('DD MMM YYYY HH:mm:ss') const subject = 'Upgrade%20failed%20for%20project' const message = `Upgrade information:%0A• Initiated at: ${initiated_at}%0A• Error: ${error}` const initiatedAtEncoded = encodeURIComponent( dayjs.utc(initiated_at ?? 0).format('YYYY-MM-DDTHH:mm:ss') ) const latestStatusAtEncoded = encodeURIComponent( dayjs .utc(latest_status_at ?? 0) .utcOffset(0) .format('YYYY-MM-DDTHH:mm:ss') ) const timestampFilter = `its=${initiatedAtEncoded}&ite=${latestStatusAtEncoded}` const acknowledgeMessage = () => { setHasDismissed(true) localStorage.setItem(key, 'true') } if (!isFailed || hasDismissed) return null return (