Compare commits

..

1 Commits

Author SHA1 Message Date
f58048768c Add Shot Lab video feed scopes and pagination
All checks were successful
Tests / Tests (pull_request) Successful in 12s
2026-07-26 02:26:39 -07:00
4 changed files with 54 additions and 169 deletions

View File

@@ -315,11 +315,6 @@ export type CreatePoolHallInput = {
timezone?: InputMaybe<Scalars["String"]["input"]>; timezone?: InputMaybe<Scalars["String"]["input"]>;
}; };
export type CreateShotShareLinkInput = {
paddingSeconds?: InputMaybe<Scalars["Float"]["input"]>;
shotIds: Array<Scalars["Int"]["input"]>;
};
export type CreateSubscriptionResultGql = { export type CreateSubscriptionResultGql = {
__typename?: "CreateSubscriptionResultGQL"; __typename?: "CreateSubscriptionResultGQL";
checkoutUrl: Scalars["String"]["output"]; checkoutUrl: Scalars["String"]["output"];
@@ -2535,7 +2530,6 @@ export type Mutation = {
createPoolHall: PoolHall; createPoolHall: PoolHall;
createPoolHallCamera: PoolHallCameraStreamCredentials; createPoolHallCamera: PoolHallCameraStreamCredentials;
createRuleSet: RuleSet; createRuleSet: RuleSet;
createShotShareLink: ShareLinkGql;
createSubscription: CreateSubscriptionResultGql; createSubscription: CreateSubscriptionResultGql;
createUploadStream: CreateUploadStreamReturn; createUploadStream: CreateUploadStreamReturn;
deleteComment: Scalars["Boolean"]["output"]; deleteComment: Scalars["Boolean"]["output"];
@@ -2579,7 +2573,6 @@ export type Mutation = {
startChallenge: ChallengeEntry; startChallenge: ChallengeEntry;
submitCancellationFeedback: Scalars["Boolean"]["output"]; submitCancellationFeedback: Scalars["Boolean"]["output"];
submitChallengeEntry: ChallengeEntry; submitChallengeEntry: ChallengeEntry;
submitSessionCoachFeedback: SessionCoachFeedbackGql;
syncAppleSubscription: SyncAppleSubscriptionResultGql; syncAppleSubscription: SyncAppleSubscriptionResultGql;
undismissChallenge: Scalars["Boolean"]["output"]; undismissChallenge: Scalars["Boolean"]["output"];
unfollowUser: UserGql; unfollowUser: UserGql;
@@ -2651,10 +2644,6 @@ export type MutationCreateRuleSetArgs = {
name: Scalars["String"]["input"]; name: Scalars["String"]["input"];
}; };
export type MutationCreateShotShareLinkArgs = {
input: CreateShotShareLinkInput;
};
export type MutationCreateSubscriptionArgs = { export type MutationCreateSubscriptionArgs = {
priceId: Scalars["String"]["input"]; priceId: Scalars["String"]["input"];
}; };
@@ -2841,12 +2830,6 @@ export type MutationSubmitChallengeEntryArgs = {
videoId: Scalars["ID"]["input"]; videoId: Scalars["ID"]["input"];
}; };
export type MutationSubmitSessionCoachFeedbackArgs = {
generationId: Scalars["ID"]["input"];
response: SessionCoachFeedbackResponseEnum;
videoId: Scalars["Int"]["input"];
};
export type MutationSyncAppleSubscriptionArgs = { export type MutationSyncAppleSubscriptionArgs = {
input: SyncAppleSubscriptionInputGql; input: SyncAppleSubscriptionInputGql;
}; };
@@ -3692,19 +3675,6 @@ export type SessionCoachEvidenceGql = {
score: Scalars["Float"]["output"]; score: Scalars["Float"]["output"];
}; };
export type SessionCoachFeedbackGql = {
__typename?: "SessionCoachFeedbackGQL";
response: SessionCoachFeedbackResponseEnum;
updatedAt: Scalars["DateTime"]["output"];
};
export enum SessionCoachFeedbackResponseEnum {
AlreadyWorkingOnThis = "ALREADY_WORKING_ON_THIS",
Helpful = "HELPFUL",
NotEnoughEvidence = "NOT_ENOUGH_EVIDENCE",
WrongFocus = "WRONG_FOCUS",
}
export type SessionCoachGql = { export type SessionCoachGql = {
__typename?: "SessionCoachGQL"; __typename?: "SessionCoachGQL";
agentGeneration?: Maybe<SessionCoachGenerationGql>; agentGeneration?: Maybe<SessionCoachGenerationGql>;
@@ -3757,7 +3727,6 @@ export type SessionCoachGenerationGql = {
createdAt: Scalars["DateTime"]["output"]; createdAt: Scalars["DateTime"]["output"];
decision?: Maybe<SessionCoachDecisionGql>; decision?: Maybe<SessionCoachDecisionGql>;
diagnostics?: Maybe<SessionCoachGenerationDiagnosticsGql>; diagnostics?: Maybe<SessionCoachGenerationDiagnosticsGql>;
feedback?: Maybe<SessionCoachFeedbackGql>;
id: Scalars["ID"]["output"]; id: Scalars["ID"]["output"];
state: SessionCoachGenerationStateEnum; state: SessionCoachGenerationStateEnum;
}; };
@@ -3781,12 +3750,6 @@ export enum SessionCoachStateEnum {
Ready = "READY", Ready = "READY",
} }
export type ShareLinkGql = {
__typename?: "ShareLinkGQL";
slug: Scalars["String"]["output"];
url: Scalars["String"]["output"];
};
export type ShotAnnotationGql = { export type ShotAnnotationGql = {
__typename?: "ShotAnnotationGQL"; __typename?: "ShotAnnotationGQL";
createdAt?: Maybe<Scalars["DateTime"]["output"]>; createdAt?: Maybe<Scalars["DateTime"]["output"]>;
@@ -6911,8 +6874,10 @@ export type ReactToVideoMutation = {
}; };
export type GetShotLabVideosQueryVariables = Exact<{ export type GetShotLabVideosQueryVariables = Exact<{
userId: Scalars["Int"]["input"]; feedInput: VideoFeedInputGql;
includePrivate: IncludePrivateEnum;
limit?: Scalars["Int"]["input"]; limit?: Scalars["Int"]["input"];
after?: InputMaybe<Scalars["String"]["input"]>;
}>; }>;
export type GetShotLabVideosQuery = { export type GetShotLabVideosQuery = {
@@ -6940,6 +6905,11 @@ export type GetShotLabVideosQuery = {
lastSegmentUploadedAt?: any | null; lastSegmentUploadedAt?: any | null;
} | null; } | null;
}>; }>;
pageInfo: {
__typename?: "PageInfoGQL";
hasNextPage: boolean;
endCursor?: string | null;
};
}; };
}; };
@@ -7358,20 +7328,6 @@ export type SessionCoachGenerationFieldsFragment = {
} | null; } | null;
}; };
export type CreateShotShareLinkMutationVariables = Exact<{
shotIds: Array<Scalars["Int"]["input"]> | Scalars["Int"]["input"];
paddingSeconds?: InputMaybe<Scalars["Float"]["input"]>;
}>;
export type CreateShotShareLinkMutation = {
__typename?: "Mutation";
createShotShareLink: {
__typename?: "ShareLinkGQL";
slug: string;
url: string;
};
};
export type PlayerSummaryFieldsFragment = { export type PlayerSummaryFieldsFragment = {
__typename?: "PlayerSummaryGQL"; __typename?: "PlayerSummaryGQL";
clusterId: number; clusterId: number;
@@ -15191,12 +15147,18 @@ export type ReactToVideoMutationOptions = Apollo.BaseMutationOptions<
ReactToVideoMutationVariables ReactToVideoMutationVariables
>; >;
export const GetShotLabVideosDocument = gql` export const GetShotLabVideosDocument = gql`
query GetShotLabVideos($userId: Int!, $limit: Int! = 25) { query GetShotLabVideos(
$feedInput: VideoFeedInputGQL!
$includePrivate: IncludePrivateEnum!
$limit: Int! = 25
$after: String = null
) {
getFeedVideos( getFeedVideos(
limit: $limit limit: $limit
after: $after
includeCallersVideos: false includeCallersVideos: false
includePrivate: MINE includePrivate: $includePrivate
feedInput: { userId: $userId } feedInput: $feedInput
) { ) {
videos { videos {
id id
@@ -15216,6 +15178,10 @@ export const GetShotLabVideosDocument = gql`
lastSegmentUploadedAt lastSegmentUploadedAt
} }
} }
pageInfo {
hasNextPage
endCursor
}
} }
} }
`; `;
@@ -15232,8 +15198,10 @@ export const GetShotLabVideosDocument = gql`
* @example * @example
* const { data, loading, error } = useGetShotLabVideosQuery({ * const { data, loading, error } = useGetShotLabVideosQuery({
* variables: { * variables: {
* userId: // value for 'userId' * feedInput: // value for 'feedInput'
* includePrivate: // value for 'includePrivate'
* limit: // value for 'limit' * limit: // value for 'limit'
* after: // value for 'after'
* }, * },
* }); * });
*/ */
@@ -15739,63 +15707,6 @@ export type RequestSessionCoachGenerationMutationOptions =
RequestSessionCoachGenerationMutation, RequestSessionCoachGenerationMutation,
RequestSessionCoachGenerationMutationVariables RequestSessionCoachGenerationMutationVariables
>; >;
export const CreateShotShareLinkDocument = gql`
mutation CreateShotShareLink(
$shotIds: [Int!]!
$paddingSeconds: Float = null
) {
createShotShareLink(
input: { shotIds: $shotIds, paddingSeconds: $paddingSeconds }
) {
slug
url
}
}
`;
export type CreateShotShareLinkMutationFn = Apollo.MutationFunction<
CreateShotShareLinkMutation,
CreateShotShareLinkMutationVariables
>;
/**
* __useCreateShotShareLinkMutation__
*
* To run a mutation, you first call `useCreateShotShareLinkMutation` within a React component and pass it any options that fit your needs.
* When your component renders, `useCreateShotShareLinkMutation` returns a tuple that includes:
* - A mutate function that you can call at any time to execute the mutation
* - An object with fields that represent the current status of the mutation's execution
*
* @param baseOptions options that will be passed into the mutation, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options-2;
*
* @example
* const [createShotShareLinkMutation, { data, loading, error }] = useCreateShotShareLinkMutation({
* variables: {
* shotIds: // value for 'shotIds'
* paddingSeconds: // value for 'paddingSeconds'
* },
* });
*/
export function useCreateShotShareLinkMutation(
baseOptions?: Apollo.MutationHookOptions<
CreateShotShareLinkMutation,
CreateShotShareLinkMutationVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useMutation<
CreateShotShareLinkMutation,
CreateShotShareLinkMutationVariables
>(CreateShotShareLinkDocument, options);
}
export type CreateShotShareLinkMutationHookResult = ReturnType<
typeof useCreateShotShareLinkMutation
>;
export type CreateShotShareLinkMutationResult =
Apollo.MutationResult<CreateShotShareLinkMutation>;
export type CreateShotShareLinkMutationOptions = Apollo.BaseMutationOptions<
CreateShotShareLinkMutation,
CreateShotShareLinkMutationVariables
>;
export const VideoPlayerClustersDocument = gql` export const VideoPlayerClustersDocument = gql`
query VideoPlayerClusters($videoId: Int!) { query VideoPlayerClusters($videoId: Int!) {
videoPlayerClusters(videoId: $videoId) { videoPlayerClusters(videoId: $videoId) {

View File

@@ -1,12 +1,19 @@
# Lightweight two-step picker data for Shot Lab's video-first source: the # Lightweight two-step picker data for Shot Lab's video-first source: recent
# caller's recent videos (completed or still uploading), then that video's # videos from the requested audience (mine, followed users, or public), then
# shots. The stream fields hint at "actively updating" without gating. # that video's shots. The stream fields hint at "actively updating" without
query GetShotLabVideos($userId: Int!, $limit: Int! = 25) { # gating.
query GetShotLabVideos(
$feedInput: VideoFeedInputGQL!
$includePrivate: IncludePrivateEnum!
$limit: Int! = 25
$after: String = null
) {
getFeedVideos( getFeedVideos(
limit: $limit limit: $limit
after: $after
includeCallersVideos: false includeCallersVideos: false
includePrivate: MINE includePrivate: $includePrivate
feedInput: { userId: $userId } feedInput: $feedInput
) { ) {
videos { videos {
id id
@@ -26,6 +33,10 @@ query GetShotLabVideos($userId: Int!, $limit: Int! = 25) {
lastSegmentUploadedAt lastSegmentUploadedAt
} }
} }
pageInfo {
hasNextPage
endCursor
}
} }
} }

View File

@@ -1,8 +0,0 @@
mutation CreateShotShareLink($shotIds: [Int!]!, $paddingSeconds: Float = null) {
createShotShareLink(
input: { shotIds: $shotIds, paddingSeconds: $paddingSeconds }
) {
slug
url
}
}

View File

@@ -259,11 +259,6 @@ input CreatePoolHallInput {
timezone: String = null timezone: String = null
} }
input CreateShotShareLinkInput {
shotIds: [Int!]!
paddingSeconds: Float = null
}
type CreateSubscriptionResultGQL { type CreateSubscriptionResultGQL {
checkoutUrl: String! checkoutUrl: String!
sessionId: String! sessionId: String!
@@ -536,6 +531,19 @@ type GetUploadLinksReturn {
stream: UploadStreamGQL stream: UploadStreamGQL
} }
type SegmentUploadLink {
segmentIndex: Int!
uploadUrl: String!
headers: [Header]!
}
type UploadLinkBatch {
links: [SegmentUploadLink!]!
alreadyUploaded: [Int!]!
}
union UploadLinkBatchGetUploadLinkErrors = UploadLinkBatch | GetUploadLinkErrors
type HLSPlaylistGQL { type HLSPlaylistGQL {
videoId: Int! videoId: Int!
m3u8Text: String! m3u8Text: String!
@@ -711,7 +719,6 @@ type Mutation {
cancelCameraClaimSession(claimSessionId: ID!): CameraClaimSession! cancelCameraClaimSession(claimSessionId: ID!): CameraClaimSession!
endCameraLease(leaseId: ID!): CameraLease! endCameraLease(leaseId: ID!): CameraLease!
extendCameraLease(leaseId: ID!, additionalMinutes: Int! = 60): CameraLease! extendCameraLease(leaseId: ID!, additionalMinutes: Int! = 60): CameraLease!
createShotShareLink(input: CreateShotShareLinkInput!): ShareLinkGQL!
finalizePlayerAssignments( finalizePlayerAssignments(
input: FinalizePlayerAssignmentsInput! input: FinalizePlayerAssignmentsInput!
): [PlayerClusterGQL!]! ): [PlayerClusterGQL!]!
@@ -728,11 +735,6 @@ type Mutation {
shotId: Int! shotId: Int!
fieldsToEdit: EditableShotFieldInputGQL! fieldsToEdit: EditableShotFieldInputGQL!
): EditShotReturn! ): EditShotReturn!
submitSessionCoachFeedback(
videoId: Int!
generationId: ID!
response: SessionCoachFeedbackResponseEnum!
): SessionCoachFeedbackGQL!
requestSessionCoachGeneration(videoId: Int!): SessionCoachGQL! requestSessionCoachGeneration(videoId: Int!): SessionCoachGQL!
getProfileImageUploadLink( getProfileImageUploadLink(
fileExt: String = ".png" fileExt: String = ".png"
@@ -1306,12 +1308,6 @@ type SegmentAlreadyUploadedErr {
segmentId: Int! segmentId: Int!
} }
type SegmentUploadLink {
segmentIndex: Int!
uploadUrl: String!
headers: [Header]!
}
type SerializedShotPathsGQL { type SerializedShotPathsGQL {
b64EncodedBuffer: String b64EncodedBuffer: String
} }
@@ -1392,18 +1388,6 @@ type SessionCoachEvidenceGQL {
baselineMakePercentage: Float baselineMakePercentage: Float
} }
type SessionCoachFeedbackGQL {
response: SessionCoachFeedbackResponseEnum!
updatedAt: DateTime!
}
enum SessionCoachFeedbackResponseEnum {
HELPFUL
WRONG_FOCUS
ALREADY_WORKING_ON_THIS
NOT_ENOUGH_EVIDENCE
}
type SessionCoachGQL { type SessionCoachGQL {
videoId: Int! videoId: Int!
processingId: Int processingId: Int
@@ -1455,7 +1439,6 @@ type SessionCoachGenerationGQL {
completedAt: DateTime completedAt: DateTime
decision: SessionCoachDecisionGQL decision: SessionCoachDecisionGQL
diagnostics: SessionCoachGenerationDiagnosticsGQL diagnostics: SessionCoachGenerationDiagnosticsGQL
feedback: SessionCoachFeedbackGQL
} }
enum SessionCoachGenerationStateEnum { enum SessionCoachGenerationStateEnum {
@@ -1477,11 +1460,6 @@ enum SessionCoachStateEnum {
FAILED FAILED
} }
type ShareLinkGQL {
slug: String!
url: String!
}
type ShotAnnotationGQL { type ShotAnnotationGQL {
shotId: Int! shotId: Int!
type: ShotAnnotationTypeGQL! type: ShotAnnotationTypeGQL!
@@ -1816,13 +1794,6 @@ type UploadLink {
headers: [Header]! headers: [Header]!
} }
type UploadLinkBatch {
links: [SegmentUploadLink!]!
alreadyUploaded: [Int!]!
}
union UploadLinkBatchGetUploadLinkErrors = UploadLinkBatch | GetUploadLinkErrors
union UploadLinkGetProfileUploadLinkErrors = union UploadLinkGetProfileUploadLinkErrors =
UploadLink UploadLink
| GetProfileUploadLinkErrors | GetProfileUploadLinkErrors