@atlaskit/link-create 0.3.0 → 0.3.1

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 (43) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/analytics.spec.yaml +85 -0
  3. package/dist/cjs/common/constants.js +10 -0
  4. package/dist/cjs/common/utils/analytics/analytics.codegen.js +27 -0
  5. package/dist/cjs/common/utils/analytics/context.js +103 -0
  6. package/dist/cjs/common/utils/analytics/index.js +18 -0
  7. package/dist/cjs/controllers/callback-context/main.js +17 -3
  8. package/dist/cjs/ui/create-form/main.js +18 -8
  9. package/dist/cjs/ui/error-boundary/index.js +22 -2
  10. package/dist/cjs/ui/main.js +51 -15
  11. package/dist/cjs/version.json +1 -1
  12. package/dist/es2019/common/constants.js +2 -0
  13. package/dist/es2019/common/utils/analytics/analytics.codegen.js +20 -0
  14. package/dist/es2019/common/utils/analytics/context.js +86 -0
  15. package/dist/es2019/common/utils/analytics/index.js +1 -0
  16. package/dist/es2019/controllers/callback-context/main.js +18 -2
  17. package/dist/es2019/ui/create-form/main.js +15 -4
  18. package/dist/es2019/ui/error-boundary/index.js +20 -2
  19. package/dist/es2019/ui/main.js +53 -16
  20. package/dist/es2019/version.json +1 -1
  21. package/dist/esm/common/constants.js +2 -0
  22. package/dist/esm/common/utils/analytics/analytics.codegen.js +20 -0
  23. package/dist/esm/common/utils/analytics/context.js +91 -0
  24. package/dist/esm/common/utils/analytics/index.js +1 -0
  25. package/dist/esm/controllers/callback-context/main.js +16 -3
  26. package/dist/esm/ui/create-form/main.js +18 -8
  27. package/dist/esm/ui/error-boundary/index.js +19 -2
  28. package/dist/esm/ui/main.js +49 -15
  29. package/dist/esm/version.json +1 -1
  30. package/dist/types/common/constants.d.ts +2 -0
  31. package/dist/types/common/types.d.ts +80 -0
  32. package/dist/types/common/utils/analytics/analytics.codegen.d.ts +48 -0
  33. package/dist/types/common/utils/analytics/context.d.ts +29 -0
  34. package/dist/types/common/utils/analytics/index.d.ts +1 -0
  35. package/dist/types/controllers/callback-context/main.d.ts +5 -1
  36. package/dist/types/index.d.ts +2 -2
  37. package/dist/types/ui/error-boundary/index.d.ts +2 -6
  38. package/dist/types/ui/group-selection/types.d.ts +1 -14
  39. package/dist/types/ui/main.d.ts +5 -3
  40. package/dist/types/ui/types.d.ts +0 -61
  41. package/package.json +7 -2
  42. package/report.api.md +12 -7
  43. package/tmp/api-report-tmp.d.ts +10 -5
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @atlaskit/link-create
2
2
 
