import { useEffect, useState } from "react"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { Link } from "react-router"; 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 SecretaryPermissionsModal from "../components/SecretaryPermissionsModal"; import Switch from '../components/ui/Switch'; // ── SVG icons (copied verbatim from clinic-pro-tauri) ─────────────────────── const PlusIcon = () => ( ); const EyeIcon = () => ( ); const EditIcon = () => ( ); const ShieldIcon = () => ( ); 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) ───────────────── // ── 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 (