fileStorage: add export actions

These are largely copied from the editor saveAs actions and allow
exporting ("downloading") a file from the browser local storage to
the file system.
This commit is contained in:
David Lechner
2022-03-01 13:44:08 -06:00
parent 80219d297f
commit a87e2c664c
7 changed files with 265 additions and 1 deletions
+2 -1
View File
@@ -17,7 +17,8 @@
"fileStorage": {
"failedToInitialize": "Failed to initial file storage. Changes will not be automatically saved.",
"failedToRead": "Failed to read file.",
"failedToWrite": "Failed to write file."
"failedToWrite": "Failed to write file.",
"failedToExport": "Failed to export file.'"
},
"flashFirmware": {
"timedOut": "The hub took too long to respond. Restart the hub and try again.",
+1
View File
@@ -16,6 +16,7 @@ export enum MessageId {
FileStorageFailedToInitialize = 'fileStorage.failedToInitialize',
FileStorageFailedToRead = 'fileStorage.failedToRead',
FileStorageFailedToWrite = 'fileStorage.failedToWrite',
FileStorageFailedToExport = 'fileStorage.failedToExport',
FlashFirmwareTimedOut = 'flashFirmware.timedOut',
FlashFirmwareBleError = 'flashFirmware.bleError',
FlashFirmwareDisconnected = 'flashFirmware.disconnected',
+6
View File
@@ -17,6 +17,7 @@ import {
} from '../ble/actions';
import { didFailToSaveAs } from '../editor/actions';
import {
fileStorageDidFailToExportFile,
fileStorageDidFailToInitialize,
fileStorageDidFailToReadFile,
fileStorageDidFailToWriteFile,
@@ -90,6 +91,7 @@ test.each([
fileStorageDidFailToInitialize(new Error('test error')),
fileStorageDidFailToReadFile('test.file', new Error('test error')),
fileStorageDidFailToWriteFile('test.file', new Error('test error')),
fileStorageDidFailToExportFile('test.file', new Error('test error')),
])('actions that should show notification: %o', async (action: AnyAction) => {
const getToasts = jest.fn().mockReturnValue([]);
const show = jest.fn();
@@ -122,6 +124,10 @@ test.each([
didCheckForUpdate(true),
bleDIServiceDidReceiveFirmwareRevision(firmwareVersion),
didFailToSaveAs(new DOMException('test message', 'AbortError')),
fileStorageDidFailToExportFile(
'test.file',
new DOMException('test message', 'AbortError'),
),
])('actions that should not show a notification: %o', async (action: AnyAction) => {
const getToasts = jest.fn().mockReturnValue([]);
const show = jest.fn();
+13
View File
@@ -19,6 +19,7 @@ import {
} from '../ble/actions';
import { didFailToSaveAs } from '../editor/actions';
import {
fileStorageDidFailToExportFile,
fileStorageDidFailToInitialize,
fileStorageDidFailToReadFile,
fileStorageDidFailToWriteFile,
@@ -402,6 +403,17 @@ function* showFileStorageFailToWrite(
yield* showUnexpectedError(MessageId.FileStorageFailedToWrite, action.error);
}
function* showFileStorageFailToExport(
action: ReturnType<typeof fileStorageDidFailToExportFile>,
): Generator {
if (action.error.name === 'AbortError') {
// user clicked cancel button - not an error
return;
}
yield* showUnexpectedError(MessageId.FileStorageFailedToExport, action.error);
}
export default function* (): Generator {
yield* takeEvery(bleDeviceDidFailToConnect, showBleDeviceDidFailToConnectError);
yield* takeEvery(bootloaderDidFailToConnect, showBootloaderDidFailToConnectError);
@@ -416,4 +428,5 @@ export default function* (): Generator {
yield* takeEvery(fileStorageDidFailToInitialize, showFileStorageFailToInitialize);
yield* takeEvery(fileStorageDidFailToReadFile, showFileStorageFailToRead);
yield* takeEvery(fileStorageDidFailToWriteFile, showFileStorageFailToWrite);
yield* takeEvery(fileStorageDidFailToExportFile, showFileStorageFailToExport);
}