Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

63 react 18next configure #71

Merged
merged 56 commits into from
May 22, 2019
Merged
Show file tree
Hide file tree
Changes from 52 commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
6d7ba25
Added react-i18next and configured, deleted i18n service
clicktronix Feb 5, 2019
d2cbef4
Mvp-base merged. Conflicts resolved
clicktronix Feb 5, 2019
5af28dc
Shrinkwrap updated
clicktronix Feb 5, 2019
6d93ac9
react-i18next moved at /services, react updated
clicktronix Feb 9, 2019
3f3916f
Fixed reat hot loader flow for i18n
clicktronix Feb 9, 2019
7e5b9ae
Deleted i18n export
clicktronix Feb 9, 2019
c3d3826
Master merged, conflicts resolved
clicktronix Mar 24, 2019
3c93486
Dirty commit
clicktronix Mar 28, 2019
ebf0443
Added translations for components
clicktronix Mar 31, 2019
4dd615d
Added styles for selector, added plural translates
clicktronix Mar 31, 2019
15ea3fc
Conflicts resolved
clicktronix Mar 31, 2019
8298d8e
Translates added
clicktronix Mar 31, 2019
d0395a9
Imports changed at client
clicktronix Apr 1, 2019
b152c95
Tests fixed for new localization
clicktronix Apr 1, 2019
6162f64
Master merged, conflicts resolved
clicktronix Apr 5, 2019
410b2fd
Changed SearchForm props for localization
clicktronix Apr 5, 2019
6980146
Tests fixed
clicktronix Apr 5, 2019
a16adce
Added memo menu items
clicktronix Apr 5, 2019
b91a7d3
Changed Lang type value
clicktronix Apr 5, 2019
e828e62
Translates updated
clicktronix Apr 5, 2019
5ae5065
Updated translations
clicktronix Apr 5, 2019
6bc4819
Conflicts resolved
clicktronix Apr 6, 2019
2bbe72c
Labels translations moved from constants
clicktronix Apr 6, 2019
71466ed
Memoization fixed
clicktronix Apr 8, 2019
baeac91
Translates updated
clicktronix Apr 8, 2019
3a0ec63
Replaced lang selector by mui
clicktronix Apr 8, 2019
93db822
I18n packages updated
clicktronix Apr 8, 2019
6aa12f2
Validators changed for work with localization
clicktronix Apr 8, 2019
7aca1d2
Code refactored
clicktronix Apr 9, 2019
f9a4780
Changed filter lables for repos values
clicktronix Apr 9, 2019
c9ae97f
Changed i18n init implementation
clicktronix Apr 9, 2019
1c7cc85
Renamed features translation at components
clicktronix Apr 9, 2019
3dfaad7
Added validation error translations
clicktronix Apr 10, 2019
290530f
i18next added at tslint imports black list
clicktronix Apr 10, 2019
fc7845b
Merge branch 'master' into 63-react-18next-configure
clicktronix Apr 10, 2019
62127be
Props WithTranslation renamed on TranslationProps
clicktronix Apr 11, 2019
bcbe6b9
Profile validators moved at constants
clicktronix Apr 11, 2019
f21a1da
Added memoizeByProps decorator
clicktronix Apr 15, 2019
9283b28
Updated context binding at memoizeByProps
clicktronix Apr 16, 2019
e3ddec5
Decorator memoizeByProps refatored
clicktronix Apr 16, 2019
5ed7b09
Translate function extends; t func added at Fields
clicktronix Apr 17, 2019
f19f504
memoizeByProps decorator updated, types for extended t func updated
clicktronix Apr 18, 2019
74dd471
Types updated for i18n, TranslateFunction & ITranslationProps are red…
clicktronix Apr 18, 2019
ae35a6b
memoizeByProps implementation updated
clicktronix Apr 18, 2019
91228f8
At memoizeByProps returned Object.defineProperty
clicktronix Apr 18, 2019
963e23f
menuItems at layout are memoized
clicktronix Apr 19, 2019
6082f1e
isTranslateGetKey moved at i18n serrvice
clicktronix Apr 19, 2019
986de5b
useTranslation hook types are redeclared
clicktronix Apr 19, 2019
e180ae6
Deleted .getKey method calling from translate keys
clicktronix Apr 19, 2019
04dfbce
Deleted serrvice deps from form in shared
clicktronix Apr 19, 2019
a46c6db
memoizeByProps updated
clicktronix Apr 19, 2019
39ae7b7
memoizeByProps types updated
clicktronix Apr 21, 2019
b6ad54f
Updated memo functios at Users and Repos search forms
clicktronix Apr 22, 2019
b128eee
Conflicts resolved. Master merged
clicktronix May 6, 2019
11df4ec
Wrong tests deleted
clicktronix May 10, 2019
e9359f6
Renamed destructured transtalations on intl
clicktronix May 21, 2019
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9,662 changes: 6,282 additions & 3,380 deletions npm-shrinkwrap.json

