{"version":3,"file":"Password.ByfR-Bit.mjs","names":["useState"],"sources":["https:/framerusercontent.com/modules/H9jQJaLy8SDDKv25Lfyp/yAbM7ZcXK7r1CBrD5lUs/Password.js"],"sourcesContent":["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\";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 usePasswordStore=createStore({is_personal:true,membership_number:null,name_kor:null,birthdate:null,email:null,tempPassword:null,newPassword:null,newPasswordAgain:null});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 toggleMembershipNumber(Component){return props=>{const[store,setStore]=usePasswordStore();const handleChange=event=>{const inputValue=event.target.value;setStore({membership_number:inputValue});};return /*#__PURE__*/_jsx(Component,{...props,onChange:handleChange});};}export function toggleName(Component){return props=>{const[store,setStore]=usePasswordStore();const handleChange=event=>{const inputValue=event.target.value;setStore({name_kor:inputValue});};return /*#__PURE__*/_jsx(Component,{...props,onChange:handleChange});};}export function toggleBirthdate(Component){return props=>{const[store,setStore]=usePasswordStore();const handleChange=event=>{const inputValue=event.target.value;setStore({birthdate:inputValue});};return /*#__PURE__*/_jsx(Component,{...props,onChange:handleChange});};}export function toggleEmail(Component){return props=>{const[store,setStore]=usePasswordStore();const handleChange=event=>{const inputValue=event.target.value;setStore({email:inputValue});};return /*#__PURE__*/_jsx(Component,{...props,onChange:handleChange});};}export function toggleTempPassword(Component){return props=>{const[store,setStore]=usePasswordStore();const handleChange=event=>{const inputValue=event.target.value;setStore({tempPassword:inputValue});};return /*#__PURE__*/_jsx(Component,{...props,onChange:handleChange});};}export function toggleNewPassword(Component){return props=>{const[store,setStore]=usePasswordStore();const handleChange=event=>{const inputValue=event.target.value;setStore({newPassword:inputValue});};return /*#__PURE__*/_jsx(Component,{...props,onChange:handleChange});};}export function toggleNewPasswordAgain(Component){return props=>{const[store,setStore]=usePasswordStore();const handleChange=event=>{const inputValue=event.target.value;setStore({newPasswordAgain:inputValue});};return /*#__PURE__*/_jsx(Component,{...props,onChange:handleChange});};}function generateTempPassword(){const chars=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";let result=\"\";for(let i=0;i<6;i++){result+=chars.charAt(Math.floor(Math.random()*chars.length));}return result;}export function requestResetEmail(Component){return props=>{const[store]=usePasswordStore();const handleClick=async()=>{try{if(!store.membership_number||!store.email){alert(\"입력되지 않은 정보가 있습니다.\");return;}// me-only logic\nconst token=localStorage.getItem(\"token\");if(!token)throw new Error(\"토큰 없음\");const res=await fetch(\"https://terene-notifier-server.onrender.com/api/auth/me\",{headers:{Authorization:`Bearer ${token}`}});if(!res.ok)throw new Error(\"인증 실패\");const user=await res.json();const customerRes=await fetch(`https://terene-db-server.onrender.com/api/v2/customers/${store.membership_number}`);if(!customerRes.ok)throw new Error(\"고객 전체 조회 실패\");const customerList=await customerRes.json();console.log(JSON.stringify(customerList));const matchedCustomer=customerList.membership_number===user.membership_number?customerList:null;if(!matchedCustomer){alert(\"인증 실패: 회원 정보 없음\");return;}// 이메일 도메인 버그 있음\n// const fullEmail = store.emailDomain\n//     ? `${store.email?.split(\"@\")[0]}${store.emailDomain}`\n//     : store.email\nconst fullEmail=store.email;const normalize=str=>str?.replace(/[\\s\\-./]/g,\"\").toLowerCase().trim();const match=normalize(store.membership_number)===normalize(matchedCustomer.membership_number)&&// fullEmail === matchedCustomer.email\nnormalize(store.email)===normalize(matchedCustomer.email);if(match){// 임시 비밀번호 생성\nconst tempPassword=generateTempPassword();const htmlTemplate=`\n<div style=\"background-color: #ffffff; color: #000000; font-family: 'Pretendard', sans-serif; padding: 40px; max-width: 600px; margin: auto;\">\n  <div style=\"text-align: center;\">\n    <h2 style=\"margin: 0; font-weight: normal;\">T E R E N E</h2>\n  </div>\n\n  <h3 style=\"margin-top: 40px; font-size: 13px; font-weight: 700; letter-spacing: 0.1em; line-height: 1.6em;\">임시 비밀번호 발급 안내</h3>\n\n  <p style=\"font-size: 13px; font-weight: 400; letter-spacing: 0.1em; line-height: 1.6em;\">\n    안녕하세요. 테레네입니다.<br>\n    테레네를 방문해주셔서 감사드립니다.\n  </p>\n\n  <p style=\"font-size: 13px; font-weight: 400; letter-spacing: 0.1em; line-height: 1.6em;\">\n    <strong>${matchedCustomer.name_kor}</strong> 님의 TERENE 회원 계정 임시 비밀번호는<br>\n    <strong style=\"font-weight: 700;\">${tempPassword}</strong> 입니다.\n  </p>\n\n  <p style=\"font-size: 13px; font-weight: 400; letter-spacing: 0.1em; line-height: 1.6em;\">\n    발급된 임시 비밀번호로 <a href=\"https://terene.kr\" style=\"color: #000000; text-decoration: underline;\">TERENE 홈페이지</a>에 로그인하신 뒤<br>\n    새로운 비밀번호로 변경 후 이용해 주세요.\n  </p>\n\n  <p style=\"font-size: 13px; font-weight: 400; letter-spacing: 0.1em; line-height: 1.6em;\">\n    감사합니다,<br>\n    <strong>TERENE team</strong>\n  </p>\n\n  <hr style=\"margin: 40px 0; border: none; border-top: 1px solid #ccc;\">\n\n  <footer style=\"font-size: 11px; letter-spacing: 0.1em; line-height: 1.3em; color: #666666;\">\n    주식회사 바드건축사사무소<br>\n    서울특별시 마포구 독막로15길 3-13, 5층<br>\n    사업자등록번호 463-88-02624<br>\n    \\xa9 Copyright 2025 VAADD ARCHITECTS\n  </footer>\n</div>\n`;const fallbackText=`\nT E R E N E\n\n임시 비밀번호 발급 안내\n\n안녕하세요. 테레네입니다.\n테레네를 방문해주셔서 감사드립니다.\n\n${matchedCustomer.name_kor} 님의 TERENE 회원 계정 임시 비밀번호는\n${tempPassword} 입니다.\n\n발급된 임시 비밀번호로 TERENE 홈페이지 (https://terene.kr)에 로그인하신 뒤\n새로운 비밀번호로 변경 후 이용해 주세요.\n\n감사합니다,\nTERENE team\n\n----------------------------\n\n주식회사 바드건축사사무소\n서울특별시 마포구 독막로15길 3-13, 5층\n사업자등록번호 463-88-02624\n\\xa9 Copyright 2025 VAADD ARCHITECTS\n`;try{const response=await fetch(\"https://terene-notifier-server.onrender.com/api/email\",{method:\"POST\",headers:{\"Content-Type\":\"application/json\"},body:JSON.stringify({platform:\"gmail\",receiver_email:matchedCustomer.email,email_title:\"임시 비밀번호 발급 안내\",email_message:fallbackText,email_html:htmlTemplate})});if(!response.ok){const errRes=await response.json();console.error(\"이메일 전송 실패:\",errRes);}else{// 비밀번호 포함 새 customer 객체 생성\nconst updatedCustomer={...matchedCustomer,password:tempPassword,remarks:[...matchedCustomer.remarks||[],\"temp_password\"]};const updateRes=await fetch(`https://terene-db-server.onrender.com/api/v2/customers/${matchedCustomer.membership_number}`,{method:\"PUT\",headers:{\"Content-Type\":\"application/json\"},body:JSON.stringify(updatedCustomer)});if(!updateRes.ok){const errorText=await updateRes.text();console.error(\"🚨 회원 정보 업데이트 실패. 서버 응답:\",errorText);throw new Error(\"회원 정보 업데이트 실패\");}alert(`${fullEmail}로 임시 비밀번호를 전송하였습니다.`);window.location.href=\"/find-password-send\";}}catch(emailError){console.error(\"❌ 이메일/DB 요청 중 오류 발생:\",emailError);alert(\"이메일 전송 중 오류가 발생했습니다.\");}}else{alert(\"회원 정보가 잘못되었습니다. 다시 한번 확인해주세요\");}}catch(error){console.error(error);alert(\"회원 정보가 잘못되었습니다. 다시 한번 확인해주세요\");}};return /*#__PURE__*/_jsx(Component,{...props,onClick:handleClick});};}export function fetchBeforeLogout(Component){return props=>{const[message,setMessage]=useState(\"\");useEffect(()=>{const fetchAndLogout=async()=>{try{// me-only logic\nconst token=localStorage.getItem(\"token\");if(!token)throw new Error(\"토큰 없음\");const res=await fetch(\"https://terene-notifier-server.onrender.com/api/auth/me\",{headers:{Authorization:`Bearer ${token}`}});if(!res.ok)throw new Error(\"인증 실패\");const user=await res.json();const name=user.name_kor||user.name||\"회원\";const email=user.email||\"등록된 이메일\";setMessage(`${name} 회원님, 임시 비밀번호를\n${email}으로 보내드렸습니다.`);// logout logic\n// 1. (선택적으로) 서버에 로그아웃 요청\nawait fetch(\"https://terene-notifier-server.onrender.com/api/auth/logout\",{method:\"POST\"});// 2. 로컬스토리지에서 토큰 삭제\nlocalStorage.removeItem(\"token\");}catch(e){console.error(\"로그아웃 또는 사용자 정보 가져오기 실패\",e);window.location.href=\"/login\";}};fetchAndLogout();},[]);return /*#__PURE__*/_jsx(Component,{...props,text:message});};}export function showMembershipNumber(Component){return props=>{const[membershipNumber,setMembershipNumber]=useState(\"\");useEffect(()=>{const fetchMembershipNumber=async()=>{try{// me-only logic\nconst token=localStorage.getItem(\"token\");if(!token)throw new Error(\"토큰 없음\");const res=await fetch(\"https://terene-notifier-server.onrender.com/api/auth/me\",{headers:{Authorization:`Bearer ${token}`}});if(!res.ok)throw new Error(\"인증 실패\");const user=await res.json();setMembershipNumber(user.membership_number);}catch(e){alert(\"로그인 요청 중 오류가 발생했습니다.\");}};fetchMembershipNumber();},[]);return /*#__PURE__*/_jsx(Component,{...props,text:membershipNumber});};}export function changePasswordWithValidation(Component){return props=>{const[store]=usePasswordStore();function isValidPassword(password){const lengthCheck=/^.{8,16}$/.test(password);const hasLower=/[a-z]/.test(password);const hasUpper=/[A-Z]/.test(password);const hasNumber=/[0-9]/.test(password);const hasSpecial=/[^A-Za-z0-9]/.test(password);// 조건: 위 요소 중 2개 이상 조합\nconst typesCount=[hasLower,hasUpper,hasNumber,hasSpecial].filter(Boolean).length;return lengthCheck&&typesCount>=2;}const handleClick=async()=>{try{// 1. 인증된 사용자 정보 가져오기\n// me-only logic\nconst token=localStorage.getItem(\"token\");if(!token)throw new Error(\"토큰 없음\");const res=await fetch(\"https://terene-notifier-server.onrender.com/api/auth/me\",{headers:{Authorization:`Bearer ${token}`}});if(!res.ok)throw new Error(\"인증 실패\");const user=await res.json();const membershipNumber=user.membership_number;// 2. 전체 고객 리스트 가져오기\nconst customerRes=await fetch(`https://terene-db-server.onrender.com/api/v2/customers`);if(!customerRes.ok)throw new Error(\"고객 전체 정보 불러오기 실패\");const customerList=await customerRes.json();const matchedCustomer=customerList.find(c=>c.membership_number===membershipNumber);if(!matchedCustomer){alert(\"회원 정보가 존재하지 않습니다.\");return;}// 3. 비밀번호 및 조건 확인\nif(store.tempPassword!==matchedCustomer.password||store.newPassword!==store.newPasswordAgain){alert(\"입력된 임시 비밀번호가 올바르지 않거나, 새 비밀번호가 일치하지 않습니다.\");return;}if(!isValidPassword(store.newPassword)){alert(\"새 비밀번호는 영문 대소문자, 숫자, 특수문자 중 2가지 이상 조합으로 8~16자여야 합니다.\");return;}// 4. remarks에서 temp_password 제거\nconst updatedRemarks=(matchedCustomer.remarks||[]).filter(remark=>remark!==\"temp_password\");// 5. 사용자 정보 업데이트\nconst updatedCustomer={...matchedCustomer,password:store.newPassword,remarks:updatedRemarks};const updateRes=await fetch(`https://terene-db-server.onrender.com/api/v2/customers/${membershipNumber}`,{method:\"PUT\",headers:{\"Content-Type\":\"application/json\"},body:JSON.stringify(updatedCustomer)});if(!updateRes.ok)throw new Error(\"비밀번호 업데이트 실패\");// logout logic\n// 1. (선택적으로) 서버에 로그아웃 요청\nawait fetch(\"https://terene-notifier-server.onrender.com/api/auth/logout\",{method:\"POST\"});// 2. 로컬스토리지에서 토큰 삭제\nlocalStorage.removeItem(\"token\");alert(\"비밀번호가 성공적으로 변경되었습니다.\");window.location.href=\"/login\";return;}catch(err){console.error(\"비밀번호 변경 오류:\",err);alert(\"비밀번호 변경 중 오류가 발생했습니다.\");}};return /*#__PURE__*/_jsx(Component,{...props,onClick:handleClick});};}\nexport const __FramerMetadata__ = {\"exports\":{\"toggleNewPasswordAgain\":{\"type\":\"reactHoc\",\"name\":\"toggleNewPasswordAgain\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"fetchBeforeLogout\":{\"type\":\"reactHoc\",\"name\":\"fetchBeforeLogout\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"toggleBirthdate\":{\"type\":\"reactHoc\",\"name\":\"toggleBirthdate\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"showMembershipNumber\":{\"type\":\"reactHoc\",\"name\":\"showMembershipNumber\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"requestResetEmail\":{\"type\":\"reactHoc\",\"name\":\"requestResetEmail\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"parseDate\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"toggleTempPassword\":{\"type\":\"reactHoc\",\"name\":\"toggleTempPassword\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"formatDate\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"changePasswordWithValidation\":{\"type\":\"reactHoc\",\"name\":\"changePasswordWithValidation\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"toggleName\":{\"type\":\"reactHoc\",\"name\":\"toggleName\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"toggleNewPassword\":{\"type\":\"reactHoc\",\"name\":\"toggleNewPassword\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"toggleEmail\":{\"type\":\"reactHoc\",\"name\":\"toggleEmail\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"toggleMembershipNumber\":{\"type\":\"reactHoc\",\"name\":\"toggleMembershipNumber\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./Password.map"],"mappings":"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"}