🕐 커밋 시간: 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: 코드 최적화로 성능 개선 기대
523 lines
15 KiB
JavaScript
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,
|
|
});
|
|
};
|