diff --git a/admin/symbols/manager.php b/admin/symbols/manager.php index e7a82dd2d4..0fdf41f082 100644 --- a/admin/symbols/manager.php +++ b/admin/symbols/manager.php @@ -1,6 +1,7 @@ getList(); - foreach ( $symbols as $symbol ) { - if ( $symbol->getUid() == $uid ) { + foreach ($symbols as $symbol) { + if ($symbol->getUid() == $uid) { return $symbol; } } @@ -60,20 +63,21 @@ public function get( $uid ) { /** * @param Brizy_Admin_Symbols_Symbol $aSymbol */ - public function deleteSymbol( $aSymbol ) { - if ( ! $aSymbol ) { - throw new Exception( "Unable to delete NULL symbol" ); + public function deleteSymbol($aSymbol) + { + if (!$aSymbol) { + throw new Exception("Unable to delete NULL symbol"); } $symbols = $this->getList(); - foreach ( $symbols as $i => $symbol ) { - if ( $symbol->getUid() == $aSymbol->getUid() ) { - unset( $symbols[ $i ] ); + foreach ($symbols as $i => $symbol) { + if ($symbol->getUid() == $aSymbol->getUid()) { + unset($symbols[$i]); } } - $this->saveAllSymbols( $symbols ); + $this->saveAllSymbols($symbols); } /** @@ -81,26 +85,28 @@ public function deleteSymbol( $aSymbol ) { * * @return Brizy_Admin_Symbols_Symbol */ - public function saveSymbol( $aSymbol ) { - if ( ! $aSymbol ) { - throw new Exception( "Unable to save NULL symbol" ); + public function saveSymbol($aSymbol) + { + if (!$aSymbol) { + throw new Exception("Unable to save NULL symbol"); } $symbols = $this->getList(); - foreach ( $symbols as $i => $symbol ) { - if ( $symbol->getUid() == $aSymbol->getUid() ) { - $symbols[ $i ] = $aSymbol; - $this->saveAllSymbols( $symbols ); + foreach ($symbols as $i => $symbol) { + if ($symbol->getUid() == $aSymbol->getUid()) { + $symbols[$i] = $aSymbol; + $this->saveAllSymbols($symbols); return; } } $symbols[] = $aSymbol; - $this->saveAllSymbols( $symbols ); + $this->saveAllSymbols($symbols); } - private function saveAllSymbols( $symbols ) { - update_option( self::BRIZY_SYMBOLS_KEY, base64_encode( json_encode( $symbols ) ) ); + private function saveAllSymbols($symbols) + { + update_option(self::BRIZY_SYMBOLS_KEY, base64_encode(json_encode($symbols))); } /** @@ -108,29 +114,28 @@ private function saveAllSymbols( $symbols ) { * * @return void */ - public function validateSymbol( $symbol ) { - if ( is_null( $symbol->getUid() ) || empty( $symbol->getUid() ) ) { - throw new Exception( 'Please provide the symbol uid' ); + public function validateSymbol($symbol) + { + if (is_null($symbol->getUid()) || empty($symbol->getUid())) { + throw new Exception('Please provide the symbol uid'); } - if ( is_null( $symbol->getVersion() ) || empty( $symbol->getVersion() ) ) { - throw new Exception( 'Please provide the symbol version' ); + if (is_null($symbol->getVersion()) || empty($symbol->getVersion())) { + throw new Exception('Please provide the symbol version'); } - $currentSymbol = $this->get( $symbol->getUid() ); + $currentSymbol = $this->get($symbol->getUid()); - if ( $currentSymbol && ( $currentSymbol->getVersion() + 1 != $symbol->getVersion() ) ) { - throw new Exception( 'Invalid symbol version. Please refresh and try again.' ); + if ($currentSymbol && ($currentSymbol->getVersion() + 1 != $symbol->getVersion())) { + throw new Exception('Invalid symbol version. Please refresh and try again.'); } - if ( is_null( $symbol->getLabel() ) || empty( $symbol->getLabel() ) ) { - throw new Exception( 'Please provide the symbol label' ); + if (is_null($symbol->getLabel()) || empty($symbol->getLabel())) { + throw new Exception('Please provide the symbol label'); } - if ( is_null( $symbol->getData() ) || empty( $symbol->getData() ) ) { - throw new Exception( 'Please provide the symbol data' ); + if (is_null($symbol->getData()) || empty($symbol->getData())) { + throw new Exception('Please provide the symbol data'); } - } - } diff --git a/brizy.php b/brizy.php index 90fae7e0d6..d5e7ee2473 100755 --- a/brizy.php +++ b/brizy.php @@ -18,7 +18,7 @@ $_SERVER['HTTPS'] = 'on'; } -define('BRIZY_DEVELOPMENT', false); +define('BRIZY_DEVELOPMENT', 1); define('BRIZY_LOG', false); define('BRIZY_VERSION', '2.4.26'); define('BRIZY_MINIMUM_PRO_VERSION', '2.4.15'); diff --git a/public/editor-client/src/api/index.ts b/public/editor-client/src/api/index.ts index a7ad43071e..139999b6da 100644 --- a/public/editor-client/src/api/index.ts +++ b/public/editor-client/src/api/index.ts @@ -813,14 +813,24 @@ export const deleteSymbol = async (data: ClassSymbol[]): Promise => { }); }; -export const updateSymbols = async (store: Readonly) => { - const { toCreate, toUpdate, toDelete } = store.symbols; +export const updateSymbols = async (snap: Readonly) => { + const { toCreate, toUpdate, toDelete } = snap.symbols; - const createPromise = createSymbol(toCreate); - const updatePromise = updateSymbol(toUpdate); - const deletePromise = deleteSymbol(toDelete); + const promises = []; - await Promise.all([createPromise, updatePromise, deletePromise]); + if (toCreate.length) { + promises.push(createSymbol(toCreate)); + } + + if (toUpdate.length) { + promises.push(updateSymbol(toUpdate)); + } + + if (toDelete.length) { + promises.push(deleteSymbol(toDelete)); + } + + await Promise.all(promises); }; //#endregion diff --git a/public/editor-client/src/config.ts b/public/editor-client/src/config.ts index b3eee0e4f6..a1daa5ad0c 100644 --- a/public/editor-client/src/config.ts +++ b/public/editor-client/src/config.ts @@ -39,7 +39,6 @@ interface Actions { getPostObjects: string; searchPosts: string; - getPostObjects: string; symbolCreate: string; symbolList: string; @@ -186,10 +185,6 @@ const actionsReader = parseStrict({ mPipe(Obj.readKey("searchPosts"), Str.read), throwOnNullish("INvalid actions: searchPosts") ), - getPostObjects: pipe( - mPipe(Obj.readKey("getPostObjects"), Str.read), - throwOnNullish("Invalid actions: getPostObjects") - ), symbolList: pipe( mPipe(Obj.readKey("symbolList"), Str.read), throwOnNullish("Invalid actions: symbolList") diff --git a/public/editor-client/src/onChange/symbols.ts b/public/editor-client/src/onChange/symbols.ts index 1b4b82a4d0..51a297f8eb 100644 --- a/public/editor-client/src/onChange/symbols.ts +++ b/public/editor-client/src/onChange/symbols.ts @@ -1,29 +1,50 @@ -import { isSymbol } from "src/symbols/utils"; +import { findSymbolIndex, isSymbol } from "src/symbols/utils"; import { SymbolAction } from "src/types/Symbols"; import { store } from "src/valtio"; +import { State } from "src/valtio/types"; +import { snapshot } from "valtio/vanilla"; export const handleSymbols = (data: SymbolAction): void => { const { type, payload } = data; if (type && payload && isSymbol(payload)) { + const state = snapshot(store) as Readonly; + switch (type) { case "CREATE": { store.symbols.toCreate.push(payload); break; } case "UPDATE": { + const indexInToCreate = findSymbolIndex("create", payload, state); + + if (indexInToCreate !== undefined) { + if (state.symbols.toCreate[indexInToCreate]) { + store.symbols.toCreate[indexInToCreate].data = payload.data; + break; + } + } + const candidateIndex = store.symbols.toUpdate.findIndex( (s) => s.uid === payload.uid ); if (candidateIndex === -1) { store.symbols.toUpdate.push(payload); + break; } store.symbols.toUpdate[candidateIndex] = payload; break; } case "DELETE": { + const indexInCreate = findSymbolIndex("create", payload, state); + + if (indexInCreate !== undefined && indexInCreate !== -1) { + store.symbols.toCreate.splice(indexInCreate, 1); + break; + } + store.symbols.toDelete.push(payload); break; } diff --git a/public/editor-client/src/symbols/utils.ts b/public/editor-client/src/symbols/utils.ts index ab672e24cd..ee582fd548 100644 --- a/public/editor-client/src/symbols/utils.ts +++ b/public/editor-client/src/symbols/utils.ts @@ -1,5 +1,7 @@ -import { ClassSymbol } from "src/types/Symbols"; +import { ClassSymbol, SymbolRequestType } from "src/types/Symbols"; import * as Obj from "src/utils/reader/object"; +import { MValue } from "src/utils/types"; +import { State } from "src/valtio/types"; export const isSymbol = (s: unknown): s is ClassSymbol => { const symbol = s as ClassSymbol; @@ -12,3 +14,29 @@ export const isSymbol = (s: unknown): s is ClassSymbol => { Obj.isObject(symbol.data) ); }; + +export const findSymbolIndex = ( + type: SymbolRequestType, + symbol: ClassSymbol, + state: Readonly +): MValue => { + let arrayToSearch: ClassSymbol[] | undefined = undefined; + + switch (type) { + case "create": + arrayToSearch = state.symbols.toCreate; + break; + case "update": + arrayToSearch = state.symbols.toUpdate; + break; + case "delete": + arrayToSearch = state.symbols.toDelete; + break; + } + + if (arrayToSearch) { + return arrayToSearch.findIndex((s) => s.uid === symbol.uid); + } + + return undefined; +}; diff --git a/public/editor-client/src/types/Symbols.ts b/public/editor-client/src/types/Symbols.ts index 02d6855f09..82e13ce470 100644 --- a/public/editor-client/src/types/Symbols.ts +++ b/public/editor-client/src/types/Symbols.ts @@ -36,6 +36,8 @@ interface SymbolDelete { payload: string; } +export type SymbolRequestType = "create" | "update" | "delete"; + export type SymbolAction = SymbolCreate | SymbolUpdate | SymbolDelete; export interface Symbols {