mirror of
https://github.com/danny-avila/LibreChat.git
synced 2026-01-02 08:38:51 +01:00
* better i18n support an internationalization-framework. * removed unused package * auto sort for translation.json * fixed tests with the new locales function * added new CI actions from locize * to use locize a mention in the README.md * to use locize a mention in the README.md * updated README.md and added TRANSLATION.md to the repo * updated TRANSLATION.md badges * updated README.md to go to the TRANSLATION.md when clicking on the Translation Progress badge * updated TRANSLATION.md and added a new issue template. * updated TRANSLATION.md and added a new issue template. * updated issue template to add the iso code link. * updated the new GitHub actions for `locize` * updated label for new issue template --> i18n * fixed type issue * Fix eslint * Fix eslint with key-spacing spacing * fix: error type * fix: handle undefined values in SortFilterHeader component * fix: typing in Image component * fix: handle optional promptGroup in PromptCard component * fix: update localize function to accept string type and remove unnecessary JSX element * fix: update localize function to enforce TranslationKeys type for better type safety * fix: improve type safety and handle null values in Assistants component * fix: enhance null checks for fileId in FilesListView component * fix: localize 'Go back' button text in FilesListView component * fix: update aria-label for menu buttons and add translation for 'Close Menu' * docs: add Reasoning UI section for Chain-of-Thought AI models in README * fix: enhance type safety by adding type for message in MultiMessage component * fix: improve null checks and optional chaining in useAutoSave hook * fix: improve handling of optional properties in cleanupPreset function * fix: ensure isFetchingNextPage defaults to false and improve null checks for messages in Search component * fix: enhance type safety and null checks in useBuildMessageTree hook --------- Co-authored-by: Danny Avila <danny@librechat.ai>
179 lines
4.4 KiB
TypeScript
179 lines
4.4 KiB
TypeScript
import { useRecoilValue, useSetRecoilState } from 'recoil';
|
|
import type { TPreset, TPlugin } from 'librechat-data-provider';
|
|
import type { TSetOptionsPayload, TSetExample, TSetOption, TSetOptions } from '~/common';
|
|
import { useChatContext } from '~/Providers/ChatContext';
|
|
import { cleanupPreset } from '~/utils';
|
|
import store from '~/store';
|
|
|
|
type TUsePresetOptions = (preset?: TPreset | boolean | null) => TSetOptionsPayload | boolean;
|
|
|
|
const usePresetIndexOptions: TUsePresetOptions = (_preset) => {
|
|
const setShowPluginStoreDialog = useSetRecoilState(store.showPluginStoreDialog);
|
|
const availableTools = useRecoilValue(store.availableTools);
|
|
const { preset, setPreset } = useChatContext();
|
|
|
|
if (!_preset) {
|
|
return false;
|
|
}
|
|
const getConversation: () => TPreset | null = () => preset;
|
|
|
|
const setOptions: TSetOptions = (options) => {
|
|
const update = { ...options };
|
|
setPreset((prevState) =>
|
|
cleanupPreset({
|
|
preset: {
|
|
...prevState,
|
|
...update,
|
|
},
|
|
}),
|
|
);
|
|
};
|
|
|
|
const setOption: TSetOption = (param) => (newValue) => {
|
|
const update = {};
|
|
update[param] = newValue;
|
|
setPreset((prevState) =>
|
|
cleanupPreset({
|
|
preset: {
|
|
...prevState,
|
|
...update,
|
|
},
|
|
}),
|
|
);
|
|
};
|
|
|
|
const setExample: TSetExample = (i, type, newValue = null) => {
|
|
const update = {};
|
|
const current = preset?.examples?.slice() || [];
|
|
const currentExample = { ...current[i] } || {};
|
|
currentExample[type] = { content: newValue };
|
|
current[i] = currentExample;
|
|
update['examples'] = current;
|
|
setPreset((prevState) =>
|
|
cleanupPreset({
|
|
preset: {
|
|
...prevState,
|
|
...update,
|
|
},
|
|
}),
|
|
);
|
|
};
|
|
|
|
const addExample: () => void = () => {
|
|
const update = {};
|
|
const current = preset?.examples?.slice() || [];
|
|
current.push({ input: { content: '' }, output: { content: '' } });
|
|
update['examples'] = current;
|
|
setPreset((prevState) =>
|
|
cleanupPreset({
|
|
preset: {
|
|
...prevState,
|
|
...update,
|
|
},
|
|
}),
|
|
);
|
|
};
|
|
|
|
const removeExample: () => void = () => {
|
|
const update = {};
|
|
const current = preset?.examples?.slice() || [];
|
|
if (current.length <= 1) {
|
|
update['examples'] = [{ input: { content: '' }, output: { content: '' } }];
|
|
setPreset((prevState) =>
|
|
cleanupPreset({
|
|
preset: {
|
|
...prevState,
|
|
...update,
|
|
},
|
|
}),
|
|
);
|
|
return;
|
|
}
|
|
current.pop();
|
|
update['examples'] = current;
|
|
setPreset((prevState) =>
|
|
cleanupPreset({
|
|
preset: {
|
|
...prevState,
|
|
...update,
|
|
},
|
|
}),
|
|
);
|
|
};
|
|
|
|
const setAgentOption: TSetOption = (param) => (newValue) => {
|
|
const editablePreset = JSON.parse(JSON.stringify(_preset));
|
|
const { agentOptions } = editablePreset;
|
|
agentOptions[param] = newValue;
|
|
setPreset((prevState) =>
|
|
cleanupPreset({
|
|
preset: {
|
|
...prevState,
|
|
agentOptions,
|
|
},
|
|
}),
|
|
);
|
|
};
|
|
|
|
function checkPluginSelection(value: string) {
|
|
if (!preset?.tools) {
|
|
return false;
|
|
}
|
|
return preset.tools.find((el) => {
|
|
if (typeof el === 'string') {
|
|
return el === value;
|
|
}
|
|
return el.pluginKey === value;
|
|
})
|
|
? true
|
|
: false;
|
|
}
|
|
|
|
const setTools: (newValue: string, remove?: boolean) => void = (newValue, remove) => {
|
|
if (newValue === 'pluginStore') {
|
|
setShowPluginStoreDialog(true);
|
|
return;
|
|
}
|
|
|
|
const update = {};
|
|
const current =
|
|
preset?.tools
|
|
?.map((tool: string | TPlugin) => {
|
|
if (typeof tool === 'string') {
|
|
return availableTools[tool];
|
|
}
|
|
return tool;
|
|
})
|
|
.filter((el) => !!el) || [];
|
|
const isSelected = checkPluginSelection(newValue);
|
|
const tool = availableTools[newValue];
|
|
if (isSelected || remove) {
|
|
update['tools'] = current.filter((el) => el.pluginKey !== newValue);
|
|
} else {
|
|
update['tools'] = [...current, tool];
|
|
}
|
|
|
|
setPreset((prevState) =>
|
|
cleanupPreset({
|
|
preset: {
|
|
...prevState,
|
|
...update,
|
|
},
|
|
}),
|
|
);
|
|
};
|
|
|
|
return {
|
|
setOption,
|
|
setExample,
|
|
addExample,
|
|
setOptions,
|
|
removeExample,
|
|
getConversation,
|
|
checkPluginSelection,
|
|
setAgentOption,
|
|
setTools,
|
|
};
|
|
};
|
|
|
|
export default usePresetIndexOptions;
|