Skip to content

Commit 5ec824c

Browse files
committed
[dashboard, server] Fix duration handling/conversion
Tool: gitpod/catfood.gitpod.cloud
1 parent f0d6f5f commit 5ec824c

File tree

4 files changed

+25
-8
lines changed

4 files changed

+25
-8
lines changed

components/dashboard/src/service/json-rpc-organization-client.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,7 @@ export class JsonRpcOrganizationClient implements PromiseClient<typeof Organizat
273273
...update,
274274
defaultRole: request.defaultRole as OrgMemberRole,
275275
timeoutSettings: {
276-
inactivity: converter.toDurationString(request.timeoutSettings?.inactivity),
276+
inactivity: converter.toDurationStringOpt(request.timeoutSettings?.inactivity),
277277
denyUserTimeouts: request.timeoutSettings?.denyUserTimeouts,
278278
},
279279
roleRestrictions,

components/dashboard/src/teams/TeamPolicies.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ export default function TeamPoliciesPage() {
9797

9898
handleUpdateTeamSettings({
9999
timeoutSettings: {
100-
inactivity: workspaceTimeout ? converter.toDuration(workspaceTimeout) : undefined,
100+
inactivity: converter.toDurationOpt(workspaceTimeout),
101101
denyUserTimeouts: !allowTimeoutChangeByMembers,
102102
},
103103
});
@@ -182,7 +182,7 @@ export default function TeamPoliciesPage() {
182182
!isOwner ||
183183
!isPaidOrDedicated ||
184184
(workspaceTimeout ===
185-
converter.toDurationString(settings?.timeoutSettings?.inactivity) &&
185+
converter.toDurationStringOpt(settings?.timeoutSettings?.inactivity) &&
186186
allowTimeoutChangeByMembers === !settings?.timeoutSettings?.denyUserTimeouts)
187187
}
188188
>

components/dashboard/src/user-settings/Preferences.tsx

+5-3
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ export default function Preferences() {
3939
const [dotfileRepo, setDotfileRepo] = useState<string>(user?.dotfileRepo || "");
4040

4141
const [workspaceTimeout, setWorkspaceTimeout] = useState<string>(
42-
converter.toDurationString(user?.workspaceTimeoutSettings?.inactivity),
42+
converter.toDurationStringOpt(user?.workspaceTimeoutSettings?.inactivity) || "",
4343
);
4444
const [timeoutUpdating, setTimeoutUpdating] = useState(false);
4545
const [creationError, setCreationError] = useState<Error>();
@@ -173,7 +173,7 @@ export default function Preferences() {
173173
<Alert type="warning" className="mb-4">
174174
The currently selected organization does not allow members to set custom workspace timeouts,
175175
so for workspaces created in it, its default timeout of{" "}
176-
{converter.toDurationString(settings?.timeoutSettings?.inactivity)} will be used.
176+
{converter.toDurationStringOpt(settings?.timeoutSettings?.inactivity) || ""} will be used.
177177
</Alert>
178178
)}
179179

@@ -201,7 +201,9 @@ export default function Preferences() {
201201
loading={timeoutUpdating}
202202
disabled={
203203
workspaceTimeout ===
204-
converter.toDurationString(user?.workspaceTimeoutSettings?.inactivity)
204+
(converter.toDurationStringOpt(
205+
user?.workspaceTimeoutSettings?.inactivity,
206+
) || "")
205207
}
206208
>
207209
Save

components/public-api/typescript-common/src/public-api-converter.ts

+17-2
Original file line numberDiff line numberDiff line change
@@ -1612,9 +1612,10 @@ export class PublicAPIConverter {
16121612
* `Duration.nanos` is ignored
16131613
* @returns a string like "1h2m3s", valid time units are `s`, `m`, `h`
16141614
*/
1615-
toDurationString(duration?: PartialMessage<Duration>): string {
1616-
const seconds = duration?.seconds || 0;
1615+
toDurationString(duration: PartialMessage<Duration>): string {
1616+
const seconds = duration.seconds || 0;
16171617
if (seconds === 0) {
1618+
// "" is our "default value" for durations on the server side
16181619
return "";
16191620
}
16201621
const totalMilliseconds = Number(seconds) * 1000;
@@ -1630,6 +1631,13 @@ export class PublicAPIConverter {
16301631
}`;
16311632
}
16321633

1634+
toDurationStringOpt(duration?: PartialMessage<Duration>): string | undefined {
1635+
if (duration === undefined) {
1636+
return undefined;
1637+
}
1638+
return this.toDurationString(duration);
1639+
}
1640+
16331641
toUser(from: UserProtocol): User {
16341642
const {
16351643
id,
@@ -1703,6 +1711,13 @@ export class PublicAPIConverter {
17031711
});
17041712
}
17051713

1714+
toDurationOpt(from: string | undefined): Duration | undefined {
1715+
if (from === undefined) {
1716+
return undefined;
1717+
}
1718+
return this.toDuration(from);
1719+
}
1720+
17061721
toWorkspaceClass(cls: SupportedWorkspaceClass): WorkspaceClass {
17071722
return new WorkspaceClass({
17081723
id: cls.id,

0 commit comments

Comments
 (0)