cozy-sharing 28.5.0 → 28.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/SharingProvider.js +182 -86
  3. package/dist/SharingProvider.spec.js +152 -0
  4. package/dist/components/Recipient/LinkRecipient.js +6 -3
  5. package/dist/components/Recipient/LinkRecipient.stories.js +0 -1
  6. package/dist/components/Recipient/MemberRecipient.spec.js +13 -0
  7. package/dist/components/Recipient/MemberRecipientPermissions.js +80 -20
  8. package/dist/components/Recipient/MemberRecipientPermissions.spec.js +214 -0
  9. package/dist/components/Recipient/actions/setReadOnlySharedPermission.js +0 -1
  10. package/dist/components/Recipient/actions/setReadOnlySharedPermission.spec.js +72 -0
  11. package/dist/components/Recipient/actions/setReadWriteSharedPermission.js +0 -1
  12. package/dist/components/Recipient/actions/setReadWriteSharedPermission.spec.js +72 -0
  13. package/dist/components/ShareDialogCozyToCozy.spec.js +9 -0
  14. package/dist/components/WhoHasAccess.js +0 -1
  15. package/locales/en.json +4 -1
  16. package/locales/fr.json +4 -1
  17. package/locales/ru.json +4 -1
  18. package/locales/vi.json +4 -1
  19. package/package.json +2 -2
  20. package/src/SharingProvider.jsx +51 -1
  21. package/src/SharingProvider.spec.jsx +94 -0
  22. package/src/components/Recipient/LinkRecipient.jsx +10 -4
  23. package/src/components/Recipient/LinkRecipient.stories.jsx +0 -1
  24. package/src/components/Recipient/MemberRecipient.spec.jsx +11 -0
  25. package/src/components/Recipient/MemberRecipientPermissions.jsx +69 -16
  26. package/src/components/Recipient/MemberRecipientPermissions.spec.jsx +165 -0
  27. package/src/components/Recipient/actions/setReadOnlySharedPermission.js +1 -1
  28. package/src/components/Recipient/actions/setReadOnlySharedPermission.spec.jsx +95 -0
  29. package/src/components/Recipient/actions/setReadWriteSharedPermission.js +1 -1
  30. package/src/components/Recipient/actions/setReadWriteSharedPermission.spec.jsx +95 -0
  31. package/src/components/ShareDialogCozyToCozy.spec.jsx +6 -0
  32. package/src/components/WhoHasAccess.jsx +0 -1