3
+ ## 0.3.1
4
+
5
+ ### Patch Changes
6
+
7
+ - [`9e1c1e92771`](https://bitbucket.org/atlassian/atlassian-frontend/commits/9e1c1e92771) - Fire analytics
8
+
3
9
  ## 0.3.0
4
10
 
5
11
  ### Minor Changes
@@ -0,0 +1,85 @@
1
+ common:
2
+ source: linkCreate
3
+ product: linkingPlatform
4
+
5
+ context:
6
+ PackageMetaData: &PackageMetaDataContext
7
+ packageName:
8
+ type: ['@atlaskit/link-create']
9
+ description: name of the package the event was fired from
10
+ packageVersion:
11
+ type: string
12
+ description: version of the package the event was fired from
13
+ source:
14
+ type: ['linkCreate']
15
+ description: the name of the ui source the event originated from (linkCreate)
16
+ componentName:
17
+ type: ['linkCreate']
18
+ description: the name of the component the event originated from (linkCreate)
19
+ LinkCreateAnalyticsContext: &LinkCreateAnalyticContext
20
+ triggeredFrom:
21
+ type: string
22
+ description: where the link create form was triggered from
23
+ objectName:
24
+ type: string
25
+ description: the object that the creation form is for
26
+ appearance:
27
+ type: ['modal', 'popup']
28
+ description: how the link create form was presented
29
+
30
+ events:
31
+ - linkCreateScreen viewed:
32
+ type: screen
33
+ description: fired when the link create is successfully submitted
34
+ attributes:
35
+ <<: *PackageMetaDataContext
36
+ <<: *LinkCreateAnalyticContext
37
+
38
+ - button clicked (create):
39
+ type: ui
40
+ description: fired when the create button is clicked
41
+ attributes:
42
+ <<: *PackageMetaDataContext
43
+ <<: *LinkCreateAnalyticContext
44
+
45
+ - button clicked (cancel):
46
+ type: ui
47
+ description: fired when the create button is clicked
48
+ attributes:
49
+ <<: *PackageMetaDataContext
50
+ <<: *LinkCreateAnalyticContext
51
+
52
+ - linkCreateScreen closed:
53
+ type: screen
54
+ description: fired when the link create component is unmounted/dismissed for any reason
55
+ attributes:
56
+ <<: *PackageMetaDataContext
57
+ <<: *LinkCreateAnalyticContext
58
+
59
+ - linkCreate unhandledErrorCaught:
60
+ type: operational
61
+ description: fired when the link create root error boundary catches an error
62
+ attributes:
63
+ <<: *PackageMetaDataContext
64
+ browserInfo:
65
+ type: string
66
+ description: the window navigator userAgent if it exists, else unknown
67
+ error:
68
+ type: string
69
+ description: the error that was caught by the error boundary
70
+ componentStack:
71
+ type: string
72
+ description: componentStack from componentDidCatch info
73
+ required: false
74
+
75
+ - object created (linkCreate):
76
+ type: track
77
+ description: fired when the object was successfully created
78
+ attributes:
79
+ <<: *PackageMetaDataContext
80
+ objectId:
81
+ type: string
82
+ description: the id of created content
83
+ objectType:
84
+ type: string
85
+ description: the type of created content
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.COMPONENT_NAME = exports.ANALYTICS_CHANNEL = void 0;
7
+ var ANALYTICS_CHANNEL = 'media';
8
+ exports.ANALYTICS_CHANNEL = ANALYTICS_CHANNEL;
9
+ var COMPONENT_NAME = 'linkCreate';
10
+ exports.COMPONENT_NAME = COMPONENT_NAME;
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ /**
8
+ * THIS FILE WAS CREATED VIA CODEGEN DO NOT MODIFY {@see http://go/af-codegen}
9
+ *
10
+ * Generates Typescript types for analytics events from analytics.spec.yaml
11
+ *
12
+ * @codegen <<SignedSource::6d7803f5c035dc3cde1be03caa91eb04>>
13
+ * @codegenCommand yarn workspace @atlaskit/link-create run codegen-analytics
14
+ */
15
+
16
+ function createEventPayload(eventKey, attributes) {
17
+ var event = eventKey.split('.');
18
+ return {
19
+ eventType: event[0],
20
+ actionSubject: event[1],
21
+ action: event[2],
22
+ actionSubjectId: event[3],
23
+ attributes: attributes
24
+ };
25
+ }
26
+ var _default = createEventPayload;
27
+ exports.default = _default;
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.useLinkCreateAnalytics = void 0;
9
+ exports.withLinkCreateAnalyticsContext = withLinkCreateAnalyticsContext;
10
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
11
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
12
+ var _react = _interopRequireWildcard(require("react"));
13
+ var _analyticsNext = require("@atlaskit/analytics-next");
14
+ var _constants = require("../../constants");
15
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
16
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
17
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
18
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
19
+ var UNKNOWN = 'unknown';
20
+ var DEFAULT_CONTEXT_ATTRIBUTES = {
21
+ triggeredFrom: UNKNOWN,
22
+ objectName: UNKNOWN,
23
+ appearance: 'modal'
24
+ };
25
+ var LinkCreateAnalyticsContext = /*#__PURE__*/_react.default.createContext({
26
+ trackAttribute: function trackAttribute() {},
27
+ trackAttributes: function trackAttributes() {},
28
+ getAttributes: function getAttributes() {
29
+ return DEFAULT_CONTEXT_ATTRIBUTES;
30
+ }
31
+ });
32
+ var LinkCreateAnalytics = function LinkCreateAnalytics(_ref) {
33
+ var initialContext = _ref.initialContext,
34
+ children = _ref.children;
35
+ var dataRef = (0, _react.useRef)(_objectSpread(_objectSpread({}, DEFAULT_CONTEXT_ATTRIBUTES), initialContext));
36
+ var methods = (0, _react.useMemo)(function () {
37
+ return {
38
+ trackAttribute: function trackAttribute(key, value) {
39
+ dataRef.current[key] = value;
40
+ },
41
+ trackAttributes: function trackAttributes(attributes) {
42
+ dataRef.current = _objectSpread(_objectSpread({}, dataRef.current), attributes);
43
+ },
44
+ getAttributes: function getAttributes() {
45
+ return dataRef.current;
46
+ }
47
+ };
48
+ }, []);
49
+ return /*#__PURE__*/_react.default.createElement(LinkCreateAnalyticsContext.Provider, {
50
+ value: methods
51
+ }, children);
52
+ };
53
+ var contextAttributesFromInitialProps = function contextAttributesFromInitialProps(props) {
54
+ return {
55
+ objectName: props.entityKey,
56
+ triggeredFrom: props.triggeredFrom
57
+ };
58
+ };
59
+
60
+ /**
61
+ * Hook that exposes the context-level attribute getters and setters.
62
+ */
63
+ var useLinkCreateAnalytics = function useLinkCreateAnalytics() {
64
+ return (0, _react.useContext)(LinkCreateAnalyticsContext);
65
+ };
66
+
67
+ /**
68
+ * Wrap component in "attributes" context store and initialise the initial context attributes from props.
69
+ */
70
+ exports.useLinkCreateAnalytics = useLinkCreateAnalytics;
71
+ function withLinkCreateAnalytics(WrappedComponent) {
72
+ return function (props) {
73
+ var _useState = (0, _react.useState)(function () {
74
+ return contextAttributesFromInitialProps(props);
75
+ }),
76
+ _useState2 = (0, _slicedToArray2.default)(_useState, 1),
77
+ initialContext = _useState2[0];
78
+ return /*#__PURE__*/_react.default.createElement(LinkCreateAnalytics, {
79
+ initialContext: initialContext
80
+ }, /*#__PURE__*/_react.default.createElement(WrappedComponent, props));
81
+ };
82
+ }
83
+
84
+ /**
85
+ * Wraps a component with the analytics context + listener to update events with contextual-level attributes.
86
+ * Should be implemented once at the root of the link create.
87
+ */
88
+ function withLinkCreateAnalyticsContext(WrappedComponent) {
89
+ return withLinkCreateAnalytics(function (props) {
90
+ var _useLinkCreateAnalyti = useLinkCreateAnalytics(),
91
+ getAttributes = _useLinkCreateAnalyti.getAttributes;
92
+ var onEvent = (0, _react.useCallback)(function (event) {
93
+ var _event$payload$attrib;
94
+ event.update({
95
+ attributes: _objectSpread(_objectSpread({}, getAttributes()), (_event$payload$attrib = event.payload.attributes) !== null && _event$payload$attrib !== void 0 ? _event$payload$attrib : {})
96
+ });
97
+ }, [getAttributes]);
98
+ return /*#__PURE__*/_react.default.createElement(_analyticsNext.AnalyticsListener, {
99
+ channel: _constants.ANALYTICS_CHANNEL,
100
+ onEvent: onEvent
101
+ }, /*#__PURE__*/_react.default.createElement(WrappedComponent, props));
102
+ });
103
+ }
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "useLinkCreateAnalytics", {
7
+ enumerable: true,
8
+ get: function get() {
9
+ return _context.useLinkCreateAnalytics;
10
+ }
11
+ });
12
+ Object.defineProperty(exports, "withLinkCreateAnalyticsContext", {
13
+ enumerable: true,
14
+ get: function get() {
15
+ return _context.withLinkCreateAnalyticsContext;
16
+ }
17
+ });
18
+ var _context = require("./context");
@@ -1,26 +1,40 @@
1
1
  "use strict";
