diff --git a/src/main.jsx b/src/main.jsx index adbde06..3c49355 100644 --- a/src/main.jsx +++ b/src/main.jsx @@ -6,18 +6,18 @@ import AuthApp from '@/views/AuthApp' import DesktopApp from '@/views/DesktopApp' import MobileApp from '@/views/MobileApp' import Standlone from '@/views/Standlone' -import OrderFollow from '@/views/OrderFollow' +import OrderFollow from '@/views/orders/Follow' import ChatHistory from '@/views/ChatHistory' import SalesManagement from '@/views/SalesManagement' import DingdingQRCode from '@/views/dingding/QRCode' import DingdingCallback from '@/views/dingding/Callback' import DingdingLogout from '@/views/dingding/Logout' -import AccountProfile from '@/views/AccountProfile' +import AccountProfile from '@/views/accounts/Profile' import ErrorPage from '@/components/ErrorPage' import Conversations from '@/views/Conversations/ChatWindow' import MobileConversation from '@/views/mobile/Conversation' import MobileChat from '@/views/mobile/Chat' -import MobileLogin from '@/views/mobile/Login' +import DingdingLogin from '@/views/dingding/Login' import useAuthStore from '@/stores/AuthStore' import '@/assets/index.css' @@ -61,10 +61,11 @@ const router = createBrowserRouter([ path: '/p', element: , children: [ - { path: 'dingding/qrcode', element: isMobileApp ? : }, - { path: 'dingding/callback', element: }, + { path: 'dingding/login', element: }, { path: 'dingding/logout', element: }, - { path: 'mobile-login', element: }, + { path: 'dingding/qrcode', element: isMobileApp ? : }, + { path: 'dingding/callback', element: }, + { path: 'mobile-login', element: }, ], }, ]); diff --git a/src/views/AuthApp.jsx b/src/views/AuthApp.jsx index 5d42f6b..60c9896 100644 --- a/src/views/AuthApp.jsx +++ b/src/views/AuthApp.jsx @@ -65,7 +65,7 @@ function AuthApp() { useEffect(() => { // 除了路由 /p...以外都需要登陆系统 if ((loginUser.userId === -1) && (href.indexOf('/p/') === -1)) { - navigate('/p/dingding/qrcode') + navigate('/p/dingding/login') } }, [href]) diff --git a/src/views/Conversations/Components/Input/MediaUpload.jsx b/src/views/Conversations/Components/Input/MediaUpload.jsx index 04746bc..8cb8f3e 100644 --- a/src/views/Conversations/Components/Input/MediaUpload.jsx +++ b/src/views/Conversations/Components/Input/MediaUpload.jsx @@ -20,7 +20,7 @@ const ImageUpload = ({ disabled, invokeUploadFileMessage, invokeSendUploadMessag const beforeUpload = async (file) => { const fileTypeSupport = Object.keys(whatsappSupportFileTypes).find((msgType) => whatsappSupportFileTypes[msgType].types.includes(file.type)); if (isEmpty(fileTypeSupport)) { - appMessage.warning('不支持的粘贴内容'); + appMessage.warning('不支持的文件格式'); return false; } const waFile = whatsappSupportFileTypes[fileTypeSupport]; diff --git a/src/views/Standlone.jsx b/src/views/Standlone.jsx index 1c554b7..c26304e 100644 --- a/src/views/Standlone.jsx +++ b/src/views/Standlone.jsx @@ -24,7 +24,7 @@ function Standlone() { App logo - 聊天式销售平台 + 销售平台 diff --git a/src/views/AccountProfile.jsx b/src/views/accounts/Profile.jsx similarity index 85% rename from src/views/AccountProfile.jsx rename to src/views/accounts/Profile.jsx index c1b18be..dd00f4d 100644 --- a/src/views/AccountProfile.jsx +++ b/src/views/accounts/Profile.jsx @@ -5,10 +5,11 @@ import { import { UserOutlined, BugOutlined } from '@ant-design/icons' import useAuthStore from '@/stores/AuthStore' -function AccountProfile() { +function Profile() { const { message } = App.useApp() - const { loginUser, copyUserSession } = useAuthStore() + const loginUser = useAuthStore((state) => state.loginUser) + const copyUserSession = useAuthStore((state) => state.copyUserSession) useEffect(() => { // 测试错误捕获: @@ -37,4 +38,4 @@ function AccountProfile() { ) } -export default AccountProfile +export default Profile diff --git a/src/views/dingding/Callback.jsx b/src/views/dingding/Callback.jsx index 6b2fcdb..15c0741 100644 --- a/src/views/dingding/Callback.jsx +++ b/src/views/dingding/Callback.jsx @@ -1,10 +1,8 @@ import useAuthStore from '@/stores/AuthStore' import { isNotEmpty } from '@/utils/commons' -import { Flex, Result, Spin, Typography } from 'antd' +import { Flex, Result, Spin } from 'antd' import { useEffect } from 'react' -import { useNavigate, useParams } from 'react-router-dom' - -const { Title } = Typography +import { useNavigate } from 'react-router-dom' // 钉钉扫码开发文档:https://open.dingtalk.com/document/orgapp/obtain-identity-credentials#title-4up-u8w-5ug // OAuth 登录授权回调 @@ -13,7 +11,8 @@ function Callback() { const navigate = useNavigate() - const { loginStatus, login, logout, setLoginStatus } = useAuthStore() + const login = useAuthStore((state) => state.login) + const loginStatus = useAuthStore((state) => state.loginStatus) const urlSearch = new URLSearchParams(location.search) const authCode = urlSearch.get('authCode') @@ -42,7 +41,12 @@ function Callback() { ) } else if (loginStatus === 302) { - navigate('/m/conversation') + const isMobileApp = navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i) !== null + if (isMobileApp) { + navigate('/m/conversation') + } else { + navigate('/') + } } else if (loginStatus === 403) { return ( diff --git a/src/views/mobile/Login.jsx b/src/views/dingding/Login.jsx similarity index 82% rename from src/views/mobile/Login.jsx rename to src/views/dingding/Login.jsx index 1b1caeb..7280774 100644 --- a/src/views/mobile/Login.jsx +++ b/src/views/dingding/Login.jsx @@ -1,6 +1,6 @@ import { Flex, Result, Spin } from 'antd' -function Chat() { +function Login() { window.location = 'https://login.dingtalk.com/oauth2/auth?redirect_uri=https%3A%2F%2Fsales.mycht.cn%2Fp%2Fdingding%2Fcallback&response_type=code&client_id=dingwgdx6emlxr3fcrg8&scope=openid&state=global-saels&prompt=consent' @@ -11,11 +11,11 @@ function Chat() { title='欢迎使用' subTitle='正在跳转到钉钉登录页面' extra={[ - + ]} /> ) } -export default Chat +export default Login diff --git a/src/views/dingding/Logout.jsx b/src/views/dingding/Logout.jsx index 73a581d..7c9407b 100644 --- a/src/views/dingding/Logout.jsx +++ b/src/views/dingding/Logout.jsx @@ -14,7 +14,7 @@ function Logout() { useEffect(() => { logout() reset(); - navigate('/p/dingding/qrcode') + navigate('/p/dingding/login') }, []) return ( diff --git a/src/views/dingding/QRCode.jsx b/src/views/dingding/QRCode.jsx index 929b339..6a6c77e 100644 --- a/src/views/dingding/QRCode.jsx +++ b/src/views/dingding/QRCode.jsx @@ -11,7 +11,10 @@ function QRCode() { const navigate = useNavigate() - const { loginStatus, loginUser, login, setLoginStatus } = useAuthStore() + const loginStatus = useAuthStore((state) => state.loginStatus) + const setLoginStatus = useAuthStore((state) => state.setLoginStatus) + const loginUser = useAuthStore((state) => state.loginUser) + const login = useAuthStore((state) => state.login) useEffect(() => { if (loginUser.userId > 0) { diff --git a/src/views/OrderFollow.jsx b/src/views/orders/Follow.jsx similarity index 91% rename from src/views/OrderFollow.jsx rename to src/views/orders/Follow.jsx index cc8f368..79dd042 100644 --- a/src/views/OrderFollow.jsx +++ b/src/views/orders/Follow.jsx @@ -2,7 +2,7 @@ import { Conditional } from '@/components/Conditional' import useAuthStore from '@/stores/AuthStore' import useFormStore from '@/stores/FormStore' import { useOrderStore, OrderLabelDefaultOptions, OrderStatusDefaultOptions, RemindStateDefaultOptions } from '@/stores/OrderStore' -import { copy, isNotEmpty } from '@/utils/commons' +import { copy, isNotEmpty, isEmpty } from '@/utils/commons' import { InfoCircleTwoTone, MailTwoTone, MessageTwoTone, PhoneTwoTone, WhatsAppOutlined } from '@ant-design/icons' import { App, Badge, Button, @@ -228,7 +228,13 @@ function OrderGroupTable({ formValues }) { title: '出发日期', dataIndex: 'COLI_OrderStartDate', width: 120, - hidden: false + hidden: false, + sortDirections: ['ascend', 'descend'], + sorter: (a, b, sortOrder) => { + const datejsA = isEmpty(a.COLI_OrderStartDate) ? dayjs(0) : new dayjs(a.COLI_OrderStartDate) + const datejsB = isEmpty(b.COLI_OrderStartDate) ? dayjs(0) : new dayjs(b.COLI_OrderStartDate) + return datejsA.isAfter(datejsB) + } }, { title: '客人最后一次回复时间', @@ -249,8 +255,9 @@ function OrderGroupTable({ formValues }) { const { notification } = App.useApp() const [loading, setLoading] = useState(false) - const { orderList, fetchOrderList } = useOrderStore() - const { loginUser } = useAuthStore() + const orderList = useOrderStore((state) => state.orderList) + const fetchOrderList = useOrderStore((state) => state.fetchOrderList) + const loginUser = useAuthStore((state) => state.loginUser) useEffect(() => { let canSearch = true @@ -360,7 +367,7 @@ function OrderGroupTable({ formValues }) { ) } -function OrderFollow() { +function Follow() { const [formValues, setFormValues] = useFormStore(useShallow((state) => [state.orderFollowForm, state.setOrderFollowForm])) const [advanceChecked, toggleAdvance] = useFormStore(useShallow((state) => [state.orderFollowAdvanceChecked, state.setOrderFollowAdvanceChecked])) @@ -405,4 +412,4 @@ function OrderFollow() { ) } -export default OrderFollow +export default Follow