fix: faulty domains code + errorboundary

This commit is contained in:
diced
2025-08-18 12:38:44 -07:00
parent 9cfb01cd88
commit 471a060df2
8 changed files with 36 additions and 6 deletions

View File

@@ -1,4 +1,6 @@
import { Container, Paper, Stack, Text, Title } from '@mantine/core';
import { useRouteError } from 'react-router-dom';
import FourOhFour from '../pages/404';
export default function GenericError({
title,
@@ -9,6 +11,10 @@ export default function GenericError({
message?: string;
details?: Record<string, any>;
}) {
const routeError: any = useRouteError();
if (routeError?.status === 404) return <FourOhFour />;
return (
<Container my='lg'>
<Stack gap='xs'>
@@ -18,7 +24,7 @@ export default function GenericError({
</Text>
{details && (
<Paper withBorder px={3} py={3}>
<pre style={{ margin: 0 }}>{JSON.stringify(details, null, 2)}</pre>
<pre style={{ margin: 0 }}>{JSON.stringify({ routeError, details }, null, 2)}</pre>
</Paper>
)}
</Stack>

View File

@@ -1,3 +1,4 @@
import { useRouteError } from 'react-router-dom';
import GenericError from './GenericError';
export default function RootErrorBoundary(props: Record<string, any>) {

View File

@@ -3,14 +3,15 @@ import UploadFile from '@/components/pages/upload/File';
import { type Response } from '@/lib/api/response';
import { SafeConfig } from '@/lib/config/safe';
import { Anchor, Center, Container, Text } from '@mantine/core';
import { Link, Params, useLoaderData } from 'react-router-dom';
import { data, Link, Params, useLoaderData } from 'react-router-dom';
import useSWR from 'swr';
export async function loader({ params }: { params: Params<string> }) {
const res = await fetch(`/api/server/folder/${params.id}?upload=true`);
if (!res.ok) {
throw new Response('Folder not found', { status: 404 });
throw data('Folder not found', { status: 404 });
}
return {
folder: (await res.json()) as Response['/api/server/folder/[id]'],
};

View File

@@ -35,6 +35,15 @@ import { Link } from 'react-router-dom';
import useSWR from 'swr';
import { useShallow } from 'zustand/shallow';
type SettingsDomains = { settings?: { domains?: string[] }; domains?: string[] };
function checkDomains(domains?: unknown): string[] {
if (!domains) return [];
if (!Array.isArray(domains)) return [];
return domains;
}
export default function UploadOptionsButton({ folder, numFiles }: { folder?: string; numFiles: number }) {
const config = useConfig();
@@ -61,12 +70,17 @@ export default function UploadOptionsButton({ folder, numFiles }: { folder?: str
const { data: folders } = useSWR<Extract<Response['/api/user/folders'], Folder[]>>(
'/api/user/folders?noincl=true',
);
const { data: settingsData } = useSWR<Response['/api/server/settings']>('/api/server/settings');
const { data: settingsData } = useSWR<SettingsDomains>(
folder ? '/api/server/public' : '/api/server/settings',
);
const combobox = useCombobox();
const [folderSearch, setFolderSearch] = useState('');
const domains = Array.isArray(settingsData?.settings.domains) ? settingsData.settings.domains : [];
const domains = folder
? checkDomains(settingsData?.domains)
: checkDomains(settingsData?.settings?.domains);
const domainOptions = [
{ value: '', label: 'Default Domain' },
...domains.map((domain) => ({

View File

@@ -51,7 +51,6 @@ export const DATABASE_TO_PROP = {
invitesEnabled: 'invites.enabled',
invitesLength: 'invites.length',
domains: 'domains',
websiteTitle: 'website.title',
websiteTitleLogo: 'website.titleLogo',
@@ -61,6 +60,8 @@ export const DATABASE_TO_PROP = {
websiteDefaultAvatar: 'website.defaultAvatar',
websiteTos: 'website.tos',
domains: 'domains',
websiteThemeDefault: 'website.theme.default',
websiteThemeDark: 'website.theme.dark',
websiteThemeLight: 'website.theme.light',

View File

@@ -75,6 +75,8 @@ export const ENVS = [
env('features.versionChecking', 'FEATURES_VERSION_CHECKING', 'boolean', true),
env('features.versionAPI', 'FEATURES_VERSION_API', 'string', true),
env('domains', 'DOMAINS', 'string[]', true),
env('invites.enabled', 'INVITES_ENABLED', 'boolean', true),
env('invites.length', 'INVITES_LENGTH', 'number', true),

View File

@@ -164,6 +164,7 @@ export const schema = z.object({
versionChecking: z.boolean().default(true),
versionAPI: z.string().url().default('https://zipline-version.diced.sh/'),
}),
domains: z.array(z.string()).default([]),
invites: z.object({
enabled: z.boolean().default(true),
length: z.number().default(8),

View File

@@ -33,9 +33,11 @@ export type ApiServerPublicResponse = {
tos?: string | null;
files: {
maxFileSize: string;
defaultFormat: Config['files']['defaultFormat'];
};
chunks: Config['chunks'];
firstSetup: boolean;
domains?: string[];
};
const logger = log('api').c('server').c('public');
@@ -69,9 +71,11 @@ export default fastifyPlugin(
},
files: {
maxFileSize: config.files.maxFileSize,
defaultFormat: config.files.defaultFormat,
},
chunks: config.chunks,
firstSetup: zipline.firstSetup,
domains: config.domains,
};
if (config.website.tos) {