import { useEffect, useState } from "react";
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
import { Link } from "react-router-dom";
import { toast } from "sonner";
import SettingsLayout from "../components/layout/SettingsLayout";
import ConfirmDialog from "../components/ui/ConfirmDialog";
import Modal from "../components/ui/Modal";
import type { ApiResponse } from "../lib/api";
import { api } from "../lib/api";
import { formatDate, digitsOnly, IRAN_MOBILE_RE, IRAN_NATIONAL_CODE_RE } from "../lib/utils";
import { useSubscription } from "../hooks/useSubscription";
import { useAuthStore } from "../stores/authStore";
import type { Secretary, SecretaryPermissions } from "../types";
import { usePermissionCatalog, blankPermissions, alignPermissions } from "../hooks/usePermissionCatalog";
import type { CatalogResource } from "../hooks/usePermissionCatalog";
import Switch from '../components/ui/Switch';
// ── SVG icons (copied verbatim from clinic-pro-tauri) ───────────────────────
const PlusIcon = () => (
);
const EyeIcon = () => (
);
const EditIcon = () => (
);
const ChevronDown = ({ open }: { open: boolean }) => (
);
// ── Avatar (first-letter gradient fallback, like tauri) ─────────────────────
function Avatar({ name, size = 32 }: { name?: string; size?: number }) {
const firstLetter = (name?.trim().charAt(0) || "?").toUpperCase();
return (
{firstLetter}
);
}
// ── Permission sections (based on existing clinicpro pages) ─────────────────
function PermissionAccordions({
permissions,
onChange,
disabled,
isClinic,
resources,
}: {
permissions: SecretaryPermissions;
onChange: (section: string, item: string, value: boolean) => void;
disabled?: boolean;
isClinic: boolean;
resources: CatalogResource[];
}) {
const [openKeys, setOpenKeys] = useState>(
new Set(["appointments", "patients"]),
);
const toggleOpen = (key: string) => {
setOpenKeys((prev) => {
const next = new Set(prev);
next.has(key) ? next.delete(key) : next.add(key);
return next;
});
};
// منابع clinic_only (مثل مدیریت پزشکان کلینیک) فقط برای مالکِ کلینیک دیده میشوند.
const sections = resources.filter((r) => !r.clinic_only || isClinic);
return (
مجوزهای دسترسی
{sections.map((section) => {
const open = openKeys.has(section.key);
const sectionPerm = permissions[section.key];
return (
{open && (
{section.actions.map((item) => (
))}
)}
);
})}
);
}
// ── Text field (tauri DefaultTextField look) ────────────────────────────────
function DefaultTextField({
placeholder,
value,
onChange,
disabled,
multiline,
rows,
numeric,
maxDigits,
}: {
placeholder?: string;
value: string;
onChange: (v: string) => void;
disabled?: boolean;
multiline?: boolean;
rows?: number;
/** فیلد فقطعددی: ارقام فارسی/عربی به لاتین تبدیل و غیررقم حذف میشود. */
numeric?: boolean;
maxDigits?: number;
}) {
const cls =
"w-full bg-[var(--bg)] dark:bg-[var(--surface)] rounded-[8px] border border-[var(--border-2)] dark:border-[var(--border)] " +
"text-[var(--text-2)] dark:text-[var(--text)] text-[16px] font-normal px-[12px] py-[12.5px] outline-none " +
"focus:border-[var(--primary)] disabled:opacity-70";
if (multiline) {
return (