Compare commits

..

29 Commits

Author SHA1 Message Date
c388932271 Add storage usage readiness fields 2026-06-26 11:36:02 -07:00
bc52145a9e Merge pull request 'Add storage status schema' (#270) from pr8-storage-status into master
Reviewed-on: #270
2026-06-26 15:33:19 +00:00
5c286f2bcf Add storage status schema
All checks were successful
Tests / Tests (pull_request) Successful in 24s
2026-06-25 17:34:19 -07:00
d636c298f8 Merge pull request 'Add resolved tier capabilities schema' (#269) from tier-capabilities-schema into master
Reviewed-on: #269
2026-06-24 03:37:17 +00:00
681320c62d Add resolved tier capabilities schema
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2026-06-23 15:51:21 -07:00
49f409f60b Merge pull request 'Add resolved tier schema' (#268) from resolved-tier-contract into master
Reviewed-on: #268
2026-06-23 22:10:10 +00:00
e7fc6c147d Add resolved tier schema
All checks were successful
Tests / Tests (pull_request) Successful in 11s
2026-06-23 14:01:32 -07:00
10c3f6de53 Merge pull request 'Add drill leaderboard run dates to gql' (#267) from dean/add-dates-to-leaderboards-gql into master
Reviewed-on: #267
2026-06-23 15:51:28 +00:00
Dean Wenstrand
d7b1aaee13 Add drill leaderboard run dates to gql
All checks were successful
Tests / Tests (pull_request) Successful in 25s
2026-06-23 08:47:08 -07:00
b477590137 Merge pull request 'VideoCardFields: fetch stream isCompleted + lastSegmentUploadedAt' (#266) from dean/feed-upload-status-fields into master
Reviewed-on: #266
2026-06-20 22:45:07 +00:00
Dean Wenstrand
d428a8caa2 VideoCardFields: fetch stream isCompleted + lastSegmentUploadedAt
All checks were successful
Tests / Tests (pull_request) Successful in 10s
Lets the feed derive upload state (uploading vs paused vs processing) per card.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 15:16:11 -07:00
48207e12ee Merge pull request 'Add lastSegmentUploadedAt to UploadStreamGQL' (#265) from dean/last-uploaded-chunk into master
Reviewed-on: #265
2026-06-20 21:45:32 +00:00
Dean Wenstrand
1d403f8155 Add lastSegmentUploadedAt to UploadStreamGQL
All checks were successful
Tests / Tests (pull_request) Successful in 10s
Surfaces the timestamp of the most recently uploaded chunk so clients can tell
an actively-uploading stream from a partially-uploaded, stalled/paused one
(combined with isCompleted).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 14:40:40 -07:00
6758f3e77a Merge pull request 'Add bio field to user (UserFragment + editUser)' (#264) from dean/profile-bio into master
Reviewed-on: #264
2026-06-19 21:27:52 +00:00
Dean Wenstrand
79979b001a Add bio field to user (UserFragment + editUser)
All checks were successful
Tests / Tests (pull_request) Successful in 10s
Expose UserGQL.bio in UserFragment and let editUser set it; regenerated
codegen. Rebased onto current master.
2026-06-19 14:14:24 -07:00
49fbebd0c2 Merge pull request 'Fix duplicate Apple IAP selection' (#263) from loewy/fix-duplicate-apple-iap-selection into master
Reviewed-on: #263
2026-06-18 21:39:20 +00:00
9219451c8d Fix duplicate Apple IAP selection
All checks were successful
Tests / Tests (pull_request) Successful in 11s
2026-06-18 14:32:37 -07:00
42601f9587 Merge pull request 'Add Apple subscription mobile operations' (#255) from apple-iap-pr4-mobile-ops into master
Reviewed-on: #255
2026-06-18 20:03:10 +00:00
acfb750265 Merge pull request 'Add Apple IAP product IDs to subscription options' (#262) from loewy/apple-iap-product-options into master
Reviewed-on: #262
2026-06-18 01:59:53 +00:00
ffa96a24c3 Add Apple subscription mobile operations
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2026-06-17 18:39:36 -07:00
5b73dd3a83 Add Apple IAP product IDs to subscription options
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2026-06-17 18:22:47 -07:00
d1bc29b41b Add Apple IAP product config to subscription options
All checks were successful
Tests / Tests (pull_request) Successful in 11s
2026-06-16 18:31:36 -07:00
853769e183 Add Apple subscription mobile operations 2026-06-16 18:31:36 -07:00
84524d165d Merge pull request 'Add followingCount to GetVideoFeed payload' (#261) from dean/feed-following-count into master
Reviewed-on: #261
2026-06-16 23:51:38 +00:00
Dean Wenstrand
f4c5fcedd6 Add followingCount to GetVideoFeed payload
All checks were successful
Tests / Tests (pull_request) Successful in 9s
Surfaces how many leading feed videos come from followed users so the
client can place the 'Trending' section divider in the blended home feed.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-16 16:46:21 -07:00
07ca121a3e Merge pull request 'Add spinTypeBreakdown (draw/center/follow) to PlayerSummaryFields' (#259) from dean/player-spin-types into master
Reviewed-on: #259
2026-06-16 22:24:19 +00:00
Dean Wenstrand
66fb4d3dcc Add spinTypeBreakdown (draw/center/follow) to PlayerSummaryFields
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2026-06-16 14:36:56 -07:00
5293576947 Merge pull request 'Add runLengths to PlayerSummaryFields (per-player run distribution)' (#258) from dean/player-run-lengths into master
Reviewed-on: #258
2026-06-16 20:57:00 +00:00
Dean Wenstrand
0c1afbcc76 Add runLengths to PlayerSummaryFields (per-player run distribution)
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2026-06-16 13:39:04 -07:00
7 changed files with 200 additions and 13 deletions

View File

@@ -28,6 +28,8 @@ export type Scalars = {
Boolean: { input: boolean; output: boolean }; Boolean: { input: boolean; output: boolean };
Int: { input: number; output: number }; Int: { input: number; output: number };
Float: { input: number; output: number }; Float: { input: number; output: number };
/** Integer value that can exceed GraphQL Int's 32-bit range. */
BigInt: { input: any; output: any };
/** Date (isoformat) */ /** Date (isoformat) */
Date: { input: any; output: any }; Date: { input: any; output: any };
/** Date with time (isoformat) */ /** Date with time (isoformat) */
@@ -83,6 +85,7 @@ export type AppleIapSubscriptionOptionsGql = {
__typename?: "AppleIapSubscriptionOptionsGQL"; __typename?: "AppleIapSubscriptionOptionsGQL";
enabled: Scalars["Boolean"]["output"]; enabled: Scalars["Boolean"]["output"];
proMonthlyProductId?: Maybe<Scalars["String"]["output"]>; proMonthlyProductId?: Maybe<Scalars["String"]["output"]>;
productIds: Array<Scalars["String"]["output"]>;
}; };
export type BankFeaturesGql = { export type BankFeaturesGql = {
@@ -326,6 +329,7 @@ export type EditShotReturn = {
export type EditUserInputGql = { export type EditUserInputGql = {
agreesToMarketing?: InputMaybe<Scalars["Boolean"]["input"]>; agreesToMarketing?: InputMaybe<Scalars["Boolean"]["input"]>;
bio?: InputMaybe<Scalars["String"]["input"]>;
fargoRating?: InputMaybe<Scalars["Int"]["input"]>; fargoRating?: InputMaybe<Scalars["Int"]["input"]>;
username?: InputMaybe<Scalars["String"]["input"]>; username?: InputMaybe<Scalars["String"]["input"]>;
videosPrivateByDefault?: InputMaybe<Scalars["Boolean"]["input"]>; videosPrivateByDefault?: InputMaybe<Scalars["Boolean"]["input"]>;
@@ -2752,7 +2756,9 @@ export type PlayerSummaryGql = {
makePercentage: Scalars["Float"]["output"]; makePercentage: Scalars["Float"]["output"];
profileImageUri?: Maybe<Scalars["String"]["output"]>; profileImageUri?: Maybe<Scalars["String"]["output"]>;
representativeFullFrameUrl?: Maybe<Scalars["String"]["output"]>; representativeFullFrameUrl?: Maybe<Scalars["String"]["output"]>;
runLengths: Array<Scalars["Int"]["output"]>;
score?: Maybe<Scalars["Int"]["output"]>; score?: Maybe<Scalars["Int"]["output"]>;
spinTypeBreakdown: SpinTypeBreakdownGql;
totalShots: Scalars["Int"]["output"]; totalShots: Scalars["Int"]["output"];
totalShotsMade: Scalars["Int"]["output"]; totalShotsMade: Scalars["Int"]["output"];
userId?: Maybe<Scalars["Int"]["output"]>; userId?: Maybe<Scalars["Int"]["output"]>;
@@ -2849,11 +2855,13 @@ export type Query = {
getOrderedShots: GetShotsResult; getOrderedShots: GetShotsResult;
getPlayTime: UserPlayTimeGql; getPlayTime: UserPlayTimeGql;
getQuotaStatus: QuotaStatusGql; getQuotaStatus: QuotaStatusGql;
getResolvedTier: ResolvedTierGql;
getRuns: GetRunsResult; getRuns: GetRunsResult;
getShotAnnotationTypes: Array<ShotAnnotationTypeGql>; getShotAnnotationTypes: Array<ShotAnnotationTypeGql>;
getShots: Array<ShotGql>; getShots: Array<ShotGql>;
getShotsByIds: Array<ShotGql>; getShotsByIds: Array<ShotGql>;
getShotsWithMetadata: GetShotsResult; getShotsWithMetadata: GetShotsResult;
getStorageStatus?: Maybe<StorageStatusGql>;
getTableState: TableStateGql; getTableState: TableStateGql;
getUser?: Maybe<UserGql>; getUser?: Maybe<UserGql>;
getUserRelationshipsMatching: UserRelationshipsResult; getUserRelationshipsMatching: UserRelationshipsResult;
@@ -3154,6 +3162,18 @@ export type RequestedMedalsGql = {
totalMakes10000?: Maybe<MedalGql>; totalMakes10000?: Maybe<MedalGql>;
}; };
export type ResolvedTierGql = {
__typename?: "ResolvedTierGQL";
capabilities: Array<Scalars["String"]["output"]>;
entitlementEndsAt?: Maybe<Scalars["DateTime"]["output"]>;
entitlementSource?: Maybe<EntitlementSourceTypeEnum>;
entitlementStartsAt?: Maybe<Scalars["DateTime"]["output"]>;
entitlementStatus?: Maybe<Scalars["String"]["output"]>;
hasActiveSubscription: Scalars["Boolean"]["output"];
tierDisplayName: Scalars["String"]["output"];
tierName: Scalars["String"]["output"];
};
export type RuleSet = { export type RuleSet = {
__typename?: "RuleSet"; __typename?: "RuleSet";
createdAt: Scalars["DateTime"]["output"]; createdAt: Scalars["DateTime"]["output"];
@@ -3344,6 +3364,13 @@ export type ShotsOrderingComponent =
videoId: IntOrdering; videoId: IntOrdering;
}; };
export type SpinTypeBreakdownGql = {
__typename?: "SpinTypeBreakdownGQL";
center: Scalars["Int"]["output"];
draw: Scalars["Int"]["output"];
follow: Scalars["Int"]["output"];
};
export type SpinTypeCountsGql = { export type SpinTypeCountsGql = {
__typename?: "SpinTypeCountsGQL"; __typename?: "SpinTypeCountsGQL";
center: Scalars["Int"]["output"]; center: Scalars["Int"]["output"];
@@ -3359,6 +3386,24 @@ export enum SpinTypeEnum {
Unknown = "UNKNOWN", Unknown = "UNKNOWN",
} }
export type StorageStatusGql = {
__typename?: "StorageStatusGQL";
isNearLimit: Scalars["Boolean"]["output"];
isOverLimit: Scalars["Boolean"]["output"];
isUnlimited: Scalars["Boolean"]["output"];
lastCalculatedAt?: Maybe<Scalars["DateTime"]["output"]>;
policyConfigured: Scalars["Boolean"]["output"];
remainingStorageBytes?: Maybe<Scalars["BigInt"]["output"]>;
retainedStorageLimitBytes?: Maybe<Scalars["BigInt"]["output"]>;
retainedStorageUsedBytes: Scalars["BigInt"]["output"];
storageUsageRatio?: Maybe<Scalars["Float"]["output"]>;
tierName: Scalars["String"]["output"];
usageCalculated: Scalars["Boolean"]["output"];
usageEstimated: Scalars["Boolean"]["output"];
usageSource?: Maybe<Scalars["String"]["output"]>;
userId: Scalars["Int"]["output"];
};
export type StreamErrorGql = { export type StreamErrorGql = {
__typename?: "StreamErrorGQL"; __typename?: "StreamErrorGQL";
message: Scalars["String"]["output"]; message: Scalars["String"]["output"];
@@ -3530,6 +3575,7 @@ export type UploadStreamGql = {
initPlaylistUploadStatus?: Maybe<InitPlaylistUploadStatusEnum>; initPlaylistUploadStatus?: Maybe<InitPlaylistUploadStatusEnum>;
isCompleted: Scalars["Boolean"]["output"]; isCompleted: Scalars["Boolean"]["output"];
lastIntendedSegmentBound?: Maybe<Scalars["Int"]["output"]>; lastIntendedSegmentBound?: Maybe<Scalars["Int"]["output"]>;
lastSegmentUploadedAt?: Maybe<Scalars["DateTime"]["output"]>;
linksRequested: Scalars["Int"]["output"]; linksRequested: Scalars["Int"]["output"];
lowestUnuploadedSegmentIndex: Scalars["Int"]["output"]; lowestUnuploadedSegmentIndex: Scalars["Int"]["output"];
resolution: VideoResolutionGql; resolution: VideoResolutionGql;
@@ -3546,6 +3592,7 @@ export type UserGql = {
__typename?: "UserGQL"; __typename?: "UserGQL";
activeVideoId?: Maybe<Scalars["Int"]["output"]>; activeVideoId?: Maybe<Scalars["Int"]["output"]>;
agreesToMarketing?: Maybe<Scalars["Boolean"]["output"]>; agreesToMarketing?: Maybe<Scalars["Boolean"]["output"]>;
bio?: Maybe<Scalars["String"]["output"]>;
createdAt?: Maybe<Scalars["DateTime"]["output"]>; createdAt?: Maybe<Scalars["DateTime"]["output"]>;
fargoRating?: Maybe<Scalars["Int"]["output"]>; fargoRating?: Maybe<Scalars["Int"]["output"]>;
firebaseUid?: Maybe<Scalars["String"]["output"]>; firebaseUid?: Maybe<Scalars["String"]["output"]>;
@@ -3670,6 +3717,7 @@ export type VideoGql = {
export type VideoHistoryGql = { export type VideoHistoryGql = {
__typename?: "VideoHistoryGQL"; __typename?: "VideoHistoryGQL";
followingCount: Scalars["Int"]["output"];
hasFollowing: Scalars["Boolean"]["output"]; hasFollowing: Scalars["Boolean"]["output"];
pageInfo: PageInfoGql; pageInfo: PageInfoGql;
videos: Array<VideoGql>; videos: Array<VideoGql>;
@@ -4270,6 +4318,8 @@ export type GetFeedQuery = {
id: string; id: string;
lastIntendedSegmentBound?: number | null; lastIntendedSegmentBound?: number | null;
streamSegmentType: StreamSegmentTypeEnum; streamSegmentType: StreamSegmentTypeEnum;
isCompleted: boolean;
lastSegmentUploadedAt?: any | null;
} | null; } | null;
tags: Array<{ tags: Array<{
__typename?: "VideoTag"; __typename?: "VideoTag";
@@ -4288,8 +4338,15 @@ export type GetFeedQuery = {
makePercentage: number; makePercentage: number;
score?: number | null; score?: number | null;
longestRun: number; longestRun: number;
runLengths: Array<number>;
averageDifficulty?: number | null; averageDifficulty?: number | null;
averageTimeBetweenShots?: number | null; averageTimeBetweenShots?: number | null;
spinTypeBreakdown: {
__typename?: "SpinTypeBreakdownGQL";
draw: number;
center: number;
follow: number;
};
}>; }>;
currentProcessing?: { currentProcessing?: {
__typename?: "VideoProcessingGQL"; __typename?: "VideoProcessingGQL";
@@ -4374,6 +4431,8 @@ export type VideoCardFieldsFragment = {
id: string; id: string;
lastIntendedSegmentBound?: number | null; lastIntendedSegmentBound?: number | null;
streamSegmentType: StreamSegmentTypeEnum; streamSegmentType: StreamSegmentTypeEnum;
isCompleted: boolean;
lastSegmentUploadedAt?: any | null;
} | null; } | null;
tags: Array<{ tags: Array<{
__typename?: "VideoTag"; __typename?: "VideoTag";
@@ -4392,8 +4451,15 @@ export type VideoCardFieldsFragment = {
makePercentage: number; makePercentage: number;
score?: number | null; score?: number | null;
longestRun: number; longestRun: number;
runLengths: Array<number>;
averageDifficulty?: number | null; averageDifficulty?: number | null;
averageTimeBetweenShots?: number | null; averageTimeBetweenShots?: number | null;
spinTypeBreakdown: {
__typename?: "SpinTypeBreakdownGQL";
draw: number;
center: number;
follow: number;
};
}>; }>;
currentProcessing?: { currentProcessing?: {
__typename?: "VideoProcessingGQL"; __typename?: "VideoProcessingGQL";
@@ -4485,6 +4551,7 @@ export type GetVideoFeedQuery = {
getFeedVideos: { getFeedVideos: {
__typename?: "VideoHistoryGQL"; __typename?: "VideoHistoryGQL";
hasFollowing: boolean; hasFollowing: boolean;
followingCount: number;
videos: Array<{ videos: Array<{
__typename?: "VideoGQL"; __typename?: "VideoGQL";
id: number; id: number;
@@ -4510,6 +4577,8 @@ export type GetVideoFeedQuery = {
id: string; id: string;
lastIntendedSegmentBound?: number | null; lastIntendedSegmentBound?: number | null;
streamSegmentType: StreamSegmentTypeEnum; streamSegmentType: StreamSegmentTypeEnum;
isCompleted: boolean;
lastSegmentUploadedAt?: any | null;
} | null; } | null;
tags: Array<{ tags: Array<{
__typename?: "VideoTag"; __typename?: "VideoTag";
@@ -4528,8 +4597,15 @@ export type GetVideoFeedQuery = {
makePercentage: number; makePercentage: number;
score?: number | null; score?: number | null;
longestRun: number; longestRun: number;
runLengths: Array<number>;
averageDifficulty?: number | null; averageDifficulty?: number | null;
averageTimeBetweenShots?: number | null; averageTimeBetweenShots?: number | null;
spinTypeBreakdown: {
__typename?: "SpinTypeBreakdownGQL";
draw: number;
center: number;
follow: number;
};
}>; }>;
currentProcessing?: { currentProcessing?: {
__typename?: "VideoProcessingGQL"; __typename?: "VideoProcessingGQL";
@@ -4658,6 +4734,7 @@ export type GetDrillRunLeaderboardQuery = {
__typename?: "VideoGQL"; __typename?: "VideoGQL";
tableSize: number; tableSize: number;
pocketSize?: number | null; pocketSize?: number | null;
createdAt?: any | null;
}; };
user: { user: {
__typename?: "UserGQL"; __typename?: "UserGQL";
@@ -5008,11 +5085,6 @@ export type GetAvailableSubscriptionOptionsQuery = {
getAvailableSubscriptionOptions: { getAvailableSubscriptionOptions: {
__typename?: "StripeSubscriptionOptionsGQL"; __typename?: "StripeSubscriptionOptionsGQL";
trialPeriodDays?: number | null; trialPeriodDays?: number | null;
appleIap: {
__typename?: "AppleIapSubscriptionOptionsGQL";
enabled: boolean;
proMonthlyProductId?: string | null;
};
products: Array<{ products: Array<{
__typename?: "StripeProductGQL"; __typename?: "StripeProductGQL";
id: string; id: string;
@@ -5030,6 +5102,12 @@ export type GetAvailableSubscriptionOptionsQuery = {
active: boolean; active: boolean;
}>; }>;
}>; }>;
appleIap: {
__typename?: "AppleIapSubscriptionOptionsGQL";
enabled: boolean;
proMonthlyProductId?: string | null;
productIds: Array<string>;
};
}; };
}; };
@@ -5214,8 +5292,15 @@ export type PlayerSummaryFieldsFragment = {
makePercentage: number; makePercentage: number;
score?: number | null; score?: number | null;
longestRun: number; longestRun: number;
runLengths: Array<number>;
averageDifficulty?: number | null; averageDifficulty?: number | null;
averageTimeBetweenShots?: number | null; averageTimeBetweenShots?: number | null;
spinTypeBreakdown: {
__typename?: "SpinTypeBreakdownGQL";
draw: number;
center: number;
follow: number;
};
}; };
export type PlayerClusterShotFieldsFragment = { export type PlayerClusterShotFieldsFragment = {
@@ -5898,6 +5983,7 @@ export type EditProfileImageUriMutation = {
username: string; username: string;
isAdmin?: boolean | null; isAdmin?: boolean | null;
profileImageUri?: string | null; profileImageUri?: string | null;
bio?: string | null;
fargoRating?: number | null; fargoRating?: number | null;
activeVideoId?: number | null; activeVideoId?: number | null;
createdAt?: any | null; createdAt?: any | null;
@@ -5918,6 +6004,7 @@ export type GetLoggedInUserQuery = {
username: string; username: string;
isAdmin?: boolean | null; isAdmin?: boolean | null;
profileImageUri?: string | null; profileImageUri?: string | null;
bio?: string | null;
fargoRating?: number | null; fargoRating?: number | null;
activeVideoId?: number | null; activeVideoId?: number | null;
createdAt?: any | null; createdAt?: any | null;
@@ -5940,6 +6027,7 @@ export type GetUserQuery = {
username: string; username: string;
isAdmin?: boolean | null; isAdmin?: boolean | null;
profileImageUri?: string | null; profileImageUri?: string | null;
bio?: string | null;
fargoRating?: number | null; fargoRating?: number | null;
activeVideoId?: number | null; activeVideoId?: number | null;
createdAt?: any | null; createdAt?: any | null;
@@ -6129,6 +6217,7 @@ export type EditUserMutationVariables = Exact<{
fargoRating?: InputMaybe<Scalars["Int"]["input"]>; fargoRating?: InputMaybe<Scalars["Int"]["input"]>;
videosPrivateByDefault?: InputMaybe<Scalars["Boolean"]["input"]>; videosPrivateByDefault?: InputMaybe<Scalars["Boolean"]["input"]>;
agreesToMarketing?: InputMaybe<Scalars["Boolean"]["input"]>; agreesToMarketing?: InputMaybe<Scalars["Boolean"]["input"]>;
bio?: InputMaybe<Scalars["String"]["input"]>;
}>; }>;
export type EditUserMutation = { export type EditUserMutation = {
@@ -6142,6 +6231,7 @@ export type EditUserMutation = {
updatedAt?: any | null; updatedAt?: any | null;
videosPrivateByDefault?: boolean | null; videosPrivateByDefault?: boolean | null;
agreesToMarketing?: boolean | null; agreesToMarketing?: boolean | null;
bio?: string | null;
}; };
}; };
@@ -6159,6 +6249,7 @@ export type UserFragmentFragment = {
username: string; username: string;
isAdmin?: boolean | null; isAdmin?: boolean | null;
profileImageUri?: string | null; profileImageUri?: string | null;
bio?: string | null;
fargoRating?: number | null; fargoRating?: number | null;
activeVideoId?: number | null; activeVideoId?: number | null;
createdAt?: any | null; createdAt?: any | null;
@@ -6182,6 +6273,7 @@ export type GetUsersMatchingQuery = {
username: string; username: string;
isAdmin?: boolean | null; isAdmin?: boolean | null;
profileImageUri?: string | null; profileImageUri?: string | null;
bio?: string | null;
fargoRating?: number | null; fargoRating?: number | null;
activeVideoId?: number | null; activeVideoId?: number | null;
createdAt?: any | null; createdAt?: any | null;
@@ -6339,8 +6431,15 @@ export type GetVideoDetailsQuery = {
makePercentage: number; makePercentage: number;
score?: number | null; score?: number | null;
longestRun: number; longestRun: number;
runLengths: Array<number>;
averageDifficulty?: number | null; averageDifficulty?: number | null;
averageTimeBetweenShots?: number | null; averageTimeBetweenShots?: number | null;
spinTypeBreakdown: {
__typename?: "SpinTypeBreakdownGQL";
draw: number;
center: number;
follow: number;
};
}>; }>;
}; };
}; };
@@ -6440,6 +6539,8 @@ export type GetVideoCardQuery = {
id: string; id: string;
lastIntendedSegmentBound?: number | null; lastIntendedSegmentBound?: number | null;
streamSegmentType: StreamSegmentTypeEnum; streamSegmentType: StreamSegmentTypeEnum;
isCompleted: boolean;
lastSegmentUploadedAt?: any | null;
} | null; } | null;
tags: Array<{ tags: Array<{
__typename?: "VideoTag"; __typename?: "VideoTag";
@@ -6458,8 +6559,15 @@ export type GetVideoCardQuery = {
makePercentage: number; makePercentage: number;
score?: number | null; score?: number | null;
longestRun: number; longestRun: number;
runLengths: Array<number>;
averageDifficulty?: number | null; averageDifficulty?: number | null;
averageTimeBetweenShots?: number | null; averageTimeBetweenShots?: number | null;
spinTypeBreakdown: {
__typename?: "SpinTypeBreakdownGQL";
draw: number;
center: number;
follow: number;
};
}>; }>;
currentProcessing?: { currentProcessing?: {
__typename?: "VideoProcessingGQL"; __typename?: "VideoProcessingGQL";
@@ -7107,6 +7215,12 @@ export const PlayerSummaryFieldsFragmentDoc = gql`
makePercentage makePercentage
score score
longestRun longestRun
runLengths
spinTypeBreakdown {
draw
center
follow
}
averageDifficulty averageDifficulty
averageTimeBetweenShots averageTimeBetweenShots
} }
@@ -7140,6 +7254,8 @@ export const VideoCardFieldsFragmentDoc = gql`
id id
lastIntendedSegmentBound lastIntendedSegmentBound
streamSegmentType streamSegmentType
isCompleted
lastSegmentUploadedAt
} }
tableSize tableSize
pocketSize pocketSize
@@ -7341,6 +7457,7 @@ export const UserFragmentFragmentDoc = gql`
username username
isAdmin isAdmin
profileImageUri profileImageUri
bio
fargoRating fargoRating
activeVideoId activeVideoId
createdAt createdAt
@@ -9464,6 +9581,7 @@ export const GetVideoFeedDocument = gql`
endCursor endCursor
} }
hasFollowing hasFollowing
followingCount
} }
} }
${VideoCardFieldsFragmentDoc} ${VideoCardFieldsFragmentDoc}
@@ -9734,6 +9852,7 @@ export const GetDrillRunLeaderboardDocument = gql`
video { video {
tableSize tableSize
pocketSize pocketSize
createdAt
} }
user { user {
id id
@@ -10629,10 +10748,6 @@ export const GetAvailableSubscriptionOptionsDocument = gql`
query GetAvailableSubscriptionOptions { query GetAvailableSubscriptionOptions {
getAvailableSubscriptionOptions { getAvailableSubscriptionOptions {
trialPeriodDays trialPeriodDays
appleIap {
enabled
proMonthlyProductId
}
products { products {
id id
name name
@@ -10648,6 +10763,11 @@ export const GetAvailableSubscriptionOptionsDocument = gql`
active active
} }
} }
appleIap {
enabled
proMonthlyProductId
productIds
}
} }
} }
`; `;
@@ -13341,6 +13461,7 @@ export const EditUserDocument = gql`
$fargoRating: Int $fargoRating: Int
$videosPrivateByDefault: Boolean $videosPrivateByDefault: Boolean
$agreesToMarketing: Boolean $agreesToMarketing: Boolean
$bio: String
) { ) {
editUser( editUser(
input: { input: {
@@ -13348,6 +13469,7 @@ export const EditUserDocument = gql`
fargoRating: $fargoRating fargoRating: $fargoRating
videosPrivateByDefault: $videosPrivateByDefault videosPrivateByDefault: $videosPrivateByDefault
agreesToMarketing: $agreesToMarketing agreesToMarketing: $agreesToMarketing
bio: $bio
} }
) { ) {
id id
@@ -13357,6 +13479,7 @@ export const EditUserDocument = gql`
updatedAt updatedAt
videosPrivateByDefault videosPrivateByDefault
agreesToMarketing agreesToMarketing
bio
} }
} }
`; `;
@@ -13382,6 +13505,7 @@ export type EditUserMutationFn = Apollo.MutationFunction<
* fargoRating: // value for 'fargoRating' * fargoRating: // value for 'fargoRating'
* videosPrivateByDefault: // value for 'videosPrivateByDefault' * videosPrivateByDefault: // value for 'videosPrivateByDefault'
* agreesToMarketing: // value for 'agreesToMarketing' * agreesToMarketing: // value for 'agreesToMarketing'
* bio: // value for 'bio'
* }, * },
* }); * });
*/ */

View File

@@ -42,6 +42,8 @@ fragment VideoCardFields on VideoGQL {
id id
lastIntendedSegmentBound lastIntendedSegmentBound
streamSegmentType streamSegmentType
isCompleted
lastSegmentUploadedAt
} }
tableSize tableSize
pocketSize pocketSize
@@ -146,5 +148,6 @@ query GetVideoFeed(
endCursor endCursor
} }
hasFollowing hasFollowing
followingCount
} }
} }

View File

@@ -56,6 +56,7 @@ query GetDrillRunLeaderboard(
video { video {
tableSize tableSize
pocketSize pocketSize
createdAt
} }
user { user {
id id

View File

@@ -29,10 +29,6 @@ mutation CreateCustomerPortalSession {
query GetAvailableSubscriptionOptions { query GetAvailableSubscriptionOptions {
getAvailableSubscriptionOptions { getAvailableSubscriptionOptions {
trialPeriodDays trialPeriodDays
appleIap {
enabled
proMonthlyProductId
}
products { products {
id id
name name
@@ -48,6 +44,11 @@ query GetAvailableSubscriptionOptions {
active active
} }
} }
appleIap {
enabled
proMonthlyProductId
productIds
}
} }
} }

View File

@@ -9,6 +9,12 @@ fragment PlayerSummaryFields on PlayerSummaryGQL {
makePercentage makePercentage
score score
longestRun longestRun
runLengths
spinTypeBreakdown {
draw
center
follow
}
averageDifficulty averageDifficulty
averageTimeBetweenShots averageTimeBetweenShots
} }

View File

@@ -177,6 +177,7 @@ mutation editUser(
$fargoRating: Int $fargoRating: Int
$videosPrivateByDefault: Boolean $videosPrivateByDefault: Boolean
$agreesToMarketing: Boolean $agreesToMarketing: Boolean
$bio: String
) { ) {
editUser( editUser(
input: { input: {
@@ -184,6 +185,7 @@ mutation editUser(
fargoRating: $fargoRating fargoRating: $fargoRating
videosPrivateByDefault: $videosPrivateByDefault videosPrivateByDefault: $videosPrivateByDefault
agreesToMarketing: $agreesToMarketing agreesToMarketing: $agreesToMarketing
bio: $bio
} }
) { ) {
id id
@@ -193,6 +195,7 @@ mutation editUser(
updatedAt updatedAt
videosPrivateByDefault videosPrivateByDefault
agreesToMarketing agreesToMarketing
bio
} }
} }
@@ -206,6 +209,7 @@ fragment UserFragment on UserGQL {
username username
isAdmin isAdmin
profileImageUri profileImageUri
bio
fargoRating fargoRating
activeVideoId activeVideoId
createdAt createdAt

View File

@@ -108,8 +108,10 @@ type Query {
): UserRelationshipsResult! ): UserRelationshipsResult!
getAvailableSubscriptionOptions: StripeSubscriptionOptionsGQL! getAvailableSubscriptionOptions: StripeSubscriptionOptionsGQL!
getUserSubscriptionStatus: UserSubscriptionStatusGQL! getUserSubscriptionStatus: UserSubscriptionStatusGQL!
getResolvedTier: ResolvedTierGQL!
getAppleAppAccountToken: String! getAppleAppAccountToken: String!
getQuotaStatus: QuotaStatusGQL! getQuotaStatus: QuotaStatusGQL!
getStorageStatus: StorageStatusGQL
getPlayTime(userId: Int!, filters: VideoFilterInput = null): UserPlayTimeGQL! getPlayTime(userId: Int!, filters: VideoFilterInput = null): UserPlayTimeGQL!
getUserVideos( getUserVideos(
userId: Int = null userId: Int = null
@@ -356,6 +358,7 @@ type UserGQL {
activeVideoId: Int activeVideoId: Int
stripeCustomerId: String stripeCustomerId: String
profileImageUri: String profileImageUri: String
bio: String
createdAt: DateTime createdAt: DateTime
updatedAt: DateTime updatedAt: DateTime
videosPrivateByDefault: Boolean videosPrivateByDefault: Boolean
@@ -529,6 +532,7 @@ type UploadStreamGQL {
initPlaylistUploadStatus: InitPlaylistUploadStatusEnum initPlaylistUploadStatus: InitPlaylistUploadStatusEnum
lowestUnuploadedSegmentIndex: Int! lowestUnuploadedSegmentIndex: Int!
uploadCompletionCursor: Int! uploadCompletionCursor: Int!
lastSegmentUploadedAt: DateTime
errors: [StreamErrorGQL!]! errors: [StreamErrorGQL!]!
createdAt: DateTime! createdAt: DateTime!
updatedAt: DateTime! updatedAt: DateTime!
@@ -688,10 +692,18 @@ type PlayerSummaryGQL {
makePercentage: Float! makePercentage: Float!
score: Int score: Int
longestRun: Int! longestRun: Int!
runLengths: [Int!]!
spinTypeBreakdown: SpinTypeBreakdownGQL!
averageDifficulty: Float averageDifficulty: Float
averageTimeBetweenShots: Float averageTimeBetweenShots: Float
} }
type SpinTypeBreakdownGQL {
draw: Int!
center: Int!
follow: Int!
}
type DeployedConfigGQL { type DeployedConfigGQL {
allowNewUsers: Boolean! allowNewUsers: Boolean!
firebase: Boolean! firebase: Boolean!
@@ -724,6 +736,7 @@ type VideoHistoryGQL {
videos: [VideoGQL!]! videos: [VideoGQL!]!
pageInfo: PageInfoGQL! pageInfo: PageInfoGQL!
hasFollowing: Boolean! hasFollowing: Boolean!
followingCount: Int!
} }
type PageInfoGQL { type PageInfoGQL {
@@ -1025,6 +1038,7 @@ type StripePriceGQL {
type AppleIapSubscriptionOptionsGQL { type AppleIapSubscriptionOptionsGQL {
enabled: Boolean! enabled: Boolean!
proMonthlyProductId: String proMonthlyProductId: String
productIds: [String!]!
} }
type UserSubscriptionStatusGQL { type UserSubscriptionStatusGQL {
@@ -1059,6 +1073,17 @@ enum StripeSubscriptionStatusEnum {
PAUSED PAUSED
} }
type ResolvedTierGQL {
tierName: String!
tierDisplayName: String!
hasActiveSubscription: Boolean!
entitlementSource: EntitlementSourceTypeEnum
entitlementStatus: String
entitlementStartsAt: DateTime
entitlementEndsAt: DateTime
capabilities: [String!]!
}
type QuotaStatusGQL { type QuotaStatusGQL {
tierName: String! tierName: String!
periodStart: DateTime! periodStart: DateTime!
@@ -1083,6 +1108,28 @@ type QuotaBucketStatusGQL {
canUpload: Boolean! canUpload: Boolean!
} }
type StorageStatusGQL {
userId: Int!
tierName: String!
retainedStorageUsedBytes: BigInt!
retainedStorageLimitBytes: BigInt
isUnlimited: Boolean!
policyConfigured: Boolean!
remainingStorageBytes: BigInt
storageUsageRatio: Float
isNearLimit: Boolean!
isOverLimit: Boolean!
usageCalculated: Boolean!
usageSource: String
lastCalculatedAt: DateTime
usageEstimated: Boolean!
}
"""
Integer value that can exceed GraphQL Int's 32-bit range.
"""
scalar BigInt
type UserPlayTimeGQL { type UserPlayTimeGQL {
totalSeconds: Float! totalSeconds: Float!
} }
@@ -1354,6 +1401,7 @@ input EditUserInputGQL {
fargoRating: Int = null fargoRating: Int = null
videosPrivateByDefault: Boolean = null videosPrivateByDefault: Boolean = null
agreesToMarketing: Boolean = null agreesToMarketing: Boolean = null
bio: String = null
} }
type SyncAppleSubscriptionResultGQL { type SyncAppleSubscriptionResultGQL {