client side state works