/* * 리드 전송 — 데모 요청 모달과 상담 신청 폼이 함께 쓴다. * * [임시] 백엔드/서버리스 연결 전까지는 mailto 로 방문자의 메일 앱을 열어 문의를 보내게 한다. * 메일 앱이 '열릴' 뿐 실제 전송 여부는 알 수 없으므로, UI 도 "접수 완료"가 아니라 * "메일 앱을 열었습니다 — 전송해 주세요"로 정직하게 안내한다(fake success 금지). 나중에 API/시트로 교체. */ // 리드 수신 주소 — 임시. 실제 영업 주소로 바꾸고, 이후 API 붙이면 mailto 자체를 교체할 것. const LEAD_EMAIL = "o2odev@o2o.kr" export type LeadSource = "demo-request" | "contact" export type Lead = { source: LeadSource name: string email: string company?: string phone?: string message?: string /** 봇 함정. 화면에서 감춘 필드라 값이 차 있으면 자동 제출이다. 서버가 조용히 버린다. */ website?: string } export type LeadResult = { ok: true } | { ok: false; reason: "invalid" | "network" | "rejected" } /** 느슨한 검사. 정규식으로 이메일을 엄밀히 검증하려는 시도는 늘 진짜 주소를 막는다. */ export function isEmailLike(value: string) { const v = value.trim() return v.length >= 5 && v.includes("@") && !v.startsWith("@") && !v.endsWith("@") && !/\s/.test(v) } export async function submitLead(lead: Lead): Promise { if (!lead.name.trim() || !isEmailLike(lead.email)) return { ok: false, reason: "invalid" } const label = lead.source === "demo-request" ? "데모 요청" : "도입 문의" const body = [ `[${label}]`, `회사명: ${lead.company || "-"}`, `담당자: ${lead.name}`, `이메일: ${lead.email}`, `연락처: ${lead.phone || "-"}`, `내용: ${lead.message || "-"}`, ].join("\n") const href = `mailto:${LEAD_EMAIL}?subject=${encodeURIComponent(`[${label}] ${lead.company || lead.name}`)}&body=${encodeURIComponent(body)}` // 방문자의 메일 앱을 연다 — 앵커 클릭이 location.href 할당보다 핸들러 발동이 확실하다. // 실제 전송은 방문자가 하므로 성공을 단정하지 않는다(호출부 UI 는 안내 문구). if (typeof document !== "undefined") { const a = document.createElement("a") a.href = href a.style.display = "none" document.body.appendChild(a) a.click() a.remove() } return { ok: true } }