@memori.ai/memori-react 4.2.0 → 4.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 (52) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/components/ExpertsDrawer/ExpertsDrawer.css +67 -0
  3. package/dist/components/ExpertsDrawer/ExpertsDrawer.d.ts +11 -0
  4. package/dist/components/ExpertsDrawer/ExpertsDrawer.js +20 -0
  5. package/dist/components/ExpertsDrawer/ExpertsDrawer.js.map +1 -0
  6. package/dist/components/Header/Header.css +4 -0
  7. package/dist/components/Header/Header.d.ts +1 -0
  8. package/dist/components/Header/Header.js +3 -2
  9. package/dist/components/Header/Header.js.map +1 -1
  10. package/dist/components/KnownFacts/KnownFacts.js +11 -7
  11. package/dist/components/KnownFacts/KnownFacts.js.map +1 -1
  12. package/dist/components/MemoriWidget/MemoriWidget.js +4 -1
  13. package/dist/components/MemoriWidget/MemoriWidget.js.map +1 -1
  14. package/dist/components/StartPanel/StartPanel.css +5 -0
  15. package/dist/locales/en.json +3 -0
  16. package/dist/locales/it.json +3 -0
  17. package/dist/styles.css +1 -0
  18. package/esm/components/ExpertsDrawer/ExpertsDrawer.css +67 -0
  19. package/esm/components/ExpertsDrawer/ExpertsDrawer.d.ts +11 -0
  20. package/esm/components/ExpertsDrawer/ExpertsDrawer.js +17 -0
  21. package/esm/components/ExpertsDrawer/ExpertsDrawer.js.map +1 -0
  22. package/esm/components/Header/Header.css +4 -0
  23. package/esm/components/Header/Header.d.ts +1 -0
  24. package/esm/components/Header/Header.js +3 -2
  25. package/esm/components/Header/Header.js.map +1 -1
  26. package/esm/components/KnownFacts/KnownFacts.js +11 -7
  27. package/esm/components/KnownFacts/KnownFacts.js.map +1 -1
  28. package/esm/components/MemoriWidget/MemoriWidget.js +4 -1
  29. package/esm/components/MemoriWidget/MemoriWidget.js.map +1 -1
  30. package/esm/components/StartPanel/StartPanel.css +5 -0
  31. package/esm/locales/en.json +3 -0
  32. package/esm/locales/it.json +3 -0
  33. package/esm/styles.css +1 -0
  34. package/package.json +1 -1
  35. package/src/components/ExpertsDrawer/ExpertsDrawer.css +67 -0
  36. package/src/components/ExpertsDrawer/ExpertsDrawer.stories.tsx +54 -0
  37. package/src/components/ExpertsDrawer/ExpertsDrawer.test.tsx +53 -0
  38. package/src/components/ExpertsDrawer/ExpertsDrawer.tsx +70 -0
  39. package/src/components/ExpertsDrawer/__snapshots__/ExpertsDrawer.test.tsx.snap +11 -0
  40. package/src/components/Header/Header.css +4 -0
  41. package/src/components/Header/Header.stories.tsx +39 -0
  42. package/src/components/Header/Header.test.tsx +58 -0
  43. package/src/components/Header/Header.tsx +14 -0
  44. package/src/components/Header/__snapshots__/Header.test.tsx.snap +171 -0
  45. package/src/components/KnownFacts/KnownFacts.tsx +14 -8
  46. package/src/components/MemoriWidget/MemoriWidget.tsx +14 -0
  47. package/src/components/StartPanel/StartPanel.css +5 -0
  48. package/src/index.stories.tsx +32 -1
  49. package/src/locales/en.json +3 -0
  50. package/src/locales/it.json +3 -0
  51. package/src/mocks/data.ts +14 -0
  52. package/src/styles.css +1 -0
