Skip to content

Commit 1dcdb8c

Browse files
authored
Merge branch 'dev' into feat/apple-app-site-association
2 parents de4137c + 06fbb0e commit 1dcdb8c

File tree

13 files changed

+194
-88
lines changed

13 files changed

+194
-88
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
"@wireapp/avs": "10.2.7",
1717
"@wireapp/avs-debugger": "0.0.7",
1818
"@wireapp/commons": "5.4.5",
19-
"@wireapp/core": "46.39.7",
19+
"@wireapp/core": "46.39.10",
2020
"@wireapp/kalium-backup": "0.0.4",
2121
"@wireapp/promise-queue": "2.4.5",
2222
"@wireapp/react-ui-kit": "9.68.0",

src/script/Config.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ const config = {
8989
ALLOWED_IMAGE_TYPES: ['image/bmp', 'image/gif', 'image/jpeg', 'image/jpg', 'image/png', 'image/webp'],
9090

9191
/** Which min and max version of the backend api do we support */
92-
SUPPORTED_API_RANGE: [MINIMUM_API_VERSION, 11],
92+
SUPPORTED_API_RANGE: [MINIMUM_API_VERSION, env.ENABLE_DEV_BACKEND_API ? Infinity : 11],
9393

9494
/** DataDog client api keys access */
9595
dataDog: {

src/script/components/Conversation/Conversation.tsx

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -478,13 +478,14 @@ export const Conversation = ({
478478
const isCellsEnabled =
479479
Config.getConfig().FEATURE.ENABLE_CELLS && activeConversation?.cellsState() !== CONVERSATION_CELLS_STATE.DISABLED;
480480

481-
const {getRootProps, getInputProps, openAllFilesView, openImageFilesView, isDragAccept} = useFilesUploadDropzone({
482-
isTeam: inTeam,
483-
cellsRepository: repositories.cells,
484-
conversation: activeConversation,
485-
isCellsEnabled: isCellsEnabled,
486-
isDisabled: isFileTabActive,
487-
});
481+
const {getRootProps, getInputProps, openAllFilesView, openImageFilesView, handlePastedFile, isDragAccept} =
482+
useFilesUploadDropzone({
483+
isTeam: inTeam,
484+
cellsRepository: repositories.cells,
485+
conversation: activeConversation,
486+
isCellsEnabled: isCellsEnabled,
487+
isDisabled: isFileTabActive,
488+
});
488489

489490
return (
490491
<ConversationFileDropzone
@@ -595,10 +596,12 @@ export const Conversation = ({
595596
storageRepository={repositories.storage}
596597
teamState={teamState}
597598
selfUser={selfUser}
599+
isCellsEnabled={isCellsEnabled}
598600
onShiftTab={() => setMsgElementsFocusable(false)}
599601
uploadDroppedFiles={uploadDroppedFiles}
600602
uploadImages={uploadImages}
601603
uploadFiles={uploadFiles}
604+
uploadPastedFiles={checkFileSharingPermission(handlePastedFile)}
602605
onCellImageUpload={openImageFilesView}
603606
onCellAssetUpload={openAllFilesView}
604607
/>

src/script/components/Conversation/useFilesUploadDropzone/useFilesUploadDropzone.ts

Lines changed: 42 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -73,32 +73,7 @@ export const useFilesUploadDropzone = ({
7373
disabled: isDisabled,
7474
accept,
7575
onDrop: checkFileSharingPermission(async (acceptedFiles: File[], rejectedFiles: FileRejection[]) => {
76-
const newFiles = [...acceptedFiles, ...rejectedFiles.map(file => file.file)];
77-
78-
const validationResult = validateFiles({
79-
newFiles,
80-
currentFiles: files,
81-
maxSize: MAX_SIZE,
82-
maxFiles: MAX_FILES,
83-
});
84-
85-
if (!validationResult.isValid) {
86-
const {error, invalidFiles} = validationResult as Extract<ValidationResult, {isValid: false}>;
87-
showFileDropzoneErrorModal({
88-
title: error.title,
89-
message: error.message,
90-
invalidFiles,
91-
});
92-
return;
93-
}
94-
95-
const transformedAcceptedFiles = transformAcceptedFiles(acceptedFiles);
96-
97-
addFiles({conversationId: conversation.id, files: transformedAcceptedFiles});
98-
99-
await attatchMetadataToFiles(transformedAcceptedFiles);
100-
101-
await uploadFiles(transformedAcceptedFiles);
76+
await processIncomingFiles(acceptedFiles, rejectedFiles, files, MAX_SIZE, MAX_FILES, conversation.id);
10277
}),
10378
onError: (error: Error) => {
10479
logger.error('Dropping files failed', error);
@@ -116,6 +91,46 @@ export const useFilesUploadDropzone = ({
11691
},
11792
});
11893

94+
const processIncomingFiles = async (
95+
acceptedFiles: File[],
96+
rejectedFiles: FileRejection[],
97+
files: FileWithPreview[],
98+
maxSize: number,
99+
maxFiles: number,
100+
conversationId: string,
101+
) => {
102+
const newFiles = [...acceptedFiles, ...rejectedFiles.map(file => file.file)];
103+
104+
const validationResult = validateFiles({
105+
newFiles,
106+
currentFiles: files,
107+
maxSize,
108+
maxFiles,
109+
});
110+
111+
if (!validationResult.isValid) {
112+
const {error, invalidFiles} = validationResult as Extract<ValidationResult, {isValid: false}>;
113+
showFileDropzoneErrorModal({
114+
title: error.title,
115+
message: error.message,
116+
invalidFiles,
117+
});
118+
return;
119+
}
120+
121+
const transformedAcceptedFiles = transformAcceptedFiles(acceptedFiles);
122+
123+
addFiles({conversationId, files: transformedAcceptedFiles});
124+
125+
await attatchMetadataToFiles(transformedAcceptedFiles);
126+
127+
await uploadFiles(transformedAcceptedFiles);
128+
};
129+
130+
const handlePastedFile = async (file: File) => {
131+
await processIncomingFiles([file], [], files, MAX_SIZE, MAX_FILES, conversation.id);
132+
};
133+
119134
const uploadFile = async (file: FileWithPreview) => {
120135
// Temporary solution to handle the local development
121136
// TODO: remove this once we have a proper way to handle the domain per env
@@ -200,5 +215,5 @@ export const useFilesUploadDropzone = ({
200215
delayedOpen();
201216
};
202217

203-
return {getRootProps, getInputProps, openAllFilesView, openImageFilesView, isDragAccept};
218+
return {getRootProps, getInputProps, openAllFilesView, openImageFilesView, handlePastedFile, isDragAccept};
204219
};

src/script/components/InputBar/InputBar.test.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,11 +86,13 @@ describe('InputBar', () => {
8686
propertiesRepository,
8787
searchRepository,
8888
storageRepository,
89+
isCellsEnabled: false,
8990
teamState: new TeamState(),
9091
selfUser: new User('id'),
9192
onShiftTab: jest.fn(),
9293
uploadDroppedFiles: jest.fn(),
9394
uploadImages: jest.fn(),
95+
uploadPastedFiles: jest.fn(),
9496
uploadFiles: jest.fn(),
9597
onCellImageUpload: jest.fn(),
9698
onCellAssetUpload: jest.fn(),

src/script/components/InputBar/InputBar.tsx

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -84,10 +84,12 @@ interface InputBarProps {
8484
readonly storageRepository: StorageRepository;
8585
readonly teamState: TeamState;
8686
readonly selfUser: User;
87+
readonly isCellsEnabled: boolean;
8788
onShiftTab: () => void;
8889
uploadDroppedFiles: (droppedFiles: File[]) => void;
8990
uploadImages: (images: File[]) => void;
9091
uploadFiles: (files: File[]) => void;
92+
uploadPastedFiles: (file: File) => void;
9193
onCellImageUpload: () => void;
9294
onCellAssetUpload: () => void;
9395
}
@@ -104,20 +106,19 @@ export const InputBar = ({
104106
storageRepository,
105107
selfUser,
106108
teamState = container.resolve(TeamState),
109+
isCellsEnabled,
107110
onShiftTab,
108111
uploadDroppedFiles,
109112
uploadImages,
110113
uploadFiles,
114+
uploadPastedFiles,
111115
onCellImageUpload,
112116
onCellAssetUpload,
113117
}: InputBarProps) => {
114-
const {classifiedDomains, isSelfDeletingMessagesEnabled, isFileSharingSendingEnabled, isCellsEnabled} =
115-
useKoSubscribableChildren(teamState, [
116-
'classifiedDomains',
117-
'isSelfDeletingMessagesEnabled',
118-
'isFileSharingSendingEnabled',
119-
'isCellsEnabled',
120-
]);
118+
const {classifiedDomains, isSelfDeletingMessagesEnabled, isFileSharingSendingEnabled} = useKoSubscribableChildren(
119+
teamState,
120+
['classifiedDomains', 'isSelfDeletingMessagesEnabled', 'isFileSharingSendingEnabled'],
121+
);
121122
const {connection, localMessageTimer, messageTimer, hasGlobalMessageTimer, isSelfUserRemoved, is1to1} =
122123
useKoSubscribableChildren(conversation, [
123124
'connection',
@@ -126,6 +127,7 @@ export const InputBar = ({
126127
'hasGlobalMessageTimer',
127128
'isSelfUserRemoved',
128129
'is1to1',
130+
'cellsState',
129131
]);
130132
const {isOutgoingRequest, isIncomingRequest} = useKoSubscribableChildren(connection!, [
131133
'isOutgoingRequest',
@@ -197,6 +199,7 @@ export const InputBar = ({
197199
const fileHandling = useFileHandling({
198200
uploadDroppedFiles,
199201
uploadImages,
202+
isFileNameKept: isCellsEnabled,
200203
});
201204

202205
const showMarkdownPreview = useUserPropertyValue<boolean>(
@@ -231,6 +234,11 @@ export const InputBar = ({
231234
sendPastedFile: fileHandling.sendPastedFile,
232235
});
233236

237+
if (fileHandling.pastedFile && !!isCellsEnabled) {
238+
uploadPastedFiles(fileHandling.pastedFile);
239+
fileHandling.clearPastedFile();
240+
}
241+
234242
const ping = usePing({
235243
conversation,
236244
messageRepository,
@@ -343,7 +351,7 @@ export const InputBar = ({
343351
</>
344352
)}
345353

346-
{fileHandling.pastedFile && (
354+
{fileHandling.pastedFile && !isCellsEnabled && (
347355
<PastedFileControls
348356
pastedFile={fileHandling.pastedFile}
349357
onClear={fileHandling.clearPastedFile}

src/script/components/InputBar/useFileHandling/useFileHandling.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,15 +28,17 @@ import {useFilePaste} from './useFilePaste/useFilePaste';
2828
interface UseFileHandlingProps {
2929
uploadDroppedFiles: (files: File[]) => void;
3030
uploadImages: (images: File[]) => void;
31+
isFileNameKept?: boolean;
3132
}
3233

33-
export const useFileHandling = ({uploadDroppedFiles, uploadImages}: UseFileHandlingProps) => {
34+
export const useFileHandling = ({uploadDroppedFiles, uploadImages, isFileNameKept}: UseFileHandlingProps) => {
3435
const [pastedFile, setPastedFile] = useState<File | null>(null);
3536

3637
useFilePaste({
3738
onFilePasted: file => {
3839
setPastedFile(file);
3940
},
41+
isFileNameKept,
4042
});
4143

4244
const clearPastedFile = () => setPastedFile(null);

src/script/components/InputBar/useFileHandling/useFilePaste/useFilePaste.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,10 @@ import {getFileExtension} from 'Util/util';
2626

2727
interface UseFilePasteParams {
2828
onFilePasted: (file: File) => void;
29+
isFileNameKept?: boolean;
2930
}
3031

31-
export const useFilePaste = ({onFilePasted}: UseFilePasteParams) => {
32+
export const useFilePaste = ({onFilePasted, isFileNameKept}: UseFilePasteParams) => {
3233
const processClipboardFiles = useCallback(
3334
(files: FileList): void => {
3435
const [pastedFile] = files;
@@ -39,15 +40,17 @@ export const useFilePaste = ({onFilePasted}: UseFilePasteParams) => {
3940
const {lastModified} = pastedFile;
4041

4142
const date = formatLocale(lastModified || new Date(), 'PP, pp');
42-
const fileName = `${t('conversationSendPastedFile', {date})}.${getFileExtension(pastedFile.name)}`;
43+
const fileName = isFileNameKept
44+
? pastedFile.name
45+
: `${t('conversationSendPastedFile', {date})}.${getFileExtension(pastedFile.name)}`;
4346

4447
const newFile = new File([pastedFile], fileName, {
4548
type: pastedFile.type,
4649
});
4750

4851
onFilePasted(newFile);
4952
},
50-
[onFilePasted],
53+
[onFilePasted, isFileNameKept],
5154
);
5255

5356
const handlePasteEvent = useCallback(

src/script/repositories/assets/AssetRepository.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ describe('AssetRepository', () => {
145145
it('uploads assets with audit log enabled when specified if required metadata is present', async () => {
146146
isAuditLogEnabled = true;
147147
const assetAuditData = {
148-
conversationId: {domain: 'domain', id: 'id'},
148+
convId: {domain: 'domain', id: 'id'},
149149
filename: 'filename',
150150
filetype: 'filetype',
151151
};
@@ -167,7 +167,7 @@ describe('AssetRepository', () => {
167167
it('does not upload asset when audit log is enabled and required metadata is missing', async () => {
168168
isAuditLogEnabled = true;
169169
const assetAuditData = {
170-
conversationId: {domain: 'domain', id: 'id'},
170+
convId: {domain: 'domain', id: 'id'},
171171
filename: 'filename',
172172
filetype: '',
173173
};

src/script/repositories/assets/AssetRepository.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -252,10 +252,7 @@ export class AssetRepository {
252252

253253
if (isAuditLogEnabled) {
254254
const isIncompleteAuditData =
255-
!options.auditData ||
256-
!options.auditData.conversationId ||
257-
!options.auditData.filename ||
258-
!options.auditData.filetype;
255+
!options.auditData || !options.auditData.convId || !options.auditData.filename || !options.auditData.filetype;
259256
if (isIncompleteAuditData) {
260257
this.removeFromUploadQueue(messageId);
261258
throw new Error('Audit data is incomplete, file cannot be uploaded');

0 commit comments

Comments
 (0)