+page.svelte 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. <script>
  2. import Chart from '../../components/Chart.svelte';
  3. import { onMount } from 'svelte';
  4. import { authentication } from '../store.js';
  5. import { fade } from 'svelte/transition';
  6. let authToken;
  7. let data = {};
  8. let isLoading = true;
  9. onMount(() => {
  10. return authentication.subscribe(async ({ token }) => {
  11. if (token) {
  12. authToken = token;
  13. await fetchPortfolio();
  14. }
  15. });
  16. });
  17. async function fetchPortfolio() {
  18. try {
  19. const response = await fetch(`${import.meta.env.VITE_STOCKS_HOST}/api/portfolios`, {
  20. headers: {
  21. Authorization: `Bearer ${authToken}`
  22. }
  23. });
  24. if (!response.ok) {
  25. const error = await response.json();
  26. throw new Error(error.message || 'Unknown error');
  27. }
  28. const portfolio = await response.json();
  29. if (portfolio?.length) {
  30. data = portfolio[0];
  31. data.stocks = data.stocks.sort((a, b) => a.total - b.total);
  32. }
  33. } catch (error) {
  34. console.error('Failed to fetch portfolio:', error);
  35. alert(`Error: ${error.message}`);
  36. } finally {
  37. isLoading = false;
  38. }
  39. }
  40. </script>
  41. <svelte:head>
  42. <title>Insights</title>
  43. <meta name="description" content="Insights" />
  44. </svelte:head>
  45. {#if isLoading}
  46. <div in:fade>Loading...</div>
  47. {:else}
  48. <div in:fade>
  49. <Chart {data} />
  50. </div>
  51. {/if}