@@ -0,0 +1,53 @@
1
+ import { render } from '@testing-library/react';
2
+ import ExpertsDrawer from './ExpertsDrawer';
3
+ import React from 'react';
4
+ import { tenant, expertReference } from '../../mocks/data';
5
+
6
+ beforeEach(() => {
7
+ // @ts-ignore
8
+ window.IntersectionObserver = jest.fn(() => ({
9
+ observe: jest.fn(),
10
+ unobserve: jest.fn(),
11
+ disconnect: jest.fn(),
12
+ takeRecords: jest.fn(),
13
+ }));
14
+ });
15
+
16
+ it('renders ExpertsDrawer unchanged', () => {
17
+ const { container } = render(
18
+ <ExpertsDrawer
19
+ onClose={jest.fn()}
20
+ baseUrl="https://app.twincreator.com"
21
+ apiUrl="https://backend.memori.ai"
22
+ tenant={tenant}
23
+ experts={[
24
+ expertReference,
25
+ {
26
+ ...expertReference,
27
+ expertID: '2',
28
+ },
29
+ ]}
30
+ />
31
+ );
32
+ expect(container).toMatchSnapshot();
33
+ });
34
+
35
+ it('renders ExpertsDrawer open unchanged', () => {
36
+ const { container } = render(
37
+ <ExpertsDrawer
38
+ open
39
+ onClose={jest.fn()}
40
+ baseUrl="https://app.twincreator.com"
41
+ apiUrl="https://backend.memori.ai"
42
+ tenant={tenant}
43
+ experts={[
44
+ expertReference,
45
+ {
46
+ ...expertReference,
47
+ expertID: '2',
48
+ },
49
+ ]}
50
+ />
51
+ );
52
+ expect(container).toMatchSnapshot();
53
+ });
@@ -0,0 +1,70 @@
1
+ import {
2
+ ExpertReference,
3
+ Tenant,
4
+ } from '@memori.ai/memori-api-client/dist/types';
5
+ import Drawer from '../ui/Drawer';
6
+ import { useTranslation } from 'react-i18next';
7
+ import { getResourceUrl } from '../../helpers/media';
8
+
9
+ export interface Props {
10
+ experts: ExpertReference[];
11
+ baseUrl: string;
12
+ apiUrl: string;
13
+ tenant?: Tenant;
14
+ open?: boolean;
15
+ onClose: () => void;
16
+ }
17
+
18
+ const ExpertsDrawer = ({
19
+ open = false,
20
+ baseUrl,
21
+ apiUrl,
22
+ tenant,
23
+ experts,
24
+ onClose,
25
+ }: Props) => {
26
+ const { t } = useTranslation();
27
+
28
+ return (
29
+ <Drawer
30
+ open={open}
31
+ onClose={onClose}
32
+ className="memori--experts-drawer"
33
+ title={
34
+ <h2 className="memori--experts-drawer--title">
35
+ {t('widget.expertsInTheBoard')}
36
+ </h2>
37
+ }
38
+ >
39
+ <ul className="memori--experts-drawer--list">
40
+ {experts.map(expert => (
41
+ <li key={expert.expertID} className="memori--experts-drawer--item">
42
+ <figure className="memori--experts-drawer--avatar">
43
+ <img
44
+ src={`${apiUrl}/api/v1/memoriai/memori/avatar/${expert.expertMemoriID}`}
45
+ alt={expert.name}
46
+ onError={e => {
47
+ e.currentTarget.src = getResourceUrl({
48
+ tenantID: tenant?.id,
49
+ type: 'avatar',
50
+ baseURL: baseUrl,
51
+ });
52
+
53
+ e.currentTarget.onerror = null;
54
+ }}
55
+ />
56
+ </figure>
57
+ <div className="memori--experts-drawer--content">
58
+ <h3 className="memori--experts-drawer--name">{expert.name}</h3>
59
+ <p className="memori--experts-drawer--description">
60
+ {expert.description}
61
+ </p>
62
+ </div>
63
+ </li>
64
+ ))}
65
+ </ul>
66
+ </Drawer>
67
+ );
68
+ };
69
+
70
+ export default ExpertsDrawer;
@@ -0,0 +1,11 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`renders ExpertsDrawer open unchanged 1`] = `
4
+ <div>
5
+ <div
6
+ style="position: fixed; top: 1px; left: 1px; width: 1px; height: 0px; padding: 0px; margin: -1px; overflow: hidden; clip: rect(0px, 0px, 0px, 0px); white-space: nowrap; border-width: 0px; display: none;"
7
+ />
8
+ </div>
9
+ `;
10
+
11
+ exports[`renders ExpertsDrawer unchanged 1`] = `<div />`;
@@ -43,6 +43,10 @@
43
43
  line-height: 1;
44
44
  }
45
45
 
46
+ .memori-header--button.memori-header--button--experts svg {
47
+ fill: #fff;
48
+ }
49
+
46
50
  .memori-header--position {
47
51
  display: inline-block;
48
52
  }
