浏览代码

✨ feat(mobile): 集成react-toastify通知系统

- 替换所有message.error为toast.error以统一通知样式
- 在主应用中添加ToastContainer组件及样式
- 配置toast位置为顶部中央,自动关闭时间3秒
- 支持点击关闭、拖拽等交互功能

♻️ refactor(mobile): 更新多处页面的错误提示方式

- PublishJobForm: 将表单验证和提交错误提示改为toast
- CompanyProfilePage: 更新企业信息加载和保存的错误提示
- FontSettingsPage: 修改字体大小设置的错误反馈方式
- MyFavoritesPage: 更新收藏内容加载和取消收藏的提示
- MyPostsPage: 调整发布内容加载和删除的错误提示
- PointsPage: 更改积分数据加载失败的提示方式
- ProfileEditPage: 更新个人档案加载和保存的错误提示
- SkillsPage: 统一技能和证书管理的操作反馈
yourname 7 月之前
父节点
当前提交
f2489b35ef

+ 12 - 12
src/client/mobile/components/PublishJobForm.tsx

@@ -115,7 +115,7 @@ export const PublishJobForm: React.FC<PublishJobFormProps> = ({ onSuccess, onCan
       }
     } catch (error) {
       console.error('获取认证企业列表失败:', error);
-      message.error('获取认证企业列表失败');
+      toast.error('获取认证企业列表失败');
     } finally {
       setLoadingCompanies(false);
     }
@@ -177,47 +177,47 @@ export const PublishJobForm: React.FC<PublishJobFormProps> = ({ onSuccess, onCan
     e.preventDefault();
     
     if (!formData.companyId) {
-      message.error('请选择企业');
+      toast.error('请选择企业');
       return;
     }
 
     if (!formData.title.trim()) {
-      message.error('请输入岗位名称');
+      toast.error('请输入岗位名称');
       return;
     }
 
     if (!formData.salary.trim()) {
-      message.error('请输入薪资范围');
+      toast.error('请输入薪资范围');
       return;
     }
 
     if (!formData.workLocation.trim()) {
-      message.error('请输入工作地点');
+      toast.error('请输入工作地点');
       return;
     }
 
     if (!formData.description.trim()) {
-      message.error('请输入岗位介绍');
+      toast.error('请输入岗位介绍');
       return;
     }
 
     if (!formData.details.trim()) {
-      message.error('请输入岗位详情');
+      toast.error('请输入岗位详情');
       return;
     }
 
     if (!formData.contactPerson.trim()) {
-      message.error('请输入联系人姓名');
+      toast.error('请输入联系人姓名');
       return;
     }
 
     if (!formData.contactPhone.trim()) {
-      message.error('请输入联系电话');
+      toast.error('请输入联系电话');
       return;
     }
 
     if (!formData.jobType.trim()) {
-      message.error('请选择岗位类型');
+      toast.error('请选择岗位类型');
       return;
     }
 
@@ -265,11 +265,11 @@ export const PublishJobForm: React.FC<PublishJobFormProps> = ({ onSuccess, onCan
         });
       } else {
         const errorData = await response.json() as { message?: string; code?: number };
-        message.error(errorData.message || '发布失败');
+        toast.error(errorData.message || '发布失败');
       }
     } catch (error) {
       console.error('发布岗位失败:', error);
-      message.error('发布岗位失败,请稍后重试');
+      toast.error('发布岗位失败,请稍后重试');
     } finally {
       setLoading(false);
     }

+ 5 - 4
src/client/mobile/components/PublishKnowledgeForm.tsx

@@ -1,5 +1,6 @@
 import React, { useState, useEffect } from 'react';
-import { Form, Input, Select, Button, message } from 'antd';
+import { Form, Input, Select, Button } from 'antd';
+import { toast } from 'react-toastify';
 
 const { TextArea } = Input;
 const { Option } = Select;
