claude-code/components/FeedbackSurvey/FeedbackSurvey.tsx

174 lines
19 KiB
TypeScript
Raw Permalink Normal View History

import { c as _c } from "react/compiler-runtime";
import React from 'react';
import { type AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS, logEvent } from 'src/services/analytics/index.js';
import { Box, Text } from '../../ink.js';
import { FeedbackSurveyView, isValidResponseInput } from './FeedbackSurveyView.js';
import type { TranscriptShareResponse } from './TranscriptSharePrompt.js';
import { TranscriptSharePrompt } from './TranscriptSharePrompt.js';
import { useDebouncedDigitInput } from './useDebouncedDigitInput.js';
import type { FeedbackSurveyResponse } from './utils.js';
type Props = {
state: 'closed' | 'open' | 'thanks' | 'transcript_prompt' | 'submitting' | 'submitted';
lastResponse: FeedbackSurveyResponse | null;
handleSelect: (selected: FeedbackSurveyResponse) => void;
handleTranscriptSelect?: (selected: TranscriptShareResponse) => void;
inputValue: string;
setInputValue: (value: string) => void;
onRequestFeedback?: () => void;
message?: string;
};
export function FeedbackSurvey(t0) {
const $ = _c(16);
const {
state,
lastResponse,
handleSelect,
handleTranscriptSelect,
inputValue,
setInputValue,
onRequestFeedback,
message
} = t0;
if (state === "closed") {
return null;
}
if (state === "thanks") {
let t1;
if ($[0] !== inputValue || $[1] !== lastResponse || $[2] !== onRequestFeedback || $[3] !== setInputValue) {
t1 = <FeedbackSurveyThanks lastResponse={lastResponse} inputValue={inputValue} setInputValue={setInputValue} onRequestFeedback={onRequestFeedback} />;
$[0] = inputValue;
$[1] = lastResponse;
$[2] = onRequestFeedback;
$[3] = setInputValue;
$[4] = t1;
} else {
t1 = $[4];
}
return t1;
}
if (state === "submitted") {
let t1;
if ($[5] === Symbol.for("react.memo_cache_sentinel")) {
t1 = <Box marginTop={1}><Text color="success">{"\u2713"} Thanks for sharing your transcript!</Text></Box>;
$[5] = t1;
} else {
t1 = $[5];
}
return t1;
}
if (state === "submitting") {
let t1;
if ($[6] === Symbol.for("react.memo_cache_sentinel")) {
t1 = <Box marginTop={1}><Text dimColor={true}>Sharing transcript{"\u2026"}</Text></Box>;
$[6] = t1;
} else {
t1 = $[6];
}
return t1;
}
if (state === "transcript_prompt") {
if (!handleTranscriptSelect) {
return null;
}
if (inputValue && !["1", "2", "3"].includes(inputValue)) {
return null;
}
let t1;
if ($[7] !== handleTranscriptSelect || $[8] !== inputValue || $[9] !== setInputValue) {
t1 = <TranscriptSharePrompt onSelect={handleTranscriptSelect} inputValue={inputValue} setInputValue={setInputValue} />;
$[7] = handleTranscriptSelect;
$[8] = inputValue;
$[9] = setInputValue;
$[10] = t1;
} else {
t1 = $[10];
}
return t1;
}
if (inputValue && !isValidResponseInput(inputValue)) {
return null;
}
let t1;
if ($[11] !== handleSelect || $[12] !== inputValue || $[13] !== message || $[14] !== setInputValue) {
t1 = <FeedbackSurveyView onSelect={handleSelect} inputValue={inputValue} setInputValue={setInputValue} message={message} />;
$[11] = handleSelect;
$[12] = inputValue;
$[13] = message;
$[14] = setInputValue;
$[15] = t1;
} else {
t1 = $[15];
}
return t1;
}
type ThanksProps = {
lastResponse: FeedbackSurveyResponse | null;
inputValue: string;
setInputValue: (value: string) => void;
onRequestFeedback?: () => void;
};
const isFollowUpDigit = (char: string): char is '1' => char === '1';
function FeedbackSurveyThanks(t0) {
const $ = _c(12);
const {
lastResponse,
inputValue,
setInputValue,
onRequestFeedback
} = t0;
const showFollowUp = onRequestFeedback && lastResponse === "good";
const t1 = Boolean(showFollowUp);
let t2;
if ($[0] !== lastResponse || $[1] !== onRequestFeedback) {
t2 = () => {
logEvent("tengu_feedback_survey_event", {
event_type: "followup_accepted" as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
response: lastResponse as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS
});
onRequestFeedback?.();
};
$[0] = lastResponse;
$[1] = onRequestFeedback;
$[2] = t2;
} else {
t2 = $[2];
}
let t3;
if ($[3] !== inputValue || $[4] !== setInputValue || $[5] !== t1 || $[6] !== t2) {
t3 = {
inputValue,
setInputValue,
isValidDigit: isFollowUpDigit,
enabled: t1,
once: true,
onDigit: t2
};
$[3] = inputValue;
$[4] = setInputValue;
$[5] = t1;
$[6] = t2;
$[7] = t3;
} else {
t3 = $[7];
}
useDebouncedDigitInput(t3);
const feedbackCommand = false ? "/issue" : "/feedback";
let t4;
if ($[8] === Symbol.for("react.memo_cache_sentinel")) {
t4 = <Text color="success">Thanks for the feedback!</Text>;
$[8] = t4;
} else {
t4 = $[8];
}
let t5;
if ($[9] !== lastResponse || $[10] !== showFollowUp) {
t5 = <Box marginTop={1} flexDirection="column">{t4}{showFollowUp ? <Text dimColor={true}>(Optional) Press [<Text color="ansi:cyan">1</Text>] to tell us what went well {" \xB7 "}{feedbackCommand}</Text> : lastResponse === "bad" ? <Text dimColor={true}>Use /issue to report model behavior issues.</Text> : <Text dimColor={true}>Use {feedbackCommand} to share detailed feedback anytime.</Text>}</Box>;
$[9] = lastResponse;
$[10] = showFollowUp;
$[11] = t5;
} else {
t5 = $[11];
}
return t5;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIkFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMiLCJsb2dFdmVudCIsIkJveCIsIlRleHQiLCJGZWVkYmFja1N1cnZleVZpZXciLCJpc1ZhbGlkUmVzcG9uc2VJbnB1dCIsIlRyYW5zY3JpcHRTaGFyZVJlc3BvbnNlIiwiVHJhbnNjcmlwdFNoYXJlUHJvbXB0IiwidXNlRGVib3VuY2VkRGlnaXRJbnB1dCIsIkZlZWRiYWNrU3VydmV5UmVzcG9uc2UiLCJQcm9wcyIsInN0YXRlIiwibGFzdFJlc3BvbnNlIiwiaGFuZGxlU2VsZWN0Iiwic2VsZWN0ZWQiLCJoYW5kbGVUcmFuc2NyaXB0U2VsZWN0IiwiaW5wdXRWYWx1ZSIsInNldElucHV0VmFsdWUiLCJ2YWx1ZSIsIm9uUmVxdWVzdEZlZWRiYWNrIiwibWVzc2FnZSIsIkZlZWRiYWNrU3VydmV5IiwidDAiLCIkIiwiX2MiLCJ0MSIsIlN5bWJvbCIsImZvciIsImluY2x1ZGVzIiwiVGhhbmtzUHJvcHMiLCJpc0ZvbGxvd1VwRGlnaXQiLCJjaGFyIiwiRmVlZGJhY2tTdXJ2ZXlUaGFua3MiLCJzaG93Rm9sbG93VXAiLCJCb29sZWFuIiwidDIiLCJldmVudF90eXBlIiwicmVzcG9uc2UiLCJ0MyIsImlzVmFsaWREaWdpdCIsImVuYWJsZWQiLCJvbmNlIiwib25EaWdpdCIsImZlZWRiYWNrQ29tbWFuZCIsInQ0IiwidDUiXSwic291cmNlcyI6WyJGZWVkYmFja1N1cnZleS50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHtcbiAgdHlwZSBBbmFseXRpY3NNZXRhZGF0YV9JX1ZFUklGSUVEX1RISVNfSVNfTk9UX0NPREVfT1JfRklMRVBBVEhTLFxuICBsb2dFdmVudCxcbn0gZnJvbSAnc3JjL3NlcnZpY2VzL2FuYWx5dGljcy9pbmRleC5qcydcbmltcG9ydCB7IEJveCwgVGV4dCB9IGZyb20gJy4uLy4uL2luay5qcydcbmltcG9ydCB7XG4gIEZlZWRiYWNrU3VydmV5VmlldyxcbiAgaXNWYWxpZFJlc3BvbnNlSW5wdXQsXG59IGZyb20gJy4vRmVlZGJhY2tTdXJ2ZXlWaWV3LmpzJ1xuaW1wb3J0IHR5cGUgeyBUcmFuc2NyaXB0U2hhcmVSZXNwb25zZSB9IGZyb20gJy4vVHJhbnNjcmlwdFNoYXJlUHJvbXB0LmpzJ1xuaW1wb3J0IHsgVHJhbnNjcmlwdFNoYXJlUHJvbXB0IH0gZnJvbSAnLi9UcmFuc2NyaXB0U2hhcmVQcm9tcHQuanMnXG5pbXBvcnQgeyB1c2VEZWJvdW5jZWREaWdpdElucHV0IH0gZnJvbSAnLi91c2VEZWJvdW5jZWREaWdpdElucHV0LmpzJ1xuaW1wb3J0IHR5cGUgeyBGZWVkYmFja1N1cnZleVJlc3BvbnNlIH0gZnJvbSAnLi91dGlscy5qcydcblxudHlwZSBQcm9wcyA9IHtcbiAgc3RhdGU6XG4gICAgfCAnY2xvc2VkJ1xuICAgIHwgJ29wZW4nXG4gICAgfCAndGhhbmtzJ1xuICAgIHwgJ3RyYW5zY3JpcHRfcHJvbXB0J1xuICAgIHwgJ3N1Ym1pdHRpbmcnXG4gICAgfCAnc3VibWl0dGVkJ1xuICBsYXN0UmVzcG9uc2U6IEZlZWRiYWNrU3VydmV5UmVzcG9uc2UgfCBudWxsXG4gIGhhbmRsZVNlbGVjdDogKHNlbGVjdGVkOiBGZWVkYmFja1N1cnZleVJlc3BvbnNlKSA9PiB2b2lkXG4gIGhhbmRsZVRyYW5zY3JpcHRTZWxlY3Q/OiAoc2VsZWN0ZWQ6IFRyYW5zY3JpcHRTaGFyZVJlc3BvbnNlKSA9PiB2b2lkXG4gIGlucHV0VmFsdWU6IHN0cmluZ1xuICBzZXRJbnB1dFZhbHVlOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZFxuICBvblJlcXVlc3RGZWVkYmFjaz86ICgpID0+IHZvaWRcbiAgbWVzc2FnZT86IHN0cmluZ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gRmVlZGJhY2tTdXJ2ZXkoe1xuICBzdGF0ZSxcbiAgbGFzdFJlc3BvbnNlLFxuICBoYW5kbGVTZWxlY3QsXG4gIGhhbmRsZVRyYW5zY3JpcHRTZWxlY3QsXG4gIGlucHV0VmFsdWUsXG4gIHNldElucHV0VmFsdWUsXG4gIG9uUmVxdWVzdEZlZWRiYWNrLFxuICBtZXNzYWdlLFxufTogUHJvcHMpOiBSZWFjdC5SZWFjdE5vZGUge1xuICBpZiAoc3RhdGUgPT09ICdjbG9zZWQnKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGlmIChzdGF0ZSA9PT0gJ3RoYW5rcycpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEZlZWRiYWNrU3VydmV5VGhhbmtzXG4gICAgICAgIGxhc3RSZXNwb25zZT17bGFzdFJlc3BvbnNlfVxuICAgICAgICBpbnB1dFZhbHVlPXtpbnB1dFZhbHVlfVxuICAgICAgICBzZXRJbnB1dFZhbHVlPXtzZXRJbnB1dFZhbHVlfVxuICAgICAgICBvblJlcXVlc3RGZWVkYmFjaz17b25SZXF1ZXN0RmVlZGJhY2t9XG4gICAgICAvPlxuICAgIClcbiAgfVxuXG4gIGlmIChzdGF0ZSA9PT0gJ3N1Ym1pdHRlZCcpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEJveCBtYXJnaW5Ub3A9ezF9PlxuICAgICAgICA8VGV4dCBjb2xvcj1cInN1Y2Nlc3NcIj5cbiAgICAgICAgICB7J1xcdTI3MTMnfSBUaGFua3MgZm9yIHNoYXJpbmcgeW91ciB0cmFuc2NyaXB0IVxuICAgICAgICA8L1RleHQ+XG4gICAgICA8L0JveD5cbiAgICApXG4gIH1cblxuICBpZiAoc3RhdGUgPT09ICdzdWJtaXR0aW5nJykge1xuICAgIHJldHVybiAoXG4gICAgICA8Qm94IG1hcmdpblRvcD17MX0+XG4gICAgICAgIDxUZXh0IGRpbUNvbG9yPlNoYXJpbmcgdHJhbnNjcmlwdHsnXFx1MjAyNid9PC9UZXh0PlxuICAgICAgPC9Cb3g+XG4gICAgKVxuICB9XG5cbiAgaWYgKHN0YXRlID09PSAndHJhbnNjcmlwdF9wcm9tcHQnKSB7XG4gICAgaWYgKCFoYW5kbGVUcmFuc2NyaXB0U2VsZWN0KSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgICAvLyBIaWRlIHByb21wdCBpZiB1c2VyIGlzIHR5cGluZyBub24tcmVzcG9uc2UgY2hhcmFjdGVyc1xuICAgIGlmIChpbnB1dFZhbHVlICYmICFbJzEnLCAnMicsICczJ10uaW5jbHVkZXMoaW5wdXRWYWx1ZSkpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICA8VHJhbnNjcmlwdFNoYXJlUHJvbXB0XG4gICAgICAgIG9uU2VsZWN0PXtoYW5kbGVUcmFuc2NyaXB0U2VsZWN0fVxuICAgICAgICBpbnB1dFZhbHVlPXtpbnB1dFZhbHVlfVxuICAgICAgICBzZXRJbnB1dFZhbHVlPXtzZXRJbnB1dFZhbHVlfVxuICAgICAgLz5