Skip to content

Commit c4e4504

Browse files
authored
Removes Task.Delay from file count (#192)
* Removes Task.Delay from file count by using a promise to block GetFile only for dataTransfers * Add Promise for datatransfers * Some cleanup, build verif
1 parent 0374882 commit c4e4504

File tree

6 files changed

+145
-132
lines changed

6 files changed

+145
-132
lines changed

src/Blazor.FileReader/FileReaderRef.cs

Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -215,32 +215,12 @@ internal class FileReaderRef : IFileReaderRef
215215
{
216216
public async Task<IEnumerable<IFileReference>> EnumerateFilesAsync()
217217
{
218-
var count = await GetFileCount();
218+
var count = await FileReaderJsInterop.GetFileCount(ElementRef);
219219
var result = Enumerable.Range(0, Math.Max(0, count))
220220
.Select(index => (IFileReference)new FileReference(this, index));
221221
return result;
222222
}
223223

224-
// Get the count twice. Ensure that both numbers are the same. if not, keep getting until the number is stable.
225-
// This is a workaround for the event handler firing off before the AfterDrop event.
226-
public async Task<int> GetFileCount()
227-
{
228-
var lastCount = -10;
229-
while (true)
230-
{
231-
var currentCount = await FileReaderJsInterop.GetFileCount(ElementRef);
232-
233-
if (lastCount == currentCount)
234-
{
235-
break;
236-
}
237-
238-
lastCount = currentCount;
239-
await Task.Delay(500);
240-
}
241-
242-
return lastCount;
243-
}
244224
public async Task RegisterDropEventsAsync(bool additive) =>
245225
await RegisterDropEventsAsync(new DropEventsOptions { Additive = additive });
246226

src/Blazor.FileReader/script/Clipboard.ts

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,29 @@ import { ConcatFileList } from "./ConcatFileList"
44
function RegisterPasteEvent(this: FileReaderComponent, element: HTMLElement, registerOptions: PasteEventOptions): boolean {
55
this.LogIfNull(element);
66

7-
const pasteHandler = (ev: ClipboardEvent) => {
7+
const pasteHandler = async (ev: ClipboardEvent) => {
88
if (ev.target instanceof HTMLElement) {
9-
let list = ev.clipboardData.files;
10-
if (list.length > 0) {
11-
ev.preventDefault();
12-
if (registerOptions.additive) {
13-
const existing = this.elementDataTransfers.get(element);
14-
if (existing !== undefined && existing.length > 0) {
15-
list = new ConcatFileList(existing, list);
9+
const listPromise = new Promise<FileList>(async (resolve, reject) => {
10+
try {
11+
let list = ev.clipboardData.files;
12+
if (list.length > 0) {
13+
ev.preventDefault();
14+
if (registerOptions.additive) {
15+
const existing = await this.elementDataTransfers.get(element);
16+
if (existing !== undefined && existing.length > 0) {
17+
list = new ConcatFileList(existing, list);
18+
}
19+
}
1620
}
21+
22+
resolve(list);
23+
}
24+
catch (e) {
25+
reject(e);
1726
}
18-
}
27+
});
1928

20-
this.elementDataTransfers.set(element, list);
29+
this.elementDataTransfers.set(element, listPromise);
2130
}
2231
};
2332

src/Blazor.FileReader/script/DragnDrop.ts

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -146,19 +146,26 @@ function RegisterDropEvents(this: FileReaderComponent, element: HTMLElement, reg
146146
this.LogIfNull(element);
147147

148148
const onAfterDropHandler = BuildDragEventHandler(registerOptions.onDropMethod, registerOptions.onDropScript, dropEvent);
149-
const dropHandler = async (ev: DragEvent) => {
149+
const dropHandler = (ev: DragEvent) => {
150150
ev.preventDefault();
151-
this.elementDataTransfers.clear();
151+
152152
if (ev.target instanceof HTMLElement) {
153-
let files = await getFilesAsync((ev.dataTransfer));
154-
if (registerOptions.additive) {
155-
const existing = this.elementDataTransfers.get(element) ?? new FileList();
156-
if (existing.length > 0) {
157-
files = new ConcatFileList(existing, files);
153+
const filePromise = new Promise<FileList>(async (resolve, reject) => {
154+
try {
155+
let files = await getFilesAsync(ev.dataTransfer);
156+
if (registerOptions.additive) {
157+
const existing = await this.elementDataTransfers.get(element) ?? new FileList();
158+
if (existing.length > 0) {
159+
files = new ConcatFileList(existing, files);
160+
}
161+
}
162+
resolve(files);
163+
} catch (e) {
164+
reject(e);
158165
}
159-
}
166+
});
160167

161-
this.elementDataTransfers.set(element, files);
168+
this.elementDataTransfers.set(element, filePromise);
162169
}
163170

164171
onAfterDropHandler(ev, element, this);

src/Blazor.FileReader/script/FileReaderComponent.ts

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class FileReaderComponent {
1212

1313
protected readonly dragElements = new Map<HTMLElement, DragEvents>();
1414
protected readonly pasteElements = new Map<HTMLElement, EventListenerOrEventListenerObject>();
15-
protected readonly elementDataTransfers = new Map<HTMLElement, FileList>();
15+
protected readonly elementDataTransfers = new Map<HTMLElement, Promise<FileList>>();
1616
private readonly readResultByTaskId = new Map<number, IReadFileData>();
1717

1818
protected LogIfNull(element: HTMLElement) {
@@ -29,29 +29,29 @@ class FileReaderComponent {
2929

3030
public UnregisterPasteEvent = UnregisterPasteEvent;
3131

32-
private GetFiles(element: HTMLElement): FileList {
32+
private async GetFiles(element: HTMLElement): Promise<FileList> {
3333
let files: FileList = null;
3434
if (element instanceof HTMLInputElement) {
3535
files = (element as HTMLInputElement).files;
3636
} else {
3737
const dataTransfer = this.elementDataTransfers.get(element);
3838
if (dataTransfer) {
39-
files = dataTransfer;
39+
files = await dataTransfer;
4040
}
4141
}
4242

4343
return files;
4444
}
4545

46-
public GetJSObjectReference(element: HTMLElement, fileIndex: number): File {
46+
public async GetJSObjectReference(element: HTMLElement, fileIndex: number): Promise<File> {
4747
this.LogIfNull(element);
48-
const files = this.GetFiles(element);
48+
const files = await this.GetFiles(element);
4949
return files.item(fileIndex);
5050
}
5151

52-
public GetFileCount = (element: HTMLElement): number => {
52+
public async GetFileCount(element: HTMLElement): Promise<number> {
5353
this.LogIfNull(element);
54-
const files = this.GetFiles(element);
54+
const files = await this.GetFiles(element);
5555
if (!files) {
5656
return -1;
5757
}
@@ -71,9 +71,9 @@ class FileReaderComponent {
7171
};
7272

7373
// Called from cs.
74-
public GetFileInfoFromElement = (element: HTMLElement, index: number): IFileInfo => {
74+
public async GetFileInfoFromElement(element: HTMLElement, index: number): Promise<IFileInfo> {
7575
this.LogIfNull(element);
76-
const files = this.GetFiles(element);
76+
const files = await this.GetFiles(element);
7777
if (!files) {
7878
return null;
7979
}
@@ -112,10 +112,10 @@ class FileReaderComponent {
112112
return result;
113113
}
114114

115-
public OpenRead = (element: HTMLElement, fileIndex: number, useWasmSharedBuffer: boolean): number => {
115+
public async OpenRead(element: HTMLElement, fileIndex: number, useWasmSharedBuffer: boolean): Promise<number> {
116116
this.LogIfNull(element);
117117

118-
const files = this.GetFiles(element);
118+
const files = await this.GetFiles(element);
119119
if (!files) {
120120
throw 'No FileList available.';
121121
}

0 commit comments

Comments
 (0)