'use client'; import { Fragment, useState } from "react"; //import { useRootData } from "~/utils/data/useRootData"; import clsx from "clsx"; import PageBlockUtils from "./PageBlockUtils"; import {ButtonSecondary} from "../../../../components/ui/buttons/ButtonSecondary"; import DownArrow from "../../../../components/ui/icons/DownArrow"; import PencilIcon from "../../../../components/ui/icons/PencilIcon"; import PlusIcon from "../../../../components/ui/icons/PlusIcon"; import TrashEmptyIcon from "../../../../components/ui/icons/TrashEmptyIcon"; import UpArrow from "../../../../components/ui/icons/UpArrow"; import Modal from "../../../../components/ui/modals/Modal"; import SlideOverWideEmpty from "../../../../components/ui/slideOvers/SlideOverWideEmpty"; import { PageBlock, PageBlockForm } from "./PageBlock"; import LayoutBlockUtils from "./shared/layout/LayoutBlockUtils"; import { PageBlockDto } from "../../dtos/PageBlockDto"; import PageBlockEditMode from "./PageBlockEditMode"; import ChatGptGeneratePageBlock from "../../../ai/components/ChatGptGeneratePageBlock"; import { useApp } from "../../../../hooks"; export function PageBlocks({ items, editor, onChange, className = "overflow-hidden", }: { items: PageBlockDto[]; editor?: { add?: boolean; edit?: boolean; remove?: boolean; move?: boolean; download?: boolean; ai?: boolean }; onChange?: (items: PageBlockDto[]) => void; className?: string; }) { const { userSession } = {userSession : {}}//useRootData(); const [editingBlockIndex, setEditingBlockIndex] = useState(-1); const [editingBlock, setEditingBlock] = useState(); const [editinBlockType, setEditingBlockType] = useState(""); const [blocksLoading, setBlocksLoading] = useState([]); function onRemove(block: PageBlockDto) { if (onChange) { onChange(items.filter((b) => b !== block)); } } function onEdit(block: PageBlockDto, index: number) { setEditingBlock(block); setEditingBlockType(getType(block)); setEditingBlockIndex(index); } function onMoveUp(block: PageBlockDto) { const index = items.indexOf(block); if (index > 0) { const newBlocks = [...items]; newBlocks[index] = newBlocks[index - 1]; newBlocks[index - 1] = block; if (onChange) { onChange(newBlocks); } } } function onMoveDown(block: PageBlockDto) { const index = items.indexOf(block); if (index < items.length - 1) { const newBlocks = [...items]; newBlocks[index] = newBlocks[index + 1]; newBlocks[index + 1] = block; if (onChange) { onChange(newBlocks); } } } function onUpdateEditingBlock(newState: PageBlockDto) { if (onChange) { onChange( items.map((b, i) => { if (i === editingBlockIndex) { return { ...b, ...newState }; } return b; }) ); } } function addBlock(type: string, index?: number) { if (!PageBlockUtils.defaultBlocks.hasOwnProperty(type)) { alert("[UNDER CONSTRUCTION 🚧] Block form: " + type); return; } // @ts-ignore const newBlock = { [type]: PageBlockUtils.defaultBlocks[type] }; if (index === undefined) { if (onChange) { onChange([...items, newBlock]); } } else { if (onChange) { onChange([...items.slice(0, index), newBlock, ...items.slice(index)]); } } } function getType(item: PageBlockDto) { const keys = Object.keys(item); if (keys.length === 0) { throw new Error("Invalid block type"); } return keys[0]; } function isGeneratingAnyBlock() { return blocksLoading.length > 0; } function isGeneratingBlock(index: number) { return blocksLoading.includes(index); } function onGenerated(index: number, block: PageBlockDto) { const newBlocks = [...items]; newBlocks[index] = block; if (onChange) { onChange(newBlocks); } } return ( {editor?.download && onChange && onChange(e)} />}
{/* {editMode && items.length > 0 && addBlock(type, 0)} />} */} {items.map((item, idx) => { return (
{/* {editMode && idx === 0 && addBlock(type, 0)} />} */} {editor && (
{getType(item)}
{editor.remove && ( onRemove(item)}> )} {editor.edit && ( onEdit(item, idx)}> )} {editor.remove && ( <> onMoveUp(item)}> onMoveDown(item)}> )} {editor.ai && ( onGenerated(idx, newBlock)} onLoading={(isLoading) => { // console.log("onLoading", isLoading, idx); if (isLoading) { setBlocksLoading([...blocksLoading, idx]); } else { setBlocksLoading(blocksLoading.filter((i) => i !== idx)); } }} /> )}
)} {editor?.add && (
); })} {editor?.add && addBlock(type)} />} setEditingBlock(undefined)} > {editingBlock && onUpdateEditingBlock(e)} />}
); } function AddBlockButton({ onAdd, className, disabled }: { onAdd: (type: string) => void; className?: string; disabled?: boolean }) { const { t } = useApp(); const [adding, setAdding] = useState(false); return (
{t("pages.blocks")}
{Object.keys(PageBlockUtils.defaultBlocks).map((type) => { return ( ); })}
); }