diff --git a/static/js/index.js b/static/js/index.js index cf2dd8d..c777980 100644 --- a/static/js/index.js +++ b/static/js/index.js @@ -1,25 +1,25 @@ window.app = Vue.createApp({ - el: '#vue', mixins: [windowMixin], delimiters: ['${', '}'], - data: function () { + data() { return { + dashboardData: null, + transactions: [], + analytics: null, + loading: true, + error: null } }, - /////////////////////////////////////////////////// - ////////////////METHODS FUNCTIONS////////////////// - /////////////////////////////////////////////////// - methods: { // Utility Methods formatCurrency(amount) { if (!amount) return 'Q 0.00'; - + // Convert centavos to quetzales return new Intl.NumberFormat('es-GT', { style: 'currency', currency: 'GTQ', - }).format(amount); + }).format(amount / 100); }, formatDate(dateString) { @@ -38,16 +38,54 @@ window.app = Vue.createApp({ return new Intl.NumberFormat('en-US').format(amount) + ' sats' }, + async loadDashboardData() { + try { + const {data} = await LNbits.api.request( + 'GET', + '/satmachineclient/api/v1/dashboard/summary', + this.g.user.wallets[0].inkey + ) + this.dashboardData = data + } catch (error) { + console.error('Error loading dashboard data:', error) + this.error = 'Failed to load dashboard data' + } + }, + + async loadTransactions() { + try { + const {data} = await LNbits.api.request( + 'GET', + '/satmachineclient/api/v1/dashboard/transactions?limit=10', + this.g.user.wallets[0].inkey + ) + this.transactions = data + } catch (error) { + console.error('Error loading transactions:', error) + } + } }, - /////////////////////////////////////////////////// - //////LIFECYCLE FUNCTIONS RUNNING ON PAGE LOAD///// - /////////////////////////////////////////////////// + async created() { - // Load DCA client data - await Promise.all([ - ]) + try { + this.loading = true + await Promise.all([ + this.loadDashboardData(), + this.loadTransactions() + ]) + } catch (error) { + console.error('Error initializing dashboard:', error) + this.error = 'Failed to initialize dashboard' + } finally { + this.loading = false + } }, computed: { + hasData() { + return this.dashboardData && !this.loading + } } }) + +window.app.mount('#dcaClient') diff --git a/templates/satmachineclient/index.html b/templates/satmachineclient/index.html index 117e5bf..6a10114 100644 --- a/templates/satmachineclient/index.html +++ b/templates/satmachineclient/index.html @@ -1,5 +1,5 @@ - + {% extends "base.html" %} {% from "macros.jinja" import window_vars with context @@ -7,6 +7,110 @@ {% endblock %} {% block page %}
+ +
+ + +
Loading your DCA dashboard...
+
+
+ +
+ + + ${error} + +
+ + +
+ +
+
+ +
${formatSats(dashboardData.total_sats_accumulated)}
+
Total Sats Accumulated
+
+
+
+ +
${formatCurrency(dashboardData.total_fiat_invested)}
+
Total Invested
+
+
+
+ +
${formatCurrency(dashboardData.current_fiat_balance)}
+
Available Balance
+
+
+
+ +
${dashboardData.total_transactions}
+
Total Transactions
+
+
+
+ + +
+
+ +
DCA Status
+
+
+
Mode: ${dashboardData.dca_mode}
+
+
+
Status: + + ${dashboardData.dca_status} + +
+
+
+
+
Average Cost Basis: ${Math.round(dashboardData.average_cost_basis)} sats/GTQ
+
+
+
+
+ + +
+
+ +
Recent Transactions
+
+ No transactions yet +
+ + + + ${formatSats(tx.amount_sats)} + ${formatCurrency(tx.amount_fiat)} • ${formatDate(tx.created_at)} + + + + ${tx.status} + + + + +
+
+
+
{% endblock %} diff --git a/views_api.py b/views_api.py index 4bcfffe..fc3e763 100644 --- a/views_api.py +++ b/views_api.py @@ -35,7 +35,7 @@ async def api_get_dashboard_summary( wallet: WalletTypeInfo = Depends(require_invoice_key), ) -> ClientDashboardSummary: """Get client dashboard summary metrics""" - summary = await get_client_dashboard_summary(wallet.user) + summary = await get_client_dashboard_summary(wallet.wallet.user) if not summary: raise HTTPException( status_code=HTTPStatus.NOT_FOUND, @@ -55,7 +55,7 @@ async def api_get_client_transactions( ) -> List[ClientTransaction]: """Get client's DCA transaction history with filtering""" return await get_client_transactions( - wallet.user, + wallet.wallet.user, limit=limit, offset=offset, transaction_type=transaction_type, @@ -70,7 +70,7 @@ async def api_get_client_analytics( time_range: str = Query("30d", regex="^(7d|30d|90d|1y|all)$"), ) -> ClientAnalytics: """Get client performance analytics and cost basis data""" - analytics = await get_client_analytics(wallet.user, time_range) + analytics = await get_client_analytics(wallet.wallet.user, time_range) if not analytics: raise HTTPException( status_code=HTTPStatus.NOT_FOUND, @@ -85,7 +85,7 @@ async def api_update_client_settings( wallet: WalletTypeInfo = Depends(require_invoice_key), ) -> dict: """Update client DCA settings (mode, limits, status)""" - client = await get_client_by_user_id(wallet.user) + client = await get_client_by_user_id(wallet.wallet.user) if not client: raise HTTPException( status_code=HTTPStatus.NOT_FOUND, @@ -111,7 +111,7 @@ async def api_export_transactions( ): """Export client transaction history""" transactions = await get_client_transactions( - wallet.user, + wallet.wallet.user, limit=10000, # Large limit for export start_date=start_date, end_date=end_date