@sproutsocial/seeds-react-menu 1.6.2 → 1.6.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sproutsocial/seeds-react-menu",
3
- "version": "1.6.2",
3
+ "version": "1.6.4",
4
4
  "description": "Seeds React Menu",
5
5
  "author": "Sprout Social, Inc.",
6
6
  "license": "MIT",
@@ -20,6 +20,7 @@ import { TEST_BOOKS } from "../__fixtures__/menu-test-data";
20
20
  import { Autocomplete } from "./Autocomplete";
21
21
  import { AutocompleteInput } from "./AutocompleteInput";
22
22
  import { AutocompleteTokenInput } from "./AutocompleteTokenInput";
23
+ import Button from "@sproutsocial/seeds-react-button";
23
24
 
24
25
  type CustomAutocompleteArgs = React.ComponentProps<typeof Autocomplete>;
25
26
 
@@ -220,7 +221,6 @@ export const AutocompleteControlled: Story = {
220
221
  };
221
222
 
222
223
  const TestControlledMultiAutocomplete = (args: CustomAutocompleteArgs) => {
223
- const [isOpen, setIsOpen] = React.useState<boolean>(false);
224
224
  const [selectedItems, setSelectedItems] = React.useState<
225
225
  TypeInternalItemProps[]
226
226
  >([]);
@@ -228,8 +228,6 @@ const TestControlledMultiAutocomplete = (args: CustomAutocompleteArgs) => {
228
228
  return (
229
229
  <Autocomplete
230
230
  multiSelect
231
- isOpen={isOpen}
232
- onIsOpenChange={({ isOpen }) => setIsOpen(isOpen)}
233
231
  selectedItems={selectedItems}
234
232
  onSelectedItemsChange={({ selectedItems: newSelectedItems }) =>
235
233
  setSelectedItems(newSelectedItems)
@@ -259,9 +257,68 @@ const TestControlledMultiAutocomplete = (args: CustomAutocompleteArgs) => {
259
257
  );
260
258
  };
261
259
 
260
+ const TestControlledMultiAutocompleteWithExternalButton = () => {
261
+ const [isOpen, setIsOpen] = React.useState<boolean>(false);
262
+ const [selectedItems, setSelectedItems] = React.useState<
263
+ TypeInternalItemProps[]
264
+ >([]);
265
+
266
+ const handleSetSelectedItems = ({ selectedItems: newSelectedItems }) => {
267
+ setSelectedItems(newSelectedItems);
268
+ };
269
+
270
+ const handleAddRandom = () => {
271
+ const randomItem = {
272
+ id: "book-3",
273
+ index: 2,
274
+ menuItemProps: {
275
+ children: "The Idiot",
276
+ id: "book-3",
277
+ },
278
+ };
279
+ setSelectedItems((prev) => [...prev, randomItem]);
280
+ console.log("random thing");
281
+ };
282
+
283
+ return (
284
+ <>
285
+ <Autocomplete
286
+ multiSelect
287
+ isOpen={isOpen}
288
+ onIsOpenChange={({ isOpen }) => setIsOpen(isOpen)}
289
+ selectedItems={selectedItems}
290
+ onSelectedItemsChange={handleSetSelectedItems}
291
+ itemToString={(item) => (item ? TEST_BOOKS[item.index].title : "")}
292
+ menuToggleElement={
293
+ <>
294
+ <MenuLabel mb={300}>Choose a book</MenuLabel>
295
+ <AutocompleteTokenInput />
296
+ </>
297
+ }
298
+ >
299
+ <MenuContent>
300
+ <MenuGroup id="books">
301
+ {TEST_BOOKS.map(({ id, title }) => (
302
+ <MenuItem key={id} id={id}>
303
+ {title}
304
+ </MenuItem>
305
+ ))}
306
+ </MenuGroup>
307
+ </MenuContent>
308
+ </Autocomplete>
309
+ <Button onClick={handleAddRandom}>Add Random thing</Button>
310
+ </>
311
+ );
312
+ };
313
+
262
314
  export const MultiAutocompleteControlled: Story = {
263
315
  name: "MultiAutocomplete Controlled State",
264
316
  render: (args: CustomAutocompleteArgs) => (
265
317
  <TestControlledMultiAutocomplete {...args} />
266
318
  ),
267
319
  };
320
+
321
+ export const MultiAutocompleteControlledWithExternal: Story = {
322
+ name: "MultiAutocomplete Controlled State With External Button",
323
+ render: () => <TestControlledMultiAutocompleteWithExternalButton />,
324
+ };
@@ -38,6 +38,7 @@ export const MultiAutocomplete = <
38
38
  onMultiSelectStateChange,
39
39
  multiSelectStateReducer,
40
40
  autoCloseOnEmpty = true,
41
+ selectedItems: selectedItemsProp,
41
42
  ...useComboboxProps
42
43
  }: TypeMultiAutocompleteProps<I>) => {
43
44
  /** Get a list of menuItems and children */
@@ -46,11 +47,16 @@ export const MultiAutocomplete = <
46
47
  menuItems,
47
48
  MenuItemComponent,
48
49
  });
