Filemedium importancesource

DesktopUpsellStartup.tsx

components/DesktopUpsell/DesktopUpsellStartup.tsx

171
Lines
15520
Bytes
3
Exports
10
Imports
10
Keywords

What this is

This page documents one file from the repository and includes its full source so you can read it without leaving the docs site.

Beginner explanation

This file is one piece of the larger system. Its name, directory, imports, and exports show where it fits. Start by reading the exports and related files first.

How it is used

Start from the exports list and related files. Those are the easiest clues for where this file fits into the system.

Expert explanation

Architecturally, this file intersects with ui-flow. It contains 171 lines, 10 detected imports, and 3 detected exports.

Important relationships

  • No related files detected.

Detected exports

  • getDesktopUpsellConfig
  • shouldShowDesktopUpsellStartup
  • DesktopUpsellStartup

Keywords

ondonereactelsehandleselectsymbolmemo_cache_sentinelconfigpermissiondialogdesktopupsellseencountnot-now

Detected imports

  • react/compiler-runtime
  • react
  • react
  • ../../ink.js
  • ../../services/analytics/growthbook.js
  • ../../services/analytics/index.js
  • ../../utils/config.js
  • ../CustomSelect/select.js
  • ../DesktopHandoff.js
  • ../permissions/PermissionDialog.js

Source notes

This page embeds the full file contents. Small or leaf files are still indexed honestly instead of being over-explained.

Open parent directory

Full source

