175 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			175 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
"use client";
 | 
						|
import IconTrashLines from '@/components/icon/icon-trash-lines';
 | 
						|
import PanelCodeHighlight from '@/components/panel-code-highlight';
 | 
						|
import ComponentsTablesSimple from '@/components/tables/components-tables-simple';
 | 
						|
import { formatUnixTimestamp } from '@/utils/helpers';
 | 
						|
import Tippy from '@tippyjs/react';
 | 
						|
import axios from 'axios';
 | 
						|
import React, { useEffect, useState } from 'react'
 | 
						|
 | 
						|
// import ReactApexChart from 'react-apexcharts';
 | 
						|
import dynamic from 'next/dynamic';
 | 
						|
import Link from 'next/link';
 | 
						|
const ReactApexChart = dynamic(() => import('react-apexcharts'), { ssr: false });
 | 
						|
 | 
						|
type Props = {}
 | 
						|
 | 
						|
const SungrowInverters = (props: Props) => {
 | 
						|
    const [inverters, setInverters] = useState<any[]>([])
 | 
						|
    const [loading, setLoading] = useState(true)
 | 
						|
    const [isMounted, setIsMounted] = useState(false)
 | 
						|
 | 
						|
    useEffect(() => {
 | 
						|
        setIsMounted(true);
 | 
						|
        const fetchData = async () => {
 | 
						|
            try {
 | 
						|
                const res = await axios.get("https://api-a.fomware.com.cn/asset/v1/list?type=2", {
 | 
						|
                    headers: {
 | 
						|
                        "Authorization": "Bearer " + process.env.NEXT_PUBLIC_CHINT_TOKEN
 | 
						|
                    }
 | 
						|
                })
 | 
						|
                console.log("res", res.data.data.devices)
 | 
						|
                setInverters(res.data.data.devices)
 | 
						|
            } catch (error) {
 | 
						|
                console.error("Error fetching data:", error);
 | 
						|
            } finally {
 | 
						|
                setLoading(false);
 | 
						|
            }
 | 
						|
        };
 | 
						|
 | 
						|
        fetchData()
 | 
						|
    }, [])
 | 
						|
 | 
						|
 | 
						|
    const chartConfigs: any = {
 | 
						|
        options: {
 | 
						|
            chart: {
 | 
						|
                height: 58,
 | 
						|
                type: 'line',
 | 
						|
                fontFamily: 'Nunito, sans-serif',
 | 
						|
                sparkline: {
 | 
						|
                    enabled: true,
 | 
						|
                },
 | 
						|
                dropShadow: {
 | 
						|
                    enabled: true,
 | 
						|
                    blur: 3,
 | 
						|
                    color: '#009688',
 | 
						|
                    opacity: 0.4,
 | 
						|
                },
 | 
						|
            },
 | 
						|
            stroke: {
 | 
						|
                curve: 'smooth',
 | 
						|
                width: 2,
 | 
						|
            },
 | 
						|
            colors: ['#009688'],
 | 
						|
            grid: {
 | 
						|
                padding: {
 | 
						|
                    top: 5,
 | 
						|
                    bottom: 5,
 | 
						|
                    left: 5,
 | 
						|
                    right: 5,
 | 
						|
                },
 | 
						|
            },
 | 
						|
            tooltip: {
 | 
						|
                x: {
 | 
						|
                    show: false,
 | 
						|
                },
 | 
						|
                y: {
 | 
						|
                    title: {
 | 
						|
                        formatter: () => {
 | 
						|
                            return '';
 | 
						|
                        },
 | 
						|
                    },
 | 
						|
                },
 | 
						|
            },
 | 
						|
        },
 | 
						|
    };
 | 
						|
 | 
						|
    // inverter status 0: initial, 1: standby, 2: fault, 3: running, 5: offline, 9: shutdown, 10: unknown
 | 
						|
 | 
						|
    return (
 | 
						|
        <div>
 | 
						|
            {loading ? <p>Loading...</p> : (
 | 
						|
            <PanelCodeHighlight title="Chint Inverters">
 | 
						|
                <div className="table-responsive mb-5">
 | 
						|
                    <table>
 | 
						|
                        <thead>
 | 
						|
                            <tr>
 | 
						|
                                <th>Inverter Name</th>
 | 
						|
                                <th>Site Name</th>
 | 
						|
                                <th>Gateway SN</th>
 | 
						|
                                <th>Inverter Status</th>
 | 
						|
                                <th>Model</th>
 | 
						|
                                <th>SN</th>
 | 
						|
                                <th>Real Time Power</th>
 | 
						|
                                <th>E-Today</th>
 | 
						|
                                <th>WeekData</th>
 | 
						|
                                <th>Created At</th>
 | 
						|
                                <th>Updated At</th>
 | 
						|
                            </tr>
 | 
						|
                        </thead>
 | 
						|
                        <tbody>
 | 
						|
                            {inverters.map((data) => (
 | 
						|
                                <tr key={data.id}>
 | 
						|
                                    <td>
 | 
						|
                                        <div className="whitespace-nowrap"><Link href={`/chint/inverters/${data.name}`}>{data.name}</Link></div>
 | 
						|
                                    </td>
 | 
						|
                                    <td>
 | 
						|
                                        <div className="whitespace-nowrap">{data.siteName}</div>
 | 
						|
                                    </td>
 | 
						|
                                    <td>
 | 
						|
                                        <div>{data.gatewaySn}</div>
 | 
						|
                                    </td>
 | 
						|
                                    <td>
 | 
						|
                                        <div className={`whitespace-nowrap ${
 | 
						|
                                            data.status === 0 ? "text-gray-500"    // Initial
 | 
						|
                                            : data.status === 1 ? "text-blue-500"  // Standby
 | 
						|
                                            : data.status === 2 ? "text-red-500"  // Fault
 | 
						|
                                            : data.status === 3 ? "text-green-500" // Running
 | 
						|
                                            : data.status === 5 ? "text-yellow-500" // Offline
 | 
						|
                                            : data.status === 9 ? "text-purple-500" // Shutdown
 | 
						|
                                            : "text-gray-400" // Unknown (default)
 | 
						|
                                        }`}>
 | 
						|
                                            {data.statusLabel}
 | 
						|
                                        </div>
 | 
						|
                                    </td>
 | 
						|
                                    <td>
 | 
						|
                                        <div>{data.model}</div>
 | 
						|
                                    </td>
 | 
						|
                                    <td>
 | 
						|
                                        <div>{data.sn}</div>
 | 
						|
                                    </td>
 | 
						|
                                    <td>
 | 
						|
                                        <div>{data.activePowerWithUnit}</div>
 | 
						|
                                    </td>
 | 
						|
                                    <td>
 | 
						|
                                        <div>{data.eTodayWithUnit}</div>
 | 
						|
                                    </td>
 | 
						|
                                    <td>
 | 
						|
                                        {isMounted && (
 | 
						|
                                            <ReactApexChart
 | 
						|
                                                series={[{ data: data.weekTrend.map((point: any) => point.y) }]}
 | 
						|
                                                options={{
 | 
						|
                                                    ...chartConfigs.options,
 | 
						|
                                                    xaxis: { categories: data.weekTrend.map((point: any) => point.x) },
 | 
						|
                                                }}
 | 
						|
                                                type="line"
 | 
						|
                                                height={58}
 | 
						|
                                                width={'100%'}
 | 
						|
                                            />
 | 
						|
                                        )}                                    </td>
 | 
						|
                                    <td>{formatUnixTimestamp(data.createdAt)}</td>
 | 
						|
                                    <td>{formatUnixTimestamp(data.updatedAt)}</td>
 | 
						|
                                </tr>
 | 
						|
                            ))}
 | 
						|
                        </tbody>
 | 
						|
                    </table>
 | 
						|
                </div>
 | 
						|
            </PanelCodeHighlight>
 | 
						|
            )}
 | 
						|
        </div>
 | 
						|
    )
 | 
						|
}
 | 
						|
 | 
						|
export default SungrowInverters
 |