diff --git a/package-lock.json b/package-lock.json index 6344d5f..2e5ebed 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,6 +7,7 @@ "": { "name": "@ktrix/mail", "version": "0.0.1", + "license": "AGPL-3.0-or-later", "dependencies": { "@tiptap/extension-link": "^2.1.13", "@tiptap/extension-placeholder": "^2.1.13", @@ -841,7 +842,6 @@ "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-2.27.2.tgz", "integrity": "sha512-ABL1N6eoxzDzC1bYvkMbvyexHacszsKdVPYqhl5GwHLOvpZcv9VE9QaKwDILTyz5voCA0lGcAAXZp+qnXOk5lQ==", "license": "MIT", - "peer": true, "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -1198,7 +1198,6 @@ "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-2.27.2.tgz", "integrity": "sha512-kaEg7BfiJPDQMKbjVIzEPO3wlcA+pZb2tlcK9gPrdDnEFaec2QTF1sXz2ak2IIb2curvnIrQ4yrfHgLlVA72wA==", "license": "MIT", - "peer": true, "dependencies": { "prosemirror-changeset": "^2.3.0", "prosemirror-collab": "^1.3.1", @@ -1913,7 +1912,6 @@ "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.25.4.tgz", "integrity": "sha512-PIM7E43PBxKce8OQeezAs9j4TP+5yDpZVbuurd1h5phUxEKIu+G2a+EUZzIC5nS1mJktDJWzbqS23n1tsAf5QA==", "license": "MIT", - "peer": true, "dependencies": { "orderedmap": "^2.0.0" } @@ -1943,7 +1941,6 @@ "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.4.tgz", "integrity": "sha512-6jiYHH2CIGbCfnxdHbXZ12gySFY/fz/ulZE333G6bPqIZ4F+TXo9ifiR86nAHpWnfoNjOb3o5ESi7J8Uz1jXHw==", "license": "MIT", - "peer": true, "dependencies": { "prosemirror-model": "^1.0.0", "prosemirror-transform": "^1.0.0", @@ -1992,7 +1989,6 @@ "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.41.4.tgz", "integrity": "sha512-WkKgnyjNncri03Gjaz3IFWvCAE94XoiEgvtr0/r2Xw7R8/IjK3sKLSiDoCHWcsXSAinVaKlGRZDvMCsF1kbzjA==", "license": "MIT", - "peer": true, "dependencies": { "prosemirror-model": "^1.20.0", "prosemirror-state": "^1.0.0", @@ -2096,7 +2092,6 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "devOptional": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -2117,7 +2112,6 @@ "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.43", @@ -2177,7 +2171,6 @@ "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.26.tgz", "integrity": "sha512-SJ/NTccVyAoNUJmkM9KUqPcYlY+u8OVL1X5EW9RIs3ch5H2uERxyyIUI4MRxVCSOiEcupX9xNGde1tL9ZKpimA==", "license": "MIT", - "peer": true, "dependencies": { "@vue/compiler-dom": "3.5.26", "@vue/compiler-sfc": "3.5.26", diff --git a/src/components/CreateFolderDialog.vue b/src/components/CreateFolderDialog.vue index c26e1c7..386c0b0 100644 --- a/src/components/CreateFolderDialog.vue +++ b/src/components/CreateFolderDialog.vue @@ -140,12 +140,12 @@ const handleCreate = async () => { properties.subscribed = true // Create the collection - const newFolder = await collectionsStore.createCollection({ - provider: props.service.provider, - service: props.service.identifier, - collection: props.parentFolder?.identifier ?? null, - properties: properties - }) + const newFolder = await collectionsStore.create( + props.service.provider, + props.service.identifier as string | number, + props.parentFolder?.identifier ?? null, + properties + ) // Success! emit('created', newFolder) diff --git a/src/components/FolderTree.vue b/src/components/FolderTree.vue index 9b47e76..ea7f037 100644 --- a/src/components/FolderTree.vue +++ b/src/components/FolderTree.vue @@ -33,9 +33,7 @@ const { settings } = useUser() // Folder view mode from user settings const folderViewMode = computed(() => { - const allSettings = settings.value?.all || {} - const mailSettings = allSettings.mail || {} - return (mailSettings.folderViewMode as FolderViewMode) || 'tree' + return (settings.value.get('mail.folderViewMode') as FolderViewMode) || 'tree' }) // Create folder dialog state @@ -112,7 +110,7 @@ const serviceGroups = computed(() => { }> = [] servicesStore.services.forEach(service => { - const folders = collectionsStore.collectionList.filter( + const folders = collectionsStore.collections.filter( c => c.provider === service.provider && String(c.service) === String(service.identifier) ) diff --git a/src/components/MessageComposer.vue b/src/components/MessageComposer.vue index aded0df..378bffe 100644 --- a/src/components/MessageComposer.vue +++ b/src/components/MessageComposer.vue @@ -131,11 +131,11 @@ const saveDraft = async () => { provider: props.folder.provider, service: props.folder.service, collection: props.folder.identifier, // Should be drafts folder ID - data: draftData, + properties: draftData, }) - if (response && response.entity) { - draftId.value = response.entity.identifier + if (response) { + draftId.value = String(response.identifier) } lastSaved.value = new Date() @@ -187,7 +187,7 @@ const handleSend = async () => { sending.value = true try { - await entityService.send({ + await entityService.transmit({ message: { to: to.value, cc: cc.value.length > 0 ? cc.value : undefined, @@ -203,7 +203,7 @@ const handleSend = async () => { // Delete draft if it was saved if (draftId.value && props.folder) { try { - await entityService.destroy({ + await entityService.delete({ provider: props.folder.provider, service: props.folder.service, collection: props.folder.identifier, diff --git a/src/components/settings/DisplaySettings.vue b/src/components/settings/DisplaySettings.vue index 4e062c4..be9b9e3 100644 --- a/src/components/settings/DisplaySettings.vue +++ b/src/components/settings/DisplaySettings.vue @@ -12,9 +12,7 @@ const compactMode = ref(false) const folderViewMode = computed({ get: () => { - const allSettings = settings.value?.all || {} - const mailSettings = allSettings.mail || {} - return (mailSettings.folderViewMode as FolderViewMode) || 'tree' + return (settings.value.get('mail.folderViewMode') as FolderViewMode) || 'tree' }, set: (value: FolderViewMode) => setSetting('mail.folderViewMode', value) }) diff --git a/src/pages/MailPage.vue b/src/pages/MailPage.vue index 9464585..d9bbff6 100644 --- a/src/pages/MailPage.vue +++ b/src/pages/MailPage.vue @@ -56,10 +56,10 @@ onMounted(async () => { await servicesStore.list() // Load collections (folders) - await collectionsStore.loadCollections() + await collectionsStore.list() // Select inbox by default if available - const inbox = collectionsStore.collectionList.find(c => c.properties.role === 'inbox') + const inbox = collectionsStore.collections.find(c => c.properties.role === 'inbox') if (inbox) { handleFolderSelect(inbox) } @@ -91,7 +91,7 @@ watch( // Add inbox for each service to get notifications servicesStore.services.forEach(service => { // Find inbox collection for this service - const inboxes = collectionsStore.collectionList.filter( + const inboxes = collectionsStore.collections.filter( c => c.service === service.identifier && (c.properties.role === 'inbox' || String(c.identifier).toLowerCase() === 'inbox') @@ -100,7 +100,7 @@ watch( if (inboxes.length > 0) { mailSync.addSource({ provider: service.provider, - service: service.identifier, + service: service.identifier as string | number, collections: inboxes.map(inbox => inbox.identifier), }) } @@ -122,7 +122,7 @@ const handleFolderSelect = async (folder: CollectionObject) => { // Load messages for this folder try { - await entitiesStore.loadMessages({ + await entitiesStore.list({ [folder.provider]: { [folder.service]: { [folder.identifier]: true @@ -188,19 +188,18 @@ const handleFolderCreated = (folder: CollectionObject) => { snackbarVisible.value = true // Reload collections to ensure UI is in sync - collectionsStore.loadCollections() + collectionsStore.list() } // Messages for current folder const currentMessages = computed(() => { if (!selectedFolder.value) return [] - const provider = selectedFolder.value.provider - const service = String(selectedFolder.value.service) - const collection = String(selectedFolder.value.identifier) - - const messages = entitiesStore.messages[provider]?.[service]?.[collection] - return messages ? Object.values(messages) : [] + return entitiesStore.entitiesForCollection( + selectedFolder.value.provider, + selectedFolder.value.service, + selectedFolder.value.identifier + ) }) @@ -230,7 +229,7 @@ const currentMessages = computed(() => { mdi-refresh diff --git a/vite.config.ts b/vite.config.ts index f92fda2..d837a59 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -47,6 +47,7 @@ export default defineConfig({ 'vue', 'vue-router', 'pinia', + '@MailManager', ], output: { assetFileNames: (assetInfo) => {