boluo-app-main/src/components/material-video-card/index.tsx
2025-03-31 22:34:22 +08:00

150 lines
4.3 KiB
TypeScript

import { BaseEventOrig, Image, Input, InputProps, Text } from '@tarojs/components';
import { navigateTo } from '@/utils/route';
import Taro from '@tarojs/taro';
import { Checkbox } from '@taroify/core';
import { useCallback } from 'react';
import { MaterialVideoInfo } from '@/types/material';
import { logWithPrefix, isDesktop } from '@/utils/common';
import { PageUrl } from '@/constants/app';
import './index.less';
interface IProps {
isTemp?: boolean;
videoInfo: MaterialVideoInfo;
onClickUpload?: () => void;
onClickDelete?: () => void;
onClickSetDefault?: () => void;
onTitleChange?: (newTitle: string) => void;
}
const PREFIX = 'material-video-card';
const log = logWithPrefix(PREFIX);
function MaterialVideoCard(props: IProps) {
const { videoInfo, isTemp = false, onClickUpload, onClickDelete, onClickSetDefault, onTitleChange } = props;
const isVideo = videoInfo.type === 'video';
const handleInput = useCallback(
(e: BaseEventOrig<InputProps.inputValueEventDetail>) => {
const value = e.detail?.value || '';
log('handleInput value', value);
onTitleChange?.(value);
},
[onTitleChange]
);
// const handleInputBlurOrConfirm = useCallback(() => {
// log('newVideoTitle', title);
// if (!title) {
// return;
// }
// onTitleChange?.(videoInfo);
// // ...
// }, [title, videoInfo, onTitleChange]);
const handleCheckboxChange = useCallback(
(checked: boolean) => {
log('handleCheckboxChange', checked);
if (videoInfo.isDefault) {
return;
}
// ...
onClickSetDefault?.();
},
[videoInfo, onClickSetDefault]
);
const handleClickVideo = useCallback(() => {
log('handleClickVideo', videoInfo);
if (!videoInfo.url) {
return;
}
if (isDesktop) {
navigateTo(PageUrl.MaterialWebview, {
source: encodeURIComponent(videoInfo.url)
})
} else {
Taro.previewMedia({
sources: [{ url: videoInfo.url, type: videoInfo.type }],
});
}
}, [videoInfo]);
return (
<div className={PREFIX}>
<div className={`${PREFIX}__cover`}>
{!isTemp && (
<>
<Image
className={`${PREFIX}__cover__image`}
mode="aspectFit"
src={videoInfo.coverUrl}
onClick={handleClickVideo}
/>
{isVideo && (
<Image
className={`${PREFIX}__cover__preview-video`}
mode="aspectFit"
src={require('@/statics/svg/preview_video.svg')}
onClick={handleClickVideo}
/>
)}
</>
)}
{isTemp && (
<div className={`${PREFIX}__cover__placeholder`} onClick={onClickUpload}>
<Image
className={`${PREFIX}__cover__placeholder__image`}
mode="aspectFit"
src={require('@/statics/svg/add.svg')}
/>
</div>
)}
</div>
<div className={`${PREFIX}__info`}>
{!isTemp && (
<>
<div className={`${PREFIX}__info__title`}>
<Input
value={videoInfo.title}
maxlength={20}
confirmType="done"
placeholder="请填写直播产品名称"
onInput={handleInput}
// onBlur={handleInputBlurOrConfirm}
// onConfirm={handleInputBlurOrConfirm}
className={`${PREFIX}__info__title__input`}
placeholderClass={`${PREFIX}__info__title__placeholder`}
/>
</div>
<div className={`${PREFIX}__info__operate`}>
<Checkbox
checked={videoInfo.isDefault}
onChange={handleCheckboxChange}
className={`${PREFIX}__info__operate__checkbox`}
>
</Checkbox>
<div className={`${PREFIX}__info__operate__delete`} onClick={onClickDelete}>
</div>
</div>
</>
)}
{isTemp && (
<Text className={`${PREFIX}__info__temp-tips`}>
{`视频不能超过1000M
视频若太大加载较慢,请耐心等待`}
</Text>
)}
</div>
</div>
);
}
export default MaterialVideoCard;