I have a function that iterates over all of the overrides in a selection and updates any symbol override that meets a specific condition. It works, but understandably this can get pretty chuggy when there are many overrides, e.g. with particularly complex symbols.
I'm completely unfamiliar with the native Sketch model so forgive me if I'm missing something glaringly obvious, but I'm wondering if there's a faster or more efficient way of achieving the same results.
Thanks!
let sketch = require("sketch");
let document = sketch.getSelectedDocument();
function createInvisibleSpace() {
let page = document.selectedPage;
let SymbolMaster = sketch.SymbolMaster;
let Rectangle = sketch.Rectangle;
let invisibleSpace = new SymbolMaster({
name: "Invisible Space",
frame: new Rectangle(0, 0, 100, 100),
parent: page,
});
return invisibleSpace.symbolId;
}
function toggleNestedSpacing() {
let selection = document.selectedLayers.layers;
// Check if Invisible Space symbol exists
let invisibleSpaceId = null;
document.getSymbols().forEach((symbol) => {
if (symbol.name === "Invisible Space") {
invisibleSpaceId = symbol.symbolId;
console.log("Invisible Space exists");
}
});
// If it doesn't exist, create the symbol and get its ID
if (!invisibleSpaceId) {
invisibleSpaceId = createInvisibleSpace();
console.log("Invisible Space does not exist");
}
// Conceal or reveal the nested spacing
if (selection.length) {
selection.forEach((layer) => {
let overrides = layer.overrides;
overrides.forEach((override) => {
if (
override.editable &&
override.symbolOverride &&
override.affectedLayer.name.includes("spacing") &&
override.value
) {
if (override.value === override.affectedLayer.symbolId) {
override.value = invisibleSpaceId;
console.log("Concealed");
} else {
override.value = override.affectedLayer.symbolId;
console.log("Revealed");
}
}
});
});
}
}