diff --git a/public/images/browsers/android-webview.png b/public/images/browser/android-webview.png similarity index 100% rename from public/images/browsers/android-webview.png rename to public/images/browser/android-webview.png diff --git a/public/images/browsers/android.png b/public/images/browser/android.png similarity index 100% rename from public/images/browsers/android.png rename to public/images/browser/android.png diff --git a/public/images/browsers/aol.png b/public/images/browser/aol.png similarity index 100% rename from public/images/browsers/aol.png rename to public/images/browser/aol.png diff --git a/public/images/browsers/beaker.png b/public/images/browser/beaker.png similarity index 100% rename from public/images/browsers/beaker.png rename to public/images/browser/beaker.png diff --git a/public/images/browsers/blackberry.png b/public/images/browser/blackberry.png similarity index 100% rename from public/images/browsers/blackberry.png rename to public/images/browser/blackberry.png diff --git a/public/images/browsers/brave.png b/public/images/browser/brave.png similarity index 100% rename from public/images/browsers/brave.png rename to public/images/browser/brave.png diff --git a/public/images/browsers/chrome.png b/public/images/browser/chrome.png similarity index 100% rename from public/images/browsers/chrome.png rename to public/images/browser/chrome.png diff --git a/public/images/browsers/chromium-webview.png b/public/images/browser/chromium-webview.png similarity index 100% rename from public/images/browsers/chromium-webview.png rename to public/images/browser/chromium-webview.png diff --git a/public/images/browsers/crios.png b/public/images/browser/crios.png similarity index 100% rename from public/images/browsers/crios.png rename to public/images/browser/crios.png diff --git a/public/images/browsers/curl.png b/public/images/browser/curl.png similarity index 100% rename from public/images/browsers/curl.png rename to public/images/browser/curl.png diff --git a/public/images/browsers/edge-chromium.png b/public/images/browser/edge-chromium.png similarity index 100% rename from public/images/browsers/edge-chromium.png rename to public/images/browser/edge-chromium.png diff --git a/public/images/browsers/edge-ios.png b/public/images/browser/edge-ios.png similarity index 100% rename from public/images/browsers/edge-ios.png rename to public/images/browser/edge-ios.png diff --git a/public/images/browsers/edge.png b/public/images/browser/edge.png similarity index 100% rename from public/images/browsers/edge.png rename to public/images/browser/edge.png diff --git a/public/images/browsers/facebook.png b/public/images/browser/facebook.png similarity index 100% rename from public/images/browsers/facebook.png rename to public/images/browser/facebook.png diff --git a/public/images/browsers/firefox.png b/public/images/browser/firefox.png similarity index 100% rename from public/images/browsers/firefox.png rename to public/images/browser/firefox.png diff --git a/public/images/browsers/fxios.png b/public/images/browser/fxios.png similarity index 100% rename from public/images/browsers/fxios.png rename to public/images/browser/fxios.png diff --git a/public/images/browsers/ie.png b/public/images/browser/ie.png similarity index 100% rename from public/images/browsers/ie.png rename to public/images/browser/ie.png diff --git a/public/images/browsers/instagram.png b/public/images/browser/instagram.png similarity index 100% rename from public/images/browsers/instagram.png rename to public/images/browser/instagram.png diff --git a/public/images/browsers/ios-webview.png b/public/images/browser/ios-webview.png similarity index 100% rename from public/images/browsers/ios-webview.png rename to public/images/browser/ios-webview.png diff --git a/public/images/browsers/ios.png b/public/images/browser/ios.png similarity index 100% rename from public/images/browsers/ios.png rename to public/images/browser/ios.png diff --git a/public/images/browsers/kakaotalk.png b/public/images/browser/kakaotalk.png similarity index 100% rename from public/images/browsers/kakaotalk.png rename to public/images/browser/kakaotalk.png diff --git a/public/images/browsers/miui.png b/public/images/browser/miui.png similarity index 100% rename from public/images/browsers/miui.png rename to public/images/browser/miui.png diff --git a/public/images/browsers/opera-mini.png b/public/images/browser/opera-mini.png similarity index 100% rename from public/images/browsers/opera-mini.png rename to public/images/browser/opera-mini.png diff --git a/public/images/browsers/opera.png b/public/images/browser/opera.png similarity index 100% rename from public/images/browsers/opera.png rename to public/images/browser/opera.png diff --git a/public/images/browsers/safari.png b/public/images/browser/safari.png similarity index 100% rename from public/images/browsers/safari.png rename to public/images/browser/safari.png diff --git a/public/images/browsers/samsung.png b/public/images/browser/samsung.png similarity index 100% rename from public/images/browsers/samsung.png rename to public/images/browser/samsung.png diff --git a/public/images/browsers/searchbot.png b/public/images/browser/searchbot.png similarity index 100% rename from public/images/browsers/searchbot.png rename to public/images/browser/searchbot.png diff --git a/public/images/browsers/silk.png b/public/images/browser/silk.png similarity index 100% rename from public/images/browsers/silk.png rename to public/images/browser/silk.png diff --git a/public/images/browsers/unknown.png b/public/images/browser/unknown.png similarity index 100% rename from public/images/browsers/unknown.png rename to public/images/browser/unknown.png diff --git a/public/images/browsers/yandexbrowser.png b/public/images/browser/yandexbrowser.png similarity index 100% rename from public/images/browsers/yandexbrowser.png rename to public/images/browser/yandexbrowser.png diff --git a/public/images/flags/ad.png b/public/images/country/ad.png similarity index 100% rename from public/images/flags/ad.png rename to public/images/country/ad.png diff --git a/public/images/flags/ae.png b/public/images/country/ae.png similarity index 100% rename from public/images/flags/ae.png rename to public/images/country/ae.png diff --git a/public/images/flags/af.png b/public/images/country/af.png similarity index 100% rename from public/images/flags/af.png rename to public/images/country/af.png diff --git a/public/images/flags/ag.png b/public/images/country/ag.png similarity index 100% rename from public/images/flags/ag.png rename to public/images/country/ag.png diff --git a/public/images/flags/ai.png b/public/images/country/ai.png similarity index 100% rename from public/images/flags/ai.png rename to public/images/country/ai.png diff --git a/public/images/flags/al.png b/public/images/country/al.png similarity index 100% rename from public/images/flags/al.png rename to public/images/country/al.png diff --git a/public/images/flags/am.png b/public/images/country/am.png similarity index 100% rename from public/images/flags/am.png rename to public/images/country/am.png diff --git a/public/images/flags/ao.png b/public/images/country/ao.png similarity index 100% rename from public/images/flags/ao.png rename to public/images/country/ao.png diff --git a/public/images/flags/aq.png b/public/images/country/aq.png similarity index 100% rename from public/images/flags/aq.png rename to public/images/country/aq.png diff --git a/public/images/flags/ar.png b/public/images/country/ar.png similarity index 100% rename from public/images/flags/ar.png rename to public/images/country/ar.png diff --git a/public/images/flags/as.png b/public/images/country/as.png similarity index 100% rename from public/images/flags/as.png rename to public/images/country/as.png diff --git a/public/images/flags/at.png b/public/images/country/at.png similarity index 100% rename from public/images/flags/at.png rename to public/images/country/at.png diff --git a/public/images/flags/au.png b/public/images/country/au.png similarity index 100% rename from public/images/flags/au.png rename to public/images/country/au.png diff --git a/public/images/flags/aw.png b/public/images/country/aw.png similarity index 100% rename from public/images/flags/aw.png rename to public/images/country/aw.png diff --git a/public/images/flags/ax.png b/public/images/country/ax.png similarity index 100% rename from public/images/flags/ax.png rename to public/images/country/ax.png diff --git a/public/images/flags/az.png b/public/images/country/az.png similarity index 100% rename from public/images/flags/az.png rename to public/images/country/az.png diff --git a/public/images/flags/ba.png b/public/images/country/ba.png similarity index 100% rename from public/images/flags/ba.png rename to public/images/country/ba.png diff --git a/public/images/flags/bb.png b/public/images/country/bb.png similarity index 100% rename from public/images/flags/bb.png rename to public/images/country/bb.png diff --git a/public/images/flags/bd.png b/public/images/country/bd.png similarity index 100% rename from public/images/flags/bd.png rename to public/images/country/bd.png diff --git a/public/images/flags/be.png b/public/images/country/be.png similarity index 100% rename from public/images/flags/be.png rename to public/images/country/be.png diff --git a/public/images/flags/bf.png b/public/images/country/bf.png similarity index 100% rename from public/images/flags/bf.png rename to public/images/country/bf.png diff --git a/public/images/flags/bg.png b/public/images/country/bg.png similarity index 100% rename from public/images/flags/bg.png rename to public/images/country/bg.png diff --git a/public/images/flags/bh.png b/public/images/country/bh.png similarity index 100% rename from public/images/flags/bh.png rename to public/images/country/bh.png diff --git a/public/images/flags/bi.png b/public/images/country/bi.png similarity index 100% rename from public/images/flags/bi.png rename to public/images/country/bi.png diff --git a/public/images/flags/bj.png b/public/images/country/bj.png similarity index 100% rename from public/images/flags/bj.png rename to public/images/country/bj.png diff --git a/public/images/flags/bl.png b/public/images/country/bl.png similarity index 100% rename from public/images/flags/bl.png rename to public/images/country/bl.png diff --git a/public/images/flags/bm.png b/public/images/country/bm.png similarity index 100% rename from public/images/flags/bm.png rename to public/images/country/bm.png diff --git a/public/images/flags/bn.png b/public/images/country/bn.png similarity index 100% rename from public/images/flags/bn.png rename to public/images/country/bn.png diff --git a/public/images/flags/bo.png b/public/images/country/bo.png similarity index 100% rename from public/images/flags/bo.png rename to public/images/country/bo.png diff --git a/public/images/flags/bq.png b/public/images/country/bq.png similarity index 100% rename from public/images/flags/bq.png rename to public/images/country/bq.png diff --git a/public/images/flags/br.png b/public/images/country/br.png similarity index 100% rename from public/images/flags/br.png rename to public/images/country/br.png diff --git a/public/images/flags/bs.png b/public/images/country/bs.png similarity index 100% rename from public/images/flags/bs.png rename to public/images/country/bs.png diff --git a/public/images/flags/bt.png b/public/images/country/bt.png similarity index 100% rename from public/images/flags/bt.png rename to public/images/country/bt.png diff --git a/public/images/flags/bv.png b/public/images/country/bv.png similarity index 100% rename from public/images/flags/bv.png rename to public/images/country/bv.png diff --git a/public/images/flags/bw.png b/public/images/country/bw.png similarity index 100% rename from public/images/flags/bw.png rename to public/images/country/bw.png diff --git a/public/images/flags/by.png b/public/images/country/by.png similarity index 100% rename from public/images/flags/by.png rename to public/images/country/by.png diff --git a/public/images/flags/bz.png b/public/images/country/bz.png similarity index 100% rename from public/images/flags/bz.png rename to public/images/country/bz.png diff --git a/public/images/flags/ca.png b/public/images/country/ca.png similarity index 100% rename from public/images/flags/ca.png rename to public/images/country/ca.png diff --git a/public/images/flags/cc.png b/public/images/country/cc.png similarity index 100% rename from public/images/flags/cc.png rename to public/images/country/cc.png diff --git a/public/images/flags/cd.png b/public/images/country/cd.png similarity index 100% rename from public/images/flags/cd.png rename to public/images/country/cd.png diff --git a/public/images/flags/cf.png b/public/images/country/cf.png similarity index 100% rename from public/images/flags/cf.png rename to public/images/country/cf.png diff --git a/public/images/flags/cg.png b/public/images/country/cg.png similarity index 100% rename from public/images/flags/cg.png rename to public/images/country/cg.png diff --git a/public/images/flags/ch.png b/public/images/country/ch.png similarity index 100% rename from public/images/flags/ch.png rename to public/images/country/ch.png diff --git a/public/images/flags/ci.png b/public/images/country/ci.png similarity index 100% rename from public/images/flags/ci.png rename to public/images/country/ci.png diff --git a/public/images/flags/ck.png b/public/images/country/ck.png similarity index 100% rename from public/images/flags/ck.png rename to public/images/country/ck.png diff --git a/public/images/flags/cl.png b/public/images/country/cl.png similarity index 100% rename from public/images/flags/cl.png rename to public/images/country/cl.png diff --git a/public/images/flags/cm.png b/public/images/country/cm.png similarity index 100% rename from public/images/flags/cm.png rename to public/images/country/cm.png diff --git a/public/images/flags/cn.png b/public/images/country/cn.png similarity index 100% rename from public/images/flags/cn.png rename to public/images/country/cn.png diff --git a/public/images/flags/co.png b/public/images/country/co.png similarity index 100% rename from public/images/flags/co.png rename to public/images/country/co.png diff --git a/public/images/flags/cr.png b/public/images/country/cr.png similarity index 100% rename from public/images/flags/cr.png rename to public/images/country/cr.png diff --git a/public/images/flags/cu.png b/public/images/country/cu.png similarity index 100% rename from public/images/flags/cu.png rename to public/images/country/cu.png diff --git a/public/images/flags/cv.png b/public/images/country/cv.png similarity index 100% rename from public/images/flags/cv.png rename to public/images/country/cv.png diff --git a/public/images/flags/cw.png b/public/images/country/cw.png similarity index 100% rename from public/images/flags/cw.png rename to public/images/country/cw.png diff --git a/public/images/flags/cx.png b/public/images/country/cx.png similarity index 100% rename from public/images/flags/cx.png rename to public/images/country/cx.png diff --git a/public/images/flags/cy.png b/public/images/country/cy.png similarity index 100% rename from public/images/flags/cy.png rename to public/images/country/cy.png diff --git a/public/images/flags/cz.png b/public/images/country/cz.png similarity index 100% rename from public/images/flags/cz.png rename to public/images/country/cz.png diff --git a/public/images/flags/de.png b/public/images/country/de.png similarity index 100% rename from public/images/flags/de.png rename to public/images/country/de.png diff --git a/public/images/flags/dj.png b/public/images/country/dj.png similarity index 100% rename from public/images/flags/dj.png rename to public/images/country/dj.png diff --git a/public/images/flags/dk.png b/public/images/country/dk.png similarity index 100% rename from public/images/flags/dk.png rename to public/images/country/dk.png diff --git a/public/images/flags/dm.png b/public/images/country/dm.png similarity index 100% rename from public/images/flags/dm.png rename to public/images/country/dm.png diff --git a/public/images/flags/do.png b/public/images/country/do.png similarity index 100% rename from public/images/flags/do.png rename to public/images/country/do.png diff --git a/public/images/flags/dz.png b/public/images/country/dz.png similarity index 100% rename from public/images/flags/dz.png rename to public/images/country/dz.png diff --git a/public/images/flags/ec.png b/public/images/country/ec.png similarity index 100% rename from public/images/flags/ec.png rename to public/images/country/ec.png diff --git a/public/images/flags/ee.png b/public/images/country/ee.png similarity index 100% rename from public/images/flags/ee.png rename to public/images/country/ee.png diff --git a/public/images/flags/eg.png b/public/images/country/eg.png similarity index 100% rename from public/images/flags/eg.png rename to public/images/country/eg.png diff --git a/public/images/flags/eh.png b/public/images/country/eh.png similarity index 100% rename from public/images/flags/eh.png rename to public/images/country/eh.png diff --git a/public/images/flags/er.png b/public/images/country/er.png similarity index 100% rename from public/images/flags/er.png rename to public/images/country/er.png diff --git a/public/images/flags/es.png b/public/images/country/es.png similarity index 100% rename from public/images/flags/es.png rename to public/images/country/es.png diff --git a/public/images/flags/et.png b/public/images/country/et.png similarity index 100% rename from public/images/flags/et.png rename to public/images/country/et.png diff --git a/public/images/flags/fi.png b/public/images/country/fi.png similarity index 100% rename from public/images/flags/fi.png rename to public/images/country/fi.png diff --git a/public/images/flags/fj.png b/public/images/country/fj.png similarity index 100% rename from public/images/flags/fj.png rename to public/images/country/fj.png diff --git a/public/images/flags/fk.png b/public/images/country/fk.png similarity index 100% rename from public/images/flags/fk.png rename to public/images/country/fk.png diff --git a/public/images/flags/fm.png b/public/images/country/fm.png similarity index 100% rename from public/images/flags/fm.png rename to public/images/country/fm.png diff --git a/public/images/flags/fo.png b/public/images/country/fo.png similarity index 100% rename from public/images/flags/fo.png rename to public/images/country/fo.png diff --git a/public/images/flags/fr.png b/public/images/country/fr.png similarity index 100% rename from public/images/flags/fr.png rename to public/images/country/fr.png diff --git a/public/images/flags/ga.png b/public/images/country/ga.png similarity index 100% rename from public/images/flags/ga.png rename to public/images/country/ga.png diff --git a/public/images/flags/gb-eng.png b/public/images/country/gb-eng.png similarity index 100% rename from public/images/flags/gb-eng.png rename to public/images/country/gb-eng.png diff --git a/public/images/flags/gb-nir.png b/public/images/country/gb-nir.png similarity index 100% rename from public/images/flags/gb-nir.png rename to public/images/country/gb-nir.png diff --git a/public/images/flags/gb-sct.png b/public/images/country/gb-sct.png similarity index 100% rename from public/images/flags/gb-sct.png rename to public/images/country/gb-sct.png diff --git a/public/images/flags/gb-wls.png b/public/images/country/gb-wls.png similarity index 100% rename from public/images/flags/gb-wls.png rename to public/images/country/gb-wls.png diff --git a/public/images/flags/gb.png b/public/images/country/gb.png similarity index 100% rename from public/images/flags/gb.png rename to public/images/country/gb.png diff --git a/public/images/flags/gd.png b/public/images/country/gd.png similarity index 100% rename from public/images/flags/gd.png rename to public/images/country/gd.png diff --git a/public/images/flags/ge.png b/public/images/country/ge.png similarity index 100% rename from public/images/flags/ge.png rename to public/images/country/ge.png diff --git a/public/images/flags/gf.png b/public/images/country/gf.png similarity index 100% rename from public/images/flags/gf.png rename to public/images/country/gf.png diff --git a/public/images/flags/gg.png b/public/images/country/gg.png similarity index 100% rename from public/images/flags/gg.png rename to public/images/country/gg.png diff --git a/public/images/flags/gh.png b/public/images/country/gh.png similarity index 100% rename from public/images/flags/gh.png rename to public/images/country/gh.png diff --git a/public/images/flags/gi.png b/public/images/country/gi.png similarity index 100% rename from public/images/flags/gi.png rename to public/images/country/gi.png diff --git a/public/images/flags/gl.png b/public/images/country/gl.png similarity index 100% rename from public/images/flags/gl.png rename to public/images/country/gl.png diff --git a/public/images/flags/gm.png b/public/images/country/gm.png similarity index 100% rename from public/images/flags/gm.png rename to public/images/country/gm.png diff --git a/public/images/flags/gn.png b/public/images/country/gn.png similarity index 100% rename from public/images/flags/gn.png rename to public/images/country/gn.png diff --git a/public/images/flags/gp.png b/public/images/country/gp.png similarity index 100% rename from public/images/flags/gp.png rename to public/images/country/gp.png diff --git a/public/images/flags/gq.png b/public/images/country/gq.png similarity index 100% rename from public/images/flags/gq.png rename to public/images/country/gq.png diff --git a/public/images/flags/gr.png b/public/images/country/gr.png similarity index 100% rename from public/images/flags/gr.png rename to public/images/country/gr.png diff --git a/public/images/flags/gs.png b/public/images/country/gs.png similarity index 100% rename from public/images/flags/gs.png rename to public/images/country/gs.png diff --git a/public/images/flags/gt.png b/public/images/country/gt.png similarity index 100% rename from public/images/flags/gt.png rename to public/images/country/gt.png diff --git a/public/images/flags/gu.png b/public/images/country/gu.png similarity index 100% rename from public/images/flags/gu.png rename to public/images/country/gu.png diff --git a/public/images/flags/gw.png b/public/images/country/gw.png similarity index 100% rename from public/images/flags/gw.png rename to public/images/country/gw.png diff --git a/public/images/flags/gy.png b/public/images/country/gy.png similarity index 100% rename from public/images/flags/gy.png rename to public/images/country/gy.png diff --git a/public/images/flags/hk.png b/public/images/country/hk.png similarity index 100% rename from public/images/flags/hk.png rename to public/images/country/hk.png diff --git a/public/images/flags/hm.png b/public/images/country/hm.png similarity index 100% rename from public/images/flags/hm.png rename to public/images/country/hm.png diff --git a/public/images/flags/hn.png b/public/images/country/hn.png similarity index 100% rename from public/images/flags/hn.png rename to public/images/country/hn.png diff --git a/public/images/flags/hr.png b/public/images/country/hr.png similarity index 100% rename from public/images/flags/hr.png rename to public/images/country/hr.png diff --git a/public/images/flags/ht.png b/public/images/country/ht.png similarity index 100% rename from public/images/flags/ht.png rename to public/images/country/ht.png diff --git a/public/images/flags/hu.png b/public/images/country/hu.png similarity index 100% rename from public/images/flags/hu.png rename to public/images/country/hu.png diff --git a/public/images/flags/id.png b/public/images/country/id.png similarity index 100% rename from public/images/flags/id.png rename to public/images/country/id.png diff --git a/public/images/flags/ie.png b/public/images/country/ie.png similarity index 100% rename from public/images/flags/ie.png rename to public/images/country/ie.png diff --git a/public/images/flags/il.png b/public/images/country/il.png similarity index 100% rename from public/images/flags/il.png rename to public/images/country/il.png diff --git a/public/images/flags/im.png b/public/images/country/im.png similarity index 100% rename from public/images/flags/im.png rename to public/images/country/im.png diff --git a/public/images/flags/in.png b/public/images/country/in.png similarity index 100% rename from public/images/flags/in.png rename to public/images/country/in.png diff --git a/public/images/flags/io.png b/public/images/country/io.png similarity index 100% rename from public/images/flags/io.png rename to public/images/country/io.png diff --git a/public/images/flags/iq.png b/public/images/country/iq.png similarity index 100% rename from public/images/flags/iq.png rename to public/images/country/iq.png diff --git a/public/images/flags/ir.png b/public/images/country/ir.png similarity index 100% rename from public/images/flags/ir.png rename to public/images/country/ir.png diff --git a/public/images/flags/is.png b/public/images/country/is.png similarity index 100% rename from public/images/flags/is.png rename to public/images/country/is.png diff --git a/public/images/flags/it.png b/public/images/country/it.png similarity index 100% rename from public/images/flags/it.png rename to public/images/country/it.png diff --git a/public/images/flags/je.png b/public/images/country/je.png similarity index 100% rename from public/images/flags/je.png rename to public/images/country/je.png diff --git a/public/images/flags/jm.png b/public/images/country/jm.png similarity index 100% rename from public/images/flags/jm.png rename to public/images/country/jm.png diff --git a/public/images/flags/jo.png b/public/images/country/jo.png similarity index 100% rename from public/images/flags/jo.png rename to public/images/country/jo.png diff --git a/public/images/flags/jp.png b/public/images/country/jp.png similarity index 100% rename from public/images/flags/jp.png rename to public/images/country/jp.png diff --git a/public/images/flags/ke.png b/public/images/country/ke.png similarity index 100% rename from public/images/flags/ke.png rename to public/images/country/ke.png diff --git a/public/images/flags/kg.png b/public/images/country/kg.png similarity index 100% rename from public/images/flags/kg.png rename to public/images/country/kg.png diff --git a/public/images/flags/kh.png b/public/images/country/kh.png similarity index 100% rename from public/images/flags/kh.png rename to public/images/country/kh.png diff --git a/public/images/flags/ki.png b/public/images/country/ki.png similarity index 100% rename from public/images/flags/ki.png rename to public/images/country/ki.png diff --git a/public/images/flags/km.png b/public/images/country/km.png similarity index 100% rename from public/images/flags/km.png rename to public/images/country/km.png diff --git a/public/images/flags/kn.png b/public/images/country/kn.png similarity index 100% rename from public/images/flags/kn.png rename to public/images/country/kn.png diff --git a/public/images/flags/kp.png b/public/images/country/kp.png similarity index 100% rename from public/images/flags/kp.png rename to public/images/country/kp.png diff --git a/public/images/flags/kr.png b/public/images/country/kr.png similarity index 100% rename from public/images/flags/kr.png rename to public/images/country/kr.png diff --git a/public/images/flags/kw.png b/public/images/country/kw.png similarity index 100% rename from public/images/flags/kw.png rename to public/images/country/kw.png diff --git a/public/images/flags/ky.png b/public/images/country/ky.png similarity index 100% rename from public/images/flags/ky.png rename to public/images/country/ky.png diff --git a/public/images/flags/kz.png b/public/images/country/kz.png similarity index 100% rename from public/images/flags/kz.png rename to public/images/country/kz.png diff --git a/public/images/flags/la.png b/public/images/country/la.png similarity index 100% rename from public/images/flags/la.png rename to public/images/country/la.png diff --git a/public/images/flags/lb.png b/public/images/country/lb.png similarity index 100% rename from public/images/flags/lb.png rename to public/images/country/lb.png diff --git a/public/images/flags/lc.png b/public/images/country/lc.png similarity index 100% rename from public/images/flags/lc.png rename to public/images/country/lc.png diff --git a/public/images/flags/li.png b/public/images/country/li.png similarity index 100% rename from public/images/flags/li.png rename to public/images/country/li.png diff --git a/public/images/flags/lk.png b/public/images/country/lk.png similarity index 100% rename from public/images/flags/lk.png rename to public/images/country/lk.png diff --git a/public/images/flags/lr.png b/public/images/country/lr.png similarity index 100% rename from public/images/flags/lr.png rename to public/images/country/lr.png diff --git a/public/images/flags/ls.png b/public/images/country/ls.png similarity index 100% rename from public/images/flags/ls.png rename to public/images/country/ls.png diff --git a/public/images/flags/lt.png b/public/images/country/lt.png similarity index 100% rename from public/images/flags/lt.png rename to public/images/country/lt.png diff --git a/public/images/flags/lu.png b/public/images/country/lu.png similarity index 100% rename from public/images/flags/lu.png rename to public/images/country/lu.png diff --git a/public/images/flags/lv.png b/public/images/country/lv.png similarity index 100% rename from public/images/flags/lv.png rename to public/images/country/lv.png diff --git a/public/images/flags/ly.png b/public/images/country/ly.png similarity index 100% rename from public/images/flags/ly.png rename to public/images/country/ly.png diff --git a/public/images/flags/ma.png b/public/images/country/ma.png similarity index 100% rename from public/images/flags/ma.png rename to public/images/country/ma.png diff --git a/public/images/flags/mc.png b/public/images/country/mc.png similarity index 100% rename from public/images/flags/mc.png rename to public/images/country/mc.png diff --git a/public/images/flags/md.png b/public/images/country/md.png similarity index 100% rename from public/images/flags/md.png rename to public/images/country/md.png diff --git a/public/images/flags/me.png b/public/images/country/me.png similarity index 100% rename from public/images/flags/me.png rename to public/images/country/me.png diff --git a/public/images/flags/mf.png b/public/images/country/mf.png similarity index 100% rename from public/images/flags/mf.png rename to public/images/country/mf.png diff --git a/public/images/flags/mg.png b/public/images/country/mg.png similarity index 100% rename from public/images/flags/mg.png rename to public/images/country/mg.png diff --git a/public/images/flags/mh.png b/public/images/country/mh.png similarity index 100% rename from public/images/flags/mh.png rename to public/images/country/mh.png diff --git a/public/images/flags/mk.png b/public/images/country/mk.png similarity index 100% rename from public/images/flags/mk.png rename to public/images/country/mk.png diff --git a/public/images/flags/ml.png b/public/images/country/ml.png similarity index 100% rename from public/images/flags/ml.png rename to public/images/country/ml.png diff --git a/public/images/flags/mm.png b/public/images/country/mm.png similarity index 100% rename from public/images/flags/mm.png rename to public/images/country/mm.png diff --git a/public/images/flags/mn.png b/public/images/country/mn.png similarity index 100% rename from public/images/flags/mn.png rename to public/images/country/mn.png diff --git a/public/images/flags/mo.png b/public/images/country/mo.png similarity index 100% rename from public/images/flags/mo.png rename to public/images/country/mo.png diff --git a/public/images/flags/mp.png b/public/images/country/mp.png similarity index 100% rename from public/images/flags/mp.png rename to public/images/country/mp.png diff --git a/public/images/flags/mq.png b/public/images/country/mq.png similarity index 100% rename from public/images/flags/mq.png rename to public/images/country/mq.png diff --git a/public/images/flags/mr.png b/public/images/country/mr.png similarity index 100% rename from public/images/flags/mr.png rename to public/images/country/mr.png diff --git a/public/images/flags/ms.png b/public/images/country/ms.png similarity index 100% rename from public/images/flags/ms.png rename to public/images/country/ms.png diff --git a/public/images/flags/mt.png b/public/images/country/mt.png similarity index 100% rename from public/images/flags/mt.png rename to public/images/country/mt.png diff --git a/public/images/flags/mu.png b/public/images/country/mu.png similarity index 100% rename from public/images/flags/mu.png rename to public/images/country/mu.png diff --git a/public/images/flags/mv.png b/public/images/country/mv.png similarity index 100% rename from public/images/flags/mv.png rename to public/images/country/mv.png diff --git a/public/images/flags/mw.png b/public/images/country/mw.png similarity index 100% rename from public/images/flags/mw.png rename to public/images/country/mw.png diff --git a/public/images/flags/mx.png b/public/images/country/mx.png similarity index 100% rename from public/images/flags/mx.png rename to public/images/country/mx.png diff --git a/public/images/flags/my.png b/public/images/country/my.png similarity index 100% rename from public/images/flags/my.png rename to public/images/country/my.png diff --git a/public/images/flags/mz.png b/public/images/country/mz.png similarity index 100% rename from public/images/flags/mz.png rename to public/images/country/mz.png diff --git a/public/images/flags/na.png b/public/images/country/na.png similarity index 100% rename from public/images/flags/na.png rename to public/images/country/na.png diff --git a/public/images/flags/nc.png b/public/images/country/nc.png similarity index 100% rename from public/images/flags/nc.png rename to public/images/country/nc.png diff --git a/public/images/flags/ne.png b/public/images/country/ne.png similarity index 100% rename from public/images/flags/ne.png rename to public/images/country/ne.png diff --git a/public/images/flags/nf.png b/public/images/country/nf.png similarity index 100% rename from public/images/flags/nf.png rename to public/images/country/nf.png diff --git a/public/images/flags/ng.png b/public/images/country/ng.png similarity index 100% rename from public/images/flags/ng.png rename to public/images/country/ng.png diff --git a/public/images/flags/ni.png b/public/images/country/ni.png similarity index 100% rename from public/images/flags/ni.png rename to public/images/country/ni.png diff --git a/public/images/flags/nl.png b/public/images/country/nl.png similarity index 100% rename from public/images/flags/nl.png rename to public/images/country/nl.png diff --git a/public/images/flags/no.png b/public/images/country/no.png similarity index 100% rename from public/images/flags/no.png rename to public/images/country/no.png diff --git a/public/images/flags/np.png b/public/images/country/np.png similarity index 100% rename from public/images/flags/np.png rename to public/images/country/np.png diff --git a/public/images/flags/nr.png b/public/images/country/nr.png similarity index 100% rename from public/images/flags/nr.png rename to public/images/country/nr.png diff --git a/public/images/flags/nu.png b/public/images/country/nu.png similarity index 100% rename from public/images/flags/nu.png rename to public/images/country/nu.png diff --git a/public/images/flags/nz.png b/public/images/country/nz.png similarity index 100% rename from public/images/flags/nz.png rename to public/images/country/nz.png diff --git a/public/images/flags/om.png b/public/images/country/om.png similarity index 100% rename from public/images/flags/om.png rename to public/images/country/om.png diff --git a/public/images/flags/pa.png b/public/images/country/pa.png similarity index 100% rename from public/images/flags/pa.png rename to public/images/country/pa.png diff --git a/public/images/flags/pe.png b/public/images/country/pe.png similarity index 100% rename from public/images/flags/pe.png rename to public/images/country/pe.png diff --git a/public/images/flags/pf.png b/public/images/country/pf.png similarity index 100% rename from public/images/flags/pf.png rename to public/images/country/pf.png diff --git a/public/images/flags/pg.png b/public/images/country/pg.png similarity index 100% rename from public/images/flags/pg.png rename to public/images/country/pg.png diff --git a/public/images/flags/ph.png b/public/images/country/ph.png similarity index 100% rename from public/images/flags/ph.png rename to public/images/country/ph.png diff --git a/public/images/flags/pk.png b/public/images/country/pk.png similarity index 100% rename from public/images/flags/pk.png rename to public/images/country/pk.png diff --git a/public/images/flags/pl.png b/public/images/country/pl.png similarity index 100% rename from public/images/flags/pl.png rename to public/images/country/pl.png diff --git a/public/images/flags/pm.png b/public/images/country/pm.png similarity index 100% rename from public/images/flags/pm.png rename to public/images/country/pm.png diff --git a/public/images/flags/pn.png b/public/images/country/pn.png similarity index 100% rename from public/images/flags/pn.png rename to public/images/country/pn.png diff --git a/public/images/flags/pr.png b/public/images/country/pr.png similarity index 100% rename from public/images/flags/pr.png rename to public/images/country/pr.png diff --git a/public/images/flags/ps.png b/public/images/country/ps.png similarity index 100% rename from public/images/flags/ps.png rename to public/images/country/ps.png diff --git a/public/images/flags/pt.png b/public/images/country/pt.png similarity index 100% rename from public/images/flags/pt.png rename to public/images/country/pt.png diff --git a/public/images/flags/pw.png b/public/images/country/pw.png similarity index 100% rename from public/images/flags/pw.png rename to public/images/country/pw.png diff --git a/public/images/flags/py.png b/public/images/country/py.png similarity index 100% rename from public/images/flags/py.png rename to public/images/country/py.png diff --git a/public/images/flags/qa.png b/public/images/country/qa.png similarity index 100% rename from public/images/flags/qa.png rename to public/images/country/qa.png diff --git a/public/images/flags/re.png b/public/images/country/re.png similarity index 100% rename from public/images/flags/re.png rename to public/images/country/re.png diff --git a/public/images/flags/ro.png b/public/images/country/ro.png similarity index 100% rename from public/images/flags/ro.png rename to public/images/country/ro.png diff --git a/public/images/flags/rs.png b/public/images/country/rs.png similarity index 100% rename from public/images/flags/rs.png rename to public/images/country/rs.png diff --git a/public/images/flags/ru.png b/public/images/country/ru.png similarity index 100% rename from public/images/flags/ru.png rename to public/images/country/ru.png diff --git a/public/images/flags/rw.png b/public/images/country/rw.png similarity index 100% rename from public/images/flags/rw.png rename to public/images/country/rw.png diff --git a/public/images/flags/sa.png b/public/images/country/sa.png similarity index 100% rename from public/images/flags/sa.png rename to public/images/country/sa.png diff --git a/public/images/flags/sb.png b/public/images/country/sb.png similarity index 100% rename from public/images/flags/sb.png rename to public/images/country/sb.png diff --git a/public/images/flags/sc.png b/public/images/country/sc.png similarity index 100% rename from public/images/flags/sc.png rename to public/images/country/sc.png diff --git a/public/images/flags/sd.png b/public/images/country/sd.png similarity index 100% rename from public/images/flags/sd.png rename to public/images/country/sd.png diff --git a/public/images/flags/se.png b/public/images/country/se.png similarity index 100% rename from public/images/flags/se.png rename to public/images/country/se.png diff --git a/public/images/flags/sg.png b/public/images/country/sg.png similarity index 100% rename from public/images/flags/sg.png rename to public/images/country/sg.png diff --git a/public/images/flags/sh.png b/public/images/country/sh.png similarity index 100% rename from public/images/flags/sh.png rename to public/images/country/sh.png diff --git a/public/images/flags/si.png b/public/images/country/si.png similarity index 100% rename from public/images/flags/si.png rename to public/images/country/si.png diff --git a/public/images/flags/sj.png b/public/images/country/sj.png similarity index 100% rename from public/images/flags/sj.png rename to public/images/country/sj.png diff --git a/public/images/flags/sk.png b/public/images/country/sk.png similarity index 100% rename from public/images/flags/sk.png rename to public/images/country/sk.png diff --git a/public/images/flags/sl.png b/public/images/country/sl.png similarity index 100% rename from public/images/flags/sl.png rename to public/images/country/sl.png diff --git a/public/images/flags/sm.png b/public/images/country/sm.png similarity index 100% rename from public/images/flags/sm.png rename to public/images/country/sm.png diff --git a/public/images/flags/sn.png b/public/images/country/sn.png similarity index 100% rename from public/images/flags/sn.png rename to public/images/country/sn.png diff --git a/public/images/flags/so.png b/public/images/country/so.png similarity index 100% rename from public/images/flags/so.png rename to public/images/country/so.png diff --git a/public/images/flags/sr.png b/public/images/country/sr.png similarity index 100% rename from public/images/flags/sr.png rename to public/images/country/sr.png diff --git a/public/images/flags/ss.png b/public/images/country/ss.png similarity index 100% rename from public/images/flags/ss.png rename to public/images/country/ss.png diff --git a/public/images/flags/st.png b/public/images/country/st.png similarity index 100% rename from public/images/flags/st.png rename to public/images/country/st.png diff --git a/public/images/flags/sv.png b/public/images/country/sv.png similarity index 100% rename from public/images/flags/sv.png rename to public/images/country/sv.png diff --git a/public/images/flags/sx.png b/public/images/country/sx.png similarity index 100% rename from public/images/flags/sx.png rename to public/images/country/sx.png diff --git a/public/images/flags/sy.png b/public/images/country/sy.png similarity index 100% rename from public/images/flags/sy.png rename to public/images/country/sy.png diff --git a/public/images/flags/sz.png b/public/images/country/sz.png similarity index 100% rename from public/images/flags/sz.png rename to public/images/country/sz.png diff --git a/public/images/flags/tc.png b/public/images/country/tc.png similarity index 100% rename from public/images/flags/tc.png rename to public/images/country/tc.png diff --git a/public/images/flags/td.png b/public/images/country/td.png similarity index 100% rename from public/images/flags/td.png rename to public/images/country/td.png diff --git a/public/images/flags/tf.png b/public/images/country/tf.png similarity index 100% rename from public/images/flags/tf.png rename to public/images/country/tf.png diff --git a/public/images/flags/tg.png b/public/images/country/tg.png similarity index 100% rename from public/images/flags/tg.png rename to public/images/country/tg.png diff --git a/public/images/flags/th.png b/public/images/country/th.png similarity index 100% rename from public/images/flags/th.png rename to public/images/country/th.png diff --git a/public/images/flags/tj.png b/public/images/country/tj.png similarity index 100% rename from public/images/flags/tj.png rename to public/images/country/tj.png diff --git a/public/images/flags/tk.png b/public/images/country/tk.png similarity index 100% rename from public/images/flags/tk.png rename to public/images/country/tk.png diff --git a/public/images/flags/tl.png b/public/images/country/tl.png similarity index 100% rename from public/images/flags/tl.png rename to public/images/country/tl.png diff --git a/public/images/flags/tm.png b/public/images/country/tm.png similarity index 100% rename from public/images/flags/tm.png rename to public/images/country/tm.png diff --git a/public/images/flags/tn.png b/public/images/country/tn.png similarity index 100% rename from public/images/flags/tn.png rename to public/images/country/tn.png diff --git a/public/images/flags/to.png b/public/images/country/to.png similarity index 100% rename from public/images/flags/to.png rename to public/images/country/to.png diff --git a/public/images/flags/tr.png b/public/images/country/tr.png similarity index 100% rename from public/images/flags/tr.png rename to public/images/country/tr.png diff --git a/public/images/flags/tt.png b/public/images/country/tt.png similarity index 100% rename from public/images/flags/tt.png rename to public/images/country/tt.png diff --git a/public/images/flags/tv.png b/public/images/country/tv.png similarity index 100% rename from public/images/flags/tv.png rename to public/images/country/tv.png diff --git a/public/images/flags/tw.png b/public/images/country/tw.png similarity index 100% rename from public/images/flags/tw.png rename to public/images/country/tw.png diff --git a/public/images/flags/tz.png b/public/images/country/tz.png similarity index 100% rename from public/images/flags/tz.png rename to public/images/country/tz.png diff --git a/public/images/flags/ua.png b/public/images/country/ua.png similarity index 100% rename from public/images/flags/ua.png rename to public/images/country/ua.png diff --git a/public/images/flags/ug.png b/public/images/country/ug.png similarity index 100% rename from public/images/flags/ug.png rename to public/images/country/ug.png diff --git a/public/images/flags/um.png b/public/images/country/um.png similarity index 100% rename from public/images/flags/um.png rename to public/images/country/um.png diff --git a/public/images/flags/xx.png b/public/images/country/unknown.png similarity index 100% rename from public/images/flags/xx.png rename to public/images/country/unknown.png diff --git a/public/images/flags/us.png b/public/images/country/us.png similarity index 100% rename from public/images/flags/us.png rename to public/images/country/us.png diff --git a/public/images/flags/uy.png b/public/images/country/uy.png similarity index 100% rename from public/images/flags/uy.png rename to public/images/country/uy.png diff --git a/public/images/flags/uz.png b/public/images/country/uz.png similarity index 100% rename from public/images/flags/uz.png rename to public/images/country/uz.png diff --git a/public/images/flags/va.png b/public/images/country/va.png similarity index 100% rename from public/images/flags/va.png rename to public/images/country/va.png diff --git a/public/images/flags/vc.png b/public/images/country/vc.png similarity index 100% rename from public/images/flags/vc.png rename to public/images/country/vc.png diff --git a/public/images/flags/ve.png b/public/images/country/ve.png similarity index 100% rename from public/images/flags/ve.png rename to public/images/country/ve.png diff --git a/public/images/flags/vg.png b/public/images/country/vg.png similarity index 100% rename from public/images/flags/vg.png rename to public/images/country/vg.png diff --git a/public/images/flags/vi.png b/public/images/country/vi.png similarity index 100% rename from public/images/flags/vi.png rename to public/images/country/vi.png diff --git a/public/images/flags/vn.png b/public/images/country/vn.png similarity index 100% rename from public/images/flags/vn.png rename to public/images/country/vn.png diff --git a/public/images/flags/vu.png b/public/images/country/vu.png similarity index 100% rename from public/images/flags/vu.png rename to public/images/country/vu.png diff --git a/public/images/flags/wf.png b/public/images/country/wf.png similarity index 100% rename from public/images/flags/wf.png rename to public/images/country/wf.png diff --git a/public/images/flags/ws.png b/public/images/country/ws.png similarity index 100% rename from public/images/flags/ws.png rename to public/images/country/ws.png diff --git a/public/images/flags/xk.png b/public/images/country/xk.png similarity index 100% rename from public/images/flags/xk.png rename to public/images/country/xk.png diff --git a/public/images/flags/ye.png b/public/images/country/ye.png similarity index 100% rename from public/images/flags/ye.png rename to public/images/country/ye.png diff --git a/public/images/flags/yt.png b/public/images/country/yt.png similarity index 100% rename from public/images/flags/yt.png rename to public/images/country/yt.png diff --git a/public/images/flags/za.png b/public/images/country/za.png similarity index 100% rename from public/images/flags/za.png rename to public/images/country/za.png diff --git a/public/images/flags/zm.png b/public/images/country/zm.png similarity index 100% rename from public/images/flags/zm.png rename to public/images/country/zm.png diff --git a/public/images/flags/zw.png b/public/images/country/zw.png similarity index 100% rename from public/images/flags/zw.png rename to public/images/country/zw.png diff --git a/src/app/(main)/websites/[websiteId]/WebsiteDetailsPage.tsx b/src/app/(main)/websites/[websiteId]/WebsiteDetailsPage.tsx index 2439040a..3eeeb18f 100644 --- a/src/app/(main)/websites/[websiteId]/WebsiteDetailsPage.tsx +++ b/src/app/(main)/websites/[websiteId]/WebsiteDetailsPage.tsx @@ -7,7 +7,6 @@ import WebsiteExpandedView from './WebsiteExpandedView'; import WebsiteHeader from './WebsiteHeader'; import WebsiteMetricsBar from './WebsiteMetricsBar'; import WebsiteTableView from './WebsiteTableView'; -import WebsiteProvider from './WebsiteProvider'; import { FILTER_COLUMNS } from 'lib/constants'; export default function WebsiteDetailsPage({ websiteId }: { websiteId: string }) { @@ -25,13 +24,13 @@ export default function WebsiteDetailsPage({ websiteId }: { websiteId: string }) }, {}); return ( - + <> {!view && } {view && } - + ); } diff --git a/src/app/(main)/websites/[websiteId]/WebsiteProvider.tsx b/src/app/(main)/websites/[websiteId]/WebsiteProvider.tsx index 76d40b70..3cdfdd5d 100644 --- a/src/app/(main)/websites/[websiteId]/WebsiteProvider.tsx +++ b/src/app/(main)/websites/[websiteId]/WebsiteProvider.tsx @@ -1,3 +1,4 @@ +'use client'; import { createContext, ReactNode, useEffect } from 'react'; import { useModified, useWebsite } from 'components/hooks'; import { Loading } from 'react-basics'; diff --git a/src/app/(main)/websites/[websiteId]/compare/WebsiteComparePage.tsx b/src/app/(main)/websites/[websiteId]/compare/WebsiteComparePage.tsx index 1455b76f..21cd6597 100644 --- a/src/app/(main)/websites/[websiteId]/compare/WebsiteComparePage.tsx +++ b/src/app/(main)/websites/[websiteId]/compare/WebsiteComparePage.tsx @@ -6,7 +6,6 @@ import { useNavigation } from 'components/hooks'; import { FILTER_COLUMNS } from 'lib/constants'; import WebsiteChart from '../WebsiteChart'; import WebsiteCompareTables from './WebsiteCompareTables'; -import WebsiteProvider from '../WebsiteProvider'; export function WebsiteComparePage({ websiteId }) { const { query } = useNavigation(); @@ -19,13 +18,13 @@ export function WebsiteComparePage({ websiteId }) { }, {}); return ( - + <> - + ); } diff --git a/src/app/(main)/websites/[websiteId]/layout.tsx b/src/app/(main)/websites/[websiteId]/layout.tsx new file mode 100644 index 00000000..1729e3ed --- /dev/null +++ b/src/app/(main)/websites/[websiteId]/layout.tsx @@ -0,0 +1,17 @@ +import { Metadata } from 'next'; +import WebsiteProvider from './WebsiteProvider'; + +export default function ({ children, params: { websiteId } }) { + if (process.env.cloudMode) { + return null; + } + + return {children}; +} + +export const metadata: Metadata = { + title: { + template: '%s | Umami', + default: 'Websites | Umami', + }, +}; diff --git a/src/app/(main)/websites/[websiteId]/realtime/RealtimeCountries.tsx b/src/app/(main)/websites/[websiteId]/realtime/RealtimeCountries.tsx index 2dd69146..ae4967da 100644 --- a/src/app/(main)/websites/[websiteId]/realtime/RealtimeCountries.tsx +++ b/src/app/(main)/websites/[websiteId]/realtime/RealtimeCountries.tsx @@ -3,19 +3,17 @@ import ListTable from 'components/metrics/ListTable'; import { useLocale, useCountryNames, useMessages } from 'components/hooks'; import classNames from 'classnames'; import styles from './RealtimeCountries.module.css'; +import TypeIcon from 'components/common/TypeIcon'; export function RealtimeCountries({ data }) { const { formatMessage, labels } = useMessages(); const { locale } = useLocale(); - const countryNames = useCountryNames(locale); + const { countryNames } = useCountryNames(locale); const renderCountryName = useCallback( ({ x: code }) => ( - {code} + {countryNames[code]} ), diff --git a/src/app/(main)/websites/[websiteId]/realtime/RealtimeLog.tsx b/src/app/(main)/websites/[websiteId]/realtime/RealtimeLog.tsx index 97fb1659..ad0314e7 100644 --- a/src/app/(main)/websites/[websiteId]/realtime/RealtimeLog.tsx +++ b/src/app/(main)/websites/[websiteId]/realtime/RealtimeLog.tsx @@ -32,7 +32,7 @@ export function RealtimeLog({ data }: { data: RealtimeData }) { const { formatMessage, labels, messages, FormattedMessage } = useMessages(); const { formatValue } = useFormat(); const { locale } = useLocale(); - const countryNames = useCountryNames(locale); + const { countryNames } = useCountryNames(locale); const [filter, setFilter] = useState(TYPE_ALL); const buttons = [ diff --git a/src/app/(main)/websites/[websiteId]/realtime/WebsiteRealtimePage.tsx b/src/app/(main)/websites/[websiteId]/realtime/WebsiteRealtimePage.tsx index d8869547..7030cc32 100644 --- a/src/app/(main)/websites/[websiteId]/realtime/WebsiteRealtimePage.tsx +++ b/src/app/(main)/websites/[websiteId]/realtime/WebsiteRealtimePage.tsx @@ -10,7 +10,6 @@ import RealtimeHeader from './RealtimeHeader'; import RealtimeUrls from './RealtimeUrls'; import RealtimeCountries from './RealtimeCountries'; import WebsiteHeader from '../WebsiteHeader'; -import WebsiteProvider from '../WebsiteProvider'; import { percentFilter } from 'lib/filters'; export function WebsiteRealtimePage({ websiteId }) { @@ -27,7 +26,7 @@ export function WebsiteRealtimePage({ websiteId }) { ); return ( - + <> @@ -41,7 +40,7 @@ export function WebsiteRealtimePage({ websiteId }) { - + ); } diff --git a/src/app/(main)/websites/[websiteId]/sessions/SessionsTable.tsx b/src/app/(main)/websites/[websiteId]/sessions/SessionsTable.tsx index 7bae8b68..d4cf827a 100644 --- a/src/app/(main)/websites/[websiteId]/sessions/SessionsTable.tsx +++ b/src/app/(main)/websites/[websiteId]/sessions/SessionsTable.tsx @@ -1,7 +1,6 @@ import Link from 'next/link'; import { GridColumn, GridTable, useBreakpoint } from 'react-basics'; import { useFormat, useMessages } from 'components/hooks'; -import { formatDistanceToNow } from 'date-fns'; import Profile from 'components/common/Profile'; export function SessionsTable({ data = [] }: { data: any[]; showDomain?: boolean }) { @@ -12,14 +11,10 @@ export function SessionsTable({ data = [] }: { data: any[]; showDomain?: boolean return ( - {row => } + {row => } - {row => ( - - {row.id} ({row.firstAt !== row.lastAt ? 'YES' : 'NO'}) - - )} + {row => {row.id}} {row => formatValue(row.country, 'country')} @@ -32,8 +27,8 @@ export function SessionsTable({ data = [] }: { data: any[]; showDomain?: boolean {row => formatValue(row.device, 'device')} - - {row => formatDistanceToNow(new Date(row.createdAt))} + + {row => row.lastAt} ); diff --git a/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionDetailsPage.module.css b/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionDetailsPage.module.css index 2f71e9a8..21bb011a 100644 --- a/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionDetailsPage.module.css +++ b/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionDetailsPage.module.css @@ -1,3 +1,18 @@ .page { display: grid; + grid-template-columns: 300px 1fr; +} + +.sidebar { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 20px; + padding-right: 20px; + border-right: 1px solid var(--base300); +} + +.content { + padding-left: 20px; } diff --git a/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionDetailsPage.tsx b/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionDetailsPage.tsx index fc6945ce..5aaac952 100644 --- a/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionDetailsPage.tsx +++ b/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionDetailsPage.tsx @@ -3,6 +3,7 @@ import WebsiteHeader from '../../WebsiteHeader'; import SessionInfo from './SessionInfo'; import { useSession } from 'components/hooks'; import { Loading } from 'react-basics'; +import Profile from 'components/common/Profile'; import styles from './SessionDetailsPage.module.css'; export default function SessionDetailsPage({ @@ -19,9 +20,15 @@ export default function SessionDetailsPage({ } return ( -
+ <> - -
+
+
+ + +
+
oh hi.
+
+ ); } diff --git a/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionInfo.module.css b/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionInfo.module.css new file mode 100644 index 00000000..c17eadf5 --- /dev/null +++ b/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionInfo.module.css @@ -0,0 +1,17 @@ +.info { + display: grid; + gap: 10px; +} + +.info dt { + color: var(--font-color200); + font-weight: bold; +} + +.info dd { + display: flex; + gap: 10px; + align-items: center; + margin: 5px 0 28px; + text-align: left; +} diff --git a/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionInfo.tsx b/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionInfo.tsx index 051703a3..cae200ab 100644 --- a/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionInfo.tsx +++ b/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionInfo.tsx @@ -1,17 +1,62 @@ -import Profile from 'components/common/Profile'; +import { format } from 'date-fns'; +import { useFormat, useLocale, useMessages, useRegionNames } from 'components/hooks'; +import TypeIcon from 'components/common/TypeIcon'; +import { Icon, CopyIcon } from 'react-basics'; +import Icons from 'components/icons'; +import styles from './SessionInfo.module.css'; export default function SessionInfo({ data }) { + const { locale } = useLocale(); + const { formatMessage, labels } = useMessages(); + const { formatValue } = useFormat(); + const { getRegionName } = useRegionNames(locale); + return ( -

- +
ID
-
{data?.id}
-
Country
-
{data?.country}
-
City
-
{data?.city}
+
+ {data?.id} +
+
{formatMessage(labels.firstSeen)}
+
{format(new Date(data?.firstAt), 'PPPpp')}
+
{formatMessage(labels.lastSeen)}
+
{format(new Date(data?.lastAt), 'PPPpp')}
+
{formatMessage(labels.country)}
+
+ + {formatValue(data?.country, 'country')} +
+
{formatMessage(labels.region)}
+
+ + + + {getRegionName(data?.subdivision1)} +
+
{formatMessage(labels.city)}
+
+ + + + {data?.city} +
+
{formatMessage(labels.os)}
+
+ + {formatValue(data?.os, 'os')} +
+
{formatMessage(labels.device)}
+
+ + {formatValue(data?.device, 'device')} +
+
{formatMessage(labels.browser)}
+
+ + {formatValue(data?.browser, 'browser')} +
-

+ ); } diff --git a/src/components/common/TypeIcon.tsx b/src/components/common/TypeIcon.tsx new file mode 100644 index 00000000..8952bb26 --- /dev/null +++ b/src/components/common/TypeIcon.tsx @@ -0,0 +1,18 @@ +export function TypeIcon({ + type, + value, +}: { + type: 'browser' | 'country' | 'device' | 'os'; + value: string; +}) { + return ( + {value} + ); +} + +export default TypeIcon; diff --git a/src/components/hooks/index.ts b/src/components/hooks/index.ts index b0271ff2..515255e6 100644 --- a/src/components/hooks/index.ts +++ b/src/components/hooks/index.ts @@ -32,6 +32,7 @@ export * from './useLocale'; export * from './useMessages'; export * from './useModified'; export * from './useNavigation'; +export * from './useRegionNames'; export * from './useSticky'; export * from './useTeamUrl'; export * from './useTheme'; diff --git a/src/components/hooks/useCountryNames.ts b/src/components/hooks/useCountryNames.ts index 17b594b6..2bdaa94e 100644 --- a/src/components/hooks/useCountryNames.ts +++ b/src/components/hooks/useCountryNames.ts @@ -28,7 +28,7 @@ export function useCountryNames(locale: string) { } }, [locale]); - return list; + return { countryNames: list }; } export default useCountryNames; diff --git a/src/components/hooks/useFormat.ts b/src/components/hooks/useFormat.ts index 57edfa52..631b3f03 100644 --- a/src/components/hooks/useFormat.ts +++ b/src/components/hooks/useFormat.ts @@ -7,7 +7,7 @@ import regions from '../../../public/iso-3166-2.json'; export function useFormat() { const { formatMessage, labels } = useMessages(); const { locale } = useLocale(); - const countryNames = useCountryNames(locale); + const { countryNames } = useCountryNames(locale); const formatOS = (value: string): string => { return OS_NAMES[value] || value; diff --git a/src/components/hooks/useRegionNames.ts b/src/components/hooks/useRegionNames.ts new file mode 100644 index 00000000..1ba7feaa --- /dev/null +++ b/src/components/hooks/useRegionNames.ts @@ -0,0 +1,19 @@ +import useCountryNames from './useCountryNames'; +import regions from '../../../public/iso-3166-2.json'; + +export function useRegionNames(locale: string) { + const { countryNames } = useCountryNames(locale); + + const getRegionName = (regionCode: string, countryCode?: string) => { + if (!countryCode) { + return regions[regionCode]; + } + + const region = regionCode.includes('-') ? regionCode : `${countryCode}-${regionCode}`; + return regions[region] ? `${regions[region]}, ${countryNames[countryCode]}` : region; + }; + + return { regionNames: regions, getRegionName }; +} + +export default useRegionNames; diff --git a/src/components/icons.ts b/src/components/icons.ts index 8e5a481c..422f042a 100644 --- a/src/components/icons.ts +++ b/src/components/icons.ts @@ -11,6 +11,7 @@ import Dashboard from 'assets/dashboard.svg'; import Eye from 'assets/eye.svg'; import Gear from 'assets/gear.svg'; import Globe from 'assets/globe.svg'; +import Location from 'assets/location.svg'; import Lock from 'assets/lock.svg'; import Logo from 'assets/logo.svg'; import Magnet from 'assets/magnet.svg'; @@ -38,6 +39,7 @@ const icons = { Eye, Gear, Globe, + Location, Lock, Logo, Magnet, diff --git a/src/components/messages.ts b/src/components/messages.ts index 66090762..764348fa 100644 --- a/src/components/messages.ts +++ b/src/components/messages.ts @@ -272,6 +272,8 @@ export const labels = defineMessages({ previous: { id: 'label.previous', defaultMessage: 'Previous' }, previousPeriod: { id: 'label.previous-period', defaultMessage: 'Previous period' }, previousYear: { id: 'label.previous-year', defaultMessage: 'Previous year' }, + lastSeen: { id: 'label.last-seen', defaultMessage: 'Last seen' }, + firstSeen: { id: 'label.first-seen', defaultMessage: 'First seen' }, }); export const messages = defineMessages({ diff --git a/src/components/metrics/BrowsersTable.tsx b/src/components/metrics/BrowsersTable.tsx index 004b5e43..d0cec124 100644 --- a/src/components/metrics/BrowsersTable.tsx +++ b/src/components/metrics/BrowsersTable.tsx @@ -2,6 +2,7 @@ import FilterLink from 'components/common/FilterLink'; import MetricsTable, { MetricsTableProps } from 'components/metrics/MetricsTable'; import { useMessages } from 'components/hooks'; import { useFormat } from 'components/hooks'; +import TypeIcon from 'components/common/TypeIcon'; export function BrowsersTable(props: MetricsTableProps) { const { formatMessage, labels } = useMessages(); @@ -10,12 +11,7 @@ export function BrowsersTable(props: MetricsTableProps) { function renderLink({ x: browser }) { return ( - {browser} + ); } diff --git a/src/components/metrics/CitiesTable.tsx b/src/components/metrics/CitiesTable.tsx index ee2d1005..b3573b5c 100644 --- a/src/components/metrics/CitiesTable.tsx +++ b/src/components/metrics/CitiesTable.tsx @@ -1,6 +1,7 @@ import MetricsTable, { MetricsTableProps } from './MetricsTable'; import { emptyFilter } from 'lib/filters'; import FilterLink from 'components/common/FilterLink'; +import TypeIcon from 'components/common/TypeIcon'; import { useLocale } from 'components/hooks'; import { useMessages } from 'components/hooks'; import { useCountryNames } from 'components/hooks'; @@ -8,7 +9,7 @@ import { useCountryNames } from 'components/hooks'; export function CitiesTable(props: MetricsTableProps) { const { locale } = useLocale(); const { formatMessage, labels } = useMessages(); - const countryNames = useCountryNames(locale); + const { countryNames } = useCountryNames(locale); const renderLabel = (city: string, country: string) => { const countryName = countryNames[country]; @@ -18,12 +19,7 @@ export function CitiesTable(props: MetricsTableProps) { const renderLink = ({ x: city, country }) => { return ( - {country && ( - {country} - )} + {country && } ); }; diff --git a/src/components/metrics/CountriesTable.tsx b/src/components/metrics/CountriesTable.tsx index 3e7c0af0..87a7838e 100644 --- a/src/components/metrics/CountriesTable.tsx +++ b/src/components/metrics/CountriesTable.tsx @@ -2,6 +2,7 @@ import FilterLink from 'components/common/FilterLink'; import { useCountryNames } from 'components/hooks'; import { useLocale, useMessages, useFormat } from 'components/hooks'; import MetricsTable, { MetricsTableProps } from './MetricsTable'; +import TypeIcon from 'components/common/TypeIcon'; export function CountriesTable({ onDataLoad, @@ -10,7 +11,7 @@ export function CountriesTable({ onDataLoad: (data: any) => void; } & MetricsTableProps) { const { locale } = useLocale(); - const countryNames = useCountryNames(locale); + const { countryNames } = useCountryNames(locale); const { formatMessage, labels } = useMessages(); const { formatCountry } = useFormat(); @@ -26,10 +27,7 @@ export function CountriesTable({ value={countryNames[code] && code} label={formatCountry(code)} > - {code} + ); }; diff --git a/src/components/metrics/DevicesTable.tsx b/src/components/metrics/DevicesTable.tsx index e3db60ea..f2f3f1aa 100644 --- a/src/components/metrics/DevicesTable.tsx +++ b/src/components/metrics/DevicesTable.tsx @@ -2,6 +2,7 @@ import MetricsTable, { MetricsTableProps } from './MetricsTable'; import FilterLink from 'components/common/FilterLink'; import { useMessages } from 'components/hooks'; import { useFormat } from 'components/hooks'; +import TypeIcon from 'components/common/TypeIcon'; export function DevicesTable(props: MetricsTableProps) { const { formatMessage, labels } = useMessages(); @@ -10,14 +11,7 @@ export function DevicesTable(props: MetricsTableProps) { function renderLink({ x: device }) { return ( - {device} + ); } diff --git a/src/components/metrics/OSTable.tsx b/src/components/metrics/OSTable.tsx index 7744bf11..6989504c 100644 --- a/src/components/metrics/OSTable.tsx +++ b/src/components/metrics/OSTable.tsx @@ -1,6 +1,7 @@ import MetricsTable, { MetricsTableProps } from './MetricsTable'; import FilterLink from 'components/common/FilterLink'; import { useMessages, useFormat } from 'components/hooks'; +import TypeIcon from 'components/common/TypeIcon'; export function OSTable(props: MetricsTableProps) { const { formatMessage, labels } = useMessages(); @@ -9,14 +10,7 @@ export function OSTable(props: MetricsTableProps) { function renderLink({ x: os }) { return ( - {os} + ); } diff --git a/src/components/metrics/RegionsTable.tsx b/src/components/metrics/RegionsTable.tsx index 6e6d7d96..215551af 100644 --- a/src/components/metrics/RegionsTable.tsx +++ b/src/components/metrics/RegionsTable.tsx @@ -1,28 +1,18 @@ import FilterLink from 'components/common/FilterLink'; import { emptyFilter } from 'lib/filters'; -import { useLocale } from 'components/hooks'; -import { useMessages } from 'components/hooks'; -import { useCountryNames } from 'components/hooks'; +import { useMessages, useLocale, useRegionNames } from 'components/hooks'; import MetricsTable, { MetricsTableProps } from './MetricsTable'; -import regions from '../../../public/iso-3166-2.json'; +import TypeIcon from 'components/common/TypeIcon'; export function RegionsTable(props: MetricsTableProps) { const { locale } = useLocale(); const { formatMessage, labels } = useMessages(); - const countryNames = useCountryNames(locale); - - const renderLabel = (code: string, country: string) => { - const region = code.includes('-') ? code : `${country}-${code}`; - return regions[region] ? `${regions[region]}, ${countryNames[country]}` : region; - }; + const { getRegionName } = useRegionNames(locale); const renderLink = ({ x: code, country }) => { return ( - - {code} + + ); }; diff --git a/src/components/metrics/WorldMap.tsx b/src/components/metrics/WorldMap.tsx index 27d0f57c..54483270 100644 --- a/src/components/metrics/WorldMap.tsx +++ b/src/components/metrics/WorldMap.tsx @@ -17,7 +17,7 @@ export function WorldMap({ data = [], className }: { data?: any[]; className?: s const { theme, colors } = useTheme(); const { locale } = useLocale(); const { formatMessage, labels } = useMessages(); - const countryNames = useCountryNames(locale); + const { countryNames } = useCountryNames(locale); const visitorsLabel = formatMessage(labels.visitors).toLocaleLowerCase(locale); const metrics = useMemo(() => (data ? percentFilter(data) : []), [data]); diff --git a/src/queries/analytics/sessions/getSession.ts b/src/queries/analytics/sessions/getSession.ts index 2c008e30..9cdc45d6 100644 --- a/src/queries/analytics/sessions/getSession.ts +++ b/src/queries/analytics/sessions/getSession.ts @@ -25,8 +25,6 @@ async function clickhouseQuery(websiteId: string, sessionId: string) { select session_id as id, website_id as websiteId, - min(created_at) as firstAt, - max(created_at) as lastAt, hostname, browser, os, @@ -35,7 +33,9 @@ async function clickhouseQuery(websiteId: string, sessionId: string) { language, country, subdivision1, - city + city, + min(created_at) as firstAt, + max(created_at) as lastAt from website_event where website_id = {websiteId:UUID} and session_id = {sessionId:UUID} diff --git a/src/queries/analytics/sessions/getSessions.ts b/src/queries/analytics/sessions/getSessions.ts index e7c95963..4e632430 100644 --- a/src/queries/analytics/sessions/getSessions.ts +++ b/src/queries/analytics/sessions/getSessions.ts @@ -32,7 +32,6 @@ async function clickhouseQuery(websiteId: string, filters: QueryFilters, pagePar select session_id as id, website_id as websiteId, - min(created_at) as createdAt, hostname, browser, os, @@ -41,13 +40,15 @@ async function clickhouseQuery(websiteId: string, filters: QueryFilters, pagePar language, country, subdivision1, - city + city, + min(created_at) as firstAt, + max(created_at) as lastAt from website_event where website_id = {websiteId:UUID} ${dateQuery} ${filterQuery} group by session_id, website_id, hostname, browser, os, device, screen, language, country, subdivision1, city - order by createdAt desc + order by lastAt desc `, params, pageParams,