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

EcrituresNumeriques / stylo / 12925854411

23 Jan 2025 09:11AM UTC coverage: 25.831% (-4.7%) from 30.523%
12925854411

push

github

web-flow
Merge pull request #1192 from EcrituresNumeriques/feat/vite6

322 of 518 branches covered (62.16%)

Branch coverage included in aggregate %.

3448 of 14077 relevant lines covered (24.49%)

1.66 hits per line

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

0.0
/front/src/components/workspace/Workspaces.jsx
1
import { Button, Modal as GeistModal } from '@geist-ui/core'
×
2
import React, { useCallback, useEffect, useState } from 'react'
×
3
import { useTranslation } from 'react-i18next'
×
4
import { shallowEqual, useSelector } from 'react-redux'
×
5
import { Search } from 'react-feather'
×
6

7
import { CurrentUserContext } from '../../contexts/CurrentUser'
×
8

9
import styles from './workspaces.module.scss'
×
10
import Field from '../../components/Field.jsx'
×
11

12
import WorkspaceItem from '../../components/workspace/WorkspaceItem.jsx'
×
13
import { useGraphQL } from '../../helpers/graphQL.js'
×
14
import { getWorkspaces, getUserStats } from './Workspaces.graphql'
×
15
import CreateWorkspace from '../../components/workspace/CreateWorkspace.jsx'
×
16

17
export default function Workspaces() {
×
18
  const { t } = useTranslation()
×
19
  const activeUser = useSelector((state) => state.activeUser, shallowEqual)
×
20
  const [filter, setFilter] = useState('')
×
21
  const [creating, setCreating] = useState(false)
×
22
  const [workspaces, setWorkspaces] = useState([])
×
23
  const [personalWorkspace, setPersonalWorkspace] = useState({
×
24
    _id: activeUser._id,
×
25
    personal: true,
×
26
    members: [],
×
27
  })
×
28
  const currentWorkspaces = activeUser.workspaces
×
29
  const handleCloseCreate = useCallback(() => {
×
30
    setCreating(false)
×
31
  }, [])
×
32
  const runQuery = useGraphQL()
×
33

34
  useEffect(() => {
×
35
    ;(async () => {
×
36
      try {
×
37
        const getUserStatsResponse = await runQuery({ query: getUserStats })
×
38
        const userStats = getUserStatsResponse.user.stats
×
39
        setPersonalWorkspace({
×
40
          _id: activeUser._id,
×
41
          personal: true,
×
42
          name: t('workspace.myspace'),
×
43
          description: '',
×
44
          color: '#D9D9D9',
×
45
          createdAt: activeUser.createdAt,
×
46
          updatedAt: activeUser.updatedAt,
×
47
          members: [],
×
48
          articlesCount:
×
49
            userStats.myArticlesCount + userStats.contributedArticlesCount,
×
50
        })
×
51
      } catch (err) {
×
52
        alert(err)
×
53
      }
×
54
    })()
×
55
  }, [activeUser._id, t])
×
56

57
  useEffect(() => {
×
58
    ;(async () => {
×
59
      try {
×
60
        const getWorkspacesResponse = await runQuery({ query: getWorkspaces })
×
61
        const workspaces = getWorkspacesResponse.workspaces
×
62
        setWorkspaces(workspaces)
×
63
        setCreating(false)
×
64
      } catch (err) {
×
65
        alert(err)
×
66
      }
×
67
    })()
×
68
  }, [currentWorkspaces])
×
69

70
  return (
×
71
    <CurrentUserContext.Provider value={activeUser}>
×
72
      <section className={styles.section}>
×
73
        <h1>{t('workspace.title')}</h1>
×
74
        <div>
×
75
          <Field
×
76
            className={styles.searchField}
×
77
            type="text"
×
78
            icon={Search}
×
79
            value={filter}
×
80
            placeholder={t('search.placeholder')}
×
81
            onChange={(e) => setFilter(e.target.value)}
×
82
          />
×
83
        </div>
×
84
        <Button
×
85
          type="secondary"
×
86
          className={styles.button}
×
87
          onClick={() => setCreating(true)}
×
88
        >
89
          {t('workspace.createNew.button')}
×
90
        </Button>
×
91

92
        <GeistModal
×
93
          width="45rem"
×
94
          visible={creating}
×
95
          onClose={handleCloseCreate}
×
96
        >
97
          <h2>{t('workspace.createModal.title')}</h2>
×
98
          <GeistModal.Content>
×
99
            <CreateWorkspace />
×
100
          </GeistModal.Content>
×
101
          <GeistModal.Action passive onClick={handleCloseCreate}>
×
102
            {t('modal.close.text')}
×
103
          </GeistModal.Action>
×
104
        </GeistModal>
×
105

106
        <ul className={styles.workspacesList}>
×
107
          {[personalWorkspace, ...workspaces].map((workspace) => (
×
108
            <li key={`workspace-${workspace._id}`}>
×
109
              <WorkspaceItem workspace={workspace} />
×
110
            </li>
×
111
          ))}
×
112
        </ul>
×
113
      </section>
×
114
    </CurrentUserContext.Provider>
×
115
  )
116
}
×
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