// // HelpView.swift // Haru_Danim // // 설정 → 도움말: 앱 사용법 안내. // 기기에 맞는 내용만 보여준다 — iPhone은 탭바/버블 메뉴·다이나믹 아일랜드·애플워치, // iPad는 사이드바·일기(다이어리). 각 주제는 접었다 펼치는 DisclosureGroup. // import SwiftUI // MARK: - 도움말 데이터 private struct HelpTopic: Identifiable { let id = UUID() let symbol: String let title: LocalizedStringKey let body: LocalizedStringKey } private struct HelpGroup: Identifiable { let id = UUID() let title: LocalizedStringKey let topics: [HelpTopic] } // MARK: - 도움말 화면 struct HelpView: View { private var groups: [HelpGroup] { var result: [HelpGroup] = [basics, mainTab, goals, history, sync] if DeviceLayout.isPad { result.append(diary) } else { result.append(iphoneUI) result.append(watch) } result.append(premiumHelp) return result } var body: some View { List { ForEach(groups) { group in Section(group.title) { ForEach(group.topics) { topic in DisclosureGroup { Text(topic.body) .font(.subheadline) .foregroundStyle(.secondary) .padding(.vertical, 4) } label: { Label { Text(topic.title) .font(.body.weight(.medium)) } icon: { Image(systemName: topic.symbol) .foregroundStyle(AppTheme.green) } } } } } } .scrollContentBackground(.hidden) .background(AppTheme.background) .navigationTitle("도움말") .navigationBarTitleDisplayMode(.inline) .toolbar(.hidden, for: .tabBar) } // MARK: 공통 — 기본 개념 private var basics: HelpGroup { HelpGroup(title: "기본 개념", topics: [ HelpTopic( symbol: "figure.walk", title: "행동 — 추적의 최소 단위", body: "행동 탭에서 습관이나 할 일을 '행동'으로 등록해요. 만들 때 시간 추적형(시작·종료 토글로 소요 시간 측정) 또는 횟수 추적형(탭할 때마다 +1) 중 하나를 골라요. 이름·아이콘·꼬리표는 나중에 언제든 바꿀 수 있지만 추적 방식은 바꿀 수 없으니 처음에 잘 골라 주세요." ), HelpTopic( symbol: "tag.fill", title: "꼬리표 — 색으로 분류", body: "꼬리표는 행동을 묶는 태그예요. 고유의 색을 가지며, 행동 버튼의 색은 지정한 꼬리표의 색을 따라요. 하나의 행동에 여러 꼬리표를 붙일 수 있고, 꼬리표 탭이나 행동 만들기 화면에서 바로 추가할 수 있어요." ), HelpTopic( symbol: "flag.fill", title: "목표와 다짐", body: "목표는 '토익 700점 받기'처럼 큰 방향이고, 다짐은 그 아래 실천 단위예요. 다짐은 특정 행동(또는 꼬리표)을 골라 주기(하루·주간·월간·특정 기간)와 목표량을 정해요. '이상 달성'뿐 아니라 '이하 유지'(예: 영상 시청 하루 1시간 이하)도 만들 수 있어요." ), ]) } // MARK: 공통 — 모음 탭 private var mainTab: HelpGroup { HelpGroup(title: "모음 탭", topics: [ HelpTopic( symbol: "play.circle.fill", title: "측정 시작·종료", body: "행동 버튼을 탭하면 시간형은 측정이 시작되고 다시 탭하면 종료돼요(테두리로 측정 중을 구분). 횟수형은 탭할 때마다 1씩 올라가요. 여러 행동을 동시에 측정해도 되고, 측정 중인 행동은 상단 '현재 진행 중' 영역에서도 종료할 수 있어요." ), HelpTopic( symbol: "hand.tap.fill", title: "길게 누르기 메뉴", body: "행동 버튼을 길게 누르면 기록 직접 입력·수정, 메모, 기록 확인, 통계 보기, 행동 설정 수정, 삭제를 할 수 있어요. 시간형은 시작·종료 시각을, 횟수형은 횟수와 시각을 직접 고칠 수 있어요." ), HelpTopic( symbol: "square.grid.3x3.fill", title: "배치 편집", body: "오른쪽 위 '배치 편집'을 누르면 버튼이 흔들리며 드래그로 순서를 바꿀 수 있어요. 한 줄에 몇 개를 놓을지도 고를 수 있어요. '완료'를 누르면 저장되고, 이 순서는 위젯의 기본 표시 순서에도 쓰여요." ), HelpTopic( symbol: "arrow.clockwise", title: "새로고침 버튼", body: "왼쪽 위 새로고침 버튼은 화면을 앱을 껐다 켠 것처럼 다시 불러와요. 다른 기기(아이패드·아이폰·워치)에서 기록했는데 이 기기 화면에 아직 안 보일 때 눌러 주세요. iCloud 동기화가 도착해 있다면 바로 반영돼요." ), ]) } // MARK: 공통 — 목표 활용 private var goals: HelpGroup { HelpGroup(title: "목표 탭", topics: [ HelpTopic( symbol: "chart.bar.fill", title: "진행률 읽는 법", body: "다짐마다 하루·주간·월간 진행률이 표시돼요. 주간·월간 진행률은 하루 초과 달성이 다른 날의 미달을 가리지 않도록 하루 목표량까지만 인정해 합산해요. '이하 유지' 다짐은 한도를 넘지 않는 동안 100%로 표시돼요." ), HelpTopic( symbol: "checkmark.seal.fill", title: "목표 종료와 판정", body: "종료일이 있는 목표는 날짜가 지나면 자동으로 달성 여부가 판정되고, 종료일이 없는 목표는 수동 종료 버튼으로 마칠 수 있어요. 판정은 다짐들의 평균 달성률이 목표를 만들 때 정한 '달성 판정 기준'(기본 100%) 이상이면 달성이에요 — 예를 들어 기준을 80%로 두면 조금 못 채워도 달성으로 기록돼요. 다짐 없이 종료일이 지난 목표는 '달성했나요?' 상태가 되어 직접 선택해요. 완료된 목표는 목록 하단의 완료 보관함에서 볼 수 있어요." ), HelpTopic( symbol: "pin.fill", title: "모음 탭에 목표 카드 띄우기", body: "설정 → '모음 탭 목표 진행 현황'에서 원하는 목표를 선택하면 모음 탭 상단에 진행 현황 카드가 떠요. 여러 개를 선택하면 옆으로 쓸어 넘길 수 있어요." ), ]) } // MARK: 공통 — 기록·통계 private var history: HelpGroup { HelpGroup(title: "기록·통계 탭", topics: [ HelpTopic( symbol: "calendar", title: "기록 보기·고치기", body: "기록 탭은 하루의 모든 기록을 보여줘요. 상단 화살표로 날짜를 이동하고, 기록을 탭하면 바로 수정할 수 있어요. 타임테이블 보기로 전환하면 하루 또는 일주일을 24시간 축 위에서 한눈에 볼 수 있어요." ), HelpTopic( symbol: "line.3.horizontal.decrease.circle", title: "필터와 하루 기준", body: "필터 버튼으로 보고 싶은 행동만 골라 볼 수 있어요. 설정의 '주 시작 요일'과 '하루 시작 시간'이 모든 집계에 적용돼요. 예를 들어 하루 시작을 06:00으로 두면 새벽 기록은 전날 실적으로 계산돼요." ), HelpTopic( symbol: "square.and.arrow.up", title: "이미지로 내보내기", body: "기록·통계 탭 오른쪽 위 내보내기 버튼으로 지금 보고 있는 기간의 리포트를 고해상도 이미지로 만들 수 있어요. 라이트·다크 테마를 골라 공유하거나 사진에 저장해요." ), ]) } // MARK: 공통 — 동기화 private var sync: HelpGroup { HelpGroup(title: "기기 간 동기화 (프리미엄)", topics: [ HelpTopic( symbol: "icloud.fill", title: "동기화 켜기", body: "설정 → 프리미엄에서 '기기 간 동기화'를 켜면 iCloud로 아이폰·아이패드의 데이터가 하나로 합쳐져요. 켠 뒤에는 앱을 완전히 종료했다가 다시 실행해야 적용돼요. 모든 기기가 같은 Apple 계정으로 로그인되어 있어야 해요." ), HelpTopic( symbol: "arrow.triangle.2.circlepath", title: "반영이 늦을 때", body: "iCloud 동기화는 네트워크 상황에 따라 몇 초에서 몇 분까지 걸릴 수 있어요. 다른 기기의 기록이 안 보이면 모음 탭 왼쪽 위 새로고침 버튼을 눌러 주세요. 그래도 안 보이면 잠시 후 다시 시도하거나 두 기기 모두 인터넷 연결을 확인해 주세요." ), ]) } // MARK: iPad 전용 — 일기 private var diary: HelpGroup { HelpGroup(title: "일기 (아이패드 · 프리미엄)", topics: [ HelpTopic( symbol: "book.closed.fill", title: "하루 정리 첫 페이지", body: "일기 탭 달력에서 날짜를 누르면 그날의 일기가 열려요. 첫 페이지는 오늘 기분·요약·목표 진행 현황·할 일·24시간 타임테이블·기록으로 하루를 정리해 보여줘요. 오른쪽 위 ⋯ 메뉴의 '첫 화면 구성'에서 섹션 표시 여부와 순서를 바꿀 수 있어요." ), HelpTopic( symbol: "calendar.badge.plus", title: "타임테이블에 일정·필터", body: "첫 페이지 타임테이블 카드 오른쪽 위 캘린더 버튼으로 그날의 캘린더 일정을 골라 함께 표시할 수 있어요. 필터 버튼을 누르면 그날 기록된 행동 중 타임테이블에 보여줄 것만 고를 수 있어요. 두 선택 모두 날짜마다 따로 저장되고, 일기를 내보낼 때도 그대로 반영돼요." ), HelpTopic( symbol: "applepencil", title: "펜슬 노트 페이지", body: "페이지를 넘기면 자유 노트가 이어져요. 애플 펜슬로 쓰고 그리고, '사진'과 '도형'을 추가한 뒤 '배치 모드'에서 드래그·핀치로 옮기고 크기를 바꿔요. 두 손가락 핀치로 페이지를 확대해 세밀하게 쓸 수 있고, 줄 노트를 켜면 줄 간격도 고를 수 있어요." ), HelpTopic( symbol: "square.and.arrow.up.on.square", title: "일기 내보내기", body: "달력 화면 오른쪽 위 내보내기 버튼에서 기간(며칠부터 며칠까지)이나 여러 날짜를 골라 PDF 또는 이미지로 저장해요. 요약 페이지와 노트 페이지가 그대로 담겨요." ), ]) } // MARK: iPhone 전용 — 화면 구성 private var iphoneUI: HelpGroup { HelpGroup(title: "화면 구성 (아이폰)", topics: [ HelpTopic( symbol: "squares.leading.rectangle", title: "탭바 구성과 더보기", body: "설정 → '탭바 구성'에서 하단 탭바에 바로 보일 탭(최대 3개)을 고를 수 있어요. 나머지 탭은 '더보기'에서 열어요." ), HelpTopic( symbol: "circle.hexagongrid.fill", title: "글래스 버블 메뉴", body: "설정 → '내비게이션 방식'에서 '글래스 버블 메뉴'를 고르면 하단 탭바 대신 화면 아래 중앙 버튼 하나로 모든 탭을 열어요. 버튼을 누르면 유리 구슬 버튼들이 부채꼴로 퍼지고, 버블 순서도 설정에서 바꿀 수 있어요." ), HelpTopic( symbol: "bolt.horizontal.circle", title: "다이나믹 아일랜드·잠금화면", body: "시간을 측정 중이면 다이나믹 아일랜드와 잠금화면에 진행 시간이 표시돼요. 여러 개를 동시에 측정하면 설정의 '대표 시간 기준'(먼저/나중에 시작한 행동)에 따라 하나가 대표로 보이고 나머지는 +N으로 표시돼요." ), ]) } // MARK: iPhone 전용 — 애플워치 private var watch: HelpGroup { HelpGroup(title: "애플워치 (프리미엄)", topics: [ HelpTopic( symbol: "applewatch", title: "워치에서 기록하기", body: "워치 앱을 열면 꼬리표 목록이 보여요. 꼬리표를 탭하면 그 안의 행동들이 나오고, 행동을 탭하면 시간형은 측정 시작·종료, 횟수형은 +1이 기록돼요. 기록은 아이폰과 자동으로 동기화돼요." ), HelpTopic( symbol: "watchface.applewatch.case", title: "컴플리케이션 추가", body: "워치 페이스를 길게 눌러 '편집' → 컴플리케이션 자리에서 하루 다님을 골라요. 현재 측정 중인 행동, 특정 목표의 달성률, 특정 다짐의 진행률을 페이스에서 바로 볼 수 있어요. 어떤 목표·다짐을 보여줄지는 컴플리케이션을 탭해 설정해요." ), HelpTopic( symbol: "arrow.triangle.2.circlepath", title: "워치와 폰이 안 맞을 때", body: "워치와 아이폰은 근처에 있을 때 자동으로 맞춰져요. 값이 다르게 보이면 워치 앱을 아래로 당겨 새로고침하거나, 아이폰에서 앱을 한 번 열어 주세요. 모음 탭의 새로고침 버튼도 도움이 돼요." ), ]) } // MARK: 공통 — 프리미엄 private var premiumHelp: HelpGroup { HelpGroup(title: "프리미엄", topics: [ HelpTopic( symbol: "crown.fill", title: "무료와 프리미엄의 차이", body: "무료로는 행동 10개·목표 2개·목표당 다짐 3개까지 만들 수 있어요. 프리미엄은 개수 제한이 풀리고 위젯, 애플워치 앱, 기기 간 동기화, 아이패드 일기를 쓸 수 있어요. 월·년 구독 또는 한 번만 결제하는 평생 이용권 중에 고르면 돼요." ), HelpTopic( symbol: "mic.fill", title: "시리·단축어로 기록하기", body: "단축어 앱에서 '하루 다님'을 검색하면 측정 시작·종료, 횟수 추가, 행동 누적값 가져오기, 목표·다짐 진행률 가져오기 동작을 조합해 나만의 자동화를 만들 수 있어요. \"시리야, 하루 다님에서 측정 시작\"처럼 말로도 실행할 수 있고, 어떤 행동인지 물으면 이름으로 대답하면 돼요. 진행률 동작은 값을 돌려주므로 다른 단축어와 이어 붙일 수 있어요." ), HelpTopic( symbol: "arrow.counterclockwise.circle", title: "구매 복원과 구독 관리", body: "기기를 바꿨거나 앱을 다시 설치했다면 설정 → 프리미엄의 '구매 복원'을 눌러 주세요. 구독 해지나 플랜 변경은 '구독 관리'에서 언제든 할 수 있고, 해지해도 결제한 기간이 끝날 때까지는 계속 쓸 수 있어요." ), ]) } }