import { useEffect, useState } from '@wordpress/element'; import apiFetch from '@wordpress/api-fetch'; import { exportJson } from '@components/Settings/SettingHelpers'; import { Button, FormFileUpload, Notice, TextControl, ToggleControl, } from '@wordpress/components'; import type { ResponseProps } from '@components/DesignPanel/types'; import { TabsWrapper, TabsList, TabsContent } from '@components/ui/Tabs'; import { PasswordInput } from '@components/ui/PasswordInput'; import PageIcon from 'blockbite-icons/dist/Pencil1'; import { Icon as IconComp } from '@components/ui/Icon'; type findReplaceType = { from: string; to: string; }; export const SynchronisationPanel = () => { const [message, setMessage] = useState(''); const [findReplace, setFindReplace] = useState({ from: '', to: '', }); const [currentVersion] = useState(wpApiSettings.itemsVersion); const [isSwiperEnabled, setIsSwiperEnabled] = useState(false); const [openAiKey, setOpenAiKey] = useState(''); useEffect(() => { // Fetch the initial state from the server const fetchLibrarySettings = async () => { const response = await apiFetch({ path: '/blockbite/v1/settings/swiper', }); setIsSwiperEnabled((response as any).isSwiperEnabled); }; // Fetch openai key const fetchOpenAiKey = async () => { const response = await apiFetch({ path: '/blockbite/v1/settings/openai_key', }); setOpenAiKey((response as any)?.key || ''); }; fetchLibrarySettings(); fetchOpenAiKey(); }, []); /* Export items to json file And generate download */ const handleExport = async (handle: string) => { try { const response = await apiFetch({ path: `/blockbite/v1/settings/site/sync-items?handle=${handle}`, method: 'GET', }); exportJson(response, handle); } catch (error) { console.error(error); } }; /* Import items from json file */ const handleImport = async (event: any, handle: string) => { const file = event.currentTarget.files[0]; const formData = new FormData(); formData.append('file', file); formData.append('handle', handle); try { const response = (await apiFetch({ path: `/blockbite/v1/settings/site/sync-items`, method: 'POST', body: formData, })) as ResponseProps; if (response.status === 200) { setMessage('Preset imported successfully'); } } catch (error) { console.error(error); } }; /* Sync blockbite core items into the database */ const handleSync = async (handle: string) => { try { const response = await apiFetch({ path: `/blockbite/v1/settings/blockbite/sync-items`, method: 'POST', data: { version: currentVersion, handle: handle, platform: 'blockbite', }, }); exportJson(response, 'preset'); } catch (error) {} }; /* Sync templates folder within theme Creates a new folder called migrated-templates and copies all the templates and template-parts */ const handleMigrateTemplates = async () => { try { const response = (await apiFetch({ path: `/blockbite/v1/settings/migrate-templates`, method: 'POST', data: { find: findReplace.from, replace: findReplace.to, }, })) as ResponseProps; setMessage(response.message); } catch (error) { console.error(error); } }; const handleSwiperToggle = async () => { try { await apiFetch({ path: '/blockbite/v1/settings/swiper', method: 'POST', data: { isSwiperEnabled: !isSwiperEnabled }, }); setIsSwiperEnabled(!isSwiperEnabled); setMessage('Settings updated successfully'); } catch (error) { console.error('Failed to update setting:', error); } }; const handleOpenAiKeySubmit = async () => { if (!openAiKey) { setMessage('Please enter an OpenAI API key'); return; } try { await apiFetch({ path: '/blockbite/v1/settings/openai_key', method: 'POST', data: { key: openAiKey }, }); setMessage('Settings updated successfully'); } catch (error) { console.error('Failed to update setting:', error); } }; return ( <> {message && ( { setMessage(''); }} > {message} )}
} onChange={(event) => handleImport(event, 'preset')} > Import Presets

Sync Blockbite Presets

Synchronize Blockbite presets to your preset panel

Current version: {currentVersion}
} onChange={(event) => handleImport(event, 'design-tokens')} > Import Tokens

Sync Blockbite Tokens

Synchronize Blockbite tokens to your preset panel

Current version: {currentVersion}

Exports Blockbite templates to your theme within a new folder called
migrated-templates

Find and replace theme name

setFindReplace({ ...findReplace, from: value }) } /> setFindReplace({ ...findReplace, to: value }) } />

Connect your Blockbite account with third-party integrations

); }; export default SynchronisationPanel;