From 9c552b8f75a4576f156ddb6b1b8e58a1724cee34 Mon Sep 17 00:00:00 2001 From: devxsby Date: Sun, 1 Jan 2023 19:38:12 +0900 Subject: [PATCH 1/5] =?UTF-8?q?[Add]=20#63-=20=EA=B0=9C=EC=9D=B8=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=EC=B2=98=EB=A6=AC=EB=B0=A9=EC=B9=A8,=20=EC=84=9C?= =?UTF-8?q?=EB=B9=84=EC=8A=A4=20=EC=9D=B4=EC=9A=A9=EC=95=BD=EA=B4=80=20?= =?UTF-8?q?=ED=85=8D=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/Literals/StringLiterals.swift | 267 ++++++++++++++++++ 1 file changed, 267 insertions(+) diff --git a/SOPT-Stamp-iOS/Projects/Core/Sources/Literals/StringLiterals.swift b/SOPT-Stamp-iOS/Projects/Core/Sources/Literals/StringLiterals.swift index afa2e4b5..e77cb427 100644 --- a/SOPT-Stamp-iOS/Projects/Core/Sources/Literals/StringLiterals.swift +++ b/SOPT-Stamp-iOS/Projects/Core/Sources/Literals/StringLiterals.swift @@ -97,4 +97,271 @@ public struct I18N { public static let passwordEditSuccess = "비밀번호가 변경되었습니다." public static let passwordEditFail = "비밀번호 변경 실패" } + + public struct serviceUsagePolicy { + public static let termsOfService = """ + 제 1장 총칙 + 제 1조 + (목적)이 약관은 “SOPT”(이하 “회사”라 합니다)가 제공하는 “SOPT 앱 서비스”(이하 ‘서비스’라 합니다)를 회사와 이용계약을 체결한 ‘고객’이 이용함에 있어 필요한 회사와 고객의 권리 및 의무, 기타 제반 사항을 정함을 목적으로 합니다. + + 제 2조 + (약관 외 준칙)이 약관에 명시되지 않은 사항에 대해서는 위치 정보의 보호 및 이용 등에 관한 법률, 전기통신사업법, 정보통신망 이용 촉진및 보호 등에 관한 법률 등 관계법령 및 회사가 정한 서비스의 세부이용지침 등의 규정에 따릅니다. + + 제 2장 서비스의 이용 + 제 3조 (가입자격) + ① 서비스에 가입할 수 있는 자는 Application 이 설치가능한 모든 사람 입니다. + + 제 4조 (서비스 가입) + ① “Application 관리자”가 정한 본 약관에 고객이 동의하면 서비스 가입의 효력이 발생합니다. + ② “Application 관리자”는 다음 각 호의 고객 가입신청에 대해서는 이를 승낙하지 아니할 수 있습니다. + + 1. 고객 등록 사항을 누락하거나 오기하여 신청하는 경우 + 2. 공공질서 또는 미풍양속을 저해하거나 저해할 목적으로 신청한 경우 + 3. 기타 회사가 정한 이용신청 요건이 충족되지 않았을 경우 + + 제 5조 (서비스의 탈퇴) + 서비스 탈퇴를 희망하는 고객은 “Application 담당자”가 정한 소정의 절차(설정메뉴의 탈퇴)를 통해 서비스 해지를 신청할 수 있습니다. + + 제 6조 (서비스의 수준) + ① 서비스의 이용은 연중무휴 1일 24시간을 원칙으로 합니다. 단, 회사의 업무상이나 기술상의 이유로 서비스가 일시 중지될 수 있으며, 운영상의 목적으로 회사가 정한 기간에는 서비스가 일시 중지될 수 있습니다. 이러한 경우 회사는 사전 또는 사후에 이를 공지합니다. + ② 위치정보는 관련 기술의 발전에 따라 오차가 발생할 수 있습니다. + + 제 7조 (서비스 이용의 제한 및 정지) + 회사는 고객이 다음 각 호에 해당하는 경우 사전 통지 없이 고객의 서비스 이용을 제한 또는 정지하거나 직권 해지를 할 수 있습니다. + + 1. 타인의 서비스 이용을 방해하거나 타인의 개인정보를 도용한 경우 + 2. 서비스를 이용하여 법령, 공공질서, 미풍양속 등에 반하는 행위를 한 경우 + + 제 8조 (서비스의 변경 및 중지) + ① 회사는 다음 각 호의 1에 해당하는 경우 고객에게 서비스의 전부 또는 일부를 제한, 변경하거나 중지할 수 있습니다. + + 1. 서비스용 설비의 보수 등 공사로 인한 부득이한 경우 + 2. 정전, 제반 설비의 장애 또는 이용량의 폭주 등으로 정상적인 서비스 이용에 지장이 있는 경우 + 3. 서비스 제휴업체와의 계약 종료 등과 같은 회사의 제반 사정 또는 법률상의 장애 등으로 서비스를 유지할 수 없는 경우 + 4. 기타 천재지변, 국가비상사태 등 불가항력적 사유가 있는 경우 + + ② 제1항에 의한 서비스 중단의 경우에는 회사는 인터넷 등에 공지하거나 고객에게 통지합니다. 다만, 회사가 통제할 수 없는 사유로 인한 서비스의 중단 (운영자의 고의, 과실이 없는 디스크 장애, 시스템 다운 등)으로 인하여 사전 통지가 불가능한 경우에는 사후에 통지합니다. + + 제 5장 기타 + 제 19조 (회사의 연락처) + 회사의 상호 다음과 같습니다. + 상호: “SOPT makers” + 이메일 주소: makers@sopt.org + + 제 20조 (양도금지) + 고객 및 회사는 고객의 서비스 가입에 따른 본 약관상의 지위 또는 권리,의무의 전부 또는 일부를 제3자에게 양도, 위임하거나 담보제공 등의 목적으로 처분할 수 없습니다. + + 제 21조 (손해배상) + ① 고객의 고의나 과실에 의해 이 약관의 규정을 위반함으로 인하여 회사에 손해가 발생하게 되는 경우, 이 약관을 위반한 고객은 회사에 발생하는 모든 손해를 배상하여야 합니다. + ② 고객이 서비스를 이용함에 있어 행한 불법행위나 고객의 고의나 과실에 의해 이 약관 위반행위로 인하여 회사가 당해 고객 이외의 제3자로부터 손해배상청구 또는 소송을 비롯한 각종 이의제기를 받는 경우 당해 고객은 그로 인하여 회사에 발생한 손해를 배상하여야 합니다. + ③ 회사가 위치정보의 보호 및 이용 등에 관한 법률 제 15조 내지 제26조의 규정을 위반한 행위 혹은 회사가 제공하는 서비스로 인하여 고객에게 손해가 발생한 경우, 회사가 고의 또는 과실 없음을 입증하지 아니하면, 고객의 손해에 대하여 책임을 부담합니다. + + 제 22조 (면책사항) + ① 회사는 천재지변 또는 이에 준하는 불가항력으로 인하여 서비스를 제공할 수 없는 경우에는 서비스 제공에 관한 책임이 면제됩니다. + ② 회사는 고객의 귀책사유로 인한 서비스의 이용장애에 대하여 책임을 지지 않습니다. + ③ 회사는 고객이 서비스를 이용하여 기대하는 수익을 상실한 것에 대하여 책임을 지지 않으며, 그 밖에 서비스를 통하여 얻은 자료로 인한 손해 등에 대하여도 책임을 지지 않습니다. + ④ 회사에서 제공하는 서비스 및 서비스를 이용하여 얻은 정보에 대한 최종판단은 고객이 직접 하여야 하고, 그에 따른 책임은 전적으로 고객 자신에게 있으며, 회사는 그로 인하여 발생하는 손해에 대해서 책임을 부담하지 않습니다. + ⑤ 회사의 업무상 또는 기술상의 장애로 인하여 서비스를 개시하지 못하는 경우 회사는 인터넷 홈페이지 등에 이를 공지하거나 E-mail 등의 방법으로 고객에게 통지합니다. 단, 회사가 통제할 수 없는 사유로 인하여 사전 공지가 불가능한 경우에는 사후에 공지합니다. + + 제 23조 (분쟁의 해결 및 관할법원) + ① 서비스 이용과 관련하여 회사와 고객 사이에 분쟁이 발생한 경우, 회사와 고객은 분쟁의 해결을 위해 성실히 협의합니다. + ② 제1항의 협의에서도 분쟁이 해결되지 않을 경우 양 당사자는 정보통신망 이용촉진 및 정보보호 등에 관한 법률 제33조의 규정에 의한 개인정보분쟁조정위원회에 분쟁조정을 신청할 수 있습니다. + """ + + public static let privacyPolicy = """ + < sopt >('https://sopt.org/'이하 'sopt')은(는) 「개인정보 보호법」 제30조에 따라 정보주체의 개인정보를 보호하고 이와 관련한 고충을 신속하고 원활하게 처리할 수 있도록 하기 위하여 다음과 같이 개인정보 처리방침을 수립·공개합니다. + + ○ 이 개인정보처리방침은 2022년 1월 1부터 적용됩니다. + + 제1조(개인정보의 처리 목적) + + < sopt >('https://sopt.org/'이하 'sopt')은(는) 다음의 목적을 위하여 개인정보를 처리합니다. 처리하고 있는 개인정보는 다음의 목적 이외의 용도로는 이용되지 않으며 이용 목적이 변경되는 경우에는 「개인정보 보호법」 제18조에 따라 별도의 동의를 받는 등 필요한 조치를 이행할 예정입니다. + + 1. 홈페이지 회원가입 및 관리 + + 회원제 서비스 제공에 따른 본인 식별·인증, 회원자격 유지·관리, 서비스 부정이용 방지 목적으로 개인정보를 처리합니다. + + 2. 마케팅 및 광고에의 활용 + + 접속빈도 파악 또는 회원의 서비스 이용에 대한 통계 등을 목적으로 개인정보를 처리합니다. + + 제2조(개인정보의 처리 및 보유 기간) + + ① < sopt >은(는) 법령에 따른 개인정보 보유·이용기간 또는 정보주체로부터 개인정보를 수집 시에 동의받은 개인정보 보유·이용기간 내에서 개인정보를 처리·보유합니다. + + ② 각각의 개인정보 처리 및 보유 기간은 다음과 같습니다. + + 1.<홈페이지 회원가입 및 관리> + + <홈페이지 회원가입 및 관리>와 관련한 개인정보는 수집.이용에 관한 동의일로부터<지체없이 파기>까지 위 이용목적을 위하여 보유.이용됩니다. + + 보유근거 : 회원제 서비스 제공에 따른 본인 인증, 식별 + + 관련법령 : + + 예외사유 : + + 제3조(처리하는 개인정보의 항목) + + ① < sopt >은(는) 다음의 개인정보 항목을 처리하고 있습니다. + + 1< 홈페이지 회원가입 및 관리 > + + 필수항목 : 이메일, 비밀번호, 로그인ID, 이름 + + 제4조(개인정보의 제3자 제공에 관한 사항) + + ① < sopt >은(는) 개인정보를 제1조(개인정보의 처리 목적)에서 명시한 범위 내에서만 처리하며, 정보주체의 동의, 법률의 특별한 규정 등 「개인정보 보호법」 제17조 및 제18조에 해당하는 경우에만 개인정보를 제3자에게 제공합니다. + + ② < sopt >은(는) 다음과 같이 개인정보를 제3자에게 제공하고 있습니다. + + 제5조(개인정보처리의 위탁에 관한 사항) + + ① < sopt >은(는) 원활한 개인정보 업무처리를 위하여 다음과 같이 개인정보 처리업무를 위탁하고 있습니다. + + ② < sopt >은(는) 위탁계약 체결시 「개인정보 보호법」 제26조에 따라 위탁업무 수행목적 외 개인정보 처리금지, 기술적․관리적 보호조치, 재위탁 제한, 수탁자에 대한 관리․감독, 손해배상 등 책임에 관한 사항을 계약서 등 문서에 명시하고, 수탁자가 개인정보를 안전하게 처리하는지를 감독하고 있습니다. + + ③ 위탁업무의 내용이나 수탁자가 변경될 경우에는 지체없이 본 개인정보 처리방침을 통하여 공개하도록 하겠습니다. + + 제6조(개인정보의 파기절차 및 파기방법) + + ① < sopt > 은(는) 개인정보 보유기간의 경과, 처리목적 달성 등 개인정보가 불필요하게 되었을 때에는 지체없이 해당 개인정보를 파기합니다. + + ② 정보주체로부터 동의받은 개인정보 보유기간이 경과하거나 처리목적이 달성되었음에도 불구하고 다른 법령에 따라 개인정보를 계속 보존하여야 하는 경우에는, 해당 개인정보를 별도의 데이터베이스(DB)로 옮기거나 보관장소를 달리하여 보존합니다. + + 1. 법령 근거 : + + 2. 보존하는 개인정보 항목 : 계좌정보, 거래날짜 + + ③ 개인정보 파기의 절차 및 방법은 다음과 같습니다. + + 1. 파기절차 + + < sopt > 은(는) 파기 사유가 발생한 개인정보를 선정하고, < sopt > 의 개인정보 보호책임자의 승인을 받아 개인정보를 파기합니다. + + 2. 파기방법 + + 전자적 파일 형태의 정보는 기록을 재생할 수 없는 기술적 방법을 사용합니다 + + 제7조(미이용자의 개인정보 파기 등에 관한 조치) + + ① <개인정보처리자명>은(는) 1년간 서비스를 이용하지 않은 이용자의 정보를 파기하고 있습니다. 다만, 다른 법령에서 정한 보존기간이 경과할 때까지 다른 이용자의 개인정보와 분리하여 별도로 저장·관리할 수 있습니다. + + ② <개인정보처리자명>은(는) 개인정보의 파기 30일 전까지 개인정보가 파기되는 사실, 기간 만료일 및 파기되는 개인정보의 항목을 이메일, 문자 등 이용자에게 통지 가능한 방법으로 알리고 있습니다. + + ③ 개인정보의 파기를 원하지 않으시는 경우, 기간 만료 전 서비스 로그인을 하시면 됩니다. + + 제8조(정보주체와 법정대리인의 권리·의무 및 그 행사방법에 관한 사항) + + ① 정보주체는 sopt에 대해 언제든지 개인정보 열람·정정·삭제·처리정지 요구 등의 권리를 행사할 수 있습니다. + + ② 제1항에 따른 권리 행사는sopt에 대해 「개인정보 보호법」 시행령 제41조제1항에 따라 서면, 전자우편, 모사전송(FAX) 등을 통하여 하실 수 있으며 sopt은(는) 이에 대해 지체 없이 조치하겠습니다. + + ③ 제1항에 따른 권리 행사는 정보주체의 법정대리인이나 위임을 받은 자 등 대리인을 통하여 하실 수 있습니다.이 경우 “개인정보 처리 방법에 관한 고시(제2020-7호)” 별지 제11호 서식에 따른 위임장을 제출하셔야 합니다. + + ④ 개인정보 열람 및 처리정지 요구는 「개인정보 보호법」 제35조 제4항, 제37조 제2항에 의하여 정보주체의 권리가 제한 될 수 있습니다. + + ⑤ 개인정보의 정정 및 삭제 요구는 다른 법령에서 그 개인정보가 수집 대상으로 명시되어 있는 경우에는 그 삭제를 요구할 수 없습니다. + + ⑥ sopt은(는) 정보주체 권리에 따른 열람의 요구, 정정·삭제의 요구, 처리정지의 요구 시 열람 등 요구를 한 자가 본인이거나 정당한 대리인인지를 확인합니다. + + 제9조(개인정보의 안전성 확보조치에 관한 사항) + + < sopt >은(는) 개인정보의 안전성 확보를 위해 다음과 같은 조치를 취하고 있습니다. + + 1. 내부관리계획의 수립 및 시행 + + 개인정보의 안전한 처리를 위하여 내부관리계획을 수립하고 시행하고 있습니다. + + 2. 개인정보의 암호화 + + 이용자의 개인정보는 비밀번호는 암호화 되어 저장 및 관리되고 있어, 본인만이 알 수 있으며 중요한 데이터는 파일 및 전송 데이터를 암호화 하거나 파일 잠금 기능을 사용하는 등의 별도 보안기능을 사용하고 있습니다. + + 3. 개인정보에 대한 접근 제한 + + 개인정보를 처리하는 데이터베이스시스템에 대한 접근권한의 부여,변경,말소를 통하여 개인정보에 대한 접근통제를 위하여 필요한 조치를 하고 있으며 침입차단시스템을 이용하여 외부로부터의 무단 접근을 통제하고 있습니다. + + 제10조(개인정보를 자동으로 수집하는 장치의 설치·운영 및 그 거부에 관한 사항) + + ① sopt 은(는) 이용자에게 개별적인 맞춤서비스를 제공하기 위해 이용정보를 저장하고 수시로 불러오는 ‘쿠키(cookie)’를 사용합니다. + + ② 쿠키는 웹사이트를 운영하는데 이용되는 서버(http)가 이용자의 컴퓨터 브라우저에게 보내는 소량의 정보이며 이용자들의 PC 컴퓨터내의 하드디스크에 저장되기도 합니다. + + 가. 쿠키의 사용 목적 : 이용자가 방문한 각 서비스와 웹 사이트들에 대한 방문 및 이용형태, 인기 검색어, 보안접속 여부, 등을 파악하여 이용자에게 최적화된 정보 제공을 위해 사용됩니다. + + 나. 쿠키의 설치•운영 및 거부 : 웹브라우저 상단의 도구>인터넷 옵션>개인정보 메뉴의 옵션 설정을 통해 쿠키 저장을 거부 할 수 있습니다. + + 다. 쿠키 저장을 거부할 경우 맞춤형 서비스 이용에 어려움이 발생할 수 있습니다. + + 제11조(행태정보의 수집·이용·제공 및 거부 등에 관한 사항) + + 행태정보의 수집·이용·제공 및 거부등에 관한 사항 + + <개인정보처리자명>은(는) 온라인 맞춤형 광고 등을 위한 행태정보를 수집·이용·제공하지 않습니다. + + 제12조(추가적인 이용·제공 판단기준) + + < sopt > 은(는) 「개인정보 보호법」 제15조제3항 및 제17조제4항에 따라 「개인정보 보호법 시행령」 제14조의2에 따른 사항을 고려하여 정보주체의 동의 없이 개인정보를 추가적으로 이용·제공할 수 있습니다. + + 이에 따라 < sopt > 가(이) 정보주체의 동의 없이 추가적인 이용·제공을 하기 위해서 다음과 같은 사항을 고려하였습니다. + + > 개인정보를 추가적으로 이용·제공하려는 목적이 당초 수집 목적과 관련성이 있는지 여부 + + > 개인정보를 수집한 정황 또는 처리 관행에 비추어 볼 때 추가적인 이용·제공에 대한 예측 가능성이 있는지 여부 + + > 개인정보의 추가적인 이용·제공이 정보주체의 이익을 부당하게 침해하는지 여부 + + > 가명처리 또는 암호화 등 안전성 확보에 필요한 조치를 하였는지 여부 + + ※ 추가적인 이용·제공 시 고려사항에 대한 판단기준은 사업자/단체 스스로 자율적으로 판단하여 작성·공개함 + + 제13조(가명정보를 처리하는 경우 가명정보 처리에 관한 사항) + + < sopt > 은(는) 다음과 같은 목적으로 가명정보를 처리하고 있습니다. + + > 가명정보의 처리 목적 + + - 회원 식별 및 랭킹 노출을 위해 닉네임을 수집하고 있습니다. + + > 가명정보의 처리 및 보유기간 + + - 탈퇴 시 즉시 파기됩니다. + + 제14조 (개인정보 보호책임자에 관한 사항) + + ① sopt 은(는) 개인정보 처리에 관한 업무를 총괄해서 책임지고, 개인정보 처리와 관련한 정보주체의 불만처리 및 피해구제 등을 위하여 아래와 같이 개인정보 보호책임자를 지정하고 있습니다. + + > 개인정보 보호책임자 + + 성명: 솝트 메이커스 + + 직책: 임원진 + + 직급: 임원진 + + 연락처 :makers@sopt.org + + ※ 개인정보 보호 담당부서로 연결됩니다. + + 제17조(정보주체의 권익침해에 대한 구제방법) + + 정보주체는 개인정보침해로 인한 구제를 받기 위하여 개인정보분쟁조정위원회, 한국인터넷진흥원 개인정보침해신고센터 등에 분쟁해결이나 상담 등을 신청할 수 있습니다. 이 밖에 기타 개인정보침해의 신고, 상담에 대하여는 아래의 기관에 문의하시기 바랍니다. + + 1. 개인정보분쟁조정위원회 : (국번없이) 1833-6972 (www.kopico.go.kr) + + 2. 개인정보침해신고센터 : (국번없이) 118 (privacy.kisa.or.kr) + + 3. 대검찰청 : (국번없이) 1301 (www.spo.go.kr) + + 4. 경찰청 : (국번없이) 182 (ecrm.cyber.go.kr) + + 「개인정보보호법」제35조(개인정보의 열람), 제36조(개인정보의 정정·삭제), 제37조(개인정보의 처리정지 등)의 규정에 의한 요구에 대 하여 공공기관의 장이 행한 처분 또는 부작위로 인하여 권리 또는 이익의 침해를 받은 자는 행정심판법이 정하는 바에 따라 행정심판을 청구할 수 있습니다. + + ※ 행정심판에 대해 자세한 사항은 중앙행정심판위원회(www.simpan.go.kr) 홈페이지를 참고하시기 바랍니다. + + 제19조(개인정보 처리방침 변경) + + ① 이 개인정보처리방침은 2022년 1월 1부터 적용됩니다. + """ + } } From d7d03e7c4247a2da7744538ef90a95651af11cdd Mon Sep 17 00:00:00 2001 From: devxsby Date: Sun, 1 Jan 2023 19:38:41 +0900 Subject: [PATCH 2/5] =?UTF-8?q?[Feat]=20#63-=20=EB=B7=B0=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SettingScene/VC/PrivacyPolicyVC.swift | 83 +++++++++++++++++++ .../SettingScene/VC/TermsOfServiceVC.swift | 83 +++++++++++++++++++ 2 files changed, 166 insertions(+) create mode 100644 SOPT-Stamp-iOS/Projects/Presentation/Sources/SettingScene/VC/PrivacyPolicyVC.swift create mode 100644 SOPT-Stamp-iOS/Projects/Presentation/Sources/SettingScene/VC/TermsOfServiceVC.swift diff --git a/SOPT-Stamp-iOS/Projects/Presentation/Sources/SettingScene/VC/PrivacyPolicyVC.swift b/SOPT-Stamp-iOS/Projects/Presentation/Sources/SettingScene/VC/PrivacyPolicyVC.swift new file mode 100644 index 00000000..eb42242b --- /dev/null +++ b/SOPT-Stamp-iOS/Projects/Presentation/Sources/SettingScene/VC/PrivacyPolicyVC.swift @@ -0,0 +1,83 @@ +// +// PrivacyPolicyVC.swift +// Presentation +// +// Created by devxsby on 2022/12/29. +// Copyright © 2022 SOPT-Stamp-iOS. All rights reserved. +// + +import UIKit +import DSKit + +import Core + +import SnapKit +import Then + +public class PrivacyPolicyVC: UIViewController { + + // MARK: - Properties + + public var factory: ModuleFactoryInterface! + + // MARK: - UI Components + + private lazy var naviBar = CustomNavigationBar(self, type: .titleWithLeftButton) + .setTitle(I18N.Setting.personalInfoPolicy) + .setRightButton(.none) + + private let textView = UITextView().then { + $0.text = I18N.serviceUsagePolicy.privacyPolicy + $0.isEditable = false + $0.showsVerticalScrollIndicator = false + $0.setLineSpacing(lineSpacing: 5) + } + + // MARK: - View Life Cycle + + public override func viewDidLoad() { + super.viewDidLoad() + self.setUI() + self.setLayout() + self.setDelegate() + } +} + +// MARK: - UI & Layout + +extension PrivacyPolicyVC { + + private func setUI() { + self.view.backgroundColor = DSKitAsset.Colors.white.color + } + + private func setLayout() { + self.view.addSubviews(naviBar, textView) + + naviBar.snp.makeConstraints { make in + make.leading.top.trailing.equalTo(view.safeAreaLayoutGuide) + } + + textView.snp.makeConstraints { make in + make.top.equalTo(naviBar.snp.bottom).offset(8) + make.leading.trailing.equalTo(view.safeAreaInsets).inset(20) + make.bottom.equalToSuperview() + } + } +} + +// MARK: - Methods + +extension PrivacyPolicyVC { + + private func setDelegate() { + textView.delegate = self + } +} + +extension PrivacyPolicyVC: UITextViewDelegate { + + public func textViewDidChangeSelection(_ textView: UITextView) { + textView.selectedTextRange = nil + } +} diff --git a/SOPT-Stamp-iOS/Projects/Presentation/Sources/SettingScene/VC/TermsOfServiceVC.swift b/SOPT-Stamp-iOS/Projects/Presentation/Sources/SettingScene/VC/TermsOfServiceVC.swift new file mode 100644 index 00000000..587f5d36 --- /dev/null +++ b/SOPT-Stamp-iOS/Projects/Presentation/Sources/SettingScene/VC/TermsOfServiceVC.swift @@ -0,0 +1,83 @@ +// +// TermsOfServiceVC.swift +// Presentation +// +// Created by devxsby on 2022/12/29. +// Copyright © 2022 SOPT-Stamp-iOS. All rights reserved. +// + +import UIKit +import DSKit + +import Core + +import SnapKit +import Then + +public class TermsOfServiceVC: UIViewController { + + // MARK: - Properties + + public var factory: ModuleFactoryInterface! + + // MARK: - UI Components + + private lazy var naviBar = CustomNavigationBar(self, type: .titleWithLeftButton) + .setTitle(I18N.Setting.serviceTerm) + .setRightButton(.none) + + private let textView = UITextView().then { + $0.text = I18N.serviceUsagePolicy.termsOfService + $0.isEditable = false + $0.showsVerticalScrollIndicator = false + $0.setLineSpacing(lineSpacing: 5) + } + + // MARK: - View Life Cycle + + public override func viewDidLoad() { + super.viewDidLoad() + self.setUI() + self.setLayout() + self.setDelegate() + } +} + +// MARK: - UI & Layout + +extension TermsOfServiceVC { + + private func setUI() { + self.view.backgroundColor = DSKitAsset.Colors.white.color + } + + private func setLayout() { + self.view.addSubviews(naviBar, textView) + + naviBar.snp.makeConstraints { make in + make.leading.top.trailing.equalTo(view.safeAreaLayoutGuide) + } + + textView.snp.makeConstraints { make in + make.top.equalTo(naviBar.snp.bottom).offset(8) + make.leading.trailing.equalTo(view.safeAreaInsets).inset(20) + make.bottom.equalToSuperview() + } + } +} + +// MARK: - Methods + +extension TermsOfServiceVC { + + private func setDelegate() { + textView.delegate = self + } +} + +extension TermsOfServiceVC: UITextViewDelegate { + + public func textViewDidChangeSelection(_ textView: UITextView) { + textView.selectedTextRange = nil + } +} From 5c75e09f895f396b67ae9949fbd9a7b94c5e2dc1 Mon Sep 17 00:00:00 2001 From: devxsby Date: Sun, 1 Jan 2023 19:39:04 +0900 Subject: [PATCH 3/5] =?UTF-8?q?[Feat]=20#63-=20=EB=B7=B0=20=EC=97=B0?= =?UTF-8?q?=EA=B2=B0=20=EB=B0=8F=20=EC=9D=98=EC=A1=B4=EC=84=B1=20=EC=A3=BC?= =?UTF-8?q?=EC=9E=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/ModuleFactoryInterface.swift | 2 ++ .../Sources/SettingScene/VC/SettingVC.swift | 14 ++++++++++++-- .../Sources/ModuleFactory/ModuleFactory.swift | 12 ++++++++++++ 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/SOPT-Stamp-iOS/Projects/Presentation/Sources/ModuleFactoryInterface.swift b/SOPT-Stamp-iOS/Projects/Presentation/Sources/ModuleFactoryInterface.swift index 96a5b436..d5221d7e 100644 --- a/SOPT-Stamp-iOS/Projects/Presentation/Sources/ModuleFactoryInterface.swift +++ b/SOPT-Stamp-iOS/Projects/Presentation/Sources/ModuleFactoryInterface.swift @@ -23,4 +23,6 @@ public protocol ModuleFactoryInterface { func makeRankingVC() -> RankingVC func makeSettingVC() -> SettingVC func makePasswordChangeVC() -> PasswordChangeVC + func makePrivacyPolicyVC() -> PrivacyPolicyVC + func makeTermsOfServiceVC() -> TermsOfServiceVC } diff --git a/SOPT-Stamp-iOS/Projects/Presentation/Sources/SettingScene/VC/SettingVC.swift b/SOPT-Stamp-iOS/Projects/Presentation/Sources/SettingScene/VC/SettingVC.swift index 8f507cfd..7fd57dda 100644 --- a/SOPT-Stamp-iOS/Projects/Presentation/Sources/SettingScene/VC/SettingVC.swift +++ b/SOPT-Stamp-iOS/Projects/Presentation/Sources/SettingScene/VC/SettingVC.swift @@ -66,6 +66,16 @@ extension SettingVC { let passwordChangeVC = self.factory.makePasswordChangeVC() navigationController?.pushViewController(passwordChangeVC, animated: true) } + + private func showPrivacyPolicyView() { + let privacyPolicyVC = self.factory.makePrivacyPolicyVC() + navigationController?.pushViewController(privacyPolicyVC, animated: true) + } + + private func showTermsOfServieView() { + let termsOfServiceVC = self.factory.makeTermsOfServiceVC() + navigationController?.pushViewController(termsOfServiceVC, animated: true) + } } // MARK: - UI & Layout @@ -117,9 +127,9 @@ extension SettingVC: UICollectionViewDelegate { case 1: switch indexPath.row { case 0: - print("개인정보처리방침") + showPrivacyPolicyView() case 1: - print("서비스 이용 약관") + showTermsOfServieView() default: print("서비스 의견 제안") } diff --git a/SOPT-Stamp-iOS/Projects/SOPT-Stamp-iOS/Sources/ModuleFactory/ModuleFactory.swift b/SOPT-Stamp-iOS/Projects/SOPT-Stamp-iOS/Sources/ModuleFactory/ModuleFactory.swift index 4bbc13c8..9ade5fdf 100644 --- a/SOPT-Stamp-iOS/Projects/SOPT-Stamp-iOS/Sources/ModuleFactory/ModuleFactory.swift +++ b/SOPT-Stamp-iOS/Projects/SOPT-Stamp-iOS/Sources/ModuleFactory/ModuleFactory.swift @@ -128,4 +128,16 @@ extension ModuleFactory: ModuleFactoryInterface { passwordChangeVC.viewModel = viewModel return passwordChangeVC } + + public func makePrivacyPolicyVC() -> Presentation.PrivacyPolicyVC { + let privacyPolicyVC = PrivacyPolicyVC() + privacyPolicyVC.factory = self + return privacyPolicyVC + } + + public func makeTermsOfServiceVC() -> Presentation.TermsOfServiceVC { + let termsOfServiceVC = TermsOfServiceVC() + termsOfServiceVC.factory = self + return termsOfServiceVC + } } From 7fad624d0196af4a0fa7a29cd8dd7a114bb6f1fe Mon Sep 17 00:00:00 2001 From: devxsby Date: Sun, 1 Jan 2023 22:00:23 +0900 Subject: [PATCH 4/5] =?UTF-8?q?[Chore]=20#63-=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20factory=20=EB=B3=80=EC=88=98=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/SettingScene/VC/PrivacyPolicyVC.swift | 6 +----- .../Sources/SettingScene/VC/TermsOfServiceVC.swift | 6 +----- .../Sources/ModuleFactory/ModuleFactory.swift | 2 -- 3 files changed, 2 insertions(+), 12 deletions(-) diff --git a/SOPT-Stamp-iOS/Projects/Presentation/Sources/SettingScene/VC/PrivacyPolicyVC.swift b/SOPT-Stamp-iOS/Projects/Presentation/Sources/SettingScene/VC/PrivacyPolicyVC.swift index eb42242b..9965ae10 100644 --- a/SOPT-Stamp-iOS/Projects/Presentation/Sources/SettingScene/VC/PrivacyPolicyVC.swift +++ b/SOPT-Stamp-iOS/Projects/Presentation/Sources/SettingScene/VC/PrivacyPolicyVC.swift @@ -15,11 +15,7 @@ import SnapKit import Then public class PrivacyPolicyVC: UIViewController { - - // MARK: - Properties - - public var factory: ModuleFactoryInterface! - + // MARK: - UI Components private lazy var naviBar = CustomNavigationBar(self, type: .titleWithLeftButton) diff --git a/SOPT-Stamp-iOS/Projects/Presentation/Sources/SettingScene/VC/TermsOfServiceVC.swift b/SOPT-Stamp-iOS/Projects/Presentation/Sources/SettingScene/VC/TermsOfServiceVC.swift index 587f5d36..5b0b6bd8 100644 --- a/SOPT-Stamp-iOS/Projects/Presentation/Sources/SettingScene/VC/TermsOfServiceVC.swift +++ b/SOPT-Stamp-iOS/Projects/Presentation/Sources/SettingScene/VC/TermsOfServiceVC.swift @@ -16,10 +16,6 @@ import Then public class TermsOfServiceVC: UIViewController { - // MARK: - Properties - - public var factory: ModuleFactoryInterface! - // MARK: - UI Components private lazy var naviBar = CustomNavigationBar(self, type: .titleWithLeftButton) @@ -39,7 +35,7 @@ public class TermsOfServiceVC: UIViewController { super.viewDidLoad() self.setUI() self.setLayout() - self.setDelegate() +// self.setDelegate() } } diff --git a/SOPT-Stamp-iOS/Projects/SOPT-Stamp-iOS/Sources/ModuleFactory/ModuleFactory.swift b/SOPT-Stamp-iOS/Projects/SOPT-Stamp-iOS/Sources/ModuleFactory/ModuleFactory.swift index 9ade5fdf..655c08a3 100644 --- a/SOPT-Stamp-iOS/Projects/SOPT-Stamp-iOS/Sources/ModuleFactory/ModuleFactory.swift +++ b/SOPT-Stamp-iOS/Projects/SOPT-Stamp-iOS/Sources/ModuleFactory/ModuleFactory.swift @@ -131,13 +131,11 @@ extension ModuleFactory: ModuleFactoryInterface { public func makePrivacyPolicyVC() -> Presentation.PrivacyPolicyVC { let privacyPolicyVC = PrivacyPolicyVC() - privacyPolicyVC.factory = self return privacyPolicyVC } public func makeTermsOfServiceVC() -> Presentation.TermsOfServiceVC { let termsOfServiceVC = TermsOfServiceVC() - termsOfServiceVC.factory = self return termsOfServiceVC } } From 65a3e8c55101c10d0f54c414451e7a0849bd715e Mon Sep 17 00:00:00 2001 From: devxsby Date: Sun, 1 Jan 2023 22:03:33 +0900 Subject: [PATCH 5/5] =?UTF-8?q?[Chore]=20#63-=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=EB=A1=9C=20=ED=95=B4=EB=86=93=EC=9D=80=20=EC=A3=BC?= =?UTF-8?q?=EC=84=9D=20=ED=95=B4=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Presentation/Sources/SettingScene/VC/TermsOfServiceVC.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SOPT-Stamp-iOS/Projects/Presentation/Sources/SettingScene/VC/TermsOfServiceVC.swift b/SOPT-Stamp-iOS/Projects/Presentation/Sources/SettingScene/VC/TermsOfServiceVC.swift index 5b0b6bd8..65e778ae 100644 --- a/SOPT-Stamp-iOS/Projects/Presentation/Sources/SettingScene/VC/TermsOfServiceVC.swift +++ b/SOPT-Stamp-iOS/Projects/Presentation/Sources/SettingScene/VC/TermsOfServiceVC.swift @@ -35,7 +35,7 @@ public class TermsOfServiceVC: UIViewController { super.viewDidLoad() self.setUI() self.setLayout() -// self.setDelegate() + self.setDelegate() } }