Skip to content

Commit 68a6af9

Browse files
authored
feat(parser): Add ListView, ListItemView and SubscribeButtonView (#1025)
1 parent 46c2f6c commit 68a6af9

File tree

5 files changed

+126
-2
lines changed

5 files changed

+126
-2
lines changed

src/parser/classes/DialogView.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,20 @@ import { Parser, type RawNode } from '../index.js';
33
import DialogHeaderView from './DialogHeaderView.js';
44
import FormFooterView from './FormFooterView.js';
55
import CreatePlaylistDialogFormView from './CreatePlaylistDialogFormView.js';
6+
import ListView from './ListView.js';
67
import PanelFooterView from './PanelFooterView.js';
78

89
export default class DialogView extends YTNode {
910
static type = 'DialogView';
1011

1112
public header: DialogHeaderView | null;
1213
public footer: FormFooterView | PanelFooterView | null;
13-
public custom_content: CreatePlaylistDialogFormView | null;
14+
public custom_content: CreatePlaylistDialogFormView | ListView | null;
1415

1516
constructor (data: RawNode) {
1617
super();
1718
this.header = Parser.parseItem(data.header, DialogHeaderView);
1819
this.footer = Parser.parseItem(data.footer, [ FormFooterView, PanelFooterView ]);
19-
this.custom_content = Parser.parseItem(data.customContent, CreatePlaylistDialogFormView);
20+
this.custom_content = Parser.parseItem(data.customContent, [ CreatePlaylistDialogFormView, ListView ]);
2021
}
2122
}

src/parser/classes/ListItemView.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import type { ObservedArray } from '../helpers.js';
2+
import type { RawNode } from '../types/RawResponse.js';
3+
import { YTNode } from '../helpers.js';
4+
import { Parser } from '../index.js';
5+
6+
import AvatarView from './AvatarView.js';
7+
import RendererContext from './misc/RendererContext.js';
8+
import SubscribeButtonView from './SubscribeButtonView.js';
9+
import Text from './misc/Text.js';
10+
11+
export default class ListItemView extends YTNode {
12+
static type = 'ListItemView';
13+
14+
public title: Text;
15+
public subtitle: Text;
16+
public leading_accessory: AvatarView | null;
17+
public renderer_context: RendererContext;
18+
public trailing_buttons?: ObservedArray<SubscribeButtonView>;
19+
20+
constructor(data: RawNode) {
21+
super();
22+
23+
this.title = Text.fromAttributed(data.title);
24+
this.subtitle = Text.fromAttributed(data.subtitle);
25+
this.leading_accessory = Parser.parseItem(data.leadingAccessory, AvatarView);
26+
this.renderer_context = new RendererContext(data.rendererContext);
27+
28+
if ('trailingButtons' in data) {
29+
this.trailing_buttons = Parser.parseArray(data.trailingButtons.buttons, SubscribeButtonView);
30+
}
31+
}
32+
}

src/parser/classes/ListView.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import type { ObservedArray } from '../helpers.js';
2+
import type { RawNode } from '../types/RawResponse.js';
3+
import { YTNode } from '../helpers.js';
4+
import { Parser } from '../index.js';
5+
6+
import ListItemView from './ListItemView.js';
7+
8+
export default class ListView extends YTNode {
9+
static type = 'ListView';
10+
11+
public items: ObservedArray<ListItemView>;
12+
13+
constructor(data: RawNode) {
14+
super();
15+
16+
this.items = Parser.parseArray(data.listItems, ListItemView);
17+
}
18+
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
import type { RawNode } from '../types/RawResponse.js';
2+
import { YTNode } from '../helpers.js';
3+
import NavigationEndpoint from './NavigationEndpoint.js';
4+
5+
interface ButtonContent {
6+
button_text: string;
7+
accessibility_text: string;
8+
image_name: string;
9+
subscribe_state_subscribed: boolean;
10+
endpoint: NavigationEndpoint;
11+
}
12+
13+
export default class SubscribeButtonView extends YTNode {
14+
static type = 'SubscribeButtonView';
15+
16+
public subscribe_button_content: ButtonContent;
17+
public unsubscribe_button_content: ButtonContent;
18+
public disable_notification_bell: boolean;
19+
public button_style: {
20+
unsubscribed_state_style: string;
21+
subscribed_state_style: string;
22+
};
23+
public is_signed_out: boolean;
24+
public background_style: string;
25+
public disable_subscribe_button: boolean;
26+
public on_show_subscription_options: NavigationEndpoint;
27+
public channel_id: string;
28+
public enable_subscribe_button_post_click_animation: boolean;
29+
public bell_accessiblity_data: {
30+
off_label: string;
31+
all_label: string;
32+
occasional_label: string;
33+
disabled_label: string;
34+
};
35+
36+
constructor(data: RawNode) {
37+
super();
38+
39+
this.subscribe_button_content = this.#parseButtonContent(data.subscribeButtonContent);
40+
this.unsubscribe_button_content = this.#parseButtonContent(data.unsubscribeButtonContent);
41+
42+
this.disable_notification_bell = data.disableNotificationBell;
43+
this.button_style = {
44+
unsubscribed_state_style: data.buttonStyle.unsubscribedStateStyle,
45+
subscribed_state_style: data.buttonStyle.subscribedStateStyle
46+
};
47+
this.is_signed_out = data.isSignedOut;
48+
this.background_style = data.backgroundStyle;
49+
this.disable_subscribe_button = data.disableSubscribeButton;
50+
this.on_show_subscription_options = new NavigationEndpoint(data.onShowSubscriptionOptions);
51+
this.channel_id = data.channelId;
52+
this.enable_subscribe_button_post_click_animation = data.enableSubscribeButtonPostClickAnimation;
53+
this.bell_accessiblity_data = {
54+
off_label: data.bellAccessibilityData.offLabel,
55+
all_label: data.bellAccessibilityData.allLabel,
56+
occasional_label: data.bellAccessibilityData.occasionalLabel,
57+
disabled_label: data.bellAccessibilityData.disabledLabel
58+
};
59+
}
60+
61+
#parseButtonContent(data: RawNode): ButtonContent {
62+
return {
63+
button_text: data.buttonText,
64+
accessibility_text: data.accessibilityText,
65+
image_name: data.imageName,
66+
subscribe_state_subscribed: data.subscribeState.subscribed,
67+
endpoint: new NavigationEndpoint(data.onTapCommand)
68+
};
69+
}
70+
}

src/parser/nodes.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,8 @@ export { default as ItemSectionTab } from './classes/ItemSectionTab.js';
224224
export { default as ItemSectionTabbedHeader } from './classes/ItemSectionTabbedHeader.js';
225225
export { default as LikeButton } from './classes/LikeButton.js';
226226
export { default as LikeButtonView } from './classes/LikeButtonView.js';
227+
export { default as ListItemView } from './classes/ListItemView.js';
228+
export { default as ListView } from './classes/ListView.js';
227229
export { default as LiveChat } from './classes/LiveChat.js';
228230
export { default as AddBannerToLiveChatCommand } from './classes/livechat/AddBannerToLiveChatCommand.js';
229231
export { default as AddChatItemAction } from './classes/livechat/AddChatItemAction.js';
@@ -457,6 +459,7 @@ export { default as StructuredDescriptionPlaylistLockup } from './classes/Struct
457459
export { default as SubFeedOption } from './classes/SubFeedOption.js';
458460
export { default as SubFeedSelector } from './classes/SubFeedSelector.js';
459461
export { default as SubscribeButton } from './classes/SubscribeButton.js';
462+
export { default as SubscribeButtonView } from './classes/SubscribeButtonView.js';
460463
export { default as SubscriptionNotificationToggleButton } from './classes/SubscriptionNotificationToggleButton.js';
461464
export { default as Tab } from './classes/Tab.js';
462465
export { default as Tabbed } from './classes/Tabbed.js';

0 commit comments

Comments
 (0)