cache data with localStorage