Compare commits

..

1 Commits

Author SHA1 Message Date
Dean Wenstrand
fd6ee4f182 Declare taxonomy filter variables on the makes/runs leaderboards
The backend leaderboard resolvers gained game_type, table size and pocket
size filters, but GetMakesLeaderboard and GetRunsLeaderboard never declared
them — GraphQL silently drops undeclared variables, so anything the client
passed was ignored and both boards stayed global.

Declare and forward the five filter args on both queries, matching the
names the drill run leaderboard already uses.
2026-07-20 22:35:48 -07:00
3 changed files with 210 additions and 57 deletions

View File

@@ -5354,6 +5354,43 @@ export type GetMyDrillRunsQuery = {
}>; }>;
}; };
export type GetLiveStreamsQueryVariables = Exact<{
limit?: Scalars["Int"]["input"];
}>;
export type GetLiveStreamsQuery = {
__typename?: "Query";
getFeedVideos: {
__typename?: "VideoHistoryGQL";
videos: Array<{
__typename?: "VideoGQL";
id: number;
name?: string | null;
startTime?: any | null;
createdAt?: any | null;
screenshotUri?: string | null;
elapsedTime?: number | null;
owner?: {
__typename?: "UserGQL";
id: number;
username: string;
profileImageUri?: string | null;
} | null;
stream?: {
__typename?: "UploadStreamGQL";
id: string;
isCompleted: boolean;
lastSegmentUploadedAt?: any | null;
} | null;
}>;
pageInfo: {
__typename?: "PageInfoGQL";
hasNextPage: boolean;
endCursor?: string | null;
};
};
};
export type GetVideoMakePercentageIntervalsQueryVariables = Exact<{ export type GetVideoMakePercentageIntervalsQueryVariables = Exact<{
videoId: Scalars["ID"]["input"]; videoId: Scalars["ID"]["input"];
intervalDuration: Scalars["Int"]["input"]; intervalDuration: Scalars["Int"]["input"];
@@ -6695,11 +6732,11 @@ export type ReactToVideoMutation = {
reactToVideo: boolean; reactToVideo: boolean;
}; };
export type GetShotLabVideosQueryVariables = Exact<{ export type GetRecordedStreamsQueryVariables = Exact<{
limit?: Scalars["Int"]["input"]; limit?: Scalars["Int"]["input"];
}>; }>;
export type GetShotLabVideosQuery = { export type GetRecordedStreamsQuery = {
__typename?: "Query"; __typename?: "Query";
getFeedVideos: { getFeedVideos: {
__typename?: "VideoHistoryGQL"; __typename?: "VideoHistoryGQL";
@@ -6717,12 +6754,6 @@ export type GetShotLabVideosQuery = {
username: string; username: string;
profileImageUri?: string | null; profileImageUri?: string | null;
} | null; } | null;
stream?: {
__typename?: "UploadStreamGQL";
id: string;
isCompleted: boolean;
lastSegmentUploadedAt?: any | null;
} | null;
}>; }>;
}; };
}; };
@@ -12169,6 +12200,105 @@ export type GetMyDrillRunsQueryResult = Apollo.QueryResult<
GetMyDrillRunsQuery, GetMyDrillRunsQuery,
GetMyDrillRunsQueryVariables GetMyDrillRunsQueryVariables
>; >;
export const GetLiveStreamsDocument = gql`
query GetLiveStreams($limit: Int! = 25) {
getFeedVideos(
limit: $limit
filters: { isStreamCompleted: false, requireCursorCompletion: false }
includePrivate: MINE
feedInput: { allUsers: true }
) {
videos {
id
name
startTime
createdAt
screenshotUri
elapsedTime
owner {
id
username
profileImageUri
}
stream {
id
isCompleted
lastSegmentUploadedAt
}
}
pageInfo {
hasNextPage
endCursor
}
}
}
`;
/**
* __useGetLiveStreamsQuery__
*
* To run a query within a React component, call `useGetLiveStreamsQuery` and pass it any options that fit your needs.
* When your component renders, `useGetLiveStreamsQuery` returns an object from Apollo Client that contains loading, error, and data properties
* you can use to render your UI.
*
* @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;
*
* @example
* const { data, loading, error } = useGetLiveStreamsQuery({
* variables: {
* limit: // value for 'limit'
* },
* });
*/
export function useGetLiveStreamsQuery(
baseOptions?: Apollo.QueryHookOptions<
GetLiveStreamsQuery,
GetLiveStreamsQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useQuery<GetLiveStreamsQuery, GetLiveStreamsQueryVariables>(
GetLiveStreamsDocument,
options,
);
}
export function useGetLiveStreamsLazyQuery(
baseOptions?: Apollo.LazyQueryHookOptions<
GetLiveStreamsQuery,
GetLiveStreamsQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useLazyQuery<GetLiveStreamsQuery, GetLiveStreamsQueryVariables>(
GetLiveStreamsDocument,
options,
);
}
export function useGetLiveStreamsSuspenseQuery(
baseOptions?: Apollo.SuspenseQueryHookOptions<
GetLiveStreamsQuery,
GetLiveStreamsQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useSuspenseQuery<
GetLiveStreamsQuery,
GetLiveStreamsQueryVariables
>(GetLiveStreamsDocument, options);
}
export type GetLiveStreamsQueryHookResult = ReturnType<
typeof useGetLiveStreamsQuery
>;
export type GetLiveStreamsLazyQueryHookResult = ReturnType<
typeof useGetLiveStreamsLazyQuery
>;
export type GetLiveStreamsSuspenseQueryHookResult = ReturnType<
typeof useGetLiveStreamsSuspenseQuery
>;
export type GetLiveStreamsQueryResult = Apollo.QueryResult<
GetLiveStreamsQuery,
GetLiveStreamsQueryVariables
>;
export const GetVideoMakePercentageIntervalsDocument = gql` export const GetVideoMakePercentageIntervalsDocument = gql`
query GetVideoMakePercentageIntervals( query GetVideoMakePercentageIntervals(
$videoId: ID! $videoId: ID!
@@ -14467,10 +14597,11 @@ export type ReactToVideoMutationOptions = Apollo.BaseMutationOptions<
ReactToVideoMutation, ReactToVideoMutation,
ReactToVideoMutationVariables ReactToVideoMutationVariables
>; >;
export const GetShotLabVideosDocument = gql` export const GetRecordedStreamsDocument = gql`
query GetShotLabVideos($limit: Int! = 25) { query GetRecordedStreams($limit: Int! = 25) {
getFeedVideos( getFeedVideos(
limit: $limit limit: $limit
filters: { isStreamCompleted: true, excludeVideosWithNoShots: true }
includePrivate: MINE includePrivate: MINE
feedInput: { allUsers: true } feedInput: { allUsers: true }
) { ) {
@@ -14486,80 +14617,75 @@ export const GetShotLabVideosDocument = gql`
username username
profileImageUri profileImageUri
} }
stream {
id
isCompleted
lastSegmentUploadedAt
}
} }
} }
} }
`; `;
/** /**
* __useGetShotLabVideosQuery__ * __useGetRecordedStreamsQuery__
* *
* To run a query within a React component, call `useGetShotLabVideosQuery` and pass it any options that fit your needs. * To run a query within a React component, call `useGetRecordedStreamsQuery` and pass it any options that fit your needs.
* When your component renders, `useGetShotLabVideosQuery` returns an object from Apollo Client that contains loading, error, and data properties * When your component renders, `useGetRecordedStreamsQuery` returns an object from Apollo Client that contains loading, error, and data properties
* you can use to render your UI. * you can use to render your UI.
* *
* @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options; * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;
* *
* @example * @example
* const { data, loading, error } = useGetShotLabVideosQuery({ * const { data, loading, error } = useGetRecordedStreamsQuery({
* variables: { * variables: {
* limit: // value for 'limit' * limit: // value for 'limit'
* }, * },
* }); * });
*/ */
export function useGetShotLabVideosQuery( export function useGetRecordedStreamsQuery(
baseOptions?: Apollo.QueryHookOptions< baseOptions?: Apollo.QueryHookOptions<
GetShotLabVideosQuery, GetRecordedStreamsQuery,
GetShotLabVideosQueryVariables GetRecordedStreamsQueryVariables
>, >,
) { ) {
const options = { ...defaultOptions, ...baseOptions }; const options = { ...defaultOptions, ...baseOptions };
return Apollo.useQuery<GetShotLabVideosQuery, GetShotLabVideosQueryVariables>( return Apollo.useQuery<
GetShotLabVideosDocument, GetRecordedStreamsQuery,
options, GetRecordedStreamsQueryVariables
); >(GetRecordedStreamsDocument, options);
} }
export function useGetShotLabVideosLazyQuery( export function useGetRecordedStreamsLazyQuery(
baseOptions?: Apollo.LazyQueryHookOptions< baseOptions?: Apollo.LazyQueryHookOptions<
GetShotLabVideosQuery, GetRecordedStreamsQuery,
GetShotLabVideosQueryVariables GetRecordedStreamsQueryVariables
>, >,
) { ) {
const options = { ...defaultOptions, ...baseOptions }; const options = { ...defaultOptions, ...baseOptions };
return Apollo.useLazyQuery< return Apollo.useLazyQuery<
GetShotLabVideosQuery, GetRecordedStreamsQuery,
GetShotLabVideosQueryVariables GetRecordedStreamsQueryVariables
>(GetShotLabVideosDocument, options); >(GetRecordedStreamsDocument, options);
} }
export function useGetShotLabVideosSuspenseQuery( export function useGetRecordedStreamsSuspenseQuery(
baseOptions?: Apollo.SuspenseQueryHookOptions< baseOptions?: Apollo.SuspenseQueryHookOptions<
GetShotLabVideosQuery, GetRecordedStreamsQuery,
GetShotLabVideosQueryVariables GetRecordedStreamsQueryVariables
>, >,
) { ) {
const options = { ...defaultOptions, ...baseOptions }; const options = { ...defaultOptions, ...baseOptions };
return Apollo.useSuspenseQuery< return Apollo.useSuspenseQuery<
GetShotLabVideosQuery, GetRecordedStreamsQuery,
GetShotLabVideosQueryVariables GetRecordedStreamsQueryVariables
>(GetShotLabVideosDocument, options); >(GetRecordedStreamsDocument, options);
} }
export type GetShotLabVideosQueryHookResult = ReturnType< export type GetRecordedStreamsQueryHookResult = ReturnType<
typeof useGetShotLabVideosQuery typeof useGetRecordedStreamsQuery
>; >;
export type GetShotLabVideosLazyQueryHookResult = ReturnType< export type GetRecordedStreamsLazyQueryHookResult = ReturnType<
typeof useGetShotLabVideosLazyQuery typeof useGetRecordedStreamsLazyQuery
>; >;
export type GetShotLabVideosSuspenseQueryHookResult = ReturnType< export type GetRecordedStreamsSuspenseQueryHookResult = ReturnType<
typeof useGetShotLabVideosSuspenseQuery typeof useGetRecordedStreamsSuspenseQuery
>; >;
export type GetShotLabVideosQueryResult = Apollo.QueryResult< export type GetRecordedStreamsQueryResult = Apollo.QueryResult<
GetShotLabVideosQuery, GetRecordedStreamsQuery,
GetShotLabVideosQueryVariables GetRecordedStreamsQueryVariables
>; >;
export const GetRecordedStreamShotsDocument = gql` export const GetRecordedStreamShotsDocument = gql`
query GetRecordedStreamShots($videoId: Int!, $limit: Int! = 200) { query GetRecordedStreamShots($videoId: Int!, $limit: Int! = 200) {

View File

@@ -0,0 +1,34 @@
# Lightweight listing of live (in-progress) streams for pickers like the
# Shot Lab "follow a live stream" flow. Selects only what a picker card
# needs; intentionally avoids the heavy VideoCardFields fragment.
query GetLiveStreams($limit: Int! = 25) {
getFeedVideos(
limit: $limit
filters: { isStreamCompleted: false, requireCursorCompletion: false }
includePrivate: MINE
feedInput: { allUsers: true }
) {
videos {
id
name
startTime
createdAt
screenshotUri
elapsedTime
owner {
id
username
profileImageUri
}
stream {
id
isCompleted
lastSegmentUploadedAt
}
}
pageInfo {
hasNextPage
endCursor
}
}
}

View File

@@ -1,10 +1,8 @@
# Lightweight two-step picker data for Shot Lab's video-first source: recent # Lightweight two-step picker data for loading a recorded shot into Shot Lab.
# videos (completed or still uploading — no completion gate, so an in-progress query GetRecordedStreams($limit: Int! = 25) {
# recording with no shots yet still appears), then that video's shots. The
# stream fields let the client hint at "actively updating" without gating.
query GetShotLabVideos($limit: Int! = 25) {
getFeedVideos( getFeedVideos(
limit: $limit limit: $limit
filters: { isStreamCompleted: true, excludeVideosWithNoShots: true }
includePrivate: MINE includePrivate: MINE
feedInput: { allUsers: true } feedInput: { allUsers: true }
) { ) {
@@ -20,11 +18,6 @@ query GetShotLabVideos($limit: Int! = 25) {
username username
profileImageUri profileImageUri
} }
stream {
id
isCompleted
lastSegmentUploadedAt
}
} }
} }
} }