From 568f7f788913faba15d952e7fb7bec548e5ca592 Mon Sep 17 00:00:00 2001 From: Dean Wenstrand Date: Sat, 25 Jul 2026 09:56:00 -0700 Subject: [PATCH] Add createShotShareLink for short share links Schema and hooks regenerated with the standard pipeline (export -> graphql-codegen -> prettier) rather than hand-edited, so schema.gql matches what the exporter emits. That normalises some ordering drift left by earlier hand-grafted edits, which is why the diff touches a few unrelated declarations; the schema is semantically identical to the backend export (verified via lexicographic_sort_schema). Co-Authored-By: Claude Fable 5 --- src/index.tsx | 87 +++++++++++++++++++++++++++++++++++ src/operations/share_link.gql | 8 ++++ src/schema.gql | 45 +++++++++++------- 3 files changed, 123 insertions(+), 17 deletions(-) create mode 100644 src/operations/share_link.gql diff --git a/src/index.tsx b/src/index.tsx index 58662f8..8d2e120 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -315,6 +315,11 @@ export type CreatePoolHallInput = { timezone?: InputMaybe; }; +export type CreateShotShareLinkInput = { + paddingSeconds?: InputMaybe; + shotIds: Array; +}; + export type CreateSubscriptionResultGql = { __typename?: "CreateSubscriptionResultGQL"; checkoutUrl: Scalars["String"]["output"]; @@ -2530,6 +2535,7 @@ export type Mutation = { createPoolHall: PoolHall; createPoolHallCamera: PoolHallCameraStreamCredentials; createRuleSet: RuleSet; + createShotShareLink: ShareLinkGql; createSubscription: CreateSubscriptionResultGql; createUploadStream: CreateUploadStreamReturn; deleteComment: Scalars["Boolean"]["output"]; @@ -2644,6 +2650,10 @@ export type MutationCreateRuleSetArgs = { name: Scalars["String"]["input"]; }; +export type MutationCreateShotShareLinkArgs = { + input: CreateShotShareLinkInput; +}; + export type MutationCreateSubscriptionArgs = { priceId: Scalars["String"]["input"]; }; @@ -3750,6 +3760,12 @@ export enum SessionCoachStateEnum { Ready = "READY", } +export type ShareLinkGql = { + __typename?: "ShareLinkGQL"; + slug: Scalars["String"]["output"]; + url: Scalars["String"]["output"]; +}; + export type ShotAnnotationGql = { __typename?: "ShotAnnotationGQL"; createdAt?: Maybe; @@ -7321,6 +7337,20 @@ export type SessionCoachGenerationFieldsFragment = { } | null; }; +export type CreateShotShareLinkMutationVariables = Exact<{ + shotIds: Array | Scalars["Int"]["input"]; + paddingSeconds?: InputMaybe; +}>; + +export type CreateShotShareLinkMutation = { + __typename?: "Mutation"; + createShotShareLink: { + __typename?: "ShareLinkGQL"; + slug: string; + url: string; + }; +}; + export type PlayerSummaryFieldsFragment = { __typename?: "PlayerSummaryGQL"; clusterId: number; @@ -15688,6 +15718,63 @@ export type RequestSessionCoachGenerationMutationOptions = RequestSessionCoachGenerationMutation, 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; +export type CreateShotShareLinkMutationOptions = Apollo.BaseMutationOptions< + CreateShotShareLinkMutation, + CreateShotShareLinkMutationVariables +>; export const VideoPlayerClustersDocument = gql` query VideoPlayerClusters($videoId: Int!) { videoPlayerClusters(videoId: $videoId) { diff --git a/src/operations/share_link.gql b/src/operations/share_link.gql new file mode 100644 index 0000000..99b9584 --- /dev/null +++ b/src/operations/share_link.gql @@ -0,0 +1,8 @@ +mutation CreateShotShareLink($shotIds: [Int!]!, $paddingSeconds: Float = null) { + createShotShareLink( + input: { shotIds: $shotIds, paddingSeconds: $paddingSeconds } + ) { + slug + url + } +} diff --git a/src/schema.gql b/src/schema.gql index e537050..06d4e35 100644 --- a/src/schema.gql +++ b/src/schema.gql @@ -259,6 +259,11 @@ input CreatePoolHallInput { timezone: String = null } +input CreateShotShareLinkInput { + shotIds: [Int!]! + paddingSeconds: Float = null +} + type CreateSubscriptionResultGQL { checkoutUrl: String! sessionId: String! @@ -341,7 +346,7 @@ type DoesNotOwnShotErr { } union DoesNotOwnShotErrOtherErrorNeedsNote = - DoesNotOwnShotErr + | DoesNotOwnShotErr | OtherErrorNeedsNote type DrillRunLeaderboardGQL { @@ -531,19 +536,6 @@ type GetUploadLinksReturn { stream: UploadStreamGQL } -type SegmentUploadLink { - segmentIndex: Int! - uploadUrl: String! - headers: [Header]! -} - -type UploadLinkBatch { - links: [SegmentUploadLink!]! - alreadyUploaded: [Int!]! -} - -union UploadLinkBatchGetUploadLinkErrors = UploadLinkBatch | GetUploadLinkErrors - type HLSPlaylistGQL { videoId: Int! m3u8Text: String! @@ -644,7 +636,7 @@ type MustHaveSetForUploadLinkErr { } union MustHaveSetForUploadLinkErrSegmentAlreadyUploadedErrProcessingFailedErrNoInitForChunkedUploadErrTooManyProfileImageUploadsErrInitUploadAlreadyCompletedErrTooManyInitUploadsErrStorageLimitExceededErr = - MustHaveSetForUploadLinkErr + | MustHaveSetForUploadLinkErr | SegmentAlreadyUploadedErr | ProcessingFailedErr | NoInitForChunkedUploadErr @@ -719,6 +711,7 @@ type Mutation { cancelCameraClaimSession(claimSessionId: ID!): CameraClaimSession! endCameraLease(leaseId: ID!): CameraLease! extendCameraLease(leaseId: ID!, additionalMinutes: Int! = 60): CameraLease! + createShotShareLink(input: CreateShotShareLinkInput!): ShareLinkGQL! finalizePlayerAssignments( input: FinalizePlayerAssignmentsInput! ): [PlayerClusterGQL!]! @@ -1308,6 +1301,12 @@ type SegmentAlreadyUploadedErr { segmentId: Int! } +type SegmentUploadLink { + segmentIndex: Int! + uploadUrl: String! + headers: [Header]! +} + type SerializedShotPathsGQL { b64EncodedBuffer: String } @@ -1460,6 +1459,11 @@ enum SessionCoachStateEnum { FAILED } +type ShareLinkGQL { + slug: String! + url: String! +} + type ShotAnnotationGQL { shotId: Int! type: ShotAnnotationTypeGQL! @@ -1682,7 +1686,7 @@ type SuccessfulAdd { } union SuccessfulAddAddShotAnnotationErrors = - SuccessfulAdd + | SuccessfulAdd | AddShotAnnotationErrors input SyncAppleSubscriptionInputGQL { @@ -1794,8 +1798,15 @@ type UploadLink { headers: [Header]! } +type UploadLinkBatch { + links: [SegmentUploadLink!]! + alreadyUploaded: [Int!]! +} + +union UploadLinkBatchGetUploadLinkErrors = UploadLinkBatch | GetUploadLinkErrors + union UploadLinkGetProfileUploadLinkErrors = - UploadLink + | UploadLink | GetProfileUploadLinkErrors union UploadLinkGetUploadLinkErrors = UploadLink | GetUploadLinkErrors