wpsStore.ts 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import { defineStore } from 'pinia';
  2. import { ref, computed } from 'vue';
  3. export const useWPSStore = defineStore('wps', () => {
  4. const connectionStatus = ref<'connected' | 'disconnected'>('disconnected');
  5. const activeDocument = ref<any>(null);
  6. const documents = ref<any[]>([]);
  7. const paragraphContent = ref<any>({
  8. text: '',
  9. html: '',
  10. revisions: [],
  11. comments: [],
  12. hasRevisions: false,
  13. hasComments: false
  14. });
  15. const hasUnsavedChanges = ref(false);
  16. const autoSync = ref(true);
  17. const isConnected = computed(() => connectionStatus.value === 'connected');
  18. const hasRevisions = computed(() => paragraphContent.value.revisions.length > 0);
  19. const hasComments = computed(() => paragraphContent.value.comments.length > 0);
  20. const canEdit = computed(() => isConnected.value && !!activeDocument.value);
  21. const setupEventListeners = () => {
  22. window.electronAPI.onWPSStatusChange((_event, status) => {
  23. connectionStatus.value = status.connected ? 'connected' : 'disconnected';
  24. documents.value = status.documents || [];
  25. activeDocument.value = status.activeDocument || null;
  26. });
  27. window.electronAPI.onDocumentsListChange((_event, docs) => {
  28. documents.value = docs;
  29. });
  30. window.electronAPI.onActiveDocumentChange((_event, doc) => {
  31. activeDocument.value = doc;
  32. hasUnsavedChanges.value = false;
  33. });
  34. window.electronAPI.onFullParagraphContentChange((_event, content) => {
  35. paragraphContent.value = content;
  36. hasUnsavedChanges.value = false;
  37. });
  38. };
  39. const refreshParagraph = async (): Promise<boolean> => {
  40. if (!isConnected.value) return false;
  41. try {
  42. const content = await window.electronAPI.getFullParagraphContent();
  43. paragraphContent.value = content;
  44. hasUnsavedChanges.value = false;
  45. return true;
  46. } catch (error) {
  47. console.error('Failed to refresh paragraph:', error);
  48. return false;
  49. }
  50. };
  51. const updateParagraph = async (content: string) => {
  52. if (!isConnected.value) return { success: false, error: 'WPS not connected' };
  53. try {
  54. const result = await window.electronAPI.updateParagraphWithRevisions(content);
  55. if (result.success) {
  56. hasUnsavedChanges.value = false;
  57. await refreshParagraph();
  58. }
  59. return result;
  60. } catch (error: any) {
  61. return { success: false, error: error.message };
  62. }
  63. };
  64. const navigateParagraph = async (direction: 'prev' | 'next') => {
  65. if (!isConnected.value) return false;
  66. return await window.electronAPI.navigateParagraph(direction);
  67. };
  68. return {
  69. connectionStatus,
  70. activeDocument,
  71. documents,
  72. paragraphContent,
  73. hasUnsavedChanges,
  74. autoSync,
  75. isConnected,
  76. hasRevisions,
  77. hasComments,
  78. canEdit,
  79. setupEventListeners,
  80. refreshParagraph,
  81. updateParagraph,
  82. navigateParagraph
  83. };
  84. });