{"version":3,"file":"CheckAuth.B2Rfgcla.mjs","names":["getKSTDate","now","key"],"sources":["https:/framerusercontent.com/modules/pIGEMps6hXhOvo2SMFcy/tp3nWYy82sKTo2bHVS2f/MonthDisplay.js","https:/framerusercontent.com/modules/pH1YXpCqKcogYIHYUFxa/M22vwGD29Gi0nTLyCSzj/DayComponent.js","https:/framerusercontent.com/modules/mkXCG9vyUDJX4hWqt92J/t7stlZMFQ8T3Gz5AFFWe/UnmuMembership.js","https:/framerusercontent.com/modules/jJ3DlGzy4thdVVHgfkA6/JVZ1xHozrTvuJE5yCyxo/WeekComponent.js","https:/framerusercontent.com/modules/mMuKKDdndWgTt46NQ8RF/wrizlCIpcas1rpJt5Euq/CheckAuth.js"],"sourcesContent":["import{jsx as _jsx}from\"react/jsx-runtime\";import{createStore}from\"https://framer.com/m/framer/store.js@^1.0.0\";const now=getKSTDate();const useStore=createStore({dayInfoLoaded:false,year:now.getFullYear(),monthIndex:now.getMonth(),prevMonthVariant:\"Disabled\",nextMonthVariant:\"Default\",firstDate:null,secondDate:null,membership_number:null,name:null,birthdate:null,phone:null,email:null,membership:\"Non-Member\",enteredCouponCode:[],signupDate:null,initialPrice:null,discountedPrice:null,integratedPrice:null,additionalPrice:0,vatPrice:null,depositPrice:null,finalPrice:null,couponDetails:[],couponPrimaryDetails:[],couponSecondaryDetails:[],remarks:[],usedMileage:0,ownedMileage:0,expiredCoupons:[]});function getKSTDate(baseDate=new Date){const utc=baseDate.getTime()+baseDate.getTimezoneOffset()*6e4;return new Date(utc+9*60*60*1e3);}// helper to centralize your year-based variant rules\nfunction getMonthVariants(monthIndex,year){const today=getKSTDate();const ty=today.getFullYear();const tm=today.getMonth();const isPastOrCurrent=year<ty||year===ty&&monthIndex<=tm;return{prevMonthVariant:isPastOrCurrent?\"Disabled\":\"Default\",nextMonthVariant:\"Default\"};}// export const MONTH_NAMES = [\n//     \"JANUARY\",\n//     \"FEBRUARY\",\n//     \"MARCH\",\n//     \"APRIL\",\n//     \"MAY\",\n//     \"JUNE\",\n//     \"JULY\",\n//     \"AUGUST\",\n//     \"SEPTEMBER\",\n//     \"OCTOBER\",\n//     \"NOVEMBER\",\n//     \"DECEMBER\",\n// ]\nexport const MONTH_NAMES=[\"01\",\"02\",\"03\",\"04\",\"05\",\"06\",\"07\",\"08\",\"09\",\"10\",\"11\",\"12\"];export function displayThisMonth(Component){return props=>{const[store]=useStore();const monthName=MONTH_NAMES[store.monthIndex];const text=`${store.year}. ${monthName}`;return /*#__PURE__*/_jsx(Component,{...props,text:text});};}export function displayNextMonth(Component){return props=>{const[store]=useStore();// store.monthIndex/store.year 기준으로 +1달 계산\nconst nextIndex=(store.monthIndex+1)%12;const nextYear=store.monthIndex===11?store.year+1:store.year;const monthName=MONTH_NAMES[nextIndex];const text=`${nextYear}. ${monthName}`;return /*#__PURE__*/_jsx(Component,{...props,text:text});};}export function toggleNextMonth(Component){return props=>{const[store,setStore]=useStore();const handleClick=()=>{// variant가 Default가 아니면 무시\nif(store.nextMonthVariant!==\"Default\")return;// syncPrevVariant()\nconst{monthIndex,year}=store;const nextIndex=(monthIndex+1)%12;const nextYear=monthIndex===11?year+1:year;setStore({monthIndex:nextIndex,year:nextYear});setStore(getMonthVariants(nextIndex,nextYear));};return /*#__PURE__*/_jsx(Component,{...props,onClick:handleClick,variant:store.nextMonthVariant});};}export function togglePrevMonth(Component){return props=>{const[store,setStore]=useStore();const handleClick=()=>{// variant가 default가 아니면 무시\nif(store.prevMonthVariant!==\"Default\")return;// syncPrevVariant()\nconst{monthIndex,year}=store;const prevIndex=(monthIndex+11)%12;const prevYear=monthIndex===0?year-1:year;setStore({monthIndex:prevIndex,year:prevYear});setStore(getMonthVariants(prevIndex,prevYear));};return /*#__PURE__*/_jsx(Component,{...props,onClick:handleClick,variant:store.prevMonthVariant});};}export function calculateDay(year,monthIndex,row,col){// 이 달 1일의 요일 (0=일,1=월,…6=토)\nconst firstWeekday=new Date(year,monthIndex,1).getDay();// 이 달의 총 일수\nconst daysInMonth=new Date(year,monthIndex+1,0).getDate();// 이전 달의 총 일수\nconst daysInPrevMonth=new Date(year,monthIndex,0).getDate();// 전체 그리드 상에서의 인덱스\nconst cellIndex=row*7+col;// \"1일\"을 기준 삼아 상대적인 날짜 계산\nconst relativeDay=cellIndex-firstWeekday+1;let day;let isCurrentMonth;let actualDate;if(relativeDay<1){day=daysInPrevMonth+relativeDay;isCurrentMonth=false;actualDate=new Date(year,monthIndex-1,day);}else if(relativeDay>daysInMonth){day=relativeDay-daysInMonth;isCurrentMonth=false;actualDate=new Date(year,monthIndex+1,day);}else{day=relativeDay;isCurrentMonth=true;actualDate=new Date(year,monthIndex,day);}return{day,isCurrentMonth,actualMonth:actualDate.getMonth(),actualYear:actualDate.getFullYear()};}export{useStore};export function toggleMembershipNumber(Component){return props=>{const[store,setStore]=useStore();const handleChange=event=>{const inputValue=event.target.value;setStore({membership_number:inputValue});};return /*#__PURE__*/_jsx(Component,{...props,onChange:handleChange});};}\nexport const __FramerMetadata__ = {\"exports\":{\"togglePrevMonth\":{\"type\":\"reactHoc\",\"name\":\"togglePrevMonth\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"displayThisMonth\":{\"type\":\"reactHoc\",\"name\":\"displayThisMonth\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"MONTH_NAMES\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"calculateDay\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"toggleNextMonth\":{\"type\":\"reactHoc\",\"name\":\"toggleNextMonth\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useStore\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"toggleMembershipNumber\":{\"type\":\"reactHoc\",\"name\":\"toggleMembershipNumber\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"displayNextMonth\":{\"type\":\"reactHoc\",\"name\":\"displayNextMonth\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./MonthDisplay.map","import{jsx as _jsx,jsxs as _jsxs}from\"react/jsx-runtime\";import{motion}from\"framer-motion\";export function DayComponent({index,variant,onClick,isToday=false,dayCategory}){const isActive=variant===\"Start\"||variant===\"Middle\"||variant===\"End\";const getBackgroundColor=()=>{if(variant===\"Invisible\")return\"transparent\";if(isActive)return\"#C2C2C2\";// if (variant === \"Disabled\") return \"transparent\"\nswitch(dayCategory){case\"Peak-Weekend\":return\"#DFDBD9\";case\"Peak-Weekday\":return\"#EFECEA\";case\"Weekend\":return\"#EFEFEF\";default:return\"transparent\";}};const getTextColor=()=>{if(variant===\"Invisible\")return\"transparent\";if(isToday)return\"#000000\";switch(variant){case\"Holiday\":return\"#DB4242\";case\"Disabled\":return\"#707070\";case\"Start\":case\"Middle\":case\"End\":return\"#F8F8F8\";default:return\"#707070\";}};const getSubText=()=>{if(variant===\"Invisible\")return null;if(variant===\"Start\")return\"입실\";if(variant===\"End\")return\"퇴실\";if(variant===\"Middle\")return\"\\xa0\";if(isToday)return\"오늘\";return null;};return /*#__PURE__*/_jsxs(motion.div,{layout:\"position\",onClick:onClick,style:{flex:1,height:\"100%\",display:\"flex\",flexDirection:\"column\",justifyContent:\"center\",alignItems:\"center\",fontFamily:\"Pretendard Light, sans-serif\",fontWeight:300,fontSize:16,lineHeight:\"1.2em\",boxSizing:\"border-box\",cursor:variant===\"Disabled\"||variant===\"Invisible\"?\"default\":\"pointer\",transition:\"background-color 0.3s ease-in-out\",backgroundColor:getBackgroundColor(),color:getTextColor()},children:[/*#__PURE__*/_jsx(\"div\",{style:{transform:isActive?\"translateY(-2px)\":\"translateY(0)\",transition:\"transform 0.3s ease-in-out\",backgroundColor:isToday?\"#D0E8FF\":\"transparent\",borderRadius:isToday?\"50%\":\"0\",width:isToday?24:\"auto\",height:isToday?24:\"auto\",display:\"flex\",alignItems:\"center\",justifyContent:\"center\",opacity:variant===\"Disabled\"?.3:1},children:variant===\"Invisible\"?null:index}),/*#__PURE__*/_jsx(motion.div,{layout:true,style:{fontSize:10,marginTop:4,fontFamily:\"Pretendard Light, sans-serif\",fontWeight:isToday?600:500,lineHeight:\"1.2em\",height:\"1em\",visibility:getSubText()?\"visible\":\"hidden\",color:getTextColor(),opacity:variant===\"Disabled\"?.3:1},children:getSubText()})]});}\nexport const __FramerMetadata__ = {\"exports\":{\"DayComponent\":{\"type\":\"reactComponent\",\"name\":\"DayComponent\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./DayComponent.map","// UnmuMembership.tsx\nimport{jsx as _jsx}from\"react/jsx-runtime\";import{useStore}from\"https://framerusercontent.com/modules/pIGEMps6hXhOvo2SMFcy/tp3nWYy82sKTo2bHVS2f/MonthDisplay.js\";const membershipCycle=[\"Non-Member\",\"UNMU 6\",\"UNMU 9\",\"UNMU 12\",\"UNMU 24\",\"TERENE 6\",\"TERENE 9\",\"TERENE 12\",\"TERENE 24\"];export function displayMembership(Component){return props=>{const[store,setStore]=useStore();const handleTap=()=>{const currentIndex=membershipCycle.indexOf(store.membership);const nextIndex=(currentIndex+1)%membershipCycle.length;setStore({membership:membershipCycle[nextIndex]});};return /*#__PURE__*/_jsx(Component,{...props,text:store.membership,onTap:handleTap});};}export const membershipLimits={\"Non-Member\":2,\"UNMU 6\":3,\"UNMU 9\":6,\"UNMU 12\":8,\"UNMU 24\":12,\"TERENE 6\":3,\"TERENE 9\":6,\"TERENE 12\":8,\"TERENE 24\":12};export const membershipPrices={\"Non-Member\":{Weekday:15e5,Weekend:21e5,\"Peak-Weekday\":21e5,\"Peak-Weekend\":24e5}};export const unmuDayLimits={\"UNMU 6\":{Weekday:4,Weekend:1,Peak:1},\"UNMU 9\":{Weekday:5,Weekend:2,Peak:2},\"UNMU 12\":{Weekday:7,Weekend:3,Peak:2},\"UNMU 24\":{Weekday:13,Weekend:6,Peak:5},\"TERENE 6\":{Weekday:4,Weekend:1,Peak:1},\"TERENE 9\":{Weekday:5,Weekend:2,Peak:2},\"TERENE 12\":{Weekday:7,Weekend:3,Peak:2},\"TERENE 24\":{Weekday:13,Weekend:6,Peak:5}};\nexport const __FramerMetadata__ = {\"exports\":{\"displayMembership\":{\"type\":\"reactHoc\",\"name\":\"displayMembership\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"unmuDayLimits\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"membershipLimits\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"membershipPrices\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}","// WeekComponent.tsx\nimport{jsx as _jsx}from\"react/jsx-runtime\";import{DayComponent}from\"https://framerusercontent.com/modules/pH1YXpCqKcogYIHYUFxa/M22vwGD29Gi0nTLyCSzj/DayComponent.js\";import{useStore,calculateDay}from\"https://framerusercontent.com/modules/pIGEMps6hXhOvo2SMFcy/tp3nWYy82sKTo2bHVS2f/MonthDisplay.js\";import{membershipLimits}from\"https://framerusercontent.com/modules/mkXCG9vyUDJX4hWqt92J/t7stlZMFQ8T3Gz5AFFWe/UnmuMembership.js\";import{addPropertyControls,ControlType}from\"framer\";function getKSTDate(baseDate=new Date){const utc=baseDate.getTime()+baseDate.getTimezoneOffset()*6e4;return new Date(utc+9*60*60*1e3);}function getLastAvailableDate(today,monthLimit){const year=today.getFullYear();const month=today.getMonth();const date=today.getDate();const targetMonth=month+monthLimit;const tempDate=new Date(year,targetMonth,date);// 2월 예외 처리: 날짜가 밀려 다음 달로 넘어간 경우\nif(tempDate.getMonth()!==targetMonth%12){// 해당 달의 마지막 날로 보정\nconst corrected=new Date(year,targetMonth+1,0)// 다음 달의 0일 → 해당 달의 마지막 날\n;corrected.setHours(23,59,59,999);return corrected;}// 일반적인 경우 (날짜가 유효하게 유지된 경우)\ntempDate.setHours(23,59,59,999);return new Date(tempDate.getTime()-24*60*60*1e3)// 전날까지 허용\n;}// export function isBeyondReservationLimit(\n//     today: Date,\n//     target: Date,\n//     membership: string,\n//     store?\n// ): boolean {\n//     if (store && store.membership === \"All-Free\") {\n//         return false\n//     }\n//     const monthLimit = membershipLimits[membership] ?? 0\n//     const lastAvailableDate = getLastAvailableDate(today, monthLimit)\n//     const now = getKSTDate()\n//     const tomorrow = new Date(today)\n//     tomorrow.setDate(today.getDate() + 1)\n//     tomorrow.setHours(0, 0, 0, 0)\n//     const deadlineForTomorrow = new Date(today)\n//     deadlineForTomorrow.setHours(14, 0, 0, 0)\n//     const isTryingToReserveTomorrow =\n//         target.getFullYear() === tomorrow.getFullYear() &&\n//         target.getMonth() === tomorrow.getMonth() &&\n//         target.getDate() === tomorrow.getDate()\n//     const isPastDeadlineForTomorrow =\n//         isTryingToReserveTomorrow &&\n//         now.getTime() >= deadlineForTomorrow.getTime()\n//     // ✅ [추가] 입실일 기준으로 3박까지는 허용 (퇴실만 예외)\n//     if (store?.firstDate && !store?.secondDate) {\n//         const checkinTime = dateToTime(store.firstDate)\n//         const maxCheckoutTime = checkinTime + 3 * 86400000 // 3일 후\n//         const targetTime = target.getTime()\n//         const checkinDate = new Date(checkinTime)\n//         const maxCheckoutDate = new Date(maxCheckoutTime)\n//         if (\n//             targetTime > lastAvailableDate.getTime() &&\n//             targetTime <= maxCheckoutDate.getTime()\n//         ) {\n//             // 입실일로부터 3박 이내이고, lastAvailableDate는 초과 → 퇴실 예외 허용\n//             return false\n//         }\n//     }\n//     return (\n//         target.getTime() > lastAvailableDate.getTime() ||\n//         isPastDeadlineForTomorrow\n//     )\n// }\nexport function isBeyondReservationLimit(today,target,membership,store){if(store&&store.membership===\"All-Free\"){return false;}const now=getKSTDate();const tomorrow=new Date(today);tomorrow.setDate(today.getDate()+1);tomorrow.setHours(0,0,0,0);const dayAfterTomorrow=new Date(today);dayAfterTomorrow.setDate(today.getDate()+2);dayAfterTomorrow.setHours(0,0,0,0);const deadlineForAfterTomorrow=new Date(today);deadlineForAfterTomorrow.setHours(15,0,0,0);const isTryingToReserveTomorrow=target.getFullYear()===tomorrow.getFullYear()&&target.getMonth()===tomorrow.getMonth()&&target.getDate()===tomorrow.getDate();const isTryingToReserveDayAfterTomorrow=target.getFullYear()===dayAfterTomorrow.getFullYear()&&target.getMonth()===dayAfterTomorrow.getMonth()&&target.getDate()===dayAfterTomorrow.getDate();// 내일은 항상 비활성화\nif(isTryingToReserveTomorrow){return true;}// 내일모레는 15시부터는 예약 불가\nif(isTryingToReserveDayAfterTomorrow&&now.getTime()>=deadlineForAfterTomorrow.getTime()){return true;}const monthLimit=membershipLimits[membership]??0;const lastAvailableDate=getLastAvailableDate(today,monthLimit);// ✅ [추가] 입실일 기준으로 3박까지는 허용 (퇴실만 예외)\nif(store?.firstDate&&!store?.secondDate){const checkinTime=dateToTime(store.firstDate);const maxCheckoutTime=checkinTime+3*864e5// 3박\n;const targetTime=target.getTime();if(targetTime>lastAvailableDate.getTime()&&targetTime<=maxCheckoutTime){return false;}}return target.getTime()>lastAvailableDate.getTime();}// reservation-3에서 first와 second 동시에 판별하기 위한 함수, reservation-2에선 영향 X\nexport function isReservationPairValid(today,first,second,membership,store){const monthLimit=membershipLimits[membership]??0;const lastAvailableDate=getLastAvailableDate(today,monthLimit);const checkinOK=!isBeyondReservationLimit(today,first,membership,store);const maxCheckoutTime=first.getTime()+3*864e5// 3박\n;const checkoutOK=second.getTime()<=maxCheckoutTime&&second.getTime()>first.getTime();return checkinOK&&checkoutOK;}function isSameDate(a,b){return a?.year===b?.year&&a?.month===b?.month&&a?.day===b?.day;}function dateToTime(date){return new Date(date.year,date.month,date.day).getTime();}function isExceeding4Nights(date1,date2){const time1=dateToTime(date1);const time2=dateToTime(date2);const diffDays=Math.abs((time2-time1)/(1e3*60*60*24));return diffDays>=4;}export function WeekComponent(props){const[store,setStore]=useStore();const{week,thisMonth,variant,dayInfoMap}=props;const monthIndex=thisMonth?store.monthIndex:(store.monthIndex+1)%12;const year=thisMonth||store.monthIndex<11?store.year:store.year+1;const width=props.variant===\"Mobile\"?300:350;const containerStyle={display:\"flex\",flexDirection:\"row\",justifyContent:\"center\",alignItems:\"center\",flexWrap:\"nowrap\",gap:0,width:width,height:50};const today=getKSTDate();today.setHours(0,0,0,0);return /*#__PURE__*/_jsx(\"div\",{style:containerStyle,children:Array.from({length:7},(_,i)=>{const{day,isCurrentMonth,actualMonth,actualYear}=calculateDay(year,monthIndex,week,i);const dateObj={year:actualYear,month:actualMonth,day};const isSelectedFirst=isSameDate(store.firstDate,dateObj);const isSelectedSecond=isSameDate(store.secondDate,dateObj);const isBetween=store.firstDate&&store.secondDate&&isCurrentMonth&&(()=>{const d=dateToTime(dateObj);const f=dateToTime(store.firstDate);const s=dateToTime(store.secondDate);return d>f&&d<s;})();const currentDate=new Date(year,monthIndex,day);currentDate.setHours(0,0,0,0);const isTodayDate=isCurrentMonth&&currentDate.getFullYear()===today.getFullYear()&&currentDate.getMonth()===today.getMonth()&&currentDate.getDate()===today.getDate();const isPast=currentDate<=today;const isBeyondLimit=isBeyondReservationLimit(today,currentDate,store.membership,store);const yyyy=dateObj.year.toString();const mm=String(dateObj.month+1).padStart(2,\"0\");const dd=String(dateObj.day).padStart(2,\"0\");const key=`${yyyy}-${mm}-${dd}`;const dayInfo=dayInfoMap?.get(key);const checkinOccupied=dayInfo?.checkin?.is_occupied??false;const checkoutOccupied=dayInfo?.checkout?.is_occupied??false;const isHoliday=dayInfo?.isHoliday??false;const category=dayInfo?.category??null;// 스타일 표현용: baseVariant는 \"회색 처리\"에만 사용\nlet baseVariant=\"Day\";// isPotentialCheckout: firstDate가 선택된 상태에서 이 날짜가 그 다음 날짜인 경우\nconst isPotentialCheckout=store.firstDate&&!store.secondDate&&dateToTime(dateObj)>dateToTime(store.firstDate);// 사이에 Disabled 날짜가 있는지 확인\nconst hasDisabledBetween=(()=>{if(!isPotentialCheckout)return false;const start=store.firstDate;const end=dateObj;for(let d=new Date(start.year,start.month,start.day+1);d<new Date(end.year,end.month,end.day);d.setDate(d.getDate()+1)){const key=`${d.getFullYear()}-${String(d.getMonth()+1).padStart(2,\"0\")}-${String(d.getDate()).padStart(2,\"0\")}`;const info=dayInfoMap?.get(key);const dayIsDisabled=!info||info.checkin?.is_occupied||info.checkout?.is_occupied;if(dayIsDisabled)return true;}return false;})();// 최종 Disabled 여부 결정\nconst shouldBeDisabled=!isCurrentMonth||isPast||isBeyondLimit||!dayInfoMap||checkinOccupied&&checkoutOccupied||checkinOccupied&&!checkoutOccupied&&(!isPotentialCheckout||hasDisabledBetween||isExceeding4Nights(store.firstDate,dateObj));if(shouldBeDisabled){baseVariant=\"Disabled\";}else if(i===0||isHoliday){// 일요일 및 공휴일 로직\nbaseVariant=\"Holiday\";}// isBeyondLimit이거나, 체크인 체크아웃 둘 다 점유된 경우, 선택 불가\nconst isSelectable=!(isPast||isBeyondLimit||checkinOccupied&&checkoutOccupied||!isCurrentMonth);const effectiveVariant=!isCurrentMonth?\"Invisible\":isSelectedFirst?\"Start\":isSelectedSecond?\"End\":isBetween?\"Middle\":baseVariant;const handleClick=()=>{if(!dayInfoMap||!isSelectable)return;const clickedTime=dateToTime(dateObj);const first=store.firstDate;const second=store.secondDate;const checkOccupiedBetween=(start,end)=>{const startDate=new Date(start.year,start.month,start.day);const endDate=new Date(end.year,end.month,end.day);for(let d=new Date(startDate.getTime()+864e5);d<endDate;d.setDate(d.getDate()+1)){const key=`${d.getFullYear()}-${String(d.getMonth()+1).padStart(2,\"0\")}-${String(d.getDate()).padStart(2,\"0\")}`;const info=dayInfoMap?.get(key);const checkinOcc=info?.checkin?.is_occupied??false;const checkoutOcc=info?.checkout?.is_occupied??false;if(checkinOcc||checkoutOcc)return true;}return false;};// 0. 아무것도 없는 상태에서 선택 -> 입실\nif(!first&&!second){if(checkinOccupied)return;// 입실이 이미 점유된 경우\nsetStore({...store,firstDate:dateObj});return;}// 1. 입실만 선택된 상태에서 동일한 날짜 클릭 -> 입실 해제\nif(first&&!second&&clickedTime===dateToTime(first)){setStore({...store,firstDate:null});return;}// 2. 입실만 선택된 상태에서 과거 클릭 -> 입실 변경\nif(first&&!second&&clickedTime<dateToTime(first)){if(checkinOccupied)return;// 입실이 이미 점유된 경우\nsetStore({...store,firstDate:dateObj});return;}// 3. 입실만 선택된 상태에서 미래 클릭 -> 퇴실 설정\nif(first&&!second&&clickedTime>dateToTime(first)){const start=first;const end=dateObj;if(isExceeding4Nights(start,end)){alert(\"4박 이상 예약은 별도로 문의해주시기 바랍니다.\\n[문의처] 카카오톡 채널(ID: TERENE)\");return;}if(checkOccupiedBetween(start,end))return;setStore({...store,firstDate:start,secondDate:end});return;}// 4. 입실/퇴실 모두 선택된 상태에서 클릭 -> 입실 재설정, 퇴실 해제\nif(first&&second){if(checkinOccupied)return;// 입실이 이미 점유된 경우\nsetStore({...store,firstDate:dateObj,secondDate:null});return;}};return /*#__PURE__*/_jsx(DayComponent,{index:day,variant:effectiveVariant,onClick:isSelectable?handleClick:undefined,isToday:isTodayDate,dayCategory:category},`${week}-${i}`);})});}addPropertyControls(WeekComponent,{week:{type:ControlType.Number,defaultValue:0,min:0,max:5,step:1,title:\"Week\",displayStepper:true},thisMonth:{type:ControlType.Boolean,defaultValue:true,title:\"Left Calendar?\",description:\"Yes = 왼쪽 달력, No = 오른쪽 달력\"},variant:{type:ControlType.Enum,options:[\"Default\",\"Mobile\"],optionTitles:[\"Default (350px)\",\"Mobile (300px)\"],defaultValue:\"Default\",title:\"Variant\"}});\nexport const __FramerMetadata__ = {\"exports\":{\"WeekComponent\":{\"type\":\"reactComponent\",\"name\":\"WeekComponent\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\"}},\"isReservationPairValid\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"isBeyondReservationLimit\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}","import{jsx as _jsx}from\"react/jsx-runtime\";import{useEffect,useState}from\"react\";import{createStore}from\"https://framer.com/m/framer/store.js@^1.0.0\";import*as React from\"react\";import{useStore}from\"https://framerusercontent.com/modules/pIGEMps6hXhOvo2SMFcy/tp3nWYy82sKTo2bHVS2f/MonthDisplay.js\";import{isReservationPairValid}from\"https://framerusercontent.com/modules/jJ3DlGzy4thdVVHgfkA6/JVZ1xHozrTvuJE5yCyxo/WeekComponent.js\";function getKSTDate(baseDate=new Date){const utc=baseDate.getTime()+baseDate.getTimezoneOffset()*6e4;return new Date(utc+9*60*60*1e3);}function getKSTISOString(date=new Date){const kstDate=getKSTDate(date);const pad=n=>String(n).padStart(2,\"0\");const year=kstDate.getFullYear();const month=pad(kstDate.getMonth()+1);const day=pad(kstDate.getDate());const hours=pad(kstDate.getHours());const minutes=pad(kstDate.getMinutes());const seconds=pad(kstDate.getSeconds());return`${year}-${month}-${day}T${hours}:${minutes}:${seconds}+09:00`;}const useAuthStore=createStore({temp_id:null,temp_password:null,checkedPermanentLogin:false});export function formatDate({year,month,day}){const paddedMonth=String(month+1).padStart(2,\"0\")// month는 0-based\n;const paddedDay=String(day).padStart(2,\"0\");return`${year}-${paddedMonth}-${paddedDay}`;}export function parseDate(dateStr){const[yearStr,monthStr,dayStr]=dateStr.split(\"-\");const year=parseInt(yearStr);const month=parseInt(monthStr)-1// zero-based\n;const day=parseInt(dayStr);if(isNaN(year)||isNaN(month)||isNaN(day))return null;return{year,month,day};}function safeParseDate(input){const date=new Date(input);return isNaN(date.getTime())?null:date;}export function toggleID(Component){return props=>{const[store,setStore]=useAuthStore();const handleChange=event=>{const inputValue=event.target.value;setStore({temp_id:inputValue});};return /*#__PURE__*/_jsx(Component,{...props,onChange:handleChange});};}export function togglePassword(Component){return props=>{const[store,setStore]=useAuthStore();const handleChange=event=>{const inputValue=event.target.value;setStore({temp_password:inputValue});};return /*#__PURE__*/_jsx(Component,{...props,type:\"password\",onChange:handleChange});};}export function togglePermanentLogin(Component){return props=>{const[store,setStore]=useAuthStore();const toggle=()=>{setStore({checkedPermanentLogin:!store.checkedPermanentLogin});};return /*#__PURE__*/_jsx(Component,{...props,onClick:toggle});};}export function safeRequestLogin(Component){return props=>{const[authStore]=useAuthStore();const[_,setStore]=useStore();const handleClick=async()=>{try{// 1. 로그인 요청\nconst loginRes=await fetch(\"https://terene-notifier-server.onrender.com/api/auth/login\",{method:\"POST\",headers:{\"Content-Type\":\"application/json\"},credentials:\"include\",body:JSON.stringify({id:authStore.temp_id,password:authStore.temp_password,mode:authStore.checkedPermanentLogin?\"permanent\":\"temporary\"})});if(!loginRes.ok){alert(\"로그인 실패: 아이디 또는 비밀번호가 틀렸습니다.\");return;}// 2. 로그인 성공 후 유저 정보 가져오기\nconst meRes=await fetch(\"https://terene-notifier-server.onrender.com/api/auth/me\",{credentials:\"include\"});if(!meRes.ok){alert(\"로그인 상태 확인 실패\");return;}const user=await meRes.json();// 3. store에 회원 정보 저장\nsetStore({membership_number:user.membership_number,name:user.name,birthdate:user.birthdate,phone:user.phone,email:user.email,membership:user.membership});// 비밀번호 변경 필요 시\nif(user.remarks?.includes(\"temp_password\")){window.location.href=\"/change-password\";return;}// 4. 관리자 or 일반회원 분기\nif(user.membership_number===\"A-00000001\"){window.location.href=\"/checkreserve-admin\";}else{window.location.href=\"/member-page-회원정보\";}}catch(err){console.error(\"로그인 에러:\",err);alert(\"로그인 요청 중 오류가 발생했습니다.\");}};return /*#__PURE__*/_jsx(Component,{...props,onClick:handleClick});};}export function safeRequestReservation(Component){return props=>{const[authStore]=useAuthStore();const[_,setStore]=useStore();const handleClick=async()=>{try{// 1. 로그인 요청\nconst loginRes=await fetch(\"https://terene-notifier-server.onrender.com/api/auth/login\",{method:\"POST\",headers:{\"Content-Type\":\"application/json\"},credentials:\"include\",body:JSON.stringify({id:authStore.temp_id,password:authStore.temp_password,mode:authStore.checkedPermanentLogin?\"permanent\":\"temporary\"})});if(!loginRes.ok){alert(\"로그인 실패: 아이디 또는 비밀번호가 틀렸습니다.\");return;}// 2. 로그인 성공 후 유저 정보 가져오기\nconst meRes=await fetch(\"https://terene-notifier-server.onrender.com/api/auth/me\",{credentials:\"include\"});if(!meRes.ok){alert(\"로그인 상태 확인 실패\");return;}const user=await meRes.json();// 3. store에 회원 정보 저장\nsetStore({membership_number:user.membership_number,name:user.name,birthdate:user.birthdate,phone:user.phone,email:user.email,membership:user.membership});// 비밀번호 변경 필요 시\nif(user.remarks?.includes(\"temp_password\")){window.location.href=\"/change-password\";return;}// 4. 관리자 or 일반회원 분기\nif(user.membership_number===\"A-00000001\"){window.location.href=\"/reservation-2-admin\";}else{window.location.href=\"/reservation-2\";}}catch(err){console.error(\"로그인 에러:\",err);alert(\"로그인 요청 중 오류가 발생했습니다.\");}};return /*#__PURE__*/_jsx(Component,{...props,onClick:handleClick});};}export function safeKeepMemberLogin(Component){return props=>{const[store,setStore]=useStore();useEffect(()=>{const fetchUser=async()=>{try{const res=await fetch(\"https://terene-notifier-server.onrender.com/api/auth/me\",{credentials:\"include\"});if(!res.ok)throw new Error(\"인증 실패\");const user=await res.json();// 비밀번호 변경 필요 시\nif(user.remarks?.includes(\"temp_password\")){window.location.href=\"/change-password\";return;}if(user.membership_number===\"A-00000001\"){window.location.href=\"/checkreserve-admin\";}else{window.location.href=\"/member-page-회원정보\";}}catch(e){}};fetchUser();},[]);return /*#__PURE__*/_jsx(Component,{...props});};}export function safeKeep1Login(Component){return props=>{const[store,setStore]=useStore();useEffect(()=>{const fetchUser=async()=>{try{const res=await fetch(\"https://terene-notifier-server.onrender.com/api/auth/me\",{credentials:\"include\"});if(!res.ok)throw new Error(\"인증 실패\");const user=await res.json();// 비밀번호 변경 필요 시\nif(user.remarks?.includes(\"temp_password\")){window.location.href=\"/change-password\";return;}if(user.membership_number===\"A-00000001\"){window.location.href=\"/reservation-2-admin\";}else{window.location.href=\"/reservation-2\";}}catch(e){}};fetchUser();},[]);return /*#__PURE__*/_jsx(Component,{...props});};}export function safeKeep2Login(Component){return props=>{const[store,setStore]=useStore();useEffect(()=>{const fetchUser=async()=>{try{const res=await fetch(\"https://terene-notifier-server.onrender.com/api/auth/me\",{credentials:\"include\"});// if (!res.ok) throw new Error(\"인증 실패\")\nif(res.ok){const user=await res.json();setStore({membership_number:user.membership_number,membership:user.membership,remarks:user.remarks??\"\"});}}catch(e){alert(\"로그인 정보가 확인되지 않았습니다.\");window.location.href=\"/login\";}};fetchUser();},[]);return /*#__PURE__*/_jsx(Component,{...props});};}export function safe2to3(Component){return props=>{const[store]=useStore();const handleClick=async()=>{const firstDate=store.firstDate;const secondDate=store.secondDate;if(!firstDate||!secondDate){alert(\"일정을 선택해주세요\");return;}const format=({year,month,day})=>`${year}-${String(month+1).padStart(2,\"0\")}-${String(day).padStart(2,\"0\")}`;const first=format(firstDate);const second=format(secondDate);const baseUrl=\"/reservation-3\";const params=new URLSearchParams;params.set(\"first\",first);params.set(\"second\",second);window.location.href=`${baseUrl}?${params.toString()}`;};return /*#__PURE__*/_jsx(Component,{...props,onClick:handleClick});};}export function safeKeep3Login(Component){return props=>{const[store,setStore]=useStore();useEffect(()=>{const run=async()=>{try{const query=new URLSearchParams(window.location.search);const first=query.get(\"first\");const second=query.get(\"second\");const firstDate=first?parseDate(first):null;const secondDate=second?parseDate(second):null;if(!firstDate||!secondDate){alert(\"날짜 정보가 누락되었습니다. 다시 시도해주세요.\");window.location.href=\"/login\";return;}const userRes=await fetch(\"https://terene-notifier-server.onrender.com/api/auth/me\",{credentials:\"include\"});// if (!userRes.ok) throw new Error(\"Unauthorized\")\nconst user=await userRes.json();const dayRes=await fetch(\"https://terene-db-server.onrender.com/api/days\");const dayData=await dayRes.json();const dayInfoMap=new Map;dayData.forEach(item=>{dayInfoMap.set(item.date,{isHoliday:item.is_holiday,checkin:item.checkin,checkout:item.checkout});});const today=getKSTDate();today.setHours(0,0,0,0);const firstTime=new Date(firstDate.year,firstDate.month,firstDate.day);const secondTime=new Date(secondDate.year,secondDate.month,secondDate.day);const diffDays=Math.abs((secondTime.getTime()-firstTime.getTime())/(1e3*60*60*24));if(diffDays>=4||firstTime<today){alert(\"잘못된 예약 날짜입니다.\");window.location.href=\"/login\";return;}const dateToStr=d=>`${d.year}-${String(d.month+1).padStart(2,\"0\")}-${String(d.day).padStart(2,\"0\")}`;const firstStr=dateToStr(firstDate);const secondStr=dateToStr(secondDate);if(dayInfoMap.get(firstStr)?.checkin?.is_occupied||dayInfoMap.get(secondStr)?.checkout?.is_occupied){alert(\"해당 날짜는 이미 예약되어 있습니다.\");window.location.href=\"/login\";return;}for(let d=new Date(firstTime.getTime()+864e5);d<secondTime;d.setDate(d.getDate()+1)){const midStr=`${d.getFullYear()}-${String(d.getMonth()+1).padStart(2,\"0\")}-${String(d.getDate()).padStart(2,\"0\")}`;const info=dayInfoMap.get(midStr);if(info?.checkin?.is_occupied||info?.checkout?.is_occupied){alert(\"중간 날짜 중 이미 예약된 날이 있습니다.\");window.location.href=\"/login\";return;}}const membership=user.membership??\"Non-Member\";if(!isReservationPairValid(today,firstTime,secondTime,membership)){alert(\"회원 등급에 맞지 않는 예약 기간입니다.\");window.location.href=\"/login\";return;}setStore({membership_number:user.membership_number,membership:user.membership,name:user.name,birthdate:user.birthdate,phone:user.phone,email:user.email,remarks:user.remarks,ownedMileage:Number(user.owned_mileage),expiredCoupons:user.used_coupons});}catch(err){alert(\"인증 정보 또는 날짜 오류가 발생했습니다.\");window.location.href=\"/login\";}};run();},[]);return /*#__PURE__*/_jsx(Component,{...props});};}export function getMemberInfo(Component){return props=>{const[store,setStore]=useStore();const[name,setName]=React.useState(\"\");React.useEffect(()=>{const fetchName=async()=>{try{const res=await fetch(\"https://terene-notifier-server.onrender.com/api/auth/me\",{credentials:\"include\"});if(!res.ok)throw new Error(\"인증 실패\");const user=await res.json();if(user.membership_number==\"A-00000001\"){window.location.href=\"/checkreserve-admin\";}setStore({...store,membership_number:user.membership_number,name:user.name,phone:user.phone,email:user.email,membership:user.membership});setName(user.name);}catch(e){alert(\"로그인이 만료되었거나 인증에 실패했습니다.\");window.location.href=\"/login\";}};fetchName();},[]);return /*#__PURE__*/_jsx(Component,{...props});};}export function getMembership(Component){return props=>{const[store]=useStore();return /*#__PURE__*/_jsx(Component,{...props,text:store.membership});};}export function getMemberName(Component){return props=>{const[store]=useStore();return /*#__PURE__*/_jsx(Component,{...props,text:`${store.name} 님,\n환영합니다.`});};}export function logoutButton(Component){return props=>{const[_,setStore]=useStore();const handleClick=async()=>{try{// 1. 서버에 로그아웃 요청\nawait fetch(\"https://terene-notifier-server.onrender.com/api/auth/logout\",{method:\"POST\",credentials:\"include\"});// 2. 클라이언트 상태 초기화\nsetStore({membership_number:null,membership:null,name:null,phone:null,email:null,ownedMileage:null,expiredCoupons:null,remarks:null});// 3. 로그인 페이지로 이동\nwindow.location.href=\"/login\";}catch(err){console.error(\"로그아웃 실패:\",err);alert(\"로그아웃 중 오류가 발생했습니다.\");}};return /*#__PURE__*/_jsx(Component,{...props,onClick:handleClick});};}export function getTotalMileage(Component){return props=>{const[store]=useStore();const[total,setTotal]=React.useState(0);React.useEffect(()=>{const fetchMileage=async()=>{if(!store.membership_number)return;try{const res=await fetch(\"https://terene-db-server.onrender.com/api/v2/mileages\");if(!res.ok)throw new Error(\"Failed to fetch mileages\");const data=await res.json();const userMileage=data.filter(m=>m.membership_number===store.membership_number);const totalAmount=userMileage.reduce((sum,entry)=>sum+Number(entry.mileage_amount||0),0);setTotal(totalAmount);}catch(e){console.error(\"마일리지 데이터 로딩 실패:\",e);setTotal(0);}};fetchMileage();},[store.membership_number]);return /*#__PURE__*/_jsx(Component,{...props,text:`${total.toLocaleString()}`});};}export function getAvailableCouponCount(Component){return props=>{const[store]=useStore();const[count,setCount]=React.useState(0);React.useEffect(()=>{const fetchCoupons=async()=>{if(!store.membership_number)return;try{const res=await fetch(\"https://terene-db-server.onrender.com/api/v2/coupon-instances\");if(!res.ok)throw new Error(\"쿠폰 조회 실패\");const data=await res.json();const availableCoupons=data.filter(coupon=>coupon.membership_number===store.membership_number&&coupon.status===\"available\");setCount(availableCoupons.length);}catch(e){console.error(\"쿠폰 불러오기 실패:\",e);setCount(0);}};fetchCoupons();},[store.membership_number]);return /*#__PURE__*/_jsx(Component,{...props,text:`${count}개`});};}export function adminKeep2Login(Component){return props=>{const[store,setStore]=useStore();useEffect(()=>{const fetchUser=async()=>{try{const res=await fetch(\"https://terene-notifier-server.onrender.com/api/auth/me\",{credentials:\"include\"});if(!res.ok)throw new Error(\"인증 실패\");const user=await res.json();if(user.membership_number!==\"A-00000001\"){alert(\"관리자만이 이 페이지에서 예약할 수 있습니다.\");window.location.href=\"/login\";return;}else{setStore({membership:\"TERENE 24\"});}}catch(e){alert(\"로그인 정보가 확인되지 않았습니다.\");window.location.href=\"/login\";}};fetchUser();},[]);return /*#__PURE__*/_jsx(Component,{...props});};}export function admin2to3(Component){return props=>{const[authStore]=useAuthStore();const[store]=useStore();const handleClick=async()=>{const queryParams=new URLSearchParams(window.location.search);const encodedMembershipNumber=queryParams.get(\"mn\");const decoded=atob(encodedMembershipNumber);const firstDate=store.firstDate;const secondDate=store.secondDate;// first와 second 값이 둘 다 있어야만 URL에 추가하도록 조건을 설정\nif(!firstDate||!secondDate){alert(\"일정을 선택해주세요\");return;}const first=formatDate(firstDate);const second=formatDate(secondDate);const baseUrl=\"/reservation-3-admin\";const params=new URLSearchParams;//////////////////////////////\nif(encodedMembershipNumber){params.set(\"mn\",encodedMembershipNumber);}params.set(\"first\",first);params.set(\"second\",second);window.location.href=`${baseUrl}?${params.toString()}`;return;};return /*#__PURE__*/_jsx(Component,{...props,onClick:handleClick});};}export function adminKeep3Login(Component){return props=>{const[decodedMembershipNumber,setDecodedMembershipNumber]=useState(null);const[store,setStore]=useStore();useEffect(()=>{const fetchUser=async()=>{try{const res=await fetch(\"https://terene-notifier-server.onrender.com/api/auth/me\",{credentials:\"include\"});if(!res.ok)throw new Error(\"인증 실패\");const user=await res.json();if(user.membership_number!==\"A-00000001\"){alert(\"관리자만이 이 페이지에서 예약할 수 있습니다.\");window.location.href=\"/login\";return;}}catch(e){alert(\"로그인 정보가 확인되지 않았습니다.\");window.location.href=\"/login\";}};const verifyMembershipNumber=async()=>{const queryParams=new URLSearchParams(window.location.search);const encodedMembershipNumber=queryParams.get(\"mn\");const first=queryParams.get(\"first\");const second=queryParams.get(\"second\");const firstDate=first?parseDate(first):null;const secondDate=second?parseDate(second):null;if(!firstDate||!secondDate){alert(\"날짜가 선택되지 않은 채로 넘어와 오류가 발생했습니다. 로그인 화면으로 돌아갑니다.\");window.location.href=`/reservation-1`;return;}try{const decoded=atob(encodedMembershipNumber);// 고객 정보 가져오기\nconst response=await fetch(\"https://terene-db-server.onrender.com/api/customers\");const data=await response.json();const matchedUser=data.find(user=>user.membership_number===decoded);// 날짜 점유 정보 가져오기\nconst dayRes=await fetch(\"https://terene-db-server.onrender.com/api/days\");const dayData=await dayRes.json();const dayInfoMap=new Map;dayData.forEach(item=>{dayInfoMap.set(item.date,{isHoliday:item.is_holiday,checkin:item.checkin,checkout:item.checkout});});const dateToString=({year,month,day})=>`${year}-${String(month+1).padStart(2,\"0\")}-${String(day).padStart(2,\"0\")}`;const dateToTime=({year,month,day})=>new Date(year,month,day).getTime();const today=getKSTDate();today.setHours(0,0,0,0);const firstTime=new Date(firstDate.year,firstDate.month,firstDate.day);const secondTime=new Date(secondDate.year,secondDate.month,secondDate.day);const diffDays=Math.abs((secondTime.getTime()-firstTime.getTime())/(1e3*60*60*24));if(diffDays>=4){alert(\"예약이 불가능한 날짜가 선택된 채로 넘어왔습니다. 오류가 발생하여 로그인 화면으로 돌아갑니다.\");window.location.href=\"/reservation-1\";return;}if(firstTime.getTime()<today.getTime()){alert(\"예약이 불가능한 날짜가 선택된 채로 넘어왔습니다. 오류가 발생하여 로그인 화면으로 돌아갑니다.\");window.location.href=\"/reservation-1\";return;}const firstStr=dateToString(firstDate);const secondStr=dateToString(secondDate);const firstInfo=dayInfoMap.get(firstStr);const secondInfo=dayInfoMap.get(secondStr);if(firstInfo?.checkin?.is_occupied){alert(\"예약이 불가능한 날짜가 선택된 채로 넘어왔습니다. 오류가 발생하여 로그인 화면으로 돌아갑니다.\");window.location.href=\"/reservation-1\";return;}if(secondInfo?.checkout?.is_occupied){alert(\"예약이 불가능한 날짜가 선택된 채로 넘어왔습니다. 오류가 발생하여 로그인 화면으로 돌아갑니다.\");window.location.href=\"/reservation-1\";return;}// 사이 날짜 점유 여부 확인\nfor(let d=new Date(firstTime.getTime()+864e5);d<secondTime;d.setDate(d.getDate()+1)){const key=`${d.getFullYear()}-${String(d.getMonth()+1).padStart(2,\"0\")}-${String(d.getDate()).padStart(2,\"0\")}`;const info=dayInfoMap.get(key);if(info?.checkin?.is_occupied||info?.checkout?.is_occupied){alert(\"예약이 불가능한 날짜가 선택된 채로 넘어왔습니다. 오류가 발생하여 로그인 화면으로 돌아갑니다.\");window.location.href=\"/reservation-1\";return;}}if(matchedUser){const membership=matchedUser.membership_grade;if(!isReservationPairValid(today,firstTime,secondTime,membership)){alert(\"예약이 불가능한 날짜가 선택된 채로 넘어왔습니다. 오류가 발생하여 로그인 화면으로 돌아갑니다.\");window.location.href=\"/reservation-1\";return;}setStore({membership_number:matchedUser.membership_number,name:matchedUser.name_kor,birthdate:matchedUser.birthdate,phone:matchedUser.phone,email:matchedUser.email,membership:matchedUser.membership_grade,remarks:matchedUser.remarks,ownedMileage:Number(matchedUser.owned_mileage),expiredCoupons:matchedUser.used_coupons});}else{if(encodedMembershipNumber){alert(\"회원 정보가 데이터베이스에서 확인되지 않았습니다. 오류가 발생하여 로그인 화면으로 돌아갑니다.\");window.location.href=\"/reservation-1\";return;}else{const membership=\"Non-Member\";if(!isReservationPairValid(today,firstTime,secondTime,membership)){alert(\"예약이 불가능한 날짜가 선택된 채로 넘어왔습니다. 오류가 발생하여 로그인 화면으로 돌아갑니다.\");window.location.href=\"/reservation-1\";return;}setStore({// firstDate: null,\n// secondDate: null,\nmembership_number:null,membership:\"Non-Member\"});}}}catch(error){if(encodedMembershipNumber){alert(\"회원 정보가 데이터베이스에서 확인되지 않았습니다. 오류가 발생하여 로그인 화면으로 돌아갑니다.\");window.location.href=\"/reservation-1\";return;}else{alert(\"데이터베이스에서 일시적인 오류가 발생하여 로그인 화면으로 돌아갑니다.\");window.location.href=\"/reservation-1\";return;setStore({// firstDate: firstDate,\n// secondDate: secondDate,\nmembership_number:null,membership:\"Non-Member\"});}}};verifyMembershipNumber();},[]);const isLoggedIn=!!decodedMembershipNumber;return /*#__PURE__*/_jsx(Component,{...props});};}\nexport const __FramerMetadata__ = {\"exports\":{\"formatDate\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"parseDate\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"logoutButton\":{\"type\":\"reactHoc\",\"name\":\"logoutButton\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"adminKeep2Login\":{\"type\":\"reactHoc\",\"name\":\"adminKeep2Login\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"safeRequestReservation\":{\"type\":\"reactHoc\",\"name\":\"safeRequestReservation\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"safeKeep2Login\":{\"type\":\"reactHoc\",\"name\":\"safeKeep2Login\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"adminKeep3Login\":{\"type\":\"reactHoc\",\"name\":\"adminKeep3Login\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"toggleID\":{\"type\":\"reactHoc\",\"name\":\"toggleID\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"getAvailableCouponCount\":{\"type\":\"reactHoc\",\"name\":\"getAvailableCouponCount\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"getMembership\":{\"type\":\"reactHoc\",\"name\":\"getMembership\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"togglePermanentLogin\":{\"type\":\"reactHoc\",\"name\":\"togglePermanentLogin\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"safe2to3\":{\"type\":\"reactHoc\",\"name\":\"safe2to3\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"togglePassword\":{\"type\":\"reactHoc\",\"name\":\"togglePassword\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"getTotalMileage\":{\"type\":\"reactHoc\",\"name\":\"getTotalMileage\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"safeKeep1Login\":{\"type\":\"reactHoc\",\"name\":\"safeKeep1Login\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"getMemberInfo\":{\"type\":\"reactHoc\",\"name\":\"getMemberInfo\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"getMemberName\":{\"type\":\"reactHoc\",\"name\":\"getMemberName\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"admin2to3\":{\"type\":\"reactHoc\",\"name\":\"admin2to3\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"safeKeep3Login\":{\"type\":\"reactHoc\",\"name\":\"safeKeep3Login\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"safeKeepMemberLogin\":{\"type\":\"reactHoc\",\"name\":\"safeKeepMemberLogin\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"safeRequestLogin\":{\"type\":\"reactHoc\",\"name\":\"safeRequestLogin\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}"],"mappings":"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"}