| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- import { Activity, BookOpen, ChevronRight, Mail, Wrench } from 'lucide-react'
- import { useRouter } from 'next/router'
- import type { ReactNode } from 'react'
- import SVG from 'react-inlinesvg'
- import { AiIconAnimation } from 'ui'
- import type { HelpOptionId } from './HelpPanel.constants'
- import { HELP_OPTION_IDS } from './HelpPanel.constants'
- import type { SupportFormUrlKeys } from '@/components/interfaces/Support/SupportForm.utils'
- import { createSupportFormUrl } from '@/components/interfaces/Support/SupportForm.utils'
- import { ResourceItem } from '@/components/ui/Resource/ResourceItem'
- import { ResourceList } from '@/components/ui/Resource/ResourceList'
- import { takeBreadcrumbSnapshot } from '@/lib/breadcrumbs'
- import { DOCS_URL } from '@/lib/constants'
- const DISCORD_URL = 'https://discord.supabase.com'
- const STATUS_URL = 'https://status.supabase.com'
- type HelpOptionsListProps = {
- excludeIds?: HelpOptionId[]
- isPlatform: boolean
- projectRef: string | undefined
- supportLinkQueryParams: Partial<SupportFormUrlKeys> | undefined
- onAssistantClick?: () => void
- onSupportClick?: () => boolean | void
- }
- type HelpOption = {
- media: ReactNode
- title: string
- description: string
- href?: string
- onClick?: () => void
- }
- export const HelpOptionsList = ({
- excludeIds = [],
- isPlatform,
- projectRef,
- supportLinkQueryParams,
- onAssistantClick,
- onSupportClick,
- }: HelpOptionsListProps) => {
- const router = useRouter()
- const basePath = router.basePath ?? ''
- const ids = HELP_OPTION_IDS.filter((id) => !excludeIds.includes(id))
- const include = (id: HelpOptionId): boolean => {
- if (id === 'assistant') return !!projectRef
- if (id === 'status' || id === 'support') return isPlatform
- return true
- }
- const filteredIds = ids.filter(include)
- const handleSupportClick = () => {
- const shouldNavigate = onSupportClick?.()
- if (shouldNavigate === false) {
- return
- }
- takeBreadcrumbSnapshot()
- router.push(createSupportFormUrl(supportLinkQueryParams ?? {}))
- }
- const renderOption = (title: string, description: string) => (
- <div className="flex flex-col gap-0.5">
- <p className="text-sm text-foreground">{title}</p>
- <p className="text-xs text-foreground-lighter">{description}</p>
- </div>
- )
- const options: Record<HelpOptionId, HelpOption> = {
- assistant: {
- media: <AiIconAnimation allowHoverEffect size={14} />,
- title: 'Briven Assistant',
- description: 'Get guided help with your project directly in Studio.',
- onClick: onAssistantClick,
- },
- docs: {
- media: <BookOpen strokeWidth={1.5} size={14} />,
- title: 'Docs',
- description: 'Browse guides, references, and product documentation.',
- href: `${DOCS_URL}/`,
- },
- troubleshooting: {
- media: <Wrench strokeWidth={1.5} size={14} />,
- title: 'Troubleshooting',
- description: 'Find fixes for common platform issues and errors.',
- href: `${DOCS_URL}/guides/troubleshooting?products=platform`,
- },
- discord: {
- media: <SVG src={`${basePath}/img/discord-icon.svg`} className="h-4 w-4" />,
- title: 'Ask on Discord',
- description: 'Get help from the community on code-related questions.',
- href: DISCORD_URL,
- },
- status: {
- media: <Activity strokeWidth={1.5} size={14} />,
- title: 'Briven status',
- description: 'Check incidents, maintenance, and uptime updates.',
- href: STATUS_URL,
- },
- support: {
- media: <Mail strokeWidth={1.5} size={14} />,
- title: 'Contact support',
- description: 'Reach support for account and platform issues.',
- onClick: handleSupportClick,
- },
- }
- return (
- <ResourceList className="rounded-none border-0 bg-transparent shadow-none">
- {filteredIds.map((id) => {
- const option = options[id]
- if (option.href) {
- return (
- <ResourceItem
- key={id}
- className="!border-b"
- media={option.media}
- meta={<ChevronRight strokeWidth={1.5} size={16} />}
- href={option.href}
- target="_blank"
- rel="noreferrer noopener"
- >
- {renderOption(option.title, option.description)}
- </ResourceItem>
- )
- }
- return (
- <ResourceItem
- key={id}
- className="!border-b"
- media={option.media}
- onClick={option.onClick}
- >
- {renderOption(option.title, option.description)}
- </ResourceItem>
- )
- })}
- </ResourceList>
- )
- }
|