Compare commits

..

9 Commits

Author SHA1 Message Date
dean
55bbf723ba feat: Add challenge dismissal GQL operations
All checks were successful
Tests / Tests (pull_request) Successful in 10s
- Add DismissChallenge/UndismissChallenge mutations
- Add IsChallengeDismissed query
- Add GetMyDismissedChallenges query
- Update schema with dismissal fields

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-25 14:03:53 -08:00
dean
88650706e0 fix: Restore isFollowedByCurrentUser in UserSocialsFields fragment
All checks were successful
Tests / Tests (pull_request) Successful in 10s
Accidentally reverted to old followers array approach when creating
challenges branch. This restores the fix from PR #1474 that uses
isFollowedByCurrentUser field directly for proper follow state display.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-25 10:47:55 -08:00
dean
8a393e9a42 feat: Add challenge invitations fields and fix feed hasFollowing query
All checks were successful
Tests / Tests (pull_request) Successful in 10s
- Add invitations query fields with invitee data to GetChallenge
- Add participantCount field to GetChallenge
- Add GetMyChallengeEntries query (was missing)
- Add hasFollowing to GetVideoFeed response (fixes feed ordering)
- Sync schema with backend challenge types

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-25 10:39:46 -08:00
dean
a00b50d985 chore: Regenerate GraphQL TypeScript types
All checks were successful
Tests / Tests (pull_request) Successful in 9s
Regenerate gql/src/index.tsx to match current schema and fix
codegen hash mismatch in CI.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-21 12:31:50 -08:00
dean
36ed501cd9 Add GraphQL queries and mutations for challenge feature
Some checks failed
Tests / Tests (pull_request) Failing after 10s
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-21 12:00:17 -08:00
dean
d17c1a2ecc chore: regenerate schema and types
Some checks failed
Tests / Tests (pull_request) Failing after 10s
2025-11-21 10:19:15 -08:00
dean
cc9bc98b32 merge: sync gql submodule, keeping local notification fragment
All checks were successful
Tests / Tests (pull_request) Successful in 11s
2025-11-20 12:57:23 -08:00
dean
eec12c61a3 schema: add challenge notification types 2025-11-20 12:53:46 -08:00
dean
b7b482694e WIP: Add challenges feature schema and operations
- Add Challenge, ChallengeEntry, ChallengeInvitation, RuleSet types
- Add queries: challenges, challenge, challengeLeaderboard, myChallengeInvitations, myChallengeEntries, ruleSets
- Add mutations: createChallenge, createRuleSet, inviteUsersToChallenge, respondToChallengeInvitation, startChallenge, submitChallengeEntry, recalculateChallengeEntry

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-18 16:12:03 -08:00
8 changed files with 6445 additions and 1092 deletions

