• 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/collaborative/CollaborativeSessionAction.jsx
1
import React, { useCallback, useEffect, useMemo } from 'react'
×
2
import PropTypes from 'prop-types'
×
3
import { Badge, Modal as GeistModal, useModal } from '@geist-ui/core'
×
4
import { Users } from 'react-feather'
×
5
import { useTranslation } from 'react-i18next'
×
6
import { useHistory } from 'react-router-dom'
×
7

8
import { useMutation } from '../../hooks/graphql.js'
×
9

10
import { startCollaborativeSession } from '../Article.graphql'
×
11
import Button from '../Button.jsx'
×
12

13
export default function CollaborativeSessionAction({
×
14
  collaborativeSession,
×
15
  articleId,
×
16
}) {
×
17
  const { t } = useTranslation()
×
18
  const history = useHistory()
×
19
  const mutation = useMutation()
×
20
  const {
×
21
    visible: collaborativeEditingVisible,
×
22
    setVisible: setCollaborativeEditingVisible,
×
23
    bindings: collaborativeEditingBinding,
×
24
  } = useModal()
×
25

26
  const handleStartCollaborativeEditing = useCallback(async () => {
×
27
    // try to start a collaborative editing
28
    if (collaborativeSession && collaborativeSession.id) {
×
29
      // join existing collaborative session
30
      history.push(`/article/${articleId}/session/${collaborativeSession.id}`)
×
31
    } else {
×
32
      // start a new collaborative session
33
      const data = await mutation({
×
34
        query: startCollaborativeSession,
×
35
        variables: { articleId },
×
36
      })
×
37
      history.push(
×
38
        `/article/${articleId}/session/${data.article.startCollaborativeSession.id}`
×
39
      )
×
40
    }
×
41
  }, [collaborativeSession])
×
42

43
  const collaborativeSessionDialogTitle = useMemo(
×
44
    () =>
×
45
      collaborativeSession
×
46
        ? t('article.collaborativeEditingJoin.title')
×
47
        : t('article.collaborativeEditingStart.title'),
×
48
    [collaborativeSession]
×
49
  )
×
50

51
  const collaborativeSessionDialogMessage = useMemo(
×
52
    () =>
×
53
      collaborativeSession
×
54
        ? t('article.collaborativeEditingJoin.confirmMessage')
×
55
        : t('article.collaborativeEditingStart.confirmMessage'),
×
56
    [collaborativeSession]
×
57
  )
×
58

59
  useEffect(() => {
×
60
    return () => {
×
61
      setCollaborativeEditingVisible(false)
×
62
    }
×
63
  }, [])
×
64

65
  return (
×
66
    <>
×
67
      <Button
×
68
        title={t(
×
69
          'collaborativeSessionAction.launchCollaborativeSessionButton.title'
×
70
        )}
×
71
        icon={true}
×
72
        onClick={() => setCollaborativeEditingVisible(true)}
×
73
      >
74
        <Users />
×
75
        {collaborativeSession && collaborativeSession.id && (
×
76
          <Badge type="error">Live</Badge>
×
77
        )}
78
      </Button>
×
79
      <GeistModal
×
80
        width="35rem"
×
81
        visible={collaborativeEditingVisible}
×
82
        {...collaborativeEditingBinding}
×
83
      >
84
        <h2>{collaborativeSessionDialogTitle}</h2>
×
85
        <GeistModal.Content>
×
86
          {collaborativeSessionDialogMessage}
×
87
        </GeistModal.Content>
×
88
        <GeistModal.Action
×
89
          passive
×
90
          onClick={() => setCollaborativeEditingVisible(false)}
×
91
        >
92
          {t('modal.cancelButton.text')}
×
93
        </GeistModal.Action>
×
94
        <GeistModal.Action onClick={handleStartCollaborativeEditing}>
×
95
          {t('modal.confirmButton.text')}
×
96
        </GeistModal.Action>
×
97
      </GeistModal>
×
98
    </>
×
99
  )
100
}
×
101

102
CollaborativeSessionAction.propTypes = {
×
103
  articleId: PropTypes.string.isRequired,
×
104
  collaborativeSession: PropTypes.shape({
×
105
    id: PropTypes.string,
×
106
  }),
×
107
}
×
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