@@ -31,7 +31,6 @@ var LinkRecipient = function LinkRecipient(props) {
31
31
 
32
32
  var recipientConfirmationData = props.recipientConfirmationData,
33
33
  verifyRecipient = props.verifyRecipient,
34
- link = props.link,
35
34
  fadeIn = props.fadeIn,
36
35
  document = props.document;
37
36
  var permissions = getDocumentPermissions(document === null || document === void 0 ? void 0 : document._id);
@@ -41,7 +40,7 @@ var LinkRecipient = function LinkRecipient(props) {
41
40
  var textPrimary = hasPassword ? t('Share.recipients.linkWithPassword') : t('Share.recipients.anyoneWithTheLink');
42
41
  var textSecondary = expiresDate ? t('Share.recipients.expires', {
43
42
  date: dateFormatted
44
- }) : link;
43
+ }) : '';
45
44
  var RightPart = recipientConfirmationData ? /*#__PURE__*/React.createElement(RecipientConfirm, {
46
45
  recipientConfirmationData: recipientConfirmationData,
47
46
  verifyRecipient: verifyRecipient
@@ -70,6 +69,10 @@ var LinkRecipient = function LinkRecipient(props) {
70
69
  };
71
70
 
72
71
  LinkRecipient.propTypes = {
73
- link: PropTypes.string.isRequired
72
+ recipientConfirmationData: PropTypes.oneOfType([PropTypes.bool, PropTypes.object]),
73
+ verifyRecipient: PropTypes.func,
74
+ fadeIn: PropTypes.bool,
75
+ document: PropTypes.object,
76
+ permissions: PropTypes.arrayOf(PropTypes.object)
74
77
  };
75
78
  export default LinkRecipient;
@@ -6,7 +6,6 @@ var meta = {
6
6
  verifyRecipient: function verifyRecipient() {
7
7
  return true;
8
8
  },
9
- link: 'test',
10
9
  fadeIn: false
11
10
  }
12
11
  };
@@ -5,6 +5,19 @@ import React from 'react';
5
5
  import { createMockClient } from 'cozy-client';
6
6
  import MemberRecipient from './MemberRecipient';
7
7
  import AppLike from '../../../test/AppLike';
8
+ var mockUpdateDocumentPermissions = jest.fn();
9
+ var mockUpdateSharingMemberType = jest.fn();
10
+ jest.mock('../../hooks/useSharingContext', function () {
11
+ return {
12
+ // eslint-disable-next-line react/display-name
13
+ useSharingContext: function useSharingContext() {
14
+ return {
15
+ updateDocumentPermissions: mockUpdateDocumentPermissions,
16
+ updateSharingMemberType: mockUpdateSharingMemberType
17
+ };
18
+ }
19
+ };
20
+ });
8
21
  describe('MemberRecipient component', function () {
9
22
  var client = createMockClient({});
10
23
  client.options = {
@@ -4,13 +4,18 @@ import _regeneratorRuntime from "@babel/runtime/regenerator";
4
4
  import React, { useState, useRef, useCallback } from 'react';
5
5
  import { useI18n } from 'twake-i18n';
6
6
  import { useClient } from 'cozy-client';
7
+ import minilog from 'cozy-minilog';
7
8
  import ActionsMenu from 'cozy-ui/transpiled/react/ActionsMenu';
8
9
  import { makeActions, divider } from 'cozy-ui/transpiled/react/ActionsMenu/Actions';
9
10
  import DropdownButton from 'cozy-ui/transpiled/react/DropdownButton';
10
11
  import Spinner from 'cozy-ui/transpiled/react/Spinner';
11
12
  import Typography from 'cozy-ui/transpiled/react/Typography';
12
- import { permission } from './actions/permission';
13
+ import { useAlert } from 'cozy-ui/transpiled/react/providers/Alert';
13
14
  import { revokeMember } from './actions/revokeMember';
15
+ import { setReadOnlySharedPermission } from './actions/setReadOnlySharedPermission';
16
+ import { setReadWriteSharedPermission } from './actions/setReadWriteSharedPermission';
17
+ import { useSharingContext } from '../../hooks/useSharingContext';
18
+ var log = minilog('MemberRecipientPermissions');
14
19
 
15
20
  var MemberRecipientPermissions = function MemberRecipientPermissions(_ref) {
16
21
  var isOwner = _ref.isOwner,
@@ -31,6 +36,12 @@ var MemberRecipientPermissions = function MemberRecipientPermissions(_ref) {
31
36
  var buttonRef = useRef();
32
37
  var client = useClient();
33
38
 
39
+ var _useSharingContext = useSharingContext(),
40
+ updateSharingMemberType = _useSharingContext.updateSharingMemberType;
41
+
42
+ var _useAlert = useAlert(),
43
+ showAlert = _useAlert.showAlert;
44
+
34
45
  var _useState = useState(false),
35
46
  _useState2 = _slicedToArray(_useState, 2),
36
47
  revoking = _useState2[0],
@@ -44,52 +55,101 @@ var MemberRecipientPermissions = function MemberRecipientPermissions(_ref) {
44
55
  var instanceMatchesClient = instance !== undefined && instance === client.options.uri;
45
56
  var contactIsOwner = status === 'owner';
46
57
  var shouldShowMenu = !revoking && !contactIsOwner && (instanceMatchesClient && !isOwner || isOwner);
47
-
48
- var toggleMenu = function toggleMenu() {
49
- return setMenuDisplayed(!isMenuDisplayed);
50
- };
51
-
52
- var hideMenu = function hideMenu() {
53
- return setMenuDisplayed(false);
54
- };
55
-
58
+ var toggleMenu = useCallback(function () {
59
+ setMenuDisplayed(function (displayed) {
60
+ return !displayed;
61
+ });
62
+ }, []);
63
+ var hideMenu = useCallback(function () {
64
+ setMenuDisplayed(false);
65
+ }, []);
56
66
  var handleRevocation = useCallback( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
57
67
  return _regeneratorRuntime.wrap(function _callee$(_context) {
58
68
  while (1) switch (_context.prev = _context.next) {
59
69
  case 0:
60
70
  setRevoking(true);
71
+ _context.prev = 1;
61
72
 
62
73
  if (!isOwner) {
63
- _context.next = 6;
74
+ _context.next = 7;
64
75
  break;
65
76
  }
66
77
 
67
- _context.next = 4;
78
+ _context.next = 5;
68
79
  return onRevoke(document, sharingId, memberIndex);
69
80
 
70
- case 4:
71
- _context.next = 8;
81
+ case 5:
82
+ _context.next = 9;
72
83
  break;
73
84
 
74
- case 6:
75
- _context.next = 8;
85
+ case 7:
86
+ _context.next = 9;
76
87
  return onRevokeSelf(document);
77
88
 
78
- case 8:
89
+ case 9:
90
+ _context.prev = 9;
79
91
  setRevoking(false);
92
+ return _context.finish(9);
80
93
 
81
- case 9:
94
+ case 12:
82
95
  case "end":
83
96
  return _context.stop();
84
97
  }
85
- }, _callee);
98
+ }, _callee, null, [[1,, 9, 12]]);
86
99
  })), [isOwner, onRevoke, onRevokeSelf, document, sharingId, memberIndex]);
87
- var actions = makeActions([permission, divider, revokeMember], {
100
+ var setType = useCallback( /*#__PURE__*/function () {
101
+ var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(newType) {
102
+ return _regeneratorRuntime.wrap(function _callee2$(_context2) {
103
+ while (1) switch (_context2.prev = _context2.next) {
104
+ case 0:
105
+ if (!(newType === type)) {
106
+ _context2.next = 3;
107
+ break;
108
+ }
109
+
110
+ hideMenu();
111
+ return _context2.abrupt("return");
112
+
113
+ case 3:
114
+ _context2.prev = 3;
115
+ _context2.next = 6;
116
+ return updateSharingMemberType(sharingId, memberIndex, newType);
117
+
118
+ case 6:
119
+ _context2.next = 12;
120
+ break;
121
+
122
+ case 8:
123
+ _context2.prev = 8;
124
+ _context2.t0 = _context2["catch"](3);
125
+ log.error('Failed to change member permission type', _context2.t0);
126
+ showAlert({
127
+ message: t('Share.members.error.changePermission'),
128
+ severity: 'error',
129
+ variant: 'filled'
130
+ });
131
+
132
+ case 12:
133
+ hideMenu();
134
+
135
+ case 13:
136
+ case "end":
137
+ return _context2.stop();
138
+ }
139
+ }, _callee2, null, [[3, 8]]);
140
+ }));
141
+
142
+ return function (_x) {
143
+ return _ref3.apply(this, arguments);
144
+ };
145
+ }(), [hideMenu, memberIndex, sharingId, showAlert, t, type, updateSharingMemberType]);
146
+ var actions = makeActions([setReadOnlySharedPermission, setReadWriteSharedPermission, divider, revokeMember], {
88
147
  client: client,
89
148
  t: t,
90
149
  type: type !== null && type !== void 0 ? type : 'one-way',
91
150
  isOwner: isOwner,
92
151
  isSharedDrive: isSharedDrive,
152
+ setType: setType,
93
153
  handleRevocation: handleRevocation
94
154
  });
95
155
  return /*#__PURE__*/React.createElement("div", {
@@ -0,0 +1,214 @@
1
+ import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
2
+ import _extends from "@babel/runtime/helpers/extends";
3
+ import _regeneratorRuntime from "@babel/runtime/regenerator";
4
+ import { render, fireEvent, screen, act, waitFor } from '@testing-library/react';
5
+ import React from 'react';
6
+ import { createMockClient } from 'cozy-client';
7
+ import MemberRecipientPermissions from './MemberRecipientPermissions';
8
+ import AppLike from '../../../test/AppLike';
9
+ var mockUpdateSharingMemberType = jest.fn();
10
+ var mockShowAlert = jest.fn();
11
+ jest.mock('../../hooks/useSharingContext', function () {
12
+ return {
13
+ useSharingContext: function useSharingContext() {
14
+ return {
15
+ updateSharingMemberType: mockUpdateSharingMemberType
16
+ };
17
+ }
18
+ };
19
+ });
20
+ jest.mock('cozy-ui/transpiled/react/providers/Alert', function () {
21
+ return {
22
+ __esModule: true,
23
+ default: function _default(_ref) {
24
+ var children = _ref.children;
25
+ return children;
26
+ },
27
+ useAlert: function useAlert() {
28
+ return {
29
+ showAlert: mockShowAlert
30
+ };
31
+ }
32
+ };
33
+ });
34
+ describe('MemberRecipientPermissions component', function () {
35
+ var client = createMockClient({});
36
+ client.options = {
37
+ uri: 'http://cozy.local:8080'
38
+ };
39
+ var defaultProps = {
40
+ isOwner: true,
41
+ isSharedDrive: false,
42
+ status: 'ready',
43
+ instance: 'http://cozy.local:8080',
44
+ type: 'two-way',
45
+ document: {
46
+ id: 'doc-123',
47
+ type: 'io.cozy.files',
48
+ path: '/test'
49
+ },
50
+ sharingId: 'sharing-123',
51
+ memberIndex: 1,
52
+ onRevoke: jest.fn(),
53
+ onRevokeSelf: jest.fn()
54
+ };
55
+ beforeEach(function () {
56
+ jest.clearAllMocks();
57
+ });
58
+
59
+ var setup = function setup(props) {
60
+ return render( /*#__PURE__*/React.createElement(AppLike, {
61
+ client: client
62
+ }, /*#__PURE__*/React.createElement(MemberRecipientPermissions, _extends({}, defaultProps, props))));
63
+ };
64
+
65
+ var createRangeBackup;
66
+ beforeAll(function () {
67
+ createRangeBackup = global.document.createRange;
68
+ global.document.createRange = jest.fn(function () {
69
+ return {
70
+ setStart: function setStart() {},
71
+ setEnd: function setEnd() {},
72
+ commonAncestorContainer: {
73
+ nodeName: 'BODY',
74
+ ownerDocument: document
75
+ }
76
+ };
77
+ });
78
+ });
79
+ afterAll(function () {
80
+ global.document.createRange = createRangeBackup;
81
+ });
82
+ it('should render the current permission type', function () {
83
+ setup();
84
+ expect(screen.getByText('can change')).toBeInTheDocument();
85
+ });
86
+ it('should call updateSharingMemberType when changing to one-way', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
87
+ var _setup, getByText;
88
+
89
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
90
+ while (1) switch (_context.prev = _context.next) {
91
+ case 0:
92
+ mockUpdateSharingMemberType.mockResolvedValue(undefined);
93
+ _setup = setup({
94
+ type: 'two-way'
95
+ }), getByText = _setup.getByText;
96
+ fireEvent.click(getByText('can change'));
97
+ fireEvent.click(getByText('Can view'));
98
+ expect(mockUpdateSharingMemberType).toHaveBeenCalledWith('sharing-123', 1, 'one-way');
99
+
100
+ case 5:
101
+ case "end":
102
+ return _context.stop();
103
+ }
104
+ }, _callee);
105
+ })));
106
+ it('should call updateSharingMemberType when changing to two-way', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
107
+ var _setup2, getByText;
108
+
109
+ return _regeneratorRuntime.wrap(function _callee2$(_context2) {
110
+ while (1) switch (_context2.prev = _context2.next) {
111
+ case 0:
112
+ mockUpdateSharingMemberType.mockResolvedValue(undefined);
113
+ _setup2 = setup({
114
+ type: 'one-way'
115
+ }), getByText = _setup2.getByText;
116
+ fireEvent.click(getByText('can view'));
117
+ fireEvent.click(getByText('Can change'));
118
+ expect(mockUpdateSharingMemberType).toHaveBeenCalledWith('sharing-123', 1, 'two-way');
119
+
120
+ case 5:
121
+ case "end":
122
+ return _context2.stop();
123
+ }
124
+ }, _callee2);
125
+ })));
126
+ it('should show error alert when updateSharingMemberType fails', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee4() {
127
+ var _setup3, getByText;
128
+
129
+ return _regeneratorRuntime.wrap(function _callee4$(_context4) {
130
+ while (1) switch (_context4.prev = _context4.next) {
131
+ case 0:
132
+ mockUpdateSharingMemberType.mockRejectedValue(new Error('Network error'));
133
+ _setup3 = setup({
134
+ type: 'two-way'
135
+ }), getByText = _setup3.getByText;
136
+ _context4.next = 4;
137
+ return act( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3() {
138
+ return _regeneratorRuntime.wrap(function _callee3$(_context3) {
139
+ while (1) switch (_context3.prev = _context3.next) {
140
+ case 0:
141
+ fireEvent.click(getByText('can change'));
142
+ fireEvent.click(getByText('Can view'));
143
+
144
+ case 2:
145
+ case "end":
146
+ return _context3.stop();
147
+ }
148
+ }, _callee3);
149
+ })));
150
+
151
+ case 4:
152
+ _context4.next = 6;
153
+ return waitFor(function () {
154
+ expect(mockShowAlert).toHaveBeenCalledWith({
155
+ message: 'An error occurred while changing the permissions. Please try again.',
156
+ severity: 'error',
157
+ variant: 'filled'
158
+ });
159
+ });
160
+
161
+ case 6:
162
+ case "end":
163
+ return _context4.stop();
164
+ }
165
+ }, _callee4);
166
+ })));
167
+ it('should not call updateSharingMemberType when selecting same type', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee5() {
168
+ var _setup4, getByText;
169
+
170
+ return _regeneratorRuntime.wrap(function _callee5$(_context5) {
171
+ while (1) switch (_context5.prev = _context5.next) {
172
+ case 0:
173
+ mockUpdateSharingMemberType.mockResolvedValue(undefined);
174
+ _setup4 = setup({
175
+ type: 'two-way'
176
+ }), getByText = _setup4.getByText;
177
+ fireEvent.click(getByText('can change'));
178
+ fireEvent.click(getByText('Can change'));
179
+ expect(mockUpdateSharingMemberType).not.toHaveBeenCalled();
180
+
181
+ case 5:
182
+ case "end":
183
+ return _context5.stop();
184
+ }
185
+ }, _callee5);
186
+ })));
187
+ it('should not render menu when user is not owner and not the shared drive contact', function () {
188
+ var _setup5 = setup({
189
+ isOwner: false,
190
+ instance: 'http://other-cozy.local:8080'
191
+ }),
192
+ queryByText = _setup5.queryByText;
193
+
194
+ expect(queryByText('can change')).not.toBeInTheDocument();
195
+ expect(queryByText('can view')).not.toBeInTheDocument();
196
+ });
197
+ it('should render menu for owner', function () {
198
+ var _setup6 = setup({
199
+ isOwner: true
200
+ }),
201
+ getByText = _setup6.getByText;
202
+
203
+ expect(getByText('can change')).toBeInTheDocument();
204
+ });
205
+ it('should render menu for the user themselves', function () {
206
+ var _setup7 = setup({
207
+ isOwner: false,
208
+ instance: 'http://cozy.local:8080'
209
+ }),
210
+ getByText = _setup7.getByText;
211
+
212
+ expect(getByText('can change')).toBeInTheDocument();
213
+ });
214
+ });
@@ -12,7 +12,6 @@ var makeComponent = function makeComponent(_ref) {
12
12
  var Component = /*#__PURE__*/forwardRef(function (props, ref) {
13
13
  return /*#__PURE__*/React.createElement(ActionsMenuItem, _extends({}, props, {
14
14
  ref: ref,
15
- button: false,
16
15
  onClick: onClick
17
16
  }), /*#__PURE__*/React.createElement(ListItemIcon, null, /*#__PURE__*/React.createElement(Radios, {
18
17
  checked: type === 'one-way'
@@ -0,0 +1,72 @@
1
+ import { render, screen, fireEvent } from '@testing-library/react';
2
+ import React from 'react';
3
+ import { setReadOnlySharedPermission } from './setReadOnlySharedPermission';
4
+ import AppLike from '../../../../test/AppLike';
5
+
6
+ var mockT = function mockT(key) {
7
+ var translations = {
8
+ 'Share.type.one-way': 'Can view',
9
+ 'Share.type.two-way': 'Can change'
10
+ };
11
+ return translations[key] || key;
12
+ };
13
+
14
+ describe('setReadOnlySharedPermission', function () {
15
+ var setType;
16
+ beforeEach(function () {
17
+ setType = jest.fn();
18
+ });
19
+ it('should return correct action structure', function () {
20
+ var action = setReadOnlySharedPermission({
21
+ t: mockT,
22
+ type: 'one-way',
23
+ setType: setType
24
+ });
25
+ expect(action.name).toBe('setReadOnlySharedPermission');
26
+ expect(action.label).toBe('Can view');
27
+ expect(action.icon).toBeNull();
28
+ });
29
+ it('should call setType with one-way when action is triggered', function () {
30
+ var action = setReadOnlySharedPermission({
31
+ t: mockT,
32
+ type: 'two-way',
33
+ setType: setType
34
+ });
35
+ action.action();
36
+ expect(setType).toHaveBeenCalledWith('one-way');
37
+ });
38
+ it('should render radio as checked when type is one-way', function () {
39
+ var _setReadOnlySharedPer = setReadOnlySharedPermission({
40
+ t: mockT,
41
+ type: 'one-way',
42
+ setType: setType
43
+ }),
44
+ Component = _setReadOnlySharedPer.Component;
45
+
46
+ render( /*#__PURE__*/React.createElement(AppLike, null, /*#__PURE__*/React.createElement(Component, null)));
47
+ expect(screen.getByRole('radio')).toBeChecked();
48
+ });
49
+ it('should render radio as unchecked when type is two-way', function () {
50
+ var _setReadOnlySharedPer2 = setReadOnlySharedPermission({
51
+ t: mockT,
52
+ type: 'two-way',
53
+ setType: setType
54
+ }),
55
+ Component = _setReadOnlySharedPer2.Component;
56
+
57
+ render( /*#__PURE__*/React.createElement(AppLike, null, /*#__PURE__*/React.createElement(Component, null)));
58
+ expect(screen.getByRole('radio')).not.toBeChecked();
59
+ });
60
+ it('should call setType with one-way when the component is clicked', function () {
61
+ var _setReadOnlySharedPer3 = setReadOnlySharedPermission({
62
+ t: mockT,
63
+ type: 'two-way',
64
+ setType: setType
65
+ }),
66
+ Component = _setReadOnlySharedPer3.Component;
67
+
68
+ render( /*#__PURE__*/React.createElement(AppLike, null, /*#__PURE__*/React.createElement(Component, null)));
69
+ fireEvent.click(screen.getByText('Can view'));
70
+ expect(setType).toHaveBeenCalledWith('one-way');
71
+ });
72
+ });
@@ -12,7 +12,6 @@ var makeComponent = function makeComponent(_ref) {
12
12
  var Component = /*#__PURE__*/forwardRef(function (props, ref) {
13
13
  return /*#__PURE__*/React.createElement(ActionsMenuItem, _extends({}, props, {
14
14
  ref: ref,
15
- button: false,
16
15
  onClick: onClick
17
16
  }), /*#__PURE__*/React.createElement(ListItemIcon, null, /*#__PURE__*/React.createElement(Radios, {
18
17
  checked: type === 'two-way'
@@ -0,0 +1,72 @@
1
+ import { render, screen, fireEvent } from '@testing-library/react';
2
+ import React from 'react';
3
+ import { setReadWriteSharedPermission } from './setReadWriteSharedPermission';
4
+ import AppLike from '../../../../test/AppLike';
5
+
6
+ var mockT = function mockT(key) {
7
+ var translations = {
8
+ 'Share.type.one-way': 'Can view',
9
+ 'Share.type.two-way': 'Can change'
10
+ };
11
+ return translations[key] || key;
12
+ };
13
+
14
+ describe('setReadWriteSharedPermission', function () {
15
+ var setType;
16
+ beforeEach(function () {
17
+ setType = jest.fn();
18
+ });
19
+ it('should return correct action structure', function () {
20
+ var action = setReadWriteSharedPermission({
21
+ t: mockT,
22
+ type: 'two-way',
23
+ setType: setType
24
+ });
25
+ expect(action.name).toBe('setReadWriteSharedPermission');
26
+ expect(action.label).toBe('Can change');
27
+ expect(action.icon).toBeNull();
28
+ });
29
+ it('should call setType with two-way when action is triggered', function () {
30
+ var action = setReadWriteSharedPermission({
31
+ t: mockT,
32
+ type: 'one-way',
33
+ setType: setType
34
+ });
35
+ action.action();
36
+ expect(setType).toHaveBeenCalledWith('two-way');
37
+ });
38
+ it('should render radio as checked when type is two-way', function () {
39
+ var _setReadWriteSharedPe = setReadWriteSharedPermission({
40
+ t: mockT,
41
+ type: 'two-way',
42
+ setType: setType
43
+ }),
44
+ Component = _setReadWriteSharedPe.Component;
45
+
46
+ render( /*#__PURE__*/React.createElement(AppLike, null, /*#__PURE__*/React.createElement(Component, null)));
47
+ expect(screen.getByRole('radio')).toBeChecked();
48
+ });
49
+ it('should render radio as unchecked when type is one-way', function () {
50
+ var _setReadWriteSharedPe2 = setReadWriteSharedPermission({
51
+ t: mockT,
52
+ type: 'one-way',
53
+ setType: setType
54
+ }),
55
+ Component = _setReadWriteSharedPe2.Component;
56
+
57
+ render( /*#__PURE__*/React.createElement(AppLike, null, /*#__PURE__*/React.createElement(Component, null)));
58
+ expect(screen.getByRole('radio')).not.toBeChecked();
59
+ });
60
+ it('should call setType with two-way when the component is clicked', function () {
61
+ var _setReadWriteSharedPe3 = setReadWriteSharedPermission({
62
+ t: mockT,
63
+ type: 'one-way',
64
+ setType: setType
65
+ }),
66
+ Component = _setReadWriteSharedPe3.Component;
67
+
68
+ render( /*#__PURE__*/React.createElement(AppLike, null, /*#__PURE__*/React.createElement(Component, null)));
69
+ fireEvent.click(screen.getByText('Can change'));
70
+ expect(setType).toHaveBeenCalledWith('two-way');
71
+ });
72
+ });
@@ -29,6 +29,15 @@ jest.mock('cozy-client', function () {
29
29
  }
30
30
  });
31
31
  });
32
+ jest.mock('../hooks/useSharingContext', function () {
33
+ return {
34
+ useSharingContext: function useSharingContext() {
35
+ return {
36
+ updateSharingMemberType: jest.fn()
37
+ };
38
+ }
39
+ };
40
+ });
32
41
  describe('ShareDialogCozyToCozy', function () {
33
42
  var client = createMockClient({});
34
43
  client.options = {
@@ -55,7 +55,6 @@ var WhoHasAccess = function WhoHasAccess(_ref2) {
55
55
  documentType: documentType,
56
56
  onRevoke: onRevoke,
57
57
  onRevokeSelf: onRevokeSelf,
58
- link: link,
59
58
  permissions: permissions,
60
59
  fadeIn: linkHasBeenJustCreated
61
60
  }), /*#__PURE__*/React.createElement(OwnerRecipient, {
package/locales/en.json CHANGED
@@ -34,7 +34,10 @@
34
34
  "members": {
35
35
  "count": "%{smart_count} member |||| %{smart_count} members",
36
36
  "others": "and 1 other… |||| and %{smart_count} others…",
37
- "otherContacts": "other contact |||| other contacts"
37
+ "otherContacts": "other contact |||| other contacts",
38
+ "error": {
39
+ "changePermission": "An error occurred while changing the permissions. Please try again."
40
+ }
38
41
  },
39
42
  "contacts": {
40
43
  "whoHasAccess": "Who has access?",
package/locales/fr.json CHANGED
@@ -34,7 +34,10 @@
34
34
  "members": {
35
35
  "count": "%{smart_count} membre |||| %{smart_count} membres",
36
36
  "others": "et 1 autre… |||| et %{smart_count} autres…",
37
- "otherContacts": "autre contact |||| autres contacts"
37
+ "otherContacts": "autre contact |||| autres contacts",
38
+ "error": {
39
+ "changePermission": "Une erreur s'est produite lors du changement des permissions. Veuillez réessayer."
40
+ }
38
41
  },
39
42
  "contacts": {
40
43
  "whoHasAccess": "Qui a accès ?",
package/locales/ru.json CHANGED
@@ -34,7 +34,10 @@
34
34
  "members": {
35
35
  "count": "%{smart_count} участник |||| %{smart_count} участника |||| %{smart_count} участников",
36
36
  "others": "и 1 другой… |||| и %{smart_count} других…",
37
- "otherContacts": "другой контакт |||| других контакта"
37
+ "otherContacts": "другой контакт |||| других контакта",
38
+ "error": {
39
+ "changePermission": "Произошла ошибка при изменении разрешений. Пожалуйста, попробуйте снова."
40
+ }
38
41
  },
39
42
  "contacts": {
40
43
  "whoHasAccess": "У кого есть доступ?",
package/locales/vi.json CHANGED
@@ -34,7 +34,10 @@
34
34
  "members": {
35
35
  "count": "%{smart_count} thành viên |||| %{smart_count} thành viên",
36
36
  "others": "và 1 người khác… |||| và %{smart_count} người khác…",
37
- "otherContacts": "người liên hệ khác |||| người liên hệ khác"
37
+ "otherContacts": "người liên hệ khác |||| người liên hệ khác",
38
+ "error": {
39
+ "changePermission": "Đã xảy ra lỗi khi thay đổi quyền. Vui lòng thử lại."
40
+ }
38
41
  },
39
42
  "contacts": {
40
43
  "whoHasAccess": "Ai có quyền truy cập?",