From c66fc9dc44b8ec903d98846c9df6a46eb529dfed Mon Sep 17 00:00:00 2001 From: Architektor Date: Wed, 14 Mar 2018 21:46:30 +0300 Subject: [PATCH 1/7] wip --- app/actions/actionTypes/ui.js | 1 + app/actions/ui.js | 6 +++ .../FeatureHightlight/FeatureHightlight.jsx | 49 +++++++++++++++++++ app/components/FeatureHightlight/index.jsx | 1 + app/components/index.jsx | 1 + app/sagas/ui.js | 12 +++++ app/types/ui.js | 5 ++ 7 files changed, 75 insertions(+) create mode 100644 app/components/FeatureHightlight/FeatureHightlight.jsx create mode 100644 app/components/FeatureHightlight/index.jsx diff --git a/app/actions/actionTypes/ui.js b/app/actions/actionTypes/ui.js index 6c18bd9e2..aa8f0f996 100644 --- a/app/actions/actionTypes/ui.js +++ b/app/actions/actionTypes/ui.js @@ -9,3 +9,4 @@ export const INSTALL_UPDATE_REQUEST = 'ui/INSTALL_UPDATE_REQUEST'; export const ADD_FLAG = 'ui/ADD_FLAG'; export const DELETE_FLAG = 'ui/DELETE_FLAG'; export const ISSUE_WORKLOGS_SCROLL_TO_INDEX_REQUEST = 'ui/ISSUE_WORKLOGS_SCROLL_TO_INDEX_REQUEST'; +export const ACKNOWLEDGE_FEATURE = 'ui/ACKNOWLEDGE_FEATURE'; diff --git a/app/actions/ui.js b/app/actions/ui.js index 6c2054dc6..3c7d20bd6 100644 --- a/app/actions/ui.js +++ b/app/actions/ui.js @@ -78,3 +78,9 @@ export const issueWorklogsScrollToIndexRequest = ( issueId, }); +export const acknowlegdeFeature = (payload: { + featureId: string, +}): UiAction => ({ + type: actionTypes.ACKNOWLEDGE_FEATURE, + payload, +}); diff --git a/app/components/FeatureHightlight/FeatureHightlight.jsx b/app/components/FeatureHightlight/FeatureHightlight.jsx new file mode 100644 index 000000000..7cff341f9 --- /dev/null +++ b/app/components/FeatureHightlight/FeatureHightlight.jsx @@ -0,0 +1,49 @@ +import React from 'react'; +import type { + Node, +} from 'react'; +import { connect } from 'react-redux'; +import type { Dispatch } from 'react-redux'; +import Tooltip from '@atlaskit/tooltip'; +import Lozenge from '@atlaskit/lozenge'; +import { getUiState } from 'selectors'; +import { uiActions } from 'actions'; + +type Props = { + dispatch: Dispatch, + children: Node, + description: string, + featuresAcknowleged: Array, + id: string, +}; + +const FeatureHighlight = ({ + dispatch, + featuresAcknowleged, + description, + children, + id, +}: Props) => (!featuresAcknowleged.includes(id) + ? ( + dispatch(uiActions.acknowlegdeFeature({ featureId: id }))} + onBlur={() => dispatch(uiActions.acknowlegdeFeature({ featureId: id }))} + > + {children} + + New + + + ) : ( + children + )); + +const connector = connect( + state => ({ + featuresAcknowleged: getUiState('featuresAcknowleged')(state), + }), + dispatch => ({ dispatch }), +); + +export default connector(FeatureHighlight); diff --git a/app/components/FeatureHightlight/index.jsx b/app/components/FeatureHightlight/index.jsx new file mode 100644 index 000000000..87fd7bf7d --- /dev/null +++ b/app/components/FeatureHightlight/index.jsx @@ -0,0 +1 @@ +export default from './FeatureHightlight'; diff --git a/app/components/index.jsx b/app/components/index.jsx index bfda484af..a3e35f17d 100644 --- a/app/components/index.jsx +++ b/app/components/index.jsx @@ -17,3 +17,4 @@ export TextField from './TextField'; export SingleSelect from './SingleSelect'; export * as ReduxFormComponents from './ReduxFormComponents'; export RemainingEstimatePicker from './RemainingEstimatePicker'; +export FeatureHighlight from './FeatureHightlight'; diff --git a/app/sagas/ui.js b/app/sagas/ui.js index cd884a839..0e88d5096 100644 --- a/app/sagas/ui.js +++ b/app/sagas/ui.js @@ -7,6 +7,7 @@ import { takeEvery, put, call, + take, fork, select, } from 'redux-saga/effects'; @@ -31,6 +32,7 @@ import { import { setToStorage, + getFromStorage, } from './storage'; import { issueSelectFlow, @@ -219,3 +221,13 @@ export function* watchSetIssuesFilter(): Generator<*, *, *> { onIssuesFilterChange, ); } + +export function* newFeaturesFlow(): Generator<*, *, *> { + while (true) { + const { payload: { featureId } } = yield take(actionTypes.ACKNOWLEDGE_FEATURE); + let acknowlegdedFeatures = yield call(getFromStorage, 'acknowlegdedFeatures'); + if (!acknowlegdedFeatures) acknowlegdedFeatures = []; + acknowlegdedFeatures.push(featureId); + yield call(setToStorage, 'acknowlegdedFeatures', acknowlegdedFeatures); + } +} diff --git a/app/types/ui.js b/app/types/ui.js index a20112a77..bab73da8e 100644 --- a/app/types/ui.js +++ b/app/types/ui.js @@ -49,6 +49,11 @@ export type UiAction = |} | {| type: typeof actionTypes.INSTALL_UPDATE_REQUEST, + |} | {| + type: typeof actionTypes.ACKNOWLEDGE_FEATURE, + payload: { + featureId: string, + }, |}; export type RemainingEstimate = 'auto' | 'new' | 'manual' | 'leave'; From ff7677709852f303674ec1b834247f354cdbb20c Mon Sep 17 00:00:00 2001 From: Architektor Date: Wed, 14 Mar 2018 22:23:58 +0300 Subject: [PATCH 2/7] feat: make new feature presentation component --- .../FeatureHighlight.jsx} | 21 +++--- app/components/FeatureHighlight/index.jsx | 1 + .../FeatureHighlight/styled/index.js | 11 +++ app/components/FeatureHightlight/index.jsx | 1 - app/components/index.jsx | 2 +- app/containers/Header/Header.jsx | 71 ++++++++++--------- app/reducers/ui.js | 1 + app/sagas/index.js | 1 + app/sagas/initializeApp.js | 4 ++ app/sagas/ui.js | 1 + app/types/ui.js | 1 + flow-typed/npm/redux_v3.x.x.js | 10 +-- package.json | 2 +- yarn.lock | 14 +--- 14 files changed, 79 insertions(+), 62 deletions(-) rename app/components/{FeatureHightlight/FeatureHightlight.jsx => FeatureHighlight/FeatureHighlight.jsx} (61%) create mode 100644 app/components/FeatureHighlight/index.jsx create mode 100644 app/components/FeatureHighlight/styled/index.js delete mode 100644 app/components/FeatureHightlight/index.jsx diff --git a/app/components/FeatureHightlight/FeatureHightlight.jsx b/app/components/FeatureHighlight/FeatureHighlight.jsx similarity index 61% rename from app/components/FeatureHightlight/FeatureHightlight.jsx rename to app/components/FeatureHighlight/FeatureHighlight.jsx index 7cff341f9..4d148be71 100644 --- a/app/components/FeatureHightlight/FeatureHightlight.jsx +++ b/app/components/FeatureHighlight/FeatureHighlight.jsx @@ -9,31 +9,32 @@ import Lozenge from '@atlaskit/lozenge'; import { getUiState } from 'selectors'; import { uiActions } from 'actions'; +import { FeatureContainer } from './styled'; + type Props = { dispatch: Dispatch, children: Node, description: string, - featuresAcknowleged: Array, + acknowlegdedFeatures: Array, id: string, }; const FeatureHighlight = ({ dispatch, - featuresAcknowleged, + acknowlegdedFeatures, description, children, id, -}: Props) => (!featuresAcknowleged.includes(id) +}: Props) => (!acknowlegdedFeatures.includes(id) ? ( dispatch(uiActions.acknowlegdeFeature({ featureId: id }))} - onBlur={() => dispatch(uiActions.acknowlegdeFeature({ featureId: id }))} + onClick={() => dispatch(uiActions.acknowlegdeFeature({ featureId: 'multiAccounts' }))} > - {children} - - New - + + {children} + New + ) : ( children @@ -41,7 +42,7 @@ const FeatureHighlight = ({ const connector = connect( state => ({ - featuresAcknowleged: getUiState('featuresAcknowleged')(state), + acknowlegdedFeatures: getUiState('acknowlegdedFeatures')(state), }), dispatch => ({ dispatch }), ); diff --git a/app/components/FeatureHighlight/index.jsx b/app/components/FeatureHighlight/index.jsx new file mode 100644 index 000000000..7fe15d4e7 --- /dev/null +++ b/app/components/FeatureHighlight/index.jsx @@ -0,0 +1 @@ +export default from './FeatureHighlight'; diff --git a/app/components/FeatureHighlight/styled/index.js b/app/components/FeatureHighlight/styled/index.js new file mode 100644 index 000000000..0b6529ed1 --- /dev/null +++ b/app/components/FeatureHighlight/styled/index.js @@ -0,0 +1,11 @@ +import styled from 'styled-components2'; + +export const FeatureContainer = styled.div` + position: relative; + & > span:last-child { + position: absolute; + top: 0; + right: 0; + transform: translateX(100%); + } +`; diff --git a/app/components/FeatureHightlight/index.jsx b/app/components/FeatureHightlight/index.jsx deleted file mode 100644 index 87fd7bf7d..000000000 --- a/app/components/FeatureHightlight/index.jsx +++ /dev/null @@ -1 +0,0 @@ -export default from './FeatureHightlight'; diff --git a/app/components/index.jsx b/app/components/index.jsx index a3e35f17d..0d62eb1a0 100644 --- a/app/components/index.jsx +++ b/app/components/index.jsx @@ -17,4 +17,4 @@ export TextField from './TextField'; export SingleSelect from './SingleSelect'; export * as ReduxFormComponents from './ReduxFormComponents'; export RemainingEstimatePicker from './RemainingEstimatePicker'; -export FeatureHighlight from './FeatureHightlight'; +export FeatureHighlight from './FeatureHighlight'; diff --git a/app/containers/Header/Header.jsx b/app/containers/Header/Header.jsx index 4e66171ff..fcda190b1 100644 --- a/app/containers/Header/Header.jsx +++ b/app/containers/Header/Header.jsx @@ -50,6 +50,8 @@ import EditorAddIcon from '@atlaskit/icon/glyph/editor/add'; import { transformValidHost } from '../../sagas/auth'; +import FeatureHighlight from '../../components/FeatureHighlight'; + import { HeaderContainer, ProfileContainer, @@ -99,40 +101,45 @@ const Header: StatelessFunctionalComponent = ({ {userData.displayName} - - {host} - - } + - {accounts.map((ac) => { - const isActive = transformValidHost(ac.host).host === host && - (ac.username === userData.emailAddress || - ac.username === userData.key || - ac.username === userData.name); - return ( - dispatch(authActions.switchAccount(ac))} - isDisabled={isActive} - elemAfter={isActive && Active} - > - - {ac.username} - - ); - })} - dispatch(authActions.logoutRequest({ dontForget: true }))} + + {host} + + } > - - Add account - - - + {accounts.map((ac) => { + const isActive = transformValidHost(ac.host).host === host && + (ac.username === userData.emailAddress || + ac.username === userData.key || + ac.username === userData.name); + return ( + dispatch(authActions.switchAccount(ac))} + isDisabled={isActive} + elemAfter={isActive && Active} + > + + {ac.username} + + ); + })} + dispatch(authActions.logoutRequest({ dontForget: true }))} + > + + Add account + + + + diff --git a/app/reducers/ui.js b/app/reducers/ui.js index fcf42a42d..de6e795fc 100644 --- a/app/reducers/ui.js +++ b/app/reducers/ui.js @@ -15,6 +15,7 @@ const initialState: UiState = { initializeInProcess: false, authorized: false, accounts: [], + acknowlegdedFeatures: [], authFormStep: 1, loginError: null, loginRequestInProcess: false, diff --git a/app/sagas/index.js b/app/sagas/index.js index 62d42fd67..656f359bf 100644 --- a/app/sagas/index.js +++ b/app/sagas/index.js @@ -74,5 +74,6 @@ export default function* rootSaga(): Generator<*, void, *> { fork(uiSagas.watchUiStateChange), fork(uiSagas.watchScrollToIndexRequest), fork(uiSagas.watchSetIssuesFilter), + fork(uiSagas.newFeaturesFlow), ]); } diff --git a/app/sagas/initializeApp.js b/app/sagas/initializeApp.js index 0b63bb400..51747079d 100644 --- a/app/sagas/initializeApp.js +++ b/app/sagas/initializeApp.js @@ -113,6 +113,10 @@ export function* initialConfigureApp({ if (!accounts) accounts = []; yield put(uiActions.setUiState('accounts', accounts)); + let acknowlegdedFeatures = yield call(getFromStorage, 'acknowlegdedFeatures'); + if (!acknowlegdedFeatures) acknowlegdedFeatures = []; + yield put(uiActions.setUiState('acknowlegdedFeatures', acknowlegdedFeatures)); + const issuesSourceId: Id | null = yield call(getFromStorage, 'issuesSourceId'); const issuesSourceType = yield call(getFromStorage, 'issuesSourceType'); const issuesSprintId: Id | null = yield call(getFromStorage, 'issuesSprintId'); diff --git a/app/sagas/ui.js b/app/sagas/ui.js index 0e88d5096..e9b09238d 100644 --- a/app/sagas/ui.js +++ b/app/sagas/ui.js @@ -229,5 +229,6 @@ export function* newFeaturesFlow(): Generator<*, *, *> { if (!acknowlegdedFeatures) acknowlegdedFeatures = []; acknowlegdedFeatures.push(featureId); yield call(setToStorage, 'acknowlegdedFeatures', acknowlegdedFeatures); + yield put(uiActions.setUiState('acknowlegdedFeatures', acknowlegdedFeatures)); } } diff --git a/app/types/ui.js b/app/types/ui.js index 7f5faec2e..48aded22a 100644 --- a/app/types/ui.js +++ b/app/types/ui.js @@ -62,6 +62,7 @@ export type UiState = {| initializeInProcess: boolean, authorized: boolean, accounts: Array<{ host: string, username: string }>, + acknowlegdedFeatures: Array, authFormStep: number, loginError: null | string, loginRequestInProcess: boolean, diff --git a/flow-typed/npm/redux_v3.x.x.js b/flow-typed/npm/redux_v3.x.x.js index 97fec81e5..7bc662368 100644 --- a/flow-typed/npm/redux_v3.x.x.js +++ b/flow-typed/npm/redux_v3.x.x.js @@ -1,5 +1,5 @@ -// flow-typed signature: ec7daead5cb4fec5ab25fedbedef29e8 -// flow-typed version: 2c04631d20/redux_v3.x.x/flow_>=v0.55.x +// flow-typed signature: cca4916b0213065533df8335c3285a4a +// flow-typed version: cab04034e7/redux_v3.x.x/flow_>=v0.55.x declare module 'redux' { @@ -27,7 +27,7 @@ declare module 'redux' { replaceReducer(nextReducer: Reducer): void }; - declare export type Reducer = (state: S, action: A) => S; + declare export type Reducer = (state: S | void, action: A) => S; declare export type CombinedReducer = (state: $Shape & {} | void, action: A) => S; @@ -43,7 +43,7 @@ declare module 'redux' { declare export type StoreEnhancer> = (next: StoreCreator) => StoreCreator; declare export function createStore(reducer: Reducer, enhancer?: StoreEnhancer): Store; - declare export function createStore(reducer: Reducer, preloadedState: S, enhancer?: StoreEnhancer): Store; + declare export function createStore(reducer: Reducer, preloadedState?: S, enhancer?: StoreEnhancer): Store; declare export function applyMiddleware(...middlewares: Array>): StoreEnhancer; @@ -56,4 +56,4 @@ declare module 'redux' { declare export function combineReducers(reducers: O): CombinedReducer<$ObjMap(r: Reducer) => S>, A>; declare export var compose: $Compose; -} \ No newline at end of file +} diff --git a/package.json b/package.json index e0e18ee4f..cbaaefaa4 100644 --- a/package.json +++ b/package.json @@ -154,7 +154,7 @@ "@atlaskit/single-select": "3.2.2", "@atlaskit/spinner": "4.1.2", "@atlaskit/tag": "3.1.3", - "@atlaskit/tooltip": "8.2.0", + "@atlaskit/tooltip": "8.3.2", "bufferutil": "3.0.3", "calculate-size": "1.1.1", "electron-json-storage": "4.0.2", diff --git a/yarn.lock b/yarn.lock index fd8d2dd48..8aea9291f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -254,7 +254,7 @@ styled-components "^1.4.6" uuid "^3.1.0" -"@atlaskit/layer-manager@^2.6.0", "@atlaskit/layer-manager@^2.7.1", "@atlaskit/layer-manager@^2.7.2", "@atlaskit/layer-manager@^2.7.4": +"@atlaskit/layer-manager@^2.7.1", "@atlaskit/layer-manager@^2.7.2", "@atlaskit/layer-manager@^2.7.4": version "2.7.4" resolved "https://registry.yarnpkg.com/@atlaskit/layer-manager/-/layer-manager-2.7.4.tgz#ad96a1335d7b77db7af8fe4b30ae8171c4febf83" dependencies: @@ -344,17 +344,7 @@ prop-types "^15.5.10" styled-components "^1.4.6" -"@atlaskit/tooltip@8.2.0": - version "8.2.0" - resolved "https://registry.yarnpkg.com/@atlaskit/tooltip/-/tooltip-8.2.0.tgz#6484f2943d2856903bd4ec1519a459f1dd569d35" - dependencies: - "@atlaskit/layer-manager" "^2.6.0" - "@atlaskit/theme" "^2.3.1" - react-deprecate "^0.1.0" - react-transition-group "^2.2.1" - styled-components "^1.4.6" - -"@atlaskit/tooltip@^8.3.2": +"@atlaskit/tooltip@8.3.2", "@atlaskit/tooltip@^8.3.2": version "8.3.2" resolved "https://registry.yarnpkg.com/@atlaskit/tooltip/-/tooltip-8.3.2.tgz#ed166fb9f46680e672f2404b310bcf5fd344d8f6" dependencies: From 1721ffb67339b241fc9a619b301d713d3d2a7101 Mon Sep 17 00:00:00 2001 From: Architektor Date: Wed, 14 Mar 2018 22:33:29 +0300 Subject: [PATCH 3/7] fix: feature acknowlegement --- app/components/FeatureHighlight/FeatureHighlight.jsx | 5 +++-- app/sagas/ui.js | 6 +++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/app/components/FeatureHighlight/FeatureHighlight.jsx b/app/components/FeatureHighlight/FeatureHighlight.jsx index 4d148be71..057b0f998 100644 --- a/app/components/FeatureHighlight/FeatureHighlight.jsx +++ b/app/components/FeatureHighlight/FeatureHighlight.jsx @@ -29,9 +29,10 @@ const FeatureHighlight = ({ ? ( dispatch(uiActions.acknowlegdeFeature({ featureId: 'multiAccounts' }))} > - + dispatch(uiActions.acknowlegdeFeature({ featureId: 'multiAccounts' }))} + > {children} New diff --git a/app/sagas/ui.js b/app/sagas/ui.js index e9b09238d..c018c86fa 100644 --- a/app/sagas/ui.js +++ b/app/sagas/ui.js @@ -7,7 +7,6 @@ import { takeEvery, put, call, - take, fork, select, } from 'redux-saga/effects'; @@ -223,12 +222,13 @@ export function* watchSetIssuesFilter(): Generator<*, *, *> { } export function* newFeaturesFlow(): Generator<*, *, *> { - while (true) { - const { payload: { featureId } } = yield take(actionTypes.ACKNOWLEDGE_FEATURE); + function* flow({ payload: { featureId } }): Generator<*, void, *> { let acknowlegdedFeatures = yield call(getFromStorage, 'acknowlegdedFeatures'); if (!acknowlegdedFeatures) acknowlegdedFeatures = []; acknowlegdedFeatures.push(featureId); yield call(setToStorage, 'acknowlegdedFeatures', acknowlegdedFeatures); + yield call(delay, 10000); yield put(uiActions.setUiState('acknowlegdedFeatures', acknowlegdedFeatures)); } + yield takeLatest(actionTypes.ACKNOWLEDGE_FEATURE, flow); } From 54e00a28bd8e25a23277f11b6ff32b3f41047f01 Mon Sep 17 00:00:00 2001 From: "Vladimir Pal (BeDoIt)" Date: Wed, 14 Mar 2018 22:50:50 +0200 Subject: [PATCH 4/7] fix: memoized resourceMap list selectors --- app/selectors/resources.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/selectors/resources.js b/app/selectors/resources.js index 8d58b3800..ea9568c0f 100644 --- a/app/selectors/resources.js +++ b/app/selectors/resources.js @@ -33,7 +33,7 @@ export const getResourceMappedList = ( resourceName: string, listName: string, ) => { - if (resourceSelectors[resourceName]) { + if (resourceSelectors[`${resourceName}${listName}`]) { return resourceSelectors[`${resourceName}${listName}`]; } resourceSelectors[`${resourceName}${listName}`] = From db85971eaf7e60d3608ba99590d82668c1c5d8f9 Mon Sep 17 00:00:00 2001 From: "Vladimir Pal (BeDoIt)" Date: Thu, 15 Mar 2018 12:24:45 +0200 Subject: [PATCH 5/7] fix: retry on connection refused --- app/containers/AuthForm/EmailStep/EmailStep.jsx | 2 +- app/sagas/issues.js | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/app/containers/AuthForm/EmailStep/EmailStep.jsx b/app/containers/AuthForm/EmailStep/EmailStep.jsx index c8119646a..32c838c64 100644 --- a/app/containers/AuthForm/EmailStep/EmailStep.jsx +++ b/app/containers/AuthForm/EmailStep/EmailStep.jsx @@ -111,7 +111,7 @@ class EmailStep extends Component { { this.usernameInput = el; diff --git a/app/sagas/issues.js b/app/sagas/issues.js index d8cf37214..7a9cacc52 100644 --- a/app/sagas/issues.js +++ b/app/sagas/issues.js @@ -286,7 +286,10 @@ export function* fetchIssues({ resolve(); } } catch (err) { - if (err.code === 'ETIMEDOUT' && !tryCount) { + if ( + ['ETIMEDOUT', 'ECONNREFUSED', 'ESOCKETTIMEDOUT'].includes(err.code) && + !tryCount + ) { yield fork( fetchIssues, { From 13e4418471034d36055532318290ad6f3db614e8 Mon Sep 17 00:00:00 2001 From: Architektor Date: Thu, 15 Mar 2018 13:30:28 +0300 Subject: [PATCH 6/7] chore: bump version to 2.6.0 --- app/package.json | 2 +- package.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/package.json b/app/package.json index dfd719695..43ebb9a7a 100644 --- a/app/package.json +++ b/app/package.json @@ -1,7 +1,7 @@ { "name": "Chronos", "productName": "Chronos", - "version": "2.5.20", + "version": "2.6.0", "description": "Native app for time-tracking fully integrated with JIRA", "main": "./main.prod.js", "scripts": { diff --git a/package.json b/package.json index cbaaefaa4..3a6a141fa 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "Chronos", - "version": "2.5.20", + "version": "2.6.0", "description": "Full functionality time tracking software with direct JIRA integration", "scripts": { "build": "concurrently \"yarn build-main\" \"yarn build-renderer\"", @@ -204,4 +204,4 @@ "path": "node_modules/cz-customizable" } } -} +} \ No newline at end of file From 8553608403c33ba6c7f82e4f1184eadd7b97b5c7 Mon Sep 17 00:00:00 2001 From: Architektor Date: Thu, 15 Mar 2018 13:30:29 +0300 Subject: [PATCH 7/7] chore: update CHANGELOG --- CHANGELOG.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 888630455..3b850dc3e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,27 @@ + +# [2.6.0](https://github.com/web-pal/chronos-timetracker/compare/v2.5.20...v2.6.0) (2018-03-15) + + +### Bug Fixes + +* accoutin deletion on logout ([280ff32](https://github.com/web-pal/chronos-timetracker/commit/280ff32)) +* feature acknowlegement ([1721ffb](https://github.com/web-pal/chronos-timetracker/commit/1721ffb)) +* hide login to exiting account button if no accounts present ([40956d3](https://github.com/web-pal/chronos-timetracker/commit/40956d3)) +* issue form with multiple accounts ([290ef83](https://github.com/web-pal/chronos-timetracker/commit/290ef83)) +* keys warning ([f146205](https://github.com/web-pal/chronos-timetracker/commit/f146205)) +* memoized resourceMap list selectors ([54e00a2](https://github.com/web-pal/chronos-timetracker/commit/54e00a2)) +* recent workogs with just created new issue ([4bcb9d4](https://github.com/web-pal/chronos-timetracker/commit/4bcb9d4)) +* retry on connection refused ([db85971](https://github.com/web-pal/chronos-timetracker/commit/db85971)) + + +### Features + +* **Authorization:** support multiple accounts ([106d30a](https://github.com/web-pal/chronos-timetracker/commit/106d30a)), closes [#71](https://github.com/web-pal/chronos-timetracker/issues/71) +* make account step on login ([9d9ade9](https://github.com/web-pal/chronos-timetracker/commit/9d9ade9)) +* make new feature presentation component ([ff76777](https://github.com/web-pal/chronos-timetracker/commit/ff76777)) + + + ## [2.5.20](https://github.com/web-pal/chronos-timetracker/compare/v2.5.19...v2.5.20) (2018-03-07)