Email-code sign-in for admins only; Overview with a needs-attention list; Songs with search, playback, editing, approve/hide and bulk edit; Albums and Singers with merge; creator applications queue. Adds the admin views, functions and creator_applications table, a deploy-admin script and a how-to guide. The admin nginx config no longer caches unhashed JS and sends its security headers again. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
45 lines
1.3 KiB
Dart
45 lines
1.3 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:flutter_web_plugins/url_strategy.dart';
|
|
import 'package:supabase_flutter/supabase_flutter.dart';
|
|
|
|
import 'env.dart';
|
|
import 'router.dart';
|
|
import 'session.dart';
|
|
import 'theme.dart';
|
|
|
|
Future<void> main() async {
|
|
WidgetsFlutterBinding.ensureInitialized();
|
|
usePathUrlStrategy(); // admin.nkbmusic.com/songs, not /#/songs (nginx serves index.html for any path)
|
|
if (!Env.isConfigured) {
|
|
runApp(const _MissingConfig());
|
|
return;
|
|
}
|
|
await Supabase.initialize(url: Env.supabaseUrl, publishableKey: Env.supabasePublishableKey);
|
|
AdminSession.instance.start();
|
|
runApp(const NkAdminApp());
|
|
}
|
|
|
|
class NkAdminApp extends StatelessWidget {
|
|
const NkAdminApp({super.key});
|
|
|
|
@override
|
|
Widget build(BuildContext context) => MaterialApp.router(
|
|
title: 'NK Admin',
|
|
debugShowCheckedModeBanner: false,
|
|
theme: buildNkTheme(),
|
|
routerConfig: adminRouter,
|
|
);
|
|
}
|
|
|
|
class _MissingConfig extends StatelessWidget {
|
|
const _MissingConfig();
|
|
|
|
@override
|
|
Widget build(BuildContext context) => MaterialApp(
|
|
theme: buildNkTheme(),
|
|
home: const Scaffold(
|
|
body: Center(child: Text('Built without env.json: run deploy-admin.sh (see admin/README.md).')),
|
|
),
|
|
);
|
|
}
|