Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
gitpod-io
GitHub Repository: gitpod-io/gitpod
Path: blob/main/components/dashboard/src/user-settings/ShowTokenModal.tsx
2500 views
1
/**
2
* Copyright (c) 2022 Gitpod GmbH. All rights reserved.
3
* Licensed under the GNU Affero General Public License (AGPL).
4
* See License.AGPL.txt in the project root for license information.
5
*/
6
7
import { PersonalAccessToken } from "@gitpod/public-api/lib/gitpod/experimental/v1/tokens_pb";
8
import { useMemo, useState } from "react";
9
import DateSelector from "../components/DateSelector";
10
import Modal, { ModalBody, ModalFooter, ModalHeader } from "../components/Modal";
11
import { getTokenExpirationDays, getTokenExpirationDescription } from "./PersonalAccessTokens";
12
import { Button } from "@podkit/buttons/Button";
13
import { useIsDataOps } from "../data/featureflag-query";
14
15
interface TokenModalProps {
16
token: PersonalAccessToken;
17
title: string;
18
description: string;
19
descriptionImportant: string;
20
actionDescription: string;
21
showDateSelector?: boolean;
22
onSave: (data: { expirationDate: Date }) => void;
23
onClose: () => void;
24
}
25
26
function ShowTokenModal(props: TokenModalProps) {
27
const [expiration, setExpiration] = useState({
28
expirationDays: "30 Days",
29
expirationDate: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000),
30
});
31
32
const save = () => {
33
props.onSave({ expirationDate: expiration.expirationDate });
34
props.onClose();
35
};
36
37
const isDataOps = useIsDataOps();
38
const TokenExpirationDays = useMemo(() => getTokenExpirationDays(isDataOps), [isDataOps]);
39
40
return (
41
<Modal visible onClose={props.onClose} onSubmit={save}>
42
<ModalHeader>{props.title}</ModalHeader>
43
<ModalBody>
44
<div className="text-gray-500 dark:text-gray-400 text-md">
45
<span>{props.description}</span> <span className="font-semibold">{props.descriptionImportant}</span>
46
</div>
47
<div className="p-4 mt-2 rounded-xl bg-pk-surface-secondary">
48
<div className="font-semibold text-gray-700 dark:text-gray-200">{props.token.name}</div>
49
<div className="font-medium text-gray-400 dark:text-gray-300">
50
{getTokenExpirationDescription(props.token.expirationTime!.toDate())}
51
</div>
52
</div>
53
<div className="mt-4">
54
{props.showDateSelector && (
55
<DateSelector
56
title="Expiration Date"
57
description={getTokenExpirationDescription(expiration.expirationDate)}
58
options={TokenExpirationDays}
59
value={TokenExpirationDays.find((i) => i.value === expiration.expirationDays)?.value}
60
onChange={(value) => {
61
const date = TokenExpirationDays.find((e) => e.value === value)?.getDate();
62
if (!date) {
63
return;
64
}
65
setExpiration({
66
expirationDays: value,
67
expirationDate: date,
68
});
69
}}
70
/>
71
)}
72
</div>
73
</ModalBody>
74
<ModalFooter>
75
<Button variant="secondary" onClick={props.onClose}>
76
Cancel
77
</Button>
78
<Button type="submit" variant="destructive">
79
{props.actionDescription}
80
</Button>
81
</ModalFooter>
82
</Modal>
83
);
84
}
85
86
export default ShowTokenModal;
87
88