@atlaskit/teams-public 0.54.3 → 0.55.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 (22) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/cjs/controllers/hooks/use-create-containers/index.js +1 -3
  3. package/dist/cjs/controllers/hooks/use-refresh-containers-on-container-created/index.js +143 -0
  4. package/dist/cjs/ui/team-containers/main.js +113 -108
  5. package/dist/cjs/ui/team-containers/team-link-card/index.js +3 -2
  6. package/dist/es2019/controllers/hooks/use-create-containers/index.js +1 -3
  7. package/dist/es2019/controllers/hooks/use-refresh-containers-on-container-created/index.js +135 -0
  8. package/dist/es2019/ui/team-containers/main.js +75 -66
  9. package/dist/es2019/ui/team-containers/team-link-card/index.js +3 -2
  10. package/dist/esm/controllers/hooks/use-create-containers/index.js +1 -3
  11. package/dist/esm/controllers/hooks/use-refresh-containers-on-container-created/index.js +136 -0
  12. package/dist/esm/ui/team-containers/main.js +107 -104
  13. package/dist/esm/ui/team-containers/team-link-card/index.js +3 -2
  14. package/dist/types/controllers/hooks/use-refresh-containers-on-container-created/index.d.ts +4 -0
  15. package/dist/types/ui/team-containers/main.d.ts +1 -1
  16. package/dist/types/ui/team-containers/team-link-card/index.d.ts +2 -1
  17. package/dist/types/ui/team-containers/types.d.ts +12 -0
  18. package/dist/types-ts4.5/controllers/hooks/use-refresh-containers-on-container-created/index.d.ts +4 -0
  19. package/dist/types-ts4.5/ui/team-containers/main.d.ts +1 -1
  20. package/dist/types-ts4.5/ui/team-containers/team-link-card/index.d.ts +2 -1
  21. package/dist/types-ts4.5/ui/team-containers/types.d.ts +12 -0
  22. package/package.json +2 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # @atlaskit/teams-public
2
2
 
3
+ ## 0.55.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`aac362891a691`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/aac362891a691) -
8
+ Team containers made reusable
9
+ - [`2aa702d47e9d3`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/2aa702d47e9d3) -
10
+ Update useRefreshOnContainerCreated to poll for container until its ready
11
+
12
+ ### Patch Changes
13
+
14
+ - Updated dependencies
15
+
3
16
  ## 0.54.3
4
17
 
5
18
  ### Patch Changes
@@ -33,10 +33,8 @@ var actions = {
33
33
  if (current.isCreated === isCreated) {
34
34
  return;
35
35
  }
36
- var isLoading = isCreated ? false : current.isLoading;
37
36
  setState(_objectSpread(_objectSpread({}, containers), {}, (0, _defineProperty2.default)({}, product, _objectSpread(_objectSpread({}, current), {}, {
38
- isCreated: isCreated,
39
- isLoading: isLoading
37
+ isCreated: isCreated
40
38
  }))));
41
39
  };
