From 8a35492a267323937c703c31c29816f95ea096f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?nicole=20miko=C5=82ajczyk?= Date: Sun, 23 Nov 2025 23:21:07 +0100 Subject: [PATCH] pl-fe: Add drive queries MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: nicole mikołajczyk --- packages/pl-api/lib/client.ts | 2 +- packages/pl-api/lib/features.ts | 2 + .../src/queries/drive/use-drive-folder.ts | 96 +++++++++++++++++++ 3 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 packages/pl-fe/src/queries/drive/use-drive-folder.ts diff --git a/packages/pl-api/lib/client.ts b/packages/pl-api/lib/client.ts index 25444e2a3..97f49b843 100644 --- a/packages/pl-api/lib/client.ts +++ b/packages/pl-api/lib/client.ts @@ -5901,7 +5901,7 @@ class PlApiClient { return v.parse(driveFolderSchema, response.json); }, - createFolder: async (name: string, parentId: string) => { + createFolder: async (name: string, parentId?: string) => { await this.#getIceshrimpAccessToken(); const response = await this.request('/api/iceshrimp/drive/folder', { diff --git a/packages/pl-api/lib/features.ts b/packages/pl-api/lib/features.ts index 6ecbbcef1..dc004b82a 100644 --- a/packages/pl-api/lib/features.ts +++ b/packages/pl-api/lib/features.ts @@ -679,6 +679,8 @@ const getFeatures = (instance: Instance) => { */ domains: any([instance.pleroma.metadata.multitenancy.enabled]), + drive: v.software === ICESHRIMP_NET, + /** * Ability to edit profile information. * @see PATCH /api/v1/accounts/update_credentials diff --git a/packages/pl-fe/src/queries/drive/use-drive-folder.ts b/packages/pl-fe/src/queries/drive/use-drive-folder.ts new file mode 100644 index 000000000..84e40979d --- /dev/null +++ b/packages/pl-fe/src/queries/drive/use-drive-folder.ts @@ -0,0 +1,96 @@ + +import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; + +import { useClient } from 'pl-fe/hooks/use-client'; +import { useFeatures } from 'pl-fe/hooks/use-features'; + +import type { DriveFolder } from 'pl-api'; + +const useDriveFolder = (folderId?: string) => { + const client = useClient(); + const features = useFeatures(); + + return useQuery({ + queryKey: ['drive', 'folders', folderId], + queryFn: () => folderId ? client.drive.getFolder(folderId) : client.drive.getDrive(), + enabled: features.drive, + }); +}; + +const useCreateDriveFolder = () => { + const client = useClient(); + const queryClient = useQueryClient(); + + return useMutation({ + mutationKey: ['drive', 'folders'], + mutationFn: ({ name, parentId }: { name: string; parentId?: string }) => client.drive.createFolder(name, parentId), + onSuccess: (folder) => { + queryClient.setQueryData(['drive', 'folders', folder.id], folder); + queryClient.invalidateQueries({ queryKey: ['drive', 'folders', folder.parent_id || undefined], exact: true }); + }, + }); +}; + +const useUpdateDriveFolder = (folderId: string) => { + const client = useClient(); + const queryClient = useQueryClient(); + + return useMutation({ + mutationKey: ['drive', 'folders'], + mutationFn: (name: string) => client.drive.updateFolder(folderId, name), + onSuccess: (folder) => { + queryClient.setQueryData(['drive', 'folders', folder.id], folder); + }, + }); +}; + +const useDeleteDriveFolder = (folderId: string) => { + const client = useClient(); + const queryClient = useQueryClient(); + + let previousParentId: string | null; + + return useMutation({ + mutationKey: ['drive', 'folders'], + mutationFn: () => { + const oldFolder = queryClient.getQueryData(['drive', 'folders', folderId]); + if (oldFolder) { + previousParentId = oldFolder.parent_id; + } else { + previousParentId = null; + } + return client.drive.deleteFolder(folderId); + }, + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ['drive', 'folders', folderId], exact: true }); + if (previousParentId) queryClient.invalidateQueries({ queryKey: ['drive', 'folders', previousParentId || undefined], exact: true }); + }, + }); +}; + +const useMoveDriveFolder = (folderId: string) => { + const client = useClient(); + const queryClient = useQueryClient(); + + let previousParentId: string | null; + + return useMutation({ + mutationKey: ['drive', 'folders'], + mutationFn: (targetFolderId: string) => { + const oldFolder = queryClient.getQueryData(['drive', 'folders', folderId]); + if (oldFolder) { + previousParentId = oldFolder.parent_id; + } else { + previousParentId = null; + } + return client.drive.moveFolder(folderId, targetFolderId); + }, + onSuccess: (_, targetFolderId) => { + queryClient.invalidateQueries({ queryKey: ['drive', 'folders', folderId], exact: true }); + queryClient.invalidateQueries({ queryKey: ['drive', 'folders', targetFolderId], exact: true }); + if (previousParentId) queryClient.invalidateQueries({ queryKey: ['drive', 'folders', previousParentId || undefined], exact: true }); + }, + }); +}; + +export { useDriveFolder, useCreateDriveFolder, useUpdateDriveFolder, useDeleteDriveFolder, useMoveDriveFolder };