From c73e66cbe819a24072fd918cc2239007417dc8db Mon Sep 17 00:00:00 2001 From: Loewy Date: Wed, 5 Nov 2025 11:46:27 -0800 Subject: [PATCH] notifications schema --- src/index.tsx | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/schema.gql | 40 ++++++++++++++++++++++++++++++++++++ 2 files changed, 96 insertions(+) diff --git a/src/index.tsx b/src/index.tsx index 1bc4fd5..f408532 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -2286,6 +2286,7 @@ export type Mutation = { createSubscription: CreateSubscriptionResultGql; createUploadStream: CreateUploadStreamReturn; deleteComment: Scalars["Boolean"]["output"]; + deleteNotification: Scalars["Boolean"]["output"]; deleteTags: Scalars["Boolean"]["output"]; deleteUser: Scalars["Boolean"]["output"]; deleteVideo: Scalars["Boolean"]["output"]; @@ -2300,6 +2301,9 @@ export type Mutation = { getHlsInitUploadLink: GetUploadLinkReturn; getProfileImageUploadLink: GetProfileUploadLinkReturn; getUploadLink: GetUploadLinkReturn; + markAllNotificationsAsRead: Scalars["Boolean"]["output"]; + markNotificationAsRead: Scalars["Boolean"]["output"]; + markNotificationsAsRead: Scalars["Boolean"]["output"]; reactToVideo: Scalars["Boolean"]["output"]; reportContent: Scalars["Boolean"]["output"]; retireTags: Scalars["Boolean"]["output"]; @@ -2346,6 +2350,10 @@ export type MutationDeleteCommentArgs = { videoId: Scalars["Int"]["input"]; }; +export type MutationDeleteNotificationArgs = { + notificationId: Scalars["Int"]["input"]; +}; + export type MutationDeleteTagsArgs = { tagsToDelete: Array; videoId: Scalars["Int"]["input"]; @@ -2401,6 +2409,14 @@ export type MutationGetUploadLinkArgs = { videoId: Scalars["Int"]["input"]; }; +export type MutationMarkNotificationAsReadArgs = { + notificationId: Scalars["Int"]["input"]; +}; + +export type MutationMarkNotificationsAsReadArgs = { + notificationIds: Array; +}; + export type MutationReactToVideoArgs = { reaction?: InputMaybe; videoId: Scalars["Int"]["input"]; @@ -2441,6 +2457,38 @@ export type NoInitForChunkedUploadErr = { segmentType: StreamSegmentTypeEnum; }; +export type NotificationConnection = { + __typename?: "NotificationConnection"; + hasMore: Scalars["Boolean"]["output"]; + notifications: Array; + totalCount: Scalars["Int"]["output"]; + unreadCount: Scalars["Int"]["output"]; +}; + +export type NotificationFilters = { + isRead?: InputMaybe; + notificationTypes?: InputMaybe>; +}; + +export type NotificationGql = { + __typename?: "NotificationGQL"; + actor: UserGql; + comment?: Maybe; + createdAt: Scalars["DateTime"]["output"]; + id: Scalars["Int"]["output"]; + isRead: Scalars["Boolean"]["output"]; + notificationType: NotificationTypeEnum; + reactionType?: Maybe; + readAt?: Maybe; + videoId?: Maybe; +}; + +export enum NotificationTypeEnum { + Comment = "COMMENT", + CommentReply = "COMMENT_REPLY", + Reaction = "REACTION", +} + export type OtherErrorNeedsNote = { __typename?: "OtherErrorNeedsNote"; msg?: Maybe; @@ -2550,6 +2598,8 @@ export type Query = { getVideo: VideoGql; getVideoMakePercentageIntervals: Array; getVideos: Array; + notifications: NotificationConnection; + unreadNotificationCount: Scalars["Int"]["output"]; waitFor: Scalars["Float"]["output"]; }; @@ -2689,6 +2739,12 @@ export type QueryGetVideosArgs = { videoIds: Array; }; +export type QueryNotificationsArgs = { + filters?: InputMaybe; + limit?: Scalars["Int"]["input"]; + offset?: Scalars["Int"]["input"]; +}; + export type QueryWaitForArgs = { duration: Scalars["Float"]["input"]; }; diff --git a/src/schema.gql b/src/schema.gql index fe85dcf..e4a0189 100644 --- a/src/schema.gql +++ b/src/schema.gql @@ -28,6 +28,12 @@ type Query { when: DateTime = null ): CountLeaderboardGQL! getMedals(scope: MedalScope!, userId: Int = null): RequestedMedalsGQL! + notifications( + limit: Int! = 20 + offset: Int! = 0 + filters: NotificationFilters = null + ): NotificationConnection! + unreadNotificationCount: Int! getRuns( filterInput: RunFilterInput! runIds: [Int!] = null @@ -714,6 +720,36 @@ input MedalScope @oneOf { datetimeRange: DatetimeRangeAggregationInput } +type NotificationConnection { + notifications: [NotificationGQL!]! + totalCount: Int! + unreadCount: Int! + hasMore: Boolean! +} + +type NotificationGQL { + id: Int! + notificationType: NotificationTypeEnum! + actor: UserGQL! + videoId: Int + comment: CommentGQL + reactionType: String + isRead: Boolean! + createdAt: DateTime! + readAt: DateTime +} + +enum NotificationTypeEnum { + COMMENT + COMMENT_REPLY + REACTION +} + +input NotificationFilters { + isRead: Boolean = null + notificationTypes: [NotificationTypeEnum!] = null +} + type GetRunsResult { runs: [RunGQL!]! count: Int @@ -915,6 +951,10 @@ type Mutation { reason: ReportReasonEnum! customReason: String = null ): Boolean! + markNotificationAsRead(notificationId: Int!): Boolean! + markAllNotificationsAsRead: Boolean! + markNotificationsAsRead(notificationIds: [Int!]!): Boolean! + deleteNotification(notificationId: Int!): Boolean! addAnnotationToShot( shotId: Int! annotationName: String!