import { c as _c } from "react/compiler-runtime";
import * as React from 'react';
import { useEffect, useState } from 'react';
import { Box, Text } from '../../ink.js';
import { getDynamicConfig_CACHED_MAY_BE_STALE } from '../../services/analytics/growthbook.js';
import { logEvent } from '../../services/analytics/index.js';
import { getGlobalConfig, saveGlobalConfig } from '../../utils/config.js';
import { Select } from '../CustomSelect/select.js';
import { DesktopHandoff } from '../DesktopHandoff.js';
import { PermissionDialog } from '../permissions/PermissionDialog.js';
type DesktopUpsellConfig = {
  enable_shortcut_tip: boolean;
  enable_startup_dialog: boolean;
};
const DESKTOP_UPSELL_DEFAULT: DesktopUpsellConfig = {
  enable_shortcut_tip: false,
  enable_startup_dialog: false
};
export function getDesktopUpsellConfig(): DesktopUpsellConfig {
  return getDynamicConfig_CACHED_MAY_BE_STALE('tengu_desktop_upsell', DESKTOP_UPSELL_DEFAULT);
}
function isSupportedPlatform(): boolean {
  return process.platform === 'darwin' || process.platform === 'win32' && process.arch === 'x64';
}
export function shouldShowDesktopUpsellStartup(): boolean {
  if (!isSupportedPlatform()) return false;
  if (!getDesktopUpsellConfig().enable_startup_dialog) return false;
  const config = getGlobalConfig();
  if (config.desktopUpsellDismissed) return false;
  if ((config.desktopUpsellSeenCount ?? 0) >= 3) return false;
  return true;
}
type DesktopUpsellSelection = 'try' | 'not-now' | 'never';
type Props = {
  onDone: () => void;
};
export function DesktopUpsellStartup(t0) {
  const $ = _c(14);
  const {
    onDone
  } = t0;
  const [showHandoff, setShowHandoff] = useState(false);
  let t1;
  if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
    t1 = [];
    $[0] = t1;
  } else {
    t1 = $[0];
  }
  useEffect(_temp, t1);
  if (showHandoff) {
    let t2;
    if ($[1] !== onDone) {
      t2 = <DesktopHandoff onDone={() => onDone()} />;
      $[1] = onDone;
      $[2] = t2;
    } else {
      t2 = $[2];
    }
    return t2;
  }
  let t2;
  if ($[3] !== onDone) {
    t2 = function handleSelect(value) {
      switch (value) {
        case "try":
          {
            setShowHandoff(true);
            return;
          }
        case "never":
          {
            saveGlobalConfig(_temp2);
            onDone();
            return;
          }
        case "not-now":
          {
            onDone();
            return;
          }
      }
    };
    $[3] = onDone;
    $[4] = t2;
  } else {
    t2 = $[4];
  }
  const handleSelect = t2;
  let t3;
  if ($[5] === Symbol.for("react.memo_cache_sentinel")) {
    t3 = {
      label: "Open in Claude Code Desktop",
      value: "try" as const
    };
    $[5] = t3;
  } else {
    t3 = $[5];
  }
  let t4;
  if ($[6] === Symbol.for("react.memo_cache_sentinel")) {
    t4 = {
      label: "Not now",
      value: "not-now" as const
    };
    $[6] = t4;
  } else {
    t4 = $[6];
  }
  let t5;
  if ($[7] === Symbol.for("react.memo_cache_sentinel")) {
    t5 = [t3, t4, {
      label: "Don't ask again",
      value: "never" as const
    }];
    $[7] = t5;
  } else {
    t5 = $[7];
  }
  const options = t5;
  let t6;
  if ($[8] === Symbol.for("react.memo_cache_sentinel")) {
    t6 = <Box marginBottom={1}><Text>Same Claude Code with visual diffs, live app preview, parallel sessions, and more.</Text></Box>;
    $[8] = t6;
  } else {
    t6 = $[8];
  }
  let t7;
  if ($[9] !== handleSelect) {
    t7 = () => handleSelect("not-now");
    $[9] = handleSelect;
    $[10] = t7;
  } else {
    t7 = $[10];
  }
  let t8;
  if ($[11] !== handleSelect || $[12] !== t7) {
    t8 = <PermissionDialog title="Try Claude Code Desktop"><Box flexDirection="column" paddingX={2} paddingY={1}>{t6}<Select options={options} onChange={handleSelect} onCancel={t7} /></Box></PermissionDialog>;
    $[11] = handleSelect;
    $[12] = t7;
    $[13] = t8;
  } else {
    t8 = $[13];
  }
  return t8;
}
function _temp2(prev_0) {
  if (prev_0.desktopUpsellDismissed) {
    return prev_0;
  }
  return {
    ...prev_0,
    desktopUpsellDismissed: true
  };
}
function _temp() {
  const newCount = (getGlobalConfig().desktopUpsellSeenCount ?? 0) + 1;
  saveGlobalConfig(prev => {
    if ((prev.desktopUpsellSeenCount ?? 0) >= newCount) {
      return prev;
    }
    return {
      ...prev,
      desktopUpsellSeenCount: newCount
    };
  });
  logEvent("tengu_desktop_upsell_shown", {
    seen_count: newCount
  });
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsInVzZUVmZmVjdCIsInVzZVN0YXRlIiwiQm94IiwiVGV4dCIsImdldER5bmFtaWNDb25maWdfQ0FDSEVEX01BWV9CRV9TVEFMRSIsImxvZ0V2ZW50IiwiZ2V0R2xvYmFsQ29uZmlnIiwic2F2ZUdsb2JhbENvbmZpZyIsIlNlbGVjdCIsIkRlc2t0b3BIYW5kb2ZmIiwiUGVybWlzc2lvbkRpYWxvZyIsIkRlc2t0b3BVcHNlbGxDb25maWciLCJlbmFibGVfc2hvcnRjdXRfdGlwIiwiZW5hYmxlX3N0YXJ0dXBfZGlhbG9nIiwiREVTS1RPUF9VUFNFTExfREVGQVVMVCIsImdldERlc2t0b3BVcHNlbGxDb25maWciLCJpc1N1cHBvcnRlZFBsYXRmb3JtIiwicHJvY2VzcyIsInBsYXRmb3JtIiwiYXJjaCIsInNob3VsZFNob3dEZXNrdG9wVXBzZWxsU3RhcnR1cCIsImNvbmZpZyIsImRlc2t0b3BVcHNlbGxEaXNtaXNzZWQiLCJkZXNrdG9wVXBzZWxsU2VlbkNvdW50IiwiRGVza3RvcFVwc2VsbFNlbGVjdGlvbiIsIlByb3BzIiwib25Eb25lIiwiRGVza3RvcFVwc2VsbFN0YXJ0dXAiLCJ0MCIsIiQiLCJfYyIsInNob3dIYW5kb2ZmIiwic2V0U2hvd0hhbmRvZmYiLCJ0MSIsIlN5bWJvbCIsImZvciIsIl90ZW1wIiwidDIiLCJoYW5kbGVTZWxlY3QiLCJ2YWx1ZSIsIl90ZW1wMiIsInQzIiwibGFiZWwiLCJjb25zdCIsInQ0IiwidDUiLCJvcHRpb25zIiwidDYiLCJ0NyIsInQ4IiwicHJldl8wIiwicHJldiIsIm5ld0NvdW50Iiwic2Vlbl9jb3VudCJdLCJzb3VyY2VzIjpbIkRlc2t0b3BVcHNlbGxTdGFydHVwLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IEJveCwgVGV4dCB9IGZyb20gJy4uLy4uL2luay5qcydcbmltcG9ydCB7IGdldER5bmFtaWNDb25maWdfQ0FDSEVEX01BWV9CRV9TVEFMRSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2FuYWx5dGljcy9ncm93dGhib29rLmpzJ1xuaW1wb3J0IHsgbG9nRXZlbnQgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hbmFseXRpY3MvaW5kZXguanMnXG5pbXBvcnQgeyBnZXRHbG9iYWxDb25maWcsIHNhdmVHbG9iYWxDb25maWcgfSBmcm9tICcuLi8uLi91dGlscy9jb25maWcuanMnXG5pbXBvcnQgeyBTZWxlY3QgfSBmcm9tICcuLi9DdXN0b21TZWxlY3Qvc2VsZWN0LmpzJ1xuaW1wb3J0IHsgRGVza3RvcEhhbmRvZmYgfSBmcm9tICcuLi9EZXNrdG9wSGFuZG9mZi5qcydcbmltcG9ydCB7IFBlcm1pc3Npb25EaWFsb2cgfSBmcm9tICcuLi9wZXJtaXNzaW9ucy9QZXJtaXNzaW9uRGlhbG9nLmpzJ1xuXG50eXBlIERlc2t0b3BVcHNlbGxDb25maWcgPSB7XG4gIGVuYWJsZV9zaG9ydGN1dF90aXA6IGJvb2xlYW5cbiAgZW5hYmxlX3N0YXJ0dXBfZGlhbG9nOiBib29sZWFuXG59XG5cbmNvbnN0IERFU0tUT1BfVVBTRUxMX0RFRkFVTFQ6IERlc2t0b3BVcHNlbGxDb25maWcgPSB7XG4gIGVuYWJsZV9zaG9ydGN1dF90aXA6IGZhbHNlLFxuICBlbmFibGVfc3RhcnR1cF9kaWFsb2c6IGZhbHNlLFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVza3RvcFVwc2VsbENvbmZpZygpOiBEZXNrdG9wVXBzZWxsQ29uZmlnIHtcbiAgcmV0dXJuIGdldER5bmFtaWNDb25maWdfQ0FDSEVEX01BWV9CRV9TVEFMRShcbiAgICAndGVuZ3VfZGVza3RvcF91cHNlbGwnLFxuICAgIERFU0tUT1BfVVBTRUxMX0RFRkFVTFQsXG4gIClcbn1cblxuZnVuY3Rpb24gaXNTdXBwb3J0ZWRQbGF0Zm9ybSgpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBwcm9jZXNzLnBsYXRmb3JtID09PSAnZGFyd2luJyB8fFxuICAgIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInICYmIHByb2Nlc3MuYXJjaCA9PT0gJ3g2NCcpXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZFNob3dEZXNrdG9wVXBzZWxsU3RhcnR1cCgpOiBib29sZWFuIHtcbiAgaWYgKCFpc1N1cHBvcnRlZFBsYXRmb3JtKCkpIHJldHVybiBmYWxzZVxuICBpZiAoIWdldERlc2t0b3BVcHNlbGxDb25maWcoKS5lbmFibGVfc3RhcnR1cF9kaWFsb2cpIHJldHVybiBmYWxzZVxuICBjb25zdCBjb25maWcgPSBnZXRHbG9iYWxDb25maWcoKVxuICBpZiAoY29uZmlnLmRlc2t0b3BVcHNlbGxEaXNtaXNzZWQpIHJldHVybiBmYWxzZVxuICBpZiAoKGNvbmZpZy5kZXNrdG9wVXBzZWxsU2VlbkNvdW50ID8/IDApID49IDMpIHJldHVybiBmYWxzZVxuICByZXR1cm4gdHJ1ZVxufVxuXG50eXBlIERlc2t0b3BVcHNlbGxTZWxlY3Rpb24gPSAndHJ5JyB8ICdub3Qtbm93JyB8ICduZXZlcidcblxudHlwZSBQcm9wcyA9IHtcbiAgb25Eb25lOiAoKSA9PiB2b2lkXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBEZXNrdG9wVXBzZWxsU3RhcnR1cCh7IG9uRG9uZSB9OiBQcm9wcyk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIGNvbnN0IFtzaG93SGFuZG9mZiwgc2V0U2hvd0hhbmRvZmZdID0gdXNlU3RhdGUoZmFsc2UpXG5cbiAgLy8gSW5jcmVtZW50IHNlZW4gY291bnQgb24gbW91bnQgKGd1YXJkIGluIHVwZGF0ZXIgZm9yIFN0cmljdE1vZGUgc2FmZXR5KVxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IG5ld0NvdW50ID0gKGdldEdsb2JhbENvbmZpZygpLmRlc2t0b3BVcHNlbGxTZWVuQ291bnQgPz8gMCkgKyAxXG4gICAgc2F2ZUdsb2JhbENvbmZpZyhwcmV2ID0+IHtcbiAgICAgIGlmICgocHJldi5kZXNrdG9wVXBzZWxsU2VlbkNvdW50ID8/IDApID49IG5ld0NvdW50KSByZXR1cm4gcHJldlxuICAgICAgcmV0dXJuIHsgLi4ucHJldiwgZGVza3RvcFVwc2VsbFNlZW5Db3VudDogbmV3Q291bnQgfVxuICAgIH0pXG4gICAgbG9nRXZlbnQoJ3Rlbmd1X2Rlc2t0b3BfdXBzZWxsX3Nob3duJywgeyBzZWVuX2NvdW50OiBuZXdDb3VudCB9KVxuICB9LCBbXSlcblxuICBpZiAoc2hvd0hhbmRvZmYpIHtcbiAgICByZXR1cm4gPERlc2t0b3BIYW5kb2ZmIG9uRG9uZT17KCkgPT4gb25Eb25lKCl9IC8+XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVTZWxlY3QodmFsdWU6IERlc2t0b3BVcHNlbGxTZWxlY3Rpb24pOiB2b2lkIHtcbiAgICBzd2l0Y2ggKHZhbHVlKSB7XG4gICAgICBjYXNlICd0cnknOlxuICAgICAgICBzZXRTaG93SGFuZG9mZih0cnVlKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ25ldmVyJzpcbiAgICAgICAgc2F2ZUdsb2JhbENvbmZpZyhwcmV2ID0+IHtcbiAgICAgICAgICBpZiAocHJldi5kZXNrdG9wVXBzZWxsRGlzbWlzc2VkKSByZXR1cm4gcHJldlxuICAgICAgICAgIHJldHVybiB7IC4uLnByZXYsIGRlc2t0b3BVcHNlbGxEaXNtaXNzZWQ6IHRydWUgfVxuICAgICAgICB9KVxuICAgICAgICBvbkRvbmUoKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ25vdC1ub3cnOlxuICAgICAgICBvbkRvbmUoKVxuICAgICAgICByZXR1cm5cbiAgICB9XG4gIH1cblxuICBjb25zdCBvcHRpb25zID0gW1xuICAgIHsgbGFiZWw6ICdPcGVuIGluIENsYXVkZSBDb2RlIERlc2t0b3AnLCB2YWx1ZTogJ3RyeScgYXMgY29uc3QgfSxcbiAgICB7IGxhYmVsOiAnTm90IG5vdycsIHZhbHVlOiAnbm90LW5vdycgYXMgY29uc3QgfSxcbiAgICB7IGxhYmVsOiBcIkRvbid0IGFzayBhZ2FpblwiLCB2YWx1ZTogJ25ldmVyJyBhcyBjb25zdCB9LFxuICBdXG5cbiAgcmV0dXJuIChcbiAgICA8UGVybWlzc2lvbkRpYWxvZyB0aXRsZT1cIlRyeSBDbGF1ZGUgQ29kZSBEZXNrdG9wXCI+XG4gICAgICA8Qm94IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIiBwYWRkaW5nWD17Mn0gcGFkZGluZ1k9ezF9PlxuICAgICAgICA8Qm94IG1hcmdpbkJvdHRvbT17MX0+XG4gICAgICAgICAgPFRleHQ+XG4gICAgICAgICAgICBTYW1lIENsYXVkZSBDb2RlIHdpdGggdmlzdWFsIGRpZmZzLCBsaXZlIGFwcCBwcmV2aWV3LCBwYXJhbGxlbFxuICAgICAgICAgICAgc2Vzc2lvbnMsIGFuZCBtb3JlLlxuICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgPC9Cb3g+XG4gICAgICAgIDxTZWxlY3RcbiAgICAgICAgICBvcHRpb25zPXtvcHRpb25zfVxuICAgICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVTZWxlY3R9XG4gICAgICAgICAgb25DYW5jZWw9eygpID0+IGhhbmRsZVNlbGVjdCgnbm90LW5vdycpfVxuICAgICAgICAvPlxuICAgICAgPC9Cb3g+XG4gICAgPC9QZXJtaXNzaW9uRGlhbG9nPlxuICApXG59XG4iXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEtBQUtBLEtBQUssTUFBTSxPQUFPO0FBQzlCLFNBQVNDLFNBQVMsRUFBRUMsUUFBUSxRQUFRLE9BQU87QUFDM0MsU0FBU0MsR0FBRyxFQUFFQyxJQUFJLFFBQVEsY0FBYztBQUN4QyxTQUFTQyxvQ0FBb0MsUUFBUSx3Q0FBd0M7QUFDN0YsU0FBU0MsUUFBUSxRQUFRLG1DQUFtQztBQUM1RCxTQUFTQyxlQUFlLEVBQUVDLGdCQUFnQixRQUFRLHVCQUF1QjtBQUN6RSxTQUFTQyxNQUFNLFFBQVEsMkJBQTJCO0FBQ2xELFNBQVNDLGNBQWMsUUFBUSxzQkFBc0I7QUFDckQsU0FBU0MsZ0JBQWdCLFFBQVEsb0NBQW9DO0FBRXJFLEtBQUtDLG1CQUFtQixHQUFHO0VBQ3pC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