Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

84 wiersze
2.4KB

  1. import { ConfigProvider, Result, Spin, theme } from 'antd'
  2. import { useCallback, useMemo } from 'react'
  3. import './App.css'
  4. import {
  5. buildKeycloakAuthorizationUrl,
  6. getKeycloakClientConfig,
  7. authenticatedFetch,
  8. logout,
  9. oidcStateStorageKey,
  10. submitKeycloakLogout,
  11. storeAuthTokenSet,
  12. } from './auth/authContracts'
  13. import { useOidcSession } from './auth/useOidcSession'
  14. import { WorkspaceShell } from './workspace/WorkspaceShell'
  15. import { workspaceThemeTokens } from './workspace/workspaceContracts'
  16. function App() {
  17. const session = useOidcSession()
  18. const config = useMemo(() => getKeycloakClientConfig(), [])
  19. const handleLogout = useCallback(async () => {
  20. const idToken = session.status === 'authenticated' ? (session.tokens.idToken ?? '') : ''
  21. const accessToken = session.status === 'authenticated' ? session.tokens.accessToken : undefined
  22. await logout(idToken, accessToken)
  23. const state = crypto.randomUUID()
  24. window.sessionStorage.setItem(oidcStateStorageKey, state)
  25. if (idToken) {
  26. submitKeycloakLogout(config, idToken, window.location.origin)
  27. return
  28. }
  29. window.location.assign(
  30. buildKeycloakAuthorizationUrl(config, state, crypto.randomUUID()).toString(),
  31. )
  32. }, [session, config])
  33. const adminFetch = useCallback(
  34. async (input: RequestInfo | URL, init: RequestInit = {}) => {
  35. if (session.status !== 'authenticated') {
  36. throw new Error('Admin request requires an authenticated session')
  37. }
  38. return authenticatedFetch(input, init, config, session.tokens, storeAuthTokenSet)
  39. },
  40. [config, session],
  41. )
  42. const content =
  43. session.status === 'authenticated' ? (
  44. <WorkspaceShell user={session.user} onLogout={handleLogout} adminFetch={adminFetch} />
  45. ) : session.status === 'error' ? (
  46. <Result status="warning" title={session.error} />
  47. ) : (
  48. <div className="app-auth-state" aria-live="polite">
  49. <Spin />
  50. </div>
  51. )
  52. return (
  53. <ConfigProvider
  54. theme={{
  55. algorithm: theme.compactAlgorithm,
  56. token: workspaceThemeTokens,
  57. components: {
  58. Layout: {
  59. headerBg: '#FFFFFF',
  60. siderBg: '#FFFFFF',
  61. },
  62. Table: {
  63. cellPaddingBlockSM: 6,
  64. cellPaddingInlineSM: 8,
  65. },
  66. },
  67. }}
  68. >
  69. <div className="app-shell">
  70. {content}
  71. </div>
  72. </ConfigProvider>
  73. )
  74. }
  75. export default App

Powered by TurnKey Linux.