Files
please-pay-me/mobile/widgetbook/lib/knobs/state_knobs.dart
T
2026-09-21 04:06:43 +03:00

47 lines
1.5 KiB
Dart

import 'package:flutter/cupertino.dart';
import 'package:please_pay_me/theme/theme.dart';
import 'package:please_pay_me/ui/ui.dart';
import 'package:please_pay_me_widgetbook/knobs/common_knobs.dart';
import 'package:widgetbook/widgetbook.dart';
enum UiAsyncState { content, loading, empty, error }
UiAsyncState knobAsyncState(BuildContext context, {String label = 'State'}) {
return context.knobs.object.dropdown(
label: label,
options: UiAsyncState.values,
labelBuilder: (value) => value.name,
initialOption: UiAsyncState.content,
);
}
/// Shared empty / error / loading wrappers for molecules & screens.
Widget wrapAsyncState({
required BuildContext context,
required UiAsyncState state,
required Widget Function() builder,
String emptyLabel = 'Пока пусто',
String errorLabel = 'Что-то пошло не так',
}) {
return switch (state) {
UiAsyncState.loading => const Padding(
padding: EdgeInsets.all(AppSpacing.s6),
child: Center(child: AppSpinner()),
),
UiAsyncState.empty => Padding(
padding: const EdgeInsets.all(AppSpacing.s6),
child: Center(child: AppText.subhead(emptyLabel)),
),
UiAsyncState.error => Padding(
padding: const EdgeInsets.all(AppSpacing.s6),
child: Center(
child: AppText.subhead(
knobText(context, label: 'Error text', initialValue: errorLabel),
color: AppColors.systemRed,
),
),
),
UiAsyncState.content => builder(),
};
}