cozy-search 0.26.2 → 0.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist/components/Assistant/AssistantAvatar.js +10 -6
  2. package/dist/components/Assistant/AssistantContainer.js +3 -3
  3. package/dist/components/Assistant/AssistantSelection.js +19 -12
  4. package/dist/components/Assistant/AssistantSelectionItem.js +2 -2
  5. package/dist/components/Assistant/styles.styl +11 -7
  6. package/dist/components/Containers/styles.styl +4 -4
  7. package/dist/components/Conversations/Conversation.js +39 -5
  8. package/dist/components/Conversations/ConversationActions.js +2 -2
  9. package/dist/components/Conversations/ConversationBar.d.ts +1 -6
  10. package/dist/components/Conversations/ConversationBar.js +16 -67
  11. package/dist/components/Conversations/ConversationComposer.js +76 -11
  12. package/dist/components/Conversations/ConversationList.d.ts +3 -2
  13. package/dist/components/Conversations/ConversationListItem.d.ts +4 -3
  14. package/dist/components/Conversations/ConversationListItem.js +42 -21
  15. package/dist/components/Conversations/ConversationListItemWider.d.ts +4 -3
  16. package/dist/components/Conversations/ConversationListItemWider.js +19 -7
  17. package/dist/components/Conversations/Sources/Sources.js +1 -2
  18. package/dist/components/Conversations/WebsearchButton.js +16 -17
  19. package/dist/components/Conversations/styles.styl +73 -17
  20. package/dist/components/Search/SearchBarMobile.js +10 -1
  21. package/dist/components/Search/SearchConversation.js +37 -46
  22. package/dist/components/Search/helpers.d.ts +6 -1
  23. package/dist/components/Search/helpers.js +48 -19
  24. package/dist/components/Search/helpers.spec.js +19 -19
  25. package/dist/components/Search/styles.styl +2 -3
  26. package/dist/components/Sidebar/index.js +18 -9
  27. package/dist/components/Sidebar/styles.styl +17 -0
  28. package/dist/components/TwakeKnowledges/ChatKnowledge.js +1 -0
  29. package/dist/components/TwakeKnowledges/DriveKnowledge.js +1 -0
  30. package/dist/components/TwakeKnowledges/MailKnowledge.js +1 -0
  31. package/dist/components/TwakeKnowledges/TwakeKnowledgePanel.js +1 -0
  32. package/dist/components/TwakeKnowledges/TwakeKnowledgeSelector.d.ts +2 -1
  33. package/dist/components/TwakeKnowledges/TwakeKnowledgeSelector.js +18 -16
  34. package/dist/components/TwakeKnowledges/styles.styl +8 -0
  35. package/dist/components/Views/DeleteAssistantDialog.js +29 -11
  36. package/dist/components/helpers.js +2 -1
  37. package/dist/components/helpers.spec.js +22 -0
  38. package/dist/hooks/useConversation.js +27 -16
  39. package/dist/locales/en.json +3 -3
  40. package/dist/locales/fr.json +3 -3
  41. package/dist/locales/index.js +12 -12
  42. package/dist/locales/ru.json +3 -3
  43. package/dist/locales/vi.json +3 -3
  44. package/dist/stylesheet.css +102 -27
  45. package/package.json +5 -5
@@ -13,12 +13,12 @@ var _classnames = _interopRequireDefault(require("classnames"));
13
13
 
14
14
  var _react = _interopRequireDefault(require("react"));
15
15
 
16
+ var _Divider = _interopRequireDefault(require("cozy-ui/transpiled/react/Divider"));
17
+
16
18
  var _ListItem = _interopRequireDefault(require("cozy-ui/transpiled/react/ListItem"));
17
19
 
18
20
  var _ListItemText = _interopRequireDefault(require("cozy-ui/transpiled/react/ListItemText"));
19
21
 
20
- var _Typography = _interopRequireDefault(require("cozy-ui/transpiled/react/Typography"));
21
-
22
22
  var _CozyTheme = require("cozy-ui-plus/dist/providers/CozyTheme");
23
23
 
24
24
  var _twakeI18n = require("twake-i18n");
