* cra boilerplate * Dummy chrome extension * eslint and working url popup * content script and dummy messaging * replace .obj diffs with dummy test * comment and in-order multiple type support * get pull api data from url * README title and desc * api/elements match with filename check * github token signin signout * manifest v3, service request for CORS * working kittycad api in service worker * First real background message * Clean up, better types * Fix settings * multiservice settings * Tweaks * WIP: download file * Working downloads and kittycad conversion * Inject react, add three dependencies * Working stl canvas * primer for github-like style * Loading before model * diff colors * colorMode auto * Popup clean up * clean up * Working loading * Logos * Add GitHub CI * Working test * yarn test in ci * Little tweak * Update README * component tests * Better test * Clean up * UserCard test * working caddiff test * Note * Rename App to Settings * storage test * Clean up * Clean up content script * further content cleanup * Fix test * Little tweaks to modelview * More tests and testing * Regex fix * LFS file download test * prettier config from kittycad/website * Little tweaks * comment * log level * Tweaks * README update * more prettier * comment * Irrelevant comment * No .vscode and readme update * Remove .vscode * Package.json update after vscode removal
53 lines
1.8 KiB
TypeScript
53 lines
1.8 KiB
TypeScript
import React, { useEffect, useState } from 'react'
|
|
import '@react-three/fiber'
|
|
import { OrbitControls } from '@react-three/drei'
|
|
import { STLLoader } from 'three/examples/jsm/loaders/STLLoader'
|
|
import { BufferGeometry } from 'three'
|
|
import { Canvas } from '@react-three/fiber'
|
|
import { Box, ThemeProvider, useTheme } from '@primer/react'
|
|
import { FileDiff } from '../chrome/types'
|
|
|
|
function ModelView({ file }: { file: string }): React.ReactElement {
|
|
const { theme } = useTheme()
|
|
const [geometry, setGeometry] = useState<BufferGeometry>()
|
|
useEffect(() => {
|
|
const loader = new STLLoader()
|
|
const geometry = loader.parse(atob(file))
|
|
console.log(`Model ${geometry.id} loaded`)
|
|
setGeometry(geometry)
|
|
}, [file])
|
|
return (
|
|
<Canvas>
|
|
<ambientLight intensity={0.7} />
|
|
<pointLight position={[10, 10, 10]} />
|
|
<mesh geometry={geometry}>
|
|
<meshStandardMaterial color={theme?.colors.fg.default} />
|
|
</mesh>
|
|
<OrbitControls />
|
|
</Canvas>
|
|
)
|
|
}
|
|
|
|
export type CadDiffProps = FileDiff
|
|
|
|
export function CadDiff({ before, after }: CadDiffProps): React.ReactElement {
|
|
return (
|
|
<ThemeProvider colorMode="auto">
|
|
<Box display="flex" height={300}>
|
|
<Box flexGrow={1} backgroundColor="danger.subtle">
|
|
{before && <ModelView file={before} />}
|
|
</Box>
|
|
<Box
|
|
flexGrow={1}
|
|
backgroundColor="success.subtle"
|
|
borderLeftWidth={1}
|
|
borderLeftColor="border.default"
|
|
borderLeftStyle="solid"
|
|
>
|
|
{after && <ModelView file={after} />}
|
|
</Box>
|
|
</Box>
|
|
</ThemeProvider>
|
|
)
|
|
}
|