mirror of
https://github.com/danny-avila/LibreChat.git
synced 2025-12-26 13:18: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>
98 lines
4.1 KiB
TypeScript
98 lines
4.1 KiB
TypeScript
import React from 'react';
|
|
import { Plus, Minus } from 'lucide-react';
|
|
import TextareaAutosize from 'react-textarea-autosize';
|
|
import type { TExample } from 'librechat-data-provider';
|
|
import type { TSetExample } from '~/common';
|
|
import { Button, Label } from '~/components/ui';
|
|
import { cn, defaultTextProps } from '~/utils/';
|
|
import { useLocalize } from '~/hooks';
|
|
|
|
type TExamplesProps = {
|
|
readonly?: boolean;
|
|
className?: string;
|
|
examples: TExample[];
|
|
setExample: TSetExample;
|
|
addExample: () => void;
|
|
removeExample: () => void;
|
|
};
|
|
|
|
function Examples({ readonly, examples, setExample, addExample, removeExample }: TExamplesProps) {
|
|
const localize = useLocalize();
|
|
return (
|
|
<>
|
|
<div id="examples-grid" className="grid gap-6 sm:grid-cols-2">
|
|
{examples.map((example, idx) => (
|
|
<React.Fragment key={idx}>
|
|
{/* Input */}
|
|
<div
|
|
className={`col-span-${
|
|
examples.length === 1 ? '1' : 'full'
|
|
} flex flex-col items-center justify-start gap-6 sm:col-span-1`}
|
|
>
|
|
<div className="grid w-full items-center gap-2">
|
|
<Label htmlFor={`input-${idx}`} className="text-left text-sm font-medium">
|
|
{localize('com_ui_input')}{' '}
|
|
<small className="opacity-40">({localize('com_endpoint_default_blank')})</small>
|
|
</Label>
|
|
<TextareaAutosize
|
|
id={`input-${idx}`}
|
|
disabled={readonly}
|
|
value={example.input.content || ''}
|
|
onChange={(e) => setExample(idx, 'input', e.target.value ?? null)}
|
|
placeholder="Set example input. Example is ignored if empty."
|
|
className={cn(
|
|
defaultTextProps,
|
|
'flex max-h-[138px] min-h-[75px] w-full resize-none px-3 py-2 ',
|
|
)}
|
|
/>
|
|
</div>
|
|
</div>
|
|
|
|
{/* Output */}
|
|
<div
|
|
className={`col-span-${
|
|
examples.length === 1 ? '1' : 'full'
|
|
} flex flex-col items-center justify-start gap-6 sm:col-span-1`}
|
|
>
|
|
<div className="grid w-full items-center gap-2">
|
|
<Label htmlFor={`output-${idx}`} className="text-left text-sm font-medium">
|
|
{localize('com_endpoint_output')}{' '}
|
|
<small className="opacity-40">({localize('com_endpoint_default_blank')})</small>
|
|
</Label>
|
|
<TextareaAutosize
|
|
id={`output-${idx}`}
|
|
disabled={readonly}
|
|
value={example.output.content || ''}
|
|
onChange={(e) => setExample(idx, 'output', e.target.value ?? null)}
|
|
placeholder={'Set example output. Example is ignored if empty.'}
|
|
className={cn(
|
|
defaultTextProps,
|
|
'flex max-h-[300px] min-h-[75px] w-full resize-none px-3 py-2 ',
|
|
)}
|
|
/>
|
|
</div>
|
|
</div>
|
|
</React.Fragment>
|
|
))}
|
|
</div>
|
|
<div className="flex justify-center">
|
|
<Button
|
|
type="button"
|
|
className="mr-2 mt-1 h-auto items-center justify-center bg-transparent px-3 py-2 text-xs font-medium font-normal text-black hover:bg-gray-100 hover:text-black focus:ring-0 focus:ring-offset-0 dark:bg-transparent dark:text-white dark:hover:bg-gray-700 dark:hover:text-white dark:focus:outline-none dark:focus:ring-offset-0"
|
|
onClick={removeExample}
|
|
>
|
|
<Minus className="w-[16px]" />
|
|
</Button>
|
|
<Button
|
|
type="button"
|
|
className="mt-1 h-auto items-center justify-center bg-transparent px-3 py-2 text-xs font-medium font-normal text-black hover:bg-gray-100 hover:text-black focus:ring-0 focus:ring-offset-0 dark:bg-transparent dark:text-white dark:hover:bg-gray-700 dark:hover:text-white dark:focus:outline-none dark:focus:ring-offset-0"
|
|
onClick={addExample}
|
|
>
|
|
<Plus className="w-[16px]" />
|
|
</Button>
|
|
</div>
|
|
</>
|
|
);
|
|
}
|
|
|
|
export default Examples;
|