Compare commits
	
		
			6 Commits
		
	
	
		
			jess/chang
			...
			pierremtb/
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| cead2320f8 | |||
| f441998f1a | |||
| 531496420e | |||
| 13bb482904 | |||
| 562959ee22 | |||
| b044f6faef | 
							
								
								
									
										15
									
								
								.github/workflows/ci.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										15
									
								
								.github/workflows/ci.yml
									
									
									
									
										vendored
									
									
								
							| @ -4,7 +4,7 @@ on: | ||||
|   pull_request: | ||||
|   push: | ||||
|     branches: | ||||
|       - main | ||||
|       - tauri | ||||
|   release: | ||||
|     types: [published] | ||||
|   schedule: | ||||
| @ -14,7 +14,7 @@ on: | ||||
|  | ||||
| env: | ||||
|   CUT_RELEASE_PR: ${{ github.event_name == 'pull_request' && (contains(github.event.pull_request.title, 'Cut release v')) }} | ||||
|   BUILD_RELEASE: ${{ github.event_name == 'release' || github.event_name == 'schedule' || github.event_name == 'pull_request' && (contains(github.event.pull_request.title, 'Cut release v')) }} | ||||
|   BUILD_RELEASE: true | ||||
|  | ||||
| concurrency: | ||||
|   group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} | ||||
| @ -412,17 +412,6 @@ jobs: | ||||
|           E2E_APPLICATION: "./src-tauri/target/${{ env.BUILD_RELEASE == 'true' && 'release' || 'debug' }}/zoo-modeling-app" | ||||
|           KITTYCAD_API_TOKEN: ${{ env.BUILD_RELEASE == 'true' && secrets.KITTYCAD_API_TOKEN || secrets.KITTYCAD_API_TOKEN_DEV }} | ||||
|  | ||||
|       - name: Run e2e tests (windows only) | ||||
|         if: ${{ matrix.os == 'windows-latest' && github.event_name != 'release' && github.event_name != 'schedule' }} | ||||
|         run: | | ||||
|           cargo install tauri-driver --force | ||||
|           yarn wdio run wdio.conf.ts | ||||
|         env: | ||||
|           E2E_APPLICATION: ".\\src-tauri\\target\\${{ env.BUILD_RELEASE == 'true' && 'release' || 'debug' }}\\Zoo Modeling App.exe" | ||||
|           KITTYCAD_API_TOKEN: ${{ env.BUILD_RELEASE == 'true' && secrets.KITTYCAD_API_TOKEN || secrets.KITTYCAD_API_TOKEN_DEV }} | ||||
|           VITE_KC_API_BASE_URL: ${{ env.BUILD_RELEASE == 'true' && 'https://api.zoo.dev' || 'https://api.dev.zoo.dev' }} | ||||
|           E2E_TAURI_ENABLED: true | ||||
|           TS_NODE_COMPILER_OPTIONS: '{"module": "commonjs"}' | ||||
|  | ||||
|       - uses: actions/download-artifact@v3 | ||||
|         if: ${{ env.CUT_RELEASE_PR == 'true' }} | ||||
|  | ||||
							
								
								
									
										2
									
								
								.github/workflows/create-release.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/create-release.yml
									
									
									
									
										vendored
									
									
								
							| @ -3,7 +3,7 @@ name: Create Release | ||||
