diff --git a/portal/ui/dist/assets/index-0MyyvFQQ.js b/portal/ui/dist/assets/index-Chqu5kQi.js
similarity index 99%
rename from portal/ui/dist/assets/index-0MyyvFQQ.js
rename to portal/ui/dist/assets/index-Chqu5kQi.js
index 45df914..683f2e8 100644
--- a/portal/ui/dist/assets/index-0MyyvFQQ.js
+++ b/portal/ui/dist/assets/index-Chqu5kQi.js
@@ -130,4 +130,4 @@ Error generating stack: `+i.message+`
${t}
- `):console.error("Failed to open preview window. Please make sure pop-ups are allowed for this site.")};return O.jsx("div",{children:O.jsx("div",{style:{cursor:"pointer"},onClick:()=>r(e),children:O.jsx("img",{src:e,alt:"Image",width:"35"})})})}function r_(){const[e,t]=C.useState(!1),[n,r]=C.useState(!0),[o,i]=C.useState(null),[l,s]=C.useState(null),[a,u]=C.useState([]),[c,p]=C.useState({preview:"",key:"",url:""});if(C.useEffect(()=>{fetch("/api/routes").then(f=>f.json()).then(f=>{u(f)}).catch(console.error).finally(()=>{r(!1)})},[]),n)return O.jsx(or,{variant:"h1",children:"Loading..."});const d=f=>{let h=f.target.value;(h===""||h.charAt(0)!=="/"&&h!=="0")&&(h=""),p({...c,key:h})},g=f=>{p({...c,url:f.target.value})},y=f=>{f.key==="Enter"&&E()},v=()=>{t(!0),setTimeout(()=>t(!1),1500)},E=()=>{fetch("/api/routes",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(c)}).then(f=>{if(f.status!==202){if(f.status===500){s("Failed to save new route: "+f.statusText);return}f.json().then(h=>{s("Failed to save new route: "+f.statusText+" => "+h.error)});return}fetch("/api/routes/preview?url=https://"+window.location.hostname+c.key,{method:"GET",headers:{"Content-Type":"application/json"}}).then(h=>h.json()).then(h=>{c.preview="data:image/png;base64,"+h.image,a&&a.length>0?u([c,...a]):u([c]),p({preview:"",key:"",url:""})}),i(`Route ${c.key} is successfully added!`)}).catch(console.error)},m=window.location.hostname;return O.jsxs(O.Fragment,{children:[O.jsxs(KC,{href:"https://github.com/alileza/bridge",sx:{color:"black",textDecoration:"none"},target:"_blank",children:[O.jsx("img",{src:"/bridge.png",className:"logo",width:"80",style:{marginRight:"10px",float:"left"}}),O.jsx(or,{variant:"h2",component:"h2",gutterBottom:!0,children:"bridge"}),O.jsx("div",{style:{clear:"both"}})]}),l&&O.jsx(em,{onClick:()=>s(null),icon:O.jsx(F0,{fontSize:"inherit"}),severity:"error",children:l}),o&&O.jsx(em,{onClick:()=>i(null),icon:O.jsx(z0,{fontSize:"inherit"}),severity:"success",children:o}),O.jsxs(CP,{sx:{display:"grid",gridTemplateColumns:"repeat(auto-fill, minmax(200px, 1fr))",gap:"16px"},children:[O.jsxs(tm,{children:[O.jsx(om,{children:O.jsx(im,{imageContent:"",routeKeyURL:c.key+c.url,handleSave:E})}),O.jsx(rm,{primary:O.jsx("input",{value:c.key,onChange:d,placeholder:"/"}),secondary:O.jsx("input",{value:c.url,onChange:g,onKeyDown:y,placeholder:"https://"})})]},"new-placeholder"),a&&a.map(f=>{const h=f.url.length>23?f.url.substring(0,23)+"...":f.url,x="https://"+m+f.key;return O.jsxs(tm,{children:[O.jsx(om,{children:O.jsx(im,{handleSave:()=>{},imageContent:f.preview,routeKeyURL:x})}),O.jsx(cE.CopyToClipboard,{text:x,onCopy:v,children:O.jsx($C,{placement:"top",sx:{cursor:"pointer"},title:e?`${x} is copied`:"copy to clipboard",children:O.jsx(rm,{primary:f.key,secondary:h})})})]},f.key)})]})]})}Ha.createRoot(document.getElementById("root")).render(O.jsx(Ft.StrictMode,{children:O.jsx(r_,{})}));
+ `):console.error("Failed to open preview window. Please make sure pop-ups are allowed for this site.")};return O.jsx("div",{children:O.jsx("div",{style:{cursor:"pointer"},onClick:()=>r(e),children:O.jsx("img",{src:e,alt:"Image",width:"35"})})})}function r_(){const[e,t]=C.useState(!1),[n,r]=C.useState(!0),[o,i]=C.useState(null),[l,s]=C.useState(null),[a,u]=C.useState([]),[c,p]=C.useState({preview:"",key:"",url:""});if(C.useEffect(()=>{fetch("/api/routes").then(f=>f.json()).then(f=>{u(f)}).catch(console.error).finally(()=>{r(!1)})},[]),n)return O.jsx(or,{variant:"h1",children:"Loading..."});const d=f=>{let h=f.target.value;(h===""||h.charAt(0)!=="/"&&h!=="0")&&(h=""),p({...c,key:h})},g=f=>{p({...c,url:f.target.value})},y=f=>{f.key==="Enter"&&E()},v=()=>{t(!0),setTimeout(()=>t(!1),1500)},E=()=>{fetch("/api/routes",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(c)}).then(f=>{if(f.status!==202){if(f.status===500){s("Failed to save new route: "+f.statusText);return}f.json().then(h=>{s("Failed to save new route: "+f.statusText+" => "+h.error)});return}fetch("/api/routes/preview?url=https://"+window.location.hostname+c.key,{method:"GET",headers:{"Content-Type":"application/json"}}).then(h=>h.json()).then(h=>{c.preview="data:image/png;base64,"+h.image,a&&a.length>0?u([c,...a]):u([c]),p({preview:"",key:"",url:""})}),i(`Route ${c.key} is successfully added!`)}).catch(console.error)},m=window.location.hostname;return O.jsxs(O.Fragment,{children:[O.jsxs(KC,{href:"https://github.com/alileza/bridge",sx:{color:"black",textDecoration:"none"},target:"_blank",children:[O.jsx("img",{src:"/bridge.png",className:"logo",width:"80",style:{marginRight:"10px",float:"left"}}),O.jsx(or,{variant:"h2",component:"h2",gutterBottom:!0,children:"bridge"}),O.jsx("div",{style:{clear:"both"}})]}),l&&O.jsx(em,{onClick:()=>s(null),icon:O.jsx(F0,{fontSize:"inherit"}),severity:"error",children:l}),o&&O.jsx(em,{onClick:()=>i(null),icon:O.jsx(z0,{fontSize:"inherit"}),severity:"success",children:o}),O.jsxs(CP,{sx:{display:"grid",gridTemplateColumns:"repeat(auto-fill, minmax(200px, 1fr))",gap:"16px"},children:[O.jsxs(tm,{children:[O.jsx(om,{children:O.jsx(im,{imageContent:"",routeKeyURL:c.key+c.url,handleSave:E})}),O.jsx(rm,{primary:O.jsx("input",{value:c.key,onChange:d,placeholder:"/"}),secondary:O.jsx("input",{value:c.url,onChange:g,onKeyDown:y,placeholder:"https://"})})]},"new-placeholder"),a&&a.map(f=>{const h=f.url.length>23?f.url.substring(0,23)+"...":f.url,x="https://"+m+f.key;return O.jsxs(tm,{children:[O.jsx(om,{children:O.jsx(im,{handleSave:()=>{},imageContent:f.preview,routeKeyURL:x})}),O.jsx(cE.CopyToClipboard,{text:x,onCopy:v,children:O.jsx($C,{placement:"top",sx:{cursor:"pointer"},title:e?`${x} is copied`:"copy to clipboard",enterTouchDelay:0,children:O.jsx(rm,{primary:f.key,secondary:h})})})]},f.key)})]})]})}Ha.createRoot(document.getElementById("root")).render(O.jsx(Ft.StrictMode,{children:O.jsx(r_,{})}));
diff --git a/portal/ui/dist/index.html b/portal/ui/dist/index.html
index 8561622..c01a51e 100644
--- a/portal/ui/dist/index.html
+++ b/portal/ui/dist/index.html
@@ -5,7 +5,7 @@
Portal
-
+
diff --git a/portal/ui/src/App.tsx b/portal/ui/src/App.tsx
index 72be058..ac7737f 100644
--- a/portal/ui/src/App.tsx
+++ b/portal/ui/src/App.tsx
@@ -166,7 +166,12 @@ function App(): JSX.Element {
{}} imageContent={route.preview} routeKeyURL={clipboardText} />
-
+