πŸ“„ File detail

components/permissions/rules/RecentDenialsTab.tsx

🧩 .tsxπŸ“ 207 linesπŸ’Ύ 18,857 bytesπŸ“ text
← Back to All Files

🎯 Use case

This file lives under β€œcomponents/”, which covers shared React UI pieces. On the API surface it exposes RecentDenialsTab β€” mainly types, interfaces, or factory objects. Dependencies touch React UI. It composes internal code from ink, utils, CustomSelect, and design-system (relative imports).

Generated from folder role, exports, dependency roots, and inline comments β€” not hand-reviewed for every path.

🧠 Inline summary

import { c as _c } from "react/compiler-runtime"; import * as React from 'react'; import { useCallback, useEffect, useState } from 'react'; // eslint-disable-next-line custom-rules/prefer-use-keybindings -- 'r' is a view-specific key, not a global keybinding import { Box, Text, useInput } from '../../../ink.js';

πŸ“€ Exports (heuristic)

  • RecentDenialsTab

πŸ“š External import roots

Package roots from from "…" (relative paths omitted).

  • react

πŸ–₯️ Source preview

import { c as _c } from "react/compiler-runtime";
import * as React from 'react';
import { useCallback, useEffect, useState } from 'react';
// eslint-disable-next-line custom-rules/prefer-use-keybindings -- 'r' is a view-specific key, not a global keybinding
import { Box, Text, useInput } from '../../../ink.js';
import { type AutoModeDenial, getAutoModeDenials } from '../../../utils/autoModeDenials.js';
import { Select } from '../../CustomSelect/select.js';
import { StatusIcon } from '../../design-system/StatusIcon.js';
import { useTabHeaderFocus } from '../../design-system/Tabs.js';
type Props = {
  onHeaderFocusChange?: (focused: boolean) => void;
  /** Called when approved/retry state changes so parent can act on exit */
  onStateChange: (state: {
    approved: Set<number>;
    retry: Set<number>;
    denials: readonly AutoModeDenial[];
  }) => void;
};
export function RecentDenialsTab(t0) {
  const $ = _c(30);
  const {
    onHeaderFocusChange,
    onStateChange
  } = t0;
  const {
    headerFocused,
    focusHeader
  } = useTabHeaderFocus();
  let t1;
  let t2;
  if ($[0] !== headerFocused || $[1] !== onHeaderFocusChange) {
    t1 = () => {
      onHeaderFocusChange?.(headerFocused);
    };
    t2 = [headerFocused, onHeaderFocusChange];
    $[0] = headerFocused;
    $[1] = onHeaderFocusChange;
    $[2] = t1;
    $[3] = t2;
  } else {
    t1 = $[2];
    t2 = $[3];
  }
  useEffect(t1, t2);
  const [denials] = useState(_temp);
  const [approved, setApproved] = useState(_temp2);
  const [retry, setRetry] = useState(_temp3);
  const [focusedIdx, setFocusedIdx] = useState(0);
  let t3;
  let t4;
  if ($[4] !== approved || $[5] !== denials || $[6] !== onStateChange || $[7] !== retry) {
    t3 = () => {
      onStateChange({
        approved,
        retry,
        denials
      });
    };
    t4 = [approved, retry, denials, onStateChange];
    $[4] = approved;
    $[5] = denials;
    $[6] = onStateChange;
    $[7] = retry;
    $[8] = t3;
    $[9] = t4;
  } else {
    t3 = $[8];
    t4 = $[9];
  }
  useEffect(t3, t4);
  let t5;
  if ($[10] === Symbol.for("react.memo_cache_sentinel")) {
    t5 = value => {
      const idx = Number(value);
      setApproved(prev => {
        const next = new Set(prev);
        if (next.has(idx)) {
          next.delete(idx);
        } else {
          next.add(idx);
        }
        return next;
      });
    };
    $[10] = t5;
  } else {
    t5 = $[10];
  }
  const handleSelect = t5;
  let t6;
  if ($[11] === Symbol.for("react.memo_cache_sentinel")) {
    t6 = value_0 => {
      setFocusedIdx(Number(value_0));
    };
    $[11] = t6;
  } else {
    t6 = $[11];
  }
  const handleFocus = t6;
  let t7;
  if ($[12] !== focusedIdx) {
    t7 = (input, _key) => {
      if (input === "r") {
        setRetry(prev_0 => {
          const next_0 = new Set(prev_0);
          if (next_0.has(focusedIdx)) {
            next_0.delete(focusedIdx);
          } else {
            next_0.add(focusedIdx);
          }
          return next_0;
        });
        setApproved(prev_1 => {
          if (prev_1.has(focusedIdx)) {
            return prev_1;
          }
          const next_1 = new Set(prev_1);
          next_1.add(focusedIdx);
          return next_1;
        });
      }
    };
    $[12] = focusedIdx;
    $[13] = t7;
  } else {
    t7 = $[13];
  }
  const t8 = denials.length > 0;
  let t9;
  if ($[14] !== t8) {
    t9 = {
      isActive: t8
    };
    $[14] = t8;
    $[15] = t9;
  } else {
    t9 = $[15];
  }
  useInput(t7, t9);
  if (denials.length === 0) {
    let t10;
    if ($[16] === Symbol.for("react.memo_cache_sentinel")) {
      t10 = <Text dimColor={true}>No recent denials. Commands denied by the auto mode classifier will appear here.</Text>;
      $[16] = t10;
    } else {
      t10 = $[16];
    }
    return t10;
  }
  let t10;
  if ($[17] !== approved || $[18] !== denials || $[19] !== retry) {
    let t11;
    if ($[21] !== approved || $[22] !== retry) {
      t11 = (d, idx_0) => {
        const isApproved = approved.has(idx_0);
        const suffix = retry.has(idx_0) ? " (retry)" : "";
        return {
          label: <Text><StatusIcon status={isApproved ? "success" : "error"} withSpace={true} />{d.display}<Text dimColor={true}>{suffix}</Text></Text>,
          value: String(idx_0)
        };
      };
      $[21] = approved;
      $[22] = retry;
      $[23] = t11;
    } else {
      t11 = $[23];
    }
    t10 = denials.map(t11);
    $[17] = approved;
    $[18] = denials;
    $[19] = retry;
    $[20] = t10;
  } else {
    t10 = $[20];
  }
  const options = t10;
  let t11;
  if ($[24] === Symbol.for("react.memo_cache_sentinel")) {
    t11 = <Text>Commands recently denied by the auto mode classifier.</Text>;
    $[24] = t11;
  } else {
    t11 = $[24];
  }
  const t12 = Math.min(10, options.length);
  let t13;
  if ($[25] !== focusHeader || $[26] !== headerFocused || $[27] !== options || $[28] !== t12) {
    t13 = <Box flexDirection="column">{t11}<Box marginTop={1}><Select options={options} onChange={handleSelect} onFocus={handleFocus} visibleOptionCount={t12} isDisabled={headerFocused} onUpFromFirstItem={focusHeader} /></Box></Box>;
    $[25] = focusHeader;
    $[26] = headerFocused;
    $[27] = options;
    $[28] = t12;
    $[29] = t13;
  } else {
    t13 = $[29];
  }
  return t13;
}
function _temp3() {
  return new Set();
}
function _temp2() {
  return new Set();
}
function _temp() {
  return getAutoModeDenials();
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsInVzZUNhbGxiYWNrIiwidXNlRWZmZWN0IiwidXNlU3RhdGUiLCJCb3giLCJUZXh0IiwidXNlSW5wdXQiLCJBdXRvTW9kZURlbmlhbCIsImdldEF1dG9Nb2RlRGVuaWFscyIsIlNlbGVjdCIsIlN0YXR1c0ljb24iLCJ1c2VUYWJIZWFkZXJGb2N1cyIsIlByb3BzIiwib25IZWFkZXJGb2N1c0NoYW5nZSIsImZvY3VzZWQiLCJvblN0YXRlQ2hhbmdlIiwic3RhdGUiLCJhcHByb3ZlZCIsIlNldCIsInJldHJ5IiwiZGVuaWFscyIsIlJlY2VudERlbmlhbHNUYWIiLCJ0MCIsIiQiLCJfYyIsImhlYWRlckZvY3VzZWQiLCJmb2N1c0hlYWRlciIsInQxIiwidDIiLCJfdGVtcCIsInNldEFwcHJvdmVkIiwiX3RlbXAyIiwic2V0UmV0cnkiLCJfdGVtcDMiLCJmb2N1c2VkSWR4Iiwic2V0Rm9jdXNlZElkeCIsInQzIiwidDQiLCJ0NSIsIlN5bWJvbCIsImZvciIsInZhbHVlIiwiaWR4IiwiTnVtYmVyIiwicHJldiIsIm5leHQiLCJoYXMiLCJkZWxldGUiLCJhZGQiLCJoYW5kbGVTZWxlY3QiLCJ0NiIsInZhbHVlXzAiLCJoYW5kbGVGb2N1cyIsInQ3IiwiaW5wdXQiLCJfa2V5IiwicHJldl8wIiwibmV4dF8wIiwicHJldl8xIiwibmV4dF8xIiwidDgiLCJsZW5ndGgiLCJ0OSIsImlzQWN0aXZlIiwidDEwIiwidDExIiwiZCIsImlkeF8wIiwiaXNBcHByb3ZlZCIsInN1ZmZpeCIsImxhYmVsIiwiZGlzcGxheSIsIlN0cmluZyIsIm1hcCIsIm9wdGlvbnMiLCJ0MTIiLCJNYXRoIiwibWluIiwidDEzIl0sInNvdXJjZXMiOlsiUmVjZW50RGVuaWFsc1RhYi50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyB1c2VDYWxsYmFjaywgdXNlRWZmZWN0LCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0J1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGN1c3RvbS1ydWxlcy9wcmVmZXItdXNlLWtleWJpbmRpbmdzIC0tICdyJyBpcyBhIHZpZXctc3BlY2lmaWMga2V5LCBub3QgYSBnbG9iYWwga2V5YmluZGluZ1xuaW1wb3J0IHsgQm94LCBUZXh0LCB1c2VJbnB1dCB9IGZyb20gJy4uLy4uLy4uL2luay5qcydcbmltcG9ydCB7XG4gIHR5cGUgQXV0b01vZGVEZW5pYWwsXG4gIGdldEF1dG9Nb2RlRGVuaWFscyxcbn0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvYXV0b01vZGVEZW5pYWxzLmpzJ1xuaW1wb3J0IHsgU2VsZWN0IH0gZnJvbSAnLi4vLi4vQ3VzdG9tU2VsZWN0L3NlbGVjdC5qcydcbmltcG9ydCB7IFN0YXR1c0ljb24gfSBmcm9tICcuLi8uLi9kZXNpZ24tc3lzdGVtL1N0YXR1c0ljb24uanMnXG5pbXBvcnQgeyB1c2VUYWJIZWFkZXJGb2N1cyB9IGZyb20gJy4uLy4uL2Rlc2lnbi1zeXN0ZW0vVGFicy5qcydcblxudHlwZSBQcm9wcyA9IHtcbiAgb25IZWFkZXJGb2N1c0NoYW5nZT86IChmb2N1c2VkOiBib29sZWFuKSA9PiB2b2lkXG4gIC8qKiBDYWxsZWQgd2hlbiBhcHByb3ZlZC9yZXRyeSBzdGF0ZSBjaGFuZ2VzIHNvIHBhcmVudCBjYW4gYWN0IG9uIGV4aXQgKi9cbiAgb25TdGF0ZUNoYW5nZTogKHN0YXRlOiB7XG4gICAgYXBwcm92ZWQ6IFNldDxudW1iZXI+XG4gICAgcmV0cnk6IFNldDxudW1iZXI+XG4gICAgZGVuaWFsczogcmVhZG9ubHkgQXV0b01vZGVEZW5pYWxbXVxuICB9KSA9PiB2b2lkXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBSZWNlbnREZW5pYWxzVGFiKHtcbiAgb25IZWFkZXJGb2N1c0NoYW5nZSxcbiAgb25TdGF0ZUNoYW5nZSxcbn06IFByb3BzKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgY29uc3QgeyBoZWFkZXJGb2N1c2VkLCBmb2N1c0hlYWRlciB9ID0gdXNlVGFiSGVhZGVyRm9jdXMoKVxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIG9uSGVhZGVyRm9jdXNDaGFuZ2U/LihoZWFkZXJGb2N1c2VkKVxuICB9LCBbaGVhZGVyRm9jdXNlZCwgb25IZWFkZXJGb2N1c0NoYW5nZV0pXG5cbiAgLy8gU25hcHNob3Qgb24gbW91bnQg4oCUIGFwcHJvdmVkL3JldHJ5IFNldHMga2V5IGJ5IGluZGV4LCBhbmQgdGhlIGxpdmUgc3RvcmVcbiAgLy8gcHJlcGVuZHMuIEEgY29uY3VycmVudCBkZW5pYWwgd291bGQgc2hpZnQgYWxsIGluZGljZXMgbWlkLWVkaXQuXG4gIGNvbnN0IFtkZW5pYWxzXSA9IHVzZVN0YXRlKCgpID0+IGdldEF1dG9Nb2RlRGVuaWFscygpKVxuXG4gIGNvbnN0IFthcHByb3ZlZCwgc2V0QXBwcm92ZWRdID0gdXNlU3RhdGU8U2V0PG51bWJlcj4+KCgpID0+IG5ldyBTZXQoKSlcbiAgY29uc3QgW3JldHJ5LCBzZXRSZXRyeV0gPSB1c2VTdGF0ZTxTZXQ8bnVtYmVyPj4oKCkgPT4gbmV3IFNldCgpKVxuICBjb25zdCBbZm9jdXNlZElkeCwgc2V0Rm9jdXNlZElkeF0gPSB1c2VTdGF0ZSgwKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgb25TdGF0ZUNoYW5nZSh7IGFwcHJvdmVkLCByZXRyeSwgZGVuaWFscyB9KVxuICB9LCBbYXBwcm92ZWQsIHJldHJ5LCBkZW5pYWxzLCBvblN0YXRlQ2hhbmdlXSlcblxuICBjb25zdCBoYW5kbGVTZWxlY3QgPSB1c2VDYWxsYmFjaygodmFsdWU6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IGlkeCA9IE51bWJlcih2YWx1ZSlcbiAgICBzZXRBcHByb3ZlZChwcmV2ID0+IHtcbiAgICAgIGNvbnN0IG5leHQgPSBuZXcgU2V0KHByZXYpXG4gICAgICBpZiAobmV4dC5oYXMoaWR4KSkgbmV4dC5kZWxldGUoaWR4KVxuICAgICAgZWxzZSBuZXh0LmFkZChpZHgpXG4gICAgICByZXR1cm4gbmV4dFxuICAgIH0pXG4gIH0sIFtdKVxuXG4gIGNvbnN0IGhhbmRsZUZvY3VzID0gdXNlQ2FsbGJhY2soKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICBzZXRGb2N1c2VkSWR4KE51bWJlcih2YWx1ZSkpXG4gIH0sIFtdKVxuXG4gIHVzZUlucHV0KFxuICAgIChpbnB1dCwgX2tleSkgPT4ge1xuICAgICAgaWYgKGlucHV0ID09PSAncicpIHtcbiAgICAgICAgc2V0UmV0cnkocHJldiA9PiB7XG4gICAgICAgICAgY29uc3QgbmV4dCA9IG5ldyBTZXQocHJldilcbiAgICAgICAgICBpZiAobmV4dC5oYXMoZm9jdXNlZElkeCkpIG5leHQuZGVsZXRlKGZvY3VzZWRJZHgpXG4gICAgICAgICAgZWxzZSBuZXh0LmFkZChmb2N1c2VkSWR4KVxuICAgICAgICAgIHJldHVybiBuZXh0XG4gICAgICAgIH0pXG4gICAgICAgIC8vIFJldHJ5IGltcGxpZXMgYXBwcm92ZVxuICAgICAgICBzZXRBcHByb3ZlZChwcmV2ID0+IHtcbiAgICAgICAgICBpZiAocHJldi5oYXMoZm9jdXNlZElkeCkpIHJldHVybiBwcmV2XG4gICAgICAgICAgY29uc3QgbmV4dCA9IG5ldyBTZXQocHJldilcbiAgICAgICAgICBuZXh0LmFkZChmb2N1c2VkSWR4KVxuICAgICAgICAgIHJldHVybiBuZXh0XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSxcbiAgICB7IGlzQWN0aXZlOiBkZW5pYWxzLmxlbmd0aCA+IDAgfSxcbiAgKVxuXG4gIGlmIChkZW5pYWxzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAoXG4gICAgICA8VGV4dCBkaW1Db2xvcj5cbiAgICAgICAgTm8gcmVjZW50IGRlbmlhbHMuIENvbW1hbmRzIGRlbmllZCBieSB0aGUgYXV0byBtb2RlIGNsYXNzaWZpZXIgd2lsbFxuICAgICAgICBhcHBlYXIgaGVyZS5cbiAgICAgIDwvVGV4dD5cbiAgICApXG4gIH1cblxuICBjb25zdCBvcHRpb25zID0gZGVuaWFscy5tYXAoKGQsIGlkeCkgPT4ge1xuICAgIGNvbnN0IGlzQXBwcm92ZWQgPSBhcHByb3ZlZC5oYXMoaWR4KVxuICAgIGNvbnN0IHN1ZmZpeCA9IHJldHJ5LmhhcyhpZHgpID8gJyAocmV0cnkpJyA6ICcnXG4gICAgcmV0dXJuIHtcbiAgICAgIGxhYmVsOiAoXG4gICAgICAgIDxUZXh0PlxuICAgICAgICAgIDxTdGF0dXNJY29uIHN0YXR1cz17aXNBcHByb3ZlZCA/ICdzdWNjZXNzJyA6ICdlcnJvcid9IHdpdGhTcGFjZSAvPlxuICAgICAgICAgIHtkLmRpc3BsYXl9XG4gICAgICAgICAgPFRleHQgZGltQ29sb3I+e3N1ZmZpeH08L1RleHQ+XG4gICAgICAgIDwvVGV4dD5cbiAgICAgICksXG4gICAgICB2YWx1ZTogU3RyaW5nKGlkeCksXG4gICAgfVxuICB9KVxuXG4gIHJldHVybiAoXG4gICAgPEJveCBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCI+XG4gICAgICA8VGV4dD5Db21tYW5kcyByZWNlbnRseSBkZW5pZWQgYnkgdGhlIGF1dG8gbW9kZSBjbGFzc2lmaWVyLjwvVGV4dD5cbiAgICAgIDxCb3ggbWFyZ2luVG9wPXsxfT5cbiAgICAgICAgPFNlbGVjdFxuICAgICAgICAgIG9wdGlvbnM9e29wdGlvbnN9XG4gICAgICAgICAgb25DaGFuZ2U9e2hhbmRsZVNlbGVjdH1cbiAgICAgICAgICBvbkZvY3VzPXtoYW5kbGVGb2N1c31cbiAgICAgICAgICB2aXNpYmxlT3B0aW9uQ291bnQ9e01hdGgubWluKDEwLCBvcHRpb25zLmxlbmd0aCl9XG4gICAgICAgICAgaXNEaXNhYmxlZD17aGVhZGVyRm9jdXNlZH1cbiAgICAgICAgICBvblVwRnJvbUZpcnN0SXRlbT17Zm9jdXNIZWFkZXJ9XG4gICAgICAgIC8+XG4gICAgICA8L0JveD5cbiAgICA8L0JveD5cbiAgKVxufVxuIl0sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxLQUFLQSxLQUFLLE1BQU0sT0FBTztBQUM5QixTQUFTQyxXQUFXLEVBQUVDLFNBQVMsRUFBRUMsUUFBUSxRQUFRLE9BQU87QUFD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