Compare commits

..

1 Commits

Author SHA1 Message Date
Dean Wenstrand
8441bb12e9 Select stream.id in upload-status operations so the cache stays normalized
All checks were successful
Tests / Tests (pull_request) Successful in 11s
UploadStreamWithDetails and the editUploadStream response selected
stream fields without id. Apollo cannot normalize an object with no id
selected, so every upload-service poll rewrote VideoGQL.stream as an
anonymous inline object — clobbering the id that feed/detail queries
select. Their cache reads went partial and useQuery silently fell back
to the last network result, rendered as the home feed collapsing to
the first page (and bouncing the viewport) whenever an upload was
polling.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 19:27:25 -07:00
3 changed files with 7 additions and 12 deletions

View File

@@ -2404,11 +2404,6 @@ export type Header = {
value: Scalars["String"]["output"]; value: Scalars["String"]["output"];
}; };
export enum HomographyBackendGql {
Classic = "CLASSIC",
Tablenet = "TABLENET",
}
export type HomographyInfoGql = { export type HomographyInfoGql = {
__typename?: "HomographyInfoGQL"; __typename?: "HomographyInfoGQL";
crop: BoundingBoxGql; crop: BoundingBoxGql;
@@ -4283,7 +4278,6 @@ export type VideoMetadataInput = {
framesPerSecond?: InputMaybe<Scalars["Float"]["input"]>; framesPerSecond?: InputMaybe<Scalars["Float"]["input"]>;
/** @deprecated `game_type` is deprecated. Use `tags` instead. */ /** @deprecated `game_type` is deprecated. Use `tags` instead. */
gameType?: InputMaybe<Scalars["String"]["input"]>; gameType?: InputMaybe<Scalars["String"]["input"]>;
homographyBackend?: InputMaybe<HomographyBackendGql>;
lastIntendedSegmentBound?: InputMaybe<Scalars["Int"]["input"]>; lastIntendedSegmentBound?: InputMaybe<Scalars["Int"]["input"]>;
pocketSize?: InputMaybe<Scalars["Float"]["input"]>; pocketSize?: InputMaybe<Scalars["Float"]["input"]>;
private?: InputMaybe<Scalars["Boolean"]["input"]>; private?: InputMaybe<Scalars["Boolean"]["input"]>;
@@ -9037,6 +9031,7 @@ export type GetUploadLinkMutation = {
}; };
stream?: { stream?: {
__typename?: "UploadStreamGQL"; __typename?: "UploadStreamGQL";
id: string;
uploadCompletionCursor: number; uploadCompletionCursor: number;
} | null; } | null;
}; };
@@ -9135,6 +9130,7 @@ export type UploadStreamWithDetailsFragment = {
startTime?: any | null; startTime?: any | null;
stream?: { stream?: {
__typename?: "UploadStreamGQL"; __typename?: "UploadStreamGQL";
id: string;
isCompleted: boolean; isCompleted: boolean;
lastIntendedSegmentBound?: number | null; lastIntendedSegmentBound?: number | null;
uploadCompletionCursor: number; uploadCompletionCursor: number;
@@ -9159,6 +9155,7 @@ export type GetUploadStreamsWithDetailsQuery = {
startTime?: any | null; startTime?: any | null;
stream?: { stream?: {
__typename?: "UploadStreamGQL"; __typename?: "UploadStreamGQL";
id: string;
isCompleted: boolean; isCompleted: boolean;
lastIntendedSegmentBound?: number | null; lastIntendedSegmentBound?: number | null;
uploadCompletionCursor: number; uploadCompletionCursor: number;
@@ -9698,6 +9695,7 @@ export const UploadStreamWithDetailsFragmentDoc = gql`
name name
startTime startTime
stream { stream {
id
isCompleted isCompleted
lastIntendedSegmentBound lastIntendedSegmentBound
uploadCompletionCursor uploadCompletionCursor
@@ -19481,6 +19479,7 @@ export const GetUploadLinkDocument = gql`
} }
} }
stream { stream {
id
uploadCompletionCursor uploadCompletionCursor
} }
} }

View File

@@ -48,6 +48,7 @@ mutation GetUploadLink($videoId: Int!, $segmentIndex: Int!) {
} }
} }
stream { stream {
id
uploadCompletionCursor uploadCompletionCursor
} }
} }
@@ -127,6 +128,7 @@ fragment UploadStreamWithDetails on VideoGQL {
name name
startTime startTime
stream { stream {
id
isCompleted isCompleted
lastIntendedSegmentBound lastIntendedSegmentBound
uploadCompletionCursor uploadCompletionCursor

View File

@@ -1901,7 +1901,6 @@ input VideoMetadataInput {
clientUploadStatus: ClientUploadStatusEnum = null clientUploadStatus: ClientUploadStatusEnum = null
resolution: VideoResolution = null resolution: VideoResolution = null
framesPerSecond: Float = null framesPerSecond: Float = null
homographyBackend: HomographyBackendGQL = null
} }
input VideoResolution { input VideoResolution {
@@ -1909,11 +1908,6 @@ input VideoResolution {
height: Int! height: Int!
} }
enum HomographyBackendGQL {
CLASSIC
TABLENET
}
type GetUploadLinkReturn { type GetUploadLinkReturn {
value: UploadLinkGetUploadLinkErrors! value: UploadLinkGetUploadLinkErrors!
stream: UploadStreamGQL stream: UploadStreamGQL