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.
This commit is contained in:
@@ -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');
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user