watch_theme_controller.dart 2.03 KB
import 'package:doublefeel_flutter/app/routes/app_pages.dart';
import 'package:doublefeel_flutter/core/network/api/theme_api.dart';
import 'package:doublefeel_flutter/core/result/app_result.dart';
import 'package:get/get.dart';

import '../models/watch_theme_models.dart';

class WatchThemeController extends GetxController {
  WatchThemeController(this._themeApi);

  final ThemeApi _themeApi;

  final selectedOfficialIndex = 0.obs;
  final hasCustomThemes = false.obs;
  final isPremium = false.obs;
  final isLoadingThemes = false.obs;
  final officialThemeItems = <WatchThemeItem>[].obs;
  final customThemeItems = <WatchThemeItem>[].obs;

  @override
  void onInit() {
    super.onInit();
    final args = Get.arguments;
    if (args is Map) {
      hasCustomThemes.value = args['hasCustomThemes'] == true;
      isPremium.value = args['isPremium'] == true || hasCustomThemes.value;
    }
    loadThemeList();
  }

  Future<void> loadThemeList() async {
    isLoadingThemes.value = true;
    final result = await _themeApi.getThemeList(errorHandlingPolicy: null);
    isLoadingThemes.value = false;

    if (result is! AppSuccess<WatchThemeResponse>) {
      return;
    }

    final themes = result.data.themes;
    final official = themes.where((theme) => theme.isOfficialTheme).toList();
    final custom = themes.where((theme) => theme.isCustomTheme).toList();
    officialThemeItems.assignAll(official);
    customThemeItems.assignAll(custom);
    selectedOfficialIndex.value = 0;
    hasCustomThemes.value = custom.isNotEmpty;
    isPremium.value = isPremium.value || hasCustomThemes.value;
  }

  void executeBackLogic() {
    Get.back();
  }

  void selectOfficialTheme(int index) {
    selectedOfficialIndex.value = index;
    Get.toNamed(Routes.WATCH_THEME_PREVIEW, arguments: {
      'theme': officialThemeItems[index],
    });
  }

  void createCustomTheme() {
    Get.toNamed(Routes.WATCH_THEME_CREATE);
  }

  void previewCustomTheme(WatchThemeItem theme) {
    Get.toNamed(Routes.WATCH_THEME_CUSTOM_PREVIEW, arguments: {
      'theme': theme,
    });
  }
}