From 32c446f1ae9f299f038519c02a705512ce4be9e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B3=A0=EB=8F=99=EC=98=81?= Date: Wed, 24 Jan 2024 13:52:43 +0900 Subject: [PATCH] merge --- .../assets/ic-lnb-logo-shoptime@3x.png | Bin 0 -> 16727 bytes .../assets/icons/ic-lnb-cart-nor.svg | 4 + .../assets/icons/ic-lnb-cart-sel.svg | 4 + .../assets/icons/ic-lnb-category-nor.svg | 4 + .../assets/icons/ic-lnb-category-sel.svg | 4 + .../assets/icons/ic-lnb-home-nor.svg | 4 + .../assets/icons/ic-lnb-home-sel.svg | 4 + .../assets/icons/ic-lnb-hotpicks-nor.svg | 4 + .../assets/icons/ic-lnb-hotpicks-sel.svg | 4 + .../assets/icons/ic-lnb-logo-shoptime@3x.png | Bin 0 -> 16727 bytes .../assets/icons/ic-lnb-mypage-nor.svg | 4 + .../assets/icons/ic-lnb-mypage-sel.svg | 4 + .../assets/icons/ic-lnb-partners-nor.svg | 4 + .../assets/icons/ic-lnb-partners-sel.svg | 4 + .../assets/icons/ic-lnb-sale-nor.svg | 4 + .../assets/icons/ic-lnb-sale-sel.svg | 4 + .../assets/icons/ic-lnb-search-nor.svg | 4 + .../assets/icons/ic-lnb-search-sel.svg | 4 + .../icons/ic-lnb-shoptime-symbol@3x.png | Bin 0 -> 7894 bytes .../assets/icons/ic-lnb-topdeals-nor.svg | 4 + .../assets/icons/ic-lnb-topdeals-sel.svg | 4 + com.twin.app.shoptime/src/App/App.js | 6 +- com.twin.app.shoptime/src/api/apiConfig.js | 1 + com.twin.app.shoptime/src/api/homeApi.js | 15 +- .../src/components/TabLayout/TabItem.jsx | 81 +++ .../components/TabLayout/TabItem.module.less | 55 ++ .../src/components/TabLayout/TabLayout.jsx | 468 ++++++++++++++++-- .../TabLayout/TabLayout.module.less | 62 +++ .../TabLayout/iconComponents/CartIcon.jsx | 16 + .../TabLayout/iconComponents/CategoryIcon.jsx | 16 + .../iconComponents/FeaturedBrandIcon.jsx | 15 + .../TabLayout/iconComponents/HomeIcon.jsx | 16 + .../TabLayout/iconComponents/HotPicksIcon.jsx | 16 + .../TabLayout/iconComponents/MyPageIcon.jsx | 16 + .../TabLayout/iconComponents/OnSaleIcon.jsx | 16 + .../TabLayout/iconComponents/SearchIcon.jsx | 16 + .../iconComponents/TrendingNowIcon.jsx | 15 + .../iconComponents/convertThemeColor.js | 11 + .../src/features/common/commonSlice.js | 1 + .../src/features/menu/menuSlice.js | 33 ++ .../src/features/menu/menuThunks.js | 15 + com.twin.app.shoptime/src/store/store.js | 4 +- .../src/style/CommonStyle.module.less | 1 + 43 files changed, 935 insertions(+), 32 deletions(-) create mode 100644 com.twin.app.shoptime/assets/ic-lnb-logo-shoptime@3x.png create mode 100644 com.twin.app.shoptime/assets/icons/ic-lnb-cart-nor.svg create mode 100644 com.twin.app.shoptime/assets/icons/ic-lnb-cart-sel.svg create mode 100644 com.twin.app.shoptime/assets/icons/ic-lnb-category-nor.svg create mode 100644 com.twin.app.shoptime/assets/icons/ic-lnb-category-sel.svg create mode 100644 com.twin.app.shoptime/assets/icons/ic-lnb-home-nor.svg create mode 100644 com.twin.app.shoptime/assets/icons/ic-lnb-home-sel.svg create mode 100644 com.twin.app.shoptime/assets/icons/ic-lnb-hotpicks-nor.svg create mode 100644 com.twin.app.shoptime/assets/icons/ic-lnb-hotpicks-sel.svg create mode 100644 com.twin.app.shoptime/assets/icons/ic-lnb-logo-shoptime@3x.png create mode 100644 com.twin.app.shoptime/assets/icons/ic-lnb-mypage-nor.svg create mode 100644 com.twin.app.shoptime/assets/icons/ic-lnb-mypage-sel.svg create mode 100644 com.twin.app.shoptime/assets/icons/ic-lnb-partners-nor.svg create mode 100644 com.twin.app.shoptime/assets/icons/ic-lnb-partners-sel.svg create mode 100644 com.twin.app.shoptime/assets/icons/ic-lnb-sale-nor.svg create mode 100644 com.twin.app.shoptime/assets/icons/ic-lnb-sale-sel.svg create mode 100644 com.twin.app.shoptime/assets/icons/ic-lnb-search-nor.svg create mode 100644 com.twin.app.shoptime/assets/icons/ic-lnb-search-sel.svg create mode 100644 com.twin.app.shoptime/assets/icons/ic-lnb-shoptime-symbol@3x.png create mode 100644 com.twin.app.shoptime/assets/icons/ic-lnb-topdeals-nor.svg create mode 100644 com.twin.app.shoptime/assets/icons/ic-lnb-topdeals-sel.svg create mode 100644 com.twin.app.shoptime/src/components/TabLayout/TabItem.jsx create mode 100644 com.twin.app.shoptime/src/components/TabLayout/TabItem.module.less create mode 100644 com.twin.app.shoptime/src/components/TabLayout/iconComponents/CartIcon.jsx create mode 100644 com.twin.app.shoptime/src/components/TabLayout/iconComponents/CategoryIcon.jsx create mode 100644 com.twin.app.shoptime/src/components/TabLayout/iconComponents/FeaturedBrandIcon.jsx create mode 100644 com.twin.app.shoptime/src/components/TabLayout/iconComponents/HomeIcon.jsx create mode 100644 com.twin.app.shoptime/src/components/TabLayout/iconComponents/HotPicksIcon.jsx create mode 100644 com.twin.app.shoptime/src/components/TabLayout/iconComponents/MyPageIcon.jsx create mode 100644 com.twin.app.shoptime/src/components/TabLayout/iconComponents/OnSaleIcon.jsx create mode 100644 com.twin.app.shoptime/src/components/TabLayout/iconComponents/SearchIcon.jsx create mode 100644 com.twin.app.shoptime/src/components/TabLayout/iconComponents/TrendingNowIcon.jsx create mode 100644 com.twin.app.shoptime/src/components/TabLayout/iconComponents/convertThemeColor.js create mode 100644 com.twin.app.shoptime/src/features/menu/menuSlice.js create mode 100644 com.twin.app.shoptime/src/features/menu/menuThunks.js diff --git a/com.twin.app.shoptime/assets/ic-lnb-logo-shoptime@3x.png b/com.twin.app.shoptime/assets/ic-lnb-logo-shoptime@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..d2b66629749d7ed06a04cc21c1b0859f8c3ca74b GIT binary patch literal 16727 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 literal 0 HcmV?d00001 diff --git a/com.twin.app.shoptime/assets/icons/ic-lnb-cart-nor.svg b/com.twin.app.shoptime/assets/icons/ic-lnb-cart-nor.svg new file mode 100644 index 00000000..ca975dae --- /dev/null +++ b/com.twin.app.shoptime/assets/icons/ic-lnb-cart-nor.svg @@ -0,0 +1,4 @@ + + + + diff --git a/com.twin.app.shoptime/assets/icons/ic-lnb-cart-sel.svg b/com.twin.app.shoptime/assets/icons/ic-lnb-cart-sel.svg new file mode 100644 index 00000000..d11eb39b --- /dev/null +++ b/com.twin.app.shoptime/assets/icons/ic-lnb-cart-sel.svg @@ -0,0 +1,4 @@ + + + + diff --git a/com.twin.app.shoptime/assets/icons/ic-lnb-category-nor.svg b/com.twin.app.shoptime/assets/icons/ic-lnb-category-nor.svg new file mode 100644 index 00000000..c8c513fa --- /dev/null +++ b/com.twin.app.shoptime/assets/icons/ic-lnb-category-nor.svg @@ -0,0 +1,4 @@ + + + + diff --git a/com.twin.app.shoptime/assets/icons/ic-lnb-category-sel.svg b/com.twin.app.shoptime/assets/icons/ic-lnb-category-sel.svg new file mode 100644 index 00000000..20dc7be2 --- /dev/null +++ b/com.twin.app.shoptime/assets/icons/ic-lnb-category-sel.svg @@ -0,0 +1,4 @@ + + + + diff --git a/com.twin.app.shoptime/assets/icons/ic-lnb-home-nor.svg b/com.twin.app.shoptime/assets/icons/ic-lnb-home-nor.svg new file mode 100644 index 00000000..36a777a7 --- /dev/null +++ b/com.twin.app.shoptime/assets/icons/ic-lnb-home-nor.svg @@ -0,0 +1,4 @@ + + + + diff --git a/com.twin.app.shoptime/assets/icons/ic-lnb-home-sel.svg b/com.twin.app.shoptime/assets/icons/ic-lnb-home-sel.svg new file mode 100644 index 00000000..bac58008 --- /dev/null +++ b/com.twin.app.shoptime/assets/icons/ic-lnb-home-sel.svg @@ -0,0 +1,4 @@ + + + + diff --git a/com.twin.app.shoptime/assets/icons/ic-lnb-hotpicks-nor.svg b/com.twin.app.shoptime/assets/icons/ic-lnb-hotpicks-nor.svg new file mode 100644 index 00000000..f798723c --- /dev/null +++ b/com.twin.app.shoptime/assets/icons/ic-lnb-hotpicks-nor.svg @@ -0,0 +1,4 @@ + + + + diff --git a/com.twin.app.shoptime/assets/icons/ic-lnb-hotpicks-sel.svg b/com.twin.app.shoptime/assets/icons/ic-lnb-hotpicks-sel.svg new file mode 100644 index 00000000..5a4b368a --- /dev/null +++ b/com.twin.app.shoptime/assets/icons/ic-lnb-hotpicks-sel.svg @@ -0,0 +1,4 @@ + + + + diff --git a/com.twin.app.shoptime/assets/icons/ic-lnb-logo-shoptime@3x.png b/com.twin.app.shoptime/assets/icons/ic-lnb-logo-shoptime@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..d2b66629749d7ed06a04cc21c1b0859f8c3ca74b GIT binary patch literal 16727 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 literal 0 HcmV?d00001 diff --git a/com.twin.app.shoptime/assets/icons/ic-lnb-mypage-nor.svg b/com.twin.app.shoptime/assets/icons/ic-lnb-mypage-nor.svg new file mode 100644 index 00000000..f8411dbc --- /dev/null +++ b/com.twin.app.shoptime/assets/icons/ic-lnb-mypage-nor.svg @@ -0,0 +1,4 @@ + + + + diff --git a/com.twin.app.shoptime/assets/icons/ic-lnb-mypage-sel.svg b/com.twin.app.shoptime/assets/icons/ic-lnb-mypage-sel.svg new file mode 100644 index 00000000..21cd3b83 --- /dev/null +++ b/com.twin.app.shoptime/assets/icons/ic-lnb-mypage-sel.svg @@ -0,0 +1,4 @@ + + + + diff --git a/com.twin.app.shoptime/assets/icons/ic-lnb-partners-nor.svg b/com.twin.app.shoptime/assets/icons/ic-lnb-partners-nor.svg new file mode 100644 index 00000000..3057aac1 --- /dev/null +++ b/com.twin.app.shoptime/assets/icons/ic-lnb-partners-nor.svg @@ -0,0 +1,4 @@ + + + + diff --git a/com.twin.app.shoptime/assets/icons/ic-lnb-partners-sel.svg b/com.twin.app.shoptime/assets/icons/ic-lnb-partners-sel.svg new file mode 100644 index 00000000..12aacaff --- /dev/null +++ b/com.twin.app.shoptime/assets/icons/ic-lnb-partners-sel.svg @@ -0,0 +1,4 @@ + + + + diff --git a/com.twin.app.shoptime/assets/icons/ic-lnb-sale-nor.svg b/com.twin.app.shoptime/assets/icons/ic-lnb-sale-nor.svg new file mode 100644 index 00000000..8f0d9f9f --- /dev/null +++ b/com.twin.app.shoptime/assets/icons/ic-lnb-sale-nor.svg @@ -0,0 +1,4 @@ + + + + diff --git a/com.twin.app.shoptime/assets/icons/ic-lnb-sale-sel.svg b/com.twin.app.shoptime/assets/icons/ic-lnb-sale-sel.svg new file mode 100644 index 00000000..37f42812 --- /dev/null +++ b/com.twin.app.shoptime/assets/icons/ic-lnb-sale-sel.svg @@ -0,0 +1,4 @@ + + + + diff --git a/com.twin.app.shoptime/assets/icons/ic-lnb-search-nor.svg b/com.twin.app.shoptime/assets/icons/ic-lnb-search-nor.svg new file mode 100644 index 00000000..cab8b59d --- /dev/null +++ b/com.twin.app.shoptime/assets/icons/ic-lnb-search-nor.svg @@ -0,0 +1,4 @@ + + + + diff --git a/com.twin.app.shoptime/assets/icons/ic-lnb-search-sel.svg b/com.twin.app.shoptime/assets/icons/ic-lnb-search-sel.svg new file mode 100644 index 00000000..edf2ed4b --- /dev/null +++ b/com.twin.app.shoptime/assets/icons/ic-lnb-search-sel.svg @@ -0,0 +1,4 @@ + + + + diff --git a/com.twin.app.shoptime/assets/icons/ic-lnb-shoptime-symbol@3x.png b/com.twin.app.shoptime/assets/icons/ic-lnb-shoptime-symbol@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..3d2c797767ddd73024d9b7a25509e9c47c6d488d GIT binary patch literal 7894 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 Ar2qf` literal 0 HcmV?d00001 diff --git a/com.twin.app.shoptime/assets/icons/ic-lnb-topdeals-nor.svg b/com.twin.app.shoptime/assets/icons/ic-lnb-topdeals-nor.svg new file mode 100644 index 00000000..ee5815c2 --- /dev/null +++ b/com.twin.app.shoptime/assets/icons/ic-lnb-topdeals-nor.svg @@ -0,0 +1,4 @@ + + + + diff --git a/com.twin.app.shoptime/assets/icons/ic-lnb-topdeals-sel.svg b/com.twin.app.shoptime/assets/icons/ic-lnb-topdeals-sel.svg new file mode 100644 index 00000000..4030c5b7 --- /dev/null +++ b/com.twin.app.shoptime/assets/icons/ic-lnb-topdeals-sel.svg @@ -0,0 +1,4 @@ + + + + diff --git a/com.twin.app.shoptime/src/App/App.js b/com.twin.app.shoptime/src/App/App.js index 2433a5bc..e437b35a 100644 --- a/com.twin.app.shoptime/src/App/App.js +++ b/com.twin.app.shoptime/src/App/App.js @@ -1,17 +1,19 @@ -import React, { useEffect } from "react"; import ThemeDecorator from "@enact/sandstone/ThemeDecorator"; +import React, { useEffect } from "react"; import css from "./App.module.less"; import MainView from "../views/MainView/MainView"; -import { useDispatch, useSelector } from "react-redux"; +import { useDispatch } from "react-redux"; import { fetchAuthenticationCode } from "../features/auth/authThunks"; +import { fetchHomeMenu } from "../features/menu/menuThunks"; function AppBase(props) { const dispatch = useDispatch(); useEffect(() => { dispatch(fetchAuthenticationCode()); + dispatch(fetchHomeMenu()); }, [dispatch]); return ; diff --git a/com.twin.app.shoptime/src/api/apiConfig.js b/com.twin.app.shoptime/src/api/apiConfig.js index 7f061294..e335edf2 100644 --- a/com.twin.app.shoptime/src/api/apiConfig.js +++ b/com.twin.app.shoptime/src/api/apiConfig.js @@ -12,6 +12,7 @@ export const URLS = { //home controller GET_HOME_TERMS: "/lgsp/v1/home/terms.lge", + GET_HOME_MENU: "/lgsp/v1/home/menu.lge", //on-sale controller GET_ON_SALE_INFO: "/lgsp/v1/onsale/onsale.lge", diff --git a/com.twin.app.shoptime/src/api/homeApi.js b/com.twin.app.shoptime/src/api/homeApi.js index ce6640bc..94560e9d 100644 --- a/com.twin.app.shoptime/src/api/homeApi.js +++ b/com.twin.app.shoptime/src/api/homeApi.js @@ -17,7 +17,20 @@ export async function getHomeMainContents() {} export async function getHomeLayout() {} // 메뉴 목록 조회 IF-LGSP-044 -export async function getHomeMenu() {} +export async function getHomeMenu() { + try { + const response = await api.get(URLS.GET_HOME_MENU, { + headers: { + lgsp_auth: + "idAfo9EFgAKcoblkOVTBL1o3rnFjw/8n8Wqd6ToStVBXJE7NE4G2L9y2rHH2z1GeufkrdBN5K14kFCxYhDBFewoj7m02hDe5vlLFzfbDAs8gZlyZUMu5bD79Dn2d5+Bb1Nd1Cg==", + }, + }); + return response.data; + } catch (error) { + console.log("Error", error); + throw error; + } +} // 약관 정보 조회 IF-LGSP-005 export async function getHomeTerms(props) { diff --git a/com.twin.app.shoptime/src/components/TabLayout/TabItem.jsx b/com.twin.app.shoptime/src/components/TabLayout/TabItem.jsx new file mode 100644 index 00000000..c5e0576e --- /dev/null +++ b/com.twin.app.shoptime/src/components/TabLayout/TabItem.jsx @@ -0,0 +1,81 @@ +import { Marquee, MarqueeController } from "@enact/sandstone/Marquee"; +import Spottable from "@enact/spotlight/Spottable"; +import { getTargetByDirectionFromElement } from "@enact/spotlight/src/target"; +import classNames from "classnames"; +import compose from "ramda/src/compose"; +import { useCallback, useMemo, useRef, useState } from "react"; +import css from "./TabItem.module.less"; + +const SpottableComponent = Spottable("div"); +const TabItemBase = ({ + icons, + title, + expanded = false, + selected = false, + index = 0, + deActivateTab, + className, + ...rest +}) => { + const [focused, setFocused] = useState(false); + const itemRef = useRef(); + + const _onFocus = useCallback(() => { + setFocused(true); + }, [index]); + + const _onBlur = useCallback(() => { + setFocused(false); + }, []); + + const isDivider = useMemo(() => { + return !title; + }, []); + const onKeyDown = useCallback( + (event) => { + if (event.key === "ArrowRight") { + const next = getTargetByDirectionFromElement( + "right", + itemRef.current.node + ); + if (!next && deActivateTab) { + deActivateTab(); + } + } + }, + [deActivateTab] + ); + const renderIcon = useCallback(() => { + if (icons) { + const Component = icons; + return ; + } else { + return null; + } + }, [focused, selected, expanded]); + return ( + + {icons &&

{renderIcon()}
} + + {expanded && title && ( + + {title} + + )} + + ); +}; +const ItemDecorator = compose(MarqueeController({ marqueeOnFocus: true })); +const TabItem = ItemDecorator(TabItemBase); +export default TabItem; diff --git a/com.twin.app.shoptime/src/components/TabLayout/TabItem.module.less b/com.twin.app.shoptime/src/components/TabLayout/TabItem.module.less new file mode 100644 index 00000000..7808b987 --- /dev/null +++ b/com.twin.app.shoptime/src/components/TabLayout/TabItem.module.less @@ -0,0 +1,55 @@ +@ICON_SIZE: 48px; +.tabItem{ + padding: 18px 12px 18px 42px; + font-size: 36px; + display: flex; + color: #606060; + align-items: center; + + + &.focused { + color: #ffffff; + background: linear-gradient(#cb1253, #e15ba1); + border-radius: 42px; + width: 402px; + } + + +.icon { + position: relative; + min-width: @ICON_SIZE; + height: @ICON_SIZE; + + > img { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + } + > svg { + position: absolute; + width: @ICON_SIZE; + height: @ICON_SIZE; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + } + + +} + +.text { + width: 100%; + line-height: 36px; + padding-left: 18px; + padding-top: 6px; + flex-grow: 1; + flex-shrink: 1; + overflow: hidden; + +} +.marqueeWrap { + width: 100%; + } +} + diff --git a/com.twin.app.shoptime/src/components/TabLayout/TabLayout.jsx b/com.twin.app.shoptime/src/components/TabLayout/TabLayout.jsx index c81ea86d..14c428e4 100644 --- a/com.twin.app.shoptime/src/components/TabLayout/TabLayout.jsx +++ b/com.twin.app.shoptime/src/components/TabLayout/TabLayout.jsx @@ -1,45 +1,457 @@ -import { useMemo } from "react"; -import { useDispatch } from "react-redux"; -import { addPanels } from "../../features/panels/panelsSlice"; +import Spotlight from "@enact/spotlight"; +import classNames from "classnames"; +import React, { + useCallback, + useEffect, + useMemo, + useRef, + useState, +} from "react"; +import { useDispatch, useSelector } from "react-redux"; +import TabItem from "./TabItem"; +import css from "./TabLayout.module.less"; +//enact +import Skinnable from "@enact/sandstone/Skinnable"; +import SpotlightContainerDecorator from "@enact/spotlight/SpotlightContainerDecorator"; +import { Cancelable } from "@enact/ui/Cancelable"; +//아이콘 +import { Job } from "@enact/core/util"; +import CartIcon from "./iconComponents/CartIcon"; +import CategoryIcon from "./iconComponents/CategoryIcon"; +import FeaturedBrandIcon from "./iconComponents/FeaturedBrandIcon"; +import HomeIcon from "./iconComponents/HomeIcon"; +import HotPicksIcon from "./iconComponents/HotPicksIcon"; +import MyPageIcon from "./iconComponents/MyPageIcon"; +import OnSaleIcon from "./iconComponents/OnSaleIcon"; +import SearchIcon from "./iconComponents/SearchIcon"; +import TrendingNowIcon from "./iconComponents/TrendingNowIcon"; +//이미지 +import shoptimeFullIcon from "../../../assets/icons/ic-lnb-logo-shoptime@3x.png"; +import shopTimeIcon from "../../../assets/icons/ic-lnb-shoptime-symbol@3x.png"; -import * as Config from "../../utils/Config"; -import { $L } from "../../utils/helperMethods"; +const Container = SpotlightContainerDecorator( + { enterTo: "default-element" }, + "div" +); -export default function TabLayout(props) { +const MainContainer = SpotlightContainerDecorator( + { enterTo: "last-focused", continue5WayHold: true }, + "div" +); + +const CancelableDiv = Cancelable( + { modal: true, onCancel: "handleCancel" }, + Skinnable(Container) +); + +class TabMenuItem { + constructor(icons = "", title = "", target, children = []) { + this.icons = icons; + this.title = title; + this.target = target; + this.children = []; //TabMenuItem + if (children && children.length > 0) { + for (let i = 0; i < children.length; i++) { + const tabmenu = new TabMenuItem( + children[i].icons, + children[i].title, + children[i].target, + children[i].children + ); + this.children.push(tabmenu); + } + } + } + hasChildren = () => { + return this.children.length > 0; + }; + getChildren = () => { + return this.children; + }; +} + +const deActivateTabJabFunc = (func) => { + func(); +}; +let deActivateTabJob = new Job(deActivateTabJabFunc, 2000); + +const COLLABSED_MAIN = 0; +const ACTIVATED_MAIN = 1; +const ACTIVATED_SUB = 2; +const EXTRA_AREA = 3; + +export default function TabLayout({ topPanelName, onTabActivated }) { const dispatch = useDispatch(); + const [mainExpanded, setMainExpanded] = useState(false); + const [mainSelectedIndex, setMainSelectedIndex] = useState(-1); + const [tabs, setTabs] = useState([]); + const [tabFocused, setTabFocused] = useState([false, false, false]); //COLLABSED_MAIN, ACTIVATED_MAIN, ACTIVATED_SUB + const panelSwitching = useRef(null); + const { cursorVisible } = useSelector((state) => state.common.appStatus); + const titles = useSelector((state) => state.menu.title); + // const items = useSelector((state) => state.menu.items); const menuItems = useMemo( () => [ - { label: $L("MY PAGE"), panel: Config.panel_names.MY_PAGE_PANEL }, - { label: $L("CATEGORY"), panel: Config.panel_names.CATEGORY_PANEL }, - { label: $L("SEARCH"), panel: Config.panel_names.SEARCH_PANEL }, - { label: $L("HOME"), panel: Config.panel_names.HOME_PANEL }, - { label: $L("ON SALE"), panel: Config.panel_names.ON_SALE_PANEL }, { - label: $L("TRENDING NOW"), - panel: Config.panel_names.TRENDING_NOW_PANEL, + title: titles[1], + icons: CategoryIcon, + children: [ + { + title: "123123", + target: [], + }, + ], }, - { label: $L("HOT PICKS"), panel: Config.panel_names.HOT_PICKS_PANEL }, - { label: $L("CART"), panel: Config.panel_names.CART_PANEL }, { - label: $L("FEATURED BRANDS"), - panel: Config.panel_names.FEATURED_BRANDS_PANEL, + title: titles[0], + icons: MyPageIcon, + children: [ + { + title: "123123", + target: [], + }, + ], }, + { + title: titles[2], + icons: SearchIcon, + children: [ + { + title: "12323232", + target: [], + }, + ], + }, + { + title: titles[3], + icons: HomeIcon, + children: [ + { + title: "43534543", + target: [], + }, + ], + }, + { + title: titles[8], + icons: FeaturedBrandIcon, + children: [ + { + title: "dsadasd", + target: [], + }, + ], + }, + { + title: titles[4], + icons: OnSaleIcon, + children: [ + { + title: "", + target: [], + }, + ], + }, + { + title: titles[5], + icons: TrendingNowIcon, + }, + { + title: titles[6], + icons: HotPicksIcon, + }, + { + title: titles[7], + icons: CartIcon, + }, + + // 메뉴 추가 필요 20240112 chw ], - [] + [mainExpanded] ); - const handleNavigation = (panel) => { - dispatch(addPanels({ name: panel, panelInfo: {} })); - }; + const makeTabmenu = useCallback(() => { + const t = []; + + for (let i = 0; i < menuItems.length; i++) { + const tabmenu = new TabMenuItem( + menuItems[i].icons, + menuItems[i].title, + menuItems[i].target, + menuItems[i].children + ); + t.push(tabmenu); + } + + return t; + }, []); + + useEffect(() => { + setTabs(makeTabmenu()); + }, []); + + const deActivateTab = useCallback(() => { + setTabFocused([false, false, false, false]); + setMainSelectedIndex(-1); + setMainExpanded(false); + }, []); + + const onTabHasFocus = useCallback( + (type) => (event) => { + switch (type) { + case COLLABSED_MAIN: + case ACTIVATED_MAIN: { + console.log("#tabs[mainSelectedIndex]", tabs[mainSelectedIndex]); + if (!cursorVisible) { + const parent = event.target.parentNode; + const children = parent.childNodes; + const index = Array.prototype.indexOf.call(children, event.target); + setMainExpanded(true); + setMainSelectedIndex(index); + } else { + if (!panelSwitching.current) { + setMainExpanded(true); + } + } + + break; + } + case ACTIVATED_SUB: { + setMainExpanded(false); + break; + } + case EXTRA_AREA: { + if (cursorVisible) { + deActivateTabJob.start(deActivateTab); + return; + } + } + } + setTabFocused((prevState) => { + const prev = [...prevState]; + prev[type] = true; + return prev; + }); + }, + [cursorVisible, deActivateTab] + ); + + const onTabBlur = useCallback( + (type) => (event) => { + switch (type) { + case ACTIVATED_MAIN: { + if (!cursorVisible) { + setMainExpanded(false); + } + + break; + } + case ACTIVATED_SUB: { + if (!cursorVisible) { + } + break; + } + case EXTRA_AREA: { + if (cursorVisible) { + deActivateTabJob.stop(); + return; + } + } + } + setTabFocused((prevState) => { + const prev = [...prevState]; + prev[type] = true; + return prev; + }); + }, + [cursorVisible] + ); + + const handleNavigation = useCallback( + ({ index, target }) => { + setMainSelectedIndex(index); + if (target) { + // dispatch(resetPanels(target)); + deActivateTab(); + } else if (cursorVisible) { + setMainExpanded(true); + } + }, + [cursorVisible, deActivateTab, dispatch] + ); + + const onClickSubItem = useCallback( + ({ index, target }) => { + if (target) { + // dispatch(resetPanels(target)); + deActivateTab(); + panelSwitching.current = true; + // panelSwitchingJob.start(panelSwitching); + } + }, + [dispatch, deActivateTab] + ); + const onClickExtraArea = useCallback( + ({ index, target }) => { + deActivateTabJob.startAfter(100, deActivateTab); + }, + [dispatch, deActivateTab] + ); + + const tabActivated = useMemo(() => { + return mainExpanded || mainSelectedIndex >= 0; + }, [mainExpanded, mainSelectedIndex]); + + const showTab = useMemo(() => { + if (!topPanelName) { + return true; + } + return false; + }, [topPanelName]); + const showSubTab = useMemo(() => { + if ( + tabActivated && + tabs[mainSelectedIndex] && + tabs[mainSelectedIndex].hasChildren() + ) { + return true; + } + return false; + }, [tabActivated, tabs, mainSelectedIndex]); + + const backKeyHandler = useCallback( + (ev) => { + if (tabActivated) { + deActivateTab(); + ev.stopPropagation(); + ev.preventDefault(); + return true; + } + }, + [tabActivated, deActivateTab] + ); + + useEffect(() => { + if (tabActivated) { + setTimeout(() => { + Spotlight.focus("activatedMain"); + }, 0); + } + if (onTabActivated) { + onTabActivated(tabActivated && showTab); + } + }, [tabActivated, showTab]); + + useEffect(() => {}, [showSubTab, mainSelectedIndex]); + if (!showTab) { + return null; + } return ( -
- {menuItems.map((item, index) => ( - - ))} -
+ <> + {/* collabsed Main */} + + + {tabs.map((item, index) => ( + + ))} + + { + + {/* expanded Main */} + + + {tabActivated && + tabs.map((item, index) => ( + + ))} + + {/* Sub */} + { + + {showSubTab && + tabs[mainSelectedIndex].children.map((item, index) => { + return ( + + ); + })} + + } + {/* Extra Area*/} + {tabActivated && ( + + )} + + } + ); } diff --git a/com.twin.app.shoptime/src/components/TabLayout/TabLayout.module.less b/com.twin.app.shoptime/src/components/TabLayout/TabLayout.module.less index e69de29b..8b66d12e 100644 --- a/com.twin.app.shoptime/src/components/TabLayout/TabLayout.module.less +++ b/com.twin.app.shoptime/src/components/TabLayout/TabLayout.module.less @@ -0,0 +1,62 @@ +.expandedRootContainer { + position: absolute; + display: flex; + width: 100%; + height: 100%; + top: 0; + left: 0; + z-index: 1; + + &.hide { + width: auto; + z-index: 0; + } + } + + .tabWrap { + background-color: #222222; + width: 120px; + + display: flex; + flex-direction: column; + justify-content: center; + // padding-top: 104px; + // padding-bottom: 104px; + z-index: 1; + flex-grow: 0; + transition: width 0.5s ease; + &.expanded { + width: 402px; + } + &.secondDepthLayout { + width: 386px; + height: calc(100%); + opacity: 0.95; + + box-shadow: 8px 0 36px rgba(33, 33, 32, 0.08); + padding-bottom: unset; + justify-content: flex-start; + } + &.extraArea { + flex-grow: 1; + background-color: rgba(0, 0, 0, 0); + transition: initial; + } + &.hide { + width: 0; + } + } + + .logo { + width: 54px; + height: 54px; + + margin-left: 42px; + margin-bottom: 84px; + + &.expanded { + width: 234px; + height: 54px; + } + } + \ No newline at end of file diff --git a/com.twin.app.shoptime/src/components/TabLayout/iconComponents/CartIcon.jsx b/com.twin.app.shoptime/src/components/TabLayout/iconComponents/CartIcon.jsx new file mode 100644 index 00000000..ce5d6709 --- /dev/null +++ b/com.twin.app.shoptime/src/components/TabLayout/iconComponents/CartIcon.jsx @@ -0,0 +1,16 @@ +import { convertThemeColor } from "./convertThemeColor"; + +const CartIcon = ({ iconType = "normal" }) => { + return ( + + + + + ); +}; + +export default CartIcon; diff --git a/com.twin.app.shoptime/src/components/TabLayout/iconComponents/CategoryIcon.jsx b/com.twin.app.shoptime/src/components/TabLayout/iconComponents/CategoryIcon.jsx new file mode 100644 index 00000000..7bdff0cd --- /dev/null +++ b/com.twin.app.shoptime/src/components/TabLayout/iconComponents/CategoryIcon.jsx @@ -0,0 +1,16 @@ +import { convertThemeColor } from "./convertThemeColor"; + +const CategoryIcon = ({ iconType = "normal" }) => { + return ( + + + + + ); +}; + +export default CategoryIcon; diff --git a/com.twin.app.shoptime/src/components/TabLayout/iconComponents/FeaturedBrandIcon.jsx b/com.twin.app.shoptime/src/components/TabLayout/iconComponents/FeaturedBrandIcon.jsx new file mode 100644 index 00000000..d2258bea --- /dev/null +++ b/com.twin.app.shoptime/src/components/TabLayout/iconComponents/FeaturedBrandIcon.jsx @@ -0,0 +1,15 @@ +import { convertThemeColor } from "./convertThemeColor"; +const FeaturedBrandIcon = ({ iconType = "normal" }) => { + return ( + + + + + ); +}; + +export default FeaturedBrandIcon; diff --git a/com.twin.app.shoptime/src/components/TabLayout/iconComponents/HomeIcon.jsx b/com.twin.app.shoptime/src/components/TabLayout/iconComponents/HomeIcon.jsx new file mode 100644 index 00000000..4e75d923 --- /dev/null +++ b/com.twin.app.shoptime/src/components/TabLayout/iconComponents/HomeIcon.jsx @@ -0,0 +1,16 @@ +import { convertThemeColor } from "./convertThemeColor"; + +const HomeIcon = ({ iconType = "normal" }) => { + return ( + + + + + ); +}; + +export default HomeIcon; diff --git a/com.twin.app.shoptime/src/components/TabLayout/iconComponents/HotPicksIcon.jsx b/com.twin.app.shoptime/src/components/TabLayout/iconComponents/HotPicksIcon.jsx new file mode 100644 index 00000000..f5374edf --- /dev/null +++ b/com.twin.app.shoptime/src/components/TabLayout/iconComponents/HotPicksIcon.jsx @@ -0,0 +1,16 @@ +import { convertThemeColor } from "./convertThemeColor"; + +const HotPicksIcon = ({ iconType = "normal" }) => { + return ( + + + + + ); +}; + +export default HotPicksIcon; diff --git a/com.twin.app.shoptime/src/components/TabLayout/iconComponents/MyPageIcon.jsx b/com.twin.app.shoptime/src/components/TabLayout/iconComponents/MyPageIcon.jsx new file mode 100644 index 00000000..dfe7c621 --- /dev/null +++ b/com.twin.app.shoptime/src/components/TabLayout/iconComponents/MyPageIcon.jsx @@ -0,0 +1,16 @@ +import { convertThemeColor } from "./convertThemeColor"; + +const MyPageIcon = ({ iconType = "normal" }) => { + return ( + + + + + ); +}; + +export default MyPageIcon; diff --git a/com.twin.app.shoptime/src/components/TabLayout/iconComponents/OnSaleIcon.jsx b/com.twin.app.shoptime/src/components/TabLayout/iconComponents/OnSaleIcon.jsx new file mode 100644 index 00000000..fe2597b6 --- /dev/null +++ b/com.twin.app.shoptime/src/components/TabLayout/iconComponents/OnSaleIcon.jsx @@ -0,0 +1,16 @@ +import { convertThemeColor } from "./convertThemeColor"; + +const OnSaleIcon = ({ iconType = "normal" }) => { + return ( + + + + + ); +}; + +export default OnSaleIcon; diff --git a/com.twin.app.shoptime/src/components/TabLayout/iconComponents/SearchIcon.jsx b/com.twin.app.shoptime/src/components/TabLayout/iconComponents/SearchIcon.jsx new file mode 100644 index 00000000..54b5480c --- /dev/null +++ b/com.twin.app.shoptime/src/components/TabLayout/iconComponents/SearchIcon.jsx @@ -0,0 +1,16 @@ +import { convertThemeColor } from "./convertThemeColor"; + +const SearchIcon = ({ iconType = "normal" }) => { + return ( + + + + + ); +}; + +export default SearchIcon; diff --git a/com.twin.app.shoptime/src/components/TabLayout/iconComponents/TrendingNowIcon.jsx b/com.twin.app.shoptime/src/components/TabLayout/iconComponents/TrendingNowIcon.jsx new file mode 100644 index 00000000..b367a375 --- /dev/null +++ b/com.twin.app.shoptime/src/components/TabLayout/iconComponents/TrendingNowIcon.jsx @@ -0,0 +1,15 @@ +import { convertThemeColor } from "./convertThemeColor"; +const TrendingNowIcon = ({ iconType = "normal" }) => { + return ( + + + + + ); +}; + +export default TrendingNowIcon; diff --git a/com.twin.app.shoptime/src/components/TabLayout/iconComponents/convertThemeColor.js b/com.twin.app.shoptime/src/components/TabLayout/iconComponents/convertThemeColor.js new file mode 100644 index 00000000..ee9d51c1 --- /dev/null +++ b/com.twin.app.shoptime/src/components/TabLayout/iconComponents/convertThemeColor.js @@ -0,0 +1,11 @@ +export const convertThemeColor = (iconType) => { + const themeMode = "light"; + const theme = { + light: { + normal: "#353535", + expanded: "#FEFEFE", + }, + }; + + return theme[themeMode][iconType]; +}; diff --git a/com.twin.app.shoptime/src/features/common/commonSlice.js b/com.twin.app.shoptime/src/features/common/commonSlice.js index 45c7f3e3..9e884bab 100644 --- a/com.twin.app.shoptime/src/features/common/commonSlice.js +++ b/com.twin.app.shoptime/src/features/common/commonSlice.js @@ -5,6 +5,7 @@ const initialState = { appStatus: { showLoadingPanel: { show: true, type: "launching" }, isLoading: true, + cursorVisible: false, }, }; diff --git a/com.twin.app.shoptime/src/features/menu/menuSlice.js b/com.twin.app.shoptime/src/features/menu/menuSlice.js new file mode 100644 index 00000000..a52253c9 --- /dev/null +++ b/com.twin.app.shoptime/src/features/menu/menuSlice.js @@ -0,0 +1,33 @@ +import { createSlice } from "@reduxjs/toolkit"; +import { fetchHomeMenu } from "./menuThunks"; + +const initialState = { + title: "", + items: {}, +}; + +export const menuSlice = createSlice({ + name: "menu", + initialState, + reducers: {}, + extraReducers: (builder) => { + builder + .addCase(fetchHomeMenu.pending, (state, action) => {}) + .addCase(fetchHomeMenu.fulfilled, (state, action) => { + state.title = action.payload.gnb.map((titles) => { + return titles.menuNm; + }); + state.items = action.payload.gnb.map((items) => { + return items; + }); + }) + + .addCase(fetchHomeMenu.rejected, (state, action) => {}); + }, +}); + +export const selectorMenuId = (state) => state.menu.menuId; +export const selectorMenuTitle = (state) => state.menu.title; +export const selectorMenuItem = (state) => state.menu.items; + +export default menuSlice.reducer; diff --git a/com.twin.app.shoptime/src/features/menu/menuThunks.js b/com.twin.app.shoptime/src/features/menu/menuThunks.js new file mode 100644 index 00000000..affce078 --- /dev/null +++ b/com.twin.app.shoptime/src/features/menu/menuThunks.js @@ -0,0 +1,15 @@ +import { createAsyncThunk } from "@reduxjs/toolkit"; +import { getHomeMenu } from "../../api/homeApi"; + +export const fetchHomeMenu = createAsyncThunk( + "menu/fetchHomeMenu", + async (_, { rejectWithValue }) => { + try { + const response = await getHomeMenu(); + + return response.data; + } catch (error) { + return rejectWithValue("unkown Error"); + } + } +); diff --git a/com.twin.app.shoptime/src/store/store.js b/com.twin.app.shoptime/src/store/store.js index b8bc2888..612dcb49 100644 --- a/com.twin.app.shoptime/src/store/store.js +++ b/com.twin.app.shoptime/src/store/store.js @@ -2,8 +2,9 @@ import { configureStore } from "@reduxjs/toolkit"; import appDataReducer from "../features/appData/appDataSlice"; import authReducer from "../features/auth/authSlice"; -import panelsReducer from "../features/panels/panelsSlice"; import commonReducer from "../features/common/commonSlice"; +import menuReducer from "../features/menu/menuSlice"; +import panelsReducer from "../features/panels/panelsSlice"; export const store = configureStore({ reducer: { @@ -11,5 +12,6 @@ export const store = configureStore({ auth: authReducer, appData: appDataReducer, common: commonReducer, + menu: menuReducer, }, }); diff --git a/com.twin.app.shoptime/src/style/CommonStyle.module.less b/com.twin.app.shoptime/src/style/CommonStyle.module.less index 03e8bad6..6a3da3ab 100644 --- a/com.twin.app.shoptime/src/style/CommonStyle.module.less +++ b/com.twin.app.shoptime/src/style/CommonStyle.module.less @@ -55,3 +55,4 @@ /* Text Button */ @LargeTextBtnHeight: 78px; @SmallTextBtnHeight: 60px; +@cateTabTwoFixWidth: 240px;