fix zoom, add state callback