feat: extract text editor and allow editing (#150)

This commit was merged in pull request #150.
This commit is contained in:
Arjun Patel
2026-04-12 12:13:25 -07:00
committed by GitHub
parent f03868e65b
commit 7568ceb80d
6 changed files with 471 additions and 271 deletions
+27 -2
View File
@@ -81,16 +81,26 @@ const particleConverter: FirestoreDataConverter<Particle> = {
case "file":
case "text":
case "quest":
case "paper":
case "paper": {
// Firestore stores timestamps as `Timestamp`; zod expects `Date`. Text
// particles carry `properties.edited_at`, so coerce it if present.
const properties =
type === "text" && raw.properties?.edited_at
? {
...raw.properties,
edited_at: (raw.properties.edited_at as Timestamp).toDate(),
}
: raw.properties;
return ParticleSchema.parse({
id: snap.id,
type: raw.type,
properties: raw.properties,
properties,
created_at: (raw.created_at as Timestamp).toDate(),
created_by_human_id: raw.created_by_human_id,
updated_at: raw.updated_at ? (raw.updated_at as Timestamp).toDate() : undefined,
reactions: raw.reactions ?? undefined,
});
}
default:
throw new Error(`Unknown particle type: ${type}`);
}
@@ -296,6 +306,21 @@ export async function updateParticleProperties<T extends ParticleType>(
});
}
// Edits the body of a text particle and stamps `properties.edited_at` so
// readers can see that the message was edited (distinct from `updated_at`,
// which is bumped by any write — visibility, reactions, etc.).
export async function editTextParticleContent(
docPath: string,
content: string,
): Promise<void> {
const particleRef = typedDoc(docPath);
await updateDoc(particleRef, {
"properties.content": content,
"properties.edited_at": serverTimestamp(),
updated_at: serverTimestamp(),
});
}
export async function updateParticleVisibleTo(
docPath: string,
visibleTo: string[],