Merge pull request 'dean/get-video-card-query' (#250) from dean/get-video-card-query into master
Reviewed-on: #250
This commit is contained in:
405
src/index.tsx
405
src/index.tsx
@@ -4393,6 +4393,24 @@ export type GetVideoFeedSessionCountQuery = {
|
||||
};
|
||||
};
|
||||
|
||||
export type GetLastSessionDateQueryVariables = Exact<{
|
||||
filters?: InputMaybe<VideoFilterInput>;
|
||||
includePrivate?: InputMaybe<IncludePrivateEnum>;
|
||||
feedInput?: InputMaybe<VideoFeedInputGql>;
|
||||
}>;
|
||||
|
||||
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<Scalars["String"]["input"]>;
|
||||
@@ -5478,6 +5496,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<GetShotsOrdering>;
|
||||
limit?: InputMaybe<Scalars["Int"]["input"]>;
|
||||
}>;
|
||||
|
||||
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;
|
||||
@@ -6197,6 +6248,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"]> | Scalars["Int"]["input"];
|
||||
}>;
|
||||
@@ -6949,6 +7096,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
|
||||
@@ -9034,6 +9191,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
|
||||
@@ -11337,6 +11581,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) {
|
||||
@@ -13151,6 +13482,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<GetVideoCardQuery, GetVideoCardQueryVariables>(
|
||||
GetVideoCardDocument,
|
||||
options,
|
||||
);
|
||||
}
|
||||
export function useGetVideoCardLazyQuery(
|
||||
baseOptions?: Apollo.LazyQueryHookOptions<
|
||||
GetVideoCardQuery,
|
||||
GetVideoCardQueryVariables
|
||||
>,
|
||||
) {
|
||||
const options = { ...defaultOptions, ...baseOptions };
|
||||
return Apollo.useLazyQuery<GetVideoCardQuery, GetVideoCardQueryVariables>(
|
||||
GetVideoCardDocument,
|
||||
options,
|
||||
);
|
||||
}
|
||||
export function useGetVideoCardSuspenseQuery(
|
||||
baseOptions?: Apollo.SuspenseQueryHookOptions<
|
||||
GetVideoCardQuery,
|
||||
GetVideoCardQueryVariables
|
||||
>,
|
||||
) {
|
||||
const options = { ...defaultOptions, ...baseOptions };
|
||||
return Apollo.useSuspenseQuery<GetVideoCardQuery, GetVideoCardQueryVariables>(
|
||||
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) {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user