Large diffs are not rendered by default.

9 changes: 6 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -178,13 +178,13 @@
"fork-ts-checker-webpack-plugin": "^0.5.0",
"gh-pages": "^2.0.1",
"html-webpack-plugin": "^3.2.0",
"jest": "^23.6.0",
"jest": "^24.7.1",
"mini-css-extract-plugin": "^0.4.5",
"react-hot-loader": "^4.7.0",
"redux-devtools-extension": "^2.13.5",
"sinon": "^7.1.1",
"style-loader": "^0.21.0",
"stylelint": "^9.6.0",
clicktronix marked this conversation as resolved.
Show resolved Hide resolved
"stylelint": "^9.10.1",
clicktronix marked this conversation as resolved.
Show resolved Hide resolved
"stylelint-config-standard": "^18.2.0",
"stylelint-order": "^1.0.0",
"stylelint-scss": "^3.3.2",
Expand Down Expand Up @@ -246,12 +246,14 @@
"file-loader": "^2.0.0",
clicktronix marked this conversation as resolved.
Show resolved Hide resolved
"filemanager-webpack-plugin": "^2.0.5",
"final-form": "^4.11.0",
"i18next": "^15.0.9",
"i18next-browser-languagedetector": "^3.0.1",
"inversify": "^5.0.1",
clicktronix marked this conversation as resolved.
Show resolved Hide resolved
"inversify-inject-decorators": "^3.1.0",
clicktronix marked this conversation as resolved.
Show resolved Hide resolved
"jss": "^9.8.3",
clicktronix marked this conversation as resolved.
Show resolved Hide resolved
"jss-compose": "^5.0.0",
"node-polyglot": "^2.3.0",
"node-sass": "^4.9.2",
"node-sass": "^4.11.0",
"normalize.css": "^8.0.0",
"normalizr": "^2.3.1",
"postcss-easy-import": "^3.0.0",
Expand All @@ -264,6 +266,7 @@
"react-dom": "^16.8.2",
"react-final-form": "^4.0.2",
"react-helmet": "^5.2.0",
"react-i18next": "^10.6.2",
"react-jss": "^8.6.1",
"react-number-format": "^4.0.6",
"react-redux": "^6.0.0",
Expand Down
6 changes: 3 additions & 3 deletions src/client.tsx
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import 'reflect-metadata';
import 'babel-polyfill';
import { App } from 'core/App';
import React from 'react';
import ReactDOM from 'react-dom';
import bootstrapper from 'react-async-bootstrapper';
import configureApp from 'core/configureApp';

import getEnvParams from './core/getEnvParams';
import configureApp from 'core/configureApp';
import { App } from 'core/App';
import getEnvParams from 'core/getEnvParams';

const { appVersion } = getEnvParams();

