Compare commits

...

4 Commits

Author SHA1 Message Date
Dean Wenstrand
722b2ca2b0 Re-add legacy shot-sim operations alongside GetShotLabVideos
All checks were successful
Tests / Tests (pull_request) Successful in 1m37s
Mobile master's shot-simulation-screen still uses LiveStreamPicker and
RecordedShotPicker (GetLiveStreams / GetRecordedStreams) while ALSO
using the video-first GetShotLabVideos picker — a transitional state.
1a95439 replaced the old operations in-place, so no gql commit carried
the union and mobile master's pointer could not satisfy its own code.
live_streams.gql is restored verbatim; GetRecordedStreams is re-added
in legacy_shotsim.gql so master's recorded_shots.gql (which now holds
GetShotLabVideos) stays untouched. Drop both when the old pickers are
deleted.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 22:57:28 -07:00
79f38fa45f Merge pull request 'dean/nested-comment-replies' (#307) from dean/nested-comment-replies into master
Reviewed-on: #307
2026-07-23 03:24:38 +00:00
Dean Wenstrand
16684f0057 Fetch replyToCommentId in comment reply selections
All checks were successful
Tests / Tests (pull_request) Successful in 12s
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-22 20:06:28 -07:00
Dean Wenstrand
6a599d7d2b Add replyToCommentId to CommentGQL
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-22 19:59:43 -07:00
6 changed files with 322 additions and 0 deletions

View File

@@ -274,6 +274,7 @@ export type CommentGql = {
id: Scalars["Int"]["output"];
message: Scalars["String"]["output"];
replies: Array<CommentGql>;
replyToCommentId?: Maybe<Scalars["Int"]["output"]>;
user: UserGql;
};
@@ -5008,6 +5009,7 @@ export type GetFeedQuery = {
__typename?: "CommentGQL";
id: number;
message: string;
replyToCommentId?: number | null;
user: {
__typename?: "UserGQL";
id: number;
@@ -5123,6 +5125,7 @@ export type VideoCardFieldsFragment = {
__typename?: "CommentGQL";
id: number;
message: string;
replyToCommentId?: number | null;
user: {
__typename?: "UserGQL";
id: number;
@@ -5271,6 +5274,7 @@ export type GetVideoFeedQuery = {
__typename?: "CommentGQL";
id: number;
message: string;
replyToCommentId?: number | null;
user: {
__typename?: "UserGQL";
id: number;
@@ -5410,6 +5414,69 @@ export type GetMyDrillRunsQuery = {
}>;
};
export type GetRecordedStreamsQueryVariables = Exact<{
limit?: Scalars["Int"]["input"];
}>;
export type GetRecordedStreamsQuery = {
__typename?: "Query";
getFeedVideos: {
__typename?: "VideoHistoryGQL";
videos: Array<{
__typename?: "VideoGQL";
id: number;
name?: string | null;
createdAt?: any | null;
screenshotUri?: string | null;
framesPerSecond?: number | null;
totalShots: number;
owner?: {
__typename?: "UserGQL";
id: number;
username: string;
profileImageUri?: string | null;
} | null;
}>;
};
};
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<{
videoId: Scalars["ID"]["input"];
intervalDuration: Scalars["Int"]["input"];
@@ -8514,6 +8581,7 @@ export type GetVideoSocialDetailsByIdQuery = {
__typename?: "CommentGQL";
id: number;
message: string;
replyToCommentId?: number | null;
user: {
__typename?: "UserGQL";
id: number;
@@ -8621,6 +8689,7 @@ export type GetVideoCardQuery = {
__typename?: "CommentGQL";
id: number;
message: string;
replyToCommentId?: number | null;
user: {
__typename?: "UserGQL";
id: number;
@@ -9424,6 +9493,7 @@ export const VideoCardFieldsFragmentDoc = gql`
replies {
id
message
replyToCommentId
user {
...UserSocialsFields
}
@@ -12378,6 +12448,195 @@ export type GetMyDrillRunsQueryResult = Apollo.QueryResult<
GetMyDrillRunsQuery,
GetMyDrillRunsQueryVariables
>;
export const GetRecordedStreamsDocument = gql`
query GetRecordedStreams($limit: Int! = 25) {
getFeedVideos(
limit: $limit
filters: { isStreamCompleted: true, excludeVideosWithNoShots: true }
includePrivate: MINE
feedInput: { allUsers: true }
) {
videos {
id
name
createdAt
screenshotUri
framesPerSecond
totalShots
owner {
id
username
profileImageUri
}
}
}
}
`;
/**
* __useGetRecordedStreamsQuery__
*
* To run a query within a React component, call `useGetRecordedStreamsQuery` and pass it any options that fit your needs.
* 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.
*
* @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 } = useGetRecordedStreamsQuery({
* variables: {
* limit: // value for 'limit'
* },
* });
*/
export function useGetRecordedStreamsQuery(
baseOptions?: Apollo.QueryHookOptions<
GetRecordedStreamsQuery,
GetRecordedStreamsQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useQuery<
GetRecordedStreamsQuery,
GetRecordedStreamsQueryVariables
>(GetRecordedStreamsDocument, options);
}
export function useGetRecordedStreamsLazyQuery(
baseOptions?: Apollo.LazyQueryHookOptions<
GetRecordedStreamsQuery,
GetRecordedStreamsQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useLazyQuery<
GetRecordedStreamsQuery,
GetRecordedStreamsQueryVariables
>(GetRecordedStreamsDocument, options);
}
export function useGetRecordedStreamsSuspenseQuery(
baseOptions?: Apollo.SuspenseQueryHookOptions<
GetRecordedStreamsQuery,
GetRecordedStreamsQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useSuspenseQuery<
GetRecordedStreamsQuery,
GetRecordedStreamsQueryVariables
>(GetRecordedStreamsDocument, options);
}
export type GetRecordedStreamsQueryHookResult = ReturnType<
typeof useGetRecordedStreamsQuery
>;
export type GetRecordedStreamsLazyQueryHookResult = ReturnType<
typeof useGetRecordedStreamsLazyQuery
>;
export type GetRecordedStreamsSuspenseQueryHookResult = ReturnType<
typeof useGetRecordedStreamsSuspenseQuery
>;
export type GetRecordedStreamsQueryResult = Apollo.QueryResult<
GetRecordedStreamsQuery,
GetRecordedStreamsQueryVariables
>;
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`
query GetVideoMakePercentageIntervals(
$videoId: ID!
@@ -18369,6 +18628,7 @@ export const GetVideoSocialDetailsByIdDocument = gql`
replies {
id
message
replyToCommentId
user {
...UserSocialsFields
}

View File

@@ -78,6 +78,7 @@ fragment VideoCardFields on VideoGQL {
replies {
id
message
replyToCommentId
user {
...UserSocialsFields
}

View File

@@ -0,0 +1,25 @@
# Legacy shot-sim operations still used by mobile master's
# LiveStreamPicker / RecordedShotPicker; remove when those are deleted.
query GetRecordedStreams($limit: Int! = 25) {
getFeedVideos(
limit: $limit
filters: { isStreamCompleted: true, excludeVideosWithNoShots: true }
includePrivate: MINE
feedInput: { allUsers: true }
) {
videos {
id
name
createdAt
screenshotUri
framesPerSecond
totalShots
owner {
id
username
profileImageUri
}
}
}
}

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

@@ -131,6 +131,7 @@ query GetVideoSocialDetailsById($videoId: Int!) {
replies {
id
message
replyToCommentId
user {
...UserSocialsFields
}

View File

@@ -221,6 +221,7 @@ type CommentGQL {
user: UserGQL!
message: String!
replies: [CommentGQL!]!
replyToCommentId: Int
}
type CountLeaderboardGQL {