. /** * Activity view page. * * @package mod_meetletacbfree * @copyright 2026 MeetLet * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ require_once('../../config.php'); use mod_meetletacbfree\local\config; use mod_meetletacbfree\local\featureaccess; use mod_meetletacbfree\local\instance; use mod_meetletacbfree\local\meetingstatus; use mod_meetletacbfree\output\view_page; use mod_meetletacbfree\registration\manager as registration_manager; $id = required_param('id', PARAM_INT); $groupid = optional_param('group', 0, PARAM_INT); $cm = get_coursemodule_from_id('meetletacbfree', $id, 0, false, MUST_EXIST); $course = $DB->get_record('course', ['id' => $cm->course], '*', MUST_EXIST); $meetlet = $DB->get_record('meetletacbfree', ['id' => $cm->instance], '*', MUST_EXIST); require_login($course, true, $cm); $context = context_module::instance($cm->id); require_capability('mod/meetletacbfree:view', $context); \mod_meetletacbfree\registration\manager::require_registered(); $PAGE->set_url('/mod/meetletacbfree/view.php', ['id' => $cm->id]); $PAGE->set_title(format_string($meetlet->name)); $PAGE->set_heading(format_string($course->fullname)); $PAGE->set_context($context); $PAGE->activityheader->disable(); $PAGE->requires->js_call_amd('mod_meetletacbfree/meetlet_modal_scroll', 'init'); $PAGE->requires->js_call_amd('mod_meetletacbfree/view', 'init'); if ($cm->groupmode) { $groupid = groups_get_activity_group($cm, true) ?: $groupid; } $inst = instance::get_from_cmid($cm->id, (int)$groupid); // First paint: local schedule only — no Adobe API. Browser polls status after load. $lifecycle = meetingstatus::resolve_local($inst, (int)$USER->id); $featurejoin = featureaccess::allowed(featureaccess::JOIN, $context, $meetlet); $event = \mod_meetletacbfree\event\course_module_viewed::create([ 'objectid' => $meetlet->id, 'context' => $context, ]); $event->add_record_snapshot('course', $course); $event->add_record_snapshot('meetletacbfree', $meetlet); $event->trigger(); $renderer = $PAGE->get_renderer('mod_meetletacbfree'); $page = new view_page($inst, config::is_configured(), $lifecycle, true); echo $OUTPUT->header(); if ($cm->groupmode) { groups_print_activity_menu($cm, $PAGE->url); } echo html_writer::div('', '', [ 'data-meetlet-config' => json_encode([ 'cmid' => (int)$cm->id, 'groupid' => (int)$groupid, 'licenseUsable' => true, 'canjoin' => $featurejoin, 'joinable' => $featurejoin && !empty($lifecycle['joinable']), 'status' => (string)$lifecycle['status'], 'statusMessage' => (string)$lifecycle['message'], 'statusPollSeconds' => 15, 'strJoinWaiting' => get_string('joinblocked_waitinghost', 'meetletacbfree'), 'strJoiningTitle' => get_string('joiningtitle', 'meetletacbfree'), 'strJoiningText' => get_string('joining', 'meetletacbfree'), 'strRecordingTitle' => get_string('preparingrecordingtitle', 'meetletacbfree'), 'strRecordingText' => get_string('preparingrecording', 'meetletacbfree'), 'canrecordings' => featureaccess::allowed(featureaccess::RECORDINGS, $context, $meetlet), ], JSON_UNESCAPED_UNICODE), 'hidden' => 'hidden', ]); echo $renderer->render($page); echo $OUTPUT->footer();