From 97cb07062c28f5b100f4014edb88c83d3f7cc0b0 Mon Sep 17 00:00:00 2001 From: Dharit Tantiviramanond Date: Wed, 7 May 2025 16:17:51 -0400 Subject: [PATCH 1/8] Add 'fan' prefix to remix contest notifications --- packages/common/src/adapters/notification.ts | 18 +-- .../useNotificationValidTypes.ts | 6 +- .../common/src/store/notifications/types.ts | 30 ++--- .../src/api/v1/models/notifications.py | 56 ++++----- .../src/api/v1/utils/extend_notification.py | 21 ++-- .../src/queries/get_notifications.py | 18 +-- .../fan_remix_contest_ended.py | 16 +-- .../fan_remix_contest_ending_soon.py | 14 +-- .../src/hooks/useNotificationNavigation.ts | 6 +- .../NotificationListItem.tsx | 21 ++-- ...x => FanRemixContestEndedNotification.tsx} | 16 +-- ...=> FanRemixContestStartedNotification.tsx} | 10 +- .../RemixContestEndingSoonNotification.tsx | 10 +- .../Notifications/index.ts | 2 +- .../generated/full/.openapi-generator/FILES | 18 +-- .../generated/full/apis/NotificationsApi.ts | 6 +- ...ts => FanRemixContestEndedNotification.ts} | 44 +++---- .../FanRemixContestEndedNotificationAction.ts | 101 ++++++++++++++++ ...emixContestEndedNotificationActionData.ts} | 20 ++-- .../FanRemixContestEndingSoonNotification.ts | 109 ++++++++++++++++++ ...emixContestEndingSoonNotificationAction.ts | 101 ++++++++++++++++ ...ontestEndingSoonNotificationActionData.ts} | 20 ++-- ... => FanRemixContestStartedNotification.ts} | 44 +++---- ...nRemixContestStartedNotificationAction.ts} | 42 +++---- ...ixContestStartedNotificationActionData.ts} | 20 ++-- .../api/generated/full/models/Notification.ts | 68 +++++------ .../models/RemixContestEndedNotification.ts | 109 ------------------ .../RemixContestEndedNotificationAction.ts | 101 ---------------- .../RemixContestStartedNotificationAction.ts | 101 ---------------- .../sdk/api/generated/full/models/index.ts | 18 +-- ...x => FanRemixContestEndedNotification.tsx} | 12 +- ...=> FanRemixContestStartedNotification.tsx} | 10 +- .../Notification/Notification.tsx | 24 ++-- .../RemixContestEndingSoonNotification.tsx | 10 +- 34 files changed, 612 insertions(+), 610 deletions(-) rename packages/mobile/src/screens/notifications-screen/Notifications/{RemixContestEndedNotification.tsx => FanRemixContestEndedNotification.tsx} (73%) rename packages/mobile/src/screens/notifications-screen/Notifications/{RemixContestStartedNotification.tsx => FanRemixContestStartedNotification.tsx} (79%) rename packages/sdk/src/sdk/api/generated/full/models/{RemixContestStartedNotification.ts => FanRemixContestEndedNotification.ts} (51%) create mode 100644 packages/sdk/src/sdk/api/generated/full/models/FanRemixContestEndedNotificationAction.ts rename packages/sdk/src/sdk/api/generated/full/models/{RemixContestEndedNotificationActionData.ts => FanRemixContestEndedNotificationActionData.ts} (57%) create mode 100644 packages/sdk/src/sdk/api/generated/full/models/FanRemixContestEndingSoonNotification.ts create mode 100644 packages/sdk/src/sdk/api/generated/full/models/FanRemixContestEndingSoonNotificationAction.ts rename packages/sdk/src/sdk/api/generated/full/models/{RemixContestStartedNotificationActionData.ts => FanRemixContestEndingSoonNotificationActionData.ts} (55%) rename packages/sdk/src/sdk/api/generated/full/models/{RemixContestEndingSoonNotification.ts => FanRemixContestStartedNotification.ts} (52%) rename packages/sdk/src/sdk/api/generated/full/models/{RemixContestEndingSoonNotificationAction.ts => FanRemixContestStartedNotificationAction.ts} (51%) rename packages/sdk/src/sdk/api/generated/full/models/{RemixContestEndingSoonNotificationActionData.ts => FanRemixContestStartedNotificationActionData.ts} (59%) delete mode 100644 packages/sdk/src/sdk/api/generated/full/models/RemixContestEndedNotification.ts delete mode 100644 packages/sdk/src/sdk/api/generated/full/models/RemixContestEndedNotificationAction.ts delete mode 100644 packages/sdk/src/sdk/api/generated/full/models/RemixContestStartedNotificationAction.ts rename packages/web/src/components/notification/Notification/{RemixContestEndedNotification.tsx => FanRemixContestEndedNotification.tsx} (86%) rename packages/web/src/components/notification/Notification/{RemixContestStartedNotification.tsx => FanRemixContestStartedNotification.tsx} (87%) diff --git a/packages/common/src/adapters/notification.ts b/packages/common/src/adapters/notification.ts index baaee3dd48f..afda4e6739f 100644 --- a/packages/common/src/adapters/notification.ts +++ b/packages/common/src/adapters/notification.ts @@ -643,36 +643,36 @@ export const notificationFromSDK = ( ...formatBaseNotification(notification) } } - case 'remix_contest_started': { + case 'fan_remix_contest_ended': { const data = notification.actions[0].data return { - type: NotificationType.RemixContestStarted, + type: NotificationType.FanRemixContestEnded, entityId: HashId.parse(data.entityId), entityUserId: HashId.parse(data.entityUserId), ...formatBaseNotification(notification) } } - case 'remix_contest_ended': { + case 'artist_remix_contest_ended': { const data = notification.actions[0].data return { - type: NotificationType.RemixContestEnded, + type: NotificationType.ArtistRemixContestEnded, entityId: HashId.parse(data.entityId), - entityUserId: HashId.parse(data.entityUserId), ...formatBaseNotification(notification) } } - case 'artist_remix_contest_ended': { + case 'fan_remix_contest_ending_soon': { const data = notification.actions[0].data return { - type: NotificationType.ArtistRemixContestEnded, + type: NotificationType.FanRemixContestEndingSoon, entityId: HashId.parse(data.entityId), + entityUserId: HashId.parse(data.entityUserId), ...formatBaseNotification(notification) } } - case 'remix_contest_ending_soon': { + case 'fan_remix_contest_started': { const data = notification.actions[0].data return { - type: NotificationType.RemixContestEndingSoon, + type: NotificationType.FanRemixContestStarted, entityId: HashId.parse(data.entityId), entityUserId: HashId.parse(data.entityUserId), ...formatBaseNotification(notification) diff --git a/packages/common/src/api/tan-query/notifications/useNotificationValidTypes.ts b/packages/common/src/api/tan-query/notifications/useNotificationValidTypes.ts index 8162b46ce26..6db656b4f1f 100644 --- a/packages/common/src/api/tan-query/notifications/useNotificationValidTypes.ts +++ b/packages/common/src/api/tan-query/notifications/useNotificationValidTypes.ts @@ -19,8 +19,8 @@ export const useNotificationValidTypes = () => { ValidTypes.ClaimableReward, ValidTypes.ListenStreakReminder, ValidTypes.ArtistRemixContestEnded, - ValidTypes.RemixContestStarted, - ValidTypes.RemixContestEnded, - ValidTypes.RemixContestEndingSoon + ValidTypes.FanRemixContestStarted, + ValidTypes.FanRemixContestEnded, + ValidTypes.FanRemixContestEndingSoon ] } diff --git a/packages/common/src/store/notifications/types.ts b/packages/common/src/store/notifications/types.ts index d87e94e03d0..9b25430f35e 100644 --- a/packages/common/src/store/notifications/types.ts +++ b/packages/common/src/store/notifications/types.ts @@ -21,9 +21,9 @@ export enum NotificationType { Milestone = 'Milestone', RemixCreate = 'RemixCreate', RemixCosign = 'RemixCosign', - RemixContestStarted = 'RemixContestStarted', - RemixContestEnded = 'RemixContestEnded', - RemixContestEndingSoon = 'RemixContestEndingSoon', + FanRemixContestStarted = 'FanRemixContestStarted', + FanRemixContestEnded = 'FanRemixContestEnded', + FanRemixContestEndingSoon = 'FanRemixContestEndingSoon', Tastemaker = 'Tastemaker', TrendingTrack = 'TrendingTrack', TrendingPlaylist = 'TrendingPlaylist', @@ -699,27 +699,27 @@ export type ListenStreakReminderNotification = BaseNotification & { streak: number } -export type RemixContestStartedNotification = BaseNotification & { - type: NotificationType.RemixContestStarted +export type FanRemixContestStartedNotification = BaseNotification & { + type: NotificationType.FanRemixContestStarted entityId: ID entityUserId: ID } -export type RemixContestEndedNotification = BaseNotification & { - type: NotificationType.RemixContestEnded +export type FanRemixContestEndingSoonNotification = BaseNotification & { + type: NotificationType.FanRemixContestEndingSoon entityId: ID entityUserId: ID } -export type RemixContestEndingSoonNotification = BaseNotification & { - type: NotificationType.RemixContestEndingSoon +export type ArtistRemixContestEndedNotification = BaseNotification & { + type: NotificationType.ArtistRemixContestEnded entityId: ID - entityUserId: ID } -export type ArtistRemixContestEndedNotification = BaseNotification & { - type: NotificationType.ArtistRemixContestEnded +export type FanRemixContestEndedNotification = BaseNotification & { + type: NotificationType.FanRemixContestEnded entityId: ID + entityUserId: ID } export type Notification = @@ -733,9 +733,8 @@ export type Notification = | MilestoneNotification | RemixCreateNotification | RemixCosignNotification - | RemixContestStartedNotification - | RemixContestEndedNotification - | RemixContestEndingSoonNotification + | FanRemixContestStartedNotification + | FanRemixContestEndingSoonNotification | TastemakerNotification | TrendingPlaylistNotification | TrendingTrackNotification @@ -761,6 +760,7 @@ export type Notification = | CommentReactionNotification | ListenStreakReminderNotification | ArtistRemixContestEndedNotification + | FanRemixContestEndedNotification export type IdentityNotification = Omit & { timestamp: string diff --git a/packages/discovery-provider/src/api/v1/models/notifications.py b/packages/discovery-provider/src/api/v1/models/notifications.py index ce46ad3e4ba..595dc0b846d 100644 --- a/packages/discovery-provider/src/api/v1/models/notifications.py +++ b/packages/discovery-provider/src/api/v1/models/notifications.py @@ -199,82 +199,84 @@ def format(self, value): }, ) -remix_contest_started_notification_action_data = ns.model( - "remix_contest_started_notification_action_data", +fan_remix_contest_started_notification_action_data = ns.model( + "fan_remix_contest_started_notification_action_data", { "entity_user_id": fields.String(required=True), "entity_id": fields.String(required=True), }, ) -remix_contest_started_notification_action = ns.clone( - "remix_contest_started_notification_action", +fan_remix_contest_started_notification_action = ns.clone( + "fan_remix_contest_started_notification_action", notification_action_base, { "data": fields.Nested( - remix_contest_started_notification_action_data, required=True + fan_remix_contest_started_notification_action_data, required=True ) }, ) -remix_contest_started_notification = ns.clone( - "remix_contest_started_notification", +fan_remix_contest_started_notification = ns.clone( + "fan_remix_contest_started_notification", notification_base, { "actions": fields.List( - fields.Nested(remix_contest_started_notification_action, required=True), + fields.Nested(fan_remix_contest_started_notification_action, required=True), required=True, ) }, ) -remix_contest_ended_notification_action_data = ns.model( - "remix_contest_ended_notification_action_data", +fan_remix_contest_ended_notification_action_data = ns.model( + "fan_remix_contest_ended_notification_action_data", { "entity_user_id": fields.String(required=True), "entity_id": fields.String(required=True), }, ) -remix_contest_ended_notification_action = ns.clone( - "remix_contest_ended_notification_action", +fan_remix_contest_ended_notification_action = ns.clone( + "fan_remix_contest_ended_notification_action", notification_action_base, { "data": fields.Nested( - remix_contest_ended_notification_action_data, required=True + fan_remix_contest_ended_notification_action_data, required=True ) }, ) -remix_contest_ended_notification = ns.clone( - "remix_contest_ended_notification", +fan_remix_contest_ended_notification = ns.clone( + "fan_remix_contest_ended_notification", notification_base, { "actions": fields.List( - fields.Nested(remix_contest_ended_notification_action, required=True), + fields.Nested(fan_remix_contest_ended_notification_action, required=True), required=True, ) }, ) -remix_contest_ending_soon_notification_action_data = ns.model( - "remix_contest_ending_soon_notification_action_data", +fan_remix_contest_ending_soon_notification_action_data = ns.model( + "fan_remix_contest_ending_soon_notification_action_data", { "entity_user_id": fields.String(required=True), "entity_id": fields.String(required=True), }, ) -remix_contest_ending_soon_notification_action = ns.clone( - "remix_contest_ending_soon_notification_action", +fan_remix_contest_ending_soon_notification_action = ns.clone( + "fan_remix_contest_ending_soon_notification_action", notification_action_base, { "data": fields.Nested( - remix_contest_ending_soon_notification_action_data, required=True + fan_remix_contest_ending_soon_notification_action_data, required=True ) }, ) -remix_contest_ending_soon_notification = ns.clone( - "remix_contest_ending_soon_notification", +fan_remix_contest_ending_soon_notification = ns.clone( + "fan_remix_contest_ending_soon_notification", notification_base, { "actions": fields.List( - fields.Nested(remix_contest_ending_soon_notification_action, required=True), + fields.Nested( + fan_remix_contest_ending_soon_notification_action, required=True + ), required=True, ) }, @@ -1081,9 +1083,9 @@ def format(self, value): "comment_mention": comment_mention_notification, "comment_reaction": comment_reaction_notification, "listen_streak_reminder": listen_streak_reminder_notification, - "remix_contest_started": remix_contest_started_notification, - "remix_contest_ended": remix_contest_ended_notification, - "remix_contest_ending_soon": remix_contest_ending_soon_notification, + "fan_remix_contest_started": fan_remix_contest_started_notification, + "fan_remix_contest_ended": fan_remix_contest_ended_notification, + "fan_remix_contest_ending_soon": fan_remix_contest_ending_soon_notification, "artist_remix_contest_ended": artist_remix_contest_ended_notification, }, discriminator="type", diff --git a/packages/discovery-provider/src/api/v1/utils/extend_notification.py b/packages/discovery-provider/src/api/v1/utils/extend_notification.py index 5a81a422c59..eed00291d8f 100644 --- a/packages/discovery-provider/src/api/v1/utils/extend_notification.py +++ b/packages/discovery-provider/src/api/v1/utils/extend_notification.py @@ -23,9 +23,6 @@ NotificationData, PlaylistMilestoneNotification, ReactionNotification, - RemixContestEndedNotification, - RemixContestEndingSoonNotification, - RemixContestStartedNotification, RemixNotification, RepostNotification, RepostOfRepostNotification, @@ -763,8 +760,8 @@ def extend_listen_streak_reminder(action: NotificationAction): } -def extend_remix_contest_started(action: NotificationAction): - data: RemixContestStartedNotification = action["data"] # type: ignore +def extend_fan_remix_contest_started(action: NotificationAction): + data = action["data"] # type: ignore return { "specifier": encode_int_id(int(action["specifier"])), "type": action["type"], @@ -780,8 +777,8 @@ def extend_remix_contest_started(action: NotificationAction): } -def extend_remix_contest_ended(action: NotificationAction): - data: RemixContestEndedNotification = action["data"] # type: ignore +def extend_fan_remix_contest_ended(action: NotificationAction): + data = action["data"] # type: ignore return { "specifier": encode_int_id(int(action["specifier"])), "type": action["type"], @@ -797,8 +794,8 @@ def extend_remix_contest_ended(action: NotificationAction): } -def extend_remix_contest_ending_soon(action: NotificationAction): - data: RemixContestEndingSoonNotification = action["data"] # type: ignore +def extend_fan_remix_contest_ending_soon(action: NotificationAction): + data = action["data"] # type: ignore return { "specifier": encode_int_id(int(action["specifier"])), "type": action["type"], @@ -865,8 +862,8 @@ def extend_artist_remix_contest_ended(action: NotificationAction): "comment_mention": extend_comment_mention, "comment_reaction": extend_comment_reaction, "listen_streak_reminder": extend_listen_streak_reminder, - "remix_contest_started": extend_remix_contest_started, - "remix_contest_ended": extend_remix_contest_ended, - "remix_contest_ending_soon": extend_remix_contest_ending_soon, + "fan_remix_contest_started": extend_fan_remix_contest_started, + "fan_remix_contest_ended": extend_fan_remix_contest_ended, + "fan_remix_contest_ending_soon": extend_fan_remix_contest_ending_soon, "artist_remix_contest_ended": extend_artist_remix_contest_ended, } diff --git a/packages/discovery-provider/src/queries/get_notifications.py b/packages/discovery-provider/src/queries/get_notifications.py index 7285f4b2cb0..d3d4d3d4535 100644 --- a/packages/discovery-provider/src/queries/get_notifications.py +++ b/packages/discovery-provider/src/queries/get_notifications.py @@ -174,9 +174,9 @@ class NotificationType(str, Enum): COMMENT_MENTION = "comment_mention" COMMENT_REACTION = "comment_reaction" LISTEN_STREAK_REMINDER = "listen_streak_reminder" - REMIX_CONTEST_STARTED = "remix_contest_started" - REMIX_CONTEST_ENDED = "remix_contest_ended" - REMIX_CONTEST_ENDING_SOON = "remix_contest_ending_soon" + FAN_REMIX_CONTEST_STARTED = "fan_remix_contest_started" + FAN_REMIX_CONTEST_ENDED = "fan_remix_contest_ended" + FAN_REMIX_CONTEST_ENDING_SOON = "fan_remix_contest_ending_soon" ARTIST_REMIX_CONTEST_ENDED = "artist_remix_contest_ended" def __str__(self) -> str: @@ -486,17 +486,17 @@ class ListenStreakReminderNotification(TypedDict): streak: int -class RemixContestStartedNotification(TypedDict): +class FanRemixContestStartedNotification(TypedDict): entity_user_id: int entity_id: int -class RemixContestEndedNotification(TypedDict): +class FanRemixContestEndedNotification(TypedDict): entity_user_id: int entity_id: int -class RemixContestEndingSoonNotification(TypedDict): +class FanRemixContestEndingSoonNotification(TypedDict): entity_user_id: int entity_id: int @@ -537,9 +537,9 @@ class ArtistRemixContestEndedNotification(TypedDict): CommentMentionNotification, CommentReactionNotification, ListenStreakReminderNotification, - RemixContestStartedNotification, - RemixContestEndedNotification, - RemixContestEndingSoonNotification, + FanRemixContestStartedNotification, + FanRemixContestEndedNotification, + FanRemixContestEndingSoonNotification, ArtistRemixContestEndedNotification, ] diff --git a/packages/discovery-provider/src/tasks/remix_contest_notifications/fan_remix_contest_ended.py b/packages/discovery-provider/src/tasks/remix_contest_notifications/fan_remix_contest_ended.py index e9d39275492..3bbc717994f 100644 --- a/packages/discovery-provider/src/tasks/remix_contest_notifications/fan_remix_contest_ended.py +++ b/packages/discovery-provider/src/tasks/remix_contest_notifications/fan_remix_contest_ended.py @@ -5,14 +5,14 @@ from src.models.tracks.track import Track from src.utils.structured_logger import StructuredLogger -REMIX_CONTEST_ENDED = "remix_contest_ended" +FAN_REMIX_CONTEST_ENDED = "fan_remix_contest_ended" REMIX_CONTEST_ENDED_WINDOW_HOURS = 24 logger = StructuredLogger(__name__) -def get_remix_contest_ended_group_id(event_id): - return f"{REMIX_CONTEST_ENDED}:{event_id}" +def get_fan_remix_contest_ended_group_id(event_id): + return f"{FAN_REMIX_CONTEST_ENDED}:{event_id}" def create_fan_remix_contest_ended_notifications(session, now=None): @@ -48,7 +48,7 @@ def create_fan_remix_contest_ended_notifications(session, now=None): ) remixer_user_ids = {row[0] for row in remixers} for user_id in remixer_user_ids: - group_id = get_remix_contest_ended_group_id(event.event_id) + group_id = get_fan_remix_contest_ended_group_id(event.event_id) parent_track = ( session.query(Track) .filter( @@ -63,7 +63,7 @@ def create_fan_remix_contest_ended_notifications(session, now=None): session.query(Notification) .filter( Notification.group_id == group_id, - Notification.type == REMIX_CONTEST_ENDED, + Notification.type == FAN_REMIX_CONTEST_ENDED, Notification.user_ids.any(user_id), ) .first() @@ -74,7 +74,7 @@ def create_fan_remix_contest_ended_notifications(session, now=None): group_id=group_id, blocknumber=None, user_ids=[user_id], - type=REMIX_CONTEST_ENDED, + type=FAN_REMIX_CONTEST_ENDED, data={ "entity_id": event.entity_id, "entity_user_id": parent_track_owner_id, @@ -82,6 +82,8 @@ def create_fan_remix_contest_ended_notifications(session, now=None): timestamp=now, ) new_notifications.append(new_notification) - logger.info(f"Inserting {len(new_notifications)} remix contest ended notifications") + logger.info( + f"Inserting {len(new_notifications)} fan remix contest ended notifications" + ) session.add_all(new_notifications) session.commit() diff --git a/packages/discovery-provider/src/tasks/remix_contest_notifications/fan_remix_contest_ending_soon.py b/packages/discovery-provider/src/tasks/remix_contest_notifications/fan_remix_contest_ending_soon.py index d197e612e59..a0ebd9ecd6e 100644 --- a/packages/discovery-provider/src/tasks/remix_contest_notifications/fan_remix_contest_ending_soon.py +++ b/packages/discovery-provider/src/tasks/remix_contest_notifications/fan_remix_contest_ending_soon.py @@ -10,12 +10,12 @@ logger = StructuredLogger(__name__) -REMIX_CONTEST_ENDING_SOON = "remix_contest_ending_soon" +FAN_REMIX_CONTEST_ENDING_SOON = "fan_remix_contest_ending_soon" REMIX_CONTEST_ENDING_SOON_WINDOW_HOURS = 72 -def get_remix_contest_ending_soon_group_id(event_id): - return f"{REMIX_CONTEST_ENDING_SOON}:{event_id}" +def get_fan_remix_contest_ending_soon_group_id(event_id): + return f"{FAN_REMIX_CONTEST_ENDING_SOON}:{event_id}" def create_fan_remix_contest_ending_soon_notifications(session, now=None): @@ -69,13 +69,13 @@ def create_fan_remix_contest_ending_soon_notifications(session, now=None): .first() ) parent_track_owner_id = parent_track.owner_id if parent_track else None - group_id = get_remix_contest_ending_soon_group_id(event.event_id) + group_id = get_fan_remix_contest_ending_soon_group_id(event.event_id) for user_id in notified_user_ids: exists = ( session.query(Notification) .filter( Notification.group_id == group_id, - Notification.type == REMIX_CONTEST_ENDING_SOON, + Notification.type == FAN_REMIX_CONTEST_ENDING_SOON, Notification.user_ids.any(user_id), ) .first() @@ -86,7 +86,7 @@ def create_fan_remix_contest_ending_soon_notifications(session, now=None): group_id=group_id, blocknumber=None, user_ids=[user_id], - type=REMIX_CONTEST_ENDING_SOON, + type=FAN_REMIX_CONTEST_ENDING_SOON, data={ "entity_id": contest_track_id, "entity_user_id": parent_track_owner_id, @@ -95,7 +95,7 @@ def create_fan_remix_contest_ending_soon_notifications(session, now=None): ) new_notifications.append(new_notification) logger.info( - f"Inserting {len(new_notifications)} remix contest ending soon notifications" + f"Inserting {len(new_notifications)} fan remix contest ending soon notifications" ) session.add_all(new_notifications) session.commit() diff --git a/packages/mobile/src/hooks/useNotificationNavigation.ts b/packages/mobile/src/hooks/useNotificationNavigation.ts index 375d5b13fb2..e5cb3f12198 100644 --- a/packages/mobile/src/hooks/useNotificationNavigation.ts +++ b/packages/mobile/src/hooks/useNotificationNavigation.ts @@ -339,9 +339,9 @@ export const useNotificationNavigation = () => { [NotificationType.CommentMention]: entityHandler, [NotificationType.CommentThread]: entityHandler, [NotificationType.CommentReaction]: entityHandler, - [NotificationType.RemixContestStarted]: entityHandler, - [NotificationType.RemixContestEnded]: entityHandler, - [NotificationType.RemixContestEndingSoon]: entityHandler + [NotificationType.FanRemixContestStarted]: entityHandler, + [NotificationType.FanRemixContestEnded]: entityHandler, + [NotificationType.FanRemixContestEndingSoon]: entityHandler }), [ dispatch, diff --git a/packages/mobile/src/screens/notifications-screen/NotificationListItem.tsx b/packages/mobile/src/screens/notifications-screen/NotificationListItem.tsx index 7f3c8e1939d..ddf7977de45 100644 --- a/packages/mobile/src/screens/notifications-screen/NotificationListItem.tsx +++ b/packages/mobile/src/screens/notifications-screen/NotificationListItem.tsx @@ -37,11 +37,10 @@ import { CommentMentionNotification, CommentReactionNotification } from './Notifications' -import { ArtistRemixContestEndedNotification } from './Notifications/ArtistRemixContestEndedNotification' +import { FanRemixContestEndedNotification } from './Notifications/FanRemixContestEndedNotification' +import { FanRemixContestStartedNotification } from './Notifications/FanRemixContestStartedNotification' import { ListenStreakReminderNotification } from './Notifications/ListenStreakReminderNotification' -import { RemixContestEndedNotification } from './Notifications/RemixContestEndedNotification' -import { RemixContestEndingSoonNotification } from './Notifications/RemixContestEndingSoonNotification' -import { RemixContestStartedNotification } from './Notifications/RemixContestStartedNotification' +import { FanRemixContestEndingSoonNotification } from './Notifications/RemixContestEndingSoonNotification' type NotificationListItemProps = { notification: Notification @@ -132,17 +131,15 @@ export const NotificationListItem = (props: NotificationListItemProps) => { return case NotificationType.ListenStreakReminder: return - case NotificationType.RemixContestStarted: - return - case NotificationType.RemixContestEnded: - return - case NotificationType.ArtistRemixContestEnded: + case NotificationType.FanRemixContestEnded: + return + case NotificationType.FanRemixContestEndingSoon: return ( - + ) - case NotificationType.RemixContestEndingSoon: + case NotificationType.FanRemixContestStarted: return ( - + ) default: return null diff --git a/packages/mobile/src/screens/notifications-screen/Notifications/RemixContestEndedNotification.tsx b/packages/mobile/src/screens/notifications-screen/Notifications/FanRemixContestEndedNotification.tsx similarity index 73% rename from packages/mobile/src/screens/notifications-screen/Notifications/RemixContestEndedNotification.tsx rename to packages/mobile/src/screens/notifications-screen/Notifications/FanRemixContestEndedNotification.tsx index 11a044d4cdb..e1f600254c0 100644 --- a/packages/mobile/src/screens/notifications-screen/Notifications/RemixContestEndedNotification.tsx +++ b/packages/mobile/src/screens/notifications-screen/Notifications/FanRemixContestEndedNotification.tsx @@ -1,7 +1,7 @@ import { useCallback } from 'react' import { useTrack, useUser } from '@audius/common/api' -import type { RemixContestEndedNotification as RemixContestEndedNotificationType } from '@audius/common/store' +import type { FanRemixContestEndedNotification as FanRemixContestEndedNotificationType } from '@audius/common/store' import { IconTrophy } from '@audius/harmony-native' import { useNotificationNavigation } from 'app/hooks/useNotificationNavigation' @@ -11,7 +11,8 @@ import { NotificationText, NotificationTile, NotificationTitle, - UserNameLink + UserNameLink, + EntityLink } from '../Notification' const messages = { @@ -20,12 +21,12 @@ const messages = { "'s remix contest has closed and winners should be announced soon. Good luck!" } -type RemixContestEndedNotificationProps = { - notification: RemixContestEndedNotificationType +type FanRemixContestEndedNotificationProps = { + notification: FanRemixContestEndedNotificationType } -export const RemixContestEndedNotification = ( - props: RemixContestEndedNotificationProps +export const FanRemixContestEndedNotification = ( + props: FanRemixContestEndedNotificationProps ) => { const { notification } = props const { entityId, entityUserId } = notification @@ -48,7 +49,8 @@ export const RemixContestEndedNotification = ( {messages.title} - {messages.description} + {messages.description}{' '} + ) diff --git a/packages/mobile/src/screens/notifications-screen/Notifications/RemixContestStartedNotification.tsx b/packages/mobile/src/screens/notifications-screen/Notifications/FanRemixContestStartedNotification.tsx similarity index 79% rename from packages/mobile/src/screens/notifications-screen/Notifications/RemixContestStartedNotification.tsx rename to packages/mobile/src/screens/notifications-screen/Notifications/FanRemixContestStartedNotification.tsx index 825347d8725..7349689d3a8 100644 --- a/packages/mobile/src/screens/notifications-screen/Notifications/RemixContestStartedNotification.tsx +++ b/packages/mobile/src/screens/notifications-screen/Notifications/FanRemixContestStartedNotification.tsx @@ -1,7 +1,7 @@ import { useCallback } from 'react' import { useTrack, useUser } from '@audius/common/api' -import type { RemixContestStartedNotification as RemixContestStartedNotificationType } from '@audius/common/store' +import type { FanRemixContestStartedNotification as FanRemixContestStartedNotificationType } from '@audius/common/store' import { IconTrophy } from '@audius/harmony-native' import { useNotificationNavigation } from 'app/hooks/useNotificationNavigation' @@ -20,12 +20,12 @@ const messages = { description: 'started a remix contest for' } -type RemixContestStartedNotificationProps = { - notification: RemixContestStartedNotificationType +type FanRemixContestStartedNotificationProps = { + notification: FanRemixContestStartedNotificationType } -export const RemixContestStartedNotification = ( - props: RemixContestStartedNotificationProps +export const FanRemixContestStartedNotification = ( + props: FanRemixContestStartedNotificationProps ) => { const { notification } = props const { entityId, entityUserId } = notification diff --git a/packages/mobile/src/screens/notifications-screen/Notifications/RemixContestEndingSoonNotification.tsx b/packages/mobile/src/screens/notifications-screen/Notifications/RemixContestEndingSoonNotification.tsx index b9589ac68bd..221554c8d84 100644 --- a/packages/mobile/src/screens/notifications-screen/Notifications/RemixContestEndingSoonNotification.tsx +++ b/packages/mobile/src/screens/notifications-screen/Notifications/RemixContestEndingSoonNotification.tsx @@ -1,7 +1,7 @@ import { useCallback } from 'react' import { useTrack, useUser } from '@audius/common/api' -import type { RemixContestEndingSoonNotification as RemixContestEndingSoonNotificationType } from '@audius/common/store' +import type { FanRemixContestEndingSoonNotification as FanRemixContestEndingSoonNotificationType } from '@audius/common/store' import { IconTrophy } from '@audius/harmony-native' import { useNotificationNavigation } from 'app/hooks/useNotificationNavigation' @@ -21,12 +21,12 @@ const messages = { " has a remix contest ending in 72 hours - don't forget to submit your remix" } -type RemixContestEndingSoonNotificationProps = { - notification: RemixContestEndingSoonNotificationType +type FanRemixContestEndingSoonNotificationProps = { + notification: FanRemixContestEndingSoonNotificationType } -export const RemixContestEndingSoonNotification = ( - props: RemixContestEndingSoonNotificationProps +export const FanRemixContestEndingSoonNotification = ( + props: FanRemixContestEndingSoonNotificationProps ) => { const { notification } = props const { entityId, entityUserId } = notification diff --git a/packages/mobile/src/screens/notifications-screen/Notifications/index.ts b/packages/mobile/src/screens/notifications-screen/Notifications/index.ts index 14aeb12ef71..17ad066bf60 100644 --- a/packages/mobile/src/screens/notifications-screen/Notifications/index.ts +++ b/packages/mobile/src/screens/notifications-screen/Notifications/index.ts @@ -31,6 +31,6 @@ export * from './CommentNotification' export * from './CommentThreadNotification' export * from './CommentMentionNotification' export * from './CommentReactionNotification' -export * from './RemixContestEndedNotification' +export * from './FanRemixContestEndedNotification' export * from './RemixContestEndingSoonNotification' export * from './ArtistRemixContestEndedNotification' diff --git a/packages/sdk/src/sdk/api/generated/full/.openapi-generator/FILES b/packages/sdk/src/sdk/api/generated/full/.openapi-generator/FILES index 225a54001fe..ccb5f7b800e 100644 --- a/packages/sdk/src/sdk/api/generated/full/.openapi-generator/FILES +++ b/packages/sdk/src/sdk/api/generated/full/.openapi-generator/FILES @@ -69,6 +69,15 @@ models/CreateNotificationActionData.ts models/CreatePlaylistNotificationActionData.ts models/CreateTrackNotificationActionData.ts models/DataAndType.ts +models/FanRemixContestEndedNotification.ts +models/FanRemixContestEndedNotificationAction.ts +models/FanRemixContestEndedNotificationActionData.ts +models/FanRemixContestEndingSoonNotification.ts +models/FanRemixContestEndingSoonNotificationAction.ts +models/FanRemixContestEndingSoonNotificationActionData.ts +models/FanRemixContestStartedNotification.ts +models/FanRemixContestStartedNotificationAction.ts +models/FanRemixContestStartedNotificationActionData.ts models/Favorite.ts models/FieldVisibility.ts models/FollowGate.ts @@ -153,15 +162,6 @@ models/ReceiveTipNotificationAction.ts models/ReceiveTipNotificationActionData.ts models/Related.ts models/RelatedArtistResponseFull.ts -models/RemixContestEndedNotification.ts -models/RemixContestEndedNotificationAction.ts -models/RemixContestEndedNotificationActionData.ts -models/RemixContestEndingSoonNotification.ts -models/RemixContestEndingSoonNotificationAction.ts -models/RemixContestEndingSoonNotificationActionData.ts -models/RemixContestStartedNotification.ts -models/RemixContestStartedNotificationAction.ts -models/RemixContestStartedNotificationActionData.ts models/RemixNotification.ts models/RemixNotificationAction.ts models/RemixNotificationActionData.ts diff --git a/packages/sdk/src/sdk/api/generated/full/apis/NotificationsApi.ts b/packages/sdk/src/sdk/api/generated/full/apis/NotificationsApi.ts index 64fb0f9a9b3..ea1fe497cf4 100644 --- a/packages/sdk/src/sdk/api/generated/full/apis/NotificationsApi.ts +++ b/packages/sdk/src/sdk/api/generated/full/apis/NotificationsApi.ts @@ -163,9 +163,9 @@ export const GetNotificationsValidTypesEnum = { CommentMention: 'comment_mention', CommentReaction: 'comment_reaction', ListenStreakReminder: 'listen_streak_reminder', - RemixContestStarted: 'remix_contest_started', - RemixContestEnded: 'remix_contest_ended', - RemixContestEndingSoon: 'remix_contest_ending_soon', + FanRemixContestStarted: 'fan_remix_contest_started', + FanRemixContestEnded: 'fan_remix_contest_ended', + FanRemixContestEndingSoon: 'fan_remix_contest_ending_soon', ArtistRemixContestEnded: 'artist_remix_contest_ended' } as const; export type GetNotificationsValidTypesEnum = typeof GetNotificationsValidTypesEnum[keyof typeof GetNotificationsValidTypesEnum]; diff --git a/packages/sdk/src/sdk/api/generated/full/models/RemixContestStartedNotification.ts b/packages/sdk/src/sdk/api/generated/full/models/FanRemixContestEndedNotification.ts similarity index 51% rename from packages/sdk/src/sdk/api/generated/full/models/RemixContestStartedNotification.ts rename to packages/sdk/src/sdk/api/generated/full/models/FanRemixContestEndedNotification.ts index 946652e1b42..2b4c9a12d1c 100644 --- a/packages/sdk/src/sdk/api/generated/full/models/RemixContestStartedNotification.ts +++ b/packages/sdk/src/sdk/api/generated/full/models/FanRemixContestEndedNotification.ts @@ -14,55 +14,55 @@ */ import { exists, mapValues } from '../runtime'; -import type { RemixContestStartedNotificationAction } from './RemixContestStartedNotificationAction'; +import type { FanRemixContestEndedNotificationAction } from './FanRemixContestEndedNotificationAction'; import { - RemixContestStartedNotificationActionFromJSON, - RemixContestStartedNotificationActionFromJSONTyped, - RemixContestStartedNotificationActionToJSON, -} from './RemixContestStartedNotificationAction'; + FanRemixContestEndedNotificationActionFromJSON, + FanRemixContestEndedNotificationActionFromJSONTyped, + FanRemixContestEndedNotificationActionToJSON, +} from './FanRemixContestEndedNotificationAction'; /** * * @export - * @interface RemixContestStartedNotification + * @interface FanRemixContestEndedNotification */ -export interface RemixContestStartedNotification { +export interface FanRemixContestEndedNotification { /** * * @type {string} - * @memberof RemixContestStartedNotification + * @memberof FanRemixContestEndedNotification */ type: string; /** * * @type {string} - * @memberof RemixContestStartedNotification + * @memberof FanRemixContestEndedNotification */ groupId: string; /** * * @type {boolean} - * @memberof RemixContestStartedNotification + * @memberof FanRemixContestEndedNotification */ isSeen: boolean; /** * * @type {number} - * @memberof RemixContestStartedNotification + * @memberof FanRemixContestEndedNotification */ seenAt?: number; /** * - * @type {Array} - * @memberof RemixContestStartedNotification + * @type {Array} + * @memberof FanRemixContestEndedNotification */ - actions: Array; + actions: Array; } /** - * Check if a given object implements the RemixContestStartedNotification interface. + * Check if a given object implements the FanRemixContestEndedNotification interface. */ -export function instanceOfRemixContestStartedNotification(value: object): value is RemixContestStartedNotification { +export function instanceOfFanRemixContestEndedNotification(value: object): value is FanRemixContestEndedNotification { let isInstance = true; isInstance = isInstance && "type" in value && value["type"] !== undefined; isInstance = isInstance && "groupId" in value && value["groupId"] !== undefined; @@ -72,11 +72,11 @@ export function instanceOfRemixContestStartedNotification(value: object): value return isInstance; } -export function RemixContestStartedNotificationFromJSON(json: any): RemixContestStartedNotification { - return RemixContestStartedNotificationFromJSONTyped(json, false); +export function FanRemixContestEndedNotificationFromJSON(json: any): FanRemixContestEndedNotification { + return FanRemixContestEndedNotificationFromJSONTyped(json, false); } -export function RemixContestStartedNotificationFromJSONTyped(json: any, ignoreDiscriminator: boolean): RemixContestStartedNotification { +export function FanRemixContestEndedNotificationFromJSONTyped(json: any, ignoreDiscriminator: boolean): FanRemixContestEndedNotification { if ((json === undefined) || (json === null)) { return json; } @@ -86,11 +86,11 @@ export function RemixContestStartedNotificationFromJSONTyped(json: any, ignoreDi 'groupId': json['group_id'], 'isSeen': json['is_seen'], 'seenAt': !exists(json, 'seen_at') ? undefined : json['seen_at'], - 'actions': ((json['actions'] as Array).map(RemixContestStartedNotificationActionFromJSON)), + 'actions': ((json['actions'] as Array).map(FanRemixContestEndedNotificationActionFromJSON)), }; } -export function RemixContestStartedNotificationToJSON(value?: RemixContestStartedNotification | null): any { +export function FanRemixContestEndedNotificationToJSON(value?: FanRemixContestEndedNotification | null): any { if (value === undefined) { return undefined; } @@ -103,7 +103,7 @@ export function RemixContestStartedNotificationToJSON(value?: RemixContestStarte 'group_id': value.groupId, 'is_seen': value.isSeen, 'seen_at': value.seenAt, - 'actions': ((value.actions as Array).map(RemixContestStartedNotificationActionToJSON)), + 'actions': ((value.actions as Array).map(FanRemixContestEndedNotificationActionToJSON)), }; } diff --git a/packages/sdk/src/sdk/api/generated/full/models/FanRemixContestEndedNotificationAction.ts b/packages/sdk/src/sdk/api/generated/full/models/FanRemixContestEndedNotificationAction.ts new file mode 100644 index 00000000000..9b5414f64a7 --- /dev/null +++ b/packages/sdk/src/sdk/api/generated/full/models/FanRemixContestEndedNotificationAction.ts @@ -0,0 +1,101 @@ +/* tslint:disable */ +/* eslint-disable */ +// @ts-nocheck +/** + * API + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { exists, mapValues } from '../runtime'; +import type { FanRemixContestEndedNotificationActionData } from './FanRemixContestEndedNotificationActionData'; +import { + FanRemixContestEndedNotificationActionDataFromJSON, + FanRemixContestEndedNotificationActionDataFromJSONTyped, + FanRemixContestEndedNotificationActionDataToJSON, +} from './FanRemixContestEndedNotificationActionData'; + +/** + * + * @export + * @interface FanRemixContestEndedNotificationAction + */ +export interface FanRemixContestEndedNotificationAction { + /** + * + * @type {string} + * @memberof FanRemixContestEndedNotificationAction + */ + specifier: string; + /** + * + * @type {string} + * @memberof FanRemixContestEndedNotificationAction + */ + type: string; + /** + * + * @type {number} + * @memberof FanRemixContestEndedNotificationAction + */ + timestamp: number; + /** + * + * @type {FanRemixContestEndedNotificationActionData} + * @memberof FanRemixContestEndedNotificationAction + */ + data: FanRemixContestEndedNotificationActionData; +} + +/** + * Check if a given object implements the FanRemixContestEndedNotificationAction interface. + */ +export function instanceOfFanRemixContestEndedNotificationAction(value: object): value is FanRemixContestEndedNotificationAction { + let isInstance = true; + isInstance = isInstance && "specifier" in value && value["specifier"] !== undefined; + isInstance = isInstance && "type" in value && value["type"] !== undefined; + isInstance = isInstance && "timestamp" in value && value["timestamp"] !== undefined; + isInstance = isInstance && "data" in value && value["data"] !== undefined; + + return isInstance; +} + +export function FanRemixContestEndedNotificationActionFromJSON(json: any): FanRemixContestEndedNotificationAction { + return FanRemixContestEndedNotificationActionFromJSONTyped(json, false); +} + +export function FanRemixContestEndedNotificationActionFromJSONTyped(json: any, ignoreDiscriminator: boolean): FanRemixContestEndedNotificationAction { + if ((json === undefined) || (json === null)) { + return json; + } + return { + + 'specifier': json['specifier'], + 'type': json['type'], + 'timestamp': json['timestamp'], + 'data': FanRemixContestEndedNotificationActionDataFromJSON(json['data']), + }; +} + +export function FanRemixContestEndedNotificationActionToJSON(value?: FanRemixContestEndedNotificationAction | null): any { + if (value === undefined) { + return undefined; + } + if (value === null) { + return null; + } + return { + + 'specifier': value.specifier, + 'type': value.type, + 'timestamp': value.timestamp, + 'data': FanRemixContestEndedNotificationActionDataToJSON(value.data), + }; +} + diff --git a/packages/sdk/src/sdk/api/generated/full/models/RemixContestEndedNotificationActionData.ts b/packages/sdk/src/sdk/api/generated/full/models/FanRemixContestEndedNotificationActionData.ts similarity index 57% rename from packages/sdk/src/sdk/api/generated/full/models/RemixContestEndedNotificationActionData.ts rename to packages/sdk/src/sdk/api/generated/full/models/FanRemixContestEndedNotificationActionData.ts index 818560daea1..68db1a15ea5 100644 --- a/packages/sdk/src/sdk/api/generated/full/models/RemixContestEndedNotificationActionData.ts +++ b/packages/sdk/src/sdk/api/generated/full/models/FanRemixContestEndedNotificationActionData.ts @@ -17,27 +17,27 @@ import { exists, mapValues } from '../runtime'; /** * * @export - * @interface RemixContestEndedNotificationActionData + * @interface FanRemixContestEndedNotificationActionData */ -export interface RemixContestEndedNotificationActionData { +export interface FanRemixContestEndedNotificationActionData { /** * * @type {string} - * @memberof RemixContestEndedNotificationActionData + * @memberof FanRemixContestEndedNotificationActionData */ entityUserId: string; /** * * @type {string} - * @memberof RemixContestEndedNotificationActionData + * @memberof FanRemixContestEndedNotificationActionData */ entityId: string; } /** - * Check if a given object implements the RemixContestEndedNotificationActionData interface. + * Check if a given object implements the FanRemixContestEndedNotificationActionData interface. */ -export function instanceOfRemixContestEndedNotificationActionData(value: object): value is RemixContestEndedNotificationActionData { +export function instanceOfFanRemixContestEndedNotificationActionData(value: object): value is FanRemixContestEndedNotificationActionData { let isInstance = true; isInstance = isInstance && "entityUserId" in value && value["entityUserId"] !== undefined; isInstance = isInstance && "entityId" in value && value["entityId"] !== undefined; @@ -45,11 +45,11 @@ export function instanceOfRemixContestEndedNotificationActionData(value: object) return isInstance; } -export function RemixContestEndedNotificationActionDataFromJSON(json: any): RemixContestEndedNotificationActionData { - return RemixContestEndedNotificationActionDataFromJSONTyped(json, false); +export function FanRemixContestEndedNotificationActionDataFromJSON(json: any): FanRemixContestEndedNotificationActionData { + return FanRemixContestEndedNotificationActionDataFromJSONTyped(json, false); } -export function RemixContestEndedNotificationActionDataFromJSONTyped(json: any, ignoreDiscriminator: boolean): RemixContestEndedNotificationActionData { +export function FanRemixContestEndedNotificationActionDataFromJSONTyped(json: any, ignoreDiscriminator: boolean): FanRemixContestEndedNotificationActionData { if ((json === undefined) || (json === null)) { return json; } @@ -60,7 +60,7 @@ export function RemixContestEndedNotificationActionDataFromJSONTyped(json: any, }; } -export function RemixContestEndedNotificationActionDataToJSON(value?: RemixContestEndedNotificationActionData | null): any { +export function FanRemixContestEndedNotificationActionDataToJSON(value?: FanRemixContestEndedNotificationActionData | null): any { if (value === undefined) { return undefined; } diff --git a/packages/sdk/src/sdk/api/generated/full/models/FanRemixContestEndingSoonNotification.ts b/packages/sdk/src/sdk/api/generated/full/models/FanRemixContestEndingSoonNotification.ts new file mode 100644 index 00000000000..2bdf3cdc929 --- /dev/null +++ b/packages/sdk/src/sdk/api/generated/full/models/FanRemixContestEndingSoonNotification.ts @@ -0,0 +1,109 @@ +/* tslint:disable */ +/* eslint-disable */ +// @ts-nocheck +/** + * API + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { exists, mapValues } from '../runtime'; +import type { FanRemixContestEndingSoonNotificationAction } from './FanRemixContestEndingSoonNotificationAction'; +import { + FanRemixContestEndingSoonNotificationActionFromJSON, + FanRemixContestEndingSoonNotificationActionFromJSONTyped, + FanRemixContestEndingSoonNotificationActionToJSON, +} from './FanRemixContestEndingSoonNotificationAction'; + +/** + * + * @export + * @interface FanRemixContestEndingSoonNotification + */ +export interface FanRemixContestEndingSoonNotification { + /** + * + * @type {string} + * @memberof FanRemixContestEndingSoonNotification + */ + type: string; + /** + * + * @type {string} + * @memberof FanRemixContestEndingSoonNotification + */ + groupId: string; + /** + * + * @type {boolean} + * @memberof FanRemixContestEndingSoonNotification + */ + isSeen: boolean; + /** + * + * @type {number} + * @memberof FanRemixContestEndingSoonNotification + */ + seenAt?: number; + /** + * + * @type {Array} + * @memberof FanRemixContestEndingSoonNotification + */ + actions: Array; +} + +/** + * Check if a given object implements the FanRemixContestEndingSoonNotification interface. + */ +export function instanceOfFanRemixContestEndingSoonNotification(value: object): value is FanRemixContestEndingSoonNotification { + let isInstance = true; + isInstance = isInstance && "type" in value && value["type"] !== undefined; + isInstance = isInstance && "groupId" in value && value["groupId"] !== undefined; + isInstance = isInstance && "isSeen" in value && value["isSeen"] !== undefined; + isInstance = isInstance && "actions" in value && value["actions"] !== undefined; + + return isInstance; +} + +export function FanRemixContestEndingSoonNotificationFromJSON(json: any): FanRemixContestEndingSoonNotification { + return FanRemixContestEndingSoonNotificationFromJSONTyped(json, false); +} + +export function FanRemixContestEndingSoonNotificationFromJSONTyped(json: any, ignoreDiscriminator: boolean): FanRemixContestEndingSoonNotification { + if ((json === undefined) || (json === null)) { + return json; + } + return { + + 'type': json['type'], + 'groupId': json['group_id'], + 'isSeen': json['is_seen'], + 'seenAt': !exists(json, 'seen_at') ? undefined : json['seen_at'], + 'actions': ((json['actions'] as Array).map(FanRemixContestEndingSoonNotificationActionFromJSON)), + }; +} + +export function FanRemixContestEndingSoonNotificationToJSON(value?: FanRemixContestEndingSoonNotification | null): any { + if (value === undefined) { + return undefined; + } + if (value === null) { + return null; + } + return { + + 'type': value.type, + 'group_id': value.groupId, + 'is_seen': value.isSeen, + 'seen_at': value.seenAt, + 'actions': ((value.actions as Array).map(FanRemixContestEndingSoonNotificationActionToJSON)), + }; +} + diff --git a/packages/sdk/src/sdk/api/generated/full/models/FanRemixContestEndingSoonNotificationAction.ts b/packages/sdk/src/sdk/api/generated/full/models/FanRemixContestEndingSoonNotificationAction.ts new file mode 100644 index 00000000000..2f89c8b6042 --- /dev/null +++ b/packages/sdk/src/sdk/api/generated/full/models/FanRemixContestEndingSoonNotificationAction.ts @@ -0,0 +1,101 @@ +/* tslint:disable */ +/* eslint-disable */ +// @ts-nocheck +/** + * API + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { exists, mapValues } from '../runtime'; +import type { FanRemixContestEndingSoonNotificationActionData } from './FanRemixContestEndingSoonNotificationActionData'; +import { + FanRemixContestEndingSoonNotificationActionDataFromJSON, + FanRemixContestEndingSoonNotificationActionDataFromJSONTyped, + FanRemixContestEndingSoonNotificationActionDataToJSON, +} from './FanRemixContestEndingSoonNotificationActionData'; + +/** + * + * @export + * @interface FanRemixContestEndingSoonNotificationAction + */ +export interface FanRemixContestEndingSoonNotificationAction { + /** + * + * @type {string} + * @memberof FanRemixContestEndingSoonNotificationAction + */ + specifier: string; + /** + * + * @type {string} + * @memberof FanRemixContestEndingSoonNotificationAction + */ + type: string; + /** + * + * @type {number} + * @memberof FanRemixContestEndingSoonNotificationAction + */ + timestamp: number; + /** + * + * @type {FanRemixContestEndingSoonNotificationActionData} + * @memberof FanRemixContestEndingSoonNotificationAction + */ + data: FanRemixContestEndingSoonNotificationActionData; +} + +/** + * Check if a given object implements the FanRemixContestEndingSoonNotificationAction interface. + */ +export function instanceOfFanRemixContestEndingSoonNotificationAction(value: object): value is FanRemixContestEndingSoonNotificationAction { + let isInstance = true; + isInstance = isInstance && "specifier" in value && value["specifier"] !== undefined; + isInstance = isInstance && "type" in value && value["type"] !== undefined; + isInstance = isInstance && "timestamp" in value && value["timestamp"] !== undefined; + isInstance = isInstance && "data" in value && value["data"] !== undefined; + + return isInstance; +} + +export function FanRemixContestEndingSoonNotificationActionFromJSON(json: any): FanRemixContestEndingSoonNotificationAction { + return FanRemixContestEndingSoonNotificationActionFromJSONTyped(json, false); +} + +export function FanRemixContestEndingSoonNotificationActionFromJSONTyped(json: any, ignoreDiscriminator: boolean): FanRemixContestEndingSoonNotificationAction { + if ((json === undefined) || (json === null)) { + return json; + } + return { + + 'specifier': json['specifier'], + 'type': json['type'], + 'timestamp': json['timestamp'], + 'data': FanRemixContestEndingSoonNotificationActionDataFromJSON(json['data']), + }; +} + +export function FanRemixContestEndingSoonNotificationActionToJSON(value?: FanRemixContestEndingSoonNotificationAction | null): any { + if (value === undefined) { + return undefined; + } + if (value === null) { + return null; + } + return { + + 'specifier': value.specifier, + 'type': value.type, + 'timestamp': value.timestamp, + 'data': FanRemixContestEndingSoonNotificationActionDataToJSON(value.data), + }; +} + diff --git a/packages/sdk/src/sdk/api/generated/full/models/RemixContestStartedNotificationActionData.ts b/packages/sdk/src/sdk/api/generated/full/models/FanRemixContestEndingSoonNotificationActionData.ts similarity index 55% rename from packages/sdk/src/sdk/api/generated/full/models/RemixContestStartedNotificationActionData.ts rename to packages/sdk/src/sdk/api/generated/full/models/FanRemixContestEndingSoonNotificationActionData.ts index 9bcf8f07236..cc233b818ee 100644 --- a/packages/sdk/src/sdk/api/generated/full/models/RemixContestStartedNotificationActionData.ts +++ b/packages/sdk/src/sdk/api/generated/full/models/FanRemixContestEndingSoonNotificationActionData.ts @@ -17,27 +17,27 @@ import { exists, mapValues } from '../runtime'; /** * * @export - * @interface RemixContestStartedNotificationActionData + * @interface FanRemixContestEndingSoonNotificationActionData */ -export interface RemixContestStartedNotificationActionData { +export interface FanRemixContestEndingSoonNotificationActionData { /** * * @type {string} - * @memberof RemixContestStartedNotificationActionData + * @memberof FanRemixContestEndingSoonNotificationActionData */ entityUserId: string; /** * * @type {string} - * @memberof RemixContestStartedNotificationActionData + * @memberof FanRemixContestEndingSoonNotificationActionData */ entityId: string; } /** - * Check if a given object implements the RemixContestStartedNotificationActionData interface. + * Check if a given object implements the FanRemixContestEndingSoonNotificationActionData interface. */ -export function instanceOfRemixContestStartedNotificationActionData(value: object): value is RemixContestStartedNotificationActionData { +export function instanceOfFanRemixContestEndingSoonNotificationActionData(value: object): value is FanRemixContestEndingSoonNotificationActionData { let isInstance = true; isInstance = isInstance && "entityUserId" in value && value["entityUserId"] !== undefined; isInstance = isInstance && "entityId" in value && value["entityId"] !== undefined; @@ -45,11 +45,11 @@ export function instanceOfRemixContestStartedNotificationActionData(value: objec return isInstance; } -export function RemixContestStartedNotificationActionDataFromJSON(json: any): RemixContestStartedNotificationActionData { - return RemixContestStartedNotificationActionDataFromJSONTyped(json, false); +export function FanRemixContestEndingSoonNotificationActionDataFromJSON(json: any): FanRemixContestEndingSoonNotificationActionData { + return FanRemixContestEndingSoonNotificationActionDataFromJSONTyped(json, false); } -export function RemixContestStartedNotificationActionDataFromJSONTyped(json: any, ignoreDiscriminator: boolean): RemixContestStartedNotificationActionData { +export function FanRemixContestEndingSoonNotificationActionDataFromJSONTyped(json: any, ignoreDiscriminator: boolean): FanRemixContestEndingSoonNotificationActionData { if ((json === undefined) || (json === null)) { return json; } @@ -60,7 +60,7 @@ export function RemixContestStartedNotificationActionDataFromJSONTyped(json: any }; } -export function RemixContestStartedNotificationActionDataToJSON(value?: RemixContestStartedNotificationActionData | null): any { +export function FanRemixContestEndingSoonNotificationActionDataToJSON(value?: FanRemixContestEndingSoonNotificationActionData | null): any { if (value === undefined) { return undefined; } diff --git a/packages/sdk/src/sdk/api/generated/full/models/RemixContestEndingSoonNotification.ts b/packages/sdk/src/sdk/api/generated/full/models/FanRemixContestStartedNotification.ts similarity index 52% rename from packages/sdk/src/sdk/api/generated/full/models/RemixContestEndingSoonNotification.ts rename to packages/sdk/src/sdk/api/generated/full/models/FanRemixContestStartedNotification.ts index f8199f7a0e8..18374a9ea0a 100644 --- a/packages/sdk/src/sdk/api/generated/full/models/RemixContestEndingSoonNotification.ts +++ b/packages/sdk/src/sdk/api/generated/full/models/FanRemixContestStartedNotification.ts @@ -14,55 +14,55 @@ */ import { exists, mapValues } from '../runtime'; -import type { RemixContestEndingSoonNotificationAction } from './RemixContestEndingSoonNotificationAction'; +import type { FanRemixContestStartedNotificationAction } from './FanRemixContestStartedNotificationAction'; import { - RemixContestEndingSoonNotificationActionFromJSON, - RemixContestEndingSoonNotificationActionFromJSONTyped, - RemixContestEndingSoonNotificationActionToJSON, -} from './RemixContestEndingSoonNotificationAction'; + FanRemixContestStartedNotificationActionFromJSON, + FanRemixContestStartedNotificationActionFromJSONTyped, + FanRemixContestStartedNotificationActionToJSON, +} from './FanRemixContestStartedNotificationAction'; /** * * @export - * @interface RemixContestEndingSoonNotification + * @interface FanRemixContestStartedNotification */ -export interface RemixContestEndingSoonNotification { +export interface FanRemixContestStartedNotification { /** * * @type {string} - * @memberof RemixContestEndingSoonNotification + * @memberof FanRemixContestStartedNotification */ type: string; /** * * @type {string} - * @memberof RemixContestEndingSoonNotification + * @memberof FanRemixContestStartedNotification */ groupId: string; /** * * @type {boolean} - * @memberof RemixContestEndingSoonNotification + * @memberof FanRemixContestStartedNotification */ isSeen: boolean; /** * * @type {number} - * @memberof RemixContestEndingSoonNotification + * @memberof FanRemixContestStartedNotification */ seenAt?: number; /** * - * @type {Array} - * @memberof RemixContestEndingSoonNotification + * @type {Array} + * @memberof FanRemixContestStartedNotification */ - actions: Array; + actions: Array; } /** - * Check if a given object implements the RemixContestEndingSoonNotification interface. + * Check if a given object implements the FanRemixContestStartedNotification interface. */ -export function instanceOfRemixContestEndingSoonNotification(value: object): value is RemixContestEndingSoonNotification { +export function instanceOfFanRemixContestStartedNotification(value: object): value is FanRemixContestStartedNotification { let isInstance = true; isInstance = isInstance && "type" in value && value["type"] !== undefined; isInstance = isInstance && "groupId" in value && value["groupId"] !== undefined; @@ -72,11 +72,11 @@ export function instanceOfRemixContestEndingSoonNotification(value: object): val return isInstance; } -export function RemixContestEndingSoonNotificationFromJSON(json: any): RemixContestEndingSoonNotification { - return RemixContestEndingSoonNotificationFromJSONTyped(json, false); +export function FanRemixContestStartedNotificationFromJSON(json: any): FanRemixContestStartedNotification { + return FanRemixContestStartedNotificationFromJSONTyped(json, false); } -export function RemixContestEndingSoonNotificationFromJSONTyped(json: any, ignoreDiscriminator: boolean): RemixContestEndingSoonNotification { +export function FanRemixContestStartedNotificationFromJSONTyped(json: any, ignoreDiscriminator: boolean): FanRemixContestStartedNotification { if ((json === undefined) || (json === null)) { return json; } @@ -86,11 +86,11 @@ export function RemixContestEndingSoonNotificationFromJSONTyped(json: any, ignor 'groupId': json['group_id'], 'isSeen': json['is_seen'], 'seenAt': !exists(json, 'seen_at') ? undefined : json['seen_at'], - 'actions': ((json['actions'] as Array).map(RemixContestEndingSoonNotificationActionFromJSON)), + 'actions': ((json['actions'] as Array).map(FanRemixContestStartedNotificationActionFromJSON)), }; } -export function RemixContestEndingSoonNotificationToJSON(value?: RemixContestEndingSoonNotification | null): any { +export function FanRemixContestStartedNotificationToJSON(value?: FanRemixContestStartedNotification | null): any { if (value === undefined) { return undefined; } @@ -103,7 +103,7 @@ export function RemixContestEndingSoonNotificationToJSON(value?: RemixContestEnd 'group_id': value.groupId, 'is_seen': value.isSeen, 'seen_at': value.seenAt, - 'actions': ((value.actions as Array).map(RemixContestEndingSoonNotificationActionToJSON)), + 'actions': ((value.actions as Array).map(FanRemixContestStartedNotificationActionToJSON)), }; } diff --git a/packages/sdk/src/sdk/api/generated/full/models/RemixContestEndingSoonNotificationAction.ts b/packages/sdk/src/sdk/api/generated/full/models/FanRemixContestStartedNotificationAction.ts similarity index 51% rename from packages/sdk/src/sdk/api/generated/full/models/RemixContestEndingSoonNotificationAction.ts rename to packages/sdk/src/sdk/api/generated/full/models/FanRemixContestStartedNotificationAction.ts index 55f34429398..97ea9df5fc0 100644 --- a/packages/sdk/src/sdk/api/generated/full/models/RemixContestEndingSoonNotificationAction.ts +++ b/packages/sdk/src/sdk/api/generated/full/models/FanRemixContestStartedNotificationAction.ts @@ -14,49 +14,49 @@ */ import { exists, mapValues } from '../runtime'; -import type { RemixContestEndingSoonNotificationActionData } from './RemixContestEndingSoonNotificationActionData'; +import type { FanRemixContestStartedNotificationActionData } from './FanRemixContestStartedNotificationActionData'; import { - RemixContestEndingSoonNotificationActionDataFromJSON, - RemixContestEndingSoonNotificationActionDataFromJSONTyped, - RemixContestEndingSoonNotificationActionDataToJSON, -} from './RemixContestEndingSoonNotificationActionData'; + FanRemixContestStartedNotificationActionDataFromJSON, + FanRemixContestStartedNotificationActionDataFromJSONTyped, + FanRemixContestStartedNotificationActionDataToJSON, +} from './FanRemixContestStartedNotificationActionData'; /** * * @export - * @interface RemixContestEndingSoonNotificationAction + * @interface FanRemixContestStartedNotificationAction */ -export interface RemixContestEndingSoonNotificationAction { +export interface FanRemixContestStartedNotificationAction { /** * * @type {string} - * @memberof RemixContestEndingSoonNotificationAction + * @memberof FanRemixContestStartedNotificationAction */ specifier: string; /** * * @type {string} - * @memberof RemixContestEndingSoonNotificationAction + * @memberof FanRemixContestStartedNotificationAction */ type: string; /** * * @type {number} - * @memberof RemixContestEndingSoonNotificationAction + * @memberof FanRemixContestStartedNotificationAction */ timestamp: number; /** * - * @type {RemixContestEndingSoonNotificationActionData} - * @memberof RemixContestEndingSoonNotificationAction + * @type {FanRemixContestStartedNotificationActionData} + * @memberof FanRemixContestStartedNotificationAction */ - data: RemixContestEndingSoonNotificationActionData; + data: FanRemixContestStartedNotificationActionData; } /** - * Check if a given object implements the RemixContestEndingSoonNotificationAction interface. + * Check if a given object implements the FanRemixContestStartedNotificationAction interface. */ -export function instanceOfRemixContestEndingSoonNotificationAction(value: object): value is RemixContestEndingSoonNotificationAction { +export function instanceOfFanRemixContestStartedNotificationAction(value: object): value is FanRemixContestStartedNotificationAction { let isInstance = true; isInstance = isInstance && "specifier" in value && value["specifier"] !== undefined; isInstance = isInstance && "type" in value && value["type"] !== undefined; @@ -66,11 +66,11 @@ export function instanceOfRemixContestEndingSoonNotificationAction(value: object return isInstance; } -export function RemixContestEndingSoonNotificationActionFromJSON(json: any): RemixContestEndingSoonNotificationAction { - return RemixContestEndingSoonNotificationActionFromJSONTyped(json, false); +export function FanRemixContestStartedNotificationActionFromJSON(json: any): FanRemixContestStartedNotificationAction { + return FanRemixContestStartedNotificationActionFromJSONTyped(json, false); } -export function RemixContestEndingSoonNotificationActionFromJSONTyped(json: any, ignoreDiscriminator: boolean): RemixContestEndingSoonNotificationAction { +export function FanRemixContestStartedNotificationActionFromJSONTyped(json: any, ignoreDiscriminator: boolean): FanRemixContestStartedNotificationAction { if ((json === undefined) || (json === null)) { return json; } @@ -79,11 +79,11 @@ export function RemixContestEndingSoonNotificationActionFromJSONTyped(json: any, 'specifier': json['specifier'], 'type': json['type'], 'timestamp': json['timestamp'], - 'data': RemixContestEndingSoonNotificationActionDataFromJSON(json['data']), + 'data': FanRemixContestStartedNotificationActionDataFromJSON(json['data']), }; } -export function RemixContestEndingSoonNotificationActionToJSON(value?: RemixContestEndingSoonNotificationAction | null): any { +export function FanRemixContestStartedNotificationActionToJSON(value?: FanRemixContestStartedNotificationAction | null): any { if (value === undefined) { return undefined; } @@ -95,7 +95,7 @@ export function RemixContestEndingSoonNotificationActionToJSON(value?: RemixCont 'specifier': value.specifier, 'type': value.type, 'timestamp': value.timestamp, - 'data': RemixContestEndingSoonNotificationActionDataToJSON(value.data), + 'data': FanRemixContestStartedNotificationActionDataToJSON(value.data), }; } diff --git a/packages/sdk/src/sdk/api/generated/full/models/RemixContestEndingSoonNotificationActionData.ts b/packages/sdk/src/sdk/api/generated/full/models/FanRemixContestStartedNotificationActionData.ts similarity index 59% rename from packages/sdk/src/sdk/api/generated/full/models/RemixContestEndingSoonNotificationActionData.ts rename to packages/sdk/src/sdk/api/generated/full/models/FanRemixContestStartedNotificationActionData.ts index 5a0053bfc72..b315f9bc46d 100644 --- a/packages/sdk/src/sdk/api/generated/full/models/RemixContestEndingSoonNotificationActionData.ts +++ b/packages/sdk/src/sdk/api/generated/full/models/FanRemixContestStartedNotificationActionData.ts @@ -17,27 +17,27 @@ import { exists, mapValues } from '../runtime'; /** * * @export - * @interface RemixContestEndingSoonNotificationActionData + * @interface FanRemixContestStartedNotificationActionData */ -export interface RemixContestEndingSoonNotificationActionData { +export interface FanRemixContestStartedNotificationActionData { /** * * @type {string} - * @memberof RemixContestEndingSoonNotificationActionData + * @memberof FanRemixContestStartedNotificationActionData */ entityUserId: string; /** * * @type {string} - * @memberof RemixContestEndingSoonNotificationActionData + * @memberof FanRemixContestStartedNotificationActionData */ entityId: string; } /** - * Check if a given object implements the RemixContestEndingSoonNotificationActionData interface. + * Check if a given object implements the FanRemixContestStartedNotificationActionData interface. */ -export function instanceOfRemixContestEndingSoonNotificationActionData(value: object): value is RemixContestEndingSoonNotificationActionData { +export function instanceOfFanRemixContestStartedNotificationActionData(value: object): value is FanRemixContestStartedNotificationActionData { let isInstance = true; isInstance = isInstance && "entityUserId" in value && value["entityUserId"] !== undefined; isInstance = isInstance && "entityId" in value && value["entityId"] !== undefined; @@ -45,11 +45,11 @@ export function instanceOfRemixContestEndingSoonNotificationActionData(value: ob return isInstance; } -export function RemixContestEndingSoonNotificationActionDataFromJSON(json: any): RemixContestEndingSoonNotificationActionData { - return RemixContestEndingSoonNotificationActionDataFromJSONTyped(json, false); +export function FanRemixContestStartedNotificationActionDataFromJSON(json: any): FanRemixContestStartedNotificationActionData { + return FanRemixContestStartedNotificationActionDataFromJSONTyped(json, false); } -export function RemixContestEndingSoonNotificationActionDataFromJSONTyped(json: any, ignoreDiscriminator: boolean): RemixContestEndingSoonNotificationActionData { +export function FanRemixContestStartedNotificationActionDataFromJSONTyped(json: any, ignoreDiscriminator: boolean): FanRemixContestStartedNotificationActionData { if ((json === undefined) || (json === null)) { return json; } @@ -60,7 +60,7 @@ export function RemixContestEndingSoonNotificationActionDataFromJSONTyped(json: }; } -export function RemixContestEndingSoonNotificationActionDataToJSON(value?: RemixContestEndingSoonNotificationActionData | null): any { +export function FanRemixContestStartedNotificationActionDataToJSON(value?: FanRemixContestStartedNotificationActionData | null): any { if (value === undefined) { return undefined; } diff --git a/packages/sdk/src/sdk/api/generated/full/models/Notification.ts b/packages/sdk/src/sdk/api/generated/full/models/Notification.ts index 52cd052551f..2b343195611 100644 --- a/packages/sdk/src/sdk/api/generated/full/models/Notification.ts +++ b/packages/sdk/src/sdk/api/generated/full/models/Notification.ts @@ -90,6 +90,27 @@ import { CreateNotificationFromJSONTyped, CreateNotificationToJSON, } from './CreateNotification'; +import { + FanRemixContestEndedNotification, + instanceOfFanRemixContestEndedNotification, + FanRemixContestEndedNotificationFromJSON, + FanRemixContestEndedNotificationFromJSONTyped, + FanRemixContestEndedNotificationToJSON, +} from './FanRemixContestEndedNotification'; +import { + FanRemixContestEndingSoonNotification, + instanceOfFanRemixContestEndingSoonNotification, + FanRemixContestEndingSoonNotificationFromJSON, + FanRemixContestEndingSoonNotificationFromJSONTyped, + FanRemixContestEndingSoonNotificationToJSON, +} from './FanRemixContestEndingSoonNotification'; +import { + FanRemixContestStartedNotification, + instanceOfFanRemixContestStartedNotification, + FanRemixContestStartedNotificationFromJSON, + FanRemixContestStartedNotificationFromJSONTyped, + FanRemixContestStartedNotificationToJSON, +} from './FanRemixContestStartedNotification'; import { FollowNotification, instanceOfFollowNotification, @@ -125,27 +146,6 @@ import { ReceiveTipNotificationFromJSONTyped, ReceiveTipNotificationToJSON, } from './ReceiveTipNotification'; -import { - RemixContestEndedNotification, - instanceOfRemixContestEndedNotification, - RemixContestEndedNotificationFromJSON, - RemixContestEndedNotificationFromJSONTyped, - RemixContestEndedNotificationToJSON, -} from './RemixContestEndedNotification'; -import { - RemixContestEndingSoonNotification, - instanceOfRemixContestEndingSoonNotification, - RemixContestEndingSoonNotificationFromJSON, - RemixContestEndingSoonNotificationFromJSONTyped, - RemixContestEndingSoonNotificationToJSON, -} from './RemixContestEndingSoonNotification'; -import { - RemixContestStartedNotification, - instanceOfRemixContestStartedNotification, - RemixContestStartedNotificationFromJSON, - RemixContestStartedNotificationFromJSONTyped, - RemixContestStartedNotificationToJSON, -} from './RemixContestStartedNotification'; import { RemixNotification, instanceOfRemixNotification, @@ -278,7 +278,7 @@ import { * * @export */ -export type Notification = { type: 'announcement' } & AnnouncementNotification | { type: 'approve_manager_request' } & ApproveManagerRequestNotification | { type: 'artist_remix_contest_ended' } & ArtistRemixContestEndedNotification | { type: 'challenge_reward' } & ChallengeRewardNotification | { type: 'claimable_reward' } & ClaimableRewardNotification | { type: 'comment' } & CommentNotification | { type: 'comment_mention' } & CommentMentionNotification | { type: 'comment_reaction' } & CommentReactionNotification | { type: 'comment_thread' } & CommentThreadNotification | { type: 'cosign' } & CosignNotification | { type: 'create' } & CreateNotification | { type: 'follow' } & FollowNotification | { type: 'listen_streak_reminder' } & ListenStreakReminderNotification | { type: 'milestone' } & MilestoneNotification | { type: 'reaction' } & ReactionNotification | { type: 'remix' } & RemixNotification | { type: 'remix_contest_ended' } & RemixContestEndedNotification | { type: 'remix_contest_ending_soon' } & RemixContestEndingSoonNotification | { type: 'remix_contest_started' } & RemixContestStartedNotification | { type: 'repost' } & RepostNotification | { type: 'repost_of_repost' } & RepostOfRepostNotification | { type: 'request_manager' } & RequestManagerNotification | { type: 'save' } & SaveNotification | { type: 'save_of_repost' } & SaveOfRepostNotification | { type: 'supporter_dethroned' } & SupporterDethronedNotification | { type: 'supporter_rank_up' } & SupporterRankUpNotification | { type: 'supporting_rank_up' } & SupporterRankUpNotification | { type: 'tastemaker' } & TastemakerNotification | { type: 'tier_change' } & TierChangeNotification | { type: 'tip_receive' } & ReceiveTipNotification | { type: 'tip_send' } & SendTipNotification | { type: 'track_added_to_playlist' } & TrackAddedToPlaylistNotification | { type: 'track_added_to_purchased_album' } & TrackAddedToPurchasedAlbumNotification | { type: 'trending' } & TrendingNotification | { type: 'trending_playlist' } & TrendingPlaylistNotification | { type: 'trending_underground' } & TrendingUndergroundNotification | { type: 'usdc_purchase_buyer' } & UsdcPurchaseBuyerNotification | { type: 'usdc_purchase_seller' } & UsdcPurchaseSellerNotification; +export type Notification = { type: 'announcement' } & AnnouncementNotification | { type: 'approve_manager_request' } & ApproveManagerRequestNotification | { type: 'artist_remix_contest_ended' } & ArtistRemixContestEndedNotification | { type: 'challenge_reward' } & ChallengeRewardNotification | { type: 'claimable_reward' } & ClaimableRewardNotification | { type: 'comment' } & CommentNotification | { type: 'comment_mention' } & CommentMentionNotification | { type: 'comment_reaction' } & CommentReactionNotification | { type: 'comment_thread' } & CommentThreadNotification | { type: 'cosign' } & CosignNotification | { type: 'create' } & CreateNotification | { type: 'fan_remix_contest_ended' } & FanRemixContestEndedNotification | { type: 'fan_remix_contest_ending_soon' } & FanRemixContestEndingSoonNotification | { type: 'fan_remix_contest_started' } & FanRemixContestStartedNotification | { type: 'follow' } & FollowNotification | { type: 'listen_streak_reminder' } & ListenStreakReminderNotification | { type: 'milestone' } & MilestoneNotification | { type: 'reaction' } & ReactionNotification | { type: 'remix' } & RemixNotification | { type: 'repost' } & RepostNotification | { type: 'repost_of_repost' } & RepostOfRepostNotification | { type: 'request_manager' } & RequestManagerNotification | { type: 'save' } & SaveNotification | { type: 'save_of_repost' } & SaveOfRepostNotification | { type: 'supporter_dethroned' } & SupporterDethronedNotification | { type: 'supporter_rank_up' } & SupporterRankUpNotification | { type: 'supporting_rank_up' } & SupporterRankUpNotification | { type: 'tastemaker' } & TastemakerNotification | { type: 'tier_change' } & TierChangeNotification | { type: 'tip_receive' } & ReceiveTipNotification | { type: 'tip_send' } & SendTipNotification | { type: 'track_added_to_playlist' } & TrackAddedToPlaylistNotification | { type: 'track_added_to_purchased_album' } & TrackAddedToPurchasedAlbumNotification | { type: 'trending' } & TrendingNotification | { type: 'trending_playlist' } & TrendingPlaylistNotification | { type: 'trending_underground' } & TrendingUndergroundNotification | { type: 'usdc_purchase_buyer' } & UsdcPurchaseBuyerNotification | { type: 'usdc_purchase_seller' } & UsdcPurchaseSellerNotification; export function NotificationFromJSON(json: any): Notification { return NotificationFromJSONTyped(json, false); @@ -311,6 +311,12 @@ export function NotificationFromJSONTyped(json: any, ignoreDiscriminator: boolea return {...CosignNotificationFromJSONTyped(json, true), type: 'cosign'}; case 'create': return {...CreateNotificationFromJSONTyped(json, true), type: 'create'}; + case 'fan_remix_contest_ended': + return {...FanRemixContestEndedNotificationFromJSONTyped(json, true), type: 'fan_remix_contest_ended'}; + case 'fan_remix_contest_ending_soon': + return {...FanRemixContestEndingSoonNotificationFromJSONTyped(json, true), type: 'fan_remix_contest_ending_soon'}; + case 'fan_remix_contest_started': + return {...FanRemixContestStartedNotificationFromJSONTyped(json, true), type: 'fan_remix_contest_started'}; case 'follow': return {...FollowNotificationFromJSONTyped(json, true), type: 'follow'}; case 'listen_streak_reminder': @@ -321,12 +327,6 @@ export function NotificationFromJSONTyped(json: any, ignoreDiscriminator: boolea return {...ReactionNotificationFromJSONTyped(json, true), type: 'reaction'}; case 'remix': return {...RemixNotificationFromJSONTyped(json, true), type: 'remix'}; - case 'remix_contest_ended': - return {...RemixContestEndedNotificationFromJSONTyped(json, true), type: 'remix_contest_ended'}; - case 'remix_contest_ending_soon': - return {...RemixContestEndingSoonNotificationFromJSONTyped(json, true), type: 'remix_contest_ending_soon'}; - case 'remix_contest_started': - return {...RemixContestStartedNotificationFromJSONTyped(json, true), type: 'remix_contest_started'}; case 'repost': return {...RepostNotificationFromJSONTyped(json, true), type: 'repost'}; case 'repost_of_repost': @@ -400,6 +400,12 @@ export function NotificationToJSON(value?: Notification | null): any { return CosignNotificationToJSON(value); case 'create': return CreateNotificationToJSON(value); + case 'fan_remix_contest_ended': + return FanRemixContestEndedNotificationToJSON(value); + case 'fan_remix_contest_ending_soon': + return FanRemixContestEndingSoonNotificationToJSON(value); + case 'fan_remix_contest_started': + return FanRemixContestStartedNotificationToJSON(value); case 'follow': return FollowNotificationToJSON(value); case 'listen_streak_reminder': @@ -410,12 +416,6 @@ export function NotificationToJSON(value?: Notification | null): any { return ReactionNotificationToJSON(value); case 'remix': return RemixNotificationToJSON(value); - case 'remix_contest_ended': - return RemixContestEndedNotificationToJSON(value); - case 'remix_contest_ending_soon': - return RemixContestEndingSoonNotificationToJSON(value); - case 'remix_contest_started': - return RemixContestStartedNotificationToJSON(value); case 'repost': return RepostNotificationToJSON(value); case 'repost_of_repost': diff --git a/packages/sdk/src/sdk/api/generated/full/models/RemixContestEndedNotification.ts b/packages/sdk/src/sdk/api/generated/full/models/RemixContestEndedNotification.ts deleted file mode 100644 index cf7e9b26cdd..00000000000 --- a/packages/sdk/src/sdk/api/generated/full/models/RemixContestEndedNotification.ts +++ /dev/null @@ -1,109 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -// @ts-nocheck -/** - * API - * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - * - * The version of the OpenAPI document: 1.0 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - -import { exists, mapValues } from '../runtime'; -import type { RemixContestEndedNotificationAction } from './RemixContestEndedNotificationAction'; -import { - RemixContestEndedNotificationActionFromJSON, - RemixContestEndedNotificationActionFromJSONTyped, - RemixContestEndedNotificationActionToJSON, -} from './RemixContestEndedNotificationAction'; - -/** - * - * @export - * @interface RemixContestEndedNotification - */ -export interface RemixContestEndedNotification { - /** - * - * @type {string} - * @memberof RemixContestEndedNotification - */ - type: string; - /** - * - * @type {string} - * @memberof RemixContestEndedNotification - */ - groupId: string; - /** - * - * @type {boolean} - * @memberof RemixContestEndedNotification - */ - isSeen: boolean; - /** - * - * @type {number} - * @memberof RemixContestEndedNotification - */ - seenAt?: number; - /** - * - * @type {Array} - * @memberof RemixContestEndedNotification - */ - actions: Array; -} - -/** - * Check if a given object implements the RemixContestEndedNotification interface. - */ -export function instanceOfRemixContestEndedNotification(value: object): value is RemixContestEndedNotification { - let isInstance = true; - isInstance = isInstance && "type" in value && value["type"] !== undefined; - isInstance = isInstance && "groupId" in value && value["groupId"] !== undefined; - isInstance = isInstance && "isSeen" in value && value["isSeen"] !== undefined; - isInstance = isInstance && "actions" in value && value["actions"] !== undefined; - - return isInstance; -} - -export function RemixContestEndedNotificationFromJSON(json: any): RemixContestEndedNotification { - return RemixContestEndedNotificationFromJSONTyped(json, false); -} - -export function RemixContestEndedNotificationFromJSONTyped(json: any, ignoreDiscriminator: boolean): RemixContestEndedNotification { - if ((json === undefined) || (json === null)) { - return json; - } - return { - - 'type': json['type'], - 'groupId': json['group_id'], - 'isSeen': json['is_seen'], - 'seenAt': !exists(json, 'seen_at') ? undefined : json['seen_at'], - 'actions': ((json['actions'] as Array).map(RemixContestEndedNotificationActionFromJSON)), - }; -} - -export function RemixContestEndedNotificationToJSON(value?: RemixContestEndedNotification | null): any { - if (value === undefined) { - return undefined; - } - if (value === null) { - return null; - } - return { - - 'type': value.type, - 'group_id': value.groupId, - 'is_seen': value.isSeen, - 'seen_at': value.seenAt, - 'actions': ((value.actions as Array).map(RemixContestEndedNotificationActionToJSON)), - }; -} - diff --git a/packages/sdk/src/sdk/api/generated/full/models/RemixContestEndedNotificationAction.ts b/packages/sdk/src/sdk/api/generated/full/models/RemixContestEndedNotificationAction.ts deleted file mode 100644 index 14fc803ea1c..00000000000 --- a/packages/sdk/src/sdk/api/generated/full/models/RemixContestEndedNotificationAction.ts +++ /dev/null @@ -1,101 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -// @ts-nocheck -/** - * API - * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - * - * The version of the OpenAPI document: 1.0 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - -import { exists, mapValues } from '../runtime'; -import type { RemixContestEndedNotificationActionData } from './RemixContestEndedNotificationActionData'; -import { - RemixContestEndedNotificationActionDataFromJSON, - RemixContestEndedNotificationActionDataFromJSONTyped, - RemixContestEndedNotificationActionDataToJSON, -} from './RemixContestEndedNotificationActionData'; - -/** - * - * @export - * @interface RemixContestEndedNotificationAction - */ -export interface RemixContestEndedNotificationAction { - /** - * - * @type {string} - * @memberof RemixContestEndedNotificationAction - */ - specifier: string; - /** - * - * @type {string} - * @memberof RemixContestEndedNotificationAction - */ - type: string; - /** - * - * @type {number} - * @memberof RemixContestEndedNotificationAction - */ - timestamp: number; - /** - * - * @type {RemixContestEndedNotificationActionData} - * @memberof RemixContestEndedNotificationAction - */ - data: RemixContestEndedNotificationActionData; -} - -/** - * Check if a given object implements the RemixContestEndedNotificationAction interface. - */ -export function instanceOfRemixContestEndedNotificationAction(value: object): value is RemixContestEndedNotificationAction { - let isInstance = true; - isInstance = isInstance && "specifier" in value && value["specifier"] !== undefined; - isInstance = isInstance && "type" in value && value["type"] !== undefined; - isInstance = isInstance && "timestamp" in value && value["timestamp"] !== undefined; - isInstance = isInstance && "data" in value && value["data"] !== undefined; - - return isInstance; -} - -export function RemixContestEndedNotificationActionFromJSON(json: any): RemixContestEndedNotificationAction { - return RemixContestEndedNotificationActionFromJSONTyped(json, false); -} - -export function RemixContestEndedNotificationActionFromJSONTyped(json: any, ignoreDiscriminator: boolean): RemixContestEndedNotificationAction { - if ((json === undefined) || (json === null)) { - return json; - } - return { - - 'specifier': json['specifier'], - 'type': json['type'], - 'timestamp': json['timestamp'], - 'data': RemixContestEndedNotificationActionDataFromJSON(json['data']), - }; -} - -export function RemixContestEndedNotificationActionToJSON(value?: RemixContestEndedNotificationAction | null): any { - if (value === undefined) { - return undefined; - } - if (value === null) { - return null; - } - return { - - 'specifier': value.specifier, - 'type': value.type, - 'timestamp': value.timestamp, - 'data': RemixContestEndedNotificationActionDataToJSON(value.data), - }; -} - diff --git a/packages/sdk/src/sdk/api/generated/full/models/RemixContestStartedNotificationAction.ts b/packages/sdk/src/sdk/api/generated/full/models/RemixContestStartedNotificationAction.ts deleted file mode 100644 index 1e10046cae9..00000000000 --- a/packages/sdk/src/sdk/api/generated/full/models/RemixContestStartedNotificationAction.ts +++ /dev/null @@ -1,101 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -// @ts-nocheck -/** - * API - * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - * - * The version of the OpenAPI document: 1.0 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - -import { exists, mapValues } from '../runtime'; -import type { RemixContestStartedNotificationActionData } from './RemixContestStartedNotificationActionData'; -import { - RemixContestStartedNotificationActionDataFromJSON, - RemixContestStartedNotificationActionDataFromJSONTyped, - RemixContestStartedNotificationActionDataToJSON, -} from './RemixContestStartedNotificationActionData'; - -/** - * - * @export - * @interface RemixContestStartedNotificationAction - */ -export interface RemixContestStartedNotificationAction { - /** - * - * @type {string} - * @memberof RemixContestStartedNotificationAction - */ - specifier: string; - /** - * - * @type {string} - * @memberof RemixContestStartedNotificationAction - */ - type: string; - /** - * - * @type {number} - * @memberof RemixContestStartedNotificationAction - */ - timestamp: number; - /** - * - * @type {RemixContestStartedNotificationActionData} - * @memberof RemixContestStartedNotificationAction - */ - data: RemixContestStartedNotificationActionData; -} - -/** - * Check if a given object implements the RemixContestStartedNotificationAction interface. - */ -export function instanceOfRemixContestStartedNotificationAction(value: object): value is RemixContestStartedNotificationAction { - let isInstance = true; - isInstance = isInstance && "specifier" in value && value["specifier"] !== undefined; - isInstance = isInstance && "type" in value && value["type"] !== undefined; - isInstance = isInstance && "timestamp" in value && value["timestamp"] !== undefined; - isInstance = isInstance && "data" in value && value["data"] !== undefined; - - return isInstance; -} - -export function RemixContestStartedNotificationActionFromJSON(json: any): RemixContestStartedNotificationAction { - return RemixContestStartedNotificationActionFromJSONTyped(json, false); -} - -export function RemixContestStartedNotificationActionFromJSONTyped(json: any, ignoreDiscriminator: boolean): RemixContestStartedNotificationAction { - if ((json === undefined) || (json === null)) { - return json; - } - return { - - 'specifier': json['specifier'], - 'type': json['type'], - 'timestamp': json['timestamp'], - 'data': RemixContestStartedNotificationActionDataFromJSON(json['data']), - }; -} - -export function RemixContestStartedNotificationActionToJSON(value?: RemixContestStartedNotificationAction | null): any { - if (value === undefined) { - return undefined; - } - if (value === null) { - return null; - } - return { - - 'specifier': value.specifier, - 'type': value.type, - 'timestamp': value.timestamp, - 'data': RemixContestStartedNotificationActionDataToJSON(value.data), - }; -} - diff --git a/packages/sdk/src/sdk/api/generated/full/models/index.ts b/packages/sdk/src/sdk/api/generated/full/models/index.ts index de2ea93ece6..5efa38502b1 100644 --- a/packages/sdk/src/sdk/api/generated/full/models/index.ts +++ b/packages/sdk/src/sdk/api/generated/full/models/index.ts @@ -57,6 +57,15 @@ export * from './CreateNotificationActionData'; export * from './CreatePlaylistNotificationActionData'; export * from './CreateTrackNotificationActionData'; export * from './DataAndType'; +export * from './FanRemixContestEndedNotification'; +export * from './FanRemixContestEndedNotificationAction'; +export * from './FanRemixContestEndedNotificationActionData'; +export * from './FanRemixContestEndingSoonNotification'; +export * from './FanRemixContestEndingSoonNotificationAction'; +export * from './FanRemixContestEndingSoonNotificationActionData'; +export * from './FanRemixContestStartedNotification'; +export * from './FanRemixContestStartedNotificationAction'; +export * from './FanRemixContestStartedNotificationActionData'; export * from './Favorite'; export * from './FieldVisibility'; export * from './FollowGate'; @@ -141,15 +150,6 @@ export * from './ReceiveTipNotificationAction'; export * from './ReceiveTipNotificationActionData'; export * from './Related'; export * from './RelatedArtistResponseFull'; -export * from './RemixContestEndedNotification'; -export * from './RemixContestEndedNotificationAction'; -export * from './RemixContestEndedNotificationActionData'; -export * from './RemixContestEndingSoonNotification'; -export * from './RemixContestEndingSoonNotificationAction'; -export * from './RemixContestEndingSoonNotificationActionData'; -export * from './RemixContestStartedNotification'; -export * from './RemixContestStartedNotificationAction'; -export * from './RemixContestStartedNotificationActionData'; export * from './RemixNotification'; export * from './RemixNotificationAction'; export * from './RemixNotificationActionData'; diff --git a/packages/web/src/components/notification/Notification/RemixContestEndedNotification.tsx b/packages/web/src/components/notification/Notification/FanRemixContestEndedNotification.tsx similarity index 86% rename from packages/web/src/components/notification/Notification/RemixContestEndedNotification.tsx rename to packages/web/src/components/notification/Notification/FanRemixContestEndedNotification.tsx index 1c33a87dad9..03db9e44574 100644 --- a/packages/web/src/components/notification/Notification/RemixContestEndedNotification.tsx +++ b/packages/web/src/components/notification/Notification/FanRemixContestEndedNotification.tsx @@ -3,7 +3,7 @@ import { useCallback } from 'react' import { useTrack, useUser } from '@audius/common/api' import { Entity, - RemixContestEndedNotification as RemixContestEndedNotificationType, + FanRemixContestEndedNotification as FanRemixContestEndedNotificationType, TrackEntity } from '@audius/common/store' import { Flex, IconTrophy } from '@audius/harmony' @@ -27,12 +27,12 @@ const messages = { "'s remix contest has closed and winners should be announced soon. Good luck!" } -type RemixContestEndedNotificationProps = { - notification: RemixContestEndedNotificationType +type FanRemixContestEndedNotificationProps = { + notification: FanRemixContestEndedNotificationType } -export const RemixContestEndedNotification = ( - props: RemixContestEndedNotificationProps +export const FanRemixContestEndedNotification = ( + props: FanRemixContestEndedNotificationProps ) => { const { notification } = props const { timeLabel, isViewed, entityId, entityUserId } = notification @@ -58,8 +58,8 @@ export const RemixContestEndedNotification = ( {' '} + {messages.description}{' '} - {messages.description} diff --git a/packages/web/src/components/notification/Notification/RemixContestStartedNotification.tsx b/packages/web/src/components/notification/Notification/FanRemixContestStartedNotification.tsx similarity index 87% rename from packages/web/src/components/notification/Notification/RemixContestStartedNotification.tsx rename to packages/web/src/components/notification/Notification/FanRemixContestStartedNotification.tsx index 354e4c2b9ae..55d6135747a 100644 --- a/packages/web/src/components/notification/Notification/RemixContestStartedNotification.tsx +++ b/packages/web/src/components/notification/Notification/FanRemixContestStartedNotification.tsx @@ -3,7 +3,7 @@ import { useCallback } from 'react' import { useTrack, useUser } from '@audius/common/api' import { Entity, - RemixContestStartedNotification as RemixContestStartedNotificationType, + FanRemixContestStartedNotification as FanRemixContestStartedNotificationType, TrackEntity } from '@audius/common/store' import { Flex, IconTrophy } from '@audius/harmony' @@ -26,12 +26,12 @@ const messages = { description: 'started a new remix contest for' } -type RemixContestStartedNotificationProps = { - notification: RemixContestStartedNotificationType +type FanRemixContestStartedNotificationProps = { + notification: FanRemixContestStartedNotificationType } -export const RemixContestStartedNotification = ( - props: RemixContestStartedNotificationProps +export const FanRemixContestStartedNotification = ( + props: FanRemixContestStartedNotificationProps ) => { const { notification } = props const { timeLabel, isViewed, entityId, entityUserId } = notification diff --git a/packages/web/src/components/notification/Notification/Notification.tsx b/packages/web/src/components/notification/Notification/Notification.tsx index e612fe6d045..9c85a2b6402 100644 --- a/packages/web/src/components/notification/Notification/Notification.tsx +++ b/packages/web/src/components/notification/Notification/Notification.tsx @@ -15,14 +15,14 @@ import { CommentMentionNotification } from './CommentMentionNotification' import { CommentNotification } from './CommentNotification' import { CommentReactionNotification } from './CommentReactionNotification' import { CommentThreadNotification } from './CommentThreadNotification' +import { FanRemixContestEndedNotification } from './FanRemixContestEndedNotification' +import { FanRemixContestStartedNotification } from './FanRemixContestStartedNotification' import { FavoriteNotification } from './FavoriteNotification' import { FavoriteOfRepostNotification } from './FavoriteOfRepostNotification' import { FollowNotification } from './FollowNotification' import { ListenStreakReminderNotification } from './ListenStreakReminderNotification' import { MilestoneNotification } from './MilestoneNotification' -import { RemixContestEndedNotification } from './RemixContestEndedNotification' -import { RemixContestEndingSoonNotification } from './RemixContestEndingSoonNotification' -import { RemixContestStartedNotification } from './RemixContestStartedNotification' +import { FanRemixContestEndingSoonNotification } from './RemixContestEndingSoonNotification' import { RemixCosignNotification } from './RemixCosignNotification' import { RemixCreateNotification } from './RemixCreateNotification' import { RepostNotification } from './RepostNotification' @@ -157,15 +157,9 @@ export const Notification = (props: NotificationProps) => { case NotificationType.ListenStreakReminder: { return } - case NotificationType.RemixContestStarted: { - return - } - case NotificationType.RemixContestEnded: { - return - } - case NotificationType.RemixContestEndingSoon: { + case NotificationType.FanRemixContestEndingSoon: { return ( - + ) } case NotificationType.ArtistRemixContestEnded: { @@ -173,6 +167,14 @@ export const Notification = (props: NotificationProps) => { ) } + case NotificationType.FanRemixContestStarted: { + return ( + + ) + } + case NotificationType.FanRemixContestEnded: { + return + } default: { return null } diff --git a/packages/web/src/components/notification/Notification/RemixContestEndingSoonNotification.tsx b/packages/web/src/components/notification/Notification/RemixContestEndingSoonNotification.tsx index 7510c694e5e..aef3421baa0 100644 --- a/packages/web/src/components/notification/Notification/RemixContestEndingSoonNotification.tsx +++ b/packages/web/src/components/notification/Notification/RemixContestEndingSoonNotification.tsx @@ -3,7 +3,7 @@ import { useCallback } from 'react' import { useTrack, useUser } from '@audius/common/api' import { Entity, - RemixContestEndingSoonNotification as RemixContestEndingSoonNotificationType, + FanRemixContestEndingSoonNotification as FanRemixContestEndingSoonNotificationType, TrackEntity } from '@audius/common/store' import { Flex, IconTrophy } from '@audius/harmony' @@ -27,12 +27,12 @@ const messages = { " has a remix contest ending in 72 hours - don't forget to submit your remix" } -type RemixContestEndingSoonNotificationProps = { - notification: RemixContestEndingSoonNotificationType +type FanRemixContestEndingSoonNotificationProps = { + notification: FanRemixContestEndingSoonNotificationType } -export const RemixContestEndingSoonNotification = ( - props: RemixContestEndingSoonNotificationProps +export const FanRemixContestEndingSoonNotification = ( + props: FanRemixContestEndingSoonNotificationProps ) => { const { notification } = props const { timeLabel, isViewed, entityId, entityUserId } = notification From 250c649c75bd5ebf8d806f71f663fbb5c86cd796 Mon Sep 17 00:00:00 2001 From: Dharit Tantiviramanond Date: Wed, 7 May 2025 16:21:58 -0400 Subject: [PATCH 2/8] changeset --- .changeset/ninety-icons-dance.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/ninety-icons-dance.md diff --git a/.changeset/ninety-icons-dance.md b/.changeset/ninety-icons-dance.md new file mode 100644 index 00000000000..8fe939ef71f --- /dev/null +++ b/.changeset/ninety-icons-dance.md @@ -0,0 +1,5 @@ +--- +"@audius/sdk": patch +--- + +Add 'fan' prefix to remix contest notifs From c522a4c56de437f983a18607c4b58675e310f3da Mon Sep 17 00:00:00 2001 From: Dharit Tantiviramanond Date: Wed, 7 May 2025 16:33:28 -0400 Subject: [PATCH 3/8] tests --- ...t_fan_remix_contest_ended_notification.py} | 16 +++++++-------- ...remix_contest_ending_soon_notification.py} | 20 +++++++++++-------- ...fan_remix_contest_started_notification.py} | 16 +++++++-------- 3 files changed, 28 insertions(+), 24 deletions(-) rename packages/discovery-provider/integration_tests/tasks/{test_remix_contest_ended_notification.py => test_fan_remix_contest_ended_notification.py} (91%) rename packages/discovery-provider/integration_tests/tasks/{test_remix_contest_ending_soon_notification.py => test_fan_remix_contest_ending_soon_notification.py} (88%) rename packages/discovery-provider/integration_tests/tasks/{test_remix_contest_started_notification.py => test_fan_remix_contest_started_notification.py} (90%) diff --git a/packages/discovery-provider/integration_tests/tasks/test_remix_contest_ended_notification.py b/packages/discovery-provider/integration_tests/tasks/test_fan_remix_contest_ended_notification.py similarity index 91% rename from packages/discovery-provider/integration_tests/tasks/test_remix_contest_ended_notification.py rename to packages/discovery-provider/integration_tests/tasks/test_fan_remix_contest_ended_notification.py index d504fb111b5..231805e595d 100644 --- a/packages/discovery-provider/integration_tests/tasks/test_remix_contest_ended_notification.py +++ b/packages/discovery-provider/integration_tests/tasks/test_fan_remix_contest_ended_notification.py @@ -17,7 +17,7 @@ TEST_REMIXER_ID_2 = 3 -def test_remix_contest_ended_notification_for_remixers(app): +def test_fan_remix_contest_ended_notification_for_remixers(app): """Test that remix contest ended notification is created for all remixers of the contest track""" with app.app_context(): db = get_db() @@ -96,7 +96,7 @@ def test_remix_contest_ended_notification_for_remixers(app): create_fan_remix_contest_ended_notifications(session) notifications = ( session.query(Notification) - .filter(Notification.type == NotificationType.REMIX_CONTEST_ENDED) + .filter(Notification.type == NotificationType.FAN_REMIX_CONTEST_ENDED) .all() ) notified_user_ids = set() @@ -105,15 +105,15 @@ def test_remix_contest_ended_notification_for_remixers(app): # entity_user_id should be the original artist assert notification.data["entity_user_id"] == TEST_EVENT_CREATOR_ID assert notification.data["entity_id"] == TEST_TRACK_ID - assert notification.type == NotificationType.REMIX_CONTEST_ENDED - assert notification.group_id.startswith("remix_contest_ended:") + assert notification.type == NotificationType.FAN_REMIX_CONTEST_ENDED + assert notification.group_id.startswith("fan_remix_contest_ended:") # Should notify both remixers assert TEST_REMIXER_ID_1 in notified_user_ids assert TEST_REMIXER_ID_2 in notified_user_ids assert len(notified_user_ids) == 2 -def test_remix_contest_ended_notification_no_duplicate_for_multiple_remixes(app): +def test_fan_remix_contest_ended_notification_no_duplicate_for_multiple_remixes(app): """Test that a user who submitted multiple remixes only gets one notification""" with app.app_context(): db = get_db() @@ -186,7 +186,7 @@ def test_remix_contest_ended_notification_no_duplicate_for_multiple_remixes(app) create_fan_remix_contest_ended_notifications(session) notifications = ( session.query(Notification) - .filter(Notification.type == NotificationType.REMIX_CONTEST_ENDED) + .filter(Notification.type == NotificationType.FAN_REMIX_CONTEST_ENDED) .all() ) notif_count = 0 @@ -195,6 +195,6 @@ def test_remix_contest_ended_notification_no_duplicate_for_multiple_remixes(app) notif_count += 1 assert notification.data["entity_user_id"] == TEST_EVENT_CREATOR_ID assert notification.data["entity_id"] == TEST_TRACK_ID - assert notification.type == NotificationType.REMIX_CONTEST_ENDED - assert notification.group_id.startswith("remix_contest_ended:") + assert notification.type == NotificationType.FAN_REMIX_CONTEST_ENDED + assert notification.group_id.startswith("fan_remix_contest_ended:") assert notif_count == 1 diff --git a/packages/discovery-provider/integration_tests/tasks/test_remix_contest_ending_soon_notification.py b/packages/discovery-provider/integration_tests/tasks/test_fan_remix_contest_ending_soon_notification.py similarity index 88% rename from packages/discovery-provider/integration_tests/tasks/test_remix_contest_ending_soon_notification.py rename to packages/discovery-provider/integration_tests/tasks/test_fan_remix_contest_ending_soon_notification.py index 4299f882a97..132705462df 100644 --- a/packages/discovery-provider/integration_tests/tasks/test_remix_contest_ending_soon_notification.py +++ b/packages/discovery-provider/integration_tests/tasks/test_fan_remix_contest_ending_soon_notification.py @@ -17,7 +17,7 @@ TEST_FAVORITER_ID = 3 -def test_remix_contest_ending_soon_notification_for_followers_and_favoriters(app): +def test_fan_remix_contest_ending_soon_notification_for_followers_and_favoriters(app): """Test that remix contest ending soon notification is created for followers and users who favorited the track""" with app.app_context(): db = get_db() @@ -94,7 +94,7 @@ def test_remix_contest_ending_soon_notification_for_followers_and_favoriters(app create_fan_remix_contest_ending_soon_notifications(session) notifications = ( session.query(Notification) - .filter(Notification.type == NotificationType.REMIX_CONTEST_ENDING_SOON) + .filter(Notification.type == NotificationType.FAN_REMIX_CONTEST_ENDING_SOON) .all() ) notified_user_ids = set() @@ -102,15 +102,15 @@ def test_remix_contest_ending_soon_notification_for_followers_and_favoriters(app notified_user_ids.update(notification.user_ids) assert notification.data["entity_user_id"] == TEST_EVENT_CREATOR_ID assert notification.data["entity_id"] == TEST_TRACK_ID - assert notification.type == NotificationType.REMIX_CONTEST_ENDING_SOON - assert notification.group_id.startswith("remix_contest_ending_soon:") + assert notification.type == NotificationType.FAN_REMIX_CONTEST_ENDING_SOON + assert notification.group_id.startswith("fan_remix_contest_ending_soon:") # Should notify both the follower and the favoriter assert TEST_FOLLOWER_ID in notified_user_ids assert TEST_FAVORITER_ID in notified_user_ids assert len(notified_user_ids) == 2 -def test_remix_contest_ending_soon_notification_no_duplicate_for_follower_and_favoriter( +def test_fan_remix_contest_ending_soon_notification_no_duplicate_for_follower_and_favoriter( app, ): """Test that a user who both follows the creator and saved the track only gets one notification""" @@ -184,7 +184,7 @@ def test_remix_contest_ending_soon_notification_no_duplicate_for_follower_and_fa create_fan_remix_contest_ending_soon_notifications(session) notifications = ( session.query(Notification) - .filter(Notification.type == NotificationType.REMIX_CONTEST_ENDING_SOON) + .filter(Notification.type == NotificationType.FAN_REMIX_CONTEST_ENDING_SOON) .all() ) notif_count = 0 @@ -193,6 +193,10 @@ def test_remix_contest_ending_soon_notification_no_duplicate_for_follower_and_fa notif_count += 1 assert notification.data["entity_user_id"] == TEST_EVENT_CREATOR_ID assert notification.data["entity_id"] == TEST_TRACK_ID - assert notification.type == NotificationType.REMIX_CONTEST_ENDING_SOON - assert notification.group_id.startswith("remix_contest_ending_soon:") + assert ( + notification.type == NotificationType.FAN_REMIX_CONTEST_ENDING_SOON + ) + assert notification.group_id.startswith( + "fan_remix_contest_ending_soon:" + ) assert notif_count == 1 diff --git a/packages/discovery-provider/integration_tests/tasks/test_remix_contest_started_notification.py b/packages/discovery-provider/integration_tests/tasks/test_fan_remix_contest_started_notification.py similarity index 90% rename from packages/discovery-provider/integration_tests/tasks/test_remix_contest_started_notification.py rename to packages/discovery-provider/integration_tests/tasks/test_fan_remix_contest_started_notification.py index 09c3e6c9d85..6b446feae1d 100644 --- a/packages/discovery-provider/integration_tests/tasks/test_remix_contest_started_notification.py +++ b/packages/discovery-provider/integration_tests/tasks/test_fan_remix_contest_started_notification.py @@ -14,7 +14,7 @@ TEST_FAVORITER_ID = 3 -def test_remix_contest_started_notification_for_followers_and_favoriters(app): +def test_fan_remix_contest_started_notification_for_followers_and_favoriters(app): """Test that remix contest started notification is created for followers and users who favorited the track""" with app.app_context(): db = get_db() @@ -95,7 +95,7 @@ def test_remix_contest_started_notification_for_followers_and_favoriters(app): with db.scoped_session() as session: notifications = ( session.query(Notification) - .filter(Notification.type == NotificationType.REMIX_CONTEST_STARTED) + .filter(Notification.type == NotificationType.FAN_REMIX_CONTEST_STARTED) .all() ) notified_user_ids = set() @@ -103,15 +103,15 @@ def test_remix_contest_started_notification_for_followers_and_favoriters(app): notified_user_ids.update(notification.user_ids) assert notification.data["entity_user_id"] == TEST_EVENT_CREATOR_ID assert notification.data["entity_id"] == TEST_TRACK_ID - assert notification.type == NotificationType.REMIX_CONTEST_STARTED - assert notification.group_id.startswith("remix_contest_started:") + assert notification.type == NotificationType.FAN_REMIX_CONTEST_STARTED + assert notification.group_id.startswith("fan_remix_contest_started:") # Should notify both the follower and the favoriter assert TEST_FOLLOWER_ID in notified_user_ids assert TEST_FAVORITER_ID in notified_user_ids assert len(notified_user_ids) == 2 -def test_remix_contest_started_notification_no_duplicate_for_follower_and_favoriter( +def test_fan_remix_contest_started_notification_no_duplicate_for_follower_and_favoriter( app, ): """Test that a user who both follows the creator and saved the track only gets one notification""" @@ -189,7 +189,7 @@ def test_remix_contest_started_notification_no_duplicate_for_follower_and_favori with db.scoped_session() as session: notifications = ( session.query(Notification) - .filter(Notification.type == NotificationType.REMIX_CONTEST_STARTED) + .filter(Notification.type == NotificationType.FAN_REMIX_CONTEST_STARTED) .all() ) # There should be only one notification for BOTH_ID @@ -199,7 +199,7 @@ def test_remix_contest_started_notification_no_duplicate_for_follower_and_favori notif_count += 1 assert notification.data["entity_user_id"] == TEST_EVENT_CREATOR_ID assert notification.data["entity_id"] == TEST_TRACK_ID - assert notification.type == NotificationType.REMIX_CONTEST_STARTED + assert notification.type == NotificationType.FAN_REMIX_CONTEST_STARTED assert notification.specifier == str(BOTH_ID) - assert notification.group_id.startswith("remix_contest_started:") + assert notification.group_id.startswith("fan_remix_contest_started:") assert notif_count == 1 From ab5c22985695d02d2f54d66e2e884ac0e431b595 Mon Sep 17 00:00:00 2001 From: Dharit Tantiviramanond Date: Wed, 7 May 2025 16:45:23 -0400 Subject: [PATCH 4/8] lint --- .../src/api/v1/utils/extend_notification.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/discovery-provider/src/api/v1/utils/extend_notification.py b/packages/discovery-provider/src/api/v1/utils/extend_notification.py index eed00291d8f..74b7f741fa6 100644 --- a/packages/discovery-provider/src/api/v1/utils/extend_notification.py +++ b/packages/discovery-provider/src/api/v1/utils/extend_notification.py @@ -15,6 +15,9 @@ CosignRemixNotification, CreatePlaylistNotification, CreateTrackNotification, + FanRemixContestEndedNotification, + FanRemixContestEndingSoonNotification, + FanRemixContestStartedNotification, FollowerMilestoneNotification, FollowNotification, ListenStreakReminderNotification, @@ -761,7 +764,7 @@ def extend_listen_streak_reminder(action: NotificationAction): def extend_fan_remix_contest_started(action: NotificationAction): - data = action["data"] # type: ignore + data: FanRemixContestStartedNotification = action["data"] # type: ignore return { "specifier": encode_int_id(int(action["specifier"])), "type": action["type"], @@ -778,7 +781,7 @@ def extend_fan_remix_contest_started(action: NotificationAction): def extend_fan_remix_contest_ended(action: NotificationAction): - data = action["data"] # type: ignore + data: FanRemixContestEndedNotification = action["data"] # type: ignore return { "specifier": encode_int_id(int(action["specifier"])), "type": action["type"], @@ -795,7 +798,7 @@ def extend_fan_remix_contest_ended(action: NotificationAction): def extend_fan_remix_contest_ending_soon(action: NotificationAction): - data = action["data"] # type: ignore + data: FanRemixContestEndingSoonNotification = action["data"] # type: ignore return { "specifier": encode_int_id(int(action["specifier"])), "type": action["type"], From 9d6e150dee071b4f1db77f53ce8ee8ebcfa8a621 Mon Sep 17 00:00:00 2001 From: Dharit Tantiviramanond Date: Wed, 7 May 2025 16:48:59 -0400 Subject: [PATCH 5/8] Revert "Add dev tools (#12063)" This reverts commit 8f05224ce76eef9a6cafd7d00480fbd51b2def63. --- packages/common/src/utils/route.ts | 2 - packages/web/src/app/web-player/WebPlayer.jsx | 22 +-- .../components/nav/desktop/useNavConfig.tsx | 21 +-- packages/web/src/hooks/useIsDevOrStaging.ts | 10 - packages/web/src/pages/dev-tools/DevTools.tsx | 176 ------------------ .../src/pages/dev-tools/SolanaToolsPage.tsx | 35 ---- .../dev-tools/components/SignatureDecoder.tsx | 141 -------------- .../components/UserBankAddressDeriver.tsx | 144 -------------- packages/web/src/pages/dev-tools/messages.ts | 38 ---- 9 files changed, 4 insertions(+), 585 deletions(-) delete mode 100644 packages/web/src/hooks/useIsDevOrStaging.ts delete mode 100644 packages/web/src/pages/dev-tools/DevTools.tsx delete mode 100644 packages/web/src/pages/dev-tools/SolanaToolsPage.tsx delete mode 100644 packages/web/src/pages/dev-tools/components/SignatureDecoder.tsx delete mode 100644 packages/web/src/pages/dev-tools/components/UserBankAddressDeriver.tsx delete mode 100644 packages/web/src/pages/dev-tools/messages.ts diff --git a/packages/common/src/utils/route.ts b/packages/common/src/utils/route.ts index f8edc2a52a7..967060f1623 100644 --- a/packages/common/src/utils/route.ts +++ b/packages/common/src/utils/route.ts @@ -82,8 +82,6 @@ export const WITHDRAWALS_PAGE = '/payments/withdrawals' export const TRANSACTION_HISTORY_PAGE = '/wallet/transaction-history' export const WALLET_PAGE = '/wallet' export const PRIVATE_KEY_EXPORTER_SETTINGS_PAGE = '/settings/export-private-key' -export const DEV_TOOLS_PAGE = '/dev-tools' -export const SOLANA_TOOLS_PAGE = '/dev-tools/solana' // Multi-stage sign up flow routes export enum SignUpPath { diff --git a/packages/web/src/app/web-player/WebPlayer.jsx b/packages/web/src/app/web-player/WebPlayer.jsx index f46fe3a2ada..f837c43fd10 100644 --- a/packages/web/src/app/web-player/WebPlayer.jsx +++ b/packages/web/src/app/web-player/WebPlayer.jsx @@ -50,7 +50,6 @@ import DesktopRoute from 'components/routes/DesktopRoute' import MobileRoute from 'components/routes/MobileRoute' import TrendingGenreSelectionPage from 'components/trending-genre-selection/TrendingGenreSelectionPage' import { USDCBalanceFetcher } from 'components/usdc-balance-fetcher/USDCBalanceFetcher' -import { useIsDevOrStaging } from 'hooks/useIsDevOrStaging' import { MAIN_CONTENT_ID, MainContentContext } from 'pages/MainContentContext' import { AiAttributedTracksPage } from 'pages/ai-attributed-tracks-page' import { AudioPage } from 'pages/audio-page/AudioPage' @@ -60,8 +59,6 @@ import CollectionPage from 'pages/collection-page/CollectionPage' import CommentHistoryPage from 'pages/comment-history/CommentHistoryPage' import { DashboardPage } from 'pages/dashboard-page/DashboardPage' import { DeactivateAccountPage } from 'pages/deactivate-account-page/DeactivateAccountPage' -import DevTools from 'pages/dev-tools/DevTools' -import SolanaToolsPage from 'pages/dev-tools/SolanaToolsPage' import { EditCollectionPage } from 'pages/edit-collection-page' import EmptyPage from 'pages/empty-page/EmptyPage' import ExploreCollectionsPage from 'pages/explore-page/ExploreCollectionsPage' @@ -197,9 +194,7 @@ const { EDIT_PLAYLIST_PAGE, EDIT_ALBUM_PAGE, AIRDROP_PAGE, - WALLET_PAGE, - DEV_TOOLS_PAGE, - SOLANA_TOOLS_PAGE + WALLET_PAGE } = route const { @@ -443,8 +438,7 @@ class WebPlayer extends Component { incrementScroll, decrementScroll, userHandle, - isWalletUIUpdateEnabled, - isDevOrStaging + isWalletUIUpdateEnabled } = this.props const { @@ -748,16 +742,6 @@ class WebPlayer extends Component { component={SavedPage} /> - {isDevOrStaging && ( - <> - - - - )} { const { isEnabled: isWalletUIUpdateEnabled } = useFeatureFlag( FeatureFlags.WALLET_UI_UPDATE ) - const isDevOrStaging = useIsDevOrStaging() return ( ) } diff --git a/packages/web/src/components/nav/desktop/useNavConfig.tsx b/packages/web/src/components/nav/desktop/useNavConfig.tsx index cb6b1be7614..f0a721ddcce 100644 --- a/packages/web/src/components/nav/desktop/useNavConfig.tsx +++ b/packages/web/src/components/nav/desktop/useNavConfig.tsx @@ -16,7 +16,6 @@ import { IconLibrary, IconMessages, IconPlaylists, - IconSettings, IconTrending, IconWallet, LoadingSpinner, @@ -26,7 +25,6 @@ import { import { useSelector } from 'react-redux' import { useLocation } from 'react-router-dom' -import { useIsDevOrStaging } from 'hooks/useIsDevOrStaging' import { RestrictionType } from 'hooks/useRequiresAccount' import { matchesRoute } from 'utils/route' @@ -45,8 +43,7 @@ const { CHATS_PAGE, UPLOAD_PAGE, REWARDS_PAGE, - WALLET_PAGE, - DEV_TOOLS_PAGE + WALLET_PAGE } = route const { getUnreadMessagesCount } = chatSelectors @@ -99,8 +96,6 @@ export const useNavConfig = () => { FeatureFlags.WALLET_UI_UPDATE ) - const isDevOrStaging = useIsDevOrStaging() - const navItems = useMemo( (): NavItemConfig[] => [ createNavItemWithSpeaker({ @@ -207,17 +202,6 @@ export const useNavConfig = () => { restriction: 'account' as RestrictionType, disabled: !hasAccount }, - // Add DevTools nav item that only appears in development and staging environments - ...(isDevOrStaging - ? [ - { - label: 'DevTools', - leftIcon: IconSettings, - to: DEV_TOOLS_PAGE, - restriction: 'none' as RestrictionType - } - ] - : []), { label: 'Playlists', leftIcon: IconPlaylists, @@ -241,8 +225,7 @@ export const useNavConfig = () => { playingFromRoute, color, spacing, - isWalletUIUpdateEnabled, - isDevOrStaging + isWalletUIUpdateEnabled ] ) diff --git a/packages/web/src/hooks/useIsDevOrStaging.ts b/packages/web/src/hooks/useIsDevOrStaging.ts deleted file mode 100644 index a917e613e61..00000000000 --- a/packages/web/src/hooks/useIsDevOrStaging.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { env } from 'services/env' - -export const useIsDevOrStaging = () => { - return ( - env.ENVIRONMENT === 'development' || - env.ENVIRONMENT === 'staging' || - import.meta.env.DEV === true || - import.meta.env.MODE === 'development' - ) -} diff --git a/packages/web/src/pages/dev-tools/DevTools.tsx b/packages/web/src/pages/dev-tools/DevTools.tsx deleted file mode 100644 index a70465bc2b7..00000000000 --- a/packages/web/src/pages/dev-tools/DevTools.tsx +++ /dev/null @@ -1,176 +0,0 @@ -import { modalsActions } from '@audius/common/store' -import { - Box, - Button, - Flex, - IconSettings, - IconSolana, - Paper, - Text, - makeResponsiveStyles -} from '@audius/harmony' -import { useDispatch } from 'react-redux' -import { useHistory } from 'react-router-dom' - -import { Header } from 'components/header/desktop/Header' -import { Page } from 'components/page/Page' -import { env } from 'services/env' - -import { messages } from './messages' - -/** - * Dev Tools page - only available in development and staging environments - * This page contains tools and utilities for developers to test and debug the application - */ - -type DevToolCardProps = { - icon: React.ElementType - title: string - description: string - buttonText: string - onButtonClick: () => void - buttonDisabled?: boolean -} - -export const useDevToolCardStyles = makeResponsiveStyles(({ theme }) => ({ - root: { - mobile: { - width: '100%', - minWidth: '300px' - }, - base: { - width: `calc(50% - ${theme.spacing.xl / 2}px)` - } - } -})) - -const DevToolCard = (props: DevToolCardProps) => { - const { - icon: Icon, - title, - description, - buttonText, - onButtonClick, - buttonDisabled - } = props - const styles = useDevToolCardStyles() - - return ( - - - - - {title} - - - {description} - - - ) -} - -export const DevTools = () => { - const dispatch = useDispatch() - const history = useHistory() - - const handleOpenFeatureFlags = () => { - dispatch( - modalsActions.setVisibility({ - modal: 'FeatureFlagOverride', - visible: true - }) - ) - } - - const ensureDevModeEnabledInProduction = () => { - const key = 'enable-dev-mode-01-21-2025' - if (env.ENVIRONMENT === 'production' && !localStorage.getItem(key)) { - localStorage.setItem(key, 'true') - } - } - - const handleOpenDiscoveryNodeSelector = () => { - ensureDevModeEnabledInProduction() - document.body.dispatchEvent( - new KeyboardEvent('keydown', { key: 'd', keyCode: 68, bubbles: true }) - ) - } - - const handleOpenConfirmerPreview = () => { - ensureDevModeEnabledInProduction() - document.body.dispatchEvent( - new KeyboardEvent('keydown', { key: 'c', keyCode: 67, bubbles: true }) - ) - } - - const handleOpenSolanaTools = () => { - history.push('/dev-tools/solana') - } - - return ( - } - > - - - - - - - - - - - - - ) -} - -export default DevTools diff --git a/packages/web/src/pages/dev-tools/SolanaToolsPage.tsx b/packages/web/src/pages/dev-tools/SolanaToolsPage.tsx deleted file mode 100644 index cc06fa0d348..00000000000 --- a/packages/web/src/pages/dev-tools/SolanaToolsPage.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import { Box, Flex } from '@audius/harmony' - -import { Header } from 'components/header/desktop/Header' -import { Page } from 'components/page/Page' - -import { SignatureDecoder } from './components/SignatureDecoder' -import { UserBankAddressDeriver } from './components/UserBankAddressDeriver' -import { messages } from './messages' - -export const SolanaToolsPage = () => { - return ( - } - > - - - - - - - - ) -} - -export default SolanaToolsPage diff --git a/packages/web/src/pages/dev-tools/components/SignatureDecoder.tsx b/packages/web/src/pages/dev-tools/components/SignatureDecoder.tsx deleted file mode 100644 index 10b3475452e..00000000000 --- a/packages/web/src/pages/dev-tools/components/SignatureDecoder.tsx +++ /dev/null @@ -1,141 +0,0 @@ -import { useState } from 'react' - -import { - Button, - Flex, - IconMessage, - Paper, - Text, - TextInput, - makeResponsiveStyles -} from '@audius/harmony' -import { Secp256k1Program, ClaimableTokensProgram } from '@audius/spl' - -import { messages } from '../messages' - -const useSignatureDecoderStyles = makeResponsiveStyles(({ theme }) => ({ - root: { - mobile: { - width: '100%', - minWidth: '300px' - }, - base: { - width: `calc(50% - ${theme.spacing.xl / 2}px)` - } - } -})) - -export const SignatureDecoder = () => { - const [signatureInput, setSignatureInput] = useState('') - const [decodedSignatureMessage, setDecodedSignatureMessage] = useState('') - const [signatureDecodeError, setSignatureDecodeError] = useState('') - const styles = useSignatureDecoderStyles() - - const handleDecodeSignature = () => { - setDecodedSignatureMessage('') - setSignatureDecodeError('') - if (!signatureInput.trim()) { - setSignatureDecodeError('Input cannot be empty.') - return - } - - try { - let hex = signatureInput.trim() - if (hex.startsWith('0x')) { - hex = hex.substring(2) - } - - if (hex.length === 0 || hex.length % 2 !== 0) { - setSignatureDecodeError( - 'Hex string must have an even number of characters and cannot be empty after removing "0x".' - ) - return - } - if (!/^[0-9a-fA-F]+$/.test(hex)) { - setSignatureDecodeError( - 'Invalid characters in hex string. Only 0-9 and a-f are allowed.' - ) - return - } - - const instructionData = Uint8Array.from(Buffer.from(hex, 'hex')) - - const decodedSecpData = Secp256k1Program.decode(instructionData) - - const decodedMessagePayload = - ClaimableTokensProgram.layouts.signedTransferInstructionData.decode( - Uint8Array.from(decodedSecpData.message) - ) - - setDecodedSignatureMessage( - JSON.stringify( - decodedMessagePayload, - (key, value) => - typeof value === 'bigint' ? value.toString() : value, - 2 - ) - ) - } catch (error: any) { - console.error('Signature decode error:', error) - setSignatureDecodeError( - `Failed to decode: ${error.message || 'Unknown error'}` - ) - } - } - - return ( - - - - - {messages.signatureDecoderTitle} - - - {messages.signatureDecoderDescription} - - {messages.signatureDecoderInputLabel} - - ) => - setSignatureInput(e.target.value) - } - width='100%' - /> - - {decodedSignatureMessage && ( - - - {messages.signatureDecoderOutputLabel} - - - - {decodedSignatureMessage} - - - - )} - {signatureDecodeError && ( - - - {messages.signatureDecoderErrorLabel} - - - {signatureDecodeError} - - - )} - - ) -} diff --git a/packages/web/src/pages/dev-tools/components/UserBankAddressDeriver.tsx b/packages/web/src/pages/dev-tools/components/UserBankAddressDeriver.tsx deleted file mode 100644 index 438e2a6d3d0..00000000000 --- a/packages/web/src/pages/dev-tools/components/UserBankAddressDeriver.tsx +++ /dev/null @@ -1,144 +0,0 @@ -import { useState } from 'react' - -import { TOKEN_LISTING_MAP } from '@audius/common/store' -import { - Button, - Flex, - IconKey, - Paper, - Text, - TextInput, - Select -} from '@audius/harmony' -import { ClaimableTokensProgram } from '@audius/spl' -import { PublicKey } from '@solana/web3.js' - -import { useDevToolCardStyles } from '../DevTools' -import { messages } from '../messages' - -const supportedTokens = ['AUDIO', 'USDC'] as const -type SupportedToken = (typeof supportedTokens)[number] - -export const UserBankAddressDeriver = () => { - const [ethAddress, setEthAddress] = useState('') - const [selectedToken, setSelectedToken] = useState('AUDIO') - const [derivedAddress, setDerivedAddress] = useState('') - const [error, setError] = useState('') - const styles = useDevToolCardStyles() - - const handleDeriveAddress = async () => { - setDerivedAddress('') - setError('') - - if (!ethAddress.trim()) { - setError('Ethereum address cannot be empty.') - return - } - if (!ethAddress.startsWith('0x') || ethAddress.length !== 42) { - setError('Invalid Ethereum address format.') - return - } - - try { - const mintInfo = TOKEN_LISTING_MAP[selectedToken] - if (!mintInfo) { - setError(`Token information not found for ${selectedToken}`) - return - } - - const mintPk = new PublicKey(mintInfo.address) - const programIdPk = ClaimableTokensProgram.programId - - const authorityPDA = await ClaimableTokensProgram.deriveAuthority({ - programId: programIdPk, - mint: mintPk - }) - - const userBankAddress = await ClaimableTokensProgram.deriveUserBank({ - ethAddress, - claimableTokensPDA: authorityPDA - }) - - setDerivedAddress(userBankAddress.toBase58()) - } catch (e: any) { - console.error('Error deriving user bank address:', e) - setError(e.message || 'An unknown error occurred.') - } - } - - return ( - - - - - {messages.userBankDeriverTitle} - - - {messages.userBankDeriverDescription} - - - {messages.userBankDeriverEthAddressLabel} - - ) => - setEthAddress(e.target.value) - } - width='100%' - /> - - - {messages.userBankDeriverTokenLabel} - - setSelectedToken(value as SupportedToken)} + aria-label={messages.userBankDeriverTokenLabel} + options={supportedTokens.map((token) => ({ + value: token, + label: token + }))} + width='100%' + /> + + + + {derivedAddress && ( + + + {messages.userBankDeriverOutputLabel} + + + + {derivedAddress} + + + + )} + + {error && ( + + + {messages.userBankDeriverErrorLabel} + + + {error} + + + )} + + ) +} diff --git a/packages/web/src/pages/dev-tools/messages.ts b/packages/web/src/pages/dev-tools/messages.ts new file mode 100644 index 00000000000..a59df3b8d8c --- /dev/null +++ b/packages/web/src/pages/dev-tools/messages.ts @@ -0,0 +1,38 @@ +export const messages = { + pageTitle: 'Developer Tools', + pageDescription: + 'This page provides utilities for developers to test and debug the application.', + featureFlagsTitle: 'Feature Flags', + featureFlagsDescription: + 'Override feature flags for testing purposes. Changes require a page refresh to take effect.', + featureFlagsButton: 'Open Feature Flag Editor', + discoveryNodeTitle: 'Discovery Node Selector', + discoveryNodeDescription: + "Select a specific Discovery Node to connect to. Alternatively, press 'D' key to toggle this tool.", + discoveryNodeButton: 'Open Discovery Node Selector', + confirmerPreviewTitle: 'Confirmer Preview', + confirmerPreviewDescription: + "Preview the state of the confirmer, which manages transaction retries. Alternatively, press 'C' key to toggle this tool.", + confirmerPreviewButton: 'Open Confirmer Preview', + signatureDecoderTitle: 'Signature Decoder', + signatureDecoderDescription: + 'Input a raw Secp256k1 instruction hex string (e.g., the "Instruction Data" from Solana Explorer for a Secp256k1 SigVerify Precompile instruction) to decode the underlying Claimable Tokens message.', + signatureDecoderInputLabel: 'Secp256k1 Instruction Hex String:', + signatureDecoderButton: 'Decode Message', + signatureDecoderOutputLabel: 'Decoded Claimable Tokens Message:', + signatureDecoderErrorLabel: 'Error:', + solanaToolsTitle: 'Solana Tools', + solanaToolsDescription: + 'A collection of tools for interacting with and debugging Solana programs.', + solanaToolsButton: 'Open Solana Tools', + userBankDeriverTitle: 'User Bank Address Deriver', + userBankDeriverDescription: + 'Derive the Program-Owned Associated Token Account (User Bank) address for a given Ethereum wallet address and token. This is where claimable tokens for that user would reside.', + userBankDeriverEthAddressLabel: 'Ethereum Wallet Address:', + userBankDeriverEthAddressPlaceholder: + 'Enter Ethereum wallet address (e.g., 0x...)', + userBankDeriverTokenLabel: 'Token Symbol:', + userBankDeriverButton: 'Derive User Bank Address', + userBankDeriverOutputLabel: 'Derived User Bank Address:', + userBankDeriverErrorLabel: 'Error Deriving Address:' +} From 84d345d49688c64a5d36d4cbd3db3dac94620fa2 Mon Sep 17 00:00:00 2001 From: Dharit Tantiviramanond Date: Wed, 7 May 2025 19:01:43 -0400 Subject: [PATCH 8/8] rename --- .../src/screens/notifications-screen/NotificationListItem.tsx | 2 +- ...tification.tsx => FanRemixContestEndingSoonNotification.tsx} | 0 .../src/screens/notifications-screen/Notifications/index.ts | 2 +- ...tification.tsx => FanRemixContestEndingSoonNotification.tsx} | 0 .../src/components/notification/Notification/Notification.tsx | 2 +- 5 files changed, 3 insertions(+), 3 deletions(-) rename packages/mobile/src/screens/notifications-screen/Notifications/{RemixContestEndingSoonNotification.tsx => FanRemixContestEndingSoonNotification.tsx} (100%) rename packages/web/src/components/notification/Notification/{RemixContestEndingSoonNotification.tsx => FanRemixContestEndingSoonNotification.tsx} (100%) diff --git a/packages/mobile/src/screens/notifications-screen/NotificationListItem.tsx b/packages/mobile/src/screens/notifications-screen/NotificationListItem.tsx index ddf7977de45..ed61c70cfe9 100644 --- a/packages/mobile/src/screens/notifications-screen/NotificationListItem.tsx +++ b/packages/mobile/src/screens/notifications-screen/NotificationListItem.tsx @@ -38,9 +38,9 @@ import { CommentReactionNotification } from './Notifications' import { FanRemixContestEndedNotification } from './Notifications/FanRemixContestEndedNotification' +import { FanRemixContestEndingSoonNotification } from './Notifications/FanRemixContestEndingSoonNotification' import { FanRemixContestStartedNotification } from './Notifications/FanRemixContestStartedNotification' import { ListenStreakReminderNotification } from './Notifications/ListenStreakReminderNotification' -import { FanRemixContestEndingSoonNotification } from './Notifications/RemixContestEndingSoonNotification' type NotificationListItemProps = { notification: Notification diff --git a/packages/mobile/src/screens/notifications-screen/Notifications/RemixContestEndingSoonNotification.tsx b/packages/mobile/src/screens/notifications-screen/Notifications/FanRemixContestEndingSoonNotification.tsx similarity index 100% rename from packages/mobile/src/screens/notifications-screen/Notifications/RemixContestEndingSoonNotification.tsx rename to packages/mobile/src/screens/notifications-screen/Notifications/FanRemixContestEndingSoonNotification.tsx diff --git a/packages/mobile/src/screens/notifications-screen/Notifications/index.ts b/packages/mobile/src/screens/notifications-screen/Notifications/index.ts index 17ad066bf60..cb259162329 100644 --- a/packages/mobile/src/screens/notifications-screen/Notifications/index.ts +++ b/packages/mobile/src/screens/notifications-screen/Notifications/index.ts @@ -32,5 +32,5 @@ export * from './CommentThreadNotification' export * from './CommentMentionNotification' export * from './CommentReactionNotification' export * from './FanRemixContestEndedNotification' -export * from './RemixContestEndingSoonNotification' +export * from './FanRemixContestEndingSoonNotification' export * from './ArtistRemixContestEndedNotification' diff --git a/packages/web/src/components/notification/Notification/RemixContestEndingSoonNotification.tsx b/packages/web/src/components/notification/Notification/FanRemixContestEndingSoonNotification.tsx similarity index 100% rename from packages/web/src/components/notification/Notification/RemixContestEndingSoonNotification.tsx rename to packages/web/src/components/notification/Notification/FanRemixContestEndingSoonNotification.tsx diff --git a/packages/web/src/components/notification/Notification/Notification.tsx b/packages/web/src/components/notification/Notification/Notification.tsx index 9c85a2b6402..c811f698a08 100644 --- a/packages/web/src/components/notification/Notification/Notification.tsx +++ b/packages/web/src/components/notification/Notification/Notification.tsx @@ -16,13 +16,13 @@ import { CommentNotification } from './CommentNotification' import { CommentReactionNotification } from './CommentReactionNotification' import { CommentThreadNotification } from './CommentThreadNotification' import { FanRemixContestEndedNotification } from './FanRemixContestEndedNotification' +import { FanRemixContestEndingSoonNotification } from './FanRemixContestEndingSoonNotification' import { FanRemixContestStartedNotification } from './FanRemixContestStartedNotification' import { FavoriteNotification } from './FavoriteNotification' import { FavoriteOfRepostNotification } from './FavoriteOfRepostNotification' import { FollowNotification } from './FollowNotification' import { ListenStreakReminderNotification } from './ListenStreakReminderNotification' import { MilestoneNotification } from './MilestoneNotification' -import { FanRemixContestEndingSoonNotification } from './RemixContestEndingSoonNotification' import { RemixCosignNotification } from './RemixCosignNotification' import { RemixCreateNotification } from './RemixCreateNotification' import { RepostNotification } from './RepostNotification'