5423
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -3535,7 +3535,6 @@ export type GetAggregatedShotMetricsQuery = {
__typename?: "TargetMetricsGQL";
count: number;
makePercentage?: number | null;
averageDifficulty?: number | null;
};
}>;
};
@@ -4018,7 +4017,6 @@ export type GetFeedQuery = {
private: boolean;
elapsedTime?: number | null;
tableSize: number;
pocketSize?: number | null;
owner?: {
__typename?: "UserGQL";
id: number;
@@ -4120,7 +4118,6 @@ export type VideoCardFieldsFragment = {
private: boolean;
elapsedTime?: number | null;
tableSize: number;
pocketSize?: number | null;
owner?: {
__typename?: "UserGQL";
id: number;
@@ -4218,7 +4215,6 @@ export type GetVideoFeedQuery = {
private: boolean;
elapsedTime?: number | null;
tableSize: number;
pocketSize?: number | null;
owner?: {
__typename?: "UserGQL";
id: number;
@@ -4969,7 +4965,6 @@ export type GetShotsWithMetadataFilterResultQuery = {
} | null;
playlist?: {
__typename?: "HLSPlaylistGQL";
videoId: number;
segmentDurations: Array<number>;
} | null;
} | null;
@@ -5052,7 +5047,6 @@ export type GetShotsWithMetadataQuery = {
} | null;
playlist?: {
__typename?: "HLSPlaylistGQL";
videoId: number;
segmentDurations: Array<number>;
} | null;
} | null;
@@ -5124,7 +5118,6 @@ export type GetShotsByIdsQuery = {
} | null;
playlist?: {
__typename?: "HLSPlaylistGQL";
videoId: number;
segmentDurations: Array<number>;
} | null;
} | null;
@@ -5189,7 +5182,6 @@ export type ShotWithAllFeaturesFragment = {
} | null;
playlist?: {
__typename?: "HLSPlaylistGQL";
videoId: number;
segmentDurations: Array<number>;
} | null;
} | null;
@@ -5271,7 +5263,6 @@ export type EditShotMutation = {
} | null;
playlist?: {
__typename?: "HLSPlaylistGQL";
videoId: number;
segmentDurations: Array<number>;
} | null;
} | null;
@@ -5387,8 +5378,6 @@ export type GetUserQuery = {
updatedAt?: any | null;
videosPrivateByDefault?: boolean | null;
agreesToMarketing?: boolean | null;
following?: Array<{ __typename?: "UserGQL"; id: number }> | null;
followers?: Array<{ __typename?: "UserGQL"; id: number }> | null;
} | null;
};
@@ -5460,7 +5449,21 @@ export type FollowUserMutationVariables = Exact<{
export type FollowUserMutation = {
__typename?: "Mutation";
followUser: { __typename?: "UserGQL"; id: number; username: string };
followUser: {
__typename?: "UserGQL";
username: string;
id: number;
following?: Array<{
__typename?: "UserGQL";
id: number;
username: string;
}> | null;
followers?: Array<{
__typename?: "UserGQL";
id: number;
username: string;
}> | null;
};
};
export type UnfollowUserMutationVariables = Exact<{
@@ -5469,7 +5472,21 @@ export type UnfollowUserMutationVariables = Exact<{
export type UnfollowUserMutation = {
__typename?: "Mutation";
unfollowUser: { __typename?: "UserGQL"; id: number; username: string };
unfollowUser: {
__typename?: "UserGQL";
username: string;
id: number;
following?: Array<{
__typename?: "UserGQL";
id: number;
username: string;
}> | null;
followers?: Array<{
__typename?: "UserGQL";
id: number;
username: string;
}> | null;
};
};
export type GetUserFollowingFollowersQueryVariables = Exact<{
@@ -5486,14 +5503,12 @@ export type GetUserFollowingFollowersQuery = {
id: number;
username: string;
profileImageUri?: string | null;
isFollowedByCurrentUser?: boolean | null;
}> | null;
followers?: Array<{
__typename?: "UserGQL";
id: number;
username: string;
profileImageUri?: string | null;
isFollowedByCurrentUser?: boolean | null;
}> | null;
} | null;
};
@@ -5688,7 +5703,6 @@ export type GetVideoDetailsQuery = {
endTime?: any | null;
makePercentage: number;
medianRun?: number | null;
averageDifficulty?: number | null;
startTime?: any | null;
totalShots: number;
totalShotsMade: number;
@@ -5954,19 +5968,6 @@ export type GetMedianRunForVideoQuery = {
getVideo: { __typename?: "VideoGQL"; id: number; medianRun?: number | null };
};
export type GetAverageDifficultyForVideoQueryVariables = Exact<{
videoId: Scalars["Int"]["input"];
}>;
export type GetAverageDifficultyForVideoQuery = {
__typename?: "Query";
getVideo: {
__typename?: "VideoGQL";
id: number;
averageDifficulty?: number | null;
};
};
export type StreamWithEndFramesFragment = {
__typename?: "UploadStreamGQL";
id: string;
@@ -6402,7 +6403,6 @@ export const VideoCardFieldsFragmentDoc = gql`
streamSegmentType
}
tableSize
pocketSize
tags {
tagClasses {
name
@@ -6551,7 +6551,6 @@ export const ShotWithAllFeaturesFragmentDoc = gql`
streamSegmentType
}
playlist {
videoId
segmentDurations
}
}
@@ -6710,7 +6709,6 @@ export const GetAggregatedShotMetricsDocument = gql`
targetMetrics {
count
makePercentage
averageDifficulty
}
}
}
@@ -10896,12 +10894,6 @@ export const GetUserDocument = gql`
query GetUser($userId: Int!) {
getUser(userId: $userId) {
...UserFragment
following {
id
}
followers {
id
}
}
}
${UserFragmentFragmentDoc}
@@ -11288,8 +11280,16 @@ export type GetUserTagsQueryResult = Apollo.QueryResult<
export const FollowUserDocument = gql`
mutation followUser($followedUserId: Int!) {
followUser(followedUserId: $followedUserId) {
id
username
id
following {
id
username
}
followers {
id
username
}
}
}
`;
@@ -11339,8 +11339,16 @@ export type FollowUserMutationOptions = Apollo.BaseMutationOptions<
export const UnfollowUserDocument = gql`
mutation unfollowUser($followedUserId: Int!) {
unfollowUser(followedUserId: $followedUserId) {
id
username
id
following {
id
username
}
followers {
id
username
}
}
}
`;
@@ -11395,13 +11403,11 @@ export const GetUserFollowingFollowersDocument = gql`
id
username
profileImageUri
isFollowedByCurrentUser
}
followers {
id
username
profileImageUri
isFollowedByCurrentUser
}
}
}
@@ -11981,7 +11987,6 @@ export const GetVideoDetailsDocument = gql`
endTime
makePercentage
medianRun
averageDifficulty
startTime
totalShots
totalShotsMade
@@ -12635,80 +12640,6 @@ export type GetMedianRunForVideoQueryResult = Apollo.QueryResult<
GetMedianRunForVideoQuery,
GetMedianRunForVideoQueryVariables
>;
export const GetAverageDifficultyForVideoDocument = gql`
query GetAverageDifficultyForVideo($videoId: Int!) {
getVideo(videoId: $videoId) {
id
averageDifficulty
}
}
`;
/**
* __useGetAverageDifficultyForVideoQuery__
*
* To run a query within a React component, call `useGetAverageDifficultyForVideoQuery` and pass it any options that fit your needs.
* When your component renders, `useGetAverageDifficultyForVideoQuery` 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 } = useGetAverageDifficultyForVideoQuery({
* variables: {
* videoId: // value for 'videoId'
* },
* });
*/
export function useGetAverageDifficultyForVideoQuery(
baseOptions: Apollo.QueryHookOptions<
GetAverageDifficultyForVideoQuery,
GetAverageDifficultyForVideoQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useQuery<
GetAverageDifficultyForVideoQuery,
GetAverageDifficultyForVideoQueryVariables
>(GetAverageDifficultyForVideoDocument, options);
}
export function useGetAverageDifficultyForVideoLazyQuery(
baseOptions?: Apollo.LazyQueryHookOptions<
GetAverageDifficultyForVideoQuery,
GetAverageDifficultyForVideoQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useLazyQuery<
GetAverageDifficultyForVideoQuery,
GetAverageDifficultyForVideoQueryVariables
>(GetAverageDifficultyForVideoDocument, options);
}
export function useGetAverageDifficultyForVideoSuspenseQuery(
baseOptions?: Apollo.SuspenseQueryHookOptions<
GetAverageDifficultyForVideoQuery,
GetAverageDifficultyForVideoQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useSuspenseQuery<
GetAverageDifficultyForVideoQuery,
GetAverageDifficultyForVideoQueryVariables
>(GetAverageDifficultyForVideoDocument, options);
}
export type GetAverageDifficultyForVideoQueryHookResult = ReturnType<
typeof useGetAverageDifficultyForVideoQuery
>;
export type GetAverageDifficultyForVideoLazyQueryHookResult = ReturnType<
typeof useGetAverageDifficultyForVideoLazyQuery
>;
export type GetAverageDifficultyForVideoSuspenseQueryHookResult = ReturnType<
typeof useGetAverageDifficultyForVideoSuspenseQuery
>;
export type GetAverageDifficultyForVideoQueryResult = Apollo.QueryResult<
GetAverageDifficultyForVideoQuery,
GetAverageDifficultyForVideoQueryVariables
>;
export const GetVideoForClipTimesDocument = gql`
query GetVideoForClipTimes($videoId: Int!) {
getVideo(videoId: $videoId) {

View File

@@ -7,7 +7,6 @@ query GetAggregatedShotMetrics($aggregateInput: AggregateInputGQL!) {
targetMetrics {
count
makePercentage
averageDifficulty
}
}
}

View File

@@ -50,7 +50,6 @@ fragment VideoCardFields on VideoGQL {
streamSegmentType
}
tableSize
pocketSize
tags {
tagClasses {
name

View File

@@ -192,7 +192,6 @@ fragment ShotWithAllFeatures on ShotGQL {
streamSegmentType
}
playlist {
videoId
segmentDurations
}
}

View File

@@ -34,12 +34,6 @@ query getLoggedInUser {
query GetUser($userId: Int!) {
getUser(userId: $userId) {
...UserFragment
following {
id
}
followers {
id
}
}
}
@@ -94,15 +88,31 @@ query GetUserTags {
mutation followUser($followedUserId: Int!) {
followUser(followedUserId: $followedUserId) {
id
username
id
following {
id
username
}
followers {
id
username
}
}
}
mutation unfollowUser($followedUserId: Int!) {
unfollowUser(followedUserId: $followedUserId) {
id
username
id
following {
id
username
}
followers {
id
username
}
}
}
@@ -113,13 +123,11 @@ query getUserFollowingFollowers {
id
username
profileImageUri
isFollowedByCurrentUser
}
followers {
id
username
profileImageUri
isFollowedByCurrentUser
}
}
}

View File

@@ -61,7 +61,6 @@ query GetVideoDetails($videoId: Int!) {
endTime
makePercentage
medianRun
averageDifficulty
startTime
totalShots
totalShotsMade
@@ -212,13 +211,6 @@ query GetMedianRunForVideo($videoId: Int!) {
}
}
query GetAverageDifficultyForVideo($videoId: Int!) {
getVideo(videoId: $videoId) {
id
averageDifficulty
}
}
fragment StreamWithEndFrames on UploadStreamGQL {
id
streamSegmentType

File diff suppressed because it is too large Load Diff