diff --git a/client/apps/admin/components/application_instance_settings/application_instance_settings.jsx b/client/apps/admin/components/application_instance_settings/application_instance_settings.jsx index b74fc1f3..d806beed 100644 --- a/client/apps/admin/components/application_instance_settings/application_instance_settings.jsx +++ b/client/apps/admin/components/application_instance_settings/application_instance_settings.jsx @@ -8,7 +8,6 @@ export default function ApplicationInstanceSettings(props) { const { application, applicationInstance, - sites, tabComponent, location } = props; @@ -19,7 +18,6 @@ export default function ApplicationInstanceSettings(props) { location={location} application={application} applicationInstance={applicationInstance} - sites={sites} />
{tabComponent} @@ -36,7 +34,6 @@ ApplicationInstanceSettings.propTypes = { applicationInstance: PropTypes.shape({ lti_key: PropTypes.string, }), - sites: PropTypes.shape({}).isRequired, tabComponent: PropTypes.element, location: PropTypes.shape({ pathname: PropTypes.string, diff --git a/client/apps/admin/components/application_instance_settings/configuration.jsx b/client/apps/admin/components/application_instance_settings/configuration.jsx index b322da53..15ae7e75 100644 --- a/client/apps/admin/components/application_instance_settings/configuration.jsx +++ b/client/apps/admin/components/application_instance_settings/configuration.jsx @@ -1,6 +1,6 @@ import React, { useState, useEffect } from 'react'; import PropTypes from 'prop-types'; -import { connect } from 'react-redux'; +import { useDispatch, useSelector } from 'react-redux'; import _ from 'lodash'; import * as ApplicationInstanceActions from '../../actions/application_instances'; import Textarea from '../common/textarea'; @@ -20,25 +20,25 @@ function prettyJSON(str) { } } -const select = (state, props) => ({ - loading: state.applicationInstances.loading, - loaded: state.applicationInstances.loaded, - applicationInstances: _.filter(state.applicationInstances.applicationInstances, - { application_id: parseInt(props.params.applicationId, 10) }), -}); - -export function Configuration(props) { +export default function Configuration(props) { const { - loading, - loaded, params, - applicationInstances } = props; + const dispatch = useDispatch(); + const loading = useSelector((state) => state.applicationInstances.loading); + const loaded = useSelector((state) => state.applicationInstances.loaded); + const applicationInstances = useSelector((state) => _.filter( + state.applicationInstances.applicationInstances, + { application_id: parseInt(params.applicationId, 10) } + )); + useEffect(() => { if (!loading && !loaded) { - props.getApplicationInstance(params.applicationId, params.applicationInstanceId); + dispatch( + getApplicationInstance(params.applicationId, params.applicationInstanceId) + ) } }, []); @@ -52,7 +52,9 @@ export function Configuration(props) { useEffect(() => { // Redux function to store newApplicationInstance - props.updateNewInstance(newApplicationInstance); + dispatch( + updateNewInstance(newApplicationInstance) + ); }, [newApplicationInstance]); @@ -135,18 +137,13 @@ export function Configuration(props) { ); } -export default connect(select, ApplicationInstanceActions)(Configuration); - Configuration.propTypes = { applicationInstance: PropTypes.shape({ config: PropTypes.string, lti_config: PropTypes.string, lti_config_xml: PropTypes.string, }), - loading: PropTypes.bool, - loaded: PropTypes.bool, updateNewInstance: PropTypes.func, - applicationInstances: PropTypes.array, getApplicationInstance: PropTypes.func, params: PropTypes.shape({ applicationId: PropTypes.string.isRequired, diff --git a/client/apps/admin/components/application_instance_settings/configuration.spec.jsx b/client/apps/admin/components/application_instance_settings/configuration.spec.jsx index a7c032f0..8ad0c635 100644 --- a/client/apps/admin/components/application_instance_settings/configuration.spec.jsx +++ b/client/apps/admin/components/application_instance_settings/configuration.spec.jsx @@ -1,12 +1,24 @@ import React from 'react'; +import { Provider } from 'react-redux'; import TestRenderer from 'react-test-renderer'; +import configureStore from 'redux-mock-store'; -import { Configuration } from './configuration'; +import Configuration from './configuration'; + +const mockStore = configureStore([]); + +const store = mockStore({ + applicationInstances : {}, +}); describe('configuration', () => { + + const params = {}; it('renders the DownloadButton component', () => { const result = TestRenderer.create( - + + + ); expect(result).toMatchSnapshot(); }); diff --git a/client/apps/admin/components/application_instance_settings/header.jsx b/client/apps/admin/components/application_instance_settings/header.jsx index bae31a6c..f32e70db 100644 --- a/client/apps/admin/components/application_instance_settings/header.jsx +++ b/client/apps/admin/components/application_instance_settings/header.jsx @@ -1,6 +1,5 @@ import React, { useState } from 'react'; import PropTypes from 'prop-types'; -import { connect } from 'react-redux'; import _ from 'lodash'; import EnabledButton from '../common/enabled'; import Menu from '../common/menu'; @@ -8,21 +7,20 @@ import DisabledButton from '../common/disabled'; import DeleteModal from '../common/delete_modal'; import getExtraFields from '../application_instances/extra_fields'; import * as ApplicationInstanceActions from '../../actions/application_instances'; +import { useDispatch, useSelector } from 'react-redux'; -const select = (state) => ({ - newApplicationInstance: state.applicationInstances.newApplicationInstance, -}); - -export function Header(props) { +export default function Header(props) { const { goBack, - applicationInstance, - application, deleteInstance, disableInstance, - newApplicationInstance, + applicationInstance, + application, } = props; + const dispatch = useDispatch(); + const newApplicationInstance = useSelector((state) => state.applicationInstances.newApplicationInstance); + const { nickname, primary_contact: primaryContact, @@ -47,7 +45,9 @@ export function Header(props) { const saveAppInstance = () => { if (!_.isEmpty(newApplicationInstance)) { - props.saveApplicationInstance(application.id, newApplicationInstance); + dispatch( + saveApplicationInstance(application.id, newApplicationInstance) + ) } }; @@ -141,8 +141,6 @@ export function Header(props) { ); } -export default connect(select, ApplicationInstanceActions)(Header); - Header.propTypes = { goBack: PropTypes.func, saveApplicationInstance: PropTypes.func, diff --git a/client/apps/admin/components/application_instance_settings/header.spec.jsx b/client/apps/admin/components/application_instance_settings/header.spec.jsx index a32997ab..4fc385df 100644 --- a/client/apps/admin/components/application_instance_settings/header.spec.jsx +++ b/client/apps/admin/components/application_instance_settings/header.spec.jsx @@ -1,9 +1,26 @@ import React from 'react'; +import { Provider } from 'react-redux'; import TestRenderer from 'react-test-renderer'; -import { Header } from './header'; +import Header from './header'; +import configureStore from 'redux-mock-store'; + +const mockStore = configureStore([]); + +const settings = { + sign_out_url: 'https://www.example.com', +}; + +const store = mockStore({ + applicationInstances: { + newApplicationInstance: { + } + }, + settings, +}); describe('Header', () => { + const applicationInstance = { site: {}, }; @@ -11,7 +28,9 @@ describe('Header', () => { it('renders the Header component', () => { const result = TestRenderer.create( +
+ ); expect(result).toMatchSnapshot(); }); diff --git a/client/apps/admin/components/application_instance_settings/index.jsx b/client/apps/admin/components/application_instance_settings/index.jsx index 37a8d441..0207a68c 100644 --- a/client/apps/admin/components/application_instance_settings/index.jsx +++ b/client/apps/admin/components/application_instance_settings/index.jsx @@ -1,38 +1,32 @@ import React, { useEffect } from 'react'; import PropTypes from 'prop-types'; -import { connect } from 'react-redux'; import _ from 'lodash'; import Heading from '../common/heading'; import Header from './header'; import ApplicationInstanceSettings from './application_instance_settings'; import Loader from '../../../../common/components/common/atomicjolt_loader'; import * as ApplicationInstanceActions from '../../actions/application_instances'; +import { useDispatch, useSelector } from 'react-redux'; -const select = (state, props) => ({ - loading: state.applicationInstances.loading, - applicationInstances: _.filter(state.applicationInstances.applicationInstances, - { application_id: parseInt(props.params.applicationId, 10) }), - applications: state.applications, - sites: state.sites, -}); - -export function Index(props) { +export default function Index(props) { const { router, - applicationInstances, - loading, params, - applications, deleteApplicationInstance, disableApplicationInstance, - sites, children, - location, } = props; + const dispatch = useDispatch(); + const loading = useSelector((state) => state.applicationInstances.loading); + const applicationInstances = useSelector((state) => state.applicationInstances); + const applications = useSelector((state) => state.applications); + useEffect(() => { - props.getApplicationInstance(params.applicationId, params.applicationInstanceId); + dispatch( + getApplicationInstance(params.applicationId, params.applicationInstanceId) + ) }, []); @@ -43,7 +37,6 @@ export function Index(props) { let backPath = ''; if (!loading) { backPath = `/applications/${application.id}/application_instances`; - } const renderLoading = () => ( @@ -70,7 +63,6 @@ export function Index(props) { @@ -80,23 +72,15 @@ export function Index(props) { ); } -export default connect(select, ApplicationInstanceActions)(Index); - Index.propTypes = { params: PropTypes.shape({ applicationId: PropTypes.string.isRequired, applicationInstanceId: PropTypes.string.isRequired, }).isRequired, - applications: PropTypes.shape({ - id: PropTypes.string.isRequired, - }).isRequired, getApplicationInstance: PropTypes.func, - applicationInstances: PropTypes.array, router: PropTypes.shape({ push: PropTypes.func, }), - loading: PropTypes.bool, - sites: PropTypes.shape({}).isRequired, deleteApplicationInstance: PropTypes.func, disableApplicationInstance: PropTypes.func, children: PropTypes.element, diff --git a/client/apps/admin/components/application_instance_settings/index.spec.jsx b/client/apps/admin/components/application_instance_settings/index.spec.jsx index 64e6ced0..6f27f9a9 100644 --- a/client/apps/admin/components/application_instance_settings/index.spec.jsx +++ b/client/apps/admin/components/application_instance_settings/index.spec.jsx @@ -3,7 +3,30 @@ import TestRenderer from 'react-test-renderer'; import { Provider } from 'react-redux'; import configureStore from 'redux-mock-store'; -import { Index } from './index'; +import Index from './index'; + +const application = { + id: 1, + name: 'test application', +}; + +const site = { + url: "https://www.example.com", +}; + +const applicationInstance = { + id: 1, + nickname: 'a test application instance', + site: site, +}; + +const params = { + applicationId: application.id, + applicationInstanceId: applicationInstance.id, +}; + +const applications = {}; +applications[application.id] = application; const mockStore = configureStore([]); const store = mockStore({ @@ -12,48 +35,18 @@ const store = mockStore({ }, applicationInstances: { newApplicationInstance: {}, + applicationInstance: applicationInstance, }, + application: application, + applications: applications, + location: {}, }); describe('Index', () => { it('renders the Index component', () => { - const application = { - id: 1, - name: 'test application', - }; - - const site = { - url: "https://www.example.com", - }; - - const applicationInstance = { - id: 2, - nickname: 'a test application instance', - site, - }; - - const params = { - applicationId: application.id, - applicationInstanceId: applicationInstance.id, - }; - - const applications = {}; - applications[application.id] = application; - - const applicationInstances = [ - applicationInstance, - ]; - - const location = {}; - const result = TestRenderer.create( - + ); expect(result).toMatchSnapshot(); diff --git a/client/apps/admin/components/application_instance_settings/xml_config.jsx b/client/apps/admin/components/application_instance_settings/xml_config.jsx index db179d1a..5e5db648 100644 --- a/client/apps/admin/components/application_instance_settings/xml_config.jsx +++ b/client/apps/admin/components/application_instance_settings/xml_config.jsx @@ -1,35 +1,31 @@ import React, { useEffect } from 'react'; import PropTypes from 'prop-types'; -import { connect } from 'react-redux'; import _ from 'lodash'; import * as ApplicationInstanceActions from '../../actions/application_instances'; import Textarea from '../common/textarea'; +import { useDispatch, useSelector } from 'react-redux'; -const select = (state, props) => ( - { - loading: state.applicationInstances.loading, - loaded: state.applicationInstances.loaded, - applicationInstances: _.filter( - state.applicationInstances.applicationInstances, - { application_id: parseInt(props.params.applicationId, 10) } - ), - } -); - -export function XmlConfig(props) { +export default function XmlConfig(props) { const { - loading, - loaded, params, - applicationInstances } = props; + const dispatch = useDispatch(); + const loading = useSelector((state) => state.applicationInstances.loading); + const loaded = useSelector((state) => state.applicationInstances.loaded); + const applicationInstances = useSelector((state) => _.filter( + state.applicationInstances, + { application_id: parseInt(props.params.applicationId, 10) } + )); + useEffect(() => { if (!loading && !loaded) { - props.getApplicationInstance( - params.applicationId, - params.applicationInstanceId - ); + dispatch( + getApplicationInstance( + params.applicationId, + params.applicationInstanceId + ) + ) } }, []); @@ -60,8 +56,6 @@ export function XmlConfig(props) { ); } -export default connect(select, ApplicationInstanceActions)(XmlConfig); - XmlConfig.propTypes = { applicationInstance: PropTypes.shape({ config: PropTypes.string, diff --git a/client/apps/admin/components/application_instance_settings/xml_config.spec.jsx b/client/apps/admin/components/application_instance_settings/xml_config.spec.jsx index b066bdbb..b18300c6 100644 --- a/client/apps/admin/components/application_instance_settings/xml_config.spec.jsx +++ b/client/apps/admin/components/application_instance_settings/xml_config.spec.jsx @@ -1,26 +1,34 @@ import React from 'react'; +import { Provider } from 'react-redux'; import TestRenderer from 'react-test-renderer'; -import { XmlConfig } from './xml_config'; +import XmlConfig from './xml_config'; +import configureStore from 'redux-mock-store'; -describe('XmlConfig', () => { - it('renders the XmlConfig component', () => { +const mockStore = configureStore([]); - const applicationInstance = { - id: 1, - }; +const applicationInstance = { + id: 1, + application_id: 2, +}; - const applicationInstances = [ - applicationInstance, - ]; +const store = mockStore({ + applicationInstances: [ + applicationInstance, + ], +}); +describe('XmlConfig', () => { + it('renders the XmlConfig component', () => { const params = { - applicationId: "1", - applicationInstanceId: "1", + applicationId: 2, + applicationInstanceId: 1, }; const result = TestRenderer.create( - + + + ); expect(result).toMatchSnapshot(); }); diff --git a/client/apps/admin/components/application_instances/settings_drop_down.jsx b/client/apps/admin/components/application_instances/settings_drop_down.jsx index 0ddffcf1..af793058 100644 --- a/client/apps/admin/components/application_instances/settings_drop_down.jsx +++ b/client/apps/admin/components/application_instances/settings_drop_down.jsx @@ -1,4 +1,4 @@ -import React from 'react'; +import React from 'react'; export default function settingDropDown() { const styles = { diff --git a/client/apps/admin/components/common/heading.jsx b/client/apps/admin/components/common/heading.jsx index 9ca248a4..7ed33a8f 100644 --- a/client/apps/admin/components/common/heading.jsx +++ b/client/apps/admin/components/common/heading.jsx @@ -1,31 +1,29 @@ import React from 'react'; import PropTypes from 'prop-types'; import _ from 'lodash'; -import { connect } from 'react-redux'; import { Link } from 'react-router3'; import Menu from './menu'; import SubNav from './sub_nav'; import logo from '../../assets/images/aj-logo-emblem.svg'; +import { useDispatch, useSelector } from 'react-redux' -const select = (state) => ({ - signOutUrl: state.settings.sign_out_url, - userEditUrl: state.settings.user_edit_url, - usersUrl: state.settings.users_url, - sites: state.sites, - journalsAdminUrl: state.settings.journals_admin_url, - poolsAdminUrl: state.settings.polls_admin_url, - discussionsAdminUrl: state.settings.discussions_admin_url, - assessmentsAdminUrl: state.settings.assessments_admin_url, - searchAdminUrl: state.settings.search_admin_url, - actAdminUrl: state.settings.act_admin_url, -}); - -export function Heading(props) { +export default function Heading(props) { const { application, - } = props; + const dispatch = useDispatch(); + const signOutUrl = useSelector((state) => state.settings.sign_out_url); + const userEditUrl = useSelector((state) => state.settings.user_edit_url); + const usersUrl = useSelector((state) => state.settings.users_url); + const sites = useSelector((state) => state.sites); + const journalsAdminUrl = useSelector((state) => state.settings.journals_admin_url); + const poolsAdminUrl = useSelector((state) => state.settings.polls_admin_url); + const discussionsAdminUrl = useSelector((state) => state.settings.discussions_admin_url); + const assessmentsAdminUrl = useSelector((state) => state.settings.assessments_admin_url); + const searchAdminUrl = useSelector((state) => state.settings.search_admin_url); + const actAdminUrl = useSelector((state) => state.settings.act_admin_url); + const apps = [ { displayName: 'Starter', @@ -63,16 +61,16 @@ export function Heading(props) {
- +
); } @@ -104,5 +102,3 @@ Heading.propTypes = { discussionsAdminUrl: PropTypes.string, actAdminUrl: PropTypes.string, }; - -export default connect(select)(Heading); diff --git a/client/apps/admin/components/common/heading.spec.jsx b/client/apps/admin/components/common/heading.spec.jsx index d6746a6f..2e88da7c 100644 --- a/client/apps/admin/components/common/heading.spec.jsx +++ b/client/apps/admin/components/common/heading.spec.jsx @@ -1,6 +1,17 @@ import React from 'react'; +import { Provider } from 'react-redux'; import TestRenderer from 'react-test-renderer'; -import { Heading } from './heading'; +import Heading from './heading'; +import configureStore from 'redux-mock-store'; + +const mockStore = configureStore([]); + +const store = mockStore({ + settings: { + sign_out_url: 'https://www.example.com' + }, + sites : { 1: { id: 1, oauth_key: 'akey', oauth_secret: 'secret' } }, +}); describe('common heading', () => { let result; @@ -14,7 +25,11 @@ describe('common heading', () => { signOutUrl: 'https://www.example.com', sites, }; - result = TestRenderer.create(); + result = TestRenderer.create( + + + + ); }); it('matches the snapshot', () => {