{"version":3,"file":"static/chunks/pages/index-a1ac3d0bc2fb479e.js","mappings":"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","sources":["webpack:///","webpack:///./public/images/4cut-ranking/4cut-ranking-main-logo.webp","webpack:///./src/components/4cut-ranking/TrendingRegion.tsx","webpack:///./src/styles/animationStyle.ts","webpack:///./src/apis/querys/region-queries/useGetHotRegion.ts","webpack:///./src/apis/querys/main-queries/useGetHotRegionTopTwoCards.ts","webpack:///./src/features/4cut-ranking-main/components/MainPhotoCardVs.tsx","webpack:///./src/features/4cut-ranking-main/components/MainGaugeBar.tsx","webpack:///./src/components/4cut-ranking/PlayingUserTooltip.tsx","webpack:///./src/apis/querys/main-queries/useGetGamePlayedCount.ts","webpack:///./src/features/4cut-ranking-main/components/MainCtaButtons.tsx","webpack:///./src/features/4cut-ranking-main/index.tsx","webpack:///./public/images/background/4cut-ranking-main-background.webp","webpack:///./pages/index.tsx","webpack:///./src/apis/gamesApiV2.ts","webpack:///./public/images/4cut-ranking/gauge-bar.png","webpack:///./src/components/4cut-ranking/GaugeBar.tsx","webpack:///./public/images/4cut-ranking/VS-background.png","webpack:///./public/images/4cut-ranking/VS.png","webpack:///./src/components/4cut-ranking/VS.tsx","webpack:///./src/components/layout/Header.tsx","webpack:///./src/hooks/useScrolled.tsx","webpack:///./src/components/layout/PageLayout.tsx","webpack:///./src/apis/querys/useGetRedDot.ts","webpack:///./src/components/common/RedDot.tsx","webpack:///./src/components/layout/PushAndSettingIconButtons.tsx","webpack:///./src/constants/region.ts","webpack:///./node_modules/.pnpm/@tanstack+query-core@5.62.2/node_modules/@tanstack/query-core/build/modern/hydration.js","webpack:///./node_modules/.pnpm/@tanstack+react-query@5.62.2_react@18.2.0/node_modules/@tanstack/react-query/build/modern/HydrationBoundary.js","webpack:///./src/libs/react-query/react-query.ts","webpack:///./src/stores/4cut-ranking/applyStore.ts","webpack:///"],"sourcesContent":["\n (window.__NEXT_P = window.__NEXT_P || []).push([\n \"/\",\n function () {\n return require(\"private-next-pages/index.tsx\");\n }\n ]);\n if(module.hot) {\n module.hot.dispose(function () {\n window.__NEXT_P.push([\"/\"])\n });\n }\n ","export default {\"src\":\"/_next/static/media/4cut-ranking-main-logo.c2b7cfcd.webp\",\"height\":369,\"width\":1125,\"blurDataURL\":\"data:image/webp;base64,UklGRngAAABXRUJQVlA4WAoAAAAQAAAABwAAAgAAQUxQSBkAAAAACQYcaCEOAQBTvvL3879bAjbTzcbT3z8AAFZQOCA4AAAAkAEAnQEqCAADAAJAOCWMAAKdNjNQAP7tK4Vp3UYo5B7yXG45M3m7/fkvZbEWITlTfq6XejSgAAA=\",\"blurWidth\":8,\"blurHeight\":3};","import styled from 'styled-components';\nimport { getFontValue } from '@styles/styleUtils';\nimport { getRegionName } from '@src/constants/region';\n\nconst Wrap = styled.div`\n position: relative;\n display: flex;\n justify-content: center;\n align-items: center;\n width: 284px;\n`;\n\nconst HorizontalLine = styled.span`\n width: 100%;\n height: 2px;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n background: linear-gradient(\n 90deg,\n rgba(255, 255, 255, 0) 0%,\n rgba(255, 255, 255, 0.6) 20%,\n rgba(255, 255, 255, 1) 50%,\n rgba(255, 255, 255, 0.6) 80%,\n rgba(255, 255, 255, 0) 100%\n );\n z-index: 1;\n`;\n\nconst RegionWrap = styled.div`\n position: relative;\n z-index: 2;\n\n > span {\n display: flex;\n justify-content: center;\n align-items: center;\n background: linear-gradient(106.99deg, #312c3c 17.68%, #120e19 90.67%);\n border: 1px solid #fff;\n color: #fff;\n ${getFontValue('body3')};\n ${({ theme }) => theme.fontFamilyV2.establish};\n padding: 0 19px;\n height: 29px;\n border-radius: 99px;\n z-index: 2;\n }\n\n &::before,\n &::after {\n content: '';\n position: absolute;\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: #fff;\n z-index: -1;\n top: 50%;\n transform: translateY(-50%);\n }\n\n &::before {\n left: -4px;\n }\n\n &::after {\n right: -4px;\n }\n`;\n\ninterface Props {\n region?: RankingRegionType;\n}\n\nconst TrendingRegion = ({ region = null }: Props): JSX.Element => {\n return (\n \n \n {getRegionName(region)}\n \n \n \n );\n};\n\nexport default TrendingRegion;\n","import { keyframes } from 'styled-components';\n\nexport const leftBounceAnimation = keyframes`\n 0% {\n transform: rotateY(35deg) translateX(0);\n }\n\n 5% {\n transform: rotateY(35deg) translateX(2px);\n }\n \n 10% {\n transform: rotateY(35deg) translateX(-1px);\n }\n\n 15% {\n transform: rotateY(35deg) translateX(1.5px);\n }\n\n 20% {\n transform: rotateY(35deg) translateX(-0.8px);\n }\n\n 25% {\n transform: rotateY(35deg) translateX(1px);\n }\n\n 30% {\n transform: rotateY(35deg) translateX(-0.5px);\n }\n\n 35% {\n transform: rotateY(35deg) translateX(0.8px);\n }\n\n 40% {\n transform: rotateY(35deg) translateX(-0.3px);\n }\n\n 45% {\n transform: rotateY(35deg) translateX(0.5px);\n }\n \n 50% {\n transform: rotateY(35deg) translateX(0);\n }\n\n 55% {\n transform: rotateY(35deg) translateX(-20px);\n }\n\n 60% {\n transform: rotateY(35deg) translateX(-16px);\n }\n\n 65% {\n transform: rotateY(35deg) translateX(-20px);\n }\n\n 70% {\n transform: rotateY(35deg) translateX(-17px);\n }\n\n 75% {\n transform: rotateY(35deg) translateX(-20px);\n }\n\n 80% {\n transform: rotateY(35deg) translateX(-18px);\n }\n\n 85% {\n transform: rotateY(35deg) translateX(-20px);\n }\n\n 90% {\n transform: rotateY(35deg) translateX(-19px);\n }\n\n 95% {\n transform: rotateY(35deg) translateX(-20px);\n }\n \n 100% {\n transform: rotateY(35deg) translateX(0);\n }\n`;\n\nexport const rightBounceAnimation = keyframes`\n 0% {\n transform: rotateY(-35deg) translateX(0);\n }\n\n 5% {\n transform: rotateY(-35deg) translateX(-2px);\n }\n\n 10% {\n transform: rotateY(-35deg) translateX(1px);\n }\n\n 15% {\n transform: rotateY(-35deg) translateX(-1.5px);\n }\n\n 20% {\n transform: rotateY(-35deg) translateX(0.8px);\n }\n\n 25% {\n transform: rotateY(-35deg) translateX(-1px);\n }\n\n 30% {\n transform: rotateY(-35deg) translateX(0.5px);\n }\n\n 35% {\n transform: rotateY(-35deg) translateX(-0.8px);\n }\n\n 40% {\n transform: rotateY(-35deg) translateX(0.3px);\n }\n\n 45% {\n transform: rotateY(-35deg) translateX(-0.5px);\n }\n \n 50% {\n transform: rotateY(-35deg) translateX(0);\n }\n\n 55% {\n transform: rotateY(-35deg) translateX(20px);\n }\n\n 60% {\n transform: rotateY(-35deg) translateX(16px);\n }\n \n 65% {\n transform: rotateY(-35deg) translateX(20px);\n }\n\n 70% {\n transform: rotateY(-35deg) translateX(17px);\n }\n\n 75% {\n transform: rotateY(-35deg) translateX(20px);\n }\n\n 80% {\n transform: rotateY(-35deg) translateX(18px);\n }\n\n 85% {\n transform: rotateY(-35deg) translateX(20px);\n }\n\n 90% {\n transform: rotateY(-35deg) translateX(19px);\n }\n\n 95% {\n transform: rotateY(-35deg) translateX(20px);\n }\n \n 100% {\n transform: rotateY(-35deg) translateX(0);\n }\n`;\n","import { useQuery } from '@tanstack/react-query';\nimport { HOT_REGION } from '@src/queryKeys';\nimport gamesApiV2 from '@src/apis/gamesApiV2';\n\nexport interface HotRegionAndCategoryRes {\n region: RankingRegionType;\n photoCardCategory: CategoryType;\n}\n\n/**\n * 실시간 핫(현재기준 24시간 가장 많은 사용자 플레이)한 지역, 카테고리 반환\n * */\nconst useGetHotRegion = (): HotRegionAndCategoryRes => {\n const { data } = useQuery({\n queryKey: [HOT_REGION],\n queryFn: async () => {\n const res = await gamesApiV2.getHotRegion();\n return res.data;\n },\n staleTime: 1000 * 60 * 5,\n gcTime: 1000 * 60 * 5,\n });\n\n return (\n data || {\n region: null,\n photoCardCategory: 'FEMALE',\n }\n );\n};\n\nexport default useGetHotRegion;\n","import { useQuery } from '@tanstack/react-query';\nimport { REGION_TOP_TWO_CARDS } from '@src/queryKeys';\nimport gamesApiV2 from '@src/apis/gamesApiV2';\nimport useGetHotRegion from '@src/apis/querys/region-queries/useGetHotRegion';\n\nexport interface TwoCardsRes {\n firstPhotoCard: PhotoCardType | undefined;\n secondPhotoCard: PhotoCardType | undefined;\n}\n\n/**\n * 실시간 핫한 지역, 카테고리의 1위, 2위 포토카드 반환\n * */\nconst useGetHotRegionTopTwoCards = (): TwoCardsRes => {\n const { region, photoCardCategory } = useGetHotRegion();\n\n const { data } = useQuery<{\n firstPhotoCard: PhotoCardType;\n secondPhotoCard: PhotoCardType;\n }>({\n queryKey: [REGION_TOP_TWO_CARDS, region, photoCardCategory],\n queryFn: async () => {\n const res = await gamesApiV2.getRegionTopTwoCards({\n region,\n photoCardCategory,\n });\n return res.data;\n },\n staleTime: 1000 * 60 * 5,\n gcTime: 1000 * 60 * 5,\n });\n\n return (\n data || {\n firstPhotoCard: undefined,\n secondPhotoCard: undefined,\n }\n );\n};\n\nexport default useGetHotRegionTopTwoCards;\n","import React from 'react';\nimport styled from 'styled-components';\nimport PhotoCard from '@components/photo-card/PhotoCard';\nimport VS from '@components/4cut-ranking/VS';\nimport {\n leftBounceAnimation,\n rightBounceAnimation,\n} from '@styles/animationStyle';\nimport useGetHotRegionTopTwoCards from '@src/apis/querys/main-queries/useGetHotRegionTopTwoCards';\n\nconst PhotoCardVsWrap = styled.div`\n width: 100%;\n height: fit-content;\n min-height: 274px;\n position: relative;\n display: flex;\n justify-content: center;\n padding: 32px;\n overflow: hidden;\n\n .photo-card {\n transform-style: preserve-3d;\n backface-visibility: hidden;\n will-change: transform;\n scale: 1.1;\n }\n\n > div.front {\n display: flex;\n justify-content: center;\n perspective: 500px;\n\n > .photo-card.left {\n transform: rotateY(35deg);\n filter: drop-shadow(-10px 0 10px #0a070f)\n drop-shadow(-10px 0 20px #0a070f);\n animation: ${leftBounceAnimation} 3s ease infinite;\n }\n\n > .photo-card.right {\n transform: rotateY(-35deg);\n filter: drop-shadow(10px 0 10px #0a070f) drop-shadow(10px 0 20px #0a070f);\n animation: ${rightBounceAnimation} 3s ease infinite;\n }\n }\n\n > div.back {\n position: absolute;\n width: 120%;\n max-width: 400px;\n display: flex;\n justify-content: space-between;\n perspective: 300px;\n opacity: 0.5;\n\n > .photo-card.left {\n transform: rotateY(35deg);\n }\n\n > .photo-card.right {\n transform: rotateY(-35deg);\n }\n }\n`;\n\nconst MainPhotoCardVs = (): JSX.Element => {\n const { firstPhotoCard, secondPhotoCard } = useGetHotRegionTopTwoCards();\n\n return (\n \n \n
\n \n \n
\n
\n \n \n
\n
\n );\n};\n\nexport default MainPhotoCardVs;\n","import React from 'react';\nimport styled from 'styled-components';\nimport Text from '@components/common/Text';\nimport GaugeBar from '@components/4cut-ranking/GaugeBar';\nimport useGetHotRegionTopTwoCards from '@src/apis/querys/main-queries/useGetHotRegionTopTwoCards';\nimport Icon from '@src/svg/Icon';\n\nconst GaugeWrap = styled.div`\n width: 295px;\n display: flex;\n flex-direction: column;\n margin: 10px 0;\n`;\n\nconst NicknameWrap = styled.div`\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: -4px;\n\n svg {\n min-width: 24px;\n }\n\n > div {\n background: linear-gradient(106.99deg, #312c3c 17.68%, #120e19 90.67%);\n display: flex;\n align-items: flex-end;\n width: 140px;\n height: 32px;\n gap: 4px;\n\n > span {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n &.left {\n justify-content: flex-start;\n border-radius: 99px 160px 20px 99px;\n box-shadow: 1px 0 4px 0 #a479f5;\n padding: 0 20px 9px 10px;\n }\n\n &.right {\n justify-content: flex-end;\n border-radius: 160px 99px 99px 20px;\n box-shadow: 1px 0 4px 0 #74b5ed;\n padding: 0 10px 9px 20px;\n }\n }\n`;\n\nconst MainGaugeBar = (): JSX.Element => {\n const { firstPhotoCard, secondPhotoCard } = useGetHotRegionTopTwoCards();\n\n const firstWinCount = firstPhotoCard?.winCount || 1;\n const secondWinCount = secondPhotoCard?.winCount || 1;\n const fullCount = firstWinCount + secondWinCount || 2;\n const leftPercent = (firstWinCount / fullCount) * 100;\n\n return (\n \n \n
\n \n \n {firstPhotoCard?.photoCardName || ''}\n \n
\n
\n \n {secondPhotoCard?.photoCardName || ''}\n \n \n
\n
\n \n
\n );\n};\n\nexport default MainGaugeBar;\n","import styled, { keyframes } from 'styled-components';\nimport Text from '@components/common/Text';\nimport { getColorValue } from '@styles/styleUtils';\nimport Icon from '@src/svg/Icon';\n\nconst bounceAnimation = keyframes`\n 0% {\n transform: translateY(0);\n }\n \n 50% {\n transform: translateY(-4px);\n }\n \n 100% {\n transform: translateY(0);\n }\n`;\n\nconst Wrap = styled.div`\n position: absolute;\n top: 0;\n right: 36px;\n display: flex;\n justify-content: center;\n align-items: center;\n gap: 4px;\n background: ${getColorValue('primary.purple')};\n padding: 5px 12px;\n border-radius: 99px;\n animation: ${bounceAnimation} 1s ease infinite;\n\n &::after {\n content: ' ';\n position: absolute;\n top: 100%;\n left: 75%;\n margin-left: -5px;\n border-width: 5px;\n border-style: solid;\n border-color: ${getColorValue('primary.purple')} transparent transparent\n transparent;\n }\n`;\n\ninterface Props {\n count?: number;\n}\n\nconst PlayingUserTooltip = ({ count = 0 }: Props): JSX.Element => {\n return (\n \n \n \n \n {count.toLocaleString()}\n \n 명 참여중\n \n \n );\n};\n\nexport default PlayingUserTooltip;\n","import { useQuery, UseQueryResult } from '@tanstack/react-query';\nimport { RANKING_GAME_PLAYED_COUNT } from '@src/queryKeys';\nimport gamesApiV2 from '@src/apis/gamesApiV2';\n\n/**\n * 포컷랭킹 게임 생성 수 반환\n * */\nconst useGetGamePlayedCount = (): UseQueryResult<{ count: number }> => {\n return useQuery<{\n count: number;\n }>({\n queryKey: [RANKING_GAME_PLAYED_COUNT],\n queryFn: async () => {\n const res = await gamesApiV2.getGamePlayedCount();\n return res.data;\n },\n staleTime: 1000 * 60 * 5,\n gcTime: 1000 * 60 * 5,\n });\n};\n\nexport default useGetGamePlayedCount;\n","import React from 'react';\nimport styled from 'styled-components';\nimport Text from '@components/common/Text';\nimport PlayingUserTooltip from '@components/4cut-ranking/PlayingUserTooltip';\nimport useAppRouter from '@hooks/useAppRouter';\nimport useUserInfoStore from '@hooks/useUserInfoStore';\nimport { useApplyFormStore } from '@src/stores/4cut-ranking/applyStore';\nimport useGetGamePlayedCount from '@src/apis/querys/main-queries/useGetGamePlayedCount';\nimport { getColorValue } from '@styles/styleUtils';\nimport useDeviceStore from '@hooks/useDeviceStore';\nimport { googleTagManager } from '@src/tags';\nimport Icon from '@src/svg/Icon';\n\nconst ButtonWrap = styled.div`\n position: relative;\n width: 100%;\n margin-top: auto;\n margin-bottom: 54px;\n\n div.tooltip-container {\n height: 36px;\n }\n\n div.button-container {\n width: 100%;\n display: grid;\n grid-template-columns: 1fr 2fr;\n gap: 8px;\n padding: 0 20px;\n }\n`;\n\nconst ApplyButton = styled.button`\n height: 52px;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n backdrop-filter: blur(8px);\n box-shadow: 0 4px 10px 0 #040e37;\n border: 2px solid ${getColorValue('white')};\n background: #17131c;\n border-radius: 12px;\n color: ${getColorValue('white')};\n\n &:hover,\n &:active {\n background: ${getColorValue('gray90')};\n }\n`;\n\nconst GameButton = styled.button`\n position: relative;\n height: 52px;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n backdrop-filter: blur(8px);\n border-radius: 12px;\n background: linear-gradient(\n 270deg,\n #cde9ff 0%,\n #abbdfb 28%,\n #9aa6f8 57.5%,\n #9c66ff 100%\n );\n color: ${getColorValue('gray100')};\n box-shadow: 8px 6px 24px rgba(255, 20, 147, 0.5),\n -8px 10px 18px rgba(17, 149, 189, 0.4);\n\n &::after {\n content: '';\n position: absolute;\n inset: 2px;\n border-radius: 10px;\n background: ${getColorValue('white')};\n }\n\n &:hover,\n &:active {\n &::after {\n background: ${getColorValue('gray15')};\n }\n }\n\n > svg,\n > span {\n z-index: 2;\n }\n`;\n\nconst MainCtaButtons = (): JSX.Element => {\n const router = useAppRouter();\n const [userInfo] = useUserInfoStore();\n const { resetData } = useApplyFormStore();\n\n const [deviceInfo] = useDeviceStore();\n const isApp = !!deviceInfo?.deviceToken;\n\n const { data } = useGetGamePlayedCount();\n\n const handleClickPlayGame = () => {\n router.push('/4cut-ranking/game');\n };\n\n const handleClickApply = () => {\n if (!isApp) {\n googleTagManager.Ranking_Apply_Button_Clicked_Web();\n }\n googleTagManager.Ranking_Apply_Button_Clicked();\n\n if (userInfo?.userId) {\n router.push('/4cut-ranking/apply');\n } else {\n // 웹 비회원 클릭 시 \"비회원으로 시작하기\" 버튼 노출된 로그인 화면으로 이동\n router.push('/login?anonymous4cutRankingApply=true');\n }\n resetData();\n };\n\n return (\n \n
\n {!!data?.count && }\n
\n
\n \n \n \n 랭킹 참가\n \n \n \n \n \n 지역 얼짱뽑기\n \n \n
\n
\n );\n};\n\nexport default MainCtaButtons;\n","import React from 'react';\nimport styled from 'styled-components';\nimport Image from 'next/image';\nimport logoImage from '@public/images/4cut-ranking/4cut-ranking-main-logo.webp';\nimport TrendingRegion from '@components/4cut-ranking/TrendingRegion';\nimport MainPhotoCardVs from '@features/4cut-ranking-main/components/MainPhotoCardVs';\nimport MainGaugeBar from '@features/4cut-ranking-main/components/MainGaugeBar';\nimport MainCtaButtons from '@features/4cut-ranking-main/components/MainCtaButtons';\nimport useGetHotRegion from '@src/apis/querys/region-queries/useGetHotRegion';\n\nconst MainPageWrap = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n height: clamp(550px, auto, 720px);\n padding-bottom: 32px;\n max-height: 720px;\n margin: auto 0;\n`;\n\nconst Logo = styled.div`\n position: relative;\n width: 100%;\n height: fit-content;\n display: flex;\n justify-content: center;\n margin-bottom: 6px;\n\n > img {\n object-fit: contain;\n z-index: 2;\n width: 100%;\n height: 100%;\n }\n`;\n\nconst MainContent = () => {\n const { region } = useGetHotRegion();\n\n return (\n \n \n \"지역\n \n \n \n \n \n \n );\n};\n\nexport default MainContent;\n","export default {\"src\":\"/_next/static/media/4cut-ranking-main-background.d82c89fc.webp\",\"height\":1720,\"width\":750,\"blurDataURL\":\"data:image/webp;base64,UklGRjIAAABXRUJQVlA4ICYAAACQAQCdASoDAAgAAkA4JZwAAudZtgAA/v3jT5Um6ZJDZk3uGAAAAA==\",\"blurWidth\":3,\"blurHeight\":8};","import { type GetServerSideProps } from 'next';\nimport { useEffect } from 'react';\nimport { dehydrate } from '@tanstack/react-query';\nimport MainContent from '@features/4cut-ranking-main';\nimport PushAndSettingIconButtons from '@components/layout/PushAndSettingIconButtons';\nimport PageLayout from '@components/layout/PageLayout';\nimport backgroundImage from '@public/images/background/4cut-ranking-main-background.webp';\nimport useDeviceStore from '@hooks/useDeviceStore';\nimport { TwoCardsRes } from '@src/apis/querys/main-queries/useGetHotRegionTopTwoCards';\nimport { HotRegionAndCategoryRes } from '@src/apis/querys/region-queries/useGetHotRegion';\nimport { Hydrate } from '@src/libs/react-query/react-query';\nimport { HOT_REGION, REGION_TOP_TWO_CARDS } from '@src/queryKeys';\nimport gamesApiV2 from '@src/apis/gamesApiV2';\nimport { DehydratedQueries } from '@src/libs/react-query/types';\nimport queryClient from '@src/libs/react-query';\nimport { googleTagManager } from '@src/tags';\n\ninterface PageServerProps {\n dehydratedQueries: DehydratedQueries;\n}\n\nconst Main = ({ dehydratedQueries }: PageServerProps) => {\n const [deviceInfo] = useDeviceStore();\n const isApp = !!deviceInfo?.deviceToken;\n\n useEffect(() => {\n if (!isApp) {\n googleTagManager.Page_View_Ranking_Web();\n }\n }, [isApp]);\n\n return (\n \n }\n >\n \n \n \n );\n};\n\nexport const getServerSideProps: GetServerSideProps = async () => {\n const regionData = await queryClient.fetchQuery({\n queryKey: [HOT_REGION],\n queryFn: async () => {\n const { data } = await gamesApiV2.getHotRegion();\n return data;\n },\n });\n\n await queryClient.prefetchQuery({\n queryKey: [\n REGION_TOP_TWO_CARDS,\n regionData.region,\n regionData.photoCardCategory,\n ],\n queryFn: async () => {\n const { data } = await gamesApiV2.getRegionTopTwoCards({\n region: regionData.region,\n photoCardCategory: regionData.photoCardCategory,\n });\n return data;\n },\n });\n\n return {\n props: {\n dehydratedQueries: dehydrate(queryClient),\n },\n };\n};\n\nexport default Main;\n","import axiosInstance from '@src/axios';\nimport { ResultOfRoundType } from '@src/stores/4cut-ranking/gameStore';\n\n// 포컷랭킹 게임 생성(랜덤 16장) API\nconst postStartGame = async (data: {\n region: RankingRegionType;\n photoCardCategory: CategoryType;\n}): Promise<\n AInstance.Res<{\n rankingGameId: string;\n photoCards: PhotoCardType[];\n }>\n> => axiosInstance.post('/api/ranking/v2/games', data);\n\n// 포컷랭킹 게임 생성(지정된 카드 1장 포함 16장) API\nconst postCustomStartGame = async (data: {\n photoCardId: string;\n}): Promise<\n AInstance.Res<{\n rankingGameId: string;\n photoCards: PhotoCardType[];\n region: RankingRegionType;\n }>\n> =>\n axiosInstance.post(\n `/api/ranking/v2/games/with-photo-card/${data.photoCardId}`,\n );\n\n// 포컷랭킹 게임 결과 반영 API\nconst postFinishGame = async (data: {\n rankingGameId: string;\n resultOfRound16: ResultOfRoundType[];\n resultOfRound8: ResultOfRoundType[];\n resultOfRound4: ResultOfRoundType[];\n resultOfFinal: ResultOfRoundType;\n}): Promise =>\n axiosInstance.post('/api/ranking/v2/games/result', data);\n\n// 실시간 핫(현재기준 24시간 가장 많은 사용자 플레이)한 지역, 카테고리 API\nconst getHotRegion = async (): Promise<\n AInstance.Res<{\n region: RankingRegionType;\n photoCardCategory: CategoryType;\n }>\n> => axiosInstance.get('/api/ranking/v2/games/hot');\n\n// 실시간 핫한 지역, 카테고리의 1위, 2위 포토카드 정보 API\nconst getRegionTopTwoCards = async (params: {\n region: RankingRegionType;\n photoCardCategory: CategoryType;\n}): Promise<\n AInstance.Res<{\n firstPhotoCard: PhotoCardType;\n secondPhotoCard: PhotoCardType;\n }>\n> => axiosInstance.get('/api/ranking/v2/games/hot/ranking', { params });\n\n// 실시간 랭킹(지역, 카테고리 별) 조회 API\nconst getRegionTopCards = async (params: {\n region: RankingRegionType;\n photoCardCategory: CategoryType;\n limit?: number;\n}): Promise> =>\n axiosInstance.get('/api/ranking/v2/games/ranking', { params });\n\n// 포컷랭킹 게임 생성 수 API\nconst getGamePlayedCount = async (): Promise<\n AInstance.Res<{\n count: number;\n }>\n> => axiosInstance.get('/api/ranking/v2/games/count');\n\nexport default {\n postStartGame,\n postFinishGame,\n getHotRegion,\n getRegionTopTwoCards,\n getRegionTopCards,\n getGamePlayedCount,\n postCustomStartGame,\n};\n","export default {\"src\":\"/_next/static/media/gauge-bar.a4ab2352.png\",\"height\":36,\"width\":1414,\"blurDataURL\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAABCAMAAADU3h9xAAAADFBMVEVlp9+RY+B+ieOSaONQym7EAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAEUlEQVR4nGNgZGZkYmBgYAAAADYACCRPyxIAAAAASUVORK5CYII=\",\"blurWidth\":8,\"blurHeight\":1};","import * as React from 'react';\nimport styled, { keyframes } from 'styled-components';\nimport Image from 'next/image';\nimport Text from '@components/common/Text';\nimport gaugeBarImage from '@public/images/4cut-ranking/gauge-bar.png';\n\nconst gaugeAnimation = keyframes`\n 0% {\n transform: translate(-10px, -50%);\n }\n\n 50% {\n transform: translate(10px, -50%);\n }\n \n 100% {\n transform: translate(-10px, -50%);\n }\n`;\n\nconst Wrap = styled.div<{ center: number }>`\n position: relative;\n width: 100%;\n height: 18px;\n border-radius: 99px;\n overflow: hidden;\n\n > img {\n position: absolute;\n width: 200vw;\n max-width: calc(480px * 2);\n height: fit-content;\n top: 50%;\n left: ${({ center }) => `calc(${center}% - min(100vw, 480px))`};\n transform: translate(0, -50%);\n animation: ${gaugeAnimation} 1s ease-in-out infinite;\n }\n`;\n\nconst ScoreWrap = styled.div`\n display: flex;\n justify-content: space-between;\n position: absolute;\n width: 100%;\n padding: 1px 12px 0;\n`;\n\ninterface Props {\n leftPercent: number;\n rightPercent?: number;\n}\n\nconst GaugeBar = ({\n leftPercent = 50,\n rightPercent = 100 - leftPercent,\n}: Props): JSX.Element => {\n const center = (leftPercent / (leftPercent + rightPercent)) * 100;\n\n return (\n \n \"\"\n \n \n {leftPercent.toFixed(1)}%\n \n \n {rightPercent.toFixed(1)}%\n \n \n \n );\n};\n\nexport default GaugeBar;\n","export default {\"src\":\"/_next/static/media/VS-background.0b8f6afb.png\",\"height\":281,\"width\":278,\"blurDataURL\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAMAAADz0U65AAAAclBMVEVMaXENARE5AVTX4fwgBiobBBoKExUmAiYTCB0JCBAmBjsbByUAABYNDR1XEF89Bz8GDR4ABwByUL2ESMoVEFnRbOo+AlNmGZGvTe//9/uyauu4s/QpNIwrHIcxEGFudeMGCTgRBz8pBS0KCR8vBzYFFTVhoKBfAAAAJHRSTlMAwMHzTzANZh2my4sGc12AlmHv7Pb64/Lt9+729+/t8d/t8fg/ErWPAAAACXBIWXMAABYlAAAWJQFJUiTwAAAARUlEQVR4nAXBhwGAIBAAsUPRBwR773X/FU0AEI3HmGBv0Rmp/dbtfAKJq+PluCwSNfE07wqqduyGt8CUro9UlpOkWvDwA3UQAz7kUmCoAAAAAElFTkSuQmCC\",\"blurWidth\":8,\"blurHeight\":8};","export default {\"src\":\"/_next/static/media/VS.1a31bc7d.png\",\"height\":281,\"width\":278,\"blurDataURL\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAMAAADz0U65AAAAElBMVEVMaXFJRklgZGmJiZNYWl13f381XbUHAAAABnRSTlMAG04NaSCF1O15AAAACXBIWXMAABYlAAAWJQFJUiTwAAAAG0lEQVR4nGNgwAcYWRiZwQxmJhYmqBgrIzalAAORABuluDL6AAAAAElFTkSuQmCC\",\"blurWidth\":8,\"blurHeight\":8};","import Image from 'next/image';\nimport { CSSProperties } from 'react';\nimport vsBackgroundImage from '@public/images/4cut-ranking/VS-background.png';\nimport vsTextImage from '@public/images/4cut-ranking/VS.png';\n\nconst VS = ({ style }: { style?: CSSProperties }): JSX.Element => {\n return (\n <>\n \n \n \n );\n};\n\nexport default VS;\n","import * as React from 'react';\nimport { useAtomValue } from 'jotai';\nimport useAppRouter from '@hooks/useAppRouter';\nimport { pathAtom } from '@src/stores/path';\nimport {\n BackButtonWrap,\n CenterTitleWrap,\n HeaderWrap,\n RightButtonContainerWrap,\n} from '@components/layout/styles/header.style';\nimport Text from '@components/common/Text';\nimport { HeaderColorType } from '@styles/styleUtils';\nimport Icon from '@src/svg/Icon';\n\nexport interface HeaderProps {\n pageTitle?: string | React.ReactElement;\n titleAlign?: 'left' | 'center';\n handleClickBack?: () => void;\n hideBackButton?: boolean;\n headerRightButton?: JSX.Element;\n headerColor?: HeaderColorType;\n showWebBanner?: boolean;\n}\n\nconst Header: React.FC = ({\n pageTitle,\n titleAlign = 'center',\n handleClickBack,\n hideBackButton,\n headerRightButton,\n headerColor = 'white',\n showWebBanner,\n}) => {\n const router = useAppRouter();\n const path = useAtomValue(pathAtom);\n\n const onClickBackButton = () => {\n if (handleClickBack) {\n handleClickBack();\n } else if (!path.prevPath) {\n router.push('/');\n } else {\n router.back();\n }\n };\n\n return (\n \n
\n {!hideBackButton && titleAlign !== 'left' && (\n \n \n \n )}\n {titleAlign === 'left' && (\n {pageTitle}\n )}\n {titleAlign === 'center' && (\n {pageTitle}\n )}\n {headerRightButton && (\n \n {headerRightButton}\n \n )}\n
\n \n );\n};\n\nexport default Header;\n","import { useEffect, useState } from 'react';\n\n/**\n * 세로 스크롤 되지 않은 경우 false, scrollY가 0을 초과하는 경우 true\n * */\nconst useScrolled = (): [boolean] => {\n const [isScrolled, setScrolled] = useState(false);\n\n const handleScroll = () => {\n const { scrollY } = window;\n\n if (scrollY <= 0) {\n return setScrolled(false);\n }\n return setScrolled(true);\n };\n\n useEffect(() => {\n if (typeof window !== 'undefined') {\n window.addEventListener('scroll', handleScroll, {\n passive: true,\n capture: true,\n });\n }\n handleScroll(); // 최초실행용\n return () => {\n window.removeEventListener('scroll', handleScroll);\n };\n }, [isScrolled]);\n\n return [isScrolled];\n};\n\nexport default useScrolled;\n","import * as React from 'react';\nimport { CSSProperties, useEffect } from 'react';\nimport { useAtom } from 'jotai';\nimport { StaticImageData } from 'next/image';\nimport { PageWrap } from '@styles/common-layouts';\nimport BottomNav from '@components/layout/BottomNav';\nimport MobileBottomNav from '@components/layout/MobileBottomNav';\nimport Header, { HeaderProps } from '@components/layout/Header';\nimport useDeviceStore from '@hooks/useDeviceStore';\nimport useScrolled from '@hooks/useScrolled';\nimport { layoutMountAtom } from '@src/stores/mount';\nimport { getColorValue, HeaderColorType } from '@styles/styleUtils';\nimport WebBanner from '@components/common/WebBanner';\n\ninterface Props extends HeaderProps {\n mode?: 'light' | 'dark';\n backgroundImage?: StaticImageData;\n nav?: boolean;\n children: React.ReactNode;\n customPageStyle?: CSSProperties;\n isHeaderVisible?: boolean;\n}\n\nconst NavBar = ({ isApp }: { isApp: boolean }) => {\n return isApp ? : ;\n};\n\nconst PageLayout = ({\n mode = 'light',\n nav = true,\n customPageStyle,\n isHeaderVisible = true,\n ...props\n}: Props) => {\n const [isScrolled] = useScrolled();\n const [isMount, setIsMount] = useAtom(layoutMountAtom);\n\n const [deviceInfo] = useDeviceStore();\n const isApp = !!deviceInfo?.deviceToken;\n const showWebBanner = isMount && !isApp;\n\n useEffect(() => {\n setIsMount(true);\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => {\n // 모바일 바깥영역 색깔 반영\n if (document) {\n if (mode === 'light') {\n document.body.style.backgroundColor = getColorValue('white') as string;\n } else {\n document.body.style.backgroundColor = getColorValue('black') as string;\n }\n }\n }, [mode]);\n\n const getHeaderStyle = (): HeaderColorType => {\n if (props?.headerColor === 'transparent') {\n return isScrolled ? 'black' : 'transparent';\n }\n if (props?.headerColor) {\n return props.headerColor;\n }\n return mode === 'dark' ? 'black' : 'white';\n };\n\n return (\n <>\n {showWebBanner && }\n \n {isHeaderVisible ? (\n \n ) : (\n
\n )}\n {props.children}\n {nav && isMount && }\n \n \n );\n};\n\nexport default PageLayout;\n","import { useQuery, UseQueryResult } from '@tanstack/react-query';\nimport usersApi from '@src/apis/usersApi';\nimport { RED_DOT } from '@src/queryKeys';\nimport useAccessToken from '@hooks/useAccessToken';\n\nconst useGetRedDot = (): UseQueryResult => {\n const [accessToken] = useAccessToken();\n return useQuery({\n queryKey: [RED_DOT],\n queryFn: async () => {\n const res = await usersApi.getPushNotView();\n return res.data;\n },\n refetchInterval: (data) => {\n if (!accessToken) return false;\n return data ? false : 5000;\n },\n });\n};\n\nexport default useGetRedDot;\n","import styled from 'styled-components';\nimport useGetRedDot from '@src/apis/querys/useGetRedDot';\n\nconst RedDotIcon = styled.div`\n position: absolute;\n top: 0;\n right: 0;\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background-color: red;\n`;\n\nconst RedDot = (): JSX.Element | null => {\n const { data } = useGetRedDot();\n\n return data ? : null;\n};\n\nexport default RedDot;\n","import * as React from 'react';\nimport { useEffect, useState } from 'react';\nimport styled from 'styled-components';\nimport useAppRouter from '@hooks/useAppRouter';\nimport useDeviceStore from '@hooks/useDeviceStore';\nimport RedDot from '@components/common/RedDot';\nimport Icon from '@src/svg/Icon';\n\nconst RedDotWrap = styled.div`\n position: relative;\n display: flex;\n align-items: center;\n`;\n\nconst PushAndSettingIconButtons = (): React.ReactElement => {\n const router = useAppRouter();\n\n const [state] = useDeviceStore();\n const [isApp, setApp] = useState(false);\n\n useEffect(() => {\n if (typeof window !== 'undefined') {\n setApp(!!state?.deviceId);\n }\n }, [state?.deviceId]);\n\n return (\n
\n {router.pathname === '/ranking' && (\n router.push('/ranking/search')}\n width={24}\n height={24}\n />\n )}\n {isApp && (\n \n router.push('/push-history')}\n />\n \n \n )}\n router.push('/setting')}\n width={24}\n height={24}\n />\n
\n );\n};\n\nexport default PushAndSettingIconButtons;\n","/**\n * 지역 카테고리\n * */\nexport const ORIGIN_REGIONS: OriginRegionType[] = [\n '서울',\n '인천 / 경기',\n '경상',\n '충청 / 강원',\n '전라 / 제주',\n];\n\n/**\n * 지역 카테고리 + \"기타\"\n * (지역이 등록되지 않은 값까지 포함)\n * */\nexport const REGIONS: RegionType[] = [\n '서울',\n '인천 / 경기',\n '경상',\n '충청 / 강원',\n '전라 / 제주',\n '기타',\n];\n\n/**\n * 지역 카테고리 + \"전국(null)\"\n * (게임 시에 선택 가능한 지역 카테고리 값)\n * */\nexport const RANKING_REGIONS: RankingRegionType[] = [\n null, // '전국'\n '서울',\n '인천 / 경기',\n '경상',\n '충청 / 강원',\n '전라 / 제주',\n];\n\n/**\n * null -> 전국 텍스트 표시에 활용\n * */\nexport const getRegionName = (\n value: RegionType | RankingRegionType | string,\n) => {\n return value || '전국';\n};\n","// src/hydration.ts\nfunction defaultTransformerFn(data) {\n return data;\n}\nfunction dehydrateMutation(mutation) {\n return {\n mutationKey: mutation.options.mutationKey,\n state: mutation.state,\n ...mutation.options.scope && { scope: mutation.options.scope },\n ...mutation.meta && { meta: mutation.meta }\n };\n}\nfunction dehydrateQuery(query, serializeData) {\n return {\n state: {\n ...query.state,\n ...query.state.data !== void 0 && {\n data: serializeData(query.state.data)\n }\n },\n queryKey: query.queryKey,\n queryHash: query.queryHash,\n ...query.state.status === \"pending\" && {\n promise: query.promise?.then(serializeData).catch((error) => {\n if (process.env.NODE_ENV !== \"production\") {\n console.error(\n `A query that was dehydrated as pending ended up rejecting. [${query.queryHash}]: ${error}; The error will be redacted in production builds`\n );\n }\n return Promise.reject(new Error(\"redacted\"));\n })\n },\n ...query.meta && { meta: query.meta }\n };\n}\nfunction defaultShouldDehydrateMutation(mutation) {\n return mutation.state.isPaused;\n}\nfunction defaultShouldDehydrateQuery(query) {\n return query.state.status === \"success\";\n}\nfunction dehydrate(client, options = {}) {\n const filterMutation = options.shouldDehydrateMutation ?? client.getDefaultOptions().dehydrate?.shouldDehydrateMutation ?? defaultShouldDehydrateMutation;\n const mutations = client.getMutationCache().getAll().flatMap(\n (mutation) => filterMutation(mutation) ? [dehydrateMutation(mutation)] : []\n );\n const filterQuery = options.shouldDehydrateQuery ?? client.getDefaultOptions().dehydrate?.shouldDehydrateQuery ?? defaultShouldDehydrateQuery;\n const serializeData = options.serializeData ?? client.getDefaultOptions().dehydrate?.serializeData ?? defaultTransformerFn;\n const queries = client.getQueryCache().getAll().flatMap(\n (query) => filterQuery(query) ? [dehydrateQuery(query, serializeData)] : []\n );\n return { mutations, queries };\n}\nfunction hydrate(client, dehydratedState, options) {\n if (typeof dehydratedState !== \"object\" || dehydratedState === null) {\n return;\n }\n const mutationCache = client.getMutationCache();\n const queryCache = client.getQueryCache();\n const deserializeData = options?.defaultOptions?.deserializeData ?? client.getDefaultOptions().hydrate?.deserializeData ?? defaultTransformerFn;\n const mutations = dehydratedState.mutations || [];\n const queries = dehydratedState.queries || [];\n mutations.forEach(({ state, ...mutationOptions }) => {\n mutationCache.build(\n client,\n {\n ...client.getDefaultOptions().hydrate?.mutations,\n ...options?.defaultOptions?.mutations,\n ...mutationOptions\n },\n state\n );\n });\n queries.forEach(({ queryKey, state, queryHash, meta, promise }) => {\n let query = queryCache.get(queryHash);\n const data = state.data === void 0 ? state.data : deserializeData(state.data);\n if (query) {\n if (query.state.dataUpdatedAt < state.dataUpdatedAt) {\n const { fetchStatus: _ignored, ...serializedState } = state;\n query.setState({\n ...serializedState,\n data\n });\n }\n } else {\n query = queryCache.build(\n client,\n {\n ...client.getDefaultOptions().hydrate?.queries,\n ...options?.defaultOptions?.queries,\n queryKey,\n queryHash,\n meta\n },\n // Reset fetch status to idle to avoid\n // query being stuck in fetching state upon hydration\n {\n ...state,\n data,\n fetchStatus: \"idle\"\n }\n );\n }\n if (promise) {\n const initialPromise = Promise.resolve(promise).then(deserializeData);\n void query.fetch(void 0, { initialPromise });\n }\n });\n}\nexport {\n defaultShouldDehydrateMutation,\n defaultShouldDehydrateQuery,\n dehydrate,\n hydrate\n};\n//# sourceMappingURL=hydration.js.map","\"use client\";\n\n// src/HydrationBoundary.tsx\nimport * as React from \"react\";\nimport { hydrate } from \"@tanstack/query-core\";\nimport { useQueryClient } from \"./QueryClientProvider.js\";\nvar HydrationBoundary = ({\n children,\n options = {},\n state,\n queryClient\n}) => {\n const client = useQueryClient(queryClient);\n const [hydrationQueue, setHydrationQueue] = React.useState();\n const optionsRef = React.useRef(options);\n optionsRef.current = options;\n React.useMemo(() => {\n if (state) {\n if (typeof state !== \"object\") {\n return;\n }\n const queryCache = client.getQueryCache();\n const queries = state.queries || [];\n const newQueries = [];\n const existingQueries = [];\n for (const dehydratedQuery of queries) {\n const existingQuery = queryCache.get(dehydratedQuery.queryHash);\n if (!existingQuery) {\n newQueries.push(dehydratedQuery);\n } else {\n const hydrationIsNewer = dehydratedQuery.state.dataUpdatedAt > existingQuery.state.dataUpdatedAt;\n const queryAlreadyQueued = hydrationQueue?.find(\n (query) => query.queryHash === dehydratedQuery.queryHash\n );\n if (hydrationIsNewer && (!queryAlreadyQueued || dehydratedQuery.state.dataUpdatedAt > queryAlreadyQueued.state.dataUpdatedAt)) {\n existingQueries.push(dehydratedQuery);\n }\n }\n }\n if (newQueries.length > 0) {\n hydrate(client, { queries: newQueries }, optionsRef.current);\n }\n if (existingQueries.length > 0) {\n setHydrationQueue(\n (prev) => prev ? [...prev, ...existingQueries] : existingQueries\n );\n }\n }\n }, [client, hydrationQueue, state]);\n React.useEffect(() => {\n if (hydrationQueue) {\n hydrate(client, { queries: hydrationQueue }, optionsRef.current);\n setHydrationQueue(void 0);\n }\n }, [client, hydrationQueue]);\n return children;\n};\nexport {\n HydrationBoundary\n};\n//# sourceMappingURL=HydrationBoundary.js.map","import {\n dehydrate,\n HydrationBoundary,\n QueryKey,\n QueryState,\n} from '@tanstack/react-query';\nimport queryClient from '@src/libs/react-query/index';\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nfunction isEqual(value1: any, value2: any): any {\n if (value1 === value2) {\n return true;\n }\n\n if (\n typeof value1 !== 'object' ||\n typeof value2 !== 'object' ||\n value1 === null ||\n value2 === null\n ) {\n return false;\n }\n\n const keys1 = Object.keys(value1);\n const keys2 = Object.keys(value2);\n\n if (keys1.length !== keys2.length) {\n return false;\n }\n\n return keys1.every(\n (key) => keys2.includes(key) && isEqual(value1[key], value2[key]),\n );\n}\n\ntype UnwrapPromise = T extends Promise ? U : T;\n\ninterface QueryProps {\n queryKey: QueryKey;\n queryFn: () => Promise | unknown;\n}\n\ninterface DehydratedQueryExtended {\n state: QueryState;\n}\n\nexport async function getDehydratedQuery({\n queryKey,\n queryFn,\n}: Q) {\n await queryClient.prefetchQuery({ queryKey, queryFn });\n\n const { queries } = dehydrate(queryClient);\n\n const [dehydratedQuery] = queries.filter((query) =>\n isEqual(query.queryKey, queryKey),\n );\n\n return dehydratedQuery as DehydratedQueryExtended<\n UnwrapPromise>\n >;\n}\n\nexport async function getDehydratedQueries(queries: Q) {\n await Promise.all(\n queries.map(({ queryKey, queryFn }) =>\n queryClient.prefetchQuery({ queryKey, queryFn }),\n ),\n );\n\n return dehydrate(queryClient); // queries 대신 state 전체를 반환\n}\n\nexport const Hydrate = HydrationBoundary;\n\nexport default {};\n","import { create } from 'zustand';\nimport { persist } from 'zustand/middleware';\n\nexport interface ApplyFormType {\n region: RankingRegionType | '';\n photoCardCategory: CategoryType | '';\n photoCardName: string;\n countryNumber: '+82';\n phoneNumber: string;\n originPhotoPath: string;\n originPhoto: File | undefined;\n resizedOriginPhoto: File | undefined;\n thumbnailPhotoPath: string;\n thumbnailPhoto: string | undefined;\n acceptedBy: 'NONE' | 'OCR' | 'EXIF';\n}\n\nexport const initialState: ApplyFormType = {\n region: '',\n photoCardCategory: '',\n photoCardName: '',\n countryNumber: '+82',\n phoneNumber: '',\n originPhotoPath: '',\n thumbnailPhotoPath: '',\n acceptedBy: 'NONE',\n originPhoto: undefined,\n resizedOriginPhoto: undefined,\n thumbnailPhoto: undefined,\n};\n\ninterface Return {\n data: ApplyFormType;\n updateData: (partialData: Partial) => void;\n resetAndUpdateData: (partialData: Partial) => void;\n resetData: () => void;\n}\n\nexport const useApplyFormStore = create((set) => ({\n data: initialState,\n updateData: (partialData: Partial) =>\n set((prev: { data: ApplyFormType }) => ({\n data: {\n ...prev.data,\n ...partialData,\n },\n })),\n resetAndUpdateData: (partialData: Partial) =>\n set({\n data: {\n ...initialState,\n ...partialData,\n },\n }),\n resetData: () =>\n set({\n data: initialState,\n }),\n}));\n\nexport const useNeverShowApplyGuideStore = create(\n persist<{\n neverShowApplyGuide: boolean;\n setNeverShowApplyGuide: () => void;\n }>(\n (set) => ({\n neverShowApplyGuide: false,\n setNeverShowApplyGuide: () =>\n set({\n neverShowApplyGuide: true,\n }),\n }),\n {\n name: 'neverShowApplyGuide',\n },\n ),\n);\n"],"names":["window","__NEXT_P","push","__webpack_require__","_4cut_ranking_main_logo","Wrap","styled","div","withConfig","HorizontalLine","span","RegionWrap","getFontValue","theme","param","fontFamilyV2","establish","_4cut_ranking_TrendingRegion","region","jsx_runtime","jsxs","jsx","getRegionName","leftBounceAnimation","keyframes","rightBounceAnimation","region_queries_useGetHotRegion","data","useQuery","queryKey","HOT_REGION","queryFn","res","gamesApiV2","getHotRegion","staleTime","gcTime","photoCardCategory","main_queries_useGetHotRegionTopTwoCards","useGetHotRegion","REGION_TOP_TWO_CARDS","getRegionTopTwoCards","firstPhotoCard","undefined","secondPhotoCard","PhotoCardVsWrap","components_MainPhotoCardVs","useGetHotRegionTopTwoCards","VS","className","PhotoCard","size","photoCardInfo","GaugeWrap","NicknameWrap","components_MainGaugeBar","firstWinCount","winCount","secondWinCount","Icon","name","width","height","Text","typo","color","photoCardName","GaugeBar","leftPercent","bounceAnimation","getColorValue","_4cut_ranking_PlayingUserTooltip","count","as","toLocaleString","main_queries_useGetGamePlayedCount","RANKING_GAME_PLAYED_COUNT","getGamePlayedCount","ButtonWrap","ApplyButton","button","GameButton","components_MainCtaButtons","router","useAppRouter","userInfo","useUserInfoStore","resetData","useApplyFormStore","deviceInfo","useDeviceStore","isApp","deviceToken","useGetGamePlayedCount","PlayingUserTooltip","onClick","googleTagManager","Ranking_Apply_Button_Clicked_Web","Ranking_Apply_Button_Clicked","userId","MainPageWrap","Logo","_4cut_ranking_main","id","Image","src","logoImage","alt","TrendingRegion","MainPhotoCardVs","MainGaugeBar","MainCtaButtons","_4cut_ranking_main_background","pages","dehydratedQueries","useEffect","Page_View_Ranking_Web","Hydrate","state","PageLayout","headerColor","mode","backgroundImage","titleAlign","headerRightButton","PushAndSettingIconButtons","MainContent","postStartGame","axiosInstance","post","postCustomStartGame","concat","photoCardId","postFinishGame","get","params","getRegionTopCards","__webpack_exports__","Z","gauge_bar","gaugeAnimation","center","ScoreWrap","_4cut_ranking_GaugeBar","rightPercent","gaugeBarImage","style","letterSpacing","fontWeight","toFixed","VS_background","_4cut_ranking_VS","Fragment","vsBackgroundImage","mixBlendMode","zIndex","position","top","left","transform","pointerEvents","vsTextImage","pageTitle","handleClickBack","hideBackButton","showWebBanner","path","useAtomValue","pathAtom","react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__","HeaderWrap","$headerColor","$showWebBanner","BackButtonWrap","prevPath","back","data-testid","CenterTitleWrap","RightButtonContainerWrap","hooks_useScrolled","isScrolled","setScrolled","useState","handleScroll","scrollY","addEventListener","passive","capture","removeEventListener","NavBar","MobileBottomNav","BottomNav","layout_PageLayout","nav","customPageStyle","isHeaderVisible","props","useScrolled","isMount","setIsMount","useAtom","layoutMountAtom","document","body","backgroundColor","WebBanner","PageWrap","$backgroundImage","Header","children","querys_useGetRedDot","accessToken","useAccessToken","RED_DOT","usersApi","getPushNotView","refetchInterval","RedDotIcon","common_RedDot","useGetRedDot","RedDotWrap","layout_PushAndSettingIconButtons","setApp","deviceId","display","alignItems","gap","pathname","RedDot","ORIGIN_REGIONS","RANKING_REGIONS","value","defaultTransformerFn","hydrate","client","dehydratedState","options","mutationCache","getMutationCache","queryCache","getQueryCache","deserializeData","defaultOptions","getDefaultOptions","mutations","queries","forEach","mutationOptions","build","queryHash","meta","promise","query","dataUpdatedAt","fetchStatus","_ignored","serializedState","setState","initialPromise","Promise","resolve","then","fetch","queryClient","QueryClientProvider","NL","hydrationQueue","setHydrationQueue","react","optionsRef","useRef","current","useMemo","newQueries","existingQueries","dehydratedQuery","existingQuery","hydrationIsNewer","queryAlreadyQueued","find","length","prev","initialState","countryNumber","phoneNumber","originPhotoPath","thumbnailPhotoPath","acceptedBy","originPhoto","resizedOriginPhoto","thumbnailPhoto","create","updateData","set","partialData","resetAndUpdateData","useNeverShowApplyGuideStore","persist","neverShowApplyGuide","setNeverShowApplyGuide"],"sourceRoot":""}