@@ -30,8 +30,11 @@ var _AssistantAvatar = _interopRequireDefault(require("../Assistant/AssistantAva
30
30
  var _helpers = require("../helpers");
31
31
 
32
32
  var styles = {
33
+ "composerContainer": "styles__composerContainer___3bNfY",
34
+ "composerActions": "styles__composerActions___2xQEH",
33
35
  "conversationBar": "styles__conversationBar___2J-Us",
34
36
  "conversationBar--mobile": "styles__conversationBar--mobile___1jdg8",
37
+ "conversationViewport": "styles__conversationViewport___24jYX",
35
38
  "conversationBar-input": "styles__conversationBar-input___2DfdZ",
36
39
  "chatConversation": "styles__chatConversation___2EmkA",
37
40
  "conversationHeaderBar": "styles__conversationHeaderBar___C8tlD",
@@ -51,7 +54,13 @@ var styles = {
51
54
  "conversation-list-item": "styles__conversation-list-item___rQapI",
52
55
  "conversation-list-item-action": "styles__conversation-list-item-action___qiuKm",
53
56
  "conversation-list-item--selected--light": "styles__conversation-list-item--selected--light___3WvIn",
54
- "conversation-list-item--selected--dark": "styles__conversation-list-item--selected--dark___JDQlY"
57
+ "conversation-list-item--selected--dark": "styles__conversation-list-item--selected--dark___JDQlY",
58
+ "conversation-list-item--wider": "styles__conversation-list-item--wider___2Tl2c",
59
+ "conversation-list-item-divider": "styles__conversation-list-item-divider___2LOP1",
60
+ "conversation-list-item-text": "styles__conversation-list-item-text___31VBM",
61
+ "conversation-list-item-title": "styles__conversation-list-item-title___3je_6",
62
+ "conversation-list-item-meta": "styles__conversation-list-item-meta___3Zk-r",
63
+ "conversation-list-item-subtitle": "styles__conversation-list-item-subtitle___3e_h0"
55
64
  };
56
65
 
57
66
  var ConversationListItem = function ConversationListItem(_ref) {
@@ -73,29 +82,41 @@ var ConversationListItem = function ConversationListItem(_ref) {
73
82
  onClick: function onClick() {
74
83
  return onOpenConversation(conversation._id);
75
84
  },
76
- className: (0, _classnames.default)('u-bdrs-4 u-ov-hidden u-mb-half', styles['conversation-list-item'], (0, _defineProperty2.default)({}, styles["conversation-list-item--selected--".concat(theme)], selected)),
85
+ className: (0, _classnames.default)('u-ov-hidden u-flex-column', styles['conversation-list-item'], (0, _defineProperty2.default)({}, styles["conversation-list-item--selected--".concat(theme)], selected)),
77
86
  selected: selected
78
- }, /*#__PURE__*/_react.default.createElement(_ListItemText.default, {
79
- primary: /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_Typography.default, {
80
- variant: "h6",
81
- className: "u-ellipsis"
82
- }, (0, _helpers.getNameOfConversation)(conversation)), /*#__PURE__*/_react.default.createElement(_ConversationActions.default, {
83
- buttonClassName: (0, _classnames.default)(styles['conversation-list-item-action']),
84
- conversation: conversation
85
- })),
86
- secondary: /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_Typography.default, {
87
- variant: "h6",
88
- className: "u-db u-ellipsis u-mb-half u-coolGrey"
89
- }, (0, _helpers.getDescriptionOfConversation)(conversation)), /*#__PURE__*/_react.default.createElement(_Typography.default, {
90
- variant: "h6",
91
- className: "u-flex u-flex-items-center u-coolGrey"
87
+ }, /*#__PURE__*/_react.default.createElement(_ConversationActions.default, {
88
+ buttonClassName: styles['conversation-list-item-action'],
89
+ conversation: conversation
90
+ }), /*#__PURE__*/_react.default.createElement(_ListItemText.default, {
91
+ className: "u-m-0",
92
+ primaryTypographyProps: {
93
+ component: 'div',
94
+ className: styles['conversation-list-item-text']
95
+ },
96
+ secondaryTypographyProps: {
97
+ component: 'div',
98
+ className: styles['conversation-list-item-text']
99
+ },
100
+ primary: /*#__PURE__*/_react.default.createElement("span", {
101
+ className: (0, _classnames.default)('u-ellipsis u-db', styles['conversation-list-item-title'])
102
+ }, (0, _helpers.getNameOfConversation)(conversation)),
103
+ secondary: /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("span", {
104
+ className: (0, _classnames.default)('u-db u-ellipsis', styles['conversation-list-item-subtitle'])
105
+ }, (0, _helpers.getDescriptionOfConversation)(conversation)), /*#__PURE__*/_react.default.createElement("span", {
106
+ className: (0, _classnames.default)('u-flex u-flex-items-center', styles['conversation-list-item-subtitle'], styles['conversation-list-item-meta'])
92
107
  }, /*#__PURE__*/_react.default.createElement(_AssistantAvatar.default, {
93
108
  assistant: conversation.assistant,
94
- className: "u-mr-half",
95
109
  isSmall: true
96
110
  }), (0, _helpers.formatConversationDate)((_conversation$cozyMet = conversation.cozyMetadata) === null || _conversation$cozyMet === void 0 ? void 0 : _conversation$cozyMet.updatedAt, t, lang)))
111
+ }), /*#__PURE__*/_react.default.createElement(_Divider.default, {
112
+ className: styles['conversation-list-item-divider']
97
113
  }));
98
- };
114
+ }; // Memoized so a re-render of the conversation list only re-renders items
115
+ // whose props actually changed (typically just the previously- and
116
+ // newly-selected items). This avoids rebuilding every item's ActionsMenu
117
+ // popover on each conversation switch.
118
+
119
+
120
+ var _default = /*#__PURE__*/_react.default.memo(ConversationListItem);
99
121
 
