Skip to content

Commit 52f70c8

Browse files
committed
feat: add file upload in chat usage
1 parent e92c28b commit 52f70c8

File tree

13 files changed

+57
-11
lines changed

13 files changed

+57
-11
lines changed

client/shared/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,6 @@ export {
272272
applyDefaultFallbackGroupPermission,
273273
} from './utils/role-helper';
274274
export { uploadFile } from './utils/upload-helper';
275-
export type { UploadFileResult } from './utils/upload-helper';
275+
export type { UploadFileResult, UploadFileUsage } from './utils/upload-helper';
276276
export { parseUrlStr } from './utils/url-helper';
277277
export { sleep } from './utils/utils';

client/shared/utils/upload-helper.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@ import { getGlobalConfig } from '../model/config';
55
import { showErrorToasts } from '../manager/ui';
66
import filesize from 'filesize';
77

8+
export type UploadFileUsage = 'chat' | 'group' | 'user' | 'unknown';
9+
810
interface UploadFileOptions {
11+
usage?: UploadFileUsage;
912
onProgress?: (percent: number, progressEvent: unknown) => void;
1013
}
1114
export interface UploadFileResult {
@@ -23,6 +26,7 @@ export async function uploadFile(
2326
): Promise<UploadFileResult> {
2427
const form = new FormData();
2528
form.append('file', file);
29+
form.append('usage', options.usage ?? 'unknown');
2630

2731
const uploadFileLimit = getGlobalConfig().uploadFileLimit;
2832
if (file.size > uploadFileLimit) {

client/web/src/components/ChatBox/ChatInputBox/utils.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,9 @@ export function uploadMessageImage(image: File): Promise<{
3939
}%(${originImageSize} -> ${compressedImageSize})`
4040
);
4141
}
42-
const fileInfo = await uploadFile(uploadImage);
42+
const fileInfo = await uploadFile(uploadImage, {
43+
usage: 'chat',
44+
});
4345
const imageRemoteUrl = fileInfo.url;
4446

4547
resolve({
@@ -62,7 +64,9 @@ export async function uploadMessageFile(file: File): Promise<{
6264
name: string;
6365
url: string;
6466
}> {
65-
const fileInfo = await uploadFile(file);
67+
const fileInfo = await uploadFile(file, {
68+
usage: 'chat',
69+
});
6670

6771
return {
6872
name: file.name || fileInfo.etag,

client/web/src/components/ImageUploader.tsx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,19 @@
11
import { blobUrlToFile } from '@/utils/file-helper';
22
import clsx from 'clsx';
33
import React, { PropsWithChildren, useState } from 'react';
4-
import { uploadFile, UploadFileResult, useAsyncRequest } from 'tailchat-shared';
4+
import {
5+
uploadFile,
6+
UploadFileResult,
7+
UploadFileUsage,
8+
useAsyncRequest,
9+
} from 'tailchat-shared';
510
import { ImagePicker } from './ImagePicker';
611

712
interface ImageUploaderProps extends PropsWithChildren {
813
circle?: boolean;
914
aspect?: number;
1015
className?: string;
16+
usage?: UploadFileUsage;
1117
onUploadSuccess: (fileInfo: UploadFileResult) => void;
1218
}
1319

@@ -20,6 +26,7 @@ export const ImageUploader: React.FC<ImageUploaderProps> = React.memo(
2026
const file = await blobUrlToFile(blobUrl);
2127

2228
const fileInfo = await uploadFile(file, {
29+
usage: props.usage,
2330
onProgress(percent) {
2431
const uploadProgress = Number((percent * 100).toFixed());
2532
console.log(`进度:${uploadProgress}`);

client/web/src/components/modals/GroupDetail/Config.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ export const GroupConfig: React.FC<{
9292
<>
9393
<ImageUploader
9494
aspect={16 / 9}
95+
usage="group"
9596
onUploadSuccess={(fileInfo: UploadFileResult) => {
9697
handleModifyConfig('groupBackgroundImage', fileInfo.url);
9798
}}

client/web/src/components/modals/GroupDetail/Summary.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ export const GroupSummary: React.FC<{
6565
<div className="w-1/3 mobile:w-full mobile:text-center">
6666
<AvatarUploader
6767
circle={true}
68+
usage="group"
6869
onUploadSuccess={handleGroupAvatarChange}
6970
>
7071
<Avatar size={128} name={groupInfo.name} src={groupInfo.avatar} />

client/web/src/components/modals/SettingsView/Account.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ export const SettingsAccount: React.FC = React.memo(() => {
9595
<div className="w-1/3 mobile:w-full">
9696
<AvatarUploader
9797
circle={true}
98+
usage="user"
9899
onUploadSuccess={handleUserAvatarChange}
99100
>
100101
<Avatar size={128} src={userInfo.avatar} name={userInfo.nickname} />

server/admin/src/client/fields.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,19 +163,29 @@ export const fileFields = [
163163
width: 140,
164164
},
165165
}),
166+
createTextField('usage', {
167+
list: {
168+
width: 100,
169+
},
170+
}),
166171
createFileSizeField('size', {
167172
list: {
168173
width: 120,
169174
sort: true,
170175
},
171176
}),
172177
createTextField('metaData.content-type'),
173-
createTextField('etag'),
178+
createTextField('etag', {
179+
list: {
180+
width: 300,
181+
},
182+
}),
174183
createUserField('userId', {
175184
reference: 'users',
176185
displayField: 'nickname',
177186
list: {
178-
width: 80,
187+
width: 200,
188+
ellipsis: true,
179189
},
180190
}),
181191
createDateTimeField('createdAt', {

server/admin/src/client/i18n/zh.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ export const zhTranslation = {
5858
objectName: '对象存储名',
5959
url: '文件路径',
6060
size: '文件大小',
61+
usage: '使用场景',
6162
'metaData.content-type': '文件类型',
6263
userId: '存储用户',
6364
createdAt: '创建时间',

server/admin/src/client/resources/file.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ export const FileList: React.FC = React.memo(() => {
5151
]}
5252
tableProps={{
5353
scroll: {
54-
x: 1200,
54+
x: 1600,
5555
},
5656
}}
5757
fields={fileFields}

server/admin/src/client/routes/system/index.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ export const SystemConfig: React.FC = React.memo(() => {
6161
if (file) {
6262
const formdata = new FormData();
6363
formdata.append('file', file);
64+
formdata.append('usage', 'server');
6465

6566
const { data } = await request.put('/file/upload', formdata, {
6667
headers: {

server/models/file.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,15 @@ export class File extends TimeStamps implements Base {
5656

5757
@prop()
5858
metaData: object;
59+
60+
/**
61+
* 这个文件是用于哪里
62+
* for example: chat, group, user
63+
*/
64+
@prop({
65+
default: 'unknown',
66+
})
67+
usage: string;
5968
}
6069

6170
export type FileDocument = DocumentType<File>;

server/services/core/file.service.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ class FileService extends TcService {
112112
ctx: TcContext<
113113
{},
114114
{
115+
$multipart: any;
115116
$params: any;
116117
filename: any;
117118
}
@@ -129,6 +130,7 @@ class FileService extends TcService {
129130
}
130131

131132
const originFilename = String(ctx.meta.filename);
133+
const usage = _.get(ctx, 'meta.$multipart.usage', 'unknown');
132134

133135
const stream = ctx.params as NodeJS.ReadableStream;
134136
(stream as any).on('error', (err) => {
@@ -142,7 +144,8 @@ class FileService extends TcService {
142144
const { etag, objectName, url } = await this.saveFileStream(
143145
ctx,
144146
originFilename,
145-
stream
147+
stream,
148+
usage
146149
);
147150

148151
resolve({
@@ -211,7 +214,8 @@ class FileService extends TcService {
211214
async saveFileStream(
212215
ctx: TcContext,
213216
filename: string,
214-
fileStream: NodeJS.ReadableStream
217+
fileStream: NodeJS.ReadableStream,
218+
usage = 'unknown'
215219
): Promise<{ etag: string; url: string; objectName: string }> {
216220
const span = ctx.startSpan('file.saveFileStream');
217221
const ext = path.extname(filename);
@@ -234,7 +238,8 @@ class FileService extends TcService {
234238
ctx,
235239
tmpObjectName,
236240
etag,
237-
ext
241+
ext,
242+
usage
238243
);
239244

240245
span.finish();
@@ -253,7 +258,8 @@ class FileService extends TcService {
253258
ctx: TcContext,
254259
tmpObjectName: string,
255260
etag: string,
256-
ext: string
261+
ext: string,
262+
usage = 'unknown'
257263
): Promise<{
258264
url: string;
259265
objectName: string;
@@ -299,6 +305,7 @@ class FileService extends TcService {
299305
url,
300306
size: stat.size,
301307
metaData: stat.metaData,
308+
usage,
302309
},
303310
{
304311
upsert: true,

0 commit comments

Comments
 (0)