directus-extension-seo
Version:
Directus SEO Extension enhance Directus with powerful SEO scoring and validator and AI SEO from ChatGPT
171 lines (147 loc) • 5.09 kB
text/typescript
import { Ref, computed, onMounted, ref } from "vue"
import { useApi, useStores } from "@directus/composables"
import merge from 'lodash/merge'
import useLanguage from "./use-languages"
import { COLLECTION } from "../constants"
import { defu } from "defu";
import { get, mergeWith } from "lodash"
export default function useItem(collection: string = '', key: string = '', isMultilang: boolean = true, defaultValue: any = {}) {
const { useNotificationsStore } = useStores()
const notify = useNotificationsStore()
const settings = ref(defaultValue)
const item = ref(defaultValue)
const isNew = ref(false)
const loading = ref(false)
const saving = ref(false)
const error = ref()
console.log('defaultValue', defaultValue, item.value)
const { currentLanguage, languages } = useLanguage()
const itemLang = computed(() => {
return (isMultilang && currentLanguage.value) ? item.value?.[currentLanguage.value] : item.value
})
const editData = computed({
get: () => isMultilang ? settings.value?.[currentLanguage.value] : settings.value,
set: (newValue) => {
if (isMultilang) {
settings.value[currentLanguage.value] = mergeWith({}, itemLang.value, newValue, function (_from: any, to: any) {
if (typeof to !== 'undefined') {
return to;
}
})
return
}
settings.value = mergeWith({}, item.value, newValue, function (_from: any, to: any) {
if (typeof to !== 'undefined') {
return to;
}
})
},
})
const api = useApi()
const endPoint = `/items/${collection}`
function getSaveValue() {
let value = defaultValue
if(isMultilang) {
languages.value.map(({value: lang}) => {
let itemValue = get(item.value, lang) || defaultValue
let settingsValue = get(settings.value, lang) || defaultValue
value[lang] = mergeWith(itemValue, settingsValue, function (_from: any, to: any) {
if (typeof to !== 'undefined') {
return to;
}
})
// if(Object.keys(itemValue) || Object.keys(settingsValue)) {
// }
})
} else {
value = mergeWith(defaultValue, item.value, settings.value, function (_from: any, to: any) {
if (typeof to !== 'undefined') {
return to;
}
},)
}
return value
}
// const saveData = computed(() => (collection === COLLECTION.seo_setting ? {
// value: getSaveValue()
// } : mergeWith(defaultValue, item.value, settings.value, function (_from: any, to: any) {
// if (typeof to !== 'undefined') {
// return to;
// }
// },)))
async function getItem() {
if( key === '+' ) {
return
}
loading.value = true;
error.value = null;
try {
const response = await api.get(`${endPoint}/${key}`, {params: {fields: ['*.*']}});
if(response?.data?.data?.value) {
item.value = response?.data?.data?.value;
} else if(response?.data?.data) {
item.value = response?.data?.data;
}
} catch (err: any) {
error.value = err;
isNew.value = true
} finally {
loading.value = false;
}
}
async function save(data: any = {}) {
saving.value = true;
try {
let response;
let requestData = isMultilang ? {
value: {
...item.value,
...settings.value
}
} : settings.value
if (isNew.value === true) {
response = await api.post(endPoint, {...requestData, ...data});
} else {
response = await api.patch(`${endPoint}/${key}`, {...requestData, ...data});
isNew.value = false
}
notify.add({
type: 'success',
title: 'Saved Successfully!'
})
if(response?.data?.data?.value) {
item.value = response?.data?.data?.value;
} else if(response?.data?.data) {
item.value = response?.data?.data;
}
isNew.value = false
return response.data.data;
} catch (err: any) {
// saveErrorHandler(err);
console.log(err)
notify.add({
type: 'error',
title: 'Save Error'
})
} finally {
saving.value = false;
}
}
onMounted(async () => {
await getItem()
})
return {
settings,
item,
itemLang,
editData,
// saveData,
currentLanguage,
languages,
saving,
loading,
error,
getItem,
save,
}
}