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 {children};
}
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 ?
: 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 ;
}
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('')} />
;
}