Compare commits

..

2 Commits

Author SHA1 Message Date
8111042936 Add pool hall camera claim schema
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2026-06-16 15:41:16 -07:00
d6fd68c1f6 add quotaEnforcementEnabled to deployed config
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2026-05-28 14:40:31 -07:00
7 changed files with 263 additions and 648 deletions

View File

@@ -140,6 +140,39 @@ export type BucketSetInputGql = {
feature: Scalars["String"]["input"];
};
export type CameraClaimSession = {
__typename?: "CameraClaimSession";
camera: PoolHallCamera;
cameraId: Scalars["ID"]["output"];
challengeCode: Scalars["String"]["output"];
createdAt: Scalars["DateTime"]["output"];
detectedAt?: Maybe<Scalars["DateTime"]["output"]>;
expiresAt: Scalars["DateTime"]["output"];
failedAt?: Maybe<Scalars["DateTime"]["output"]>;
failureReason?: Maybe<Scalars["String"]["output"]>;
id: Scalars["ID"]["output"];
status: Scalars["String"]["output"];
updatedAt: Scalars["DateTime"]["output"];
userId: Scalars["ID"]["output"];
};
export type CameraLease = {
__typename?: "CameraLease";
camera: PoolHallCamera;
cameraId: Scalars["ID"]["output"];
claimSessionId?: Maybe<Scalars["ID"]["output"]>;
createdAt: Scalars["DateTime"]["output"];
endReason?: Maybe<Scalars["String"]["output"]>;
endedAt?: Maybe<Scalars["DateTime"]["output"]>;
expiresAt?: Maybe<Scalars["DateTime"]["output"]>;
id: Scalars["ID"]["output"];
startedAt: Scalars["DateTime"]["output"];
status: Scalars["String"]["output"];
updatedAt: Scalars["DateTime"]["output"];
userId: Scalars["ID"]["output"];
videoId?: Maybe<Scalars["ID"]["output"]>;
};
export type CancellationFeedbackMetadataInput = {
appVersion?: InputMaybe<Scalars["String"]["input"]>;
gitRevision?: InputMaybe<Scalars["String"]["input"]>;
@@ -235,6 +268,21 @@ export type CreateCustomerPortalSessionResultGql = {
portalUrl: Scalars["String"]["output"];
};
export type CreatePoolHallCameraInput = {
name: Scalars["String"]["input"];
poolHallId: Scalars["ID"]["input"];
streamPath?: InputMaybe<Scalars["String"]["input"]>;
tableLabel?: InputMaybe<Scalars["String"]["input"]>;
};
export type CreatePoolHallInput = {
address?: InputMaybe<Scalars["String"]["input"]>;
latitude?: InputMaybe<Scalars["Float"]["input"]>;
longitude?: InputMaybe<Scalars["Float"]["input"]>;
name: Scalars["String"]["input"];
timezone?: InputMaybe<Scalars["String"]["input"]>;
};
export type CreateSubscriptionResultGql = {
__typename?: "CreateSubscriptionResultGQL";
checkoutUrl: Scalars["String"]["output"];
@@ -2387,11 +2435,15 @@ export type Mutation = {
addAnnotationToShot: AddShotAnnotationReturn;
blockContent: Scalars["Boolean"]["output"];
blockUser: Scalars["Boolean"]["output"];
cancelCameraClaimSession: CameraClaimSession;
cancelSubscription: UserSubscriptionStatusGql;
commentOnVideo: Scalars["Boolean"]["output"];
createBucketSet: BucketSetGql;
createCameraClaimSession: CameraClaimSession;
createChallenge: Challenge;
createCustomerPortalSession: CreateCustomerPortalSessionResultGql;
createPoolHall: PoolHall;
createPoolHallCamera: PoolHallCameraStreamCredentials;
createRuleSet: RuleSet;
createSubscription: CreateSubscriptionResultGql;
createUploadStream: CreateUploadStreamReturn;
@@ -2424,6 +2476,7 @@ export type Mutation = {
respondToChallengeInvitation: ChallengeInvitation;
retireTags: Scalars["Boolean"]["output"];
revokeManualEntitlement: UserSubscriptionStatusGql;
rotatePoolHallCameraStreamKey: PoolHallCameraStreamCredentials;
setLoggerLevel: Scalars["Boolean"]["output"];
setSegmentDuration: Scalars["Boolean"]["output"];
startChallenge: ChallengeEntry;
@@ -2431,6 +2484,8 @@ export type Mutation = {
submitChallengeEntry: ChallengeEntry;
undismissChallenge: Scalars["Boolean"]["output"];
unfollowUser: UserGql;
updatePoolHall: PoolHall;
updatePoolHallCamera: PoolHallCamera;
updateShotAnnotations: UpdateShotAnnotationReturn;
};
@@ -2448,6 +2503,10 @@ export type MutationBlockUserArgs = {
userId: Scalars["Int"]["input"];
};
export type MutationCancelCameraClaimSessionArgs = {
claimSessionId: Scalars["ID"]["input"];
};
export type MutationCommentOnVideoArgs = {
message: Scalars["String"]["input"];
parentCommentId?: InputMaybe<Scalars["Int"]["input"]>;
@@ -2458,6 +2517,10 @@ export type MutationCreateBucketSetArgs = {
params: CreateBucketSetInput;
};
export type MutationCreateCameraClaimSessionArgs = {
cameraId: Scalars["ID"]["input"];
};
export type MutationCreateChallengeArgs = {
description?: InputMaybe<Scalars["String"]["input"]>;
endDate: Scalars["DateTime"]["input"];
@@ -2471,6 +2534,14 @@ export type MutationCreateChallengeArgs = {
startDate: Scalars["DateTime"]["input"];
};
export type MutationCreatePoolHallArgs = {
input: CreatePoolHallInput;
};
export type MutationCreatePoolHallCameraArgs = {
input: CreatePoolHallCameraInput;
};
export type MutationCreateRuleSetArgs = {
description?: InputMaybe<Scalars["String"]["input"]>;
name: Scalars["String"]["input"];
@@ -2606,6 +2677,10 @@ export type MutationRevokeManualEntitlementArgs = {
userId: Scalars["Int"]["input"];
};
export type MutationRotatePoolHallCameraStreamKeyArgs = {
cameraId: Scalars["ID"]["input"];
};
export type MutationSetLoggerLevelArgs = {
level: Scalars["String"]["input"];
path: Scalars["String"]["input"];
@@ -2640,6 +2715,14 @@ export type MutationUnfollowUserArgs = {
followedUserId: Scalars["Int"]["input"];
};
export type MutationUpdatePoolHallArgs = {
input: UpdatePoolHallInput;
};
export type MutationUpdatePoolHallCameraArgs = {
input: UpdatePoolHallCameraInput;
};
export type MutationUpdateShotAnnotationsArgs = {
annotations: Array<UpdateAnnotationInputGql>;
shotId: Scalars["Int"]["input"];
@@ -2791,6 +2874,41 @@ export type PocketingIntentionInfoGql = {
pocketId: PocketIdentifier;
};
export type PoolHall = {
__typename?: "PoolHall";
address?: Maybe<Scalars["String"]["output"]>;
createdAt: Scalars["DateTime"]["output"];
id: Scalars["ID"]["output"];
latitude?: Maybe<Scalars["Float"]["output"]>;
longitude?: Maybe<Scalars["Float"]["output"]>;
name: Scalars["String"]["output"];
status: Scalars["String"]["output"];
timezone?: Maybe<Scalars["String"]["output"]>;
updatedAt: Scalars["DateTime"]["output"];
};
export type PoolHallCamera = {
__typename?: "PoolHallCamera";
createdAt: Scalars["DateTime"]["output"];
id: Scalars["ID"]["output"];
lastPublishedAt?: Maybe<Scalars["DateTime"]["output"]>;
lastUnpublishedAt?: Maybe<Scalars["DateTime"]["output"]>;
name: Scalars["String"]["output"];
poolHall: PoolHall;
poolHallId: Scalars["ID"]["output"];
status: Scalars["String"]["output"];
streamPath: Scalars["String"]["output"];
tableLabel?: Maybe<Scalars["String"]["output"]>;
updatedAt: Scalars["DateTime"]["output"];
};
export type PoolHallCameraStreamCredentials = {
__typename?: "PoolHallCameraStreamCredentials";
camera: PoolHallCamera;
rtmpPath: Scalars["String"]["output"];
streamKey: Scalars["String"]["output"];
};
export type ProcessingFailedErr = {
__typename?: "ProcessingFailedErr";
processing: VideoProcessingGql;
@@ -2809,9 +2927,13 @@ export enum ProcessingStatusEnum {
export type Query = {
__typename?: "Query";
activeCameraLease?: Maybe<CameraLease>;
cameraClaimSession?: Maybe<CameraClaimSession>;
challenge?: Maybe<Challenge>;
challengeLeaderboard: Array<ChallengeEntry>;
challenges: Array<Challenge>;
claimableCameras: Array<PoolHallCamera>;
claimablePoolHalls: Array<PoolHall>;
doesUsernameExist: Scalars["Boolean"]["output"];
getAggregatedShotMetrics: Array<AggregateResultGql>;
getAvailableSubscriptionOptions: StripeSubscriptionOptionsGql;
@@ -2847,12 +2969,18 @@ export type Query = {
myChallengeInvitations: Array<ChallengeInvitation>;
myDismissedChallenges: Array<Challenge>;
notifications: NotificationConnection;
poolHallCameras: Array<PoolHallCamera>;
poolHalls: Array<PoolHall>;
ruleSets: Array<RuleSet>;
unreadNotificationCount: Scalars["Int"]["output"];
videoPlayerClusters: Array<PlayerClusterGql>;
waitFor: Scalars["Float"]["output"];
};
export type QueryCameraClaimSessionArgs = {
id: Scalars["ID"]["input"];
};
export type QueryChallengeArgs = {
id: Scalars["ID"]["input"];
};
@@ -2866,6 +2994,10 @@ export type QueryChallengesArgs = {
includeDismissed?: Scalars["Boolean"]["input"];
};
export type QueryClaimableCamerasArgs = {
poolHallId: Scalars["ID"]["input"];
};
export type QueryDoesUsernameExistArgs = {
candidateUsername: Scalars["String"]["input"];
};
@@ -3016,6 +3148,10 @@ export type QueryNotificationsArgs = {
offset?: Scalars["Int"]["input"];
};
export type QueryPoolHallCamerasArgs = {
poolHallId: Scalars["ID"]["input"];
};
export type QueryVideoPlayerClustersArgs = {
videoId: Scalars["Int"]["input"];
};
@@ -3432,6 +3568,23 @@ export type UpdateAnnotationInputGql = {
notes?: InputMaybe<Scalars["String"]["input"]>;
};
export type UpdatePoolHallCameraInput = {
id: Scalars["ID"]["input"];
name?: InputMaybe<Scalars["String"]["input"]>;
status?: InputMaybe<Scalars["String"]["input"]>;
tableLabel?: InputMaybe<Scalars["String"]["input"]>;
};
export type UpdatePoolHallInput = {
address?: InputMaybe<Scalars["String"]["input"]>;
id: Scalars["ID"]["input"];
latitude?: InputMaybe<Scalars["Float"]["input"]>;
longitude?: InputMaybe<Scalars["Float"]["input"]>;
name?: InputMaybe<Scalars["String"]["input"]>;
status?: InputMaybe<Scalars["String"]["input"]>;
timezone?: InputMaybe<Scalars["String"]["input"]>;
};
export type UpdateShotAnnotationReturn = {
__typename?: "UpdateShotAnnotationReturn";
error?: Maybe<DoesNotOwnShotErr>;
@@ -4393,24 +4546,6 @@ 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"]>;
@@ -5496,39 +5631,6 @@ 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;
@@ -5800,47 +5902,6 @@ export type GetUserPlayTimeQuery = {
getPlayTime: { __typename?: "UserPlayTimeGQL"; totalSeconds: number };
};
export type GetUploadQuotaStatusQueryVariables = Exact<{
[key: string]: never;
}>;
export type GetUploadQuotaStatusQuery = {
__typename?: "Query";
getQuotaStatus: {
__typename?: "QuotaStatusGQL";
tierName: string;
periodStart: any;
periodEnd: any;
durationUsedSeconds: number;
durationLimitSeconds?: number | null;
maxVideoDurationSeconds?: number | null;
durationRemainingSeconds?: number | null;
canUpload: boolean;
importQuotaBuckets: Array<{
__typename?: "QuotaBucketStatusGQL";
quotaKey: string;
appliesToUploadKind: string;
periodStart: any;
periodEnd: any;
durationUsedSeconds: number;
durationLimitSeconds?: number | null;
durationRemainingSeconds?: number | null;
canUpload: boolean;
}>;
recordingQuotaBuckets: Array<{
__typename?: "QuotaBucketStatusGQL";
quotaKey: string;
appliesToUploadKind: string;
periodStart: any;
periodEnd: any;
durationUsedSeconds: number;
durationLimitSeconds?: number | null;
durationRemainingSeconds?: number | null;
canUpload: boolean;
}>;
};
};
export type GetUsernamesQueryVariables = Exact<{
matchString: Scalars["String"]["input"];
limit?: InputMaybe<Scalars["Int"]["input"]>;
@@ -6248,102 +6309,6 @@ 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"];
}>;
@@ -6896,10 +6861,8 @@ export type UploadStreamWithDetailsFragment = {
startTime?: any | null;
stream?: {
__typename?: "UploadStreamGQL";
id: string;
isCompleted: boolean;
lastIntendedSegmentBound?: number | null;
streamSegmentType: StreamSegmentTypeEnum;
uploadCompletionCursor: number;
uploadsCompleted: number;
} | null;
@@ -6922,10 +6885,8 @@ export type GetUploadStreamsWithDetailsQuery = {
startTime?: any | null;
stream?: {
__typename?: "UploadStreamGQL";
id: string;
isCompleted: boolean;
lastIntendedSegmentBound?: number | null;
streamSegmentType: StreamSegmentTypeEnum;
uploadCompletionCursor: number;
uploadsCompleted: number;
} | null;
@@ -7100,16 +7061,6 @@ 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
@@ -7313,10 +7264,8 @@ export const UploadStreamWithDetailsFragmentDoc = gql`
name
startTime
stream {
id
isCompleted
lastIntendedSegmentBound
streamSegmentType
uploadCompletionCursor
uploadsCompleted
}
@@ -9197,93 +9146,6 @@ 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
@@ -11587,93 +11449,6 @@ 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) {
@@ -12163,105 +11938,6 @@ export type GetUserPlayTimeQueryResult = Apollo.QueryResult<
GetUserPlayTimeQuery,
GetUserPlayTimeQueryVariables
>;
export const GetUploadQuotaStatusDocument = gql`
query GetUploadQuotaStatus {
getQuotaStatus {
tierName
periodStart
periodEnd
durationUsedSeconds
durationLimitSeconds
maxVideoDurationSeconds
durationRemainingSeconds
canUpload
importQuotaBuckets {
quotaKey
appliesToUploadKind
periodStart
periodEnd
durationUsedSeconds
durationLimitSeconds
durationRemainingSeconds
canUpload
}
recordingQuotaBuckets {
quotaKey
appliesToUploadKind
periodStart
periodEnd
durationUsedSeconds
durationLimitSeconds
durationRemainingSeconds
canUpload
}
}
}
`;
/**
* __useGetUploadQuotaStatusQuery__
*
* To run a query within a React component, call `useGetUploadQuotaStatusQuery` and pass it any options that fit your needs.
* When your component renders, `useGetUploadQuotaStatusQuery` 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 } = useGetUploadQuotaStatusQuery({
* variables: {
* },
* });
*/
export function useGetUploadQuotaStatusQuery(
baseOptions?: Apollo.QueryHookOptions<
GetUploadQuotaStatusQuery,
GetUploadQuotaStatusQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useQuery<
GetUploadQuotaStatusQuery,
GetUploadQuotaStatusQueryVariables
>(GetUploadQuotaStatusDocument, options);
}
export function useGetUploadQuotaStatusLazyQuery(
baseOptions?: Apollo.LazyQueryHookOptions<
GetUploadQuotaStatusQuery,
GetUploadQuotaStatusQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useLazyQuery<
GetUploadQuotaStatusQuery,
GetUploadQuotaStatusQueryVariables
>(GetUploadQuotaStatusDocument, options);
}
export function useGetUploadQuotaStatusSuspenseQuery(
baseOptions?: Apollo.SuspenseQueryHookOptions<
GetUploadQuotaStatusQuery,
GetUploadQuotaStatusQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useSuspenseQuery<
GetUploadQuotaStatusQuery,
GetUploadQuotaStatusQueryVariables
>(GetUploadQuotaStatusDocument, options);
}
export type GetUploadQuotaStatusQueryHookResult = ReturnType<
typeof useGetUploadQuotaStatusQuery
>;
export type GetUploadQuotaStatusLazyQueryHookResult = ReturnType<
typeof useGetUploadQuotaStatusLazyQuery
>;
export type GetUploadQuotaStatusSuspenseQueryHookResult = ReturnType<
typeof useGetUploadQuotaStatusSuspenseQuery
>;
export type GetUploadQuotaStatusQueryResult = Apollo.QueryResult<
GetUploadQuotaStatusQuery,
GetUploadQuotaStatusQueryVariables
>;
export const GetUsernamesDocument = gql`
query getUsernames(
$matchString: String!
@@ -13488,80 +13164,6 @@ 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) {

View File

@@ -101,27 +101,6 @@ 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

View File

@@ -132,38 +132,6 @@ 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

View File

@@ -49,39 +49,6 @@ query GetUserPlayTime($userId: Int!, $filters: VideoFilterInput) {
}
}
query GetUploadQuotaStatus {
getQuotaStatus {
tierName
periodStart
periodEnd
durationUsedSeconds
durationLimitSeconds
maxVideoDurationSeconds
durationRemainingSeconds
canUpload
importQuotaBuckets {
quotaKey
appliesToUploadKind
periodStart
periodEnd
durationUsedSeconds
durationLimitSeconds
durationRemainingSeconds
canUpload
}
recordingQuotaBuckets {
quotaKey
appliesToUploadKind
periodStart
periodEnd
durationUsedSeconds
durationLimitSeconds
durationRemainingSeconds
canUpload
}
}
}
query getUsernames(
$matchString: String!
$limit: Int = null

View File

@@ -139,15 +139,6 @@ 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

View File

@@ -113,10 +113,8 @@ fragment UploadStreamWithDetails on VideoGQL {
name
startTime
stream {
id
isCompleted
lastIntendedSegmentBound
streamSegmentType
uploadCompletionCursor
uploadsCompleted
}

View File

@@ -42,6 +42,12 @@ type Query {
filters: NotificationFilters = null
): NotificationConnection!
unreadNotificationCount: Int!
poolHalls: [PoolHall!]!
claimablePoolHalls: [PoolHall!]!
poolHallCameras(poolHallId: ID!): [PoolHallCamera!]!
claimableCameras(poolHallId: ID!): [PoolHallCamera!]!
cameraClaimSession(id: ID!): CameraClaimSession
activeCameraLease: CameraLease
getRuns(
filterInput: RunFilterInput!
runIds: [Int!] = null
@@ -840,6 +846,63 @@ input NotificationFilters {
notificationTypes: [NotificationTypeEnum!] = null
}
type PoolHall {
id: ID!
name: String!
address: String
latitude: Float
longitude: Float
timezone: String
status: String!
createdAt: DateTime!
updatedAt: DateTime!
}
type PoolHallCamera {
id: ID!
poolHallId: ID!
name: String!
tableLabel: String
streamPath: String!
status: String!
lastPublishedAt: DateTime
lastUnpublishedAt: DateTime
createdAt: DateTime!
updatedAt: DateTime!
poolHall: PoolHall!
}
type CameraClaimSession {
id: ID!
cameraId: ID!
userId: ID!
challengeCode: String!
status: String!
expiresAt: DateTime!
detectedAt: DateTime
failedAt: DateTime
failureReason: String
createdAt: DateTime!
updatedAt: DateTime!
camera: PoolHallCamera!
}
type CameraLease {
id: ID!
cameraId: ID!
claimSessionId: ID
userId: ID!
videoId: ID
status: String!
startedAt: DateTime!
endedAt: DateTime
expiresAt: DateTime
endReason: String
createdAt: DateTime!
updatedAt: DateTime!
camera: PoolHallCamera!
}
type GetRunsResult {
runs: [RunGQL!]!
count: Int
@@ -1149,6 +1212,15 @@ type Mutation {
markAllNotificationsAsRead: Boolean!
markNotificationsAsRead(notificationIds: [Int!]!): Boolean!
deleteNotification(notificationId: Int!): Boolean!
createPoolHall(input: CreatePoolHallInput!): PoolHall!
updatePoolHall(input: UpdatePoolHallInput!): PoolHall!
createPoolHallCamera(
input: CreatePoolHallCameraInput!
): PoolHallCameraStreamCredentials!
updatePoolHallCamera(input: UpdatePoolHallCameraInput!): PoolHallCamera!
rotatePoolHallCameraStreamKey(cameraId: ID!): PoolHallCameraStreamCredentials!
createCameraClaimSession(cameraId: ID!): CameraClaimSession!
cancelCameraClaimSession(claimSessionId: ID!): CameraClaimSession!
finalizePlayerAssignments(
input: FinalizePlayerAssignmentsInput!
): [PlayerClusterGQL!]!
@@ -1223,6 +1295,44 @@ enum ReportReasonEnum {
OTHER
}
input CreatePoolHallInput {
name: String!
address: String = null
latitude: Float = null
longitude: Float = null
timezone: String = null
}
input UpdatePoolHallInput {
id: ID!
name: String = null
address: String = null
latitude: Float = null
longitude: Float = null
timezone: String = null
status: String = null
}
type PoolHallCameraStreamCredentials {
camera: PoolHallCamera!
streamKey: String!
rtmpPath: String!
}
input CreatePoolHallCameraInput {
poolHallId: ID!
name: String!
tableLabel: String = null
streamPath: String = null
}
input UpdatePoolHallCameraInput {
id: ID!
name: String = null
tableLabel: String = null
status: String = null
}
input FinalizePlayerAssignmentsInput {
videoId: Int!
clusterAssignments: [ClusterAssignmentInput!]! = []