diff --git a/web/src/app/submissions/[submissionId]/_reviewButtons.tsx b/web/src/app/submissions/[submissionId]/_reviewButtons.tsx
index e3cc4b9..5a10850 100644
--- a/web/src/app/submissions/[submissionId]/_reviewButtons.tsx
+++ b/web/src/app/submissions/[submissionId]/_reviewButtons.tsx
@@ -1,3 +1,5 @@
+import { Roles } from "@/app/ts/Roles";
+import { SubmissionStatus } from "@/app/ts/Submission";
 import { Button, ButtonOwnProps } from "@mui/material";
 import { useState, useEffect } from "react";
 
@@ -60,8 +62,8 @@ export default function ReviewButtons(props: ReviewId) {
 	// Upload         | MapAdmin  | Validated
 	// ResetUploading | MapAdmin  | Uploading
 	const { submissionId } = props;
-	const [roles, setRoles] = useState<string[]>([]);
-	const [status, setStatus] = useState<string | null>(null);
+	const [roles, setRoles] = useState<Roles>(Roles.Empty);
+	const [status, setStatus] = useState<SubmissionStatus>(SubmissionStatus.UnderConstruction);
 	const [loading, setLoading] = useState(true);
 
 	useEffect(() => {
@@ -93,36 +95,37 @@ export default function ReviewButtons(props: ReviewId) {
 
 	const visibleButtons: ReviewButton[] = [];
 
-	if (roles.includes("Submitter")) {
-		if (["UnderConstruction", "ChangesRequested"].includes(status!)) {
+	const is_submitter = false; // TODO: MY_USER === submission.Submitter
+	if (is_submitter) {
+		if ([SubmissionStatus.UnderConstruction, SubmissionStatus.ChangesRequested].includes(status!)) {
 			visibleButtons.push({ name: "Submit", action: "submit", color: "info", submissionId });
 		}
-		if (["Submitted", "ChangesRequested"].includes(status!)) {
+		if ([SubmissionStatus.Submitted, SubmissionStatus.ChangesRequested].includes(status!)) {
 			visibleButtons.push({ name: "Revoke", action: "revoke", color: "info", submissionId });
 		}
 	}
 
-	if (roles.includes("Reviewer")) {
-		if (status === "Submitted") {
+	if (roles&Roles.SubmissionReview) {
+		if (status === SubmissionStatus.Submitted) {
 			visibleButtons.push({ name: "Accept", action: "trigger-validate", color: "info", submissionId });
 			visibleButtons.push({ name: "Reject", action: "reject", color: "error", submissionId });
 		}
-		if (status === "Accepted") {
+		if (status === SubmissionStatus.Accepted) {
 			visibleButtons.push({ name: "Validate", action: "retry-validate", color: "info", submissionId });
 		}
-		if (status === "Validating") {
+		if (status === SubmissionStatus.Validating) {
 			visibleButtons.push({ name: "Reset Validating (fix softlocked status)", action: "reset-validating", color: "error", submissionId });
 		}
-		if (["Validated", "Accepted", "Submitted"].includes(status!)) {
+		if ([SubmissionStatus.Validated, SubmissionStatus.Accepted, SubmissionStatus.Submitted].includes(status!)) {
 			visibleButtons.push({ name: "Request Changes", action: "request-changes", color: "error", submissionId });
 		}
 	}
 
-	if (roles.includes("MapAdmin")) {
-		if (status === "Validated") {
+	if (roles&Roles.SubmissionUpload) {
+		if (status === SubmissionStatus.Validated) {
 			visibleButtons.push({ name: "Upload", action: "trigger-upload", color: "info", submissionId });
 		}
-		if (status === "Uploading") {
+		if (status === SubmissionStatus.Uploading) {
 			visibleButtons.push({ name: "Reset Uploading (fix softlocked status)", action: "reset-uploading", color: "error", submissionId });
 		}
 	}
diff --git a/web/src/app/ts/Roles.ts b/web/src/app/ts/Roles.ts
new file mode 100644
index 0000000..af94e36
--- /dev/null
+++ b/web/src/app/ts/Roles.ts
@@ -0,0 +1,15 @@
+// Submissions roles bitflag
+enum Roles {
+  SubmissionUpload = 1 << 6,
+  SubmissionReview = 1 << 5,
+  SubmissionRelease = 1 << 4,
+  ScriptWrite = 1 << 3,
+  MapfixUpload = 1 << 2,
+  MapfixReview = 1 << 1,
+  MapDownload = 1 << 0,
+  Empty = 0
+}
+
+export {
+	Roles,
+}