import { computed, defineComponent, onBeforeUpdate, onMounted, type PropType, } from 'vue'; import { DefaultComponentProps } from '../_default'; import BCMSImage from '../image'; import BCMSIcon from '../icon'; import BCMSLink from '../link'; import BCMSTextArea from './text-area'; import { type BCMSMedia, type BCMSPropValueMediaData, BCMSMediaType, } from '@becomes/cms-sdk/types'; import { useTranslation } from '../../translations'; const component = defineComponent({ props: { ...DefaultComponentProps, value: { type: Object as PropType, default: () => { return { _id: '', }; }, }, label: { type: String, default: '', }, showLink: { type: Boolean, default: true, }, invalidText: { type: String, default: '', }, showAlt: { type: Boolean, default: true, }, showCaption: { type: Boolean, default: true, }, propPath: String, }, emits: { clear: () => { return true; }, click: () => { return true; }, altTextChange: (_value: string) => { return true; }, captionChange: (_value: string) => { return true; }, }, setup(props, ctx) { const translations = computed(() => { return useTranslation(); }); const throwable = window.bcms.util.throwable; const store = window.bcms.vue.store; const broken = computed(() => { if (props.value._id) { const m = store.getters.media_findOne((e) => e._id === props.value._id); if (!m) { return true; } } return false; }); const media = computed< { data: BCMSMedia; src: string; type: BCMSMediaType } | undefined >(() => { const m = store.getters.media_findOne((e) => e._id === props.value._id); if (!m) { return undefined; } return { data: m, src: m.name, type: m.type, }; }); let idBuffer = '' + props.value._id; async function getMedia() { await throwable( async () => { await window.bcms.sdk.media.getById(idBuffer); }, undefined, async () => { // Do nothing } ); } onMounted(async () => { if (!media.value && idBuffer) { getMedia(); } }); onBeforeUpdate(async () => { if (idBuffer !== props.value._id) { idBuffer = props.value._id; if (!media.value && idBuffer.length === 24) { await getMedia(); } } }); return () => (
{props.label && ( {props.label} )}
{props.value ? ( <> {media.value && props.showLink && ( )} {(media.value || broken.value) && ( )} ) : ( )}
{props.showAlt && ( { ctx.emit('altTextChange', value); }} /> )} {props.showCaption && ( { ctx.emit('captionChange', value); }} /> )}
); }, }); export default component;