// SPDX-FileCopyrightText: (C) 2024 Matyáš Caras // // SPDX-License-Identifier: AGPL-3.0-only import 'package:flutter/material.dart'; import 'package:json_annotation/json_annotation.dart'; part 'category.g.dart'; @JsonSerializable() /// Represents a category in a user's wallet class WalletCategory { /// Represents a category in a user's wallet WalletCategory({ required this.name, required this.id, required this.icon, required this.color, }); /// Generates a class instance from a Map factory WalletCategory.fromJson(Map json) => _$WalletCategoryFromJson(json); /// Default [WalletCategory] instance for json_serializable factory WalletCategory.unknown() => WalletCategory( name: "Unknown", id: -1, icon: Icons.question_mark, color: Colors.green, ); /// User-defined name @JsonKey(defaultValue: "Unknown") String name; /// Unique identificator of the category @JsonKey(required: true, disallowNullValue: true) final int id; /// Selected Icon for the category @JsonKey( fromJson: _iconDataFromJson, toJson: _iconDataToJson, defaultValue: _defaultIcon, ) IconData icon; /// The color that will be displayed with entry @JsonKey( fromJson: _colorFromJson, toJson: _colorToJson, defaultValue: _defaultColor, ) Color color; /// Converts the data in this instance into a Map Map toJson() => _$WalletCategoryToJson(this); @override String toString() { return name; } } Map _iconDataToJson(IconData icon) => {'codepoint': icon.codePoint, 'family': icon.fontFamily}; IconData _iconDataFromJson(Map data) => IconData(data['codepoint'] as int, fontFamily: data['family'] as String?); int _colorToJson(Color color) => color.value; Color _colorFromJson(int input) => Color(input); /// Type of entry, either expense or income enum EntryType { /// Expense expense, /// Income income } IconData _defaultIcon() => Icons.question_mark; Color _defaultColor() => Colors.green;