pl-fe: Add drive queries

Signed-off-by: nicole mikołajczyk <git@mkljczk.pl>
This commit is contained in:
nicole mikołajczyk
2025-11-23 23:21:07 +01:00
parent 86dd9fcc49
commit 8a35492a26
3 changed files with 99 additions and 1 deletions

View File

@ -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', {

View File

@ -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

View File

@ -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<DriveFolder>(['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<DriveFolder>(['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 };