2
2
 
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
3
4
  var _typeof = require("@babel/runtime/helpers/typeof");
4
5
  Object.defineProperty(exports, "__esModule", {
5
6
  value: true
6
7
  });
7
8
  exports.useLinkCreateCallback = exports.LinkCreateCallbackProvider = void 0;
8
9
  var _react = _interopRequireWildcard(require("react"));
10
+ var _analyticsNext = require("@atlaskit/analytics-next");
11
+ var _constants = require("../../common/constants");
12
+ var _analytics = _interopRequireDefault(require("../../common/utils/analytics/analytics.codegen"));
9
13
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
10
14
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
11
15
  var LinkCreateCallbackContext = /*#__PURE__*/_react.default.createContext({});
12
16
  var LinkCreateCallbackProvider = function LinkCreateCallbackProvider(_ref) {
13
17
  var children = _ref.children,
14
- onCreate = _ref.onCreate,
18
+ _onCreate = _ref.onCreate,
15
19
  onFailure = _ref.onFailure,
16
20
  onCancel = _ref.onCancel;
21
+ var _useAnalyticsEvents = (0, _analyticsNext.useAnalyticsEvents)(),
22
+ createAnalyticsEvent = _useAnalyticsEvents.createAnalyticsEvent;
17
23
  var value = (0, _react.useMemo)(function () {
18
24
  return {
19
- onCreate: onCreate,
25
+ onCreate: function onCreate(result) {
26
+ var objectId = result.objectId,
27
+ objectType = result.objectType;
28
+ createAnalyticsEvent((0, _analytics.default)('track.object.created.linkCreate', {
29
+ objectId: objectId,
30
+ objectType: objectType
31
+ })).fire(_constants.ANALYTICS_CHANNEL);
32
+ _onCreate && _onCreate(result);
33
+ },
20
34
  onFailure: onFailure,
21
35
  onCancel: onCancel
22
36
  };
23
- }, [onCreate, onFailure, onCancel]);
37
+ }, [onFailure, onCancel, createAnalyticsEvent, _onCreate]);
24
38
  return /*#__PURE__*/_react.default.createElement(LinkCreateCallbackContext.Provider, {
25
39
  value: value
26
40
  }, children);
