Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 10 additions & 2 deletions analysis_options.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@ analyzer:
# iOS 빌드 시 SwiftPM 이 체크아웃한 서드파티 예제 dart 파일이
# 로컬 analyze 에 오류로 잡히는 것을 제외(CI 는 build/ 가 없어 무관).
- build/**
language:
strict-casts: true
strict-raw-types: true

linter:
# The lint rules applied to this project can be customized in the
Expand All @@ -27,8 +30,13 @@ linter:
# `// ignore_for_file: name_of_lint` syntax on the line or in the file
# producing the lint.
rules:
# avoid_print: false # Uncomment to disable the `avoid_print` rule
# prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
# flutter_lints 기본 세트에 더해 실질 버그를 잡는 규칙 위주로 활성화.
unawaited_futures: true # await 누락(무시 의도면 unawaited() 명시)
cancel_subscriptions: true # StreamSubscription 해제 누락
avoid_slow_async_io: true # 동기 IO 사용
only_throw_errors: true # 문자열 throw 금지
prefer_single_quotes: true
directives_ordering: true

# Additional information about this file can be found at
# https://dart.dev/guides/language/analysis-options
24 changes: 13 additions & 11 deletions lib/main.dart
Original file line number Diff line number Diff line change
@@ -1,34 +1,36 @@
import 'dart:async';
import 'env.dart';
import 'motion/motion.dart';
import 'firebase_options.dart';

import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter_naver_map/flutter_naver_map.dart';
import 'package:supabase_flutter/supabase_flutter.dart';
import 'theme/app_theme.dart';
import 'screen/welcome_screen.dart';
import 'screen/main_screen.dart';
import 'screen/admin/admin_home_screen.dart';

import 'env.dart';
import 'firebase_options.dart';
import 'motion/motion.dart';
import 'screen/activity_screens.dart' show MyReviewsScreen;
import 'screen/admin/admin_home_screen.dart';
import 'screen/chat_room_screen.dart';
import 'screen/guardian_invites_screen.dart';
import 'screen/main_screen.dart';
import 'screen/notifications_screen.dart';
import 'screen/post_detail_screen.dart';
import 'screen/review_detail_screen.dart';
import 'screen/user_profile_screen.dart';
import 'screen/welcome_screen.dart';
import 'services/chat_repository.dart';
import 'services/community_repository.dart';
import 'services/facility_review_repository.dart';
import 'services/session.dart';
import 'widgets/review_cards.dart';
import 'services/keyboard_barrier.dart';
import 'services/local_notice_service.dart';
import 'services/push_service.dart';
import 'services/realtime_service.dart';
import 'services/keyboard_barrier.dart';
import 'services/session.dart';
import 'services/theme_controller.dart';
import 'theme/app_theme.dart';
import 'widgets/app_toast.dart';
import 'widgets/review_cards.dart';

/// 강제 로그아웃(세션 무효화) 시 라우팅·안내를 위한 전역 키.
final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
Expand Down
6 changes: 3 additions & 3 deletions lib/motion/motion.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@
library;

export 'app_motion.dart';
export 'pressable.dart';
export 'entrance.dart';
export 'spring_page_route.dart';
export 'collapse_route.dart';
export 'entrance.dart';
export 'heart_burst.dart';
export 'pressable.dart';
export 'spring_page_route.dart';
export 'springy_nav_bar.dart';
3 changes: 2 additions & 1 deletion lib/motion/springy_nav_bar.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'app_motion.dart';

import '../theme/app_palette.dart';
import 'app_motion.dart';

class SpringyNavItem {
const SpringyNavItem({required this.icon, IconData? activeIcon})
Expand Down
8 changes: 5 additions & 3 deletions lib/screen/activity_screens.dart
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
import 'dart:async';
import 'package:flutter/material.dart';
import '../motion/motion.dart';
import '../theme/app_palette.dart';

import '../data/mock_data.dart' show categoryLabel, timeAgo;
import '../data/review_categories.dart';
import '../motion/motion.dart';
import '../services/activity_repository.dart';
import '../services/session.dart';
import '../theme/app_palette.dart';
import 'review_write_screen.dart';

DateTime? _date(dynamic v) =>
Expand Down Expand Up @@ -345,7 +347,7 @@ class _MyAppointmentsScreenState extends State<MyAppointmentsScreen> {
),
),
);
if (done == true) _load();
if (done == true) unawaited(_load());
}

void _toast(String m) {
Expand Down
3 changes: 2 additions & 1 deletion lib/screen/admin/admin_broadcast_screen.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import '../../theme/app_palette.dart';

import '../../services/admin_repository.dart';
import '../../theme/app_palette.dart';
import 'admin_theme.dart';

/// 전체 공지 발송 — 탈퇴자를 제외한 전 회원에게 system_notice 알림(인앱+푸시)을 보낸다.
Expand Down
3 changes: 2 additions & 1 deletion lib/screen/admin/admin_business_screen.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:url_launcher/url_launcher.dart';

Expand Down Expand Up @@ -181,7 +182,7 @@ class _AdminBusinessScreenState extends State<AdminBusinessScreen> {
),
builder: (_) => _DetailSheet(app: a),
);
if (changed == true) _load();
if (changed == true) unawaited(_load());
}

void _toast(String msg) {
Expand Down
3 changes: 2 additions & 1 deletion lib/screen/admin/admin_chat_history_screen.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import '../../theme/app_palette.dart';

import '../../services/admin_repository.dart';
import '../../theme/app_palette.dart';
import 'admin_theme.dart';

/// 관리자 — 채팅방 대화 내역(삭제된 메시지 포함) 조회.
Expand Down
15 changes: 8 additions & 7 deletions lib/screen/admin/admin_home_screen.dart
Original file line number Diff line number Diff line change
@@ -1,20 +1,21 @@
import 'package:flutter/material.dart';

import '../../motion/motion.dart';
import '../../theme/app_palette.dart';
import '../../services/admin_repository.dart';
import '../../services/auth_service.dart';
import '../../services/session.dart';
import '../welcome_screen.dart';
import '../../theme/app_palette.dart';
import '../change_password_screen.dart';
import 'admin_theme.dart';
import 'admin_business_screen.dart';
import 'admin_users_screen.dart';
import 'admin_reports_screen.dart';
import 'admin_posts_screen.dart';
import '../welcome_screen.dart';
import 'admin_broadcast_screen.dart';
import 'admin_business_screen.dart';
import 'admin_inquiries_screen.dart';
import 'admin_logs_screen.dart';
import 'admin_metrics_screen.dart';
import 'admin_posts_screen.dart';
import 'admin_reports_screen.dart';
import 'admin_theme.dart';
import 'admin_users_screen.dart';

/// 관리자 홈 — 대시보드 + 관리 메뉴.
/// 관리자(user_type='admin') 로 로그인하면 일반 화면 대신 이 화면으로 진입한다.
Expand Down
8 changes: 5 additions & 3 deletions lib/screen/admin/admin_inquiries_screen.dart
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
import 'dart:async';
import 'package:flutter/material.dart';
import '../../motion/motion.dart';
import '../../theme/app_palette.dart';

import '../../data/mock_data.dart' show timeAgo;
import '../../motion/motion.dart';
import '../../services/admin_repository.dart';
import '../../services/chat_repository.dart';
import '../../theme/app_palette.dart';
import '../chat_room_screen.dart';
import 'admin_theme.dart';

Expand Down Expand Up @@ -69,7 +71,7 @@ class _AdminInquiriesScreenState extends State<AdminInquiriesScreen> {
context,
AppPageRoute(builder: (_) => ChatRoomScreen(room: room)),
);
if (mounted) _load();
if (mounted) unawaited(_load());
} catch (_) {
_toast('문의방을 열지 못했어요');
} finally {
Expand Down
3 changes: 2 additions & 1 deletion lib/screen/admin/admin_logs_screen.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import 'package:flutter/material.dart';
import '../../theme/app_palette.dart';

import '../../data/mock_data.dart' show timeAgo;
import '../../services/admin_repository.dart';
import '../../theme/app_palette.dart';
import 'admin_theme.dart';

/// 감사 로그 — 관리자 조치 이력(정지·숨김·삭제·신고처리 등).
Expand Down
3 changes: 2 additions & 1 deletion lib/screen/admin/admin_metrics_screen.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import '../../theme/app_palette.dart';

import '../../services/admin_repository.dart';
import '../../theme/app_palette.dart';
import 'admin_theme.dart';

/// 관리자 운영 지표·비용 화면.
Expand Down
6 changes: 4 additions & 2 deletions lib/screen/admin/admin_posts_screen.dart
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
import 'dart:async';
import '../../motion/motion.dart';

import 'package:flutter/material.dart';
import '../../theme/app_palette.dart';

import '../../data/mock_data.dart' show timeAgo, categoryLabel;
import '../../motion/motion.dart';
import '../../services/admin_repository.dart';
import '../../theme/app_palette.dart';
import 'admin_theme.dart';

/// 게시글/댓글 관리 — 게시글 검색/조회 + 숨김·삭제, 댓글 관리로 이동.
Expand Down
3 changes: 2 additions & 1 deletion lib/screen/admin/admin_report_detail_screen.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import 'package:flutter/material.dart';
import '../../theme/app_palette.dart';

import '../../data/mock_data.dart' show timeAgo;
import '../../services/admin_repository.dart';
import '../../theme/app_palette.dart';
import 'admin_chat_history_screen.dart';
import 'admin_theme.dart';

Expand Down
10 changes: 6 additions & 4 deletions lib/screen/admin/admin_reports_screen.dart
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
import 'dart:async';
import 'package:flutter/material.dart';
import '../../motion/motion.dart';
import '../../theme/app_palette.dart';

import '../../data/mock_data.dart' show timeAgo;
import '../../motion/motion.dart';
import '../../services/admin_repository.dart';
import 'admin_theme.dart';
import '../../theme/app_palette.dart';
import 'admin_report_detail_screen.dart';
import 'admin_theme.dart';

/// 신고 처리 — 미처리/전체 신고 조회 + 상태 변경(검토중/처리완료/반려).
class AdminReportsScreen extends StatefulWidget {
Expand Down Expand Up @@ -163,7 +165,7 @@ class _AdminReportsScreenState extends State<AdminReportsScreen> {
builder: (_) => AdminReportDetailScreen(report: _items[i]),
),
);
if (mounted) _load();
if (mounted) unawaited(_load());
},
child: _ReportCard(
report: _items[i],
Expand Down
4 changes: 3 additions & 1 deletion lib/screen/admin/admin_users_screen.dart
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
import 'dart:async';

import 'package:flutter/material.dart';
import '../../theme/app_palette.dart';

import '../../data/mock_data.dart' show timeAgo;
import '../../services/admin_repository.dart';
import '../../services/session.dart';
import '../../theme/app_palette.dart';
import 'admin_theme.dart';

/// 회원 관리 — 검색/조회 + 상태 변경(정지/휴면/활성).
Expand Down
3 changes: 2 additions & 1 deletion lib/screen/applicants_screen.dart
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import 'package:flutter/material.dart';
import '../theme/app_palette.dart';

import '../data/mock_data.dart' show timeAgo;
import '../models/community.dart';
import '../services/activity_repository.dart';
import '../services/chat_launcher.dart';
import '../theme/app_palette.dart';

/// 지원자 목록 — 글 작성자 또는 공동보호자가 지원자를 확인하고 1명을 수락(선택)한다.
/// 수락 시 DB 트리거가 약속을 만들고 나머지 지원자는 자동 거절된다.
Expand Down
7 changes: 4 additions & 3 deletions lib/screen/auth/login_screen.dart
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
import 'package:flutter/material.dart';

import '../../motion/motion.dart';
import '../../theme/app_palette.dart';
import '../../services/auth_service.dart';
import '../../services/session.dart';
import '../main_screen.dart';
import '../../theme/app_palette.dart';
import '../admin/admin_home_screen.dart';
import 'signup_phone_screen.dart';
import '../main_screen.dart';
import 'reset_password_screen.dart';
import 'signup_phone_screen.dart';

/// 로그인 — 아이디/비밀번호 기반.
class LoginScreen extends StatefulWidget {
Expand Down
3 changes: 2 additions & 1 deletion lib/screen/auth/reset_password_screen.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import '../../theme/app_palette.dart';

import '../../services/phone_auth_service.dart';
import '../../theme/app_palette.dart';

/// 비밀번호 재설정 — 전화 OTP 기반.
/// 1) 전화번호 입력 → SMS 코드 발송 (phone_verifications.purpose='password_reset')
Expand Down
11 changes: 6 additions & 5 deletions lib/screen/auth/signup_phone_screen.dart
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
import 'package:flutter/material.dart';
import '../../motion/motion.dart';
import 'package:flutter/services.dart';
import '../../theme/app_palette.dart';
import '../../services/phone_auth_service.dart';

import '../../main.dart' show navigatorKey;
import '../../motion/motion.dart';
import '../../services/auth_service.dart';
import '../../services/phone_auth_service.dart';
import '../../theme/app_palette.dart';
import '../business_register_screen.dart';
import '../main_screen.dart';
import '../pet_edit_screen.dart';
import '../business_register_screen.dart';
import '../terms_screen.dart';
import 'login_screen.dart';
import '../../main.dart' show navigatorKey;

/// 회원가입 — 전화 OTP 기반 다단계 흐름 (0025 §1.3).
/// 1) 약관 동의 (필수 전부 동의해야 다음 진행 가능)
Expand Down
6 changes: 4 additions & 2 deletions lib/screen/blocked_users_screen.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import 'dart:async';
import 'package:flutter/material.dart';
import '../theme/app_palette.dart';

import '../services/activity_repository.dart';
import '../theme/app_palette.dart';

/// 차단 사용자 관리 — 목록 + 차단 해제.
class BlockedUsersScreen extends StatefulWidget {
Expand Down Expand Up @@ -39,7 +41,7 @@ class _BlockedUsersScreenState extends State<BlockedUsersScreen> {
Future<void> _unblock(Map<String, dynamic> item) async {
try {
await _repo.unblock(item['blocked_id'] as String);
_load();
unawaited(_load());
} catch (_) {
if (mounted) {
ScaffoldMessenger.of(context).showSnackBar(
Expand Down
3 changes: 2 additions & 1 deletion lib/screen/change_password_screen.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import '../theme/app_palette.dart';

import '../services/auth_service.dart';
import '../theme/app_palette.dart';

/// 비밀번호 변경 — 현재 비밀번호 확인 후 새 비밀번호로 변경.
class ChangePasswordScreen extends StatefulWidget {
Expand Down
6 changes: 4 additions & 2 deletions lib/screen/chat_room_screen.dart
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
import 'dart:ui' as ui;

import 'package:flutter/material.dart';
import 'package:flutter/services.dart' show SystemUiOverlayStyle;
import 'package:supabase_flutter/supabase_flutter.dart';
import '../motion/motion.dart';
import '../theme/app_palette.dart';

import '../data/mock_data.dart' show timeAgo;
import '../models/chat.dart';
import '../motion/motion.dart';
import '../services/chat_repository.dart';
import '../services/report_repository.dart';
import '../services/storage_service.dart';
import '../theme/app_palette.dart';
import '../widgets/overlay_icon_button.dart';
import '../widgets/report_sheet.dart';
import 'user_profile_screen.dart';
Expand Down
Loading
Loading