Skip to content

Commit 6758199

Browse files
authored
fix: app info modal avatar upload method replace (#5787)
* fix: app info modal avatar upload method replace * chore: replace all useSelectFile with useUploadAvatar
1 parent 603c5a2 commit 6758199

File tree

7 files changed

+43
-171
lines changed

7 files changed

+43
-171
lines changed

projects/app/src/pageComponents/app/detail/InfoModal.tsx

Lines changed: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import CollaboratorContextProvider from '@/components/support/permission/MemberManager/context';
22
import ResumeInherit from '@/components/support/permission/ResumeInheritText';
33
import { AppContext } from './context';
4-
import { useSelectFile } from '@/web/common/file/hooks/useSelectFile';
54
import { resumeInheritPer } from '@/web/core/app/api';
65
import {
76
deleteAppCollaborators,
@@ -21,7 +20,6 @@ import {
2120
import type { RequireOnlyOne } from '@fastgpt/global/common/type/utils';
2221
import type { AppSchema } from '@fastgpt/global/core/app/type.d';
2322
import { AppRoleList } from '@fastgpt/global/support/permission/app/constant';
24-
import type { PermissionValueType } from '@fastgpt/global/support/permission/type';
2523
import Avatar from '@fastgpt/web/components/common/Avatar';
2624
import MyIcon from '@fastgpt/web/components/common/Icon';
2725
import MyModal from '@fastgpt/web/components/common/MyModal';
@@ -32,20 +30,18 @@ import React, { useCallback } from 'react';
3230
import { useForm } from 'react-hook-form';
3331
import { useContextSelector } from 'use-context-selector';
3432
import { ReadRoleVal } from '@fastgpt/global/support/permission/constant';
33+
import { useUploadAvatar } from '@fastgpt/web/common/file/hooks/useUploadAvatar';
34+
import { getUploadAvatarPresignedUrl } from '@/web/common/file/api';
3535

3636
const InfoModal = ({ onClose }: { onClose: () => void }) => {
3737
const { t } = useTranslation();
3838
const { toast } = useToast();
3939
const { updateAppDetail, appDetail, reloadApp } = useContextSelector(AppContext, (v) => v);
4040

41-
const {
42-
File,
43-
onOpen: onOpenSelectFile,
44-
onSelectImage
45-
} = useSelectFile({
46-
fileType: '.jpg,.png',
47-
multiple: false
48-
});
41+
const { Component: AvatarUploader, handleFileSelectorOpen: handleAvatarSelectorOpen } =
42+
useUploadAvatar(getUploadAvatarPresignedUrl, {
43+
onSuccess: (avatar) => setValue('avatar', avatar)
44+
});
4945

5046
const {
5147
register,
@@ -134,7 +130,7 @@ const InfoModal = ({ onClose }: { onClose: () => void }) => {
134130
borderRadius={'md'}
135131
mr={4}
136132
title={t('common:set_avatar')}
137-
onClick={() => onOpenSelectFile()}
133+
onClick={handleAvatarSelectorOpen}
138134
/>
139135
<FormControl>
140136
<Input
@@ -220,15 +216,7 @@ const InfoModal = ({ onClose }: { onClose: () => void }) => {
220216
</Button>
221217
</ModalFooter>
222218

223-
<File
224-
onSelect={(e) =>
225-
onSelectImage(e, {
226-
maxH: 300,
227-
maxW: 300,
228-
callback: (e) => setValue('avatar', e)
229-
})
230-
}
231-
/>
219+
<AvatarUploader />
232220
</MyModal>
233221
);
234222
};

projects/app/src/pageComponents/dashboard/apps/CreateModal.tsx

Lines changed: 11 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import {
1010
Textarea,
1111
ModalFooter
1212
} from '@chakra-ui/react';
13-
import { useSelectFile } from '@/web/common/file/hooks/useSelectFile';
1413
import { useForm } from 'react-hook-form';
1514
import { postCreateApp } from '@/web/core/app/api';
1615
import { useRouter } from 'next/router';
@@ -33,6 +32,8 @@ import {
3332
import { useSystemStore } from '@/web/common/system/useSystemStore';
3433
import FillRowTabs from '@fastgpt/web/components/common/Tabs/FillRowTabs';
3534
import { appTypeMap } from '@/pageComponents/app/constants';
35+
import { useUploadAvatar } from '@fastgpt/web/common/file/hooks/useUploadAvatar';
36+
import { getUploadAvatarPresignedUrl } from '@/web/common/file/api';
3637

3738
type FormType = {
3839
avatar: string;
@@ -69,14 +70,13 @@ const CreateModal = ({ onClose, type }: { type: CreateAppType; onClose: () => vo
6970
});
7071

7172
const avatar = watch('avatar');
72-
const {
73-
File,
74-
onOpen: onOpenSelectFile,
75-
onSelectImage
76-
} = useSelectFile({
77-
fileType: '.jpg,.png',
78-
multiple: false
79-
});
73+
74+
const { Component: AvatarUploader, handleFileSelectorOpen: handleAvatarSelectorOpen } =
75+
useUploadAvatar(getUploadAvatarPresignedUrl, {
76+
onSuccess(avatar) {
77+
setValue('avatar', avatar);
78+
}
79+
});
8080

8181
const { runAsync: onclickCreate, loading: isCreating } = useRequest2(
8282
async ({ avatar, name, curlContent }: FormType, templateId?: string) => {
@@ -153,7 +153,7 @@ const CreateModal = ({ onClose, type }: { type: CreateAppType; onClose: () => vo
153153
h={['28px', '36px']}
154154
cursor={'pointer'}
155155
borderRadius={'md'}
156-
onClick={onOpenSelectFile}
156+
onClick={handleAvatarSelectorOpen}
157157
/>
158158
</MyTooltip>
159159
<Input
@@ -322,15 +322,7 @@ const CreateModal = ({ onClose, type }: { type: CreateAppType; onClose: () => vo
322322
)}
323323
</ModalFooter>
324324

325-
<File
326-
onSelect={(e) =>
327-
onSelectImage(e, {
328-
maxH: 300,
329-
maxW: 300,
330-
callback: (e) => setValue('avatar', e)
331-
})
332-
}
333-
/>
325+
<AvatarUploader />
334326
</MyModal>
335327
);
336328
};

projects/app/src/pageComponents/dashboard/apps/HttpToolsCreateModal.tsx

Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import React, { useState } from 'react';
22
import { Box, Flex, Button, ModalBody, Input, Textarea, ModalFooter } from '@chakra-ui/react';
3-
import { useSelectFile } from '@/web/common/file/hooks/useSelectFile';
43
import { useForm } from 'react-hook-form';
54
import { useRequest2 } from '@fastgpt/web/hooks/useRequest';
65
import Avatar from '@fastgpt/web/components/common/Avatar';
@@ -15,6 +14,8 @@ import { useRouter } from 'next/router';
1514
import type { StoreSecretValueType } from '@fastgpt/global/common/secret/type';
1615
import LeftRadio from '@fastgpt/web/components/common/Radio/LeftRadio';
1716
import MyIcon from '@fastgpt/web/components/common/Icon';
17+
import { useUploadAvatar } from '@fastgpt/web/common/file/hooks/useUploadAvatar';
18+
import { getUploadAvatarPresignedUrl } from '@/web/common/file/api';
1819

1920
export type HttpToolsType = {
2021
id?: string;
@@ -68,14 +69,12 @@ const HttpPluginCreateModal = ({ onClose }: { onClose: () => void }) => {
6869
}
6970
);
7071

71-
const {
72-
File,
73-
onOpen: onOpenSelectFile,
74-
onSelectImage
75-
} = useSelectFile({
76-
fileType: 'image/*',
77-
multiple: false
78-
});
72+
const { Component: AvatarUploader, handleFileSelectorOpen: handleAvatarSelectorOpen } =
73+
useUploadAvatar(getUploadAvatarPresignedUrl, {
74+
onSuccess(avatar) {
75+
setValue('avatar', avatar);
76+
}
77+
});
7978

8079
return (
8180
<>
@@ -100,7 +99,7 @@ const HttpPluginCreateModal = ({ onClose }: { onClose: () => void }) => {
10099
h={['28px', '32px']}
101100
cursor={'pointer'}
102101
borderRadius={'md'}
103-
onClick={onOpenSelectFile}
102+
onClick={handleAvatarSelectorOpen}
104103
/>
105104
</MyTooltip>
106105
<Input
@@ -185,15 +184,7 @@ const HttpPluginCreateModal = ({ onClose }: { onClose: () => void }) => {
185184
</Button>
186185
</ModalFooter>
187186
</MyModal>
188-
<File
189-
onSelect={(e) =>
190-
onSelectImage(e, {
191-
maxH: 300,
192-
maxW: 300,
193-
callback: (e) => setValue('avatar', e)
194-
})
195-
}
196-
/>
187+
<AvatarUploader />
197188
</>
198189
);
199190
};

projects/app/src/pageComponents/dashboard/apps/JsonImportModal.tsx

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { useSelectFile } from '@/web/common/file/hooks/useSelectFile';
21
import { Box, Button, Flex, Input, ModalBody, ModalFooter } from '@chakra-ui/react';
32
import Avatar from '@fastgpt/web/components/common/Avatar';
43
import MyModal from '@fastgpt/web/components/common/MyModal';
@@ -23,6 +22,8 @@ import {
2322
removeUtmParams,
2423
removeUtmWorkflow
2524
} from '@/web/support/marketing/utils';
25+
import { useUploadAvatar } from '@fastgpt/web/common/file/hooks/useUploadAvatar';
26+
import { getUploadAvatarPresignedUrl } from '@/web/common/file/api';
2627

2728
type FormType = {
2829
avatar: string;
@@ -66,14 +67,14 @@ const JsonImportModal = ({ onClose }: { onClose: () => void }) => {
6667
};
6768

6869
const avatar = watch('avatar');
69-
const {
70-
File,
71-
onOpen: onOpenSelectFile,
72-
onSelectImage
73-
} = useSelectFile({
74-
fileType: '.jpg,.png',
75-
multiple: false
76-
});
70+
71+
const { Component: AvatarUploader, handleFileSelectorOpen: handleAvatarSelectorOpen } =
72+
useUploadAvatar(getUploadAvatarPresignedUrl, {
73+
onSuccess(avatar) {
74+
setValue('avatar', avatar);
75+
}
76+
});
77+
7778
// If the user does not select an avatar, it will follow the type to change
7879
const selectedAvatar = useMemo(() => {
7980
if (avatar) return avatar;
@@ -162,7 +163,7 @@ const JsonImportModal = ({ onClose }: { onClose: () => void }) => {
162163
h={['1.75rem', '2.25rem']}
163164
cursor={'pointer'}
164165
borderRadius={'md'}
165-
onClick={onOpenSelectFile}
166+
onClick={handleAvatarSelectorOpen}
166167
/>
167168
</MyTooltip>
168169
<Input
@@ -190,15 +191,7 @@ const JsonImportModal = ({ onClose }: { onClose: () => void }) => {
190191
<Button onClick={handleSubmit(onSubmit)}>{t('common:Confirm')}</Button>
191192
</ModalFooter>
192193
</MyModal>
193-
<File
194-
onSelect={(e) =>
195-
onSelectImage(e, {
196-
maxH: 300,
197-
maxW: 300,
198-
callback: (e) => setValue('avatar', e)
199-
})
200-
}
201-
/>
194+
<AvatarUploader />
202195
</>
203196
);
204197
};

projects/app/src/web/common/file/api.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@ import type { UploadImgProps } from '@fastgpt/global/common/file/api.d';
33
import type { CreatePostPresignedUrlResult } from '@fastgpt/service/common/s3/type';
44
import { type AxiosProgressEvent } from 'axios';
55

6-
export const postUploadImg = (e: UploadImgProps) => POST<string>('/common/file/uploadImage', e);
7-
86
export const postUploadFiles = (
97
data: FormData,
108
onUploadProgress: (progressEvent: AxiosProgressEvent) => void
Lines changed: 1 addition & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
1-
import { postUploadImg, postUploadFiles } from '@/web/common/file/api';
2-
import type { UploadImgProps } from '@fastgpt/global/common/file/api';
1+
import { postUploadFiles } from '@/web/common/file/api';
32
import type { BucketNameEnum } from '@fastgpt/global/common/file/constants';
4-
import type { preUploadImgProps } from '@fastgpt/global/common/file/api';
5-
import { compressBase64Img, type CompressImgProps } from '@fastgpt/web/common/file/img';
63
import type { UploadChatFileProps, UploadDatasetFileProps } from '@/pages/api/common/file/upload';
74

85
/**
@@ -37,52 +34,3 @@ export const uploadFile2DB = async ({
3734
});
3835
return res;
3936
};
40-
41-
/**
42-
* compress image. response base64
43-
* @param maxSize The max size of the compressed image
44-
*/
45-
const compressBase64ImgAndUpload = async ({
46-
base64Img,
47-
maxW,
48-
maxH,
49-
maxSize,
50-
...props
51-
}: UploadImgProps & CompressImgProps) => {
52-
const compressUrl = await compressBase64Img({
53-
base64Img,
54-
maxW,
55-
maxH,
56-
maxSize
57-
});
58-
59-
return postUploadImg({
60-
...props,
61-
base64Img: compressUrl
62-
});
63-
};
64-
65-
export const compressImgFileAndUpload = async ({
66-
file,
67-
...props
68-
}: preUploadImgProps &
69-
CompressImgProps & {
70-
file: File;
71-
}) => {
72-
const reader = new FileReader();
73-
reader.readAsDataURL(file);
74-
75-
const base64Img = await new Promise<string>((resolve, reject) => {
76-
reader.onload = () => {
77-
resolve(reader.result as string);
78-
};
79-
reader.onerror = (err) => {
80-
reject('Load image error');
81-
};
82-
});
83-
84-
return compressBase64ImgAndUpload({
85-
base64Img,
86-
...props
87-
});
88-
};

projects/app/src/web/common/file/hooks/useSelectFile.tsx

Lines changed: 1 addition & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,7 @@ import React, { useRef, useCallback } from 'react';
22
import { Box } from '@chakra-ui/react';
33
import { useToast } from '@fastgpt/web/hooks/useToast';
44
import { useMemoizedFn } from 'ahooks';
5-
import { compressImgFileAndUpload } from '../controller';
6-
import { getErrText } from '@fastgpt/global/common/error/utils';
75
import { useTranslation } from 'next-i18next';
8-
import { useRequest2 } from '@fastgpt/web/hooks/useRequest';
96

107
export const useSelectFile = (props?: {
118
fileType?: string;
@@ -51,43 +48,8 @@ export const useSelectFile = (props?: {
5148
SelectFileDom.current && SelectFileDom.current.click();
5249
}, []);
5350

54-
const { runAsync: onSelectImage, loading } = useRequest2(
55-
async (
56-
e: File[],
57-
{
58-
maxW,
59-
maxH,
60-
callback
61-
}: {
62-
maxW?: number;
63-
maxH?: number;
64-
callback?: (e: string) => any;
65-
}
66-
) => {
67-
const file = e[0];
68-
if (!file) return Promise.resolve('Can not found image');
69-
try {
70-
const src = await compressImgFileAndUpload({
71-
file,
72-
maxW,
73-
maxH
74-
});
75-
callback?.(src);
76-
return src;
77-
} catch (err: any) {
78-
toast({
79-
title: getErrText(err, t('common:error.upload_image_error')),
80-
status: 'warning'
81-
});
82-
return Promise.reject(getErrText(err, t('common:error.upload_image_error')));
83-
}
84-
}
85-
);
86-
8751
return {
8852
File,
89-
onOpen,
90-
onSelectImage,
91-
loading
53+
onOpen
9254
};
9355
};

0 commit comments

Comments
 (0)