/ components / DesktopUpsell / DesktopUpsellStartup.tsx
DesktopUpsellStartup.tsx
  1  import { c as _c } from "react/compiler-runtime";
  2  import * as React from 'react';
  3  import { useEffect, useState } from 'react';
  4  import { Box, Text } from '../../ink.js';
  5  import { getDynamicConfig_CACHED_MAY_BE_STALE } from '../../services/analytics/growthbook.js';
  6  import { logEvent } from '../../services/analytics/index.js';
  7  import { getGlobalConfig, saveGlobalConfig } from '../../utils/config.js';
  8  import { Select } from '../CustomSelect/select.js';
  9  import { DesktopHandoff } from '../DesktopHandoff.js';
 10  import { PermissionDialog } from '../permissions/PermissionDialog.js';
 11  type DesktopUpsellConfig = {
 12    enable_shortcut_tip: boolean;
 13    enable_startup_dialog: boolean;
 14  };
 15  const DESKTOP_UPSELL_DEFAULT: DesktopUpsellConfig = {
 16    enable_shortcut_tip: false,
 17    enable_startup_dialog: false
 18  };
 19  export function getDesktopUpsellConfig(): DesktopUpsellConfig {
 20    return getDynamicConfig_CACHED_MAY_BE_STALE('tengu_desktop_upsell', DESKTOP_UPSELL_DEFAULT);
 21  }
 22  function isSupportedPlatform(): boolean {
 23    return process.platform === 'darwin' || process.platform === 'win32' && process.arch === 'x64';
 24  }
 25  export function shouldShowDesktopUpsellStartup(): boolean {
 26    if (!isSupportedPlatform()) return false;
 27    if (!getDesktopUpsellConfig().enable_startup_dialog) return false;
 28    const config = getGlobalConfig();
 29    if (config.desktopUpsellDismissed) return false;
 30    if ((config.desktopUpsellSeenCount ?? 0) >= 3) return false;
 31    return true;
 32  }
 33  type DesktopUpsellSelection = 'try' | 'not-now' | 'never';
 34  type Props = {
 35    onDone: () => void;
 36  };
 37  export function DesktopUpsellStartup(t0) {
 38    const $ = _c(14);
 39    const {
 40      onDone
 41    } = t0;
 42    const [showHandoff, setShowHandoff] = useState(false);
 43    let t1;
 44    if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
 45      t1 = [];
 46      $[0] = t1;
 47    } else {
 48      t1 = $[0];
 49    }
 50    useEffect(_temp, t1);
 51    if (showHandoff) {
 52      let t2;
 53      if ($[1] !== onDone) {
 54        t2 = <DesktopHandoff onDone={() => onDone()} />;
 55        $[1] = onDone;
 56        $[2] = t2;
 57      } else {
 58        t2 = $[2];
 59      }
 60      return t2;
 61    }
 62    let t2;
 63    if ($[3] !== onDone) {
 64      t2 = function handleSelect(value) {
 65        switch (value) {
 66          case "try":
 67            {
 68              setShowHandoff(true);
 69              return;
 70            }
 71          case "never":
 72            {
 73              saveGlobalConfig(_temp2);
 74              onDone();
 75              return;
 76            }
 77          case "not-now":
 78            {
 79              onDone();
 80              return;
 81            }
 82        }
 83      };
 84      $[3] = onDone;
 85      $[4] = t2;
 86    } else {
 87      t2 = $[4];
 88    }
 89    const handleSelect = t2;
 90    let t3;
 91    if ($[5] === Symbol.for("react.memo_cache_sentinel")) {
 92      t3 = {
 93        label: "Open in Claude Code Desktop",
 94        value: "try" as const
 95      };
 96      $[5] = t3;
 97    } else {
 98      t3 = $[5];
 99    }
