TextArea POS component onChange not firing

My POS app makes use of the TextArea component, and up util recently I’ve had no issues. I’ve noticed today that the onChange handler for the component no longer works as expected. I’ve tested with a completely blank component, as per the docs:

import { useState } from 'react'
import { Text, reactExtension, TextArea, ScrollView } from '@shopify/ui-extensions-react/point-of-sale';

const Modal = () => {
  const [text, setText] = useState('');

  return (
    <ScrollView>
      <TextArea
        label="Text"
        rows={4}
        placeholder="Input your text here"
        value={text}
        onChange={setText}
      />
      <Text>{text}</Text>
    </ScrollView>
  )
}

export default reactExtension('pos.home.modal.render', () => <Modal />);  

And as you can see the text value never updates in the UI:

I’ve tested on react version 18.0.0 and 18.3.1.

  "name": "pos-ui",
  "private": true,
  "version": "1.0.0",
  "license": "UNLICENSED",
  "dependencies": {
    "@shopify/ui-extensions": "2025.7.1",
    "@shopify/ui-extensions-react": "2025.7.1",
    "react": "18.3.1",
    "react-reconciler": "0.29.0"
  },
  "devDependencies": {
    "@types/react": "^18.3.25"
  }
}

I’d really appreciate if someone on Shopify’s team can test this. Thanks in advance.

[Edit]: Everything works as expected for all other input fields! It’s just the TextArea field.

Hey again @21O - thanks for flagging this and for sharing your snippet there. I think I was able to replicate the behaviour somewhat using the code above. Is this similar to what you’re seeing?

It looks like for me, the text does update at a certain point while I’m typing, but if I erase the text too quickly, I see essentially the same thing you are. Happy to investigate this further, just wanted to confirm if this is what you’re seeing. Hope to hear from you soon!

Hey @21O - just wanted to ping you here to see if I could still help. :slight_smile:

Hi @Alan_G,

Apologies for not getting back to you. That’s not actaully the same bug as I’m seeing. I’m seeing the onChance event handler fire once, and then never again. It’s intersting that you’re not having the same issue - I assume you’re testing on the same depenency versions as me?

Thanks :slight_smile:

Hey @21O , interesting! Thanks for confirming. Here’s what I’m using which I think should match your config:

        "dependencies": {
        "@shopify/ui-extensions": "2025.7.1",
        "@shopify/ui-extensions-react": "2025.7.1",
        "react": "18.3.1",
        "react-reconciler": "0.29.0"
      }

I wonder if the same potential issue is just manifesting differently on different OSes, just to confirm, I’m running this on version 10.12.2 of the POS app on Android 16. Are you running on iOS by any chance? Just want to narrow down the device type too to see if I can replicate. Hope to hear from you soon!

Just confirming the same issue persists when I upgraded my app version to 10.13 as well. This is definitely something we’d like to look into, but just wanted to wait to hear back from you :slight_smile:

Hi @Alan_G - that’s right, I’m on iOS. Thanks for investigating!

Thanks @21O, my hunch is that this might be the same issue, just showing up differently depending on device. I’ll keep digging into this for you on our end here and loop back with you once I have more info to share.

Hey @21O :waving_hand: - thanks for your patience on this, just wanted to loop back with you to let you know that we are investigating this as a possible bug and have logged a bug investigation ticket on our end internally. I can’t guarantee a turnaround time, but wanted to loop back here to let you know we are still investigating.

I’ll keep in touch here with updates :slight_smile:

Hi @Alan_G - Interestingly this is only happening when I test it on my iPhone. When testing the onChange handler on my iPad it works as expected…

Hi @21O @Alan_G , I think I’m experiencing the same issue, the <TextArea> POS component only returns the first character in the onChange callback.
I found that it only happens on iOS/iPadOS 26. I tested using the same device (iPad Pro 4th gen) and the same code — it worked normally on iPadOS 18, but once I updated the device to iPadOS 26, the bug started occurring.
Here is the list of devices I tested:

Working normally:

  • iPhone 12 mini, iOS 18.7.2

  • iPhone Xs Max, iOS 18.7.2

  • iPad Pro 4th gen, iPadOS 18.7.2

