@atlaskit/link-picker 1.9.2 → 1.9.4

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 (46) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/cjs/analytics.codegen.js +1 -1
  3. package/dist/cjs/common/analytics/context.js +137 -0
  4. package/dist/cjs/common/analytics/index.js +27 -0
  5. package/dist/cjs/common/analytics/input-field-tracking.js +115 -0
  6. package/dist/cjs/common/constants.js +1 -1
  7. package/dist/cjs/ui/error-boundary/index.js +104 -0
  8. package/dist/cjs/ui/index.js +10 -6
  9. package/dist/cjs/ui/link-picker/index.js +56 -16
  10. package/dist/cjs/ui/link-picker/text-input/index.js +18 -23
  11. package/dist/cjs/version.json +1 -1
  12. package/dist/es2019/analytics.codegen.js +1 -1
  13. package/dist/es2019/common/analytics/context.js +95 -0
  14. package/dist/es2019/common/analytics/index.js +2 -0
  15. package/dist/es2019/common/analytics/input-field-tracking.js +85 -0
  16. package/dist/es2019/common/constants.js +1 -1
  17. package/dist/es2019/ui/error-boundary/index.js +62 -0
  18. package/dist/es2019/ui/index.js +8 -5
  19. package/dist/es2019/ui/link-picker/index.js +51 -14
  20. package/dist/es2019/ui/link-picker/link-search-error/index.js +2 -2
  21. package/dist/es2019/ui/link-picker/text-input/index.js +14 -20
  22. package/dist/es2019/version.json +1 -1
  23. package/dist/esm/analytics.codegen.js +1 -1
  24. package/dist/esm/common/analytics/context.js +110 -0
  25. package/dist/esm/common/analytics/index.js +2 -0
  26. package/dist/esm/common/analytics/input-field-tracking.js +91 -0
  27. package/dist/esm/common/constants.js +1 -1
  28. package/dist/esm/ui/error-boundary/index.js +81 -0
  29. package/dist/esm/ui/index.js +8 -5
  30. package/dist/esm/ui/link-picker/index.js +54 -14
  31. package/dist/esm/ui/link-picker/link-search-error/index.js +2 -2
  32. package/dist/esm/ui/link-picker/text-input/index.js +16 -21
  33. package/dist/esm/version.json +1 -1
  34. package/dist/types/analytics.codegen.d.ts +21 -1
  35. package/dist/types/common/analytics/context.d.ts +28 -0
  36. package/dist/types/common/analytics/index.d.ts +2 -0
  37. package/dist/types/common/analytics/input-field-tracking.d.ts +17 -0
  38. package/dist/types/common/constants.d.ts +1 -1
  39. package/dist/types/ui/error-boundary/index.d.ts +27 -0
  40. package/dist/types/ui/index.d.ts +2 -5
  41. package/dist/types/ui/link-picker/text-input/index.d.ts +6 -8
  42. package/package.json +1 -1
  43. package/dist/cjs/services/with-link-picker-analytics/index.js +0 -33
  44. package/dist/es2019/services/with-link-picker-analytics/index.js +0 -15
  45. package/dist/esm/services/with-link-picker-analytics/index.js +0 -17
  46. package/dist/types/services/with-link-picker-analytics/index.d.ts +0 -4
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @atlaskit/link-picker
2
2
 
