• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

EcrituresNumeriques / stylo / 15066626824

16 May 2025 10:41AM UTC coverage: 37.574% (-0.02%) from 37.594%
15066626824

Pull #1517

github

web-flow
Merge e05a1c169 into 607ffe7f9
Pull Request #1517: Mise à jour vers react-router@7

549 of 776 branches covered (70.75%)

Branch coverage included in aggregate %.

13 of 373 new or added lines in 28 files covered. (3.49%)

5 existing lines in 4 files now uncovered.

5319 of 14841 relevant lines covered (35.84%)

2.56 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/front/src/components/header/UserMenu.jsx
1
import React, { useCallback, useEffect } from 'react'
×
2
import { useTranslation } from 'react-i18next'
×
3
import { useSelector } from 'react-redux'
×
NEW
4
import { Link } from 'react-router'
×
5
import { Layers, LogOut, User } from 'lucide-react'
×
6
import { useLogout } from '../../hooks/user.js'
×
7

8
import useComponentVisible from '../../hooks/componentVisible'
×
9
import styles from './UserMenu.module.scss'
×
10
import Button from '../Button.jsx'
×
11
import WorkspaceMenuItem from '../workspace/WorkspaceMenuItem.jsx'
×
12
import UserMenuLink from './UserMenuLink.jsx'
×
13
import { useActiveWorkspace } from '../../hooks/workspace.js'
×
14

15
export default function UserMenu() {
×
16
  const { t } = useTranslation()
×
17
  const logout = useLogout()
×
18

19
  const handleLogout = useCallback(() => {
×
20
    setIsComponentVisible(false)
×
21
    logout()
×
22
  }, [])
×
23

24
  const { ref, isComponentVisible, setIsComponentVisible } =
×
25
    useComponentVisible(false)
×
26
  const activeUser = useSelector((state) => state.activeUser)
×
27
  const activeWorkspace = useActiveWorkspace()
×
28

29
  useEffect(() => {
×
30
    setIsComponentVisible(false)
×
31
  }, [activeWorkspace])
×
32

33
  return (
×
34
    <div ref={ref} className={styles.container}>
×
35
      <div
×
36
        className={styles.userMenuLink}
×
37
        onClick={() => setIsComponentVisible(!isComponentVisible)}
×
38
      >
39
        <UserMenuLink
×
40
          username={activeUser.displayName}
×
41
          activeWorkspace={activeWorkspace}
×
42
        />
×
43
      </div>
×
44
      {isComponentVisible && (
×
45
        <div className={styles.menu}>
×
46
          <div className={styles.workspaces}>
×
47
            <h4>{t('workspace.menu.title')}</h4>
×
48
            <ul>
×
49
              <WorkspaceMenuItem
×
50
                color="#D9D9D9"
×
51
                name={t('workspace.myspace')}
×
52
              />
×
53
              {activeUser.workspaces.map((workspace) => (
×
54
                <WorkspaceMenuItem
×
55
                  id={workspace._id}
×
56
                  key={workspace._id}
×
57
                  color={workspace.color}
×
58
                  name={workspace.name}
×
59
                />
×
60
              ))}
×
61
              <li className={styles.workspacesLink}>
×
62
                <Link
×
63
                  to="/workspaces"
×
64
                  onClick={() => setIsComponentVisible(false)}
×
65
                >
66
                  <Layers />
×
67
                  {t('workspace.all')}
×
68
                </Link>
×
69
              </li>
×
70
            </ul>
×
71
          </div>
×
72
          <div className={styles.footer}>
×
73
            <div className={styles.userBlock}>
×
74
              <Link
×
75
                to="/credentials"
×
76
                onClick={() => setIsComponentVisible(false)}
×
77
                className={styles.userCard}
×
78
              >
79
                <div className={styles.persona}>
×
80
                  <User />
×
81
                </div>
×
82
                <div className={styles.userInfo}>
×
83
                  <div className={styles.username}>
×
84
                    {activeUser.displayName}
×
85
                  </div>
×
86
                  <div className={styles.email}>{activeUser.email}</div>
×
87
                </div>
×
88
              </Link>
×
89
              <Button
×
90
                className={styles.logoutButton}
×
91
                onClick={handleLogout}
×
92
                aria-label={t('credentials.logout.confirmButton')}
×
93
                link
×
94
              >
95
                <LogOut size={22} aria-hidden />
×
96
              </Button>
×
97
            </div>
×
98
          </div>
×
99
        </div>
×
100
      )}
101
    </div>
×
102
  )
103
}
×
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc