mirror of
https://github.com/danny-avila/LibreChat.git
synced 2025-12-17 00:40:14 +01:00
* feat: Add extended inputs for promts library variables * feat: Add maxRows prop to VariableForm input field * 📩 feat: invite user (#3012) * feat: basic invite-user script * feat: add invite user functionality and registration validation middleware * fix: invite user fixes * refactor: consolidate direct model access to a central place of functions * style(Registration): add spinner to continue button * refactor: import ordrer * feat: improve invite user script and error handling * fix: merge conflict * refactor: remove `console.log` and use `logger` * fix: token operation and checkinvite issues * bring back comment and remove console log * fix: return invalid token when token is not found * fix: getInvite fix * refactor: Update Token.js to use async/await syntax for update and delete operations * feat: Refactor Token.js to use async/await syntax for createToken and findToken functions * refactor(inviteUser): define functions outside of module.exports * Update AuthService.js --------- Co-authored-by: Danny Avila <danny@librechat.ai> * style: improve OpenAI.tsx input field focus styling * refactor: update import statement in Input.tsx * refactor: remove multi-line * refactor: update placeholder text to use localization * style: new dropdown variable info and markdown styling for info * Add ReactMarkdown * chore: styling, import order * refactor: update ReactMarkdown usage in VariableForm * style: remove markdown class * refactor: update mobile styling and use code renderer * style(InputWithDropDown): update focus trigger style * style(OptionsPopover): update Save As Preset `focus` and `dark:bg` --------- Co-authored-by: Konstantin Meshcheryakov <kmeshcheryakov@klika-tech.com> Co-authored-by: Marco Beretta <81851188+berry-13@users.noreply.github.com> Co-authored-by: bsu3338 <bsu3338@users.noreply.github.com>
92 lines
2.6 KiB
TypeScript
92 lines
2.6 KiB
TypeScript
import copy from 'copy-to-clipboard';
|
|
import { InfoIcon } from 'lucide-react';
|
|
import React, { useRef, useState, RefObject } from 'react';
|
|
import Clipboard from '~/components/svg/Clipboard';
|
|
import CheckMark from '~/components/svg/CheckMark';
|
|
import useLocalize from '~/hooks/useLocalize';
|
|
import cn from '~/utils/cn';
|
|
|
|
type CodeBarProps = {
|
|
lang: string;
|
|
codeRef: RefObject<HTMLElement>;
|
|
plugin?: boolean;
|
|
error?: boolean;
|
|
};
|
|
|
|
type CodeBlockProps = Pick<CodeBarProps, 'lang' | 'plugin' | 'error'> & {
|
|
codeChildren: React.ReactNode;
|
|
classProp?: string;
|
|
};
|
|
|
|
const CodeBar: React.FC<CodeBarProps> = React.memo(({ lang, codeRef, error, plugin = null }) => {
|
|
const localize = useLocalize();
|
|
const [isCopied, setIsCopied] = useState(false);
|
|
return (
|
|
<div className="relative flex items-center rounded-tl-md rounded-tr-md bg-gray-700 px-4 py-2 font-sans text-xs text-gray-200 dark:bg-gray-700">
|
|
<span className="">{lang}</span>
|
|
{plugin === true ? (
|
|
<InfoIcon className="ml-auto flex h-4 w-4 gap-2 text-white/50" />
|
|
) : (
|
|
<button
|
|
type="button"
|
|
className={cn(
|
|
'ml-auto flex gap-2',
|
|
error === true ? 'h-4 w-4 items-start text-white/50' : '',
|
|
)}
|
|
onClick={async () => {
|
|
const codeString = codeRef.current?.textContent;
|
|
if (codeString != null) {
|
|
setIsCopied(true);
|
|
copy(codeString, { format: 'text/plain' });
|
|
|
|
setTimeout(() => {
|
|
setIsCopied(false);
|
|
}, 3000);
|
|
}
|
|
}}
|
|
>
|
|
{isCopied ? (
|
|
<>
|
|
<CheckMark className="h-[18px] w-[18px]" />
|
|
{error === true ? '' : localize('com_ui_copied')}
|
|
</>
|
|
) : (
|
|
<>
|
|
<Clipboard />
|
|
{error === true ? '' : localize('com_ui_copy_code')}
|
|
</>
|
|
)}
|
|
</button>
|
|
)}
|
|
</div>
|
|
);
|
|
});
|
|
|
|
const CodeBlock: React.FC<CodeBlockProps> = ({
|
|
lang,
|
|
codeChildren,
|
|
classProp = '',
|
|
plugin = null,
|
|
error,
|
|
}) => {
|
|
const codeRef = useRef<HTMLElement>(null);
|
|
const language = plugin || error ? 'json' : lang;
|
|
|
|
return (
|
|
<div className="w-full rounded-md bg-gray-900 text-xs text-white/80">
|
|
<CodeBar lang={lang} codeRef={codeRef} plugin={!!plugin} error={error} />
|
|
<div className={cn(classProp, 'overflow-y-auto p-4')}>
|
|
<code
|
|
ref={codeRef}
|
|
className={cn(
|
|
plugin || error ? '!whitespace-pre-wrap' : `hljs language-${language} !whitespace-pre`,
|
|
)}
|
|
>
|
|
{codeChildren}
|
|
</code>
|
|
</div>
|
|
</div>
|
|
);
|
|
};
|
|
|
|
export default CodeBlock;
|