import type { LoaderFunction } from '@remix-run/node'; import { json } from '@remix-run/node'; import React, { useEffect, useState } from 'react'; import { requireAdmin } from '~/lib/auth.server'; import { settingsService } from '~/lib/settings.server'; export const loader: LoaderFunction = async ({ request }) => { await requireAdmin(request); await settingsService.init?.(); const entries: any[] = []; // @ts-ignore for (const key of (settingsService as any).cache.keys()) { entries.push({ key, value: await settingsService.get(key) }); } return json({ entries }); }; export default function SettingsPage() { const [items, setItems] = useState>([]); useEffect(() => { fetch('/api/admin/settings') .then(r => r.json()) .then(j => setItems(j)); }, []); async function save(key: string, value: any) { await fetch(`/api/admin/settings/${encodeURIComponent(key)}`, { method: 'PUT', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ value }), }); setItems(s => s.map(i => (i.key === key ? { ...i, value } : i))); } return (

Settings