feat: jump to my newly created particle once created

This commit is contained in:
talksik
2026-03-24 10:27:50 -07:00
parent 1fb31a0d04
commit 6f033e2a73
3 changed files with 25 additions and 2 deletions
+8 -2
View File
@@ -17,6 +17,7 @@ interface ComposeOverlayProps {
// Optional target path for reply mode. If not provided, compose creates a new stream.
targetPath?: ParticlePath;
onActiveChange?: (active: boolean) => void;
onParticleCreated?: (particleId: string) => void;
}
@@ -30,6 +31,7 @@ export function ComposeOverlay({
networkId,
targetPath,
onActiveChange,
onParticleCreated,
}: ComposeOverlayProps) {
const [step, setStep] = useState<ComposeStep>("idle");
const [error, setError] = useState<string | null>(null);
@@ -113,8 +115,9 @@ export function ComposeOverlay({
async (path: ParticlePath) => {
if (!userEmail) return;
let particleId = '';
if (textContent.trim()) {
await createParticle.mutateAsync({
particleId = await createParticle.mutateAsync({
path,
type: "text",
properties: { content: textContent },
@@ -126,7 +129,7 @@ export function ComposeOverlay({
reviewMimeType,
);
await createParticle.mutateAsync({
particleId = await createParticle.mutateAsync({
path,
type: "media",
properties: {
@@ -138,6 +141,8 @@ export function ComposeOverlay({
createdByEmail: userEmail,
});
}
onParticleCreated?.(particleId);
},
[
userEmail,
@@ -147,6 +152,7 @@ export function ComposeOverlay({
reviewDurationMs,
createParticle,
uploadMedia,
onParticleCreated
],
);
@@ -110,6 +110,7 @@ export function StreamView({ path, streamParticle }: StreamViewProps) {
next,
prev,
goTo,
goToParticle,
pause,
resume,
} = useStreamPlayback(streamParticle, path);
@@ -188,6 +189,11 @@ export function StreamView({ path, streamParticle }: StreamViewProps) {
[prev, next],
);
const onLocalParticleCreated = useCallback(
(particleId: string) => {
goToParticle(particleId);
}, [goToParticle]);
if (children.length === 0) {
return (
<div className="flex h-full flex-col items-center justify-center gap-4 bg-black text-white">
@@ -264,6 +270,7 @@ export function StreamView({ path, streamParticle }: StreamViewProps) {
networkId={networkId!}
targetPath={path}
onActiveChange={setComposeActive}
onParticleCreated={onLocalParticleCreated}
/>
{/* Bottom overlay: stream info + reply */}
+10
View File
@@ -86,6 +86,7 @@ interface UseStreamPlaybackResult {
next: () => void;
prev: () => void;
goTo: (index: number) => void;
goToParticle: (particleId: string) => void;
pause: () => void;
resume: () => void;
}
@@ -212,6 +213,14 @@ export function useStreamPlayback(
[children],
);
// NOTE: if particle doesn't exist in children, this will lead to a brief moment where currentParticle is null
const goToParticle = useCallback(
(particleId: string) => {
// Dispatch directly by ID — if the particle isn't in children yet
// (e.g. just created), it will resolve once the live query delivers it.
dispatch({ type: "SET_PARTICLE", particleId });
}, []);
const pause = useCallback(() => dispatch({ type: "PAUSE" }), []);
const resume = useCallback(() => dispatch({ type: "RESUME" }), []);
@@ -225,6 +234,7 @@ export function useStreamPlayback(
next,
prev,
goTo,
goToParticle,
pause,
resume,
};