diff --git a/src/modules/record/components/TaskRecordPreview.vue b/src/modules/record/components/TaskRecordPreview.vue index ec93a0d..f6158af 100644 --- a/src/modules/record/components/TaskRecordPreview.vue +++ b/src/modules/record/components/TaskRecordPreview.vue @@ -15,16 +15,10 @@ const { duration } = useTaskRecordMetadata(taskRecord) diff --git a/src/modules/record/hooks/useCopyRecord.hook.ts b/src/modules/record/hooks/useCopyRecord.hook.ts index d032f56..0d2605e 100644 --- a/src/modules/record/hooks/useCopyRecord.hook.ts +++ b/src/modules/record/hooks/useCopyRecord.hook.ts @@ -1,44 +1,45 @@ -import { useTaskRecordStore } from '@/modules/record/stores/useTaskRecordStore' import type { Task } from '@/modules/task/models/task' -import { formatDiffInMinutes, formatToShortDate } from '@/shared/format-date' -import { toValue } from '@vueuse/core' -import { ref, type ComputedRef } from 'vue' +import { computed, ref, type ComputedRef } from 'vue' +import { toBlob } from 'html-to-image' export const useCopyRecord = (task: ComputedRef) => { - const recordStore = useTaskRecordStore() - - const canShareTask = !!navigator.clipboard + const canShareTask = + !!navigator && !!navigator.clipboard && !!navigator.clipboard.writeText const taskCopied = ref(false) + const domId = computed(() => `task-${task.value?.id}`) const shareTask = async () => { - const t = toValue(task) + const node = document.getElementById(domId.value) - if (!t) { + if (!node) { return } - const record = recordStore.getTaskRecord(t.id) - - let clipboardText = `${t.title};${formatToShortDate(t.date)}\n - Step;Estimation;Duration\n` - - t.steps.forEach((step) => { - const recordStep = record?.stepRecords[step.id] - const duration = - recordStep && recordStep.end - ? formatDiffInMinutes(recordStep.start, recordStep.end) - : '-' - const analyze = duration <= step.estimation ? '✅' : '⚠️' - - clipboardText += `"${analyze} ${step.title}";${step.estimation};${duration}\n` + const blob = await toBlob(node, { + style: { + margin: 'inherit' + } }) - await navigator.clipboard.writeText(clipboardText) - taskCopied.value = true + if (!blob) { + return + } - setTimeout(() => { - taskCopied.value = false - }, 2000) + try { + await navigator.clipboard.write([ + new ClipboardItem({ + [blob.type]: blob + }) + ]) + + taskCopied.value = true + } catch (error) { + console.warn(error) + } finally { + setTimeout(() => { + taskCopied.value = false + }, 2000) + } } return { diff --git a/src/views/task/TaskView.vue b/src/views/task/TaskView.vue index d609d47..3e90853 100644 --- a/src/views/task/TaskView.vue +++ b/src/views/task/TaskView.vue @@ -6,6 +6,7 @@ import { useCopyRecord } from '@/modules/record/hooks/useCopyRecord.hook' import { useTaskStore } from '@/modules/task/stores/useTask.store' import { computed } from 'vue' import { useRouter } from 'vue-router' +import StepRecord from '@/modules/record/components/StepRecord.vue' const props = defineProps<{ id: string @@ -31,47 +32,78 @@ const { canShareTask, taskCopied, shareTask } = useCopyRecord(task)