Summary of changes: - Extracted archive scanning logic into a modular 'useArchiveScanner' hook for better maintainability and performance. - Refined PostModal carousel with intelligent media preloading and smoother, jitter-free transitions. - Optimized image rendering with 'decoding=async' and removed 'black flashes' between slide changes. - Updated PWA configuration to 'autoUpdate' with hourly periodic checks for fresh content. - Fixed several bugs including stories sorting, permalink parameter cleanup, and profile metadata cache restoration. - Comprehensive updates to documentation (README.md and GEMINI.md) reflecting the new architecture.
37 lines
1.0 KiB
TypeScript
37 lines
1.0 KiB
TypeScript
import { ArchiveFile } from '../types';
|
|
|
|
export class LocalArchiveFile implements ArchiveFile {
|
|
constructor(private file: File) {}
|
|
get name() { return this.file.name; }
|
|
get webkitRelativePath() { return this.file.webkitRelativePath; }
|
|
get size() { return this.file.size; }
|
|
text() { return this.file.text(); }
|
|
arrayBuffer() { return this.file.arrayBuffer(); }
|
|
stream() { return this.file.stream(); }
|
|
}
|
|
|
|
export class RemoteArchiveFile implements ArchiveFile {
|
|
constructor(
|
|
public name: string,
|
|
public webkitRelativePath: string,
|
|
public size: number,
|
|
public url: string
|
|
) {}
|
|
async text() {
|
|
const res = await fetch(this.url);
|
|
return res.text();
|
|
}
|
|
async arrayBuffer() {
|
|
const res = await fetch(this.url);
|
|
return res.arrayBuffer();
|
|
}
|
|
stream() {
|
|
const transform = new TransformStream();
|
|
fetch(this.url).then(res => {
|
|
if (res.body) res.body.pipeTo(transform.writable);
|
|
else transform.writable.getWriter().close();
|
|
});
|
|
return transform.readable;
|
|
}
|
|
}
|