Skip to content

Commit

Permalink
🙅🏻‍♀️🌺 ↝ [SSM-83]: JVH Cloud generator export working, import in prog…
Browse files Browse the repository at this point in the history
…ress
  • Loading branch information
Gizmotronn committed Jan 3, 2025
1 parent 7522ae3 commit 18b1b10
Show file tree
Hide file tree
Showing 8 changed files with 321 additions and 43 deletions.
72 changes: 48 additions & 24 deletions components/Data/Generator/Meteorologists/JVH/cloud-classifier.tsx
Original file line number Diff line number Diff line change
@@ -1,37 +1,41 @@
'use client'

import { useState } from 'react'
import { useState, useEffect } from 'react'
import { Slider } from '@/components/ui/slider'
import { Badge } from '@/components/ui/badge'
import { CloudPattern } from '../../../../../types/Generators/JVH/atmosphere'
import { CloudPattern, CloudConfiguration } from '../../../../../types/Generators/JVH/atmosphere'
import { cloudCompositions } from '../../../../../data/cloud-compositions'
import { Cloud, Wind, TornadoIcon as Hurricane, Waves, Activity } from 'lucide-react'
import { CloudCanvas } from './cloud-canvas'
import { SciFiPanel } from '../../../../ui/styles/sci-fi/panel'
import { SciFiButton } from '../../../../ui/styles/sci-fi/button'
import { ConfigIOPanel } from './configuration'

export default function CloudClassifier() {
interface CloudSignalProps {
classificationConfig?: CloudConfiguration
classificationId: string
};

export default function CloudClassifier({ classificationConfig, classificationId }: CloudSignalProps) {
const [selectedPatterns, setSelectedPatterns] = useState<CloudPattern[]>([])
const [altitude, setAltitude] = useState(500)

const patterns = [
{ type: 'featureless' as const, icon: <Cloud className="w-5 h-5" />, label: 'Featureless' },
{ type: 'turbulent' as const, icon: <Wind className="w-5 h-5" />, label: 'Turbulent' },
{ type: 'vortex' as const, icon: <Hurricane className="w-5 h-5" />, label: 'Vortex' },
{ type: 'bands' as const, icon: <Waves className="w-5 h-5" />, label: 'Bands' },
]
{ type: 'bands' as const, icon: <Waves className="w-5 h-5" />, label: 'Bands' }
];

const togglePattern = (pattern: CloudPattern) => {
setSelectedPatterns(current =>
current.includes(pattern)
? current.filter(p => p !== pattern)
: [...current, pattern]
)
}
setSelectedPatterns((current) =>
current.includes(pattern) ? current.filter((p) => p !== pattern) : [...current, pattern]
);
};

