48 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			48 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import { useEffect, useRef } from 'react'
 | |
| import createGlobe from 'cobe'
 | |
| 
 | |
| export function Globe({ className }: { className?: string }) {
 | |
|   const canvasRef = useRef<HTMLCanvasElement>(null)
 | |
| 
 | |
|   useEffect(() => {
 | |
|     let phi = 0
 | |
| 
 | |
|     if (!canvasRef.current) return
 | |
| 
 | |
|     const globe = createGlobe(canvasRef.current, {
 | |
|       devicePixelRatio: 2,
 | |
|       width: 600 * 2,
 | |
|       height: 600 * 2,
 | |
|       phi: 0,
 | |
|       theta: 0,
 | |
|       dark: 0,
 | |
|       diffuse: 1.2,
 | |
|       mapSamples: 16000,
 | |
|       mapBrightness: 6,
 | |
|       baseColor: [0.3, 0.3, 0.3],
 | |
|       markerColor: [0.1, 0.8, 1],
 | |
|       glowColor: [1, 1, 1],
 | |
|       markers: [
 | |
|         { location: [37.7595, -122.4367], size: 0.03 },
 | |
|         { location: [40.7128, -74.006], size: 0.1 },
 | |
|       ],
 | |
|       onRender: (state) => {
 | |
|         state.phi = phi
 | |
|         phi += 0.01
 | |
|       },
 | |
|     })
 | |
| 
 | |
|     return () => {
 | |
|       globe.destroy()
 | |
|     }
 | |
|   }, [])
 | |
| 
 | |
|   return (
 | |
|     <canvas
 | |
|       ref={canvasRef}
 | |
|       className={className}
 | |
|       style={{ width: '100%', height: '100%', maxWidth: '100%', aspectRatio: 1 }}
 | |
|     />
 | |
|   )
 | |
| }
 |