diff --git a/js/main.js b/js/main.js
index 7654607..c1d9a53 100644
--- a/js/main.js
+++ b/js/main.js
@@ -465,6 +465,51 @@ const BACK_LINK_PATH_TITLE = {
'/home': '홈',
'/blog': '블로그',
};
+const FINDMYDEVICE_AUTH_REQUIRED = location.pathname.startsWith('/findmydevice');
+let findmydeviceAuthenticated = !FINDMYDEVICE_AUTH_REQUIRED;
+
+function renderAuthErrorPage() {
+ document.body.innerHTML = `
+
+
+
+ `;
+ const renderPin = () => window.CustomAuthPin?.render({
+ mount: '#findMyShortcut',
+ title: '비밀번호',
+ placeholder: '비밀번호',
+ backLabel: '채건닷컴',
+ backHref: 'https://chaegeon.com/',
+ onSuccess: () => location.reload(),
+ });
+ if (window.CustomAuthPin) {
+ renderPin();
+ return;
+ }
+ const script = document.createElement('script');
+ script.src = '/custom/common/js/auth-pin.js';
+ script.onload = renderPin;
+ document.body.appendChild(script);
+}
+
+const findmydeviceAuthPromise = FINDMYDEVICE_AUTH_REQUIRED
+ ? fetch('/custom/launcher/api.php?session=1', { credentials: 'same-origin' })
+ .then(res => res.ok ? res.json() : Promise.reject())
+ .then(session => {
+ findmydeviceAuthenticated = !!session.authenticated;
+ return findmydeviceAuthenticated;
+ })
+ .catch(() => {
+ findmydeviceAuthenticated = false;
+ return false;
+ })
+ : Promise.resolve(true);
+
+function runAfterFindAuth(callback) {
+ return findmydeviceAuthPromise
+ .then(ok => ok ? callback() : null)
+ .catch(() => null);
+}
function cleanPageTitle(title) {
return String(title || '')
@@ -622,7 +667,7 @@ document.getElementById('langToggle').addEventListener('click', () => {
localStorage.setItem('currentLang', langCode);
applyLanguage(langCode);
- fetchDeviceData(true).then(data => updateDOMWithData(data));
+ runAfterFindAuth(() => fetchDeviceData(true).then(data => updateDOMWithData(data)));
// locateBtn 즉시 재렌더링
if (document.getElementById('locateBtn')) {
@@ -680,41 +725,12 @@ document.addEventListener('DOMContentLoaded', () => {
setupBackLink();
- function renderAuthErrorPage() {
- document.body.innerHTML = `
-
-
-
- `;
- const renderPin = () => window.CustomAuthPin?.render({
- mount: '#findMyShortcut',
- title: '비밀번호',
- placeholder: '비밀번호',
- backLabel: '채건닷컴',
- backHref: 'https://chaegeon.com/',
- onSuccess: () => location.reload(),
+ if (FINDMYDEVICE_AUTH_REQUIRED) {
+ findmydeviceAuthPromise.then(ok => {
+ if (!ok) renderAuthErrorPage();
});
- if (window.CustomAuthPin) {
- renderPin();
- return;
- }
- const script = document.createElement('script');
- script.src = '/custom/common/js/auth-pin.js';
- script.onload = renderPin;
- document.body.appendChild(script);
}
- if (location.pathname.startsWith('/findmydevice')) {
- fetch('/custom/launcher/api.php?session=1', { credentials: 'same-origin' })
- .then(res => res.ok ? res.json() : Promise.reject())
- .then(session => {
- if (!session.authenticated) {
- renderAuthErrorPage();
- }
- })
- .catch(renderAuthErrorPage);
- }
-
const btnArea = document.querySelector('body > div.btnArea');
const pageModifyLink = btnArea?.querySelectorAll('a')[1]?.getAttribute('href') || '';
if (btnArea) btnArea.remove();
@@ -832,12 +848,12 @@ document.addEventListener('DOMContentLoaded', () => {
// 3) 지도 히스토리 초기화 & 라이브 데이터 재요청 + 현재 위치로 이동
resetHistoryLayer();
- fetchDeviceData(true).then(data => {
- updateDOMWithData(data);
- if (data.latitude && data.longitude && mapState.map) {
- mapState.map.panTo(new naver.maps.LatLng(data.latitude, data.longitude));
- }
- });
+ runAfterFindAuth(() => fetchDeviceData(true).then(data => {
+ updateDOMWithData(data);
+ if (data.latitude && data.longitude && mapState.map) {
+ mapState.map.panTo(new naver.maps.LatLng(data.latitude, data.longitude));
+ }
+ }));
});
}
@@ -917,7 +933,7 @@ document.addEventListener('DOMContentLoaded', () => {
endEl.addEventListener(ev, () => fire(true));
});
- fire(false);
+ runAfterFindAuth(() => fire(false));
})();
});
@@ -970,13 +986,15 @@ document.getElementById('autoUpdateSwitch').addEventListener('change', () => {
});
setInterval(() => {
+ if (!findmydeviceAuthenticated) return;
if (document.getElementById('autoUpdateSwitch')?.checked) {
callDeviceWebhook('auto_tick');
}
}, 10000);
-
-setInterval(() => {
- if (lastUpdateISOTime) {
+
+setInterval(() => {
+ if (!findmydeviceAuthenticated) return;
+ if (lastUpdateISOTime) {
const el = document.getElementById("lastUpdateTime");
if (el) el.textContent = getRelativeTime(lastUpdateISOTime);
}
@@ -2398,6 +2416,10 @@ function syncUpdateBtn() {
}
function fetchDeviceData(includeLang = true, range = null) {
+ if (!findmydeviceAuthenticated) {
+ return Promise.reject(new Error('not_authenticated'));
+ }
+
const params = new URLSearchParams(includeLang ? { lang: langCode } : { hashonly: 1 });
// 우선순위: 직접 인자(range) > 전역 오버라이드(_overrideRange)