{"version":3,"file":"SubscriptionModule.2reIGBsW.mjs","names":["SUBSCRIBED_BUTTON_TEXT","Fragment","useMemo","useMemo","useState","useMemo","useRef","useCallback","__esmMin","init_npm_react_18_3_1","pe","de","p","ne","init_jsx_runtime","l","ce","_e","addPropertyControls","init_framer_BWFVvmND","ControlType","init_helpers","useTrackClickButtonEvent","init_useTheme","init_ComponentTimingContext","COMPONENT_ID_PROPS","isValid","init_isValid","init_EventTrackingProvider_hooks","init_Button","useSWR","init_EventTrigger","init_EventTrackingProvider","QUERY_CONTROL","init_RaffleApiService","useComponentId","init_controls","init_types","SWRErrorBoundary","useComponentTiming","THEME_CONTROLS","init_IntersectionProvider_hooks","init_useTrackSnowplowEvent","init_hooks","init_theme","useIntersectionContext","useTrackSnowplowEvent","combineObjectPropertyControls","init_SWRErrorBoundary","init_IntersectionProvider","useCurrentUser","RAFFLE_GROUP_CONTROLS","QueryType","raffleApi","useComponentTimingContext","Default","init_dist","EventTrigger","composeFramerDateTime","BUTTON_THEME_CONTROLS","init_isCanvas","init_SectionLayout","isAbove","SwitchButton","init_isFramerPreview","init_segment","useHandleSubscription","isFramerPreview","init_createUTCDate","init_key","BUTTON_SIZE_CONTROLS","init_useComponentTiming","useTheme","init_SegmentProvider","init_SwitchButton","init_device","createKRTimeZoneDate","createKey","splitToStringArray","BUTTON_VARIANT_CONTROLS","isCanvas","BUTTON_FILL_CONTROLS","SectionLayout","init_date","init_button","init_splitToStringArray","useSegment","SEGMENT_CONTROLS","init_SubscriptionButton_hooks","isWebview","init_useVisibilityAwareInterval","init_query_store","init_component_id","init_useCurrentUser","useVisibilityAwareInterval","useQueryStore","ComponentTimingProvider","init_CanvasError","CanvasError","restOf","init_restOf","init_useGroupSubscriptionState","useLiveAllNotification","useGroupSubscriptionState","init_useLiveAllNotification","SubscriptionModuleLayoutType","SubscriptionModuleInputType","ManualSubscriptionInputMode","init_SubscriptionModule_types","\"Button\"","\"SwitchButton\"","SubscriptionModuleLayoutType2","\"Linked\"","\"Auto\"","\"Manual\"","SubscriptionModuleInputType2","\"Single\"","\"Multiple\"","ManualSubscriptionInputMode2","SUBSCRIPTION_FETCHER_KEY","useSubscriptionQuery","fetchRaffleGroupSubscription","querySubscription","init_SubscriptionModule_hooks","enabled","_enabled","query","rest","hasKeys","data","isLoading","validateSubscriptionElementEventKey","init_SubscriptionElement_utils","type","eventKey","key","fallbackRaffleButtonText","SUBSCRIBED_BUTTON_TEXT$1","SubscriptionElementView","init_SubscriptionElementView","theme","shouldRenderError","errorMessage","getButtonTextByLayoutType","layout","buttonText","isSubscribed","layoutOverrides","disabled","handleButtonClick","loading","onClick","handleTriggerClick","onTriggerClick","SubscriptionElement","attachAdditionalQuery","init_SubscriptionElement","_query","trackClickButtonEvent","isVisible","toggleSubscription","separateByIndex","init_separateByIndex","array","index","AutoSubscriptionModule","init_AutoSubscriptionModule","isInView","subscription","markReady","restEventKeys","AUTO_SUBSCRIPTION_MODULE_QUERY","init_SubscriptionModule_controls","normalizeEventKeys","getKeywordCollectionEventKeys","getCouponCollectionEventKeys","getEventKeys","init_LinkedSubscriptionModule_utils","eventKeys","normalizedEventKeys","input","LinkedSubscriptionModule","init_LinkedSubscriptionModule","state","value","keys","getActiveEventKeys","hasPendingExpiry","init_ManualMultipleSubscriptionModule_utils","validUntilDate","validUntil","now","SUBSCRIBED_BUTTON_TEXT","UNSUBSCRIBED_BUTTON_TEXT","ENDED_BUTTON_TEXT","MS_IN_SECOND","ManualMultipleSubscriptionModule","getButtonText","init_ManualMultipleSubscriptionModule","componentId","trackSnowplowEvent","setNow","nextNow","isEventEnded","optimisticSubscribedEventKeys","setOptimisticSubscribedEventKeys","subscribedEventKeys","isAlarmStatusReady","logged","hasPendingImpression","trackImpression","groupKey","eventKeysToUnsubscribe","eventKeysToSubscribe","nextAlarmStatus","SubscriptionModuleInner","SubscriptionModule","getManualMultipleInputError","init_SubscriptionModule","timing","mode","SubscriptionModule_default","init_SubscriptionModule$1"],"sources":["https:/asset.29cm.co.kr/contents/framer/components/modules/SubscriptionModule/SubscriptionModule.types.js","https:/asset.29cm.co.kr/contents/framer/components/modules/SubscriptionModule/SubscriptionModule.hooks.js","https:/asset.29cm.co.kr/contents/framer/components/modules/SubscriptionModule/SubscriptionElement/SubscriptionElement.utils.js","https:/asset.29cm.co.kr/contents/framer/components/modules/SubscriptionModule/SubscriptionElement/SubscriptionElementView.js","https:/asset.29cm.co.kr/contents/framer/components/modules/SubscriptionModule/SubscriptionElement/SubscriptionElement.js","https:/asset.29cm.co.kr/contents/framer/utils/separateByIndex.js","https:/asset.29cm.co.kr/contents/framer/components/modules/SubscriptionModule/AutoSubscriptionModule/AutoSubscriptionModule.js","https:/asset.29cm.co.kr/contents/framer/components/modules/SubscriptionModule/SubscriptionModule.controls.js","https:/asset.29cm.co.kr/contents/framer/components/modules/SubscriptionModule/LinkedSubscriptionModule/LinkedSubscriptionModule.utils.js","https:/asset.29cm.co.kr/contents/framer/components/modules/SubscriptionModule/LinkedSubscriptionModule/LinkedSubscriptionModule.js","https:/asset.29cm.co.kr/contents/framer/components/modules/SubscriptionModule/ManualMultipleSubscriptionModule/ManualMultipleSubscriptionModule.utils.js","https:/asset.29cm.co.kr/contents/framer/components/modules/SubscriptionModule/ManualMultipleSubscriptionModule/ManualMultipleSubscriptionModule.js","https:/asset.29cm.co.kr/contents/framer/components/modules/SubscriptionModule/SubscriptionModule.js","https:/framerusercontent.com/modules/li1jzy1s7A3mwbefBisv/ArGuRhl30yd7RMeslnKY/SubscriptionModule.js"],"sourcesContent":["var SubscriptionModuleLayoutType = /* @__PURE__ */ ((SubscriptionModuleLayoutType2) => {\n  SubscriptionModuleLayoutType2[SubscriptionModuleLayoutType2[\"Button\"] = 0] = \"Button\";\n  SubscriptionModuleLayoutType2[SubscriptionModuleLayoutType2[\"SwitchButton\"] = 1] = \"SwitchButton\";\n  return SubscriptionModuleLayoutType2;\n})(SubscriptionModuleLayoutType || {});\nvar SubscriptionModuleInputType = /* @__PURE__ */ ((SubscriptionModuleInputType2) => {\n  SubscriptionModuleInputType2[SubscriptionModuleInputType2[\"Linked\"] = 0] = \"Linked\";\n  SubscriptionModuleInputType2[SubscriptionModuleInputType2[\"Auto\"] = 1] = \"Auto\";\n  SubscriptionModuleInputType2[SubscriptionModuleInputType2[\"Manual\"] = 2] = \"Manual\";\n  return SubscriptionModuleInputType2;\n})(SubscriptionModuleInputType || {});\nvar ManualSubscriptionInputMode = /* @__PURE__ */ ((ManualSubscriptionInputMode2) => {\n  ManualSubscriptionInputMode2[ManualSubscriptionInputMode2[\"Single\"] = 0] = \"Single\";\n  ManualSubscriptionInputMode2[ManualSubscriptionInputMode2[\"Multiple\"] = 1] = \"Multiple\";\n  return ManualSubscriptionInputMode2;\n})(ManualSubscriptionInputMode || {});\nexport {\n  ManualSubscriptionInputMode,\n  SubscriptionModuleInputType,\n  SubscriptionModuleLayoutType\n};\n","import { raffleApi } from \"../../../apis/raffle/RaffleApiService.js\";\nimport { QueryType } from \"../types.js\";\nimport useSWR from \"../../../node_modules/swr/core/dist/index.js\";\nconst SUBSCRIPTION_FETCHER_KEY = \"subscription-module/subscription\";\nconst useSubscriptionQuery = (query, _enabled = true) => {\n  const enabled = _enabled && query !== void 0;\n  const {\n    isLoading,\n    data,\n    ...rest\n  } = useSWR(enabled ? [SUBSCRIPTION_FETCHER_KEY, query] : null, () => querySubscription(query));\n  const hasKeys = data !== void 0 && data.eventKeys.length > 0;\n  return {\n    isLoading: isLoading || !enabled || !hasKeys,\n    subscription: data ?? {\n      eventKeys: []\n    },\n    ...rest\n  };\n};\nconst fetchRaffleGroupSubscription = async (query) => {\n  if (!query.raffleGroupId) {\n    return {\n      eventKeys: []\n    };\n  }\n  const {\n    data\n  } = await raffleApi.getRaffleGroup(query.raffleGroupId);\n  return {\n    eventKeys: data.notificationKey ? [data.notificationKey] : [],\n    layoutOverrides: {\n      text: data.buttonText ?? \"\"\n    }\n  };\n};\nconst querySubscription = (query) => {\n  if (!query) {\n    return {\n      eventKeys: []\n    };\n  }\n  switch (query.type) {\n    case QueryType.RaffleGroup:\n      return fetchRaffleGroupSubscription(query);\n    default:\n      return {\n        eventKeys: []\n      };\n  }\n};\nexport {\n  useSubscriptionQuery\n};\n","import { SubscriptionModuleInputType } from \"../SubscriptionModule.types.js\";\nconst validateSubscriptionElementEventKey = ({\n  type,\n  eventKey\n}) => {\n  switch (type) {\n    case SubscriptionModuleInputType.Manual: {\n      const keys = eventKey.split(\",\").map((key) => key.trim()).filter(Boolean);\n      if (keys.length <= 1) {\n        return {\n          isValid: true\n        };\n      }\n      return {\n        isValid: false,\n        errorMessage: \"이벤트 키(eventKey)는 1개만 입력해 주세요.\\n쉼표(,)로 여러 개 입력할 수 없습니다.\"\n      };\n    }\n    default:\n      return {\n        isValid: true\n      };\n  }\n};\nexport {\n  validateSubscriptionElementEventKey\n};\n","import { jsxs, Fragment, jsx } from \"react/jsx-runtime\";\nimport { Button as Default } from \"../../../@shared/Button/Button.js\";\nimport { SubscriptionModuleLayoutType } from \"../SubscriptionModule.types.js\";\nimport { useTheme } from \"../../../../hooks/useTheme.js\";\nimport { SwitchButton } from \"../../../@shared/SwitchButton/SwitchButton.js\";\nimport { isCanvas } from \"../../../../utils/framer/isCanvas.js\";\nimport { isFramerPreview } from \"../../../../utils/framer/isFramerPreview.js\";\nimport { EventTrigger } from \"../../../@shared/EventTrigger/index.js\";\nimport { CanvasError } from \"../../../@shared/CanvasError/CanvasError.js\";\nconst fallbackRaffleButtonText = \" \";\nconst SUBSCRIBED_BUTTON_TEXT = \"알림 해제\";\nconst SubscriptionElementView = ({\n  isSubscribed,\n  onClick,\n  onTriggerClick,\n  layout,\n  layoutOverrides,\n  loading = false,\n  buttonText,\n  prefixIcon,\n  errorMessage,\n  disabled = false\n}) => {\n  const theme = useTheme();\n  const shouldRenderError = Boolean(errorMessage) && (isCanvas() || isFramerPreview());\n  const getButtonTextByLayoutType = () => {\n    switch (layout.type) {\n      case SubscriptionModuleLayoutType.Button:\n        if (buttonText) {\n          return buttonText;\n        }\n        if (isSubscribed) {\n          return SUBSCRIBED_BUTTON_TEXT;\n        }\n        return (layoutOverrides == null ? void 0 : layoutOverrides.text) || layout.button.text || fallbackRaffleButtonText;\n      case SubscriptionModuleLayoutType.SwitchButton:\n        if (disabled && buttonText) {\n          return buttonText;\n        }\n        return layout.switchButton.text;\n    }\n  };\n  const handleButtonClick = () => {\n    if (loading) {\n      return;\n    }\n    onClick();\n  };\n  const handleTriggerClick = () => {\n    onTriggerClick == null ? void 0 : onTriggerClick(getButtonTextByLayoutType());\n  };\n  switch (layout.type) {\n    case SubscriptionModuleLayoutType.Button:\n      return /* @__PURE__ */ jsxs(Fragment, { children: [\n        /* @__PURE__ */ jsx(EventTrigger.Target, { style: {\n          width: \"100%\"\n        }, onClick: handleTriggerClick, children: /* @__PURE__ */ jsx(Default, { ...layout.button, prefixIcon, pending: loading, disabled, onClick: handleButtonClick, children: getButtonTextByLayoutType() }) }),\n        shouldRenderError && errorMessage && /* @__PURE__ */ jsx(CanvasError, { message: errorMessage })\n      ] });\n    case SubscriptionModuleLayoutType.SwitchButton:\n      return /* @__PURE__ */ jsxs(Fragment, { children: [\n        /* @__PURE__ */ jsx(EventTrigger.Target, { onClick: handleTriggerClick, children: /* @__PURE__ */ jsx(SwitchButton, { theme, active: isSubscribed || isCanvas(), activeColor: layout.switchButton.activeColor, disabled, onClick: handleButtonClick, children: getButtonTextByLayoutType() }) }),\n        shouldRenderError && errorMessage && /* @__PURE__ */ jsx(CanvasError, { message: errorMessage })\n      ] });\n  }\n};\nexport {\n  SubscriptionElementView\n};\n","import { jsx } from \"react/jsx-runtime\";\nimport { useMemo } from \"react\";\nimport { useHandleSubscription } from \"../../../systems/curations/SubscriptionButton/SubscriptionButton.hooks.js\";\nimport { useTrackClickButtonEvent } from \"../../hooks.js\";\nimport { useSegment } from \"../../../@shared/providers/SegmentProvider/SegmentProvider.js\";\nimport { validateSubscriptionElementEventKey } from \"./SubscriptionElement.utils.js\";\nimport { SubscriptionElementView } from \"./SubscriptionElementView.js\";\nconst SubscriptionElement = ({\n  loading = false,\n  query: _query,\n  type,\n  sectionKey = \"\",\n  groupKey,\n  eventKey,\n  restEventKeys = [],\n  layoutOverrides,\n  layout\n}) => {\n  const query = useMemo(() => attachAdditionalQuery(_query), [_query]);\n  const {\n    isVisible\n  } = useSegment();\n  const trackClickButtonEvent = useTrackClickButtonEvent(query);\n  const {\n    isValid,\n    errorMessage\n  } = useMemo(() => validateSubscriptionElementEventKey({\n    type,\n    eventKey\n  }), [type, eventKey]);\n  const {\n    isSubscribed,\n    toggleSubscription\n  } = useHandleSubscription({\n    groupKey,\n    sectionKey,\n    eventKey,\n    restEventKeys\n  });\n  const handleButtonClick = () => {\n    toggleSubscription({\n      shouldTrackClickEvent: false\n    });\n  };\n  const handleTriggerClick = (buttonText) => {\n    trackClickButtonEvent({\n      type: isSubscribed ? \"unsubscribe_notification\" : \"subscribe_notification\",\n      name: buttonText\n    });\n  };\n  if (!isVisible) {\n    return null;\n  }\n  return /* @__PURE__ */ jsx(SubscriptionElementView, { isSubscribed, onClick: handleButtonClick, onTriggerClick: handleTriggerClick, layout, layoutOverrides, loading, errorMessage: isValid ? void 0 : errorMessage });\n};\nconst attachAdditionalQuery = (query) => {\n  return query ? {\n    ...query\n  } : void 0;\n};\nexport {\n  SubscriptionElement\n};\n","import { restOf } from \"./restOf.js\";\nconst separateByIndex = (array, index = 0) => {\n  return [array[index], restOf(array, index)];\n};\nexport {\n  separateByIndex\n};\n","import { jsx } from \"react/jsx-runtime\";\nimport { useEffect } from \"react\";\nimport \"../../../systems/curations/IntersectionProvider/IntersectionProvider.js\";\nimport { useIntersectionContext } from \"../../../systems/curations/IntersectionProvider/IntersectionProvider.hooks.js\";\nimport { useComponentTimingContext } from \"../../../../hooks/beacon/ComponentTimingContext.js\";\nimport { useSubscriptionQuery } from \"../SubscriptionModule.hooks.js\";\nimport { SubscriptionElement } from \"../SubscriptionElement/SubscriptionElement.js\";\nimport { separateByIndex } from \"../../../../utils/separateByIndex.js\";\nconst AutoSubscriptionModule = ({\n  query,\n  layout\n}) => {\n  const {\n    isInView\n  } = useIntersectionContext();\n  const {\n    isLoading,\n    subscription\n  } = useSubscriptionQuery(query, isInView);\n  const {\n    markReady\n  } = useComponentTimingContext();\n  useEffect(() => {\n    if (!isLoading && subscription.eventKeys.length > 0) {\n      markReady();\n    }\n  }, [isLoading, subscription.eventKeys.length, markReady]);\n  const [eventKey = \"\", restEventKeys] = separateByIndex(subscription.eventKeys, 0);\n  return /* @__PURE__ */ jsx(SubscriptionElement, { ...subscription, loading: isLoading, eventKey, restEventKeys, layout, query });\n};\nexport {\n  AutoSubscriptionModule\n};\n","import { QUERY_CONTROL, RAFFLE_GROUP_CONTROLS } from \"../controls.js\";\nimport { combineObjectPropertyControls } from \"../../../libs/property-controls/helpers.js\";\nconst AUTO_SUBSCRIPTION_MODULE_QUERY = {\n  ...QUERY_CONTROL,\n  controls: combineObjectPropertyControls(RAFFLE_GROUP_CONTROLS)\n};\nexport {\n  AUTO_SUBSCRIPTION_MODULE_QUERY\n};\n","import { QueryType } from \"../../types.js\";\nimport { separateByIndex } from \"../../../../utils/separateByIndex.js\";\nimport { splitToStringArray } from \"../../../../utils/splitToStringArray.js\";\nconst normalizeEventKeys = (eventKeys) => {\n  return eventKeys.flatMap((key) => splitToStringArray(key).filter(Boolean));\n};\nconst getKeywordCollectionEventKeys = (query, input) => {\n  var _a;\n  const normalizedEventKeys = normalizeEventKeys(input.eventKeys);\n  const [eventKey = \"\", restEventKeys] = separateByIndex(normalizedEventKeys, (_a = query.selectedProductGroup) == null ? void 0 : _a.index);\n  return {\n    sectionKey: `${query.keywordCollectionId}`,\n    eventKey,\n    restEventKeys\n  };\n};\nconst getCouponCollectionEventKeys = (query, input) => {\n  const normalizedEventKeys = normalizeEventKeys(input.eventKeys);\n  const [eventKey = \"\", restEventKeys] = separateByIndex(normalizedEventKeys, query.index);\n  return {\n    sectionKey: `${query.brandSaleGroupId}`,\n    eventKey,\n    restEventKeys\n  };\n};\nconst getEventKeys = (query, input) => {\n  if (!query) {\n    return {\n      eventKey: \"\",\n      restEventKeys: []\n    };\n  }\n  switch (query.type) {\n    case QueryType.KeywordCollection:\n      return getKeywordCollectionEventKeys(query, input);\n    case QueryType.CouponCollection:\n      return getCouponCollectionEventKeys(query, input);\n    default:\n      return {\n        eventKey: \"\",\n        restEventKeys: []\n      };\n  }\n};\nexport {\n  getCouponCollectionEventKeys,\n  getEventKeys,\n  getKeywordCollectionEventKeys\n};\n","import { jsx } from \"react/jsx-runtime\";\nimport { useQueryStore } from \"../../query-store/query.store.js\";\nimport { SubscriptionElement } from \"../SubscriptionElement/SubscriptionElement.js\";\nimport { getEventKeys } from \"./LinkedSubscriptionModule.utils.js\";\nimport { useMemo } from \"react\";\nimport { createKey } from \"../../utils/key.js\";\nconst LinkedSubscriptionModule = ({\n  value,\n  input,\n  layout\n}) => {\n  const query = useQueryStore((state) => state.queries[value]);\n  const keys = useMemo(() => getEventKeys(query, input), [query, input]);\n  return /* @__PURE__ */ jsx(SubscriptionElement, { ...keys, groupKey: input.groupKey, layout, query }, createKey(query));\n};\nexport {\n  LinkedSubscriptionModule\n};\n","import { composeFramerDateTime, isAbove } from \"../../../../utils/date.js\";\nimport { isValid } from \"../../../../node_modules/date-fns/isValid.js\";\nconst getActiveEventKeys = (eventKeys, now) => eventKeys.filter(({\n  validUntil\n}) => {\n  const validUntilDate = validUntil && composeFramerDateTime(validUntil);\n  return !validUntilDate || !isAbove(now, validUntilDate);\n}).map(({\n  eventKey\n}) => eventKey == null ? void 0 : eventKey.trim()).filter(Boolean);\nconst hasPendingExpiry = (eventKeys, now) => eventKeys.some(({\n  eventKey,\n  validUntil\n}) => {\n  const validUntilDate = validUntil && composeFramerDateTime(validUntil);\n  return Boolean(eventKey == null ? void 0 : eventKey.trim()) && !!validUntilDate && isValid(validUntilDate) && !isAbove(now, validUntilDate);\n});\nexport {\n  getActiveEventKeys,\n  hasPendingExpiry\n};\n","import { jsx } from \"react/jsx-runtime\";\nimport { useState, useMemo, useRef, useCallback, useEffect } from \"react\";\nimport { useSegment } from \"../../../@shared/providers/SegmentProvider/SegmentProvider.js\";\nimport { EventTrigger } from \"../../../@shared/EventTrigger/index.js\";\nimport { useComponentId } from \"../../../systems/curations/EventTrackingProvider/EventTrackingProvider.hooks.js\";\nimport \"../../../systems/curations/EventTrackingProvider/EventTrackingProvider.js\";\nimport { useGroupSubscriptionState } from \"../../../../hooks/subscription/useGroupSubscriptionState.js\";\nimport { useLiveAllNotification } from \"../../../../hooks/subscription/useLiveAllNotification.js\";\nimport { useTrackSnowplowEvent } from \"../../../../hooks/snowplow/useTrackSnowplowEvent.js\";\nimport { useCurrentUser } from \"../../../../hooks/useCurrentUser.js\";\nimport { useVisibilityAwareInterval } from \"../../../../hooks/useVisibilityAwareInterval.js\";\nimport { isWebview } from \"../../../../utils/device.js\";\nimport { createKRTimeZoneDate } from \"../../../../utils/createUTCDate.js\";\nimport { getActiveEventKeys, hasPendingExpiry } from \"./ManualMultipleSubscriptionModule.utils.js\";\nimport { SubscriptionElementView } from \"../SubscriptionElement/SubscriptionElementView.js\";\nconst SUBSCRIBED_BUTTON_TEXT = \"전체 알림 해제\";\nconst UNSUBSCRIBED_BUTTON_TEXT = \"전체 알림 받기\";\nconst ENDED_BUTTON_TEXT = \"이벤트 종료\";\nconst MS_IN_SECOND = 1e3;\nconst ManualMultipleSubscriptionModule = ({\n  eventKeys,\n  groupKey,\n  layout\n}) => {\n  const {\n    isVisible\n  } = useSegment();\n  const componentId = useComponentId();\n  const trackSnowplowEvent = useTrackSnowplowEvent();\n  const {\n    logged\n  } = useCurrentUser();\n  const [now, setNow] = useState(() => createKRTimeZoneDate());\n  const normalizedEventKeys = useMemo(() => getActiveEventKeys(eventKeys, now), [eventKeys, now]);\n  useVisibilityAwareInterval(() => {\n    const nextNow = createKRTimeZoneDate();\n    if (getActiveEventKeys(eventKeys, nextNow).length === normalizedEventKeys.length) {\n      return;\n    }\n    setNow(nextNow);\n  }, hasPendingExpiry(eventKeys, now) ? MS_IN_SECOND : null);\n  const isEventEnded = normalizedEventKeys.length === 0;\n  const [optimisticSubscribedEventKeys, setOptimisticSubscribedEventKeys] = useState(null);\n  const {\n    subscribedEventKeys,\n    isLoading,\n    refreshSubscriptions\n  } = useGroupSubscriptionState({\n    groupKey,\n    eventKeys: normalizedEventKeys\n  });\n  const {\n    isSubscribed,\n    eventKeysToSubscribe,\n    eventKeysToUnsubscribe,\n    toggleSubscription\n  } = useLiveAllNotification({\n    groupKey,\n    eventKeys: normalizedEventKeys,\n    subscribedEventKeys: optimisticSubscribedEventKeys ?? subscribedEventKeys,\n    onOptimisticSubscribedChange: setOptimisticSubscribedEventKeys,\n    refreshSubscriptions\n  });\n  const isAlarmStatusReady = !logged || !isLoading;\n  const hasPendingImpression = useRef(false);\n  const trackImpression = useCallback(() => {\n    if (!isWebview()) {\n      return;\n    }\n    if (isEventEnded) {\n      return;\n    }\n    trackSnowplowEvent(\"impression_content\", {\n      section_name: componentId,\n      section_title: componentId,\n      position: -1,\n      layout_position: -1,\n      group_key: groupKey,\n      alarm_status: isSubscribed,\n      // NOTE: (김홍동) 클릭과 같게, 이 시점에 버튼을 누르면 실제로 요청될 키를 싣습니다.\n      event_key: (isSubscribed ? eventKeysToUnsubscribe : eventKeysToSubscribe).join(\",\")\n    });\n  }, [componentId, eventKeysToSubscribe, eventKeysToUnsubscribe, groupKey, isEventEnded, isSubscribed, trackSnowplowEvent]);\n  const handleImpression = () => {\n    if (!isAlarmStatusReady) {\n      hasPendingImpression.current = true;\n      return;\n    }\n    trackImpression();\n  };\n  useEffect(() => {\n    if (!hasPendingImpression.current || !isAlarmStatusReady) {\n      return;\n    }\n    hasPendingImpression.current = false;\n    trackImpression();\n  }, [isAlarmStatusReady, trackImpression]);\n  const handleClick = () => {\n    if (isEventEnded) {\n      return;\n    }\n    toggleSubscription();\n  };\n  const handleTriggerClick = (buttonText) => {\n    if (isEventEnded) {\n      return;\n    }\n    if (!isWebview() || !logged) {\n      return;\n    }\n    const nextAlarmStatus = !isSubscribed;\n    trackSnowplowEvent(\"click_button\", {\n      section_name: componentId,\n      section_title: componentId,\n      position: -1,\n      layout_position: -1,\n      button_id: nextAlarmStatus ? \"subscribe_notification\" : \"unsubscribe_notification\",\n      button_name: buttonText,\n      // NOTE: (김홍동) 노출은 그 시점의 상태를, 클릭은 클릭으로 바뀌는 방향을 싣습니다. 같은 이름이지만 의미가 다릅니다.\n      alarm_status: nextAlarmStatus,\n      group_key: groupKey,\n      event_key: (nextAlarmStatus ? eventKeysToSubscribe : eventKeysToUnsubscribe).join(\",\")\n    });\n  };\n  if (!isVisible) {\n    return null;\n  }\n  return /* @__PURE__ */ jsx(EventTrigger.Root, { types: [\"impression\"], onImpression: handleImpression, children: /* @__PURE__ */ jsx(SubscriptionElementView, { isSubscribed, onClick: handleClick, onTriggerClick: handleTriggerClick, layout, buttonText: getButtonText({\n    isEventEnded,\n    isSubscribed\n  }), prefixIcon: isEventEnded ? void 0 : isSubscribed ? \"bellOff\" : \"bell\", disabled: isEventEnded }) });\n};\nconst getButtonText = ({\n  isEventEnded,\n  isSubscribed\n}) => {\n  if (isEventEnded) {\n    return ENDED_BUTTON_TEXT;\n  }\n  return isSubscribed ? SUBSCRIBED_BUTTON_TEXT : UNSUBSCRIBED_BUTTON_TEXT;\n};\nexport {\n  ManualMultipleSubscriptionModule\n};\n","import { jsx } from \"react/jsx-runtime\";\nimport { addPropertyControls, ControlType } from \"framer\";\nimport { SWRErrorBoundary } from \"../../@shared/SWRErrorBoundary/SWRErrorBoundary.js\";\nimport { SubscriptionModuleInputType, ManualSubscriptionInputMode, SubscriptionModuleLayoutType } from \"./SubscriptionModule.types.js\";\nimport { QueryType } from \"../types.js\";\nimport { COMPONENT_ID_PROPS } from \"../../../libs/property-controls/component-id.js\";\nimport { SectionLayout } from \"../../systems/curations/SectionLayout/SectionLayout.js\";\nimport { ComponentTimingProvider } from \"../../../hooks/beacon/ComponentTimingContext.js\";\nimport { useComponentTiming } from \"../../../hooks/beacon/useComponentTiming.js\";\nimport { AutoSubscriptionModule } from \"./AutoSubscriptionModule/AutoSubscriptionModule.js\";\nimport { BUTTON_VARIANT_CONTROLS, BUTTON_THEME_CONTROLS, BUTTON_SIZE_CONTROLS, BUTTON_FILL_CONTROLS } from \"../../../libs/property-controls/button.js\";\nimport { AUTO_SUBSCRIPTION_MODULE_QUERY } from \"./SubscriptionModule.controls.js\";\nimport { THEME_CONTROLS } from \"../../../libs/property-controls/theme.js\";\nimport { LinkedSubscriptionModule } from \"./LinkedSubscriptionModule/LinkedSubscriptionModule.js\";\nimport { SEGMENT_CONTROLS } from \"../../../libs/property-controls/segment.js\";\nimport { SubscriptionElement } from \"./SubscriptionElement/SubscriptionElement.js\";\nimport { ManualMultipleSubscriptionModule } from \"./ManualMultipleSubscriptionModule/ManualMultipleSubscriptionModule.js\";\nimport { CanvasError } from \"../../@shared/CanvasError/CanvasError.js\";\nimport { isCanvas } from \"../../../utils/framer/isCanvas.js\";\nimport { isFramerPreview } from \"../../../utils/framer/isFramerPreview.js\";\nconst SubscriptionModuleInner = ({\n  input,\n  layout\n}) => {\n  switch (input.type) {\n    case SubscriptionModuleInputType.Auto:\n      return /* @__PURE__ */ jsx(AutoSubscriptionModule, { query: input.query, layout });\n    case SubscriptionModuleInputType.Linked:\n      return /* @__PURE__ */ jsx(LinkedSubscriptionModule, { ...input, layout });\n    case SubscriptionModuleInputType.Manual:\n      if (input.mode === ManualSubscriptionInputMode.Multiple) {\n        const errorMessage = getManualMultipleInputError(input);\n        if (errorMessage) {\n          return isCanvas() || isFramerPreview() ? /* @__PURE__ */ jsx(CanvasError, { message: errorMessage }) : null;\n        }\n        return /* @__PURE__ */ jsx(ManualMultipleSubscriptionModule, { eventKeys: input.eventKeys, groupKey: input.groupKey ?? \"\", layout });\n      }\n      return /* @__PURE__ */ jsx(SubscriptionElement, { type: input.type, eventKey: input.eventKey, layout });\n    default:\n      return null;\n  }\n};\nconst SubscriptionModule = ({\n  componentId,\n  theme,\n  segment,\n  ...rest\n}) => {\n  const timing = useComponentTiming(\"SubscriptionModule\");\n  return /* @__PURE__ */ jsx(ComponentTimingProvider, { timing, children: /* @__PURE__ */ jsx(SectionLayout, { componentId, theme, segment, onVisible: timing.markVisible, children: /* @__PURE__ */ jsx(SWRErrorBoundary, { reportFailure: true, children: /* @__PURE__ */ jsx(SubscriptionModuleInner, { ...rest }) }) }) });\n};\naddPropertyControls(SubscriptionModule, {\n  ...THEME_CONTROLS,\n  ...SEGMENT_CONTROLS,\n  componentId: {\n    hidden: ({\n      input\n    }) => (input == null ? void 0 : input.type) === SubscriptionModuleInputType.Linked,\n    ...COMPONENT_ID_PROPS.componentId\n  },\n  input: {\n    type: ControlType.Object,\n    title: \"입력 값\",\n    controls: {\n      type: {\n        type: ControlType.Enum,\n        title: \"유형\",\n        options: [SubscriptionModuleInputType.Linked, SubscriptionModuleInputType.Auto, SubscriptionModuleInputType.Manual],\n        optionTitles: [\"연결\", \"자동\", \"수동\"]\n      },\n      query: {\n        hidden: ({\n          type\n        }) => type !== SubscriptionModuleInputType.Auto,\n        ...AUTO_SUBSCRIPTION_MODULE_QUERY\n      },\n      value: {\n        hidden: ({\n          type\n        }) => type !== SubscriptionModuleInputType.Linked,\n        type: ControlType.String,\n        title: \"출력 값\",\n        defaultValue: \"\"\n      },\n      input: {\n        hidden: ({\n          type\n        }) => type !== SubscriptionModuleInputType.Linked,\n        type: ControlType.Object,\n        title: \"알림 옵션\",\n        controls: {\n          eventKeys: {\n            type: ControlType.Array,\n            title: \"이벤트 키\",\n            description: \"알림 기능을 활성화할 이벤트를 구분하기 위해 사전에 정의된 키를 입력합니다.\\n복수 입력 시 반드시 회차 순서대로 입력하거나 콤마(,)로 구분하여 입력해 주세요.\",\n            control: {\n              type: ControlType.String,\n              defaultValue: \"\",\n              placeholder: \"BRAND_DEAL_01\"\n            }\n          },\n          groupKey: {\n            type: ControlType.String,\n            title: \"그룹 키\",\n            description: \"이벤트 키들의 그룹을 식별하는 키를 입력합니다.\\n알림 그룹이 존재하지 않는 경우 미입력\",\n            defaultValue: \"\",\n            placeholder: \"25-02-29homeweek-encore\"\n          }\n        }\n      },\n      mode: {\n        hidden: ({\n          type\n        }) => type !== SubscriptionModuleInputType.Manual,\n        type: ControlType.Enum,\n        title: \"알림 키 개수\",\n        options: [ManualSubscriptionInputMode.Single, ManualSubscriptionInputMode.Multiple],\n        optionTitles: [\"단일\", \"복수\"],\n        defaultValue: ManualSubscriptionInputMode.Single\n      },\n      eventKey: {\n        hidden: ({\n          type,\n          mode\n        }) => type !== SubscriptionModuleInputType.Manual || mode === ManualSubscriptionInputMode.Multiple,\n        type: ControlType.String,\n        title: \"알림 키\",\n        description: \"알림 기능을 활성화할 이벤트를 구분하기 위해 사전에 정의된 키를 입력합니다.\\n알림 키는 1개만 입력해 주세요. (쉼표(,)로 여러 개 입력할 수 없습니다.)\\n\",\n        defaultValue: \"\"\n      },\n      eventKeys: {\n        hidden: ({\n          type,\n          mode\n        }) => type !== SubscriptionModuleInputType.Manual || mode !== ManualSubscriptionInputMode.Multiple,\n        type: ControlType.Array,\n        title: \"알림 키\",\n        description: \"알림 기능을 활성화할 이벤트를 구분하기 위해 사전에 정의된 키를 입력합니다.\\n한 칸에 알림 키 하나만 입력합니다. 순서는 상관없습니다.\\n유효 일시를 입력하면 그 일시가 지난 뒤에는 신청/해제 대상에서 제외됩니다.\",\n        control: {\n          type: ControlType.Object,\n          title: \"알림 키\",\n          controls: {\n            eventKey: {\n              type: ControlType.String,\n              title: \"알림 키\",\n              defaultValue: \"\",\n              placeholder: \"BRAND_DEAL_01\"\n            },\n            // NOTE: (김홍동) Framer 의 Date 컨트롤은 날짜만 주므로 시·분·초를 따로 받습니다. 날짜를 비우면 만료를 보지 않습니다.\n            validUntil: {\n              type: ControlType.Object,\n              title: \"유효 일시\",\n              controls: {\n                date: {\n                  type: ControlType.Date,\n                  title: \"날짜\",\n                  description: \"비워 두면 만료되지 않습니다.\"\n                },\n                hours: {\n                  type: ControlType.Number,\n                  title: \"시\",\n                  description: \"0 ~ 23시 기준\",\n                  defaultValue: 0,\n                  min: 0,\n                  max: 23,\n                  unit: \"시\",\n                  step: 1,\n                  displayStepper: true\n                },\n                minutes: {\n                  type: ControlType.Number,\n                  title: \"분\",\n                  defaultValue: 0,\n                  min: 0,\n                  max: 59,\n                  unit: \"분\",\n                  step: 1,\n                  displayStepper: true\n                },\n                seconds: {\n                  type: ControlType.Number,\n                  title: \"초\",\n                  defaultValue: 0,\n                  min: 0,\n                  max: 59,\n                  unit: \"초\",\n                  step: 1,\n                  displayStepper: true\n                }\n              }\n            }\n          }\n        }\n      },\n      groupKey: {\n        hidden: ({\n          type,\n          mode\n        }) => type !== SubscriptionModuleInputType.Manual || mode !== ManualSubscriptionInputMode.Multiple,\n        type: ControlType.String,\n        title: \"그룹 키\",\n        description: \"개별 알림 키들을 하나로 묶는 그룹의 키를 입력합니다.\\n반드시 입력해야 하며, 같은 그룹 키를 입력한 다른 모듈과 알림 상태가 공유됩니다.\",\n        defaultValue: \"\",\n        placeholder: \"BRAND_DEAL\"\n      }\n    }\n  },\n  layout: {\n    type: ControlType.Object,\n    title: \"레이아웃\",\n    controls: {\n      type: {\n        type: ControlType.Enum,\n        title: \"유형\",\n        options: [SubscriptionModuleLayoutType.SwitchButton, SubscriptionModuleLayoutType.Button],\n        optionTitles: [\"스위치 버튼\", \"버튼\"]\n      },\n      button: {\n        hidden: ({\n          type\n        }) => type !== SubscriptionModuleLayoutType.Button,\n        type: ControlType.Object,\n        title: \"버튼 옵션\",\n        controls: {\n          text: {\n            hidden: (_, {\n              input\n            }) => input.type === SubscriptionModuleInputType.Auto && input.query.type === QueryType.RaffleGroup,\n            type: ControlType.String,\n            title: \"버튼 텍스트\",\n            description: \"알림 키 개수가 '복수'인 경우에는 '전체 알림 받기 / 전체 알림 해제' 고정 문구가 적용되어 이 값은 사용되지 않습니다.\"\n          },\n          ...BUTTON_VARIANT_CONTROLS,\n          ...BUTTON_THEME_CONTROLS,\n          ...BUTTON_SIZE_CONTROLS,\n          ...BUTTON_FILL_CONTROLS\n        }\n      },\n      switchButton: {\n        hidden: ({\n          type\n        }) => type !== SubscriptionModuleLayoutType.SwitchButton,\n        type: ControlType.Object,\n        title: \"스위치 버튼 옵션\",\n        controls: {\n          text: {\n            type: ControlType.String,\n            title: \"버튼 텍스트\",\n            defaultValue: \"알림 받기\"\n          },\n          activeColor: {\n            type: ControlType.Color,\n            title: \"활성화 색상\",\n            description: \"버튼이 활성화 상태일 때의 색상 설정\",\n            optional: true\n          }\n        }\n      }\n    }\n  }\n});\nconst getManualMultipleInputError = ({\n  eventKeys,\n  groupKey\n}) => {\n  if (!(eventKeys == null ? void 0 : eventKeys.some(({\n    eventKey\n  }) => eventKey == null ? void 0 : eventKey.trim()))) {\n    return \"복수 입력을 사용하려면 알림 키를 하나 이상 입력해 주세요.\";\n  }\n  if (!(groupKey == null ? void 0 : groupKey.trim())) {\n    return \"복수 입력을 사용하려면 그룹 키를 입력해 주세요.\";\n  }\n  return void 0;\n};\nexport {\n  SubscriptionModule\n};\n","import{SubscriptionModule}from\"https://asset.29cm.co.kr/contents/framer/components/modules/SubscriptionModule/SubscriptionModule.js\";SubscriptionModule.displayName=\"[조립형]Subscription\";export default SubscriptionModule;\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"SubscriptionModule\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./SubscriptionModule.map"],"mappings":"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"}