[search] IF-LGSP-097 검색 메인 조회 적용
- searchpanel진입시 화면에 적용. - your recent searches부분은 미적용. - hotpicksforyou링크연결.
This commit is contained in:
@@ -2,222 +2,224 @@
|
||||
|
||||
export const types = {
|
||||
// panel actions
|
||||
PUSH_PANEL: 'PUSH_PANEL',
|
||||
POP_PANEL: 'POP_PANEL',
|
||||
UPDATE_PANEL: 'UPDATE_PANEL',
|
||||
RESET_PANELS: 'RESET_PANELS',
|
||||
PUSH_PANEL: "PUSH_PANEL",
|
||||
POP_PANEL: "POP_PANEL",
|
||||
UPDATE_PANEL: "UPDATE_PANEL",
|
||||
RESET_PANELS: "RESET_PANELS",
|
||||
|
||||
// device actions
|
||||
GET_AUTHENTICATION_CODE: 'GET_AUTHENTICATION_CODE',
|
||||
REGISTER_DEVICE: 'REGISTER_DEVICE',
|
||||
REGISTER_DEVICE_INFO: 'REGISTER_DEVICE_INFO',
|
||||
GET_DEVICE_INFO: 'GET_DEVICE_INFO',
|
||||
CLEAR_REGISTER_DEVICE_INFO: 'CLEAR_REGISTER_DEVICE_INFO',
|
||||
REGISTER_DEVICE_RESET: 'REGISTER_DEVICE_RESET',
|
||||
GET_AUTHENTICATION_CODE: "GET_AUTHENTICATION_CODE",
|
||||
REGISTER_DEVICE: "REGISTER_DEVICE",
|
||||
REGISTER_DEVICE_INFO: "REGISTER_DEVICE_INFO",
|
||||
GET_DEVICE_INFO: "GET_DEVICE_INFO",
|
||||
CLEAR_REGISTER_DEVICE_INFO: "CLEAR_REGISTER_DEVICE_INFO",
|
||||
REGISTER_DEVICE_RESET: "REGISTER_DEVICE_RESET",
|
||||
|
||||
// common actions
|
||||
GET_HTTP_HEADER: 'GET_HTTP_HEADER',
|
||||
CHANGE_APP_STATUS: 'CHANGE_APP_STATUS',
|
||||
SEND_BROADCAST: 'SEND_BROADCAST',
|
||||
CHANGE_LOCAL_SETTINGS: 'CHANGE_LOCAL_SETTINGS',
|
||||
GNB_OPENED: 'GNB_OPENED',
|
||||
SET_SHOW_POPUP: 'SET_SHOW_POPUP',
|
||||
SET_SHOW_SECONDARY_POPUP: 'SET_SHOW_SECONDARY_POPUP',
|
||||
SET_HIDE_POPUP: 'SET_HIDE_POPUP',
|
||||
SET_HIDE_SECONDARY_POPUP: 'SET_HIDE_SECONDARY_POPUP',
|
||||
SHOW_OPTIONAL_TERMS_CONFIRM_POPUP: 'SHOW_OPTIONAL_TERMS_CONFIRM_POPUP',
|
||||
HIDE_OPTIONAL_TERMS_CONFIRM_POPUP: 'HIDE_OPTIONAL_TERMS_CONFIRM_POPUP',
|
||||
TOGGLE_OPTIONAL_TERMS_CONFIRM: 'TOGGLE_OPTIONAL_TERMS_CONFIRM',
|
||||
GET_HTTP_HEADER: "GET_HTTP_HEADER",
|
||||
CHANGE_APP_STATUS: "CHANGE_APP_STATUS",
|
||||
SEND_BROADCAST: "SEND_BROADCAST",
|
||||
CHANGE_LOCAL_SETTINGS: "CHANGE_LOCAL_SETTINGS",
|
||||
GNB_OPENED: "GNB_OPENED",
|
||||
SET_SHOW_POPUP: "SET_SHOW_POPUP",
|
||||
SET_SHOW_SECONDARY_POPUP: "SET_SHOW_SECONDARY_POPUP",
|
||||
SET_HIDE_POPUP: "SET_HIDE_POPUP",
|
||||
SET_HIDE_SECONDARY_POPUP: "SET_HIDE_SECONDARY_POPUP",
|
||||
SHOW_OPTIONAL_TERMS_CONFIRM_POPUP: "SHOW_OPTIONAL_TERMS_CONFIRM_POPUP",
|
||||
HIDE_OPTIONAL_TERMS_CONFIRM_POPUP: "HIDE_OPTIONAL_TERMS_CONFIRM_POPUP",
|
||||
TOGGLE_OPTIONAL_TERMS_CONFIRM: "TOGGLE_OPTIONAL_TERMS_CONFIRM",
|
||||
// 선택약관 팝업 상태 관리
|
||||
SET_OPTIONAL_TERMS_POPUP_SHOWN: 'SET_OPTIONAL_TERMS_POPUP_SHOWN',
|
||||
SET_OPTIONAL_TERMS_USER_DECISION: 'SET_OPTIONAL_TERMS_USER_DECISION',
|
||||
RESET_OPTIONAL_TERMS_SESSION: 'RESET_OPTIONAL_TERMS_SESSION',
|
||||
SET_OPTIONAL_TERMS_POPUP_SHOWN: "SET_OPTIONAL_TERMS_POPUP_SHOWN",
|
||||
SET_OPTIONAL_TERMS_USER_DECISION: "SET_OPTIONAL_TERMS_USER_DECISION",
|
||||
RESET_OPTIONAL_TERMS_SESSION: "RESET_OPTIONAL_TERMS_SESSION",
|
||||
// 선택약관 직접 상태 업데이트 (API 호출 없이)
|
||||
UPDATE_OPTIONAL_TERMS_AGREE_DIRECT: 'UPDATE_OPTIONAL_TERMS_AGREE_DIRECT',
|
||||
UPDATE_TERMS_AGREEMENT_STATUS_DIRECT: 'UPDATE_TERMS_AGREEMENT_STATUS_DIRECT',
|
||||
SET_EXIT_APP: 'SET_EXIT_APP',
|
||||
GET_LOGIN_USER_DATA: 'GET_LOGIN_USER_DATA',
|
||||
GET_TERMS_AGREE_YN: 'GET_TERMS_AGREE_YN',
|
||||
LAUNCH_MEMBERSHIP_APP: 'LAUNCH_MEMBERSHIP_APP',
|
||||
SET_FOCUS: 'SET_FOCUS',
|
||||
SET_GNB_MENU: 'SET_GNB_MENU',
|
||||
SET_SYSTEM_NOTICE: 'SET_SYSTEM_NOTICE',
|
||||
SET_SYSTEM_TERMINATION: 'SET_SYSTEM_TERMINATION',
|
||||
SET_DEEP_LINK: 'SET_DEEP_LINK',
|
||||
SET_SECOND_LAYER_INFO: 'SET_SECOND_LAYER_INFO',
|
||||
SET_ERROR_MESSAGE: 'SET_ERROR_MESSAGE',
|
||||
CLEAR_ERROR_MESSAGE: 'CLEAR_ERROR_MESSAGE',
|
||||
GET_DEVICE_MACADDRESS: 'GET_DEVICE_MACADDRESS',
|
||||
SET_DEVICE_REGISTERED: 'SET_DEVICE_REGISTERED',
|
||||
UPDATE_OPTIONAL_TERMS_AGREE_DIRECT: "UPDATE_OPTIONAL_TERMS_AGREE_DIRECT",
|
||||
UPDATE_TERMS_AGREEMENT_STATUS_DIRECT: "UPDATE_TERMS_AGREEMENT_STATUS_DIRECT",
|
||||
SET_EXIT_APP: "SET_EXIT_APP",
|
||||
GET_LOGIN_USER_DATA: "GET_LOGIN_USER_DATA",
|
||||
GET_TERMS_AGREE_YN: "GET_TERMS_AGREE_YN",
|
||||
LAUNCH_MEMBERSHIP_APP: "LAUNCH_MEMBERSHIP_APP",
|
||||
SET_FOCUS: "SET_FOCUS",
|
||||
SET_GNB_MENU: "SET_GNB_MENU",
|
||||
SET_SYSTEM_NOTICE: "SET_SYSTEM_NOTICE",
|
||||
SET_SYSTEM_TERMINATION: "SET_SYSTEM_TERMINATION",
|
||||
SET_DEEP_LINK: "SET_DEEP_LINK",
|
||||
SET_SECOND_LAYER_INFO: "SET_SECOND_LAYER_INFO",
|
||||
SET_ERROR_MESSAGE: "SET_ERROR_MESSAGE",
|
||||
CLEAR_ERROR_MESSAGE: "CLEAR_ERROR_MESSAGE",
|
||||
GET_DEVICE_MACADDRESS: "GET_DEVICE_MACADDRESS",
|
||||
SET_DEVICE_REGISTERED: "SET_DEVICE_REGISTERED",
|
||||
|
||||
// billing actions
|
||||
GET_MY_INFO_BILLING_SEARCH: 'GET_MY_INFO_BILLING_SEARCH',
|
||||
GET_MY_INFO_BILLING_SEARCH: "GET_MY_INFO_BILLING_SEARCH",
|
||||
|
||||
// card actions
|
||||
GET_MY_INFO_CARD_SEARCH: 'GET_MY_INFO_CARD_SEARCH',
|
||||
GET_MY_INFO_CARD_SEARCH: "GET_MY_INFO_CARD_SEARCH",
|
||||
|
||||
// shipping actions
|
||||
GET_MY_INFO_SHIPPING_SEARCH: 'GET_MY_INFO_SHIPPING_SEARCH',
|
||||
GET_MY_INFO_SHIPPING_SEARCH: "GET_MY_INFO_SHIPPING_SEARCH",
|
||||
|
||||
// cart actions
|
||||
GET_MY_INFO_CART_SEARCH: 'GET_MY_INFO_CART_SEARCH',
|
||||
ADD_TO_CART: 'ADD_TO_CART',
|
||||
REMOVE_FROM_CART: 'REMOVE_FROM_CART',
|
||||
UPDATE_CART_ITEM: 'UPDATE_CART_ITEM',
|
||||
CLEAR_CART: 'CLEAR_CART',
|
||||
GET_MY_INFO_CART_SEARCH: "GET_MY_INFO_CART_SEARCH",
|
||||
ADD_TO_CART: "ADD_TO_CART",
|
||||
REMOVE_FROM_CART: "REMOVE_FROM_CART",
|
||||
UPDATE_CART_ITEM: "UPDATE_CART_ITEM",
|
||||
CLEAR_CART: "CLEAR_CART",
|
||||
|
||||
// appData actions
|
||||
ADD_MAIN_INDEX: 'ADD_MAIN_INDEX',
|
||||
SEND_SMS: 'SEND_SMS',
|
||||
CLEAR_SMS: 'CLEAR_SMS',
|
||||
ADD_MAIN_INDEX: "ADD_MAIN_INDEX",
|
||||
SEND_SMS: "SEND_SMS",
|
||||
CLEAR_SMS: "CLEAR_SMS",
|
||||
|
||||
// home actions
|
||||
GET_HOME_TERMS: 'GET_HOME_TERMS',
|
||||
SET_TERMS_ID_MAP: 'SET_TERMS_ID_MAP',
|
||||
SET_OPTIONAL_TERMS_AVAILABILITY: 'SET_OPTIONAL_TERMS_AVAILABILITY',
|
||||
GET_HOME_MENU: 'GET_HOME_MENU',
|
||||
GET_HOME_LAYOUT: 'GET_HOME_LAYOUT',
|
||||
GET_HOME_MAIN_CONTENTS: 'GET_HOME_MAIN_CONTENTS',
|
||||
GET_HOME_FULL_VIDEO_INFO: 'GET_HOME_FULL_VIDEO_INFO',
|
||||
GET_THEME_CURATION_INFO: 'GET_THEME_CURATION_INFO',
|
||||
GET_THEME_CURATION_DETAIL_INFO: 'GET_THEME_CURATION_DETAIL_INFO',
|
||||
GET_THEME_HOTEL_DETAIL_INFO: 'GET_THEME_HOTEL_DETAIL_INFO',
|
||||
GET_THEME_MENU_SHELF_INFO: 'GET_THEME_MENU_SHELF_INFO',
|
||||
CLEAR_THEME_MENU_SHELF_INFO: 'CLEAR_THEME_MENU_SHELF_INFO',
|
||||
CLEAR_THEME_DETAIL: 'CLEAR_THEME_DETAIL',
|
||||
CHECK_ENTER_THROUGH_GNB: 'CHECK_ENTER_THROUGH_GNB',
|
||||
SET_DEFAULT_FOCUS: 'SET_DEFAULT_FOCUS',
|
||||
SET_BANNER_INDEX: 'SET_BANNER_INDEX',
|
||||
RESET_HOME_INFO: 'RESET_HOME_INFO',
|
||||
UPDATE_HOME_INFO: 'UPDATE_HOME_INFO',
|
||||
GET_HOME_TERMS: "GET_HOME_TERMS",
|
||||
SET_TERMS_ID_MAP: "SET_TERMS_ID_MAP",
|
||||
SET_OPTIONAL_TERMS_AVAILABILITY: "SET_OPTIONAL_TERMS_AVAILABILITY",
|
||||
GET_HOME_MENU: "GET_HOME_MENU",
|
||||
GET_HOME_LAYOUT: "GET_HOME_LAYOUT",
|
||||
GET_HOME_MAIN_CONTENTS: "GET_HOME_MAIN_CONTENTS",
|
||||
GET_HOME_FULL_VIDEO_INFO: "GET_HOME_FULL_VIDEO_INFO",
|
||||
GET_THEME_CURATION_INFO: "GET_THEME_CURATION_INFO",
|
||||
GET_THEME_CURATION_DETAIL_INFO: "GET_THEME_CURATION_DETAIL_INFO",
|
||||
GET_THEME_HOTEL_DETAIL_INFO: "GET_THEME_HOTEL_DETAIL_INFO",
|
||||
GET_THEME_MENU_SHELF_INFO: "GET_THEME_MENU_SHELF_INFO",
|
||||
CLEAR_THEME_MENU_SHELF_INFO: "CLEAR_THEME_MENU_SHELF_INFO",
|
||||
CLEAR_THEME_DETAIL: "CLEAR_THEME_DETAIL",
|
||||
CHECK_ENTER_THROUGH_GNB: "CHECK_ENTER_THROUGH_GNB",
|
||||
SET_DEFAULT_FOCUS: "SET_DEFAULT_FOCUS",
|
||||
SET_BANNER_INDEX: "SET_BANNER_INDEX",
|
||||
RESET_HOME_INFO: "RESET_HOME_INFO",
|
||||
UPDATE_HOME_INFO: "UPDATE_HOME_INFO",
|
||||
|
||||
// brand actions
|
||||
GET_BRAND_LIST: 'GET_BRAND_LIST',
|
||||
GET_BRAND_LAYOUT_INFO: 'GET_BRAND_LAYOUT_INFO',
|
||||
GET_BRAND_LIVE_CHANNEL_INFO: 'GET_BRAND_LIVE_CHANNEL_INFO',
|
||||
GET_BRAND_CHAN_INFO: 'GET_BRAND_CHAN_INFO',
|
||||
GET_BRAND_TSV_INFO: 'GET_BRAND_TSV_INFO',
|
||||
GET_BRAND_RECOMMENDED_SHOW_INFO: 'GET_BRAND_RECOMMENDED_SHOW_INFO',
|
||||
GET_BRAND_SERIES_INFO: 'GET_BRAND_SERIES_INFO',
|
||||
GET_BRAND_CATEGORY_INFO: 'GET_BRAND_CATEGORY_INFO',
|
||||
GET_BRAND_CATEGORY_PRODUCT_INFO: 'GET_BRAND_CATEGORY_PRODUCT_INFO',
|
||||
GET_BRAND_BEST_SELLER: 'GET_BRAND_BEST_SELLER',
|
||||
GET_BRAND_CREATORS_INFO: 'GET_BRAND_CREATORS_INFO',
|
||||
GET_BRAND_SHOWROOM: 'GET_BRAND_SHOWROOM',
|
||||
GET_BRAND_RECENTLY_AIRED: 'GET_BRAND_RECENTLY_AIRED',
|
||||
SET_BRAND_LIVE_CHANNEL_UPCOMING: 'SET_BRAND_LIVE_CHANNEL_UPCOMING',
|
||||
SET_BRAND_CHAN_INFO: 'SET_BRAND_CHAN_INFO',
|
||||
RESET_BRAND_STATE: 'RESET_BRAND_STATE',
|
||||
RESET_BRAND_STATE_EXCEPT_BRAND_INFO: 'RESET_BRAND_STATE_EXCEPT_BRAND_INFO',
|
||||
RESET_BRAND_LAYOUT_INFO: 'RESET_BRAND_LAYOUT_INFO',
|
||||
GET_BRAND_LIST: "GET_BRAND_LIST",
|
||||
GET_BRAND_LAYOUT_INFO: "GET_BRAND_LAYOUT_INFO",
|
||||
GET_BRAND_LIVE_CHANNEL_INFO: "GET_BRAND_LIVE_CHANNEL_INFO",
|
||||
GET_BRAND_CHAN_INFO: "GET_BRAND_CHAN_INFO",
|
||||
GET_BRAND_TSV_INFO: "GET_BRAND_TSV_INFO",
|
||||
GET_BRAND_RECOMMENDED_SHOW_INFO: "GET_BRAND_RECOMMENDED_SHOW_INFO",
|
||||
GET_BRAND_SERIES_INFO: "GET_BRAND_SERIES_INFO",
|
||||
GET_BRAND_CATEGORY_INFO: "GET_BRAND_CATEGORY_INFO",
|
||||
GET_BRAND_CATEGORY_PRODUCT_INFO: "GET_BRAND_CATEGORY_PRODUCT_INFO",
|
||||
GET_BRAND_BEST_SELLER: "GET_BRAND_BEST_SELLER",
|
||||
GET_BRAND_CREATORS_INFO: "GET_BRAND_CREATORS_INFO",
|
||||
GET_BRAND_SHOWROOM: "GET_BRAND_SHOWROOM",
|
||||
GET_BRAND_RECENTLY_AIRED: "GET_BRAND_RECENTLY_AIRED",
|
||||
SET_BRAND_LIVE_CHANNEL_UPCOMING: "SET_BRAND_LIVE_CHANNEL_UPCOMING",
|
||||
SET_BRAND_CHAN_INFO: "SET_BRAND_CHAN_INFO",
|
||||
RESET_BRAND_STATE: "RESET_BRAND_STATE",
|
||||
RESET_BRAND_STATE_EXCEPT_BRAND_INFO: "RESET_BRAND_STATE_EXCEPT_BRAND_INFO",
|
||||
RESET_BRAND_LAYOUT_INFO: "RESET_BRAND_LAYOUT_INFO",
|
||||
|
||||
// main actions
|
||||
GET_SUB_CATEGORY: 'GET_SUB_CATEGORY',
|
||||
APPEND_SUB_CATEGORY: 'APPEND_SUB_CATEGORY',
|
||||
GET_TOP_20_SHOW: 'GET_TOP_20_SHOW',
|
||||
GET_PRODUCT_DETAIL: 'GET_PRODUCT_DETAIL',
|
||||
GET_YOUMAYLIKE: 'GET_YOUMAYLIKE',
|
||||
SET_MAIN_LIKE_CATEGORY: 'SET_MAIN_LIKE_CATEGORY',
|
||||
SET_MAIN_LIVE_UPCOMING_ALARM: 'SET_MAIN_LIVE_UPCOMING_ALARM',
|
||||
GET_MAIN_LIVE_SHOW_NOW_PRODUCT: 'GET_MAIN_LIVE_SHOW_NOW_PRODUCT',
|
||||
GET_MAIN_LIVE_SHOW: 'GET_MAIN_LIVE_SHOW',
|
||||
GET_MAIN_CATEGORY_SHOW_DETAIL: 'GET_MAIN_CATEGORY_SHOW_DETAIL',
|
||||
CLEAR_PRODUCT_DETAIL: 'CLEAR_PRODUCT_DETAIL',
|
||||
CLEAR_SUB_CATEGORY: 'CLEAR_SUB_CATEGORY',
|
||||
CLEAR_SHOPNOW_INFO: 'CLEAR_SHOPNOW_INFO',
|
||||
GET_SUB_CATEGORY: "GET_SUB_CATEGORY",
|
||||
APPEND_SUB_CATEGORY: "APPEND_SUB_CATEGORY",
|
||||
GET_TOP_20_SHOW: "GET_TOP_20_SHOW",
|
||||
GET_PRODUCT_DETAIL: "GET_PRODUCT_DETAIL",
|
||||
GET_YOUMAYLIKE: "GET_YOUMAYLIKE",
|
||||
SET_MAIN_LIKE_CATEGORY: "SET_MAIN_LIKE_CATEGORY",
|
||||
SET_MAIN_LIVE_UPCOMING_ALARM: "SET_MAIN_LIVE_UPCOMING_ALARM",
|
||||
GET_MAIN_LIVE_SHOW_NOW_PRODUCT: "GET_MAIN_LIVE_SHOW_NOW_PRODUCT",
|
||||
GET_MAIN_LIVE_SHOW: "GET_MAIN_LIVE_SHOW",
|
||||
GET_MAIN_CATEGORY_SHOW_DETAIL: "GET_MAIN_CATEGORY_SHOW_DETAIL",
|
||||
CLEAR_PRODUCT_DETAIL: "CLEAR_PRODUCT_DETAIL",
|
||||
CLEAR_SUB_CATEGORY: "CLEAR_SUB_CATEGORY",
|
||||
CLEAR_SHOPNOW_INFO: "CLEAR_SHOPNOW_INFO",
|
||||
|
||||
// myPage actions
|
||||
GET_MY_RECOMMANDED_KEYWORD: 'GET_MY_RECOMMANDED_KEYWORD',
|
||||
GET_MY_FAQ_INFO: 'GET_MY_FAQ_INFO',
|
||||
GET_NOTICE: 'GET_NOTICE',
|
||||
GET_MY_CUSTOMERS: 'GET_MY_CUSTOMERS',
|
||||
GET_MY_FAVORITE: 'GET_MY_FAVORITE',
|
||||
DELETE_MY_FAVORITE: 'DELETE_MY_FAVORITE',
|
||||
GET_MY_FAVORITE_FLAG: 'GET_MY_FAVORITE_FLAG',
|
||||
SET_MY_TERMS_WITHDRAW: 'SET_MY_TERMS_WITHDRAW',
|
||||
GET_MY_UPCOMING_CHANGE_INFO: 'GET_MY_UPCOMING_CHANGE_INFO',
|
||||
GET_MY_UPCOMING_ALERT_SHOW: 'GET_MY_UPCOMING_ALERT_SHOW',
|
||||
DELETE_MY_UPCOMING_ALERT_SHOW: 'DELETE_MY_UPCOMING_ALERT_SHOW',
|
||||
GET_MY_UPCOMING_ALERT_SHOW_KEYS: 'GET_MY_UPCOMING_ALERT_SHOW_KEYS',
|
||||
SET_MY_UPCOMING_USE_ALERT: 'SET_MY_UPCOMING_USE_ALERT',
|
||||
GET_UPCOMING_ALERT_SHOW_CHANGE_INFO: 'GET_UPCOMING_ALERT_SHOW_CHANGE_INFO',
|
||||
GET_MY_RECENTLY_VIEWED_INFO: 'GET_MY_RECENTLY_VIEWED_INFO',
|
||||
CLEAR_RECENTLY_VIEWED_INFO: 'CLEAR_RECENTLY_VIEWED_INFO',
|
||||
CLEAR_FAVORITES: 'CLEAR_FAVORITES',
|
||||
SET_MYPAGE_TERMS_AGREE: 'SET_MYPAGE_TERMS_AGREE',
|
||||
SET_MYPAGE_TERMS_AGREE_SUCCESS: 'SET_MYPAGE_TERMS_AGREE_SUCCESS',
|
||||
SET_MYPAGE_TERMS_AGREE_FAIL: 'SET_MYPAGE_TERMS_AGREE_FAIL',
|
||||
GET_MY_RECOMMANDED_KEYWORD: "GET_MY_RECOMMANDED_KEYWORD",
|
||||
GET_MY_FAQ_INFO: "GET_MY_FAQ_INFO",
|
||||
GET_NOTICE: "GET_NOTICE",
|
||||
GET_MY_CUSTOMERS: "GET_MY_CUSTOMERS",
|
||||
GET_MY_FAVORITE: "GET_MY_FAVORITE",
|
||||
DELETE_MY_FAVORITE: "DELETE_MY_FAVORITE",
|
||||
GET_MY_FAVORITE_FLAG: "GET_MY_FAVORITE_FLAG",
|
||||
SET_MY_TERMS_WITHDRAW: "SET_MY_TERMS_WITHDRAW",
|
||||
GET_MY_UPCOMING_CHANGE_INFO: "GET_MY_UPCOMING_CHANGE_INFO",
|
||||
GET_MY_UPCOMING_ALERT_SHOW: "GET_MY_UPCOMING_ALERT_SHOW",
|
||||
DELETE_MY_UPCOMING_ALERT_SHOW: "DELETE_MY_UPCOMING_ALERT_SHOW",
|
||||
GET_MY_UPCOMING_ALERT_SHOW_KEYS: "GET_MY_UPCOMING_ALERT_SHOW_KEYS",
|
||||
SET_MY_UPCOMING_USE_ALERT: "SET_MY_UPCOMING_USE_ALERT",
|
||||
GET_UPCOMING_ALERT_SHOW_CHANGE_INFO: "GET_UPCOMING_ALERT_SHOW_CHANGE_INFO",
|
||||
GET_MY_RECENTLY_VIEWED_INFO: "GET_MY_RECENTLY_VIEWED_INFO",
|
||||
CLEAR_RECENTLY_VIEWED_INFO: "CLEAR_RECENTLY_VIEWED_INFO",
|
||||
CLEAR_FAVORITES: "CLEAR_FAVORITES",
|
||||
SET_MYPAGE_TERMS_AGREE: "SET_MYPAGE_TERMS_AGREE",
|
||||
SET_MYPAGE_TERMS_AGREE_SUCCESS: "SET_MYPAGE_TERMS_AGREE_SUCCESS",
|
||||
SET_MYPAGE_TERMS_AGREE_FAIL: "SET_MYPAGE_TERMS_AGREE_FAIL",
|
||||
|
||||
// onSale actions
|
||||
GET_HOME_ON_SALE_INFO: 'GET_HOME_ON_SALE_INFO',
|
||||
GET_ON_SALE_INFO: 'GET_ON_SALE_INFO',
|
||||
COPY_CATEGORY_INFO: 'COPY_CATEGORY_INFO',
|
||||
RESET_ON_SALE_STATE: 'RESET_ON_SALE_STATE',
|
||||
GET_HOME_ON_SALE_INFO: "GET_HOME_ON_SALE_INFO",
|
||||
GET_ON_SALE_INFO: "GET_ON_SALE_INFO",
|
||||
COPY_CATEGORY_INFO: "COPY_CATEGORY_INFO",
|
||||
RESET_ON_SALE_STATE: "RESET_ON_SALE_STATE",
|
||||
|
||||
// product actions
|
||||
GET_BEST_SELLER: 'GET_BEST_SELLER',
|
||||
GET_PRODUCT_GROUP: 'GET_PRODUCT_GROUP',
|
||||
GET_PRODUCT_OPTION: 'GET_PRODUCT_OPTION',
|
||||
GET_PRODUCT_IMAGE_LENGTH: 'GET_PRODUCT_IMAGE_LENGTH',
|
||||
GET_VIDEO_INDECATOR_FOCUS: 'GET_VIDEO_INDECATOR_FOCUS',
|
||||
GET_PRODUCT_OPTION_ID: 'GET_PRODUCT_OPTION_ID',
|
||||
CLEAR_PRODUCT_OPTIONS: 'CLEAR_PRODUCT_OPTIONS',
|
||||
GET_USER_REVIEW: 'GET_USER_REVIEW',
|
||||
TOGGLE_SHOW_ALL_REVIEWS: 'TOGGLE_SHOW_ALL_REVIEWS',
|
||||
RESET_SHOW_ALL_REVIEWS: 'RESET_SHOW_ALL_REVIEWS',
|
||||
GET_BEST_SELLER: "GET_BEST_SELLER",
|
||||
GET_PRODUCT_GROUP: "GET_PRODUCT_GROUP",
|
||||
GET_PRODUCT_OPTION: "GET_PRODUCT_OPTION",
|
||||
GET_PRODUCT_IMAGE_LENGTH: "GET_PRODUCT_IMAGE_LENGTH",
|
||||
GET_VIDEO_INDECATOR_FOCUS: "GET_VIDEO_INDECATOR_FOCUS",
|
||||
GET_PRODUCT_OPTION_ID: "GET_PRODUCT_OPTION_ID",
|
||||
CLEAR_PRODUCT_OPTIONS: "CLEAR_PRODUCT_OPTIONS",
|
||||
GET_USER_REVIEW: "GET_USER_REVIEW",
|
||||
TOGGLE_SHOW_ALL_REVIEWS: "TOGGLE_SHOW_ALL_REVIEWS",
|
||||
RESET_SHOW_ALL_REVIEWS: "RESET_SHOW_ALL_REVIEWS",
|
||||
|
||||
// search actions
|
||||
GET_SEARCH: 'GET_SEARCH',
|
||||
GET_SHOPPERHOUSE_SEARCH: 'GET_SHOPPERHOUSE_SEARCH',
|
||||
CLEAR_SHOPPERHOUSE_DATA: 'CLEAR_SHOPPERHOUSE_DATA',
|
||||
RESET_SEARCH: 'RESET_SEARCH',
|
||||
RESET_VOICE_SEARCH: 'RESET_VOICE_SEARCH',
|
||||
GET_SEARCH_PROCESSED: 'GET_SEARCH_PROCESSED',
|
||||
SET_SEARCH_INIT_PERFORMED: 'SET_SEARCH_INIT_PERFORMED',
|
||||
UPDATE_SEARCH_TIMESTAMP: 'UPDATE_SEARCH_TIMESTAMP',
|
||||
GET_SEARCH: "GET_SEARCH",
|
||||
GET_SEARCH_MAIN: "GET_SEARCH_MAIN",
|
||||
CLEAR_SEARCH_MAIN_DATA: "CLEAR_SEARCH_MAIN_DATA",
|
||||
GET_SHOPPERHOUSE_SEARCH: "GET_SHOPPERHOUSE_SEARCH",
|
||||
CLEAR_SHOPPERHOUSE_DATA: "CLEAR_SHOPPERHOUSE_DATA",
|
||||
RESET_SEARCH: "RESET_SEARCH",
|
||||
RESET_VOICE_SEARCH: "RESET_VOICE_SEARCH",
|
||||
GET_SEARCH_PROCESSED: "GET_SEARCH_PROCESSED",
|
||||
SET_SEARCH_INIT_PERFORMED: "SET_SEARCH_INIT_PERFORMED",
|
||||
UPDATE_SEARCH_TIMESTAMP: "UPDATE_SEARCH_TIMESTAMP",
|
||||
|
||||
// event actions
|
||||
GET_WELCOME_EVENT_INFO: 'GET_WELCOME_EVENT_INFO',
|
||||
GET_EVENT_ISSUED_STATUS: 'GET_EVENT_ISSUED_STATUS',
|
||||
SET_EVENT_ISSUE_REQ: 'SET_EVENT_ISSUE_REQ',
|
||||
SET_EVENT_POP_CLICK_INFO: 'SET_EVENT_POP_CLICK_INFO',
|
||||
CLEAR_EVENT_INFO: 'CLEAR_EVENT_INFO',
|
||||
SKIP_CLICK_INFO: 'SKIP_CLICK_INFO',
|
||||
CLEAR_CURATION_COUPON: 'CLEAR_CURATION_COUPON',
|
||||
CLEAR_EVENT_ISSUED_STATUS_SUCCEESS: 'CLEAR_EVENT_ISSUED_STATUS_SUCCEESS',
|
||||
GET_WELCOME_EVENT_INFO: "GET_WELCOME_EVENT_INFO",
|
||||
GET_EVENT_ISSUED_STATUS: "GET_EVENT_ISSUED_STATUS",
|
||||
SET_EVENT_ISSUE_REQ: "SET_EVENT_ISSUE_REQ",
|
||||
SET_EVENT_POP_CLICK_INFO: "SET_EVENT_POP_CLICK_INFO",
|
||||
CLEAR_EVENT_INFO: "CLEAR_EVENT_INFO",
|
||||
SKIP_CLICK_INFO: "SKIP_CLICK_INFO",
|
||||
CLEAR_CURATION_COUPON: "CLEAR_CURATION_COUPON",
|
||||
CLEAR_EVENT_ISSUED_STATUS_SUCCEESS: "CLEAR_EVENT_ISSUED_STATUS_SUCCEESS",
|
||||
|
||||
// coupon actions
|
||||
GET_PRODUCT_COUPON_INFO: 'GET_PRODUCT_COUPON_INFO',
|
||||
GET_PRODUCT_COUPON_SEARCH: 'GET_PRODUCT_COUPON_SEARCH',
|
||||
GET_PRODUCT_COUPON_DOWNLOAD: 'GET_PRODUCT_COUPON_DOWNLOAD',
|
||||
GET_PRODUCT_COUPON_TOTDOWNLOAD: 'GET_PRODUCT_COUPON_TOTDOWNLOAD',
|
||||
CLEAR_COUPON_INFO: 'CLEAR_COUPON_INFO',
|
||||
CLEAR_GET_PRODUCT_COUPON_DOWNLOAD: 'CLEAR_GET_PRODUCT_COUPON_DOWNLOAD',
|
||||
GET_PRODUCT_COUPON_INFO: "GET_PRODUCT_COUPON_INFO",
|
||||
GET_PRODUCT_COUPON_SEARCH: "GET_PRODUCT_COUPON_SEARCH",
|
||||
GET_PRODUCT_COUPON_DOWNLOAD: "GET_PRODUCT_COUPON_DOWNLOAD",
|
||||
GET_PRODUCT_COUPON_TOTDOWNLOAD: "GET_PRODUCT_COUPON_TOTDOWNLOAD",
|
||||
CLEAR_COUPON_INFO: "CLEAR_COUPON_INFO",
|
||||
CLEAR_GET_PRODUCT_COUPON_DOWNLOAD: "CLEAR_GET_PRODUCT_COUPON_DOWNLOAD",
|
||||
|
||||
// checkout actions
|
||||
GET_CHECKOUT_INFO: 'GET_CHECKOUT_INFO',
|
||||
INSERT_MY_INFO_CHECKOUT_ORDER: 'INSERT_MY_INFO_CHECKOUT_ORDER',
|
||||
GET_TAX_INFOS: 'GET_TAX_INFOS',
|
||||
UPDATE_SELECTED_SHIPPING_ADDR: 'UPDATE_SELECTED_SHIPPING_ADDR',
|
||||
UPDATE_SELECTED_BILLING_ADDR: 'UPDATE_SELECTED_BILLING_ADDR',
|
||||
UPDATE_SELECTED_COUPON: 'UPDATE_SELECTED_COUPON',
|
||||
GET_CHECKOUT_TOTAL_AMT: 'GET_CHECKOUT_TOTAL_AMT',
|
||||
CHECKOUT_DATA_RESET: 'CHECKOUT_DATA_RESET',
|
||||
GET_CHECKOUT_INFO: "GET_CHECKOUT_INFO",
|
||||
INSERT_MY_INFO_CHECKOUT_ORDER: "INSERT_MY_INFO_CHECKOUT_ORDER",
|
||||
GET_TAX_INFOS: "GET_TAX_INFOS",
|
||||
UPDATE_SELECTED_SHIPPING_ADDR: "UPDATE_SELECTED_SHIPPING_ADDR",
|
||||
UPDATE_SELECTED_BILLING_ADDR: "UPDATE_SELECTED_BILLING_ADDR",
|
||||
UPDATE_SELECTED_COUPON: "UPDATE_SELECTED_COUPON",
|
||||
GET_CHECKOUT_TOTAL_AMT: "GET_CHECKOUT_TOTAL_AMT",
|
||||
CHECKOUT_DATA_RESET: "CHECKOUT_DATA_RESET",
|
||||
|
||||
// order actions
|
||||
SET_PURCHASE_TERMS_AGREE: 'SET_PURCHASE_TERMS_AGREE',
|
||||
SET_PURCHASE_TERMS_WITHDRAW: 'SET_PURCHASE_TERMS_WITHDRAW',
|
||||
GET_MY_INFO_ORDER_SEARCH: 'GET_MY_INFO_ORDER_SEARCH',
|
||||
GET_MY_INFO_ORDER_SEARCH_CANCEL: 'GET_MY_INFO_ORDER_SEARCH_CANCEL',
|
||||
GET_MY_INFO_ORDER_DETAIL_SEARCH: 'GET_MY_INFO_ORDER_DETAIL_SEARCH',
|
||||
GET_MY_INFO_ORDER_SHIPPING_SEARCH: 'GET_MY_INFO_ORDER_SHIPPING_SEARCH',
|
||||
CLEAR_MY_INFO_ORDER_SEARCH: 'CLEAR_MY_INFO_ORDER_SEARCH',
|
||||
SET_PURCHASE_TERMS_AGREE: "SET_PURCHASE_TERMS_AGREE",
|
||||
SET_PURCHASE_TERMS_WITHDRAW: "SET_PURCHASE_TERMS_WITHDRAW",
|
||||
GET_MY_INFO_ORDER_SEARCH: "GET_MY_INFO_ORDER_SEARCH",
|
||||
GET_MY_INFO_ORDER_SEARCH_CANCEL: "GET_MY_INFO_ORDER_SEARCH_CANCEL",
|
||||
GET_MY_INFO_ORDER_DETAIL_SEARCH: "GET_MY_INFO_ORDER_DETAIL_SEARCH",
|
||||
GET_MY_INFO_ORDER_SHIPPING_SEARCH: "GET_MY_INFO_ORDER_SHIPPING_SEARCH",
|
||||
CLEAR_MY_INFO_ORDER_SEARCH: "CLEAR_MY_INFO_ORDER_SEARCH",
|
||||
|
||||
// play controller
|
||||
GET_CHAT_LOG: 'GET_CHAT_LOG',
|
||||
GET_SUBTITLE: 'GET_SUBTITLE',
|
||||
CLEAR_PLAYER_INFO: 'CLEAR_PLAYER_INFO',
|
||||
UPDATE_VIDEO_PLAY_STATE: 'UPDATE_VIDEO_PLAY_STATE',
|
||||
GET_CHAT_LOG: "GET_CHAT_LOG",
|
||||
GET_SUBTITLE: "GET_SUBTITLE",
|
||||
CLEAR_PLAYER_INFO: "CLEAR_PLAYER_INFO",
|
||||
UPDATE_VIDEO_PLAY_STATE: "UPDATE_VIDEO_PLAY_STATE",
|
||||
|
||||
// 🔽 [추가] 플레이 제어 매니저 액션 타입
|
||||
/**
|
||||
@@ -228,88 +230,89 @@ export const types = {
|
||||
* SET_PLAYER_CONTROL: 특정 컴포넌트에게 비디오 재생 제어권을 부여합니다.
|
||||
* CLEAR_PLAYER_CONTROL: 컴포넌트로부터 비디오 재생 제어권을 회수합니다.
|
||||
*/
|
||||
SET_PLAYER_CONTROL: 'SET_PLAYER_CONTROL',
|
||||
CLEAR_PLAYER_CONTROL: 'CLEAR_PLAYER_CONTROL',
|
||||
SET_PLAYER_CONTROL: "SET_PLAYER_CONTROL",
|
||||
CLEAR_PLAYER_CONTROL: "CLEAR_PLAYER_CONTROL",
|
||||
|
||||
// reset action
|
||||
RESET_REDUX_STATE: 'RESET_REDUX_STATE',
|
||||
RESET_REDUX_STATE: "RESET_REDUX_STATE",
|
||||
|
||||
// cancel actions
|
||||
GET_MY_INFO_ORDER_CANCEL_SEARCH: 'GET_MY_INFO_ORDER_CANCEL_SEARCH',
|
||||
GET_MY_INFO_ORDER_CANCEL_COLUMNS_SEARCH: 'GET_MY_INFO_ORDER_CANCEL_COLUMNS_SEARCH',
|
||||
UPDATE_ORDER_PARTIAL_CANCEL: 'UPDATE_ORDER_PARTIAL_CANCEL',
|
||||
PAYMENT_TOTAL_CANCEL: 'PAYMENT_TOTAL_CANCEL',
|
||||
GET_MY_INFO_ORDER_CANCEL_SEARCH: "GET_MY_INFO_ORDER_CANCEL_SEARCH",
|
||||
GET_MY_INFO_ORDER_CANCEL_COLUMNS_SEARCH:
|
||||
"GET_MY_INFO_ORDER_CANCEL_COLUMNS_SEARCH",
|
||||
UPDATE_ORDER_PARTIAL_CANCEL: "UPDATE_ORDER_PARTIAL_CANCEL",
|
||||
PAYMENT_TOTAL_CANCEL: "PAYMENT_TOTAL_CANCEL",
|
||||
|
||||
// emp actions
|
||||
GET_SHOPTIME_TERMS: 'GET_SHOPTIME_TERMS',
|
||||
GET_SHOPTIME_TERMS: "GET_SHOPTIME_TERMS",
|
||||
|
||||
// pinCode actions
|
||||
GET_MY_INFO_CARD_PINCODE_CHECK: 'GET_MY_INFO_CARD_PINCODE_CHECK',
|
||||
GET_MY_INFO_CARD_PINCODE_CHECK: "GET_MY_INFO_CARD_PINCODE_CHECK",
|
||||
|
||||
// new actions
|
||||
CANCEL_FOCUS_ELEMENT: 'CANCEL_FOCUS_ELEMENT',
|
||||
CANCEL_FOCUS_ELEMENT: "CANCEL_FOCUS_ELEMENT",
|
||||
|
||||
// 약관동의 여부 확인 상태
|
||||
GET_TERMS_AGREE_YN_START: 'GET_TERMS_AGREE_YN_START',
|
||||
GET_TERMS_AGREE_YN_SUCCESS: 'GET_TERMS_AGREE_YN_SUCCESS',
|
||||
GET_TERMS_AGREE_YN_FAILURE: 'GET_TERMS_AGREE_YN_FAILURE',
|
||||
GET_TERMS_AGREE_YN_START: "GET_TERMS_AGREE_YN_START",
|
||||
GET_TERMS_AGREE_YN_SUCCESS: "GET_TERMS_AGREE_YN_SUCCESS",
|
||||
GET_TERMS_AGREE_YN_FAILURE: "GET_TERMS_AGREE_YN_FAILURE",
|
||||
|
||||
// device
|
||||
REQ_REG_DEVICE_INFO: 'REQ_REG_DEVICE_INFO',
|
||||
REQ_REG_DEVICE_INFO: "REQ_REG_DEVICE_INFO",
|
||||
|
||||
// 🔽 [추가] 영구재생 비디오 정보 저장
|
||||
SET_PERSISTENT_VIDEO_INFO: 'SET_PERSISTENT_VIDEO_INFO',
|
||||
SET_PERSISTENT_VIDEO_INFO: "SET_PERSISTENT_VIDEO_INFO",
|
||||
|
||||
// 🔽 [추가] 배너 비디오 제어 액션 타입
|
||||
/**
|
||||
* HomeBanner의 배너 간 비디오 재생 제어를 위한 액션 타입들.
|
||||
* 첫 번째 배너 상시 재생과 두 번째 배너 포커스 재생을 관리합니다.
|
||||
*/
|
||||
SET_BANNER_STATE: 'SET_BANNER_STATE',
|
||||
SET_BANNER_FOCUS: 'SET_BANNER_FOCUS',
|
||||
SET_BANNER_AVAILABILITY: 'SET_BANNER_AVAILABILITY',
|
||||
SET_BANNER_TRANSITION: 'SET_BANNER_TRANSITION',
|
||||
PAUSE_PLAYER_CONTROL: 'PAUSE_PLAYER_CONTROL',
|
||||
RESUME_PLAYER_CONTROL: 'RESUME_PLAYER_CONTROL',
|
||||
SET_BANNER_STATE: "SET_BANNER_STATE",
|
||||
SET_BANNER_FOCUS: "SET_BANNER_FOCUS",
|
||||
SET_BANNER_AVAILABILITY: "SET_BANNER_AVAILABILITY",
|
||||
SET_BANNER_TRANSITION: "SET_BANNER_TRANSITION",
|
||||
PAUSE_PLAYER_CONTROL: "PAUSE_PLAYER_CONTROL",
|
||||
RESUME_PLAYER_CONTROL: "RESUME_PLAYER_CONTROL",
|
||||
// 🔽 [추가] HomeBanner 동영상 포커스 정책 관리
|
||||
SET_CURRENT_FOCUS_BANNER: 'SET_CURRENT_FOCUS_BANNER',
|
||||
UPDATE_VIDEO_POLICY: 'UPDATE_VIDEO_POLICY',
|
||||
SET_MODAL_BORDER: 'SET_MODAL_BORDER',
|
||||
SET_BANNER_VISIBILITY: 'SET_BANNER_VISIBILITY',
|
||||
SET_CURRENT_FOCUS_BANNER: "SET_CURRENT_FOCUS_BANNER",
|
||||
UPDATE_VIDEO_POLICY: "UPDATE_VIDEO_POLICY",
|
||||
SET_MODAL_BORDER: "SET_MODAL_BORDER",
|
||||
SET_BANNER_VISIBILITY: "SET_BANNER_VISIBILITY",
|
||||
|
||||
// 🔽 [추가] JustForYou 상품 관리 부분
|
||||
GET_RECENTLY_SAW_ITEM: 'GET_RECENTLY_SAW_ITEM',
|
||||
GET_LIKE_BRAND_PRODUCT: 'GET_LIKE_BRAND_PRODUCT',
|
||||
GET_MORE_TO_CONCIDER_AT_THIS_PRICE: 'GET_MORE_TO_CONCIDER_AT_THIS_PRICE',
|
||||
GET_JUSTFORYOU_INFO: 'GET_JUSTFORYOU_INFO',
|
||||
GET_RECENTLY_SAW_ITEM: "GET_RECENTLY_SAW_ITEM",
|
||||
GET_LIKE_BRAND_PRODUCT: "GET_LIKE_BRAND_PRODUCT",
|
||||
GET_MORE_TO_CONCIDER_AT_THIS_PRICE: "GET_MORE_TO_CONCIDER_AT_THIS_PRICE",
|
||||
GET_JUSTFORYOU_INFO: "GET_JUSTFORYOU_INFO",
|
||||
|
||||
// 🔽 Voice Conductor 관련 액션 타입
|
||||
VOICE_REGISTER_SUCCESS: 'VOICE_REGISTER_SUCCESS',
|
||||
VOICE_REGISTER_FAILURE: 'VOICE_REGISTER_FAILURE',
|
||||
VOICE_SET_TICKET: 'VOICE_SET_TICKET',
|
||||
VOICE_SET_CONTEXT_SUCCESS: 'VOICE_SET_CONTEXT_SUCCESS',
|
||||
VOICE_SET_CONTEXT_FAILURE: 'VOICE_SET_CONTEXT_FAILURE',
|
||||
VOICE_PERFORM_ACTION: 'VOICE_PERFORM_ACTION',
|
||||
VOICE_REPORT_RESULT_SUCCESS: 'VOICE_REPORT_RESULT_SUCCESS',
|
||||
VOICE_REPORT_RESULT_FAILURE: 'VOICE_REPORT_RESULT_FAILURE',
|
||||
VOICE_UPDATE_INTENTS: 'VOICE_UPDATE_INTENTS',
|
||||
VOICE_CLEAR_STATE: 'VOICE_CLEAR_STATE',
|
||||
VOICE_ADD_LOG: 'VOICE_ADD_LOG',
|
||||
VOICE_CLEAR_LOGS: 'VOICE_CLEAR_LOGS',
|
||||
VOICE_STT_TEXT_RECEIVED: 'VOICE_STT_TEXT_RECEIVED', // STT 텍스트 수신
|
||||
VOICE_REGISTER_SUCCESS: "VOICE_REGISTER_SUCCESS",
|
||||
VOICE_REGISTER_FAILURE: "VOICE_REGISTER_FAILURE",
|
||||
VOICE_SET_TICKET: "VOICE_SET_TICKET",
|
||||
VOICE_SET_CONTEXT_SUCCESS: "VOICE_SET_CONTEXT_SUCCESS",
|
||||
VOICE_SET_CONTEXT_FAILURE: "VOICE_SET_CONTEXT_FAILURE",
|
||||
VOICE_PERFORM_ACTION: "VOICE_PERFORM_ACTION",
|
||||
VOICE_REPORT_RESULT_SUCCESS: "VOICE_REPORT_RESULT_SUCCESS",
|
||||
VOICE_REPORT_RESULT_FAILURE: "VOICE_REPORT_RESULT_FAILURE",
|
||||
VOICE_UPDATE_INTENTS: "VOICE_UPDATE_INTENTS",
|
||||
VOICE_CLEAR_STATE: "VOICE_CLEAR_STATE",
|
||||
VOICE_ADD_LOG: "VOICE_ADD_LOG",
|
||||
VOICE_CLEAR_LOGS: "VOICE_CLEAR_LOGS",
|
||||
VOICE_STT_TEXT_RECEIVED: "VOICE_STT_TEXT_RECEIVED", // STT 텍스트 수신
|
||||
|
||||
// 🔽 Web Speech API 관련
|
||||
WEB_SPEECH_INITIALIZED: 'WEB_SPEECH_INITIALIZED',
|
||||
WEB_SPEECH_START: 'WEB_SPEECH_START',
|
||||
WEB_SPEECH_INTERIM_RESULT: 'WEB_SPEECH_INTERIM_RESULT',
|
||||
WEB_SPEECH_END: 'WEB_SPEECH_END',
|
||||
WEB_SPEECH_ERROR: 'WEB_SPEECH_ERROR',
|
||||
WEB_SPEECH_CLEANUP: 'WEB_SPEECH_CLEANUP',
|
||||
WEB_SPEECH_INITIALIZED: "WEB_SPEECH_INITIALIZED",
|
||||
WEB_SPEECH_START: "WEB_SPEECH_START",
|
||||
WEB_SPEECH_INTERIM_RESULT: "WEB_SPEECH_INTERIM_RESULT",
|
||||
WEB_SPEECH_END: "WEB_SPEECH_END",
|
||||
WEB_SPEECH_ERROR: "WEB_SPEECH_ERROR",
|
||||
WEB_SPEECH_CLEANUP: "WEB_SPEECH_CLEANUP",
|
||||
|
||||
//convert img
|
||||
CONVERT_PDF_TO_IMAGE: 'CONVERT_PDF_TO_IMAGE',
|
||||
CONVERT_PDF_TO_IMAGE_SUCCESS: 'CONVERT_PDF_TO_IMAGE_SUCCESS',
|
||||
CONVERT_PDF_TO_IMAGE_FAILURE: 'CONVERT_PDF_TO_IMAGE_FAILURE',
|
||||
CLEAR_CONVERTED_IMAGE: 'CLEAR_CONVERTED_IMAGE',
|
||||
CLEAR_CONVERTED_IMAGE_BY_URL: 'CLEAR_CONVERTED_IMAGE_BY_URL', // ⭐ 새로 추가
|
||||
CONVERT_PDF_TO_IMAGE: "CONVERT_PDF_TO_IMAGE",
|
||||
CONVERT_PDF_TO_IMAGE_SUCCESS: "CONVERT_PDF_TO_IMAGE_SUCCESS",
|
||||
CONVERT_PDF_TO_IMAGE_FAILURE: "CONVERT_PDF_TO_IMAGE_FAILURE",
|
||||
CLEAR_CONVERTED_IMAGE: "CLEAR_CONVERTED_IMAGE",
|
||||
CLEAR_CONVERTED_IMAGE_BY_URL: "CLEAR_CONVERTED_IMAGE_BY_URL", // ⭐ 새로 추가
|
||||
};
|
||||
|
||||
@@ -2,6 +2,7 @@ import { URLS } from '../api/apiConfig';
|
||||
import { TAxios } from '../api/TAxios';
|
||||
import { SEARCH_DATA_MAX_RESULTS_LIMIT } from '../utils/Config';
|
||||
import { types } from './actionTypes';
|
||||
import { changeAppStatus } from './commonActions';
|
||||
|
||||
// Search 통합검색 (IBS) 데이터 조회 IF-LGSP-090
|
||||
let getSearchKey = null;
|
||||
@@ -14,11 +15,13 @@ export const getSearch =
|
||||
lastSearchedParams = params;
|
||||
}
|
||||
const maxResults =
|
||||
startIndex === 1 ? SEARCH_DATA_MAX_RESULTS_LIMIT * 2 : SEARCH_DATA_MAX_RESULTS_LIMIT;
|
||||
startIndex === 1
|
||||
? SEARCH_DATA_MAX_RESULTS_LIMIT * 2
|
||||
: SEARCH_DATA_MAX_RESULTS_LIMIT;
|
||||
|
||||
let currentKey = key;
|
||||
const onSuccess = (response) => {
|
||||
console.log('getSearch onSuccess: ', response.data);
|
||||
console.log("getSearch onSuccess: ", response.data);
|
||||
|
||||
if (startIndex === 1) {
|
||||
getSearchKey = new Date();
|
||||
@@ -41,13 +44,13 @@ export const getSearch =
|
||||
};
|
||||
|
||||
const onFail = (error) => {
|
||||
console.error('getSearch onFail: ', error);
|
||||
console.error("getSearch onFail: ", error);
|
||||
};
|
||||
|
||||
TAxios(
|
||||
dispatch,
|
||||
getState,
|
||||
'post',
|
||||
"post",
|
||||
URLS.GET_SEARCH,
|
||||
{},
|
||||
{ service, query, startIndex, maxResults, domain },
|
||||
@@ -55,6 +58,7 @@ export const getSearch =
|
||||
onFail
|
||||
);
|
||||
};
|
||||
|
||||
export const continueSearch =
|
||||
(key, startIndex = 1) =>
|
||||
(dispatch, getState) => {
|
||||
@@ -69,7 +73,13 @@ export const continueSearch =
|
||||
//ignore search
|
||||
return;
|
||||
}
|
||||
dispatch(getSearch({ ...lastSearchedParams, domain: key }, startIndex, getSearchKey));
|
||||
dispatch(
|
||||
getSearch(
|
||||
{ ...lastSearchedParams, domain: key },
|
||||
startIndex,
|
||||
getSearchKey
|
||||
)
|
||||
);
|
||||
};
|
||||
|
||||
export const resetSearch = (status) => {
|
||||
@@ -102,21 +112,27 @@ export const getShopperHouseSearch =
|
||||
getShopperHouseSearchKey = currentSearchKey;
|
||||
|
||||
console.log(
|
||||
'[ShopperHouse] 🔍 [DEBUG] API 호출 시작 - key:',
|
||||
"[ShopperHouse] 🔍 [DEBUG] API 호출 시작 - key:",
|
||||
currentSearchKey,
|
||||
'query:',
|
||||
"query:",
|
||||
query
|
||||
);
|
||||
|
||||
const onSuccess = (response) => {
|
||||
console.log('[ShopperHouse] 📥 [DEBUG] API 응답 도착 - key:', currentSearchKey);
|
||||
console.log('[ShopperHouse] 🔑 [DEBUG] 현재 유효한 key:', getShopperHouseSearchKey);
|
||||
console.log(
|
||||
"[ShopperHouse] 📥 [DEBUG] API 응답 도착 - key:",
|
||||
currentSearchKey
|
||||
);
|
||||
console.log(
|
||||
"[ShopperHouse] 🔑 [DEBUG] 현재 유효한 key:",
|
||||
getShopperHouseSearchKey
|
||||
);
|
||||
|
||||
// ✨ 현재 요청이 최신 요청인지 확인
|
||||
if (currentSearchKey === getShopperHouseSearchKey) {
|
||||
console.log('[ShopperHouse] ✅ [DEBUG] 유효한 응답 - Redux 업데이트');
|
||||
console.log("[ShopperHouse] ✅ [DEBUG] 유효한 응답 - Redux 업데이트");
|
||||
console.log(
|
||||
'[ShopperHouse] getShopperHouseSearch onSuccess: ',
|
||||
"[ShopperHouse] getShopperHouseSearch onSuccess: ",
|
||||
JSON.stringify(response.data)
|
||||
);
|
||||
|
||||
@@ -124,32 +140,36 @@ export const getShopperHouseSearch =
|
||||
const retCode = response.data?.retCode;
|
||||
if (retCode !== 0) {
|
||||
console.error(
|
||||
'[ShopperHouse] ❌ API 실패 - retCode:',
|
||||
"[ShopperHouse] ❌ API 실패 - retCode:",
|
||||
retCode,
|
||||
'retMsg:',
|
||||
"retMsg:",
|
||||
response.data?.retMsg
|
||||
);
|
||||
console.log('[VoiceInput] 📥 API 응답 실패');
|
||||
console.log('[VoiceInput] ├─ retCode:', retCode);
|
||||
console.log('[VoiceInput] └─ retMsg:', response.data?.retMsg);
|
||||
console.log("[VoiceInput] 📥 API 응답 실패");
|
||||
console.log("[VoiceInput] ├─ retCode:", retCode);
|
||||
console.log("[VoiceInput] └─ retMsg:", response.data?.retMsg);
|
||||
return;
|
||||
}
|
||||
|
||||
// ✅ result 데이터 존재 확인
|
||||
if (!response.data?.data?.result) {
|
||||
console.error('[ShopperHouse] ❌ API 응답에 result 데이터 없음');
|
||||
console.log('[VoiceInput] 📥 API 응답 실패 (result 데이터 없음)');
|
||||
console.error("[ShopperHouse] ❌ API 응답에 result 데이터 없음");
|
||||
console.log("[VoiceInput] 📥 API 응답 실패 (result 데이터 없음)");
|
||||
return;
|
||||
}
|
||||
|
||||
// 📥 [VoiceInput] API 응답 성공 로그
|
||||
const resultData = response.data.data.result;
|
||||
const results = resultData.results || [];
|
||||
const receivedSearchId = results.length > 0 ? results[0].searchId : null;
|
||||
const receivedSearchId =
|
||||
results.length > 0 ? results[0].searchId : null;
|
||||
|
||||
console.log('[VoiceInput] 📥 API 응답 성공');
|
||||
console.log('[VoiceInput] ├─ searchId:', receivedSearchId || '(없음)');
|
||||
console.log('[VoiceInput] └─ 결과 수:', results.length);
|
||||
console.log("[VoiceInput] 📥 API 응답 성공");
|
||||
console.log(
|
||||
"[VoiceInput] ├─ searchId:",
|
||||
receivedSearchId || "(없음)"
|
||||
);
|
||||
console.log("[VoiceInput] └─ 결과 수:", results.length);
|
||||
|
||||
dispatch({
|
||||
type: types.GET_SHOPPERHOUSE_SEARCH,
|
||||
@@ -158,20 +178,28 @@ export const getShopperHouseSearch =
|
||||
|
||||
dispatch(updateSearchTimestamp());
|
||||
} else {
|
||||
console.log('[ShopperHouse] ❌ [DEBUG] 오래된 응답 무시 - Redux 업데이트 안함');
|
||||
console.log(
|
||||
"[ShopperHouse] ❌ [DEBUG] 오래된 응답 무시 - Redux 업데이트 안함"
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
const onFail = (error) => {
|
||||
console.error('[ShopperHouse] getShopperHouseSearch onFail: ', JSON.stringify(error));
|
||||
console.error(
|
||||
"[ShopperHouse] getShopperHouseSearch onFail: ",
|
||||
JSON.stringify(error)
|
||||
);
|
||||
|
||||
const retCode = error?.data?.retCode;
|
||||
if (retCode === 401) {
|
||||
console.log('[VoiceInput] ⚠️ Access Token 만료 - 자동 갱신 중...');
|
||||
console.log('[VoiceInput] └─ TAxios가 자동으로 재요청합니다');
|
||||
console.log("[VoiceInput] ⚠️ Access Token 만료 - 자동 갱신 중...");
|
||||
console.log("[VoiceInput] └─ TAxios가 자동으로 재요청합니다");
|
||||
} else {
|
||||
console.log('[VoiceInput] 📥 API 요청 실패');
|
||||
console.log('[VoiceInput] └─ error:', error?.message || JSON.stringify(error));
|
||||
console.log("[VoiceInput] 📥 API 요청 실패");
|
||||
console.log(
|
||||
"[VoiceInput] └─ error:",
|
||||
error?.message || JSON.stringify(error)
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -179,18 +207,65 @@ export const getShopperHouseSearch =
|
||||
if (searchId) {
|
||||
params.searchid = searchId;
|
||||
}
|
||||
console.log('[ShopperHouse] getShopperHouseSearch params: ', JSON.stringify(params));
|
||||
console.log(
|
||||
"[ShopperHouse] getShopperHouseSearch params: ",
|
||||
JSON.stringify(params)
|
||||
);
|
||||
|
||||
TAxios(dispatch, getState, 'post', URLS.GET_SHOPPERHOUSE_SEARCH, {}, params, onSuccess, onFail);
|
||||
TAxios(
|
||||
dispatch,
|
||||
getState,
|
||||
"post",
|
||||
URLS.GET_SHOPPERHOUSE_SEARCH,
|
||||
{},
|
||||
params,
|
||||
onSuccess,
|
||||
onFail
|
||||
);
|
||||
};
|
||||
|
||||
// ShopperHouse 검색 데이터 초기화
|
||||
export const clearShopperHouseData = () => {
|
||||
// ✨ 검색 키 초기화 - 진행 중인 요청의 응답을 무시하도록
|
||||
console.log('[ShopperHouse] 🧹 [DEBUG] clearShopperHouseData - 이전 요청 무효화');
|
||||
console.log(
|
||||
"[ShopperHouse] 🧹 [DEBUG] clearShopperHouseData - 이전 요청 무효화"
|
||||
);
|
||||
getShopperHouseSearchKey = null;
|
||||
|
||||
return {
|
||||
type: types.CLEAR_SHOPPERHOUSE_DATA,
|
||||
};
|
||||
};
|
||||
// 기존 코드 뒤에 추가
|
||||
|
||||
// Search Main 조회 IF-LGSP-097
|
||||
export const getSearchMain = () => (dispatch, getState) => {
|
||||
const onSuccess = (response) => {
|
||||
console.log("getSearchMain onSuccess: ", response.data);
|
||||
|
||||
dispatch({
|
||||
type: types.GET_SEARCH_MAIN,
|
||||
payload: response.data,
|
||||
});
|
||||
};
|
||||
|
||||
const onFail = (error) => {
|
||||
console.error("getSearchMain onFail: ", error);
|
||||
};
|
||||
|
||||
TAxios(
|
||||
dispatch,
|
||||
getState,
|
||||
"post",
|
||||
URLS.GET_SEARCH_MAIN,
|
||||
{},
|
||||
{},
|
||||
onSuccess,
|
||||
onFail
|
||||
);
|
||||
};
|
||||
|
||||
// 검색 메인 데이터 초기화
|
||||
export const clearSearchMainData = () => ({
|
||||
type: types.CLEAR_SEARCH_MAIN_DATA,
|
||||
});
|
||||
|
||||
@@ -83,6 +83,8 @@ export const URLS = {
|
||||
GET_SEARCH: "/lgsp/v1/search/list.lge",
|
||||
// IF-LGSP-098 ShopperHouse검색조회
|
||||
GET_SHOPPERHOUSE_SEARCH: "/lgsp/v1/search/shopperhouse/list.lge",
|
||||
// IF-LGSP-097 검색 메인 조회
|
||||
GET_SEARCH_MAIN: "/lgsp/v1/search/main.lge",
|
||||
|
||||
//main controller
|
||||
GET_SUB_CATEGORY: "/lgsp/v1/main/subcategory.lge",
|
||||
|
||||
@@ -8,6 +8,12 @@ const initialState = {
|
||||
searchTimestamp: null,
|
||||
shopperHouseData: null,
|
||||
shopperHouseSearchId: null,
|
||||
// 🔽 검색 메인 데이터 추가
|
||||
searchMainData: {
|
||||
topSearchs: [],
|
||||
popularBrands: [],
|
||||
hotPicksForYou: [],
|
||||
},
|
||||
};
|
||||
|
||||
export const searchReducer = (state = initialState, action) => {
|
||||
@@ -77,7 +83,7 @@ export const searchReducer = (state = initialState, action) => {
|
||||
const resultData = action.payload?.data?.result;
|
||||
|
||||
if (!resultData) {
|
||||
console.error('[searchReducer] Invalid shopperHouse data structure');
|
||||
console.error("[searchReducer] Invalid shopperHouse data structure");
|
||||
return state;
|
||||
}
|
||||
|
||||
@@ -87,8 +93,8 @@ export const searchReducer = (state = initialState, action) => {
|
||||
const searchId = results.length > 0 ? results[0].searchId : null;
|
||||
|
||||
// [VoiceInput] Redux에 searchId 저장 로그
|
||||
console.log('[VoiceInput] 💾 Redux에 searchId 저장');
|
||||
console.log('[VoiceInput] └─ searchId:', searchId || '(없음)');
|
||||
console.log("[VoiceInput] 💾 Redux에 searchId 저장");
|
||||
console.log("[VoiceInput] └─ searchId:", searchId || "(없음)");
|
||||
|
||||
return {
|
||||
...state,
|
||||
@@ -103,13 +109,68 @@ export const searchReducer = (state = initialState, action) => {
|
||||
}
|
||||
|
||||
case types.CLEAR_SHOPPERHOUSE_DATA:
|
||||
console.log('[VoiceInput] 🧹 Redux shopperHouseData 초기화 (searchId 리셋)');
|
||||
console.log(
|
||||
"[VoiceInput] 🧹 Redux shopperHouseData 초기화 (searchId 리셋)"
|
||||
);
|
||||
return {
|
||||
...state,
|
||||
shopperHouseData: null,
|
||||
shopperHouseSearchId: null,
|
||||
};
|
||||
|
||||
// 🔽 검색 메인 데이터 처리
|
||||
case types.GET_SEARCH_MAIN: {
|
||||
console.log(
|
||||
"🔍 [searchReducer] GET_SEARCH_MAIN 받은 payload:",
|
||||
action.payload
|
||||
);
|
||||
|
||||
// 여러 가능한 구조 확인
|
||||
let resultData = null;
|
||||
|
||||
if (action.payload?.result) {
|
||||
// payload.result 구조
|
||||
resultData = action.payload.result;
|
||||
console.log("✅ [searchReducer] payload.result 구조 확인");
|
||||
} else if (action.payload?.data?.result) {
|
||||
// payload.data.result 구조
|
||||
resultData = action.payload.data.result;
|
||||
console.log("✅ [searchReducer] payload.data.result 구조 확인");
|
||||
} else if (action.payload?.data) {
|
||||
// payload.data에 직접 데이터가 있는 경우
|
||||
resultData = action.payload.data;
|
||||
console.log("✅ [searchReducer] payload.data 직접 구조 확인");
|
||||
}
|
||||
|
||||
if (!resultData) {
|
||||
console.error("[searchReducer] ❌ Invalid searchMain data structure");
|
||||
console.error("받은 payload:", JSON.stringify(action.payload, null, 2));
|
||||
return state;
|
||||
}
|
||||
|
||||
console.log("[searchReducer] ✅ GET_SEARCH_MAIN success");
|
||||
|
||||
return {
|
||||
...state,
|
||||
searchMainData: {
|
||||
topSearchs: resultData.topSearchs || [],
|
||||
popularBrands: resultData.popularBrands || [],
|
||||
hotPicksForYou: resultData.hotPicksForYou || [],
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
case types.CLEAR_SEARCH_MAIN_DATA:
|
||||
console.log("[searchReducer] 🧹 searchMainData 초기화");
|
||||
return {
|
||||
...state,
|
||||
searchMainData: {
|
||||
topSearchs: [],
|
||||
popularBrands: [],
|
||||
hotPicksForYou: [],
|
||||
},
|
||||
};
|
||||
|
||||
default:
|
||||
return state;
|
||||
}
|
||||
|
||||
@@ -1,20 +1,43 @@
|
||||
// src/views/SearchPanel/SearchPanel.new.jsx
|
||||
import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
||||
import React, {
|
||||
useCallback,
|
||||
useEffect,
|
||||
useMemo,
|
||||
useRef,
|
||||
useState,
|
||||
} from 'react';
|
||||
|
||||
import classNames from 'classnames';
|
||||
import { useDispatch, useSelector } from 'react-redux';
|
||||
import {
|
||||
useDispatch,
|
||||
useSelector,
|
||||
} from 'react-redux';
|
||||
|
||||
import Spotlight from '@enact/spotlight';
|
||||
import SpotlightContainerDecorator from '@enact/spotlight/SpotlightContainerDecorator';
|
||||
import SpotlightContainerDecorator
|
||||
from '@enact/spotlight/SpotlightContainerDecorator';
|
||||
import Spottable from '@enact/spotlight/Spottable';
|
||||
|
||||
import micIcon from '../../../assets/images/searchpanel/image-mic.png';
|
||||
import hotPicksImage from '../../../assets/images/searchpanel/img-hotpicks.png';
|
||||
import hotPicksBrandImage from '../../../assets/images/searchpanel/img-search-hotpicks.png';
|
||||
import { sendLogGNB, sendLogTotalRecommend } from '../../actions/logActions';
|
||||
import hotPicksBrandImage
|
||||
from '../../../assets/images/searchpanel/img-search-hotpicks.png';
|
||||
import {
|
||||
sendLogGNB,
|
||||
sendLogTotalRecommend,
|
||||
} from '../../actions/logActions';
|
||||
import { getMyRecommandedKeyword } from '../../actions/myPageActions';
|
||||
import { popPanel, updatePanel } from '../../actions/panelActions';
|
||||
import { getSearch, resetSearch, resetVoiceSearch } from '../../actions/searchActions';
|
||||
import {
|
||||
popPanel,
|
||||
pushPanel,
|
||||
updatePanel,
|
||||
} from '../../actions/panelActions';
|
||||
import {
|
||||
getSearch,
|
||||
getSearchMain,
|
||||
resetSearch,
|
||||
resetVoiceSearch,
|
||||
} from '../../actions/searchActions';
|
||||
// import {
|
||||
// showErrorToast,
|
||||
// showInfoToast,
|
||||
@@ -24,43 +47,64 @@ import { getSearch, resetSearch, resetVoiceSearch } from '../../actions/searchAc
|
||||
// showWarningToast,
|
||||
// } from '../../actions/toastActions';
|
||||
import TBody from '../../components/TBody/TBody';
|
||||
import TInput, { ICONS, KINDS } from './TInput/TInput';
|
||||
import TPanel from '../../components/TPanel/TPanel';
|
||||
import TVerticalPagenator from '../../components/TVerticalPagenator/TVerticalPagenator';
|
||||
import TVirtualGridList from '../../components/TVirtualGridList/TVirtualGridList';
|
||||
import TVerticalPagenator
|
||||
from '../../components/TVerticalPagenator/TVerticalPagenator';
|
||||
import TVirtualGridList
|
||||
from '../../components/TVirtualGridList/TVirtualGridList';
|
||||
// import VirtualKeyboardContainer from "../../components/TToast/VirtualKeyboardContainer";
|
||||
import usePrevious from '../../hooks/usePrevious';
|
||||
import { LOG_CONTEXT_NAME, LOG_MENU, LOG_MESSAGE_ID, panel_names } from '../../utils/Config';
|
||||
import {
|
||||
LOG_CONTEXT_NAME,
|
||||
LOG_MENU,
|
||||
LOG_MESSAGE_ID,
|
||||
panel_names,
|
||||
} from '../../utils/Config';
|
||||
import SearchInputOverlay from './SearchInpuOverlay';
|
||||
import css from './SearchPanel.new.module.less';
|
||||
import SearchResultsNew from './SearchResults.new';
|
||||
import VoiceInputOverlay, { VOICE_MODES } from './VoiceInputOverlay/VoiceInputOverlay';
|
||||
import TInput, {
|
||||
ICONS,
|
||||
KINDS,
|
||||
} from './TInput/TInput';
|
||||
import VoiceInputOverlay, {
|
||||
VOICE_MODES,
|
||||
} from './VoiceInputOverlay/VoiceInputOverlay';
|
||||
|
||||
const ContainerBasic = SpotlightContainerDecorator({ enterTo: 'last-focused' }, 'div');
|
||||
const ContainerBasic = SpotlightContainerDecorator(
|
||||
{ enterTo: "last-focused" },
|
||||
"div"
|
||||
);
|
||||
|
||||
// 검색 입력 영역 컨테이너
|
||||
const InputContainer = SpotlightContainerDecorator({ enterTo: 'last-focused' }, 'div');
|
||||
const InputContainer = SpotlightContainerDecorator(
|
||||
{ enterTo: "last-focused" },
|
||||
"div"
|
||||
);
|
||||
|
||||
// 콘텐츠 섹션 컨테이너
|
||||
const SectionContainer = SpotlightContainerDecorator({ enterTo: 'last-focused' }, 'div');
|
||||
const SectionContainer = SpotlightContainerDecorator(
|
||||
{ enterTo: "last-focused" },
|
||||
"div"
|
||||
);
|
||||
|
||||
// Spottable 컴포넌트들
|
||||
const SpottableMicButton = Spottable('div');
|
||||
const SpottableKeyword = Spottable('div');
|
||||
const SpottableProduct = Spottable('div');
|
||||
const SpottableMicButton = Spottable("div");
|
||||
const SpottableKeyword = Spottable("div");
|
||||
const SpottableProduct = Spottable("div");
|
||||
|
||||
const ITEMS_PER_PAGE = 9;
|
||||
|
||||
// Spotlight ID 상수
|
||||
const SPOTLIGHT_IDS = {
|
||||
SEARCH_INPUT_LAYER: 'search-input-layer',
|
||||
SEARCH_INPUT_BOX: 'search-input-box',
|
||||
MICROPHONE_BUTTON: 'microphone-button',
|
||||
RECENT_SEARCHES_SECTION: 'recent-searches-section',
|
||||
TOP_SEARCHES_SECTION: 'top-searches-section',
|
||||
POPULAR_BRANDS_SECTION: 'popular-brands-section',
|
||||
HOT_PICKS_SECTION: 'hot-picks-section',
|
||||
SEARCH_VERTICAL_PAGENATOR: 'search_verticalPagenator',
|
||||
SEARCH_INPUT_LAYER: "search-input-layer",
|
||||
SEARCH_INPUT_BOX: "search-input-box",
|
||||
MICROPHONE_BUTTON: "microphone-button",
|
||||
RECENT_SEARCHES_SECTION: "recent-searches-section",
|
||||
TOP_SEARCHES_SECTION: "top-searches-section",
|
||||
POPULAR_BRANDS_SECTION: "popular-brands-section",
|
||||
HOT_PICKS_SECTION: "hot-picks-section",
|
||||
SEARCH_VERTICAL_PAGENATOR: "search_verticalPagenator",
|
||||
};
|
||||
|
||||
export default function SearchPanel({ panelInfo, isOnTop, spotlightId }) {
|
||||
@@ -72,13 +116,27 @@ export default function SearchPanel({ panelInfo, isOnTop, spotlightId }) {
|
||||
const { searchDatas: searchDatas } = useSelector((state) => state.search);
|
||||
const searchPerformed = useSelector((state) => state.search.searchPerformed);
|
||||
const panels = useSelector((state) => state.panels.panels);
|
||||
const shopperHouseData = useSelector((state) => state.search.shopperHouseData);
|
||||
const shopperHouseData = useSelector(
|
||||
(state) => state.search.shopperHouseData
|
||||
);
|
||||
//검색 메인
|
||||
const hotPicksForYou = useSelector(
|
||||
(state) => state.search.searchMainData.hotPicksForYou
|
||||
);
|
||||
const popularBrands = useSelector(
|
||||
(state) => state.search.searchMainData.popularBrands
|
||||
);
|
||||
const topSearchs = useSelector(
|
||||
(state) => state.search.searchMainData.topSearchs
|
||||
);
|
||||
|
||||
const [firstSpot, setFirstSpot] = useState(false);
|
||||
const [currentPage, setCurrentPage] = useState(1);
|
||||
const [paginatedKeywords, setPaginatedKeywords] = useState([]);
|
||||
const [pageChanged, setPageChanged] = useState(false);
|
||||
const [searchQuery, setSearchQuery] = useState(panelInfo.searchVal ? panelInfo.searchVal : null);
|
||||
const [searchQuery, setSearchQuery] = useState(
|
||||
panelInfo.searchVal ? panelInfo.searchVal : null
|
||||
);
|
||||
const [position, setPosition] = useState(null);
|
||||
const [showVirtualKeyboard, setShowVirtualKeyboard] = useState(false);
|
||||
const [isVoiceOverlayVisible, setIsVoiceOverlayVisible] = useState(false);
|
||||
@@ -86,7 +144,10 @@ export default function SearchPanel({ panelInfo, isOnTop, spotlightId }) {
|
||||
|
||||
// isVoiceOverlayVisible 상태 변화 추적
|
||||
useEffect(() => {
|
||||
console.log('🔄 [DEBUG][SearchPanel] isVoiceOverlayVisible changed to:', isVoiceOverlayVisible);
|
||||
console.log(
|
||||
"🔄 [DEBUG][SearchPanel] isVoiceOverlayVisible changed to:",
|
||||
isVoiceOverlayVisible
|
||||
);
|
||||
}, [isVoiceOverlayVisible]);
|
||||
|
||||
//인풋창 포커스 구분을 위함
|
||||
@@ -102,8 +163,8 @@ export default function SearchPanel({ panelInfo, isOnTop, spotlightId }) {
|
||||
const [isInputModeActive, setIsInputModeActive] = useState(false);
|
||||
const handleInputModeChange = useCallback((isActive) => {
|
||||
console.log(
|
||||
'[SearchPanel] TInput 입력 모드:',
|
||||
isActive ? '활성화 (키보드 표시)' : '비활성화 (키보드 숨김)'
|
||||
"[SearchPanel] TInput 입력 모드:",
|
||||
isActive ? "활성화 (키보드 표시)" : "비활성화 (키보드 숨김)"
|
||||
);
|
||||
setIsInputModeActive(isActive);
|
||||
}, []);
|
||||
@@ -111,9 +172,11 @@ export default function SearchPanel({ panelInfo, isOnTop, spotlightId }) {
|
||||
let searchQueryRef = usePrevious(searchQuery);
|
||||
let isOnTopRef = usePrevious(isOnTop);
|
||||
|
||||
const firstButtonSpotlightId = 'first-keyword-button';
|
||||
const firstButtonSpotlightId = "first-keyword-button";
|
||||
const cbChangePageRef = useRef(null);
|
||||
const [focusedContainerId, setFocusedContainerId] = useState(panelInfo?.focusedContainerId);
|
||||
const [focusedContainerId, setFocusedContainerId] = useState(
|
||||
panelInfo?.focusedContainerId
|
||||
);
|
||||
const focusedContainerIdRef = usePrevious(focusedContainerId);
|
||||
|
||||
// Timer refs for cleanup
|
||||
@@ -127,51 +190,8 @@ export default function SearchPanel({ panelInfo, isOnTop, spotlightId }) {
|
||||
// }, [isVoiceOverlayVisible]);
|
||||
|
||||
// 가짜 데이터 - 실제로는 Redux store나 API에서 가져와야 함
|
||||
const recentSearches = useMemo(() => ['Puppy food', 'Dog toy', 'Fitness'], []);
|
||||
|
||||
const topSearches = useMemo(
|
||||
() => ["Mather's Day", 'Gift', 'Easter Day', 'Royal Canin puppy food', 'Fitness', 'Parrot'],
|
||||
[]
|
||||
);
|
||||
const popularBrands = useMemo(
|
||||
() => ['Shark', 'Ninja', 'Skechers', 'LocknLock', '8Greens', 'LGE'],
|
||||
[]
|
||||
);
|
||||
const hotPicks = useMemo(
|
||||
() => [
|
||||
{
|
||||
id: 1,
|
||||
image: hotPicksImage,
|
||||
brandLogo: hotPicksBrandImage,
|
||||
brandName: 'Product Name',
|
||||
title: 'New Shark Vacuum! Your pet Hair Solution!',
|
||||
isForYou: false,
|
||||
},
|
||||
{
|
||||
id: 2,
|
||||
image: hotPicksImage,
|
||||
brandLogo: hotPicksBrandImage,
|
||||
brandName: 'Product Name',
|
||||
title: 'New Shark Vacuum! Your pet Hair Solution!',
|
||||
isForYou: false,
|
||||
},
|
||||
{
|
||||
id: 3,
|
||||
image: hotPicksImage,
|
||||
brandLogo: hotPicksBrandImage,
|
||||
brandName: 'Product Name',
|
||||
title: 'New Shark Vacuum! Your pet Hair Solution!',
|
||||
isForYou: false,
|
||||
},
|
||||
{
|
||||
id: 4,
|
||||
image: hotPicksImage,
|
||||
brandLogo: hotPicksBrandImage,
|
||||
brandName: 'Product Name',
|
||||
title: 'New Shark Vacuum! Your pet Hair Solution!',
|
||||
isForYou: true,
|
||||
},
|
||||
],
|
||||
const recentSearches = useMemo(
|
||||
() => ["Puppy food", "Dog toy", "Fitness"],
|
||||
[]
|
||||
);
|
||||
|
||||
@@ -219,6 +239,7 @@ export default function SearchPanel({ panelInfo, isOnTop, spotlightId }) {
|
||||
// 컴포넌트 마운트 시 Voice Search 상태 초기화
|
||||
useEffect(() => {
|
||||
dispatch(resetVoiceSearch());
|
||||
dispatch(getSearchMain());
|
||||
}, [dispatch]);
|
||||
|
||||
useEffect(() => {
|
||||
@@ -255,7 +276,7 @@ export default function SearchPanel({ panelInfo, isOnTop, spotlightId }) {
|
||||
dispatch(
|
||||
sendLogTotalRecommend({
|
||||
query: searchQuery,
|
||||
searchType: searchPerformed ? 'query' : 'keyword',
|
||||
searchType: searchPerformed ? "query" : "keyword",
|
||||
result: result,
|
||||
contextName: LOG_CONTEXT_NAME.SEARCH,
|
||||
messageId: LOG_MESSAGE_ID.SEARCH_ITEM,
|
||||
@@ -279,9 +300,9 @@ export default function SearchPanel({ panelInfo, isOnTop, spotlightId }) {
|
||||
if (query.trim()) {
|
||||
dispatch(
|
||||
getSearch({
|
||||
service: 'com.lgshop.app',
|
||||
service: "com.lgshop.app",
|
||||
query: query,
|
||||
domain: 'theme,show,item',
|
||||
domain: "theme,show,item",
|
||||
})
|
||||
);
|
||||
|
||||
@@ -372,7 +393,7 @@ export default function SearchPanel({ panelInfo, isOnTop, spotlightId }) {
|
||||
}
|
||||
|
||||
// Enter 키 처리
|
||||
if (e.key === 'Enter') {
|
||||
if (e.key === "Enter") {
|
||||
e.preventDefault();
|
||||
if (showVirtualKeyboard) {
|
||||
// 가상 키보드가 열려있으면 검색 실행하고 키보드 닫기
|
||||
@@ -386,26 +407,32 @@ export default function SearchPanel({ panelInfo, isOnTop, spotlightId }) {
|
||||
|
||||
// 방향키 처리 - Spotlight 네비게이션 허용
|
||||
const arrowKeys = [
|
||||
'ArrowLeft',
|
||||
'ArrowRight',
|
||||
'ArrowUp',
|
||||
'ArrowDown',
|
||||
'Left',
|
||||
'Right',
|
||||
'Up',
|
||||
'Down',
|
||||
"ArrowLeft",
|
||||
"ArrowRight",
|
||||
"ArrowUp",
|
||||
"ArrowDown",
|
||||
"Left",
|
||||
"Right",
|
||||
"Up",
|
||||
"Down",
|
||||
];
|
||||
if (arrowKeys.includes(e.key)) {
|
||||
// 입력 필드가 비어있고 왼쪽 화살표인 경우에만 방지
|
||||
if (position === 0 && (e.key === 'Left' || e.key === 'ArrowLeft') && !searchQuery) {
|
||||
if (
|
||||
position === 0 &&
|
||||
(e.key === "Left" || e.key === "ArrowLeft") &&
|
||||
!searchQuery
|
||||
) {
|
||||
e.preventDefault();
|
||||
return;
|
||||
}
|
||||
|
||||
// 오른쪽 화살표 키 처리 - 포커스 이동 허용
|
||||
if (e.key === 'ArrowRight' || e.key === 'Right') {
|
||||
if (e.key === "ArrowRight" || e.key === "Right") {
|
||||
// 커서가 텍스트 끝에 있을 때만 포커스 이동 허용
|
||||
const input = document.querySelector(`[data-spotlight-id="input-field-box"] > input`);
|
||||
const input = document.querySelector(
|
||||
`[data-spotlight-id="input-field-box"] > input`
|
||||
);
|
||||
if (input && position === input.value.length) {
|
||||
// 커서가 텍스트 끝에 있으면 포커스 이동 허용
|
||||
return;
|
||||
@@ -420,7 +447,9 @@ export default function SearchPanel({ panelInfo, isOnTop, spotlightId }) {
|
||||
);
|
||||
|
||||
const cursorPosition = useCallback(() => {
|
||||
const input = document.querySelector(`[data-spotlight-id="input-field-box"] > input`);
|
||||
const input = document.querySelector(
|
||||
`[data-spotlight-id="input-field-box"] > input`
|
||||
);
|
||||
if (input) {
|
||||
setPosition(input.selectionStart);
|
||||
}
|
||||
@@ -431,7 +460,7 @@ export default function SearchPanel({ panelInfo, isOnTop, spotlightId }) {
|
||||
return;
|
||||
}
|
||||
console.log(
|
||||
'🖱️ [DEBUG][SearchPanel] onClickMic called, current isVoiceOverlayVisible:',
|
||||
"🖱️ [DEBUG][SearchPanel] onClickMic called, current isVoiceOverlayVisible:",
|
||||
isVoiceOverlayVisible
|
||||
);
|
||||
setIsVoiceOverlayVisible(true);
|
||||
@@ -447,10 +476,10 @@ export default function SearchPanel({ panelInfo, isOnTop, spotlightId }) {
|
||||
setIsVoiceOverlayVisible(false);
|
||||
return;
|
||||
}
|
||||
if (searchQuery === null || searchQuery === '') {
|
||||
if (searchQuery === null || searchQuery === "") {
|
||||
dispatch(popPanel(panel_names.SEARCH_PANEL));
|
||||
} else {
|
||||
setSearchQuery('');
|
||||
setSearchQuery("");
|
||||
setCurrentPage(1);
|
||||
dispatch(resetSearch());
|
||||
Spotlight.focus(SPOTLIGHT_IDS.SEARCH_INPUT_BOX);
|
||||
@@ -470,7 +499,7 @@ export default function SearchPanel({ panelInfo, isOnTop, spotlightId }) {
|
||||
Spotlight.resume();
|
||||
setFirstSpot(true);
|
||||
if (panelInfo.currentSpot) {
|
||||
if (panels[panels.length - 1]?.name === 'searchpanel') {
|
||||
if (panels[panels.length - 1]?.name === "searchpanel") {
|
||||
Spotlight.focus(panelInfo.currentSpot);
|
||||
}
|
||||
}
|
||||
@@ -521,7 +550,7 @@ export default function SearchPanel({ panelInfo, isOnTop, spotlightId }) {
|
||||
// Microphone button keydown handler
|
||||
const handleMicKeyDown = useCallback(
|
||||
(e) => {
|
||||
if (e.key === 'Enter') {
|
||||
if (e.key === "Enter") {
|
||||
onClickMic();
|
||||
}
|
||||
},
|
||||
@@ -531,7 +560,7 @@ export default function SearchPanel({ panelInfo, isOnTop, spotlightId }) {
|
||||
// Voice overlay close handler
|
||||
const handleVoiceOverlayClose = useCallback(() => {
|
||||
console.log(
|
||||
'🚪 [DEBUG][SearchPanel] handleVoiceOverlayClose called, setting isVoiceOverlayVisible to FALSE'
|
||||
"🚪 [DEBUG][SearchPanel] handleVoiceOverlayClose called, setting isVoiceOverlayVisible to FALSE"
|
||||
);
|
||||
setIsVoiceOverlayVisible(false);
|
||||
|
||||
@@ -546,60 +575,68 @@ export default function SearchPanel({ panelInfo, isOnTop, spotlightId }) {
|
||||
setIsSearchOverlayVisible(false);
|
||||
}, []);
|
||||
|
||||
// 테스트용 Toast 핸들러들
|
||||
// const handleTestToasts = useCallback(() => {
|
||||
// // 간단한 Toast 테스트
|
||||
// dispatch(showSuccessToast('테스트 메시지입니다', { duration: 3000 }));
|
||||
// }, [dispatch]);
|
||||
|
||||
// ProductCard 컴포넌트
|
||||
const renderItem = useCallback(
|
||||
(
|
||||
// {
|
||||
// product,
|
||||
// index,
|
||||
// onClick,
|
||||
// showBrandLogo = true,
|
||||
// showBrandName = true,
|
||||
// showProductTitle = true,
|
||||
// ...rest
|
||||
// }
|
||||
{ index, ...rest }
|
||||
) => {
|
||||
({ index, ...rest }) => {
|
||||
const {
|
||||
showBrandLogo = true,
|
||||
showBrandName = true,
|
||||
showProductTitle = true,
|
||||
image,
|
||||
title,
|
||||
brandLogo,
|
||||
brandName,
|
||||
} = hotPicks[index];
|
||||
bgImgPath,
|
||||
curationId,
|
||||
curationNm,
|
||||
patncLogoPath,
|
||||
patncNm,
|
||||
patnrId,
|
||||
} = hotPicksForYou[index];
|
||||
const onClick = () => {
|
||||
dispatch(
|
||||
pushPanel({
|
||||
name: panel_names.HOT_PICKS_PANEL,
|
||||
panelInfo: {
|
||||
curationId: curationId,
|
||||
patnrId: patnrId,
|
||||
},
|
||||
})
|
||||
);
|
||||
dispatch(popPanel(panel_names.SEARCH_PANEL));
|
||||
};
|
||||
return (
|
||||
<SpottableProduct
|
||||
key={`product-${index}`}
|
||||
className={css.productCard}
|
||||
spotlightId={`product-${index}`}
|
||||
onClick={onClick}
|
||||
{...rest}
|
||||
>
|
||||
<div className={css.productImageWrapper}>
|
||||
<img src={image} alt={title} className={css.productImage} />
|
||||
<img
|
||||
src={bgImgPath}
|
||||
alt={curationNm}
|
||||
className={css.productImage}
|
||||
/>
|
||||
</div>
|
||||
<div className={css.productInfo}>
|
||||
{showBrandLogo && (
|
||||
<div className={css.productBrandWrapper}>
|
||||
<img src={brandLogo} alt={brandName} className={css.brandLogo} />
|
||||
<img
|
||||
src={patncLogoPath}
|
||||
alt={patncNm}
|
||||
className={css.brandLogo}
|
||||
/>
|
||||
</div>
|
||||
)}
|
||||
<div className={css.productDetails}>
|
||||
{showBrandName && <div className={css.brandName}>{brandName}</div>}
|
||||
{showProductTitle && <div className={css.productTitle}>{title}</div>}
|
||||
{showBrandName && <div className={css.brandName}>{patncNm}</div>}
|
||||
{showProductTitle && (
|
||||
<div className={css.productTitle}>{curationNm}</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</SpottableProduct>
|
||||
);
|
||||
},
|
||||
[hotPicks]
|
||||
[hotPicksForYou]
|
||||
);
|
||||
|
||||
useEffect(() => {
|
||||
@@ -608,11 +645,17 @@ export default function SearchPanel({ panelInfo, isOnTop, spotlightId }) {
|
||||
if (cbChangePageRef.current) {
|
||||
cbChangePageRef.current(0, true);
|
||||
}
|
||||
} else {
|
||||
setIsSearchOverlayVisible(false);
|
||||
}
|
||||
}, [searchPerformed, searchQuery, inputFocus]);
|
||||
|
||||
return (
|
||||
<TPanel className={css.container} handleCancel={onCancel} spotlightId={spotlightId}>
|
||||
<TPanel
|
||||
className={css.container}
|
||||
handleCancel={onCancel}
|
||||
spotlightId={spotlightId}
|
||||
>
|
||||
<TBody className={css.tBody} scrollable spotlightDisabled={!isOnTop}>
|
||||
<ContainerBasic>
|
||||
{isOnTop && (
|
||||
@@ -632,8 +675,10 @@ export default function SearchPanel({ panelInfo, isOnTop, spotlightId }) {
|
||||
className={classNames(
|
||||
css.inputContainer,
|
||||
inputFocus === true && css.inputFocus,
|
||||
searchDatas && css.searchValue /* 이건 결과값 있을때만. 조건 추가필요 */,
|
||||
(isVoiceOverlayVisible || isSearchOverlayVisible) && css.hidden
|
||||
searchDatas &&
|
||||
css.searchValue /* 이건 결과값 있을때만. 조건 추가필요 */,
|
||||
(isVoiceOverlayVisible || isSearchOverlayVisible) &&
|
||||
css.hidden
|
||||
)}
|
||||
data-wheel-point="true"
|
||||
spotlightId={SPOTLIGHT_IDS.SEARCH_INPUT_LAYER}
|
||||
@@ -674,7 +719,11 @@ export default function SearchPanel({ panelInfo, isOnTop, spotlightId }) {
|
||||
spotlightId={SPOTLIGHT_IDS.MICROPHONE_BUTTON}
|
||||
>
|
||||
<div className={css.microphoneCircle}>
|
||||
<img src={micIcon} alt="Microphone" className={css.microphoneIcon} />
|
||||
<img
|
||||
src={micIcon}
|
||||
alt="Microphone"
|
||||
className={css.microphoneIcon}
|
||||
/>
|
||||
</div>
|
||||
</SpottableMicButton>
|
||||
|
||||
@@ -729,104 +778,120 @@ export default function SearchPanel({ panelInfo, isOnTop, spotlightId }) {
|
||||
{/* 노출 조건 변경 필요. 포커스 블러만으로는 안됌.(가상 키보드 노출시가 맞을듯) */}
|
||||
{/* {inputFocus === false ? ( */}
|
||||
{/* {inputFocus === false && ( */}
|
||||
<>
|
||||
{/* 최근 검색어 섹션 */}
|
||||
<SectionContainer
|
||||
className={css.section}
|
||||
data-wheel-point="true"
|
||||
spotlightId={SPOTLIGHT_IDS.RECENT_SEARCHES_SECTION}
|
||||
>
|
||||
<div className={css.sectionHeader}>
|
||||
<div className={css.sectionIndicator} />
|
||||
<div className={css.sectionTitle}>Your Recent Searches</div>
|
||||
</div>
|
||||
<div className={css.keywordList}>
|
||||
{recentSearches.map((keyword, index) => (
|
||||
<SpottableKeyword
|
||||
key={`recent-${index}`}
|
||||
className={css.keywordButton}
|
||||
onClick={createKeywordClickHandler(keyword)}
|
||||
spotlightId={`recent-keyword-${index}`}
|
||||
>
|
||||
{keyword}
|
||||
</SpottableKeyword>
|
||||
))}
|
||||
</div>
|
||||
</SectionContainer>
|
||||
|
||||
{/* 인기 검색어 섹션 */}
|
||||
<SectionContainer
|
||||
className={css.section}
|
||||
data-wheel-point="true"
|
||||
spotlightId={SPOTLIGHT_IDS.TOP_SEARCHES_SECTION}
|
||||
>
|
||||
<div className={css.sectionHeader}>
|
||||
<div className={css.sectionIndicator} />
|
||||
<div className={css.sectionTitle}>Top Searches</div>
|
||||
</div>
|
||||
<div className={css.keywordList}>
|
||||
{topSearches.map((keyword, index) => (
|
||||
<SpottableKeyword
|
||||
key={`top-${index}`}
|
||||
className={css.keywordButton}
|
||||
onClick={createKeywordClickHandler(keyword)}
|
||||
spotlightId={`top-keyword-${index}`}
|
||||
>
|
||||
{keyword}
|
||||
</SpottableKeyword>
|
||||
))}
|
||||
</div>
|
||||
</SectionContainer>
|
||||
|
||||
{/* 인기 브랜드 섹션 */}
|
||||
<SectionContainer
|
||||
className={css.section}
|
||||
data-wheel-point="true"
|
||||
spotlightId={SPOTLIGHT_IDS.POPULAR_BRANDS_SECTION}
|
||||
>
|
||||
<div className={css.sectionHeader}>
|
||||
<div className={css.sectionIndicator} />
|
||||
<div className={css.sectionTitle}>Popular Brands</div>
|
||||
</div>
|
||||
<div className={css.keywordList}>
|
||||
{popularBrands.map((brand, index) => (
|
||||
<SpottableKeyword
|
||||
key={`brand-${index}`}
|
||||
className={css.keywordButton}
|
||||
onClick={createKeywordClickHandler(brand)}
|
||||
spotlightId={`brand-${index}`}
|
||||
>
|
||||
{brand}
|
||||
</SpottableKeyword>
|
||||
))}
|
||||
</div>
|
||||
</SectionContainer>
|
||||
|
||||
{/* Hot Picks for You 섹션 */}
|
||||
<SectionContainer
|
||||
className={css.hotpicksSection}
|
||||
data-wheel-point="true"
|
||||
spotlightId={SPOTLIGHT_IDS.HOT_PICKS_SECTION}
|
||||
>
|
||||
<div className={css.sectionHeader}>
|
||||
<div className={css.sectionIndicator} />
|
||||
<div className={css.sectionTitle}>Hot Picks for You</div>
|
||||
</div>
|
||||
<div className={css.productList}>
|
||||
{hotPicks && hotPicks.length > 0 && (
|
||||
<TVirtualGridList
|
||||
dataSize={hotPicks.length}
|
||||
direction="horizontal"
|
||||
renderItem={renderItem}
|
||||
// itemWidth={546}
|
||||
itemWidth={416}
|
||||
itemHeight={436}
|
||||
spacing={20}
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
</SectionContainer>
|
||||
</>
|
||||
{recentSearches && recentSearches.length > 0 && (
|
||||
<>
|
||||
{/* 최근 검색어 섹션 */}
|
||||
<SectionContainer
|
||||
className={css.section}
|
||||
data-wheel-point="true"
|
||||
spotlightId={SPOTLIGHT_IDS.RECENT_SEARCHES_SECTION}
|
||||
>
|
||||
<div className={css.sectionHeader}>
|
||||
<div className={css.sectionIndicator} />
|
||||
<div className={css.sectionTitle}>
|
||||
Your Recent Searches
|
||||
</div>
|
||||
</div>
|
||||
<div className={css.keywordList}>
|
||||
{recentSearches.map((keyword, index) => (
|
||||
<SpottableKeyword
|
||||
key={`recent-${index}`}
|
||||
className={css.keywordButton}
|
||||
onClick={createKeywordClickHandler(keyword)}
|
||||
spotlightId={`recent-keyword-${index}`}
|
||||
>
|
||||
{keyword}
|
||||
</SpottableKeyword>
|
||||
))}
|
||||
</div>
|
||||
</SectionContainer>
|
||||
</>
|
||||
)}
|
||||
{topSearchs && topSearchs.length > 0 && (
|
||||
<>
|
||||
{/* 인기 검색어 섹션 */}
|
||||
<SectionContainer
|
||||
className={css.section}
|
||||
data-wheel-point="true"
|
||||
spotlightId={SPOTLIGHT_IDS.TOP_SEARCHES_SECTION}
|
||||
>
|
||||
<div className={css.sectionHeader}>
|
||||
<div className={css.sectionIndicator} />
|
||||
<div className={css.sectionTitle}>Top Searches</div>
|
||||
</div>
|
||||
<div className={css.keywordList}>
|
||||
{topSearchs.map((item, index) => (
|
||||
<SpottableKeyword
|
||||
key={`top-${index}`}
|
||||
className={css.keywordButton}
|
||||
onClick={createKeywordClickHandler(item.query)}
|
||||
spotlightId={`top-keyword-${index}`}
|
||||
>
|
||||
{item.query}
|
||||
</SpottableKeyword>
|
||||
))}
|
||||
</div>
|
||||
</SectionContainer>
|
||||
</>
|
||||
)}
|
||||
{/* 인기 브랜드 섹션 */}
|
||||
{popularBrands && popularBrands.length > 0 && (
|
||||
<>
|
||||
<SectionContainer
|
||||
className={css.section}
|
||||
data-wheel-point="true"
|
||||
spotlightId={SPOTLIGHT_IDS.POPULAR_BRANDS_SECTION}
|
||||
>
|
||||
<div className={css.sectionHeader}>
|
||||
<div className={css.sectionIndicator} />
|
||||
<div className={css.sectionTitle}>Popular Brands</div>
|
||||
</div>
|
||||
<div className={css.keywordList}>
|
||||
{popularBrands.map((item, index) => (
|
||||
<SpottableKeyword
|
||||
key={`brand-${index}`}
|
||||
className={css.keywordButton}
|
||||
onClick={createKeywordClickHandler(item.query)}
|
||||
spotlightId={`brand-${index}`}
|
||||
>
|
||||
{item.query}
|
||||
</SpottableKeyword>
|
||||
))}
|
||||
</div>
|
||||
</SectionContainer>
|
||||
</>
|
||||
)}
|
||||
{/* Hot Picks for You 섹션 */}
|
||||
{hotPicksForYou && hotPicksForYou.length > 0 && (
|
||||
<>
|
||||
<SectionContainer
|
||||
className={css.hotpicksSection}
|
||||
data-wheel-point="true"
|
||||
spotlightId={SPOTLIGHT_IDS.HOT_PICKS_SECTION}
|
||||
>
|
||||
<div className={css.sectionHeader}>
|
||||
<div className={css.sectionIndicator} />
|
||||
<div className={css.sectionTitle}>
|
||||
Hot Picks for You
|
||||
</div>
|
||||
</div>
|
||||
<div className={css.productList}>
|
||||
{hotPicksForYou && hotPicksForYou.length > 0 && (
|
||||
<TVirtualGridList
|
||||
dataSize={hotPicksForYou.length}
|
||||
direction="horizontal"
|
||||
renderItem={renderItem}
|
||||
// itemWidth={546}
|
||||
itemWidth={416}
|
||||
itemHeight={436}
|
||||
spacing={20}
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
</SectionContainer>
|
||||
</>
|
||||
)}
|
||||
{/* )} */}
|
||||
{/* ) : ( */}
|
||||
{/* <div className={css.inputFocusBox}>
|
||||
|
||||
Reference in New Issue
Block a user