Skip to content

Commit

Permalink
feat: auto setting active linked enterprise
Browse files Browse the repository at this point in the history
  • Loading branch information
alex-sheehan-edx committed Jan 9, 2024
1 parent c67c5e4 commit 66066a3
Show file tree
Hide file tree
Showing 4 changed files with 83 additions and 0 deletions.
8 changes: 8 additions & 0 deletions src/components/EnterpriseApp/EnterpriseAppContextProvider.jsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
import React, { createContext, useMemo } from 'react';
import PropTypes from 'prop-types';
import { getAuthenticatedUser } from '@edx/frontend-platform/auth';

import { EnterpriseSubsidiesContext, useEnterpriseSubsidiesContext } from '../EnterpriseSubsidiesContext';
import { SubsidyRequestsContext, useSubsidyRequestsContext } from '../subsidy-requests/SubsidyRequestsContext';
import {
useEnterpriseCurationContext,
useUpdateActiveEnterpriseForUser,
} from './data/hooks';
import EnterpriseAppSkeleton from './EnterpriseAppSkeleton';

Expand Down Expand Up @@ -68,10 +70,16 @@ const EnterpriseAppContextProvider = ({
curationTitleForCreation: enterpriseName,
});

const { isLoading: isUpdatingActiveEnterprise } = useUpdateActiveEnterpriseForUser({
enterpriseId,
user: getAuthenticatedUser(),
});

const isLoading = (
subsidyRequestsContext.isLoading
|| enterpriseSubsidiesContext.isLoading
|| enterpriseCurationContext.isLoading
|| isUpdatingActiveEnterprise
);

// [tech debt] consolidate the other context values (e.g., useSubsidyRequestsContext)
Expand Down
1 change: 1 addition & 0 deletions src/components/EnterpriseApp/data/hooks/index.js
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
export { default as useEnterpriseCuration } from './useEnterpriseCuration';
export { default as useEnterpriseCurationContext } from './useEnterpriseCurationContext';
export { default as useUpdateActiveEnterpriseForUser } from './useUpdateActiveEnterpriseForUser';
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import { useState, useEffect, useCallback } from 'react';
import { logError } from '@edx/frontend-platform/logging';

import LmsApiService from '../../../../data/services/LmsApiService';

const useUpdateActiveEnterpriseForUser = ({
enterpriseId,
user,
}) => {
const [isLoading, setIsLoading] = useState(false);

const updateActiveEnterpriseAndRefreshJWT = useCallback(async () => {
setIsLoading(true);
try {
await LmsApiService.updateUserActiveEnterprise(enterpriseId);
await LmsApiService.loginRefresh();
} catch (error) {
logError(error);
} finally {
setIsLoading(false);
}
}, [enterpriseId]);

useEffect(() => {
if (!(enterpriseId && user)) {
return;
}

const { roles } = user;
// The first learner role corresponds to the currently active enterprise for the user
const activeLearnerRole = roles.find(role => role.split(':')[0] === 'enterprise_learner');

if (activeLearnerRole) {
const currentActiveEnterpriseId = activeLearnerRole.split(':')[1];
if (currentActiveEnterpriseId !== '*' && currentActiveEnterpriseId !== enterpriseId) {
updateActiveEnterpriseAndRefreshJWT();
}
}
}, [enterpriseId, user, updateActiveEnterpriseAndRefreshJWT]);
return {
isLoading,
};
};

export default useUpdateActiveEnterpriseForUser;
29 changes: 29 additions & 0 deletions src/data/services/LmsApiService.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth';
import { camelCaseObject } from '@edx/frontend-platform/utils';
import Cookies from 'universal-cookie';

import { configuration } from '../../config';
import generateFormattedStatusUrl from './apiServiceUtils';
Expand Down Expand Up @@ -384,6 +385,34 @@ class LmsApiService {
const url = `${LmsApiService.baseUrl}/enterprise/api/v1/analytics-summary/${enterpriseUUID}`;
return LmsApiService.apiClient().post(url, formData);
}

static updateUserActiveEnterprise = (enterpriseId) => {
const url = `${configuration.LMS_BASE_URL}/enterprise/select/active`;
const formData = new FormData();
formData.append('enterprise', enterpriseId);

return LmsApiService.apiClient().post(
url,
formData,
);
};

static loginRefresh = async () => {
const loginRefreshUrl = `${configuration.LMS_BASE_URL}/login_refresh`;

try {
return LmsApiService.apiClient().post(loginRefreshUrl);
} catch (error) {
const isUserUnauthenticated = error.response?.status === 401;
if (isUserUnauthenticated) {
// Clean up the cookie if it exists to eliminate any situation
// where the cookie is not expired but the jwt is expired.
const cookies = new Cookies();
cookies.remove(configuration.ACCESS_TOKEN_COOKIE_NAME);
}
return Promise.resolve();
}
};
}

export default LmsApiService;

0 comments on commit 66066a3

Please sign in to comment.