cozy-search 0.1.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.
- package/LICENSE +21 -0
- package/README.md +89 -0
- package/dist/components/AssistantDesktop.d.ts +16 -0
- package/dist/components/AssistantDesktop.js +44 -0
- package/dist/components/AssistantIcon/AssistantIcon.d.ts +6 -0
- package/dist/components/AssistantIcon/AssistantIcon.js +43 -0
- package/dist/components/AssistantMobile.d.ts +2 -0
- package/dist/components/AssistantMobile.js +50 -0
- package/dist/components/AssistantProvider.d.ts +7 -0
- package/dist/components/AssistantProvider.js +174 -0
- package/dist/components/Conversations/ChatAssistantItem.d.ts +8 -0
- package/dist/components/Conversations/ChatAssistantItem.js +53 -0
- package/dist/components/Conversations/ChatConversation.d.ts +5 -0
- package/dist/components/Conversations/ChatConversation.js +110 -0
- package/dist/components/Conversations/ChatItem.d.ts +7 -0
- package/dist/components/Conversations/ChatItem.js +39 -0
- package/dist/components/Conversations/ChatItemLabel.d.ts +5 -0
- package/dist/components/Conversations/ChatItemLabel.js +29 -0
- package/dist/components/Conversations/ChatRealtimeAnswer.d.ts +5 -0
- package/dist/components/Conversations/ChatRealtimeAnswer.js +30 -0
- package/dist/components/Conversations/ChatUserItem.d.ts +7 -0
- package/dist/components/Conversations/ChatUserItem.js +41 -0
- package/dist/components/Conversations/Conversation.d.ts +4 -0
- package/dist/components/Conversations/Conversation.js +41 -0
- package/dist/components/Conversations/ConversationBar.d.ts +4 -0
- package/dist/components/Conversations/ConversationBar.js +164 -0
- package/dist/components/Conversations/Sources/Sources.d.ts +5 -0
- package/dist/components/Conversations/Sources/Sources.js +134 -0
- package/dist/components/Conversations/Sources/SourcesItem.d.ts +4 -0
- package/dist/components/Conversations/Sources/SourcesItem.js +55 -0
- package/dist/components/Conversations/Sources/styles.styl +5 -0
- package/dist/components/Conversations/styles.styl +15 -0
- package/dist/components/ResultMenu/NoResultItem.d.ts +2 -0
- package/dist/components/ResultMenu/NoResultItem.js +30 -0
- package/dist/components/ResultMenu/NotEnoughItem.d.ts +2 -0
- package/dist/components/ResultMenu/NotEnoughItem.js +30 -0
- package/dist/components/ResultMenu/ResultMenu.d.ts +6 -0
- package/dist/components/ResultMenu/ResultMenu.js +47 -0
- package/dist/components/ResultMenu/ResultMenuContent.d.ts +3 -0
- package/dist/components/ResultMenu/ResultMenuContent.js +117 -0
- package/dist/components/ResultMenu/ResultMenuItem.d.ts +12 -0
- package/dist/components/ResultMenu/ResultMenuItem.js +65 -0
- package/dist/components/ResultMenu/SuggestionItemTextHighlighted.d.ts +5 -0
- package/dist/components/ResultMenu/SuggestionItemTextHighlighted.js +100 -0
- package/dist/components/ResultMenu/SuggestionItemTextSecondary.d.ts +7 -0
- package/dist/components/ResultMenu/SuggestionItemTextSecondary.js +70 -0
- package/dist/components/ResultMenu/styles.styl +8 -0
- package/dist/components/Search/EncryptedFolderIcon.d.ts +2 -0
- package/dist/components/Search/EncryptedFolderIcon.js +34 -0
- package/dist/components/Search/SearchBar.d.ts +4 -0
- package/dist/components/Search/SearchBar.js +71 -0
- package/dist/components/Search/SearchBarDesktop.d.ts +15 -0
- package/dist/components/Search/SearchBarDesktop.js +167 -0
- package/dist/components/Search/SearchBarMobile.d.ts +6 -0
- package/dist/components/Search/SearchBarMobile.js +71 -0
- package/dist/components/Search/SearchProvider.d.ts +7 -0
- package/dist/components/Search/SearchProvider.js +81 -0
- package/dist/components/Search/SearchSubmitFab.d.ts +5 -0
- package/dist/components/Search/SearchSubmitFab.js +59 -0
- package/dist/components/Search/SuggestionsPlaceholder.d.ts +2 -0
- package/dist/components/Search/SuggestionsPlaceholder.js +55 -0
- package/dist/components/Search/getFileMimetype.d.ts +1 -0
- package/dist/components/Search/getFileMimetype.js +54 -0
- package/dist/components/Search/getIconForSearchResult.d.ts +12 -0
- package/dist/components/Search/getIconForSearchResult.js +127 -0
- package/dist/components/Search/styles.styl +7 -0
- package/dist/components/Search/useFetchResult.d.ts +4 -0
- package/dist/components/Search/useFetchResult.js +191 -0
- package/dist/components/Views/AssistantDialog.d.ts +2 -0
- package/dist/components/Views/AssistantDialog.js +79 -0
- package/dist/components/Views/SearchDialog.d.ts +2 -0
- package/dist/components/Views/SearchDialog.js +96 -0
- package/dist/components/helpers.d.ts +5 -0
- package/dist/components/helpers.js +58 -0
- package/dist/components/queries.d.ts +25 -0
- package/dist/components/queries.js +58 -0
- package/dist/components/styles.styl +18 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +39 -0
- package/dist/locales/en.json +21 -0
- package/dist/locales/fr.json +21 -0
- package/dist/locales/index.d.ts +6 -0
- package/dist/locales/index.js +53 -0
- package/dist/stylesheet.css +48 -0
- package/package.json +91 -0
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.default = void 0;
|
|
9
|
+
|
|
10
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
11
|
+
|
|
12
|
+
var _reactRouterDom = require("react-router-dom");
|
|
13
|
+
|
|
14
|
+
var _ClickAwayListener = _interopRequireDefault(require("cozy-ui/transpiled/react/ClickAwayListener"));
|
|
15
|
+
|
|
16
|
+
var _Icon = _interopRequireDefault(require("cozy-ui/transpiled/react/Icon"));
|
|
17
|
+
|
|
18
|
+
var _SearchBar = _interopRequireDefault(require("cozy-ui/transpiled/react/SearchBar"));
|
|
19
|
+
|
|
20
|
+
var _I18n = require("cozy-ui/transpiled/react/providers/I18n");
|
|
21
|
+
|
|
22
|
+
var _SearchProvider = require("./SearchProvider");
|
|
23
|
+
|
|
24
|
+
var _AssistantIcon = require("../AssistantIcon/AssistantIcon");
|
|
25
|
+
|
|
26
|
+
var _AssistantProvider = require("../AssistantProvider");
|
|
27
|
+
|
|
28
|
+
var _ResultMenu = _interopRequireDefault(require("../ResultMenu/ResultMenu"));
|
|
29
|
+
|
|
30
|
+
var _helpers = require("../helpers");
|
|
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
|
+
var styles = {
|
|
37
|
+
"searchBarDesktop--result": "styles__searchBarDesktop--result___2bQQy",
|
|
38
|
+
"suggestionsPlaceholder": "styles__suggestionsPlaceholder___y-vsv"
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
var SearchBarDesktop = function SearchBarDesktop(_ref) {
|
|
42
|
+
var value = _ref.value,
|
|
43
|
+
onClear = _ref.onClear,
|
|
44
|
+
onChange = _ref.onChange,
|
|
45
|
+
elevation = _ref.elevation,
|
|
46
|
+
size = _ref.size,
|
|
47
|
+
hasHalfBorderRadius = _ref.hasHalfBorderRadius;
|
|
48
|
+
|
|
49
|
+
var _useI18n = (0, _I18n.useI18n)(),
|
|
50
|
+
t = _useI18n.t;
|
|
51
|
+
|
|
52
|
+
var _useSearch = (0, _SearchProvider.useSearch)(),
|
|
53
|
+
searchValue = _useSearch.searchValue,
|
|
54
|
+
results = _useSearch.results,
|
|
55
|
+
selectedIndex = _useSearch.selectedIndex,
|
|
56
|
+
setSelectedIndex = _useSearch.setSelectedIndex;
|
|
57
|
+
|
|
58
|
+
var _useAssistant = (0, _AssistantProvider.useAssistant)(),
|
|
59
|
+
onAssistantExecute = _useAssistant.onAssistantExecute;
|
|
60
|
+
|
|
61
|
+
var navigate = (0, _reactRouterDom.useNavigate)();
|
|
62
|
+
var searchRef = (0, _react.useRef)();
|
|
63
|
+
var listRef = (0, _react.useRef)();
|
|
64
|
+
|
|
65
|
+
var handleClick = function handleClick() {
|
|
66
|
+
if (!(0, _helpers.isAssistantEnabled)()) return;
|
|
67
|
+
var conversationId = (0, _helpers.makeConversationId)();
|
|
68
|
+
onAssistantExecute({
|
|
69
|
+
value: value,
|
|
70
|
+
conversationId: conversationId
|
|
71
|
+
});
|
|
72
|
+
navigate("assistant/".concat(conversationId)); // setTimeout usefull to prevent the field from emptying before the route is changed
|
|
73
|
+
// works because the modal appears on top of the view that carries the input and not instead of it.
|
|
74
|
+
|
|
75
|
+
setTimeout(function () {
|
|
76
|
+
onClear();
|
|
77
|
+
}, 100);
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
var handleKeyDown = function handleKeyDown(ev) {
|
|
81
|
+
var _listRef$current;
|
|
82
|
+
|
|
83
|
+
var listElementCount = (_listRef$current = listRef.current) === null || _listRef$current === void 0 ? void 0 : _listRef$current.childElementCount;
|
|
84
|
+
|
|
85
|
+
if (ev.key === 'ArrowDown') {
|
|
86
|
+
ev.preventDefault();
|
|
87
|
+
|
|
88
|
+
if (selectedIndex === listElementCount - 1) {
|
|
89
|
+
setSelectedIndex(0);
|
|
90
|
+
} else {
|
|
91
|
+
setSelectedIndex(function (v) {
|
|
92
|
+
return v + 1;
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
if (ev.key === 'ArrowUp') {
|
|
98
|
+
ev.preventDefault();
|
|
99
|
+
|
|
100
|
+
if (selectedIndex === 0) {
|
|
101
|
+
setSelectedIndex(listElementCount - 1);
|
|
102
|
+
} else {
|
|
103
|
+
setSelectedIndex(function (v) {
|
|
104
|
+
return v - 1;
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
if (ev.key === 'Escape') {
|
|
110
|
+
ev.preventDefault();
|
|
111
|
+
onClear();
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
if (ev.key === 'Enter') {
|
|
115
|
+
ev.preventDefault();
|
|
116
|
+
|
|
117
|
+
if (selectedIndex) {
|
|
118
|
+
var _results;
|
|
119
|
+
|
|
120
|
+
var onClickFn = (results === null || results === void 0 ? void 0 : (_results = results[selectedIndex - 1]) === null || _results === void 0 ? void 0 : _results.onClick) || handleClick;
|
|
121
|
+
onClickFn();
|
|
122
|
+
} else if (value !== '') {
|
|
123
|
+
handleClick();
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
return /*#__PURE__*/_react.default.createElement(_ClickAwayListener.default, {
|
|
129
|
+
onClickAway: onClear
|
|
130
|
+
}, /*#__PURE__*/_react.default.createElement("span", null, /*#__PURE__*/_react.default.createElement(_SearchBar.default, {
|
|
131
|
+
elevation: elevation,
|
|
132
|
+
className: searchValue && hasHalfBorderRadius ? styles['searchBarDesktop--result'] : '',
|
|
133
|
+
ref: searchRef,
|
|
134
|
+
size: size,
|
|
135
|
+
icon: size === 'large' ? /*#__PURE__*/_react.default.createElement(_Icon.default, {
|
|
136
|
+
className: "u-mh-1",
|
|
137
|
+
icon: _AssistantIcon.AssistantIcon,
|
|
138
|
+
size: 32
|
|
139
|
+
}) : /*#__PURE__*/_react.default.createElement(_Icon.default, {
|
|
140
|
+
className: "u-ml-1 u-mr-half",
|
|
141
|
+
icon: _AssistantIcon.AssistantIcon,
|
|
142
|
+
size: 24
|
|
143
|
+
}),
|
|
144
|
+
placeholder: (0, _helpers.isAssistantEnabled)() ? t('assistant.search.placeholder') : undefined // fallback on SearchBar default
|
|
145
|
+
,
|
|
146
|
+
value: value,
|
|
147
|
+
componentsProps: {
|
|
148
|
+
inputBase: {
|
|
149
|
+
onKeyDown: handleKeyDown
|
|
150
|
+
}
|
|
151
|
+
},
|
|
152
|
+
disabledClear: true,
|
|
153
|
+
disabledFocus: value !== '',
|
|
154
|
+
onChange: onChange
|
|
155
|
+
}), searchValue && /*#__PURE__*/_react.default.createElement(_ResultMenu.default, {
|
|
156
|
+
listRef: listRef,
|
|
157
|
+
anchorRef: searchRef,
|
|
158
|
+
onClick: handleClick
|
|
159
|
+
})));
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
SearchBarDesktop.defaultProps = {
|
|
163
|
+
size: 'large',
|
|
164
|
+
elevation: false
|
|
165
|
+
};
|
|
166
|
+
var _default = SearchBarDesktop;
|
|
167
|
+
exports.default = _default;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.default = void 0;
|
|
9
|
+
|
|
10
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
11
|
+
|
|
12
|
+
var _SearchBar = _interopRequireDefault(require("cozy-ui/transpiled/react/SearchBar"));
|
|
13
|
+
|
|
14
|
+
var _useEventListener = _interopRequireDefault(require("cozy-ui/transpiled/react/hooks/useEventListener"));
|
|
15
|
+
|
|
16
|
+
var _SuggestionsPlaceholder = _interopRequireDefault(require("./SuggestionsPlaceholder"));
|
|
17
|
+
|
|
18
|
+
var _helpers = require("../helpers");
|
|
19
|
+
|
|
20
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
21
|
+
|
|
22
|
+
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; }
|
|
23
|
+
|
|
24
|
+
var styles = {
|
|
25
|
+
"conversationBar": "styles__conversationBar___2J-Us",
|
|
26
|
+
"conversationBar-input": "styles__conversationBar-input___2DfdZ"
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
var SearchBarMobile = function SearchBarMobile(_ref) {
|
|
30
|
+
var value = _ref.value,
|
|
31
|
+
onClear = _ref.onClear,
|
|
32
|
+
onChange = _ref.onChange;
|
|
33
|
+
var inputRef = (0, _react.useRef)(); // to adjust input height for multiline when typing in it
|
|
34
|
+
|
|
35
|
+
(0, _useEventListener.default)(inputRef.current, 'input', function () {
|
|
36
|
+
inputRef.current.style.height = 'auto'; // to resize input when emptying it
|
|
37
|
+
|
|
38
|
+
inputRef.current.style.height = "".concat(inputRef.current.scrollHeight, "px");
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
var handleClear = function handleClear() {
|
|
42
|
+
onClear();
|
|
43
|
+
inputRef.current.style.height = 'auto';
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
return /*#__PURE__*/_react.default.createElement(_SearchBar.default, {
|
|
47
|
+
className: styles['conversationBar'],
|
|
48
|
+
size: "auto",
|
|
49
|
+
icon: null,
|
|
50
|
+
placeholder: (0, _helpers.isAssistantEnabled)() ? ' ' : undefined // if assistant enabled, we set a blank space because we want only the SuggestionsPlaceholder below
|
|
51
|
+
,
|
|
52
|
+
value: value,
|
|
53
|
+
componentsProps: {
|
|
54
|
+
inputBase: {
|
|
55
|
+
inputProps: {
|
|
56
|
+
className: styles['conversationBar-input']
|
|
57
|
+
},
|
|
58
|
+
inputRef: inputRef,
|
|
59
|
+
autoFocus: true,
|
|
60
|
+
rows: 1,
|
|
61
|
+
multiline: true,
|
|
62
|
+
startAdornment: (0, _helpers.isAssistantEnabled)() && !value && /*#__PURE__*/_react.default.createElement(_SuggestionsPlaceholder.default, null)
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
onChange: onChange,
|
|
66
|
+
onClear: handleClear
|
|
67
|
+
});
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
var _default = SearchBarMobile;
|
|
71
|
+
exports.default = _default;
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.useSearch = exports.default = exports.SearchContext = void 0;
|
|
9
|
+
|
|
10
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
11
|
+
|
|
12
|
+
var _debounce = _interopRequireDefault(require("lodash/debounce"));
|
|
13
|
+
|
|
14
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
15
|
+
|
|
16
|
+
var _useFetchResult2 = require("./useFetchResult");
|
|
17
|
+
|
|
18
|
+
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); }
|
|
19
|
+
|
|
20
|
+
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; }
|
|
21
|
+
|
|
22
|
+
var SearchContext = /*#__PURE__*/_react.default.createContext();
|
|
23
|
+
|
|
24
|
+
exports.SearchContext = SearchContext;
|
|
25
|
+
|
|
26
|
+
var useSearch = function useSearch() {
|
|
27
|
+
var context = (0, _react.useContext)(SearchContext);
|
|
28
|
+
|
|
29
|
+
if (!context) {
|
|
30
|
+
throw new Error('useSearch must be used within a SearchProvider');
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
return context;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
exports.useSearch = useSearch;
|
|
37
|
+
|
|
38
|
+
var SearchProvider = function SearchProvider(_ref) {
|
|
39
|
+
var children = _ref.children;
|
|
40
|
+
|
|
41
|
+
var _useState = (0, _react.useState)(''),
|
|
42
|
+
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
|
|
43
|
+
searchValue = _useState2[0],
|
|
44
|
+
setSearchValue = _useState2[1];
|
|
45
|
+
|
|
46
|
+
var _useState3 = (0, _react.useState)(),
|
|
47
|
+
_useState4 = (0, _slicedToArray2.default)(_useState3, 2),
|
|
48
|
+
selectedIndex = _useState4[0],
|
|
49
|
+
setSelectedIndex = _useState4[1];
|
|
50
|
+
|
|
51
|
+
var _useFetchResult = (0, _useFetchResult2.useFetchResult)(searchValue),
|
|
52
|
+
isLoading = _useFetchResult.isLoading,
|
|
53
|
+
results = _useFetchResult.results;
|
|
54
|
+
|
|
55
|
+
var delayedSetSearchValue = (0, _react.useMemo)(function () {
|
|
56
|
+
return (0, _debounce.default)(setSearchValue, 250);
|
|
57
|
+
}, [setSearchValue]);
|
|
58
|
+
var clearSearch = (0, _react.useCallback)(function () {
|
|
59
|
+
setSearchValue('');
|
|
60
|
+
setSelectedIndex();
|
|
61
|
+
}, []);
|
|
62
|
+
var value = (0, _react.useMemo)(function () {
|
|
63
|
+
return {
|
|
64
|
+
searchValue: searchValue,
|
|
65
|
+
setSearchValue: setSearchValue,
|
|
66
|
+
delayedSetSearchValue: delayedSetSearchValue,
|
|
67
|
+
isLoading: isLoading,
|
|
68
|
+
clearSearch: clearSearch,
|
|
69
|
+
selectedIndex: selectedIndex,
|
|
70
|
+
setSelectedIndex: setSelectedIndex,
|
|
71
|
+
results: results
|
|
72
|
+
};
|
|
73
|
+
}, [searchValue, delayedSetSearchValue, isLoading, clearSearch, selectedIndex, results]);
|
|
74
|
+
return /*#__PURE__*/_react.default.createElement(SearchContext.Provider, {
|
|
75
|
+
value: value
|
|
76
|
+
}, children);
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
var _default = /*#__PURE__*/_react.default.memo(SearchProvider);
|
|
80
|
+
|
|
81
|
+
exports.default = _default;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.default = void 0;
|
|
9
|
+
|
|
10
|
+
var _react = _interopRequireDefault(require("react"));
|
|
11
|
+
|
|
12
|
+
var _cozyDeviceHelper = require("cozy-device-helper");
|
|
13
|
+
|
|
14
|
+
var _Fab = _interopRequireDefault(require("cozy-ui/transpiled/react/Fab"));
|
|
15
|
+
|
|
16
|
+
var _Icon = _interopRequireDefault(require("cozy-ui/transpiled/react/Icon"));
|
|
17
|
+
|
|
18
|
+
var _Paperplane = _interopRequireDefault(require("cozy-ui/transpiled/react/Icons/Paperplane"));
|
|
19
|
+
|
|
20
|
+
var _I18n = require("cozy-ui/transpiled/react/providers/I18n");
|
|
21
|
+
|
|
22
|
+
var _styles = require("cozy-ui/transpiled/react/styles");
|
|
23
|
+
|
|
24
|
+
var useStyles = (0, _styles.makeStyles)({
|
|
25
|
+
root: {
|
|
26
|
+
right: '1rem',
|
|
27
|
+
bottom: '1rem',
|
|
28
|
+
position: 'fixed',
|
|
29
|
+
marginBottom: function marginBottom(_ref) {
|
|
30
|
+
var immersive = _ref.immersive;
|
|
31
|
+
return immersive ? 'var(--flagship-bottom-height)' : 0;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
var SearchSubmitFab = function SearchSubmitFab(_ref2) {
|
|
37
|
+
var searchValue = _ref2.searchValue,
|
|
38
|
+
onClick = _ref2.onClick;
|
|
39
|
+
|
|
40
|
+
var _useI18n = (0, _I18n.useI18n)(),
|
|
41
|
+
t = _useI18n.t;
|
|
42
|
+
|
|
43
|
+
var styles = useStyles({
|
|
44
|
+
immersive: (0, _cozyDeviceHelper.getFlagshipMetadata)().immersive
|
|
45
|
+
});
|
|
46
|
+
return /*#__PURE__*/_react.default.createElement(_Fab.default, {
|
|
47
|
+
"aria-label": t('assistant.search.send'),
|
|
48
|
+
color: "primary",
|
|
49
|
+
size: "medium",
|
|
50
|
+
classes: styles,
|
|
51
|
+
disabled: !searchValue,
|
|
52
|
+
onClick: onClick
|
|
53
|
+
}, /*#__PURE__*/_react.default.createElement(_Icon.default, {
|
|
54
|
+
icon: _Paperplane.default
|
|
55
|
+
}));
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
var _default = SearchSubmitFab;
|
|
59
|
+
exports.default = _default;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.default = void 0;
|
|
9
|
+
|
|
10
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
11
|
+
|
|
12
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
13
|
+
|
|
14
|
+
var _reactTypeAnimation = require("react-type-animation");
|
|
15
|
+
|
|
16
|
+
var _rooks = require("rooks");
|
|
17
|
+
|
|
18
|
+
var _Typography = _interopRequireDefault(require("cozy-ui/transpiled/react/Typography"));
|
|
19
|
+
|
|
20
|
+
var _I18n = require("cozy-ui/transpiled/react/providers/I18n");
|
|
21
|
+
|
|
22
|
+
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); }
|
|
23
|
+
|
|
24
|
+
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; }
|
|
25
|
+
|
|
26
|
+
var styles = {
|
|
27
|
+
"searchBarDesktop--result": "styles__searchBarDesktop--result___2bQQy",
|
|
28
|
+
"suggestionsPlaceholder": "styles__suggestionsPlaceholder___y-vsv"
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
var SuggestionsPlaceholder = function SuggestionsPlaceholder() {
|
|
32
|
+
var _useI18n = (0, _I18n.useI18n)(),
|
|
33
|
+
t = _useI18n.t;
|
|
34
|
+
|
|
35
|
+
var _useState = (0, _react.useState)(false),
|
|
36
|
+
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
|
|
37
|
+
showSuggestions = _useState2[0],
|
|
38
|
+
setShowSuggestions = _useState2[1];
|
|
39
|
+
|
|
40
|
+
(0, _rooks.useTimeoutWhen)(function () {
|
|
41
|
+
return setShowSuggestions(true);
|
|
42
|
+
}, 2500);
|
|
43
|
+
return /*#__PURE__*/_react.default.createElement("div", {
|
|
44
|
+
className: styles['suggestionsPlaceholder']
|
|
45
|
+
}, /*#__PURE__*/_react.default.createElement(_Typography.default, null, showSuggestions ? /*#__PURE__*/_react.default.createElement(_reactTypeAnimation.TypeAnimation, {
|
|
46
|
+
cursor: false,
|
|
47
|
+
sequence: [t('assistant.suggestions.find_file'), 2500, t('assistant.suggestions.reimbursements'), 2500, t('assistant.suggestions.reorganise_files'), 2500],
|
|
48
|
+
speed: 40,
|
|
49
|
+
repeat: Infinity,
|
|
50
|
+
omitDeletionAnimation: true
|
|
51
|
+
}) : t('assistant.search.placeholder')));
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
var _default = SuggestionsPlaceholder;
|
|
55
|
+
exports.default = _default;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export function getFileMimetype(collection: any): (mime?: string, name?: string) => any;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.getFileMimetype = void 0;
|
|
9
|
+
|
|
10
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
11
|
+
|
|
12
|
+
var _mimeTypes = _interopRequireDefault(require("mime-types"));
|
|
13
|
+
|
|
14
|
+
var getMimetypeFromFilename = function getMimetypeFromFilename(name) {
|
|
15
|
+
return _mimeTypes.default.lookup(name) || 'application/octet-stream';
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
var mappingMimetypeSubtype = {
|
|
19
|
+
word: 'text',
|
|
20
|
+
text: 'text',
|
|
21
|
+
zip: 'zip',
|
|
22
|
+
pdf: 'pdf',
|
|
23
|
+
spreadsheet: 'sheet',
|
|
24
|
+
excel: 'sheet',
|
|
25
|
+
sheet: 'sheet',
|
|
26
|
+
presentation: 'slide',
|
|
27
|
+
powerpoint: 'slide'
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
var getFileMimetype = function getFileMimetype(collection) {
|
|
31
|
+
return function () {
|
|
32
|
+
var mime = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
|
|
33
|
+
var name = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
|
|
34
|
+
var mimetype = mime === 'application/octet-stream' ? getMimetypeFromFilename(name.toLowerCase()) : mime;
|
|
35
|
+
|
|
36
|
+
var _mimetype$split = mimetype.split('/'),
|
|
37
|
+
_mimetype$split2 = (0, _slicedToArray2.default)(_mimetype$split, 2),
|
|
38
|
+
type = _mimetype$split2[0],
|
|
39
|
+
subtype = _mimetype$split2[1];
|
|
40
|
+
|
|
41
|
+
if (collection[type]) {
|
|
42
|
+
return type;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
if (type === 'application') {
|
|
46
|
+
var existingType = subtype.match(Object.keys(mappingMimetypeSubtype).join('|'));
|
|
47
|
+
return existingType ? mappingMimetypeSubtype[existingType[0]] : undefined;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return undefined;
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
exports.getFileMimetype = getFileMimetype;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export function getIconForSearchResult(searchResult: any): {
|
|
2
|
+
type: string;
|
|
3
|
+
app: any;
|
|
4
|
+
component?: undefined;
|
|
5
|
+
} | {
|
|
6
|
+
type: string;
|
|
7
|
+
component: any;
|
|
8
|
+
app?: undefined;
|
|
9
|
+
};
|
|
10
|
+
export function getDriveMimeTypeIcon(isDirectory: boolean, name: string, mime: string, { isEncrypted }?: {
|
|
11
|
+
isEncrypted?: boolean | undefined;
|
|
12
|
+
} | undefined): import("react").ReactNode;
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.getIconForSearchResult = exports.getDriveMimeTypeIcon = void 0;
|
|
9
|
+
|
|
10
|
+
var _get = _interopRequireDefault(require("lodash/get"));
|
|
11
|
+
|
|
12
|
+
var _Contacts = _interopRequireDefault(require("cozy-ui/transpiled/react/Icons/Contacts"));
|
|
13
|
+
|
|
14
|
+
var _FileTypeAudio = _interopRequireDefault(require("cozy-ui/transpiled/react/Icons/FileTypeAudio"));
|
|
15
|
+
|
|
16
|
+
var _FileTypeBin = _interopRequireDefault(require("cozy-ui/transpiled/react/Icons/FileTypeBin"));
|
|
17
|
+
|
|
18
|
+
var _FileTypeCode = _interopRequireDefault(require("cozy-ui/transpiled/react/Icons/FileTypeCode"));
|
|
19
|
+
|
|
20
|
+
var _FileTypeFiles = _interopRequireDefault(require("cozy-ui/transpiled/react/Icons/FileTypeFiles"));
|
|
21
|
+
|
|
22
|
+
var _FileTypeFolder = _interopRequireDefault(require("cozy-ui/transpiled/react/Icons/FileTypeFolder"));
|
|
23
|
+
|
|
24
|
+
var _FileTypeImage = _interopRequireDefault(require("cozy-ui/transpiled/react/Icons/FileTypeImage"));
|
|
25
|
+
|
|
26
|
+
var _FileTypeNote = _interopRequireDefault(require("cozy-ui/transpiled/react/Icons/FileTypeNote"));
|
|
27
|
+
|
|
28
|
+
var _FileTypePdf = _interopRequireDefault(require("cozy-ui/transpiled/react/Icons/FileTypePdf"));
|
|
29
|
+
|
|
30
|
+
var _FileTypeSheet = _interopRequireDefault(require("cozy-ui/transpiled/react/Icons/FileTypeSheet"));
|
|
31
|
+
|
|
32
|
+
var _FileTypeSlide = _interopRequireDefault(require("cozy-ui/transpiled/react/Icons/FileTypeSlide"));
|
|
33
|
+
|
|
34
|
+
var _FileTypeText = _interopRequireDefault(require("cozy-ui/transpiled/react/Icons/FileTypeText"));
|
|
35
|
+
|
|
36
|
+
var _FileTypeVideo = _interopRequireDefault(require("cozy-ui/transpiled/react/Icons/FileTypeVideo"));
|
|
37
|
+
|
|
38
|
+
var _FileTypeZip = _interopRequireDefault(require("cozy-ui/transpiled/react/Icons/FileTypeZip"));
|
|
39
|
+
|
|
40
|
+
var _EncryptedFolderIcon = _interopRequireDefault(require("./EncryptedFolderIcon"));
|
|
41
|
+
|
|
42
|
+
var _getFileMimetype = require("./getFileMimetype");
|
|
43
|
+
|
|
44
|
+
var getIconForSearchResult = function getIconForSearchResult(searchResult) {
|
|
45
|
+
if (searchResult.doc._type === 'io.cozy.apps') {
|
|
46
|
+
return {
|
|
47
|
+
type: 'app',
|
|
48
|
+
app: searchResult.doc
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
if (searchResult.slug === 'notes') {
|
|
53
|
+
return {
|
|
54
|
+
type: 'component',
|
|
55
|
+
component: _FileTypeNote.default
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (searchResult.slug === 'drive') {
|
|
60
|
+
return {
|
|
61
|
+
type: 'component',
|
|
62
|
+
component: getDriveMimeTypeIcon(searchResult.doc.type === 'directory', searchResult.doc.name, searchResult.doc.mime)
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
if (searchResult.slug === 'contacts') {
|
|
67
|
+
return {
|
|
68
|
+
type: 'component',
|
|
69
|
+
component: _Contacts.default
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return {
|
|
74
|
+
type: 'component',
|
|
75
|
+
component: _FileTypeFiles.default
|
|
76
|
+
};
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* Returns the appropriate icon for a given file based on its mime type and other properties.
|
|
80
|
+
*
|
|
81
|
+
* This method has been copied from cozy-drive
|
|
82
|
+
*
|
|
83
|
+
* See source: https://github.com/cozy/cozy-drive/blob/fbe2df67199683b23a40f476ccdacb00ee027459/src/lib/getMimeTypeIcon.js
|
|
84
|
+
*
|
|
85
|
+
* @param {boolean} isDirectory - Indicates whether the file is a directory.
|
|
86
|
+
* @param {string} name - The name of the file.
|
|
87
|
+
* @param {string} mime - The mime type of the file.
|
|
88
|
+
* @param {Object} [options] - Additional options.
|
|
89
|
+
* @param {boolean} [options.isEncrypted] - Indicates whether the file is encrypted. Default is false.
|
|
90
|
+
* @returns {import('react').ReactNode} - The icon corresponding to the file's mime type.
|
|
91
|
+
*/
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
exports.getIconForSearchResult = getIconForSearchResult;
|
|
95
|
+
|
|
96
|
+
var getDriveMimeTypeIcon = function getDriveMimeTypeIcon(isDirectory, name, mime) {
|
|
97
|
+
var _ref = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {},
|
|
98
|
+
_ref$isEncrypted = _ref.isEncrypted,
|
|
99
|
+
isEncrypted = _ref$isEncrypted === void 0 ? false : _ref$isEncrypted;
|
|
100
|
+
|
|
101
|
+
if (isEncrypted) {
|
|
102
|
+
return _EncryptedFolderIcon.default;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
if (isDirectory) {
|
|
106
|
+
return _FileTypeFolder.default;
|
|
107
|
+
} else if (/\.cozy-note$/.test(name)) {
|
|
108
|
+
return _FileTypeNote.default;
|
|
109
|
+
} else {
|
|
110
|
+
var iconsByMimeType = {
|
|
111
|
+
audio: _FileTypeAudio.default,
|
|
112
|
+
bin: _FileTypeBin.default,
|
|
113
|
+
code: _FileTypeCode.default,
|
|
114
|
+
image: _FileTypeImage.default,
|
|
115
|
+
pdf: _FileTypePdf.default,
|
|
116
|
+
slide: _FileTypeSlide.default,
|
|
117
|
+
sheet: _FileTypeSheet.default,
|
|
118
|
+
text: _FileTypeText.default,
|
|
119
|
+
video: _FileTypeVideo.default,
|
|
120
|
+
zip: _FileTypeZip.default
|
|
121
|
+
};
|
|
122
|
+
var type = (0, _getFileMimetype.getFileMimetype)(iconsByMimeType)(mime, name);
|
|
123
|
+
return (0, _get.default)(iconsByMimeType, type, _FileTypeFiles.default);
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
exports.getDriveMimeTypeIcon = getDriveMimeTypeIcon;
|