items( array( $item_id ) )[ $item_id ] ?? null; if ( null !== $item && ProgressStatus::COMPLETED === ( Learner::item_statuses( $user_id, $item->course_id )[ $item_id ] ?? null ) ) { $text = self::lesson_done( $item->unit_id ); $course_id = $item->course_id; } } if ( '' === $text ) { return ''; } self::$said = true; return EarlyScripts::after( Markup::notice( $text, 'success' ) . self::completion( $user_id, $course_id ), self::CLEAN ); } private const CLEAN = '(function(){var u=new URL(location.href);if(u.searchParams.has("' . LessonNav::SAID . '")){u.searchParams.delete("' . LessonNav::SAID . '");history.replaceState(history.state,"",u.href);}})();'; public static function completion( int $user_id, int $course_id ): string { $snapshot = $user_id > 0 ? Learner::snapshot( $user_id, $course_id ) : null; if ( null === $snapshot || ProgressStatus::COMPLETED !== $snapshot->status ) { return ''; } $html = esc_html__( 'You have completed this course.', 'rooster-lms' ); $url = self::certificate_url( $user_id, $course_id, $snapshot->cycle ); if ( '' !== $url ) { $html .= ' ' . esc_html__( 'View your certificate', 'rooster-lms' ) . ''; } return Markup::notice_html( $html, 'success' ); } public static function certificate_url( int $user_id, int $course_id, int $cycle ): string { $certificate = Services::certificate_repo()->for_cycle( $user_id, $course_id, $cycle ); return null === $certificate || 'revoked' === $certificate->status() ? '' : Services::certificate_renderer()->print_url( $certificate ); } public static function reset(): void { self::$said = false; } public static function lesson_done( int $unit_id ): string { return sprintf( /* translators: %s: lesson title. */ __( 'You completed ā€œ%sā€.', 'rooster-lms' ), self::title( ObjectType::UNIT, $unit_id ) ); } public static function title( ObjectType $type, int $id ): string { $post = (int) ( Services::posts()->for_objects( $type, array( $id ), Switcher::current() )[ $id ] ?? 0 ); return $post > 0 ? get_the_title( $post ) : ''; } }