diff --git a/src/Uno.UI/ts/Windows/Storage/Pickers/FileSavePicker.ts b/src/Uno.UI/ts/Windows/Storage/Pickers/FileSavePicker.ts index eadb187730cb..eb3a70188ab2 100644 --- a/src/Uno.UI/ts/Windows/Storage/Pickers/FileSavePicker.ts +++ b/src/Uno.UI/ts/Windows/Storage/Pickers/FileSavePicker.ts @@ -23,13 +23,9 @@ types: [], }; - if (suggestedFileName != "") { - options.suggestedName = suggestedFileName; - } - const acceptTypes = JSON.parse(fileTypesJson); - for (const acceptType of acceptTypes) { + for (const acceptType of acceptTypes) { const pickerAcceptType: FilePickerAcceptType = { accept: {}, description: acceptType.description, @@ -42,6 +38,20 @@ options.types.push(pickerAcceptType); } + if (suggestedFileName != "") { + // In case the suggested file name does not end with any extension provided by the app + // we attach the first one if such exists. This is because JS could otherwise truncate + // the filename incorrectly, e.g.: + // "this.is.a.filename" would get truncated to "this" + var lowerCaseFileName = suggestedFileName.toLowerCase(); + if (!acceptTypes.some(f => f.accept.some(a => a.extensions.some(e => lowerCaseFileName.endsWith(e.toLowerCase())))) && + acceptTypes.length > 0) { + suggestedFileName += acceptTypes[0].accept[0].extensions[0]; + } + + options.suggestedName = suggestedFileName; + } + try { const selectedFile = await showSaveFilePicker(options); const info = Uno.Storage.NativeStorageItem.getInfos(selectedFile)[0];