3
+ ## 1.9.4
4
+
5
+ ### Patch Changes
6
+
7
+ - [`81ac9ce10ff`](https://bitbucket.org/atlassian/atlassian-frontend/commits/81ac9ce10ff) - Update error boundary implementation to replace analytic instrumentation for uncaught errors.
8
+
9
+ ## 1.9.3
10
+
11
+ ### Patch Changes
12
+
13
+ - [`e3f8fb1f348`](https://bitbucket.org/atlassian/atlassian-frontend/commits/e3f8fb1f348) - Adds tracking of how the input fields are populated ie paste vs manual vs search.
14
+
3
15
  ## 1.9.2
4
16
 
5
17
  ### Patch Changes
@@ -10,7 +10,7 @@ exports.default = void 0;
10
10
  *
11
11
  * Generates analytics utilities from the package analytics spec yaml
12
12
  *
13
- * @codegen <<SignedSource::115bafba068f36f76da67200ee2d08c4>>
13
+ * @codegen <<SignedSource::3c46f1d8f463b6898a7a0e1e1f4676b4>>
14
14
  * @codegenCommand yarn workspace @atlaskit/link-picker run codegen-analytics
15
15
  */
16
16
  function createEventPayload(eventKey, attributes) {
@@ -0,0 +1,137 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ var _typeof = require("@babel/runtime/helpers/typeof");
6
+
7
+ Object.defineProperty(exports, "__esModule", {
8
+ value: true
9
+ });
10
+ exports.useLinkPickerAnalytics = void 0;
11
+ exports.withLinkPickerAnalyticsContext = withLinkPickerAnalyticsContext;
12
+
13
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
14
+
15
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
16
+
17
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
18
+
19
+ var _react = _interopRequireWildcard(require("react"));
20
+
21
+ var _analyticsNext = require("@atlaskit/analytics-next");
22
+
23
+ var _constants = require("../constants");
24
+
25
+ var _url = require("../utils/url");
26
+
27
+ 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); }
28
+
29
+ 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; }
30
+
31
+ 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; }
32
+
33
+ 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; }
34
+
35
+ var DEFAULT_CONTEXT_ATTRIBUTES = {
36
+ linkState: 'newLink',
37
+ linkFieldContent: null,
38
+ linkFieldContentInputMethod: null,
39
+ displayTextFieldContent: null,
40
+ displayTextFieldContentInputMethod: null
41
+ };
42
+
43
+ var LinkPickerAnalyticsContext = /*#__PURE__*/_react.default.createContext({
44
+ trackAttribute: function trackAttribute() {},
45
+ trackAttributes: function trackAttributes() {},
46
+ getAttributes: function getAttributes() {
47
+ return DEFAULT_CONTEXT_ATTRIBUTES;
48
+ }
49
+ });
50
+ /**
51
+ * TODO: Should we hook this into the form state/reducer?
52
+ */
53
+
54
+
55
+ var contextAttributesFromIntialProps = function contextAttributesFromIntialProps(props) {
56
+ return {
57
+ linkState: (0, _url.normalizeUrl)(props.url) ? 'editLink' : 'newLink',
58
+ linkFieldContent: (0, _url.normalizeUrl)(props.url) ? 'url' : null,
59
+ displayTextFieldContent: Boolean(props.displayText) ? 'text_string' : null
60
+ };
61
+ };
62
+ /**
63
+ * Context for tracking attributes to deliver at a context-level
64
+ */
65
+
66
+
67
+ var LinkPickerAnalytics = function LinkPickerAnalytics(_ref) {
68
+ var initialContext = _ref.initialContext,
69
+ children = _ref.children;
70
+ var dataRef = (0, _react.useRef)(_objectSpread(_objectSpread({}, DEFAULT_CONTEXT_ATTRIBUTES), initialContext));
71
+ var methods = (0, _react.useMemo)(function () {
72
+ return {
73
+ trackAttribute: function trackAttribute(key, value) {
74
+ dataRef.current[key] = value;
75
+ },
76
+ trackAttributes: function trackAttributes(attributes) {
77
+ dataRef.current = _objectSpread(_objectSpread({}, dataRef.current), attributes);
78
+ },
79
+ getAttributes: function getAttributes() {
80
+ return dataRef.current;
81
+ }
82
+ };
83
+ }, []);
84
+ return /*#__PURE__*/_react.default.createElement(LinkPickerAnalyticsContext.Provider, {
85
+ value: methods
86
+ }, children);
87
+ };
88
+ /**
89
+ * Hook that exposes the context-level attribute getters and setters.
90
+ */
91
+
92
+
93
+ var useLinkPickerAnalytics = function useLinkPickerAnalytics() {
94
+ return (0, _react.useContext)(LinkPickerAnalyticsContext);
95
+ };
96
+ /**
97
+ * Wrap component in "attributes" context store and initialise the initial context attributes from props.
98
+ */
99
+
100
+
101
+ exports.useLinkPickerAnalytics = useLinkPickerAnalytics;
102
+
103
+ function withLinkPickerAnalytics(WrappedComponent) {
104
+ return function (props) {
105
+ var _useState = (0, _react.useState)(function () {
106
+ return contextAttributesFromIntialProps(props);
107
+ }),
108
+ _useState2 = (0, _slicedToArray2.default)(_useState, 1),
109
+ initialContext = _useState2[0];
110
+
111
+ return /*#__PURE__*/_react.default.createElement(LinkPickerAnalytics, (0, _extends2.default)({
112
+ initialContext: initialContext
113
+ }, props), /*#__PURE__*/_react.default.createElement(WrappedComponent, props));
114
+ };
115
+ }
116
+ /**
117
+ * Wraps a component with the analytics context + listener to update events with contextual-level attributes.
118
+ * Should be implemented once at the root of the link picker.
119
+ */
120
+
121
+
122
+ function withLinkPickerAnalyticsContext(WrappedComponent) {
123
+ return withLinkPickerAnalytics(function (props) {
124
+ var _useLinkPickerAnalyti = useLinkPickerAnalytics(),
125
+ getAttributes = _useLinkPickerAnalyti.getAttributes;
126
+
127
+ var onEvent = (0, _react.useCallback)(function (event) {
128
+ event.update({
129
+ attributes: getAttributes()
130
+ });
131
+ }, [getAttributes]);
132
+ return /*#__PURE__*/_react.default.createElement(_analyticsNext.AnalyticsListener, {
133
+ channel: _constants.ANALYTICS_CHANNEL,
134
+ onEvent: onEvent
135
+ }, /*#__PURE__*/_react.default.createElement(WrappedComponent, props));
136
+ });
137
+ }
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "useLinkPickerAnalytics", {
7
+ enumerable: true,
8
+ get: function get() {
9
+ return _context.useLinkPickerAnalytics;
10
+ }
11
+ });
12
+ Object.defineProperty(exports, "withInputFieldTracking", {
13
+ enumerable: true,
14
+ get: function get() {
15
+ return _inputFieldTracking.withInputFieldTracking;
16
+ }
17
+ });
18
+ Object.defineProperty(exports, "withLinkPickerAnalyticsContext", {
19
+ enumerable: true,
20
+ get: function get() {
21
+ return _context.withLinkPickerAnalyticsContext;
22
+ }
23
+ });
24
+
25
+ var _context = require("./context");
26
+
27
+ var _inputFieldTracking = require("./input-field-tracking");
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ var _typeof3 = require("@babel/runtime/helpers/typeof");
6
+
7
+ Object.defineProperty(exports, "__esModule", {
8
+ value: true
9
+ });
10
+ exports.withInputFieldTracking = void 0;
11
+
12
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
13
+
14
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
15
+
16
+ var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
17
+
18
+ var _react = _interopRequireWildcard(require("react"));
19
+
20
+ var _analyticsNext = require("@atlaskit/analytics-next");
21
+
22
+ var _constants = require("../constants");
23
+
24
+ var _analytics = _interopRequireDefault(require("../../analytics.codegen"));
25
+
26
+ var _2 = require(".");
27
+
28
+ 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); }
29
+
30
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof3(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; }
31
+
32
+ var isEventWithInputType = function isEventWithInputType(e) {
33
+ return (0, _typeof2.default)(e) === 'object' && e !== null && 'inputType' in e;
34
+ };
35
+
36
+ var getChangeEventInputMethodType = function getChangeEventInputMethodType(event) {
37
+ if (isEventWithInputType(event.nativeEvent) && typeof event.nativeEvent.inputType === 'string' && event.nativeEvent.inputType.includes('insertFromPaste')) {
38
+ return 'paste';
39
+ }
40
+
41
+ return 'manual';
42
+ };
43
+ /**
44
+ * Wraps an input field and connects it to the link picker analytics context to provide a baseline of analytics tracking
45
+ * @param WrappedComponent The input field to be tracked
46
+ * @param field The name of the field (ie matching actionSubjectId)
47
+ * @param filterOnChangeEventAttrs Function to hook into and filter/customise the default attribute tracking logic
48
+ * @returns HOC Input field with tracking
49
+ */
50
+
51
+
52
+ var withInputFieldTracking = function withInputFieldTracking(WrappedComponent, field) {
53
+ var filterOnChangeEventAttrs = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function (_, attributes) {
54
+ return attributes;
55
+ };
56
+ return function (props) {
57
+ var onBlur = props.onBlur,
58
+ onChange = props.onChange,
59
+ onClear = props.onClear,
60
+ onFocus = props.onFocus;
61
+
62
+ var _useLinkPickerAnalyti = (0, _2.useLinkPickerAnalytics)(),
63
+ trackAttribute = _useLinkPickerAnalyti.trackAttribute,
64
+ trackAttributes = _useLinkPickerAnalyti.trackAttributes;
65
+
66
+ var _useAnalyticsEvents = (0, _analyticsNext.useAnalyticsEvents)(),
67
+ createAnalyticsEvent = _useAnalyticsEvents.createAnalyticsEvent; // Ref to track if the value of the field has changed between focus and blur
68
+
69
+
70
+ var valueOnFocus = (0, _react.useRef)(null); // Track the content and input method on every direct change to the input
71
+
72
+ var handleOnChange = (0, _react.useCallback)(function (event) {
73
+ var _filterOnChangeEventA;
74
+
75
+ // TODO: See above re template literal, improve typesafety here
76
+ // trackAttribute(`${field}FieldContent`, contentTypeFn(event.currentTarget.value));
77
+ // trackAttribute(`${field}FieldContentInputMethod`, methodTypeFn(event));
78
+ trackAttributes(filterOnChangeEventAttrs(event, (_filterOnChangeEventA = {}, (0, _defineProperty2.default)(_filterOnChangeEventA, "".concat(field, "FieldContent"), Boolean(event.currentTarget.value) ? 'text_string' : null), (0, _defineProperty2.default)(_filterOnChangeEventA, "".concat(field, "FieldContentInputMethod"), getChangeEventInputMethodType(event)), _filterOnChangeEventA)));
79
+ onChange === null || onChange === void 0 ? void 0 : onChange(event);
80
+ }, [onChange, trackAttributes]); // Store the value of the field at the time the field is focused so we can know if it changes when the user's focus leaves
81
+
82
+ var handleOnFocus = (0, _react.useCallback)(function (event) {
83
+ valueOnFocus.current = event.currentTarget.value;
84
+ onFocus === null || onFocus === void 0 ? void 0 : onFocus(event);
85
+ }, [onFocus]); // Fire updated events only when the user's focus leaves the field
86
+
87
+ var handleOnBlur = (0, _react.useCallback)(function (event) {
88
+ // Only fire if the value has changed since the field was focused (we are only concerned with the net change to the field)
89
+ if (event.currentTarget.value !== valueOnFocus.current) {
90
+ createAnalyticsEvent((0, _analytics.default)("ui.textField.updated.".concat(field, "Field"), {})).fire(_constants.ANALYTICS_CHANNEL);
91
+ }
92
+
93
+ onBlur === null || onBlur === void 0 ? void 0 : onBlur(event);
94
+ }, [onBlur, createAnalyticsEvent]); // Track the values as null when the text field is cleared
95
+
96
+ var handleOnClear = (0, _react.useCallback)(function () {
97
+ trackAttribute("".concat(field, "FieldContent"), null);
98
+ trackAttribute("".concat(field, "FieldContentInputMethod"), null);
99
+
100
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
101
+ args[_key] = arguments[_key];
102
+ }
103
+
104
+ onClear === null || onClear === void 0 ? void 0 : onClear.apply(void 0, args);
105
+ }, [onClear, trackAttribute]);
106
+ return /*#__PURE__*/_react.default.createElement(WrappedComponent, (0, _extends2.default)({}, props, {
107
+ onBlur: handleOnBlur,
108
+ onChange: handleOnChange,
109
+ onClear: handleOnClear,
110
+ onFocus: handleOnFocus
111
+ }));
112
+ };
113
+ };
114
+
115
+ exports.withInputFieldTracking = withInputFieldTracking;
@@ -6,5 +6,5 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.COMPONENT_NAME = exports.ANALYTICS_CHANNEL = void 0;
7
7
  var ANALYTICS_CHANNEL = 'media';
