You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ygdc/assets/js/kirby.js

153 lines
3.8 KiB

2 months ago
import { ref, reactive, watch, computed } from "vue";
function isIterable(obj) {
// checks for null and undefined
if (obj == null) {
return false;
}
return typeof obj[Symbol.iterator] === 'function';
}
export async function homeAction(options = {}) {
return await ( await fetch("/", {
method: "POST",
headers: {
Accept: "application/json",
},
body: JSON.stringify(options),
})).json();
}
export async function getQuery(query, options = {}) {
return (await ( await fetch("/api/query", {
method: "POST",
headers: {
Accept: "application/json",
// completely unsafe
// Authorization: "Basic "+btoa("api@api.de:H]RcScp];76!-PB")
},
body: JSON.stringify({
query: query,
...options
}),
})).json()).result;
}
async function getKirby(endpoint) {
return (await (await fetch("/api"+endpoint, {
method: "GET",
headers: {
// completely unsafe
Authorization: "Basic "+btoa("api@api.de:H]RcScp];76!-PB")
}
})).json()).data;
// .catch(error => {
// console.log("Error:", error);
// });
}
export async function setKirby(endpoint, data) {
const response = await fetch(`/${endpoint}`, {
method: "POST",
cache: "no-cache",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
action: "update",
data: data
}),
});
const ret = await response.json();
return ret;
}
function updateContent(endpoint, data) {
return fetch("/api"+endpoint, {
method: "PATCH",
headers: {
// "X-CSRF" : g_csrf,
// completely unsafe
"Authorization": "Basic "+btoa("api@api.de:H]RcScp];76!-PB")
},
body: JSON.stringify(data)
})
.then(response => response.json())
.then(response => {
// console.log(response.data);
})
.catch(error => {
console.log("Error:", error);
});
}
export const convertToPages = async (obj) => {
for(var key in obj){
if (obj[key].hasOwnProperty("link")) {
obj[key] = await kirbyPage(obj[key].link);
} else if (Array.isArray(obj[key]) || typeof obj[key] === 'object' ) {
obj[key] = convertToPages(obj[key]);
}
}
return obj;
}
export const kirbyPage = async (endpoint) => {
if (!endpoint.startsWith("/pages/")){
endpoint = "/pages/"+endpoint.replaceAll("/","+");
}
let patch = false;
const page = new Proxy(reactive({}), {
async set(target, key, value) {
if(value.hasOwnProperty("uuid") && value.uuid.startsWith("page://")){
value = await kirbyPage(value.link);
}
if (Array.isArray(value) || typeof value === 'object' ) {
for(var i in value){
if (value[i].hasOwnProperty("uuid") && value[i].uuid.startsWith("page://")) {
value[i] = await kirbyPage(value[i].link);
}
}
}
target[key] = value;
if (patch) {
const data = {};
if (value.isPage) {
data[key] = "page://"+value.uuid;
} else if (Array.isArray(value) || typeof value === 'object' ) {
data[key] = [];
for (var i in value) {
if (value[i].isPage) {
data[key].push("page://"+value[i].uuid);
} else {
data[key].push(value[i]);
}
}
} else {
data[key] = value;
}
updateContent(endpoint, data);
}
return true;
},
get(target, prop, receiver) {
if (prop == "isPage") {
return true;
}
return target[prop];
}
}
);
const lastData = ref({});
const kData = await getKirby(endpoint);
Object.assign(page, kData.content);
patch = true;
return page;
}