{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "error-screen",
  "dependencies": [
    "shaka-player@^4"
  ],
  "registryDependencies": [
    "https://limeplay.winoffrg.dev/r/media-provider.json",
    "item"
  ],
  "files": [
    {
      "path": "registry/default/ui/error-screen.tsx",
      "content": "\"use client\"\n\nimport type { ComponentPropsWithoutRef } from \"react\"\n\nimport * as React from \"react\"\nimport shaka from \"shaka-player\"\n\nimport {\n  Item,\n  ItemActions,\n  ItemContent,\n  ItemDescription,\n  ItemTitle,\n} from \"@/components/ui/item\"\nimport { cn } from \"@/lib/utils\"\n\nconst MEDIA_ERROR_MAP: Partial<\n  Record<number, { code: string; title: string }>\n> = {\n  1: { code: \"MEDIA_ERR_ABORTED\", title: \"Playback aborted\" },\n  2: { code: \"MEDIA_ERR_NETWORK\", title: \"Unable to connect\" },\n  3: { code: \"MEDIA_ERR_DECODE\", title: \"Playback error\" },\n  4: { code: \"MEDIA_ERR_SRC_NOT_SUPPORTED\", title: \"Format not supported\" },\n}\n\nconst SHAKA_CATEGORY_MAP: Record<number, string> = {\n  1: \"Network error\",\n  2: \"Text error\",\n  3: \"Media error\",\n  4: \"Manifest error\",\n  5: \"Streaming error\",\n  6: \"DRM error\",\n  7: \"Player error\",\n  8: \"Cast error\",\n  9: \"Storage error\",\n}\n\nconst SHAKA_DOCS_BASE =\n  \"https://shaka-player-demo.appspot.com/docs/api/shaka.util.Error.html\"\n\nexport interface ErrorDetails {\n  code: string\n  description: string\n  shakaDocsUrl?: string\n  title: string\n}\n\nexport type ShakaErrorLike = {\n  category: number\n  code: number\n  message: string\n  severity: number\n}\n\ninterface ErrorScreenProps extends ComponentPropsWithoutRef<\"div\"> {\n  description?: string\n  error?: unknown\n  message?: string\n}\n\ninterface MediaErrorLike {\n  code: number\n}\n\nexport const ErrorScreen = React.forwardRef<HTMLDivElement, ErrorScreenProps>(\n  ({ children, className, description, error, message, ...props }, ref) => {\n    const details = getErrorDetails(error)\n\n    return (\n      <div\n        aria-live=\"assertive\"\n        className={cn(\n          \"absolute inset-0 z-50 flex items-center justify-center bg-background text-foreground\",\n          className\n        )}\n        ref={ref}\n        role=\"alert\"\n        {...props}\n      >\n        <Item\n          className={`\n            max-w-md px-4\n            sm:px-8\n          `}\n        >\n          <ItemContent\n            className={`\n              gap-1.5\n              sm:gap-2\n            `}\n          >\n            <ItemTitle\n              className={`\n                text-sm font-semibold\n                sm:text-base\n              `}\n            >\n              {message ?? details.title}\n            </ItemTitle>\n            <ItemDescription\n              className={`\n                text-xs font-medium text-muted-foreground\n                sm:text-sm\n              `}\n            >\n              Error code: {details.code}\n            </ItemDescription>\n            <ItemDescription\n              className={`\n                text-xs/relaxed text-muted-foreground/60\n                sm:text-sm\n              `}\n            >\n              {description ?? details.description}\n            </ItemDescription>\n          </ItemContent>\n          {children && (\n            <ItemActions className=\"basis-full\">{children}</ItemActions>\n          )}\n        </Item>\n      </div>\n    )\n  }\n)\n\nexport function getErrorDetails(error: unknown): ErrorDetails {\n  if (!error) {\n    return {\n      code: \"ERR_UNKNOWN\",\n      description:\n        \"Something went wrong during playback. Please try again or check your connection.\",\n      title: \"Something went wrong\",\n    }\n  }\n\n  if (isMediaError(error)) {\n    const mapped = MEDIA_ERROR_MAP[error.code]\n\n    return {\n      code: mapped?.code ?? `MEDIA_ERR_${error.code}`,\n      description:\n        error.code === 2\n          ? \"There was an issue connecting with the stream. Please check your internet connection and try again.\"\n          : \"This content could not be played. Try a different stream or check your connection.\",\n      title: mapped?.title ?? \"Playback error\",\n    }\n  }\n\n  if (isShakaError(error)) {\n    const categoryLabel =\n      SHAKA_CATEGORY_MAP[error.category] ?? `Category ${error.category}`\n    const isNetwork = error.category === 1\n\n    return {\n      code: `SHAKA-${error.category}_${error.code}`,\n      description: isNetwork\n        ? \"There was an issue connecting with the stream. Please check your internet connection and try again.\"\n        : `A ${categoryLabel.toLowerCase()} occurred while loading content. Try a different stream or check your connection.`,\n      shakaDocsUrl: `${SHAKA_DOCS_BASE}#:~:text=${error.code}`,\n      title: isNetwork ? \"Unable to connect\" : categoryLabel,\n    }\n  }\n\n  return {\n    code: \"ERR_PLAYBACK\",\n    description:\n      \"This content could not be played. Try a different stream or check your connection.\",\n    title: \"Playback error\",\n  }\n}\n\nexport function isMediaError(error: unknown): error is MediaErrorLike {\n  if (!error || typeof error !== \"object\") {\n    return false\n  }\n\n  if (typeof MediaError !== \"undefined\" && error instanceof MediaError) {\n    return true\n  }\n\n  return (\n    !hasNumberProperty(error, \"category\") && hasNumberProperty(error, \"code\")\n  )\n}\n\nexport function isShakaError(error: unknown): error is ShakaErrorLike {\n  if (!error || typeof error !== \"object\") {\n    return false\n  }\n\n  return (\n    error instanceof shaka.util.Error ||\n    (hasNumberProperty(error, \"category\") &&\n      hasNumberProperty(error, \"code\") &&\n      hasNumberProperty(error, \"severity\") &&\n      hasStringProperty(error, \"message\"))\n  )\n}\n\nfunction hasNumberProperty<Key extends string>(\n  value: unknown,\n  key: Key\n): value is Record<Key, number> {\n  if (!value || typeof value !== \"object\") {\n    return false\n  }\n\n  const record = value as Record<string, unknown>\n\n  return typeof record[key] === \"number\"\n}\n\nfunction hasStringProperty<Key extends string>(\n  value: unknown,\n  key: Key\n): value is Record<Key, string> {\n  if (!value || typeof value !== \"object\") {\n    return false\n  }\n\n  const record = value as Record<string, unknown>\n\n  return typeof record[key] === \"string\"\n}\n\nErrorScreen.displayName = \"ErrorScreen\"\n",
      "type": "registry:ui",
      "target": "components/limeplay/error-screen.tsx"
    }
  ],
  "type": "registry:ui"
}