8
8
  exports.ANALYTICS_CHANNEL = ANALYTICS_CHANNEL;
9
- var COMPONENT_NAME = 'LinkPicker';
9
+ var COMPONENT_NAME = 'linkPicker';
10
10
  exports.COMPONENT_NAME = COMPONENT_NAME;
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ var _typeof = require("@babel/runtime/helpers/typeof");
6
+
7
+ Object.defineProperty(exports, "__esModule", {
8
+ value: true
9
+ });
10
+ exports.default = exports.BaseErrorBoundary = void 0;
11
+
12
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
13
+
14
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
15
+
16
+ var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
17
+
18
+ var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
19
+
20
+ var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
21
+
22
+ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
23
+
24
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
25
+
26
+ var _react = _interopRequireWildcard(require("react"));
27
+
28
+ var _analyticsNext = require("@atlaskit/analytics-next");
29
+
30
+ var _analytics = _interopRequireDefault(require("../../analytics.codegen"));
31
+
32
+ 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); }
33
+
34
+ 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; }
35
+
36
+ function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; }
37
+
38
+ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
39
+
40
+ // eslint-disable-next-line @repo/internal/react/no-class-components
41
+ var BaseErrorBoundary = /*#__PURE__*/function (_Component) {
42
+ (0, _inherits2.default)(BaseErrorBoundary, _Component);
43
+
44
+ var _super = _createSuper(BaseErrorBoundary);
45
+
46
+ function BaseErrorBoundary(props) {
47
+ var _this;
48
+
49
+ (0, _classCallCheck2.default)(this, BaseErrorBoundary);
50
+ _this = _super.call(this, props);
51
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "fireAnalytics", function (analyticsErrorPayload) {
52
+ var _window, _window$navigator, _analyticsErrorPayloa, _analyticsErrorPayloa2;
53
+
54
+ var _this$props = _this.props,
55
+ createAnalyticsEvent = _this$props.createAnalyticsEvent,
56
+ channel = _this$props.channel;
57
+ createAnalyticsEvent((0, _analytics.default)('ui.linkPicker.unhandledErrorCaught', {
58
+ browserInfo: ((_window = window) === null || _window === void 0 ? void 0 : (_window$navigator = _window.navigator) === null || _window$navigator === void 0 ? void 0 : _window$navigator.userAgent) || 'unknown',
59
+ error: analyticsErrorPayload.error.toString(),
60
+ componentStack: (_analyticsErrorPayloa = (_analyticsErrorPayloa2 = analyticsErrorPayload.info) === null || _analyticsErrorPayloa2 === void 0 ? void 0 : _analyticsErrorPayloa2.componentStack) !== null && _analyticsErrorPayloa !== void 0 ? _analyticsErrorPayloa : ''
61
+ })).fire(channel);
62
+ });
63
+ _this.state = {
64
+ hasError: false
65
+ };
66
+ return _this;
67
+ }
68
+
69
+ (0, _createClass2.default)(BaseErrorBoundary, [{
70
+ key: "componentDidCatch",
71
+ value: function componentDidCatch(error, info) {
72
+ var onError = this.props.onError;
73
+ var payload = {
74
+ error: error,
75
+ info: info
76
+ };
77
+ this.fireAnalytics(payload);
78
+ onError && onError(error, info);
79
+ this.setState({
80
+ hasError: true
81
+ });
82
+ }
83
+ }, {
84
+ key: "render",
85
+ value: function render() {
86
+ var _this$props2 = this.props,
87
+ children = _this$props2.children,
88
+ ErrorComponent = _this$props2.ErrorComponent;
89
+ var hasError = this.state.hasError;
90
+
91
+ if (hasError && ErrorComponent) {
92
+ return /*#__PURE__*/_react.default.createElement(ErrorComponent, null);
93
+ }
94
+
95
+ return children;
96
+ }
97
+ }]);
98
+ return BaseErrorBoundary;
99
+ }(_react.Component);
100
+
101
+ exports.BaseErrorBoundary = BaseErrorBoundary;
102
+ var ErrorBoundary = (0, _analyticsNext.withAnalyticsEvents)()(BaseErrorBoundary);
103
+ var _default = ErrorBoundary;
104
+ exports.default = _default;
@@ -11,14 +11,16 @@ var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
11
11
 
