It may be worth pointing out that element-specific wait UI like this may have an impact on the long-term management of the product’s design.

Deciding to have a button morph into a waiting state implies you adopt a similar approach for interactive elements that aren’t buttons. So they all get their own morphing styles. That’s fine for a small app with not may contexts and element types, but for more complex apps, having an element-independent wait state is more sustainable.