42
40
  }
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.TIMEOUT_DURATION = exports.INTERVAL_TIME = void 0;
8
+ exports.useRefreshOnContainerCreated = useRefreshOnContainerCreated;
9
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
11
+ var _react = require("react");
12
+ var _useCreateContainers3 = require("../use-create-containers");
13
+ var _useTeamContainers2 = require("../use-team-containers");
14
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
15
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
16
+ var PRODUCT_TO_CONTAINER_TYPE = {
17
+ Jira: 'JiraProject',
18
+ Confluence: 'ConfluenceSpace',
19
+ Loom: 'LoomSpace'
20
+ };
21
+ var INTERVAL_TIME = exports.INTERVAL_TIME = 2000;
22
+ var TIMEOUT_DURATION = exports.TIMEOUT_DURATION = 30000;
23
+ function useRefreshOnContainerCreated(teamId) {
24
+ var _useCreateContainers = (0, _useCreateContainers3.useCreateContainers)(),
25
+ _useCreateContainers2 = (0, _slicedToArray2.default)(_useCreateContainers, 2),
26
+ containers = _useCreateContainers2[0],
27
+ updateContainerLoading = _useCreateContainers2[1].updateContainerLoading;
28
+ var _useTeamContainers = (0, _useTeamContainers2.useTeamContainers)(teamId),
29
+ refetchTeamContainers = _useTeamContainers.refetchTeamContainers,
30
+ teamContainers = _useTeamContainers.teamContainers;
31
+ var _useState = (0, _react.useState)({}),
32
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
33
+ createdContainers = _useState2[0],
34
+ setCreatedContainers = _useState2[1];
35
+ var intervalRef = (0, _react.useRef)(null);
36
+ (0, _react.useEffect)(function () {
37
+ setCreatedContainers({});
38
+ if (intervalRef.current) {
39
+ clearInterval(intervalRef.current);
40
+ intervalRef.current = null;
41
+ }
42
+ }, [teamId]);
43
+ (0, _react.useEffect)(function () {
44
+ var products = Object.keys(containers);
45
+ products.forEach(function (product) {
46
+ var isCreated = containers[product].isCreated;
47
+ if (!isCreated) {
48
+ return;
49
+ }
50
+ var existing = createdContainers[product];
51
+ if (existing && existing.found === false) {
52
+ return;
53
+ }
54
+ if (existing && existing.found) {
55
+ return;
56
+ }
57
+ var containerType = PRODUCT_TO_CONTAINER_TYPE[product];
58
+ if (!containerType) {
59
+ return;
60
+ }
61
+ var currentCount = teamContainers.filter(function (c) {
62
+ return c.type === containerType;
63
+ }).length;
64
+ if (currentCount > 0) {
65
+ setCreatedContainers(function (prev) {
66
+ return _objectSpread(_objectSpread({}, prev), {}, (0, _defineProperty2.default)({}, product, {
67
+ startedAt: Date.now(),
68
+ found: true
69
+ }));
70
+ });
71
+ updateContainerLoading(product, false);
72
+ return;
73
+ }
74
+ setCreatedContainers(function (prev) {
75
+ return _objectSpread(_objectSpread({}, prev), {}, (0, _defineProperty2.default)({}, product, {
76
+ startedAt: Date.now(),
77
+ found: false
78
+ }));
79
+ });
80
+ });
81
+ }, [containers, createdContainers, teamContainers, updateContainerLoading]);
82
+ (0, _react.useEffect)(function () {
83
+ if (Object.keys(createdContainers).length === 0) {
84
+ if (intervalRef.current) {
85
+ clearInterval(intervalRef.current);
86
+ intervalRef.current = null;
87
+ }
88
+ return;
89
+ }
90
+ if (intervalRef.current) {
91
+ return;
92
+ }
93
+ intervalRef.current = setInterval(function () {
94
+ setCreatedContainers(function (prev) {
95
+ var anyPending = false;
96
+ var next = _objectSpread({}, prev);
97
+ Object.keys(prev).forEach(function (product) {
98
+ var target = prev[product];
99
+ if (!target || target.found) {
100
+ return;
101
+ }
102
+ var startedAt = target.startedAt;
103
+ var containerType = PRODUCT_TO_CONTAINER_TYPE[product];
104
+ if (!containerType) {
105
+ next[product] = _objectSpread(_objectSpread({}, target), {}, {
106
+ found: true
107
+ });
108
+ updateContainerLoading(product, false);
109
+ return;
110
+ }
111
+ var currentCount = teamContainers.filter(function (container) {
112
+ return container.type === containerType;
113
+ }).length;
114
+ var elapsed = Date.now() - startedAt;
115
+ if (currentCount > 0 || elapsed >= TIMEOUT_DURATION) {
116
+ next[product] = _objectSpread(_objectSpread({}, target), {}, {
117
+ found: true
118
+ });
119
+ updateContainerLoading(product, false);
120
+ } else {
121
+ anyPending = true;
122
+ }
123
+ });
124
+ if (!anyPending) {
125
+ if (intervalRef.current) {
126
+ clearInterval(intervalRef.current);
127
+ intervalRef.current = null;
128
+ }
129
+ }
130
+ if (anyPending) {
131
+ refetchTeamContainers();
132
+ }
133
+ return next;
134
+ });
135
+ }, INTERVAL_TIME);
136
+ return function () {
137
+ if (intervalRef.current) {
138
+ clearInterval(intervalRef.current);
139
+ intervalRef.current = null;
140
+ }
141
+ };
142
+ }, [createdContainers, teamContainers, refetchTeamContainers, updateContainerLoading]);
143
+ }
@@ -8,7 +8,6 @@ Object.defineProperty(exports, "__esModule", {
8
8
  exports.TeamContainers = exports.MAX_NUMBER_OF_CONTAINERS_TO_SHOW = exports.ICON_COLOR = exports.ICON_BACKGROUND = void 0;
9
9
  var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
10
10
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
11
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
12
11
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
13
12
  var _react = _interopRequireWildcard(require("react"));
14
13
  var _reactIntlNext = require("react-intl-next");
@@ -23,44 +22,22 @@ var _colors = require("@atlaskit/theme/colors");
23
22
  var _teamContainersSkeleton = require("../../common/ui/team-containers-skeleton");
24
23
  var _analytics = require("../../common/utils/analytics");
25
24
  var _controllers = require("../../controllers");
26
- var _useCreateContainers5 = require("../../controllers/hooks/use-create-containers");
25
+ var _useCreateContainers3 = require("../../controllers/hooks/use-create-containers");
27
26
  var _useProductPermission3 = require("../../controllers/hooks/use-product-permission");
27
+ var _useRefreshContainersOnContainerCreated = require("../../controllers/hooks/use-refresh-containers-on-container-created");
28
28
  var _useRequestedContainer = require("../../controllers/hooks/use-requested-container");
29
- var _useTeamContainers3 = require("../../controllers/hooks/use-team-containers");
29
+ var _useTeamContainers2 = require("../../controllers/hooks/use-team-containers");
30
30
  var _useTeamLinksAndContainers = require("../../controllers/hooks/use-team-links-and-containers");
31
31
  var _addContainerCard = require("./add-container-card");
32
32
  var _async = require("./disconnect-dialog/async");
33
33
  var _noProductAccessEmptyState = require("./no-product-access-empty-state");
34
34
  var _teamLinkCard = require("./team-link-card");
35
35
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
36
- function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
37
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } // eslint-disable-next-line @atlaskit/design-system/no-emotion-primitives -- to be migrated to @atlaskit/primitives/compiled – go/akcss
36
+ // eslint-disable-next-line @atlaskit/design-system/no-emotion-primitives -- to be migrated to @atlaskit/primitives/compiled go/akcss
37
+
38
38
  var ICON_BACKGROUND = exports.ICON_BACKGROUND = "var(--ds-icon-inverse, ".concat(_colors.N0, ")");
39
39
  var ICON_COLOR = exports.ICON_COLOR = "var(--ds-icon-subtle, ".concat(_colors.N90, ")");
40
40
  var MAX_NUMBER_OF_CONTAINERS_TO_SHOW = exports.MAX_NUMBER_OF_CONTAINERS_TO_SHOW = 4;
41
- function useRefreshOnContainerCreated(teamId) {
42
- var _useCreateContainers = (0, _useCreateContainers5.useCreateContainers)(),
43
- _useCreateContainers2 = (0, _slicedToArray2.default)(_useCreateContainers, 1),
44
- containers = _useCreateContainers2[0];
45
- var _useTeamContainers = (0, _useTeamContainers3.useTeamContainers)(teamId),
46
- refetchTeamContainers = _useTeamContainers.refetchTeamContainers;
47
- var _useState = (0, _react.useState)({}),
48
- _useState2 = (0, _slicedToArray2.default)(_useState, 2),
49
- refreshedProducts = _useState2[0],
50
- setRefreshedProducts = _useState2[1];
51
- (0, _react.useEffect)(function () {
52
- var products = Object.keys(containers);
53
- products.forEach(function (product) {
54
- var isCreated = containers[product].isCreated;
55
- if (isCreated && !refreshedProducts[product]) {
56
- setRefreshedProducts(function (prev) {
57
- return _objectSpread(_objectSpread({}, prev), {}, (0, _defineProperty2.default)({}, product, true));
58
- });
59
- refetchTeamContainers();
60
- }
61
- });
62
- }, [containers, refetchTeamContainers, refreshedProducts]);
63
- }
64
41
  var TeamContainers = exports.TeamContainers = function TeamContainers(_ref) {
65
42
  var teamId = _ref.teamId,
66
43
  onAddAContainerClick = _ref.onAddAContainerClick,
@@ -72,17 +49,21 @@ var TeamContainers = exports.TeamContainers = function TeamContainers(_ref) {
72
49
  cloudId = _ref.cloudId,
73
50
  filterContainerId = _ref.filterContainerId,
74
51
  isDisplayedOnProfileCard = _ref.isDisplayedOnProfileCard,
52
+ isReadOnly = _ref.isReadOnly,
53
+ onError = _ref.onError,
75
54
  _ref$maxNumberOfConta = _ref.maxNumberOfContainersToShow,
76
- maxNumberOfContainersToShow = _ref$maxNumberOfConta === void 0 ? MAX_NUMBER_OF_CONTAINERS_TO_SHOW : _ref$maxNumberOfConta;
55
+ maxNumberOfContainersToShow = _ref$maxNumberOfConta === void 0 ? MAX_NUMBER_OF_CONTAINERS_TO_SHOW : _ref$maxNumberOfConta,
56
+ elemBeforeCards = _ref.elemBeforeCards;
77
57
  var _useAnalyticsEvents = (0, _analyticsNext.useAnalyticsEvents)(),
78
58
  createAnalyticsEvent = _useAnalyticsEvents.createAnalyticsEvent;
79
- var _useTeamContainers2 = (0, _useTeamContainers3.useTeamContainers)(teamId),
80
- unlinkError = _useTeamContainers2.unlinkError;
59
+ var _useTeamContainers = (0, _useTeamContainers2.useTeamContainers)(teamId),
60
+ unlinkError = _useTeamContainers.unlinkError;
81
61
  var _useTeamLinksAndConta = (0, _useTeamLinksAndContainers.useTeamLinksAndContainers)(teamId, true),
82
62
  teamLinks = _useTeamLinksAndConta.teamLinks,
83
63
  removeTeamLink = _useTeamLinksAndConta.removeTeamLink,
84
64
  iconsLoading = _useTeamLinksAndConta.iconsLoading,
85
65
  iconHasLoaded = _useTeamLinksAndConta.iconHasLoaded,
66
+ hasError = _useTeamLinksAndConta.hasError,
86
67
  linksLoading = _useTeamLinksAndConta.isLoading;
87
68
  var _useRequestedContaine = (0, _useRequestedContainer.useRequestedContainers)({
88
69
  teamId: teamId,
@@ -90,38 +71,38 @@ var TeamContainers = exports.TeamContainers = function TeamContainers(_ref) {
90
71
  onRequestedContainerTimeout: onRequestedContainerTimeout
91
72
  }),
92
73
  requestedContainers = _useRequestedContaine.requestedContainers;
93
- var _useTeamContainersHoo = (0, _useTeamContainers3.useTeamContainersHook)(),
74
+ var _useTeamContainersHoo = (0, _useTeamContainers2.useTeamContainersHook)(),
94
75
  _useTeamContainersHoo2 = (0, _slicedToArray2.default)(_useTeamContainersHoo, 2),
95
76
  _ = _useTeamContainersHoo2[0],
96
77
  actions = _useTeamContainersHoo2[1];
78
+ var _useState = (0, _react.useState)(false),
79
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
80
+ showMore = _useState2[0],
81
+ setShowMore = _useState2[1];
97
82
  var _useState3 = (0, _react.useState)(false),
98
83
  _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
99
- showMore = _useState4[0],
100
- setShowMore = _useState4[1];
101
- var _useState5 = (0, _react.useState)(false),
84
+ isDisconnectDialogOpen = _useState4[0],
85
+ setIsDisconnectDialogOpen = _useState4[1];
86
+ var _useState5 = (0, _react.useState)(),
102
87
  _useState6 = (0, _slicedToArray2.default)(_useState5, 2),
103
- isDisconnectDialogOpen = _useState6[0],
104
- setIsDisconnectDialogOpen = _useState6[1];
105
- var _useState7 = (0, _react.useState)(),
88
+ selectedContainerDetails = _useState6[0],
89
+ setSelectedContainerDetails = _useState6[1];
90
+ var _useState7 = (0, _react.useState)(teamLinks),
106
91
  _useState8 = (0, _slicedToArray2.default)(_useState7, 2),
107
- selectedContainerDetails = _useState8[0],
108
- setSelectedContainerDetails = _useState8[1];
109
- var _useState9 = (0, _react.useState)(teamLinks),
110
- _useState0 = (0, _slicedToArray2.default)(_useState9, 2),
111
- filteredTeamLinks = _useState0[0],
112
- setFilteredTeamLinks = _useState0[1];
113
- var _useState1 = (0, _react.useState)({
92
+ filteredTeamLinks = _useState8[0],
93
+ setFilteredTeamLinks = _useState8[1];
94
+ var _useState9 = (0, _react.useState)({
114
95
  Jira: false,
115
96
  Confluence: false,
116
97
  Loom: false,
117
98
  WebLink: false
118
99
  }),
119
- _useState10 = (0, _slicedToArray2.default)(_useState1, 2),
120
- canAddContainer = _useState10[0],
121
- setCanAddContainer = _useState10[1];
122
- var _useCreateContainers3 = (0, _useCreateContainers5.useCreateContainers)(),
123
- _useCreateContainers4 = (0, _slicedToArray2.default)(_useCreateContainers3, 1),
124
- containers = _useCreateContainers4[0];
100
+ _useState0 = (0, _slicedToArray2.default)(_useState9, 2),
101
+ canAddContainer = _useState0[0],
102
+ setCanAddContainer = _useState0[1];
103
+ var _useCreateContainers = (0, _useCreateContainers3.useCreateContainers)(),
104
+ _useCreateContainers2 = (0, _slicedToArray2.default)(_useCreateContainers, 1),
105
+ containers = _useCreateContainers2[0];
125
106
  var _usePeopleAndTeamAnal = (0, _analytics.usePeopleAndTeamAnalytics)(),
126
107
  fireTrackEvent = _usePeopleAndTeamAnal.fireTrackEvent;
127
108
  var _useProductPermission = (0, _teamsAppInternalProductPermissions.useProductPermissions)({
@@ -146,7 +127,7 @@ var TeamContainers = exports.TeamContainers = function TeamContainers(_ref) {
146
127
  }),
147
128
  productPermissionsOld = _useProductPermission2.data,
148
129
  productPermissionIsLoadingOld = _useProductPermission2.loading;
149
- useRefreshOnContainerCreated(teamId);
130
+ (0, _useRefreshContainersOnContainerCreated.useRefreshOnContainerCreated)(teamId);
150
131
  var hasPermissionToCreateContainer = (0, _react.useMemo)(function () {
151
132
  if (!productPermissions) {
152
133
  return {};
@@ -168,7 +149,7 @@ var TeamContainers = exports.TeamContainers = function TeamContainers(_ref) {
168
149
  }, [teamLinks, isDisplayedOnProfileCard, filterContainerId, requestedContainers]);
169
150
  (0, _react.useEffect)(function () {
170
151
  var containersToCheck = filteredTeamLinks;
171
- if (containersToCheck.length > maxNumberOfContainersToShow || isDisplayedOnProfileCard) {
152
+ if (containersToCheck.length > maxNumberOfContainersToShow || isDisplayedOnProfileCard || isReadOnly) {
172
153
  setCanAddContainer({
173
154
  Jira: false,
174
155
  Confluence: false,
@@ -200,7 +181,16 @@ var TeamContainers = exports.TeamContainers = function TeamContainers(_ref) {
200
181
  WebLink: !containerExists('WebLink')
201
182
  });
202
183
  }
203
- }, [isDisplayedOnProfileCard, productPermissions, productPermissionsOld, filteredTeamLinks, maxNumberOfContainersToShow, requestedContainers]);
184
+ }, [isDisplayedOnProfileCard, productPermissions, productPermissionsOld, filteredTeamLinks, maxNumberOfContainersToShow, requestedContainers, isReadOnly]);
185
+ (0, _react.useEffect)(function () {
186
+ if (onError) {
187
+ if (hasError) {
188
+ onError(hasError);
189
+ } else if (unlinkError) {
190
+ onError(unlinkError);
191
+ }
192
+ }
193
+ }, [hasError, unlinkError, onError]);
204
194
  var handleShowMore = function handleShowMore() {
205
195
  setShowMore(!showMore);
206
196
  };
@@ -311,63 +301,78 @@ var TeamContainers = exports.TeamContainers = function TeamContainers(_ref) {
311
301
  numberOfContainers: maxNumberOfContainersToShow
312
302
  });
313
303
  }
314
- if (hasNoContainers && !isDisplayedOnProfileCard && hasNoPermissions) {
315
- return /*#__PURE__*/_react.default.createElement(_noProductAccessEmptyState.NoProductAccessState, null);
304
+ if (hasNoContainers) {
305
+ if (components !== null && components !== void 0 && components.TeamContainersEmptyState) {
306
+ var EmptyStateComponent = components.TeamContainersEmptyState;
307
+ return /*#__PURE__*/_react.default.createElement(EmptyStateComponent, {
308
+ hasNoPermissions: !!hasNoPermissions
309
+ });
310
+ } else if (!isDisplayedOnProfileCard && hasNoPermissions) {
311
+ return /*#__PURE__*/_react.default.createElement(_noProductAccessEmptyState.NoProductAccessState, null);
312
+ }
316
313
  }
317
314
  return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_primitives.Stack, {
318
315
  space: "space.200"
319
- }, /*#__PURE__*/_react.default.createElement(_primitives.Grid, {
320
- templateColumns: "repeat(auto-fill, minmax(300px, 1fr))",
321
- gap: isDisplayedOnProfileCard ? 'space.0' : 'space.100'
322
- }, filteredTeamLinks.slice(0, maxNumberOfContainersToShow).map(function (container) {
323
- return /*#__PURE__*/_react.default.createElement(LinkedContainerCardComponent, {
324
- key: container.id,
325
- containerType: container.type,
326
- containerTypeProperties: container.containerTypeProperties,
327
- title: container.name,
328
- containerIcon: container.icon || undefined,
329
- link: container.link || undefined,
330
- containerId: container.id,
331
- iconsLoading: iconsLoading,
332
- iconHasLoaded: iconHasLoaded,
333
- onDisconnectButtonClick: function onDisconnectButtonClick() {
334
- return handleOpenDisconnectDialog({
335
- containerId: container.id,
336
- containerType: container.type,
337
- containerName: container.name
338
- });
339
- },
340
- onEditLinkClick: function onEditLinkClick() {
341
- return handleEditContainerClick(container);
342
- }
343
- });
344
- }), (0, _addContainerCard.getAddContainerCards)({
345
- containers: availableContainers,
346
- onAddAContainerClick: onAddAContainerClick,
347
- showNewDesign: createContainerExperimentEnabled
348
- }), showMore && filteredTeamLinks.slice(maxNumberOfContainersToShow).map(function (container) {
349
- return /*#__PURE__*/_react.default.createElement(LinkedContainerCardComponent, {
350
- key: container.id,
351
- containerType: container.type,
352
- containerTypeProperties: container.containerTypeProperties,
353
- title: container.name,
354
- containerId: container.id,
355
- containerIcon: container.icon || undefined,
356
- link: container.link || undefined,
357
- iconsLoading: iconsLoading,
358
- iconHasLoaded: iconHasLoaded,
359
- onDisconnectButtonClick: function onDisconnectButtonClick() {
360
- return handleOpenDisconnectDialog({
361
- containerId: container.id,
362
- containerType: container.type,
363
- containerName: container.name
364
- });
365
- },
366
- onEditLinkClick: function onEditLinkClick() {
367
- return handleEditContainerClick(container);
368
- }
369
- });
370
- })), filteredTeamLinks.length > maxNumberOfContainersToShow && /*#__PURE__*/_react.default.createElement(_primitives.Inline, null, /*#__PURE__*/_react.default.createElement(_new.default, {
316
+ }, function () {
317
+ var GridComponent = (components === null || components === void 0 ? void 0 : components.Grid) || _primitives.Grid;
318
+ return /*#__PURE__*/_react.default.createElement(GridComponent, {
319
+ templateColumns: "repeat(auto-fill, minmax(300px, 1fr))",
320
+ gap: isDisplayedOnProfileCard ? 'space.0' : 'space.100'
321
+ }, elemBeforeCards && function () {
322
+ var ElemBeforeCards = elemBeforeCards;
323
+ return /*#__PURE__*/_react.default.createElement(ElemBeforeCards, null);
324
+ }(), filteredTeamLinks.slice(0, maxNumberOfContainersToShow).map(function (container) {
325
+ return /*#__PURE__*/_react.default.createElement(LinkedContainerCardComponent, {
326
+ key: container.id,
327
+ containerType: container.type,
328
+ containerTypeProperties: container.containerTypeProperties,
329
+ title: container.name,
330
+ containerIcon: container.icon || undefined,
331
+ link: container.link || undefined,
332
+ containerId: container.id,
333
+ iconsLoading: iconsLoading,
334
+ iconHasLoaded: iconHasLoaded,
335
+ isReadOnly: isReadOnly,
336
+ onDisconnectButtonClick: function onDisconnectButtonClick() {
337
+ return handleOpenDisconnectDialog({
338
+ containerId: container.id,
339
+ containerType: container.type,
340
+ containerName: container.name
341
+ });
342
+ },
343
+ onEditLinkClick: function onEditLinkClick() {
344
+ return handleEditContainerClick(container);
345
+ }
346
+ });
347
+ }), (0, _addContainerCard.getAddContainerCards)({
348
+ containers: availableContainers,
349
+ onAddAContainerClick: onAddAContainerClick,
350
+ showNewDesign: createContainerExperimentEnabled
351
+ }), showMore && filteredTeamLinks.slice(maxNumberOfContainersToShow).map(function (container) {
352
+ return /*#__PURE__*/_react.default.createElement(LinkedContainerCardComponent, {
353
+ key: container.id,
354
+ containerType: container.type,
355
+ containerTypeProperties: container.containerTypeProperties,
356
+ title: container.name,
357
+ containerId: container.id,
358
+ containerIcon: container.icon || undefined,
359
+ link: container.link || undefined,
360
+ iconsLoading: iconsLoading,
361
+ iconHasLoaded: iconHasLoaded,
362
+ isReadOnly: isReadOnly,
363
+ onDisconnectButtonClick: function onDisconnectButtonClick() {
364
+ return handleOpenDisconnectDialog({
365
+ containerId: container.id,
366
+ containerType: container.type,
367
+ containerName: container.name
368
+ });
369
+ },
370
+ onEditLinkClick: function onEditLinkClick() {
371
+ return handleEditContainerClick(container);
372
+ }
373
+ });
374
+ }));
375
+ }(), filteredTeamLinks.length > maxNumberOfContainersToShow && /*#__PURE__*/_react.default.createElement(_primitives.Inline, null, /*#__PURE__*/_react.default.createElement(_new.default, {
371
376
  appearance: "subtle",
372
377
  onClick: handleShowMore
373
378
  }, showMore ? /*#__PURE__*/_react.default.createElement(_reactIntlNext.FormattedMessage, messages.showLess) : /*#__PURE__*/_react.default.createElement(_reactIntlNext.FormattedMessage, messages.showMore)))), /*#__PURE__*/_react.default.createElement(_modalTransition.default, null, isDisconnectDialogOpen && selectedContainerDetails && /*#__PURE__*/_react.default.createElement(_async.DisconnectDialogLazy, {
@@ -53,7 +53,8 @@ var TeamLinkCard = exports.TeamLinkCard = function TeamLinkCard(_ref) {
53
53
  _onEditLinkClick = _ref.onEditLinkClick,
54
54
  iconsLoading = _ref.iconsLoading,
55
55
  iconHasLoaded = _ref.iconHasLoaded,
56
- openInNewTab = _ref.openInNewTab;
56
+ openInNewTab = _ref.openInNewTab,
57
+ isReadOnly = _ref.isReadOnly;
57
58
  var _useAnalyticsEvents = (0, _analyticsNext.useAnalyticsEvents)(),
58
59
  createAnalyticsEvent = _useAnalyticsEvents.createAnalyticsEvent;
59
60
  var _getContainerProperti = (0, _getContainerProperties.getContainerProperties)({
@@ -186,7 +187,7 @@ var TeamLinkCard = exports.TeamLinkCard = function TeamLinkCard(_ref) {
186
187
  }, description), /*#__PURE__*/_react.default.createElement(_compiled.Text, {
187
188
  size: "small",
188
189
  color: "color.text.subtle"
189
- }, containerTypeText))))), /*#__PURE__*/_react.default.createElement(_teamLinkCardActions.TeamLinkCardActions, {
190
+ }, containerTypeText))))), !isReadOnly && /*#__PURE__*/_react.default.createElement(_teamLinkCardActions.TeamLinkCardActions, {
190
191
  containerType: containerType,
191
192
  title: title,
192
193
  containerId: containerId,
@@ -26,13 +26,11 @@ const actions = {
26
26
  if (current.isCreated === isCreated) {
27
27
  return;
28
28
  }
29
- const isLoading = isCreated ? false : current.isLoading;
30
29
  setState({
31
30
  ...containers,
32
31
  [product]: {
33
32
  ...current,
34
- isCreated,
35
- isLoading
33
+ isCreated
36
34
  }
37
35
  });
38
36
  }
@@ -0,0 +1,135 @@
1
+ import { useEffect, useRef, useState } from 'react';
2
+ import { useCreateContainers } from '../use-create-containers';
3
+ import { useTeamContainers } from '../use-team-containers';
4
+ const PRODUCT_TO_CONTAINER_TYPE = {
5
+ Jira: 'JiraProject',
6
+ Confluence: 'ConfluenceSpace',
7
+ Loom: 'LoomSpace'
8
+ };
9
+ const INTERVAL_TIME = 2000;
10
+ const TIMEOUT_DURATION = 30000;
11
+ function useRefreshOnContainerCreated(teamId) {
12
+ const [containers, {
13
+ updateContainerLoading
14
+ }] = useCreateContainers();
15
+ const {
16
+ refetchTeamContainers,
17
+ teamContainers
18
+ } = useTeamContainers(teamId);
19
+ const [createdContainers, setCreatedContainers] = useState({});
20
+ const intervalRef = useRef(null);
21
+ useEffect(() => {
22
+ setCreatedContainers({});
23
+ if (intervalRef.current) {
24
+ clearInterval(intervalRef.current);
25
+ intervalRef.current = null;
26
+ }
27
+ }, [teamId]);
28
+ useEffect(() => {
29
+ const products = Object.keys(containers);
30
+ products.forEach(product => {
31
+ const {
32
+ isCreated
33
+ } = containers[product];
34
+ if (!isCreated) {
35
+ return;
36
+ }
37
+ const existing = createdContainers[product];
38
+ if (existing && existing.found === false) {
39
+ return;
40
+ }
41
+ if (existing && existing.found) {
42
+ return;
43
+ }
44
+ const containerType = PRODUCT_TO_CONTAINER_TYPE[product];
45
+ if (!containerType) {
46
+ return;
47
+ }
48
+ const currentCount = teamContainers.filter(c => c.type === containerType).length;
49
+ if (currentCount > 0) {
50
+ setCreatedContainers(prev => ({
51
+ ...prev,
52
+ [product]: {
53
+ startedAt: Date.now(),
54
+ found: true
55
+ }
56
+ }));
57
+ updateContainerLoading(product, false);
58
+ return;
59
+ }
60
+ setCreatedContainers(prev => ({
61
+ ...prev,
62
+ [product]: {
63
+ startedAt: Date.now(),
64
+ found: false
65
+ }
66
+ }));
67
+ });
68
+ }, [containers, createdContainers, teamContainers, updateContainerLoading]);
69
+ useEffect(() => {
70
+ if (Object.keys(createdContainers).length === 0) {
71
+ if (intervalRef.current) {
72
+ clearInterval(intervalRef.current);
73
+ intervalRef.current = null;
74
+ }
75
+ return;
76
+ }
77
+ if (intervalRef.current) {
78
+ return;
79
+ }
80
+ intervalRef.current = setInterval(() => {
81
+ setCreatedContainers(prev => {
82
+ let anyPending = false;
83
+ const next = {
84
+ ...prev
85
+ };
86
+ Object.keys(prev).forEach(product => {
87
+ const target = prev[product];
88
+ if (!target || target.found) {
89
+ return;
90
+ }
91
+ const {
92
+ startedAt
93
+ } = target;
94
+ const containerType = PRODUCT_TO_CONTAINER_TYPE[product];
95
+ if (!containerType) {
96
+ next[product] = {
97
+ ...target,
98
+ found: true
99
+ };
100
+ updateContainerLoading(product, false);
101
+ return;
102
+ }
103
+ const currentCount = teamContainers.filter(container => container.type === containerType).length;
104
+ const elapsed = Date.now() - startedAt;
105
+ if (currentCount > 0 || elapsed >= TIMEOUT_DURATION) {
106
+ next[product] = {
107
+ ...target,
108
+ found: true
109
+ };
110
+ updateContainerLoading(product, false);
111
+ } else {
112
+ anyPending = true;
113
+ }
114
+ });
115
+ if (!anyPending) {
116
+ if (intervalRef.current) {
117
+ clearInterval(intervalRef.current);
118
+ intervalRef.current = null;
119
+ }
120
+ }
121
+ if (anyPending) {
122
+ refetchTeamContainers();
123
+ }
124
+ return next;
125
+ });
126
+ }, INTERVAL_TIME);
127
+ return () => {
128
+ if (intervalRef.current) {
129
+ clearInterval(intervalRef.current);
130
+ intervalRef.current = null;
131
+ }
132
+ };
133
+ }, [createdContainers, teamContainers, refetchTeamContainers, updateContainerLoading]);
134
+ }
135
+ export { useRefreshOnContainerCreated, INTERVAL_TIME, TIMEOUT_DURATION };