49
- const [selectedItems, setSelectedItems] =
50
+ const [selectedItemsState, setSelectedItemsState] =
50
51
  React.useState(initialSelectedItems);
51
- const [selectedItemIds, setSelectedItemIds] = React.useState<
52
- Record<string, boolean>
53
- >(getSelectedItemIds(initialSelectedItems));
52
+ const selectedItems = React.useMemo(
53
+ () => selectedItemsProp || selectedItemsState,
54
+ [selectedItemsProp, selectedItemsState]
55
+ );
56
+ const selectedItemIds = React.useMemo(
57
+ () => getSelectedItemIds(selectedItems),
58
+ [selectedItems]
59
+ );
54
60
 
55
61
  // function that checks that item should be visible based on the selected items
56
62
  const getIsItemVisibleMulti = React.useCallback<typeof getIsItemVisible>(
@@ -109,10 +115,9 @@ export const MultiAutocomplete = <
109
115
  const useMultipleSelectionReturnProps = useMultipleSelection({
110
116
  ...defaultDownshiftProps.multi,
111
117
  itemToKey,
112
- selectedItems,
118
+ selectedItems: selectedItemsProp || selectedItems,
113
119
  onSelectedItemsChange: ({ selectedItems, ...changes }) => {
114
- setSelectedItems(selectedItems);
115
- setSelectedItemIds(getSelectedItemIds(selectedItems));
120
+ setSelectedItemsState(selectedItems);
116
121
  onSelectedItemsChange &&
117
122
  onSelectedItemsChange({ selectedItems, ...changes });
118
123
  },
@@ -139,11 +144,7 @@ export const MultiAutocomplete = <
139
144
  case useCombobox.stateChangeTypes.ItemClick:
140
145
  if (newSelectedItem) {
141
146
  const newSelectedItems = [...selectedItems, newSelectedItem];
142
- setSelectedItems(newSelectedItems);
143
- setSelectedItemIds({
144
- ...selectedItemIds,
145
- [newSelectedItem.id]: true,
146
- });
147
+ setSelectedItemsState(newSelectedItems);
147
148
  onSelectedItemsChange &&
148
149
  onSelectedItemsChange({
149
150
  selectedItems: newSelectedItems,
@@ -162,16 +163,8 @@ export const MultiAutocomplete = <
162
163
  ...useComboboxProps,
163
164
  });
164
165
 
165
- const { isOpen, closeMenu, inputValue } = useComboboxReturnProps;
166
166
  const { popoutProps: userPopoutProps } = useComboboxProps;
167
167
 
168
- React.useEffect(() => {
169
- if (!inputValue) return;
170
- if (allMenuItems && hiddenItemsCount >= allMenuItems.length && isOpen) {
171
- closeMenu?.();
172
- }
173
- }, [hiddenItemsCount, allMenuItems?.length, isOpen, inputValue]);
174
-
175
168
  return (
176
169
  <MenuRootComponent
177
170
  {...{