import React from 'react'; import Navigation from '../lib/navigation.js'; const navigate = view => Navigation.navigateTo(view); const VIEW_CONFIG = { 'chat-inbound-request': {relationship: 'pending_inbound', variant: 'inbound-request'}, 'chat-inbound-message': {relationship: 'pending_inbound', variant: 'inbound-message'}, 'chat-outbound-request': {relationship: 'pending_outbound', variant: 'outbound-request'}, 'chat-status': {relationship: 'friend', variant: 'status'}, 'chat-friend': {relationship: 'friend', variant: 'friend'}, 'chat-media': {relationship: 'friend', variant: 'media'}, 'chat-blocked': {relationship: 'blocked_by_peer', variant: 'blocked'}, 'chat-deleted': {relationship: 'none', variant: 'deleted'}, 'chat-standard': {relationship: 'friend', variant: 'standard'}, 'chat-attachments': {relationship: 'friend', variant: 'attachments'}, 'chat-mixed': {relationship: 'friend', variant: 'mixed'}, 'chat-contact-card': {relationship: 'friend', variant: 'contact-card'} }; const ATTACHMENTS = [ {id: 'photo', icon: 'image', label: '照片'}, {id: 'camera', icon: 'photo_camera', label: '拍摄'}, {id: 'call', icon: 'call', label: '视频语音'}, {id: 'card', icon: 'contact_page', label: '名片'}, {id: 'file', icon: 'folder', label: '文件'}, {id: 'favorite', icon: 'bookmark', label: '收藏'}, {id: 'video', icon: 'videocam', label: '视频通话'} ]; function Icon({children}) { return ; } function Toast({message, onDone}) { React.useEffect(() => { if (!message) return undefined; const timer = window.setTimeout(onDone, 2200); return () => window.clearTimeout(timer); }, [message, onDone]); return message ?
{message}
: null; } function ChatAvatar({mine = false, peer = false}) { return
; } function Status({value, failedReason}) { if (!value && !failedReason) return null; return
{failedReason ? error : null}{failedReason || value}
; } function FileCard() { return
365天艾宾浩斯记忆曲线复习计划.pdf115KB
P
; } function ContactCard({onOpen}) { return ; } function VoiceMessage({duration = 6, playing = false}) { return
{playing ? 'graphic_eq' : 'volume_up'}{duration}″
; } function ImageMessage({progress}) { return
会话图片 {progress < 100 ?
{progress}%
: null}
; } function Bubble({mine = false, children, status, failedReason, type = 'text', onOpenCard}) { return
{!mine ? : null}
{type === 'file' ? : type === 'card' ? :
{children}
}
{mine ? : null}
; } function RelationNotice({children, action, onAction}) { return
{children}{action ? : null}
; } function ChatTimeline({variant, uploadProgress, sendStatus, onRetry, onOpenCard, onFriendAction}) { if (variant === 'inbound-request' || variant === 'inbound-message') { return <>

7月30日 11:40

{variant === 'inbound-request' ? '请求添加你为好友' : '我是祈万事安好'} 以上是打招呼的消息
; } if (variant === 'outbound-request') { return <>

7月30日 11:40

请求添加你为好友 好友申请已发送,等待对方处理 ; } if (variant === 'status') { return <>

7月30日 11:40

我是祈万事安好 你已添加安妮,现在可以开始聊天。 ; } if (variant === 'friend') { return <>

8月27日 11:11

你们已成为好友,现在可以开始聊天 我们已成为好友,现在我们可以开始聊天 你还好吗? ; } if (variant === 'media') { return <>

8月27日 11:11

接雨彤创建群聊 你还好吗? ; } if (variant === 'blocked') { return <>

7月30日 11:40

请求添加你为好友 你已添加了安妮,现在可以开始聊天。

7月30日 13:00

这边在网上看见你的留言,你想了解什么课程了 有课程辅导的老师?对新手友好吗? 这个不用担心特别好上手,学起来特别简单 拉黑我这么速度,真的牛 ; } if (variant === 'deleted') { return <>

7月30日 13:00

你好我是XXX推荐过来的,这边想了解课程是吗 这边目前找到更好的课程,不考虑你们家,谢谢 这是我们导师名片,你可以加一下,对比一下价格 onFriendAction('resent')}>你还不是他(她)朋友。 这么突然把我删了,真心累了 onFriendAction('resent')}>你还不是他(她)朋友。 ; } const base = <>

