Files
shoptime/com.twin.app.shoptime/src/lunaSend/common.js
optrader 5c3324c120 [251124] fix: Log정리-3
🕐 커밋 시간: 2025. 11. 24. 12:13:08

📊 변경 통계:
  • 총 파일: 10개
  • 추가: +29줄
  • 삭제: -110줄

📁 추가된 파일:
  + com.twin.app.shoptime/src/utils/debug.js

📝 수정된 파일:
  ~ com.twin.app.shoptime/src/actions/playActions.js
  ~ com.twin.app.shoptime/src/actions/productActions.js
  ~ com.twin.app.shoptime/src/components/VideoPlayer/VideoPlayer.js
  ~ com.twin.app.shoptime/src/hooks/useFocusHistory/useFocusHistory.js
  ~ com.twin.app.shoptime/src/lunaSend/common.js
  ~ com.twin.app.shoptime/src/reducers/panelReducer.js
  ~ com.twin.app.shoptime/src/views/HomePanel/HomePanel.jsx
  ~ com.twin.app.shoptime/src/views/MyPagePanel/MyPageSub/TermsOfService/TermsOfOptional.jsx
  ~ com.twin.app.shoptime/src/views/PlayerPanel/PlayerPanel.jsx

🔧 함수 변경 내용:
  📄 com.twin.app.shoptime/src/actions/playActions.js (javascript):
     Deleted: dwarn(), derror()
  📄 com.twin.app.shoptime/src/actions/productActions.js (javascript):
     Deleted: dwarn(), derror()
  📄 com.twin.app.shoptime/src/components/VideoPlayer/VideoPlayer.js (javascript):
     Deleted: dwarn(), derror()
  📄 com.twin.app.shoptime/src/hooks/useFocusHistory/useFocusHistory.js (javascript):
     Deleted: dwarn(), derror()
  📄 com.twin.app.shoptime/src/lunaSend/common.js (javascript):
     Deleted: dwarn(), derror()
  📄 com.twin.app.shoptime/src/reducers/panelReducer.js (javascript):
     Deleted: dwarn(), derror()
  📄 com.twin.app.shoptime/src/views/HomePanel/HomePanel.jsx (javascript):
     Deleted: dwarn(), derror()
  📄 com.twin.app.shoptime/src/views/MyPagePanel/MyPageSub/TermsOfService/TermsOfOptional.jsx (javascript):
     Deleted: dwarn(), derror()
  📄 com.twin.app.shoptime/src/views/PlayerPanel/PlayerPanel.jsx (javascript):
     Deleted: dwarn(), derror()

🔧 주요 변경 내용:
  • 핵심 비즈니스 로직 개선
  • UI 컴포넌트 아키텍처 개선
  • API 서비스 레이어 개선
  • 공통 유틸리티 함수 최적화

Performance: 코드 최적화로 성능 개선 기대
2025-11-24 12:13:09 +09:00

523 lines
15 KiB
JavaScript

