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

EcrituresNumeriques / stylo / 15421390032

03 Jun 2025 03:23PM UTC coverage: 38.118% (+0.4%) from 37.711%
15421390032

push

github

web-flow
feat: EntĂȘte responsive (#1531)

Co-authored-by: Thomas Parisot <thom4parisot@users.noreply.github.com>

560 of 791 branches covered (70.8%)

Branch coverage included in aggregate %.

36 of 309 new or added lines in 17 files covered. (11.65%)

307 existing lines in 17 files now uncovered.

5458 of 14997 relevant lines covered (36.39%)

2.58 hits per line

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

0.0
/front/src/components/header/UserMenu.jsx
NEW
1
import React, { useCallback, useEffect } from 'react'
×
2
import { useTranslation } from 'react-i18next'
×
NEW
3
import { useSelector } from 'react-redux'
×
NEW
4
import { Link } from 'react-router'
×
NEW
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'
×
NEW
11
import WorkspaceMenuItem from '../workspace/WorkspaceMenuItem.jsx'
×
UNCOV
12
import UserMenuLink from './UserMenuLink.jsx'
×
NEW
13
import { useActiveWorkspace } from '../../hooks/workspace.js'
×
14

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

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

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

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

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

© 2026 Coveralls, Inc