|
1 | 1 | import { DeveloperService } from "../spicedb-common/services/developerservice"; |
2 | | -import Button from "@material-ui/core/Button"; |
3 | | -import { Theme, createStyles, makeStyles } from "@material-ui/core/styles"; |
4 | | -import { alpha } from "@material-ui/core/styles/colorManipulator"; |
5 | | -import CheckCircleIcon from "@material-ui/icons/CheckCircle"; |
6 | | -import CheckCircleOutlineIcon from "@material-ui/icons/CheckCircleOutline"; |
7 | | -import ErrorIcon from "@material-ui/icons/Error"; |
8 | | -import PlayCircleFilledIcon from "@material-ui/icons/PlayCircleFilled"; |
9 | | -import clsx from "clsx"; |
10 | | -import "react-reflex/styles.css"; |
| 2 | +import { Button } from "./ui/button"; |
11 | 3 | import { DataStore } from "../services/datastore"; |
12 | 4 | import { ValidationState, ValidationStatus } from "../services/validation"; |
13 | | -import { TourElementClass } from "./GuidedTour"; |
| 5 | +import { CheckCircle, CircleX, CirclePlay } from "lucide-react"; |
14 | 6 |
|
15 | | -const useStyles = makeStyles((theme: Theme) => |
16 | | - createStyles({ |
17 | | - gcm: { |
18 | | - color: "green", |
19 | | - display: "inherit", |
20 | | - }, |
21 | | - rem: { |
22 | | - color: "red", |
23 | | - display: "inherit", |
24 | | - }, |
25 | | - gray: { |
26 | | - color: "gray", |
27 | | - display: "inherit", |
28 | | - }, |
29 | | - lastRun: { |
30 | | - display: "grid", |
31 | | - gridTemplateColumns: "auto 150px", |
32 | | - alignItems: "center", |
33 | | - columnGap: theme.spacing(1), |
34 | | - backgroundColor: "rgba(255, 255, 255, 0.05)", |
35 | | - height: "100%", |
36 | | - padding: "4px", |
37 | | - paddingLeft: "8px", |
38 | | - }, |
39 | | - validated: { |
40 | | - backgroundColor: alpha(theme.palette.success.light, 0.2), |
41 | | - }, |
42 | | - validationError: { |
43 | | - backgroundColor: alpha(theme.palette.error.light, 0.2), |
44 | | - }, |
45 | | - validationDisplay: { |
46 | | - display: "grid", |
47 | | - gridTemplateColumns: "auto auto", |
48 | | - alignItems: "center", |
49 | | - columnGap: theme.spacing(1), |
50 | | - }, |
51 | | - }), |
52 | | -); |
53 | | - |
54 | | -export function ValidateButton(props: { |
| 7 | +export function ValidateButton({ |
| 8 | + conductValidation, |
| 9 | + datastore, |
| 10 | + validationState, |
| 11 | + developerService, |
| 12 | +}: { |
55 | 13 | conductValidation: () => void; |
56 | 14 | datastore: DataStore; |
57 | 15 | validationState: ValidationState; |
58 | 16 | developerService: DeveloperService; |
59 | 17 | }) { |
60 | 18 | const validated = |
61 | | - props.validationState.status === ValidationStatus.VALIDATED || |
62 | | - props.validationState.status === ValidationStatus.VALIDATION_ERROR; |
| 19 | + validationState.status === ValidationStatus.VALIDATED || |
| 20 | + validationState.status === ValidationStatus.VALIDATION_ERROR; |
63 | 21 | const upToDate = |
64 | 22 | validated && |
65 | | - props.validationState.validationDatastoreIndex === |
66 | | - props.datastore.currentIndex(); |
67 | | - |
68 | | - const classes = useStyles(); |
| 23 | + validationState.validationDatastoreIndex === datastore.currentIndex(); |
69 | 24 |
|
70 | 25 | return ( |
71 | | - <div className={classes.validationDisplay}> |
72 | | - <div |
73 | | - className={clsx(classes.lastRun, { |
74 | | - [classes.validated]: |
75 | | - upToDate && |
76 | | - props.validationState.status === ValidationStatus.VALIDATED, |
77 | | - [classes.validationError]: |
78 | | - upToDate && |
79 | | - props.validationState.status === ValidationStatus.VALIDATION_ERROR, |
80 | | - })} |
81 | | - > |
| 26 | + <div className="flex flex-row bg-transparent justify-between"> |
| 27 | + <div className="flex flex-row px-3 mr-2 w-48 items-center bg-zinc-700 rounded-xs"> |
82 | 28 | <ValidationIcon |
83 | | - datastore={props.datastore} |
84 | | - validationState={props.validationState} |
| 29 | + datastore={datastore} |
| 30 | + validationState={validationState} |
| 31 | + className="pr-2" |
85 | 32 | /> |
86 | 33 | {upToDate && |
87 | | - props.validationState.status === ValidationStatus.VALIDATED && |
| 34 | + validationState.status === ValidationStatus.VALIDATED && |
88 | 35 | "Validated!"} |
89 | 36 | {upToDate && |
90 | | - props.validationState.status === ValidationStatus.VALIDATION_ERROR && |
| 37 | + validationState.status === ValidationStatus.VALIDATION_ERROR && |
91 | 38 | "Failed to Validate"} |
92 | | - {props.validationState.status === ValidationStatus.CALL_ERROR && |
| 39 | + {validationState.status === ValidationStatus.CALL_ERROR && |
93 | 40 | "Dev service loading"} |
94 | | - {props.validationState.status !== ValidationStatus.CALL_ERROR && |
| 41 | + {validationState.status !== ValidationStatus.CALL_ERROR && |
95 | 42 | !upToDate && |
96 | 43 | "Validation not run"} |
97 | 44 | </div> |
98 | 45 | <Button |
99 | | - variant="contained" |
100 | | - startIcon={<PlayCircleFilledIcon />} |
101 | | - className={TourElementClass.run} |
102 | 46 | disabled={ |
103 | | - props.developerService.state.status !== "ready" || |
104 | | - props.validationState.status === ValidationStatus.RUNNING |
| 47 | + developerService.state.status !== "ready" || |
| 48 | + validationState.status === ValidationStatus.RUNNING |
105 | 49 | } |
106 | | - onClick={props.conductValidation} |
| 50 | + onClick={conductValidation} |
| 51 | + variant="outline" |
107 | 52 | > |
| 53 | + <CirclePlay /> |
108 | 54 | Run |
109 | 55 | </Button> |
110 | 56 | </div> |
111 | 57 | ); |
112 | 58 | } |
113 | 59 |
|
114 | | -export function ValidationIcon(props: { |
115 | | - small?: boolean; |
| 60 | +export function ValidationIcon({ |
| 61 | + datastore, |
| 62 | + validationState, |
| 63 | + className, |
| 64 | +}: { |
116 | 65 | datastore: DataStore; |
117 | 66 | validationState: ValidationState; |
| 67 | + className: string; |
118 | 68 | }) { |
119 | | - const classes = useStyles(); |
120 | 69 | if ( |
121 | | - props.validationState.status === ValidationStatus.VALIDATED && |
122 | | - props.datastore.currentIndex() === |
123 | | - props.validationState.validationDatastoreIndex |
| 70 | + validationState.status === ValidationStatus.VALIDATED && |
| 71 | + datastore.currentIndex() === validationState.validationDatastoreIndex |
124 | 72 | ) { |
125 | | - return ( |
126 | | - <span className={classes.gcm}> |
127 | | - <CheckCircleIcon /> |
128 | | - </span> |
129 | | - ); |
| 73 | + return <CheckCircle className={className} fill="green" />; |
130 | 74 | } |
131 | 75 |
|
132 | 76 | if ( |
133 | | - props.validationState.status === ValidationStatus.VALIDATION_ERROR && |
134 | | - props.datastore.currentIndex() === |
135 | | - props.validationState.validationDatastoreIndex |
| 77 | + validationState.status === ValidationStatus.VALIDATION_ERROR && |
| 78 | + datastore.currentIndex() === validationState.validationDatastoreIndex |
136 | 79 | ) { |
137 | | - return ( |
138 | | - <span className={classes.rem}> |
139 | | - <ErrorIcon /> |
140 | | - </span> |
141 | | - ); |
| 80 | + return <CircleX className={className} fill="red" />; |
142 | 81 | } |
143 | 82 |
|
144 | | - return ( |
145 | | - <span className={classes.gray}> |
146 | | - <CheckCircleOutlineIcon /> |
147 | | - </span> |
148 | | - ); |
| 83 | + return <CheckCircle className={className} />; |
149 | 84 | } |
0 commit comments