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 : }
|