import GlobalLoading from './GlobalLoading';
import { fetchCurrentUser } from '../../store/users/actions';
import { fetchLanguages, fetchAppState } from '../../store/rootActions';
+import { fetchMyOrganizations } from '../../apps/account/organizations/actions';
interface Props {
children: JSX.Element;
fetchAppState: () => Promise<any>;
fetchCurrentUser: () => Promise<void>;
fetchLanguages: () => Promise<void>;
+ fetchMyOrganizations: () => Promise<void>;
}
interface State {
this.props
.fetchCurrentUser()
.then(() => Promise.all([this.fetchAppState(), this.props.fetchLanguages()]))
- .then(this.finishLoading, () => {});
+ .then(
+ ([appState]) => {
+ if (this.mounted) {
+ if (appState.organizationsEnabled) {
+ this.props.fetchMyOrganizations();
+ }
+ this.setState({ loading: false });
+ }
+ },
+ () => {}
+ );
}
componentWillUnmount() {
fetchAppState = () => {
return this.props.fetchAppState().then(appState => {
if (this.mounted) {
- const onSonarCloud =
- appState.settings !== undefined &&
- appState.settings['sonar.sonarcloud.enabled'] === 'true';
this.setState({
branchesEnabled: appState.branchesEnabled,
canAdmin: appState.canAdmin,
- onSonarCloud
+ onSonarCloud:
+ appState.settings !== undefined &&
+ appState.settings['sonar.sonarcloud.enabled'] === 'true'
});
}
+ return appState;
});
};
- finishLoading = () => {
- if (this.mounted) {
- this.setState({ loading: false });
- }
- };
-
render() {
if (this.state.loading) {
return <GlobalLoading />;
}
}
-export default connect(null, { fetchAppState, fetchCurrentUser, fetchLanguages })(App as any);
+export default connect(null, {
+ fetchAppState,
+ fetchCurrentUser,
+ fetchLanguages,
+ fetchMyOrganizations
+})(App as any);
interface Props {
appState: { organizationsEnabled: boolean };
currentUser: CurrentUser;
- fetchMyOrganizations: () => Promise<void>;
organizations: Organization[];
}
};
openDropdown = () => {
- this.fetchMyOrganizations().then(() => {
- window.addEventListener('click', this.handleClickOutside, true);
- this.setState({ open: true });
- });
+ window.addEventListener('click', this.handleClickOutside, true);
+ this.setState({ open: true });
};
closeDropdown = () => {
this.setState({ open: false });
};
- fetchMyOrganizations = () => {
- if (this.props.appState.organizationsEnabled) {
- return this.props.fetchMyOrganizations();
- }
- return Promise.resolve();
- };
-
renderAuthenticated() {
const { organizations } = this.props;
const currentUser = this.props.currentUser as LoggedInUser;
<OrganizationAvatar organization={organization} small={true} />
<span className="spacer-left">{organization.name}</span>
</div>
- {organization.canAdmin && (
+ {organization.isAdmin && (
<span className="outline-badge spacer-left">{translate('admin')}</span>
)}
</OrganizationLink>
import { connect } from 'react-redux';
import GlobalNavUser from './GlobalNavUser';
import { Organization } from '../../../types';
-import { fetchMyOrganizations } from '../../../../apps/account/organizations/actions';
import { getMyOrganizations } from '../../../../store/rootReducer';
interface StateProps {
organizations: getMyOrganizations(state)
});
-interface DispatchProps {
- fetchMyOrganizations: () => Promise<void>;
-}
-
-const mapDispatchToProps = {
- fetchMyOrganizations: fetchMyOrganizations as any
-} as DispatchProps;
-
-export default connect(mapStateToProps, mapDispatchToProps)(GlobalNavUser);
+export default connect(mapStateToProps)(GlobalNavUser);
it('should render the right interface for anonymous user', () => {
const currentUser = { isLoggedIn: false };
const wrapper = shallow(
- <GlobalNavUser
- appState={appState}
- currentUser={currentUser}
- fetchMyOrganizations={jest.fn()}
- organizations={[]}
- />
+ <GlobalNavUser appState={appState} currentUser={currentUser} organizations={[]} />
);
expect(wrapper).toMatchSnapshot();
});
it('should render the right interface for logged in user', () => {
const wrapper = shallow(
- <GlobalNavUser
- appState={appState}
- currentUser={currentUser}
- fetchMyOrganizations={jest.fn()}
- organizations={[]}
- />
+ <GlobalNavUser appState={appState} currentUser={currentUser} organizations={[]} />
);
wrapper.setState({ open: true });
expect(wrapper).toMatchSnapshot();
});
-it('should render the users organizations', () => {
+it('should render user organizations', () => {
const wrapper = shallow(
- <GlobalNavUser
- appState={appState}
- currentUser={currentUser}
- fetchMyOrganizations={jest.fn()}
- organizations={organizations}
- />
+ <GlobalNavUser appState={appState} currentUser={currentUser} organizations={organizations} />
);
wrapper.setState({ open: true });
expect(wrapper).toMatchSnapshot();
});
-it('should not render the users organizations when they are not activated', () => {
+it('should not render user organizations when they are not activated', () => {
const wrapper = shallow(
<GlobalNavUser
appState={{ organizationsEnabled: false }}
currentUser={currentUser}
- fetchMyOrganizations={jest.fn()}
organizations={organizations}
/>
);
wrapper.setState({ open: true });
expect(wrapper).toMatchSnapshot();
});
-
-it('should update the component correctly when the user changes to anonymous', () => {
- const fetchMyOrganizations = jest.fn();
- const wrapper = shallow(
- <GlobalNavUser
- appState={appState}
- currentUser={currentUser}
- fetchMyOrganizations={fetchMyOrganizations}
- organizations={[]}
- />
- );
- wrapper.setState({ open: true });
- expect(wrapper).toMatchSnapshot();
- wrapper.setProps({ currentUser: { isLoggedIn: false } });
- expect(fetchMyOrganizations.mock.calls.length).toBe(0);
- expect(wrapper).toMatchSnapshot();
-});
-
-it('should lazyload the organizations when opening the dropdown', () => {
- const fetchMyOrganizations = jest.fn(() => Promise.resolve());
- const wrapper = shallow(
- <GlobalNavUser
- appState={appState}
- currentUser={currentUser}
- fetchMyOrganizations={fetchMyOrganizations}
- organizations={organizations}
- />
- );
- expect(fetchMyOrganizations.mock.calls.length).toBe(0);
- (wrapper.instance() as GlobalNavUser).openDropdown();
- expect(fetchMyOrganizations.mock.calls.length).toBe(1);
- (wrapper.instance() as GlobalNavUser).openDropdown();
- expect(fetchMyOrganizations.mock.calls.length).toBe(2);
-});
-
-it('should update the organizations when the user changes', () => {
- const fetchMyOrganizations = jest.fn(() => Promise.resolve());
- const wrapper = shallow(
- <GlobalNavUser
- appState={appState}
- currentUser={currentUser}
- fetchMyOrganizations={fetchMyOrganizations}
- organizations={organizations}
- />
- );
- (wrapper.instance() as GlobalNavUser).openDropdown();
- expect(fetchMyOrganizations.mock.calls.length).toBe(1);
- wrapper.setProps({
- currentUser: { isLoggedIn: true, name: 'test', email: 'test@sonarsource.com' }
- });
- (wrapper.instance() as GlobalNavUser).openDropdown();
- expect(fetchMyOrganizations.mock.calls.length).toBe(2);
-});
// Jest Snapshot v1, https://goo.gl/fbAQLP
-exports[`should not render the users organizations when they are not activated 1`] = `
+exports[`should not render user organizations when they are not activated 1`] = `
<li
className="dropdown js-user-authenticated open"
>
</li>
`;
-exports[`should render the users organizations 1`] = `
+exports[`should render user organizations 1`] = `
<li
className="dropdown js-user-authenticated open"
>
</ul>
</li>
`;
-
-exports[`should update the component correctly when the user changes to anonymous 1`] = `
-<li
- className="dropdown js-user-authenticated open"
->
- <a
- className="dropdown-toggle navbar-avatar"
- href="#"
- onClick={[Function]}
- >
- <Connect(Avatar)
- hash="abcd1234"
- name="foo"
- size={32}
- />
- </a>
- <ul
- className="dropdown-menu dropdown-menu-right"
- >
- <li
- className="dropdown-item"
- >
- <div
- className="text-ellipsis text-muted"
- title="foo"
- >
- <strong>
- foo
- </strong>
- </div>
- <div
- className="little-spacer-top text-ellipsis text-muted"
- title="foo@bar.baz"
- >
- foo@bar.baz
- </div>
- </li>
- <li
- className="divider"
- />
- <li>
- <Link
- onClick={[Function]}
- onlyActiveOnIndex={false}
- style={Object {}}
- to="/account"
- >
- my_account.page
- </Link>
- </li>
- <li>
- <a
- href="#"
- onClick={[Function]}
- >
- layout.logout
- </a>
- </li>
- </ul>
-</li>
-`;
-
-exports[`should update the component correctly when the user changes to anonymous 2`] = `
-<li>
- <a
- className="navbar-login"
- href="#"
- onClick={[Function]}
- >
- layout.login
- </a>
-</li>
-`;
canProvisionProjects?: boolean;
canUpdateProjectsVisibilityToPrivate?: boolean;
description?: string;
+ isAdmin?: boolean;
isDefault?: boolean;
key: string;
name: string;
import OrganizationsList from './OrganizationsList';
import CreateOrganizationForm from './CreateOrganizationForm';
import { translate } from '../../../helpers/l10n';
-import { fetchIfAnyoneCanCreateOrganizations, fetchMyOrganizations } from './actions';
+import { fetchIfAnyoneCanCreateOrganizations } from './actions';
import { getAppState, getMyOrganizations, getGlobalSettingValue } from '../../../store/rootReducer';
import { Organization } from '../../../app/types';
interface DispatchProps {
fetchIfAnyoneCanCreateOrganizations: () => Promise<void>;
- fetchMyOrganizations: () => Promise<void>;
}
interface Props extends StateProps, DispatchProps {}
componentDidMount() {
this.mounted = true;
- Promise.all([
- this.props.fetchMyOrganizations(),
- this.props.fetchIfAnyoneCanCreateOrganizations()
- ]).then(this.stopLoading, this.stopLoading);
+ this.props.fetchIfAnyoneCanCreateOrganizations().then(this.stopLoading, this.stopLoading);
}
componentWillUnmount() {
});
const mapDispatchToProps = {
- fetchMyOrganizations: fetchMyOrganizations as any,
fetchIfAnyoneCanCreateOrganizations: fetchIfAnyoneCanCreateOrganizations as any
} as DispatchProps;