🕐 커밋 시간: 2025. 09. 04. 12:56:09 💬 사용자 메시지: UserReviews와 CustomerImages에 페이지네이션 기능 추가 - CustomerImages: 5개씩 표시하는 View More 버튼 기능 - UserReviews: 모든 리뷰 데이터 표시로 변경 - Chromium 68 호환성 개선 (Optional Chaining 제거) - API 엔드포인트 및 Redux 액션/리듀서 추가 - 1124px 레이아웃 통일 및 View More 버튼 스타일링 📊 변경 통계: • 총 파일: 57개 • 추가: +1252줄 • 삭제: -540줄 📁 추가된 파일: + com.twin.app.shoptime/assets/images/icons/ic-gr-call-1.png + com.twin.app.shoptime/assets/images/image-review-sample-1.png + com.twin.app.shoptime/src/views/DetailPanel/DetailPanel.backup.jsx + com.twin.app.shoptime/src/views/DetailPanel/DetailPanel.backup.module.less + com.twin.app.shoptime/src/views/DetailPanel/ProductAllSection/ProductAllSection.jsx + com.twin.app.shoptime/src/views/DetailPanel/ProductAllSection/ProductAllSection.module.less + com.twin.app.shoptime/src/views/DetailPanel/ProductContentSection/ProductDescription/ProductDescription.jsx + com.twin.app.shoptime/src/views/DetailPanel/ProductContentSection/ProductDescription/ProductDescription.module.less + com.twin.app.shoptime/src/views/DetailPanel/ProductContentSection/ProductDescription/package.json + com.twin.app.shoptime/src/views/DetailPanel/ProductContentSection/ProductDetail/ProductDetail.new.jsx + com.twin.app.shoptime/src/views/DetailPanel/ProductContentSection/ProductDetail/ProductDetail.new.module.less + com.twin.app.shoptime/src/views/DetailPanel/ProductContentSection/UserReviews/CustomerImages/CustomerImages.jsx + com.twin.app.shoptime/src/views/DetailPanel/ProductContentSection/UserReviews/CustomerImages/CustomerImages.module.less + com.twin.app.shoptime/src/views/DetailPanel/ProductContentSection/UserReviews/UserReviews.jsx + com.twin.app.shoptime/src/views/DetailPanel/ProductContentSection/UserReviews/UserReviews.module.less + com.twin.app.shoptime/src/views/DetailPanel/ProductContentSection/UserReviews/UserReviewsPopup/UserReviewsPopup.figma.jsx + com.twin.app.shoptime/src/views/DetailPanel/ProductContentSection/UserReviews/UserReviewsPopup/UserReviewsPopup.jsx + com.twin.app.shoptime/src/views/DetailPanel/ProductContentSection/UserReviews/UserReviewsPopup/UserReviewsPopup.module.less + com.twin.app.shoptime/src/views/DetailPanel/ProductContentSection/UserReviews/package.json + com.twin.app.shoptime/src/views/DetailPanel/ProductContentSection/YouMayAlsoLike/YouMayAlsoLike.jsx + com.twin.app.shoptime/src/views/DetailPanel/ProductContentSection/YouMayAlsoLike/YouMayAlsoLike.module.less + com.twin.app.shoptime/src/views/DetailPanel/ProductContentSection/YouMayAlsoLike/package.json + com.twin.app.shoptime/src/views/DetailPanel/ProductInfoSection/QRCode/QRCode.jsx + com.twin.app.shoptime/src/views/DetailPanel/ProductInfoSection/QRCode/QRCode.module.less + com.twin.app.shoptime/src/views/DetailPanel/ProductInfoSection/QRCode/package.json + com.twin.app.shoptime/src/views/DetailPanel/ProductOverview/ProductOverview.jsx + com.twin.app.shoptime/src/views/DetailPanel/ProductOverview/ProductOverview.module.less + com.twin.app.shoptime/src/views/DetailPanel/ProductOverview/ProductPriceDisplay/BuyNowPriceDisplay/BuyNowPriceDisplay.jsx + com.twin.app.shoptime/src/views/DetailPanel/ProductOverview/ProductPriceDisplay/BuyNowPriceDisplay/BuyNowPriceDisplay.module.less + com.twin.app.shoptime/src/views/DetailPanel/ProductOverview/ProductPriceDisplay/BuyNowPriceDisplay/package.json + com.twin.app.shoptime/src/views/DetailPanel/ProductOverview/ProductPriceDisplay/ProductPriceDisplay.jsx + com.twin.app.shoptime/src/views/DetailPanel/ProductOverview/ProductPriceDisplay/ProductPriceDisplay.module.less + com.twin.app.shoptime/src/views/DetailPanel/ProductOverview/ProductPriceDisplay/ShopByMobilePriceDisplay/ShopByMobilePriceDisplay.jsx + com.twin.app.shoptime/src/views/DetailPanel/ProductOverview/ProductPriceDisplay/ShopByMobilePriceDisplay/ShopByMobilePriceDisplay.module.less + com.twin.app.shoptime/src/views/DetailPanel/ProductOverview/ProductPriceDisplay/ShopByMobilePriceDisplay/package.json + com.twin.app.shoptime/src/views/DetailPanel/ProductOverview/ProductPriceDisplay/package.json + com.twin.app.shoptime/src/views/DetailPanel/ProductOverview/package.json + com.twin.app.shoptime/src/views/DetailPanel/ThemeItemListOverlay/ThemeItemListOverlay.jsx + com.twin.app.shoptime/src/views/DetailPanel/ThemeItemListOverlay/ThemeItemListOverlay.module.less + com.twin.app.shoptime/src/views/DetailPanel/components/CustomScrollbar/CustomScrollbar.jsx + com.twin.app.shoptime/src/views/DetailPanel/components/CustomScrollbar/CustomScrollbar.module.less + com.twin.app.shoptime/src/views/DetailPanel/components/DetailMobileSendPopUp.jsx + com.twin.app.shoptime/src/views/DetailPanel/components/DetailMobileSendPopUp.module.less + com.twin.app.shoptime/src/views/DetailPanel/components/THeaderCustom.jsx + com.twin.app.shoptime/src/views/DetailPanel/components/THeaderCustom.module.less + com.twin.app.shoptime/src/views/DetailPanel/components/TScroller/TScrollerDetail.jsx + com.twin.app.shoptime/src/views/DetailPanel/components/TScroller/TScrollerDetail.module.less + package-lock.json 📝 수정된 파일: ~ com.twin.app.shoptime/src/actions/actionTypes.js ~ com.twin.app.shoptime/src/actions/productActions.js ~ com.twin.app.shoptime/src/api/apiConfig.js ~ com.twin.app.shoptime/src/reducers/productReducer.js ~ com.twin.app.shoptime/src/utils/fp.js ~ com.twin.app.shoptime/src/utils/lodash.js ~ com.twin.app.shoptime/src/utils/lodashFpEx.js ~ com.twin.app.shoptime/src/views/DetailPanel/DetailPanel.jsx ~ com.twin.app.shoptime/src/views/DetailPanel/DetailPanel.module.less 🔧 주요 변경 내용: • 타입 시스템 안정성 강화 • 핵심 비즈니스 로직 개선 • API 서비스 레이어 개선 • 공통 유틸리티 함수 최적화 • 프로젝트 의존성 관리 개선 • UI 컴포넌트 아키텍처 개선 • 대규모 기능 개발 • 모듈 구조 개선 BREAKING CHANGE: API 또는 설정 변경으로 인한 호환성 영향 가능
Enact Client
- npm install -g @enact/cli@6.0.4
enact 및 기타 라이브러리 버전 변경 불가
Node.js >= v14.0.0 (recommended: v16.13.0)
개발 및 테스트 환경
빌드 방법
# 개발 빌드
npm run build
# 또는
npm run pack
# 빌드 결과물 테스트를 위한 로컬 서버 실행
npx http-server ./dist
Chrome 테스트 환경
- WebOS 3.0용 Chrome 38 버전 필수
- Chrome 38 버전 다운로드 및 설치: WebOS TV 개발자 사이트
- 모든 기능은 반드시 Chrome 38에서 테스트 필요
Chrome 38 브라우저 호환성 제한사항
JavaScript 제한사항
-
async/await 문법 - 지원되지 않음 (Chrome 55부터 지원)
- 대체방법: Promise 체이닝 방식 사용
// Promise 방식으로 비동기 처리 function getData() { return fetch('/api/data') .then(function(result) { return result; }); } -
ESLint - 지원되지 않음 (Enact CLI 6.0.4 버전 제한)
- 이유: ESLint 6 이후 버전과의 호환성 문제
- WebOS 3.0 호환성을 위해 Enact 버전 업그레이드 불가
-
React import 문 필수
- 모든 컴포넌트 파일 상단에 React import 필요
import React from "react";
CSS 제한사항
- CSS Grid Layout
- CSS Flexbox
- CSS Variables (Custom Properties)
- CSS gap 속성 - margin 혹은 padding 사용
- CSS calc() - 제한적 지원 (문자열로 사용 필요)
calc(@toplayerHeight + 22px);
/* 사용불가 */
~"calc(@{toplayerHeight} + 22px)";
/* 문자열로 사용 가능 */
- CSS Transforms 3D
- CSS Animations/Transitions
- CSS Filter Effects
- CSS Masks
- CSS Custom Scroll Snap
- CSS Logical Properties
code convention
-
vs-code extension: js/ts import/export sorter 설치
-
vs-code setting.json
{
"prettier.tabWidth": 2,
"prettier.printWidth": 80,
"prettier.trailingComma": "es5",
"tsImportSorter.configuration.keepUnused": [".*"],
}
배포
npm install -g @enact/cli@6.0.4 npm install npm run build --> ./dist 폴더 배포
배포 시 주의 사항
develop환경에서는 오토 스크롤 영역을 명확하게 보기 위해background-color를 보여지게 했으나, 배포 시에는production상태로 바꿔서 빌드하셔야 합니다.
// AutoScrollArea.module.less
.autoScrollArea {
position: absolute;
z-index: 20;
background-color: transparent; /* production */
// background-color: #ff00001f; /* develop */
}
상태로 변경 후 배포 부탁드립니다.
TVirtualGridList 사용시 여백
OnSaleProductList.jsx 참고 --> 가로 100%일 경우 container에서 여백 제어하는 것이 아니라 각 사용하려는 컴포넌트에서 class로 "TVirtualGridList" 추가한 부분에서 좌측 여백 추가(여백은 padding-left로 조절)
// OnSaleProductList.module.less
.tVirtualGridList {
padding-left: 60px; /* GUI 가이드에 맞도록 적절히 조절 */
}
TScroller 사용시 여백
SubCategory.jsx 참고(Home) --> 가로 100%일 경우 TScroller 자체에서 여백 제어하는 것이 아니라 손자 엘리먼트에 좌측 여백 추가(여백은 padding-left로 조절)
// SubCategory.module.less
.home {
> div {
> div {
padding-left: 60px; /* GUI 가이드에 맞도록 적절히 조절 */
}
}
}
자막영상
ontv4u 검색 후 첫 영상
컴포넌트 사용 가이드라인
1. Grid 레이아웃 여백 설정
TVirtualGridList 사용시 여백
OnSaleProductList.jsx 참고 --> 가로 100%일 경우 container에서 여백 제어하는 것이 아니라 각 사용하려는 컴포넌트에서 class로 "TVirtualGridList" 추가한 부분에서 좌측 여백 추가(여백은 padding-left로 조절)
// OnSaleProductList.module.less
.tVirtualGridList {
padding-left: 60px; /* GUI 가이드에 맞도록 적절히 조절 */
}
2. 스크롤 레이아웃 여백 설정
TScroller 사용시 여백
SubCategory.jsx 참고(Home) --> 가로 100%일 경우 TScroller 자체에서 여백 제어하는 것이 아니라 손자 엘리먼트에 좌측 여백 추가(여백은 padding-left로 조절)
// SubCategory.module.less
.home {
> div {
> div {
padding-left: 60px; /* GUI 가이드에 맞도록 적절히 조절 */
}
}
}
3. 테스트용 자막 영상
자막영상 테스트
ontv4u 검색 후 첫 영상