@@ -173,13 +173,13 @@ import { api } from "./api.js";
173173 const dpr = window . devicePixelRatio || 1 ;
174174
175175 canvas . width = parentWidth * dpr ;
176- canvas . height = 220 * dpr ;
176+ canvas . height = 260 * dpr ;
177177
178178 const ctx = canvas . getContext ( "2d" ) ;
179179 ctx . setTransform ( 1 , 0 , 0 , 1 , 0 , 0 ) ;
180180 ctx . scale ( dpr , dpr ) ;
181181
182- ctx . clearRect ( 0 , 0 , parentWidth , 220 ) ;
182+ ctx . clearRect ( 0 , 0 , parentWidth , 260 ) ;
183183
184184 if ( ! series ?. length ) return ;
185185
@@ -329,33 +329,7 @@ import { api } from "./api.js";
329329 // ============================================================
330330 // NET WORTH DATA + RENDER
331331 // ============================================================
332- function buildDemoNetWorth ( currency ) {
333- return {
334- currency,
335- asOf : new Date ( ) . toISOString ( ) ,
336- assets : [
337- { name : "Checking" , amount : 4200 } ,
338- { name : "Savings" , amount : 7800 } ,
339- { name : "Investments" , amount : 15300 } ,
340- { name : "Property" , amount : 62000 } ,
341- ] ,
342- liabilities : [
343- { name : "Credit Card" , amount : 1800 } ,
344- { name : "Auto Loan" , amount : 6200 } ,
345- { name : "Student Loan" , amount : 12400 } ,
346- ] ,
347- trend : [
348- { label : "Aug" , value : 68000 } ,
349- { label : "Sep" , value : 69200 } ,
350- { label : "Oct" , value : 70100 } ,
351- { label : "Nov" , value : 71450 } ,
352- { label : "Dec" , value : 70980 } ,
353- { label : "Jan" , value : 72620 } ,
354- ] ,
355- } ;
356- }
357-
358- function buildMonthlyNet ( records , monthsBack = 6 ) {
332+ function buildMonthlyNet ( records , monthsBack = 12 ) {
359333 const now = new Date ( ) ;
360334 const months = [ ] ;
361335 for ( let i = monthsBack - 1 ; i >= 0 ; i -= 1 ) {
@@ -392,24 +366,30 @@ import { api } from "./api.js";
392366 }
393367 }
394368
395- const demo = buildDemoNetWorth ( currency ) ;
396- if ( ! records ?. length ) return demo ;
397-
398- const assetsTotal = demo . assets . reduce ( ( s , a ) => s + a . amount , 0 ) ;
399- const liabilitiesTotal = demo . liabilities . reduce ( ( s , l ) => s + l . amount , 0 ) ;
400- const base = assetsTotal - liabilitiesTotal ;
401- const months = buildMonthlyNet ( records , 6 ) ;
369+ if ( ! records ?. length ) {
370+ return {
371+ currency,
372+ asOf : null ,
373+ assets : [ ] ,
374+ liabilities : [ ] ,
375+ trend : [ ] ,
376+ } ;
377+ }
402378
379+ const base = 0 ;
380+ const months = buildMonthlyNet ( records , 12 ) ;
403381 let running = base ;
404382 const trend = months . map ( ( m ) => {
405383 running += m . net ;
406384 return { label : m . label , value : Math . max ( 0 , running ) } ;
407385 } ) ;
408386
409387 return {
410- ...demo ,
411- trend,
388+ currency,
412389 asOf : new Date ( ) . toISOString ( ) ,
390+ assets : [ ] ,
391+ liabilities : [ ] ,
392+ trend,
413393 } ;
414394 }
415395
@@ -419,21 +399,29 @@ import { api } from "./api.js";
419399 const liabilitiesTotal = ( data . liabilities || [ ] ) . reduce ( ( s , l ) => s + l . amount , 0 ) ;
420400 const netWorth = assetsTotal - liabilitiesTotal ;
421401
422- setText ( "#netWorthTotal" , fmtMoney ( netWorth , data . currency ) ) ;
423- setText ( "#assetsTotal" , fmtMoney ( assetsTotal , data . currency ) ) ;
424- setText ( "#liabilitiesTotal" , fmtMoney ( liabilitiesTotal , data . currency ) ) ;
425-
426- const deltaBase = data . trend ?. length ? data . trend [ 0 ] . value : netWorth ;
427- const delta = netWorth - deltaBase ;
428- const deltaLabel = delta >= 0 ? "up" : "down" ;
429- setText (
430- "#netWorthDelta" ,
431- `${ delta >= 0 ? "+" : "-" } ${ fmtMoney ( Math . abs ( delta ) , data . currency ) } ${ deltaLabel } vs 6 months ago`
432- ) ;
433- setText (
434- "#netWorthUpdated" ,
435- `Updated ${ new Date ( data . asOf ) . toLocaleDateString ( ) } `
436- ) ;
402+ if ( ! data . assets ?. length && ! data . liabilities ?. length && ! data . trend ?. length ) {
403+ setText ( "#netWorthTotal" , "—" ) ;
404+ setText ( "#assetsTotal" , "—" ) ;
405+ setText ( "#liabilitiesTotal" , "—" ) ;
406+ setText ( "#netWorthDelta" , "Connect accounts to see your net worth trend." ) ;
407+ setText ( "#netWorthUpdated" , "No net worth data yet" ) ;
408+ } else {
409+ setText ( "#netWorthTotal" , fmtMoney ( netWorth , data . currency ) ) ;
410+ setText ( "#assetsTotal" , fmtMoney ( assetsTotal , data . currency ) ) ;
411+ setText ( "#liabilitiesTotal" , fmtMoney ( liabilitiesTotal , data . currency ) ) ;
412+
413+ const deltaBase = data . trend ?. length ? data . trend [ 0 ] . value : netWorth ;
414+ const delta = netWorth - deltaBase ;
415+ const deltaLabel = delta >= 0 ? "up" : "down" ;
416+ setText (
417+ "#netWorthDelta" ,
418+ `${ delta >= 0 ? "+" : "-" } ${ fmtMoney ( Math . abs ( delta ) , data . currency ) } ${ deltaLabel } vs previous period`
419+ ) ;
420+ setText (
421+ "#netWorthUpdated" ,
422+ data . asOf ? `Updated ${ new Date ( data . asOf ) . toLocaleDateString ( ) } ` : "No net worth data yet"
423+ ) ;
424+ }
437425
438426 const assetsList = $ ( "#assetsList" ) ;
439427 const liabilitiesList = $ ( "#liabilitiesList" ) ;
@@ -464,7 +452,9 @@ import { api } from "./api.js";
464452 renderList ( assetsList , data . assets ) ;
465453 renderList ( liabilitiesList , data . liabilities ) ;
466454
467- drawNetWorthChart ( $ ( "#netWorthChart" ) , data . trend , data . currency ) ;
455+ if ( data . trend ?. length ) {
456+ drawNetWorthChart ( $ ( "#netWorthChart" ) , data . trend , data . currency ) ;
457+ }
468458 }
469459
470460 function renderKpis ( comp , viewLabel ) {
@@ -697,7 +687,9 @@ import { api } from "./api.js";
697687
698688 const redraw = debounce ( ( ) => {
699689 drawBarChart ( canvas , computed . categories ) ;
700- drawNetWorthChart ( $ ( "#netWorthChart" ) , netWorthData . trend , netWorthData . currency ) ;
690+ if ( netWorthData . trend ?. length ) {
691+ drawNetWorthChart ( $ ( "#netWorthChart" ) , netWorthData . trend , netWorthData . currency ) ;
692+ }
701693 } , 150 ) ;
702694
703695 window . addEventListener ( "resize" , redraw ) ;
0 commit comments