Cleanup "groupExtensionsByLanguage"

This commit is contained in:
schroda
2025-04-21 01:41:48 +02:00
parent 78030b103a
commit 87a496cec0

View File

@@ -11,7 +11,6 @@ import {
ExtensionAction, ExtensionAction,
ExtensionGroupState, ExtensionGroupState,
ExtensionState, ExtensionState,
GroupedExtensions,
GroupedExtensionsResult, GroupedExtensionsResult,
InstalledState, InstalledState,
TExtension, TExtension,
@@ -52,48 +51,40 @@ export const translateExtensionLanguage = (languageCode: string): string =>
: langCodeToName(languageCode); : langCodeToName(languageCode);
export function groupExtensionsByLanguage(extensions: TExtension[]): GroupedExtensionsResult { export function groupExtensionsByLanguage(extensions: TExtension[]): GroupedExtensionsResult {
const allLangs: string[] = []; const extensionsByLanguage = Object.groupBy<ExtensionGroupState | string, TExtension>(extensions, (extension) => {
const sortedExtensions: GroupedExtensions = { if (!extension.isInstalled) {
[ExtensionGroupState.OBSOLETE]: [], return extension.lang;
[ExtensionGroupState.INSTALLED]: [],
[ExtensionGroupState.UPDATE_PENDING]: [],
};
extensions.forEach((extension) => {
if (sortedExtensions[extension.lang] === undefined) {
sortedExtensions[extension.lang] = [];
allLangs.push(extension.lang);
}
if (extension.isInstalled) {
if (extension.hasUpdate) {
sortedExtensions[ExtensionGroupState.UPDATE_PENDING].push(extension);
return;
}
if (extension.isObsolete) {
sortedExtensions[ExtensionGroupState.OBSOLETE].push(extension);
return;
} }
sortedExtensions[ExtensionGroupState.INSTALLED].push(extension); if (extension.hasUpdate) {
} else { return ExtensionGroupState.UPDATE_PENDING;
sortedExtensions[extension.lang].push(extension);
} }
if (extension.isObsolete) {
return ExtensionGroupState.OBSOLETE;
}
return ExtensionGroupState.INSTALLED;
}); });
allLangs.sort(langSortCmp); // sort groups by language
const result: GroupedExtensionsResult<ExtensionGroupState | DefaultLanguage | string> = [ const extensionsBySortedLanguage = Object.entries(extensionsByLanguage).toSorted(([a], [b]) => {
[ExtensionGroupState.OBSOLETE, sortedExtensions[ExtensionGroupState.OBSOLETE]], const extensionGroupStates = Object.values(ExtensionGroupState);
[ExtensionGroupState.UPDATE_PENDING, sortedExtensions[ExtensionGroupState.UPDATE_PENDING]],
[ExtensionGroupState.INSTALLED, sortedExtensions[ExtensionGroupState.INSTALLED]],
];
const langExt: GroupedExtensionsResult = allLangs.map((lang) => [lang, sortedExtensions[lang]]); if (extensionGroupStates.includes(a as ExtensionGroupState)) {
const groupedExtensions = result.concat(langExt); return -1;
}
if (extensionGroupStates.includes(b as ExtensionGroupState)) {
return 1;
}
groupedExtensions.forEach(([, groupedExtensionList]) => return langSortCmp(a, b);
groupedExtensionList.sort((a, b) => a.name.localeCompare(b.name)), });
);
return groupedExtensions; return extensionsBySortedLanguage.map(([language, extensionsOfLanguage]) => [
language,
(extensionsOfLanguage ?? []).toSorted((a, b) => langSortCmp(a.lang, b.lang)),
]);
} }
export const getLanguagesFromExtensions = (extensions: TExtension[]): string[] => export const getLanguagesFromExtensions = (extensions: TExtension[]): string[] =>