mirror of
https://github.com/Steffo99/sophon.git
synced 2024-12-22 14:54:22 +00:00
✨ Add a logout box
This commit is contained in:
parent
f008487a07
commit
11bdd9fa3f
6 changed files with 119 additions and 7 deletions
|
@ -4,6 +4,7 @@
|
||||||
"private": true,
|
"private": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@fortawesome/fontawesome-svg-core": "^1.2.36",
|
"@fortawesome/fontawesome-svg-core": "^1.2.36",
|
||||||
|
"@fortawesome/free-regular-svg-icons": "^5.15.4",
|
||||||
"@fortawesome/free-solid-svg-icons": "^5.15.4",
|
"@fortawesome/free-solid-svg-icons": "^5.15.4",
|
||||||
"@fortawesome/react-fontawesome": "^0.1.15",
|
"@fortawesome/react-fontawesome": "^0.1.15",
|
||||||
"@reach/router": "^1.3.4",
|
"@reach/router": "^1.3.4",
|
||||||
|
|
|
@ -14,7 +14,7 @@ export function AuthorizationBrowseBox(): JSX.Element {
|
||||||
const canBrowse =
|
const canBrowse =
|
||||||
React.useMemo(
|
React.useMemo(
|
||||||
() => (
|
() => (
|
||||||
authorization !== undefined && !authorization.state.running
|
authorization !== undefined && !authorization.state.running && authorization.state.token === undefined
|
||||||
),
|
),
|
||||||
[authorization],
|
[authorization],
|
||||||
)
|
)
|
||||||
|
|
|
@ -22,11 +22,19 @@ export function AuthorizationLoginBox(): JSX.Element {
|
||||||
const canLogin =
|
const canLogin =
|
||||||
React.useMemo<boolean>(
|
React.useMemo<boolean>(
|
||||||
() => (
|
() => (
|
||||||
axios !== undefined && authorization !== undefined && !authorization.state.running && username.value !== "" && password.value !== ""
|
axios !== undefined && authorization !== undefined && !authorization.state.running && authorization.state.token === undefined
|
||||||
),
|
),
|
||||||
[axios, authorization, username, password],
|
[axios, authorization, username, password],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const canClickLogin =
|
||||||
|
React.useMemo<boolean>(
|
||||||
|
() => (
|
||||||
|
canLogin && username.value !== "" && password.value !== ""
|
||||||
|
),
|
||||||
|
[canLogin, username, password],
|
||||||
|
)
|
||||||
|
|
||||||
const doLogin =
|
const doLogin =
|
||||||
React.useCallback(
|
React.useCallback(
|
||||||
async () => {
|
async () => {
|
||||||
|
@ -83,7 +91,7 @@ export function AuthorizationLoginBox(): JSX.Element {
|
||||||
)
|
)
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Box>
|
<Box disabled={!canLogin}>
|
||||||
<Heading level={3}>
|
<Heading level={3}>
|
||||||
Login
|
Login
|
||||||
</Heading>
|
</Heading>
|
||||||
|
@ -100,7 +108,7 @@ export function AuthorizationLoginBox(): JSX.Element {
|
||||||
<Form.Field label={"Username"} required {...username}/>
|
<Form.Field label={"Username"} required {...username}/>
|
||||||
<Form.Field label={"Password"} type={"password"} required {...password}/>
|
<Form.Field label={"Password"} type={"password"} required {...password}/>
|
||||||
<Form.Row>
|
<Form.Row>
|
||||||
<Form.Button type={"submit"} disabled={!canLogin} onClick={doLogin}>
|
<Form.Button type={"submit"} disabled={!canClickLogin} onClick={doLogin}>
|
||||||
Login
|
Login
|
||||||
</Form.Button>
|
</Form.Button>
|
||||||
</Form.Row>
|
</Form.Row>
|
||||||
|
|
|
@ -0,0 +1,83 @@
|
||||||
|
import {faUser as faUserRegular} from "@fortawesome/free-regular-svg-icons"
|
||||||
|
import {faExclamationCircle, faTimesCircle, faUser as faUserSolid} from "@fortawesome/free-solid-svg-icons"
|
||||||
|
import {FontAwesomeIcon} from "@fortawesome/react-fontawesome"
|
||||||
|
import {Box, Form, Heading, Idiomatic as I} from "@steffo/bluelib-react"
|
||||||
|
import * as React from "react"
|
||||||
|
import {useAuthorizationContext} from "../../contexts/authorization"
|
||||||
|
|
||||||
|
|
||||||
|
export interface AuthorizationLogoutBoxProps {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export function AuthorizationLogoutBox({}: AuthorizationLogoutBoxProps): JSX.Element {
|
||||||
|
const authorization = useAuthorizationContext()
|
||||||
|
|
||||||
|
const loggedUsername = React.useMemo(
|
||||||
|
() => {
|
||||||
|
if(!authorization) {
|
||||||
|
return <I bluelibClassNames={"color-red"}>
|
||||||
|
<FontAwesomeIcon icon={faExclamationCircle}/> Not in a AuthorizationContext
|
||||||
|
</I>
|
||||||
|
}
|
||||||
|
else if(authorization.state.user === undefined) {
|
||||||
|
return <I bluelibClassNames={"color-red"}>
|
||||||
|
<FontAwesomeIcon icon={faTimesCircle}/> Not logged in
|
||||||
|
</I>
|
||||||
|
}
|
||||||
|
else if(authorization.state.user === null) {
|
||||||
|
return <I>
|
||||||
|
<FontAwesomeIcon icon={faUserRegular}/> a guest
|
||||||
|
</I>
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return <I>
|
||||||
|
<FontAwesomeIcon icon={faUserSolid}/> {authorization.state.user.username}
|
||||||
|
</I>
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[authorization],
|
||||||
|
)
|
||||||
|
|
||||||
|
const canLogout = React.useMemo(
|
||||||
|
() => (
|
||||||
|
authorization !== undefined && authorization.state.user !== undefined && !authorization.state.running
|
||||||
|
),
|
||||||
|
[authorization],
|
||||||
|
)
|
||||||
|
|
||||||
|
const doLogout = React.useCallback(
|
||||||
|
() => {
|
||||||
|
if(!authorization) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
authorization.dispatch({
|
||||||
|
type: "clear",
|
||||||
|
})
|
||||||
|
},
|
||||||
|
[authorization],
|
||||||
|
)
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Box disabled={!canLogout}>
|
||||||
|
<Heading level={3}>
|
||||||
|
Logout
|
||||||
|
</Heading>
|
||||||
|
<p>
|
||||||
|
To use a different account with Sophon, you'll need to logout from your current one first.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
You are currently logged in as {loggedUsername}.
|
||||||
|
</p>
|
||||||
|
<Form>
|
||||||
|
<Form.Row>
|
||||||
|
<Form.Button disabled={!canLogout} onClick={doLogout}>
|
||||||
|
Logout
|
||||||
|
</Form.Button>
|
||||||
|
</Form.Row>
|
||||||
|
</Form>
|
||||||
|
</Box>
|
||||||
|
)
|
||||||
|
}
|
|
@ -1,18 +1,31 @@
|
||||||
import {Chapter} from "@steffo/bluelib-react"
|
import {Chapter} from "@steffo/bluelib-react"
|
||||||
import * as React from "react"
|
import * as React from "react"
|
||||||
|
import {useAuthorizationContext} from "../../contexts/authorization"
|
||||||
import {InstanceDescriptionBox} from "../instance/InstanceDescriptionBox"
|
import {InstanceDescriptionBox} from "../instance/InstanceDescriptionBox"
|
||||||
import {AuthorizationAdminBox} from "./AuthorizationAdminBox"
|
import {AuthorizationAdminBox} from "./AuthorizationAdminBox"
|
||||||
import {AuthorizationBrowseBox} from "./AuthorizationBrowseBox"
|
import {AuthorizationBrowseBox} from "./AuthorizationBrowseBox"
|
||||||
import {AuthorizationLoginBox} from "./AuthorizationLoginBox"
|
import {AuthorizationLoginBox} from "./AuthorizationLoginBox"
|
||||||
|
import {AuthorizationLogoutBox} from "./AuthorizationLogoutBox"
|
||||||
|
|
||||||
|
|
||||||
export function AuthorizationStepPage(): JSX.Element {
|
export function AuthorizationStepPage(): JSX.Element {
|
||||||
|
const authorization = useAuthorizationContext()
|
||||||
|
|
||||||
return <>
|
return <>
|
||||||
<InstanceDescriptionBox/>
|
<InstanceDescriptionBox/>
|
||||||
|
{
|
||||||
|
authorization?.state.token === undefined ?
|
||||||
<Chapter>
|
<Chapter>
|
||||||
<AuthorizationBrowseBox/>
|
<AuthorizationBrowseBox/>
|
||||||
<AuthorizationLoginBox/>
|
<AuthorizationLoginBox/>
|
||||||
</Chapter>
|
</Chapter>
|
||||||
|
:
|
||||||
|
<Chapter>
|
||||||
|
<AuthorizationLogoutBox/>
|
||||||
|
</Chapter>
|
||||||
|
}
|
||||||
|
<Chapter>
|
||||||
<AuthorizationAdminBox/>
|
<AuthorizationAdminBox/>
|
||||||
|
</Chapter>
|
||||||
</>
|
</>
|
||||||
}
|
}
|
||||||
|
|
|
@ -1246,6 +1246,13 @@
|
||||||
dependencies:
|
dependencies:
|
||||||
"@fortawesome/fontawesome-common-types" "^0.2.36"
|
"@fortawesome/fontawesome-common-types" "^0.2.36"
|
||||||
|
|
||||||
|
"@fortawesome/free-regular-svg-icons@^5.15.4":
|
||||||
|
version "5.15.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-5.15.4.tgz#b97edab436954333bbeac09cfc40c6a951081a02"
|
||||||
|
integrity sha512-9VNNnU3CXHy9XednJ3wzQp6SwNwT3XaM26oS4Rp391GsxVYA+0oDR2J194YCIWf7jNRCYKjUCOduxdceLrx+xw==
|
||||||
|
dependencies:
|
||||||
|
"@fortawesome/fontawesome-common-types" "^0.2.36"
|
||||||
|
|
||||||
"@fortawesome/free-solid-svg-icons@^5.15.4":
|
"@fortawesome/free-solid-svg-icons@^5.15.4":
|
||||||
version "5.15.4"
|
version "5.15.4"
|
||||||
resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.4.tgz#2a68f3fc3ddda12e52645654142b9e4e8fbb6cc5"
|
resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.4.tgz#2a68f3fc3ddda12e52645654142b9e4e8fbb6cc5"
|
||||||
|
|
Loading…
Reference in a new issue