LCOV - code coverage report
Current view: top level - dashql-app/src/ui/version - release_bundle.tsx Coverage Total Hit
Test: DashQL 915828b Lines: 41.1 % 56 23
Test Date: 2026-11-06 19:30:32

            Line data    Source code
       1              : import * as React from 'react';
       2              : 
       3              : import { classNames } from '../../utils/classnames.js';
       4              : import { Button, ButtonSize } from '../foundations/button.js';
       5              : import { ReleaseChannel, ReleaseManifest } from '../../platform/version/web_version_check.js';
       6              : import { useLogger } from '../../platform/logger/logger_provider.js';
       7              : import { useLatestReleaseManifest, useStableReleaseManifest } from '../../platform/version/version_check.js';
       8              : 
       9              : import * as styles from './release_bundle.module.css';
      10              : import { Result, RESULT_OK } from '../../utils/result.js';
      11              : 
      12              : interface ReleaseBundleProps {
      13              :     name: string;
      14              :     channel: ReleaseChannel;
      15              :     pubDate: Date;
      16              :     url: URL;
      17              :     version: string;
      18              : }
      19            1 : const ReleaseBundle: React.FC<ReleaseBundleProps> = (props: ReleaseBundleProps) => {
      20            0 :     const logger = useLogger();
      21            0 :     return (
      22            0 :         <React.Fragment>
      23            0 :             <div className={styles.native_app_platform_bundle_name}>
      24            0 :                 {props.name}
      25            0 :             </div>
      26            0 :             <div className={styles.native_app_platform_bundle_version}>
      27            0 :                 {props.version}
      28            0 :             </div>
      29            0 :             <div className={styles.native_app_platform_bundle_channel}>
      30            0 :                 <div className={styles.native_app_platform_bundle_channel_text}>
      31            0 :                     {props.channel}
      32            0 :                 </div>
      33            0 :             </div>
      34            0 :             <div className={styles.native_app_platform_bundle_download}>
      35            0 :                 <Button size={ButtonSize.Small} onClick={() => {
      36            0 :                     logger.info("Prompting user to download", { "name": props.name, "version": props.version });
      37            0 :                     const link = document.createElement('a');
      38            0 :                     link.href = props.url.toString();
      39            0 :                     link.download = props.name;
      40            0 :                     link.click();
      41            0 :                 }}>Download</Button>
      42            0 :             </div>
      43            0 :         </React.Fragment>
      44              :     );
      45            0 : }
      46              : 
      47              : interface ReleaseBundlesProps {
      48              :     className?: string;
      49              : }
      50              : 
      51            1 : export const ReleaseBundles: React.FC<ReleaseBundlesProps> = (props: ReleaseBundlesProps) => {
      52            1 :     const stableReleaseManifest = useStableReleaseManifest();
      53            1 :     const latestReleaseManifest = useLatestReleaseManifest();
      54              : 
      55              :     // We'll care about identifying the exact platform bundles as soon as we support more than mac.
      56            1 :     const macBundles: ReleaseBundleProps[] = React.useMemo(() => {
      57            1 :         const macBundles: ReleaseBundleProps[] = []
      58            1 :         const releaseManifests: [Result<ReleaseManifest> | null, ReleaseChannel][] = [[stableReleaseManifest, "stable"], [latestReleaseManifest, "latest"]];
      59            1 :         for (const [manifest, channel] of releaseManifests) {
      60            1 :             if (manifest != null && manifest.type == RESULT_OK) {
      61            1 :                 for (const bundle of manifest.value.bundles) {
      62            0 :                     if (bundle.bundle_type == "Dmg") {
      63            0 :                         macBundles.push({
      64            0 :                             name: bundle.name,
      65            0 :                             channel: channel,
      66            0 :                             pubDate: manifest.value.pub_date,
      67            0 :                             url: bundle.url,
      68            0 :                             version: manifest.value.version
      69            1 :                         });
      70              :                     }
      71              :                 }
      72              :             }
      73              :         }
      74            1 :         return macBundles;
      75            1 :     }, [stableReleaseManifest, latestReleaseManifest]);
      76              : 
      77            1 :     return (
      78            1 :         <div className={classNames(styles.native_apps_container, props.className)}>
      79            1 :             <div className={styles.native_app_platform_title}>
      80              :                 Native Apps
      81            1 :             </div>
      82            1 :             <div className={styles.native_app_platform_bundles}>
      83            1 :                 {macBundles.map((bundle, index) => (
      84            0 :                     <ReleaseBundle key={index} {...bundle} />
      85            1 :                 ))}
      86            1 :             </div>
      87            1 :         </div>
      88              :     );
      89            1 : }
        

Generated by: LCOV version 2.0-1