Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
18 changes: 10 additions & 8 deletions web-server/pages/api/resources/orgs/[org_id]/teams/index.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,16 @@
import { groupBy, prop } from 'ramda';
import * as yup from 'yup';

import {
getAllTeamsReposProdBranchesForOrg,
transformTeamRepoBranchesToMap
} from '@/api/internal/team/[team_id]/repo_branches';
import { getTeamRepos } from '@/api/resources/team_repos';
import { Endpoint } from '@/api-helpers/global';
import { getTeamMembersFilterSettingForOrg } from '@/api-helpers/team';
import { getMiniUsersByOrgId } from '@/api-helpers/user';
import { getTeamV2Mock } from '@/mocks/teams';
import { FetchTeamsResponse } from '@/types/resources';
import { db } from '@/utils/db';
import groupBy from '@/utils/objectArray';

const getSchema = yup.object().shape({
user_id: yup.string().uuid().nullable().optional(),
include_teams: yup.array().of(yup.string().uuid()).nullable().optional()
Expand Down Expand Up @@ -54,9 +53,9 @@ export const getOrgTeams = async (
{} as Record<ID, boolean>
);

const [users_map, teamsReposProductionBranchDetails] = await Promise.all([
getMiniUsersByOrgId(org_id).then(groupBy),
getAllTeamsReposProdBranchesForOrg(org_id)
const [teamsReposProductionBranchDetails, repos] = await Promise.all([
getAllTeamsReposProdBranchesForOrg(org_id),
Promise.all(teamRows.map((team) => getTeamRepos(team.id)))
]);

const teamManagers = {} as Record<ID, any>;
Expand All @@ -74,12 +73,15 @@ export const getOrgTeams = async (
t.manager_id === user_id ||
t.member_ids.includes(user_id)
);

const teamReposProdBranchMap = transformTeamRepoBranchesToMap(
teamsReposProductionBranchDetails
);

return { teams, users: users_map, teamReposProdBranchMap };
return {
teams,
teamReposProdBranchMap,
teamReposMap: groupBy(prop('team_id'), repos.flat())
};
};

export default endpoint.serve();
2 changes: 1 addition & 1 deletion web-server/pages/api/resources/orgs/[org_id]/teams/v2.ts
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ endpoint.handle.PATCH(patchSchema, async (req, res) => {
return res.send(getTeamV2Mock);
}

const { org_id, id, name, org_repos, provider } = req.payload;
const { id, name, org_repos, provider } = req.payload;
const orgReposList: ReqRepoWithProvider[] = [];
forEachObjIndexed((repos, org) => {
repos.forEach((repo) => {
Expand Down
28 changes: 27 additions & 1 deletion web-server/pages/welcome.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { Button, Card, Box, styled, Container } from '@mui/material';
import Head from 'next/head';
import { useRouter } from 'next/router';
import { ReactNode } from 'react';

import background from '@/assets/background.png';
Expand All @@ -12,6 +13,10 @@ import { FlexBox } from '@/components/FlexBox';
import { Logo } from '@/components/Logo/Logo';
import { Line } from '@/components/Text';
import { ROUTES } from '@/constants/routes';
import { useAuth } from '@/hooks/useAuth';
import { updateOnboardingState } from '@/slices/auth';
import { useDispatch } from '@/store';
import { OnboardingStep } from '@/types/resources';

function Page() {
return (
Expand Down Expand Up @@ -60,6 +65,10 @@ const containerStyles = {
};

const OnboardingContent = () => {
const dispatch = useDispatch();
const router = useRouter();
const { onboardingState, orgId } = useAuth();

return (
<Content>
<MainContent>
Expand Down Expand Up @@ -111,7 +120,24 @@ const OnboardingContent = () => {
</FlexBox>
))}
</FlexBox>
<Button href={ROUTES.INTEGRATIONS.PATH} variant="contained">
<Button
variant="contained"
onClick={() => {
dispatch(
updateOnboardingState({
org_id: orgId,
onboardingState: Array.from(
new Set([
...onboardingState,
OnboardingStep.WELCOME_SCREEN
])
)
})
).then(() => {
router.push(ROUTES.INTEGRATIONS.PATH);
});
}}
>
Continue
</Button>
</FlexBox>
Expand Down
11 changes: 2 additions & 9 deletions web-server/src/components/TeamSelector/useTeamSelectorSetup.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import { useAuth } from '@/hooks/useAuth';
import { useAxios } from '@/hooks/useAxios';
import { useStateTeamConfig } from '@/hooks/useStateTeamConfig';
import { appSlice } from '@/slices/app';
import { resourcesSlice } from '@/slices/resources';
import { teamSlice } from '@/slices/team';
import { useSelector } from '@/store';
import { Team } from '@/types/api/teams';
Expand Down Expand Up @@ -65,6 +64,7 @@ export const useTeamSelectorSetup = ({ mode }: UseTeamSelectorSetupArgs) => {
const updateUsers = useCallback(
(res: AxiosResponse<FetchTeamsResponse>) => {
dispatch(teamSlice.actions.setTeams(res.data.teams));
dispatch(teamSlice.actions.setTeamReposMaps(res.data.teamReposMap));
dispatch(
appSlice.actions.setTeamProdBranchMap(res.data.teamReposProdBranchMap)
);
Expand Down Expand Up @@ -102,19 +102,12 @@ export const useTeamSelectorSetup = ({ mode }: UseTeamSelectorSetupArgs) => {
onSuccess: updateUsers
});

useEffect(() => {
dispatch(resourcesSlice.actions.updateFetchState({ users: fetch_state }));
}, [dispatch, fetch_state]);

const apiTeams = useMemo(
() => payload?.teams || ([] as Team[]),
[payload?.teams]
);

const usersMap = useMemo(
() => payload?.users || ([] as unknown as FetchTeamsResponse['users']),
[payload?.users]
);
const usersMap = {};

useEffect(() => {
if (!orgId) return;
Expand Down
27 changes: 0 additions & 27 deletions web-server/src/hooks/useStateTeamConfig.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import {
startOfWeek
} from 'date-fns';
import { daysInWeek } from 'date-fns/constants';
import { ascend, compose, partition, prop, sort, toLower } from 'ramda';
import { useCallback, useMemo } from 'react';

import { DateRange, DateRangeMap } from '@/components/DateRangePicker';
Expand Down Expand Up @@ -168,32 +167,6 @@ export const useStateBranchConfig = () => {
return branchNames;
};

export const useStateSingleTeamMembers = (includeManager: boolean = false) => {
const { team } = useSingleTeamConfig();

const usersMap = useSelector((s) => s.resources.users);

return useMemo(() => {
const ids = [
...(team?.member_ids || []),
includeManager ? team?.manager_id : null
].filter(Boolean);

let users = ids
.filter((id) => Boolean(usersMap[id]))
.map((id) => ({
...usersMap[id],
isManager: id === team?.manager_id
}));

users = sort(ascend(compose(toLower, prop('name'))), users) as typeof users;

const [mgr, others] = partition((user) => user.isManager, users);

return [...mgr, ...others].filter(Boolean);
}, [includeManager, team?.manager_id, team?.member_ids, usersMap]);
};

export const useCurrentDateRangeReactNode = () => {
const { start, end, partiallyUnselected } = useStateDateConfig();
return !partiallyUnselected ? (
Expand Down
29 changes: 29 additions & 0 deletions web-server/src/slices/auth.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { PayloadAction, createAsyncThunk } from '@reduxjs/toolkit';

import { handleApi } from '@/api-helpers/axios-api-instance';
import { FetchState } from '@/constants/ui-states';
import { OnboardingStep } from '@/types/resources';
import { addFetchCasesToReducer } from '@/utils/redux';

export interface State {
Expand Down Expand Up @@ -46,6 +47,19 @@ export const authSlice = createSlice({
state.org = action.payload;
}
);
addFetchCasesToReducer(
builder,
updateOnboardingState,
'org',
(
state,
action: PayloadAction<{ onboarding_state: OnboardingStep[] }>
) => {
if (state.org) {
state.org.onboarding_state = action.payload.onboarding_state;
}
}
);
}
});

Expand All @@ -56,3 +70,18 @@ export const fetchCurrentOrg = createAsyncThunk(
return session.org;
}
);

export const updateOnboardingState = createAsyncThunk(
'auth/updateOnboardingState',
async (params: { org_id: ID; onboardingState: OnboardingStep[] }) => {
return handleApi<{ onboarding_state: OnboardingStep[] }>(
`/resources/orgs/${params.org_id}/onboarding`,
{
method: 'PUT',
data: {
onboarding_state: params.onboardingState
}
}
);
}
);
42 changes: 0 additions & 42 deletions web-server/src/slices/resources.ts

This file was deleted.

2 changes: 0 additions & 2 deletions web-server/src/store/rootReducer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,11 @@ import { doraMetricsSlice } from '@/slices/dora_metrics';
import { loadLinkSlice } from '@/slices/loadLink';
import { orgSlice } from '@/slices/org';
import { reposSlice } from '@/slices/repos';
import { resourcesSlice } from '@/slices/resources';
import { teamSlice } from '@/slices/team';

export const rootReducer = combineReducers({
app: appSlice.reducer,
auth: authSlice.reducer,
resources: resourcesSlice.reducer,
actions: actionsSlice.reducer,
team: teamSlice.reducer,
repos: reposSlice.reducer,
Expand Down
3 changes: 2 additions & 1 deletion web-server/src/types/resources.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { ReactChild, ReactFragment, ReactPortal } from 'react';

import { Row } from '@/constants/db';
import { CIProvider, Integration } from '@/constants/integrations';
import { DB_OrgRepo } from '@/types/api/org_repo';
import { Team } from '@/types/api/teams';

export type DeepPartial<T> = {
Expand Down Expand Up @@ -611,8 +612,8 @@ export enum TeamSettings {

export type FetchTeamsResponse = {
teams: Team[];
users: Record<ID, BaseUser>;
teamReposProdBranchMap: Record<ID, TeamRepoBranchDetails[]>;
teamReposMap: Record<ID, DB_OrgRepo[]>;
};

export type FetchTeamSettingsAPIResponse<T extends {} = {}> = {
Expand Down