/**
* contact.js - u5904u7406u8054u7cfbu6211u4eecu9875u9762u7684u6d88u606fu53d1u9001u529fu80fd
* u5c06u7528u6237u63d0u4ea4u7684u6d88u606fu4fddu5b58u5230 Supabase u7684 comments u6570u636eu8868u4e2d
*/
document.addEventListener('DOMContentLoaded', function() {
console.log('Contact form script loaded');
// u83b7u53d6u8054u7cfbu8868u5355u5143u7d20
const contactForm = document.getElementById('contact-form');
// u521du59cbu5316u6210u529fu548cu9519u8befu6d88u606fu5bb9u5668
let successMessage = document.getElementById('contact-success');
let errorMessage = document.getElementById('contact-error');
// u5982u679cu6d88u606fu5bb9u5668u4e0du5b58u5728uff0cu521bu5efau5b83u4eec
if (!successMessage) {
successMessage = document.createElement('div');
successMessage.id = 'contact-success';
successMessage.className = 'alert alert-success mt-3 d-none';
successMessage.role = 'alert';
successMessage.innerHTML = 'u60a8u7684u6d88u606fu5df2u6210u529fu53d1u9001uff01u6211u4eecu5c06u5c3du5febu56deu590du60a8u3002';
contactForm.parentNode.appendChild(successMessage);
}
if (!errorMessage) {
errorMessage = document.createElement('div');
errorMessage.id = 'contact-error';
errorMessage.className = 'alert alert-danger mt-3 d-none';
errorMessage.role = 'alert';
errorMessage.innerHTML = 'u53d1u9001u6d88u606fu5931u8d25uff0cu8bf7u7a0du540eu518du8bd5u3002';
contactForm.parentNode.appendChild(errorMessage);
}
// u8868u5355u63d0u4ea4u5904u7406
if (contactForm) {
contactForm.addEventListener('submit', async function(e) {
e.preventDefault();
// u663eu793au52a0u8f7du72b6u6001
const submitButton = contactForm.querySelector('button[type="submit"]');
const originalButtonText = submitButton.innerHTML;
submitButton.disabled = true;
submitButton.innerHTML = ' u53d1u9001u4e2d...';
// u9690u85cfu4e4bu524du7684u6d88u606f
successMessage.classList.add('d-none');
errorMessage.classList.add('d-none');
try {
// 获取用户实际输入的表单数据
const rawFormData = {
name: document.getElementById('name').value,
email: document.getElementById('email').value,
subject: document.getElementById('subject').value,
message: document.getElementById('message').value
};
console.log('Raw form data collected:', rawFormData);
// 对未填写的字段使用默认值
const formData = {
name: rawFormData.name || '匿名用户',
email: rawFormData.email || 'anonymous@example.com',
subject: rawFormData.subject || '联系表单提交',
message: rawFormData.message || '用户未提供具体消息内容'
};
console.log('Form data collected:', formData);
// 严格按照 comments 表的结构创建数据
const contact = {
// 必需字段 - 确保这些字段非空
content: formData.message, // 这是必需字段,不能为空
created_at: new Date().toISOString(),
author: formData.name,
source: 'contact_page',
// 其他字段
title: formData.subject,
comment: `${formData.subject}
${formData.message}`,
status: 'new'
};
// 获取当前用户ID(如果已登录)
let userId = null;
if (window.supabaseClient) {
const { data: { user }, error: userError } = await window.supabaseClient.auth.getUser();
if (!userError && user) {
userId = user.id;
console.log('Contact: User is logged in with ID:', userId);
} else {
console.log('Contact: User is not logged in, using default user ID');
// 对于未登录用户,使用默认 user_id
userId = 'anonymous_user'
}
} else {
console.error('Contact: Supabase client not initialized');
throw new Error('认证系统未初始化');
}
contact.user_id = userId; // 设置用户ID
// 检查 comments 表是否存在
console.log('Contact: Checking if comments table exists...');
try {
// 尝试从 comments 表中获取一条数据,如果表不存在,则会抛出错误
const { data: testData, error: testError } = await window.supabaseClient
.from('comments')
.select('id')
.limit(1);
if (testError) {
if (testError.code === 'PGRST301') {
// u8868u4e0du5b58u5728uff0cu5c1du8bd5u521bu5efau7b80u5316u7248u672cu7684u6d88u606f
console.log('Contact: comments table does not exist, using contact_messages table instead');
const simpleContact = {
name: formData.name,
email: formData.email,
subject: formData.subject,
message: formData.message,
created_at: contact.created_at
};
// u5c1du8bd5u5c06u6570u636eu5199u5165 contact_messages u8868
const { data: contactData, error: contactError } = await window.supabaseClient
.from('contact_messages')
.insert([simpleContact]);
if (contactError) {
// u5982u679c contact_messages u8868u4e5fu4e0du5b58u5728uff0cu5c1du8bd5 feedback u8868
console.log('Contact: contact_messages table also not found, trying feedback table');
const simpleFeedback = {
name: formData.name,
email: formData.email,
type: 'contact',
content: `${formData.subject}\n\n${formData.message}`,
created_at: contact.created_at
};
const { data: feedbackData, error: feedbackError } = await window.supabaseClient
.from('feedback')
.insert([simpleFeedback]);
if (feedbackError) {
console.error('Contact: Error submitting to any table:', feedbackError);
throw new Error(`u53d1u9001u6d88u606fu5931u8d25: ${feedbackError.message || 'u670du52a1u5668u9519u8bef'}`);
}
console.log('Contact: Successfully submitted to feedback table');
// 不要返回,继续执行成功消息显示逻辑
}
console.log('Contact: Successfully submitted to contact_messages table');
// 不要返回,继续执行成功消息显示逻辑
} else {
// u5176u4ed6u9519u8befuff0cu53efu80fdu662fu6743u9650u95eeu9898
console.error('Contact: Error checking comments table:', testError);
throw new Error(`u68c0u67e5u6570u636eu8868u5931u8d25: ${testError.message}`);
}
}
// u8868u5b58u5728uff0cu6b63u5e38u63d0u4ea4
console.log('Contact: comments table exists, submitting message');
// 结构提交数据 - 确保使用用户输入
const submissionData = {
// 必需字段 - 绝对使用用户输入(如果有)
content: rawFormData.message && rawFormData.message.trim() !== '' ? rawFormData.message : formData.message,
created_at: new Date().toISOString(),
author: rawFormData.name && rawFormData.name.trim() !== '' ? rawFormData.name : formData.name,
title: rawFormData.subject && rawFormData.subject.trim() !== '' ? rawFormData.subject : formData.subject,
status: 'new',
source: 'contact_page',
user_id: userId // 如果用户未登录,已设置默认值
};
// 记录使用的内容来源
if (rawFormData.message && rawFormData.message.trim() !== '') {
console.log('使用用户提供的消息内容:', rawFormData.message);
} else {
console.log('用户未提供消息内容,使用默认值:', formData.message);
}
// 在控制台打印最终提交的数据,方便调试
console.log('最终提交的表单数据:', {
content: submissionData.content,
author: submissionData.author,
title: submissionData.title,
user_id: submissionData.user_id
});
console.log('Final submission data:', submissionData);
const { data, error } = await window.supabaseClient
.from('comments')
.insert([submissionData]);
if (error) {
console.error('Contact: Error submitting message:', error);
throw new Error(`u53d1u9001u6d88u606fu5931u8d25: ${error.message}`);
}
console.log('Contact: Message successfully sent to comments table');
} catch (submitError) {
// u5982u679cu6240u6709u5c1du8bd5u90fdu5931u8d25uff0cu5728u63a7u5236u53f0u8bb0u5f55u4e0bu6765
console.error('Contact: All submission attempts failed:', submitError);
console.log('Contact message (console only):', contact);
// u5c1du8bd5u4f7fu7528 localStorage u5b58u50a8
try {
const storedMessages = JSON.parse(localStorage.getItem('pendingMessages') || '[]');
storedMessages.push(contact);
localStorage.setItem('pendingMessages', JSON.stringify(storedMessages));
console.log('Contact: Stored in localStorage for later submission');
} catch (storageError) {
console.error('Contact: Failed to store in localStorage:', storageError);
}
throw submitError;
}
console.log('Contact: Message successfully sent');
// u663eu793au6210u529fu6d88u606f
successMessage.classList.remove('d-none');
// u91cdu7f6eu8868u5355
contactForm.reset();
} catch (error) {
console.error('Contact submission error:', error);
// u663eu793au9519u8befu6d88u606f
errorMessage.textContent = error.message || 'u53d1u9001u6d88u606fu5931u8d25uff0cu8bf7u7a0du540eu518du8bd5u3002';
errorMessage.classList.remove('d-none');
} finally {
// u6062u590du6309u94aeu72b6u6001
submitButton.disabled = false;
submitButton.innerHTML = originalButtonText;
}
});
} else {
console.error('Contact form not found');
}
});