mirror of
https://github.com/danny-avila/LibreChat.git
synced 2025-12-17 08:50:15 +01:00
* BIG UI UPDATE * fix: search bar, dialog template, new chat icon, convo icon and delete/rename button * moved some color config and a lot of files * small text fixes and tailwind config refactor * Update localization and UI styles * Update styles and add user-select:none to Tooltip component * Update mobile.css styles for navigation mask and background color * Update component imports and styles * Update DeleteButton imports and references * Update UI components * Update tooltip delay duration * Fix styling and update text in various components * fixed assistant style * minor style fixes * revert: removed CreationHeader & CreationPanel * style: match new styling for SidePanel * style: match bg-gray-800 to ChatGPT (#212121) * style: remove slate for gray where applicable to match new light theme --------- Co-authored-by: Danny Avila <messagedaniel@protonmail.com>
88 lines
2.5 KiB
TypeScript
88 lines
2.5 KiB
TypeScript
import React, { useState } from 'react';
|
|
import { FileUp } from 'lucide-react';
|
|
import { cn } from '~/utils/';
|
|
import { useLocalize } from '~/hooks';
|
|
|
|
type FileUploadProps = {
|
|
onFileSelected: (jsonData: Record<string, unknown>) => void;
|
|
className?: string;
|
|
containerClassName?: string;
|
|
successText?: string;
|
|
invalidText?: string;
|
|
validator?: ((data: Record<string, unknown>) => boolean) | null;
|
|
text?: string;
|
|
id?: string;
|
|
};
|
|
|
|
const FileUpload: React.FC<FileUploadProps> = ({
|
|
onFileSelected,
|
|
className = '',
|
|
containerClassName = '',
|
|
successText = null,
|
|
invalidText = null,
|
|
validator = null,
|
|
text = null,
|
|
id = '1',
|
|
}) => {
|
|
const [statusColor, setStatusColor] = useState<string>('text-gray-600');
|
|
const [status, setStatus] = useState<null | string>(null);
|
|
const localize = useLocalize();
|
|
|
|
const handleFileChange = (event: React.ChangeEvent<HTMLInputElement>): void => {
|
|
const file = event.target.files?.[0];
|
|
if (!file) {
|
|
return;
|
|
}
|
|
|
|
const reader = new FileReader();
|
|
reader.onload = (e) => {
|
|
const jsonData = JSON.parse(e.target?.result as string);
|
|
if (validator && !validator(jsonData)) {
|
|
setStatus('invalid');
|
|
setStatusColor('text-red-600');
|
|
return;
|
|
}
|
|
|
|
if (validator) {
|
|
setStatus('success');
|
|
setStatusColor('text-green-500 dark:text-green-500');
|
|
}
|
|
|
|
onFileSelected(jsonData);
|
|
};
|
|
reader.readAsText(file);
|
|
};
|
|
|
|
let statusText: string;
|
|
if (!status) {
|
|
statusText = text ?? localize('com_endpoint_import');
|
|
} else if (status === 'success') {
|
|
statusText = successText ?? localize('com_ui_upload_success');
|
|
} else {
|
|
statusText = invalidText ?? localize('com_ui_upload_invalid');
|
|
}
|
|
|
|
return (
|
|
<label
|
|
htmlFor={`file-upload-${id}`}
|
|
className={cn(
|
|
'mr-1 flex h-auto cursor-pointer items-center rounded bg-transparent px-2 py-1 text-xs font-medium font-normal transition-colors hover:bg-gray-100 hover:text-green-700 dark:bg-transparent dark:text-gray-300 dark:hover:bg-gray-800 dark:hover:text-green-500',
|
|
statusColor,
|
|
containerClassName,
|
|
)}
|
|
>
|
|
<FileUp className="mr-1 flex w-[22px] items-center stroke-1" />
|
|
<span className="flex text-xs ">{statusText}</span>
|
|
<input
|
|
id={`file-upload-${id}`}
|
|
value=""
|
|
type="file"
|
|
className={cn('hidden ', className)}
|
|
accept=".json"
|
|
onChange={handleFileChange}
|
|
/>
|
|
</label>
|
|
);
|
|
};
|
|
|
|
export default FileUpload;
|