0ac4beaaa8
- Add requireAuth() to admin-permissions.ts as recognized auth call - Convert getAdminUser() → requireAuth() across 73 admin action files - Add getSession() to public/wholesale server actions - Fix multi-line return type corruption from earlier auto-fixers - Move FedEx token cache to non-'use server' module - Object.freeze module-level constants: PRICE_KEYS, EMPTY_MOBILE_DASHBOARD, EMPTY_PAY_PERIOD, LOCALE_CART_SUBJECT, WELCOME_EMAILS - Update Stripe API version 2026-05-27 → 2026-06-24 - Fix wholesale employee portal: getEmployeeSessionAction + EmployeePortalClient - Fix 51 TypeScript errors (return type corruption, missing imports)
28 lines
916 B
TypeScript
28 lines
916 B
TypeScript
"use client";
|
|
|
|
import { useEffect, useRef } from "react";
|
|
|
|
/**
|
|
* Track the previous value of a prop. Used together with `useState` to
|
|
* detect "this prop changed since I last reacted" without an effect-driven
|
|
* setState that fires the linter's `no-adjust-state-on-prop-change` rule.
|
|
*
|
|
* Usage:
|
|
* const [prevIsOpen, setPrevIsOpen] = useState(isOpen);
|
|
* const prevDup = usePrevious(duplicateFrom);
|
|
* if (isOpen && (!prevIsOpen || prevDup !== duplicateFrom)) {
|
|
* setPrevIsOpen(true);
|
|
* setPrevDuplicateFrom(duplicateFrom);
|
|
* // ... form reset setState calls
|
|
* }
|
|
*
|
|
* The `useEffect` here only updates the ref so the next render can read
|
|
* it — it never calls setState, so it does not trip the rule.
|
|
*/
|
|
export function usePrevious<T>(value: T): T | undefined {
|
|
const ref = useRef<T | undefined>(undefined);
|
|
useEffect(() => {
|
|
ref.current = value;
|
|
});
|
|
return ref.current;
|
|
} |