Compare commits

..

10 Commits

Author SHA1 Message Date
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
655209e1c6 Merge pull request 'Add Apple IAP subscription options schema' (#256) from loewy/apple-iap-product-config into master
Reviewed-on: #256
2026-06-16 18:10:00 +00:00
c9576cf405 Add Apple IAP subscription options schema
All checks were successful
Tests / Tests (pull_request) Successful in 11s
2026-06-16 10:47:07 -07:00
0c0cd7a7bb Merge pull request 'dean/my-drill-runs' (#257) from dean/my-drill-runs into master
Reviewed-on: #257
2026-06-16 04:25:03 +00:00
48b647636e Merge pull request 'Add GetDrillRunLeaderboard query + generated types' (#254) from dean/drill-run-leaderboard into master
Reviewed-on: #254
2026-06-16 00:52:05 +00:00
079e4e8719 Merge pull request 'Add Apple subscription sync schema' (#253) from apple-iap-pr2-backend-schema into master
Reviewed-on: #253
2026-06-12 04:50:36 +00:00
4 changed files with 89 additions and 0 deletions

View File

@@ -79,6 +79,12 @@ export enum AlignedIntervalEnum {
Year = "YEAR", Year = "YEAR",
} }
export type AppleIapSubscriptionOptionsGql = {
__typename?: "AppleIapSubscriptionOptionsGQL";
enabled: Scalars["Boolean"]["output"];
proMonthlyProductId?: Maybe<Scalars["String"]["output"]>;
};
export type BankFeaturesGql = { export type BankFeaturesGql = {
__typename?: "BankFeaturesGQL"; __typename?: "BankFeaturesGQL";
bankAngle: Scalars["Float"]["output"]; bankAngle: Scalars["Float"]["output"];
@@ -2746,7 +2752,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"]>;
@@ -3338,6 +3346,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"];
@@ -3385,6 +3400,7 @@ export type StripeProductGql = {
export type StripeSubscriptionOptionsGql = { export type StripeSubscriptionOptionsGql = {
__typename?: "StripeSubscriptionOptionsGQL"; __typename?: "StripeSubscriptionOptionsGQL";
appleIap: AppleIapSubscriptionOptionsGql;
products: Array<StripeProductGql>; products: Array<StripeProductGql>;
trialPeriodDays?: Maybe<Scalars["Int"]["output"]>; trialPeriodDays?: Maybe<Scalars["Int"]["output"]>;
}; };
@@ -3663,6 +3679,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>;
@@ -4281,8 +4298,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";
@@ -4385,8 +4409,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";
@@ -4478,6 +4509,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;
@@ -4521,8 +4553,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";
@@ -5164,8 +5203,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 = {
@@ -6289,8 +6335,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;
};
}>; }>;
}; };
}; };
@@ -6408,8 +6461,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";
@@ -7057,6 +7117,12 @@ export const PlayerSummaryFieldsFragmentDoc = gql`
makePercentage makePercentage
score score
longestRun longestRun
runLengths
spinTypeBreakdown {
draw
center
follow
}
averageDifficulty averageDifficulty
averageTimeBetweenShots averageTimeBetweenShots
} }
@@ -9414,6 +9480,7 @@ export const GetVideoFeedDocument = gql`
endCursor endCursor
} }
hasFollowing hasFollowing
followingCount
} }
} }
${VideoCardFieldsFragmentDoc} ${VideoCardFieldsFragmentDoc}

View File

@@ -146,5 +146,6 @@ query GetVideoFeed(
endCursor endCursor
} }
hasFollowing hasFollowing
followingCount
} }
} }

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

@@ -688,10 +688,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 +732,7 @@ type VideoHistoryGQL {
videos: [VideoGQL!]! videos: [VideoGQL!]!
pageInfo: PageInfoGQL! pageInfo: PageInfoGQL!
hasFollowing: Boolean! hasFollowing: Boolean!
followingCount: Int!
} }
type PageInfoGQL { type PageInfoGQL {
@@ -1001,6 +1010,7 @@ type UserRelationship {
type StripeSubscriptionOptionsGQL { type StripeSubscriptionOptionsGQL {
products: [StripeProductGQL!]! products: [StripeProductGQL!]!
trialPeriodDays: Int trialPeriodDays: Int
appleIap: AppleIapSubscriptionOptionsGQL!
} }
type StripeProductGQL { type StripeProductGQL {
@@ -1021,6 +1031,11 @@ type StripePriceGQL {
active: Boolean! active: Boolean!
} }
type AppleIapSubscriptionOptionsGQL {
enabled: Boolean!
proMonthlyProductId: String
}
type UserSubscriptionStatusGQL { type UserSubscriptionStatusGQL {
hasActiveSubscription: Boolean! hasActiveSubscription: Boolean!
entitlementSource: EntitlementSourceTypeEnum entitlementSource: EntitlementSourceTypeEnum