Version 3 of the kit: - Radix UI replaced with Base UI (using the Shadcn UI patterns) - next-intl replaces react-i18next - enhanceAction deprecated; usage moved to next-safe-action - main layout now wrapped with [locale] path segment - Teams only mode - Layout updates - Zod v4 - Next.js 16.2 - Typescript 6 - All other dependencies updated - Removed deprecated Edge CSRF - Dynamic Github Action runner
61 lines
1.3 KiB
TypeScript
61 lines
1.3 KiB
TypeScript
import {
|
|
Select,
|
|
SelectContent,
|
|
SelectItem,
|
|
SelectTrigger,
|
|
SelectValue,
|
|
} from '@kit/ui/select';
|
|
import { Trans } from '@kit/ui/trans';
|
|
|
|
type Role = string;
|
|
|
|
export function MembershipRoleSelector({
|
|
roles,
|
|
value,
|
|
currentUserRole,
|
|
onChange,
|
|
triggerClassName,
|
|
}: {
|
|
roles: Role[];
|
|
value: Role;
|
|
currentUserRole?: Role;
|
|
onChange: (role: Role | null) => unknown;
|
|
triggerClassName?: string;
|
|
}) {
|
|
return (
|
|
<Select value={value} onValueChange={onChange}>
|
|
<SelectTrigger
|
|
className={triggerClassName}
|
|
data-test={'role-selector-trigger'}
|
|
>
|
|
<SelectValue>
|
|
{(value) =>
|
|
value ? (
|
|
<Trans i18nKey={`common.roles.${value}.label`} defaults={value} />
|
|
) : (
|
|
''
|
|
)
|
|
}
|
|
</SelectValue>
|
|
</SelectTrigger>
|
|
|
|
<SelectContent>
|
|
{roles.map((role) => {
|
|
return (
|
|
<SelectItem
|
|
key={role}
|
|
data-test={`role-option-${role}`}
|
|
disabled={currentUserRole === role}
|
|
value={role}
|
|
>
|
|
<span className={'text-sm capitalize'}>
|
|
<Trans i18nKey={`common.roles.${role}.label`} defaults={role} />
|
|
</span>
|
|
</SelectItem>
|
|
);
|
|
})}
|
|
</SelectContent>
|
|
</Select>
|
|
);
|
|
}
|