Oululaiset pääsevät tutustumaan kotikaupunkiinsa uudessa valossa loppiaisena käyttöön avautuvan uuden Cityspotting Oulu -mobiilisovelluksen avulla.
– Kyseessä ei ole turistikartta, vaan nimenomaan paikallisille tarkoitettu löytöretkiseikkailu. Sovelluksen spotit eivät ole lähtökohtaisesti niitä Google-haun ensimmäisiä rivejä, kun etsit kiinnostavia kohteita Oulusta, vaan yllättäviä ja piilossa olevia helmiä. Tutumpia kohteita, kuten vaikkapa Oulun Tähtitornin kahvilaa, esitellään aivan uudesta näkövinkkelistä, sovelluksen perustaja ja sisällöntuottaja Mikko Rinnevuori kertoo.
Kirjaudu tai luo Kaleva Media -tunnus
{ if (window.LorienDispatch) { const payload = { structuredEvent: { eventCategory: ’Funnel Tracking’, eventAction: action, }, }; if (typeof cb === ’function’) { // Never wait longer than CALLBACK_MAX_WAIT setTimeout(() => { cb(); }, CALLBACK_MAX_WAIT); payload.eventTimeout = CALLBACK_EVENT_TIMEOUT; payload.eventCallback = cb; } window.LorienDispatch.dispatchEvent(’loginWallEvent’, payload); } else if (typeof cb === ’function’) { cb(); } }; const trackLoginWallClick = (elem, action) => { elem.addEventListener(’click’, function (event) { event.preventDefault(); const url = event.currentTarget.href; const callbackToRedirectUser = () => { setTimeout(() => { window.location.href = url; }, CALLBACK_DELAY); }; trackLoginPaywallEvent(action, callbackToRedirectUser); }); }; const loginRequiredPaywall = (options) => { const trxId = KalevaPaywallUtils.generateTransactionId(); const pwCreateLink = document.querySelector(’.js-create-account-link’); const pwLoginLink = document.querySelector(’.js-login-link’); const createLinkUrlParams = KalevaPaywallUtils.getLoginwallUrlParams( options.channel, ’login-paywall-signup’, trxId, ); if (pwCreateLink.href.includes(’luotunnus’)) { pwCreateLink.href = pwCreateLink.href + createLinkUrlParams; } else { const newParams = createLinkUrlParams.replace( ’next=’, ’content_url=’ + encodeURIComponent(window.location.origin), ); const hasParams = pwCreateLink.href.includes(’?’); pwCreateLink.href = pwCreateLink.href + (hasParams ? newParams : newParams.replace(’&’, ’?’)); } const loginLinkUrl = pwLoginLink.href + KalevaPaywallUtils.getLoginwallUrlParams(options.channel, ’login-paywall-logins’, trxId); pwLoginLink.href = loginLinkUrl; window.dataLayer.push({ logintxid: trxId, }); trackLoginPaywallEvent(’Login Walled Page Landed’); trackLoginWallClick(pwCreateLink, ’Signup link clicked’); trackLoginWallClick(pwLoginLink, ’Login link clicked’); }; window.login_html_utils = { loginRequiredPaywall, }; })(); function initLoginwall() { !isProd && console.log(’initLoginwall’); // old implementation window.login_html_utils.loginRequiredPaywall({ channel: window.digitalData.channel.title, }); // new zephr stuff const darkTheme = [’body.videosite’, ’body.gallery’, ’.article.-rich’].some((cls) => document.querySelector(cls)); document.querySelector(’.paywall__cta’).classList.add(’km-button-rounded’); document.querySelector(’.paywall__cta’).classList.add(’km-button-rounded__brown’); document.querySelector(’.js-login-link’).classList.add(’no-link-styles’); document.querySelector(’.js-login-link’).classList.add(’km-button-rounded’); document .querySelector(’.js-login-link’) .classList.add(darkTheme ? ’km-button-rounded__black-outlined’ : ’km-button-rounded__white-outlined’); document.querySelector(’.paywall-css-container’).classList.add(darkTheme ? ’-theme-dark’ : ’-theme-normal’); if (darkTheme) { document.querySelector(’.article.-rich’)?.classList.add(’-with-paywall-dark’); } } ]]> { ctaLink.href = KalevaPaywallUtils.setUrlParameter(ctaLink.href, key, value); }); const currentUrlWithKvatxid = KalevaPaywallUtils.setUrlParameter(document.location.href, ’kvatxid’, kvatxid); ctaLink.href = KalevaPaywallUtils.setUrlParameter(ctaLink.href, ’kvatxid’, kvatxid); ctaLink.href = KalevaPaywallUtils.setUrlParameter(ctaLink.href, ’content_url’, currentUrlWithKvatxid); const loginLink = document.querySelector(’a.js-login-link’); if (loginLink) { loginLink.href = KalevaPaywallUtils.setUrlParameter(loginLink.href, ’next’, currentUrlWithKvatxid); } // KalevaPaywallContent.bindListeners(); const parentFrameLinks = document.querySelectorAll(’a.js-parent-frame-link’); Array.prototype.forEach.call(parentFrameLinks, function (element) { element.addEventListener(’click’, function (e) { e.preventDefault(); if (e.target.className.indexOf(’js-cta-link’) > -1) { window.dataLayer.push({ event: ’Paywall CTA click’, }); setTimeout(function () { document.location.href = e.target.getAttribute(’href’); }, 100); } else { document.location.href = e.target.getAttribute(’href’); } }); }); } ]]> t.trim()) .filter(Boolean) .forEach((benefit) => { container.innerHTML += ` ${benefit} ]]>
Lähde