@@ -8,11 +8,14 @@ Object.defineProperty(exports, "__esModule", {
8
8
  exports.CreateForm = void 0;
9
9
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
10
10
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
11
- var _react = _interopRequireDefault(require("react"));
11
+ var _react = _interopRequireWildcard(require("react"));
12
12
  var _react2 = require("@emotion/react");
13
+ var _analyticsNext = require("@atlaskit/analytics-next");
13
14
  var _loadingButton = _interopRequireDefault(require("@atlaskit/button/loading-button"));
14
15
  var _standardButton = _interopRequireDefault(require("@atlaskit/button/standard-button"));
15
16
  var _form = _interopRequireWildcard(require("@atlaskit/form"));
17
+ var _constants = require("../../common/constants");
18
+ var _analytics = _interopRequireDefault(require("../../common/utils/analytics/analytics.codegen"));
16
19
  var _formContext = require("../../controllers/form-context");
17
20
  var _styled = require("./styled");
18
21
  var _utils = require("./utils");
@@ -29,38 +32,45 @@ var CreateFormWithoutContext = function CreateFormWithoutContext(_ref) {
29
32
  testId = _ref.testId,
30
33
  onCancel = _ref.onCancel,
31
34
  onSubmit = _ref.onSubmit;
35
+ var _useAnalyticsEvents = (0, _analyticsNext.useAnalyticsEvents)(),
36
+ createAnalyticsEvent = _useAnalyticsEvents.createAnalyticsEvent;
32
37
  var _useFormContext = (0, _formContext.useFormContext)(),
33
38
  getValidators = _useFormContext.getValidators;
34
- var handleSubmit = /*#__PURE__*/function () {
39
+ var handleSubmit = (0, _react.useCallback)( /*#__PURE__*/function () {
35
40
  var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(data) {
36
41
  var validators, errors;
37
42
  return _regeneratorRuntime().wrap(function _callee$(_context) {
38
43
  while (1) {
39
44
  switch (_context.prev = _context.next) {
40
45
  case 0:
46
+ createAnalyticsEvent((0, _analytics.default)('ui.button.clicked.create', {})).fire(_constants.ANALYTICS_CHANNEL);
41
47
  validators = getValidators();
42
48
  errors = (0, _utils.validateFormData)({
43
49
  data: data,
44
50
  validators: validators
45
51
  });
46
52
  if (!(Object.keys(errors).length !== 0)) {
47
- _context.next = 4;
53
+ _context.next = 5;
48
54
  break;
49
55
  }
50
56
  return _context.abrupt("return", errors);
51
- case 4:
52
- onSubmit(data);
53
57
  case 5:
58
+ onSubmit(data);
59
+ case 6:
54
60
  case "end":
55
61
  return _context.stop();
56
62
  }
57
63
  }
58
64
  }, _callee);
59
65
  }));
60
- return function handleSubmit(_x) {
66
+ return function (_x) {
61
67
  return _ref2.apply(this, arguments);
62
68
  };
63
- }();
69
+ }(), [createAnalyticsEvent, getValidators, onSubmit]);
70
+ var handleCancel = (0, _react.useCallback)(function () {
71
+ createAnalyticsEvent((0, _analytics.default)('ui.button.clicked.cancel', {})).fire(_constants.ANALYTICS_CHANNEL);
72
+ onCancel && onCancel();
73
+ }, [createAnalyticsEvent, onCancel]);
64
74
  return (0, _react2.jsx)(_form.default, {
65
75
  onSubmit: handleSubmit
66
76
  }, function (_ref3) {
@@ -74,7 +84,7 @@ var CreateFormWithoutContext = function CreateFormWithoutContext(_ref) {
74
84
  css: _styled.formStyles
75
85
  }), (0, _react2.jsx)(_form.FormSection, null, children), (0, _react2.jsx)(_form.FormFooter, null, (0, _react2.jsx)(_standardButton.default, {
76
86
  appearance: "subtle",
77
- onClick: onCancel,
87
+ onClick: handleCancel,
78
88
  testId: 'cancel-button'
79
89
  }, "Cancel"), (0, _react2.jsx)(_loadingButton.default, {
80
90
  appearance: "primary",
@@ -1,17 +1,37 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
4
5
  Object.defineProperty(exports, "__esModule", {
5
6
  value: true
6
7
  });
7
8
  exports.ErrorBoundary = void 0;
8
- var _react = _interopRequireDefault(require("react"));
9
+ var _react = _interopRequireWildcard(require("react"));
10
+ var _analyticsNext = require("@atlaskit/analytics-next");
11
+ var _constants = require("../../common/constants");
12
+ var _analytics = _interopRequireDefault(require("../../common/utils/analytics/analytics.codegen"));
9
13
  var _errorBoundaryBase = require("./error-boundary-base");
10
14
  var _errorBoundaryUi = require("./error-boundary-ui");
15
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
16
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
11
17
  var ErrorBoundary = function ErrorBoundary(_ref) {
12
18
  var children = _ref.children;
13
- // TODO: onError => Analytics
19
+ var _useAnalyticsEvents = (0, _analyticsNext.useAnalyticsEvents)(),
20
+ createAnalyticsEvent = _useAnalyticsEvents.createAnalyticsEvent;
21
+ var handleError = (0, _react.useCallback)(function (error, info) {
22
+ var _window, _window$navigator, _info$componentStack;
23
+ // Fire Analytics event
24
+ createAnalyticsEvent((0, _analytics.default)('operational.linkCreate.unhandledErrorCaught', {
25
+ browserInfo: ((_window = window) === null || _window === void 0 ? void 0 : (_window$navigator = _window.navigator) === null || _window$navigator === void 0 ? void 0 : _window$navigator.userAgent) || 'unknown',
26
+ error: error.toString(),
27
+ componentStack: (_info$componentStack = info === null || info === void 0 ? void 0 : info.componentStack) !== null && _info$componentStack !== void 0 ? _info$componentStack : ''
28
+ })).fire(_constants.ANALYTICS_CHANNEL);
29
+
30
+ // Fire UFO failed experience
31
+ // failUfoExperience(ufoExperience.mounted);
32
+ }, [createAnalyticsEvent]);
14
33
  return /*#__PURE__*/_react.default.createElement(_errorBoundaryBase.BaseErrorBoundary, {
34
+ onError: handleError,
15
35
  ErrorComponent: _errorBoundaryUi.ErrorBoundaryUI
16
36
  }, children);
17
37
  };
@@ -1,46 +1,82 @@
1
1
  "use strict";
2
2
 
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
3
4
  var _typeof = require("@babel/runtime/helpers/typeof");
4
5
  Object.defineProperty(exports, "__esModule", {
5
6
  value: true
6
7
  });
7
- exports.default = void 0;
8
+ exports.default = exports.PACKAGE_DATA = void 0;
9
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
8
10
  var _react = require("react");
9
11
  var _react2 = require("@emotion/react");
12
+ var _analyticsNext = require("@atlaskit/analytics-next");
10
13
  var _modalDialog = _interopRequireWildcard(require("@atlaskit/modal-dialog"));
14
+ var _constants = require("../common/constants");
15
+ var _analytics = require("../common/utils/analytics");
16
+ var _analytics2 = _interopRequireDefault(require("../common/utils/analytics/analytics.codegen"));
11
17
  var _callbackContext = require("../controllers/callback-context");
18
+ var _version = require("../version.json");
12
19
  var _errorBoundary = require("./error-boundary");
13
20
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
14
21
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
15
22
  /** @jsx jsx */
16
23
 
17
- function ComposedLinkCreate(_ref) {
24
+ var LinkCreate = function LinkCreate(_ref) {
18
25
  var plugins = _ref.plugins,
19
- testId = _ref.testId,
20
- groupKey = _ref.groupKey,
21
26
  entityKey = _ref.entityKey,
22
27
  onCreate = _ref.onCreate,
23
28
  onFailure = _ref.onFailure,
24
- onCancel = _ref.onCancel,
25
- active = _ref.active;
29
+ onCancel = _ref.onCancel;
26
30
  var chosenOne = plugins.find(function (plugin) {
27
31
  return plugin.key === entityKey;
28
32
  });
29
33
  if (!chosenOne) {
30
34
  throw new Error('Make sure you specified a valid entityKey');
31
35
  }
36
+ var handleCreate = (0, _react.useCallback)(function (result) {
37
+ onCreate && onCreate(result.url);
38
+ }, [onCreate]);
32
39
  return (0, _react2.jsx)(_callbackContext.LinkCreateCallbackProvider, {
33
- onCreate: onCreate,
40
+ onCreate: handleCreate,
34
41
  onFailure: onFailure,
35
42
  onCancel: onCancel
36
43
  }, chosenOne.form);
37
- }
38
- var LinkCreate = /*#__PURE__*/(0, _react.memo)(function (props) {
39
- return (0, _react2.jsx)(_modalDialog.ModalTransition, null, !!props.active && (0, _react2.jsx)(_modalDialog.default, {
40
- onClose: props.onCancel,
41
- testId: props.testId,
42
- shouldScrollInViewport: true
43
- }, (0, _react2.jsx)(_modalDialog.ModalHeader, null, (0, _react2.jsx)(_modalDialog.ModalTitle, null, "Create New")), (0, _react2.jsx)(_modalDialog.ModalBody, null, (0, _react2.jsx)(_errorBoundary.ErrorBoundary, null, (0, _react2.jsx)(ComposedLinkCreate, props)))));
44
+ };
45
+ var LinkCreateWithModal = function LinkCreateWithModal(props) {
46
+ var testId = props.testId,
47
+ onCancel = props.onCancel,
48
+ active = props.active;
49
+ var _useAnalyticsEvents = (0, _analyticsNext.useAnalyticsEvents)(),
50
+ createAnalyticsEvent = _useAnalyticsEvents.createAnalyticsEvent;
51
+ var handleOpenComplete = (0, _react.useCallback)(function () {
52
+ createAnalyticsEvent((0, _analytics2.default)('screen.linkCreateScreen.viewed', {})).fire(_constants.ANALYTICS_CHANNEL);
53
+ }, [createAnalyticsEvent]);
54
+ var handleCloseComplete = (0, _react.useCallback)(function () {
55
+ createAnalyticsEvent((0, _analytics2.default)('screen.linkCreateScreen.closed', {})).fire(_constants.ANALYTICS_CHANNEL);
56
+ }, [createAnalyticsEvent]);
57
+ return (0, _react2.jsx)(_modalDialog.ModalTransition, null, !!active && (0, _react2.jsx)(_modalDialog.default, {
58
+ onClose: onCancel,
59
+ testId: testId,
60
+ shouldScrollInViewport: true,
61
+ onOpenComplete: handleOpenComplete,
62
+ onCloseComplete: handleCloseComplete
63
+ }, (0, _react2.jsx)(_modalDialog.ModalHeader, null, (0, _react2.jsx)(_modalDialog.ModalTitle, null, "Create New")), (0, _react2.jsx)(_modalDialog.ModalBody, null, (0, _react2.jsx)(_errorBoundary.ErrorBoundary, null, (0, _react2.jsx)(LinkCreate, props)))));
64
+ };
65
+ var LinkCreateWithAnalyticsContext = (0, _analytics.withLinkCreateAnalyticsContext)( /*#__PURE__*/(0, _react.memo)(function (_ref2) {
66
+ var props = (0, _extends2.default)({}, _ref2);
67
+ return (0, _react2.jsx)(LinkCreateWithModal, props);
68
+ }));
69
+ var PACKAGE_DATA = {
70
+ packageName: _version.name,
71
+ packageVersion: _version.version,
72
+ componentName: _constants.COMPONENT_NAME,
73
+ source: _constants.COMPONENT_NAME
74
+ };
75
+ exports.PACKAGE_DATA = PACKAGE_DATA;
76
+ var ComposedLinkCreate = /*#__PURE__*/(0, _react.memo)(function (props) {
77
+ return (0, _react2.jsx)(_analyticsNext.AnalyticsContext, {
78
+ data: PACKAGE_DATA
79
+ }, (0, _react2.jsx)(LinkCreateWithAnalyticsContext, props));
44
80
  });
45
- var _default = LinkCreate;
81
+ var _default = ComposedLinkCreate;
46
82
  exports.default = _default;
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/link-create",
3
- "version": "0.3.0",
3
+ "version": "0.3.1",
4
4
  "sideEffects": false
5
5
  }
@@ -0,0 +1,2 @@
1
+ export const ANALYTICS_CHANNEL = 'media';
2
+ export const COMPONENT_NAME = 'linkCreate';
@@ -0,0 +1,20 @@
1
+ /**
2
+ * THIS FILE WAS CREATED VIA CODEGEN DO NOT MODIFY {@see http://go/af-codegen}
3
+ *
4
+ * Generates Typescript types for analytics events from analytics.spec.yaml
5
+ *
6
+ * @codegen <<SignedSource::6d7803f5c035dc3cde1be03caa91eb04>>
7
+ * @codegenCommand yarn workspace @atlaskit/link-create run codegen-analytics
8
+ */
9
+
10
+ function createEventPayload(eventKey, attributes) {
11
+ const event = eventKey.split('.');
12
+ return {
13
+ eventType: event[0],
14
+ actionSubject: event[1],
15
+ action: event[2],
16
+ actionSubjectId: event[3],
17
+ attributes: attributes
18
+ };
19
+ }
20
+ export default createEventPayload;
@@ -0,0 +1,86 @@
1
+ import React, { useCallback, useContext, useMemo, useRef, useState } from 'react';
2
+ import { AnalyticsListener } from '@atlaskit/analytics-next';
3
+ import { ANALYTICS_CHANNEL } from '../../constants';
4
+ const UNKNOWN = 'unknown';
5
+ const DEFAULT_CONTEXT_ATTRIBUTES = {
6
+ triggeredFrom: UNKNOWN,
7
+ objectName: UNKNOWN,
8
+ appearance: 'modal'
9
+ };
10
+ const LinkCreateAnalyticsContext = /*#__PURE__*/React.createContext({
11
+ trackAttribute: () => {},
12
+ trackAttributes: () => {},
13
+ getAttributes: () => DEFAULT_CONTEXT_ATTRIBUTES
14
+ });
15
+ const LinkCreateAnalytics = ({
16
+ initialContext,
17
+ children
18
+ }) => {
19
+ const dataRef = useRef({
20
+ ...DEFAULT_CONTEXT_ATTRIBUTES,
21
+ ...initialContext
22
+ });
23
+ const methods = useMemo(() => ({
24
+ trackAttribute: (key, value) => {
25
+ dataRef.current[key] = value;
26
+ },
27
+ trackAttributes: attributes => {
28
+ dataRef.current = {
29
+ ...dataRef.current,
30
+ ...attributes
31
+ };
32
+ },
33
+ getAttributes: () => dataRef.current
34
+ }), []);
35
+ return /*#__PURE__*/React.createElement(LinkCreateAnalyticsContext.Provider, {
36
+ value: methods
37
+ }, children);
38
+ };
39
+ const contextAttributesFromInitialProps = props => {
40
+ return {
41
+ objectName: props.entityKey,
42
+ triggeredFrom: props.triggeredFrom
43
+ };
44
+ };
45
+
46
+ /**
47
+ * Hook that exposes the context-level attribute getters and setters.
48
+ */
49
+ export const useLinkCreateAnalytics = () => useContext(LinkCreateAnalyticsContext);
50
+
51
+ /**
52
+ * Wrap component in "attributes" context store and initialise the initial context attributes from props.
53
+ */
54
+ function withLinkCreateAnalytics(WrappedComponent) {
55
+ return props => {
56
+ const [initialContext] = useState(() => contextAttributesFromInitialProps(props));
57
+ return /*#__PURE__*/React.createElement(LinkCreateAnalytics, {
58
+ initialContext: initialContext
59
+ }, /*#__PURE__*/React.createElement(WrappedComponent, props));
60
+ };
61
+ }
62
+
63
+ /**
64
+ * Wraps a component with the analytics context + listener to update events with contextual-level attributes.
65
+ * Should be implemented once at the root of the link create.
66
+ */
67
+ export function withLinkCreateAnalyticsContext(WrappedComponent) {
68
+ return withLinkCreateAnalytics(props => {
69
+ const {
70
+ getAttributes
71
+ } = useLinkCreateAnalytics();
72
+ const onEvent = useCallback(event => {
73
+ var _event$payload$attrib;
74
+ event.update({
75
+ attributes: {
76
+ ...getAttributes(),
77
+ ...((_event$payload$attrib = event.payload.attributes) !== null && _event$payload$attrib !== void 0 ? _event$payload$attrib : {})
78
+ }
79
+ });
80
+ }, [getAttributes]);
81
+ return /*#__PURE__*/React.createElement(AnalyticsListener, {
82
+ channel: ANALYTICS_CHANNEL,
83
+ onEvent: onEvent
84
+ }, /*#__PURE__*/React.createElement(WrappedComponent, props));
85
+ });
86
+ }
@@ -0,0 +1 @@
1
+ export { useLinkCreateAnalytics, withLinkCreateAnalyticsContext } from './context';