|
1 | | -import { call, put, select } from 'redux-saga/effects'; |
2 | | -import type { OverallState } from 'src/commons/application/ApplicationTypes'; |
3 | | -import { flagConductorEnable } from 'src/features/conductor/flagConductorEnable'; |
4 | | -import { flagConductorEvaluatorUrl } from 'src/features/conductor/flagConductorEvaluatorUrl'; |
5 | | -import { staticLanguageDirectoryProvider } from 'src/features/directory/LanguageDirectoryTypes'; |
| 1 | +import { ILanguageDefinition } from 'language-directory/dist/types'; |
| 2 | +import { getEvaluatorDefinition } from 'language-directory/dist/util'; |
| 3 | +import { call, fork, put, select } from 'redux-saga/effects'; |
| 4 | +import { selectDirectoryLanguageUrl } from 'src/features/directory/flagDirectoryLanguageUrl'; |
6 | 5 |
|
7 | 6 | import LanguageDirectoryActions from '../../features/directory/LanguageDirectoryActions'; |
| 7 | +import { LanguageDirectoryState } from '../../features/directory/LanguageDirectoryTypes'; |
| 8 | +import type { OverallState } from '../application/ApplicationTypes'; |
8 | 9 | import { combineSagaHandlers } from '../redux/utils'; |
9 | | -import { actions } from '../utils/ActionsHelper'; |
10 | 10 |
|
11 | | -const LanguageDirectorySaga = combineSagaHandlers({ |
| 11 | +export function* getLanguageDefinitionSaga() { |
| 12 | + const directory: LanguageDirectoryState = yield select( |
| 13 | + (state: OverallState) => state.languageDirectory |
| 14 | + ); |
| 15 | + if (!directory.selectedLanguageId) return undefined; |
| 16 | + return directory.languageMap[directory.selectedLanguageId]; |
| 17 | +} |
| 18 | + |
| 19 | +export function* getEvaluatorDefinitionSaga() { |
| 20 | + const directory: LanguageDirectoryState = yield select( |
| 21 | + (state: OverallState) => state.languageDirectory |
| 22 | + ); |
| 23 | + if (!directory.selectedEvaluatorId) return undefined; |
| 24 | + const language: ILanguageDefinition = yield call(getLanguageDefinitionSaga); |
| 25 | + if (!language) return undefined; |
| 26 | + return getEvaluatorDefinition(language, directory.selectedEvaluatorId); |
| 27 | +} |
| 28 | + |
| 29 | +const languageDirectoryHandlers = combineSagaHandlers({ |
12 | 30 | [LanguageDirectoryActions.setLanguages.type]: function* () { |
13 | | - const state = yield select((s: OverallState) => s.languageDirectory); |
14 | | - if (state.selectedLanguageId === null && state.languages.length > 0) { |
15 | | - yield put(actions.setSelectedLanguage(state.languages[0].id)); |
16 | | - } |
17 | | - if (state.selectedEvaluatorId === null && state.languages.length > 0) { |
18 | | - yield put(actions.setSelectedEvaluator(state.languages[0].evaluators[0].id)); |
| 31 | + const directory = yield select((state: OverallState) => state.languageDirectory); |
| 32 | + if (directory.languages.length > 0) { |
| 33 | + yield put(LanguageDirectoryActions.setSelectedLanguage(directory.languages[0].id)); |
19 | 34 | } |
20 | 35 | }, |
21 | 36 | [LanguageDirectoryActions.fetchLanguages.type]: function* () { |
22 | | - const langs = yield call( |
23 | | - staticLanguageDirectoryProvider.getLanguages.bind(staticLanguageDirectoryProvider) |
24 | | - ); |
25 | | - yield put(actions.setLanguages(langs)); |
| 37 | + const url = yield select(selectDirectoryLanguageUrl); |
| 38 | + const response = yield call(fetch, url); |
| 39 | + if (!response.ok) { |
| 40 | + throw new Error(`Can't retrieve language directory: ${response.status}`); |
| 41 | + } |
| 42 | + const result: ILanguageDefinition[] = yield call([response, 'json']); |
| 43 | + yield put(LanguageDirectoryActions.setLanguages(result)); |
26 | 44 | }, |
27 | | - [LanguageDirectoryActions.setSelectedLanguage.type]: function* (action) { |
28 | | - const { |
29 | | - payload: { languageId, evaluatorId } |
30 | | - } = action; |
31 | | - if (evaluatorId) return; // already explicitly set |
32 | | - const language = yield call( |
33 | | - staticLanguageDirectoryProvider.getLanguageById.bind(staticLanguageDirectoryProvider), |
34 | | - languageId |
35 | | - ); |
| 45 | + [LanguageDirectoryActions.setSelectedLanguage.type]: function* () { |
| 46 | + const language = yield call(getLanguageDefinitionSaga); |
36 | 47 | if (!language) return; |
37 | | - const defaultEvaluatorId: string | null = |
38 | | - language.evaluators.length > 0 ? language.evaluators[0].id : null; |
39 | | - if (!defaultEvaluatorId) return; |
40 | | - // If state still matches the same language, set evaluator |
41 | | - const currentLanguageId: string | null = yield select( |
42 | | - (s: OverallState) => s.languageDirectory.selectedLanguageId |
43 | | - ); |
44 | | - if (currentLanguageId !== languageId) return; |
45 | | - yield put(actions.setSelectedEvaluator(defaultEvaluatorId)); |
46 | | - }, |
47 | | - [LanguageDirectoryActions.setSelectedEvaluator.type]: function* (action) { |
48 | | - const { |
49 | | - payload: { evaluatorId } |
50 | | - } = action; |
51 | | - const selectedLanguageId: string | null = yield select( |
52 | | - (s: OverallState) => s.languageDirectory.selectedLanguageId |
53 | | - ); |
54 | | - if (!selectedLanguageId) return; |
55 | | - const evaluator = yield call( |
56 | | - staticLanguageDirectoryProvider.getEvaluatorDefinition.bind(staticLanguageDirectoryProvider), |
57 | | - selectedLanguageId, |
58 | | - evaluatorId |
59 | | - ); |
60 | | - if (!evaluator) return; |
61 | | - yield put(actions.setFlag({ featureFlag: flagConductorEnable, value: true })); |
62 | | - yield put(actions.setFlag({ featureFlag: flagConductorEvaluatorUrl, value: evaluator.path })); |
| 48 | + if (language.evaluators.length > 0) { |
| 49 | + yield put(LanguageDirectoryActions.setSelectedEvaluator(language.evaluators[0].id)); |
| 50 | + } |
63 | 51 | } |
64 | 52 | }); |
65 | 53 |
|
| 54 | +function* LanguageDirectorySaga() { |
| 55 | + yield fork(languageDirectoryHandlers); |
| 56 | + yield put(LanguageDirectoryActions.fetchLanguages()); |
| 57 | +} |
| 58 | + |
66 | 59 | export default LanguageDirectorySaga; |
0 commit comments