@@ -4,12 +4,9 @@ import { useQueryState } from 'nuqs'
44import { useEffect , useState } from 'react'
55import { pipe } from '@/lib/tinybird'
66import MetricCard from '../auth0/metric'
7- import { SubsChart } from './subs-chart'
8-
9- interface SubsDataPoint {
10- day : string
11- invoices : number
12- }
7+ import { SubsChart , SubsDataPoint } from './subs-chart'
8+ import { SubsByPlanChart , SubsByPlanDataPoint } from './sub-by-plan-chart'
9+ import { SubsByPlanTsChart , SubsByPlanTsDataPoint } from './sub-by-plan-ts-chart'
1310
1411export default function OrbDashboard ( ) {
1512 const [ token ] = useQueryState ( 'token' )
@@ -18,6 +15,8 @@ export default function OrbDashboard() {
1815 const [ issuedInvoices , setIssuedInvoices ] = useState < number > ( 0 )
1916 const [ paidInvoices , setPaidInvoices ] = useState < number > ( 0 )
2017 const [ subsTimeSeriesData , setSubsTimeSeriesData ] = useState < SubsDataPoint [ ] > ( [ ] )
18+ const [ subsByPlanData , setSubsByPlanData ] = useState < SubsByPlanDataPoint [ ] > ( [ ] )
19+ const [ subsByPlanTsData , setSubsByPlanTsData ] = useState < SubsByPlanTsDataPoint [ ] > ( [ ] )
2120
2221 useEffect ( ( ) => {
2322 async function fetchMetrics ( ) {
@@ -29,20 +28,26 @@ export default function OrbDashboard() {
2928 churnedSubsResult ,
3029 issuedInvoicesResult ,
3130 paidInvoicesResult ,
32- subsTimeSeriesResult
31+ subsTimeSeriesResult ,
32+ subsByPlanResult ,
33+ subsByPlanTsResult
3334 ] = await Promise . all ( [
3435 pipe ( token , 'orb_new_subs' ) ,
3536 pipe ( token , 'orb_churn_subs' ) ,
3637 pipe ( token , 'orb_invoices_issued' ) ,
3738 pipe ( token , 'orb_invoices_paid' ) ,
38- pipe < { data : SubsDataPoint [ ] } > ( token , 'orb_subs_ts' )
39+ pipe < { data : SubsDataPoint [ ] } > ( token , 'orb_subs_ts' ) ,
40+ pipe < { data : SubsByPlanDataPoint [ ] } > ( token , 'orb_subs_created_by_plan' ) ,
41+ pipe < { data : SubsByPlanTsDataPoint [ ] } > ( token , 'orb_daily_subs_created_by_plan' )
3942 ] )
4043
4144 setNewSubs ( newSubsResult . data [ 0 ] ?. subs || 0 )
4245 setChurnedSubs ( churnedSubsResult . data [ 0 ] ?. subs || 0 )
4346 setIssuedInvoices ( issuedInvoicesResult . data [ 0 ] ?. invoices || 0 )
4447 setPaidInvoices ( paidInvoicesResult . data [ 0 ] ?. invoices || 0 )
4548 setSubsTimeSeriesData ( subsTimeSeriesResult . data )
49+ setSubsByPlanData ( subsByPlanResult . data )
50+ setSubsByPlanTsData ( subsByPlanTsResult . data )
4651 } catch ( error ) {
4752 console . error ( 'Failed to fetch metrics:' , error )
4853 }
@@ -51,11 +56,11 @@ export default function OrbDashboard() {
5156 fetchMetrics ( )
5257 } , [ token ] )
5358
54- const churnRate = newSubs > 0
55- ? Math . round ( ( churnedSubs / newSubs ) * 100 )
59+ const churnRate = newSubs > 0
60+ ? Math . round ( ( churnedSubs / newSubs ) * 100 )
5661 : 0
5762
58- const invoicePaymentRate = issuedInvoices > 0
63+ const invoicePaymentRate = issuedInvoices > 0
5964 ? Math . round ( ( paidInvoices / issuedInvoices ) * 100 )
6065 : 0
6166
@@ -86,8 +91,13 @@ export default function OrbDashboard() {
8691 </ div >
8792
8893 { /* Charts Grid */ }
89- < div className = "grid gap-4 md: grid-cols-2 " >
94+ < div className = "grid gap-4 grid-cols-1 " >
9095 < SubsChart data = { subsTimeSeriesData } />
96+
97+ </ div >
98+ < div className = "grid gap-4 md:grid-cols-2" >
99+ < SubsByPlanTsChart data = { subsByPlanTsData } />
100+ < SubsByPlanChart data = { subsByPlanData } />
91101 </ div >
92102 </ div >
93103 )
0 commit comments