schlechtenburg/packages/example-site/composables/editor.ts

103 lines
2.5 KiB
TypeScript

import { IBlockData, SbMode } from "@schlechtenburg/core";
import { IPage } from "./pages";
export const useEditor = () => {
const {
currentPage,
currentPageId,
setCurrentPageId,
} = useCurrentPage();
const {
removePage,
updatePage,
pages,
} = usePages();
const mode = useState<SbMode>('mode', () => SbMode.View);
const draft = useState<IBlockData<any>|null>('draft', () => null);
const setMode = (newMode: SbMode) => {
mode.value = newMode;
};
const updateDraft = (newDraft: IBlockData<any>) => {
draft.value = newDraft;
}
const edit = (block: IBlockData<any>) => {
draft.value = block;
mode.value = SbMode.Edit;
updateDraft(currentPage.value?.attributes?.block!);
};
const save = async () => {
if (currentPageId.value === 'draft') {
const { data, error } = await useAsyncGql(
'createPage',
{ data: {
title: currentPage.value?.attributes?.title,
slug: currentPage.value?.attributes?.slug,
block: currentPage.value?.attributes?.block,
parent: currentPage.value?.attributes?.parent?.data?.id,
publishedAt: (new Date()).toISOString(),
}}
);
if (error.value) {
console.error('Error creating page!');
console.error('error:', error.value);
console.error('data:', data.value);
return;
}
setMode(SbMode.View);
updatePage(data.value?.createPage?.data?.attributes?.block);
updateDraft(data.value?.createPage?.data?.attributes?.block);
navigateTo(getPagePath(data.value?.createPage?.data! as IPage, pages.value));
return;
} else {
const { data, error } = await useAsyncGql(
'updatePage',
{
id: currentPage.value?.id || '',
data: {
block: draft.value!
},
},
);
if (error.value) {
console.error('Error updating page!');
console.error('error:', error.value);
console.error('data:', data.value);
return;
}
setMode(SbMode.View);
updatePage(data.value?.updatePage?.data?.attributes?.block);
updateDraft(data.value?.updatePage?.data?.attributes?.block);
}
};
const cancel = () => {
setMode(SbMode.View);
if (currentPageId.value === 'draft') {
setCurrentPageId(currentPage.value?.attributes?.parent?.data?.id || null);
removePage('draft');
}
};
return {
mode,
setMode,
edit,
cancel,
save,
draft,
updateDraft,
};
};