semua fitur selesai

This commit is contained in:
Andreas Malvino
2025-06-30 15:22:38 +07:00
parent 8284c93aa5
commit 0423c2fdf9
54 changed files with 11844 additions and 3143 deletions

View File

@ -9,6 +9,7 @@ class LoginView extends GetView<AuthController> {
@override
Widget build(BuildContext context) {
return Scaffold(
resizeToAvoidBottomInset: true,
body: Stack(
children: [
// Background gradient
@ -72,18 +73,21 @@ class LoginView extends GetView<AuthController> {
),
),
// Main content
// Main content with keyboard avoidance
SafeArea(
child: SingleChildScrollView(
physics: const BouncingScrollPhysics(),
physics: const ClampingScrollPhysics(),
padding: EdgeInsets.only(
bottom: MediaQuery.of(context).viewInsets.bottom,
),
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 24.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
const SizedBox(height: 50),
SizedBox(height: MediaQuery.of(context).size.height * 0.05),
_buildHeader(),
const SizedBox(height: 40),
SizedBox(height: MediaQuery.of(context).size.height * 0.03),
_buildLoginCard(),
_buildRegisterLink(),
const SizedBox(height: 30),
@ -103,12 +107,12 @@ class LoginView extends GetView<AuthController> {
tag: 'logo',
child: Image.asset(
'assets/images/logo.png',
width: 220,
height: 220,
width: 180,
height: 180,
errorBuilder: (context, error, stackTrace) {
return Icon(
Icons.apartment_rounded,
size: 180,
size: 150,
color: AppColors.primary,
);
},
@ -123,7 +127,7 @@ class LoginView extends GetView<AuthController> {
shadowColor: AppColors.shadow,
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(24)),
child: Padding(
padding: const EdgeInsets.all(28.0),
padding: const EdgeInsets.all(24.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
@ -145,7 +149,7 @@ class LoginView extends GetView<AuthController> {
fontWeight: FontWeight.w400,
),
),
const SizedBox(height: 32),
const SizedBox(height: 24),
// Email field
_buildInputLabel('Email'),
@ -204,7 +208,7 @@ class LoginView extends GetView<AuthController> {
Obx(
() => SizedBox(
width: double.infinity,
height: 56,
height: 50, // Slightly smaller height
child: ElevatedButton(
onPressed:
controller.isLoading.value ? null : controller.login,
@ -309,6 +313,16 @@ class LoginView extends GetView<AuthController> {
keyboardType: keyboardType,
obscureText: obscureText,
style: TextStyle(fontSize: 16, color: AppColors.textPrimary),
textInputAction:
keyboardType == TextInputType.emailAddress
? TextInputAction.next
: TextInputAction.done,
scrollPhysics: const ClampingScrollPhysics(),
onChanged: (_) {
if (controller.text.isNotEmpty) {
this.controller.errorMessage.value = '';
}
},
decoration: InputDecoration(
hintText: hintText,
hintStyle: TextStyle(color: AppColors.textLight),

View File

@ -1,6 +1,8 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:get/get.dart';
import '../../../theme/app_colors.dart';
import 'package:flutter/rendering.dart';
class RegistrationSuccessView extends StatefulWidget {
const RegistrationSuccessView({Key? key}) : super(key: key);
@ -15,10 +17,17 @@ class _RegistrationSuccessViewState extends State<RegistrationSuccessView>
late AnimationController _animationController;
late Animation<double> _scaleAnimation;
late Animation<double> _fadeAnimation;
String? registerId;
@override
void initState() {
super.initState();
// Get the registration ID from arguments
if (Get.arguments != null && Get.arguments is Map) {
registerId = Get.arguments['register_id'] as String?;
}
_animationController = AnimationController(
vsync: this,
duration: const Duration(milliseconds: 1000),
@ -215,7 +224,7 @@ class _RegistrationSuccessViewState extends State<RegistrationSuccessView>
Container(
padding: const EdgeInsets.symmetric(horizontal: 20),
child: Text(
'Akun Anda telah berhasil terdaftar. Silakan masuk dengan email dan password yang telah Anda daftarkan.',
'Akun Anda telah berhasil terdaftar. Silahkan tunggu petugas untuk melakukan verifikasi data diri anda.',
style: TextStyle(
fontSize: 16,
color: AppColors.textSecondary,
@ -224,6 +233,84 @@ class _RegistrationSuccessViewState extends State<RegistrationSuccessView>
textAlign: TextAlign.center,
),
),
if (registerId != null) ...[
const SizedBox(height: 24),
Text(
'Kode Registrasi:',
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.bold,
color: AppColors.textPrimary,
),
textAlign: TextAlign.center,
),
const SizedBox(height: 8),
Container(
padding: const EdgeInsets.symmetric(
horizontal: 24,
vertical: 12,
),
decoration: BoxDecoration(
color: AppColors.successLight,
borderRadius: BorderRadius.circular(12),
border: Border.all(
color: AppColors.success.withOpacity(0.5),
),
),
child: Row(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
registerId!,
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,
color: AppColors.success,
letterSpacing: 1,
),
),
const SizedBox(width: 8),
IconButton(
icon: Icon(
Icons.copy,
size: 20,
color: AppColors.success,
),
onPressed: () {
// Copy to clipboard
final data = ClipboardData(text: registerId!);
Clipboard.setData(data);
Get.snackbar(
'Berhasil Disalin',
'Kode registrasi telah disalin ke clipboard',
snackPosition: SnackPosition.BOTTOM,
backgroundColor: AppColors.successLight,
colorText: AppColors.success,
margin: const EdgeInsets.all(16),
);
},
padding: EdgeInsets.zero,
constraints: const BoxConstraints(),
splashRadius: 20,
),
],
),
),
const SizedBox(height: 16),
Container(
padding: const EdgeInsets.symmetric(horizontal: 20),
child: Text(
'Simpan kode registrasi ini untuk memeriksa status pendaftaran Anda.',
style: TextStyle(
fontSize: 14,
color: AppColors.textSecondary,
fontStyle: FontStyle.italic,
),
textAlign: TextAlign.center,
),
),
],
],
),
);

File diff suppressed because it is too large Load Diff