Live #1: Kenapa Harus Kuliah?
Kak Belva punya yang namanya 'kertas keramat' untuk membantu dirinya dalam persiapan kuliah, yuk cari tahu lebih lanjut cerita dari kak Belva!
Live #2 - Goal Setting Masuk PTN Impian
Kak Iman menjelaskan pentingnya perencanaan matang untuk kuliah dengan 5 years canvas plan. Kak Iman juga punya resep rahasia tentang manajemen waktu yang namanya 4D,
langsung simak videonya ya!
Live #3 - Kenali Jalur Masuk PTN Sejak Dini (UM, SBMPTN, SNMPTN)
Kak Fikrie menjelaskan secara detil jalur masuk perguruan tinggi (SNMPTN, SBMPTN, dan Mandiri) yang perlu kamu persiapkan sejak dini. Jangan salah arah, jangan salah
langkah!
Live #4 - Tips Memilih Jurusan
Kak Giri menjelaskan tips supaya kamu nggak salah jurusan dengan framework RADAR. Yuk pelajari lebih lanjut dari kak Giri!
Live #5 - Mystery of Gap Year
Kak Yosef menjelaskan strategi persiapan kuliah bagi anak yang mengambil gap year dengan rumus S3DAP-nya, wah temen-temen yang sedang atau berencana ambil gap year
harus tahu rumus ini nih!
Live #6 - Hal yang Perlu Kamu Maksimalkan di Dunia Kuliah: Kompetisi, IPK, Organisasi, Magang
Kak Rayestu berbagi tips seputar memaksimalkan pengalaman di dunia kuliah dengan framework FAST. Yang kepo dunia kuliah itu seperti apa, wajib banget nonton video ini!
Live #7 - Cara Kuliah Gak Perlu Bayar (Beasiswa)
Kak Stephanie berbagi tips nih buat kalian biar bisa kuliah gak perlu bayar. Simak lebih lanjut strategi dapetin beasiswa dengan SIN3MA framework dari kak Steph, yuk!
Live #8 - Masterplan 2020
Kak Shenna menjelaskan template perencanaan persiapan kuliah yang bernama MASTERPLAN, yuk praktik membuat MASTERPLAN persiapan kuliah versi kamu!
<!doctype html>
<html class="no-js" lang="id">
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta name="author" content="PT Ruang Raya Indonesia" />
<meta name="description" content="" />
<meta name="generator" content="HubSpot" />
<title>UTBK Premium</title>
<link rel="shortcut icon" href="https://cdn-web-2.ruangguru.com/landing-pages/assets/hs/favicon60x60-3.png" />
<meta property="og:description" content="" />
<meta property="og:title" content="UTBK Premium" />
<meta name="twitter:description" content="" />
<meta name="twitter:title" content="UTBK Premium" />
<style>
a.cta_button {
-moz-box-sizing: content-box !important;
-webkit-box-sizing: content-box !important;
box-sizing: content-box !important;
vertical-align: middle;
}
.hs-breadcrumb-menu {
list-style-type: none;
margin: 0px 0px 0px 0px;
padding: 0px 0px 0px 0px;
}
.hs-breadcrumb-menu-item {
float: left;
padding: 10px 0px 10px 10px;
}
.hs-breadcrumb-menu-divider:before {
content: '›';
padding-left: 10px;
}
.hs-featured-image-link {
border: 0;
}
.hs-featured-image {
float: right;
margin: 0 0 20px 20px;
max-width: 50%;
}
@media (max-width: 568px) {
.hs-featured-image {
float: none;
margin: 0;
width: 100%;
max-width: 100%;
}
}
.hs-screen-reader-text {
clip: rect(1px, 1px, 1px, 1px);
height: 1px;
overflow: hidden;
position: absolute !important;
width: 1px;
}
</style>
<link
rel="stylesheet"
href="https://cdn-web-2.ruangguru.com/landing-page-web/public/staticpages/www.ruangguru.com/hs-fs/hub/2828691/hub_generated/module_assets/37590585364/1620034508120/module_37590585364_module-webview-utbk-home.min.css"
/>
<!-- Added by GoogleAnalytics integration -->
<script>
var _hsp = (window._hsp = window._hsp || []);
_hsp.push([
'addPrivacyConsentListener',
function (consent) {
if (consent.allowed || (consent.categories && consent.categories.analytics)) {
(function (i, s, o, g, r, a, m) {
i['GoogleAnalyticsObject'] = r;
(i[r] =
i[r] ||
function () {
(i[r].q = i[r].q || []).push(arguments);
}),
(i[r].l = 1 * new Date());
(a = s.createElement(o)), (m = s.getElementsByTagName(o)[0]);
a.async = 1;
a.src = g;
m.parentNode.insertBefore(a, m);
})(window, document, 'script', '//www.google-analytics.com/analytics.js', 'ga');
ga('create', 'UA-49650255-1', 'auto');
ga('send', 'pageview');
}
},
]);
</script>
<!-- /Added by GoogleAnalytics integration -->
<link rel="canonical" href="https://www.ruangguru.com/webview/utbk-premium" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<script>
(function (h, e, a, t, m, p) {
m = e.createElement(a);
m.async = !0;
m.src = t;
p = e.getElementsByTagName(a)[0];
p.parentNode.insertBefore(m, p);
})(window, document, 'script', 'https://u.heatmap.it/log.js');
</script>
<meta name="google-site-verification" content="VJAn1g6wmtTZPpTXh-B4xoSFEkUi5jcV74xQSr6jnOM" />
<script>
document.querySelector('meta[name="author"]').setAttribute('content', 'Ruangguru Tech Team');
</script>
<meta name="publisher" content="PT Ruang Raya Indonesia" />
<!-- Global site tag (gtag.js) - Google Analytics -->
<!--
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-49650255-1"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-49650255-1');
</script>
-->
<!-- Google Tag Manager -->
<script>
(function (w, d, s, l, i) {
w[l] = w[l] || [];
w[l].push({ 'gtm.start': new Date().getTime(), event: 'gtm.js' });
var f = d.getElementsByTagName(s)[0],
j = d.createElement(s),
dl = l != 'dataLayer' ? '&l=' + l : '';
j.async = true;
j.src = 'https://www.googletagmanager.com/gtm.js?id=' + i + dl;
f.parentNode.insertBefore(j, f);
})(window, document, 'script', 'dataLayer', 'GTM-PVNLZFT');
</script>
<!-- End Google Tag Manager -->
<meta property="og:url" content="https://www.ruangguru.com/webview/utbk-premium" />
<meta name="twitter:card" content="summary" />
<meta http-equiv="content-language" content="id" />
<link rel="stylesheet" href="https://cdn-web-2.ruangguru.com/landing-page-web/public/assets/common/layout.min.css" />
<link
rel="stylesheet"
href="https://cdn-web-2.ruangguru.com/landing-page-web/public/staticpages/www.ruangguru.com/hs-fs/hub/2828691/hub_generated/template_assets/32781682988/1666344401391/A_Ruangguru_Projects/1_SOP_Landing_Page/SOP_Style_Ruangguru.min.css"
/>
<link
rel="stylesheet"
href="https://cdn-web-2.ruangguru.com/landing-page-web/public/staticpages/www.ruangguru.com/hs-fs/hub/2828691/hub_generated/template_assets/37590707569/1620034513522/A_Ruangguru_Projects/Draft_Mareta/UTBK_Premium/utbk-webview-style.min.css"
/>
<meta name="robots" content="noindex, follow" />
<script type="module" crossorigin src="https://cdn-web-2.ruangguru.com/landing-page-web/public/staticpages/www.ruangguru.com/webview/utbk-premium/assets/index-Dqv5PPZA.js"></script>
</head>
<body class="hs-content-id-37326387586 hs-landing-page hs-page" style="">
<div class="header-container-wrapper">
<div class="header-container container-fluid"></div>
<!--end header -->
</div>
<!--end header wrapper -->
<div class="body-container-wrapper">
<div class="body-container container-fluid">
<div class="row-fluid-wrapper row-depth-1 row-number-1">
<div class="row-fluid">
<div class="span12 widget-span widget-type-custom_widget" style="" data-widget-type="custom_widget" data-x="0" data-w="12">
<div
id="hs_cos_wrapper_module_160546146620915"
class="hs_cos_wrapper hs_cos_wrapper_widget hs_cos_wrapper_type_module"
style=""
data-hs-cos-general-type="widget"
data-hs-cos-type="module"
>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<link
rel="stylesheet"
href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css"
integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk"
crossorigin="anonymous"
/>
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.9.0/slick.css" />
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.9.0/slick-theme.css" />
<!-- isi utbk premium -->
<div class="utbk">
<div class="utbk__heading">
<ul class="nav nav-pills justify-content-center" id="pills-tab" role="tablist">
<li class="nav-item">
<a class="nav-link active" id="pills-home-tab" data-toggle="pill" href="#pills-home" role="tab" aria-controls="pills-home" aria-selected="true">Video</a>
</li>
<li class="nav-item">
<a class="nav-link" id="pills-profile-tab" data-toggle="pill" href="#pills-profile" role="tab" aria-controls="pills-profile" aria-selected="false">E-Book</a>
</li>
</ul>
<div class="tab-content" id="pills-tabContent">
<div class="tab-pane fade show active" id="pills-home" role="tabpanel" aria-labelledby="pills-home-tab">
<div class="utbk__card">
<div class="utbk__card--video">
<a href="https://utbk.ruangguru.com/webview-utbk-premium/detail-video-1">
<img src="https://cdn-web-2.ruangguru.com/landing-pages/assets/hs/UTBK%20Premium/1.png" alt="" />
</a>
<div class="utbk__card--text mt-3">
<h2>Live #1: Kenapa Harus Kuliah?</h2>
<p>Kak Belva punya yang namanya 'kertas keramat' untuk membantu dirinya dalam persiapan kuliah, yuk cari tahu lebih lanjut cerita dari kak Belva!</p>
</div>
</div>
</div>
<div class="utbk__card">
<div class="utbk__card--video">
<a href="https://utbk.ruangguru.com/webview-utbk-premium/detail-video-2/">
<img src="https://cdn-web-2.ruangguru.com/landing-pages/assets/hs/UTBK%20Premium/2.png" alt="" />
</a>
<div class="utbk__card--text mt-3">
<h2>Live #2 - Goal Setting Masuk PTN Impian</h2>
<p>
Kak Iman menjelaskan pentingnya perencanaan matang untuk kuliah dengan 5 years canvas plan. Kak Iman juga punya resep rahasia tentang manajemen waktu yang namanya 4D,
langsung simak videonya ya!
</p>
</div>
</div>
</div>
<div class="utbk__card">
<div class="utbk__card--video">
<a href="https://utbk.ruangguru.com/webview-utbk-premium/detail-video-3/">
<img src="https://cdn-web-2.ruangguru.com/landing-pages/assets/hs/UTBK%20Premium/3.png" alt="" />
</a>
<div class="utbk__card--text mt-3">
<h2>Live #3 - Kenali Jalur Masuk PTN Sejak Dini (UM, SBMPTN, SNMPTN)</h2>
<p>
Kak Fikrie menjelaskan secara detil jalur masuk perguruan tinggi (SNMPTN, SBMPTN, dan Mandiri) yang perlu kamu persiapkan sejak dini. Jangan salah arah, jangan salah
langkah!
</p>
</div>
</div>
</div>
<div class="utbk__card">
<div class="utbk__card--video">
<a href="https://utbk.ruangguru.com/webview-utbk-premium/detail-video-4/">
<img src="https://cdn-web-2.ruangguru.com/landing-pages/assets/hs/UTBK%20Premium/4.png" alt="" />
</a>
<div class="utbk__card--text mt-3">
<h2>Live #4 - Tips Memilih Jurusan</h2>
<p>Kak Giri menjelaskan tips supaya kamu nggak salah jurusan dengan framework RADAR. Yuk pelajari lebih lanjut dari kak Giri!</p>
</div>
</div>
</div>
<div class="utbk__card">
<div class="utbk__card--video">
<a href="https://utbk.ruangguru.com/webview-utbk-premium/detail-video-5/">
<img src="https://cdn-web-2.ruangguru.com/landing-pages/assets/hs/UTBK%20Premium/5.png" alt="" />
</a>
<div class="utbk__card--text mt-3">
<h2>Live #5 - Mystery of Gap Year</h2>
<p>
Kak Yosef menjelaskan strategi persiapan kuliah bagi anak yang mengambil gap year dengan rumus S3DAP-nya, wah temen-temen yang sedang atau berencana ambil gap year
harus tahu rumus ini nih!
</p>
</div>
</div>
</div>
<div class="utbk__card">
<div class="utbk__card--video">
<a href="https://utbk.ruangguru.com/webview-utbk-premium/detail-video-6/">
<img src="https://cdn-web-2.ruangguru.com/landing-pages/assets/hs/UTBK%20Premium/6.png" alt="" />
</a>
<div class="utbk__card--text mt-3">
<h2>Live #6 - Hal yang Perlu Kamu Maksimalkan di Dunia Kuliah: Kompetisi, IPK, Organisasi, Magang</h2>
<p>
Kak Rayestu berbagi tips seputar memaksimalkan pengalaman di dunia kuliah dengan framework FAST. Yang kepo dunia kuliah itu seperti apa, wajib banget nonton video ini!
</p>
</div>
</div>
</div>
<div class="utbk__card">
<div class="utbk__card--video">
<a href="https://utbk.ruangguru.com/webview-utbk-premium/detail-video-7/">
<img src="https://cdn-web-2.ruangguru.com/landing-pages/assets/hs/UTBK%20Premium/7.png" alt="" />
</a>
<div class="utbk__card--text mt-3">
<h2>Live #7 - Cara Kuliah Gak Perlu Bayar (Beasiswa)</h2>
<p>
Kak Stephanie berbagi tips nih buat kalian biar bisa kuliah gak perlu bayar. Simak lebih lanjut strategi dapetin beasiswa dengan SIN3MA framework dari kak Steph, yuk!
</p>
</div>
</div>
</div>
<div class="utbk__card">
<div class="utbk__card--video">
<a href="https://utbk.ruangguru.com/webview-utbk-premium/detail-video-8">
<img src="https://cdn-web-2.ruangguru.com/landing-pages/assets/hs/UTBK%20Premium/8.png" alt="" />
</a>
<div class="utbk__card--text mt-3">
<h2>Live #8 - Masterplan 2020</h2>
<p>Kak Shenna menjelaskan template perencanaan persiapan kuliah yang bernama MASTERPLAN, yuk praktik membuat MASTERPLAN persiapan kuliah versi kamu!</p>
</div>
</div>
</div>
</div>
<!-- ebook -->
<div class="tab-pane fade" id="pills-profile" role="tabpanel" aria-labelledby="pills-profile-tab">
<div class="utbk__card" id="card-1">
<div class="utbk__card--video">
<div class="row">
<div class="col-3 utbk__card--ebook m-auto">
<img
src="https://cdn-web-2.ruangguru.com/landing-pages/assets/hs/UTBK%20Premium/ebook/latihan%20dan%20pembahasan%20soal%20HOTS%20UTBK%20SBMPTN%202020%20Saintek%201%20(1).png"
alt=""
/>
</div>
<div class="col-9 pl-0 my-auto">
<a href="https://utbk.ruangguru.com/webview-utbk-premium/detail-ebook-1"><h2>Latihan dan Pembahasan Soal HOTS UTBK SBMPTN 2020 Saintek</h2></a>
</div>
</div>
</div>
</div>
<div class="utbk__card" id="card-2">
<div class="utbk__card--video">
<div class="row">
<div class="col-3 utbk__card--ebook m-auto">
<img
src="https://cdn-web-2.ruangguru.com/landing-pages/assets/hs/UTBK%20Premium/ebook/latihan%20dan%20pembahasan%20soal%20HOTS%20UTBK%20SBMPTN%202020%20Soshum%201%20(1).png"
alt=""
/>
</div>
<div class="col-9 pl-0 my-auto">
<a href="https://utbk.ruangguru.com/webview-utbk-premium/detail-ebook-2"><h2>Latihan dan Pembahasan Soal HOTS UTBK SBMPTN 2020 Soshum</h2></a>
</div>
</div>
</div>
</div>
<div class="utbk__card" id="card-3">
<div class="utbk__card--video">
<div class="row">
<div class="col-3 utbk__card--ebook m-auto">
<img
src="https://cdn-web-2.ruangguru.com/landing-pages/assets/hs/UTBK%20Premium/ebook/latihan%20dan%20pembahasan%20soal%20HOTS%20UTBK%20SBMPTN%202020%20TPS%201%20(1).png"
alt=""
/>
</div>
<div class="col-9 pl-0 my-auto">
<a href="https://utbk.ruangguru.com/webview-utbk-premium/detail-ebook-3"><h2>Latihan dan Pembahasan Soal HOTS UTBK SBMPTN 2020 TPS</h2></a>
</div>
</div>
</div>
</div>
<div class="utbk__card" id="card-4">
<div class="utbk__card--video">
<div class="row">
<div class="col-3 utbk__card--ebook m-auto">
<img src="https://cdn-web-2.ruangguru.com/landing-pages/assets/hs/UTBK%20Premium/ebook/Info%20jurusan%20saintek%20dan%20soshum%20di%20Indonesia%201%20(1).png" alt="" />
</div>
<div class="col-9 pl-0 my-auto">
<a href="https://utbk.ruangguru.com/webview-utbk-premium/detail-ebook-4"><h2>Informasi Jurusan Saintek dan Soshum di Indonesia</h2></a>
</div>
</div>
</div>
</div>
<div class="utbk__card" id="card-5">
<div class="utbk__card--video">
<div class="row">
<div class="col-3 utbk__card--ebook m-auto">
<img src="https://cdn-web-2.ruangguru.com/landing-pages/assets/hs/UTBK%20Premium/ebook/Info%20Perguruan%20Tinggi%20Negeri%20di%20Indonesia%201%20(1).png" alt="" />
</div>
<div class="col-9 pl-0 my-auto">
<a href="https://utbk.ruangguru.com/webview-utbk-premium/detail-ebook-5"><h2>Informasi Perguruan Tinggi Negeri di Indonesia</h2></a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
<script
src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js"
integrity="sha384-OgVRvuATP1z7JjHLkuOU7Xw704+h835Lr+6QL9UvYjZE3Ipu6Tp75j7Bh/kR0JKI"
crossorigin="anonymous"
></script>
</div>
</div>
<!--end widget-span -->
</div>
<!--end row-->
</div>
<!--end row-wrapper -->
</div>
<!--end body -->
</div>
<!--end body wrapper -->
<script src="https://cdn-web-2.ruangguru.com/landing-page-web/public/staticpages/www.ruangguru.com/hs-fs/hub/2828691/hub_generated/module_assets/37590585364/1620034508034/module_37590585364_module-webview-utbk-home.min.js"></script>
<!-- Start of HubSpot Analytics Code -->
<script type="text/javascript">
var _hsq = _hsq || [];
_hsq.push(['setContentType', 'landing-page']);
_hsq.push(['setCanonicalUrl', 'https:\/\/www.ruangguru.com\/webview\/utbk-premium']);
_hsq.push(['setPageId', '37326387586']);
_hsq.push([
'setContentMetadata',
{
contentPageId: 37326387586,
legacyPageId: '37326387586',
contentFolderId: null,
contentGroupId: null,
abTestId: null,
languageVariantId: 37326387586,
languageCode: 'id',
},
]);
</script>
<script type="text/javascript">
var hsVars = {
render_id: '9ee60b6f-d3ff-4b66-a656-4fcbb69ccd04',
ticks: 1684630768195,
page_id: 37326387586,
content_group_id: 0,
portal_id: 2828691,
app_hs_base_url: 'https://app.hubspot.com',
cp_hs_base_url: 'https://cp.hubspot.com',
language: 'id',
analytics_page_type: 'landing-page',
analytics_page_id: '37326387586',
category_id: 1,
folder_id: 0,
is_hubspot_user: false,
};
</script>
<script src="https://unpkg.com/@dotlottie/player-component@latest/dist/dotlottie-player.mjs" type="module"></script>
<!-- Load CSS for all versions -->
<script>
// CSS loading function available for all versions
function loadFloatingCSS() {
// Check if CSS is already loaded
if (document.getElementById('fb-component-css')) {
return;
}
// Create and append CSS style block to head
const style = document.createElement('style');
style.id = 'fb-component-css';
style.textContent = `
.bantuan-container {
position: relative;
}
.bantuan-element {
position: fixed;
z-index: 999;
display: flex;
align-items: flex-end;
justify-content: flex-end;
cursor: pointer;
transition: all 0.6s ease;
}
.bantuan-top {
bottom: 11rem;
right: 2rem;
}
.bantuan-bottom {
bottom: 2rem;
right: 2rem;
}
.bantuan-top-2 {
bottom: 15rem;
right: 2rem;
}
.bantuan-top-3 {
bottom: 19rem;
right: 2rem;
}
.bantuan-bottom-2 {
bottom: 5rem;
right: 2rem;
}
.bantuan-bottom-3 {
bottom: 8rem;
right: 2rem;
}
@media (min-width: 768px) {
.bantuan-element img {
width: auto;
transition: all 0.4s ease;
}
.bantuan-top img {
width: 140px;
}
.bantuan-bottom img {
width: 140px;
}
.bantuan-top-2 img,
.bantuan-top-3 img {
width: 140px;
}
.bantuan-bottom-2 img,
.bantuan-bottom-3 img {
width: 140px;
}
.bantuan-element.clicked {
bottom: 9rem;
right: 2.5rem;
}
.bantuan-element.clicked img {
width: auto;
height: 64px;
}
}
@media (max-width: 767px) {
.bantuan-top {
bottom: 8rem;
right: 1rem;
align-items: center;
}
.bantuan-bottom {
bottom: 2rem;
right: 1.25rem;
align-items: center;
}
.bantuan-top-2 {
bottom: 12rem;
right: 1rem;
align-items: center;
}
.bantuan-top-3 {
bottom: 16rem;
right: 1rem;
align-items: center;
}
.bantuan-bottom-2 {
bottom: 5rem;
right: 1.25rem;
align-items: center;
}
.bantuan-bottom-3 {
bottom: 8rem;
right: 1.25rem;
align-items: center;
}
.bantuan-element img {
width: auto;
}
.bantuan-top img,
.bantuan-top-2 img,
.bantuan-top-3 img {
width: 96px;
}
.bantuan-bottom img,
.bantuan-bottom-2 img,
.bantuan-bottom-3 img {
width: 96px;
}
}
.bantuan-element:hover {
transform: scale(1.05);
}
.bantuan-element img {
max-width: 100%;
height: auto;
}
`;
document.head.appendChild(style);
}
// Load CSS immediately
loadFloatingCSS();
</script>
<div id="bantuan-divs-container" style="position: relative" data-product="ruangguru" data-table=""></div>
<script>
class FloatingDivsComponent {
constructor(product = 'ruangguru', table = 'rg_promo_banner') {
this.container = document.getElementById('bantuan-divs-container');
this.floatingElements = [];
this.product = product;
this.table = table;
// Configuration
this.config = {
baseApiUrl: 'https://gw.ruangguru.com/api/v3/rdb/p_ddgy8hjx5dxsqx/rg_banner/views/',
apiKey: 'vLyK3dJrDBRmOwueX2OJXibMkgsUbBk0WS4ua2p1',
maxElements: 2,
zIndexBase: 100,
};
// Build dynamic API URL based on table parameter
this.config.apiUrl = this.buildApiUrl();
this.init();
}
buildApiUrl() {
const baseUrl = this.config.baseApiUrl;
const tableName = this.table || 'rg_promo_banner';
const queryParams =
'offset=0&limit=99999&sort=rankPosition&where=(type,eq,floating)~and(showIn,anyof,landingPage)~and(hide,is,false)~and(product,eq,' +
this.product +
')&nested%5Bcta%5D%5Bfields%5D=Id,name,ctaId,imageUrl,ctaLink,targetUrl';
return `${baseUrl}${tableName}?${queryParams}`;
}
async init() {
try {
await this.fetchFloatingElements();
this.renderFloatingElements();
} catch (error) {
console.error('Failed to initialize floating divs component:', error);
}
}
async fetchFloatingElements() {
try {
const options = {
method: 'GET',
headers: {
'xc-token': this.config.apiKey || 'vLyK3dJrDBRmOwueX2OJXibMkgsUbBk0WS4ua2p1',
},
};
const urlNoco = this.config.apiUrl;
const response = await fetch(urlNoco, options);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
this.floatingElements = this.processApiResponse(data);
} catch (error) {
console.error('Error fetching floating elements:', error);
throw error;
}
}
processApiResponse(data) {
if (!data || !data.list || !Array.isArray(data.list)) {
return [];
}
// Ensure we only get maximum 2 elements
const limitedElements = data.list.slice(0, this.config.maxElements);
return limitedElements;
}
renderFloatingElements() {
if (!this.container || this.floatingElements.length === 0) {
return;
}
// Additional safeguard: ensure we never render more than maxElements
const elementsToRender = this.floatingElements.slice(0, this.config.maxElements);
// Clean up existing elements and their event listeners
this.cleanupExistingElements();
// Clear existing content
this.container.innerHTML = '';
elementsToRender.forEach((element, index) => {
const floatingDiv = this.createFloatingDiv(element, index);
this.container.appendChild(floatingDiv);
});
}
cleanupExistingElements() {
// Clear existing elements (no need for event listener cleanup with CSS approach)
const existingElements = this.container.querySelectorAll('[data-floating-element]');
existingElements.forEach(element => {
element.remove();
});
}
createFloatingDiv(element, index) {
const div = document.createElement('div');
const cta = element.cta[0]; // Use the first CTA
// Add data attribute for cleanup tracking
div.setAttribute('data-floating-element', 'true');
// Apply CSS classes based on rankPosition
const positionClass = this.getPositionClass(element.rankPosition, index);
div.className = `bantuan-element ${positionClass}`;
div.style.zIndex = this.config.zIndexBase + index;
// Create the link and image
const link = document.createElement('a');
link.href = 'https://cta.ruangguru.com/' + cta.ctaId || '#';
link.target = '_blank';
// Add tracking attributes
link.setAttribute('data-tracking-event-type', 'landing_page__core__item_click');
link.setAttribute(
'data-tracking-context',
JSON.stringify({
product_name: this.product,
cta_action: 'redirection',
cta_action_detail: link.href,
item_type: 'floating',
item_name: element.name || 'Floating element',
item_category: 'payment',
item_position: index,
item_serial: null,
section_type: 'floating_item',
section_position: 'body',
section_name: 'floating_item',
})
);
const img = document.createElement('img');
img.src = element.imageUrl + '?h=200&convert=webp';
img.alt = element.name || 'Floating element';
img.loading = 'lazy';
// Add click tracking
link.addEventListener('click', () => {
this.trackClick(element, cta);
});
link.appendChild(img);
div.appendChild(link);
return div;
}
getPositionClass(rankPosition, index) {
// Define positioning classes based on rankPosition
if (rankPosition === 1) {
return 'bantuan-top'; // Top position
} else if (rankPosition === 2) {
return 'bantuan-bottom'; // Bottom position
} else {
// For additional elements, distribute them evenly
return `bantuan-${index % 2 === 0 ? 'top' : 'bottom'}-${Math.floor(index / 2) + 1}`;
}
}
trackClick(element, cta) {
// Implement click tracking logic here
console.log('Floating element clicked:', {
elementId: element.Id,
elementName: cta.name,
ctaId: cta.ctaId,
targetUrl: cta.targetUrl,
});
}
// Public method to manually refresh
async refresh() {
try {
await this.fetchFloatingElements();
this.renderFloatingElements();
} catch (error) {
console.error('Failed to refresh floating elements:', error);
throw error;
}
}
// Public method to get current floating elements
getFloatingElements() {
return [...this.floatingElements];
}
}
// Initialize the component when DOM is ready
document.addEventListener('DOMContentLoaded', () => {
// Get product and table parameters from data attributes
const container = document.getElementById('bantuan-divs-container');
const product = container.getAttribute('data-product') || 'ruangguru';
const table = container.getAttribute('data-table') || 'rg_promo_banner';
new FloatingDivsComponent(product, table);
});
// Export for use in other modules if needed
if (typeof module !== 'undefined' && module.exports) {
module.exports = FloatingDivsComponent;
}
</script>
<!-- Tracker -->
<script src="https://unpkg.com/analytics@0.8.1/dist/analytics.min.js"></script>
<script type="text/javascript" src="https://unpkg.com/analytics-plugin-trackable/dist/analytics-plugin-trackable.min.js"></script>
<!-- Google Tag Manager (noscript) -->
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-N8DPXH6" height="0" width="0" style="display: none; visibility: hidden"></iframe></noscript>
<!-- End Google Tag Manager (noscript) -->
<script type="text/javascript" defer>
/* Initialize analytics */
var Analytics = _analytics.init({
app: 'brainAcademyLandingPage',
debug: false,
plugins: [analyticsTrackable()],
});
Analytics.ready(function () {
Analytics.page();
});
</script>
<!-- Generated by the HubSpot Template Builder - template version 1.03 -->
</body>
</html>