Skip to content

Commit

Permalink
feat: has the message been listened to or not
Browse files Browse the repository at this point in the history
  • Loading branch information
TinySmallM committed Feb 19, 2025
1 parent 69d8dba commit f44295d
Show file tree
Hide file tree
Showing 12 changed files with 84 additions and 21 deletions.
3 changes: 0 additions & 3 deletions src/assets/icons/Icon32PauseCircle.svg

This file was deleted.

24 changes: 24 additions & 0 deletions src/assets/icons/Icon32PauseCircle.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import { defineComponent, useId } from 'vue'

type Props = {
withUnlistenedDot?: boolean
}

export const Icon32PauseCircle = defineComponent<Props>((props) => {
const id = useId()

return () => (
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
{!props.withUnlistenedDot && (
<mask id={id}>
<rect width="100%" height="100%" fill="white" />
<circle cx="27" cy="27" r="5" />
</mask>
)}
<path mask={`url(#${id})`} d="M32 16a16 16 0 1 1-32 0 16 16 0 0 1 32 0zm-20.9-5.45c-.1.21-.1.49-.1 1.05v8.8c0 .56 0 .84.1 1.05a1 1 0 0 0 .45.44c.21.11.49.11 1.05.11h.8c.56 0 .84 0 1.05-.1a1 1 0 0 0 .44-.45c.11-.21.11-.49.11-1.05v-8.8c0-.56 0-.84-.1-1.05a1 1 0 0 0-.45-.44c-.21-.11-.49-.11-1.05-.11h-.8c-.56 0-.84 0-1.05.1a1 1 0 0 0-.44.45zm6 0c-.1.21-.1.49-.1 1.05v8.8c0 .56 0 .84.1 1.05a1 1 0 0 0 .45.44c.21.11.49.11 1.05.11h.8c.56 0 .84 0 1.05-.1a1 1 0 0 0 .44-.45c.11-.21.11-.49.11-1.05v-8.8c0-.56 0-.84-.1-1.05a1 1 0 0 0-.45-.44c-.21-.11-.49-.11-1.05-.11h-.8c-.56 0-.84 0-1.05.1a1 1 0 0 0-.44.45z" fill="currentColor" />
{!props.withUnlistenedDot && <circle cx="27" cy="27" r="3" fill="currentColor" />}
</svg>
)
}, {
props: ['withUnlistenedDot']
})
3 changes: 0 additions & 3 deletions src/assets/icons/Icon32PlayCircle.svg

This file was deleted.

24 changes: 24 additions & 0 deletions src/assets/icons/Icon32PlayCircle.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import { defineComponent, useId } from 'vue'

type Props = {
withUnlistenedDot?: boolean
}

export const Icon32PlayCircle = defineComponent<Props>((props) => {
const id = useId()

return () => (
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
{!props.withUnlistenedDot && (
<mask id={id}>
<rect width="100%" height="100%" fill="white" />
<circle cx="27" cy="27" r="5" />
</mask>
)}
<path mask={`url(#${id})`} clip-rule="evenodd" d="M32 16c0 8.837-7.163 16-16 16S0 24.837 0 16 7.163 0 16 0s16 7.163 16 16zm-9.851.874a1.005 1.005 0 0 0 0-1.739l-8.644-4.994a1.003 1.003 0 0 0-1.505.87v9.988c0 .773.836 1.256 1.505.87z" fill="currentColor" fill-rule="evenodd" />
{!props.withUnlistenedDot && <circle cx="27" cy="27" r="3" fill="currentColor" />}
</svg>
)
}, {
props: ['withUnlistenedDot']
})
6 changes: 4 additions & 2 deletions src/assets/icons/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,9 @@ export { default as Icon24ViewOutline } from './Icon24ViewOutline.svg'
export { default as Icon24VolumeOutline } from './Icon24VolumeOutline.svg'
export { default as Icon28DeleteOutline } from './Icon28DeleteOutline.svg'
export { default as Icon32DonutCircleFillYellow } from './Icon32DonutCircleFillYellow.svg'
export { default as Icon32PauseCircle } from './Icon32PauseCircle.svg'
export { default as Icon32PlayCircle } from './Icon32PlayCircle.svg'

export { Icon32PauseCircle } from './Icon32PauseCircle'
export { Icon32PlayCircle } from './Icon32PlayCircle'

