I'm using the exact same flow in my current project.
Shared data is stored in the state of a single component. Data propagates via props and since you've got a single source of truth you don't have to worry about data synchronization. To manipulate data, the component that owns the data exposes methods to children via context.
As a bonus, components become incredibly easy to test since both props and context are both explicitly passed to each component.