Skip to content

Commit

Permalink
[discover] optimize rendering language options (#8685)
Browse files Browse the repository at this point in the history
* memoization plus not setting the user query language

Signed-off-by: Kawika Avilla <kavilla414@gmail.com>

* clean up commented code

Signed-off-by: Kawika Avilla <kavilla414@gmail.com>

* Changeset file for PR #8685 created/updated

* Changeset file for PR #8685 deleted

---------

Signed-off-by: Kawika Avilla <kavilla414@gmail.com>
Co-authored-by: opensearch-changeset-bot[bot] <154024398+opensearch-changeset-bot[bot]@users.noreply.github.com>
  • Loading branch information
kavilla and opensearch-changeset-bot[bot] authored Oct 23, 2024
1 parent 79fed30 commit 85e0767
Showing 1 changed file with 51 additions and 42 deletions.
93 changes: 51 additions & 42 deletions src/plugins/data/public/ui/query_editor/language_selector.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import {
EuiSmallButtonEmpty,
PopoverAnchorPosition,
} from '@elastic/eui';
import React, { useEffect, useState } from 'react';
import React, { useCallback, useEffect, useMemo, useState } from 'react';
import { Query } from '../..';
import { LanguageConfig } from '../../query';
import { getQueryService } from '../../services';
Expand All @@ -36,12 +36,14 @@ export const QueryLanguageSelector = (props: QueryLanguageSelectorProps) => {
const queryString = getQueryService().queryString;
const languageService = queryString.getLanguageService();

const datasetSupportedLanguages = props.query.dataset
? queryString
.getDatasetService()
.getType(props.query.dataset.type)
?.supportedLanguages(props.query.dataset)
: undefined;
const datasetSupportedLanguages = useMemo(() => {
const dataset = props.query.dataset;
if (!dataset) {
return undefined;
}
const datasetType = queryString.getDatasetService().getType(dataset.type);
return datasetType?.supportedLanguages(dataset);
}, [props.query.dataset, queryString]);

useEffect(() => {
const subscription = queryString.getUpdates$().subscribe((query: Query) => {
Expand All @@ -59,51 +61,58 @@ export const QueryLanguageSelector = (props: QueryLanguageSelectorProps) => {
setPopover(!isPopoverOpen);
};

const languageOptions: Array<{ label: string; value: string }> = [];

languageService.getLanguages().forEach((language) => {
if (
(language && props.appName && !language.editorSupportedAppNames?.includes(props.appName)) ||
languageService.getUserQueryLanguageBlocklist().includes(language?.id) ||
(datasetSupportedLanguages && !datasetSupportedLanguages.includes(language.id))
)
return;
languageOptions.unshift(mapExternalLanguageToOptions(language));
});

const selectedLanguage = {
label:
(languageOptions.find(
(option) => (option.value as string).toLowerCase() === currentLanguage.toLowerCase()
)?.label as string) ?? languageOptions[0].label,
};
const languageOptions = useMemo(() => {
const options: Array<{ label: string; value: string }> = [];

const handleLanguageChange = (newLanguage: string) => {
setCurrentLanguage(newLanguage);
props.onSelectLanguage(newLanguage);
};
languageService.getLanguages().forEach((language) => {
const isSupported =
!datasetSupportedLanguages || datasetSupportedLanguages.includes(language.id);
const isBlocklisted = languageService.getUserQueryLanguageBlocklist().includes(language?.id);
const isAppSupported =
!props.appName || language?.editorSupportedAppNames?.includes(props.appName);

if (!isSupported || isBlocklisted || !isAppSupported) return;

options.unshift(mapExternalLanguageToOptions(language));
});

languageService.setUserQueryLanguage(currentLanguage);
return options.sort((a, b) => a.label.localeCompare(b.label));
}, [languageService, props.appName, datasetSupportedLanguages]);

const selectedLanguage = useMemo(
() => ({
label:
languageOptions.find(
(option) => option.value.toLowerCase() === currentLanguage.toLowerCase()
)?.label ?? languageOptions[0]?.label,
}),
[languageOptions, currentLanguage]
);

const handleLanguageChange = useCallback(
(newLanguage: string) => {
setCurrentLanguage(newLanguage);
props.onSelectLanguage(newLanguage);
languageService.setUserQueryLanguage(newLanguage);
setPopover(false);
},
[props, languageService]
);

const languageOptionsMenu = languageOptions
.sort((a, b) => {
return a.label.localeCompare(b.label);
})
.map((language) => {
return (
const languageOptionsMenu = useMemo(
() =>
languageOptions.map((language) => (
<EuiContextMenuItem
key={language.label}
className="languageSelector__menuItem"
icon={language.label === selectedLanguage.label ? 'check' : 'empty'}
onClick={() => {
setPopover(false);
handleLanguageChange(language.value);
}}
onClick={() => handleLanguageChange(language.value)}
>
{language.label}
</EuiContextMenuItem>
);
});
)),
[languageOptions, selectedLanguage.label, handleLanguageChange]
);

return (
<EuiPopover
Expand Down

0 comments on commit 85e0767

Please sign in to comment.