import 'package:brick_offline_first_with_supabase/brick_offline_first_with_supabase.dart'; import 'package:brick_sqlite/brick_sqlite.dart'; import 'package:brick_supabase/brick_supabase.dart'; import '../utils/app_time.dart'; /// Status of a programmer project. class ProgrammerProjectStatus { static const active = 'active'; static const archived = 'archived'; static const all = [active, archived]; static String label(String status) { switch (status) { case active: return 'Active'; case archived: return 'Archived'; default: return status; } } } @ConnectOfflineFirstWithSupabase( supabaseConfig: SupabaseSerializable(tableName: 'programmer_projects'), ) class ProgrammerProject extends OfflineFirstWithSupabaseModel { final String id; final String name; final String? description; final String status; final String? creatorId; final DateTime createdAt; final DateTime updatedAt; ProgrammerProject({ required this.id, required this.name, this.description, required this.status, this.creatorId, required this.createdAt, required this.updatedAt, }); bool get isArchived => status == ProgrammerProjectStatus.archived; @Supabase(ignore: true) @Sqlite(ignore: true) @override bool operator ==(Object other) => identical(this, other) || other is ProgrammerProject && runtimeType == other.runtimeType && id == other.id && name == other.name && status == other.status && updatedAt == other.updatedAt; @Supabase(ignore: true) @Sqlite(ignore: true) @override int get hashCode => Object.hash(id, name, status, updatedAt); factory ProgrammerProject.fromMap(Map map) { return ProgrammerProject( id: map['id'].toString(), name: map['name'] as String? ?? '', description: map['description'] as String?, status: map['status'] as String? ?? ProgrammerProjectStatus.active, creatorId: map['creator_id']?.toString(), createdAt: AppTime.parse(map['created_at'] as String), updatedAt: map['updated_at'] == null ? AppTime.parse(map['created_at'] as String) : AppTime.parse(map['updated_at'] as String), ); } }