@@ -28,6 +28,7 @@ const Template: Story<Props> = args => {
28
28
  const [speakerMuted, setSpeakerMuted] = React.useState(args.speakerMuted);
29
29
  const [showSettingsDrawer, setShowSettingsDrawer] = React.useState(false);
30
30
  const [showKnownFactsDrawer, setShowKnownFactsDrawer] = React.useState(false);
31
+ const [showExpertsDrawer, setShowExpertsDrawer] = React.useState(false);
31
32
  const [continuousSpeech, setContinuousSpeech] = React.useState(true);
32
33
  const [continuousSpeechTimeout, setContinuousSpeechTimeout] =
33
34
  React.useState(2);
@@ -41,6 +42,7 @@ const Template: Story<Props> = args => {
41
42
  showSettings
42
43
  setShowSettingsDrawer={() => setShowSettingsDrawer(true)}
43
44
  setShowKnownFactsDrawer={() => setShowKnownFactsDrawer(true)}
45
+ setShowExpertsDrawer={() => setShowExpertsDrawer(true)}
44
46
  />
45
47
  <SettingsDrawer
46
48
  open={!!showSettingsDrawer}
@@ -194,3 +196,40 @@ WithDeepThoughtEnabledAndOngoingChat.args = {
194
196
  sessionID: '1234',
195
197
  loginToken: 'abcd',
196
198
  };
199
+
200
+ export const ForBoardOfExperts = Template.bind({});
201
+ ForBoardOfExperts.args = {
202
+ memori: {
203
+ ...memori,
204
+ enableBoardOfExperts: true,
205
+ },
206
+ history,
207
+ setShowPositionDrawer: () => {},
208
+ setShowSettingsDrawer: () => {},
209
+ showExperts: true,
210
+ clearHistory: () => {},
211
+ speakerMuted: false,
212
+ hasUserActivatedSpeak: false,
213
+ showShare: false,
214
+ showSettings: false,
215
+ loginToken: 'abcd',
216
+ };
217
+
218
+ export const ForBoardOfExpertsAndOngoingChat = Template.bind({});
219
+ ForBoardOfExpertsAndOngoingChat.args = {
220
+ memori: {
221
+ ...memori,
222
+ enableBoardOfExperts: true,
223
+ },
224
+ history,
225
+ setShowPositionDrawer: () => {},
226
+ setShowSettingsDrawer: () => {},
227
+ showExperts: true,
228
+ clearHistory: () => {},
229
+ speakerMuted: false,
230
+ hasUserActivatedSpeak: true,
231
+ showShare: false,
232
+ showSettings: false,
233
+ sessionID: '1234',
234
+ loginToken: 'abcd',
235
+ };
@@ -11,6 +11,7 @@ it('renders Header unchanged', () => {
11
11
  setShowPositionDrawer={jest.fn()}
12
12
  setShowSettingsDrawer={jest.fn()}
13
13
  setShowKnownFactsDrawer={jest.fn()}
14
+ setShowExpertsDrawer={jest.fn()}
14
15
  speakerMuted={false}
15
16
  setSpeakerMuted={jest.fn()}
16
17
  hasUserActivatedSpeak={false}
@@ -38,6 +39,7 @@ it('renders Header with position unchanged', () => {
38
39
  setShowPositionDrawer={jest.fn()}
39
40
  setShowSettingsDrawer={jest.fn()}
40
41
  setShowKnownFactsDrawer={jest.fn()}
42
+ setShowExpertsDrawer={jest.fn()}
41
43
  speakerMuted={false}
42
44
  setSpeakerMuted={jest.fn()}
43
45
  hasUserActivatedSpeak={false}
@@ -57,6 +59,7 @@ it('renders Header with speaker muted unchanged', () => {
57
59
  setShowPositionDrawer={jest.fn()}
58
60
  setShowSettingsDrawer={jest.fn()}
59
61
  setShowKnownFactsDrawer={jest.fn()}
62
+ setShowExpertsDrawer={jest.fn()}
60
63
  speakerMuted={true}
61
64
  setSpeakerMuted={jest.fn()}
62
65
  hasUserActivatedSpeak={false}
@@ -76,6 +79,7 @@ it('renders Header with share button unchanged', () => {
76
79
  setShowPositionDrawer={jest.fn()}
77
80
  setShowSettingsDrawer={jest.fn()}
78
81
  setShowKnownFactsDrawer={jest.fn()}
82
+ setShowExpertsDrawer={jest.fn()}
79
83
  speakerMuted={false}
80
84
  setSpeakerMuted={jest.fn()}
81
85
  hasUserActivatedSpeak={false}
@@ -95,6 +99,7 @@ it('renders Header with settings button unchanged', () => {
95
99
  setShowPositionDrawer={jest.fn()}
96
100
  setShowSettingsDrawer={jest.fn()}
97
101
  setShowKnownFactsDrawer={jest.fn()}
102
+ setShowExpertsDrawer={jest.fn()}
98
103
  speakerMuted={false}
99
104
  setSpeakerMuted={jest.fn()}
100
105
  hasUserActivatedSpeak={false}
@@ -114,6 +119,7 @@ it('renders Header with clear button unchanged', () => {
114
119
  setShowPositionDrawer={jest.fn()}
115
120
  setShowSettingsDrawer={jest.fn()}
116
121
  setShowKnownFactsDrawer={jest.fn()}
122
+ setShowExpertsDrawer={jest.fn()}
117
123
  speakerMuted={false}
118
124
  setSpeakerMuted={jest.fn()}
119
125
  hasUserActivatedSpeak={false}
@@ -134,6 +140,7 @@ it('renders Header with user activated speak unchanged', () => {
134
140
  setShowPositionDrawer={jest.fn()}
135
141
  setShowSettingsDrawer={jest.fn()}
136
142
  setShowKnownFactsDrawer={jest.fn()}
143
+ setShowExpertsDrawer={jest.fn()}
137
144
  speakerMuted={false}
138
145
  setSpeakerMuted={jest.fn()}
139
146
  hasUserActivatedSpeak={true}
@@ -156,6 +163,7 @@ it('renders Header with deep thought unchanged', () => {
156
163
  setShowPositionDrawer={jest.fn()}
157
164
  setShowSettingsDrawer={jest.fn()}
158
165
  setShowKnownFactsDrawer={jest.fn()}
166
+ setShowExpertsDrawer={jest.fn()}
159
167
  speakerMuted={false}
160
168
  setSpeakerMuted={jest.fn()}
161
169
  hasUserActivatedSpeak={false}
@@ -179,6 +187,56 @@ it('renders Header with deep thought and session open unchanged', () => {
179
187
  setShowPositionDrawer={jest.fn()}
180
188
  setShowSettingsDrawer={jest.fn()}
181
189
  setShowKnownFactsDrawer={jest.fn()}
190
+ setShowExpertsDrawer={jest.fn()}
191
+ speakerMuted={false}
192
+ setSpeakerMuted={jest.fn()}
193
+ hasUserActivatedSpeak={true}
194
+ showShare={false}
195
+ showSettings={false}
196
+ clearHistory={jest.fn()}
197
+ sessionID="1234"
198
+ loginToken="abcd"
199
+ />
200
+ );
201
+ expect(container).toMatchSnapshot();
202
+ });
203
+
204
+ it('renders Header for board of experts unchanged', () => {
205
+ const { container } = render(
206
+ <Header
207
+ memori={{
208
+ ...memori,
209
+ enableBoardOfExperts: true,
210
+ }}
211
+ history={history}
212
+ setShowPositionDrawer={jest.fn()}
213
+ setShowSettingsDrawer={jest.fn()}
214
+ setShowKnownFactsDrawer={jest.fn()}
215
+ setShowExpertsDrawer={jest.fn()}
216
+ speakerMuted={false}
217
+ setSpeakerMuted={jest.fn()}
218
+ hasUserActivatedSpeak={false}
219
+ showShare={false}
220
+ showSettings={false}
221
+ clearHistory={jest.fn()}
222
+ loginToken="abcd"
223
+ />
224
+ );
225
+ expect(container).toMatchSnapshot();
226
+ });
227
+
228
+ it('renders Header for board of experts with session open unchanged', () => {
229
+ const { container } = render(
230
+ <Header
231
+ memori={{
232
+ ...memori,
233
+ enableBoardOfExperts: true,
234
+ }}
235
+ history={history}
236
+ setShowPositionDrawer={jest.fn()}
237
+ setShowSettingsDrawer={jest.fn()}
238
+ setShowKnownFactsDrawer={jest.fn()}
239
+ setShowExpertsDrawer={jest.fn()}
182
240
  speakerMuted={false}
183
241
  setSpeakerMuted={jest.fn()}
184
242
  hasUserActivatedSpeak={true}
@@ -19,6 +19,7 @@ import Fullscreen from '../icons/Fullscreen';
19
19
  import Refresh from '../icons/Refresh';
20
20
  import Clear from '../icons/Clear';
21
21
  import DeepThought from '../icons/DeepThought';
22
+ import Group from '../icons/Group';
22
23
 
23
24
  export interface Props {
24
25
  className?: string;
@@ -29,6 +30,7 @@ export interface Props {
29
30
  setShowPositionDrawer: (show: boolean) => void;
30
31
  setShowSettingsDrawer: (show: boolean) => void;
31
32
  setShowKnownFactsDrawer: (show: boolean) => void;
33
+ setShowExpertsDrawer: (show: boolean) => void;
32
34
  speakerMuted: boolean;
33
35
  setSpeakerMuted: (mute: boolean) => void;
34
36
  hasUserActivatedSpeak?: boolean;
@@ -51,6 +53,7 @@ const Header: React.FC<Props> = ({
51
53
  setShowPositionDrawer,
52
54
  setShowSettingsDrawer,
53
55
  setShowKnownFactsDrawer,
56
+ setShowExpertsDrawer,
54
57
  speakerMuted,
55
58
  setSpeakerMuted,
56
59
  hasUserActivatedSpeak = false,
@@ -142,6 +145,17 @@ const Header: React.FC<Props> = ({
142
145
  title={t('knownFacts.title') || 'Known facts'}
143
146
  />
144
147
  )}
148
+ {memori.enableBoardOfExperts && (
149
+ <Button
150
+ primary
151
+ shape="circle"
152
+ icon={<Group />}
153
+ className="memori-header--button memori-header--button--experts"
154
+ disabled={!hasUserActivatedSpeak || !sessionID}
155
+ onClick={() => setShowExpertsDrawer(true)}
156
+ title={t('widget.showExpertsInTheBoard') || 'Experts in this board'}
157
+ />
158
+ )}
145
159
  {showSpeaker && (
146
160
  <Button
147
161
  primary
@@ -1,5 +1,176 @@
1
1
  // Jest Snapshot v1, https://goo.gl/fbAQLP
2
2
 
3
+ exports[`renders Header for board of experts unchanged 1`] = `
4
+ <div>
5
+ <div
6
+ class="memori-header"
7
+ >
8
+ <button
9
+ class="memori-button memori-button--primary memori-button--circle memori-button--padded memori-button--icon-only memori-header--button memori-header--button--experts"
10
+ disabled=""
11
+ title="widget.showExpertsInTheBoard"
12
+ >
13
+ <span
14
+ class="memori-button--icon"
15
+ >
16
+ <svg
17
+ aria-hidden="true"
18
+ fill="none"
19
+ focusable="false"
20
+ height="16"
21
+ role="img"
22
+ stroke="currentColor"
23
+ stroke-linecap="round"
24
+ stroke-linejoin="round"
25
+ stroke-width="2"
26
+ viewBox="0 0 640 512"
27
+ width="20"
28
+ xmlns="http://www.w3.org/2000/svg"
29
+ >
30
+ <path
31
+ d="M211.2 96a64 64 0 10-128 0 64 64 0 10128 0zM32 256c0 17.7 14.3 32 32 32h85.6c10.1-39.4 38.6-71.5 75.8-86.6-9.7-6-21.2-9.4-33.4-9.4H96c-35.3 0-64 28.7-64 64zm461.6 32H576c17.7 0 32-14.3 32-32 0-35.3-28.7-64-64-64h-96c-11.7 0-22.7 3.1-32.1 8.6 38.1 14.8 67.4 47.3 77.7 87.4zm-102.4-61.6c-6.9-1.6-14.2-2.4-21.6-2.4h-96c-8.5 0-16.7 1.1-24.5 3.1-30.8 8.1-55.6 31.1-66.1 60.9-3.5 10-5.5 20.8-5.5 32 0 17.7 14.3 32 32 32h224c17.7 0 32-14.3 32-32 0-11.2-1.9-22-5.5-32-10.8-30.7-36.8-54.2-68.9-61.6zM563.2 96a64 64 0 10-128 0 64 64 0 10128 0zm-241.6 96a80 80 0 100-160 80 80 0 100 160zM32 416c-17.7 0-32 14.3-32 32s14.3 32 32 32h576c17.7 0 32-14.3 32-32s-14.3-32-32-32H32z"
32
+ />
33
+ </svg>
34
+ </span>
35
+ </button>
36
+ <button
37
+ class="memori-button memori-button--primary memori-button--circle memori-button--padded memori-button--icon-only memori-header--button memori-header--button--speaker"
38
+ title="widget.sound"
39
+ >
40
+ <span
41
+ class="memori-button--icon"
42
+ >
43
+ <svg
44
+ aria-hidden="true"
45
+ focusable="false"
46
+ role="img"
47
+ viewBox="0 0 1024 1024"
48
+ xmlns="http://www.w3.org/2000/svg"
49
+ >
50
+ <path
51
+ d="M625.9 115c-5.9 0-11.9 1.6-17.4 5.3L254 352H90c-8.8 0-16 7.2-16 16v288c0 8.8 7.2 16 16 16h164l354.5 231.7c5.5 3.6 11.6 5.3 17.4 5.3 16.7 0 32.1-13.3 32.1-32.1V147.1c0-18.8-15.4-32.1-32.1-32.1zM586 803L293.4 611.7l-18-11.7H146V424h129.4l17.9-11.7L586 221v582zm348-327H806c-8.8 0-16 7.2-16 16v40c0 8.8 7.2 16 16 16h128c8.8 0 16-7.2 16-16v-40c0-8.8-7.2-16-16-16zm-41.9 261.8l-110.3-63.7a15.9 15.9 0 00-21.7 5.9l-19.9 34.5c-4.4 7.6-1.8 17.4 5.8 21.8L856.3 800a15.9 15.9 0 0021.7-5.9l19.9-34.5c4.4-7.6 1.7-17.4-5.8-21.8zM760 344a15.9 15.9 0 0021.7 5.9L892 286.2c7.6-4.4 10.2-14.2 5.8-21.8L878 230a15.9 15.9 0 00-21.7-5.9L746 287.8a15.99 15.99 0 00-5.8 21.8L760 344z"
52
+ />
53
+ </svg>
54
+ </span>
55
+ </button>
56
+ <div
57
+ class="memori-export-history-button memori-header--button memori-header--button--export"
58
+ data-headlessui-state=""
59
+ title="write_and_speak.exportChatHistoryMessage"
60
+ >
61
+ <button
62
+ class="memori-button memori-button--circle memori-button--icon-only memori-button--disabled"
63
+ data-headlessui-state=""
64
+ disabled=""
65
+ id="headlessui-popover-button-:r1f:"
66
+ type="button"
67
+ >
68
+ <div
69
+ class="memori-button--icon"
70
+ >
71
+ <svg
72
+ aria-hidden="true"
73
+ focusable="false"
74
+ role="img"
75
+ viewBox="0 0 1024 1024"
76
+ xmlns="http://www.w3.org/2000/svg"
77
+ >
78
+ <path
79
+ d="M464 512a48 48 0 1096 0 48 48 0 10-96 0zm200 0a48 48 0 1096 0 48 48 0 10-96 0zm-400 0a48 48 0 1096 0 48 48 0 10-96 0zm661.2-173.6c-22.6-53.7-55-101.9-96.3-143.3a444.35 444.35 0 00-143.3-96.3C630.6 75.7 572.2 64 512 64h-2c-60.6.3-119.3 12.3-174.5 35.9a445.35 445.35 0 00-142 96.5c-40.9 41.3-73 89.3-95.2 142.8-23 55.4-34.6 114.3-34.3 174.9A449.4 449.4 0 00112 714v152a46 46 0 0046 46h152.1A449.4 449.4 0 00510 960h2.1c59.9 0 118-11.6 172.7-34.3a444.48 444.48 0 00142.8-95.2c41.3-40.9 73.8-88.7 96.5-142 23.6-55.2 35.6-113.9 35.9-174.5.3-60.9-11.5-120-34.8-175.6zm-151.1 438C704 845.8 611 884 512 884h-1.7c-60.3-.3-120.2-15.3-173.1-43.5l-8.4-4.5H188V695.2l-4.5-8.4C155.3 633.9 140.3 574 140 513.7c-.4-99.7 37.7-193.3 107.6-263.8 69.8-70.5 163.1-109.5 262.8-109.9h1.7c50 0 98.5 9.7 144.2 28.9 44.6 18.7 84.6 45.6 119 80 34.3 34.3 61.3 74.4 80 119 19.4 46.2 29.1 95.2 28.9 145.8-.6 99.6-39.7 192.9-110.1 262.7z"
80
+ />
81
+ </svg>
82
+ </div>
83
+ </button>
84
+ </div>
85
+ </div>
86
+ </div>
87
+ `;
88
+
89
+ exports[`renders Header for board of experts with session open unchanged 1`] = `
90
+ <div>
91
+ <div
92
+ class="memori-header"
93
+ >
94
+ <button
95
+ class="memori-button memori-button--primary memori-button--circle memori-button--padded memori-button--icon-only memori-header--button memori-header--button--experts"
96
+ title="widget.showExpertsInTheBoard"
97
+ >
98
+ <span
99
+ class="memori-button--icon"
100
+ >
101
+ <svg
102
+ aria-hidden="true"
103
+ fill="none"
104
+ focusable="false"
105
+ height="16"
106
+ role="img"
107
+ stroke="currentColor"
108
+ stroke-linecap="round"
109
+ stroke-linejoin="round"
110
+ stroke-width="2"
111
+ viewBox="0 0 640 512"
112
+ width="20"
113
+ xmlns="http://www.w3.org/2000/svg"
114
+ >
115
+ <path
116
+ d="M211.2 96a64 64 0 10-128 0 64 64 0 10128 0zM32 256c0 17.7 14.3 32 32 32h85.6c10.1-39.4 38.6-71.5 75.8-86.6-9.7-6-21.2-9.4-33.4-9.4H96c-35.3 0-64 28.7-64 64zm461.6 32H576c17.7 0 32-14.3 32-32 0-35.3-28.7-64-64-64h-96c-11.7 0-22.7 3.1-32.1 8.6 38.1 14.8 67.4 47.3 77.7 87.4zm-102.4-61.6c-6.9-1.6-14.2-2.4-21.6-2.4h-96c-8.5 0-16.7 1.1-24.5 3.1-30.8 8.1-55.6 31.1-66.1 60.9-3.5 10-5.5 20.8-5.5 32 0 17.7 14.3 32 32 32h224c17.7 0 32-14.3 32-32 0-11.2-1.9-22-5.5-32-10.8-30.7-36.8-54.2-68.9-61.6zM563.2 96a64 64 0 10-128 0 64 64 0 10128 0zm-241.6 96a80 80 0 100-160 80 80 0 100 160zM32 416c-17.7 0-32 14.3-32 32s14.3 32 32 32h576c17.7 0 32-14.3 32-32s-14.3-32-32-32H32z"
117
+ />
118
+ </svg>
119
+ </span>
120
+ </button>
121
+ <button
122
+ class="memori-button memori-button--primary memori-button--circle memori-button--padded memori-button--icon-only memori-header--button memori-header--button--speaker"
123
+ title="widget.sound"
124
+ >
125
+ <span
126
+ class="memori-button--icon"
127
+ >
128
+ <svg
129
+ aria-hidden="true"
130
+ focusable="false"
131
+ role="img"
132
+ viewBox="0 0 1024 1024"
133
+ xmlns="http://www.w3.org/2000/svg"
134
+ >
135
+ <path
136
+ d="M625.9 115c-5.9 0-11.9 1.6-17.4 5.3L254 352H90c-8.8 0-16 7.2-16 16v288c0 8.8 7.2 16 16 16h164l354.5 231.7c5.5 3.6 11.6 5.3 17.4 5.3 16.7 0 32.1-13.3 32.1-32.1V147.1c0-18.8-15.4-32.1-32.1-32.1zM586 803L293.4 611.7l-18-11.7H146V424h129.4l17.9-11.7L586 221v582zm348-327H806c-8.8 0-16 7.2-16 16v40c0 8.8 7.2 16 16 16h128c8.8 0 16-7.2 16-16v-40c0-8.8-7.2-16-16-16zm-41.9 261.8l-110.3-63.7a15.9 15.9 0 00-21.7 5.9l-19.9 34.5c-4.4 7.6-1.8 17.4 5.8 21.8L856.3 800a15.9 15.9 0 0021.7-5.9l19.9-34.5c4.4-7.6 1.7-17.4-5.8-21.8zM760 344a15.9 15.9 0 0021.7 5.9L892 286.2c7.6-4.4 10.2-14.2 5.8-21.8L878 230a15.9 15.9 0 00-21.7-5.9L746 287.8a15.99 15.99 0 00-5.8 21.8L760 344z"
137
+ />
138
+ </svg>
139
+ </span>
140
+ </button>
141
+ <div
142
+ class="memori-export-history-button memori-header--button memori-header--button--export"
143
+ data-headlessui-state=""
144
+ title="write_and_speak.exportChatHistoryMessage"
145
+ >
146
+ <button
147
+ aria-expanded="false"
148
+ class="memori-button memori-button--circle memori-button--icon-only memori-button--primary"
149
+ data-headlessui-state=""
150
+ id="headlessui-popover-button-:r1k:"
151
+ type="button"
152
+ >
153
+ <div
154
+ class="memori-button--icon"
155
+ >
156
+ <svg
157
+ aria-hidden="true"
158
+ focusable="false"
159
+ role="img"
160
+ viewBox="0 0 1024 1024"
161
+ xmlns="http://www.w3.org/2000/svg"
162
+ >
163
+ <path
164
+ d="M464 512a48 48 0 1096 0 48 48 0 10-96 0zm200 0a48 48 0 1096 0 48 48 0 10-96 0zm-400 0a48 48 0 1096 0 48 48 0 10-96 0zm661.2-173.6c-22.6-53.7-55-101.9-96.3-143.3a444.35 444.35 0 00-143.3-96.3C630.6 75.7 572.2 64 512 64h-2c-60.6.3-119.3 12.3-174.5 35.9a445.35 445.35 0 00-142 96.5c-40.9 41.3-73 89.3-95.2 142.8-23 55.4-34.6 114.3-34.3 174.9A449.4 449.4 0 00112 714v152a46 46 0 0046 46h152.1A449.4 449.4 0 00510 960h2.1c59.9 0 118-11.6 172.7-34.3a444.48 444.48 0 00142.8-95.2c41.3-40.9 73.8-88.7 96.5-142 23.6-55.2 35.6-113.9 35.9-174.5.3-60.9-11.5-120-34.8-175.6zm-151.1 438C704 845.8 611 884 512 884h-1.7c-60.3-.3-120.2-15.3-173.1-43.5l-8.4-4.5H188V695.2l-4.5-8.4C155.3 633.9 140.3 574 140 513.7c-.4-99.7 37.7-193.3 107.6-263.8 69.8-70.5 163.1-109.5 262.8-109.9h1.7c50 0 98.5 9.7 144.2 28.9 44.6 18.7 84.6 45.6 119 80 34.3 34.3 61.3 74.4 80 119 19.4 46.2 29.1 95.2 28.9 145.8-.6 99.6-39.7 192.9-110.1 262.7z"
165
+ />
166
+ </svg>
167
+ </div>
168
+ </button>
169
+ </div>
170
+ </div>
171
+ </div>
172
+ `;
173
+
3
174
  exports[`renders Header unchanged 1`] = `
4
175
  <div>
5
176
  <div
@@ -267,17 +267,19 @@ const KnownFacts = ({
267
267
  <div className="memori--table--pagination--pages">
268
268
  <Button
269
269
  shape="circle"
270
- disabled={pageIndex === 0}
270
+ disabled={pageIndex === 0 || pageIndex < numberOfResults}
271
271
  padded={false}
272
272
  title={t('previous') || 'Previous'}
273
273
  icon={<ChevronLeft />}
274
274
  onClick={() => {
275
- setPageIndex(pageIndex - 1);
276
- fetchKnownFacts(undefined, pageIndex - 1, numberOfResults);
275
+ let from =
276
+ (pageIndex / numberOfResults - 1) * numberOfResults;
277
+ setPageIndex(from);
278
+ fetchKnownFacts(undefined, from, numberOfResults);
277
279
  }}
278
280
  />
279
281
  <span className="memori--table--pagination--pages--current">
280
- {pageIndex + 1} /{' '}
282
+ {Math.ceil(pageIndex / numberOfResults) + 1} /{' '}
281
283
  {Math.ceil(knownFactsCount / numberOfResults)}
282
284
  </span>
283
285
  <Button
@@ -286,11 +288,14 @@ const KnownFacts = ({
286
288
  title={t('next') || 'Next'}
287
289
  icon={<ChevronRight />}
288
290
  disabled={
289
- (pageIndex + 1) * numberOfResults >= knownFactsCount
291
+ (pageIndex / numberOfResults + 1) * numberOfResults >=
292
+ knownFactsCount
290
293
  }
291
294
  onClick={() => {
292
- setPageIndex(pageIndex + 1);
293
- fetchKnownFacts(undefined, 1, numberOfResults);
295
+ let from =
296
+ (pageIndex / numberOfResults + 1) * numberOfResults;
297
+ setPageIndex(from);
298
+ fetchKnownFacts(undefined, from, numberOfResults);
294
299
  }}
295
300
  />
296
301
  </div>
@@ -306,7 +311,8 @@ const KnownFacts = ({
306
311
  displayValue={`${numberOfResults} / ${t('page') || 'page'}`}
307
312
  onChange={value => {
308
313
  setNumberOfResults(value);
309
- fetchKnownFacts(undefined, undefined, value);
314
+ setPageIndex(0);
315
+ fetchKnownFacts(undefined, 0, value);
310
316
  }}
311
317
  />
312
318
  </nav>
@@ -52,6 +52,7 @@ import PoweredBy from '../PoweredBy/PoweredBy';
52
52
  import AgeVerificationModal from '../AgeVerificationModal/AgeVerificationModal';
53
53
  import SettingsDrawer from '../SettingsDrawer/SettingsDrawer';
54
54
  import KnownFacts from '../KnownFacts/KnownFacts';
55
+ import ExpertsDrawer from '../ExpertsDrawer/ExpertsDrawer';
55
56
 
56
57
  // Layout
57
58
  import FullPageLayout from '../layouts/FullPage';
@@ -455,6 +456,7 @@ const MemoriWidget = ({
455
456
  const [showPositionDrawer, setShowPositionDrawer] = useState(false);
456
457
  const [showSettingsDrawer, setShowSettingsDrawer] = useState(false);
457
458
  const [showKnownFactsDrawer, setShowKnownFactsDrawer] = useState(false);
459
+ const [showExpertsDrawer, setShowExpertsDrawer] = useState(false);
458
460
  const [muteSpeaker, setMuteSpeaker] = useState(false);
459
461
  const [continuousSpeech, setContinuousSpeech] = useState(false);
460
462
  const [continuousSpeechTimeout, setContinuousSpeechTimeout] = useState(2);
@@ -2595,6 +2597,7 @@ const MemoriWidget = ({
2595
2597
  setShowPositionDrawer,
2596
2598
  setShowSettingsDrawer,
2597
2599
  setShowKnownFactsDrawer,
2600
+ setShowExpertsDrawer,
2598
2601
  showSpeaker: !!AZURE_COGNITIVE_SERVICES_TTS_KEY,
2599
2602
  speakerMuted: muteSpeaker || speakerMuted,
2600
2603
  setSpeakerMuted: mute => {
@@ -2920,6 +2923,17 @@ const MemoriWidget = ({
2920
2923
  closeDrawer={() => setShowKnownFactsDrawer(false)}
2921
2924
  />
2922
2925
  )}
2926
+
2927
+ {showExpertsDrawer && !!experts && (
2928
+ <ExpertsDrawer
2929
+ apiUrl={apiUrl}
2930
+ baseUrl={baseUrl}
2931
+ tenant={tenant}
2932
+ experts={experts}
2933
+ open={showExpertsDrawer}
2934
+ onClose={() => setShowExpertsDrawer(false)}
2935
+ />
2936
+ )}
2923
2937
  </div>
2924
2938
  );
2925
2939
  };
@@ -214,4 +214,9 @@
214
214
  padding: 5px;
215
215
  border: 1px solid #666;
216
216
  border-radius: 50%;
217
+ }
218
+
219
+ .memori--deep-thought-disclaimer a {
220
+ color: inherit;
221
+ text-decoration: underline;
217
222
  }