Bug happening on:

  • iPhone 17 Pro, iOS 26.0.1

  • iPhone 13, iOS 26.0.1

  • iPad Pro 2nd gen, iPadOS 26.1

  • iPad Pro 4th gen, iPadOS 26.1

1 Like

Thanks @Minh_Duong for flagging this too, it does seem like the same issue. I’ll share your info internally on my end here. We still have this logged as something to look into, so I appreciate you flagging this too.

Thanks @21O for confirming it seems to be an Apple only issue as well - very odd. I’ll keep my eye on this and get back in touch when I can confirm a fix/next steps.

Hey folks :waving_hand: - we pushed a fix for this about a month ago, just wanted to circle back to see if you’re still seeing this issue. If so, feel free to tag me here and I’d be happy to take another look.

Hi @Alan_G I’m getting reports of what sounds like this issue occurring today from some of my merchants, the behaviour they are describing sounds like the onChange callback is not working for TextArea or TextField. They’ve reported that the issue started occurring after updating their devices to 26.2.1.

I haven’t been able to reproduce yet myself as I don’t have an iOS device running v26, my older v18 device is not exhibiting this behaviour.

It does seem to be the onChange handler, I was able to workaround this by using onInput instead.

I don’t think this issue has been resolved, but certainly the behaviour has changed now, suggesting something was done in a recent release.

Thanks for flagging this @simon_b , just confirming, is this still replicable with the minimal repro that was shared earlier in the thread?

import { useState } from 'react'
import { Text, reactExtension, TextArea, ScrollView } from '@shopify/ui-extensions-react/point-of-sale';

const Modal = () => {
  const [text, setText] = useState('');

  return (
    <ScrollView>
      <TextArea
        label="Text"
        rows={4}
        placeholder="Input your text here"
        value={text}
        onChange={setText}
      />
      <Text>{text}</Text>
    </ScrollView>
  )
}

export default reactExtension('pos.home.modal.render', () => <Modal />);

Just want to see if I can replicate things on my end again here so we can look into this further.

Hi @Alan_G sorry for the delay, yes I can reproduce this using your minimal example, I added the following logging to verify that the setText method was not being called:

import { useState, useEffect } from 'react'
import { Text, reactExtension, TextArea, ScrollView } from '@shopify/ui-extensions-react/point-of-sale';

const Modal = () => {
  const [text, setText] = useState('');

  // Here 👇
  useEffect(() => {
    console.log(text);
  }, [text]);

  return (
    <ScrollView>
      <TextArea
        label="Text"
        rows={4}
        placeholder="Input your text here"
        value={text}
        onChange={setText}
      />
      <Text>{text}</Text>
    </ScrollView>
  )
}

export default reactExtension('pos.home.modal.render', () => <Modal />);

I get no output in the console when I input anything into the TextArea

EDIT - Oops just noticed the Text component below, didn’t need the console output, either way it doesn’t work.

No worries @simon_b - thanks for confirming, I’ll dig into this further on my end here and loop back with you once I have more to share on next steps :slight_smile:

For what it’s worth, I’ve also encountered this issue. A client reported it to me about a week ago which seems to align with the timing in this thread. My guess is their POS iPad updated to iOS 26 around that time, but I’ve yet to confirm.

I’ve also worked around this by switching onChange to onInput. I’m a little concerned that this broke without warning.

1 Like

Hi folks :waving_hand:

I was able to do some further digging into this and can confirm this is expected behaviour

The onChange callback for TextArea and TextField in POS UI Extensions is designed to fire when the user finishes editing (typically on blur/unfocus), not on every keystroke. This is documented her in our TextArea API reference:

onChange - “The callback when the user has finished editing a field.”

The reason for this design is to avoid performance issues with rapid state updates during typing, especially on lower-powered devices.

For realtime, you should be able to use onInput as your workaround like you mentioned @johnholdun - though note the docs do mention this is intended for side effects like clearing validation errors rather than primary state management. That said, if it’s working for your use case, it should be fine to continue using it.

If you’re seeing onChange not fire even when unfocusing the field, that could be a potential issue - so please me know if you do see that.

Hope this helps!