1+ 'use client' ;
2+ import { useState , useMemo } from 'react' ;
3+ import SignalGraphView from '@/components/nodes/signal-graph-node/signal-graph-full' ;
4+ import { GlobalProvider } from '@/context/GlobalContext' ;
5+
6+ const WINDOW_SIZE = 200 ; // how many points visible at once
7+
8+ export default function TestChartPage ( ) {
9+ const [ allData , setAllData ] = useState < any [ ] > ( [ ] ) ;
10+ const [ windowStart , setWindowStart ] = useState ( 0 ) ;
11+
12+ const handleFile = ( e : React . ChangeEvent < HTMLInputElement > ) => {
13+ const file = e . target . files ?. [ 0 ] ;
14+ if ( ! file ) return ;
15+ const reader = new FileReader ( ) ;
16+ reader . onload = ( event ) => {
17+ const text = event . target ?. result as string ;
18+ const lines = text . trim ( ) . split ( '\n' ) ;
19+ const parsed = lines . slice ( 1 ) . map ( line => {
20+ const values = line . split ( ',' ) ;
21+ const timeOnly = values [ 0 ] . trim ( ) . split ( ' ' ) [ 1 ] ?. slice ( 0 , 12 ) ?? values [ 0 ] ;
22+ return {
23+ time : timeOnly ,
24+ signal1 : Number ( values [ 1 ] ) ,
25+ signal2 : Number ( values [ 2 ] ) ,
26+ signal3 : Number ( values [ 3 ] ) ,
27+ signal4 : Number ( values [ 4 ] ) ,
28+ } ;
29+ } ) ;
30+ setAllData ( parsed ) ;
31+ setWindowStart ( 0 ) ;
32+ } ;
33+ reader . readAsText ( file ) ;
34+ } ;
35+
36+ // only the visible slice
37+ const visibleData = useMemo (
38+ ( ) => allData . slice ( windowStart , windowStart + WINDOW_SIZE ) ,
39+ [ allData , windowStart ]
40+ ) ;
41+
42+ const maxStart = Math . max ( 0 , allData . length - WINDOW_SIZE ) ;
43+
44+ return (
45+ < GlobalProvider >
46+ < div className = "w-screen h-screen p-8" style = { { backgroundColor : '#EAF1F0' } } >
47+
48+ < input type = "file" accept = ".csv" onChange = { handleFile } className = "mb-4" />
49+
50+ { allData . length > 0 && (
51+ < div className = "mb-4 flex items-center gap-4" >
52+ < span className = "text-sm text-gray-500" >
53+ { allData . length } rows — showing { windowStart + 1 } –{ Math . min ( windowStart + WINDOW_SIZE , allData . length ) }
54+ </ span >
55+ < input
56+ type = "range"
57+ min = { 0 }
58+ max = { maxStart }
59+ value = { windowStart }
60+ onChange = { ( e ) => setWindowStart ( Number ( e . target . value ) ) }
61+ className = "w-full"
62+ />
63+ </ div >
64+ ) }
65+
66+ { allData . length > 0 && < SignalGraphView data = { visibleData } /> }
67+ </ div >
68+ </ GlobalProvider >
69+ ) ;
70+ }
0 commit comments