| on: | ||||
|   push: | ||||
|     branches: | ||||
|       - main | ||||
|       - tauri | ||||
|  | ||||
| jobs: | ||||
|   create-release: | ||||
|  | ||||
| @ -29,15 +29,13 @@ test.describe('Text-to-CAD tests', () => { | ||||
|     ) | ||||
|     await expect(submittingToastMessage).toBeVisible() | ||||
|  | ||||
|     await page.waitForTimeout(5000) | ||||
|  | ||||
|     const generatingToastMessage = page.getByText( | ||||
|       `Generating parametric model...` | ||||
|     ) | ||||
|     await expect(generatingToastMessage).toBeVisible() | ||||
|     await expect(generatingToastMessage).toBeVisible({ timeout: 10000 }) | ||||
|  | ||||
|     const successToastMessage = page.getByText(`Text-to-CAD successful`) | ||||
|     await expect(successToastMessage).toBeVisible() | ||||
|     await expect(successToastMessage).toBeVisible({ timeout: 15000 }) | ||||
|  | ||||
|     await expect(page.getByText('Copied')).not.toBeVisible() | ||||
|  | ||||
| @ -96,15 +94,13 @@ test.describe('Text-to-CAD tests', () => { | ||||
|     ) | ||||
|     await expect(submittingToastMessage).toBeVisible() | ||||
|  | ||||
|     await page.waitForTimeout(5000) | ||||
|  | ||||
|     const generatingToastMessage = page.getByText( | ||||
|       `Generating parametric model...` | ||||
|     ) | ||||
|     await expect(generatingToastMessage).toBeVisible() | ||||
|     await expect(generatingToastMessage).toBeVisible({ timeout: 10000 }) | ||||
|  | ||||
|     const successToastMessage = page.getByText(`Text-to-CAD successful`) | ||||
|     await expect(successToastMessage).toBeVisible() | ||||
|     await expect(successToastMessage).toBeVisible({ timeout: 15000 }) | ||||
|  | ||||
|     await expect(page.getByText('Copied')).not.toBeVisible() | ||||
|  | ||||
| @ -116,13 +112,12 @@ test.describe('Text-to-CAD tests', () => { | ||||
|     // Find the toast. | ||||
|     // Look out for the toast message | ||||
|     await expect(submittingToastMessage).toBeVisible() | ||||
|  | ||||
|     await page.waitForTimeout(5000) | ||||
|  | ||||
|     await expect(generatingToastMessage).toBeVisible() | ||||
|     await expect(generatingToastMessage).toBeVisible({ timeout: 10000 }) | ||||
|  | ||||
|     // Expect 2 success toasts. | ||||
|     await expect(successToastMessage).toHaveCount(2) | ||||
|     await expect(successToastMessage).toHaveCount(2, { | ||||
|       timeout: 15000, | ||||
|     }) | ||||
|     await expect(page.getByText('a 2x4 lego')).toBeVisible() | ||||
|     await expect(page.getByText('a 2x6 lego')).toBeVisible() | ||||
|   }) | ||||
| @ -145,15 +140,13 @@ test.describe('Text-to-CAD tests', () => { | ||||
|     ) | ||||
|     await expect(submittingToastMessage).toBeVisible() | ||||
|  | ||||
|     await page.waitForTimeout(5000) | ||||
|  | ||||
|     const generatingToastMessage = page.getByText( | ||||
|       `Generating parametric model...` | ||||
|     ) | ||||
|     await expect(generatingToastMessage).toBeVisible() | ||||
|     await expect(generatingToastMessage).toBeVisible({ timeout: 10000 }) | ||||
|  | ||||
|     const successToastMessage = page.getByText(`Text-to-CAD successful`) | ||||
|     await expect(successToastMessage).toBeVisible() | ||||
|     await expect(successToastMessage).toBeVisible({ timeout: 15000 }) | ||||
|  | ||||
|     // Hit copy to clipboard. | ||||
|     const rejectButton = page.getByRole('button', { name: 'Reject' }) | ||||
| @ -317,11 +310,9 @@ test.describe('Text-to-CAD tests', () => { | ||||
|     // Look out for the toast message | ||||
|     await expect(submittingToastMessage).toBeVisible() | ||||
|  | ||||
|     await page.waitForTimeout(5000) | ||||
|     await expect(generatingToastMessage).toBeVisible({ timeout: 10000 }) | ||||
|  | ||||
|     await expect(generatingToastMessage).toBeVisible() | ||||
|  | ||||
|     await expect(successToastMessage).toBeVisible() | ||||
|     await expect(successToastMessage).toBeVisible({ timeout: 15000 }) | ||||
|   }) | ||||
|  | ||||
|   test('sending a bad prompt fails, can ignore toast, can start over from command bar', async ({ | ||||
| @ -390,11 +381,9 @@ test.describe('Text-to-CAD tests', () => { | ||||
|     // Look out for the toast message | ||||
|     await expect(submittingToastMessage).toBeVisible() | ||||
|  | ||||
|     await page.waitForTimeout(5000) | ||||
|     await expect(generatingToastMessage).toBeVisible({ timeout: 10000 }) | ||||
|  | ||||
|     await expect(generatingToastMessage).toBeVisible() | ||||
|  | ||||
|     await expect(successToastMessage).toBeVisible() | ||||
|     await expect(successToastMessage).toBeVisible({ timeout: 15000 }) | ||||
|  | ||||
|     await expect(page.getByText('Copied')).not.toBeVisible() | ||||
|  | ||||
| @ -447,16 +436,13 @@ test.describe('Text-to-CAD tests', () => { | ||||
|     ) | ||||
|     await expect(submittingToastMessage).toBeVisible() | ||||
|  | ||||
|     await page.waitForTimeout(1000) | ||||
|  | ||||
|     const generatingToastMessage = page.getByText( | ||||
|       `Generating parametric model...` | ||||
|     ) | ||||
|     await expect(generatingToastMessage).toBeVisible() | ||||
|     await page.waitForTimeout(5000) | ||||
|     await expect(generatingToastMessage).toBeVisible({ timeout: 10000 }) | ||||
|  | ||||
|     const successToastMessage = page.getByText(`Text-to-CAD successful`) | ||||
|     await expect(successToastMessage).toBeVisible() | ||||
|     await expect(successToastMessage).toBeVisible({ timeout: 15000 }) | ||||
|  | ||||
|     await expect(page.getByText(promptWithNewline)).toBeVisible() | ||||
|   }) | ||||
|  | ||||
| @ -1,6 +1,6 @@ | ||||
| { | ||||
|   "name": "untitled-app", | ||||
|   "version": "0.24.12", | ||||
|   "version": "0.24.13", | ||||
|   "private": true, | ||||
|   "dependencies": { | ||||
|     "@codemirror/autocomplete": "^6.17.0", | ||||
|  | ||||
| @ -80,5 +80,5 @@ | ||||
|     } | ||||
|   }, | ||||
|   "productName": "Zoo Modeling App", | ||||
|   "version": "0.24.12" | ||||
|   "version": "0.24.13" | ||||
| } | ||||
|  | ||||
| @ -49,7 +49,7 @@ | ||||
|     "updater": { | ||||
|       "active": true, | ||||
|       "endpoints": [ | ||||
|         "https://dl.zoo.dev/releases/modeling-app/last_update.json" | ||||
|         "https://dl.zoo.dev/releases/modeling-app/test/electron/last_update.json" | ||||
|       ], | ||||
|       "pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IEUzNzA4MjBEQjFBRTY4NzYKUldSMmFLNnhEWUp3NCtsT21Jd05wQktOaGVkOVp6MUFma0hNTDRDSnI2RkJJTEZOWG1ncFhqcU8K" | ||||
|     } | ||||
|  | ||||
| @ -6,7 +6,7 @@ import { PATHS } from 'lib/paths' | ||||
| import toast from 'react-hot-toast' | ||||
| import { sep } from '@tauri-apps/api/path' | ||||
| import { TextToCad_type } from '@kittycad/lib/dist/types/src/models' | ||||
| import { useEffect, useRef, useState } from 'react' | ||||
| import { useCallback, useEffect, useRef, useState } from 'react' | ||||
| import { | ||||
|   Box3, | ||||
|   Color, | ||||
| @ -122,10 +122,40 @@ export function ToastTextToCadSuccess({ | ||||
| }) { | ||||
|   const wrapperRef = useRef<HTMLDivElement | null>(null) | ||||
|   const canvasRef = useRef<HTMLCanvasElement | null>(null) | ||||
|   const animationRequestRef = useRef<number>() | ||||
|   const [hasCopied, setHasCopied] = useState(false) | ||||
|   const [showCopiedUi, setShowCopiedUi] = useState(false) | ||||
|   const modelId = data.id | ||||
|  | ||||
|   const animate = useCallback( | ||||
|     ({ | ||||
|       renderer, | ||||
|       scene, | ||||
|       camera, | ||||
|       controls, | ||||
|       isFirstRender = false, | ||||
|     }: { | ||||
|       renderer: WebGLRenderer | ||||
|       scene: Scene | ||||
|       camera: OrthographicCamera | ||||
|       controls: OrbitControls | ||||
|       isFirstRender?: boolean | ||||
|     }) => { | ||||
|       if ( | ||||
|         !wrapperRef.current || | ||||
|         !(isFirstRender || animationRequestRef.current) | ||||
|       ) | ||||
|         return | ||||
|       animationRequestRef.current = requestAnimationFrame(() => | ||||
|         animate({ renderer, scene, camera, controls }) | ||||
|       ) | ||||
|       // required if controls.enableDamping or controls.autoRotate are set to true | ||||
|       controls.update() | ||||
|       renderer.render(scene, camera) | ||||
|     }, | ||||
|     [] | ||||
|   ) | ||||
|  | ||||
|   useEffect(() => { | ||||
|     if (!canvasRef.current) return | ||||
|  | ||||
| @ -133,7 +163,6 @@ export function ToastTextToCadSuccess({ | ||||
|     const renderer = new WebGLRenderer({ canvas, antialias: true, alpha: true }) | ||||
|     renderer.setSize(CANVAS_SIZE, CANVAS_SIZE) | ||||
|     renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2)) | ||||
|     renderer.setAnimationLoop(animate) | ||||
|  | ||||
|     const scene = new Scene() | ||||
|     const ambientLight = new DirectionalLight(new Color('white'), 8.0) | ||||
| @ -156,13 +185,6 @@ export function ToastTextToCadSuccess({ | ||||
|       return | ||||
|     } | ||||
|  | ||||
|     function animate() { | ||||
|       requestAnimationFrame(animate) | ||||
|       // required if controls.enableDamping or controls.autoRotate are set to true | ||||
|       controls.update() | ||||
|       renderer.render(scene, camera) | ||||
|     } | ||||
|  | ||||
|     loader.parse( | ||||
|       buffer, | ||||
|       '', | ||||
| @ -213,6 +235,8 @@ export function ToastTextToCadSuccess({ | ||||
|  | ||||
|         camera.updateProjectionMatrix() | ||||
|         controls.update() | ||||
|         // render the scene once... | ||||
|         renderer.render(scene, camera) | ||||
|       }, | ||||
|       // called when loading has errors | ||||
|       function (error) { | ||||
| @ -222,8 +246,26 @@ export function ToastTextToCadSuccess({ | ||||
|       } | ||||
|     ) | ||||
|  | ||||
|     // ...and set a mouseover listener on the canvas to enable the orbit controls | ||||
|     canvasRef.current.addEventListener('mouseover', () => { | ||||
|       renderer.setAnimationLoop(() => | ||||
|         animate({ renderer, scene, camera, controls, isFirstRender: true }) | ||||
|       ) | ||||
|     }) | ||||
|     canvasRef.current.addEventListener('mouseout', () => { | ||||
|       renderer.setAnimationLoop(null) | ||||
|       if (animationRequestRef.current) { | ||||
|         cancelAnimationFrame(animationRequestRef.current) | ||||
|         animationRequestRef.current = undefined | ||||
|       } | ||||
|     }) | ||||
|  | ||||
|     return () => { | ||||
|       renderer.dispose() | ||||
|       if (animationRequestRef.current) { | ||||
|         cancelAnimationFrame(animationRequestRef.current) | ||||
|         animationRequestRef.current = undefined | ||||
|       } | ||||
|     } | ||||
|   }, []) | ||||
|  | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	