diff --git a/src/components/ui/Masks.tsx b/src/components/ui/Masks.tsx index 8b6939c85cf59a36aa289f9c3053a6c28bec202c..26493e34f417596f4082b1ec75778b62612beb9c 100644 --- a/src/components/ui/Masks.tsx +++ b/src/components/ui/Masks.tsx @@ -12,6 +12,10 @@ export default function Masks() { <rect x="0" y="0" width="32" height="32" fill="white" /> <circle cx="27" cy="27" r="7" fill={"black"} /> </mask> + <mask id="session"> + <rect x="0" y="0" width="32" height="32" fill="white" /> + <circle cx="26" cy="30" r="12" fill={"black"} /> + </mask> <mask id="overlap"> <rect x="0" y="0" width="32" height="32" fill="white" /> <circle cx="32" cy="16" r="18" fill={"black"} /> diff --git a/src/pages/settings/panes/Sessions.tsx b/src/pages/settings/panes/Sessions.tsx index 88c813817190f99bed9960955174979bebdfbc0c..999e78d88b7dc6513ba8bf207ff8bc2e54057f13 100644 --- a/src/pages/settings/panes/Sessions.tsx +++ b/src/pages/settings/panes/Sessions.tsx @@ -66,15 +66,15 @@ export function Sessions() { const name = session.friendly_name; switch (true) { case /firefox/i.test(name): - return <Firefoxbrowser />; + return <Firefoxbrowser size={32} />; case /chrome/i.test(name): - return <Googlechrome />; + return <Googlechrome size={32} />; case /safari/i.test(name): - return <Safari />; + return <Safari size={32} />; case /edge/i.test(name): - return <Microsoftedge />; + return <Microsoftedge size={32} />; default: - return <HelpCircle />; + return <HelpCircle size={32} />; } } @@ -82,15 +82,15 @@ export function Sessions() { const name = session.friendly_name; switch (true) { case /linux/i.test(name): - return <Linux />; + return <Linux size={14} />; case /android/i.test(name): - return <Android />; + return <Android size={14} />; case /mac.*os/i.test(name): - return <Macos />; + return <Macos size={14} />; case /ios/i.test(name): - return <Ios />; + return <Ios size={14} />; case /windows/i.test(name): - return <Windows />; + return <Windows size={14} />; default: return null; } @@ -117,67 +117,80 @@ export function Sessions() { <h3> <Text id="app.settings.pages.sessions.active_sessions" /> </h3> - {render.map((session) => ( - <div - className={styles.entry} - data-active={session.id === deviceId} - data-deleting={attemptingDelete.indexOf(session.id) > -1}> - {deviceId === session.id && ( - <span className={styles.label}> - <Text id="app.settings.pages.sessions.this_device" />{" "} - </span> - )} - <div className={styles.session}> - <div className={styles.detail}> - <div className={styles.icon}> - {getIcon(session)} - <div>{getSystemIcon(session)}</div> - </div> - <div className={styles.info}> - <input - type="text" - className={styles.name} - value={session.friendly_name} - autocomplete="off" - /> - <span className={styles.time}> - <Text - id="app.settings.pages.sessions.created" - fields={{ - time_ago: dayjs( - session.timestamp, - ).fromNow(), - }} - /> - </span> + {render.map((session) => { + const systemIcon = getSystemIcon(session); + return ( + <div + className={styles.entry} + data-active={session.id === deviceId} + data-deleting={attemptingDelete.indexOf(session.id) > -1}> + {deviceId === session.id && ( + <span className={styles.label}> + <Text id="app.settings.pages.sessions.this_device" />{" "} + </span> + )} + <div className={styles.session}> + <div className={styles.detail}> + <svg width={42} height={42} + viewBox="0 0 32 32"> + <foreignObject + x="0" + y="0" + width="32" + height="32" + mask={systemIcon ? "url(#session)": undefined}> + {getIcon(session)} + </foreignObject> + <foreignObject x="18" y="18" width="14" height="14"> + { systemIcon } + </foreignObject> + </svg> + <div className={styles.info}> + <input + type="text" + className={styles.name} + value={session.friendly_name} + autocomplete="off" + style={{ pointerEvents: 'none' }} /> + <span className={styles.time}> + <Text + id="app.settings.pages.sessions.created" + fields={{ + time_ago: dayjs( + session.timestamp, + ).fromNow(), + }} + /> + </span> + </div> </div> + {deviceId !== session.id && ( + <Button + onClick={async () => { + setDelete([ + ...attemptingDelete, + session.id, + ]); + await client.req( + "DELETE", + `/auth/sessions/${session.id}` as "/auth/sessions", + ); + setSessions( + sessions?.filter( + (x) => x.id !== session.id, + ), + ); + }} + disabled={ + attemptingDelete.indexOf(session.id) > -1 + }> + <Text id="app.settings.pages.logOut" /> + </Button> + )} </div> - {deviceId !== session.id && ( - <Button - onClick={async () => { - setDelete([ - ...attemptingDelete, - session.id, - ]); - await client.req( - "DELETE", - `/auth/sessions/${session.id}` as "/auth/sessions", - ); - setSessions( - sessions?.filter( - (x) => x.id !== session.id, - ), - ); - }} - disabled={ - attemptingDelete.indexOf(session.id) > -1 - }> - <Text id="app.settings.pages.logOut" /> - </Button> - )} </div> - </div> - ))} + ) + })} <Button error> <Text id="app.settings.pages.sessions.logout" /> </Button>