import appinfo from '../../webos-meta/appinfo.json';
import { alertToast } from '../actions/commonActions';
import { store } from '../store/store';
import LS2Request from './LS2Request';
import { createDebugHelpers } from '../utils/debug';
// 디버그 헬퍼 설정
const DEBUG_MODE = false;
const { dlog, dwarn, derror } = createDebugHelpers(DEBUG_MODE);
export const getConnectionStatus = ({ onSuccess, onFailure, onComplete }) => {
if (typeof window === 'object' && !window.PalmSystem) {
dlog('LUNA SEND getConnectionStatus');
//test
// setTimeout(() => {
// onSuccess({
// returnValue: true,
// wifi: { state: "disconnected", onInternet: "no" },
// wired: { state: "disconnected", onInternet: "no" },
// });
// setTimeout(() => {
// onSuccess({
// returnValue: true,
// wifi: { state: "connected", onInternet: "yes" },
// wired: { state: "connected", onInternet: "yes" },
// });
// }, 20000);
// }, 10000);
return 'Some Hard Coded Mock Data';
} else {
return new LS2Request().send({
service: 'luna://com.webos.service.connectionmanager',
method: 'getStatus',
subscribe: true,
parameters: {},
onSuccess,
onFailure,
onComplete,
});
}
};
export const createToast = (message) => {
if (typeof window === 'object' && !window.PalmSystem) {
dlog('LUNA SEND createToast message', message);
return;
}
return new LS2Request().send({
service: 'luna://com.webos.notification',
method: 'createToast',
parameters: {
message: message,
iconUrl: '',
noaction: true,
},
onSuccess: (res) => {
dlog('LUNA SEND createToast success', message);
},
onFailure: (err) => {
derror('LUNA SEND createToast failed', err);
},
});
};
let httpHeaderHandler = null;
export const getHttpHeaderForServiceRequest = ({ onSuccess, onFailure, onComplete }) => {
if (typeof window === 'object' && window.PalmSystem && process.env.REACT_APP_MODE !== 'DEBUG') {
if (httpHeaderHandler) {
httpHeaderHandler.cancel();
}
httpHeaderHandler = new LS2Request().send({
service: 'luna://com.webos.service.sdx',
method: 'getHttpHeaderForServiceRequest',
subscribe: true,
parameters: {},
onSuccess: (res) => {
try {
dlog('[serverHost][LS2] onSuccess HOST:', res && res.HOST);
dlog('[serverHost][LS2] onSuccess raw:', res);
} catch (e) {}
onSuccess && onSuccess(res);
},
onFailure: (err) => {
derror('[serverHost][LS2] onFailure:', err);
onFailure && onFailure(err);
},
onComplete: (res) => {
dlog('[serverHost][LS2] onComplete:', res);
onComplete && onComplete(res);
},
});
return httpHeaderHandler;
} else {
const serverType = store.getState().localSettings.serverType;
const userNumber = serverType === 'prd' ? 'US2412306099093' : 'US2210240095608';
const mockRes = {
HOST: 'qt2-US.nextlgsdp.com',
'X-User-Number': userNumber,
Authorization:
'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJuZXh0bGdzZHAuY29tIiwiYXVkIjoibmV4dGxnc2RwLmNvbSIsImlhdCI6MTcwNzc4NTUyNSwiZXhwIjoxNzA3NzkyNzI1LCJtYWNBZGRyZXNzIjoiZWVkMDQ2NjdiNjUzOWU3YmQxMDA1OTljYjBkYTI5ZjRjZTgyZGZlOGZkNzIzMDAxZGVmMjg4NWRkNWZiODRmNWNiMzZlM2QwNzYzNWZjZGJjYWNjNGVjMzI5NWIwNjZjOTMwNmNmNDI1ZGQzMmQ2MDMxMjc1NWNkOTIyNjEwMzcifQ.vqPdYGnN46diesDBLzA4UhACCJVdIycLs7wZu9M55Hc',
'X-Authentication': 'MkOLvUocrJ69RH/iV1ZABJhjR2g=',
'X-Device-ID':
'OemUY5qbPITZv96QKlxrtcqT6ypeX6us2qANLng3/0QCUhv2mecK1UDTMYb/hjpjey9dC/kFycc/5R8u+oK56JIWyYC4V278z64YDPKbDXIsd+eECvyf+Rdm8BneIUPM',
'X-Device-Product': 'webOSTV 6.0',
'X-Device-Platform': 'W21A',
'X-Device-Model': 'HE_DTV_W20P_AFADATAA',
'X-Device-Eco-Info': '1',
'X-Device-Country': 'US',
'X-Device-Language': 'en-US',
'X-Device-Netcast-Platform-Version': '6.4.0',
'X-Device-Publish-Flag': 'N',
'X-Device-Fck': '253',
'X-Device-SDK-VERSION': '1.0.0',
'X-Device-Eula':
'additionalDataAllowed,takeOnAllowed,networkAllowed,generalTermsAllowed,chpAllowed,customAdAllowed,acrOnAllowed,voice2Allowed,voiceAllowed,acrAdAllowed',
};
try {
dlog('[serverHost][LS2][MOCK] onSuccess HOST:', mockRes.HOST);
dlog('[serverHost][LS2][MOCK] onSuccess raw:', mockRes);
} catch (e) {}
onSuccess(mockRes);
}
};
export const getSystemSettings = (parameters, { onSuccess, onFailure, onComplete }) => {
if (typeof window === 'object' && window.PalmSystem && process.env.REACT_APP_MODE !== 'DEBUG') {
return new LS2Request().send({
service: 'luna://com.webos.settingsservice',
method: 'getSystemSettings',
subscribe: true,
parameters: parameters,
onSuccess,
onFailure,
onComplete,
});
} else if (typeof window === 'object') {
const language =
typeof window.navigator === 'object'
? window.navigator.language || window.navigator.userLanguage
: 'en-US';
const res = {
settings: {
smartServiceCountryCode2: language.split('-')[1],
captionEnable: true,
},
returnValue: true,
};
onSuccess(res);
onComplete(res);
}
};
export function checkValidCountry(ricCode, country) {
if (ricCode === 'aic') {
if (country === 'US') return true;
else return false;
} else if (ricCode === 'eic') {
if (country === 'GB' || country === 'DE') return true;
else return false;
} else if (ricCode === 'ruc') {
if (country === 'RU') return true;
else return false;
} else {
if (country === 'US') {
return true;
} else {
return false;
}
}
}
// 3.0 ~ 4.5
export const setSubtitleEnable = (mediaId, captionEnable, { onSuccess, onFailure, onComplete }) => {
if (typeof window === 'object' && window.PalmSystem && process.env.REACT_APP_MODE !== 'DEBUG') {
if (captionEnable) {
return new LS2Request().send({
service: 'luna://com.webos.service.tv.subtitle',
method: 'enableSubtitle',
parameters: { pipelineId: mediaId },
onSuccess,
onFailure,
onComplete,
});
} else {
return new LS2Request().send({
service: 'luna://com.webos.service.tv.subtitle',
method: 'disableSubtitle',
parameters: { pipelineId: mediaId },
onSuccess,
onFailure,
onComplete,
});
}
}
};
// 5.0
export const setSubtitleEnableOver5 = (
mediaId,
captionEnable,
{ onSuccess, onFailure, onComplete }
) => {
if (typeof window === 'object' && window.PalmSystem) {
return new LS2Request().send({
service: 'luna://com.webos.media',
method: 'setSubtitleEnable',
parameters: { enable: captionEnable, mediaId: mediaId },
onSuccess,
onFailure,
onComplete,
});
}
};
// system Alert with time validation
export const addReservation = (data, { onSuccess, onFailure, onComplete }) => {
if (typeof window === 'object' && !window.PalmSystem) {
dlog('LUNA SEND addReservation data', data);
return;
}
const createReservation = () => {
return new LS2Request().send({
service: 'luna://com.webos.service.tvReservationAgent',
method: 'add',
parameters: {
scheduleType: 'LGShopping',
startTime: {
year: data.startTime.year,
month: data.startTime.month,
day: data.startTime.day,
hour: data.startTime.hour,
minute: data.startTime.minute,
second: data.startTime.second,
},
callback: {
method: 'luna://com.webos.notification/createAlert',
params: {
message: data.params.message,
buttons: [
{
label: data.params.buttons[0].label,
onclick: 'luna://com.webos.applicationManager/launch',
params: {
id: window.PalmSystem.identifier ?? appinfo.id,
params: data.params.launch,
},
},
{
label: data.params.buttons[1].label,
},
],
autoTimeout: 30,
},
},
information: {
showId: data.params.showId,
chanId: data.params.chanId,
},
},
onSuccess,
onFailure: (err) => {
derror('LUNA SEND addReservation failed', err);
// Check if error is related to invalid current time
if (err && err.errorText && err.errorText.includes('Invalid current time')) {
dlog('Invalid current time error detected, will retry after time validation');
// Don't call onFailure immediately, let the retry logic handle it
return;
}
onFailure(err);
},
onComplete,
});
};
// First, validate system time before creating reservation
const validateTimeAndCreateReservation = (retryCount = 0, maxRetries = 3) => {
dlog(`LUNA SEND validating system time, attempt ${retryCount + 1}`);
getSystemTime({
onSuccess: (timeRes) => {
dlog('LUNA SEND system time validation success', timeRes);
// Time is available, proceed with reservation
createReservation();
},
onFailure: (timeErr) => {
derror('LUNA SEND system time validation failed', timeErr);
if (retryCount < maxRetries) {
// Retry with exponential backoff
const delay = Math.min(1000 * Math.pow(2, retryCount), 5000); // Max 5 seconds
dlog(`LUNA SEND retrying time validation in ${delay}ms`);
setTimeout(() => {
validateTimeAndCreateReservation(retryCount + 1, maxRetries);
}, delay);
} else {
dlog('LUNA SEND max retries exceeded for time validation');
// Still try to create reservation as fallback
createReservation();
}
},
onComplete: () => {
dlog('LUNA SEND system time validation complete');
},
});
};
// Start the validation and reservation process
validateTimeAndCreateReservation();
};
export const deleteReservationCallback = (scheduleIdList, { onSuccess, onFailure, onComplete }) => {
if (typeof window === 'object' && !window.PalmSystem) {
dlog('LUNA SEND deleteReservationCallback scheduleIdList', scheduleIdList);
return;
}
return new LS2Request().send({
service: 'luna://com.webos.service.tvReservationAgent',
method: 'delete',
parameters: {
scheduleIdList: scheduleIdList,
},
onSuccess,
onFailure,
onComplete,
});
};
export const deleteReservation = ({ onSuccess, onFailure, onComplete }) => {
if (typeof window === 'object' && !window.PalmSystem) {
dlog('LUNA SEND deleteReservation');
return;
}
return new LS2Request().send({
service: 'luna://com.palm.db',
method: 'search',
parameters: {
query: {
from: 'com.webos.service.tvReservationAgent.info:1',
orderBy: 'startTime',
filter: [{ prop: 'reserveType', op: '=', val: 6 }], // 6 LG Shopping 전용.
},
},
onSuccess,
onFailure,
onComplete,
});
};
export const deleteOldDb8 = (kind, { onSuccess, onFailure, onComplete }) => {
if (typeof window === 'object' && !window.PalmSystem) {
dlog('LUNA SEND deleteOldDb8');
onSuccess && onSuccess();
return;
}
const id = window.PalmSystem.identifier ?? appinfo.id;
return new LS2Request().send({
service: 'luna://com.webos.service.db',
method: 'delKind',
parameters: {
id: id + ':' + kind,
},
onSuccess,
onFailure,
onComplete,
});
};
export const checkFirstLaunch = ({ onSuccess, onFailure, onComplete }) => {
if (typeof window === 'object' && !window.PalmSystem) {
dlog('LUNA SEND checkFirstLaunch');
return;
}
const id = window.PalmSystem.identifier ?? appinfo.id;
return new LS2Request().send({
service: 'luna://com.webos.service.db',
method: 'find',
parameters: {
query: {
from: `${id}:20`,
where: [{ prop: 'type', op: '=', val: 'app_init' }],
},
},
onSuccess,
onFailure,
onComplete,
});
};
export const saveFirstLaunchInfo = ({ onSuccess, onFailure, onComplete }) => {
if (typeof window === 'object' && !window.PalmSystem) {
dlog('LUNA SEND saveFirstLaunchInfo');
onSuccess({ returnValue: true });
return;
}
const id = window.PalmSystem.identifier ?? appinfo.id;
return new LS2Request().send({
service: 'luna://com.webos.service.db',
method: 'put',
parameters: {
object: [
{
_kind: `${id}:20`,
type: 'app_init',
initialized: true,
timestamp: new Date().toISOString(),
},
],
},
onSuccess,
onFailure,
onComplete,
});
};
export const disableNotification = ({ onSuccess, onFailure, onComplete }) => {
if (typeof window === 'object' && !window.PalmSystem) {
dlog('LUNA SEND disableNotification');
return;
}
return new LS2Request().send({
service: 'luna://com.webos.notification',
method: 'disable',
parameters: {},
onSuccess,
onFailure,
onComplete,
});
};
export const enableNotification = ({ onSuccess, onFailure, onComplete }) => {
if (typeof window === 'object' && !window.PalmSystem) {
dlog('LUNA SEND enableNotification');
return;
}
return new LS2Request().send({
service: 'luna://com.webos.notification',
method: 'enable',
parameters: {},
onSuccess,
onFailure,
onComplete,
});
};
export const getConnectionInfo = ({ onSuccess, onFailure, onComplete }) => {
if (typeof window === 'object' && !window.PalmSystem) {
dlog('LUNA SEND disableConnectionInfo');
return;
} else {
return new LS2Request().send({
service: 'luna://com.webos.service.connectionmanager',
method: 'getinfo',
subscribe: false,
parameters: {},
onSuccess,
onFailure,
onComplete,
});
}
};
// Check system time availability
export const getSystemTime = ({ onSuccess, onFailure, onComplete }) => {
if (typeof window === 'object' && !window.PalmSystem) {
dlog('LUNA SEND getSystemTime - mock environment');
onSuccess({ returnValue: true, utc: Date.now() / 1000 });
return;
}
return new LS2Request().send({
service: 'luna://com.webos.settingsservice',
method: 'getSystemSettings',
subscribe: false,
parameters: {
category: 'time',
keys: ['autoClock'],
},
onSuccess: (res) => {
dlog('LUNA SEND getSystemTime success', res);
if (res && res.returnValue) {
// If autoClock is available, try to get actual time
new LS2Request().send({
service: 'luna://com.webos.service.systemservice',
method: 'clock/getTime',
subscribe: false,
parameters: {},
onSuccess: (timeRes) => {
dlog('LUNA SEND clock/getTime success', timeRes);
onSuccess(timeRes);
},
onFailure: (timeErr) => {
derror('LUNA SEND clock/getTime failed', timeErr);
// Fallback to settings response if getTime fails
onSuccess(res);
},
onComplete,
});
} else {
onFailure(res);
}
},
onFailure,
onComplete,
});
};