fix(config): phase 7 follow-up — fix remaining /ims/ occurrences in sw.js, notifications, components
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -27,7 +27,7 @@ export function SiteZoneManager({ sites }: Props) {
|
||||
const post = async (payload: Record<string, unknown>) => {
|
||||
setBusy(true)
|
||||
setError(null)
|
||||
const res = await fetch('/ims/api/admin/sites', {
|
||||
const res = await fetch('/api/admin/sites', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify(payload),
|
||||
@@ -46,7 +46,7 @@ export function SiteZoneManager({ sites }: Props) {
|
||||
const id = payload.id as string
|
||||
setBusyId(id)
|
||||
setError(null)
|
||||
const res = await fetch('/ims/api/admin/sites', {
|
||||
const res = await fetch('/api/admin/sites', {
|
||||
method,
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify(payload),
|
||||
|
||||
@@ -28,7 +28,7 @@ export function TruckManager({ trucks }: Props) {
|
||||
setSubmitting(true)
|
||||
setError(null)
|
||||
try {
|
||||
const res = await fetch('/ims/api/admin/trucks', {
|
||||
const res = await fetch('/api/admin/trucks', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ truck_no: no, carrier: carrier.trim() || null }),
|
||||
@@ -53,7 +53,7 @@ export function TruckManager({ trucks }: Props) {
|
||||
setBusyId(id)
|
||||
setError(null)
|
||||
try {
|
||||
const res = await fetch('/ims/api/admin/trucks', {
|
||||
const res = await fetch('/api/admin/trucks', {
|
||||
method,
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify(payload),
|
||||
|
||||
@@ -34,7 +34,7 @@ export function UserManager({ users, sites }: Props) {
|
||||
const patchUser = async (id: string, update: Record<string, unknown>) => {
|
||||
setBusyId(id)
|
||||
setError(null)
|
||||
const res = await fetch('/ims/api/admin/users', {
|
||||
const res = await fetch('/api/admin/users', {
|
||||
method: 'PATCH',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ id, ...update }),
|
||||
@@ -66,7 +66,7 @@ export function UserManager({ users, sites }: Props) {
|
||||
e.preventDefault()
|
||||
setSubmitting(true)
|
||||
setError(null)
|
||||
const res = await fetch('/ims/api/admin/users', {
|
||||
const res = await fetch('/api/admin/users', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({
|
||||
|
||||
@@ -26,7 +26,7 @@ export function CapaForm({ incidentId }: Props) {
|
||||
const [error, setError] = useState<string | null>(null)
|
||||
|
||||
useEffect(() => {
|
||||
fetch('/ims/api/users')
|
||||
fetch('/api/users')
|
||||
.then(r => r.json())
|
||||
.then(data => { if (Array.isArray(data)) setUsers(data) })
|
||||
.catch(() => {})
|
||||
@@ -46,7 +46,7 @@ export function CapaForm({ incidentId }: Props) {
|
||||
}
|
||||
setSaving(true)
|
||||
setError(null)
|
||||
const res = await fetch('/ims/api/capa', {
|
||||
const res = await fetch('/api/capa', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({
|
||||
|
||||
@@ -26,7 +26,7 @@ export function RiskFlagsPanel() {
|
||||
setLoading(true)
|
||||
setError(null)
|
||||
try {
|
||||
const res = await fetch('/ims/api/dashboard/ai/risk-flags', { method: 'POST' })
|
||||
const res = await fetch('/api/dashboard/ai/risk-flags', { method: 'POST' })
|
||||
if (!res.ok) {
|
||||
const data = await res.json().catch(() => ({}))
|
||||
setError(data.error ?? 'Analysis failed')
|
||||
|
||||
@@ -30,7 +30,7 @@ export function OfflineSync() {
|
||||
if (report.type_details) fd.append('type_details', JSON.stringify(report.type_details))
|
||||
|
||||
try {
|
||||
const res = await fetch('/ims/api/incidents', { method: 'POST', body: fd })
|
||||
const res = await fetch('/api/incidents', { method: 'POST', body: fd })
|
||||
if (res.ok && report.id != null) {
|
||||
await removePendingReport(report.id)
|
||||
}
|
||||
|
||||
@@ -134,7 +134,7 @@ export function ReportForm({ zoneToken, trucks, initialTruckId }: Props) {
|
||||
|
||||
if (!overrideQuality) {
|
||||
try {
|
||||
const qcRes = await fetch('/ims/api/incidents/ai/quality-check', {
|
||||
const qcRes = await fetch('/api/incidents/ai/quality-check', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({
|
||||
@@ -176,7 +176,7 @@ export function ReportForm({ zoneToken, trucks, initialTruckId }: Props) {
|
||||
if (form.truck_id) fd.append('truck_id', form.truck_id)
|
||||
files.forEach(f => fd.append('files', f))
|
||||
|
||||
const res = await fetch('/ims/api/incidents', { method: 'POST', body: fd })
|
||||
const res = await fetch('/api/incidents', { method: 'POST', body: fd })
|
||||
|
||||
// Parse JSON separately so a non-JSON response (HTML error page) surfaces the status code
|
||||
let data: Record<string, unknown> = {}
|
||||
|
||||
@@ -20,7 +20,7 @@ export function NotificationBell() {
|
||||
const panelRef = useRef<HTMLDivElement>(null)
|
||||
|
||||
const load = useCallback(() => {
|
||||
fetch('/ims/api/notifications')
|
||||
fetch('/api/notifications')
|
||||
.then(r => (r.ok ? r.json() : Promise.reject()))
|
||||
.then((data: { notifications: Notification[]; unread: number }) => {
|
||||
setNotifications(data.notifications)
|
||||
@@ -45,7 +45,7 @@ export function NotificationBell() {
|
||||
}, [open])
|
||||
|
||||
const markAllRead = () => {
|
||||
fetch('/ims/api/notifications', {
|
||||
fetch('/api/notifications', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ all: true }),
|
||||
|
||||
@@ -25,7 +25,7 @@ export function ApiKeyForm({ settings }: Props) {
|
||||
setSaving(s => ({ ...s, [key]: true }))
|
||||
setResults(r => ({ ...r, [key]: undefined as never }))
|
||||
try {
|
||||
const res = await fetch('/ims/api/settings', {
|
||||
const res = await fetch('/api/settings', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ key, value: values[key] }),
|
||||
|
||||
@@ -79,7 +79,7 @@ export async function escalateOverdueCapa(): Promise<{ notified: number }> {
|
||||
if (!ownerEmail) continue
|
||||
|
||||
const incidentRef = capa.incidentRef ?? capa.incidentId
|
||||
const capaUrl = `${siteUrl}/ims/hse/capa/${capa.id}`
|
||||
const capaUrl = `${siteUrl}/hse/capa/${capa.id}`
|
||||
const subject = THRESHOLD_SUBJECT[threshold]
|
||||
const html = `
|
||||
<p>Hi ${ownerName},</p>
|
||||
|
||||
@@ -85,7 +85,7 @@ export async function sendEffectivenessRecheckNotifications(): Promise<{ notifie
|
||||
const incidentRef = capa.incidentRef ?? capa.incidentId
|
||||
const roundLabel = getRoundLabel(round)
|
||||
const capaDesc = capa.description
|
||||
const capaUrl = `${siteUrl}/ims/hse/capa/${capa.id}`
|
||||
const capaUrl = `${siteUrl}/hse/capa/${capa.id}`
|
||||
|
||||
const subject = `[IMS] ${roundLabel} effectiveness check — ${incidentRef}`
|
||||
const html = `
|
||||
|
||||
+4
-4
@@ -16,20 +16,20 @@ self.addEventListener('activate', event => {
|
||||
self.addEventListener('fetch', event => {
|
||||
const url = new URL(event.request.url)
|
||||
|
||||
// Only handle same-origin GET requests under /ims/
|
||||
// Only handle same-origin GET requests
|
||||
if (
|
||||
event.request.method !== 'GET' ||
|
||||
url.origin !== self.location.origin ||
|
||||
!url.pathname.startsWith('/ims/')
|
||||
!url.pathname.startsWith('/')
|
||||
) {
|
||||
return
|
||||
}
|
||||
|
||||
// Skip API routes — always go to network
|
||||
if (url.pathname.startsWith('/ims/api/')) return
|
||||
if (url.pathname.startsWith('/api/')) return
|
||||
|
||||
// Cache-first for immutable Next.js static assets
|
||||
if (url.pathname.startsWith('/ims/_next/static/')) {
|
||||
if (url.pathname.startsWith('/_next/static/')) {
|
||||
event.respondWith(
|
||||
caches.match(event.request).then(cached => {
|
||||
if (cached) return cached
|
||||
|
||||
Reference in New Issue
Block a user