import type { ComponentType, ReactNode } from 'react'; import type { SduiBlock } from '@proulr/sdui-contract'; import { SduiButtonBlock, SduiColumnBlock, SduiIconBlock, SduiInfoBannerBlock, SduiRowBlock, SduiScrollBlock, SduiSpacerBlock, SduiTextBlock, SduiUnknownBlock, type SduiBlockRenderProps, } from './blocks/SduiPrimitiveBlocks'; import { SduiCardBlock, SduiListItemBlock, SduiSectionHeaderBlock, SduiSelectRowBlock, SduiToggleRowBlock, } from './blocks/SduiLayoutBlocks'; import { SduiChipBlock, SduiChipRowBlock, SduiDiscoverGridBlock, SduiDiscoverMapBlock, SduiDiscoverProfileCardBlock, SduiTextFieldBlock, } from './blocks/SduiDiscoverBlocks'; import { SduiProfileCompletionBannerBlock, SduiStoryRailBlock, } from './blocks/SduiSocialBlocks'; import { SduiChatInboxCapabilitiesBlock, SduiEmptyStateBlock, SduiFlashInboxCapabilitiesBlock, SduiInboxPersonRowBlock, SduiInboxSearchFieldBlock, SduiProfileVisitsCapabilitiesBlock, SduiFloatingCreateMenuBlock, SduiInboxHubChromeBlock, SduiSegmentedTabsBlock, } from './blocks/SduiInboxBlocks'; import { SduiNativeAdBlock } from './blocks/SduiNativeAdBlock'; import { SduiQrCodeBlock } from './blocks/SduiQrCodeBlock'; import { SduiAlbumDetailBlock, SduiAlbumGridBlock, SduiChatThreadBlock, SduiNewPostComposerBlock, SduiNewStoryComposerBlock, SduiStoryViewersPanelBlock, SduiPostCommentsBlock, SduiProfileOnboardingBlock, SduiProfileSelfBlock, SduiProfileSetupBlock, SduiProfileReportBlock, SduiProfileViewBlock, SduiSocialPostFeedBlock, SduiSocialProfileBlock, SduiSettingsHomeBlock, SduiSettingsPageBlock, SduiChatGroupCreateBlock, SduiChatGroupInfoBlock, SduiChatGroupAddMembersBlock, SduiChatGroupInviteBlock, SduiDiscoverBrowseLocationBlock, SduiRightNowComposeBlock, SduiRightNowFeedBlock, SduiThoughtFeedBlock, } from './blocks/SduiNativeDomainBlocks'; export type { SduiBlockRenderProps }; type SduiBlockComponent = ComponentType; const REGISTRY: Record = { text: SduiTextBlock, column: SduiColumnBlock, row: SduiRowBlock, scroll: SduiScrollBlock, button: SduiButtonBlock, icon: SduiIconBlock, qr_code: SduiQrCodeBlock, spacer: SduiSpacerBlock, info_banner: SduiInfoBannerBlock, native_ad: SduiNativeAdBlock, card: SduiCardBlock, section_header: SduiSectionHeaderBlock, list_item: SduiListItemBlock, toggle_row: SduiToggleRowBlock, select_row: SduiSelectRowBlock, chip: SduiChipBlock, chip_row: SduiChipRowBlock, segmented_tabs: SduiSegmentedTabsBlock, empty_state: SduiEmptyStateBlock, inbox_person_row: SduiInboxPersonRowBlock, inbox_search_field: SduiInboxSearchFieldBlock, chat_inbox_capabilities: SduiChatInboxCapabilitiesBlock, flash_inbox_capabilities: SduiFlashInboxCapabilitiesBlock, profile_visits_capabilities: SduiProfileVisitsCapabilitiesBlock, floating_create_menu: SduiFloatingCreateMenuBlock, inbox_hub_chrome: SduiInboxHubChromeBlock, discover_grid: SduiDiscoverGridBlock, discover_profile_card: SduiDiscoverProfileCardBlock, discover_map: SduiDiscoverMapBlock, text_field: SduiTextFieldBlock, story_rail: SduiStoryRailBlock, profile_completion_banner: SduiProfileCompletionBannerBlock, chat_thread: SduiChatThreadBlock, social_post_feed: SduiSocialPostFeedBlock, thought_feed: SduiThoughtFeedBlock, profile_view: SduiProfileViewBlock, profile_self: SduiProfileSelfBlock, profile_setup: SduiProfileSetupBlock, profile_onboarding: SduiProfileOnboardingBlock, profile_report: SduiProfileReportBlock, album_grid: SduiAlbumGridBlock, album_detail: SduiAlbumDetailBlock, new_post_composer: SduiNewPostComposerBlock, new_story_composer: SduiNewStoryComposerBlock, story_viewers_panel: SduiStoryViewersPanelBlock, post_comments: SduiPostCommentsBlock, social_profile: SduiSocialProfileBlock, settings_home: SduiSettingsHomeBlock, settings_page: SduiSettingsPageBlock, chat_group_create: SduiChatGroupCreateBlock, chat_group_info: SduiChatGroupInfoBlock, chat_group_add_members: SduiChatGroupAddMembersBlock, chat_group_invite: SduiChatGroupInviteBlock, discover_browse_location: SduiDiscoverBrowseLocationBlock, right_now_feed: SduiRightNowFeedBlock, right_now_compose: SduiRightNowComposeBlock, }; export function resolveSduiBlockComponent(type: string): SduiBlockComponent { return REGISTRY[type] ?? SduiUnknownBlock; } export function registerSduiBlockComponent(type: string, component: SduiBlockComponent) { REGISTRY[type] = component; } export type BlockNodeProps = { block: SduiBlock; data: Record; onAction: (actionId: string, vars?: Record) => void; }; export function renderBlockTree( block: SduiBlock, data: Record, onAction: BlockNodeProps['onAction'], ): ReactNode { const Component = resolveSduiBlockComponent(block.type); const childNodes = block.children.map((child) => ( )); return ( {childNodes} ); } function BlockNode({ block, data, onAction }: BlockNodeProps) { return <>{renderBlockTree(block, data, onAction)}; }