12
12
  var _react = _interopRequireWildcard(require("react"));
13
13
 
14
- var _analyticsNext = require("@atlaskit/analytics-next");
15
-
16
14
  var _reactLooselyLazy = require("react-loosely-lazy");
17
15
 
16
+ var _analyticsNext = require("@atlaskit/analytics-next");
17
+
18
18
  var _constants = require("../common/constants");
19
19
 
20
20
  var _version = require("../version.json");
21
21
 
22
+ var _errorBoundary = _interopRequireDefault(require("./error-boundary"));
23
+
22
24
  var _errorBoundaryFallback = require("./error-boundary-fallback");
23
25
 
24
26
  var _loaderFallback = require("./loader-fallback");
@@ -30,7 +32,8 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
30
32
  var PACKAGE_DATA = {
31
33
  packageName: _version.name,
32
34
  packageVersion: _version.version,
33
- componentName: _constants.COMPONENT_NAME
35
+ componentName: _constants.COMPONENT_NAME,
36
+ source: _constants.COMPONENT_NAME
34
37
  };
35
38
  exports.PACKAGE_DATA = PACKAGE_DATA;
36
39
  var LazyLinkPicker = (0, _reactLooselyLazy.lazyForPaint)(function () {
@@ -39,12 +42,13 @@ var LazyLinkPicker = (0, _reactLooselyLazy.lazyForPaint)(function () {
39
42
  });
40
43
  });
