Files
front-hokm/lib/core/theme/ranks.dart
T
2026-07-08 13:48:29 +03:30

52 lines
1.9 KiB
Dart

import 'package:flutter/material.dart';
import 'app_theme.dart';
/// کشِ رنگ و برچسبِ رتبه‌ها که از سرور می‌آید (tier → گرادیان/برچسب). با هر بار
/// خواندنِ کاتالوگِ قاب‌ها پر می‌شود؛ تا آن لحظه از fallbackِ خنثی استفاده می‌شود.
class RankStyles {
RankStyles._();
static final RankStyles I = RankStyles._();
final Map<String, List<Color>> _grad = {};
final Map<String, String> _label = {};
/// کش را از کاتالوگِ سرور پر می‌کند. هر آیتم id/label/c1/c2 دارد.
void setFromCatalog(
Iterable<({String id, String label, String c1, String c2})> tiers,
) {
for (final t in tiers) {
final g = _parse(t.c1, t.c2);
if (g != null) _grad[t.id] = g;
if (t.label.isNotEmpty) _label[t.id] = t.label;
}
}
/// گرادیانِ رتبه (از سرور، وگرنه fallbackِ خنثیِ طلایی).
List<Color> gradient(String tier) => _grad[tier] ?? _fallbackGrad;
/// برچسبِ فارسیِ رتبه (از سرور، وگرنه خودِ شناسه).
String label(String tier) => _label[tier] ?? tier;
static const _fallbackGrad = [AppColors.gold, AppColors.goldDark];
static List<Color>? _parse(String c1, String c2) {
final a = _hex(c1), b = _hex(c2);
if (a == null || b == null) return null;
return [a, b];
}
static Color? _hex(String s) {
s = s.trim().replaceAll('#', '');
if (s.length != 6) return null;
final v = int.tryParse(s, radix: 16);
return v == null ? null : Color(0xFF000000 | v);
}
}
/// گرادیانِ رنگیِ رتبه (از کشِ سرور).
List<Color> rankGradient(String tier) => RankStyles.I.gradient(tier);
/// برچسبِ فارسیِ رتبه (از کشِ سرور).
String rankLabel(String tier) => RankStyles.I.label(tier);