7月30日 11:40

请求添加你为好友 你已添加了安妮,现在可以开始聊天。

7月30日 13:00

你好,我是王珊珊,很高兴认识你,你怎么称呼 你好,我是安妮,想跟你咨询一下设计课程,方便? ; if (variant === 'standard') { return <>{base}非常方便,这是我们的课程目录,你可以看看了解一下; } if (variant === 'mixed') { return <>{base}; } if (variant === 'contact-card') { return <>{base}这是我们导师名片,你可以加一下,有问题随时联系他好的,非常感谢,那我这边就直接联系他吧没问题的,有疑问随时沟通; } return base; } function AttachmentPanel({onChoose}) { return
{ATTACHMENTS.map(item => )}
; } function Composer({relationship, attachmentOpen, setAttachmentOpen, onSend}) { const [draft, setDraft] = React.useState(sessionStorage.getItem('im-chat-draft') || ''); const canSend = relationship === 'friend'; const updateDraft = value => { setDraft(value); sessionStorage.setItem('im-chat-draft', value); }; const submit = e => { e.preventDefault(); if (!canSend || !draft.trim()) return; onSend(draft.trim()); updateDraft(''); }; return
updateDraft(e.target.value)} placeholder={canSend ? '输入消息' : relationship === 'pending_inbound' ? '请先处理好友申请' : relationship === 'pending_outbound' ? '等待对方通过好友申请' : '当前无法发送消息'} disabled={!canSend} /> {draft.trim() ? : }
; } export default function DirectMessageView({view}) { const config = VIEW_CONFIG[view] || VIEW_CONFIG['chat-standard']; const [relationship, setRelationship] = React.useState(config.relationship); const [variant, setVariant] = React.useState(config.variant); const [attachmentOpen, setAttachmentOpen] = React.useState(config.variant === 'attachments'); const [uploadProgress, setUploadProgress] = React.useState(config.variant === 'media' ? 76 : 100); const [sendStatus, setSendStatus] = React.useState('发送中'); const [extraMessages, setExtraMessages] = React.useState([]); const [toast, setToast] = React.useState(''); React.useEffect(() => { if (variant !== 'status') return undefined; const stages = ['已发送', '已送达', '已读']; const timers = stages.map((status, index) => window.setTimeout(() => setSendStatus(status), 600 * (index + 1))); return () => timers.forEach(timer => window.clearTimeout(timer)); }, [variant]); React.useEffect(() => { if (variant !== 'media' || uploadProgress >= 100) return undefined; const timer = window.setTimeout(() => setUploadProgress(value => Math.min(value + 4, 100)), 350); return () => window.clearTimeout(timer); }, [variant, uploadProgress]); const friendAction = action => { if (action === 'declined') { setRelationship('none'); setToast('已拒绝好友申请'); } else { setRelationship(action === 'accepted' ? 'friend' : 'pending_outbound'); if (action === 'accepted') setVariant('friend'); setToast(action === 'accepted' ? '好友申请已通过' : '好友验证已发送'); } }; return

接语彤

在线
setToast('正在重试发送')} onOpenCard={() => navigate('friend-profile')} onFriendAction={friendAction} /> {extraMessages.map(item => {item.text})}
{relationship === 'friend' ? null :
info_outline{relationship === 'pending_inbound' ? '通过好友申请后即可发送消息' : relationship === 'pending_outbound' ? '好友申请正在等待处理' : relationship === 'none' ? '对方已不是你的好友,发送消息前需重新验证' : '当前关系状态下无法发送消息'}
} { const id = Date.now(); setExtraMessages(items => items.concat({id, text, status: '发送中'})); window.setTimeout(() => setExtraMessages(items => items.map(item => item.id === id ? {...item, status: '已发送'} : item)), 600); }} /> {attachmentOpen && relationship === 'friend' ? { setToast(`已选择${item.label},上传接口将在联调阶段接入`); if (item.id === 'card') navigate('chat-contact-card'); if (item.id === 'photo' || item.id === 'camera') navigate('media-uploading'); if (item.id === 'call' || item.id === 'video') navigate('call-history'); if (item.id === 'file') navigate('upload-file'); if (item.id === 'favorite') navigate('favorites'); }} /> : null} setToast('')} />
; }