fix(style): simple audio player
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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>
|
||||||
)}
|
)}
|
||||||
|
|||||||
Reference in New Issue
Block a user