Skip to content

Commit fe1cb95

Browse files
committed
Pass intl as prop to GUI
Allow intl to be passed in to GUI as a prop (rather than having to be already in the store)
1 parent 93d9b4a commit fe1cb95

17 files changed

+79
-58
lines changed

.eslintignore

+1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
node_modules/*
22
build/*
3+
dist/*

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ npm-*
1111

1212
# Build
1313
/build
14+
/dist
1415
/.opt-in
1516

1617
# generated translation files

src/containers/language-selector.jsx

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
11
import {connect} from 'react-redux';
2-
import {updateIntl} from '../reducers/intl.js';
32

43
import LanguageSelectorComponent from '../components/language-selector/language-selector.jsx';
54

65
const mapStateToProps = state => ({
76
currentLocale: state.intl.locale
87
});
98

10-
const mapDispatchToProps = dispatch => ({
9+
const mapDispatchToProps = () => ({
1110
onChange: e => {
1211
e.preventDefault();
13-
dispatch(updateIntl(e.target.value));
1412
}
1513
});
1614

src/lib/app-state-hoc.jsx

+29-11
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@ import {Provider} from 'react-redux';
33
import {createStore, applyMiddleware, compose} from 'redux';
44
import throttle from 'redux-throttle';
55

6-
import {intlInitialState, IntlProvider} from '../reducers/intl.js';
6+
import {intlShape} from 'react-intl';
7+
import {IntlProvider, updateIntl} from 'react-intl-redux';
8+
import {intlInitialState} from '../reducers/intl.js';
79
import reducer from '../reducers/gui';
810

911
const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;
@@ -12,7 +14,6 @@ const enhancer = composeEnhancers(
1214
throttle(300, {leading: true, trailing: true})
1315
)
1416
);
15-
const store = createStore(reducer, intlInitialState, enhancer);
1617

1718
import ErrorBoundary from '../containers/error-boundary.jsx';
1819

@@ -22,15 +23,32 @@ import ErrorBoundary from '../containers/error-boundary.jsx';
2223
* @returns {React.Component} component with redux and intl state provided
2324
*/
2425
const AppStateHOC = function (WrappedComponent) {
25-
const AppStateWrapper = ({...props}) => (
26-
<Provider store={store}>
27-
<IntlProvider>
28-
<ErrorBoundary>
29-
<WrappedComponent {...props} />
30-
</ErrorBoundary>
31-
</IntlProvider>
32-
</Provider>
33-
);
26+
class AppStateWrapper extends React.Component {
27+
constructor (props) {
28+
super(props);
29+
this.store = createStore(reducer, (props.intl || intlInitialState), enhancer);
30+
}
31+
componentDidUpdate (prevProps) {
32+
if (prevProps.intl !== this.props.intl) updateIntl(this.props.intl);
33+
}
34+
render () {
35+
return (
36+
<Provider store={this.store}>
37+
<IntlProvider>
38+
<ErrorBoundary>
39+
<WrappedComponent {...this.props} />
40+
</ErrorBoundary>
41+
</IntlProvider>
42+
</Provider>
43+
);
44+
45+
}
46+
47+
48+
}
49+
AppStateWrapper.propTypes = {
50+
intl: intlShape
51+
};
3452
return AppStateWrapper;
3553
};
3654

File renamed without changes.

src/examples/blocks-only.jsx src/playground/blocks-only.jsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import AppStateHOC from '../lib/app-state-hoc.jsx';
66
import Controls from '../containers/controls.jsx';
77
import Blocks from '../containers/blocks.jsx';
88
import GUI from '../containers/gui.jsx';
9-
import ProjectLoaderHOC from '../lib/project-loader-hoc.jsx';
9+
import ProjectLoaderHOC from './project-loader-hoc.jsx';
1010

1111
import styles from './blocks-only.css';
1212

src/examples/compatibility-testing.jsx src/playground/compatibility-testing.jsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import Controls from '../containers/controls.jsx';
77
import Stage from '../containers/stage.jsx';
88
import Box from '../components/box/box.jsx';
99
import GUI from '../containers/gui.jsx';
10-
import ProjectLoaderHOC from '../lib/project-loader-hoc.jsx';
10+
import ProjectLoaderHOC from './project-loader-hoc.jsx';
1111

1212
const mapStateToProps = state => ({vm: state.vm});
1313

File renamed without changes.
File renamed without changes.

src/index.jsx src/playground/index.jsx

+4-4
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@ import React from 'react';
33
import ReactDOM from 'react-dom';
44
import Modal from 'react-modal';
55

6-
import analytics from './lib/analytics';
7-
import AppStateHOC from './lib/app-state-hoc.jsx';
8-
import GUI from './containers/gui.jsx';
9-
import ProjectLoaderHOC from './lib/project-loader-hoc.jsx';
6+
import analytics from '../lib/analytics';
7+
import AppStateHOC from '../lib/app-state-hoc.jsx';
8+
import GUI from '../containers/gui.jsx';
9+
import ProjectLoaderHOC from './project-loader-hoc.jsx';
1010

1111
import styles from './index.css';
1212

