Skip to content

Commit 895fe21

Browse files
committed
unify actions of card and panel, use useLauncherEnvironmentReadiness in SessionLauncherCard, remove unnecessary span
1 parent 63c2b80 commit 895fe21

22 files changed

Lines changed: 651 additions & 713 deletions

client/src/features/ProjectPageV2/utils/useProjectPermissions.hook.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import { skipToken } from "@reduxjs/toolkit/query";
2020
import { useEffect } from "react";
2121

2222
import { DEFAULT_PERMISSIONS } from "../../permissionsV2/permissions.constants";
23-
import type { ProjectPermissions } from "../../permissionsV2/permissions.types";
23+
import type { PermissionsWithLoadingState } from "../../permissionsV2/permissions.types";
2424
import { projectV2Api } from "../../projectsV2/api/projectV2.enhanced-api";
2525

2626
interface UseProjectPermissionsArgs {
@@ -29,7 +29,7 @@ interface UseProjectPermissionsArgs {
2929

3030
export default function useProjectPermissions({
3131
projectId,
32-
}: UseProjectPermissionsArgs): ProjectPermissions {
32+
}: UseProjectPermissionsArgs): PermissionsWithLoadingState {
3333
const { currentData, isLoading, isError, isUninitialized } =
3434
projectV2Api.endpoints.getProjectsByProjectIdPermissions.useQueryState(
3535
projectId ? { projectId } : skipToken,
@@ -43,7 +43,7 @@ export default function useProjectPermissions({
4343
}
4444
}, [fetchPermissions, isUninitialized, projectId]);
4545

46-
const isLoadingPermissions = isLoading || isUninitialized;
46+
const isLoadingPermissions = isLoading || !!(projectId && isUninitialized);
4747

4848
if (isLoading || isError || !currentData) {
4949
return {

client/src/features/permissionsV2/permissions.types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,6 @@ export type Permissions = {
2222
[key in RequestedPermission]: boolean;
2323
};
2424

25-
export type ProjectPermissions = Permissions & {
25+
export type PermissionsWithLoadingState = Permissions & {
2626
isLoadingPermissions: boolean;
2727
};

client/src/features/sessionsV2/SessionList/SessionLauncherCard.tsx

Lines changed: 34 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919
import { skipToken } from "@reduxjs/toolkit/query";
2020
import cx from "classnames";
21-
import { useContext, useMemo } from "react";
21+
import { useMemo } from "react";
2222
import {
2323
CircleFill,
2424
Link45deg,
@@ -30,18 +30,12 @@ import { Card, CardBody, Col, DropdownItem, Row } from "reactstrap";
3030

3131
import SessionEnvironmentGitLabWarningBadge from "~/features/legacy/SessionEnvironmentGitLabWarnBadge";
3232
import { Loader } from "../../../components/Loader";
33-
import AppContext from "../../../utils/context/appContext";
34-
import { DEFAULT_APP_PARAMS } from "../../../utils/context/appParams.constants";
3533
import PermissionsGuard from "../../permissionsV2/PermissionsGuard";
3634
import useProjectPermissions from "../../ProjectPageV2/utils/useProjectPermissions.hook";
3735
import { Project } from "../../projectsV2/api/projectV2.api";
3836
import { computeResourcesApi } from "../api/computeResources.api";
3937
import type { SessionLauncher } from "../api/sessionLaunchersV2.api";
40-
import {
41-
sessionLaunchersV2Api,
42-
useGetEnvironmentsByEnvironmentIdBuildsQuery as useGetBuildsQuery,
43-
} from "../api/sessionLaunchersV2.api";
44-
import { useGetSessionsImagesQuery } from "../api/sessionsV2.api";
38+
import { sessionLaunchersV2Api } from "../api/sessionLaunchersV2.api";
4539
import {
4640
BuildStatusBadge,
4741
BuildStatusDescription,
@@ -58,6 +52,7 @@ import {
5852
getLauncherCategoryDefinitionByLauncher,
5953
} from "../session.utils";
6054
import { SessionV2 } from "../sessionsV2.types";
55+
import useLauncherEnvironmentReadiness from "../useLauncherEnvironmentReadiness.hook";
6156
import SessionCard from "./SessionCard";
6257

6358
import styles from "./Session.module.scss";
@@ -84,34 +79,29 @@ export default function SessionLauncherCard({
8479
toggleSessionView,
8580
toggleShareLink,
8681
}: SessionLauncherCardProps) {
87-
const { params } = useContext(AppContext);
88-
const environment = launcher?.environment;
89-
const imageBuildersEnabled =
90-
params?.IMAGE_BUILDERS_ENABLED ?? DEFAULT_APP_PARAMS.IMAGE_BUILDERS_ENABLED;
91-
const isCodeEnvironment = environment?.environment_image_source === "build";
92-
const isExternalImageEnvironment =
93-
environment?.environment_kind === "CUSTOM" &&
94-
environment?.environment_image_source === "image";
95-
96-
const { data: builds, isLoading } = useGetBuildsQuery(
97-
imageBuildersEnabled && isCodeEnvironment
98-
? { environmentId: environment.id }
99-
: skipToken,
100-
);
82+
const {
83+
builds,
84+
isBuildInProgress,
85+
isCodeEnvironment,
86+
isCustomImageEnvironment,
87+
isGlobalEnvironment,
88+
isLoadingBuilds,
89+
isLoadingContainerImage,
90+
lastBuild,
91+
lastSuccessfulBuild,
92+
useOldImage,
93+
containerImage,
94+
} = useLauncherEnvironmentReadiness({ launcher });
10195

102-
const lastBuild = builds?.at(0);
103-
const lastSuccessfulBuild = builds?.find(
104-
(build) => build.status === "succeeded" && build.id !== lastBuild?.id,
105-
);
10696
const hasSession = !!sessions?.length;
10797
const launcherDefinition =
10898
launcher && getLauncherCategoryDefinitionByLauncher(launcher);
10999
const LauncherTypeIcon = launcherDefinition?.icon || PlayCircle;
110100
const launcherTypeLabel = launcherDefinition?.text.display || null;
111101

112102
sessionLaunchersV2Api.endpoints.getEnvironmentsByEnvironmentIdBuilds.useQuerySubscription(
113-
isCodeEnvironment && lastBuild?.status === "in_progress"
114-
? { environmentId: environment.id }
103+
launcher && isBuildInProgress
104+
? { environmentId: launcher.environment.id }
115105
: skipToken,
116106
{
117107
pollingInterval: 1_000,
@@ -142,13 +132,6 @@ export default function SessionLauncherCard({
142132
"text-muted",
143133
];
144134

145-
const { data: containerImage, isLoading: isLoadingContainerImage } =
146-
useGetSessionsImagesQuery(
147-
environment?.container_image != null
148-
? { imageUrl: environment.container_image }
149-
: skipToken,
150-
);
151-
152135
const { data: resourcePools, isLoading: isLoadingResourcePools } =
153136
computeResourcesApi.endpoints.getResourcePools.useQueryState({});
154137
// Ref: https://github.com/facebook/react/issues/35577
@@ -205,7 +188,7 @@ export default function SessionLauncherCard({
205188
</span>
206189
</Col>
207190
<Col xs={12} xl="auto">
208-
{environment?.environment_kind === "GLOBAL" ? (
191+
{isGlobalEnvironment ? (
209192
<span className={cx(ENVIRONMENT_KIND_CLASSES)}>
210193
<EnvironmentIcon type="global" />
211194
Global environment
@@ -215,7 +198,7 @@ export default function SessionLauncherCard({
215198
<EnvironmentIcon type="codeBased" size={16} />
216199
Code based environment
217200
</span>
218-
) : isExternalImageEnvironment ? (
201+
) : isCustomImageEnvironment ? (
219202
<span className={cx(ENVIRONMENT_KIND_CLASSES)}>
220203
<EnvironmentIcon type="custom" size={16} />
221204
External image environment
@@ -250,7 +233,7 @@ export default function SessionLauncherCard({
250233
<Row className="g-2">
251234
<Col xs={12} xl={4}>
252235
{isCodeEnvironment &&
253-
(isLoading ||
236+
(isLoadingBuilds ||
254237
isLoadingContainerImage ||
255238
isLoadingResourcePools) ? (
256239
<SessionBadge
@@ -328,32 +311,26 @@ export default function SessionLauncherCard({
328311
>
329312
<LauncherActions
330313
placement="launcher-card"
314+
builds={builds}
331315
hasSession={hasSession}
332316
lastBuild={lastBuild}
333317
launcher={launcher}
334318
namespace={project.namespace}
335319
otherActions={otherLauncherActions}
336320
slug={project.slug}
337-
useOldImage={
338-
isCodeEnvironment &&
339-
lastBuild?.status !== "succeeded" &&
340-
!!lastSuccessfulBuild
341-
}
342321
/>
343-
{isCodeEnvironment &&
344-
lastBuild?.status !== "succeeded" &&
345-
lastSuccessfulBuild && (
346-
<BuildStatusDescription
347-
isOldImage={true}
348-
status={lastSuccessfulBuild?.status}
349-
createdAt={lastSuccessfulBuild?.created_at}
350-
completedAt={
351-
lastSuccessfulBuild?.status === "succeeded"
352-
? lastSuccessfulBuild?.result?.completed_at
353-
: undefined
354-
}
355-
/>
356-
)}
322+
{useOldImage && lastSuccessfulBuild && (
323+
<BuildStatusDescription
324+
isOldImage={true}
325+
status={lastSuccessfulBuild?.status}
326+
createdAt={lastSuccessfulBuild?.created_at}
327+
completedAt={
328+
lastSuccessfulBuild?.status === "succeeded"
329+
? lastSuccessfulBuild?.result?.completed_at
330+
: undefined
331+
}
332+
/>
333+
)}
357334
</div>
358335
)}
359336
</Col>

client/src/features/sessionsV2/SessionView/SessionView.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ function SessionCardNotRunning({
185185
contentSession={
186186
<div className="my-auto">
187187
<LauncherActions
188-
placement="launcher-panel"
188+
placement="launcher-side-panel"
189189
hasSession={hasSession}
190190
launcher={launcher}
191191
namespace={project.namespace}

client/src/features/sessionsV2/components/launcherActions/LauncherActions.tsx

Lines changed: 19 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -17,57 +17,43 @@
1717
*/
1818

1919
import { getLauncherCategory } from "~/features/sessionsV2/session.utils";
20-
import JobCardActions from "./job/JobCardActions";
21-
import JobPanelSubmit from "./job/JobPanelSubmit";
22-
import SessionCardActions from "./session/SessionCardActions";
23-
import SessionPanelActions from "./session/SessionPanelActions";
20+
import JobLauncherActions from "./job/JobLauncherActions";
21+
import SessionLauncherActions from "./session/SessionLauncherActions";
2422
import type { LauncherActionsProps } from "./types";
2523

2624
export function LauncherActions({
2725
placement,
26+
builds,
2827
hasSession,
2928
lastBuild,
3029
launcher,
3130
namespace,
3231
otherActions,
3332
slug,
34-
useOldImage,
3533
}: LauncherActionsProps) {
3634
const category = getLauncherCategory(launcher);
37-
38-
if (placement === "launcher-card") {
39-
return category === "session" ? (
40-
<SessionCardActions
41-
hasSession={hasSession}
42-
lastBuild={lastBuild}
43-
launcher={launcher}
44-
namespace={namespace}
45-
otherActions={otherActions}
46-
slug={slug}
47-
useOldImage={useOldImage}
48-
/>
49-
) : (
50-
<JobCardActions
51-
hasSession={hasSession}
52-
lastBuild={lastBuild}
53-
launcher={launcher}
54-
namespace={namespace}
55-
otherActions={otherActions}
56-
slug={slug}
57-
useOldImage={useOldImage}
58-
/>
59-
);
60-
}
61-
6235
return category === "session" ? (
63-
<SessionPanelActions
36+
<SessionLauncherActions
37+
builds={builds}
6438
hasSession={hasSession}
39+
lastBuild={lastBuild}
6540
launcher={launcher}
6641
namespace={namespace}
42+
otherActions={placement === "launcher-card" && otherActions}
6743
slug={slug}
68-
useOldImage={useOldImage}
44+
displayBuildActions={placement === "launcher-card"}
45+
alwaysShowLaunchAction={placement === "launcher-side-panel"}
6946
/>
7047
) : (
71-
<JobPanelSubmit launcher={launcher} useOldImage={useOldImage} />
48+
<JobLauncherActions
49+
builds={builds}
50+
hasSession={hasSession}
51+
lastBuild={lastBuild}
52+
launcher={launcher}
53+
namespace={namespace}
54+
otherActions={placement === "launcher-card" && otherActions}
55+
slug={slug}
56+
displayBuildActions={placement === "launcher-card"}
57+
/>
7258
);
7359
}

0 commit comments

Comments
 (0)