From d9cee38a77fee4184c1bf85d7590f79fbd18510e Mon Sep 17 00:00:00 2001 From: Ronald Langeveld Date: Fri, 18 Aug 2023 14:54:13 +0200 Subject: [PATCH] Wired up Pintura integration to AdminX (#17759) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit refs https://github.com/TryGhost/Product/issues/3729 - Wired up the Pintura Integration to AdminX. --- ### 🤖 Generated by Copilot at 4d33355 This pull request adds the ability to customize the Pintura image editor with custom JS and CSS files in the advanced settings modal. It introduces a new `files.ts` file in the `api` folder, which provides a hook and a helper function for uploading and retrieving files. It also modifies the `PinturaModal.tsx` component to use these functions and display the settings. --- apps/admin-x-settings/src/api/files.ts | 20 ++++ .../advanced/integrations/PinturaModal.tsx | 87 ++++++++++++++- .../e2e/advanced/integrations/pintura.test.ts | 104 ++++++++++++++++++ .../test/utils/files/pintura-umd.js | 1 + .../test/utils/files/pintura.css | 1 + 5 files changed, 208 insertions(+), 5 deletions(-) create mode 100644 apps/admin-x-settings/src/api/files.ts create mode 100644 apps/admin-x-settings/test/e2e/advanced/integrations/pintura.test.ts create mode 100644 apps/admin-x-settings/test/utils/files/pintura-umd.js create mode 100644 apps/admin-x-settings/test/utils/files/pintura.css diff --git a/apps/admin-x-settings/src/api/files.ts b/apps/admin-x-settings/src/api/files.ts new file mode 100644 index 0000000000..13ceb76eaf --- /dev/null +++ b/apps/admin-x-settings/src/api/files.ts @@ -0,0 +1,20 @@ +import {createMutation} from '../utils/apiRequests'; + +export interface FilesResponseType { + files: { + url: string; + ref: string | null; + }[]; +} + +export const useUploadFile = createMutation({ + method: 'POST', + path: () => '/files/upload/', + body: ({file}) => { + const formData = new FormData(); + formData.append('file', file); + return formData; + } +}); + +export const getFileUrl = (response: FilesResponseType) => response.files[0].url; diff --git a/apps/admin-x-settings/src/components/settings/advanced/integrations/PinturaModal.tsx b/apps/admin-x-settings/src/components/settings/advanced/integrations/PinturaModal.tsx index 9bf0983b7e..7c58ad5b39 100644 --- a/apps/admin-x-settings/src/components/settings/advanced/integrations/PinturaModal.tsx +++ b/apps/admin-x-settings/src/components/settings/advanced/integrations/PinturaModal.tsx @@ -7,12 +7,73 @@ import Toggle from '../../../../admin-x-ds/global/form/Toggle'; import pinturaScreenshot from '../../../../assets/images/pintura-screenshot.png'; import useRouting from '../../../../hooks/useRouting'; import {ReactComponent as Icon} from '../../../../assets/icons/pintura.svg'; -import {useState} from 'react'; +import {Setting, getSettingValues, useEditSettings} from '../../../../api/settings'; +import {showToast} from '../../../../admin-x-ds/global/Toast'; +import {useEffect, useRef, useState} from 'react'; +import {useGlobalData} from '../../../providers/GlobalDataProvider'; +import {useUploadFile} from '../../../../api/files'; const PinturaModal = NiceModal.create(() => { const {updateRoute} = useRouting(); const modal = NiceModal.useModal(); const [enabled, setEnabled] = useState(false); + const [uploadingState, setUploadingState] = useState({ + js: false, + css: false + }); + + const {settings} = useGlobalData(); + const [pinturaEnabled] = getSettingValues(settings, ['pintura']); + const {mutateAsync: editSettings} = useEditSettings(); + const {mutateAsync: uploadFile} = useUploadFile(); + + useEffect(() => { + setEnabled(pinturaEnabled || false); + }, [pinturaEnabled]); + + const jsUploadRef = useRef(null); + const cssUploadRef = useRef(null); + const triggerUpload = (form: string) => { + if (form === 'js') { + jsUploadRef.current?.click(); + } + + if (form === 'css') { + cssUploadRef.current?.click(); + } + }; + + const handleUpload = async (event: React.ChangeEvent, form: 'js' | 'css') => { + try { + setUploadingState(prev => ({...prev, [form]: true})); + + const file = event.target?.files?.[0]; + if (!file) { + return; + } + + const {files} = await uploadFile({file}); + const url = files[0].url; + const updates : Setting[] = [ + {key: `pintura_${form}_url`, value: url} + ]; + + await editSettings(updates); + + setUploadingState(prev => ({...prev, [form]: false})); + + showToast({ + type: 'success', + message: `Pintura ${form} uploaded successfully` + }); + } catch (e) { + setUploadingState({js: false, css: false}); + showToast({ + type: 'pageError', + message: `Can't upload Pintura ${form}!` + }); + } + }; return ( { cancelLabel='' okColor='black' okLabel='Save' + testId='pintura-modal' title='' - onOk={() => { + onOk={async () => { modal.remove(); + updateRoute('integrations'); + await editSettings([ + {key: 'pintura', value: enabled} + ]); }} > {
Enable Pintura for editing your images in Ghost} label='Enable Pintura' @@ -60,14 +127,24 @@ const PinturaModal = NiceModal.create(() => {
Upload Pintura script
Upload the pintura-umd.js file from the Pintura package
-