100
- var _default = ConversationListItem;
101
122
  exports.default = _default;
@@ -1,8 +1,9 @@
1
- export default ConversationListItemWider;
2
- declare function ConversationListItemWider({ conversation, selected, divider, disableAction, onOpenConversation }: {
1
+ declare const _default: React.MemoExoticComponent<({ conversation, selected, divider, disableAction, onOpenConversation }: {
3
2
  conversation: any;
4
3
  selected: any;
5
4
  divider: any;
6
5
  disableAction: any;
7
6
  onOpenConversation: any;
8
- }): JSX.Element;
7
+ }) => JSX.Element>;
8
+ export default _default;
9
+ import React from 'react';
@@ -32,8 +32,11 @@ var _AssistantAvatar = _interopRequireDefault(require("../Assistant/AssistantAva
32
32
  var _helpers = require("../helpers");
33
33
 
34
34
  var styles = {
35
+ "composerContainer": "styles__composerContainer___3bNfY",
36
+ "composerActions": "styles__composerActions___2xQEH",
35
37
  "conversationBar": "styles__conversationBar___2J-Us",
36
38
  "conversationBar--mobile": "styles__conversationBar--mobile___1jdg8",
39
+ "conversationViewport": "styles__conversationViewport___24jYX",
37
40
  "conversationBar-input": "styles__conversationBar-input___2DfdZ",
38
41
  "chatConversation": "styles__chatConversation___2EmkA",
39
42
  "conversationHeaderBar": "styles__conversationHeaderBar___C8tlD",
@@ -53,7 +56,13 @@ var styles = {
53
56
  "conversation-list-item": "styles__conversation-list-item___rQapI",
54
57
  "conversation-list-item-action": "styles__conversation-list-item-action___qiuKm",
55
58
  "conversation-list-item--selected--light": "styles__conversation-list-item--selected--light___3WvIn",
56
- "conversation-list-item--selected--dark": "styles__conversation-list-item--selected--dark___JDQlY"
59
+ "conversation-list-item--selected--dark": "styles__conversation-list-item--selected--dark___JDQlY",
60
+ "conversation-list-item--wider": "styles__conversation-list-item--wider___2Tl2c",
61
+ "conversation-list-item-divider": "styles__conversation-list-item-divider___2LOP1",
62
+ "conversation-list-item-text": "styles__conversation-list-item-text___31VBM",
63
+ "conversation-list-item-title": "styles__conversation-list-item-title___3je_6",
64
+ "conversation-list-item-meta": "styles__conversation-list-item-meta___3Zk-r",
65
+ "conversation-list-item-subtitle": "styles__conversation-list-item-subtitle___3e_h0"
57
66
  };
58
67
 
59
68
  var ConversationListItemWider = function ConversationListItemWider(_ref) {
@@ -78,13 +87,13 @@ var ConversationListItemWider = function ConversationListItemWider(_ref) {
78
87
  onClick: function onClick() {
79
88
  return onOpenConversation(conversation._id);
80
89
  },
81
- className: (0, _classnames.default)('u-bdrs-0 u-ov-hidden u-flex u-flex-items-center u-flex-justify-between u-w-100', styles['conversation-list-item'], (0, _defineProperty2.default)({}, styles["conversation-list-item--selected--".concat(theme)], selected)),
90
+ className: (0, _classnames.default)('u-bdrs-0 u-ov-hidden u-flex u-flex-items-center u-flex-justify-between u-w-100', styles['conversation-list-item'], styles['conversation-list-item--wider'], (0, _defineProperty2.default)({}, styles["conversation-list-item--selected--".concat(theme)], selected)),
82
91
  selected: selected
83
92
  }, /*#__PURE__*/_react.default.createElement(_ListItemIcon.default, null, /*#__PURE__*/_react.default.createElement(_AssistantAvatar.default, {
84
93
  assistant: conversation.assistant,
85
- className: "u-mr-half",
86
- isSmall: true
94
+ className: "u-mr-half u-w-1 u-h-1"
87
95
  })), /*#__PURE__*/_react.default.createElement(_ListItemText.default, {
96
+ className: "u-pr-1",
88
97
  primary: /*#__PURE__*/_react.default.createElement("div", {
89
98
  className: "u-flex u-flex-items-center"
90
99
  }, /*#__PURE__*/_react.default.createElement(_Typography.default, {
@@ -99,9 +108,12 @@ var ConversationListItemWider = function ConversationListItemWider(_ref) {
99
108
  className: "u-coolGrey"
100
109
  }, (0, _helpers.getDescriptionOfConversation)(conversation))
101
110
  }), /*#__PURE__*/_react.default.createElement(_Typography.default, {
102
- className: "u-miw-4 u-fz-xsmall u-ta-right"
111
+ className: "u-miw-4 u-fz-xsmall u-ta-right u-dn-s"
103
112
  }, (0, _helpers.formatConversationDate)((_conversation$cozyMet = conversation.cozyMetadata) === null || _conversation$cozyMet === void 0 ? void 0 : _conversation$cozyMet.updatedAt, t, lang)));
104
- };
113
+ }; // Memoized for the same reason as ConversationListItem: skip re-rendering
114
+ // list items whose props are unchanged on a conversation switch.
115
+
116
+
117
+ var _default = /*#__PURE__*/_react.default.memo(ConversationListItemWider);
105
118
 
106
- var _default = ConversationListItemWider;
107
119
  exports.default = _default;
@@ -96,8 +96,7 @@ var Sources = function Sources(_ref) {
96
96
  }, [showSources]);
97
97
  return /*#__PURE__*/_react.default.createElement(_Box.default, {
98
98
  ref: ref,
99
- className: "u-mt-1-half",
100
- pl: "44px"
99
+ className: "u-mt-1-half"
101
100
  }, /*#__PURE__*/_react.default.createElement(_Chips.default, {
102
101
  className: "u-mb-1",
103
102
  icon: /*#__PURE__*/_react.default.createElement(_Icon.default, {
@@ -15,9 +15,7 @@ var _Buttons = _interopRequireDefault(require("cozy-ui/transpiled/react/Buttons"
15
15
 
16
16
  var _Icon = _interopRequireDefault(require("cozy-ui/transpiled/react/Icon"));
17
17
 
18
- var _IconButton = _interopRequireDefault(require("cozy-ui/transpiled/react/IconButton"));
19
-
20
- var _Globe = _interopRequireDefault(require("cozy-ui/transpiled/react/Icons/Globe"));
18
+ var _Planet = _interopRequireDefault(require("cozy-ui/transpiled/react/Icons/Planet"));
21
19
 
22
20
  var _twakeI18n = require("twake-i18n");
23
21
 
@@ -32,25 +30,26 @@ var WebsearchButton = function WebsearchButton(_ref) {
32
30
  return null;
33
31
  }
34
32
 
35
- return /*#__PURE__*/_react.default.createElement(_IconButton.default, {
36
- className: "u-p-0 u-mr-half",
37
- "aria-pressed": websearchEnabled,
38
- "aria-label": t('assistant.websearch.label'),
39
- title: t('assistant.websearch.label'),
40
- onClick: onToggleWebsearch
41
- }, /*#__PURE__*/_react.default.createElement(_Buttons.default, {
33
+ return /*#__PURE__*/_react.default.createElement(_Buttons.default, {
42
34
  size: "small",
43
- component: "div",
44
- className: "u-miw-auto u-w-2 u-h-2 u-bdrs-circle",
35
+ variant: websearchEnabled ? 'primary' : 'text',
36
+ className: "u-miw-auto u-w-2 u-h-2 u-bdrs-circle u-flex-shrink-0 u-mr-half",
45
37
  classes: {
46
38
  label: 'u-flex u-w-auto'
47
39
  },
48
- disabled: !websearchEnabled,
40
+ style: websearchEnabled ? undefined : {
41
+ boxShadow: 'inset 0 0 0 1px var(--secondaryTextColor)'
42
+ },
43
+ "aria-pressed": websearchEnabled,
44
+ "aria-label": t('assistant.websearch.label'),
45
+ title: t('assistant.websearch.label'),
49
46
  label: /*#__PURE__*/_react.default.createElement(_Icon.default, {
50
- icon: _Globe.default,
51
- size: 12
52
- })
53
- }));
47
+ icon: _Planet.default,
48
+ size: 12,
49
+ color: websearchEnabled ? undefined : 'var(--secondaryTextColor)'
50
+ }),
51
+ onClick: onToggleWebsearch
52
+ });
54
53
  };
55
54
 
56
55
  var _default = WebsearchButton;
@@ -1,18 +1,43 @@
1
1
  @require 'settings/breakpoints.styl'
2
2
 
3
+ .composerContainer
4
+ position relative
5
+ border 1px solid var(--borderMainColor)
6
+ border-radius 20px
7
+ padding 8px 8px 8px 16px
8
+ background-color var(--paperBackgroundColor)
9
+ z-index calc(var(--zIndex-modal) + 15)
10
+
11
+ .composerActions
12
+ margin-top 16px
13
+ gap 8px
14
+
3
15
  .conversationBar
16
+ flex 1
17
+ min-width 0
4
18
  max-height 95px
5
- min-height 48px
6
- z-index calc(var(--zIndex-modal) + 15)
19
+ min-height 32px
20
+ background-color transparent !important
21
+ border 0 !important
7
22
 
8
23
  +gt-mobile()
9
24
  max-height 178px
10
25
 
11
26
  &--mobile
12
- border 0
13
27
  background-color transparent !important
14
28
  border-color transparent !important
15
29
 
30
+ .conversationViewport
31
+ +mobile()
32
+ // Indent the message column past the absolutely-positioned
33
+ // sidebar toggle button (top-left of the screen when the sidebar
34
+ // is closed) so text never overlaps the icon — even when the
35
+ // conversation is scrolled. The menu button's right edge sits at
36
+ // ~48px (8px header padding + 40px button), so we leave a small
37
+ // buffer beyond that.
38
+ padding-left 56px
39
+ padding-right 16px
40
+
16
41
 
17
42
  .conversationBar-input
18
43
  max-height 80px
@@ -83,22 +108,53 @@
83
108
  hyphens auto
84
109
 
85
110
  .conversation-list-item
86
- &:hover
87
- .conversation-list-item-action
88
- display block !important
89
- &:focus-within
90
- .conversation-list-item-action
91
- display block !important
92
-
93
- .conversation-list-item-action
94
- display none !important
95
- position absolute
96
- top 6px
97
- right 12px
111
+ padding 8px !important
112
+ border-radius 8px !important
113
+ align-items stretch !important
114
+
115
+ &:hover .conversation-list-item-action,
116
+ &:focus-within .conversation-list-item-action
117
+ opacity 1
118
+ pointer-events auto
98
119
 
99
120
  &--selected
100
121
  &--light
101
- background var(--grey100) !important
102
-
122
+ background var(--primaryColorLightest) !important
103
123
  &--dark
104
124
  background var(--grey900) !important
125
+
126
+ &--wider
127
+ align-items center !important
128
+
129
+ .conversation-list-item-divider
130
+ // Counteract the item's 8px padding so the divider spans the full
131
+ // width and sits flush with the bottom edge of the selected highlight.
132
+ margin 8px -8px -8px -8px !important
133
+
134
+ .conversation-list-item-action
135
+ position absolute !important
136
+ top 8px
137
+ right 8px
138
+ opacity 0
139
+ pointer-events none
140
+
141
+ .conversation-list-item-text
142
+ line-height 16px
143
+ overflow hidden
144
+ margin-right 28px !important
145
+
146
+ .conversation-list-item-title
147
+ color var(--primaryTextColor)
148
+ font-size 14px
149
+ font-weight 500
150
+ line-height 16px
151
+ letter-spacing 0.5px
152
+
153
+ .conversation-list-item-meta
154
+ gap 4px
155
+
156
+ .conversation-list-item-subtitle
157
+ color var(--secondaryTextColor)
158
+ font-size 11px
159
+ font-weight 400
160
+ line-height 16px
@@ -12,8 +12,11 @@ var _react = _interopRequireDefault(require("react"));
12
12
  var _SearchBar = _interopRequireDefault(require("cozy-ui/transpiled/react/SearchBar"));
13
13
 
14
14
  var styles = {
15
+ "composerContainer": "styles__composerContainer___3bNfY",
16
+ "composerActions": "styles__composerActions___2xQEH",
15
17
  "conversationBar": "styles__conversationBar___2J-Us",
16
18
  "conversationBar--mobile": "styles__conversationBar--mobile___1jdg8",
19
+ "conversationViewport": "styles__conversationViewport___24jYX",
17
20
  "conversationBar-input": "styles__conversationBar-input___2DfdZ",
18
21
  "chatConversation": "styles__chatConversation___2EmkA",
19
22
  "conversationHeaderBar": "styles__conversationHeaderBar___C8tlD",
@@ -33,7 +36,13 @@ var styles = {
33
36
  "conversation-list-item": "styles__conversation-list-item___rQapI",
34
37
  "conversation-list-item-action": "styles__conversation-list-item-action___qiuKm",
35
38
  "conversation-list-item--selected--light": "styles__conversation-list-item--selected--light___3WvIn",
36
- "conversation-list-item--selected--dark": "styles__conversation-list-item--selected--dark___JDQlY"
39
+ "conversation-list-item--selected--dark": "styles__conversation-list-item--selected--dark___JDQlY",
40
+ "conversation-list-item--wider": "styles__conversation-list-item--wider___2Tl2c",
41
+ "conversation-list-item-divider": "styles__conversation-list-item-divider___2LOP1",
42
+ "conversation-list-item-text": "styles__conversation-list-item-text___31VBM",
43
+ "conversation-list-item-title": "styles__conversation-list-item-title___3je_6",
44
+ "conversation-list-item-meta": "styles__conversation-list-item-meta___3Zk-r",
45
+ "conversation-list-item-subtitle": "styles__conversation-list-item-subtitle___3e_h0"
37
46
  };
38
47
 
39
48
  var SearchBarMobile = function SearchBarMobile(_ref) {
@@ -9,6 +9,8 @@ exports.default = void 0;
9
9
 
10
10
  var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
11
11
 
12
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
13
+
12
14
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
13
15
 
14
16
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
@@ -25,8 +27,6 @@ var _Buttons = _interopRequireDefault(require("cozy-ui/transpiled/react/Buttons"
25
27
 
26
28
  var _Dialog = _interopRequireDefault(require("cozy-ui/transpiled/react/Dialog"));
27
29
 
28
- var _Divider = _interopRequireDefault(require("cozy-ui/transpiled/react/Divider"));
29
-
30
30
  var _Icon = _interopRequireDefault(require("cozy-ui/transpiled/react/Icon"));
31
31
 
32
32
  var _IconButton = _interopRequireDefault(require("cozy-ui/transpiled/react/IconButton"));
@@ -83,10 +83,11 @@ var SearchConversationContainer = function SearchConversationContainer(_ref) {
83
83
  };
84
84
 
85
85
  var SearchConversation = function SearchConversation() {
86
- var _groupedConversations, _groupedConversations2;
86
+ var _cx;
87
87
 
88
88
  var _useI18n = (0, _twakeI18n.useI18n)(),
89
- t = _useI18n.t;
89
+ t = _useI18n.t,
90
+ lang = _useI18n.lang;
90
91
 
91
92
  var _useBreakpoints = (0, _Breakpoints.useBreakpoints)(),
92
93
  isMobile = _useBreakpoints.isMobile;
@@ -170,78 +171,68 @@ var SearchConversation = function SearchConversation() {
170
171
  isMobile: isMobile
171
172
  }, /*#__PURE__*/_react.default.createElement("div", {
172
173
  className: (0, _classnames.default)('u-h-100 u-flex u-flex-column u-flex-items-start u-ov-hidden', {
173
- 'u-w-7 u-mh-half': !isMobile
174
+ 'u-w-7 u-mh-half': !isMobile,
175
+ 'u-w-100': isMobile
174
176
  })
175
177
  }, /*#__PURE__*/_react.default.createElement("div", {
176
- className: (0, _classnames.default)('u-w-100', {
177
- 'u-mv-2': !isMobile
178
+ className: (0, _classnames.default)('u-w-100 u-bxz', {
179
+ 'u-mv-2': !isMobile,
180
+ 'u-p-1': isMobile
178
181
  })
179
182
  }, /*#__PURE__*/_react.default.createElement("div", {
180
- className: "u-flex u-flex-items-center"
183
+ className: "u-flex u-flex-items-center u-w-100"
181
184
  }, /*#__PURE__*/_react.default.createElement(_SearchBar.default, {
182
- elevation: isMobile ? 0 : 1,
185
+ elevation: 1,
183
186
  disabledHover: !!isMobile,
184
- disabledClear: !!isMobile,
185
- className: (0, _classnames.default)('u-w-100', styles['search-bar--mobile'], {
186
- 'u-mb-2': !isMobile
187
- }),
187
+ className: (0, _classnames.default)('u-flex-auto u-miw-0', (_cx = {}, (0, _defineProperty2.default)(_cx, styles['search-bar--mobile'], isMobile), (0, _defineProperty2.default)(_cx, 'u-mb-2', !isMobile), _cx)),
188
188
  placeholder: t('assistant.search_conversation.placeholder'),
189
- size: isMobile ? 'small' : 'medium',
189
+ size: "medium",
190
190
  value: searchStr,
191
191
  onChange: handleSearchChange
192
192
  }), isMobile && /*#__PURE__*/_react.default.createElement(_IconButton.default, {
193
193
  size: "small",
194
+ className: "u-ml-half u-flex-shrink-0",
194
195
  onClick: function onClick() {
195
196
  return setIsOpenSearchConversation(false);
196
197
  },
197
198
  "aria-label": t('assistant.search_conversation.close')
198
199
  }, /*#__PURE__*/_react.default.createElement(_Icon.default, {
199
200
  icon: _Cross.default
200
- }))), isMobile && /*#__PURE__*/_react.default.createElement(_Divider.default, {
201
- className: "u-mb-half"
202
- }), /*#__PURE__*/_react.default.createElement(_Buttons.default, {
201
+ }))), /*#__PURE__*/_react.default.createElement(_Buttons.default, {
203
202
  label: t('assistant.search_conversation.new_chat'),
204
203
  variant: "secondary",
205
- color: "secondary",
206
204
  startIcon: /*#__PURE__*/_react.default.createElement(_Icon.default, {
207
205
  icon: _Plus.default
208
206
  }),
209
207
  onClick: createNewConversation,
210
208
  size: "large",
211
- className: "u-ml-half-t u-bdrs-6"
209
+ className: (0, _classnames.default)({
210
+ 'u-ml-half-t u-bdrs-6': !isMobile,
211
+ 'u-mt-1 u-bdrs-7 u-bdw-1': isMobile
212
+ })
212
213
  })), /*#__PURE__*/_react.default.createElement("div", {
213
214
  className: "u-ov-auto u-flex-auto u-w-100 u-pos-relative"
214
215
  }, isLoading ? /*#__PURE__*/_react.default.createElement("div", {
215
216
  className: "u-flex u-flex-items-center u-flex-justify-center u-p-2"
216
217
  }, /*#__PURE__*/_react.default.createElement(_Spinner.default, {
217
218
  size: "xxlarge"
218
- })) : searchStr ? /*#__PURE__*/_react.default.createElement(_ConversationList.default, {
219
- divider: true,
220
- disableAction: true,
221
- conversations: conversations,
222
- onOpenConversation: goToConversation,
223
- ItemComponent: _ConversationListItemWider.default
224
- }) : /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, ((_groupedConversations = groupedConversations.today) === null || _groupedConversations === void 0 ? void 0 : _groupedConversations.length) > 0 && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_Typography.default, {
225
- variant: "subtitle1",
226
- color: "textSecondary",
227
- className: "u-mb-half u-ml-half-t"
228
- }, t('assistant.search_conversation.recent')), /*#__PURE__*/_react.default.createElement(_ConversationList.default, {
229
- divider: true,
230
- disableAction: true,
231
- conversations: groupedConversations.today,
232
- onOpenConversation: goToConversation,
233
- ItemComponent: _ConversationListItemWider.default
234
- })), ((_groupedConversations2 = groupedConversations.older) === null || _groupedConversations2 === void 0 ? void 0 : _groupedConversations2.length) > 0 && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_Typography.default, {
235
- variant: "subtitle1",
236
- color: "textSecondary",
237
- className: "u-mt-1 u-mb-half u-ml-half-t"
238
- }, t('assistant.search_conversation.older')), /*#__PURE__*/_react.default.createElement(_ConversationList.default, {
239
- divider: true,
240
- disableAction: true,
241
- conversations: groupedConversations.older,
242
- onOpenConversation: goToConversation,
243
- ItemComponent: _ConversationListItemWider.default
244
- }))), !isLoading && (conversations === null || conversations === void 0 ? void 0 : conversations.length) === 0 && /*#__PURE__*/_react.default.createElement(_NotFoundConversation.default, null))));
219
+ })) : groupedConversations.map(function (group, index) {
220
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, {
221
+ key: group.dayTimestamp
222
+ }, /*#__PURE__*/_react.default.createElement(_Typography.default, {
223
+ variant: "subtitle1",
224
+ color: "textSecondary",
225
+ className: (0, _classnames.default)('u-mb-half u-ml-1 u-ml-half-t', {
226
+ 'u-mt-1': index > 0
227
+ })
228
+ }, group.key === 'today' ? t('assistant.search_conversation.recent') : group.key === 'yesterday' ? t('assistant.time.yesterday') : (0, _helpers.formatDayLabel)(group.dayTimestamp, lang)), /*#__PURE__*/_react.default.createElement(_ConversationList.default, {
229
+ divider: true,
230
+ disableAction: true,
231
+ conversations: group.items,
232
+ onOpenConversation: goToConversation,
233
+ ItemComponent: _ConversationListItemWider.default
234
+ }));
235
+ }), !isLoading && (conversations === null || conversations === void 0 ? void 0 : conversations.length) === 0 && /*#__PURE__*/_react.default.createElement(_NotFoundConversation.default, null))));
245
236
  };
