|
5 | 5 | ContextProviderExtras,
|
6 | 6 | ContextSubmenuItem,
|
7 | 7 | LoadSubmenuItemsArgs,
|
| 8 | + SiteIndexingConfig, |
8 | 9 | } from "../../index.js";
|
9 | 10 | import { DocsService } from "../../indexing/docs/DocsService.js";
|
10 | 11 | import configs from "../../indexing/docs/preIndexedDocs.js";
|
@@ -108,40 +109,44 @@ class DocsContextProvider extends BaseContextProvider {
|
108 | 109 | ];
|
109 | 110 | }
|
110 | 111 |
|
111 |
| - async loadSubmenuItems( |
112 |
| - args: LoadSubmenuItemsArgs, |
113 |
| - ): Promise<ContextSubmenuItem[]> { |
114 |
| - const docs = await this.docsService.list(); |
115 |
| - const submenuItems: ContextSubmenuItem[] = docs.map((doc) => ({ |
| 112 | + // Get combined site configs from preIndexedDocs and options.sites. |
| 113 | + private _getDocsSitesConfig(): SiteIndexingConfig[] { |
| 114 | + return [...configs, ...(this.options?.sites || [])]; |
| 115 | + } |
| 116 | + |
| 117 | + // Get indexed docs as ContextSubmenuItems from database. |
| 118 | + private async _getIndexedDocsContextSubmenuItems(): Promise<ContextSubmenuItem[]> { |
| 119 | + return (await this.docsService.list()).map((doc) => ({ |
116 | 120 | title: doc.title,
|
117 | 121 | description: new URL(doc.baseUrl).hostname,
|
118 | 122 | id: doc.baseUrl,
|
119 |
| - metadata: { |
120 |
| - preIndexed: !!configs.find((config) => config.title === doc.title), |
121 |
| - }, |
122 | 123 | }));
|
| 124 | + } |
123 | 125 |
|
124 |
| - submenuItems.push( |
125 |
| - ...configs |
126 |
| - // After it's actually downloaded, we don't want to show twice |
127 |
| - .filter( |
128 |
| - (config) => !submenuItems.some((item) => item.id === config.startUrl), |
129 |
| - ) |
130 |
| - .map((config) => ({ |
131 |
| - title: config.title, |
132 |
| - description: new URL(config.startUrl).hostname, |
133 |
| - id: config.startUrl, |
134 |
| - metadata: { |
135 |
| - preIndexed: true, |
136 |
| - }, |
137 |
| - // iconUrl: config.faviconUrl, |
138 |
| - })), |
139 |
| - ); |
| 126 | + async loadSubmenuItems( |
| 127 | + args: LoadSubmenuItemsArgs, |
| 128 | + ): Promise<ContextSubmenuItem[]> { |
| 129 | + const submenuItemsMap = new Map<string, ContextSubmenuItem>(); |
| 130 | + |
| 131 | + for (const item of await this._getIndexedDocsContextSubmenuItems()) { |
| 132 | + submenuItemsMap.set(item.id, item); |
| 133 | + } |
| 134 | + |
| 135 | + for (const config of this._getDocsSitesConfig()) { |
| 136 | + submenuItemsMap.set(config.startUrl, { |
| 137 | + id: config.startUrl, |
| 138 | + title: config.title, |
| 139 | + description: new URL(config.startUrl).hostname, |
| 140 | + metadata: { preIndexed: !!configs.find((cnf) => cnf.title === config.title), }, |
| 141 | + }); |
| 142 | + } |
| 143 | + |
| 144 | + const submenuItems = Array.from(submenuItemsMap.values()); |
140 | 145 |
|
141 | 146 | // Sort submenuItems such that the objects with titles which don't occur in configs occur first, and alphabetized
|
142 | 147 | submenuItems.sort((a, b) => {
|
143 |
| - const aTitleInConfigs = a.metadata?.preIndexed; |
144 |
| - const bTitleInConfigs = b.metadata?.preIndexed; |
| 148 | + const aTitleInConfigs = a.metadata?.preIndexed ?? false; |
| 149 | + const bTitleInConfigs = b.metadata?.preIndexed ?? false; |
145 | 150 |
|
146 | 151 | // Primary criterion: Items not in configs come first
|
147 | 152 | if (!aTitleInConfigs && bTitleInConfigs) {
|
|
0 commit comments