message: separate hashtag extractor
diff: import { tl } from 'app/i18next-t';
  import { getNotes } from 'app/inventory/dim-item-info';
  import { DimItem } from 'app/inventory/item-types';
  +import { collectNotesHashtags } from 'app/inventory/note-hashtags';
  import { DestinyInventoryItemDefinition } from 'bungie-api-ts/destiny2';
  import { ItemCategoryHashes, PlugCategoryHashes } from 'data/d2/generated-enums';
  import _ from 'lodash';
  @@ -68,22 +69,7 @@ const freeformFilters: FilterDefinition[] = [
  keywords: 'notes',
  description: tl('Filter.Notes'),
  format: 'freeform',
  - suggestionsGenerator: ({ itemInfos }) => {
  - if (!itemInfos) {
  - return;
  - }
  - // collect hash tags from item notes
  - const hashTags = new Set<string>();
  - for (const info of Object.values(itemInfos)) {
  - const matches = info.notes?.matchAll(/#\w+/g);
  - if (matches) {
  - for (const match of matches) {
  - hashTags.add(match[0]);
  - }
  - }
  - }
  - return [...hashTags];
  - },
  + suggestionsGenerator: ({ itemInfos }) => itemInfos && collectNotesHashtags(itemInfos),
  filter: ({ filterValue, itemInfos, itemHashTags, language }) => {
  filterValue = plainString(filterValue, language);
  return (item) => {
  