import React, { useState, useEffect, useCallback, useRef } from 'react';
import { Table, Button, message, Modal, Space, Image, Input, Tag } from 'antd';
import { PlusOutlined, SearchOutlined } from '@ant-design/icons';
import { deviceApi } from '../api/deviceApi';
import ExcelImportExport from './ExcelImportExport';
import MemberForm from './MemberForm';
import Highlighter from 'react-highlight-words';
const MemberList = () => {
const [members, setMembers] = useState([]);
const [loading, setLoading] = useState(false);
const [isModalVisible, setIsModalVisible] = useState(false);
const [editingMember, setEditingMember] = useState(null);
const [searchText, setSearchText] = useState('');
const [searchedColumn, setSearchedColumn] = useState('');
const searchInput = useRef(null);
const fetchMembers = useCallback(async () => {
setLoading(true);
try {
const data = await deviceApi.getAllPersons();
console.log('获取到的会友列表数据:', data);
setMembers(data);
message.success('会友列表获取成功');
} catch (error) {
console.error('获取会友列表失败', error);
message.error(`获取会友列表失败: ${error.message}`);
} finally {
setLoading(false);
}
}, []);
useEffect(() => {
fetchMembers();
}, [fetchMembers]);
const handleSearch = (selectedKeys, confirm, dataIndex) => {
confirm();
setSearchText(selectedKeys[0]);
setSearchedColumn(dataIndex);
};
const handleReset = (clearFilters) => {
clearFilters();
setSearchText('');
};
const getColumnSearchProps = (dataIndex) => ({
filterDropdown: ({ setSelectedKeys, selectedKeys, confirm, clearFilters }) => (
setSelectedKeys(e.target.value ? [e.target.value] : [])}
onPressEnter={() => handleSearch(selectedKeys, confirm, dataIndex)}
style={{ width: 188, marginBottom: 8, display: 'block' }}
/>
),
filterIcon: (filtered) => ,
onFilter: (value, record) =>
record[dataIndex] ? record[dataIndex].toString().toLowerCase().includes(value.toLowerCase()) : '',
onFilterDropdownVisibleChange: (visible) => {
if (visible) {
setTimeout(() => searchInput.current?.select(), 100);
}
},
render: (text) =>
searchedColumn === dataIndex ? (
) : (
text
),
});
const handleAdd = () => {
setEditingMember(null);
setIsModalVisible(true);
};
const handleEdit = (record) => {
setEditingMember(record);
setIsModalVisible(true);
};
const handleDelete = (id) => {
Modal.confirm({
title: '确认删除',
content: '您确定要删除这个会友吗?此操作不可逆。',
onOk: async () => {
try {
await deviceApi.deletePerson(id);
message.success('会友删除成功');
fetchMembers();
} catch (error) {
console.error('删除会友失败', error);
message.error(`删除会友失败: ${error.message}`);
}
},
});
};
const handleSubmit = async (values) => {
try {
if (editingMember) {
console.log('更新会员信息:', values);
await deviceApi.updatePerson(editingMember.personId, values);
message.success('会友信息更新成功');
} else {
console.log('添加新会员:', values);
await deviceApi.addPerson(values);
message.success('会友添加成功');
}
setIsModalVisible(false);
fetchMembers();
} catch (error) {
console.error('操作失败', error);
message.error(`操作失败: ${error.message}`);
}
};
const columns = [
{ title: 'ID', dataIndex: 'personId', key: 'personId' },
{
title: '姓名',
dataIndex: 'name',
key: 'name',
...getColumnSearchProps('name'),
},
{ title: '性别', dataIndex: 'gender', key: 'gender' },
{ title: '年龄', dataIndex: 'age', key: 'age' },
{ title: '出生日期', dataIndex: 'birthDate', key: 'birthDate' },
{ title: '婚姻状况', dataIndex: 'maritalStatus', key: 'maritalStatus' },
{
title: '是否受洗',
dataIndex: 'isBaptized',
key: 'isBaptized',
render: (isBaptized) => isBaptized ? '是' : '否'
},
{ title: '受洗日期', dataIndex: 'baptismDate', key: 'baptismDate' },
{
title: '联系方式',
dataIndex: 'contact',
key: 'contact',
...getColumnSearchProps('contact'),
},
{
title: '服侍岗位',
dataIndex: 'servicePosition',
key: 'servicePosition',
...getColumnSearchProps('servicePosition'),
render: (positions) => (
<>
{Array.isArray(positions) && positions.map((position) => (
{position}
))}
>
),
},
{
title: '照片',
dataIndex: 'photo',
key: 'photo',
render: (photo) => photo ? : '无照片'
},
{
title: '操作',
key: 'action',
render: (_, record) => (
),
},
];
console.log('当前会友列表数据:', members);
return (
会友列表
}>
添加会友
setIsModalVisible(false)}
footer={null}
width={600}
>
);
};
export default MemberList;