100    let t4;
101    if ($[6] === Symbol.for("react.memo_cache_sentinel")) {
102      t4 = {
103        label: "Not now",
104        value: "not-now" as const
105      };
106      $[6] = t4;
107    } else {
108      t4 = $[6];
109    }
110    let t5;
111    if ($[7] === Symbol.for("react.memo_cache_sentinel")) {
112      t5 = [t3, t4, {
113        label: "Don't ask again",
114        value: "never" as const
115      }];
116      $[7] = t5;
117    } else {
118      t5 = $[7];
119    }
120    const options = t5;
121    let t6;
122    if ($[8] === Symbol.for("react.memo_cache_sentinel")) {
123      t6 = <Box marginBottom={1}><Text>Same Claude Code with visual diffs, live app preview, parallel sessions, and more.</Text></Box>;
124      $[8] = t6;
125    } else {
126      t6 = $[8];
127    }
128    let t7;
129    if ($[9] !== handleSelect) {
130      t7 = () => handleSelect("not-now");
131      $[9] = handleSelect;
132      $[10] = t7;
133    } else {
134      t7 = $[10];
135    }
136    let t8;
137    if ($[11] !== handleSelect || $[12] !== t7) {
138      t8 = <PermissionDialog title="Try Claude Code Desktop"><Box flexDirection="column" paddingX={2} paddingY={1}>{t6}<Select options={options} onChange={handleSelect} onCancel={t7} /></Box></PermissionDialog>;
139      $[11] = handleSelect;
140      $[12] = t7;
141      $[13] = t8;
142    } else {
143      t8 = $[13];
144    }
145    return t8;
146  }
147  function _temp2(prev_0) {
148    if (prev_0.desktopUpsellDismissed) {
149      return prev_0;
150    }
151    return {
152      ...prev_0,
153      desktopUpsellDismissed: true
154    };
155  }
156  function _temp() {
157    const newCount = (getGlobalConfig().desktopUpsellSeenCount ?? 0) + 1;
158    saveGlobalConfig(prev => {
159      if ((prev.desktopUpsellSeenCount ?? 0) >= newCount) {
160        return prev;
161      }
162      return {
163        ...prev,
164        desktopUpsellSeenCount: newCount
165      };
166    });
167    logEvent("tengu_desktop_upsell_shown", {
168      seen_count: newCount
169    });
170  }
171  //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsInVzZUVmZmVjdCIsInVzZVN0YXRlIiwiQm94IiwiVGV4dCIsImdldER5bmFtaWNDb25maWdfQ0FDSEVEX01BWV9CRV9TVEFMRSIsImxvZ0V2ZW50IiwiZ2V0R2xvYmFsQ29uZmlnIiwic2F2ZUdsb2JhbENvbmZpZyIsIlNlbGVjdCIsIkRlc2t0b3BIYW5kb2ZmIiwiUGVybWlzc2lvbkRpYWxvZyIsIkRlc2t0b3BVcHNlbGxDb25maWciLCJlbmFibGVfc2hvcnRjdXRfdGlwIiwiZW5hYmxlX3N0YXJ0dXBfZGlhbG9nIiwiREVTS1RPUF9VUFNFTExfREVGQVVMVCIsImdldERlc2t0b3BVcHNlbGxDb25maWciLCJpc1N1cHBvcnRlZFBsYXRmb3JtIiwicHJvY2VzcyIsInBsYXRmb3JtIiwiYXJjaCIsInNob3VsZFNob3dEZXNrdG9wVXBzZWxsU3RhcnR1cCIsImNvbmZpZyIsImRlc2t0b3BVcHNlbGxEaXNtaXNzZWQiLCJkZXNrdG9wVXBzZWxsU2VlbkNvdW50IiwiRGVza3RvcFVwc2VsbFNlbGVjdGlvbiIsIlByb3BzIiwib25Eb25lIiwiRGVza3RvcFVwc2VsbFN0YXJ0dXAiLCJ0MCIsIiQiLCJfYyIsInNob3dIYW5kb2ZmIiwic2V0U2hvd0hhbmRvZmYiLCJ0MSIsIlN5bWJvbCIsImZvciIsIl90ZW1wIiwidDIiLCJoYW5kbGVTZWxlY3QiLCJ2YWx1ZSIsIl90ZW1wMiIsInQzIiwibGFiZWwiLCJjb25zdCIsInQ0IiwidDUiLCJvcHRpb25zIiwidDYiLCJ0NyIsInQ4IiwicHJldl8wIiwicHJldiIsIm5ld0NvdW50Iiwic2Vlbl9jb3VudCJdLCJzb3VyY2VzIjpbIkRlc2t0b3BVcHNlbGxTdGFydHVwLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IEJveCwgVGV4dCB9IGZyb20gJy4uLy4uL2luay5qcydcbmltcG9ydCB7IGdldER5bmFtaWNDb25maWdfQ0FDSEVEX01BWV9CRV9TVEFMRSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2FuYWx5dGljcy9ncm93dGhib29rLmpzJ1xuaW1wb3J0IHsgbG9nRXZlbnQgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hbmFseXRpY3MvaW5kZXguanMnXG5pbXBvcnQgeyBnZXRHbG9iYWxDb25maWcsIHNhdmVHbG9iYWxDb25maWcgfSBmcm9tICcuLi8uLi91dGlscy9jb25maWcuanMnXG5pbXBvcnQgeyBTZWxlY3QgfSBmcm9tICcuLi9DdXN0b21TZWxlY3Qvc2VsZWN0LmpzJ1xuaW1wb3J0IHsgRGVza3RvcEhhbmRvZmYgfSBmcm9tICcuLi9EZXNrdG9wSGFuZG9mZi5qcydcbmltcG9ydCB7IFBlcm1pc3Npb25EaWFsb2cgfSBmcm9tICcuLi9wZXJtaXNzaW9ucy9QZXJtaXNzaW9uRGlhbG9nLmpzJ1xuXG50eXBlIERlc2t0b3BVcHNlbGxDb25maWcgPSB7XG4gIGVuYWJsZV9zaG9ydGN1dF90aXA6IGJvb2xlYW5cbiAgZW5hYmxlX3N0YXJ0dXBfZGlhbG9nOiBib29sZWFuXG59XG5cbmNvbnN0IERFU0tUT1BfVVBTRUxMX0RFRkFVTFQ6IERlc2t0b3BVcHNlbGxDb25maWcgPSB7XG4gIGVuYWJsZV9zaG9ydGN1dF90aXA6IGZhbHNlLFxuICBlbmFibGVfc3RhcnR1cF9kaWFsb2c6IGZhbHNlLFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVza3RvcFVwc2VsbENvbmZpZygpOiBEZXNrdG9wVXBzZWxsQ29uZmlnIHtcbiAgcmV0dXJuIGdldER5bmFtaWNDb25maWdfQ0FDSEVEX01BWV9CRV9TVEFMRShcbiAgICAndGVuZ3VfZGVza3RvcF91cHNlbGwnLFxuICAgIERFU0tUT1BfVVBTRUxMX0RFRkFVTFQsXG4gIClcbn1cblxuZnVuY3Rpb24gaXNTdXBwb3J0ZWRQbGF0Zm9ybSgpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBwcm9jZXNzLnBsYXRmb3JtID09PSAnZGFyd2luJyB8fFxuICAgIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInICYmIHByb2Nlc3MuYXJjaCA9PT0gJ3g2NCcpXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZFNob3dEZXNrdG9wVXBzZWxsU3RhcnR1cCgpOiBib29sZWFuIHtcbiAgaWYgKCFpc1N1cHBvcnRlZFBsYXRmb3JtKCkpIHJldHVybiBmYWxzZVxuICBpZiAoIWdldERlc2t0b3BVcHNlbGxDb25maWcoKS5lbmFibGVfc3RhcnR1cF9kaWFsb2cpIHJldHVybiBmYWxzZVxuICBjb25zdCBjb25maWcgPSBnZXRHbG9iYWxDb25maWcoKVxuICBpZiAoY29uZmlnLmRlc2t0b3BVcHNlbGxEaXNtaXNzZWQpIHJldHVybiBmYWxzZVxuICBpZiAoKGNvbmZpZy5kZXNrdG9wVXBzZWxsU2VlbkNvdW50ID8/IDApID49IDMpIHJldHVybiBmYWxzZVxuICByZXR1cm4gdHJ1ZVxufVxuXG50eXBlIERlc2t0b3BVcHNlbGxTZWxlY3Rpb24gPSAndHJ5JyB8ICdub3Qtbm93JyB8ICduZXZlcidcblxudHlwZSBQcm9wcyA9IHtcbiAgb25Eb25lOiAoKSA9PiB2b2lkXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBEZXNrdG9wVXBzZWxsU3RhcnR1cCh7IG9uRG9uZSB9OiBQcm9wcyk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIGNvbnN0IFtzaG93SGFuZG9mZiwgc2V0U2hvd0hhbmRvZmZdID0gdXNlU3RhdGUoZmFsc2UpXG5cbiAgLy8gSW5jcmVtZW50IHNlZW4gY291bnQgb24gbW91bnQgKGd1YXJkIGluIHVwZGF0ZXIgZm9yIFN0cmljdE1vZGUgc2FmZXR5KVxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IG5ld0NvdW50ID0gKGdldEdsb2JhbENvbmZpZygpLmRlc2t0b3BVcHNlbGxTZWVuQ291bnQgPz8gMCkgKyAxXG4gICAgc2F2ZUdsb2JhbENvbmZpZyhwcmV2ID0+IHtcbiAgICAgIGlmICgocHJldi5kZXNrdG9wVXBzZWxsU2VlbkNvdW50ID8/IDApID49IG5ld0NvdW50KSByZXR1cm4gcHJldlxuICAgICAgcmV0dXJuIHsgLi4ucHJldiwgZGVza3RvcFVwc2VsbFNlZW5Db3VudDogbmV3Q291bnQgfVxuICAgIH0pXG4gICAgbG9nRXZlbnQoJ3Rlbmd1X2Rlc2t0b3BfdXBzZWxsX3Nob3duJywgeyBzZWVuX2NvdW50OiBuZXdDb3VudCB9KVxuICB9LCBbXSlcblxuICBpZiAoc2hvd0hhbmRvZmYpIHtcbiAgICByZXR1cm4gPERlc2t0b3BIYW5kb2ZmIG9uRG9uZT17KCkgPT4gb25Eb25lKCl9IC8+XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVTZWxlY3QodmFsdWU6IERlc2t0b3BVcHNlbGxTZWxlY3Rpb24pOiB2b2lkIHtcbiAgICBzd2l0Y2ggKHZhbHVlKSB7XG4gICAgICBjYXNlICd0cnknOlxuICAgICAgICBzZXRTaG93SGFuZG9mZih0cnVlKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ25ldmVyJzpcbiAgICAgICAgc2F2ZUdsb2JhbENvbmZpZyhwcmV2ID0+IHtcbiAgICAgICAgICBpZiAocHJldi5kZXNrdG9wVXBzZWxsRGlzbWlzc2VkKSByZXR1cm4gcHJldlxuICAgICAgICAgIHJldHVybiB7IC4uLnByZXYsIGRlc2t0b3BVcHNlbGxEaXNtaXNzZWQ6IHRydWUgfVxuICAgICAgICB9KVxuICAgICAgICBvbkRvbmUoKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ25vdC1ub3cnOlxuICAgICAgICBvbkRvbmUoKVxuICAgICAgICByZXR1cm5cbiAgICB9XG4gIH1cblxuICBjb25zdCBvcHRpb25zID0gW1xuICAgIHsgbGFiZWw6ICdPcGVuIGluIENsYXVkZSBDb2RlIERlc2t0b3AnLCB2YWx1ZTogJ3RyeScgYXMgY29uc3QgfSxcbiAgICB7IGxhYmVsOiAnTm90IG5vdycsIHZhbHVlOiAnbm90LW5vdycgYXMgY29uc3QgfSxcbiAgICB7IGxhYmVsOiBcIkRvbid0IGFzayBhZ2FpblwiLCB2YWx1ZTogJ25ldmVyJyBhcyBjb25zdCB9LFxuICBdXG5cbiAgcmV0dXJuIChcbiAgICA8UGVybWlzc2lvbkRpYWxvZyB0aXRsZT1cIlRyeSBDbGF1ZGUgQ29kZSBEZXNrdG9wXCI+XG4gICAgICA8Qm94IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIiBwYWRkaW5nWD17Mn0gcGFkZGluZ1k9ezF9PlxuICAgICAgICA8Qm94IG1hcmdpbkJvdHRvbT17MX0+XG4gICAgICAgICAgPFRleHQ+XG4gICAgICAgICAgICBTYW1lIENsYXVkZSBDb2RlIHdpdGggdmlzdWFsIGRpZmZzLCBsaXZlIGFwcCBwcmV2aWV3LCBwYXJhbGxlbFxuICAgICAgICAgICAgc2Vzc2lvbnMsIGFuZCBtb3JlLlxuICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgPC9Cb3g+XG4gICAgICAgIDxTZWxlY3RcbiAgICAgICAgICBvcHRpb25zPXtvcHRpb25zfVxuICAgICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVTZWxlY3R9XG4gICAgICAgICAgb25DYW5jZWw9eygpID0+IGhhbmRsZVNlbGVjdCgnbm90LW5vdycpfVxuICAgICAgICAvPlxuICAgICAgPC9Cb3g+XG4gICAgPC9QZXJtaXNzaW9uRGlhbG9nPlxuICApXG59XG4iXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEtBQUtBLEtBQUssTUFBTSxPQUFPO0FBQzlCLFNBQVNDLFNBQVMsRUFBRUMsUUFBUSxRQUFRLE9BQU87QUFDM0MsU0FBU0MsR0FBRyxFQUFFQyxJQUFJLFFBQVEsY0FBYztBQUN4QyxTQUFTQyxvQ0FBb0MsUUFBUSx3Q0FBd0M7QUFDN0YsU0FBU0MsUUFBUSxRQUFRLG1DQUFtQztBQUM1RCxTQUFTQyxlQUFlLEVBQUVDLGdCQUFnQixRQUFRLHVCQUF1QjtBQUN6RSxTQUFTQyxNQUFNLFFBQVEsMkJBQTJCO0FBQ2xELFNBQVNDLGNBQWMsUUFBUSxzQkFBc0I7QUFDckQsU0FBU0MsZ0JBQWdCLFFBQVEsb0NBQW9DO0FBRXJFLEtBQUtDLG1CQUFtQixHQUFHO0VBQ3pC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