41
44
  var ComposedLinkPicker = /*#__PURE__*/(0, _react.memo)(function (props) {
42
- return /*#__PURE__*/_react.default.createElement(_analyticsNext.AnalyticsErrorBoundary, {
45
+ return /*#__PURE__*/_react.default.createElement(_analyticsNext.AnalyticsContext, {
46
+ data: PACKAGE_DATA
47
+ }, /*#__PURE__*/_react.default.createElement(_errorBoundary.default, {
43
48
  channel: _constants.ANALYTICS_CHANNEL,
44
- data: PACKAGE_DATA,
45
49
  ErrorComponent: _errorBoundaryFallback.ErrorBoundaryFallback
46
50
  }, /*#__PURE__*/_react.default.createElement(_reactLooselyLazy.LazySuspense, {
47
51
  fallback: _loaderFallback.LoaderFallback
48
- }, /*#__PURE__*/_react.default.createElement(LazyLinkPicker, props)));
52
+ }, /*#__PURE__*/_react.default.createElement(LazyLinkPicker, props))));
49
53
  });
50
54
  exports.ComposedLinkPicker = ComposedLinkPicker;
@@ -33,20 +33,20 @@ var _analytics = _interopRequireDefault(require("../../analytics.codegen"));
33
33
 
34
34
  var _constants = require("../../common/constants");
