narrowLayout.tsx 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. import {useEffect} from 'react';
  2. import styled from '@emotion/styled';
  3. import {logout} from 'sentry/actionCreators/account';
  4. import {IconSentry} from 'sentry/icons';
  5. import {t} from 'sentry/locale';
  6. import useApi from 'sentry/utils/useApi';
  7. type Props = {
  8. children: React.ReactNode;
  9. maxWidth?: string;
  10. showLogout?: boolean;
  11. };
  12. function NarrowLayout({maxWidth, showLogout, children}: Props) {
  13. const api = useApi();
  14. useEffect(() => {
  15. document.body.classList.add('narrow');
  16. return () => document.body.classList.remove('narrow');
  17. }, []);
  18. async function handleLogout() {
  19. await logout(api);
  20. window.location.assign('/auth/login');
  21. }
  22. return (
  23. <div className="app">
  24. <div className="pattern-bg" />
  25. <div className="container" style={{maxWidth}}>
  26. <div className="box box-modal">
  27. <div className="box-header">
  28. <a href="/">
  29. <IconSentry size="lg" />
  30. </a>
  31. {showLogout && (
  32. <a className="logout pull-right" onClick={handleLogout}>
  33. <Logout>{t('Sign out')}</Logout>
  34. </a>
  35. )}
  36. </div>
  37. <div className="box-content with-padding">{children}</div>
  38. </div>
  39. </div>
  40. </div>
  41. );
  42. }
  43. const Logout = styled('span')`
  44. font-size: ${p => p.theme.fontSizeLarge};
  45. `;
  46. export default NarrowLayout;