mirror of
https://github.com/labring/FastGPT.git
synced 2025-10-20 18:54:09 +00:00

* add dynamic inputRender (#5127) * dynamic input component * fix * fix * fix * perf: dynamic render input * update doc * perf: error catch * num input ui * fix form render (#5177) * perf: i18n check * add log * doc * Sync dataset (#5181) * perf: api dataset create (#5047) * Sync dataset (#5120) * add * wait * restructure dataset sync, update types and APIs, add sync hints, and remove legacy logic * feat: add function to retrieve real file ID from third-party doc library and rename team permission check function for clarity * fix come console * refactor: rename team dataset limit check functions for clarity, update API dataset sync limit usage, and rename root directory to "ROOT_FOLDER" * frat: update sync dataset login * fix delete.ts * feat: update pnpm-lock.yaml to include bullmq, fix comments in api.d.ts and type.d.ts, rename API file ID field, optimize dataset sync logic, and add website sync feature with related APIs * feat: update CollectionCard to support site dataset sync, add API root ID constant and init sync API * feat: add RootCollectionId constant to replace hardcoded root ID --------- Co-authored-by: dreamer6680 <146868355@qq.com> * perf: code * feat: update success message for dataset sync, revise related i18n texts, and optimize file selection logic (#5166) Co-authored-by: dreamer6680 <146868355@qq.com> * perf: select file * Sync dataset (#5180) * feat: update success message for dataset sync, revise related i18n texts, and optimize file selection logic * fix: make listfile function return rawid string --------- Co-authored-by: dreamer6680 <146868355@qq.com> * init sh * fix: ts --------- Co-authored-by: dreamer6680 <1468683855@qq.com> Co-authored-by: dreamer6680 <146868355@qq.com> * update doc * i18n --------- Co-authored-by: heheer <heheer@sealos.io> Co-authored-by: dreamer6680 <1468683855@qq.com> Co-authored-by: dreamer6680 <146868355@qq.com>
57 lines
1.6 KiB
TypeScript
57 lines
1.6 KiB
TypeScript
import React, { useRef, useCallback } from 'react';
|
|
import { Box } from '@chakra-ui/react';
|
|
import { useToast } from '../../../hooks/useToast';
|
|
import { useTranslation } from 'next-i18next';
|
|
export const useSelectFile = (props?: {
|
|
fileType?: string;
|
|
multiple?: boolean;
|
|
maxCount?: number;
|
|
}) => {
|
|
const { t } = useTranslation();
|
|
const { fileType = '*', multiple = false, maxCount = 10 } = props || {};
|
|
const { toast } = useToast();
|
|
const SelectFileDom = useRef<HTMLInputElement>(null);
|
|
const openSign = useRef<any>();
|
|
|
|
const File = useCallback(
|
|
({ onSelect }: { onSelect: (e: File[], sign?: any) => void }) => (
|
|
<Box position={'absolute'} w={0} h={0} overflow={'hidden'}>
|
|
<input
|
|
ref={SelectFileDom}
|
|
type="file"
|
|
accept={fileType}
|
|
multiple={multiple}
|
|
onChange={(e) => {
|
|
const files = e.target.files;
|
|
|
|
if (!files || files?.length === 0) return;
|
|
|
|
let fileList = Array.from(files);
|
|
if (fileList.length > maxCount) {
|
|
toast({
|
|
status: 'warning',
|
|
title: t('file:select_file_amount_limit', { max: maxCount })
|
|
});
|
|
fileList = fileList.slice(0, maxCount);
|
|
}
|
|
onSelect(fileList, openSign.current);
|
|
|
|
e.target.value = '';
|
|
}}
|
|
/>
|
|
</Box>
|
|
),
|
|
[fileType, maxCount, multiple, t, toast]
|
|
);
|
|
|
|
const onOpen = useCallback((sign?: any) => {
|
|
openSign.current = sign;
|
|
SelectFileDom.current && SelectFileDom.current.click();
|
|
}, []);
|
|
|
|
return {
|
|
File,
|
|
onOpen
|
|
};
|
|
};
|