Files
AgentHub/client/src/components/users/PasswordRules.tsx
T
nntrivi2001 750d74a2af chore: v2.8.15 — Oh My Pi login sharing, omp --allow-home, Markdown Preview default, first-login password
- omp-share.js: an admin's switch (S3) runs omp's own auth broker + gateway as
  the host on loopback; a member's omp pane reaches it as a scoped client keyed
  by its pane token (clients file = live omp panes only), runs on
  --model agenthub/<model>, never holds a credential.
- omp catalog: --allow-home, so a workspace at the account's home keeps its
  sessions there (they were recorded under a temp dir and dropped).
- Settings → Appearance → Open Markdown as: Preview (default) or Raw, for
  Files/Changes, the config viewer and a chat's file panel.
- First-login password change and password rules, avatar URLs, Artifacts
  "Mine" includes installed shared skills/plugins, a member's own hook pages.
2026-10-22 10:04:30 +07:00

40 lines
1.4 KiB
TypeScript

/**
* @file PasswordRules.tsx
* @description The checklist under a "new password" field the account picks
* for itself (Settings → Account, the first-login password change, an admin's
* own password on the Users page): each rule of `lib/passwordRules.ts`, ticked
* as the password typed passes it.
* @author Nguyễn Ngọc Trí Vĩ <vinnt@smartgift.vn>
*/
import { useTranslation } from "react-i18next";
import { Check, Circle } from "lucide-react";
import { PASSWORD_MIN_LENGTH, PASSWORD_RULES, passwordProblems } from "../../lib/passwordRules";
export function PasswordRules({ password, username }: { password: string; username?: string }) {
const { t } = useTranslation("users");
const failed = new Set(passwordProblems(password, username));
return (
<ul className="grid gap-x-4 gap-y-1 text-xs sm:grid-cols-2" data-testid="password-rules">
{PASSWORD_RULES.map((rule) => {
const ok = password.length > 0 && !failed.has(rule);
return (
<li
key={rule}
className={`flex items-center gap-1.5 ${ok ? "text-status-success" : "text-fg-muted"}`}
data-rule={rule}
data-ok={ok}
>
{ok ? (
<Check className="h-3.5 w-3.5 flex-shrink-0" />
) : (
<Circle className="h-3 w-3 flex-shrink-0" />
)}
{t(`passwordRules.${rule}`, { min: PASSWORD_MIN_LENGTH })}
</li>
);
})}
</ul>
);
}