44 lines · 1.7 KB · TypeScript
RawDownload
import { PROVIDER_SEND_TURN_MAX_INPUT_CHARS } from "@t3tools/contracts"; type ComposerSubmitEvent = { preventDefault: () => void }; type ComposerSubmissionInput = {  prompt: string;  providerInput?: string;  submissionTarget: "provider-turn" | "pending-user-input";}; export function getComposerPromptLengthValidationMessage(prompt: string): string | null {  const excessCharacters = prompt.trim().length - PROVIDER_SEND_TURN_MAX_INPUT_CHARS;  if (excessCharacters <= 0) return null;   const characterLabel = excessCharacters === 1 ? "character" : "characters";  return `Prompt is ${excessCharacters.toLocaleString("en-US")} ${characterLabel} over the ${PROVIDER_SEND_TURN_MAX_INPUT_CHARS.toLocaleString("en-US")}-character limit. Shorten or split it before sending.`;} export function getComposerSubmissionValidationMessage(  options: ComposerSubmissionInput,): string | null {  return options.submissionTarget === "provider-turn"    ? getComposerPromptLengthValidationMessage(options.providerInput ?? options.prompt)    : null;} export function submitComposerDraft(  options: ComposerSubmissionInput & {    event: ComposerSubmitEvent | undefined;    onSend: (event?: ComposerSubmitEvent) => boolean | void;  },): { validationMessage: string | null; didDispatch: boolean } {  const validationMessage = getComposerSubmissionValidationMessage(options);  if (validationMessage) {    options.event?.preventDefault();    return { validationMessage, didDispatch: false };  }   if (options.onSend(options.event) === false) {    options.event?.preventDefault();    return { validationMessage: null, didDispatch: false };  }  return { validationMessage: null, didDispatch: true };}