fix: prevent Automerge sync from overwriting local image state
onChange handler was resetting _tweetImages on every sync event, undoing local deletions before they could round-trip. Now only updates state in readonly mode; edit mode preserves local changes. Also add cache-busting timestamps to uploaded/generated image URLs to prevent browser from showing stale cached images. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
b7111f01ee
commit
5b2862afd7
|
|
@ -121,10 +121,15 @@ export class FolkThreadBuilder extends HTMLElement {
|
||||||
|
|
||||||
this._offlineUnsub = runtime.onChange(docId, (updated: SocialsDoc) => {
|
this._offlineUnsub = runtime.onChange(docId, (updated: SocialsDoc) => {
|
||||||
if (this._threadId && updated?.threads?.[this._threadId]) {
|
if (this._threadId && updated?.threads?.[this._threadId]) {
|
||||||
// Deep-clone to avoid Automerge proxy — direct property writes
|
const synced = JSON.parse(JSON.stringify(updated.threads[this._threadId])) as ThreadData;
|
||||||
// on proxies are silently ignored outside change() calls
|
// In readonly mode, always take the synced version
|
||||||
this._thread = JSON.parse(JSON.stringify(updated.threads[this._threadId]));
|
if (this._mode === 'readonly') {
|
||||||
this._tweetImages = this._thread?.tweetImages || {};
|
this._thread = synced;
|
||||||
|
this._tweetImages = synced.tweetImages || {};
|
||||||
|
this.render();
|
||||||
|
}
|
||||||
|
// In edit mode, only update thread metadata (not images)
|
||||||
|
// to avoid overwriting in-flight local changes
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} catch (e: any) {
|
} catch (e: any) {
|
||||||
|
|
@ -652,7 +657,8 @@ export class FolkThreadBuilder extends HTMLElement {
|
||||||
const res = await fetch(this.basePath + 'api/threads/' + this._threadId + '/tweet/' + index + '/upload-image', { method: 'POST', body: form });
|
const res = await fetch(this.basePath + 'api/threads/' + this._threadId + '/tweet/' + index + '/upload-image', { method: 'POST', body: form });
|
||||||
const data = await res.json();
|
const data = await res.json();
|
||||||
if (data.imageUrl) {
|
if (data.imageUrl) {
|
||||||
this._tweetImages[index] = data.imageUrl;
|
// Bust browser cache with timestamp
|
||||||
|
this._tweetImages[index] = data.imageUrl + '?t=' + Date.now();
|
||||||
if (this._thread) {
|
if (this._thread) {
|
||||||
this._thread.tweetImages = { ...this._tweetImages };
|
this._thread.tweetImages = { ...this._tweetImages };
|
||||||
await this.saveToAutomerge(this._thread);
|
await this.saveToAutomerge(this._thread);
|
||||||
|
|
@ -676,7 +682,8 @@ export class FolkThreadBuilder extends HTMLElement {
|
||||||
const res = await fetch(this.basePath + 'api/threads/' + this._threadId + '/tweet/' + index + '/image', { method: 'POST' });
|
const res = await fetch(this.basePath + 'api/threads/' + this._threadId + '/tweet/' + index + '/image', { method: 'POST' });
|
||||||
const data = await res.json();
|
const data = await res.json();
|
||||||
if (data.imageUrl) {
|
if (data.imageUrl) {
|
||||||
this._tweetImages[index] = data.imageUrl;
|
// Bust browser cache with timestamp
|
||||||
|
this._tweetImages[index] = data.imageUrl + '?t=' + Date.now();
|
||||||
if (this._thread) {
|
if (this._thread) {
|
||||||
this._thread.tweetImages = { ...this._tweetImages };
|
this._thread.tweetImages = { ...this._tweetImages };
|
||||||
await this.saveToAutomerge(this._thread);
|
await this.saveToAutomerge(this._thread);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue