Abstract all the things! :)
On a side note, I finally made progress on my "Jira" type app acceptance criteria checklist. The hard part was syncing and race conditions updating the server and UI. That's solved by using optimistic updates in URQL.
Using "optimistic updates", the cache is updated immediately before the request is sent, so the the controlled state of the checklist doesn't lag and get out of sync.