@@ -45,7 +46,7 @@ const PublishKnowledgeForm: React.FC<PublishKnowledgeFormProps> = ({ onSuccess,
       const userData = await userResponse.json();
       
       if (!userData.data?.id) {
-        message.error('请先登录');
+        toast.error('请先登录');
         return;
       }
 
@@ -77,10 +78,10 @@ const PublishKnowledgeForm: React.FC<PublishKnowledgeFormProps> = ({ onSuccess,
         form.resetFields();
         onSuccess();
       } else {
-        message.error(result.message || '发布失败');
+        toast.error(result.message || '发布失败');
       }
     } catch (error) {
-      message.error('发布失败,请重试');
+      toast.error('发布失败,请重试');
     } finally {
       setLoading(false);
     }

+ 14 - 0
src/client/mobile/index.tsx

@@ -4,6 +4,8 @@ import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
 import { AuthProvider } from './hooks/AuthProvider'
 import { RouterProvider } from 'react-router-dom'
 import { router } from './routes'
+import { ToastContainer } from 'react-toastify'
+import 'react-toastify/dist/ReactToastify.css'
 
 // 创建QueryClient实例
 const queryClient = new QueryClient();
@@ -14,6 +16,18 @@ const App = () => {
     <QueryClientProvider client={queryClient}>
       <AuthProvider>
         <RouterProvider router={router} />
+        <ToastContainer
+          position="top-center"
+          autoClose={3000}
+          hideProgressBar={false}
+          newestOnTop={false}
+          closeOnClick
+          rtl={false}
+          pauseOnFocusLoss
+          draggable
+          pauseOnHover
+          theme="light"
+        />
       </AuthProvider>
     </QueryClientProvider>
   )

+ 4 - 4
src/client/mobile/pages/CompanyProfilePage.tsx

@@ -70,11 +70,11 @@ const CompanyProfilePage: React.FC = () => {
           setIsEditing(true);
         }
       } else {
-        message.error('获取企业信息失败');
+        toast.error('获取企业信息失败');
       }
     } catch (error) {
       console.error('获取企业信息失败:', error);
-      message.error('获取企业信息失败,请重试');
+      toast.error('获取企业信息失败,请重试');
     } finally {
       setLoading(false);
     }
@@ -103,11 +103,11 @@ const CompanyProfilePage: React.FC = () => {
         setIsEditing(false);
         message.success('企业信息保存成功');
       } else {
-        message.error('保存失败,请重试');
+        toast.error('保存失败,请重试');
       }
     } catch (error) {
       console.error('保存企业信息失败:', error);
-      message.error('保存失败,请重试');
+      toast.error('保存失败,请重试');
     } finally {
       setLoading(false);
     }

+ 2 - 2
src/client/mobile/pages/FontSettingsPage.tsx

@@ -45,7 +45,7 @@ const FontSettingsPage: React.FC = () => {
       }
     } catch (error) {
       console.error('加载用户偏好设置失败:', error);
-      message.error('加载设置失败,请重试');
+      toast.error('加载设置失败,请重试');
     }
   };
 
@@ -81,7 +81,7 @@ const FontSettingsPage: React.FC = () => {
       }
     } catch (error) {
       console.error('更新字体大小失败:', error);
-      message.error('更新失败,请重试');
+      toast.error('更新失败,请重试');
     } finally {
       setLoading(false);
     }

+ 2 - 2
src/client/mobile/pages/MyFavoritesPage.tsx

@@ -60,7 +60,7 @@ const MyFavoritesPage: React.FC = () => {
       }
     } catch (error) {
       console.error('加载收藏内容失败:', error);
-      message.error('加载收藏内容失败');
+      toast.error('加载收藏内容失败');
     } finally {
       setLoading(false);
     }
@@ -84,7 +84,7 @@ const MyFavoritesPage: React.FC = () => {
       }
     } catch (error) {
       console.error('取消收藏失败:', error);
-      message.error('取消收藏失败');
+      toast.error('取消收藏失败');
     }
   };
 

+ 2 - 2
src/client/mobile/pages/MyPostsPage.tsx

@@ -73,7 +73,7 @@ const MyPostsPage: React.FC = () => {
       }
     } catch (error) {
       console.error('加载发布内容失败:', error);
-      message.error('加载发布内容失败');
+      toast.error('加载发布内容失败');
     } finally {
       setLoading(false);
     }
@@ -97,7 +97,7 @@ const MyPostsPage: React.FC = () => {
       }
     } catch (error) {
       console.error('删除失败:', error);
-      message.error('删除失败');
+      toast.error('删除失败');
     }
   };
 