src/playground/intl.js

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import {addLocaleData} from 'react-intl';
2+
import defaultsDeep from 'lodash.defaultsdeep';
3+
4+
import localeData from 'scratch-l10n';
5+
import guiMessages from 'scratch-l10n/locales/gui-msgs';
6+
import paintMessages from 'scratch-l10n/locales/paint-msgs';
7+
import penMessages from 'scratch-l10n/locales/pen-msgs';
8+
9+
const combinedMessages = defaultsDeep({}, guiMessages.messages, paintMessages.messages, penMessages.messages);
10+
11+
Object.keys(localeData).forEach(locale => {
12+
// TODO: will need to handle locales not in the default intl - see www/custom-locales
13+
addLocaleData(localeData[locale].localeData);
14+
});
15+
16+
const intlDefault = {
17+
defaultLocale: 'en',
18+
locale: 'en',
19+
messages: combinedMessages.en.messages
20+
};
21+
22+
export {
23+
intlDefault as default,
24+
combinedMessages
25+
};
File renamed without changes.

src/examples/player.jsx src/playground/player.jsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import Controls from '../containers/controls.jsx';
77
import Stage from '../containers/stage.jsx';
88
import Box from '../components/box/box.jsx';
99
import GUI from '../containers/gui.jsx';
10-
import ProjectLoaderHOC from '../lib/project-loader-hoc.jsx';
10+
import ProjectLoaderHOC from './project-loader-hoc.jsx';
1111

1212
import './player.css';
1313

src/lib/project-loader-hoc.jsx src/playground/project-loader-hoc.jsx

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import React from 'react';
22

3-
import analytics from './analytics';
4-
import log from './log';
5-
import storage from './storage';
3+
import analytics from '../lib/analytics';
4+
import log from '../lib/log';
5+
import storage from '../lib/storage';
66

77
/* Higher Order Component to provide behavior for loading projects by id from
88
* the window's hash (#this part in the url)

src/reducers/intl.js

+3-25
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,14 @@
1-
import {addLocaleData} from 'react-intl';
2-
import {updateIntl as superUpdateIntl} from 'react-intl-redux';
3-
import {IntlProvider, intlReducer} from 'react-intl-redux';
4-
import defaultsDeep from 'lodash.defaultsdeep';
5-
6-
import localeData from 'scratch-l10n';
7-
import guiMessages from 'scratch-l10n/locales/gui-msgs';
8-
import paintMessages from 'scratch-l10n/locales/paint-msgs';
9-
import penMessages from 'scratch-l10n/locales/pen-msgs';
10-
11-
const combinedMessages = defaultsDeep({}, guiMessages.messages, paintMessages.messages, penMessages.messages);
12-
13-
Object.keys(localeData).forEach(locale => {
14-
// TODO: will need to handle locales not in the default intl - see www/custom-locales
15-
addLocaleData(localeData[locale].localeData);
16-
});
1+
import {intlReducer} from 'react-intl-redux';
172

183
const intlInitialState = {
194
intl: {
205
defaultLocale: 'en',
216
locale: 'en',
22-
messages: combinedMessages.en.messages
7+
messages: {}
238
}
249
};
2510

26-
const updateIntl = locale => superUpdateIntl({
27-
locale: locale,
28-
messages: combinedMessages[locale].messages || combinedMessages.en.messages
29-
});
30-
3111
export {
3212
intlReducer as default,
33-
IntlProvider,
34-
intlInitialState,
35-
updateIntl
13+
intlInitialState
3614
};

test/unit/util/project-loader-hoc.test.jsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import React from 'react';
2-
import ProjectLoaderHOC from '../../../src/lib/project-loader-hoc.jsx';
2+
import ProjectLoaderHOC from '../../../src/playground/project-loader-hoc.jsx';
33
import storage from '../../../src/lib/storage';
44
import {mount} from 'enzyme';
55

webpack.config.js

+8-8
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@ module.exports = {
1919
devtool: 'cheap-module-source-map',
2020
entry: {
2121
lib: ['react', 'react-dom'],
22-
gui: './src/index.jsx',
23-
blocksonly: './src/examples/blocks-only.jsx',
24-
compatibilitytesting: './src/examples/compatibility-testing.jsx',
25-
player: './src/examples/player.jsx'
22+
gui: './src/playground/index.jsx',
23+
blocksonly: './src/playground/blocks-only.jsx',
24+
compatibilitytesting: './src/playground/compatibility-testing.jsx',
25+
player: './src/playground/player.jsx'
2626
},
2727
output: {
2828
path: path.resolve(__dirname, 'build'),
@@ -82,24 +82,24 @@ module.exports = {
8282
}),
8383
new HtmlWebpackPlugin({
8484
chunks: ['lib', 'gui'],
85-
template: 'src/index.ejs',
85+
template: 'src/playground/index.ejs',
8686
title: 'Scratch 3.0 GUI'
8787
}),
8888
new HtmlWebpackPlugin({
8989
chunks: ['lib', 'blocksonly'],
90-
template: 'src/index.ejs',
90+
template: 'src/playground/index.ejs',
9191
filename: 'blocks-only.html',
9292
title: 'Scratch 3.0 GUI: Blocks Only Example'
9393
}),
9494
new HtmlWebpackPlugin({
9595
chunks: ['lib', 'compatibilitytesting'],
96-
template: 'src/index.ejs',
96+
template: 'src/playground/index.ejs',
9797
filename: 'compatibility-testing.html',
9898
title: 'Scratch 3.0 GUI: Compatibility Testing'
9999
}),
100100
new HtmlWebpackPlugin({
101101
chunks: ['lib', 'player'],
102-
template: 'src/index.ejs',
102+
template: 'src/playground/index.ejs',
103103
filename: 'player.html',
104104
title: 'Scratch 3.0 GUI: Player Example'
105105
}),

0 commit comments

Comments
 (0)