Forum: - TipTap WYSIWYG editor with full toolbar - @emoji-mart/react emoji picker (consistent with tweets) - @mention autocomplete with user search API - Fix PHP 8.4 parse errors in Blade templates - Fix thread data display (paginator items) - Align forum page widths to max-w-5xl Discover: - Extract shared _nav.blade.php partial - Add missing nav links to for-you page - Add Following link for authenticated users Feed/Posts: - Post model, controllers, policies, migrations - Feed page components (PostComposer, FeedCard, etc) - Post reactions, comments, saves, reports, sharing - Scheduled publishing support - Link preview controller Profile: - Profile page components (ProfileHero, ProfileTabs) - Profile API controller Uploads: - Upload wizard enhancements - Scheduled publish picker - Studio status bar and readiness checklist
38 lines
1.4 KiB
JavaScript
38 lines
1.4 KiB
JavaScript
/**
|
|
* Forum React Island Entry Point
|
|
*
|
|
* Auto-detects which forum page mount-point is present in the DOM
|
|
* and renders the corresponding React component with server-provided props.
|
|
*/
|
|
|
|
import React from 'react'
|
|
import { createRoot } from 'react-dom/client'
|
|
|
|
const MOUNTS = [
|
|
{ rootId: 'forum-index-root', propsId: 'forum-index-props', loader: () => import('./Pages/Forum/ForumIndex') },
|
|
{ rootId: 'forum-category-root', propsId: 'forum-category-props', loader: () => import('./Pages/Forum/ForumCategory') },
|
|
{ rootId: 'forum-thread-root', propsId: 'forum-thread-props', loader: () => import('./Pages/Forum/ForumThread') },
|
|
{ rootId: 'forum-new-thread-root', propsId: 'forum-new-thread-props', loader: () => import('./Pages/Forum/ForumNewThread') },
|
|
{ rootId: 'forum-edit-post-root', propsId: 'forum-edit-post-props', loader: () => import('./Pages/Forum/ForumEditPost') },
|
|
]
|
|
|
|
for (const { rootId, propsId, loader } of MOUNTS) {
|
|
const el = document.getElementById(rootId)
|
|
if (!el) continue
|
|
|
|
let props = {}
|
|
try {
|
|
const propsEl = document.getElementById(propsId)
|
|
props = propsEl ? JSON.parse(propsEl.textContent || '{}') : {}
|
|
} catch {
|
|
props = {}
|
|
}
|
|
|
|
loader().then((mod) => {
|
|
const Component = mod.default
|
|
createRoot(el).render(<Component {...props} />)
|
|
})
|
|
|
|
break // Only one forum page per request
|
|
}
|