+ 1 - 1
src/client/mobile/pages/PointsPage.tsx

@@ -62,7 +62,7 @@ const PointsPage: React.FC = () => {
       }
     } catch (error) {
       console.error('加载积分数据失败:', error);
-      message.error('加载积分数据失败');
+      toast.error('加载积分数据失败');
     } finally {
       setLoading(false);
     }

+ 2 - 2
src/client/mobile/pages/ProfileEditPage.tsx

@@ -56,7 +56,7 @@ const ProfileEditPage: React.FC = () => {
       }
     } catch (error) {
       console.error('加载个人档案失败:', error);
-      message.error('加载个人档案失败');
+      toast.error('加载个人档案失败');
     }
   };
 
@@ -124,7 +124,7 @@ const ProfileEditPage: React.FC = () => {
       }
     } catch (error) {
       console.error('更新失败:', error);
-      message.error('更新失败,请重试');
+      toast.error('更新失败,请重试');
     } finally {
       setLoading(false);
     }

+ 1 - 1
src/client/mobile/pages/ProfilePage.tsx

@@ -84,7 +84,7 @@ const ProfilePage: React.FC = () => {
       }
     } catch (error) {
       console.error('更新字体大小失败:', error);
-      message.error('更新失败,请重试');
+      toast.error('更新失败,请重试');
     } finally {
       setLoading(false);
     }

+ 9 - 9
src/client/mobile/pages/SkillsPage.tsx

@@ -2,8 +2,9 @@ import React, { useState, useEffect } from 'react';
 import { useAuth } from '../hooks/AuthProvider';
 import { useNavigate } from 'react-router-dom';
 import { silverUsersClient } from '@/client/api';
-import { App, Card, List, Button, Tag, Modal, Form, Input, Select, Upload, message } from 'antd';
+import { App, Card, List, Button, Tag, Modal, Form, Input, Select, Upload } from 'antd';
 import { PlusOutlined, UploadOutlined, EditOutlined, DeleteOutlined } from '@ant-design/icons';
+import { toast } from 'react-toastify';
 import type { UploadProps } from 'antd';
 
 const { Option } = Select;
@@ -11,7 +12,6 @@ const { Option } = Select;
 const SkillsPage: React.FC = () => {
   const { user } = useAuth();
   const navigate = useNavigate();
-  const { message } = App.useApp();
   const [loading, setLoading] = useState(false);
   const [skills, setSkills] = useState<any[]>([]);
   const [certificates, setCertificates] = useState<any[]>([]);
@@ -44,7 +44,7 @@ const SkillsPage: React.FC = () => {
       }
     } catch (error) {
       console.error('加载技能信息失败:', error);
-      message.error('加载技能信息失败');
+      toast.error('加载技能信息失败');
     } finally {
       setLoading(false);
     }
@@ -55,9 +55,9 @@ const SkillsPage: React.FC = () => {
       const newSkills = [...skills, values.skill];
       await updateProfile({ skills: newSkills.join(',') });
       setSkills(newSkills);
-      message.success('技能添加成功');
+      toast.success('技能添加成功');
     } catch (error) {
-      message.error('技能添加失败');
+      toast.error('技能添加失败');
     }
   };
 
@@ -66,9 +66,9 @@ const SkillsPage: React.FC = () => {
       const newSkills = skills.filter(skill => skill !== skillToRemove);
       await updateProfile({ skills: newSkills.join(',') });
       setSkills(newSkills);
-      message.success('技能删除成功');
+      toast.success('技能删除成功');
     } catch (error) {
-      message.error('技能删除失败');
+      toast.error('技能删除失败');
     }
   };
 
@@ -79,7 +79,7 @@ const SkillsPage: React.FC = () => {
       setCertificates(newCertificates);
       message.success('证书添加成功');
     } catch (error) {
-      message.error('证书添加失败');
+      toast.error('证书添加失败');
     }
   };
 
@@ -90,7 +90,7 @@ const SkillsPage: React.FC = () => {
       setCertificates(newCertificates);
       message.success('证书删除成功');
     } catch (error) {
-      message.error('证书删除失败');
+      toast.error('证书删除失败');
     }
   };