export { default as Icon32Spinner } from './Icon32Spinner.svg'
export { default as Icon44Spinner } from './Icon44Spinner.svg'
1 change: 1 addition & 0 deletions src/converters/MessageConverter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ export function fromApiMessage(message: MessagesMessage): Message.Message {
return {
kind: 'Normal',
text: message.text,
wasListened: message.was_listened ?? false,
attaches: fromApiAttaches(message.attachments ?? []),
replyMessage: message.reply_message && fromApiForeignMessage(
message.reply_message,
Expand Down
5 changes: 3 additions & 2 deletions src/model/Message.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ export interface Normal extends BaseMessage {
kind: 'Normal'
text: string
attaches: Attach.Attaches
wasListened: boolean
replyMessage?: Foreign
forwardedMessages?: NonEmptyArray<Foreign>
}
Expand All @@ -33,7 +34,7 @@ export interface Expired extends BaseMessage {
kind: 'Expired'
}

export interface Foreign extends Omit<Normal, 'kind' | 'peerId' | 'cmid' | 'isOut'> {
export interface Foreign extends Omit<Normal, 'kind' | 'peerId' | 'cmid' | 'isOut' | 'wasListened'> {
kind: 'Foreign'
peerId?: Peer.Id
cmid?: Cmid
Expand All @@ -42,7 +43,7 @@ export interface Foreign extends Omit<Normal, 'kind' | 'peerId' | 'cmid' | 'isOu
isUnavailable: boolean
}

export interface Pinned extends Omit<Normal, 'kind' | 'isOut' | 'updatedAt'> {
export interface Pinned extends Omit<Normal, 'kind' | 'isOut' | 'updatedAt' | 'wasListened'> {
kind: 'Pinned'
isUnavailable: boolean
}
Expand Down
8 changes: 7 additions & 1 deletion src/ui/messenger/ConvoMessage/ConvoMessage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,13 @@ export const ConvoMessage = defineComponent<Props>((props) => {
)}

{message.text && <span class="ConvoMessage__text">{message.text}</span>}
{hasAttaches && <Attaches class="ConvoMessage__attaches" attaches={message.attaches} />}
{hasAttaches && (
<Attaches
class="ConvoMessage__attaches"
attaches={message.attaches}
message={message}
/>
)}

{isEmpty && (
<span class="ConvoMessage__empty">
Expand Down
22 changes: 14 additions & 8 deletions src/ui/messenger/attaches/AttachVoice/AttachVoice.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import './AttachVoice.css'

type Props = {
voice: Attach.Voice
wasListened?: boolean
}

export const AttachVoice = defineComponent<Props>((props) => {
Expand All @@ -27,7 +28,7 @@ export const AttachVoice = defineComponent<Props>((props) => {
})

const text = computed(() => {
if (props.voice.transcript && props.voice.transcript.trim() === '') {
if (!props.voice.transcript || props.voice.transcript.trim() === '') {
return lang.use('me_voice_transcription_empty')
}

Expand Down Expand Up @@ -91,13 +92,17 @@ export const AttachVoice = defineComponent<Props>((props) => {
<div class="AttachVoice__player">
<ButtonIcon
onClick={toggleAudio}
icon={isPause.value ? <Icon32PauseCircle /> : <Icon32PlayCircle />}
icon={isPause.value
? <Icon32PauseCircle withUnlistenedDot={props.wasListened} />
: <Icon32PlayCircle withUnlistenedDot={props.wasListened} />}
/>

<div class="AttachVoice__track">
<div class="AttachVoice__trackContent">
<input
class="AttachVoice__range"
type="range"
step="0.1"
id="track"
name="track"
value={range.value}
Expand All @@ -120,11 +125,12 @@ export const AttachVoice = defineComponent<Props>((props) => {
</div>
{!isHiddenCollapse.value && (
<div class="AttachVoice__transcript">
<div class={['AttachVoice__collapse', {
'AttachVoice__collapse--open': !isHiddenCollapse.value,
'AttachVoice__collapse--close': isHiddenCollapse.value,
'AttachVoice__collapse--faded': transcriptNotReady.value
}]}
<div
class={['AttachVoice__collapse', {
'AttachVoice__collapse--open': !isHiddenCollapse.value,
'AttachVoice__collapse--close': isHiddenCollapse.value,
'AttachVoice__collapse--faded': transcriptNotReady.value
}]}
>
{text.value}
</div>
Expand All @@ -133,5 +139,5 @@ export const AttachVoice = defineComponent<Props>((props) => {
</div>
)
}, {
props: ['voice']
props: ['voice', 'wasListened']
})
8 changes: 6 additions & 2 deletions src/ui/messenger/attaches/Attaches.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { defineComponent } from 'vue'
import * as Attach from 'model/Attach'
import * as Message from 'model/Message'
import { useEnv } from 'hooks'
import { ClassName } from 'misc/utils'
import { AttachVoice } from './AttachVoice/AttachVoice'
Expand All @@ -11,6 +12,7 @@ import './Attaches.css'

type Props = {
attaches: Attach.Attaches
message?: Message.Normal
class: ClassName
}

Expand All @@ -23,7 +25,9 @@ export const Attaches = defineComponent<Props>((props) => {
{props.attaches.photos && <AttachPhotos photos={props.attaches.photos} />}
{props.attaches.links?.map((link) => <AttachLink link={link} />)}
{props.attaches.wall && <AttachWall wall={props.attaches.wall} />}
{props.attaches.voice && <AttachVoice voice={props.attaches.voice} />}
{props.attaches.voice && (
<AttachVoice voice={props.attaches.voice} wasListened={props.message?.wasListened} />
)}
{props.attaches.unknown?.map((unknown) => (
<div class="Attaches__unknown">
{lang.use('me_unknown_attach')} ({unknown.type})
Expand All @@ -32,5 +36,5 @@ export const Attaches = defineComponent<Props>((props) => {
</div>
)
}, {
props: ['attaches', 'class']
props: ['attaches', 'class', 'message']
})
1 change: 1 addition & 0 deletions src/ui/ui/ButtonIcon/ButtonIcon.css
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
flex: none;
position: relative;
border-radius: 6px;
line-height: 0;
transition: background-color var(--fastTransition), opacity var(--fastTransition);
}

Expand Down
Binary file added vk.zip
Binary file not shown.

0 comments on commit f44295d

Please sign in to comment.