Re: Transaction states.
Our use case is different from yours (creating + managing ERC721 tokens as ownership/validation documentation for unique assets), but there might be something useful for you here. We went with a global component, as well as contextual object based notifications.
As an example, if the user creates a new record, then that record will appear in their collection with a pending state, even if the transaction has not succeeded yet. That way the user gets feedback that the system has accepted their input even if it isn't written to the blockchain yet.
I think the global component is important because that allows the user to easily go back if any transaction has a problem. If you only have contextual ones then the user has to navigate back to where they were in order to see state.
We have set it up on the backend to save the information about that transaction, so all the user has to do is click the failed transaction to re-trigger metamask (and maybe increase their gas if necessary)
This invision flow should give you an idea of what I mean. https://invis.io/R5NY06XNM8H (If you're on a small screen you may need to hit "CMD" + "-" once or twice to see the whole image.
Curious to hear your thoughts.