Expand Down
9 changes: 3 additions & 6 deletions src/core/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import 'normalize.css';
import { hot } from 'react-hot-loader/root';
import { ThemeProvider } from 'services/theme';
import { containers as NotificationContainers } from 'services/notification';
import { I18nProvider } from 'services/i18n';
import { IAppData, IModule, IJssDependencies } from 'shared/types/app';
import { BaseStyles, JssProvider, SheetsRegistry } from 'shared/styles';

Expand Down Expand Up @@ -61,11 +60,9 @@ function renderSharedPart(
disableStylesGeneration={disableStylesGeneration}
>
<ThemeProvider disableStylesGeneration={disableStylesGeneration}>
<I18nProvider>
<BaseStyles>
{createRoutes(modules)}
</BaseStyles>
</I18nProvider>
<BaseStyles>
{createRoutes(modules)}
</BaseStyles>
<NotificationContainers.Notification />
</ThemeProvider>
</JssProvider>
Expand Down
6 changes: 4 additions & 2 deletions src/core/configureApp.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,18 @@
import configureDeps from './configureDeps';
import { TYPES, container } from './configureIoc';
import configureStore, { createReducer } from './configureStore';
import { configureJss } from './configureJss';

import * as allModules from 'modules';
import { configureJss } from 'core/configureJss';
import { ReducersMap } from 'shared/types/redux';
import { reduxEntry as themeProviderRE } from 'services/theme';
import { reduxEntry as notificationReduxEntry } from 'services/notification';
import { IAppData, IModule, RootSaga, IAppReduxState, IReduxEntry } from 'shared/types/app';
import { initializeI18n } from 'services/i18n/i18nContainer';

function configureApp(data?: IAppData): IAppData {
/* Prepare main app elements */
const modules: IModule[] = Object.values(allModules);
const modules: IModule[] = Object.values(allModules);

if (data) {
return { ...data, modules };
Expand All @@ -37,6 +38,7 @@ function configureApp(data?: IAppData): IAppData {

const dependencies = configureDeps(store);
const jssDeps = configureJss();
initializeI18n();

sharedReduxEntries.forEach(connectEntryToStore);
modules.forEach((module: IModule) => {
Expand Down
45 changes: 33 additions & 12 deletions src/features/profile/view/containers/ProfileEdit/ProfileEdit.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,15 @@ import { connect } from 'react-redux';
import { Form, FormRenderProps } from 'react-final-form';
import { bind } from 'decko';

import { withTranslation, ITranslationProps, tKeys } from 'services/i18n';
import { TextInputField, NumberInputField } from 'shared/view/form';
import { Button } from 'shared/view/elements';
import { IAppReduxState } from 'shared/types/app';
import { IProfile } from 'shared/types/models';
import { actions as notificationServiceActions } from 'services/notification';

import { fieldNames, validateBio, validateName, validateNickname } from './constants';
import {
fieldNames, validateName, validateNickname, validateBio,
} from './constants';
import { ProfileAvatar } from '../../components';
import { IProfileEditFormFields } from '../../../namespace';
import { actions, selectors } from './../../../redux';
Expand All @@ -23,7 +25,7 @@ interface IStateProps {

type IActionProps = typeof mapDispatch;

type IProps = IStateProps & IActionProps;
type IProps = IStateProps & IActionProps & ITranslationProps;

function mapState(state: IAppReduxState): IStateProps {
return {
Expand All @@ -37,6 +39,7 @@ const mapDispatch = {
};

const b = block('profile-edit');
const { profile: translations } = tKeys.features;

class ProfileEdit extends React.PureComponent<IProps> {
public render() {
Expand All @@ -53,27 +56,44 @@ class ProfileEdit extends React.PureComponent<IProps> {

@bind
private renderForm({ handleSubmit }: FormRenderProps) {
const { profile: { avatarURL } } = this.props;
const { profile: { avatarURL }, t } = this.props;
return (
<form onSubmit={handleSubmit} className={b()}>
<div className={b('avatar')}>
<ProfileAvatar avatarURL={avatarURL} size="big" />
</div>
<div className={b('fields')}>
<div className={b('field')}>
<TextInputField name={fieldNames.name} label="Name" validate={validateName}/>
<TextInputField
name={fieldNames.name}
label={t(translations.name)}
validate={validateName}
t={t}
/>
</div>
<div className={b('field')}>
<TextInputField name={fieldNames.nickname} label="Nickname" validate={validateNickname} />
<TextInputField
name={fieldNames.nickname}
label={t(translations.nickname)}
validate={validateNickname}
t={t}
/>
</div>
<div className={b('field')}>
<NumberInputField name={fieldNames.age} label="Age" />
<NumberInputField name={fieldNames.age} label={t(translations.age)} t={t} />
</div>
<div className={b('field')}>
<TextInputField name={fieldNames.bio} label="Bio" multiline rowsMax={10} validate={validateBio}/>
<TextInputField
name={fieldNames.bio}
label={t(translations.bio)}
multiline
rowsMax={10}
validate={validateBio}
t={t}
/>
</div>
<div className={b('button')}>
<Button variant="outlined" type="submit">Save</Button>
<Button variant="outlined" type="submit">{t(tKeys.shared.save)}</Button>
</div>
</div>
</form>
Expand All @@ -82,11 +102,12 @@ class ProfileEdit extends React.PureComponent<IProps> {

@bind
private handleFormSubmit(values: IProfileEditFormFields) {
const { saveProfile, setNotification } = this.props;
const { saveProfile, setNotification, t } = this.props;
saveProfile(values);
setNotification({ kind: 'info', text: 'User data was saved.' });
setNotification({ kind: 'info', text: t(tKeys.shared.notifications.saved) });
}
}

const connectedComponent = connect(mapState, mapDispatch)(ProfileEdit);
export { ProfileEdit, IProps as IProfileEditProps };
export default connect(mapState, mapDispatch)(ProfileEdit);
export default withTranslation()(connectedComponent);
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Form } from 'react-final-form';

import { makeShallowRenderer } from 'shared/helpers';
import { makeShallowRenderer, getMockedLocaleProps } from 'shared/helpers';
import { profile } from 'shared/mocks';

import { ProfileEdit, IProfileEditProps } from '../ProfileEdit';
Expand All @@ -9,6 +9,7 @@ const props: IProfileEditProps = {
profile,
setNotification: jest.fn(),
saveProfile: jest.fn(),
...getMockedLocaleProps(),
};

const getComponent = makeShallowRenderer(ProfileEdit, props);
Expand Down
43 changes: 34 additions & 9 deletions src/features/profile/view/containers/ProfileEdit/constants.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import { FormFieldNames } from 'shared/types/form';
import { IProfileEditFormFields } from '../../../namespace';
import {
isRequired, makeMaxCharactersValidator, makeMinCharactersValidator, composeValidators,
composeValidators, makeRequired, makeMinCharactersValidator, makeMaxCharactersValidator,
} from 'shared/validators';
import { IProfileEditFormFields } from '../../../namespace';
import { tKeys } from 'services/i18n';

export const fieldNames: FormFieldNames<IProfileEditFormFields> = {
age: 'age',
Expand All @@ -12,16 +13,40 @@ export const fieldNames: FormFieldNames<IProfileEditFormFields> = {
avatarURL: 'avatarURL',
};

export const MIN_NAME_LENGTH = 3;
export const MAX_NAME_LENGTH = 35;
export const MIN_NICKNAME_LENGTH = 3;
export const MAX_NICKNAME_LENGTH = 13;
export const MAX_BIO_LENGTH = 200;

export const validateName = composeValidators(
isRequired,
makeMinCharactersValidator(3, 'Name'),
makeMaxCharactersValidator(35, 'Name'),
makeRequired(tKeys.shared.fieldIsRequiredError),
makeMinCharactersValidator(MIN_NAME_LENGTH, {
key: tKeys.shared.fieldMinLengthError,
options: { minCharacters: MIN_NAME_LENGTH },
}),
makeMaxCharactersValidator(MAX_NAME_LENGTH, {
key: tKeys.shared.fieldMaxLengthError,
options: { maxCharacters: MAX_NAME_LENGTH },
}),
);

export const validateNickname = composeValidators(
isRequired,
makeMinCharactersValidator(3, 'Nickname'),
makeMaxCharactersValidator(13, 'Nickname'),
makeRequired(tKeys.shared.fieldIsRequiredError),
makeMinCharactersValidator(MIN_NICKNAME_LENGTH, {
key: tKeys.shared.fieldMinLengthError,
options: { minCharacters: MIN_NICKNAME_LENGTH },
}),
makeMaxCharactersValidator(MAX_NICKNAME_LENGTH, {
key: tKeys.shared.fieldMaxLengthError,
options: { maxCharacters: MAX_NICKNAME_LENGTH },
}),
);

export const validateBio = makeMaxCharactersValidator(200, 'Bio');
export const validateBio = composeValidators(
makeRequired(tKeys.shared.fieldIsRequiredError),
makeMaxCharactersValidator(MAX_BIO_LENGTH, {
key: tKeys.shared.fieldMaxLengthError,
options: { maxCharacters: MAX_BIO_LENGTH },
}),
);
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import block from 'bem-cn';
import { connect } from 'react-redux';
import { bind } from 'decko';

import { withTranslation, ITranslationProps, tKeys } from 'services/i18n';
import { IAppReduxState } from 'shared/types/app';
import { IProfile } from 'shared/types/models';
import { Popover } from 'shared/view/components';
Expand All @@ -23,9 +24,10 @@ interface IStateProps {
profile: IProfile;
}

type IProps = IOwnProps & IStateProps;
type IProps = IOwnProps & IStateProps & ITranslationProps;

const b = block('profile-preview');
const { profile: translations } = tKeys.features;

function mapState(state: IAppReduxState): IStateProps {
return {
Expand All @@ -41,7 +43,7 @@ class ProfilePreview extends React.PureComponent<IProps, IState> {
private blockRef = createRef<HTMLDivElement>();

public render() {
const { profile: { avatarURL, name, nickname, age, bio }, onEditClick } = this.props;
const { profile: { avatarURL, name, nickname, age, bio }, onEditClick, t } = this.props;
const { isOpen } = this.state;
return (
<div className={b()} ref={this.blockRef}>
Expand All @@ -64,15 +66,15 @@ class ProfilePreview extends React.PureComponent<IProps, IState> {
{nickname}
</div>
<div className={b('age')}>
{age} y.o.
{t(translations.yearsOld, { count: age })}
</div>
</div>
</div>
<div className={b('bio')}>
{bio}
</div>
<div className={b('edit')} onClick={onEditClick}>
Edit
{t(translations.edit)}
</div>
</div>
</Popover>
Expand All @@ -92,5 +94,7 @@ class ProfilePreview extends React.PureComponent<IProps, IState> {

}

const connectedComponent = connect(mapState)(ProfilePreview);

export { ProfilePreview, IProps as IProfilePreviewProps };
export default connect(mapState)(ProfilePreview);
export default withTranslation()(connectedComponent);
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { makeShallowRenderer } from 'shared/helpers';
import { makeShallowRenderer, getMockedLocaleProps } from 'shared/helpers';
import { Popover } from 'shared/view/components';
import { profile } from 'shared/mocks';

Expand All @@ -7,6 +7,7 @@ import { ProfilePreview, IProfilePreviewProps } from '../ProfilePreview';
const props: IProfilePreviewProps = {
onEditClick: jest.fn(),
profile,
...getMockedLocaleProps(),
};

const getComponent = makeShallowRenderer(ProfilePreview, props);
Expand Down
Loading