decouple loading & image, use router for state