import React, { useEffect, useState } from 'react' import '@react-three/fiber' import { Box, SegmentedControl, ThemeProvider } from '@primer/react' import { FileBlob, MessageIds } from '../../chrome/types' import { createPortal } from 'react-dom' import { Loading } from '../Loading' import { CadBlob } from './CadBlob' function CadBlobPortal({ element, owner, repo, sha, filename, classicUi, }: { element: HTMLElement owner: string repo: string sha: string filename: string classicUi: boolean }): React.ReactElement { const [richBlob, setRichBlob] = useState() const [richSelected, setRichSelected] = useState(true) const [toolbarContainer, setToolbarContainer] = useState() const [blobContainer, setBlobContainer] = useState() const [sourceElements, setSourceElements] = useState([]) useEffect(() => { let existingToggle: HTMLElement | undefined | null let toolbar: HTMLElement | undefined | null let blob: HTMLElement | undefined | null if (classicUi) { // no existing toggle toolbar = element.querySelector('.js-blob-header') blob = element.querySelector('.blob-wrapper') } else { existingToggle = element.querySelector( 'ul[class*=SegmentedControl]' ) toolbar = existingToggle?.parentElement blob = element.querySelector( 'section[aria-labelledby="file-name-id"]' ) } const isPreviewAlreadyEnabled = existingToggle && existingToggle.childElementCount > 2 // Preview, Code, Blame if (isPreviewAlreadyEnabled) { const existingPreview = element.querySelector('iframe') blob = existingPreview?.parentElement if (blob && blob.parentElement) { setBlobContainer(blob.parentElement) blob.style.display = 'none' } // No toolbar, no sourceElements. Only a replacement of the existing (STL) preview return } if (toolbar != null) { setToolbarContainer(toolbar) if (existingToggle) { existingToggle.style.display = 'none' } } if (blob != null) { setBlobContainer(blob) const sourceElements = Array.from(blob.children) as HTMLElement[] sourceElements.map(n => (n.style.display = 'none')) setSourceElements(sourceElements) } }, [element]) useEffect(() => { ;(async () => { const response = await chrome.runtime.sendMessage({ id: MessageIds.GetFileBlob, data: { owner, repo, sha, filename }, }) if ('error' in response) { console.log(response.error) } else { setRichBlob(response as FileBlob) } })() }, [owner, repo, sha, filename]) return ( <> {toolbarContainer && createPortal( { if (index < 2) { setRichSelected(index === 0) sourceElements.map( n => (n.style.display = index === 0 ? 'none' : 'block') ) return } window.location.href = `https://github.com/${owner}/${repo}/blame/${sha}/${filename}` }} > Preview Code {!classicUi && ( Blame )} , toolbarContainer )} {blobContainer && createPortal( {richBlob ? ( ) : ( )} , blobContainer )} ) } export type CadBlobPageProps = { element: HTMLElement owner: string repo: string sha: string filename: string classicUi: boolean } export function CadBlobPage({ element, owner, repo, sha, filename, classicUi, }: CadBlobPageProps): React.ReactElement { return ( ) }