import {useState} from 'react' import {useMutation, useQueryClient} from '@tanstack/react-query' import { K8sEngineDetails } from "@/features/k8s/K8sEngineDetails"; import { LogsExplorerPanel } from "@/components/LogsExplorerPanel"; import { LogsQueryPanel } from "@/components/LogsQueryPanel"; import type { CloudProvider } from "@/types/cloud"; import type { CloudResource, StorageObject } from "@/types/resource"; import {formatBytes} from "@/lib/format"; import {CopyValueButton} from "@/components/CopyValueButton"; import {rebootCloudResource, startCloudResource, stopCloudResource} from "@/api/cloudProxyClient"; import {cloudQueryKeys} from "@/api/queries/cloudQueries"; import {decodeRawMime, htmlMimePart, inlineMimeImages, parseMimeAttachments} from '@/lib/emailMime' interface ResourceInspectorProps { resource?: CloudResource; object?: StorageObject; cloud?: CloudProvider; runtimeReachable?: boolean; serviceName?: string; } export function ResourceInspector({ resource, object, cloud, runtimeReachable, serviceName, }: ResourceInspectorProps) { if (!resource) { return (

Resource Inspector

Select a resource

Inspect normalized metadata returned by the cloud proxy.

); } if (object) { return ( ); } if (resource.type === 'email') { return } const tags = getTags(resource.metadata.tags); const tagsUnavailable = getBooleanMetadata(resource.metadata.tagsUnavailable) ?? false; const versioning = getStringMetadata(resource.metadata.versioning); const versioningEnabled = getBooleanMetadata( resource.metadata.versioningEnabled, ); const isDatabase = resource.service === "database" || resource.type === "db-instance"; const isAwsDatabase = isDatabase && resource.cloud === "aws"; const isK8sEngine = resource.service === "k8s" || resource.type === "cluster"; const isLambda = resource.service === "serverless" || resource.type === "lambda"; const isLogGroup = resource.cloud === "aws" && (resource.service === "logs" || resource.type === "log-group"); return ( ); } function EmailInspector({resource}: {resource: CloudResource}) { const [tab, setTab] = useState<'preview' | 'text' | 'raw'>('preview') const source = getStringMetadata(resource.metadata.source) ?? '-' const toAddresses = getStringList(resource.metadata.toAddresses) const ccAddresses = getStringList(resource.metadata.ccAddresses) const bccAddresses = getStringList(resource.metadata.bccAddresses) const replyToAddresses = getStringList(resource.metadata.replyToAddresses) const textBody = getStringMetadata(resource.metadata.textBody) const htmlBody = getStringMetadata(resource.metadata.htmlBody) const rawData = getStringMetadata(resource.metadata.rawData) const rawMime = rawData ? decodeRawMime(rawData) : null const attachments = rawMime ? parseMimeAttachments(rawMime) : [] const inlineImages = rawMime ? inlineMimeImages(rawMime) : {} const rawHtmlBody = rawMime ? htmlMimePart(rawMime) : null const previewHtml = htmlBody ?? rawHtmlBody const hasPreview = Boolean(previewHtml || textBody) const activeTab = tab === 'preview' && !hasPreview ? (rawData ? 'raw' : 'text') : tab return (