index.tsx 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. import { CloseOutlined, EditOutlined, SaveOutlined } from '@ant-design/icons';
  2. import { PageContainer, ProFormText } from '@ant-design/pro-components';
  3. import { Button, Card, Col, Divider, Form, Row, Space, Typography } from 'antd';
  4. import { AvatarUpload } from './components/AvatarUpload';
  5. import { useUserInfo } from './hooks/useUserInfo';
  6. const UserInfo = () => {
  7. const {
  8. form,
  9. isEditing,
  10. loading,
  11. uploading,
  12. userInfo,
  13. handleEdit,
  14. handleCancel,
  15. handleSave,
  16. handleAvatarUpload,
  17. } = useUserInfo();
  18. if (!userInfo) {
  19. return <div>加载中...</div>;
  20. }
  21. return (
  22. <PageContainer title="个人信息">
  23. <Card>
  24. <Row gutter={48}>
  25. <Col xs={24} md={8} lg={6}>
  26. <div className="flex flex-col items-center gap-3 py-4">
  27. <AvatarUpload
  28. avatar={userInfo.avatar}
  29. isEditing={isEditing}
  30. uploading={uploading}
  31. onUpload={handleAvatarUpload}
  32. />
  33. <div className="text-center">
  34. <div className="text-base font-medium">
  35. {userInfo.nickname || userInfo.username}
  36. </div>
  37. <Typography.Text type="secondary" className="text-sm">
  38. {userInfo.username}
  39. </Typography.Text>
  40. </div>
  41. </div>
  42. <Divider className="md:hidden" />
  43. </Col>
  44. <Col xs={24} md={16} lg={18}>
  45. <Form form={form} layout="vertical" className="max-w-160">
  46. <Form.Item name="avatar" hidden />
  47. <Row gutter={24}>
  48. <Col xs={24} sm={12}>
  49. <ProFormText
  50. name="username"
  51. label="用户名"
  52. readonly
  53. formItemProps={{ layout: 'vertical' }}
  54. fieldProps={{ disabled: true }}
  55. />
  56. </Col>
  57. <Col xs={24} sm={12}>
  58. <ProFormText
  59. name="nickname"
  60. label="昵称"
  61. readonly={!isEditing}
  62. rules={[{ required: true, message: '请输入昵称' }]}
  63. placeholder="请输入昵称"
  64. />
  65. </Col>
  66. <Col xs={24} sm={12}>
  67. <ProFormText
  68. name="email"
  69. label="邮箱"
  70. readonly={!isEditing}
  71. rules={[{ type: 'email', message: '请输入正确的邮箱格式' }]}
  72. placeholder="请输入邮箱"
  73. />
  74. </Col>
  75. <Col xs={24} sm={12}>
  76. <ProFormText
  77. name="phone"
  78. label="电话"
  79. readonly={!isEditing}
  80. placeholder="请输入电话"
  81. />
  82. </Col>
  83. </Row>
  84. <div className="mt-2">
  85. {!isEditing ? (
  86. <Button type="primary" icon={<EditOutlined />} onClick={handleEdit}>
  87. 修改信息
  88. </Button>
  89. ) : (
  90. <Space>
  91. <Button
  92. type="primary"
  93. icon={<SaveOutlined />}
  94. onClick={handleSave}
  95. loading={loading}
  96. >
  97. 确定修改
  98. </Button>
  99. <Button icon={<CloseOutlined />} onClick={handleCancel}>
  100. 取消
  101. </Button>
  102. </Space>
  103. )}
  104. </div>
  105. </Form>
  106. </Col>
  107. </Row>
  108. </Card>
  109. </PageContainer>
  110. );
  111. };
  112. export default UserInfo;