Files
Qlyra/lib/models/informer_banner.dart
sevenhill f74057ce9b
Build Android (FCM) / build-android-fcm (push) Canceled after 0s
Build Android / build-android (push) Canceled after 0s
Build iOS / build-ios (push) Canceled after 0s
Build Linux / build-linux (push) Canceled after 0s
Build macOS / build-macos (push) Canceled after 0s
Build Windows / build-windows (push) Canceled after 0s
Release (main) / android (oneme) (push) Canceled after 0s
Release (main) / android (qlyra) (push) Canceled after 0s
Release (main) / windows (push) Canceled after 0s
Release (main) / linux (push) Canceled after 0s
Release (main) / macos (push) Canceled after 0s
Release (main) / ios (push) Canceled after 0s
Release (main) / release (push) Canceled after 0s
Rebrand application as Qlyra
2026-08-30 13:16:17 +03:00

116 lines
3.2 KiB
Dart

abstract class BannerType {
static const int text = 0;
static const int link = 1;
static const int update = 2;
}
abstract class BannerSettings {
static const int textAnimation = 1;
static const int hideCloseButton = 2;
static const int hideOnClick = 4;
static const int iconThemeColor = 8;
}
class InformerBanner {
final String id;
final String title;
final String description;
final int settings;
final int priority;
final int repeat;
final int rerun;
final int? animojiId;
final String? url;
final int type;
const InformerBanner({
required this.id,
required this.title,
this.description = '',
this.settings = 0,
this.priority = 0,
this.repeat = 0,
this.rerun = 0,
this.animojiId,
this.url,
this.type = BannerType.text,
});
bool get animatesText => settings & BannerSettings.textAnimation != 0;
bool get hidesCloseButton => settings & BannerSettings.hideCloseButton != 0;
bool get closesOnClick => settings & BannerSettings.hideOnClick != 0;
bool get tintsIconWithTheme => settings & BannerSettings.iconThemeColor != 0;
bool get isLink =>
type == BannerType.link && url != null && url!.trim().isNotEmpty;
bool get isUpdate => type == BannerType.update;
bool get isClickable => isLink || isUpdate;
static InformerBanner? fromMap(Map<dynamic, dynamic> map) {
final id = map['id']?.toString();
if (id == null || id.isEmpty) return null;
final title = map['title']?.toString() ?? '';
final description = map['description']?.toString() ?? '';
if (title.isEmpty && description.isEmpty) return null;
return InformerBanner(
id: id,
title: title,
description: description,
settings: _int(map['settings']) ?? 0,
priority: _int(map['priority']) ?? 0,
repeat: _int(map['repeat']) ?? 0,
rerun: _int(map['rerun']) ?? 0,
animojiId: _int(map['animojiId']),
url: map['url']?.toString(),
type: _int(map['type']) ?? BannerType.text,
);
}
Map<String, dynamic> toJson() => {
'id': id,
'title': title,
'description': description,
'settings': settings,
'priority': priority,
'repeat': repeat,
'rerun': rerun,
'animojiId': animojiId,
'url': url,
'type': type,
};
static int? _int(dynamic value) {
if (value is int) return value;
if (value is num) return value.toInt();
if (value is String) return int.tryParse(value);
return null;
}
}
class BannerShowState {
final int showCounter;
final int? showAt;
final int? closedAt;
const BannerShowState({this.showCounter = 0, this.showAt, this.closedAt});
BannerShowState copyWith({int? showCounter, int? showAt, int? closedAt}) =>
BannerShowState(
showCounter: showCounter ?? this.showCounter,
showAt: showAt ?? this.showAt,
closedAt: closedAt ?? this.closedAt,
);
static BannerShowState fromJson(Map<dynamic, dynamic> map) => BannerShowState(
showCounter: InformerBanner._int(map['showCounter']) ?? 0,
showAt: InformerBanner._int(map['showAt']),
closedAt: InformerBanner._int(map['closedTime']),
);
Map<String, dynamic> toJson() => {
'showCounter': showCounter,
'showAt': showAt,
'closedTime': closedAt,
};
}