Files
Onsol-GO/lib/screens/auth/invite_signup_screen.dart
2026-04-23 23:58:59 -05:00

66 lines
2.5 KiB
Dart

import 'package:flutter/material.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
class InviteSignupScreen extends StatefulWidget {
const InviteSignupScreen({super.key});
@override
State<InviteSignupScreen> createState() => _InviteSignupScreenState();
}
class _InviteSignupScreenState extends State<InviteSignupScreen> {
final _code = TextEditingController();
final _email = TextEditingController();
final _pass = TextEditingController();
final _user = TextEditingController();
void _processSignup() async {
final messenger = ScaffoldMessenger.of(context);
final nav = Navigator.of(context);
// 1. Check if Invite Code exists and is not used
var codeDoc = await FirebaseFirestore.instance.collection('invite_codes').doc(_code.text.trim()).get();
final codeData = codeDoc.data();
if (codeDoc.exists && codeData != null && codeData['isUsed'] == false) {
try {
// 2. Create the User
UserCredential cred = await FirebaseAuth.instance.createUserWithEmailAndPassword(
email: _email.text.trim(), password: _pass.text.trim());
// 3. Create Firestore Profile
await FirebaseFirestore.instance.collection('users').doc(cred.user!.uid).set({
'username': _user.text.trim(),
'role': 'reader',
'rankLevel': 1,
'uid': cred.user!.uid,
});
// 4. Burn the code
await codeDoc.reference.update({'isUsed': true});
if (context.mounted) nav.pop();
} catch (e) {
messenger.showSnackBar(SnackBar(content: Text(e.toString())));
}
} else {
messenger.showSnackBar(const SnackBar(content: Text("Invalid or Used Code")));
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text("REDEEM INVITATION")),
body: ListView(
padding: const EdgeInsets.all(32),
children: [
TextField(controller: _code, decoration: const InputDecoration(labelText: "6-Digit Invite Code")),
TextField(controller: _user, decoration: const InputDecoration(labelText: "Choose Username")),
TextField(controller: _email, decoration: const InputDecoration(labelText: "Email")),
TextField(controller: _pass, decoration: const InputDecoration(labelText: "Password"), obscureText: true),
const SizedBox(height: 30),
ElevatedButton(onPressed: _processSignup, child: const Text("JOIN THE ORDER")),
],
),
);
}
}