Skip to content

Commit

Permalink
🌡️🦽 ↝ [SSP-39 SSP-42 SSP-43 SSC-45 SSM-76]: Planet maker is now in C2…
Browse files Browse the repository at this point in the history
… of PH
  • Loading branch information
Gizmotronn committed Dec 28, 2024
1 parent dee0d11 commit 8678f4e
Show file tree
Hide file tree
Showing 5 changed files with 147 additions and 77 deletions.
Original file line number Diff line number Diff line change
@@ -1,62 +1,110 @@
'use client'
import { useState, useEffect } from 'react';
import { PlanetScene } from './planet-scene';
import { PlanetControls } from './planet-controls';
import { PlanetImportExport } from './planet-import-export';
import { calculatePlanetStats } from '@/utils/planet-physics';
import { useSession, useSupabaseClient } from '@supabase/auth-helpers-react';
import type { PlanetStats } from '@/utils/planet-physics';

import { useState } from 'react'
import { PlanetScene } from './planet-scene'
import { PlanetControls } from './planet-controls'
import { PlanetImportExport } from './planet-import-export'
import { calculatePlanetStats } from '@/utils/planet-physics'
import type { PlanetStats } from '@/utils/planet-physics'
const TERRESTRIAL_THRESHOLD = 7.5; // Earth masses
const GASEOUS_THRESHOLD = 2.0; // Earth radii

const TERRESTRIAL_THRESHOLD = 7.5 // Earth masses
const GASEOUS_THRESHOLD = 2.0 // Earth radii
interface PlanetGeneratorProps {
classificationConfig?: any;
classificationId: string;
author: string;
};

export default function PlanetGenerator() {
const [mass, setMass] = useState(1)
const [radius, setRadius] = useState(1)
const [typeOverride, setTypeOverride] = useState<'terrestrial' | 'gaseous' | null>(null)
export default function PlanetGenerator({ classificationConfig, author, classificationId }: PlanetGeneratorProps) {
const supabase = useSupabaseClient();
const session = useSession();

const stats = calculatePlanetStats(mass, radius, typeOverride)
const initialMass = classificationConfig?.exportedValue?.mass ?? 1;
const initialRadius = classificationConfig?.exportedValue?.radius ?? 1;

const [mass, setMass] = useState(initialMass);
const [radius, setRadius] = useState(initialRadius);
const [typeOverride, setTypeOverride] = useState<'terrestrial' | 'gaseous' | null>(null);

const stats = calculatePlanetStats(mass, radius, typeOverride);

const handleMassChange = (newMass: number) => {
if (typeOverride === 'terrestrial' && newMass > TERRESTRIAL_THRESHOLD) {
setMass(TERRESTRIAL_THRESHOLD)
setMass(TERRESTRIAL_THRESHOLD);
} else if (typeOverride === 'gaseous' && newMass <= TERRESTRIAL_THRESHOLD) {
setMass(TERRESTRIAL_THRESHOLD + 0.1)
setMass(TERRESTRIAL_THRESHOLD + 0.1);
} else {
setMass(newMass)
setMass(newMass);
}
}
};

const handleRadiusChange = (newRadius: number) => {
if (typeOverride === 'terrestrial' && newRadius > GASEOUS_THRESHOLD) {
setRadius(GASEOUS_THRESHOLD)
setRadius(GASEOUS_THRESHOLD);
} else if (typeOverride === 'gaseous' && newRadius <= GASEOUS_THRESHOLD) {
setRadius(GASEOUS_THRESHOLD + 0.1)
setRadius(GASEOUS_THRESHOLD + 0.1);
} else {
setRadius(newRadius)
setRadius(newRadius);
}
}
};

