Kia Motors realizó una presentación excepcional en SEMA 2018, trayendo algunos modelos exclusivos nuevos y coches modificados.
Kia Motors America sorprendió a todos al presentar el nuevo Forte GT por primera vez, pero eso no fue todo; también trajeron un Lamborgini Kia Forte Federation verde intenso, el Kia Telluride 2020, el Kia Forte Drift Car, el Stinger de la policía de Queensland y el K900 y Stinger DUB Edition.
Kia también utilizó el espacio entre Central & South Hall para realizar paseos con el Stinger y el nuevo Telluride 2020; usaron el Stinger para derrapar por el pequeño circuito y también prepararon un circuito todoterreno para los 4 nuevos modelos Telluride que fabricaron.
-
{
const btn = w.querySelector(`[data-action="${action}"]`)
if (!btn) return
btn.dataset.state = on ? 'on' : 'off'
const label = btn.querySelector('.post-action-label')
if (label) label.textContent = on ? label.dataset.labelOn : label.dataset.labelOff
})
}
function setCountAll(n) {
wrappers.forEach((w) => {
const c = w.querySelector('[data-count]')
if (c) c.textContent = String(n)
})
}
function getCount() {
const c = wrappers[0]?.querySelector('[data-count]')
return Number(c?.textContent || 0)
}
function getState(action) {
const btn = wrappers[0]?.querySelector(`[data-action="${action}"]`)
return btn?.dataset.state === 'on'
}
async function loadInitial() {
try {
// Comprobar sesion PRIMERO. Sin esto, lanzabamos 3 fetches en
// paralelo y los anonimos (mayoria) generaban 2 invocations
// inutiles (vote + bookmark devolvian 401). Con miles de page
// renders/h post-cutover ese desperdicio se notaba en logs y
// function invocations facturadas.
//
// Reusa el helper kcbFetchSession (BaseLayout) que cachea el resultado
// en sessionStorage 10 min. Navbar/PostComments/PostActions todos
// usan el mismo helper → 1 fetch por sesion en lugar de 1 por page.
// Fallback in-place si el helper no esta cargado (orden inesperado).
if (typeof window.kcbFetchSession === 'function') {
window.__kcbSession = window.kcbFetchSession()
} else {
window.__kcbSession = window.__kcbSession || new Promise((resolve) => {
const start = () => {
fetch('/api/auth/session-check/', { credentials: 'same-origin' })
.then((r) => (r.ok ? r.json() : null))
.then(resolve)
.catch(() => resolve(null))
}
if ('requestIdleCallback' in window) {
requestIdleCallback(start, { timeout: 2000 })
} else {
setTimeout(start, 1000)
}
})
}
const s = await window.__kcbSession
if (s) {
userAuthenticated = Boolean(s.authenticated)
}
// Solo si el usuario esta autenticado pedimos su estado per-post.
// Para anonimos: vote_count se queda con el valor SSR inicial
// (data-count en el HTML); voted/bookmarked permanecen 'off'.
if (!userAuthenticated) return
const [voteRes, bmRes] = await Promise.all([
fetch(`/api/vote/${encodeURIComponent(slug)}`).catch(() => null),
fetch(`/api/bookmark/${encodeURIComponent(slug)}`).catch(() => null),
])
if (voteRes && voteRes.ok) {
const v = await voteRes.json()
setStateAll('like', Boolean(v.voted))
if (typeof v.vote_count === 'number') setCountAll(v.vote_count)
}
if (bmRes && bmRes.ok) {
const b = await bmRes.json()
setStateAll('bookmark', Boolean(b.bookmarked))
}
} catch {
/* silencioso — botones quedan en estado off */
}
}
function flashStatusAll(action, msg) {
wrappers.forEach((w) => {
const btn = w.querySelector(`[data-action="${action}"]`)
if (!btn) return
const prevTitle = btn.title
btn.title = msg
btn.classList.add('is-flash')
setTimeout(() => {
btn.title = prevTitle
btn.classList.remove('is-flash')
}, 1800)
})
}
async function handleVote() {
if (!userAuthenticated) {
flashStatusAll('like', signinHint)
const next = encodeURIComponent(location.pathname + location.search)
location.href = `/login/?next=${next}`
return
}
const prevState = getState('like')
// Optimistic UI (todas las instancias sincronizadas)
setStateAll('like', !prevState)
setCountAll(getCount() + (prevState ? -1 : 1))
try {
const res = await fetch(`/api/vote/${encodeURIComponent(slug)}`, { method: 'POST' })
if (!res.ok) throw new Error('vote failed')
const data = await res.json()
setStateAll('like', Boolean(data.voted))
if (typeof data.vote_count === 'number') setCountAll(data.vote_count)
// GA4: solo cuenta el voto positivo (toggle ON), no la retirada.
if (data.voted && window.kcbTrack) {
window.kcbTrack('post_vote', { slug })
}
} catch {
setStateAll('like', prevState)
setCountAll(getCount() + (prevState ? 1 : -1))
}
}
async function handleBookmark() {
if (!userAuthenticated) {
flashStatusAll('bookmark', signinHint)
const next = encodeURIComponent(location.pathname + location.search)
location.href = `/login/?next=${next}`
return
}
const prevState = getState('bookmark')
setStateAll('bookmark', !prevState)
try {
const res = await fetch(`/api/bookmark/${encodeURIComponent(slug)}`, { method: 'POST' })
if (!res.ok) throw new Error('bookmark failed')
const data = await res.json()
setStateAll('bookmark', Boolean(data.bookmarked))
// GA4: solo cuenta el bookmark positivo (toggle ON), no la retirada.
if (data.bookmarked && window.kcbTrack) {
window.kcbTrack('post_bookmark', { slug })
}
} catch {
setStateAll('bookmark', prevState)
}
}
// Bind click en TODOS los botones de TODAS las instancias
wrappers.forEach((w) => {
w.querySelector('[data-action="like"]')?.addEventListener('click', handleVote)
w.querySelector('[data-action="bookmark"]')?.addEventListener('click', handleBookmark)
})
loadInitial()
} // bindAll
})()
})(); Agregar Korean Car Blog en Agrega Korean Car Blog a tus fuentes preferidas en Google
Sigue leyendo
Más sobre este tema
Spy Shots1 sept 2020
Kia Forte facelift captado por dentro y por fuera
Spy Shots27 ago 2020
Kia Forte facelift captado de cerca
Spy Shots18 ago 2020
2021 Sonata N-Line: galería completa
Spy Shots17 ago 2020
































Comentarios
Aún no hay comentarios. Sé el primero.