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

EcrituresNumeriques / stylo / 14530927846

18 Apr 2025 06:33AM UTC coverage: 34.65% (+1.2%) from 33.412%
14530927846

push

github

web-flow
Ajout des providers Zotero et Hypothesis (#1376)

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

535 of 793 branches covered (67.47%)

Branch coverage included in aggregate %.

544 of 1053 new or added lines in 27 files covered. (51.66%)

51 existing lines in 9 files now uncovered.

5316 of 16093 relevant lines covered (33.03%)

2.4 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'
×
4
import { Link } from 'react-router-dom'
×
5
import { Layers, LogOut, User } from 'lucide-react'
×
NEW
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

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

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

23
  const { ref, isComponentVisible, setIsComponentVisible } =
×
24
    useComponentVisible(false)
×
25
  const activeUser = useSelector((state) => state.activeUser)
×
26
  const activeWorkspace = activeUser.workspaces.find(
×
27
    (workspace) => workspace._id === activeUser.activeWorkspaceId
×
28
  )
×
29

30
  useEffect(() => {
×
31
    setIsComponentVisible(false)
×
32
  }, [activeUser.activeWorkspaceId])
×
33

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