import 'dart:io'; import 'package:bloc/bloc.dart'; import 'package:business_panel/core/config/api_config.dart'; import 'package:business_panel/core/services/token_storage_service.dart'; import 'package:dio/dio.dart'; import 'package:business_panel/core/utils/logging_interceptor.dart'; part 'auth_event.dart'; part 'auth_state.dart'; class AuthBloc extends Bloc { late final Dio _dio; final TokenStorageService _tokenStorage = TokenStorageService(); AuthBloc() : super(AuthInitial()) { _dio = Dio(); _dio.interceptors.add(LoggingInterceptor()); on((event, emit) async { emit(AuthLoading()); final token = await _tokenStorage.getAccessToken(); emit(AuthChecked(token != null && token.isNotEmpty)); }); on((event, emit) async { emit(AuthLoading()); try { final token = await _tokenStorage.getAccessToken(); if (token == null || token.isEmpty) { emit(AuthFailure("Token not found. Please log in again.")); return; } final response = await _dio.get( ApiConfig.checkShopStatus, options: Options( headers: {'Authorization': 'Bearer $token'}, ), ); // *** CHANGE IS HERE: Parse shop name from response *** final shopName = response.data?['data']?['Name'] as String? ?? 'فروشگاه شما'; emit(ShopExists(shopName)); } on DioException catch (e) { final isOffline = e.error is SocketException || e.type == DioExceptionType.connectionError || e.type == DioExceptionType.sendTimeout || e.type == DioExceptionType.receiveTimeout; if (isOffline) { emit(AuthOffline()); } else if (e.response?.statusCode == 404) { emit(NoShop()); } else { emit(AuthFailure(e.response?.data?['message'] ?? 'An error occurred while checking shop status.')); } } catch (e) { emit(AuthFailure('An unexpected error occurred: ${e.toString()}')); } }); on((event, emit) async { emit(AuthLoading()); try { final response = await _dio.post( ApiConfig.sendOtp, data: {'Phone': event.phoneNumber, 'Code': event.countryCode}, ); if (response.statusCode == 200) { emit(AuthCodeSentSuccess()); } else { emit(AuthFailure(response.data['message'] ?? 'An error occurred.')); } } on DioException catch (e) { emit(AuthFailure(e.response?.data['message'] ?? 'Network error.')); } }); on((event, emit) async { emit(AuthLoading()); try { final response = await _dio.post( ApiConfig.verifyOtp, data: { 'Phone': event.phoneNumber, 'Code': event.countryCode, 'OTP': event.otp, }, ); if (response.statusCode == 200 && response.data['data']['accessToken'] != null) { final accessToken = response.data['data']['accessToken']; final refreshToken = response.data['data']['refreshToken']; await _tokenStorage.saveTokens( accessToken: accessToken, refreshToken: refreshToken, ); add(CheckShopStatus()); } else { emit(AuthFailure(response.data['message'] ?? 'The verification code is incorrect.')); } } on DioException catch (e) { emit(AuthFailure(e.response?.data['message'] ?? 'Network error.')); } }); } }