// stores/notionStore.js import { defineStore } from "pinia"; export const useNotionStore = defineStore("notion", { state: () => ({ blocks: [], selectedBlockId: null, draggedBlockId: null, }), getters: { getBlockById: (state) => (id) => { return state.blocks.find((block) => block.id === id); }, getChildBlocks: (state) => (parentId) => { return state.blocks.filter((block) => block.parentId === parentId); }, selectedBlock: (state) => { return state.blocks.find((block) => block.id === state.selectedBlockId); }, // بلوک‌های سطح بالا (بدون والد) topLevelBlocks: (state) => { return state.blocks.filter((block) => !block.parentId); }, }, actions: { // ایجاد ID یکتا generateId() { return ( "block_" + Date.now() + "_" + Math.random().toString(36).substr(2, 9) ); }, // ایجاد بلوک جدید addBlock({ type = "paragraph", content = "", parentId = null, position = null, }) { const newBlock = { id: this.generateId(), type, content, parentId, children: [], properties: {}, createdAt: new Date().toISOString(), updatedAt: new Date().toISOString(), collapsed: false, aiProcessing: false, color: "default", }; // اضافه کردن بلوک در موقعیت مشخص if (position !== null && position >= 0 && position < this.blocks.length) { this.blocks.splice(position, 0, newBlock); } else { this.blocks.push(newBlock); } // اگر والد دارد، به لیست فرزندانش اضافه شود if (parentId) { const parent = this.getBlockById(parentId); if (parent) { parent.children.push(newBlock.id); } } this.selectedBlockId = newBlock.id; this.saveToLocalStorage(); return newBlock; }, // به‌روزرسانی بلوک updateBlock(blockId, updates) { const index = this.blocks.findIndex((block) => block.id === blockId); if (index !== -1) { this.blocks[index] = { ...this.blocks[index], ...updates, updatedAt: new Date().toISOString(), }; this.saveToLocalStorage(); } }, // حذف بلوک deleteBlock(blockId) { const block = this.getBlockById(blockId); // حذف فرزندان بلوک if (block && block.children && block.children.length > 0) { block.children.forEach((childId) => this.deleteBlock(childId)); } // حذف از لیست فرزندان والد if (block && block.parentId) { const parent = this.getBlockById(block.parentId); if (parent) { parent.children = parent.children.filter((id) => id !== blockId); } } // حذف بلوک اصلی this.blocks = this.blocks.filter((block) => block.id !== blockId); this.saveToLocalStorage(); }, // انتخاب بلوک selectBlock(blockId) { this.selectedBlockId = blockId; }, // جابجایی بلوک moveBlock(blockId, newParentId = null, newIndex = null) { const block = this.getBlockById(blockId); if (!block) return; // حذف از والد قبلی if (block.parentId) { const oldParent = this.getBlockById(block.parentId); if (oldParent) { oldParent.children = oldParent.children.filter( (id) => id !== blockId ); } } // آپدیت والد جدید block.parentId = newParentId; // اضافه به لیست فرزندان والد جدید if (newParentId) { const newParent = this.getBlockById(newParentId); if (newParent) { if (newIndex !== null) { newParent.children.splice(newIndex, 0, blockId); } else { newParent.children.push(blockId); } } } // جابجایی در آرایه اصلی اگر index مشخص شده if (newIndex !== null) { const currentIndex = this.blocks.findIndex((b) => b.id === blockId); if (currentIndex !== -1) { const [block] = this.blocks.splice(currentIndex, 1); this.blocks.splice(newIndex, 0, block); } } this.saveToLocalStorage(); }, // ذخیره در localStorage saveToLocalStorage() { if (typeof window !== "undefined") { localStorage.setItem( "notion-blocks", JSON.stringify({ blocks: this.blocks, version: "1.0.0", lastSaved: new Date().toISOString(), }) ); } }, // بارگذاری از localStorage loadFromLocalStorage() { if (typeof window !== "undefined") { const saved = localStorage.getItem("notion-blocks"); if (saved) { const data = JSON.parse(saved); this.blocks = data.blocks || []; } else { // ایجاد بلوک‌های پیش‌فرض this.initializeDefaultBlocks(); } } }, // بلوک‌های پیش‌فرض initializeDefaultBlocks() { this.blocks = [ { id: this.generateId(), type: "heading1", content: "خوش آمدید به نوشن فارسی! 🎉", parentId: null, children: [], properties: {}, createdAt: new Date().toISOString(), updatedAt: new Date().toISOString(), collapsed: false, color: "default", }, { id: this.generateId(), type: "paragraph", content: "روی هر بلوک کلیک کنید یا علامت + را بزنید. برای منوی بیشتر راست کلیک کنید.", parentId: null, children: [], properties: {}, createdAt: new Date().toISOString(), updatedAt: new Date().toISOString(), collapsed: false, color: "default", }, { id: this.generateId(), type: "todo", content: "اولین کار را انجام دهید", parentId: null, children: [], properties: { checked: false }, createdAt: new Date().toISOString(), updatedAt: new Date().toISOString(), collapsed: false, color: "default", }, ]; }, // پیدا کردن موقعیت بلوک findBlockPosition(blockId) { return this.blocks.findIndex((block) => block.id === blockId); }, // پیدا کردن بلوک بعدی findNextBlock(blockId) { const index = this.findBlockPosition(blockId); if (index < this.blocks.length - 1) { return this.blocks[index + 1]; } return null; }, // پیدا کردن بلوک قبلی findPreviousBlock(blockId) { const index = this.findBlockPosition(blockId); if (index > 0) { return this.blocks[index - 1]; } return null; }, }, });