fix(style): simple audio player

This commit is contained in:
jialin
2025-06-18 17:45:58 +08:00
parent 3e76d7c321
commit 73c525127f
5 changed files with 56 additions and 25 deletions
+51 -20
View File
@@ -1,7 +1,7 @@
import { formatTime } from '@/utils/index'; import { formatTime } from '@/utils/index';
import { DeleteOutlined, DownloadOutlined } from '@ant-design/icons'; import { DeleteOutlined, DownloadOutlined } from '@ant-design/icons';
import { useIntl } from '@umijs/max'; import { useIntl } from '@umijs/max';
import { Button, Dropdown, Slider, Tooltip, type MenuProps } from 'antd'; import { Button, Dropdown, Slider, type MenuProps } from 'antd';
import { createStyles } from 'antd-style'; import { createStyles } from 'antd-style';
import { round } from 'lodash'; import { round } from 'lodash';
import React, { import React, {
@@ -11,6 +11,8 @@ import React, {
useImperativeHandle, useImperativeHandle,
useMemo useMemo
} from 'react'; } from 'react';
import styled from 'styled-components';
import AutoTooltip from '../auto-tooltip';
import IconFont from '../icon-font'; import IconFont from '../icon-font';
type ActionItem = 'download' | 'delete' | 'speed'; type ActionItem = 'download' | 'delete' | 'speed';
@@ -28,13 +30,28 @@ interface AudioPlayerProps {
onDelete?: () => void; onDelete?: () => void;
} }
const SliderWrapper = styled.div`
width: 100%;
display: flex;
align-items: center;
justify-content: flex-start;
gap: 8px;
.ant-slider {
flex: 1;
}
.time {
color: var(--ant-color-text-tertiary);
}
`;
const useStyles = createStyles(({ css, token }) => { const useStyles = createStyles(({ css, token }) => {
// @ts-ignore // @ts-ignore
const isDarkMode = token.darkMode as boolean; const isDarkMode = token.darkMode as boolean;
return { return {
wrapper: css` wrapper: css`
position: relative; position: relative;
min-width: 300px; min-width: 320px;
width: 320px;
height: 54px; height: 54px;
display: flex; display: flex;
align-items: center; align-items: center;
@@ -45,13 +62,20 @@ const useStyles = createStyles(({ css, token }) => {
: '#F1F3F4'}; : '#F1F3F4'};
border-radius: 28px; border-radius: 28px;
.inner { .inner {
width: 100%;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: flex-start; justify-content: flex-start;
flex: 1; flex: 1;
gap: 10px; gap: 8px;
.slider { .slider {
display: flex;
flex-direction: column;
justify-content: center;
flex: 1; flex: 1;
.ant-slider {
margin: 0;
}
&:hover { &:hover {
.ant-slider-handle { .ant-slider-handle {
opacity: 1; opacity: 1;
@@ -82,6 +106,10 @@ const useStyles = createStyles(({ css, token }) => {
const sliderStyles = { const sliderStyles = {
rail: { rail: {
borderRadius: '4px',
backgroundColor: 'var(--ant-color-fill-secondary)'
},
track: {
borderRadius: '4px', borderRadius: '4px',
backgroundColor: 'var(--ant-color-bg-spotlight)' backgroundColor: 'var(--ant-color-bg-spotlight)'
} }
@@ -322,33 +350,36 @@ const AudioPlayer: React.FC<AudioPlayerProps> = forwardRef((props, ref) => {
icon={ icon={
!playOn ? ( !playOn ? (
<IconFont <IconFont
type="icon-play" type="icon-playcircle-fill"
style={{ fontSize: '22px' }} style={{ fontSize: '22px' }}
></IconFont> ></IconFont>
) : ( ) : (
<IconFont <IconFont
type="icon-pause" type="icon-stopcircle-fill"
style={{ fontSize: '22px' }} style={{ fontSize: '22px' }}
></IconFont> ></IconFont>
) )
} }
></Button> ></Button>
<Tooltip title={name}>
<span className="time current">
{formatTime(audioState.currentTime)} /{' '}
{formatTime(audioState.duration)}
</span>
</Tooltip>
<div className="slider"> <div className="slider">
<Slider <div className="flex-center flex-between file-name">
tooltip={{ open: false }} <AutoTooltip ghost maxWidth={220}>
min={0} <span>{name}</span>
step={1} </AutoTooltip>
styles={sliderStyles} </div>
max={audioState.duration} <SliderWrapper>
value={audioState.currentTime} <span className="time">{formatTime(audioState.currentTime)}</span>
onChange={handleCurrentChange} <Slider
/> tooltip={{ open: false }}
min={0}
step={1}
styles={sliderStyles}
max={audioState.duration}
value={audioState.currentTime}
onChange={handleCurrentChange}
/>
</SliderWrapper>
</div> </div>
<Dropdown menu={{ items }} trigger={['click']}> <Dropdown menu={{ items }} trigger={['click']}>
<Button <Button
+1 -1
View File
@@ -2,7 +2,7 @@ import { createFromIconfontCN } from '@ant-design/icons';
// import './iconfont/iconfont.js'; // import './iconfont/iconfont.js';
const IconFont = createFromIconfontCN({ const IconFont = createFromIconfontCN({
scriptUrl: '//at.alicdn.com/t/c/font_4613488_gxrotg9r0p.js' scriptUrl: '//at.alicdn.com/t/c/font_4613488_njee9tsv0mp.js'
}); });
export default IconFont; export default IconFont;
@@ -196,7 +196,7 @@ const AddModal: FC<AddModalProps> = (props) => {
const currentModelId = updateRequestModelId(); const currentModelId = updateRequestModelId();
setEvaluteState(EvaluateProccess.file); setEvaluteState(EvaluateProccess.file);
const evaluateRes = await handleEvaluateOnChange?.({ const evaluateRes = await handleOnValuesChangeBefore?.({
changedValues: {}, changedValues: {},
allValues: form.current?.form?.getFieldsValue?.(), allValues: form.current?.form?.getFieldsValue?.(),
source: props.source source: props.source
@@ -519,7 +519,7 @@ const MessageInput: React.FC<MessageInputProps> = forwardRef(
<SimpleAudio <SimpleAudio
url={message.audio?.[0].data?.url} url={message.audio?.[0].data?.url}
name={message.audio?.[0].data?.name} name={message.audio?.[0].data?.name}
height={54} height={50}
onDelete={handleDeleteAudio} onDelete={handleDeleteAudio}
></SimpleAudio> ></SimpleAudio>
</AudioWrapper> </AudioWrapper>
@@ -219,7 +219,7 @@ const MessageBody: React.FC<MessageBodyProps> = forwardRef(
url={data.audio?.[0]?.data.url} url={data.audio?.[0]?.data.url}
name={data.audio?.[0]?.data.name} name={data.audio?.[0]?.data.name}
actions={[]} actions={[]}
height={54} height={50}
></SimpleAudio> ></SimpleAudio>
</AudioWrapper> </AudioWrapper>
)} )}
@@ -250,7 +250,7 @@ const MessageBody: React.FC<MessageBodyProps> = forwardRef(
url={data.audio?.[0]?.data.url} url={data.audio?.[0]?.data.url}
name={data.audio?.[0]?.data.name} name={data.audio?.[0]?.data.name}
onDelete={handleDeleteAudio} onDelete={handleDeleteAudio}
height={54} height={50}
></SimpleAudio> ></SimpleAudio>
</AudioWrapper> </AudioWrapper>
)} )}