|
|
|
@ -43,32 +43,32 @@ const displayTime = computed(() => {
|
|
|
|
|
<template>
|
|
|
|
|
<div class="message-container" :class="{ assistant: props.assistant }">
|
|
|
|
|
<div class="message container">
|
|
|
|
|
<div class="avatar-col">
|
|
|
|
|
<div class="message-avatar">
|
|
|
|
|
<ion-avatar class="avatar">
|
|
|
|
|
<img :src="props.avatar" />
|
|
|
|
|
</ion-avatar>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="message-content">
|
|
|
|
|
<div class="message-header">
|
|
|
|
|
<div class="header-left text-selectable">
|
|
|
|
|
<span class="message-sender">{{ props.sender }}</span>
|
|
|
|
|
<span class="message-time">{{ displayTime }}</span>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="header-right" v-if="props.msgId || props.error">
|
|
|
|
|
<ion-button fill="clear" size="small" color="primary" v-if="props.edit" @click="emit('clickEdit')">
|
|
|
|
|
<ion-icon slot="start" :icon="createOutline"></ion-icon>
|
|
|
|
|
<ion-label>编辑</ion-label>
|
|
|
|
|
</ion-button>
|
|
|
|
|
<ion-button fill="clear" size="small" color="primary" v-if="props.change" @click="emit('clickChange')">
|
|
|
|
|
<ion-icon slot="start" :icon="reloadOutline"></ion-icon>
|
|
|
|
|
<ion-label>{{ props.error ? "重试" : "换一个" }}</ion-label>
|
|
|
|
|
</ion-button>
|
|
|
|
|
<ion-button fill="clear" size="small" color="primary" v-if="props.assistant && !props.error" @click="emit('clickCreateBranch')">
|
|
|
|
|
<ion-icon slot="start" :icon="gitNetworkOutline"></ion-icon>
|
|
|
|
|
<ion-label>创建分支</ion-label>
|
|
|
|
|
</ion-button>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="message-header">
|
|
|
|
|
<div class="header-left text-selectable">
|
|
|
|
|
<span class="message-sender">{{ props.sender }}</span>
|
|
|
|
|
<span class="message-time">{{ displayTime }}</span>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="header-right" v-if="props.msgId || props.error">
|
|
|
|
|
<ion-button fill="clear" size="small" color="primary" v-if="props.edit" @click="emit('clickEdit')">
|
|
|
|
|
<ion-icon slot="start" :icon="createOutline"></ion-icon>
|
|
|
|
|
<ion-label>编辑</ion-label>
|
|
|
|
|
</ion-button>
|
|
|
|
|
<ion-button fill="clear" size="small" color="primary" v-if="props.change" @click="emit('clickChange')">
|
|
|
|
|
<ion-icon slot="start" :icon="reloadOutline"></ion-icon>
|
|
|
|
|
<ion-label>{{ props.error ? "重试" : "换一个" }}</ion-label>
|
|
|
|
|
</ion-button>
|
|
|
|
|
<ion-button fill="clear" size="small" color="primary" v-if="props.assistant && !props.error" @click="emit('clickCreateBranch')">
|
|
|
|
|
<ion-icon slot="start" :icon="gitNetworkOutline"></ion-icon>
|
|
|
|
|
<ion-label>创建分支</ion-label>
|
|
|
|
|
</ion-button>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="message-content">
|
|
|
|
|
<div class="message-body">
|
|
|
|
|
<markdown-parser v-if="props.content !== undefined" :md="props.content" :cursor="props.cursor"></markdown-parser>
|
|
|
|
|
<div class="message-error text-selectable" v-else-if="props.error">
|
|
|
|
@ -76,7 +76,6 @@ const displayTime = computed(() => {
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="avatar-fill"></div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</template>
|
|
|
|
@ -94,30 +93,30 @@ const displayTime = computed(() => {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.message {
|
|
|
|
|
display: flex;
|
|
|
|
|
flex-direction: row;
|
|
|
|
|
gap: 16px;
|
|
|
|
|
display: grid;
|
|
|
|
|
grid-template-areas: "avatar-col message-header avatar-balance" "avatar-col message-content avatar-balance";
|
|
|
|
|
grid-template-columns: 46px 1fr 46px;
|
|
|
|
|
grid-template-rows: auto auto;
|
|
|
|
|
column-gap: 16px;
|
|
|
|
|
row-gap: 8px;
|
|
|
|
|
padding-top: 16px;
|
|
|
|
|
padding-bottom: 16px;
|
|
|
|
|
|
|
|
|
|
.avatar-col,
|
|
|
|
|
.avatar-fill {
|
|
|
|
|
flex: 0 0;
|
|
|
|
|
|
|
|
|
|
@media (max-width: 767px) {
|
|
|
|
|
grid-template-areas: "avatar-col message-header" "message-content message-content";
|
|
|
|
|
grid-template-columns: auto 1fr;
|
|
|
|
|
grid-template-rows: auto auto;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.avatar-fill {
|
|
|
|
|
width: 0;
|
|
|
|
|
flex-basis: 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@media (min-width: 768px) {
|
|
|
|
|
.avatar-fill {
|
|
|
|
|
width: 48px;
|
|
|
|
|
flex-basis: 48px;
|
|
|
|
|
}
|
|
|
|
|
.message-avatar {
|
|
|
|
|
grid-area: avatar-col;
|
|
|
|
|
display: flex;
|
|
|
|
|
justify-content: center;
|
|
|
|
|
align-items: flex-start;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.message-header {
|
|
|
|
|
grid-area: message-header;
|
|
|
|
|
display: flex;
|
|
|
|
|
justify-content: space-between;
|
|
|
|
|
align-items: center;
|
|
|
|
@ -127,12 +126,30 @@ const displayTime = computed(() => {
|
|
|
|
|
display: flex;
|
|
|
|
|
align-items: center;
|
|
|
|
|
gap: 8px;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
>.header-right {
|
|
|
|
|
display: flex;
|
|
|
|
|
flex-direction: row;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@media (max-width: 767px) {
|
|
|
|
|
|
|
|
|
|
@media (max-width: 767px) {
|
|
|
|
|
align-items: flex-start;
|
|
|
|
|
|
|
|
|
|
>.header-left {
|
|
|
|
|
flex-direction: column;
|
|
|
|
|
align-items: flex-start;
|
|
|
|
|
gap: 4px;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
>.header-right {
|
|
|
|
|
flex-direction: column;
|
|
|
|
|
|
|
|
|
|
ion-button {
|
|
|
|
|
margin: 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.message-sender {
|
|
|
|
@ -149,7 +166,7 @@ const displayTime = computed(() => {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.message-content {
|
|
|
|
|
flex: 1 1;
|
|
|
|
|
grid-area: message-content;
|
|
|
|
|
width: 100%;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|