35
35
 
36
+ var _analytics2 = require("../../common/analytics");
37
+
38
+ var _url2 = require("../../common/utils/url");
39
+
36
40
  var _usePlugins2 = require("../../services/use-plugins");
37
41
 
38
42
  var _useSearchQuery = require("../../services/use-search-query");
39
43
 
40
- var _withLinkPickerAnalytics = require("../../services/with-link-picker-analytics");
44
+ var _useFixHeight = _interopRequireDefault(require("../../controllers/use-fix-height"));
41
45
 
42
46
  var _messages = require("./messages");
43
47
 
44
48
  var _textInput = _interopRequireDefault(require("./text-input"));
45
49
 
46
- var _url2 = require("../../common/utils/url");
47
-
48
- var _useFixHeight = _interopRequireDefault(require("../../controllers/use-fix-height"));
49
-
50
50
  var _styled = require("./styled");
51
51
 
52
52
  var _browser = require("./browser");
@@ -106,6 +106,25 @@ function reducer(state, payload) {
106
106
 
107
107
  return _objectSpread(_objectSpread({}, state), payload);
108
108
  }
109
+ /**
110
+ * Bind input fields to analytics tracking
111
+ */
112
+
113
+
114
+ var getLinkFieldContent = function getLinkFieldContent(value) {
115
+ if (!Boolean(value)) {
116
+ return null;
117
+ }
118
+
119
+ return (0, _url2.isSafeUrl)(value) ? 'url' : 'text_string';
120
+ };
121
+
122
+ var LinkInputField = (0, _analytics2.withInputFieldTracking)(_textInput.default, 'link', function (event, attributes) {
123
+ return _objectSpread(_objectSpread({}, attributes), {}, {
124
+ linkFieldContent: getLinkFieldContent(event.currentTarget.value)
125
+ });
126
+ });
127
+ var DisplayTextInputField = (0, _analytics2.withInputFieldTracking)(_textInput.default, 'displayText');
109
128
 