const handleTypeOverride = (type: 'terrestrial' | 'gaseous' | null) => {
setTypeOverride(type)
setTypeOverride(type);
if (type === 'terrestrial') {
if (mass > TERRESTRIAL_THRESHOLD) setMass(TERRESTRIAL_THRESHOLD)
if (radius > GASEOUS_THRESHOLD) setRadius(GASEOUS_THRESHOLD)
if (mass > TERRESTRIAL_THRESHOLD) setMass(TERRESTRIAL_THRESHOLD);
if (radius > GASEOUS_THRESHOLD) setRadius(GASEOUS_THRESHOLD);
} else if (type === 'gaseous') {
if (mass <= TERRESTRIAL_THRESHOLD) setMass(TERRESTRIAL_THRESHOLD + 0.1)
if (radius <= GASEOUS_THRESHOLD) setRadius(GASEOUS_THRESHOLD + 0.1)
}
}
if (mass <= TERRESTRIAL_THRESHOLD) setMass(TERRESTRIAL_THRESHOLD + 0.1);
if (radius <= GASEOUS_THRESHOLD) setRadius(GASEOUS_THRESHOLD + 0.1);
};
};

const handleImport = (importedStats: Partial<PlanetStats>) => {
if (importedStats.mass !== undefined) {
setMass(importedStats.mass)
setMass(importedStats.mass);
}
if (importedStats.radius !== undefined) {
setRadius(importedStats.radius)
setRadius(importedStats.radius);
}
setTypeOverride(null);
};

const handleSave = async () => {
if (!classificationId) {
console.error('Classification ID is missing.');
return;
}

const idToQuery = typeof classificationId === 'string' ? classificationId : String(classificationId);

try {
const { data, error } = await supabase
.from('classifications')
.select('classificationConfiguration')
.eq('id', idToQuery)
.single();

if (error) throw error;

const currentConfig = data?.classificationConfiguration || {};
const newConfig = {
...currentConfig,
exportedValue: { mass, radius },
};

const { error: updateError } = await supabase
.from('classifications')
.update({ classificationConfiguration: newConfig })
.eq('id', idToQuery);

if (updateError) throw updateError;

alert('Planet configuration saved successfully!');
} catch (err) {
console.error('Error saving planet configuration:', err);
alert('Failed to save planet configuration.');
}
setTypeOverride(null)
}
};

return (
<div className="min-h-screen bg-black p-8">
Expand All @@ -71,7 +119,15 @@ export default function PlanetGenerator() {
onRadiusChange={handleRadiusChange}
onTypeOverride={handleTypeOverride}
/>
<PlanetImportExport stats={stats} onImport={handleImport} />
<PlanetImportExport stats={stats} onImport={handleImport} onSave={handleSave} />
{author === session?.user.id && (
<button
onClick={handleSave}
className="mt-4 bg-blue-500 text-white py-2 px-4 rounded"
>
Save Configuration
</button>
)}
</div>
</div>
</div>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,38 +1,48 @@
import { useState } from 'react'
import { Button } from "@/components/ui/button"
import { Textarea } from "@/components/ui/textarea"
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"
import type { PlanetStats } from '@/utils/planet-physics'
import { useState } from 'react';
import { Button } from '@/components/ui/button';
import { Textarea } from '@/components/ui/textarea';
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
import type { PlanetStats } from '@/utils/planet-physics';

interface PlanetImportExportProps {
stats: PlanetStats
onImport: (importedStats: Partial<PlanetStats>) => void
stats: PlanetStats;
onImport: (importedStats: Partial<PlanetStats>) => void;
onSave: (updatedConfig: any) => void;
}

export function PlanetImportExport({ stats, onImport }: PlanetImportExportProps) {
const [importExportText, setImportExportText] = useState('')
export function PlanetImportExport({ stats, onImport, onSave }: PlanetImportExportProps) {
const [importExportText, setImportExportText] = useState('');

const handleExport = () => {
const exportText = `radius: ${stats.radius.toFixed(2)}
mass: ${stats.mass.toFixed(2)}`
setImportExportText(exportText)
}
const exportText = `radius: ${stats.radius.toFixed(2)}\nmass: ${stats.mass.toFixed(2)}`;
setImportExportText(exportText);
};

const handleImport = () => {
const lines = importExportText.split('\n')
const importedStats: Partial<PlanetStats> = {}
const lines = importExportText.split('\n');
const importedStats: Partial<PlanetStats> = {};

lines.forEach(line => {
const [key, value] = line.split(':').map(part => part.trim())
const [key, value] = line.split(':').map(part => part.trim());
if (key === 'radius' || key === 'mass') {
importedStats[key] = parseFloat(value)
importedStats[key] = parseFloat(value);
}
})
});

if (Object.keys(importedStats).length > 0) {
onImport(importedStats)
onImport(importedStats);
}
}
};

