Files
shoptime/com.twin.app.shoptime/src/actions/commonActions.js
optrader a6eee92641 [251210] fix: 백화현상디버깅-App.js commonActions.js 원복
🕐 커밋 시간: 2025. 12. 10. 10:01:38

📊 변경 통계:
  • 총 파일: 2개
  • 추가: +16줄
  • 삭제: -14줄

📝 수정된 파일:
  ~ com.twin.app.shoptime/src/App/App.js
  ~ com.twin.app.shoptime/src/actions/commonActions.js

🔧 함수 변경 내용:
  📄 com.twin.app.shoptime/src/App/App.js (javascript):
     Added: AppBase(), keyDownEvent(), mouseMoveEvent()
    🔄 Modified: function()
  📄 com.twin.app.shoptime/src/actions/commonActions.js (javascript):
    🔄 Modified: alertToast(), setFocus(), cancelFocusElement(), addReservation(), Job()

🔧 주요 변경 내용:
  • 핵심 비즈니스 로직 개선
2025-12-10 10:01:38 +09:00

813 lines
23 KiB
JavaScript

// src/actions/commonActions.js
import { Job } from '@enact/core/util';
import Spotlight from '@enact/spotlight';
// <<<<<<< HEAD
import appinfo from '../../webos-meta/appinfo.json';
import appinfo35 from '../../webos-meta/appinfo35.json';
import appinfo79 from '../../webos-meta/appinfo79.json';
import * as lunaSend from '../lunaSend';
import * as Config from '../utils/Config';
import * as HelperMethods from '../utils/helperMethods';
import { types } from './actionTypes';
import { createDebugHelpers } from '../utils/debug';
// 디버그 헬퍼 설정
const DEBUG_MODE = false;
const { dlog, derror } = createDebugHelpers(DEBUG_MODE);
// =======
// import appinfo from "../../webos-meta/appinfo.json";
// import appinfo35 from "../../webos-meta/appinfo35.json";
// import appinfo79 from "../../webos-meta/appinfo79.json";
// import { handleBypassLink } from "../App/bypassLinkHandler";
// import * as lunaSend from "../lunaSend";
// import { initialLocalSettings } from "../reducers/localSettingsReducer";
// import * as Config from "../utils/Config";
// import * as HelperMethods from "../utils/helperMethods";
// import { types } from "./actionTypes";
// >>>>>>> gitlab/develop
export const changeAppStatus = (status) => ({
type: types.CHANGE_APP_STATUS,
payload: status,
});
export const changeBroadcastEvent = (status) => ({
type: types.SEND_BROADCAST,
payload: status,
});
export const changeLocalSettings = (status) => ({
type: types.CHANGE_LOCAL_SETTINGS,
payload: status,
});
export const gnbOpened = (status) => ({
type: types.GNB_OPENED,
payload: status,
});
// <<<<<<< HEAD
export const setShowPopup = (config, addPayload = {}) => {
let payload;
if (typeof config === 'string') {
payload = { activePopup: config, ...addPayload };
} else {
payload = config;
}
// =======
// export const setShowPopup = (config) => {
// const payload = typeof config === "string" ? { activePopup: config } : config;
// >>>>>>> gitlab/develop
return {
type: types.SET_SHOW_POPUP,
payload,
};
};
export const setShowSecondaryPopup = (popupType, payload = {}) => ({
type: types.SET_SHOW_SECONDARY_POPUP,
payload: { activePopup: popupType, ...payload },
});
export const setHidePopup = () => ({
type: types.SET_HIDE_POPUP,
});
export const setHideSecondaryPopup = () => ({
type: types.SET_HIDE_SECONDARY_POPUP,
});
export const showOptionalTermsConfirmPopup = () => ({
type: types.SHOW_OPTIONAL_TERMS_CONFIRM_POPUP,
});
export const hideOptionalTermsConfirmPopup = () => ({
type: types.HIDE_OPTIONAL_TERMS_CONFIRM_POPUP,
});
export const toggleOptionalTermsConfirm = (selected) => ({
type: types.TOGGLE_OPTIONAL_TERMS_CONFIRM,
payload: selected,
});
export const setExitApp = () => (dispatch) => {
dispatch({ type: types.SET_EXIT_APP });
dlog('Exiting App...');
if (typeof window === 'object') {
window.close();
} else {
window.location.reload();
}
};
export const getLoginUserData = (userData) => ({
type: types.GET_LOGIN_USER_DATA,
payload: userData,
});
export const loadingComplete = (status) => ({
type: 'loadingComplete',
payload: status,
});
export const alertToast = (payload) => (dispatch) => {
if (typeof window === 'object' && !window.PalmSystem) {
dispatch(changeAppStatus({ toast: true, toastText: payload }));
} else {
lunaSend.createToast(payload);
}
};
export const getSystemSettings = () => (dispatch, getState) => {
dlog('getSystemSettings ');
lunaSend.getSystemSettings(
{ category: 'caption', keys: ['captionEnable'] },
{
onSuccess: () => {},
onFailure: () => {},
onComplete: (res) => {
dlog('getSystemSettings onComplete', res);
if (res && res.settings) {
if (typeof res.settings.captionEnable !== 'undefined') {
dispatch(
changeAppStatus({
captionEnable:
res.settings.captionEnable === 'on' || res.settings.captionEnable === true,
})
);
}
}
},
}
);
};
export const getHttpHeaderForServiceRequest = (onComplete) => (dispatch, getState) => {
dlog('getHttpHeaderForServiceRequest ');
const { serverType, ricCodeSetting, languageSetting } = getState().localSettings;
lunaSend.getHttpHeaderForServiceRequest({
onSuccess: (res) => {
const version = res['X-Device-Netcast-Platform-Version'] || '';
const webOSVersion = Number(version.substring(0, version.lastIndexOf('.')));
// 4버전 미만인 경우 다른 처리 없이 버전 정보만 저장
if (webOSVersion < 4) {
dispatch(
changeAppStatus({
webOSVersion,
showLoadingPanel: { show: false },
})
);
return;
}
// 4버전 이상인 경우 기존 로직 수행
dlog('getHttpHeaderForServiceRequest', res);
const convertedRes = {
Authorization: res['Authorization'],
'X-Authentication': res['X-Authentication'],
'X-Device-ID': res['X-Device-ID'],
'X-Device-Product': res['X-Device-Product'],
'X-Device-Platform': res['X-Device-Platform'],
'X-Device-Model': res['X-Device-Model'],
'X-Device-Eco-Info': res['X-Device-Eco-Info'],
'X-Device-Country': res['X-Device-Country'],
'X-Device-Language': res['X-Device-Language'],
'X-Device-Netcast-Platform-Version': res['X-Device-Netcast-Platform-Version'],
'X-Device-Publish-Flag': res['X-Device-Publish-Flag'],
'X-Device-Fck': res['X-Device-Fck'],
'X-Device-Eula': res['X-Device-Eula'],
'X-Device-SDK-VERSION': res['X-Device-SDK-VERSION'],
};
convertedRes['X-Device-Personalization'] = 'Y';
if (
typeof window === 'object' &&
window.PalmSystem &&
window.PalmSystem.identifier &&
process.env.REACT_APP_MODE !== 'DEBUG'
) {
convertedRes['app_id'] = window.PalmSystem.identifier ?? appinfo.id;
} else {
if (ricCodeSetting === 'aic') {
convertedRes['app_id'] = appinfo.id;
} else if (ricCodeSetting === 'eic') {
convertedRes['app_id'] = appinfo35.id;
} else if (ricCodeSetting === 'ruc') {
convertedRes['app_id'] = appinfo79.id;
} else {
convertedRes['app_id'] = appinfo.id;
}
}
convertedRes['app_ver'] = '1.0.0';
convertedRes['cntry_cd'] = res['X-Device-Country'];
convertedRes['prod_cd'] = res['X-Device-Product'];
convertedRes['plat_cd'] = res['X-Device-Platform'];
convertedRes['lang_cd'] = res['X-Device-Language'];
convertedRes['sdk_ver'] = res['X-Device-SDK-VERSION'];
convertedRes['publish_flag'] = res['X-Device-Publish-Flag'];
convertedRes['os_ver'] = version;
convertedRes['dvc_auth'] = res['X-Authentication'];
if (serverType !== 'system') {
if (ricCodeSetting === 'eic') {
if (languageSetting === 'GB') {
convertedRes['cntry_cd'] = 'GB';
convertedRes['X-Device-Country'] = 'GB';
res['HOST'] = 'GB.nextlgsdp.com';
}
if (languageSetting === 'DE') {
convertedRes['cntry_cd'] = 'DE';
convertedRes['X-Device-Country'] = 'DE';
res['HOST'] = 'DE.nextlgsdp.com';
}
}
if (ricCodeSetting === 'aic') {
convertedRes['cntry_cd'] = 'US';
convertedRes['X-Device-Country'] = 'US';
res['HOST'] = 'US.nextlgsdp.com';
}
if (ricCodeSetting === 'ruc') {
convertedRes['cntry_cd'] = 'RU';
convertedRes['X-Device-Country'] = 'RU';
res['HOST'] = 'RU.nextlgsdp.com';
}
}
if (convertedRes['cntry_cd'] === 'US') {
convertedRes['lang_cd'] = 'en-US';
}
if (convertedRes['cntry_cd'] === 'DE') {
convertedRes['lang_cd'] = 'de-DE';
}
if (convertedRes['cntry_cd'] === 'GB') {
convertedRes['lang_cd'] = 'en-GB';
}
if (convertedRes['cntry_cd'] === 'RU') {
convertedRes['lang_cd'] = 'ru-RU';
}
dispatch({ type: types.GET_HTTP_HEADER, payload: convertedRes });
dispatch(
changeAppStatus({
webOSVersion,
serverHOST: res['HOST'],
mbr_no: res['X-User-Number'],
})
);
const parameters = { serviceName: 'LGE' };
const mbrNo = res['X-User-Number'];
lunaSend.getLoginUserData(parameters, {
onSuccess: (loginRes) => {
const userId = loginRes.id ?? '';
const profileNick = loginRes.profileNick || userId.split('@')[0];
dispatch(
getLoginUserData({
userId,
userNumber: mbrNo,
profileNick,
})
);
},
onFailure: (err) => derror('LoginData fetch failed ', err),
});
},
onFailure: (err) => {
dlog('getHttpHeaderForServiceRequest fail', err);
},
});
};
export const getDeviceId = (onComplete) => (dispatch, getState) => {
lunaSend.getDeviceId(
{ idType: ['LGUDID'] },
{
onSuccess: (res) => {
dlog('getDeviceId ', res);
if (res.returnValue) {
const deviceId = res.idList[0].idValue;
dispatch(changeAppStatus({ deviceId: deviceId }));
}
},
onFailure: (err) => {
dlog(err);
},
onComplete: () => {
dlog('getDeviceId done');
if (onComplete) onComplete();
},
}
);
};
export const getTermsAgreeYn = () => (dispatch, getState) => {
dispatch({ type: types.GET_TERMS_AGREE_YN_START });
try {
const { terms } = getState().home.termsData.data;
dlog(
'getTermsAgreeYn',
terms.map((term) => ({
trmsId: term.trmsId,
trmsTpCd: term.trmsTpCd,
trmsAgrFlag: term.trmsAgrFlag,
trmsPopFlag: term.trmsPopFlag,
}))
);
// MST00405 선택약관 정보만 따로 출력
const optionalTerm = terms.find((term) => term.trmsTpCd === 'MST00405');
if (optionalTerm) {
dlog('getTermsAgreeYn MST00405 선택약관:', {
trmsId: optionalTerm.trmsId,
trmsTpCd: optionalTerm.trmsTpCd,
trmsAgrFlag: optionalTerm.trmsAgrFlag,
trmsPopFlag: optionalTerm.trmsPopFlag,
});
} else {
dlog('getTermsAgreeYn MST00405 선택약관을 찾을 수 없습니다.');
}
const termsAgreeFlag = terms.reduce((acc, term) => {
switch (term.trmsTpCd) {
case 'MST00401':
acc.privacyTerms = term.trmsAgrFlag;
break;
case 'MST00402':
acc.serviceTerms = term.trmsAgrFlag;
break;
case 'MST00403':
acc.purchaseTerms = term.trmsAgrFlag;
break;
case 'MST00404':
acc.paymentTerms = term.trmsAgrFlag;
break;
case 'MST00405':
acc.optionalTerms = term.trmsAgrFlag;
break;
default:
break;
}
return acc;
}, {});
dispatch({
type: types.GET_TERMS_AGREE_YN_SUCCESS,
payload: termsAgreeFlag,
});
} catch (error) {
derror('getTermsAgreeYn error:', error);
dispatch({ type: types.GET_TERMS_AGREE_YN_FAILURE });
}
};
// export const getTermsAgreeYn = () => (dispatch, getState) => {
// const { terms } = getState().home.termsData.data;
// // dlog("getTermsAgreeYn", terms);
// dlog("getTermsAgreeYn", terms.map(term => ({
// trmsId: term.trmsId,
// trmsTpCd: term.trmsTpCd,
// trmsAgrFlag: term.trmsAgrFlag,
// trmsPopFlag: term.trmsPopFlag,
// })));
// const termsAgreeFlag = terms.reduce((acc, term) => {
// switch (term.trmsTpCd) {
// case "MST00401":
// acc.privacyTerms = term.trmsAgrFlag;
// break;
// case "MST00402":
// acc.serviceTerms = term.trmsAgrFlag;
// break;
// case "MST00403":
// acc.purchaseTerms = term.trmsAgrFlag;
// break;
// case "MST00404":
// acc.paymentTerms = term.trmsAgrFlag;
// break;
// case "MST00405":
// acc.optionalTerms = term.trmsAgrFlag;
// break;
// default:
// break;
// }
// return acc;
// }, {});
// dispatch({
// type: types.GET_TERMS_AGREE_YN,
// payload: termsAgreeFlag,
// });
// };
export const launchMembershipApp = () => (dispatch, getState) => {
const state = getState();
const panels = state.panels.panels;
const currentPanel = panels[panels.length - 1];
const returnPath = JSON.stringify({
name: currentPanel.name,
panelInfo: currentPanel.panelInfo || {},
});
if (typeof window === 'object' && !window.PalmSystem) {
// const testBypass = {
// name: Config.panel_names.CATEGORY_PANEL,
// panelInfo: {
// COUNT: 31,
// currentSpot: null,
// dropDownTab: 0,
// expsOrd: 1,
// focusedContainerId: null,
// lgCatCd: "1017",
// lgCatNm: "LG Electronics",
// tab: 0,
// },
// };
dlog('returnPath', returnPath);
// setTimeout(() => {
// dispatch(handleBypassLink(JSON.stringify(testBypass)));
// }, 1000);
return;
}
lunaSend.launchMembershipApp(returnPath, {
onSuccess: (res) => {
dlog('membership launch success: ', res);
},
onFailure: (err) => {
dlog('membership launch failed:', err);
},
});
};
let rafId = null;
export const setFocus = (spotlightId) => ({
type: types.SET_FOCUS,
payload: spotlightId,
});
export const focusElement = (spotlightId) => (dispatch, getState) => {
dispatch(setFocus(spotlightId));
if (typeof window === 'object') {
rafId = window.requestAnimationFrame(() => {
Spotlight.focus(spotlightId);
});
}
};
export const cancelFocusElement = () => () => {
if (rafId !== null) {
if (typeof window === 'object') {
window.cancelAnimationFrame(rafId);
rafId = null;
}
}
};
let broadcastTimer = null;
export const sendBroadCast =
({ type, moreInfo }) =>
(dispatch, getState) => {
clearTimeout(broadcastTimer);
dispatch(changeBroadcastEvent({ type, moreInfo }));
broadcastTimer = setTimeout(() => {
//clear after 500ms
dispatch(changeBroadcastEvent({}));
}, 5000);
};
export const requestLiveSubtitle =
({ mediaId, enable }) =>
(dispatch, getState) => {
const webOSVersion = getState().common.appStatus.webOSVersion;
if (Number(webOSVersion) <= 4.5) {
lunaSend.setSubtitleEnable(mediaId, enable, {
onSuccess: (res) => {
dlog(res);
},
onFailure: (err) => {
dlog(err);
},
});
return;
} else {
lunaSend.setSubtitleEnableOver5(mediaId, enable, {
onSuccess: (res) => {
dlog(res);
},
onFailure: (err) => {
dlog(err);
},
});
}
};
export const addReservation = (data) => (dispatch) => {
lunaSend.addReservation(data, {
onSuccess: (res) => {
dlog('addReservation success:', res);
// Optionally show success toast
if (res && res.returnValue) {
dispatch(alertToast('Reminder set successfully'));
}
},
onFailure: (err) => {
derror('addReservation failed:', err);
// Use the helper function for better error handling
const errorMessage = HelperMethods.getReservationErrorMessage(err);
dispatch(alertToast(errorMessage));
},
onComplete: () => {
dlog('addReservation completed');
},
});
};
export const deleteReservationCallback = (scheduleIdList) => (dispatch) => {
lunaSend.deleteReservationCallback(scheduleIdList, {
onSuccess: (res) => {
// dispatch(alertToast("success" + JSON.stringify(res)));
},
onFailure: (err) => {
// dispatch(alertToast("failed" + JSON.stringify(err)));
},
});
};
export const deleteReservation = (showId) => (dispatch) => {
lunaSend.deleteReservation({
onSuccess: (res) => {
let items = [];
res.results.forEach((item) => {
let obj = JSON.parse(item.information.information);
items.push({
_id: item._id,
showId: obj.showId,
});
});
let index = items.findIndex((item) => item.showId === showId);
let deletedIdList = [];
if (index !== -1) {
deletedIdList.push(items[index]._id);
dispatch(deleteReservationCallback(deletedIdList));
}
},
onFailure: (err) => {
dlog(err);
},
});
};
export const setSystemNotice = () => ({
type: types.SET_SYSTEM_NOTICE,
});
export const setSystemTermination = (isinitialLoad) => ({
type: types.SET_SYSTEM_TERMINATION,
payload: { isinitialLoad },
});
export const setDeepLink = (deepLinkInfo) => ({
type: types.SET_DEEP_LINK,
payload: deepLinkInfo,
});
export const setSecondLayerInfo = (secondLayerInfo) => ({
type: types.SET_SECOND_LAYER_INFO,
payload: secondLayerInfo,
});
export const setGNBMenu = (gnbMenu) => ({
type: types.SET_GNB_MENU,
payload: gnbMenu,
});
export const setDeviceRegistered = (isRegistered) => ({
type: types.SET_DEVICE_REGISTERED,
payload: isRegistered,
});
export const clearErrorMessage = () => ({
type: types.CLEAR_ERROR_MESSAGE,
});
export const showError =
(errorCode, errorMsg, shouldPopPanel = false, retDetailCode = null, returnBindStrings = null) =>
(dispatch) => {
dispatch(
setShowPopup(Config.ACTIVE_POPUP.errorPopup, {
data: {
errorCode,
errorMsg,
retDetailCode,
shouldPopPanel,
returnBindStrings,
},
})
);
};
//luna-send -f -n 1 luna://com.webos.service.db/delKind '{"id": "com.lgshop.app:5"}' -a "com.lgshop.app"
export const deleteOldDb8Datas = () => (dispatch) => {
for (let i = 1; i < 10; i++) {
lunaSend.deleteOldDb8(i, {
onSuccess: () => {},
onFailure: () => {},
});
}
dispatch(changeLocalSettings({ oldDb8Deleted: true }));
};
export const checkFirstLaunch = () => (dispatch) => {
lunaSend.checkFirstLaunch({
onSuccess: (res) => {
if (!res.returnValue) {
derror('Failed to check first launch status');
return;
}
if (res.results.length === 0) {
dlog('First launch detected - initializing localStorage');
if (typeof window === 'object') {
dispatch(changeLocalSettings({ phoneNumbers: {}, recentItems: [] }));
}
lunaSend.saveFirstLaunchInfo({
onSuccess: (saveRes) => {
dlog('First launch info saved to DB8:', saveRes);
dispatch(changeAppStatus({ isFirstLaunch: true }));
},
onFailure: (err) => {
derror('Failed to save first launch info:', err);
},
});
} else {
dlog('Not first launch - keeping existing settings');
dispatch(changeAppStatus({ isFirstLaunch: false }));
}
},
onFailure: (err) => {
derror('Failed to check first launch:', err);
},
});
};
let updateNetworkStateJob = new Job((dispatch, connected) => {
dispatch(changeAppStatus({ isInternetConnected: connected }));
});
export const getConnectionStatus = () => (dispatch, getState) => {
lunaSend.getConnectionStatus({
onSuccess: (res) => {
dlog('lunasend getConnectionStatus', res);
if (res.returnValue) {
const isInternet =
(res.wifi && res.wifi.onInternet === 'yes') ||
(res.wired && res.wired.onInternet === 'yes');
const isInternetConnected =
(res.wifi && res.wifi.state === 'connected') ||
(res.wired && res.wired.state === 'connected');
dlog('internetconnected.............', isInternet, isInternetConnected, res);
const connected = isInternet && isInternetConnected;
updateNetworkStateJob.startAfter(connected ? 100 : 3000, dispatch, connected);
}
},
onFailure: (err) => {
dlog(err);
},
onComplete: (res) => {
dlog('getConnectionStatus done', res);
},
});
};
// macAddress
export const getConnectionInfo = () => (dispatch, getState) => {
lunaSend.getConnectionInfo({
onSuccess: (res) => {
dlog('lunasend getConnectionStatus', res);
if (res && res.returnValue) {
const macAddress = res?.wiredInfo?.macAddress;
dlog('macAddress...........', macAddress, res);
}
},
onFailure: (err) => {
dlog('getConnentionInfo', err);
},
onComplete: (res) => {
dlog('getConnentionInfo done', res);
dispatch({
type: types.GET_DEVICE_MACADDRESS,
payload: res,
});
},
});
};
export const disableNotification = () => (dispatch, getState) => {
lunaSend.disableNotification({
onSuccess: (res) => {
dlog('lunasend disable notification success', res);
},
onFailure: (err) => {
dlog('lunasend disable notification failure', err);
},
onComplete: (res) => {
dlog('lunasend disable notification complete', res);
},
});
};
export const enableNotification = () => (dispatch, getState) => {
lunaSend.enableNotification({
onSuccess: (res) => {
dlog('lunasend enable notification success', res);
},
onFailure: (err) => {
dlog('lunasend enable notification failure', err);
},
onComplete: (res) => {
dlog('lunasend enable notification complete', res);
},
});
};
// 선택약관 팝업 상태 관리 액션 생성자들 (TV 환경 최적화)
export const setOptionalTermsPopupShown = (shown = true) => ({
type: types.SET_OPTIONAL_TERMS_POPUP_SHOWN,
payload: shown,
});
export const setOptionalTermsUserDecision = (decision) => ({
type: types.SET_OPTIONAL_TERMS_USER_DECISION,
payload: decision, // 'agreed' | 'declined' | null
});
export const resetOptionalTermsSession = () => ({
type: types.RESET_OPTIONAL_TERMS_SESSION,
});
// 선택약관 동의 처리를 위한 헬퍼 함수
export const handleOptionalTermsAgree = () => (dispatch) => {
dlog('[CommonActions] 선택약관 동의 처리');
dispatch(setOptionalTermsUserDecision('agreed'));
dispatch(setOptionalTermsPopupShown(true));
};
// 선택약관 거절 처리를 위한 헬퍼 함수
export const handleOptionalTermsDecline = () => (dispatch) => {
dlog('[CommonActions] 선택약관 거절 처리');
dispatch(setOptionalTermsUserDecision('declined'));
dispatch(setOptionalTermsPopupShown(true));
};
// 선택약관 상태 통합 업데이트 (TV 환경 최적화 - API 호출 없이 즉시 반영)
export const updateOptionalTermsAgreement =
(agreed = true) =>
(dispatch) => {
dlog(`[CommonActions] 선택약관 통합 상태 업데이트: ${agreed}`);
// 1. optionalTermsPopupFlow 업데이트 (TV 환경용)
dispatch(setOptionalTermsUserDecision(agreed ? 'agreed' : 'declined'));
dispatch(setOptionalTermsPopupShown(true));
// 2. 기본 optionalTermsAgree 상태 직접 업데이트 (API 호출 없이)
dispatch({
type: types.UPDATE_OPTIONAL_TERMS_AGREE_DIRECT,
payload: agreed,
});
// 3. termsAgreementStatus도 동기화
dispatch({
type: types.UPDATE_TERMS_AGREEMENT_STATUS_DIRECT,
payload: { MST00405: agreed },
});
};