| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- <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, useTemplateRef, 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 = useTemplateRef<InstanceType<typeof Editor>>('editorRef')
- 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>
|