{"version":3,"file":"WefunForm.CSiLhUC7.mjs","names":["useRef"],"sources":["https:/framerusercontent.com/modules/IsljDMkjJybLrYa4C6Q0/kWaL21LLd9MW3KqsGJCS/WefunForm.js"],"sourcesContent":["import{jsx as _jsx}from\"react/jsx-runtime\";import{addPropertyControls,ControlType}from\"framer\";import{useEffect,useRef}from\"react\";// stable 채널은 검증된 버전을 가리킨다(짧게 캐시). 버전을 고정하려면 /0.3.2/ 처럼 쓴다.\nconst SDK_URL=\"https://form-sdk.wefun.io/stable/viewer.mjs\";// 위펀폼 공개 API. GET {FORM_API_URL}{위펀폼 ID} -> { id, detail: 폼 정의 }\nconst FORM_API_URL=\"https://api.snack24h.com/public/forms/leads/\";// 폼 API 가 이 시간 안에 응답하지 않으면 요청을 끊고 백업 JSON 으로 넘어간다.\nconst FORM_API_TIMEOUT_MS=5e3;async function fetchFormDefinition(formId,signal){const request=new AbortController;const abort=()=>request.abort();const timer=setTimeout(abort,FORM_API_TIMEOUT_MS);signal.addEventListener(\"abort\",abort);try{const response=await fetch(FORM_API_URL+encodeURIComponent(formId),{credentials:\"omit\",signal:request.signal});if(!response.ok)throw new Error(`폼 API 응답 ${response.status}: ${formId}`);const body=await response.json();if(!body.detail||typeof body.detail!==\"object\")throw new Error(`폼 API 응답에 detail 이 없다: ${formId}`);return body.detail;}catch(error){if(request.signal.aborted&&!signal.aborted)throw new Error(`폼 API 가 ${FORM_API_TIMEOUT_MS}ms 안에 응답하지 않았다: ${formId}`);throw error;}finally{clearTimeout(timer);signal.removeEventListener(\"abort\",abort);}}// 비어 있으면 undefined. 형식이 깨졌으면 JSON.parse 가 던진다.\nfunction parseFormJson(json){const text=json?.trim();return text?JSON.parse(text):undefined;}// oid 는 보내지 않는다. 리드 소스(Web)와 비어 있는 LastName(회사명)은 Apex 가 채운다.\nconst SALESFORCE={action:\"https://wefun.my.salesforce-sites.com/webform/services/apexrest/v1/common/createLead\"};// 운영 Salesforce Lead 필드 (이름 -> Salesforce 필드명·ID)\nconst SF_LEAD_FIELDS={// ===== 시스템 =====\noid:\"oid\",return_url:\"retURL\",// ===== 표준 Lead 필드 =====\nfirst_name:\"first_name\",last_name:\"last_name\",email:\"email\",company:\"company\",city:\"city\",state:\"state\",salutation:\"salutation\",title:\"title\",url:\"url\",phone:\"phone\",mobile:\"mobile\",fax:\"fax\",street:\"street\",zip:\"zip\",country:\"country\",description:\"description\",lead_source:\"lead_source\",industry:\"industry\",rating:\"rating\",revenue:\"revenue\",campaign_id:\"Campaign_ID\",member_status:\"member_status\",email_opt_out:\"emailOptOut\",fax_opt_out:\"faxOptOut\",do_not_call:\"doNotCall\",number_of_employees:\"NumberOfEmployees\",// ===== 커스텀 Lead 필드 =====\nservices_name:\"00NTJ00000hYopW\",service_key:\"00NTJ00000hYopW\",service_name_ko:\"00NTJ00000hYopT\",inbound_channel:\"00NTJ00000hYooz\",origin_campaign:\"00NTJ00000hYopD\",origin_medium:\"00NTJ00000hYopE\",origin_source:\"00NTJ00000hYopF\",origin_term:\"00NTJ00000hYopG\",utm_campaign:\"00NTJ00000hYopa\",utm_medium:\"00NTJ00000hYopb\",utm_source:\"00NTJ00000hYopc\",utm_term:\"00NTJ00000hYosr\",contact_create_source:\"00NTJ00000hYopR\",quote_budget_range:\"00NTJ00000hYopM\",quote_employee_range:\"00NTJ00000hYopN\",marketing_consent_contact:\"00NTJ00000hYop2\",consent_personal_marketing:\"00NTJ00000hYop5\",privacy_consent_contact:\"00NTJ00000hYop6\",business_number:\"00NTJ00000hYopQ\",notification_checked_at:\"00NTJ00000hYooY\",auto_assign_status:\"00NTJ00000hYooZ\",department:\"00NTJ00000hYooi\",contact_note:\"00NTJ00000hYooj\",budget:\"00NTJ00000hYooe\",quote_deadline:\"00NTJ00000hYoog\",company_domain:\"00NTJ00000hYooh\",bid_deadline_at:\"00NTJ00000hYooa\",bid_notice_key:\"00NTJ00000hYoob\",bid_posted_at:\"00NTJ00000hYooc\",budget_note:\"00NTJ00000hYood\",contract_method:\"00NTJ00000hYool\",auto_convert_fail_reason:\"00NTJ00000hYoom\",auto_convert_retry_count:\"00NTJ00000hYoon\",key_inquiry:\"00NTJ00000hYooo\",credit_rating:\"00NTJ00000hYoop\",desired_start_date:\"00NTJ00000hYooq\",employee_growth_rate:\"00NTJ00000hYoor\",equipment_needed:\"00NTJ00000hYoos\",equipment_support_type:\"00NTJ00000hYoot\",current_usage:\"00NTJ00000hYoou\",external_id:\"00NTJ00000hYoov\",first_visit_at:\"00NTJ00000hYoow\",follow_up_sales:\"00NTJ00000hYoox\",first_inbound_at:\"00NTJ00000hYooy\",is_from_lead:\"00NTJ00000hYop0\",manual_assign:\"00NTJ00000hYop1\",create_account:\"00NTJ00000hYop3\",partner:\"00NTJ00000hYop4\",is_wefun_customer:\"00NTJ00000hYop7\",last_visit_at:\"00NTJ00000hYop8\",marketing_grade:\"00NTJ00000hYop9\",marketing_score:\"00NTJ00000hYopA\",notice_posted_at:\"00NTJ00000hYopB\",notice_url:\"00NTJ00000hYopC\",owner_assigned_at:\"00NTJ00000hYopH\",page_views:\"00NTJ00000hYopI\",partner_name:\"00NTJ00000hYopJ\",delivery_type:\"00NTJ00000hYopK\",preferred_products:\"00NTJ00000hYopL\",quote:\"00NTJ00000hYopO\",search_keyword:\"00NTJ00000hYopS\",service_department:\"00NTJ00000hYopV\",location:\"00NTJ00000hYopX\",service_contract_name:\"00NTJ00000hYopY\",visit_count:\"00NTJ00000hYopZ\",disqualify_reason:\"00NTJ00000hYpWI\"};// 분리 동의(consent_contact)는 고른 항목 배열이라 아래에서 따로 체크박스 필드로 바꾼다.\nconst CONSENT_KEYS=new Set([\"consent_contact\"]);// 폼 응답 키 -> Salesforce 필드. 자체 키만 본다(constructor 같은 상속 속성은 매핑하지 않는다).\nfunction salesforceField(key){return typeof key===\"string\"&&Object.prototype.hasOwnProperty.call(SF_LEAD_FIELDS,key)?SF_LEAD_FIELDS[key]:undefined;}// origin_* 가 비면 같은 utm_* 값을 쓴다(기존 Web-to-Lead 규칙). SDK 가 아니라 Host 에서 처리한다.\nconst ORIGIN_FALLBACK={origin_source:\"utm_source\",origin_medium:\"utm_medium\",origin_campaign:\"utm_campaign\",origin_term:\"utm_term\"};function withOriginFallback(values){const filled={...values};for(const[origin,utm]of Object.entries(ORIGIN_FALLBACK))if(isEmptyValue(filled[origin])&&!isEmptyValue(filled[utm]))filled[origin]=filled[utm];return filled;}// 다중 선택은 Salesforce 다중 선택 목록 형식인 \";\" 로 잇는다. description 에서도 같다.\nfunction toSalesforceValue(value,separator=\";\"){return Array.isArray(value)?value.join(separator):String(value);}function isEmptyValue(value){return value===undefined||value===null||value===\"\"||value===false||Array.isArray(value)&&value.length===0;}// 폼 정의에서 응답 키 -> 라벨을 모은다. description 에 \"|| 라벨: 값\" 으로 쓴다.\nfunction collectFieldLabels(node,labels={}){if(!node||typeof node!==\"object\")return labels;const{field,children}=node;if(field?.key)labels[field.key]=field.label||field.key;for(const child of children??[])collectFieldLabels(child,labels);return labels;}function postToSalesforce(values,extra,labels){const fields={};// 폼 응답 키가 SF_LEAD_FIELDS 이름과 같으면 그 필드로, 없으면 description 에 \"|| 라벨: 값\" 줄로 모은다.\n// 줄 맨 앞 \"||\" 가 필드 구분자다. 값에 \":\"·줄바꿈이 있어도 \"||\" 로 나누면 필드가 섞이지 않는다.\nconst descriptionLines=[];for(const[key,value]of Object.entries(withOriginFallback(values))){if(CONSENT_KEYS.has(key)||isEmptyValue(value))continue;const sfName=salesforceField(key);// 체크박스(true)는 Salesforce 체크박스 값 \"1\" 로 보낸다(분리 동의·리드 임베드와 같다).\nif(sfName)fields[sfName]=value===true?\"1\":toSalesforceValue(value);else descriptionLines.push(`|| ${labels[key]??key}: ${toSalesforceValue(value)}`);}if(descriptionLines.length>0)fields[SF_LEAD_FIELDS.description]=descriptionLines.join(\"\\n\");// 분리 동의(consent_contact): 고른 항목 값이 곧 SF_LEAD_FIELDS 이름이다.\n// 예) [\"privacy_consent_contact\", \"marketing_consent_contact\"]\n// 통합 동의(consent_personal_marketing)는 위 반복문에서 그대로 매핑된다.\nif(Array.isArray(values.consent_contact))for(const item of values.consent_contact){const sfName=salesforceField(item);if(sfName)fields[sfName]=\"1\";}// 고정값은 폼 값을 처리한 뒤에 넣어, 같은 이름의 폼 필드가 덮어쓰지 못하게 한다.\nObject.assign(fields,extra);const form=document.createElement(\"form\");form.method=\"POST\";form.action=SALESFORCE.action;form.acceptCharset=\"UTF-8\";for(const[name,value]of Object.entries(fields)){const input=document.createElement(\"input\");input.type=\"hidden\";input.name=name;input.value=value;form.appendChild(input);}document.body.appendChild(form);// Salesforce 가 저장한 뒤 returnUrl 로 리디렉트한다.\nform.submit();}/**\n * 폭은 지정해야 한다(고정·채우기). 폼은 반응형 컨테이너라 스스로 폭을 주장하지 않아, 내용 맞춤(auto)이면 0으로 줄어든다.\n * @framerSupportedLayoutWidth any-prefer-fixed\n * @framerIntrinsicWidth 600\n * @framerSupportedLayoutHeight auto\n */export default function WefunForm(props){const{service,formTypeId,formType,submitService,wefunFormId,wefunFormJson}=props;const ref=useRef(null);// 위펀폼 ID 와 정의 JSON 이 둘 다 없으면 아무것도 그리지 않는다.\nconst hasForm=Boolean(wefunFormId?.trim()||wefunFormJson?.trim());useEffect(()=>{if(!hasForm)return;let instance;let cancelled=false;const controller=new AbortController;const search=window.location.search;const returnUrl=\"https://wefuncorp.com/confirm/\"+service+\"-\"+formTypeId+search;// 위펀폼 ID 가 있으면 API 에서 받는다. 없으면(또는 API 가 실패하면) 위펀폼 정의 JSON 을 쓴다.\nconst formId=wefunFormId?.trim();const loadDefinition=async()=>{if(formId){try{return await fetchFormDefinition(formId,controller.signal);}catch(error){if(controller.signal.aborted)throw error;// 백업 JSON 이 비었거나 깨졌으면 파싱 오류가 아니라 원래 API 오류를 알린다.\nlet fallback;try{fallback=parseFormJson(wefunFormJson);}catch{throw error;}if(fallback===undefined)throw error;console.warn(\"[WefunForm] 폼 API 실패, 정의 JSON 사용\",error);return fallback;}}return parseFormJson(wefunFormJson);};Promise.all([import(/* @vite-ignore */SDK_URL),loadDefinition()]).then(([{mount},definition])=>{if(cancelled||!ref.current)return;const labels=collectFieldLabels(definition?.root);instance=mount(ref.current,{definition,initialValues:{services_name:service,service_key:service,contact_create_source:formType},onLoadError:error=>console.error(\"[WefunForm]\",error.reason,error.message),onSubmit:values=>postToSalesforce(values,{returnUrl,[SF_LEAD_FIELDS.inbound_channel]:\"IB\",[SF_LEAD_FIELDS.service_name_ko]:submitService,[SF_LEAD_FIELDS.service_key]:service},labels)});})// SDK 파일·폼 정의를 못 받은 경우. 받은 정의가 형식에 맞지 않으면 onLoadError 가 받는다.\n.catch(error=>{if(!cancelled)console.error(\"[WefunForm]\",error);});return()=>{cancelled=true;controller.abort();instance?.unmount();};},[hasForm,service,formTypeId,formType,submitService,wefunFormId,wefunFormJson]);if(!hasForm)return null;return /*#__PURE__*/_jsx(\"div\",{ref:ref,style:{width:\"100%\"}});}addPropertyControls(WefunForm,{service:{title:\"서비스명\",type:ControlType.String,defaultValue:\"snack\"},submitService:{title:\"서비스 한글명\",type:ControlType.String,defaultValue:\"스낵24\"},formTypeId:{title:\"폼 타입 - em, all, comp, ...\",type:ControlType.String,defaultValue:\"all\"},formType:{title:\"폼 타입 한글명 - 무료상담하기\",type:ControlType.String,defaultValue:\"무료상담하기\"},wefunFormId:{title:\"위펀폼 ID\",type:ControlType.String,defaultValue:null},wefunFormJson:{title:\"위펀폼 정의 JSON\",type:ControlType.String,defaultValue:null}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"WefunForm\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\",\"framerSupportedLayoutHeight\":\"auto\",\"framerSupportedLayoutWidth\":\"any-prefer-fixed\",\"framerIntrinsicWidth\":\"600\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./WefunForm.map"],"mappings":"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"}