@redocly/theme 0.18.1 → 0.18.2

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.
@@ -35,6 +35,7 @@ const SearchTrigger_1 = require("../../components/Search/SearchTrigger");
35
35
  const MobileSearchTrigger_1 = require("../../components/Search/MobileSearchTrigger");
36
36
  const SearchDialog_1 = require("../../components/Search/SearchDialog");
37
37
  const hooks_1 = require("../../hooks");
38
+ const telemetry_1 = require("../../mocks/telemetry");
38
39
  function Search({ className }) {
39
40
  var _a, _b;
40
41
  const [isOpen, setIsOpen] = (0, react_1.useState)(false);
@@ -46,6 +47,7 @@ function Search({ className }) {
46
47
  if (hotkeysKeys) {
47
48
  (0, hotkeys_js_1.default)(hotkeysKeys, (ev) => {
48
49
  setIsOpen(true);
50
+ telemetry_1.telemetry.send('search_opened', { method: 'shortcut' });
49
51
  ev.preventDefault();
50
52
  });
51
53
  return () => hotkeys_js_1.default.unbind(hotkeysKeys);
@@ -56,8 +58,14 @@ function Search({ className }) {
56
58
  }, []);
57
59
  (0, react_1.useEffect)(onClose, [location, onClose]);
58
60
  return (react_1.default.createElement(Wrapper, { "data-component-name": "Search/Search", className: className },
59
- react_1.default.createElement(SearchTrigger_1.SearchTrigger, { onClick: () => setIsOpen(true) }),
60
- react_1.default.createElement(MobileSearchTrigger_1.MobileSearchTrigger, { onClick: () => setIsOpen(true) }),
61
+ react_1.default.createElement(SearchTrigger_1.SearchTrigger, { onClick: () => {
62
+ telemetry_1.telemetry.send('search_opened', { method: 'click' });
63
+ setIsOpen(true);
64
+ } }),
65
+ react_1.default.createElement(MobileSearchTrigger_1.MobileSearchTrigger, { onClick: () => {
66
+ telemetry_1.telemetry.send('search_opened', { method: 'click' });
67
+ setIsOpen(true);
68
+ } }),
61
69
  isOpen && react_1.default.createElement(SearchDialog_1.SearchDialog, { onClose: onClose })));
62
70
  }
63
71
  exports.Search = Search;
@@ -2,6 +2,7 @@ import type { PropsWithChildren } from 'react';
2
2
  type Child = {
3
3
  props: {
4
4
  label: string;
5
+ key?: string;
5
6
  } & TabsProps;
6
7
  };
7
8
  type TabsProps = PropsWithChildren<{
@@ -36,9 +36,9 @@ function Tabs(props) {
36
36
  const [activeTab, setActiveTab] = (0, react_1.useState)((_a = children[0]) === null || _a === void 0 ? void 0 : _a.props.label);
37
37
  const onTabSelect = (label) => setActiveTab(label);
38
38
  return (react_1.default.createElement(TabsContainer, { "data-component-name": "Markdown/Tabs/Tabs", className: props.className },
39
- react_1.default.createElement(TabList, null, children.map((child) => {
40
- const { label } = child.props;
41
- return react_1.default.createElement(Tabs_1.Tab, { activeTab: activeTab, key: label, label: label, onClick: onTabSelect });
39
+ react_1.default.createElement(TabList, null, children.map((child, idx) => {
40
+ const { label, key } = child.props;
41
+ return (react_1.default.createElement(Tabs_1.Tab, { activeTab: activeTab, key: `${key || label}-${idx}`, label: label, onClick: onTabSelect }));
42
42
  })),
43
43
  react_1.default.createElement(TabContent, null, children.map((child) => {
44
44
  if (child.props.label !== activeTab)
@@ -0,0 +1,2 @@
1
+ import type { ClientTelemetry } from '@redocly/portal-types';
2
+ export declare const telemetry: ClientTelemetry;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.telemetry = void 0;
4
+ exports.telemetry = {
5
+ send: () => undefined,
6
+ };
7
+ //# sourceMappingURL=telemetry.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@redocly/theme",
3
- "version": "0.18.1",
3
+ "version": "0.18.2",
4
4
  "description": "Shared UI components lib",
5
5
  "keywords": [
6
6
  "theme",
@@ -80,7 +80,8 @@
80
80
  "tsconfig-paths": "^4.2.0",
81
81
  "tsconfig-paths-webpack-plugin": "^3.5.2",
82
82
  "typescript": "^4.8.4",
83
- "webpack": "^5.72.0"
83
+ "webpack": "^5.72.0",
84
+ "@redocly/portal-types": "1.0.1"
84
85
  },
85
86
  "dependencies": {
86
87
  "@redocly/ajv": "^8.11.0",
@@ -7,6 +7,7 @@ import { SearchTrigger } from '@theme/components/Search/SearchTrigger';
7
7
  import { MobileSearchTrigger } from '@theme/components/Search/MobileSearchTrigger';
8
8
  import { SearchDialog } from '@theme/components/Search/SearchDialog';
9
9
  import { useThemeConfig } from '@theme/hooks';
10
+ import { telemetry } from '@portal/telemetry';
10
11
 
11
12
  export function Search({ className }: { className?: string }): JSX.Element {
12
13
  const [isOpen, setIsOpen] = useState(false);
@@ -19,6 +20,7 @@ export function Search({ className }: { className?: string }): JSX.Element {
19
20
  if (hotkeysKeys) {
20
21
  hotkeys(hotkeysKeys, (ev) => {
21
22
  setIsOpen(true);
23
+ telemetry.send('search_opened', { method: 'shortcut' });
22
24
  ev.preventDefault();
23
25
  });
24
26
 
@@ -34,8 +36,18 @@ export function Search({ className }: { className?: string }): JSX.Element {
34
36
 
35
37
  return (
36
38
  <Wrapper data-component-name="Search/Search" className={className}>
37
- <SearchTrigger onClick={() => setIsOpen(true)} />
38
- <MobileSearchTrigger onClick={() => setIsOpen(true)} />
39
+ <SearchTrigger
40
+ onClick={() => {
41
+ telemetry.send('search_opened', { method: 'click' });
42
+ setIsOpen(true);
43
+ }}
44
+ />
45
+ <MobileSearchTrigger
46
+ onClick={() => {
47
+ telemetry.send('search_opened', { method: 'click' });
48
+ setIsOpen(true);
49
+ }}
50
+ />
39
51
 
40
52
  {isOpen && <SearchDialog onClose={onClose} />}
41
53
  </Wrapper>
@@ -5,7 +5,7 @@ import type { PropsWithChildren } from 'react';
5
5
 
6
6
  import { Tab } from '@theme/components/Tabs';
7
7
 
8
- type Child = { props: { label: string } & TabsProps };
8
+ type Child = { props: { label: string; key?: string } & TabsProps };
9
9
  type TabsProps = PropsWithChildren<{ children: Child[]; className?: string }>;
10
10
 
11
11
  export function Tabs(props: TabsProps): JSX.Element {
@@ -16,9 +16,16 @@ export function Tabs(props: TabsProps): JSX.Element {
16
16
  return (
17
17
  <TabsContainer data-component-name="Markdown/Tabs/Tabs" className={props.className}>
18
18
  <TabList>
19
- {children.map((child) => {
20
- const { label } = child.props;
21
- return <Tab activeTab={activeTab} key={label} label={label} onClick={onTabSelect} />;
19
+ {children.map((child, idx) => {
20
+ const { label, key } = child.props;
21
+ return (
22
+ <Tab
23
+ activeTab={activeTab}
24
+ key={`${key || label}-${idx}`}
25
+ label={label}
26
+ onClick={onTabSelect}
27
+ />
28
+ );
22
29
  })}
23
30
  </TabList>
24
31
  <TabContent>
@@ -0,0 +1,5 @@
1
+ import type { ClientTelemetry } from '@redocly/portal-types';
2
+
3
+ export const telemetry = {
4
+ send: () => undefined,
5
+ } as unknown as ClientTelemetry;