forked from ourworld_web/www_engage_os
add
This commit is contained in:
92
components/uilayouts/globe.tsx
Normal file
92
components/uilayouts/globe.tsx
Normal file
@@ -0,0 +1,92 @@
|
||||
'use client';
|
||||
import React, { useEffect, useRef, useState } from 'react';
|
||||
import createGlobe from 'cobe';
|
||||
import { cn } from '@/lib/utils';
|
||||
interface EarthProps {
|
||||
className?: string;
|
||||
theta?: number;
|
||||
dark?: number;
|
||||
scale?: number;
|
||||
diffuse?: number;
|
||||
mapSamples?: number;
|
||||
mapBrightness?: number;
|
||||
baseColor?: [number, number, number];
|
||||
markerColor?: [number, number, number];
|
||||
glowColor?: [number, number, number];
|
||||
}
|
||||
const Earth: React.FC<EarthProps> = ({
|
||||
className,
|
||||
theta = 0.25,
|
||||
dark = 1,
|
||||
scale = 1.1,
|
||||
diffuse = 1.2,
|
||||
mapSamples = 40000,
|
||||
mapBrightness = 6,
|
||||
baseColor = [0.4, 0.6509, 1],
|
||||
markerColor = [1, 0, 0],
|
||||
glowColor = [0.2745, 0.5765, 0.898],
|
||||
}) => {
|
||||
const canvasRef = useRef<HTMLCanvasElement>(null);
|
||||
|
||||
useEffect(() => {
|
||||
let width = 0;
|
||||
const onResize = () =>
|
||||
canvasRef.current && (width = canvasRef.current.offsetWidth);
|
||||
window.addEventListener('resize', onResize);
|
||||
onResize();
|
||||
let phi = 0;
|
||||
|
||||
onResize();
|
||||
const globe = createGlobe(canvasRef.current!, {
|
||||
devicePixelRatio: 2,
|
||||
width: width * 2,
|
||||
height: width * 2,
|
||||
phi: 0,
|
||||
theta: theta,
|
||||
dark: dark,
|
||||
scale: scale,
|
||||
diffuse: diffuse,
|
||||
mapSamples: mapSamples,
|
||||
mapBrightness: mapBrightness,
|
||||
baseColor: baseColor,
|
||||
markerColor: markerColor,
|
||||
glowColor: glowColor,
|
||||
opacity: 1,
|
||||
offset: [0, 0],
|
||||
markers: [
|
||||
// longitude latitude
|
||||
],
|
||||
onRender: (state: Record<string, any>) => {
|
||||
// Called on every animation frame.
|
||||
// `state` will be an empty object, return updated params.\
|
||||
state.phi = phi;
|
||||
phi += 0.003;
|
||||
},
|
||||
});
|
||||
|
||||
return () => {
|
||||
globe.destroy();
|
||||
};
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<div
|
||||
className={cn(
|
||||
'flex items-center justify-center z-[10] w-full max-w-[350px] mx-auto',
|
||||
className
|
||||
)}
|
||||
>
|
||||
<canvas
|
||||
ref={canvasRef}
|
||||
style={{
|
||||
width: '100%',
|
||||
height: '100%',
|
||||
maxWidth: '100%',
|
||||
aspectRatio: '1',
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default Earth;
|
Reference in New Issue
Block a user