From d5c74ba1ae15e9c7deff50ba5cefc4b6425326b0 Mon Sep 17 00:00:00 2001 From: ronronscelestes Date: Mon, 4 Apr 2022 15:12:21 +0200 Subject: [PATCH] go to pending modal on successfully drop file --- .../components/LogoInput/index.js | 2 +- .../LogoModalStepper/AddLogoDialog.js | 32 +++++- .../LogoModalStepper/FromComputerForm.js | 97 +++++++++++-------- .../LogoModalStepper/PendingLogoDialog.js | 2 +- .../components/LogoModalStepper/index.js | 23 +++-- .../components/LogoModalStepper/reducer.js | 7 +- .../components/LogoModalStepper/stepper.js | 14 ++- .../utils/parseFileMetadatas.js | 3 +- .../core/admin/admin/src/translations/en.json | 5 + 9 files changed, 126 insertions(+), 59 deletions(-) diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoInput/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoInput/index.js index 24dba4a1d2..5e752a51b6 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoInput/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoInput/index.js @@ -58,7 +58,7 @@ const LogoInput = ({ customLogo, defaultLogo }) => { setIsDialogOpen(false)} - initialStep={customLogo ? 'pending' : 'add'} + initialStep={customLogo ? 'pending' : 'upload'} isOpen={isDialogOpen} /> diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/AddLogoDialog.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/AddLogoDialog.js index 8dda57ca98..e0ce2b8935 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/AddLogoDialog.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/AddLogoDialog.js @@ -1,23 +1,37 @@ import React from 'react'; +import { useIntl } from 'react-intl'; +import PropTypes from 'prop-types'; import { Tabs, Tab, TabGroup, TabPanels, TabPanel } from '@strapi/design-system/Tabs'; import { Box } from '@strapi/design-system/Box'; import { Divider } from '@strapi/design-system/Divider'; import FromComputerForm from './FromComputerForm'; -const AddLogoDialog = () => { +const AddLogoDialog = ({ setLocalImage, goTo, next }) => { + const { formatMessage } = useIntl(); + return ( - From computer - From URL + + {formatMessage({ + id: 'Settings.application.customization.modal.upload.from-computer', + defaultMessage: 'From computer', + })} + + + {formatMessage({ + id: 'Settings.application.customization.modal.upload.from-url', + defaultMessage: 'From URL', + })} + - + TO DO @@ -25,4 +39,14 @@ const AddLogoDialog = () => { ); }; +AddLogoDialog.defaultProps = { + next: null, +}; + +AddLogoDialog.propTypes = { + setLocalImage: PropTypes.func.isRequired, + goTo: PropTypes.func.isRequired, + next: PropTypes.string, +}; + export default AddLogoDialog; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/FromComputerForm.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/FromComputerForm.js index e40a723fa1..837d8b3a79 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/FromComputerForm.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/FromComputerForm.js @@ -1,4 +1,5 @@ import React, { useState, useRef } from 'react'; +import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; import styled from 'styled-components'; import { Box } from '@strapi/design-system/Box'; @@ -14,7 +15,7 @@ const FileInput = styled(Box)` opacity: 0; `; -const FromComputerForm = () => { +const FromComputerForm = ({ setLocalImage, goTo, next }) => { const { formatMessage } = useIntl(); const [dragOver, setDragOver] = useState(false); const [fileError, setFileError] = useState(false); @@ -37,8 +38,9 @@ const FromComputerForm = () => { } try { - const fileToAsset = await parseFileMetadatas(file); - console.log(fileToAsset); + const asset = await parseFileMetadatas(file); + setLocalImage(asset); + goTo(next); } catch (err) { if (err.displayMessage) { setFileError(formatMessage(err.displayMessage)); @@ -77,47 +79,52 @@ const FromComputerForm = () => { onDragEnter={handleDragEnter} onDragLeave={handleDragLeave} > - - - + + - - Drag & Drop here or - + + + Drag and Drop here or + + - `.${format}`)} - cursor="pointer" - as="input" - position="absolute" - left={0} - right={0} - bottom={0} - top={0} - width="100%" - type="file" - name="files" - tabIndex={-1} - zIndex={1} - onChange={handleChange} - ref={inputRef} - /> + `.${format}`)} + cursor="pointer" + as="input" + position="absolute" + left={0} + right={0} + bottom={0} + top={0} + width="100%" + type="file" + name="files" + tabIndex={-1} + zIndex={1} + onChange={handleChange} + ref={inputRef} + /> - + - - - Max dimension: 750*750, Max size: TBC - - - + + + {/* Add translation once we know more about max size */} + Max dimension: 750*750, Max size: TBC + + {fileError && ( @@ -133,4 +140,14 @@ const FromComputerForm = () => { ); }; +FromComputerForm.defaultProps = { + next: null, +}; + +FromComputerForm.propTypes = { + setLocalImage: PropTypes.func.isRequired, + goTo: PropTypes.func.isRequired, + next: PropTypes.string, +}; + export default FromComputerForm; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/PendingLogoDialog.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/PendingLogoDialog.js index b72799f200..75648873d9 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/PendingLogoDialog.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/PendingLogoDialog.js @@ -1,7 +1,7 @@ import React from 'react'; const PendingLogoDialog = () => { - return
PendingLogoDialog
; + return
PENDING DIALOG - TO DO
; }; export default PendingLogoDialog; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/index.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/index.js index 487211a1bf..69f149881c 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/index.js @@ -1,5 +1,6 @@ import React, { useReducer, useEffect } from 'react'; import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; import { ModalLayout, ModalBody, @@ -11,15 +12,16 @@ import reducer, { initialState } from './reducer'; import stepper from './stepper'; const LogoModalStepper = ({ initialStep, isOpen, onClose }) => { - const [{ currentStep }, dispatch] = useReducer(reducer, initialState); - const { Component, modalTitle } = stepper[currentStep]; + const [{ currentStep, localImage }, dispatch] = useReducer(reducer, initialState); + const { Component, modalTitle, next } = stepper[currentStep]; + const { formatMessage } = useIntl(); useEffect(() => { if (isOpen) { goTo(initialStep); } - // Disabling the rule because we just want to let the ability to open the modal - // at a specific step then we will let the stepper handle the navigation + // Disabling the rule because we just want to open the modal at a specific step + // then we let the stepper handle the navigation // eslint-disable-next-line react-hooks/exhaustive-deps }, [isOpen]); @@ -30,6 +32,13 @@ const LogoModalStepper = ({ initialStep, isOpen, onClose }) => { }); }; + const setLocalImage = asset => { + dispatch({ + type: 'SET_LOCAL_IMAGE', + value: asset, + }); + }; + if (!isOpen) { return null; } @@ -37,12 +46,12 @@ const LogoModalStepper = ({ initialStep, isOpen, onClose }) => { return ( - - {modalTitle} + + {formatMessage(modalTitle)} - + diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/reducer.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/reducer.js index d2dc33f38b..b88c5f637c 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/reducer.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/reducer.js @@ -8,7 +8,8 @@ import produce from 'immer'; const initialState = { - currentStep: 'add', + currentStep: 'upload', + localImage: undefined, }; const reducer = (state = initialState, action) => @@ -18,6 +19,10 @@ const reducer = (state = initialState, action) => draftState.currentStep = action.to; break; } + case 'SET_LOCAL_IMAGE': { + draftState.localImage = action.value; + break; + } default: { return draftState; } diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/stepper.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/stepper.js index b271d5114b..d4e00fdc66 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/stepper.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/stepper.js @@ -2,17 +2,23 @@ import AddLogoDialog from './AddLogoDialog'; import PendingLogoDialog from './PendingLogoDialog'; const stepper = { - add: { + upload: { Component: AddLogoDialog, - modalTitle: 'Upload logo', + modalTitle: { + id: 'Settings.application.customization.modal.upload', + defaultMessage: 'Upload logo', + }, next: 'pending', prev: null, }, pending: { Component: PendingLogoDialog, - modalTitle: 'Pending logo', + modalTitle: { + id: 'Settings.application.customization.modal.pending', + defaultMessage: 'Pending logo', + }, next: null, - prev: 'add', + prev: 'upload', }, }; diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/utils/parseFileMetadatas.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/utils/parseFileMetadatas.js index 5e615370b6..cd65120f9f 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/utils/parseFileMetadatas.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/utils/parseFileMetadatas.js @@ -34,9 +34,10 @@ const rawFileToAsset = rawFile => { }; export const parseFileMetadatas = async file => { - const isFormatAuthorized = ACCEPTED_FORMAT.some(format => file.type.includes(format)); let error; + const isFormatAuthorized = ACCEPTED_FORMAT.some(format => file.type.includes(format)); + if (!isFormatAuthorized) { error = new Error('File format'); error.displayMessage = FILE_FORMAT_ERROR_MESSAGE; diff --git a/packages/core/admin/admin/src/translations/en.json b/packages/core/admin/admin/src/translations/en.json index d4d5644efb..f74271dd0d 100644 --- a/packages/core/admin/admin/src/translations/en.json +++ b/packages/core/admin/admin/src/translations/en.json @@ -103,6 +103,11 @@ "Settings.application.customization.carousel.title": "Logo", "Settings.application.customization.carousel.change-action": "Change logo", "Settings.application.customization.carousel-slide.label": "Logo slide", + "Settings.application.customization.modal.upload": "Upload logo", + "Settings.application.customization.modal.upload.from-computer": "From computer", + "Settings.application.customization.modal.upload.cta.browse": "Browse files", + "Settings.application.customization.modal.upload.from-url": "From URL", + "Settings.application.customization.modal.pending": "Pending logo", "Settings.error": "Error", "Settings.global": "Global Settings", "Settings.permissions": "Administration panel",