246
237
 
247
238
  var _default = SearchConversation;
@@ -1 +1,6 @@
1
- export function groupConversationsByDate(conversations: any[]): Object;
1
+ export function formatDayLabel(timestamp: any, lang: any): string;
2
+ export function groupConversationsByDate(conversations: any[]): Array<{
3
+ key: string;
4
+ dayTimestamp: number;
5
+ items: any[];
6
+ }>;
@@ -1,39 +1,68 @@
1
1
  "use strict";
2
2
 
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
3
5
  Object.defineProperty(exports, "__esModule", {
4
6
  value: true
5
7
  });
6
- exports.groupConversationsByDate = void 0;
8
+ exports.groupConversationsByDate = exports.formatDayLabel = void 0;
9
+
10
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
11
+
12
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
7
13
 
14
+ var startOfDay = function startOfDay(date) {
15
+ return new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime();
16
+ };
17
+
18
+ var formatDayLabel = function formatDayLabel(timestamp, lang) {
19
+ return new Date(timestamp).toLocaleDateString(lang, {
20
+ day: 'numeric',
21
+ month: 'long',
22
+ year: 'numeric'
23
+ });
24
+ };
8
25
  /**
9
- * Groups conversations into 'today' and 'older' based on their updatedAt date.
26
+ * Groups conversations by calendar day based on their updatedAt date.
27
+ * Returns an ordered array of buckets so today appears first, then yesterday,
28
+ * then each earlier day descending.
10
29
  *
11
30
  * @param {Array} conversations - The list of conversations to group.
12
- * @returns {Object} An object with 'today' and 'older' arrays of conversations.
31
+ * @returns {Array<{ key: string, dayTimestamp: number, items: Array }>}
13
32
  */
