import classNames from "classnames"; import { Ellipsis, EyeOffIcon, LucideIcon, SearchCode, XIcon, } from "lucide-react"; import { isEqual as _isEqual } from "lodash-es"; import ContentifyForm from "./contentify-form"; import { type ReactNode, createContext, useState, useMemo, useEffect, } from "react"; import Modal from "./components/modal"; import { IconType } from "react-icons/lib"; import toast, { Toaster } from "react-hot-toast"; import MetaContentForm from "./meta-content-form"; import useLocalStorage from "./utils/use-local-storage"; import SigninIcon from "./components/icons/signin-icon"; import { BsLaptop, BsPhone, BsTablet } from "react-icons/bs"; import { IframeWithStyles } from "./components/IframeWithStyles"; import { ContextType, Field, PageData, User, AssetSource } from "./types"; // CSS is imported in index.ts to ensure styles are bundled export const CMSContext = createContext({ editMode: false, editing: { id: null, inputs: [] }, pageData: {} as PageData, setPageData: () => {}, setEditing: () => {}, hoveredId: null, setHoveredId: () => {}, disabledItems: [], setDisabledItems: () => {}, screenSize: "default", assetSource: undefined, pages: [], onPageSearch: () => Promise.resolve([]), }); export type CMSProviderProps = { children?: ReactNode; user: User | null; initialPageData: PageData; onSignout: () => void; onSignin: () => void; onPublish: (pageData: PageData) => Promise; assetSource?: AssetSource; pages: { id: string; path: string; title: string }[]; onPageSearch?: (search: string) => Promise<{ path: string; title: string }[]>; }; export function CMSProvider({ children, user, initialPageData, pages, onSignout, onSignin, onPublish, assetSource, onPageSearch, }: CMSProviderProps) { const [showMetaContentForm, setShowMetaContentForm] = useState(false); const [publishing, setPublishing] = useState(false); const [pageData, setPageData] = useState({}); const [screenSize, setScreenSize] = useLocalStorage< ContextType["screenSize"] >("screenSize", "default"); const [editMode, setEditMode] = useLocalStorage("editMode", false); const [editing, setEditing] = useState<{ id: string | null; inputs: Field[]; }>({ id: null, inputs: [] }); const [hoveredId, setHoveredId] = useState(null); const [disabledItems, setDisabledItems] = useLocalStorage( "disabledItems", [] ); useEffect(() => { setPageData(structuredClone(initialPageData) || {}); }, [initialPageData]); const isInEditMode = !!user && editMode; const touched = useMemo( () => !_isEqual(initialPageData, pageData), [pageData, initialPageData] ); const ScreensizeButton = ({ Icon, size, }: { Icon: LucideIcon | IconType; size: ContextType["screenSize"]; }) => { return ( ); }; // if (_isEmpty(pageData)) return <>; return (
{!user ? ( <> {children} ) : ( <>
{editMode ? ( <>
) : ( <>  )}
{touched && ( <> )} {editMode ? ( ) : null}
{(() => { const widthPx = screenSize === "desktop" ? 1536 : screenSize === "tablet" ? 1280 : screenSize === "phone" ? 640 : undefined; // default if (widthPx === undefined) { // Screen size = default → render without iframe return (
{children}
); } return (
{children}
); })()} {editing.id ? ( setEditing({ id: null, inputs: [] })}> setEditing({ id: null, inputs: [] })} /> ) : null} {showMetaContentForm ? ( setShowMetaContentForm(false)}> setShowMetaContentForm(false)} /> ) : null}
)}
); } export default CMSProvider;