implemented a comprehensive client-side demo mode triggered by a "demo@" username prefix, serving curated fixture data for all app modules
This commit is contained in:
@@ -0,0 +1,155 @@
|
||||
import '../../marianumcloud/webdav/queries/list_files/cacheable_file.dart';
|
||||
import '../../marianumcloud/webdav/queries/list_files/list_files_response.dart';
|
||||
|
||||
/// Curated WebDAV listings for the demo mode. Everything is built on
|
||||
/// [CacheableFile] (the app-level model the file UI renders) so no `nextcloud`
|
||||
/// DAV objects need to be faked and no network is ever touched.
|
||||
///
|
||||
/// `hasPreview`/`fileId` are left null on purpose: without them the file list
|
||||
/// won't try to fetch server-side thumbnails for the fixtures.
|
||||
class DemoFiles {
|
||||
const DemoFiles._();
|
||||
|
||||
/// Returns the listing for [path] as passed to `FilesDataProvider.listFiles`
|
||||
/// (`/` or empty for the root, otherwise the joined folder display names).
|
||||
/// Unknown folders resolve to an empty listing rather than an error.
|
||||
static ListFilesResponse listing(String path) {
|
||||
final key = path.replaceAll('/', '').trim();
|
||||
switch (key) {
|
||||
case '':
|
||||
return _root();
|
||||
case 'Hausaufgaben':
|
||||
return _hausaufgaben();
|
||||
case 'Arbeitsblätter':
|
||||
return _arbeitsblaetter();
|
||||
case 'Klausuren':
|
||||
return _klausuren();
|
||||
case 'Schuljahr 2025-26':
|
||||
return _schuljahr();
|
||||
default:
|
||||
return ListFilesResponse({});
|
||||
}
|
||||
}
|
||||
|
||||
static ListFilesResponse _root() => ListFilesResponse({
|
||||
_folder('Hausaufgaben', daysAgo: 1),
|
||||
_folder('Arbeitsblätter', daysAgo: 3),
|
||||
_folder('Klausuren', daysAgo: 12),
|
||||
_folder('Schuljahr 2025-26', daysAgo: 30),
|
||||
_file('Deutsch Lektüre.pdf', size: 2_480_000, daysAgo: 2),
|
||||
_file('Mathe Formelsammlung.pdf', size: 890_000, daysAgo: 9),
|
||||
_file('Bio Referat.pptx', size: 5_120_000, daysAgo: 5),
|
||||
_file('Stundenplan.pdf', size: 145_000, daysAgo: 14),
|
||||
});
|
||||
|
||||
static ListFilesResponse _hausaufgaben() => ListFilesResponse({
|
||||
_file(
|
||||
'Deutsch Aufsatz.docx',
|
||||
parent: 'Hausaufgaben',
|
||||
size: 42_000,
|
||||
daysAgo: 1,
|
||||
),
|
||||
_file(
|
||||
'Mathe Übungen KW28.pdf',
|
||||
parent: 'Hausaufgaben',
|
||||
size: 310_000,
|
||||
daysAgo: 2,
|
||||
),
|
||||
_file(
|
||||
'Englisch Vokabeln.pdf',
|
||||
parent: 'Hausaufgaben',
|
||||
size: 96_000,
|
||||
daysAgo: 4,
|
||||
),
|
||||
});
|
||||
|
||||
static ListFilesResponse _arbeitsblaetter() => ListFilesResponse({
|
||||
_file(
|
||||
'Physik Optik.pdf',
|
||||
parent: 'Arbeitsblätter',
|
||||
size: 720_000,
|
||||
daysAgo: 6,
|
||||
),
|
||||
_file(
|
||||
'Geschichte Weimar.pdf',
|
||||
parent: 'Arbeitsblätter',
|
||||
size: 540_000,
|
||||
daysAgo: 8,
|
||||
),
|
||||
});
|
||||
|
||||
static ListFilesResponse _klausuren() => ListFilesResponse({
|
||||
_file(
|
||||
'Mathe Klausur 1.pdf',
|
||||
parent: 'Klausuren',
|
||||
size: 630_000,
|
||||
daysAgo: 20,
|
||||
),
|
||||
_file(
|
||||
'Deutsch Klausur 1.pdf',
|
||||
parent: 'Klausuren',
|
||||
size: 580_000,
|
||||
daysAgo: 34,
|
||||
),
|
||||
});
|
||||
|
||||
static ListFilesResponse _schuljahr() => ListFilesResponse({
|
||||
_folder('Halbjahr 1', parent: 'Schuljahr 2025-26', daysAgo: 40),
|
||||
_file(
|
||||
'Klassenliste 10b.pdf',
|
||||
parent: 'Schuljahr 2025-26',
|
||||
size: 78_000,
|
||||
daysAgo: 60,
|
||||
),
|
||||
});
|
||||
|
||||
static CacheableFile _folder(
|
||||
String name, {
|
||||
String? parent,
|
||||
required int daysAgo,
|
||||
}) {
|
||||
final base = parent == null ? '' : '/$parent';
|
||||
return CacheableFile(
|
||||
path: '$base/$name/',
|
||||
isDirectory: true,
|
||||
name: name,
|
||||
modifiedAt: _relative(daysAgo),
|
||||
createdAt: _relative(daysAgo + 30),
|
||||
);
|
||||
}
|
||||
|
||||
static CacheableFile _file(
|
||||
String name, {
|
||||
String? parent,
|
||||
required int size,
|
||||
required int daysAgo,
|
||||
}) {
|
||||
final base = parent == null ? '' : '/$parent';
|
||||
return CacheableFile(
|
||||
path: '$base/$name',
|
||||
isDirectory: false,
|
||||
name: name,
|
||||
mimeType: _mimeFor(name),
|
||||
size: size,
|
||||
modifiedAt: _relative(daysAgo),
|
||||
createdAt: _relative(daysAgo + 30),
|
||||
);
|
||||
}
|
||||
|
||||
static DateTime _relative(int daysAgo) =>
|
||||
DateTime.now().subtract(Duration(days: daysAgo, hours: 3));
|
||||
|
||||
static String _mimeFor(String name) {
|
||||
final ext = name.split('.').last.toLowerCase();
|
||||
switch (ext) {
|
||||
case 'pdf':
|
||||
return 'application/pdf';
|
||||
case 'pptx':
|
||||
return 'application/vnd.openxmlformats-officedocument.presentationml.presentation';
|
||||
case 'docx':
|
||||
return 'application/vnd.openxmlformats-officedocument.wordprocessingml.document';
|
||||
default:
|
||||
return 'application/octet-stream';
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user