33
+
34
+
35
+ exports.formatDayLabel = formatDayLabel;
36
+
14
37
  var groupConversationsByDate = function groupConversationsByDate(conversations) {
15
- if (!conversations) return {
16
- today: [],
17
- older: []
18
- };
19
- var groups = {
20
- today: [],
21
- older: []
22
- };
38
+ if (!conversations || conversations.length === 0) return [];
23
39
  var now = new Date();
24
- var today = new Date(now.getFullYear(), now.getMonth(), now.getDate()).getTime();
40
+ var todayTs = startOfDay(now);
41
+ var yesterdayTs = todayTs - 86400000;
42
+ var buckets = new Map();
25
43
  conversations.forEach(function (conv) {
26
44
  var _conv$cozyMetadata;
27
45
 
28
- var date = new Date(((_conv$cozyMetadata = conv.cozyMetadata) === null || _conv$cozyMetadata === void 0 ? void 0 : _conv$cozyMetadata.updatedAt) || Date.now()).getTime();
46
+ var raw = ((_conv$cozyMetadata = conv.cozyMetadata) === null || _conv$cozyMetadata === void 0 ? void 0 : _conv$cozyMetadata.updatedAt) || Date.now();
47
+ var dayTs = startOfDay(new Date(raw));
48
+ if (!buckets.has(dayTs)) buckets.set(dayTs, []);
49
+ buckets.get(dayTs).push(conv);
50
+ });
51
+ return (0, _toConsumableArray2.default)(buckets.entries()).sort(function (a, b) {
52
+ return b[0] - a[0];
53
+ }).map(function (_ref) {
54
+ var _ref2 = (0, _slicedToArray2.default)(_ref, 2),
55
+ dayTimestamp = _ref2[0],
56
+ items = _ref2[1];
29
57
 
30
- if (date >= today) {
31
- groups.today.push(conv);
32
- } else {
33
- groups.older.push(conv);
34
- }
58
+ var key;
59
+ if (dayTimestamp === todayTs) key = 'today';else if (dayTimestamp === yesterdayTs) key = 'yesterday';else key = 'date';
60
+ return {
61
+ key: key,
62
+ dayTimestamp: dayTimestamp,
63
+ items: items
64
+ };
35
65
  });
36
- return groups;
37
66
  };
38
67
 
39
68
  exports.groupConversationsByDate = groupConversationsByDate;