diff --git a/src/client/components/Routes.js b/src/client/components/Routes.js index a5c9568d37..9026ab0117 100644 --- a/src/client/components/Routes.js +++ b/src/client/components/Routes.js @@ -90,7 +90,7 @@ const Routes = () => { return ( { return ( @@ -107,7 +107,7 @@ const Routes = () => { return ( { return ( diff --git a/src/client/components/data/edit.js b/src/client/components/data/edit.js index a7205c2797..fc45a5c87a 100644 --- a/src/client/components/data/edit.js +++ b/src/client/components/data/edit.js @@ -1,62 +1,57 @@ -import React, { Component } from 'react'; -import { connect } from 'react-redux'; -import { withRouter } from 'react-router-dom'; -import api from 'payload/api'; - -const mapState = state => ({ - locale: state.common.locale, -}); +import React, { useState, useEffect } from 'react'; +import PropTypes from 'prop-types'; +import { useRouteMatch, useHistory } from 'react-router-dom'; +import config from 'payload-config'; +import useMountEffect from '../../hooks/useMountEffect'; +import { requests } from '../../api'; +import { useLocale } from '../utilities/Locale'; const withEditData = (PassedComponent) => { - class EditData extends Component { - constructor(props) { - super(props); + const EditData = (props) => { + const { collection } = props; + const locale = useLocale(); + const [data, setData] = useState({}); + const match = useRouteMatch(); + const history = useHistory(); - this.state = { - data: {}, - }; - } - - fetchData = () => { - const { id } = this.props.match.params; + const fetchData = () => { + const { id } = match.params; const params = { - locale: this.props.locale, + locale, 'fallback-locale': 'null', }; if (id) { - api.requests.get(`${this.props.config.serverUrl}/${this.props.collection.slug}/${id}`, params).then( - res => this.setState({ data: res }), + requests.get(`${config.serverUrl}/${collection.slug}/${id}`, params).then( + res => setData(res), (err) => { console.warn(err); - this.props.history.push('/not-found'); + history.push('/not-found'); }, ); } - } + }; - componentDidMount() { - this.fetchData(); - } + useMountEffect(fetchData); + useEffect(fetchData, [locale]); - componentDidUpdate(prevProps) { - if (prevProps.locale !== this.props.locale) { - this.fetchData(); - } - } + return ( + + ); + }; - render() { - return ( - - ); - } - } + EditData.propTypes = { + collection: PropTypes.shape({ + slug: PropTypes.string, + }).isRequired, + }; - return withRouter(connect(mapState)(EditData)); + + return EditData; }; export default withEditData; diff --git a/src/client/components/views/collections/Edit/index.js b/src/client/components/views/collections/Edit/index.js index 7e990774ee..30612ba3fa 100644 --- a/src/client/components/views/collections/Edit/index.js +++ b/src/client/components/views/collections/Edit/index.js @@ -1,20 +1,25 @@ -import React, { useEffect } from 'react'; -import { useStepNav } from '../../../modules/StepNav'; +import React from 'react'; +import PropTypes from 'prop-types'; +import withEditData from '../../../data/edit'; +import getSanitizedConfig from '../../../../config/getSanitizedConfig'; +import DefaultTemplate from '../../../layout/DefaultTemplate'; import './index.scss'; -const EditView = props => { - const { setStepNav } = useStepNav(); +const { routes: { admin } } = getSanitizedConfig(); + +const EditView = (props) => { + const { collection, data, isEditing } = props; const nav = [{ - url: `/collections/${props.collection.slug}`, - label: props.collection.label + url: `${admin}/collections/${collection.slug}`, + label: collection.labels.plural, }]; - if (props.isEditing) { + if (isEditing) { nav.push({ - url: `/collections/${props.collection.slug}/${props.data._id}`, - label: props.data ? props.data[props.collection.useAsTitle] : '' + url: `${admin}/collections/${collection.slug}/${data._id}`, + label: data ? data[collection.useAsTitle] : '' }) } else { nav.push({ @@ -22,25 +27,38 @@ const EditView = props => { }) } - useEffect(() => setStepNav(nav), []); - return ( -
+
- {props.isEditing && + {isEditing &&

- Edit {Object.keys(props.data).length > 0 && - (props.data[props.collection.useAsTitle] ? props.data[props.collection.useAsTitle] : '[Untitled]') + Edit {Object.keys(data).length > 0 && + (data[collection.useAsTitle] ? data[collection.useAsTitle] : '[Untitled]') }

} - {!props.isEditing && -

Create New {props.collection.singular}

+ {!isEditing && +

Create New {collection.labels.singular}

}
- {props.children} -
+ ); }; -export default EditView; +EditView.propTypes = { + collection: PropTypes.shape({ + labels: PropTypes.shape({ + plural: PropTypes.string, + }), + slug: PropTypes.string, + useAsTitle: PropTypes.string, + }).isRequired, + data: PropTypes.shape({ + _id: PropTypes.string, + }).isRequired, +}; + +export default withEditData(EditView); diff --git a/src/client/components/views/collections/List/index.js b/src/client/components/views/collections/List/index.js index fde2751c82..5ec4afc351 100644 --- a/src/client/components/views/collections/List/index.js +++ b/src/client/components/views/collections/List/index.js @@ -1,5 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; +import getSanitizedConfig from '../../../../config/getSanitizedConfig'; import withListData from '../../../data/list'; import DefaultTemplate from '../../../layout/DefaultTemplate'; import HeadingButton from '../../../modules/HeadingButton'; @@ -7,6 +8,8 @@ import SearchableTable from '../../../modules/SearchableTable'; import './index.scss'; +const { routes: { admin } } = getSanitizedConfig(); + const ListView = (props) => { const { collection, data } = props; @@ -22,7 +25,7 @@ const ListView = (props) => {