Skip to content
Snippets Groups Projects
messaging-room.message.vue 5.02 KiB
Newer Older
こぴなたみぽ's avatar
wip
こぴなたみぽ committed
<template>
syuilo's avatar
syuilo committed
<div class="message" :data-is-me="isMe">
syuilo's avatar
syuilo committed
	<mk-avatar class="avatar" :user="message.user" target="_blank"/>
syuilo's avatar
syuilo committed
	<div class="content">
syuilo's avatar
syuilo committed
		<div class="balloon" :data-no-text="message.text == null">
syuilo's avatar
syuilo committed
			<p class="read" v-if="isMe && message.isRead">%i18n:@is-read%</p>
syuilo's avatar
syuilo committed
			<button class="delete-button" v-if="isMe" title="%i18n:common.delete%">
syuilo's avatar
syuilo committed
				<img src="/assets/desktop/messaging/delete.png" alt="Delete"/>
			</button>
syuilo's avatar
syuilo committed
			<div class="content" v-if="!message.isDeleted">
syuilo's avatar
syuilo committed
				<mk-note-html class="text" v-if="message.text" ref="text" :text="message.text" :i="os.i"/>
syuilo's avatar
syuilo committed
				<div class="file" v-if="message.file">
					<a :href="message.file.url" target="_blank" :title="message.file.name">
						<img v-if="message.file.type.split('/')[0] == 'image'" :src="message.file.url" :alt="message.file.name"/>
						<p v-else>{{ message.file.name }}</p>
					</a>
syuilo's avatar
syuilo committed
				</div>
こぴなたみぽ's avatar
wip
こぴなたみぽ committed
			</div>
syuilo's avatar
syuilo committed
			<div class="content" v-if="message.isDeleted">
syuilo's avatar
syuilo committed
				<p class="is-deleted">%i18n:@deleted%</p>
こぴなたみぽ's avatar
wip
こぴなたみぽ committed
			</div>
		</div>
syuilo's avatar
syuilo committed
		<div></div>
		<mk-url-preview v-for="url in urls" :url="url" :key="url"/>
こぴなたみぽ's avatar
wip
こぴなたみぽ committed
		<footer>
syuilo's avatar
syuilo committed
			<mk-time :time="message.createdAt"/>
syuilo's avatar
syuilo committed
			<template v-if="message.is_edited">%fa:pencil-alt%</template>
こぴなたみぽ's avatar
wip
こぴなたみぽ committed
		</footer>
	</div>
</div>
</template>

<script lang="ts">
import Vue from 'vue';
import parse from '../../../../../text/parse';
こぴなたみぽ's avatar
wip
こぴなたみぽ committed

export default Vue.extend({
syuilo's avatar
syuilo committed
	props: {
		message: {
			required: true
		}
Akihiko Odaki's avatar
Akihiko Odaki committed
	},
こぴなたみぽ's avatar
wip
こぴなたみぽ committed
	computed: {
		isMe(): boolean {
syuilo's avatar
syuilo committed
			return this.message.userId == (this as any).os.i.id;
syuilo's avatar
syuilo committed
		},
		urls(): string[] {
			if (this.message.text) {
				const ast = parse(this.message.text);
				return ast
					.filter(t => (t.type == 'url' || t.type == 'link') && !t.silent)
					.map(t => t.url);
			} else {
				return null;
			}
こぴなたみぽ's avatar
wip
こぴなたみぽ committed
		}
	}
});
</script>

<style lang="stylus" scoped>
syuilo's avatar
syuilo committed
@import '~const.styl'

root(isDark)
	$me-balloon-color = $theme-color
こぴなたみぽ's avatar
wip
こぴなたみぽ committed

	padding 10px 12px 10px 12px
	background-color transparent

syuilo's avatar
syuilo committed
	> .avatar
こぴなたみぽ's avatar
wip
こぴなたみぽ committed
		display block
syuilo's avatar
syuilo committed
		position absolute
		top 10px
syuilo's avatar
syuilo committed
		width 54px
		height 54px
		border-radius 8px
		transition all 0.1s ease
こぴなたみぽ's avatar
wip
こぴなたみぽ committed

syuilo's avatar
syuilo committed
	> .content
こぴなたみぽ's avatar
wip
こぴなたみぽ committed

		> .balloon
			display block
			padding 0
syuilo's avatar
syuilo committed
			max-width calc(100% - 16px)
こぴなたみぽ's avatar
wip
こぴなたみぽ committed
			min-height 38px
			border-radius 16px

			&:before
				content ""
				pointer-events none
				display block
				position absolute
				top 12px

syuilo's avatar
syuilo committed
			& + *
				clear both

こぴなたみぽ's avatar
wip
こぴなたみぽ committed
			&:hover
				> .delete-button
					display block

			> .delete-button
				display none
				position absolute
				z-index 1
				top -4px
				right -4px
				margin 0
				padding 0
				cursor pointer
				outline none
				border none
				border-radius 0
				box-shadow none
				background transparent

				> img
					vertical-align bottom
					width 16px
					height 16px
					cursor pointer

			> .read
				user-select none
				display block
				position absolute
				z-index 1
				bottom -4px
				left -12px
				margin 0
