Render\CourseGrid::class, 'course-outline' => Render\CourseOutline::class, 'enrol-button' => Render\EnrolButton::class, 'mark-complete' => Render\MarkComplete::class, 'progress-bar' => Render\ProgressBar::class, 'my-courses' => Render\MyCourses::class, 'org-progress' => Render\OrgProgress::class, 'category-grid' => Render\CategoryGrid::class, 'category-list' => Render\CategoryList::class, 'breadcrumbs' => Render\Breadcrumbs::class, 'org-portal' => Render\OrgPortal::class, 'org-dashboard' => Render\OrgDashboard::class, 'org-members' => Render\OrgMembers::class, 'org-matrix' => Render\OrgMatrix::class, 'org-job-roles' => Render\OrgJobRoles::class, 'org-locations' => Render\OrgLocations::class, 'org-branding' => Render\OrgBranding::class, 'org-registration-fields' => Render\OrgRegistrationFields::class, 'org-enroller' => Render\OrgEnroller::class, 'org-catalogue' => Render\OrgCatalogue::class, 'org-quiz-results' => Render\OrgQuizResults::class, 'quiz' => Render\Quiz::class, 'h5p' => Render\H5P::class, 'question' => Render\Question::class, 'stimulus' => Render\Stimulus::class, 'my-certificates' => Render\MyCertificates::class, 'certificate-verify' => Render\CertificateVerify::class, 'grading-queue' => Render\GradingQueue::class, 'org-assessments' => Render\OrgAssessments::class, 'feedback' => Render\Feedback::class, 'account' => Render\Account::class, 'account-menu' => Render\AccountMenu::class, 'live-session' => Render\LiveSession::class, 'live-sessions' => Render\LiveSessions::class, 'live-lesson' => \RoosterLMS\Live\Lesson\LessonView::class, ); public const ON_DEMAND_MODULES = array( 'enrol-button', 'mark-complete', 'org-progress', 'org-members', 'org-matrix', 'org-job-roles', 'org-locations', 'org-branding', 'org-registration-fields', 'org-enroller', 'org-catalogue', 'quiz', 'grading-queue', 'org-assessments', 'feedback' ); private static array $modules = array(); private static bool $registered = false; public function register(): void { if ( self::$registered ) { return; } self::$registered = true; add_action( 'init', array( $this, 'register_blocks' ) ); add_filter( 'block_categories_all', array( $this, 'category' ), 10, 1 ); ( new LanguageUrls() )->register(); ( new LiveContent() )->register(); } public function register_blocks(): void { $manifest = dirname( rtrim( self::build_dir(), '/\\' ) ) . '/blocks-manifest.php'; if ( is_file( $manifest ) ) { wp_register_block_metadata_collection( rtrim( self::build_dir(), '/\\' ), $manifest ); } $registry = \WP_Block_Type_Registry::get_instance(); foreach ( self::BLOCKS as $name => $class ) { $dir = self::build_dir() . $name; if ( ! is_file( $dir . '/block.json' ) || $registry->is_registered( 'rooster-lms/' . $name ) ) { continue; } $type = register_block_type( $dir, array( 'render_callback' => array( $class, 'render' ) ) ); if ( false === $type ) { continue; } if ( in_array( $name, self::ON_DEMAND_MODULES, true ) ) { self::$modules[ $name ] = array_values( array_map( 'strval', (array) $type->view_script_module_ids ) ); $type->view_script_module_ids = array(); } $handle = generate_block_asset_handle( 'rooster-lms/' . $name, 'editorScript' ); if ( wp_script_is( $handle, 'registered' ) ) { wp_set_script_translations( $handle, 'rooster-lms', ROOSTER_LMS_DIR . 'languages' ); } } } public function category( $categories ) { if ( ! is_array( $categories ) ) { return $categories; } foreach ( $categories as $category ) { if ( is_array( $category ) && isset( $category['slug'] ) && 'rooster-lms' === $category['slug'] ) { return $categories; } } $categories[] = array( 'slug' => 'rooster-lms', 'title' => __( 'Rooster LMS', 'rooster-lms' ), 'icon' => null, ); return $categories; } public static function build_dir(): string { $default = ROOSTER_LMS_DIR . 'build/blocks/'; $dir = apply_filters( 'rooster_lms_blocks_build_dir', $default ); return is_string( $dir ) && '' !== $dir ? trailingslashit( $dir ) : $default; } public static function enqueue_view_module( string $name ): void { foreach ( self::$modules[ $name ] ?? array() as $id ) { wp_enqueue_script_module( $id ); } } public static function view_module_ids( string $name ): array { return self::$modules[ $name ] ?? array(); } public static function is_registered( string $name ): bool { return \WP_Block_Type_Registry::get_instance()->is_registered( 'rooster-lms/' . $name ); } }