Ruangguru mau bagi-bagi hadiah, loh. Ayo, izinkan notifikasinya biar kamu dapat info terbaru.
2026-03-08 19:16
Diff
<!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>Notifikasi App</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="Notifikasi App" />
<meta name="twitter:description" content="" />
<meta name="twitter:title" content="Notifikasi App" />
<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/49928139324/1625129805798/module_49928139324_content_notifikasi_app_webview.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/notification" />
<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/notification" />
<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"
/>
<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/notification/assets/index-Dqv5PPZA.js"></script>
</head>
<body class="hs-content-id-49926747170 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_162511319144019"
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"
>
<link
rel="stylesheet"
href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css"
integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk"
crossorigin="anonymous"
/>
<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 class="webview">
<div class="banner">
<div class="page-center">
<div class="container-banner">
<div class="banner__left">
<p class="font-desc">Ruangguru mau bagi-bagi hadiah, loh. Ayo, izinkan notifikasinya biar kamu dapat info terbaru.</p>
</div>
<div class="banner__right">
<img src="https://cdn-web-2.ruangguru.com/landing-pages/assets/hs/Wivina_assets/Notifikasi%20App/banner_right.png" />
</div>
</div>
</div>
</div>
<div class="izinkan-notif">
<div class="container-izinkan">
<div class="izinkan__title">
<h2 class="font-subtitle">Izinkan Notifikasi</h2>
<p class="font-desc">Pilih merek HP-mu dan ikuti langkah-langkahnya</p>
</div>
<div class="izinkan__content">
<div class="faq-cont" id="faq-accordion" data-show="true">
<div class="faq-item">
<div class="accordion-faq font-desc font-primary" data-toggle="collapse" data-target="#faq1" aria-expanded="false" aria-controls="faq1">
<div class="wrap-acc">
<div class="img-accordion">
<img src="https://cdn-web-2.ruangguru.com/landing-pages/assets/hs/Wivina_assets/Notifikasi%20App/notif1.png" alt="notif" />
</div>
<div class="text">OPPO</div>
</div>
</div>
<div class="collapse" id="faq1" data-parent="#faq-accordion">
<div class="card card-body font-desc font-primary">
<ol type="1">
<li>Pergi ke halaman Pengaturan handphone kamu</li>
<li>Pilih menu “Notification & Status Bar”</li>
<li>Pilih menu “Manage Notifications”</li>
<li>Pilih aplikasi Ruangguru</li>
<li>Pastikan notifikasi dinyalakan pada menu “Allow Notification”</li>
</ol>
</div>
</div>
</div>
<div class="faq-item">
<div class="accordion-faq font-desc font-primary" data-toggle="collapse" data-target="#faq2" aria-expanded="false" aria-controls="faq2">
<div class="wrap-acc">
<div class="img-accordion">
<img src="https://cdn-web-2.ruangguru.com/landing-pages/assets/hs/Wivina_assets/Notifikasi%20App/notif2.png" alt="notif" />
</div>
<div class="text">Xiaomi</div>
</div>
</div>
<div class="collapse" id="faq2" data-parent="#faq-accordion">
<div class="card card-body font-desc font-primary">
<ol type="1">
<li>Pergi ke halaman Pengaturan handphone kamu</li>
<li>Pilih menu “Notification”</li>
<li>Pilih menu “Manage Notifications”</li>
<li>Cari aplikasi Ruangguru dan pastikan notifikasi pada Aplikasi Ruangguru diizinkan</li>
</ol>
</div>
</div>
</div>
<div class="faq-item">
<div class="accordion-faq font-desc font-primary" data-toggle="collapse" data-target="#faq3" aria-expanded="false" aria-controls="faq3">
<div class="wrap-acc">
<div class="img-accordion">
<img src="https://cdn-web-2.ruangguru.com/landing-pages/assets/hs/Wivina_assets/Notifikasi%20App/notif3.png" alt="notif" />
</div>
<div class="text">Samsung</div>
</div>
</div>
<div class="collapse" id="faq3" data-parent="#faq-accordion">
<div class="card card-body font-desc font-primary">
<ol type="1">
<li>Pergi ke halaman Pengaturan handphone kamu</li>
<li>Pilih menu “Notification”</li>
<li>Pastikan “Do not disturb” dimatikan</li>
<li>Pergi ke menu “App Notification”</li>
<li>Cari aplikasi Ruangguru dan pastikan notifikasi pada Aplikasi Ruangguru diizinkan</li>
</ol>
</div>
</div>
</div>
<div class="faq-item">
<div class="accordion-faq font-desc font-primary" data-toggle="collapse" data-target="#faq4" aria-expanded="false" aria-controls="faq4">
<div class="wrap-acc">
<div class="img-accordion">
<img src="https://cdn-web-2.ruangguru.com/landing-pages/assets/hs/Wivina_assets/Notifikasi%20App/notif4.png" alt="notif" />
</div>
<div class="text">Vivo</div>
</div>
</div>
<div class="collapse" id="faq4" data-parent="#faq-accordion">
<div class="card card-body font-desc font-primary">
<ol type="1">
<li>Pergi ke halaman Pengaturan handphone kamu</li>
<li>Pilih menu “Status Bar and Notification”</li>
<li>Pilih menu “Manage Notifications”</li>
<li>Pilih aplikasi Ruangguru</li>
<li>Pastikan notifikasi dinyalakan pada menu “Allow Notification”</li>
</ol>
</div>
</div>
</div>
<div class="faq-item">
<div class="accordion-faq font-desc font-primary" data-toggle="collapse" data-target="#faq5" aria-expanded="false" aria-controls="faq5">
<div class="wrap-acc">
<div class="img-accordion">
<img src="https://cdn-web-2.ruangguru.com/landing-pages/assets/hs/Wivina_assets/Notifikasi%20App/notif5.png" alt="notif" />
</div>
<div class="text">realme</div>
</div>
</div>
<div class="collapse" id="faq5" data-parent="#faq-accordion">
<div class="card card-body font-desc font-primary">
<ol type="1">
<li>Pergi ke halaman Pengaturan handphone kamu</li>
<li>Pilih menu “Notification & Status Bar”</li>
<li>Pilih menu “Manage Notifications”</li>
<li>Pilih aplikasi Ruangguru</li>
<li>Pastikan notifikasi dinyalakan pada menu “Allow Notification”</li>
</ol>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!--end widget-span -->
</div>
<!--end row-->
</div>
<!--end row-wrapper -->
</div>
<!--end body -->
</div>
<!--end body wrapper -->
<!-- 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\/notification']);
_hsq.push(['setPageId', '49926747170']);
_hsq.push([
'setContentMetadata',
{
contentPageId: 49926747170,
legacyPageId: '49926747170',
contentFolderId: null,
contentGroupId: null,
abTestId: null,
languageVariantId: 49926747170,
languageCode: 'id',
},
]);
</script>
<script type="text/javascript">
var hsVars = {
render_id: '3a324f35-f9c3-4e18-9758-b66af920045d',
ticks: 1684631159962,
page_id: 49926747170,
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: '49926747170',
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>