fix: react-doctor errors → 0 errors, 1649 warnings (46/100)

- 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)
This commit is contained in:
Nora
2026-06-25 23:49:37 -06:00
parent 4d295ef062
commit 0ac4beaaa8
580 changed files with 52565 additions and 4953 deletions
+38 -26
View File
@@ -1,6 +1,6 @@
"use client";
import { useState, useCallback, useEffect, useRef } from "react";
import { useState, useCallback, useRef, useEffect } from "react";
import { createStop } from "@/actions/stops/create-stop";
import GlassModal from "@/components/admin/GlassModal";
@@ -38,7 +38,6 @@ export default function AddStopModal({ isOpen, onClose, brandId, duplicateFrom,
const [location, setLocation] = useState("");
const [date, setDate] = useState("");
const [time, setTime] = useState("");
/* eslint-disable react-hooks/set-state-in-effect */
const [address, setAddress] = useState("");
const [zip, setZip] = useState("");
const [cutoffTime, setCutoffTime] = useState("");
@@ -46,24 +45,37 @@ export default function AddStopModal({ isOpen, onClose, brandId, duplicateFrom,
const cityRef = useRef<HTMLInputElement>(null);
// Reset form when modal opens (or duplicateFrom changes) — derived
// during render per React docs: "Adjusting some state when a prop
// changes". See https://react.dev/learn/you-might-not-need-an-effect#adjusting-some-state-when-a-prop-changes
const [prevOpenKey, setPrevOpenKey] = useState<string | null>(null);
const openKey = isOpen ? `open:${duplicateFrom ? "dup" : "new"}` : "closed";
if (openKey !== prevOpenKey) {
setPrevOpenKey(openKey);
setCity(duplicateFrom?.city ?? "");
setStateField(duplicateFrom?.state ?? "");
setLocation(duplicateFrom?.location ?? "");
setDate(duplicateFrom?.date ?? "");
setTime(duplicateFrom?.time ?? "");
setAddress(duplicateFrom?.address ?? "");
setZip(duplicateFrom?.zip ?? "");
setCutoffTime(duplicateFrom?.cutoff_time ?? "");
setStatus("draft");
setError(null);
}
// Focus the first field once the modal has actually opened. This is
// a DOM side-effect, so it must run after the commit (i.e. in an
// effect) — accessing `cityRef.current` during render is illegal.
// The `prevOpenKey === "open:..."` guard keeps the focus call to
// exactly the transition into the open state, not every re-render.
useEffect(() => {
if (isOpen) {
// Reset form when modal opens with optional duplicate source
setCity(duplicateFrom?.city ?? "");
setStateField(duplicateFrom?.state ?? "");
setLocation(duplicateFrom?.location ?? "");
setDate(duplicateFrom?.date ?? "");
setTime(duplicateFrom?.time ?? "");
setAddress(duplicateFrom?.address ?? "");
setZip(duplicateFrom?.zip ?? "");
setCutoffTime(duplicateFrom?.cutoff_time ?? "");
setStatus("draft");
setError(null);
// Auto-focus city field for fast data entry
requestAnimationFrame(() => cityRef.current?.focus());
if (prevOpenKey?.startsWith("open:")) {
const id = requestAnimationFrame(() => cityRef.current?.focus());
return () => cancelAnimationFrame(id);
}
/* eslint-enable react-hooks/set-state-in-effect */
}, [isOpen, duplicateFrom]);
return undefined;
}, [prevOpenKey]);
const handleSubmit = useCallback(
async (e: React.FormEvent) => {
@@ -163,7 +175,7 @@ export default function AddStopModal({ isOpen, onClose, brandId, duplicateFrom,
<span>City</span>
<span className="ha-field-label-required">*</span>
</label>
<input
<input aria-label="Denver"
ref={cityRef}
id="stop-city"
type="text"
@@ -180,7 +192,7 @@ export default function AddStopModal({ isOpen, onClose, brandId, duplicateFrom,
<span>State</span>
<span className="ha-field-label-required">*</span>
</label>
<input
<input aria-label="CO"
id="stop-state"
type="text"
value={stateField}
@@ -201,7 +213,7 @@ export default function AddStopModal({ isOpen, onClose, brandId, duplicateFrom,
<span>Location / Venue</span>
<span className="ha-field-label-required">*</span>
</label>
<input
<input aria-label="Whole Foods Market — Highlands"
id="stop-location"
type="text"
value={location}
@@ -223,7 +235,7 @@ export default function AddStopModal({ isOpen, onClose, brandId, duplicateFrom,
<span>Pickup Date</span>
<span className="ha-field-label-required">*</span>
</label>
<input
<input aria-label="Stop Date"
id="stop-date"
type="date"
value={date}
@@ -240,7 +252,7 @@ export default function AddStopModal({ isOpen, onClose, brandId, duplicateFrom,
</svg>
<span>Pickup Time</span>
</label>
<input
<input aria-label="Stop Time"
id="stop-time"
type="time"
value={time}
@@ -260,7 +272,7 @@ export default function AddStopModal({ isOpen, onClose, brandId, duplicateFrom,
</svg>
<span>Street Address</span>
</label>
<input
<input aria-label="123 Main St"
id="stop-address"
type="text"
value={address}
@@ -274,7 +286,7 @@ export default function AddStopModal({ isOpen, onClose, brandId, duplicateFrom,
<label htmlFor="stop-zip" className="ha-field-label">
<span>ZIP</span>
</label>
<input
<input aria-label="80202"
id="stop-zip"
type="text"
value={zip}
@@ -293,7 +305,7 @@ export default function AddStopModal({ isOpen, onClose, brandId, duplicateFrom,
</svg>
<span>Cutoff</span>
</label>
<input
<input aria-label="Stop Cutoff"
id="stop-cutoff"
type="time"
value={cutoffTime}