const getCompositionAnalysis = () => {
const analysis = new Set<string>()
selectedPatterns.forEach(pattern => {
selectedPatterns.forEach((pattern) => {
switch (pattern) {
case 'featureless':
analysis.add('ammonia')
Expand All @@ -54,10 +58,28 @@ export default function CloudClassifier() {
return Array.from(analysis)
}

const getCurrentConfig = (): CloudConfiguration => ({
patterns: selectedPatterns,
altitude,
timestamp: new Date().toISOString()
})

const handleImport = (config: CloudConfiguration) => {
setSelectedPatterns(config.patterns)
setAltitude(config.altitude)
}

// Initialize the component state with classificationConfig if available
useEffect(() => {
if (classificationConfig) {
setSelectedPatterns(classificationConfig.patterns || [])
setAltitude(classificationConfig.altitude || 500)
}
}, [classificationConfig])

return (
<div className="min-h-screen bg-slate-950 p-4 md:p-8 text-cyan-50">
<div className="max-w-4xl mx-auto space-y-4">
{/* Header */}
<SciFiPanel className="p-4">
<div className="flex items-center justify-between">
<div>
Expand All @@ -72,7 +94,6 @@ export default function CloudClassifier() {
</SciFiPanel>

<div className="grid md:grid-cols-2 gap-4">
{/* Control Panel */}
<SciFiPanel className="p-4 space-y-6">
<div className="space-y-4">
<h2 className="text-lg font-semibold text-cyan-400">Pattern Selection</h2>
Expand Down Expand Up @@ -110,7 +131,6 @@ export default function CloudClassifier() {
</div>
</SciFiPanel>

{/* Visualization Panel */}
<SciFiPanel className="p-4">
<h2 className="text-lg font-semibold text-cyan-400 mb-4">Cloud Formation Display</h2>
<div className="h-[300px] rounded border border-cyan-500/20 overflow-hidden">
Expand All @@ -119,7 +139,12 @@ export default function CloudClassifier() {
</SciFiPanel>
</div>

{/* Analysis Panel */}
<ConfigIOPanel
currentConfig={getCurrentConfig()}
onImport={handleImport}
classificationId={classificationId}
/>

{selectedPatterns.length > 0 && (
<SciFiPanel variant="secondary" className="p-4">
<h2 className="text-lg font-semibold text-red-400 mb-4">Composition Analysis</h2>
Expand All @@ -139,12 +164,12 @@ export default function CloudClassifier() {
})}
</div>
<div className="text-sm text-red-300/70">
{selectedPatterns.map(pattern => (
{selectedPatterns.map((pattern) => (
<p key={pattern} className="mt-1">
{pattern === 'featureless' && "STATUS: Calm atmospheric region detected"}
{pattern === 'turbulent' && "WARNING: Strong atmospheric activity present"}
{pattern === 'vortex' && "ALERT: Deep storm system identified"}
{pattern === 'bands' && "INFO: Zonal jet streams observed"}
{pattern === 'featureless' && 'STATUS: Calm atmospheric region detected'}
{pattern === 'turbulent' && 'WARNING: Strong atmospheric activity present'}
{pattern === 'vortex' && 'ALERT: Deep storm system identified'}
{pattern === 'bands' && 'INFO: Zonal jet streams observed'}
</p>
))}
</div>
Expand All @@ -153,6 +178,5 @@ export default function CloudClassifier() {
)}
</div>
</div>
)
}

);
};
145 changes: 145 additions & 0 deletions components/Data/Generator/Meteorologists/JVH/configuration.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
'use client'

import { useState } from 'react'
import { SciFiPanel } from '@/components/ui/styles/sci-fi/panel'
import { SciFiButton } from '@/components/ui/styles/sci-fi/button'
import { Textarea } from '@/components/ui/textarea'
import { CloudConfiguration } from '@/types/Generators/JVH/atmosphere'
import { Download, Upload, AlertCircle } from 'lucide-react'
import { useSupabaseClient } from '@supabase/auth-helpers-react'

interface ConfigIOPanelProps {
currentConfig: CloudConfiguration
classificationId: string
onImport: (config: CloudConfiguration) => void
};

export function ConfigIOPanel({ currentConfig, classificationId, onImport }: ConfigIOPanelProps) {
const supabase = useSupabaseClient()

const [importText, setImportText] = useState('')
const [error, setError] = useState<string | null>(null)

const exportConfig = () => {
const configString = JSON.stringify(currentConfig, null, 2)
setImportText(configString)
setError(null)
}

const [exporting, setExporting] = useState(false)

const handleExport = async () => {
if (!classificationId) {
console.error('Classification ID not found.')
return
}

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

if (error) throw error

const currentConfiguration = data?.classificationConfiguration || {}
const cloudData = currentConfiguration.cloudData || {}

// Combine the new fields with cloudData without nested errors
const updatedConfig = {
...cloudData, // Keep the original cloud data
patterns: currentConfig.patterns || [], // Add patterns
altitude: currentConfig.altitude || 500, // Add altitude
timestamp: currentConfig.timestamp || new Date().toISOString(), // Add timestamp
}

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

if (updateError) throw updateError

alert('Cloud data exported successfully!')
} catch (err) {
console.error('Error exporting cloud data:', err)
alert('Failed to export cloud data.')
} finally {
setExporting(false)
}

const configString = JSON.stringify(currentConfig, null, 2)
setImportText(configString)
setError(null)
}

const importConfig = () => {
try {
const config = JSON.parse(importText) as CloudConfiguration

if (!config.patterns || !Array.isArray(config.patterns)) {
throw new Error('Invalid patterns configuration')
}
if (typeof config.altitude !== 'number' || config.altitude < 0 || config.altitude > 1000) {
throw new Error('Invalid altitude value')
}
if (!config.timestamp) {
throw new Error('Missing timestamp')
}

onImport(config)
setError(null)
} catch (err) {
setError('Invalid configuration format')
}
}

return (
<SciFiPanel className="p-4">
<div className="space-y-4">
<div className="flex items-center justify-between">
<h2 className="text-lg font-semibold text-cyan-400">Configuration Transfer</h2>
<div className="flex gap-2">
<SciFiButton onClick={handleExport} className="flex items-center gap-2">
<Download className="w-4 h-4" />
Export
</SciFiButton>
<SciFiButton
onClick={importConfig}
variant="secondary"
className="flex items-center gap-2"
>
<Upload className="w-4 h-4" />
Import
</SciFiButton>
</div>
</div>

<div>
<h3 className="text-sm text-cyan-300/70">Current Configuration</h3>
<pre className="font-mono text-sm bg-slate-900 text-cyan-50 p-4 rounded">
{JSON.stringify(currentConfig, null, 2)}
</pre>
</div>

<Textarea
value={importText}
onChange={(e) => setImportText(e.target.value)}
placeholder="Paste configuration data here..."
className="font-mono text-sm h-32 bg-slate-900 border-cyan-500/20 text-cyan-50 placeholder:text-cyan-500/50"
/>

{error && (
<div className="flex items-center gap-2 text-red-400 text-sm">
<AlertCircle className="w-4 h-4" />
<span>{error}</span>
</div>
)}
</div>
</SciFiPanel>
);
};
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,6 @@
import React, { useEffect, useState } from "react";
import { PostCardSingleWithGenerator } from "@/content/Posts/PostWithGen";
import { useSession, useSupabaseClient } from "@supabase/auth-helpers-react";
import CloudSignal from "./CloudSignal";

interface Classification {
id: number;
created_at: string;
content: string | null;
author: string | null;
anomaly: number | null;
media: any | null;
classificationtype: string | null;
classificationConfiguration: any | null;
};

export default function CloudClassificationGenerator() {
const supabase = useSupabaseClient();
Expand All @@ -29,7 +17,7 @@ export default function CloudClassificationGenerator() {
setError('User session not found.');
setLoading(false);
return;
}
};

setLoading(true);
setError(null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ export default function CloudSignal({ classificationConfig, classificationId }:
if (!classificationId) {
console.error("Classification ID is missing.");
return;
}
};
setExporting(true);

try {
Expand Down
Loading

0 comments on commit 18b1b10

Please sign in to comment.