const handleSave = () => {
const updatedConfig = {
exportedValue: {
radius: stats.radius,
mass: stats.mass,
},
};
onSave(updatedConfig);
};

return (
<Card className="w-80">
Expand All @@ -49,9 +59,9 @@ mass: ${stats.mass.toFixed(2)}`
<div className="flex justify-between">
<Button onClick={handleExport}>Export</Button>
<Button onClick={handleImport}>Import</Button>
<Button onClick={handleSave}>Save</Button>
</div>
</CardContent>
</Card>
)
}

);
};
Original file line number Diff line number Diff line change
Expand Up @@ -79,18 +79,18 @@ export default function PHClassificationGenerator() {
) : (
classifications.map((classification) => (
<PostCardSingleWithGenerator
key={classification.id}
classificationId={classification.id}
title={classification.title}
author={classification.author}
content={classification.content}
votes={classification.votes || 0}
category={classification.category}
tags={classification.tags || []}
images={classification.images || []}
anomalyId={classification.anomaly}
classificationConfig={classification.classificationConfiguration}
classificationType={classification.classificationtype}
key={classification.id}
classificationId={classification.id}
title={classification.title}
author={classification.author}
content={classification.content}
votes={classification.votes || 0}
category={classification.category}
tags={classification.tags || []}
images={classification.images || []}
anomalyId={classification.anomaly}
classificationConfig={classification.classificationConfiguration}
classificationType={classification.classificationtype}
/>
))
)}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ const generateCloudPath = (shape: CloudShape, width: number, height: number, off
}

return points
}
};

const drawFluffyCloud = (
ctx: CanvasRenderingContext2D,
Expand Down Expand Up @@ -86,7 +86,7 @@ const drawFluffyCloud = (
ctx.fill()

ctx.restore()
}
};

const getCloudColor = (altitude: number, shape: CloudShape) => {
const normalizedAltitude = (altitude - 50) / 30 // 0 to 1
Expand All @@ -104,7 +104,7 @@ const getCloudColor = (altitude: number, shape: CloudShape) => {
const opacity = shape === 'wisp' ? 0.7 : 0.9

return `rgba(${color.r}, ${color.g}, ${color.b}, ${opacity})`
}
};

export default function CloudSignal({ classificationConfig, classificationId }: CloudSignalProps) {
const supabase = useSupabaseClient();
Expand Down
14 changes: 9 additions & 5 deletions content/Posts/PostWithGen.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ interface CommentProps {
author: string;
content: string;
created_at: string;
}
};

interface PostCardSingleProps {
classificationId: number;
Expand All @@ -33,7 +33,7 @@ interface PostCardSingleProps {
classificationType: string;
onVote?: () => void;
commentStatus?: boolean;
}
};

export function PostCardSingleWithGenerator({
classificationId,
Expand Down Expand Up @@ -86,11 +86,15 @@ export function PostCardSingleWithGenerator({
switch (classificationType) {
case "cloud":
return <CloudSignal
classificationConfig={classificationConfig}
classificationId={String(classificationId)}
classificationConfig={classificationConfig}
classificationId={String(classificationId)}
/>
case "planet":
return <PlanetGenerator />;
return <PlanetGenerator
classificationId={String(classificationId)}
classificationConfig={classificationConfig}
author={author}
/>;
default:
return (
<div>
Expand Down

0 comments on commit 8678f4e

Please sign in to comment.