diff --git a/modules/rsocials/components/folk-thread-builder.ts b/modules/rsocials/components/folk-thread-builder.ts index 4aa9b55..f7cf162 100644 --- a/modules/rsocials/components/folk-thread-builder.ts +++ b/modules/rsocials/components/folk-thread-builder.ts @@ -405,7 +405,7 @@ export class FolkThreadBuilder extends HTMLElement { // ── Draft management (Automerge) ── - private saveDraft() { + private async saveDraft() { const sr = this.shadowRoot; if (!sr) return; const textarea = sr.getElementById('thread-input') as HTMLTextAreaElement; @@ -435,8 +435,8 @@ export class FolkThreadBuilder extends HTMLElement { this._thread = thread; - // Save via Automerge - this.saveToAutomerge(thread); + // Save via Automerge (await ensures doc is open first) + await this.saveToAutomerge(thread); // Update URL history.replaceState(null, '', this.basePath + 'thread/' + this._threadId + '/edit'); @@ -562,7 +562,7 @@ export class FolkThreadBuilder extends HTMLElement { private async generateImage() { if (!this._threadId) { - this.saveDraft(); + await this.saveDraft(); if (!this._threadId) return; } @@ -588,7 +588,7 @@ export class FolkThreadBuilder extends HTMLElement { // Update Automerge with new image URL if (this._thread) { this._thread.imageUrl = data.imageUrl; - this.saveToAutomerge(this._thread); + await this.saveToAutomerge(this._thread); } } else { genBtn.textContent = 'Generation Failed'; @@ -604,7 +604,7 @@ export class FolkThreadBuilder extends HTMLElement { private async uploadImage(file: File) { if (!this._threadId) { - this.saveDraft(); + await this.saveDraft(); if (!this._threadId) return; } @@ -631,7 +631,7 @@ export class FolkThreadBuilder extends HTMLElement { genBtn.textContent = 'Replace with AI'; if (this._thread) { this._thread.imageUrl = data.imageUrl; - this.saveToAutomerge(this._thread); + await this.saveToAutomerge(this._thread); } } else { uploadBtn.textContent = data.error || 'Upload Failed'; @@ -647,7 +647,7 @@ export class FolkThreadBuilder extends HTMLElement { private async uploadTweetImage(index: string, file: File) { if (!this._threadId) { - this.saveDraft(); + await this.saveDraft(); if (!this._threadId) return; } @@ -660,7 +660,7 @@ export class FolkThreadBuilder extends HTMLElement { this._tweetImages[index] = data.imageUrl; if (this._thread) { this._thread.tweetImages = { ...this._tweetImages }; - this.saveToAutomerge(this._thread); + await this.saveToAutomerge(this._thread); } this.renderPreview(); } @@ -669,7 +669,7 @@ export class FolkThreadBuilder extends HTMLElement { private async generateTweetImage(index: string) { if (!this._threadId) { - this.saveDraft(); + await this.saveDraft(); if (!this._threadId) return; } @@ -684,7 +684,7 @@ export class FolkThreadBuilder extends HTMLElement { this._tweetImages[index] = data.imageUrl; if (this._thread) { this._thread.tweetImages = { ...this._tweetImages }; - this.saveToAutomerge(this._thread); + await this.saveToAutomerge(this._thread); } this.renderPreview(); } else if (btn) { @@ -703,7 +703,7 @@ export class FolkThreadBuilder extends HTMLElement { delete this._tweetImages[index]; if (this._thread) { this._thread.tweetImages = Object.keys(this._tweetImages).length ? { ...this._tweetImages } : undefined; - this.saveToAutomerge(this._thread); + await this.saveToAutomerge(this._thread); } this.renderPreview(); } catch (e) { console.error('Tweet image removal failed:', e); } @@ -919,7 +919,7 @@ export class FolkThreadBuilder extends HTMLElement { shareBtn.disabled = true; try { - this.saveDraft(); + await this.saveDraft(); if (!this._threadId) { shareBtn.textContent = 'Share'; shareBtn.disabled = false; return; } if (imagePreview?.hidden) {