{"version":3,"file":"interface.mjs","sourceRoot":"","sources":["../src/interface.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SnapInterfaceControllerState } from '@metamask/snaps-controllers';\nimport type { DialogApprovalTypes } from '@metamask/snaps-rpc-methods';\nimport { DIALOG_APPROVAL_TYPES } from '@metamask/snaps-rpc-methods';\nimport type {\n  FormState,\n  InterfaceContext,\n  InterfaceState,\n  SnapId,\n  UserInputEvent,\n  File,\n  AccountSelectorState,\n  AssetSelectorState,\n  CaipAssetType,\n} from '@metamask/snaps-sdk';\nimport { DialogType, UserInputEventType, assert } from '@metamask/snaps-sdk';\nimport type {\n  FooterElement,\n  FormElement,\n  JSXElement,\n} from '@metamask/snaps-sdk/jsx';\nimport {\n  HandlerType,\n  createAccountList,\n  createChainIdList,\n  getJsxChildren,\n  unwrapError,\n  walkJsx,\n} from '@metamask/snaps-utils';\nimport {\n  assertExhaustive,\n  hasProperty,\n  parseCaipAccountId,\n} from '@metamask/utils';\nimport type { PayloadAction } from '@reduxjs/toolkit';\nimport deepEqual from 'fast-deep-equal';\nimport { type SagaIterator } from 'redux-saga';\nimport { call, put, select, take } from 'redux-saga/effects';\n\nimport { TYPEABLE_INPUTS } from './constants';\nimport type { RootControllerMessenger } from './controllers';\nimport { getFileSize, getFileToUpload } from './files';\nimport type { SimulationOptions } from './options';\nimport type { Interface, RunSagaFunction } from './store';\nimport { getCurrentInterface, resolveInterface, setInterface } from './store';\nimport type {\n  FileOptions,\n  SnapHandlerInterface,\n  SnapInterface,\n  SnapInterfaceActions,\n} from './types';\nimport { formatTypeErrorMessage } from './utils/errors';\n\n/**\n * The maximum file size that can be uploaded.\n */\nconst MAX_FILE_SIZE = 10_000_000; // 10 MB\n\n/**\n * The elements based on the Selector component.\n */\nconst SELECTOR_ELEMENTS = ['Selector', 'AccountSelector', 'AssetSelector'];\n\n/**\n * Get a user interface object from a type and content object.\n *\n * @param runSaga - A function to run a saga outside the usual Redux flow.\n * @param type - The type of the interface.\n * @param id - The interface ID.\n * @param content - The content to show in the interface.\n * @param interfaceActions - The actions to interact with the interface.\n * @returns The user interface object.\n */\nexport function getInterfaceResponse(\n  runSaga: RunSagaFunction,\n  type: DialogApprovalTypes[DialogType | 'default'] | 'Notification',\n  id: string,\n  content: JSXElement,\n  interfaceActions: SnapInterfaceActions,\n): SnapInterface {\n  switch (type) {\n    case DIALOG_APPROVAL_TYPES[DialogType.Alert]:\n      return {\n        ...interfaceActions,\n        type: DialogType.Alert,\n        content,\n        id,\n\n        ok: resolveWith(runSaga, null),\n      };\n\n    case DIALOG_APPROVAL_TYPES[DialogType.Confirmation]:\n      return {\n        ...interfaceActions,\n        type: DialogType.Confirmation,\n        content,\n        id,\n\n        ok: resolveWith(runSaga, true),\n        cancel: resolveWith(runSaga, false),\n      };\n\n    case DIALOG_APPROVAL_TYPES[DialogType.Prompt]:\n      return {\n        ...interfaceActions,\n        type: DialogType.Prompt,\n        content,\n        id,\n\n        ok: resolveWithInput(runSaga),\n        cancel: resolveWith(runSaga, null),\n      };\n\n    case DIALOG_APPROVAL_TYPES.default: {\n      const footer = getElementByType<FooterElement>(content, 'Footer');\n\n      // No Footer defined so we apply a default footer.\n      if (!footer) {\n        return {\n          ...interfaceActions,\n          content,\n          id,\n\n          ok: resolveWith(runSaga, null),\n          cancel: resolveWith(runSaga, null),\n        };\n      }\n\n      // Only one button in footer so we apply a default cancel button.\n      if (getJsxChildren(footer).length === 1) {\n        return {\n          ...interfaceActions,\n          content,\n          id,\n\n          cancel: resolveWith(runSaga, null),\n        };\n      }\n\n      // We have two buttons in the footer so we assume the snap handles the approval of the interface.\n      return {\n        ...interfaceActions,\n        content,\n        id,\n      };\n    }\n\n    case 'Notification': {\n      return {\n        ...interfaceActions,\n        content,\n        id,\n      };\n    }\n\n    default:\n      throw new Error(`Unknown or unsupported dialog type: \"${String(type)}\".`);\n  }\n}\n\n/**\n * Resolve the current user interface with the given value.\n *\n * @param value - The value to resolve the user interface with.\n * @yields Puts the resolve user interface action.\n */\nexport function* resolveWithSaga(value: unknown): SagaIterator {\n  yield put(resolveInterface(value));\n}\n\n/**\n * Resolve the current user interface with the given value. This returns a\n * function that can be used to resolve the user interface.\n *\n * @param runSaga - A function to run a saga outside the usual Redux flow.\n * @param value - The value to resolve the user interface with.\n * @returns A function that can be used to resolve the user interface.\n */\nfunction resolveWith(runSaga: RunSagaFunction, value: unknown) {\n  return async () => {\n    await runSaga(resolveWithSaga, value).toPromise();\n  };\n}\n\n/**\n * Resolve the current user interface with the provided input. This returns a\n * function that can be used to resolve the user interface.\n *\n * @param runSaga - A function to run a saga outside the usual Redux flow.\n * @returns A function that can be used to resolve the user interface.\n */\nfunction resolveWithInput(runSaga: RunSagaFunction) {\n  return async (value = '') => {\n    await runSaga(resolveWithSaga, value).toPromise();\n  };\n}\n\n/**\n * Get the stored user interface from the store.\n *\n * @param controllerMessenger - The controller messenger used to call actions.\n * @param snapId - The Snap ID.\n * @yields Takes the set interface action.\n * @returns The user interface object.\n */\nfunction* getStoredInterface(\n  controllerMessenger: RootControllerMessenger,\n  snapId: SnapId,\n): SagaIterator<Interface & { content: JSXElement }> {\n  const currentInterface: Interface | null = yield select(getCurrentInterface);\n\n  if (currentInterface) {\n    const { content } = controllerMessenger.call(\n      'SnapInterfaceController:getInterface',\n      snapId,\n      currentInterface.id,\n    );\n\n    return { ...currentInterface, content };\n  }\n\n  const { payload }: PayloadAction<Interface> = yield take(setInterface.type);\n  const { content } = controllerMessenger.call(\n    'SnapInterfaceController:getInterface',\n    snapId,\n    payload.id,\n  );\n\n  return { ...payload, content };\n}\n\n/**\n * A JSX element with a name.\n */\nexport type NamedJSXElement = JSXElement & { props: { name: string } };\n\n/**\n * Check if a JSX element is a JSX element with a given name.\n *\n * @param element - The JSX element.\n * @param name - The element name.\n * @returns True if the element is a JSX element with the given name, otherwise\n * false.\n */\nfunction isJSXElementWithName<Element extends JSXElement, Name extends string>(\n  element: Element,\n  name: Name,\n): element is Element & { props: { name: Name } } {\n  return hasProperty(element.props, 'name') && element.props.name === name;\n}\n\n/**\n * Find an element inside a form element in a JSX tree.\n *\n * @param form - The form element.\n * @param name - The element name.\n * @returns An object containing the element and the form name if it's contained\n * in a form, otherwise undefined.\n */\nfunction getFormElement(form: FormElement, name: string) {\n  const element = walkJsx<NamedJSXElement>(form, (childElement) => {\n    if (isJSXElementWithName(childElement, name)) {\n      return childElement;\n    }\n\n    return undefined;\n  });\n\n  if (element === undefined) {\n    return undefined;\n  }\n\n  return { element, form: form.props.name };\n}\n\n/**\n * Get an object containing the element, and optional form that's associated\n * with the element if any.\n *\n * @param element - The JSX element.\n * @returns An object containing the element and optional form.\n */\nfunction getElementWithOptionalForm(element: NamedJSXElement): {\n  element: NamedJSXElement;\n  form?: string;\n} {\n  if (element.type !== 'Button' || !element.props.form) {\n    return { element };\n  }\n\n  return { element, form: element.props.form };\n}\n\n/**\n * Get an element from a JSX tree with the given name.\n *\n * @param content - The interface content.\n * @param name - The element name.\n * @returns An object containing the element and the form name if it's contained\n * in a form, otherwise undefined.\n */\nexport function getElement(\n  content: JSXElement,\n  name: string,\n):\n  | {\n      element: NamedJSXElement;\n      form?: string;\n    }\n  | undefined {\n  if (isJSXElementWithName(content, name)) {\n    return getElementWithOptionalForm(content);\n  }\n\n  return walkJsx(content, (element) => {\n    if (element.type === 'Form') {\n      return getFormElement(element, name);\n    }\n\n    if (isJSXElementWithName(element, name)) {\n      return getElementWithOptionalForm(element);\n    }\n\n    return undefined;\n  });\n}\n\n/**\n * Get an element from a JSX tree with the given type.\n *\n * @param content - The interface content.\n * @param type - The element type.\n * @returns The element with the given type.\n */\nexport function getElementByType<Element extends JSXElement>(\n  content: JSXElement,\n  type: string,\n) {\n  return walkJsx(content, (element) => {\n    if (element.type === type) {\n      return element as Element;\n    }\n\n    return undefined;\n  });\n}\n\n/**\n * Handle submitting event requests to OnUserInput including unwrapping potential errors.\n *\n * @param controllerMessenger - The controller messenger used to call actions.\n * @param snapId - The Snap ID.\n * @param id - The interface ID.\n * @param event - The event to submit.\n * @param context - The interface context.\n */\nasync function handleEvent(\n  controllerMessenger: RootControllerMessenger,\n  snapId: SnapId,\n  id: string,\n  event: UserInputEvent,\n  context: InterfaceContext | null,\n) {\n  try {\n    await controllerMessenger.call(\n      'ExecutionService:handleRpcRequest',\n      snapId,\n      {\n        origin: 'metamask',\n        handler: HandlerType.OnUserInput,\n        request: {\n          jsonrpc: '2.0',\n          method: ' ',\n          params: {\n            event,\n            id,\n            context,\n          },\n        },\n      },\n    );\n  } catch (error) {\n    const [unwrapped] = unwrapError(error);\n    throw unwrapped;\n  }\n}\n\n/**\n * Click on an element of the Snap interface.\n *\n * @param controllerMessenger - The controller messenger used to call actions.\n * @param id - The interface ID.\n * @param content - The interface content.\n * @param snapId - The Snap ID.\n * @param name - The element name.\n */\nexport async function clickElement(\n  controllerMessenger: RootControllerMessenger,\n  id: string,\n  content: JSXElement,\n  snapId: SnapId,\n  name: string,\n): Promise<void> {\n  const result = getElement(content, name);\n  assert(\n    result !== undefined,\n    `Could not find an element in the interface with the name \"${name}\".`,\n  );\n\n  assert(\n    result.element.type === 'Button' || result.element.type === 'Checkbox',\n    `Expected an element of type \"Button\" or \"Checkbox\", but found \"${result.element.type}\".`,\n  );\n\n  const { state, context } = controllerMessenger.call(\n    'SnapInterfaceController:getInterface',\n    snapId,\n    id,\n  );\n\n  const { type } = result.element;\n  const elementName = result.element.props.name;\n\n  const formState = (result.form ? state[result.form] : state) as FormState;\n  const currentValue = formState[elementName];\n\n  switch (type) {\n    case 'Button': {\n      // Button click events are always triggered.\n      await handleEvent(\n        controllerMessenger,\n        snapId,\n        id,\n        {\n          type: UserInputEventType.ButtonClickEvent,\n          name: elementName,\n        },\n        context,\n      );\n\n      if (result.form && result.element.props.type === 'submit') {\n        await handleEvent(\n          controllerMessenger,\n          snapId,\n          id,\n          {\n            type: UserInputEventType.FormSubmitEvent,\n            name: result.form,\n            value: state[result.form] as FormState,\n          },\n          context,\n        );\n      }\n      break;\n    }\n\n    case 'Checkbox': {\n      const newValue = !currentValue;\n      const newState = mergeValue(state, name, newValue, result.form);\n\n      controllerMessenger.call(\n        'SnapInterfaceController:updateInterfaceState',\n        id,\n        newState,\n      );\n\n      await handleEvent(\n        controllerMessenger,\n        snapId,\n        id,\n        {\n          type: UserInputEventType.InputChangeEvent,\n          name: elementName,\n          value: newValue,\n        },\n        context,\n      );\n      break;\n    }\n\n    /* istanbul ignore next */\n    default:\n      assertExhaustive(type);\n  }\n}\n\n/**\n * Merge a value in the interface state.\n *\n * @param state - The actual interface state.\n * @param name - The component name that changed value.\n * @param value - The new value.\n * @param form - The form name if the element is in one.\n * @returns The state with the merged value.\n */\nexport function mergeValue(\n  state: InterfaceState,\n  name: string,\n  value:\n    | string\n    | File\n    | boolean\n    | AccountSelectorState\n    | AssetSelectorState\n    | null,\n  form?: string,\n): InterfaceState {\n  if (form) {\n    return {\n      ...state,\n      [form]: {\n        ...(state[form] as FormState),\n        [name]: value,\n      },\n    };\n  }\n\n  return { ...state, [name]: value };\n}\n\n/**\n * Process the input value for an input element based on the element type.\n *\n * @param value - The original input value.\n * @param element - The interface element.\n * @returns The processed value.\n */\nfunction processInputValue(value: string, element: NamedJSXElement): string {\n  if (element.type === 'AddressInput') {\n    const { chainId } = element.props;\n    return `${chainId}:${value}`;\n  }\n\n  return value;\n}\n\n/**\n * Type a value in an interface element.\n *\n * @param controllerMessenger - The controller messenger used to call actions.\n * @param id - The interface ID.\n * @param content - The interface Components.\n * @param snapId - The Snap ID.\n * @param name - The element name.\n * @param value - The value to type in the element.\n */\nexport async function typeInField(\n  controllerMessenger: RootControllerMessenger,\n  id: string,\n  content: JSXElement,\n  snapId: SnapId,\n  name: string,\n  value: string,\n) {\n  const result = getElement(content, name);\n\n  assert(\n    result !== undefined,\n    `Could not find an element in the interface with the name \"${name}\".`,\n  );\n\n  assert(\n    TYPEABLE_INPUTS.includes(result.element.type),\n    `Expected an element of type ${formatTypeErrorMessage(TYPEABLE_INPUTS)}, but found \"${result.element.type}\".`,\n  );\n\n  const newValue = processInputValue(value, result.element);\n\n  const { state, context } = controllerMessenger.call(\n    'SnapInterfaceController:getInterface',\n    snapId,\n    id,\n  );\n\n  const newState = mergeValue(state, name, newValue, result.form);\n\n  controllerMessenger.call(\n    'SnapInterfaceController:updateInterfaceState',\n    id,\n    newState,\n  );\n\n  await controllerMessenger.call('ExecutionService:handleRpcRequest', snapId, {\n    origin: 'metamask',\n    handler: HandlerType.OnUserInput,\n    request: {\n      jsonrpc: '2.0',\n      method: ' ',\n      params: {\n        event: {\n          type: UserInputEventType.InputChangeEvent,\n          name: result.element.props.name,\n          value: newValue,\n        },\n        id,\n        context,\n      },\n    },\n  });\n}\n\n/**\n * Type a value in an interface element.\n *\n * @param controllerMessenger - The controller messenger used to call actions.\n * @param id - The interface ID.\n * @param content - The interface Components.\n * @param snapId - The Snap ID.\n * @param name - The element name.\n * @param value - The value to type in the element.\n */\nexport async function selectInDropdown(\n  controllerMessenger: RootControllerMessenger,\n  id: string,\n  content: JSXElement,\n  snapId: SnapId,\n  name: string,\n  value: string,\n) {\n  const result = getElement(content, name);\n\n  assert(\n    result !== undefined,\n    `Could not find an element in the interface with the name \"${name}\".`,\n  );\n\n  assert(\n    result.element.type === 'Dropdown',\n    `Expected an element of type \"Dropdown\", but found \"${result.element.type}\".`,\n  );\n\n  const options = getJsxChildren(result.element) as JSXElement[];\n  const selectedOption = options.find(\n    (option) =>\n      hasProperty(option.props, 'value') && option.props.value === value,\n  );\n\n  assert(\n    selectedOption !== undefined,\n    `The dropdown with the name \"${name}\" does not contain \"${value}\".`,\n  );\n\n  const { state, context } = controllerMessenger.call(\n    'SnapInterfaceController:getInterface',\n    snapId,\n    id,\n  );\n\n  const newState = mergeValue(state, name, value, result.form);\n\n  controllerMessenger.call(\n    'SnapInterfaceController:updateInterfaceState',\n    id,\n    newState,\n  );\n\n  await controllerMessenger.call('ExecutionService:handleRpcRequest', snapId, {\n    origin: 'metamask',\n    handler: HandlerType.OnUserInput,\n    request: {\n      jsonrpc: '2.0',\n      method: ' ',\n      params: {\n        event: {\n          type: UserInputEventType.InputChangeEvent,\n          name: result.element.props.name,\n          value,\n        },\n        id,\n        context,\n      },\n    },\n  });\n}\n\n/**\n * Choose an option with value from radio group interface element.\n *\n * @param controllerMessenger - The controller messenger used to call actions.\n * @param id - The interface ID.\n * @param content - The interface Components.\n * @param snapId - The Snap ID.\n * @param name - The element name.\n * @param value - The value to type in the element.\n */\nexport async function selectFromRadioGroup(\n  controllerMessenger: RootControllerMessenger,\n  id: string,\n  content: JSXElement,\n  snapId: SnapId,\n  name: string,\n  value: string,\n) {\n  const result = getElement(content, name);\n\n  assert(\n    result !== undefined,\n    `Could not find an element in the interface with the name \"${name}\".`,\n  );\n\n  assert(\n    result.element.type === 'RadioGroup',\n    `Expected an element of type \"RadioGroup\", but found \"${result.element.type}\".`,\n  );\n\n  const options = getJsxChildren(result.element) as JSXElement[];\n  const selectedOption = options.find(\n    (option) =>\n      hasProperty(option.props, 'value') && option.props.value === value,\n  );\n\n  assert(\n    selectedOption !== undefined,\n    `The RadioGroup with the name \"${name}\" does not contain \"${value}\".`,\n  );\n\n  const { state, context } = controllerMessenger.call(\n    'SnapInterfaceController:getInterface',\n    snapId,\n    id,\n  );\n\n  const newState = mergeValue(state, name, value, result.form);\n\n  controllerMessenger.call(\n    'SnapInterfaceController:updateInterfaceState',\n    id,\n    newState,\n  );\n\n  await controllerMessenger.call('ExecutionService:handleRpcRequest', snapId, {\n    origin: 'metamask',\n    handler: HandlerType.OnUserInput,\n    request: {\n      jsonrpc: '2.0',\n      method: ' ',\n      params: {\n        event: {\n          type: UserInputEventType.InputChangeEvent,\n          name: result.element.props.name,\n          value,\n        },\n        id,\n        context,\n      },\n    },\n  });\n}\n\n/**\n * Get the value from a Selector interface element.\n *\n * @param element - The Selector element to get the value from.\n * @param options - The simulation options.\n * @param value - The value to get from the Selector.\n *\n * @returns The value from the Selector element.\n */\nexport function getValueFromSelector(\n  element: NamedJSXElement,\n  options: SimulationOptions,\n  value: string,\n) {\n  switch (element.type) {\n    case 'Selector': {\n      const selectorOptions = getJsxChildren(element) as JSXElement[];\n      const selectedOption = selectorOptions.find(\n        (option) =>\n          hasProperty(option.props, 'value') && option.props.value === value,\n      );\n\n      assert(\n        selectedOption !== undefined,\n        `The Selector with the name \"${element.props.name}\" does not contain \"${value}\".`,\n      );\n\n      return value;\n    }\n\n    case 'AccountSelector': {\n      const { accounts } = options;\n\n      const selectedAccount = accounts.find((account) => account.id === value);\n\n      assert(\n        selectedAccount !== undefined,\n        `The AccountSelector with the name \"${element.props.name}\" does not contain an account with ID \"${value}\".`,\n      );\n\n      return {\n        accountId: selectedAccount.id,\n        addresses: createAccountList(\n          selectedAccount.address,\n          createChainIdList(selectedAccount.scopes, element.props.chainIds),\n        ),\n      };\n    }\n\n    case 'AssetSelector': {\n      const { assets, accounts } = options;\n\n      const selectedAsset = assets[value as CaipAssetType];\n\n      const { address } = parseCaipAccountId(element.props.addresses[0]);\n\n      const account = accounts.find(\n        (simulationAccount) => simulationAccount.address === address,\n      );\n\n      const accountHasAsset = account?.assets?.some((asset) => asset === value);\n\n      assert(\n        selectedAsset !== undefined && accountHasAsset,\n        `The AssetSelector with the name \"${element.props.name}\" does not contain an asset with ID \"${value}\".`,\n      );\n\n      return {\n        asset: value as CaipAssetType,\n        name: selectedAsset.name,\n        symbol: selectedAsset.symbol,\n      };\n    }\n\n    default:\n      throw new Error(\n        `Expected an element of type ${formatTypeErrorMessage(SELECTOR_ELEMENTS)}, but found \"${element.type}\".`,\n      );\n  }\n}\n\n/**\n * Choose an option with value from a Selector interface element.\n *\n * @param controllerMessenger - The controller messenger used to call actions.\n * @param options - The simulation options.\n * @param id - The interface ID.\n * @param content - The interface Components.\n * @param snapId - The Snap ID.\n * @param name - The element name.\n * @param value - The value to type in the element.\n */\nexport async function selectFromSelector(\n  controllerMessenger: RootControllerMessenger,\n  options: SimulationOptions,\n  id: string,\n  content: JSXElement,\n  snapId: SnapId,\n  name: string,\n  value: string,\n) {\n  const result = getElement(content, name);\n\n  assert(\n    result !== undefined,\n    `Could not find an element in the interface with the name \"${name}\".`,\n  );\n\n  const selectedValue = getValueFromSelector(result.element, options, value);\n\n  const { state, context } = controllerMessenger.call(\n    'SnapInterfaceController:getInterface',\n    snapId,\n    id,\n  );\n\n  const newState = mergeValue(state, name, selectedValue, result.form);\n\n  controllerMessenger.call(\n    'SnapInterfaceController:updateInterfaceState',\n    id,\n    newState,\n  );\n\n  await controllerMessenger.call('ExecutionService:handleRpcRequest', snapId, {\n    origin: 'metamask',\n    handler: HandlerType.OnUserInput,\n    request: {\n      jsonrpc: '2.0',\n      method: ' ',\n      params: {\n        event: {\n          type: UserInputEventType.InputChangeEvent,\n          name: result.element.props.name,\n          value: selectedValue,\n        },\n        id,\n        context,\n      },\n    },\n  });\n}\n\n/**\n * Pick a date or time in a DateTimePicker interface element.\n *\n * @param controllerMessenger - The controller messenger used to call actions.\n * @param id - The interface ID.\n * @param content - The interface Components.\n * @param snapId - The Snap ID.\n * @param name - The element name.\n * @param value - The value to pick in the element.\n */\nexport async function pickDateTime(\n  controllerMessenger: RootControllerMessenger,\n  id: string,\n  content: JSXElement,\n  snapId: SnapId,\n  name: string,\n  value: Date,\n) {\n  const result = getElement(content, name);\n\n  assert(\n    result !== undefined,\n    `Could not find an element in the interface with the name \"${name}\".`,\n  );\n\n  assert(\n    result.element.type === 'DateTimePicker',\n    `Expected an element of type \"DateTimePicker\", but found \"${result.element.type}\".`,\n  );\n\n  assert(\n    !isNaN(value.getTime()),\n    `Expected \"value\" to be a valid Date object.`,\n  );\n\n  const parsedDate = value.toISOString();\n\n  const now = new Date();\n\n  if (result.element.props.disableFuture) {\n    assert(\n      value <= now,\n      `The selected date \"${parsedDate}\" is in the future, but the DateTimePicker with the name \"${name}\" has future dates disabled.`,\n    );\n  }\n\n  if (result.element.props.disablePast) {\n    assert(\n      value >= now,\n      `The selected date \"${parsedDate}\" is in the past, but the DateTimePicker with the name \"${name}\" has past dates disabled.`,\n    );\n  }\n\n  const { state, context } = controllerMessenger.call(\n    'SnapInterfaceController:getInterface',\n    snapId,\n    id,\n  );\n\n  const newState = mergeValue(state, name, parsedDate, result.form);\n\n  controllerMessenger.call(\n    'SnapInterfaceController:updateInterfaceState',\n    id,\n    newState,\n  );\n\n  await controllerMessenger.call('ExecutionService:handleRpcRequest', snapId, {\n    origin: 'metamask',\n    handler: HandlerType.OnUserInput,\n    request: {\n      jsonrpc: '2.0',\n      method: ' ',\n      params: {\n        event: {\n          type: UserInputEventType.InputChangeEvent,\n          name: result.element.props.name,\n          value: parsedDate,\n        },\n        id,\n        context,\n      },\n    },\n  });\n}\n\n/**\n * Wait for an interface to be updated.\n *\n * @param controllerMessenger - The controller messenger used to call actions.\n * @param options - The simulation options.\n * @param snapId - The Snap ID.\n * @param id - The interface ID.\n * @param originalContent - The original interface content.\n * @returns A promise that resolves to the updated interface.\n */\nexport async function waitForUpdate(\n  controllerMessenger: RootControllerMessenger,\n  options: SimulationOptions,\n  snapId: SnapId,\n  id: string,\n  originalContent: JSXElement,\n) {\n  return new Promise<SnapHandlerInterface>((resolve) => {\n    const listener = (state: SnapInterfaceControllerState) => {\n      const currentInterface = state.interfaces[id];\n      const newContent = currentInterface?.content;\n\n      if (!deepEqual(originalContent, newContent)) {\n        controllerMessenger.unsubscribe(\n          'SnapInterfaceController:stateChange',\n          listener,\n        );\n\n        const actions = getInterfaceActions(\n          snapId,\n          controllerMessenger,\n          options,\n          {\n            content: newContent,\n            id,\n          },\n        );\n\n        resolve({ ...actions, content: newContent });\n      }\n    };\n\n    controllerMessenger.subscribe(\n      'SnapInterfaceController:stateChange',\n      listener,\n    );\n  });\n}\n\n/**\n * Get a formatted file size.\n *\n * @param size - The file size in bytes.\n * @returns The formatted file size in MB, with two decimal places.\n * @example\n * getFormattedFileSize(1_000_000); // '1.00 MB'\n */\nfunction getFormattedFileSize(size: number) {\n  return `${(size / 1_000_000).toFixed(2)} MB`;\n}\n\n/**\n * Upload a file to an interface element.\n *\n * @param controllerMessenger - The controller messenger used to call actions.\n * @param id - The interface ID.\n * @param content - The interface Components.\n * @param snapId - The Snap ID.\n * @param name - The element name.\n * @param file - The file to upload. This can be a path to a file or a\n * `Uint8Array` containing the file contents. If this is a path, the file is\n * resolved relative to the current working directory.\n * @param options - The file options.\n * @param options.fileName - The name of the file. By default, this is\n * inferred from the file path if it's a path, and defaults to an empty string\n * if it's a `Uint8Array`.\n * @param options.contentType - The content type of the file. By default, this\n * is inferred from the file name if it's a path, and defaults to\n * `application/octet-stream` if it's a `Uint8Array` or the content type\n * cannot be inferred from the file name.\n */\nexport async function uploadFile(\n  controllerMessenger: RootControllerMessenger,\n  id: string,\n  content: JSXElement,\n  snapId: SnapId,\n  name: string,\n  file: string | Uint8Array,\n  options?: FileOptions,\n) {\n  const result = getElement(content, name);\n\n  assert(\n    result !== undefined,\n    `Could not find an element in the interface with the name \"${name}\".`,\n  );\n\n  assert(\n    result.element.type === 'FileInput',\n    `Expected an element of type \"FileInput\", but found \"${result.element.type}\".`,\n  );\n\n  const { state, context } = controllerMessenger.call(\n    'SnapInterfaceController:getInterface',\n    snapId,\n    id,\n  );\n\n  const fileSize = await getFileSize(file);\n  if (fileSize > MAX_FILE_SIZE) {\n    throw new Error(\n      `The file size (${getFormattedFileSize(\n        fileSize,\n      )}) exceeds the maximum allowed size of ${getFormattedFileSize(\n        MAX_FILE_SIZE,\n      )}.`,\n    );\n  }\n\n  const fileObject = await getFileToUpload(file, options);\n  const newState = mergeValue(state, name, fileObject, result.form);\n\n  controllerMessenger.call(\n    'SnapInterfaceController:updateInterfaceState',\n    id,\n    newState,\n  );\n\n  await controllerMessenger.call('ExecutionService:handleRpcRequest', snapId, {\n    origin: 'metamask',\n    handler: HandlerType.OnUserInput,\n    request: {\n      jsonrpc: '2.0',\n      method: ' ',\n      params: {\n        event: {\n          type: UserInputEventType.FileUploadEvent,\n          name: result.element.props.name,\n          file: fileObject,\n        },\n        id,\n        context,\n      },\n    },\n  });\n}\n\n/**\n * Get the user interface actions for a Snap interface. These actions can be\n * used to interact with the interface.\n *\n * @param snapId - The Snap ID.\n * @param controllerMessenger - The controller messenger used to call actions.\n * @param simulationOptions - The simulation options.\n * @param interface - The interface object.\n * @param interface.content - The interface content.\n * @param interface.id - The interface ID.\n * @returns The user interface actions.\n */\nexport function getInterfaceActions(\n  snapId: SnapId,\n  controllerMessenger: RootControllerMessenger,\n  simulationOptions: SimulationOptions,\n  { content, id }: Omit<Interface, 'type'> & { content: JSXElement },\n): SnapInterfaceActions {\n  return {\n    clickElement: async (name: string) => {\n      await clickElement(controllerMessenger, id, content, snapId, name);\n    },\n\n    pickDateTime: async (name: string, value: Date) => {\n      await pickDateTime(controllerMessenger, id, content, snapId, name, value);\n    },\n\n    typeInField: async (name: string, value: string) => {\n      await typeInField(controllerMessenger, id, content, snapId, name, value);\n    },\n\n    selectInDropdown: async (name: string, value: string) => {\n      await selectInDropdown(\n        controllerMessenger,\n        id,\n        content,\n        snapId,\n        name,\n        value,\n      );\n    },\n\n    selectFromRadioGroup: async (name: string, value: string) => {\n      await selectFromRadioGroup(\n        controllerMessenger,\n        id,\n        content,\n        snapId,\n        name,\n        value,\n      );\n    },\n\n    selectFromSelector: async (name: string, value: string) => {\n      await selectFromSelector(\n        controllerMessenger,\n        simulationOptions,\n        id,\n        content,\n        snapId,\n        name,\n        value,\n      );\n    },\n\n    uploadFile: async (\n      name: string,\n      file: string | Uint8Array,\n      options?: FileOptions,\n    ) => {\n      await uploadFile(\n        controllerMessenger,\n        id,\n        content,\n        snapId,\n        name,\n        file,\n        options,\n      );\n    },\n\n    waitForUpdate: async () =>\n      waitForUpdate(\n        controllerMessenger,\n        simulationOptions,\n        snapId,\n        id,\n        content,\n      ),\n  };\n}\n\n/**\n * Get a user interface object from a Snap.\n *\n * @param runSaga - A function to run a saga outside the usual Redux flow.\n * @param snapId - The Snap ID.\n * @param controllerMessenger - The controller messenger used to call actions.\n * @param options - The simulation options.\n * @yields Takes the set interface action.\n * @returns The user interface object.\n */\nexport function* getInterface(\n  runSaga: RunSagaFunction,\n  snapId: SnapId,\n  controllerMessenger: RootControllerMessenger,\n  options: SimulationOptions,\n): SagaIterator {\n  const storedInterface = yield call(\n    getStoredInterface,\n    controllerMessenger,\n    snapId,\n  );\n\n  const interfaceActions = getInterfaceActions(\n    snapId,\n    controllerMessenger,\n    options,\n    storedInterface,\n  );\n\n  return getInterfaceResponse(\n    runSaga,\n    storedInterface.type,\n    storedInterface.id,\n    storedInterface.content,\n    interfaceActions,\n  );\n}\n"]}