diff --git a/src/index.tsx b/src/index.tsx index dfb9d8e..b5f3b7b 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -4377,6 +4377,24 @@ export type GetVideoFeedSessionCountQuery = { }; }; +export type GetLastSessionDateQueryVariables = Exact<{ + filters?: InputMaybe; + includePrivate?: InputMaybe; + feedInput?: InputMaybe; +}>; + +export type GetLastSessionDateQuery = { + __typename?: "Query"; + getFeedVideos: { + __typename?: "VideoHistoryGQL"; + videos: Array<{ + __typename?: "VideoGQL"; + id: number; + startTime?: any | null; + }>; + }; +}; + export type GetVideoFeedQueryVariables = Exact<{ limit?: Scalars["Int"]["input"]; after?: InputMaybe; @@ -5462,6 +5480,39 @@ export type GetShotsByIdsQuery = { }>; }; +export type ShotClipRangeFragment = { + __typename?: "ShotGQL"; + id: number; + videoId: number; + startFrame: number; + endFrame: number; + startTime: number; + endTime: number; +}; + +export type GetShotClipRangesQueryVariables = Exact<{ + filterInput: FilterInput; + shotsOrdering?: InputMaybe; + limit?: InputMaybe; +}>; + +export type GetShotClipRangesQuery = { + __typename?: "Query"; + getOrderedShots: { + __typename?: "GetShotsResult"; + count?: number | null; + shots: Array<{ + __typename?: "ShotGQL"; + id: number; + videoId: number; + startFrame: number; + endFrame: number; + startTime: number; + endTime: number; + }>; + }; +}; + export type ShotWithAllFeaturesFragment = { __typename?: "ShotGQL"; id: number; @@ -6140,6 +6191,102 @@ export type GetVideoSocialDetailsByIdQuery = { }; }; +export type GetVideoCardQueryVariables = Exact<{ + videoId: Scalars["Int"]["input"]; +}>; + +export type GetVideoCardQuery = { + __typename?: "Query"; + getVideo: { + __typename?: "VideoGQL"; + id: number; + name?: string | null; + screenshotUri?: string | null; + totalShots: number; + makePercentage: number; + averageTimeBetweenShots?: number | null; + averageDifficulty?: number | null; + startTime?: any | null; + private: boolean; + elapsedTime?: number | null; + tableSize: number; + pocketSize?: number | null; + owner?: { + __typename?: "UserGQL"; + id: number; + username: string; + profileImageUri?: string | null; + } | null; + stream?: { + __typename?: "UploadStreamGQL"; + id: string; + lastIntendedSegmentBound?: number | null; + streamSegmentType: StreamSegmentTypeEnum; + } | null; + tags: Array<{ + __typename?: "VideoTag"; + name: string; + tagClasses: Array<{ __typename?: "VideoTagClass"; name: string }>; + }>; + playerSummaries: Array<{ + __typename?: "PlayerSummaryGQL"; + clusterId: number; + userId?: number | null; + username?: string | null; + profileImageUri?: string | null; + representativeFullFrameUrl?: string | null; + totalShots: number; + totalShotsMade: number; + makePercentage: number; + score?: number | null; + longestRun: number; + averageDifficulty?: number | null; + averageTimeBetweenShots?: number | null; + }>; + currentProcessing?: { + __typename?: "VideoProcessingGQL"; + id: number; + status: ProcessingStatusEnum; + } | null; + reactions: Array<{ + __typename?: "ReactionGQL"; + videoId: number; + reaction: ReactionEnum; + user: { + __typename?: "UserGQL"; + id: number; + username: string; + profileImageUri?: string | null; + isFollowedByCurrentUser?: boolean | null; + }; + }>; + comments: Array<{ + __typename?: "CommentGQL"; + id: number; + message: string; + user: { + __typename?: "UserGQL"; + id: number; + username: string; + profileImageUri?: string | null; + isFollowedByCurrentUser?: boolean | null; + }; + replies: Array<{ + __typename?: "CommentGQL"; + id: number; + message: string; + user: { + __typename?: "UserGQL"; + id: number; + username: string; + profileImageUri?: string | null; + isFollowedByCurrentUser?: boolean | null; + }; + }>; + }>; + }; +}; + export type GetVideosQueryVariables = Exact<{ videoIds: Array | Scalars["Int"]["input"]; }>; @@ -6892,6 +7039,16 @@ export const PlayerClusterFieldsFragmentDoc = gql` } ${PlayerClusterShotFieldsFragmentDoc} `; +export const ShotClipRangeFragmentDoc = gql` + fragment ShotClipRange on ShotGQL { + id + videoId + startFrame + endFrame + startTime @client + endTime @client + } +`; export const ShotWithAllFeaturesFragmentDoc = gql` fragment ShotWithAllFeatures on ShotGQL { id @@ -8976,6 +9133,93 @@ export type GetVideoFeedSessionCountQueryResult = Apollo.QueryResult< GetVideoFeedSessionCountQuery, GetVideoFeedSessionCountQueryVariables >; +export const GetLastSessionDateDocument = gql` + query GetLastSessionDate( + $filters: VideoFilterInput = null + $includePrivate: IncludePrivateEnum = MINE + $feedInput: VideoFeedInputGQL = null + ) { + getFeedVideos( + limit: 1 + filters: $filters + includePrivate: $includePrivate + feedInput: $feedInput + ) { + videos { + id + startTime + } + } + } +`; + +/** + * __useGetLastSessionDateQuery__ + * + * To run a query within a React component, call `useGetLastSessionDateQuery` and pass it any options that fit your needs. + * When your component renders, `useGetLastSessionDateQuery` 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 } = useGetLastSessionDateQuery({ + * variables: { + * filters: // value for 'filters' + * includePrivate: // value for 'includePrivate' + * feedInput: // value for 'feedInput' + * }, + * }); + */ +export function useGetLastSessionDateQuery( + baseOptions?: Apollo.QueryHookOptions< + GetLastSessionDateQuery, + GetLastSessionDateQueryVariables + >, +) { + const options = { ...defaultOptions, ...baseOptions }; + return Apollo.useQuery< + GetLastSessionDateQuery, + GetLastSessionDateQueryVariables + >(GetLastSessionDateDocument, options); +} +export function useGetLastSessionDateLazyQuery( + baseOptions?: Apollo.LazyQueryHookOptions< + GetLastSessionDateQuery, + GetLastSessionDateQueryVariables + >, +) { + const options = { ...defaultOptions, ...baseOptions }; + return Apollo.useLazyQuery< + GetLastSessionDateQuery, + GetLastSessionDateQueryVariables + >(GetLastSessionDateDocument, options); +} +export function useGetLastSessionDateSuspenseQuery( + baseOptions?: Apollo.SuspenseQueryHookOptions< + GetLastSessionDateQuery, + GetLastSessionDateQueryVariables + >, +) { + const options = { ...defaultOptions, ...baseOptions }; + return Apollo.useSuspenseQuery< + GetLastSessionDateQuery, + GetLastSessionDateQueryVariables + >(GetLastSessionDateDocument, options); +} +export type GetLastSessionDateQueryHookResult = ReturnType< + typeof useGetLastSessionDateQuery +>; +export type GetLastSessionDateLazyQueryHookResult = ReturnType< + typeof useGetLastSessionDateLazyQuery +>; +export type GetLastSessionDateSuspenseQueryHookResult = ReturnType< + typeof useGetLastSessionDateSuspenseQuery +>; +export type GetLastSessionDateQueryResult = Apollo.QueryResult< + GetLastSessionDateQuery, + GetLastSessionDateQueryVariables +>; export const GetVideoFeedDocument = gql` query GetVideoFeed( $limit: Int! = 5 @@ -11279,6 +11523,93 @@ export type GetShotsByIdsQueryResult = Apollo.QueryResult< GetShotsByIdsQuery, GetShotsByIdsQueryVariables >; +export const GetShotClipRangesDocument = gql` + query GetShotClipRanges( + $filterInput: FilterInput! + $shotsOrdering: GetShotsOrdering + $limit: Int + ) { + getOrderedShots( + filterInput: $filterInput + shotsOrdering: $shotsOrdering + limit: $limit + ) { + count + shots { + ...ShotClipRange + } + } + } + ${ShotClipRangeFragmentDoc} +`; + +/** + * __useGetShotClipRangesQuery__ + * + * To run a query within a React component, call `useGetShotClipRangesQuery` and pass it any options that fit your needs. + * When your component renders, `useGetShotClipRangesQuery` 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 } = useGetShotClipRangesQuery({ + * variables: { + * filterInput: // value for 'filterInput' + * shotsOrdering: // value for 'shotsOrdering' + * limit: // value for 'limit' + * }, + * }); + */ +export function useGetShotClipRangesQuery( + baseOptions: Apollo.QueryHookOptions< + GetShotClipRangesQuery, + GetShotClipRangesQueryVariables + >, +) { + const options = { ...defaultOptions, ...baseOptions }; + return Apollo.useQuery< + GetShotClipRangesQuery, + GetShotClipRangesQueryVariables + >(GetShotClipRangesDocument, options); +} +export function useGetShotClipRangesLazyQuery( + baseOptions?: Apollo.LazyQueryHookOptions< + GetShotClipRangesQuery, + GetShotClipRangesQueryVariables + >, +) { + const options = { ...defaultOptions, ...baseOptions }; + return Apollo.useLazyQuery< + GetShotClipRangesQuery, + GetShotClipRangesQueryVariables + >(GetShotClipRangesDocument, options); +} +export function useGetShotClipRangesSuspenseQuery( + baseOptions?: Apollo.SuspenseQueryHookOptions< + GetShotClipRangesQuery, + GetShotClipRangesQueryVariables + >, +) { + const options = { ...defaultOptions, ...baseOptions }; + return Apollo.useSuspenseQuery< + GetShotClipRangesQuery, + GetShotClipRangesQueryVariables + >(GetShotClipRangesDocument, options); +} +export type GetShotClipRangesQueryHookResult = ReturnType< + typeof useGetShotClipRangesQuery +>; +export type GetShotClipRangesLazyQueryHookResult = ReturnType< + typeof useGetShotClipRangesLazyQuery +>; +export type GetShotClipRangesSuspenseQueryHookResult = ReturnType< + typeof useGetShotClipRangesSuspenseQuery +>; +export type GetShotClipRangesQueryResult = Apollo.QueryResult< + GetShotClipRangesQuery, + GetShotClipRangesQueryVariables +>; export const EditShotDocument = gql` mutation EditShot($shotId: Int!, $fieldsToEdit: EditableShotFieldInputGQL!) { editShot(shotId: $shotId, fieldsToEdit: $fieldsToEdit) { @@ -12994,6 +13325,80 @@ export type GetVideoSocialDetailsByIdQueryResult = Apollo.QueryResult< GetVideoSocialDetailsByIdQuery, GetVideoSocialDetailsByIdQueryVariables >; +export const GetVideoCardDocument = gql` + query GetVideoCard($videoId: Int!) { + getVideo(videoId: $videoId) { + ...VideoCardFields + } + } + ${VideoCardFieldsFragmentDoc} +`; + +/** + * __useGetVideoCardQuery__ + * + * To run a query within a React component, call `useGetVideoCardQuery` and pass it any options that fit your needs. + * When your component renders, `useGetVideoCardQuery` 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 } = useGetVideoCardQuery({ + * variables: { + * videoId: // value for 'videoId' + * }, + * }); + */ +export function useGetVideoCardQuery( + baseOptions: Apollo.QueryHookOptions< + GetVideoCardQuery, + GetVideoCardQueryVariables + >, +) { + const options = { ...defaultOptions, ...baseOptions }; + return Apollo.useQuery( + GetVideoCardDocument, + options, + ); +} +export function useGetVideoCardLazyQuery( + baseOptions?: Apollo.LazyQueryHookOptions< + GetVideoCardQuery, + GetVideoCardQueryVariables + >, +) { + const options = { ...defaultOptions, ...baseOptions }; + return Apollo.useLazyQuery( + GetVideoCardDocument, + options, + ); +} +export function useGetVideoCardSuspenseQuery( + baseOptions?: Apollo.SuspenseQueryHookOptions< + GetVideoCardQuery, + GetVideoCardQueryVariables + >, +) { + const options = { ...defaultOptions, ...baseOptions }; + return Apollo.useSuspenseQuery( + GetVideoCardDocument, + options, + ); +} +export type GetVideoCardQueryHookResult = ReturnType< + typeof useGetVideoCardQuery +>; +export type GetVideoCardLazyQueryHookResult = ReturnType< + typeof useGetVideoCardLazyQuery +>; +export type GetVideoCardSuspenseQueryHookResult = ReturnType< + typeof useGetVideoCardSuspenseQuery +>; +export type GetVideoCardQueryResult = Apollo.QueryResult< + GetVideoCardQuery, + GetVideoCardQueryVariables +>; export const GetVideosDocument = gql` query GetVideos($videoIds: [Int!]!) { getVideos(videoIds: $videoIds) { diff --git a/src/operations/feed.gql b/src/operations/feed.gql index b85ffb9..ec831af 100644 --- a/src/operations/feed.gql +++ b/src/operations/feed.gql @@ -101,6 +101,27 @@ query GetVideoFeedSessionCount( } } +# Minimal query for the Home recency nudge ("you haven't recorded in N days"). +# Only the most recent session's start time — avoids pulling the full +# VideoCardFields payload (reactions, comments, player summaries, etc.). +query GetLastSessionDate( + $filters: VideoFilterInput = null + $includePrivate: IncludePrivateEnum = MINE + $feedInput: VideoFeedInputGQL = null +) { + getFeedVideos( + limit: 1 + filters: $filters + includePrivate: $includePrivate + feedInput: $feedInput + ) { + videos { + id + startTime + } + } +} + query GetVideoFeed( $limit: Int! = 5 $after: String = null diff --git a/src/operations/shots.gql b/src/operations/shots.gql index 93ae786..c4fa522 100644 --- a/src/operations/shots.gql +++ b/src/operations/shots.gql @@ -132,6 +132,38 @@ query GetShotsByIds($ids: [Int!]!) { } } +# Lightweight clip boundaries for condensed session playback. The inline +# session player only needs each shot's frame/time window to seek between +# shots — this skips the heavy ShotWithAllFeatures payload (cue/pocketing +# features, serialized shot paths, annotations, nested video/playlist). The +# startTime/endTime @client resolvers derive their values from the frame +# fields + the video (looked up internally), so this is all they require. +fragment ShotClipRange on ShotGQL { + id + videoId + startFrame + endFrame + startTime @client + endTime @client +} + +query GetShotClipRanges( + $filterInput: FilterInput! + $shotsOrdering: GetShotsOrdering + $limit: Int +) { + getOrderedShots( + filterInput: $filterInput + shotsOrdering: $shotsOrdering + limit: $limit + ) { + count + shots { + ...ShotClipRange + } + } +} + fragment ShotWithAllFeatures on ShotGQL { id videoId diff --git a/src/operations/video.gql b/src/operations/video.gql index bbf0c46..ce6c463 100644 --- a/src/operations/video.gql +++ b/src/operations/video.gql @@ -139,6 +139,15 @@ query GetVideoSocialDetailsById($videoId: Int!) { } } +# Full card payload for a single video — reuses the same VideoCardFields +# fragment the feed list uses, so the session-detail meta header shares one +# source of truth (and the normalized Apollo cache) with the feed card. +query GetVideoCard($videoId: Int!) { + getVideo(videoId: $videoId) { + ...VideoCardFields + } +} + query GetVideos($videoIds: [Int!]!) { getVideos(videoIds: $videoIds) { ...VideoStreamMetadata