* push state to history
* refactor