diff --git a/packages/frontend/src/components/user-select.tsx b/packages/frontend/src/components/user-select.tsx
new file mode 100644
index 0000000..26c9832
--- /dev/null
+++ b/packages/frontend/src/components/user-select.tsx
@@ -0,0 +1,59 @@
+import type { UserRecord } from "@issue/shared";
+import { useState } from "react";
+import SmallUserDisplay from "@/components/small-user-display";
+import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select";
+
+export function UserSelect({
+ users,
+ value,
+ onChange,
+ fallbackUser,
+ placeholder = "Select user",
+}: {
+ users: UserRecord[];
+ value: string;
+ onChange: (value: string) => void;
+ fallbackUser?: UserRecord | null;
+ placeholder?: string;
+}) {
+ const [isOpen, setIsOpen] = useState(false);
+
+ const renderSelectedValue = () => {
+ if (value === "unassigned") {
+ return "Unassigned";
+ }
+
+ const user = users.find((u) => u.id.toString() === value);
+ const className = "p-0 py-2 text-sm";
+
+ if (user) {
+ return ;
+ }
+
+ if (fallbackUser) {
+ return ;
+ }
+
+ return null;
+ };
+
+ return (
+
+ );
+}