admin-content-disposition.ts 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import { useCallback } from 'react';
  2. import useSWR from 'swr';
  3. import useSWRMutation from 'swr/mutation';
  4. import { apiv3Get, apiv3Put } from '../util/apiv3-client';
  5. export interface ContentDispositionSettings {
  6. inlineMimeTypes: string[];
  7. attachmentMimeTypes: string[];
  8. }
  9. interface ContentDispositionGetResponse {
  10. currentDispositionSettings: ContentDispositionSettings;
  11. }
  12. interface ContentDispositionUpdateRequest {
  13. newInlineMimeTypes: string[];
  14. newAttachmentMimeTypes: string[];
  15. }
  16. interface ContentDispositionUpdateResponse {
  17. currentDispositionSettings: ContentDispositionSettings;
  18. }
  19. interface UseContentDisposition {
  20. currentSettings: ContentDispositionSettings | undefined;
  21. isLoading: boolean;
  22. isUpdating: boolean;
  23. updateSettings: (
  24. newSettings: ContentDispositionSettings,
  25. ) => Promise<ContentDispositionSettings>;
  26. }
  27. export const useContentDisposition = (): UseContentDisposition => {
  28. const { data, isLoading, mutate } = useSWR(
  29. '/content-disposition-settings/',
  30. (endpoint) =>
  31. apiv3Get<ContentDispositionGetResponse>(endpoint).then(
  32. (res) => res.data.currentDispositionSettings,
  33. ),
  34. );
  35. const { trigger, isMutating: isUpdating } = useSWRMutation(
  36. '/content-disposition-settings/',
  37. async (
  38. endpoint: string,
  39. { arg }: { arg: ContentDispositionUpdateRequest },
  40. ) => {
  41. const response = await apiv3Put<ContentDispositionUpdateResponse>(
  42. endpoint,
  43. arg,
  44. );
  45. return response.data.currentDispositionSettings;
  46. },
  47. );
  48. const updateSettings = useCallback(
  49. async (
  50. newSettings: ContentDispositionSettings,
  51. ): Promise<ContentDispositionSettings> => {
  52. const request: ContentDispositionUpdateRequest = {
  53. newInlineMimeTypes: newSettings.inlineMimeTypes,
  54. newAttachmentMimeTypes: newSettings.attachmentMimeTypes,
  55. };
  56. const updatedData = await trigger(request);
  57. // Update local cache and avoid an unnecessary extra GET request
  58. await mutate(updatedData, { revalidate: false });
  59. return updatedData;
  60. },
  61. [trigger, mutate],
  62. );
  63. return {
  64. currentSettings: data,
  65. isLoading,
  66. isUpdating,
  67. updateSettings,
  68. };
  69. };