Compare commits

...

5 Commits

Author SHA1 Message Date
8367c2d0cd add createCustomerPortalSession
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2026-04-30 11:44:34 -07:00
b0c62f6e80 Merge pull request 'Trim getFeed query fragment' (#237) from loewy/trim-get-feed-query-fragment into master
Reviewed-on: #237
2026-04-29 20:26:40 +00:00
bc1ff66467 trim uncessary requested fields
All checks were successful
Tests / Tests (pull_request) Successful in 38s
2026-04-28 12:53:25 -07:00
ae37a3d9d9 Merge pull request 'Default getLongestRunsLeaderboard limit to 50' (#236) from dean/leaderboard-default-top-50 into master
Reviewed-on: #236
2026-04-24 00:01:23 +00:00
Dean Wenstrand
114b21400e Default getLongestRunsLeaderboard limit to 50
All checks were successful
Tests / Tests (pull_request) Successful in 10s
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-23 16:56:56 -07:00
4 changed files with 90 additions and 82 deletions

View File

@@ -224,6 +224,11 @@ export type CreateBucketSetInput = {
keyName: Scalars["String"]["input"];
};
export type CreateCustomerPortalSessionResultGql = {
__typename?: "CreateCustomerPortalSessionResultGQL";
portalUrl: Scalars["String"]["output"];
};
export type CreateSubscriptionResultGql = {
__typename?: "CreateSubscriptionResultGQL";
checkoutUrl: Scalars["String"]["output"];
@@ -2373,6 +2378,7 @@ export type Mutation = {
commentOnVideo: Scalars["Boolean"]["output"];
createBucketSet: BucketSetGql;
createChallenge: Challenge;
createCustomerPortalSession: CreateCustomerPortalSessionResultGql;
createRuleSet: RuleSet;
createSubscription: CreateSubscriptionResultGql;
createUploadStream: CreateUploadStreamReturn;
@@ -2451,6 +2457,10 @@ export type MutationCreateChallengeArgs = {
startDate: Scalars["DateTime"]["input"];
};
export type MutationCreateCustomerPortalSessionArgs = {
returnUrl?: InputMaybe<Scalars["String"]["input"]>;
};
export type MutationCreateRuleSetArgs = {
description?: InputMaybe<Scalars["String"]["input"]>;
name: Scalars["String"]["input"];
@@ -4097,15 +4107,11 @@ export type GetFeedQuery = {
id: number;
name?: string | null;
screenshotUri?: string | null;
totalShotsMade: number;
totalShots: number;
makePercentage: number;
averageTimeBetweenShots?: number | null;
averageDifficulty?: number | null;
createdAt?: any | null;
updatedAt?: any | null;
startTime?: any | null;
endTime?: any | null;
private: boolean;
elapsedTime?: number | null;
tableSize: number;
@@ -4120,26 +4126,13 @@ export type GetFeedQuery = {
__typename?: "UploadStreamGQL";
id: string;
lastIntendedSegmentBound?: number | null;
isCompleted: boolean;
streamSegmentType: StreamSegmentTypeEnum;
} | null;
tags: Array<{
__typename?: "VideoTag";
name: string;
tagClasses: Array<{ __typename?: "VideoTagClass"; name: string }>;
}>;
tags: Array<{ __typename?: "VideoTag"; name: string }>;
currentProcessing?: {
__typename?: "VideoProcessingGQL";
id: number;
status: ProcessingStatusEnum;
errors: Array<{
__typename?: "VideoProcessingErrorGQL";
message: string;
}>;
statuses: Array<{
__typename?: "VideoProcessingStatusGQL";
status: ProcessingStatusEnum;
}>;
} | null;
reactions: Array<{
__typename?: "ReactionGQL";
@@ -4199,15 +4192,11 @@ export type VideoCardFieldsFragment = {
id: number;
name?: string | null;
screenshotUri?: string | null;
totalShotsMade: number;
totalShots: number;
makePercentage: number;
averageTimeBetweenShots?: number | null;
averageDifficulty?: number | null;
createdAt?: any | null;
updatedAt?: any | null;
startTime?: any | null;
endTime?: any | null;
private: boolean;
elapsedTime?: number | null;
tableSize: number;
@@ -4222,23 +4211,13 @@ export type VideoCardFieldsFragment = {
__typename?: "UploadStreamGQL";
id: string;
lastIntendedSegmentBound?: number | null;
isCompleted: boolean;
streamSegmentType: StreamSegmentTypeEnum;
} | null;
tags: Array<{
__typename?: "VideoTag";
name: string;
tagClasses: Array<{ __typename?: "VideoTagClass"; name: string }>;
}>;
tags: Array<{ __typename?: "VideoTag"; name: string }>;
currentProcessing?: {
__typename?: "VideoProcessingGQL";
id: number;
status: ProcessingStatusEnum;
errors: Array<{ __typename?: "VideoProcessingErrorGQL"; message: string }>;
statuses: Array<{
__typename?: "VideoProcessingStatusGQL";
status: ProcessingStatusEnum;
}>;
} | null;
reactions: Array<{
__typename?: "ReactionGQL";
@@ -4312,15 +4291,11 @@ export type GetVideoFeedQuery = {
id: number;
name?: string | null;
screenshotUri?: string | null;
totalShotsMade: number;
totalShots: number;
makePercentage: number;
averageTimeBetweenShots?: number | null;
averageDifficulty?: number | null;
createdAt?: any | null;
updatedAt?: any | null;
startTime?: any | null;
endTime?: any | null;
private: boolean;
elapsedTime?: number | null;
tableSize: number;
@@ -4335,26 +4310,13 @@ export type GetVideoFeedQuery = {
__typename?: "UploadStreamGQL";
id: string;
lastIntendedSegmentBound?: number | null;
isCompleted: boolean;
streamSegmentType: StreamSegmentTypeEnum;
} | null;
tags: Array<{
__typename?: "VideoTag";
name: string;
tagClasses: Array<{ __typename?: "VideoTagClass"; name: string }>;
}>;
tags: Array<{ __typename?: "VideoTag"; name: string }>;
currentProcessing?: {
__typename?: "VideoProcessingGQL";
id: number;
status: ProcessingStatusEnum;
errors: Array<{
__typename?: "VideoProcessingErrorGQL";
message: string;
}>;
statuses: Array<{
__typename?: "VideoProcessingStatusGQL";
status: ProcessingStatusEnum;
}>;
} | null;
reactions: Array<{
__typename?: "ReactionGQL";
@@ -4749,6 +4711,18 @@ export type CreateSubscriptionMutation = {
};
};
export type CreateCustomerPortalSessionMutationVariables = Exact<{
returnUrl?: InputMaybe<Scalars["String"]["input"]>;
}>;
export type CreateCustomerPortalSessionMutation = {
__typename?: "Mutation";
createCustomerPortalSession: {
__typename?: "CreateCustomerPortalSessionResultGQL";
portalUrl: string;
};
};
export type GetAvailableSubscriptionOptionsQueryVariables = Exact<{
[key: string]: never;
}>;
@@ -6519,41 +6493,26 @@ export const VideoCardFieldsFragmentDoc = gql`
}
name
screenshotUri
totalShotsMade
totalShots
makePercentage
averageTimeBetweenShots
averageDifficulty
createdAt
updatedAt
startTime
endTime
private
elapsedTime
screenshotUri
stream {
id
lastIntendedSegmentBound
isCompleted
streamSegmentType
}
tableSize
pocketSize
tags {
tagClasses {
name
}
name
}
currentProcessing {
id
errors {
message
}
status
statuses {
status
}
}
reactions {
videoId
@@ -9652,6 +9611,57 @@ export type CreateSubscriptionMutationOptions = Apollo.BaseMutationOptions<
CreateSubscriptionMutation,
CreateSubscriptionMutationVariables
>;
export const CreateCustomerPortalSessionDocument = gql`
mutation CreateCustomerPortalSession($returnUrl: String) {
createCustomerPortalSession(returnUrl: $returnUrl) {
portalUrl
}
}
`;
export type CreateCustomerPortalSessionMutationFn = Apollo.MutationFunction<
CreateCustomerPortalSessionMutation,
CreateCustomerPortalSessionMutationVariables
>;
/**
* __useCreateCustomerPortalSessionMutation__
*
* To run a mutation, you first call `useCreateCustomerPortalSessionMutation` within a React component and pass it any options that fit your needs.
* When your component renders, `useCreateCustomerPortalSessionMutation` 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 [createCustomerPortalSessionMutation, { data, loading, error }] = useCreateCustomerPortalSessionMutation({
* variables: {
* returnUrl: // value for 'returnUrl'
* },
* });
*/
export function useCreateCustomerPortalSessionMutation(
baseOptions?: Apollo.MutationHookOptions<
CreateCustomerPortalSessionMutation,
CreateCustomerPortalSessionMutationVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useMutation<
CreateCustomerPortalSessionMutation,
CreateCustomerPortalSessionMutationVariables
>(CreateCustomerPortalSessionDocument, options);
}
export type CreateCustomerPortalSessionMutationHookResult = ReturnType<
typeof useCreateCustomerPortalSessionMutation
>;
export type CreateCustomerPortalSessionMutationResult =
Apollo.MutationResult<CreateCustomerPortalSessionMutation>;
export type CreateCustomerPortalSessionMutationOptions =
Apollo.BaseMutationOptions<
CreateCustomerPortalSessionMutation,
CreateCustomerPortalSessionMutationVariables
>;
export const GetAvailableSubscriptionOptionsDocument = gql`
query GetAvailableSubscriptionOptions {
getAvailableSubscriptionOptions {

View File

@@ -31,41 +31,26 @@ fragment VideoCardFields on VideoGQL {
}
name
screenshotUri
totalShotsMade
totalShots
makePercentage
averageTimeBetweenShots
averageDifficulty
createdAt
updatedAt
startTime
endTime
private
elapsedTime
screenshotUri
stream {
id
lastIntendedSegmentBound
isCompleted
streamSegmentType
}
tableSize
pocketSize
tags {
tagClasses {
name
}
name
}
currentProcessing {
id
errors {
message
}
status
statuses {
status
}
}
reactions {
videoId

View File

@@ -20,6 +20,12 @@ mutation CreateSubscription($priceId: String!) {
}
}
mutation CreateCustomerPortalSession($returnUrl: String) {
createCustomerPortalSession(returnUrl: $returnUrl) {
portalUrl
}
}
query GetAvailableSubscriptionOptions {
getAvailableSubscriptionOptions {
products {

View File

@@ -28,7 +28,7 @@ type Query {
getLongestRunsLeaderboard(
interval: TimeInterval = null
when: DateTime = null
limit: Int! = 100
limit: Int! = 50
requiredTags: [String!] = null
): RunLeaderboardGQL!
getMakesLeaderboard(
@@ -1117,6 +1117,9 @@ type Mutation {
ensureStripeCustomerExists: UserGQL!
deleteUser: Boolean!
createSubscription(priceId: String!): CreateSubscriptionResultGQL!
createCustomerPortalSession(
returnUrl: String = null
): CreateCustomerPortalSessionResultGQL!
cancelSubscription: UserSubscriptionStatusGQL!
grantManualEntitlement(
userId: Int!
@@ -1256,6 +1259,10 @@ type CreateSubscriptionResultGQL {
sessionId: String!
}
type CreateCustomerPortalSessionResultGQL {
portalUrl: String!
}
enum CancellationReasonEnum {
DONT_PLAY_ENOUGH
TOO_EXPENSIVE