Enhance routing and type definitions for training page. Added new training route and updated related components, including navigation links and user data handling. Refactored layout for improved user experience and consistency across site pages.
CI / build (push) Has been skipped
CI / deploy (push) Successful in 1m31s

This commit is contained in:
eewing
2026-03-16 14:05:11 -05:00
parent 60ac4a8f79
commit 59056d3f41
19 changed files with 310 additions and 74 deletions
+109
View File
@@ -0,0 +1,109 @@
import { fail, redirect } from '@sveltejs/kit';
import type { Actions, PageServerLoad } from './$types';
type TrainingVideo = {
id: string;
title: string;
description: string | null;
created: string;
videoUrl: string;
};
const VIDEO_COLLECTION = 'year';
const VIDEO_FIELD = 'Media';
export const load: PageServerLoad = async ({ locals }) => {
const user = locals.user;
let records: any[] = [];
try {
records = await locals.pb.collection(VIDEO_COLLECTION).getFullList({
sort: '-created'
});
} catch (e) {
console.error('Failed to load training videos from PocketBase', e);
records = [];
}
const videos: TrainingVideo[] = records.map((record: any) => {
const fileName = record[VIDEO_FIELD];
const videoUrl = fileName
? locals.pb.files.getUrl(record, fileName)
: '';
return {
id: record.id as string,
title: (record.title as string) ?? 'Untitled video',
description: (record.description as string) ?? null,
created: record.created as string,
videoUrl
};
});
const canUpload = Boolean(user?.training_admin);
return {
videos,
canUpload
};
};
export const actions: Actions = {
upload: async ({ request, locals }) => {
const user = locals.user;
if (!user) {
throw redirect(303, '/login');
}
if (!user.training_admin) {
return fail(403, {
error: 'You do not have permission to upload training videos.'
});
}
const formData = await request.formData();
const title = String(formData.get('title') ?? '').trim();
const description = String(formData.get('description') ?? '').trim();
const file = formData.get('video');
if (!title) {
return fail(400, {
error: 'Title is required.',
values: { title, description }
});
}
if (!(file instanceof File)) {
return fail(400, {
error: 'Please choose a video file to upload.',
values: { title, description }
});
}
const createData = new FormData();
createData.set('title', title);
if (description) {
createData.set('description', description);
}
createData.set(VIDEO_FIELD, file);
try {
await locals.pb.collection(VIDEO_COLLECTION).create(createData);
} catch (e) {
const message =
e && typeof e === 'object' && 'message' in e
? String((e as { message: string }).message)
: 'Could not upload video.';
return fail(500, {
error: message,
values: { title, description }
});
}
throw redirect(303, '/training');
}
};