diff --git a/Dockerfile b/Dockerfile index c1fd64a044d59bc986ea393bdc688b24019c85ed..bb94e9aaf19ca45ac1133e98eb98986c4410e42e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -31,8 +31,11 @@ ARG KEY_CLOAK_ISSUER ARG NEXT_PUBLIC_HANDLE_SYSTEM_BASE_URI ARG NEXT_PUBLIC_HANDLE_SYSTEM_DOWNLOAD_PROXY ARG NEXTAUTH_URL -ARG NEXTAUTH_URL_INTERNAL ARG NEXT_PUBLIC_CORDRA_HANDLE +ARG NEXT_PUBLIC_SHOWCASE_LEFT_PID +ARG NEXT_PUBLIC_SHOWCASE_LEFT_MDPID +ARG NEXT_PUBLIC_SHOWCASE_RIGHT_PID +ARG NEXT_PUBLIC_SHOWCASE_RIGHT_MDPID ENV KEY_CLOAK_ISSUER=${KEY_CLOAK_ISSUER} ENV KEY_CLOAK_CLIENT_SECRET=${KEY_CLOAK_CLIENT_SECRET} @@ -42,8 +45,11 @@ ENV NEXT_PUBLIC_HANDLE_SYSTEM_DOWNLOAD_PROXY=${NEXT_PUBLIC_HANDLE_SYSTEM_DOWNLOA ENV NEXT_PUBLIC_HANDLE_SYSTEM_BASE_URI=${NEXT_PUBLIC_HANDLE_SYSTEM_BASE_URI} ENV NEXT_PUBLIC_API_URL=${NEXT_PUBLIC_API_URL:-"https://manager.testbed.pid.gwdg.de/api/v1"} ENV NEXTAUTH_URL=${NEXTAUTH_URL} -ENV NEXTAUTH_URL_INTERNAL=${NEXTAUTH_URL_INTERNAL} ENV NEXT_PUBLIC_CORDRA_HANDLE=${NEXT_PUBLIC_CORDRA_HANDLE} +ENV NEXT_PUBLIC_SHOWCASE_LEFT_PID=${NEXT_PUBLIC_SHOWCASE_LEFT_PID} +ENV NEXT_PUBLIC_SHOWCASE_RIGHT_PID=${NEXT_PUBLIC_SHOWCASE_RIGHT_PID} +ENV NEXT_PUBLIC_SHOWCASE_LEFT_MDPID=${NEXT_PUBLIC_SHOWCASE_LEFT_MDPID} +ENV NEXT_PUBLIC_SHOWCASE_RIGHT_MDPID=${NEXT_PUBLIC_SHOWCASE_RIGHT_MDPID} RUN npm run build @@ -66,6 +72,5 @@ ENV KEY_CLOAK_ISSUER=${KEY_CLOAK_ISSUER} ENV KEY_CLOAK_CLIENT_SECRET=${KEY_CLOAK_CLIENT_SECRET} ENV KEY_CLOAK_CLIENT_ID=${KEY_CLOAK_CLIENT_ID} ENV NEXTAUTH_URL=${NEXTAUTH_URL} -ENV NEXTAUTH_URL_INTERNAL=${NEXTAUTH_URL_INTERNAL} CMD ["node", "server.js"] diff --git a/next.config.js b/next.config.js index 9450e3b7a8c59e8cc5655e5be200fea714d347fc..b6232b53dec6760ac1f0b0546ac7146bfd750258 100644 --- a/next.config.js +++ b/next.config.js @@ -10,7 +10,6 @@ module.exports = { KEY_CLOAK_CLIENT_ID: process.env.KEY_CLOAK_CLIENT_ID, PORT: process.env.PORT, NEXTAUTH_URL: process.env.NEXTAUTH_URL, - NEXTAUTH_URL_INTERNAL: process.env.NEXTAUTH_URL_INTERNAL, }, eslint: { ignoreDuringBuilds: true, diff --git a/pages/_app.tsx b/pages/_app.tsx index edfa562956014208d84cec29893253651d5283d1..95ccab9ac156c1148daa609b5fa2cbf0d1b71e2a 100644 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -1,4 +1,4 @@ -import { AuthBindings, Refine } from '@refinedev/core' +import { AuthProvider, Refine } from '@refinedev/core' import { RefineKbar, RefineKbarProvider } from '@refinedev/kbar' import { RefineSnackbarProvider, @@ -42,7 +42,7 @@ type AppPropsWithLayout = AppProps & { const App = (props: React.PropsWithChildren) => { const { t, i18n } = useTranslation() - const { data, status } = useSession() + const { data, status, error } = useSession() const to = usePathname() const i18nProvider = { @@ -55,38 +55,29 @@ const App = (props: React.PropsWithChildren) => { return <span>loading...</span> } - const authProvider: AuthBindings = { + const authProvider: AuthProvider = { login: async () => { - // console.log('login') - signIn('keycloak', { - callbackUrl: to ? to.toString() : '/fdo', - redirect: true - }) + await signIn('keycloak') return { success: true } }, logout: async () => { - // console.log('logout') - signOut({ - redirect: true, - callbackUrl: '/fdo' - }) + signOut() return { - success: true + success: true, } }, onError: async (error) => { - // console.log('onError') - console.error(error) + // console.error("onError", error) return { error } }, check: async () => { - // console.log('check') + // console.log("check", data, error, status) if (status === 'unauthenticated') { return { authenticated: false, @@ -94,17 +85,32 @@ const App = (props: React.PropsWithChildren) => { } } + if(data?.error) { + return { + error: error, + authenticated: false, + redirectTo: '/login' + } + } + return { authenticated: true } }, getPermissions: async () => { - // console.log('getPermissions') return null }, getIdentity: async () => { - // console.log('getIdentity', data) - if (data?.user) { + // console.log("getIdentity", data, error, status); + if(data?.error) { + return { + error: error, + authenticated: false, + redirectTo: '/login' + } + } + + if (data?.user && status === "authenticated") { const { user } = data return { name: user.name, @@ -211,7 +217,6 @@ function MyApp ({ return ( <SessionProvider session={session} - refetchInterval={10} refetchOnWindowFocus={true} > <App>{renderComponent()}</App> diff --git a/pages/api/auth/[...nextauth].ts b/pages/api/auth/[...nextauth].ts index 02a71c91783538a40d8a17d09ac7a0dc26f4a609..b5cb5b65f1fbf45f47d7bce655181507acaf089d 100644 --- a/pages/api/auth/[...nextauth].ts +++ b/pages/api/auth/[...nextauth].ts @@ -10,10 +10,10 @@ async function refreshAccessToken (token: any) { try { const url = issuer + '/protocol/openid-connect/token' const params = new URLSearchParams({ - client_id: clientId, - client_secret: clientSecret, + client_id: clientId!, + client_secret: clientSecret!, grant_type: 'refresh_token', - refresh_token: token.refreshToken + refresh_token: token.refresh_token!, }).toString() const response = await fetch(url, { @@ -24,26 +24,29 @@ async function refreshAccessToken (token: any) { body: params }) - const refreshedTokens = await response.json() + const new_tokens = await response.json() if (!response.ok) { - throw refreshedTokens + throw new_tokens } - console.log('### refreshToken', new Date().toISOString(), refreshedTokens, '### ### ###') + // console.log('### new_tokens', new Date().toISOString(), new_tokens, '### ### ###') return { ...token, - accessToken: refreshedTokens.access_token, - accessTokenExpires: Date.now() + refreshedTokens.expires_in * 1000, - refreshToken: refreshedTokens.refresh_token ?? token.refreshToken // Fall back to old refresh token + access_token: new_tokens.access_token, + expires_at: Math.floor(Date.now()/1000 + new_tokens.expires_in), + refresh_token: new_tokens.refresh_token ?? token.refresh_token // Fall back to old refresh token } } catch (error) { - console.log('### RefreshAccessTokenError', error, '### ### ###') + // console.log('### RefreshAccessTokenError', error, '### ### ###') + throw new Error("RefreshTokenError") + /* return { ...token, error: 'RefreshAccessTokenError' } + */ } } @@ -52,7 +55,6 @@ export const authOptions = { session: { maxAge: 172800 // 48h }, - debug: true, // Configure one or more authentication providers providers: [ // !!! Should be stored in .env file. @@ -62,7 +64,7 @@ export const authOptions = { issuer, // authorization: { params: { scope: 'openid profile email' } }, profile (profile) { - console.log('### profile', profile, '### ### ###') + // console.log('### profile', profile, '### ### ###') return { id: profile.sub, name: profile.name ?? profile.preferred_username @@ -72,43 +74,44 @@ export const authOptions = { ], callbacks: { async signIn ({ user, account, profile, email, credentials }: any) { - console.log('### signIn', user, account, profile, email, credentials, '### ### ###') + // console.log('### signIn', user, account, profile, email, credentials, '### ### ###') return true }, async session ({ session, user, token }: any) { - console.log('### session', session, user, token, '### ### ###') + // console.log('### session', session, user, token, '### ### ###') session.user = token.user - session.accessToken = token.accessToken + session.access_token = token.access_token session.error = token.error return session }, + /* async redirect ({ url, baseUrl }: any) { - console.log('### redirect', url, baseUrl, '### ### ###') - return Promise.resolve(url) + // console.log('### redirect', url, baseUrl, '### ### ###') + return baseUrl + //Promise.resolve(url) }, + */ async jwt ({ token, user, account, profile, isNewUser }: any) { - console.log('### jwt', token, user, account, profile, isNewUser, '### ### ###') + // console.log('### jwt', token, user, account, profile, isNewUser, '### ### ###') // Initial sign in if (account && user) { return { - lastRefresh: Date.now(), - accessToken: account.access_token, - accessTokenExpires: account.expires_at, - refreshToken: account.refresh_token, + access_token: account.access_token, + expires_at: account.expires_at, + refresh_token: account.refresh_token, user } - } - - if (token.lastRefresh + 60000 > Date.now()) { - // return if last refresh is 10 seconds or younger + } else if (Date.now() < token.expires_at * 1000) { return token - } + } else { + if (!token.refresh_token) throw new TypeError("Missing refresh_token") - // Access token has expired, try to update it - return refreshAccessToken(token) + // Access token has expired, try to update it + return refreshAccessToken(token) + } } }, secret: secretSessionKey diff --git a/pages/fdo/show/[prefix]/[suffix].tsx b/pages/fdo/show/[prefix]/[suffix].tsx index 47add0b786319564ecb56b60e524d4db9e9fa6ce..dbcbaef6b442c10210bc02015f0435e087665927 100644 --- a/pages/fdo/show/[prefix]/[suffix].tsx +++ b/pages/fdo/show/[prefix]/[suffix].tsx @@ -5,11 +5,8 @@ import { GetServerSideProps } from 'next' import { serverSideTranslations } from 'next-i18next/serverSideTranslations' import { useTranslate, useParsed, useCustom, useApiUrl } from '@refinedev/core' import { Show } from '@refinedev/mui' -import { Typography } from '@mui/material' +import Typography from '@mui/material/Typography' import CircularProgress from '@mui/material/CircularProgress' -import AssignmentIcon from '@mui/icons-material/Assignment' -import Avatar from '@mui/material/Avatar' -import { blue } from '@mui/material/colors' import Box from '@mui/material/Box' import Stack from '@mui/material/Stack' import Chip from '@mui/material/Chip' @@ -22,15 +19,11 @@ import MenuList from '@mui/material/MenuList' import MenuItem from '@mui/material/MenuItem' import ListItemText from '@mui/material/ListItemText' import ListItemIcon from '@mui/material/ListItemIcon' -import ContentPaste from '@mui/icons-material/ContentPaste' -import Cloud from '@mui/icons-material/Cloud' import VerifiedIcon from '@mui/icons-material/Verified' import ReportIcon from '@mui/icons-material/Report' -import { JsonView, darkStyles, defaultStyles } from 'react-json-view-lite'; -import { styled, ThemeProvider } from '@mui/material/styles' -import Details from '../../../../src/components/fdos/details' -import { FDO_COMMUNITY_TYPE_EVEBS as EVEBS, FDO_COMMUNITY_MD_PROFILE_EDC as EDC, FDO_COMMUNITY_MD_PROFILE_AAS as AAS, HANDLE_SYSTEM_BASE_URI as HS_BASE_URI, HANDLE_SYSTEM_DOWNLOAD_PROXY as HS_PROXY, CORDRA_HANDLE as CORDRA } from '../../../../src/constants' -import 'react-json-view-lite/dist/index.css'; +import { styled } from '@mui/material/styles' +import EvebsDetails from '@components/Evebs' +import { FDO_COMMUNITY_TYPE_EVEBS as EVEBS, HANDLE_SYSTEM_BASE_URI as HS_BASE_URI } from '../../../../src/constants' const resolvePid = (pid: string) => `${HS_BASE_URI}/${pid}` @@ -54,90 +47,6 @@ const getFdoDetails = (data: object) => { return fdoDetails } -interface IJsonMetadata { - metadata: object -} - -interface IEvebsDetails { - metadataJson: IJsonMetadata - dataspace: string - dataspaceIcon: string - technology: string - technologyIcon: string -} - -const getEvebsDetails = (typePid, repository, metadataRecord) => { - console.log(metadataRecord); - const row = (category: string, classification: string, logo: string) => { - return { category, classification, logo } - } - const techInfo = metadataRecord.fdoProfile === AAS ? "BaSyx AAS" : "EDC"; - const techLogo = metadataRecord.fdoProfile === AAS ? "/images/aas.png" : "/images/eclipse-logo.png"; - const dataspaceInfo = metadataRecord.fdoProfile === AAS ? "RWTH" : "MDS"; - const dataspaceLogo = metadataRecord.fdoProfile === AAS ? "/images/rwth.png" : "/images/mds.png"; - - return [ - row('Type', <Link href={resolvePid(typePid)}>{ "EVEBS-FDO" }</Link>, ''), - row('Repository', <Link href="#">{repository}</Link>, - repository == CORDRA ? "/images/cordra-primary-blue.png" : "/images/la_logo.png"), - - row('Dataspace', dataspaceInfo, dataspaceLogo), - row('Technology', techInfo, techLogo), - ] -} - -const EvebsDetails = ({pid, typePid, repository, metadataPid}) => { - const apiUrl = useApiUrl() - const t = useTranslate() - const { data, isLoading, isError, error } = useCustom({ - url: `${HS_PROXY}/${metadataPid}?locatt=payloadIndex:0`, - method: 'get', - errorNotification: () => false, - queryOptions: { - retry: false - } - }) - const metadataRecord = useCustom({ - url: `${apiUrl}/fdo/${metadataPid}`, - method: 'get', - errorNotification: () => false, - queryOptions: { - retry: false - } - }); - - const metadata = data?.data; - var description = undefined - var displayName = metadata?.displayName - if(displayName) { - displayName = displayName[0].text - } - if(isError) { - displayName = pid - } else if(metadata?.description) { - description = metadata?.description[0].text - } - - console.log(isLoading, data, repository, typePid, metadata); - return isLoading || metadataRecord.isLoading ? <Item>loading json</Item> : ( - <> - <Item sx={{ width: '50%' }} > - <Typography variant="h5" gutterBottom> {displayName || metadata.idShort || metadata.id} </Typography> <Typography variant="subtitle1" gutterBottom > {metadata?.description[0].text} </Typography> - <Box> - <Details rows={getEvebsDetails(typePid, repository, metadataRecord.data.data)}></Details> - </Box> - </Item> - { metadata && - <Item> - <Box> - <Typography variant="h6" gutterBottom>Metadata (JSON)</Typography> - <JsonView data={metadata} shouldExpandNode={lvl => lvl<3} style={defaultStyles} /> - </Box> - </Item> - } - </> - ) -} const Item = styled(Paper)(({ theme }) => ({ backgroundColor: '#fff', @@ -257,7 +166,7 @@ const ShowFDO = () => { </MenuList> </Item> - { isEvebs && <EvebsDetails {...fdoDetails}/> } + { isEvebs && <EvebsDetails {...fdoDetails} showJson={true}/> } </Stack> </div><br/><br/> </Show> diff --git a/pages/login/index.tsx b/pages/login/index.tsx index 775128b1948fbff0e6c9981d659c4602892fee2e..606a795ccc659e80becdd744944a6f7531a9f77d 100644 --- a/pages/login/index.tsx +++ b/pages/login/index.tsx @@ -74,11 +74,16 @@ export const getServerSideProps: GetServerSideProps<{}> = async (context) => { 'common' ]) + // console.log("login", context, session); + const destination = context?.query?.to + if (session) { return { - props: {}, + props: { + ...translateProps + }, redirect: { - destination: '/', + destination: destination || '/', permanent: false } } diff --git a/src/components/ContentArea.tsx b/src/components/ContentArea.tsx index e080c8dfb42d0b04edf2a6e23fc0d0d1c2e18bf9..a68f625553f4ea2dc2644fa1b69e9b07d482c89e 100644 --- a/src/components/ContentArea.tsx +++ b/src/components/ContentArea.tsx @@ -10,6 +10,9 @@ import Divider from '@mui/material/Divider' import Button from '@mui/material/Button' import FDOImage from '@components/FDOImage' import Stack from '@mui/material/Stack' +import Evebs from '@components/Evebs' +import Link from '@mui/material/Link' +import { FDO_COMMUNITY_MD_PROFILE_AAS as AAS, HANDLE_SYSTEM_BASE_URI as HS_BASE_URI, HANDLE_SYSTEM_DOWNLOAD_PROXY as HS_PROXY, CORDRA_HANDLE as CORDRA, FDO_COMMUNITY_TYPE_EVEBS as EVEBS } from '../constants' const Item = styled(Paper)(({ theme }) => ({ backgroundColor: theme.palette.mode === 'dark' ? '#1A2027' : '#fff', @@ -20,6 +23,10 @@ const Item = styled(Paper)(({ theme }) => ({ })) export default function RowAndColumnSpacing () { + const leftShowCase = process.env.NEXT_PUBLIC_SHOWCASE_LEFT_PID + const leftShowCaseMD = process.env.NEXT_PUBLIC_SHOWCASE_LEFT_MDPID + const rightShowCase = process.env.NEXT_PUBLIC_SHOWCASE_RIGHT_PID + const rightShowCaseMD = process.env.NEXT_PUBLIC_SHOWCASE_RIGHT_MDPID return ( <Box alignItems="center"> <Grid container spacing={2} columns={10} justifyContent="center" alignItems="center" marginTop={2}> @@ -34,43 +41,30 @@ export default function RowAndColumnSpacing () { </Stack> </Item> </Grid> - { /* - <Grid item xs={6}> - <Item> - <Typography variant="body1" gutterBottom> - The FDO Manager allows you to browse FDOs, create FDOs and much more and is - part of the <a href="https://fdo-one.org/">FDO One project</a>. - <br/> - One key feature of FDOs is that they - are identified via a persistent identifier (PID). - <br/> - <br/> - You are interested to look at a specific FDO? Just enter the PID below! - </Typography><br/> - <br/><br/> - <Divider /><br/><br/> - <Typography variant="body1" gutterBottom> - Or just start from the overview of the FDO Manager by clicking here: - </Typography><br/> - <Typography variant="button" display="block" gutterBottom fontSize={19}> - Enter FDO Manager - </Typography> - </Item> - </Grid> - <Grid item xs={6}> - </Grid> - */ } + </Grid> - {/* + { (leftShowCase || rightShowCase) && <Grid container spacing={2} columns={20} justifyContent="center" alignItems="center" marginTop={2}> <Grid item xs={6}> - </Grid> - <Grid item xs={6}> - <Item><Content/></Item> - </Grid> - </Grid> - */} + { leftShowCase && + <Evebs typePid={EVEBS} + metadataPid={leftShowCaseMD} + title="Showcase: An Asset Adminstration Shell(AAS) FDO" + subtitle={<Link href={"/fdo/show/" + leftShowCase}>Show {leftShowCase}</Link>} /> + } + </Grid> + <Grid item xs={6}> + { rightShowCase && + <Evebs typePid={EVEBS} + metadataPid={rightShowCaseMD} + title="Showcase: An FDO hosted in an Eclipse Dataspace Components (EDC) Dataspace" + subtitle={<Link href={"/fdo/show/" + rightShowCase}>Show {rightShowCase}</Link>} /> + } + </Grid> + </Grid> + } + </Box> ) } diff --git a/src/components/Evebs.jsx b/src/components/Evebs.jsx new file mode 100644 index 0000000000000000000000000000000000000000..5fcb1e7f3161ac9a5d666ef25ac5875a8e3fa660 --- /dev/null +++ b/src/components/Evebs.jsx @@ -0,0 +1,106 @@ +import React from 'react' +import { useTranslate, useCustom, useApiUrl } from '@refinedev/core' +import CircularProgress from '@mui/material/CircularProgress' +import Box from '@mui/material/Box' +import Link from '@mui/material/Link' +import Paper from '@mui/material/Paper' +import Typography from '@mui/material/Typography' +import { FDO_COMMUNITY_MD_PROFILE_AAS as AAS, HANDLE_SYSTEM_BASE_URI as HS_BASE_URI, HANDLE_SYSTEM_DOWNLOAD_PROXY as HS_PROXY, CORDRA_HANDLE as CORDRA } from '../constants' +import { JsonView, darkStyles, defaultStyles } from 'react-json-view-lite'; +import { styled } from '@mui/material/styles' +import 'react-json-view-lite/dist/index.css'; + +import Details from '@components/fdos/details' + +const resolvePid = (pid) => `${HS_BASE_URI}/${pid}` + +const Item = styled(Paper)(({ theme }) => ({ + backgroundColor: '#fff', + ...theme.typography.body2, + padding: theme.spacing(1), + textAlign: 'left', + color: theme.palette.text.secondary, + ...theme.applyStyles('dark', { + backgroundColor: '#1A2027' + }) +})) + +const getEvebsDetails = (typePid, repository, metadataRecord) => { + const row = (category, classification, logo) => { + return { category, classification, logo } + } + const techInfo = metadataRecord.fdoProfile === AAS ? "BaSyx AAS" : "EDC"; + const techLogo = metadataRecord.fdoProfile === AAS ? "/images/aas.png" : "/images/eclipse-logo.png"; + const dataspaceInfo = metadataRecord.fdoProfile === AAS ? "RWTH" : "MDS"; + const dataspaceLogo = metadataRecord.fdoProfile === AAS ? "/images/rwth.png" : "/images/mds.png"; + + const details = [ + row('Type', <Link href={resolvePid(typePid)}>{ "EVEBS-FDO" }</Link>, '') + ] + if(repository) { + details.push(row('Repository', repository, + repository == CORDRA ? "/images/cordra-primary-blue.png" : "/images/la_logo.png")) + } + details.push(row('Dataspace', dataspaceInfo, dataspaceLogo)) + details.push(row('Technology', techInfo, techLogo)) + return details +} + +const EvebsDetails = ({pid, typePid, repository, metadataPid, title, showJson, subtitle}) => { + const apiUrl = useApiUrl() + const t = useTranslate() + const { data, isLoading, isError, error } = useCustom({ + url: `${HS_PROXY}/${metadataPid}?locatt=payloadIndex:0`, + method: 'get', + errorNotification: () => false, + queryOptions: { + retry: false + } + }) + const metadataRecord = useCustom({ + url: `${apiUrl}/fdo/${metadataPid}`, + method: 'get', + errorNotification: () => false, + queryOptions: { + retry: false + } + }); + + const metadata = data?.data; + var description = undefined + var displayName = metadata?.displayName + if(displayName && displayName[0]) { + displayName = displayName[0].text + } + if(isError) { + displayName = pid + } else if(metadata?.description && metadata?.description[0]) { + description = metadata?.description[0].text + } + + if (metadataRecord.isError) { + return <Item>Error</Item> + } + + return isLoading || metadataRecord.isLoading ? <Item><CircularProgress/></Item> : ( + <> + <Item> + <Typography variant="h5" gutterBottom>{title || displayName || metadata?.idShort || metadata?.id}</Typography> + <Typography variant="subtitle1" gutterBottom>{subtitle || description}</Typography> + <Box> + <Details rows={getEvebsDetails(typePid, repository, metadataRecord.data.data)}></Details> + </Box> + </Item> + { metadata && showJson && + <Item> + <Box> + <Typography variant="h6" gutterBottom>Metadata (JSON)</Typography> + <JsonView data={metadata} shouldExpandNode={lvl => lvl<3} style={defaultStyles} /> + </Box> + </Item> + } + </> + ) +} + +export default EvebsDetails diff --git a/src/components/fdos/create.tsx b/src/components/fdos/create.tsx index 470b37a838632af810c445b61a93c1d017046c93..e9935bc00a4f6e17623882de1792f4f9debd7cfd 100644 --- a/src/components/fdos/create.tsx +++ b/src/components/fdos/create.tsx @@ -160,11 +160,21 @@ const StepData: React.FC<any> = ({ register, errors }) => { return <FileUpload register={register} errors={errors} name="fdo_data" label="Upload data file"/> } +const showNewFdo = (go, pid) => { + const prefix = pid.split('/', 1)[0] + const suffix = pid.substring(prefix.length + 1) + setTimeout(() => go({ to: { resource: 'fdo', action: 'show', id: pid, meta: { prefix, suffix } }, type: 'replace' }), 300); +} + export const FdoCreate: React.FC<IResourceComponentsProps> = () => { const go = useGo() const accessToken = useAccessToken() - const formRet = useStepsForm<any, HttpError, any>({ defaultValues: { repository: '', profile: '' }, refineCoreProps: { meta: { headers: { Authentication: `Bearer ${accessToken}` } } } }) + const meta = { + headers: { Authentication: `Bearer ${accessToken}` } + } + + const formRet = useStepsForm<any, HttpError, any>({ defaultValues: { repository: '', profile: '' }, refineCoreProps: { meta: meta } }) const { setError, saveButtonProps, @@ -180,9 +190,7 @@ export const FdoCreate: React.FC<IResourceComponentsProps> = () => { } = formRet if (data?.data?.pid) { - const prefix = data?.data?.pid?.split('/', 1)[0] - const suffix = data?.data?.pid?.substring(prefix.length + 1) - go({ to: { resource: 'fdo', action: 'show', id: data?.data?.pid, meta: { prefix, suffix } }, type: 'push' }) + showNewFdo(go, data.data.pid) } const onSubmit = (data: any) => { diff --git a/src/components/header/UserComponent.tsx b/src/components/header/UserComponent.tsx index d92365c1573fcffb6c98a8f18bc68aeeef812444..9f2ac3506b1a7dd32cc1786110c789475eb5be26 100644 --- a/src/components/header/UserComponent.tsx +++ b/src/components/header/UserComponent.tsx @@ -1,4 +1,4 @@ -import * as React from 'react' +import React, { useContext } from 'react' import Button from '@mui/material/Button' import Menu from '@mui/material/Menu' import MenuItem from '@mui/material/MenuItem' @@ -6,6 +6,7 @@ import Stack from '@mui/material/Stack' import Typography from '@mui/material/Typography' import Avatar from '@mui/material/Avatar' import { useGetIdentity, useLogout, useLogin, useTranslate } from '@refinedev/core' +import { ColorModeContext } from "@contexts" interface IUser { name: string @@ -28,6 +29,7 @@ const Login = () => { } const UserMenu = ({ user }: any) => { + const { mode } = useContext(ColorModeContext); const [anchorEl, setAnchorEl] = React.useState<null | HTMLElement>(null) const open = Boolean(anchorEl) const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => { @@ -63,6 +65,7 @@ const UserMenu = ({ user }: any) => { } }} variant="subtitle2" + color={mode === "light" && "white" } > {user?.name} </Typography> @@ -88,7 +91,8 @@ const UserMenu = ({ user }: any) => { } export default function UserComponent () { - const { data: user } = useGetIdentity<IUser>() + const { data, isError, error } = useGetIdentity<IUser>(); + // console.log("UserComponent", data, isError, error); - return (user?.name ? <UserMenu user={user}/> : <Login/>) + return (!isError && data?.name ? <UserMenu user={data}/> : <Login/>) } diff --git a/src/providers/dataProvider.tsx b/src/providers/dataProvider.tsx index 10d87ca601378b2f146b00a3f3446ecf48a68bb9..d657713626839069d0d7ab0e22f74da87f374043 100644 --- a/src/providers/dataProvider.tsx +++ b/src/providers/dataProvider.tsx @@ -5,7 +5,6 @@ import axios from 'axios' const getNewlyCreated = async (newLocation: string) => { const response = await axios.get(newLocation) - console.log(response); if (response.data.data) { return response.data.data; } diff --git a/src/utils.tsx b/src/utils.tsx index edc9cb2f2d145ccb3f2642b9e7159028b24d6dc9..7d97f91fa9a0a00ecdc430d7a8d58daa1aff1294 100644 --- a/src/utils.tsx +++ b/src/utils.tsx @@ -16,19 +16,10 @@ export const useAccessToken: any = () => { const data = identity?.data?.data - if (data?.accessToken == null) { - return null - } - if (data?.error) { doLogout(logout, open) return null } - if (data?.accessTokenExpires) { - doLogout(logout, open) - return null - } - - return data?.accessToken + return data?.access_token }