110
129
  function LinkPicker(_ref) {
111
130
  var _errorFallback;
@@ -150,6 +169,11 @@ function LinkPicker(_ref) {
150
169
  var isEditing = !!initUrl;
151
170
  var selectedItem = items === null || items === void 0 ? void 0 : items[selectedIndex];
152
171
  var isSelectedItem = (selectedItem === null || selectedItem === void 0 ? void 0 : selectedItem.url) === url;
172
+
173
+ var _useLinkPickerAnalyti = (0, _analytics2.useLinkPickerAnalytics)(),
174
+ trackAttribute = _useLinkPickerAnalyti.trackAttribute,
175
+ getAttributes = _useLinkPickerAnalyti.getAttributes;
176
+
153
177
  (0, _react.useEffect)(function () {
154
178
  // Anything in here is fired on component mount.
155
179
  var event = createAnalyticsEvent((0, _analytics.default)('ui.inlineDialog.viewed.linkPicker', {}));
@@ -165,14 +189,14 @@ function LinkPicker(_ref) {
165
189
  onContentResize();
166
190
  }
167
191
  }, [onContentResize, items, isLoading, isActivePlugin, tabs]);
168
- var handleChangeUrl = (0, _react.useCallback)(function (url) {
192
+ var handleChangeUrl = (0, _react.useCallback)(function (e) {
169
193
  dispatch({
170
- url: url
194
+ url: e.currentTarget.value
171
195
  });
172
196
  }, []);
173
- var handleChangeText = (0, _react.useCallback)(function (displayText) {
197
+ var handleChangeText = (0, _react.useCallback)(function (e) {
174
198
  dispatch({
175
- displayText: displayText
199
+ displayText: e.currentTarget.value
176
200
  });
177
201
  }, []);
178
202
  var handleKeyDown = (0, _react.useCallback)(function (event) {
@@ -201,6 +225,11 @@ function LinkPicker(_ref) {
201
225
  }
202
226
 
203
227
  if ([KEY_CODE_ARROW_DOWN, KEY_CODE_ARROW_UP].includes(keyCode) && items[updatedIndex]) {
228
+ /**
229
+ * Manually track that the url has been updated using searchResult method
230
+ */
231
+ trackAttribute('linkFieldContent', getLinkFieldContent(items[updatedIndex].url));
232
+ trackAttribute('linkFieldContentInputMethod', 'searchResult');
204
233
  dispatch({
205
234
  activeIndex: updatedIndex,
206
235
  selectedIndex: updatedIndex,
@@ -208,7 +237,7 @@ function LinkPicker(_ref) {
208
237
  invalidUrl: false
209
238
  });
210
239
  }
211
- }, [activeIndex, items]);
240
+ }, [activeIndex, items, trackAttribute]);
212
241
  var handleClear = (0, _react.useCallback)(function (field) {
213
242
  dispatch((0, _defineProperty2.default)({}, field, ''));
214
243
  }, []);
@@ -235,7 +264,12 @@ function LinkPicker(_ref) {
235
264
  var event = createAnalyticsEvent((0, _analytics.default)('ui.form.submitted.linkPicker', {})); // Clone the event so that it can be emitted for consumer usage
236
265
  // This must happen BEFORE the original event is fired!
237
266
 
238
- var consumerEvent = event.clone(); // Dispatch the original event to our channel
267
+ var consumerEvent = event.clone(); // Cloned event doesnt have the attributes that are added by
268
+ // the analytics listener in the LinkPickerAnalyticsContext, add them here
269
+
270
+ consumerEvent === null || consumerEvent === void 0 ? void 0 : consumerEvent.update({
271
+ attributes: getAttributes()
272
+ }); // Dispatch the original event to our channel
239
273
 
240
274
  event.fire(_constants.ANALYTICS_CHANNEL);
241
275
  onSubmit(_objectSpread({
@@ -248,7 +282,7 @@ function LinkPicker(_ref) {
248
282
  }, inputType === 'manual' ? {
249
283
  rawUrl: state.url
250
284
  } : {}), consumerEvent);
251
- }, [displayText, onSubmit, state.url, createAnalyticsEvent]);
285
+ }, [displayText, onSubmit, state.url, createAnalyticsEvent, getAttributes]);
252
286
  var handleSelected = (0, _react.useCallback)(function (objectId) {
253
287
  var selectedItem = items === null || items === void 0 ? void 0 : items.find(function (item) {
254
288
  return item.objectId === objectId;
@@ -258,9 +292,15 @@ function LinkPicker(_ref) {
258
292
  var _url = selectedItem.url,
259
293
  name = selectedItem.name;
260
294
  dispatchEvent(new Event('submit'));
295
+ /**
296
+ * Manually track that the url has been updated using searchResult method
297
+ */
298
+
299
+ trackAttribute('linkFieldContent', getLinkFieldContent(_url));
300
+ trackAttribute('linkFieldContentInputMethod', 'searchResult');
261
301
  handleInsert(_url, name, 'typeAhead');
262
302
  }
263
- }, [handleInsert, items]);
303
+ }, [handleInsert, trackAttribute, items]);
264
304
  var handleSubmit = (0, _react.useCallback)(function (event) {
265
305
  event.preventDefault();
266
306
 
@@ -304,7 +344,7 @@ function LinkPicker(_ref) {
304
344
  delay: 250
305
345
  }), (0, _react2.jsx)(_visuallyHidden.default, {
306
346
  id: screenReaderDescriptionId
307
- }, (0, _react2.jsx)(_reactIntlNext.FormattedMessage, _messages.messages.searchLinkAriaDescription)), (0, _react2.jsx)(_textInput.default, {
347
+ }, (0, _react2.jsx)(_reactIntlNext.FormattedMessage, _messages.messages.searchLinkAriaDescription)), (0, _react2.jsx)(LinkInputField, {
308
348
  role: "combobox",
309
349
  autoComplete: "off",
310
350
  name: "url",
@@ -324,7 +364,7 @@ function LinkPicker(_ref) {
324
364
  onClear: handleClear,
325
365
  onKeyDown: handleKeyDown,
326
366
  onChange: handleChangeUrl
327
- }), (0, _react2.jsx)(_textInput.default, {
367
+ }), (0, _react2.jsx)(DisplayTextInputField, {
328
368
  autoComplete: "off",
329
369
  name: "displayText",
330
370
  testId: testIds.textInputField,
@@ -375,7 +415,7 @@ function LinkPicker(_ref) {
375
415
  }));
376
416
  }
377
417
 
378
- var _default = (0, _withLinkPickerAnalytics.withLinkPickerAnalyticsContext)( /*#__PURE__*/(0, _react.memo)(LinkPicker));
418
+ var _default = (0, _analytics2.withLinkPickerAnalyticsContext)( /*#__PURE__*/(0, _react.memo)(LinkPicker));
379
419
 
380
420
  exports.default = _default;
381
421