syuilo's avatar
syuilo committed
				color isDark ? rgba(#fff, 0.5) : rgba(#000, 0.5)
こぴなたみぽ's avatar
wip
こぴなたみぽ committed
				font-size 11px

			> .content

				> .is-deleted
					display block
					margin 0
					padding 0
					overflow hidden
					overflow-wrap break-word
					font-size 1em
syuilo's avatar
syuilo committed
					color rgba(#000, 0.5)
こぴなたみぽ's avatar
wip
こぴなたみぽ committed

syuilo's avatar
syuilo committed
				> .text
こぴなたみぽ's avatar
wip
こぴなたみぽ committed
					display block
					margin 0
					padding 8px 16px
					overflow hidden
					overflow-wrap break-word
					font-size 1em
syuilo's avatar
syuilo committed
					color rgba(#000, 0.8)
こぴなたみぽ's avatar
wip
こぴなたみぽ committed

					& + .file
syuilo's avatar
syuilo committed
						> a
							border-radius 0 0 16px 16px
こぴなたみぽ's avatar
wip
こぴなたみぽ committed

				> .file
syuilo's avatar
syuilo committed
					> a
						display block
						max-width 100%
						max-height 512px
						border-radius 16px
						overflow hidden
						text-decoration none

						&:hover
							text-decoration none

							> p
								background #ccc

						> *
こぴなたみぽ's avatar
wip
こぴなたみぽ committed
							display block
syuilo's avatar
syuilo committed
							margin 0
							width 100%
							height 100%

						> p
							padding 30px
							text-align center
							color #555
							background #ddd

		> .mk-url-preview
			margin 8px 0
こぴなたみぽ's avatar
wip
こぴなたみぽ committed

		> footer
			display block
syuilo's avatar
syuilo committed
			margin 2px 0 0 0
こぴなたみぽ's avatar
wip
こぴなたみぽ committed
			font-size 10px
syuilo's avatar
syuilo committed
			color isDark ? rgba(#fff, 0.4) : rgba(#000, 0.4)
こぴなたみぽ's avatar
wip
こぴなたみぽ committed

			> [data-fa]
				margin-left 4px

syuilo's avatar
syuilo committed
	&:not([data-is-me])
syuilo's avatar
syuilo committed
		> .avatar
syuilo's avatar
syuilo committed
			left 12px
こぴなたみぽ's avatar
wip
こぴなたみぽ committed

syuilo's avatar
syuilo committed
		> .content
			padding-left 66px
こぴなたみぽ's avatar
wip
こぴなたみぽ committed

			> .balloon
syuilo's avatar
syuilo committed
				$color = isDark ? #2d3338 : #eee
syuilo's avatar
syuilo committed
				float left
syuilo's avatar
syuilo committed
				background $color
こぴなたみぽ's avatar
wip
こぴなたみぽ committed

syuilo's avatar
syuilo committed
				&[data-no-text]
					background transparent

				&:not([data-no-text]):before
こぴなたみぽ's avatar
wip
こぴなたみぽ committed
					left -14px
					border-top solid 8px transparent
syuilo's avatar
syuilo committed
					border-right solid 8px $color
こぴなたみぽ's avatar
wip
こぴなたみぽ committed
					border-bottom solid 8px transparent
					border-left solid 8px transparent

syuilo's avatar
syuilo committed
				> .content
					> .text
						if isDark
							color #fff

こぴなたみぽ's avatar
wip
こぴなたみぽ committed
			> footer
				text-align left

syuilo's avatar
syuilo committed
	&[data-is-me]
syuilo's avatar
syuilo committed
		> .avatar
syuilo's avatar
syuilo committed
			right 12px
こぴなたみぽ's avatar
wip
こぴなたみぽ committed

syuilo's avatar
syuilo committed
		> .content
			padding-right 66px
こぴなたみぽ's avatar
wip
こぴなたみぽ committed

			> .balloon
syuilo's avatar
syuilo committed
				float right
こぴなたみぽ's avatar
wip
こぴなたみぽ committed
				background $me-balloon-color

syuilo's avatar
syuilo committed
				&[data-no-text]
					background transparent

				&:not([data-no-text]):before
こぴなたみぽ's avatar
wip
こぴなたみぽ committed
					right -14px
					left auto
					border-top solid 8px transparent
					border-right solid 8px transparent
					border-bottom solid 8px transparent
					border-left solid 8px $me-balloon-color

				> .content

					> p.is-deleted
syuilo's avatar
syuilo committed
						color rgba(#fff, 0.5)
こぴなたみぽ's avatar
wip
こぴなたみぽ committed

syuilo's avatar
syuilo committed
					> .text >>>
こぴなたみぽ's avatar
wip
こぴなたみぽ committed
						&, *
							color #fff !important

			> footer
				text-align right

syuilo's avatar
syuilo committed
	&[data-is-deleted]
syuilo's avatar
syuilo committed
		> .baloon
			opacity 0.5
こぴなたみぽ's avatar
wip
こぴなたみぽ committed

syuilo's avatar
syuilo committed
.message[data-darkmode]
	root(true)

.message:not([data-darkmode])
	root(false)

こぴなたみぽ's avatar
wip
こぴなたみぽ committed
</style>