CatPtain's picture
Upload 339 files
89ce340 verified
<template>
<div class="remark">
<div
class="resize-handler"
@mousedown="$event => resize($event)"
></div>
<Editor
:value="remark"
ref="editorRef"
@update="value => handleInput(value)"
/>
</div>
</template>
<script lang="ts" setup>
import { computed, nextTick, ref, watch } from 'vue'
import { storeToRefs } from 'pinia'
import { useSlidesStore } from '@/store'
import Editor from './Editor.vue'
const props = defineProps<{
height: number
}>()
const emit = defineEmits<{
(event: 'update:height', payload: number): void
}>()
const slidesStore = useSlidesStore()
const { currentSlide } = storeToRefs(slidesStore)
const editorRef = ref<InstanceType<typeof Editor>>()
watch(() => currentSlide.value.id, () => {
nextTick(() => {
editorRef.value!.updateTextContent()
})
}, {
immediate: true,
})
const remark = computed(() => currentSlide.value?.remark || '')
const handleInput = (content: string) => {
slidesStore.updateSlide({ remark: content })
}
const resize = (e: MouseEvent) => {
let isMouseDown = true
const startPageY = e.pageY
const originHeight = props.height
document.onmousemove = e => {
if (!isMouseDown) return
const currentPageY = e.pageY
const moveY = currentPageY - startPageY
let newHeight = -moveY + originHeight
if (newHeight < 40) newHeight = 40
if (newHeight > 360) newHeight = 360
emit('update:height', newHeight)
}
document.onmouseup = () => {
isMouseDown = false
document.onmousemove = null
document.onmouseup = null
}
}
</script>
<style lang="scss" scoped>
.remark {
position: relative;
border-top: 1px solid $borderColor;
}
.resize-handler {
height: 7px;
position: absolute;
top: -3px;
left: 0;
right: 0;
cursor: n-resize;
z-index: 2;
}
</style>