From 623c7673ca051e62aaec020251e574a2943d5b8f Mon Sep 17 00:00:00 2001 From: Baek2back Date: Sun, 30 Jul 2023 04:44:31 +0900 Subject: [PATCH 01/11] =?UTF-8?q?Refactor:=20=EB=AF=B8=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=20=EB=8D=B0=EC=9D=B4=ED=84=B0=EB=A5=BC=20=EC=A0=9C=EA=B1=B0?= =?UTF-8?q?=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/constants/platform/android.tsx | 124 --------------- src/constants/platform/design.tsx | 148 ------------------ src/constants/platform/index.ts | 13 -- src/constants/platform/ios.tsx | 152 ------------------- src/constants/platform/node.tsx | 153 ------------------- src/constants/platform/spring.tsx | 228 ---------------------------- src/constants/platform/web.tsx | 236 ----------------------------- 7 files changed, 1054 deletions(-) diff --git a/src/constants/platform/android.tsx b/src/constants/platform/android.tsx index 3c06bc0..6d21121 100644 --- a/src/constants/platform/android.tsx +++ b/src/constants/platform/android.tsx @@ -15,130 +15,6 @@ const android = { color: '#77EDAD', emojis: [AndroidLeftEmoji, AndroidRightEmoji], }, - introduction: ( - <> - Mash-Up 안드로이드팀은 세미나, 프로젝트, 스터디 등 여러 활동을 진행합니다. -
- 학생부터 현업 직장인까지 다양한 연령대의 사람들이 모여 있으며 좋은 지식을 다 같이 공유하고 - 성장하며 서로에게 자극이 되기도 하는 관계를 지향합니다. -
- 개발 뿐만 아니라 안드로이드 개발이라는 같은 공통사를 가진 좋은 사람들과 만날 수 있는 친목의 - 장이 되기도 합니다. -
- 안드로이드팀은 열정있는 안드로이드 개발자분들을 기다리고 있습니다! - - ), - talent: [ - { - id: 'android-talent-1', - content: <>코틀린을 사용해서 안드로이드 프로젝트를 진행해보신 분, - }, - { - id: 'android-talent-2', - content: <>기술적으로 풀기 어려운 문제를 공유해 함께 토론하고 해결해보고 싶으신 분, - }, - { - id: 'android-talent-3', - content: <>스터디, 세미나, 코드리뷰 등 팀 활동에 적극적으로 참여할 수 있으신 분, - }, - { - id: 'android-talent-4', - content: <>다양한 취미를 안드로이드 팀원과 함께 공유하고 즐기고 싶으신 분, - }, - { - id: 'android-talent-5', - content: ( - <> - 수다쟁이 환영 ( ͡° ͜ʖ ͡°) - - ), - }, - ], - study: [ - { - id: 'android-study-1', - content: <>Android Blog, - }, - { - id: 'android-study-2', - content: <>Compose, - }, - { - id: 'android-study-3', - content: <>Coroutine + Flow, - }, - { - id: 'android-study-4', - content: ( - <> - 기타 여러분이 원하는 주제{' '} - (☞ ͡° ͜ʖ ͡°)☞ - - ), - }, - ], - interview: [ - { - id: 'android-interview-1', - content: '토요일, 일요일', - }, - { - id: 'android-interview-2', - content: '오전 10시 ~ 오후 6시', - }, - ], - questions: [ - { - id: 'android-question-1', - title: { text: '어떤 활동을 진행하나요?' }, - content: [ - { - id: 'android-question-1-1', - content: ( - <> - Mash-Up 안드로이드 13기는 팀원들이 원하는 자율적인 주제로 여러개의 스터디가 개설되고 - 진행됩니다. Compose, Coroutine 등 기술적인 스터디 이외에도 Mash-Up 안드로이드 팀 - Youtube 컨텐츠 제작이나, Android Weekly 번역 및 공유 등 가벼운 스터디도 진행될 - 예정이에요! 뿐만아니라, 안드로이드 현업 개발자와의 만남 및 세미나도 계획되어있습니다. - - ), - }, - ], - }, - { - id: 'android-question-2', - title: { text: '어느정도 안드로이드 개발을 할 줄 알아야 하나요?' }, - content: [ - { - id: 'android-question-2-1', - content: ( - <> - 안드로이드 팀에는 기본적으로 학생부터 직장인까지 열정 넘치는 분들은 누구나 참여 - 가능합니다. 단, 앱을 출시하는 프로젝트를 동아리에서 진행하기 때문에 간단한 안드로이드 - 토이 프로젝트라도 한 번 이상 진행해보신 분들을 뽑을 예정입니다! 또한, 코틀린으로 - 프로젝트를 진행하기 때문에 코틀린을 능숙하진 않더라도 사용할 줄 알아야합니다. - - ), - }, - ], - }, - { - id: 'android-question-3', - title: { text: '프로젝트의 스펙은 어떻게 되나요?' }, - content: [ - { - id: 'android-question-3-1', - content: ( - <> - 프로젝트마다 팀원끼리 상의해서 스펙을 다르게 가져갑니다. 자신이 평소 사용해보고 싶었던 - 라이브러리들을 사용해볼 수 있는 기회이면서 접해보지 못했던 스택들을 다른 팀원들과 함께 - 사용해보면서 익힐 수 있는 기회가 되기도합니다. - - ), - }, - ], - }, - ], }; export default android; diff --git a/src/constants/platform/design.tsx b/src/constants/platform/design.tsx index e86a44f..1f72b08 100644 --- a/src/constants/platform/design.tsx +++ b/src/constants/platform/design.tsx @@ -15,153 +15,5 @@ const design = { color: '#6220EE', emojis: [DesignLeftEmoji, DesignRightEmoji], }, - introduction: ( - <> - Mash-up의 Product Design 팀은 서비스의 경험을 설계하고 문제를 해결해요. -
- 서비스 기획부터 인터페이스, 브랜딩, 프로토타이핑까지 모든 디자인을 유연하게 설계할 수 있는 - 금손 팀원으로 구성돼요. 우리는 프로젝트 전체를 이해하고 개발자들과 적극적으로 소통하며 더 좋은 - 프로젝트의 서비스 방향을 고민해요. 학생부터 현업 직장인까지 다양한 경험을 가진 사람들과의 - 만남으로 디자인 지식과 트렌드를 공유하며 성장해 나가는 것을 추구하고 있어요. 번뜩이는 - 아이디어를 멋진 서비스로 만들어내는 일을 함께할 디자이너를 기다리고 있어요. - - ), - talent: [ - { - id: 'design-talent-1', - content: <>💁🏻 사용자의 관점에서 서비스를 설계하고 디자인할 수 있는 분!, - }, - { - id: 'design-talent-2', - content: <>💻 개발자와 소통하여 문제를 잘 해결해나갈 수 있는 능력을 가지신 분!, - }, - { - id: 'design-talent-3', - content: <>🏃🏼‍♀️ 프로젝트의 결과만큼 함께 만드는 과정도 중요하게 생각하시는 분!, - }, - { - id: 'design-talent-4', - content: <>💬 자신의 생각을 다른 사람에게 이야기하는 것에 적극적인 분!, - }, - ], - study: [ - { - id: 'design-study-1', - content: <>포트폴리오 스터디, - }, - { - id: 'design-study-2', - content: <>데이터 분석 스터디, - }, - { - id: 'design-study-3', - content: <>국내외 서비스 분석 및 아티클 스터디, - }, - ], - interview: [ - { - id: 'design-interview-1', - content: '토요일, 일요일', - }, - { - id: 'design-interview-2', - content: '오전 10시 ~ 오후 6시', - }, - ], - questions: [ - { - id: 'design-question-1', - title: { text: '디자인팀은 주로 어떤 활동을 하나요?' }, - content: [ - { - id: 'design-question-1-1', - content: ( - <> - 개발팀과 함께 기획의 시간을 가진 뒤, 협업을 진행하며 서비스를 완성시키는 공식 프로젝트 - 하나를 진행해요. - - ), - }, - { - id: 'design-question-1-2', - content: ( - <> - 프로젝트 진행 이외에도 디자인 팀원들끼리 플랫폼 세미나와 스터디를 열어, 디자인 지식을 - 마음껏 공유할 수 있는 시간을 가지고 있어요! - - ), - }, - ], - }, - { - id: 'design-question-2', - title: { text: '디자인할 때 주로 어떤 툴을 사용하나요?' }, - content: [ - { - id: 'design-question-2-1', - content: ( - <> - Figma, Sketch, XD 등 프로토타이핑 툴을 주로 사용해요. 프로젝트 팀 진행에서는 - 개발자와의 협업을 위해 Zeplin을 활용하기도 해요. 팀원들과 합의를 통해 작업 툴을 맞출 - 수 있어요. - - ), - }, - ], - }, - { - id: 'design-question-3', - title: { text: '프로덕트(UX/UI)관련 학과를 지원해야 하나요?' }, - content: [ - { - id: 'design-question-3-1', - content: ( - <> - 아니요! 매쉬업에서는 프로덕트 디자인에 관심 있는 사람이라면 환영해요. 다만, 프로덕트 - 디자인에 대한 기본적인 이해도가 없다면 협업할 때 버거울 수 있다 생각해요. 꾸준히 - 부족함을 채우기 위해 노력하는 열정과, 책임감을 가지고 있다면 충분해요 😄 - - ), - }, - ], - }, - { - id: 'design-question-4', - title: { text: '포트폴리오를 웹 URL로 제출해도 되나요?' }, - content: [ - { - id: 'design-question-4-1', - content: <>네 가능해요! 지원서 제출 시 pdf에 링크를 첨부하여 제출해 주시면 됩니다., - }, - ], - }, - { - id: 'design-question-5', - title: { text: '세미나와 스터디는 어떻게 진행되나요?' }, - content: [ - { - id: 'design-question-5-1', - content: ( - <> - 매 기수마다 선호도에 따라 진행하는 스터디와 세미나 주제가 다를 수 있어요. 팀원들이 - 하고자 하는 새로운 주제가 있다면, 자유롭게 스터디를 만들 수 있어요! 지난 12기 때는 - 팀원들의 관심사를 바탕으로 포트폴리오, 데이터 분석, 웹 스터디 등을 진행하였으니 참고 - 부탁드려요. - - ), - }, - ], - }, - { - id: 'design-question-6', - title: { text: '경력이 없거나 동아리가 처음인 사람도 괜찮을까요?' }, - content: [ - { - id: 'design-question-6-1', - content: <>네 괜찮아요! 디자인에 대한 열정만 있다면 누구든지 함께할 준비가 되어있어요., - }, - ], - }, - ], }; export default design; diff --git a/src/constants/platform/index.ts b/src/constants/platform/index.ts index adbfe90..b987945 100644 --- a/src/constants/platform/index.ts +++ b/src/constants/platform/index.ts @@ -1,6 +1,4 @@ -import { Item } from '@/components/common/BulletedList/BulletedList.component'; import { ValueOf } from '@/types'; -import { ReactNode } from 'react'; import web from './web'; import spring from './spring'; import design from './design'; @@ -25,22 +23,11 @@ export type Path = { apply: string; }; -export type Question = { - id: string; - title: { emoji?: string; text: string }; - content: Item[]; -}; - export type Platform = { id: string; name: string; role: string; path: Path; - introduction: ReactNode; - questions: Question[]; - study: Item[]; - interview: Item[]; - talent: Item[]; hero: { color: string; emojis: any[]; diff --git a/src/constants/platform/ios.tsx b/src/constants/platform/ios.tsx index 18d2f3f..71da4a4 100644 --- a/src/constants/platform/ios.tsx +++ b/src/constants/platform/ios.tsx @@ -15,158 +15,6 @@ const ios = { color: '#F8F9FA', emojis: [IOSLeftEmoji, IOSRightEmoji], }, - introduction: ( - <> - Mash-Up iOS 팀은 자유롭고 활기찬 분위기 속에서 정보와 지식을 공유하며 성장하는 네트워크를 - 형성하는 것이 목표입니다. 학생부터 현직자까지 다양한 인원들이 활동하고 있으며, 서로에게 좋은 - 자극이 되는 건강한 관계를 유지하고 있습니다. 함께 성장하며, 거리낌 없이 참여할 수 있는 열정 - 가득한 iOS 개발자를 기다리고 있습니다. 고민은 지원을 늦출 뿐! 우리 iOS 팀은 여러분들의 많은 - 지원과 관심을 기다리고 있습니다! - - ), - talent: [ - { - id: 'ios-talent-1', - content: <>💻 온/오프라인을 가리지 않고 활발하게 참여하실 수 있는 분!, - }, - { - id: 'ios-talent-2', - content: <>🎁 새로운 기술과 새로운 제품을 참지 못하시는 분!, - }, - { - id: 'ios-talent-3', - content: <>🍺 남들과 어울려서 놀기 좋아하시는 분!, - }, - { - id: 'ios-talent-4', - content: <>🔥 동아리에 확실한 목표를 가지고 적극적으로 활동하실 분!, - }, - { - id: 'ios-talent-5', - content: <>🍎 iOS에 열정 넘치고 애플 아니면 안되는 사람!  (aka. 앱등이), - }, - ], - study: [ - { - id: 'ios-study-1', - content: <>✨ 매주 화요일 8시부터 2시간 동안 iOS 세미나를 진행해요(10주간), - }, - { - id: 'ios-study-2', - content: ( - <> - 🔥 세미나에서는 각 팀 혹은 개인이 발표하는 시간과 그 주제를 가지고 얘기하는 시간을 가져요 - - ), - }, - { - id: 'ios-study-3', - content: <>👨‍👧‍👦 3명이 한 팀이 되어 공부하고, 함께 프로젝트를 진행해요, - }, - ], - interview: [ - { - id: 'ios-interview-1', - content: '🗓 2월 4일(토), 2월 5일(일)', - }, - { - id: 'ios-interview-2', - content: '⏰ 오전 11시 ~ 오후 5시', - }, - ], - - questions: [ - { - id: 'ios-question-1', - title: { emoji: '🏃‍♀️', text: 'iOS팀은 어떤 활동을 진행하나요?' }, - content: [ - { - id: 'ios-question-1-1', - content: <>이번 Mash-Up iOS는 3명이 한 팀이 되어 스터디 및 프로젝트를 진행합니다., - }, - { - id: 'ios-question-1-2', - content: ( - <> - 스터디는 3명이 함께 주제를 정하여 깊이있게 탐구해보는 시간입니다. 이렇게 공부한 주제를 - 바탕으로 정해진 세미나 시간에 발표를 진행합니다. - - ), - }, - { - id: 'ios-question-1-3', - content: ( - <> - 프로젝트는 다른 플랫폼과 함께하여 하나의 앱을 개발하는 과정입니다. 스터디를 통해 - 공부해본 주제들을 프로젝트에 활용해볼 수 있습니다. - - ), - }, - { - id: 'ios-question-1-4', - content: <>이외에도 여러 친목 활동과 네트워킹을 가지는 자리가 있습니다., - }, - ], - }, - { - id: 'ios-question-2', - title: { emoji: '🧐', text: 'iOS로 개발해본 경험이 없이 지원해도 되나요?' }, - content: [ - { - id: 'ios-question-2-1', - content: ( - <> - iOS 개발 자체를 따로 스터디하는 시간은 없기 때문에, 기본적으로 swift 및 iOS를 사용할 - 줄 알아야합니다. 최소한 토이 프로젝트 하나를 완성해본 경험이 필요합니다. - - ), - }, - ], - }, - { - id: 'ios-question-3', - title: { emoji: '🛠', text: 'UIKit으로 개발하나요?' }, - content: [ - { - id: 'ios-question-3-1', - content: ( - <> - 프로젝트의 스펙은 스터디를 함께한 팀원들과 함께 상의 후 결정하게 됩니다. 그 동안 - 활용해보고 싶었거나 새롭게 도전해보고 싶었던 기술들을 적용해볼 수 있습니다. - - ), - }, - ], - }, - { - id: 'ios-question-4', - title: { emoji: '🫣', text: 'iOS 팀은 어떤 사람들이 모여있나요?' }, - content: [ - { - id: 'ios-question-4-1', - content: <>직장인 10명 (1~5년차), 학생 3명, - }, - { - id: 'ios-question-4-1', - content: <>나이 : 22~32세, - }, - { - id: 'ios-question-4-1', - content: <>iOS에 대한 열정이 넘치고 재밌는 사람들과 함께할 수 있어요, - }, - ], - }, - { - id: 'ios-question-5', - title: { emoji: '👨‍👧‍👦', text: '13기 iOS는 몇 명 뽑나요?' }, - content: [ - { - id: 'ios-question-5-1', - content: <>2~3명을 모집할 예정입니다., - }, - ], - }, - ], }; export default ios; diff --git a/src/constants/platform/node.tsx b/src/constants/platform/node.tsx index b6cea08..a27902e 100644 --- a/src/constants/platform/node.tsx +++ b/src/constants/platform/node.tsx @@ -15,158 +15,5 @@ const node = { color: '#1D1F22', emojis: [NodeLeftEmoji, NodeRightEmoji], }, - introduction: ( - <> - 안녕하세요!! -
- 일할 땐 일하고 놀 땐 놀자! 일일놀놀 노드팀입니다! -
- 저희는 다양한 사람들과 다양한 경험을 하며 어디서나 필요로 하는 인재가 되는 것을 지향합니다🤓 -
- 모르는 것을 모른다 말하고 알려고 노력하는 지적 솔직함을 지향합니다💻 -
- 하지만 일하기만 하는 사무적 관계는 No👊 놀기만 하는 관계도 No👊 -
- 서로의 성장와 재미 두 마리 토끼를 모두 잡는 것이 Node팀의 목표입니다!🔥🔥 -
- 여러분들을 Mash-Up Node팀으로 초대합니다! - - ), - talent: [ - { - id: 'node-talent-1', - content: <>😏 목표의식과 책임감이 강한 사람, - }, - { - id: 'node-talent-2', - content: <>🔥 도전에 대해 거부감이 없고 적극적인 사람, - }, - { - id: 'node-talent-3', - content: <>😎 Deep-Dive를 좋아하는 사람, - }, - { - id: 'node-talent-4', - content: <>💻 기술 얘기하는 걸 좋아하는 코딩 덕후, - }, - ], - study: [ - { - id: 'node-study-1', - content: <>⌨️ Typescript, - }, - { - id: 'node-study-2', - content: <>🐈 NestJS, - }, - { - id: 'node-study-3', - content: <>📖 공유하고 싶은 기술에 대한 자율 스터디, - }, - ], - interview: [ - { - id: 'node-interview-1', - content: '토요일, 일요일', - }, - { - id: 'node-interview-2', - content: '오전 10시 ~ 오후 6시', - }, - ], - questions: [ - { - id: 'node-question-1', - title: { text: '노드팀은 무엇을 하나요?' }, - content: [ - { - id: 'node-question-1-1', - content: ( - <>스터디로 함께 공부하고 기술적인 논의를 진행하며, 다 같이 공유하고 성장합니다. - ), - }, - { - id: 'node-question-1-2', - content: <>온/오프라인 모각코(모여서 각자 코딩)로 정기적으로 모이며 친목을 다집니다., - }, - { - id: 'node-question-1-3', - content: ( - <> - 스터디로만 끝나는 공부는 그만! 실력 있는 프론트엔드 개발자와 디자이너와 함께 멋진 - 프로젝트를 진행합니다. - - ), - }, - ], - }, - { - id: 'node-question-2', - title: { text: '스터디 진행방식은 어떻게 되나요?' }, - content: [ - { - id: 'node-question-2-1', - content: <>플랫폼 스터디와 자율 스터디를 진행합니다, - }, - { - id: 'node-question-2-2', - content: <>플랫폼 스터디, - subItems: [ - { - id: 'node-question-2-2-1', - content: <>정기적으로 진행되는 단체 스터디입니다., - }, - { - id: 'node-question-2-2-2', - content: <>한 달에 2번 정도씩 정해진 주제에 대해 다같이 스터디합니다., - }, - ], - }, - { - id: 'node-question-2-3', - content: <>자율 스터디, - subItems: [ - { - id: 'node-question-2-3-1', - content: ( - <> - 수요조사를 통해 마음이 맞는 사람들끼리 자율적으로 스터디를 진행하게 됩니다 - (Architecture, Design Pattern 등등..) - - ), - }, - { - id: 'node-question-2-3-2', - content: <>주제, 방법, 시간, 장소는 모두 스터디원들끼리 정하게 됩니다., - }, - ], - }, - ], - }, - { - id: 'node-question-3', - title: { text: '노드에 대해 얼마나 알아야 지원할 수 있나요?' }, - content: [ - { - id: 'node-question-3-1', - content: ( - <> - NodeJS 를 따로 스터디하는 시간은 없기 때문에, 기본적으로 NodeJS를 사용해본 경험이 - 있어야합니다! - - ), - }, - { - id: 'node-question-3-2', - content: ( - <> - NestJS 프레임워크를 사용하기 때문에 필수적인 건 아니지만, Express와 같은 서버 경험이나 - 타입스크립트 사용 경험이 있으면 스터디하기가 더 편할거에요. - - ), - }, - ], - }, - ], }; export default node; diff --git a/src/constants/platform/spring.tsx b/src/constants/platform/spring.tsx index 441c1f0..9071904 100644 --- a/src/constants/platform/spring.tsx +++ b/src/constants/platform/spring.tsx @@ -15,233 +15,5 @@ const spring = { color: '#0E3932', emojis: [SpringLeftEmoji, SpringRightEmoji], }, - introduction: ( - <> - Mash-Up의 열정의 Spring 팀은 학생부터 현직자까지 다양한 인원이 모여 활동하고 있습니다. -
- Spring 팀은 개발에 대한 열정을 통해 개발 지식을 공유하고 함께 고민하면서, 공동의 기술적 성장을 - 목표로 합니다. -
- 이러한 열정을 프로젝트, 세미나, 스터디를 통하여 실제로 행동에 옮기면서 개발자로서의 성장을 - 추구하고 있습니다! 🌱 -
- 개발 뿐 아니라, 놀 때도 최선을 다해 재미까지 챙기는 Spring 팀에서 열정적인 에너지를 전달하는 - 동료가 되어줄 개발자 분들을 기다리고 있습니다. - - ), - talent: [ - { - id: 'spring-talent-1', - content: <>📢 스프링 프로젝트를 통한 협업 경험이 있으신 분, - }, - { - id: 'spring-talent-2', - content: ( - <>📢 Mash-Up 활동(세미나/프로젝트/번개 등)에 뼈를 갈아넣을 수 있는 열정을 가지신 분 - ), - }, - { - id: 'spring-talent-3', - content: <>📢 개인뿐만 아닌 공동의 기술적 성장과 교류에 대해 “적극적인” 수다쟁이 , - }, - { - id: 'spring-talent-4', - content: <>📢 팀 활동에 “책임감”을 가지고 끝까지 완수하는 태도를 가지신 분, - }, - { - id: 'spring-talent-5', - content: <>📢 본인의 목표와 꿈에 대해 두려움없이 꾸준히 도전하시는 분, - }, - ], - study: [ - { - id: 'spring-study-1', - content: <>매주 스터디를 통해 공부한 주제 포스팅 및 발표 (주제는 함께 정해요!), - subItems: [ - { - id: 'spring-study-1-1', - content: <>📚 Spring, - }, - { - id: 'spring-study-1-2', - content: <>📚 Kotlin, 코루틴, - }, - { - id: 'spring-study-1-3', - content: <>📚 미들웨어 (Kafka, Redis), - }, - { - id: 'spring-study-1-4', - content: <>📚 아키텍처, 인프라, - }, - ], - }, - ], - interview: [ - { - id: 'spring-interview-1', - content: '토요일, 일요일', - }, - { - id: 'spring-interview-2', - content: '오전 10시 ~ 오후 6시', - }, - ], - questions: [ - { - id: 'spring-question-1', - title: { text: '프레임워크와 언어는 무엇을 사용하나요?' }, - content: [ - { - id: 'spring-question-1-1', - content: <>프레임워크는 당연히 스프링을 사용해요. 우리는 스프링 팀이니까요! 🌱, - }, - { - id: 'spring-question-1-2', - content: <>언어는 코틀린과 자바를 사용합니다., - }, - ], - }, - { - id: 'spring-question-2', - title: { text: '직장인 혹은 학생 지원 가능한가요? ' }, - content: [ - { - id: 'spring-question-2-1', - content: <>저희 매쉬업은 직장인과 학생 구분 없이 활동할 수 있어요!, - }, - { - id: 'spring-question-2-2', - content: ( - <> - 서버 개발 시 경험하지 못한 영역에 대하여 도전적으로 개발 할 수 있는 분이면 지원 - 가능합니다. - - ), - }, - { - id: 'spring-question-2-3', - content: <>직장인, - subItems: [ - { - id: 'spring-question-2-3-1', - content: <>일과 함께 동아리 활동을 병행하여 “빠지지 않고” 참여할 수 있는 분, - }, - { - id: 'spring-question-2-3-2', - content: <>프로젝트, 스터디 진행에 “적극적인” 참여가 가능하신 분, - }, - ], - }, - { - id: 'spring-question-2-4', - content: <>학생, - subItems: [ - { - id: 'spring-question-2-4-1', - content: <>부족한 부분을 스스로 공부하고 적극적으로 질문할 수 있는 분, - }, - { - id: 'spring-question-2-4-2', - content: <>경험이 많지 않더라도 도전정신을 갖고 열심히 참여하실 분, - }, - ], - }, - ], - }, - { - id: 'spring-question-3', - title: { text: '스프링을 얼마나 알아야 지원할 수 있나요?' }, - content: [ - { - id: 'spring-question-3-1', - content: ( - <> - 원활한 프로젝트, 세미나 진행과 기존 인원과의 실력차를 고려하여 스프링을 이용해 간단한 - 프로젝트라도 경험해보신 분을 모시려고 합니다. (세미나 시간에 교육 프로그램을 지원하지 - 않습니다) - - ), - }, - { - id: 'spring-question-3-2', - content: ( - <> - 물론 스프링에 대한 지식이 부족해도 괜찮아요. 😊 -
- 단, 의존적인 자세보다는 주도적인 자세를 가진 분이시면 좋겠어요! - - ), - }, - { - id: 'spring-question-3-3', - content: ( - <> - 언어는 코틀린 혹은 자바로 진행할 것이기 때문에 해당 언어를 다뤄보신 경험이 있으신 분을 - 우대하고 있어요! - - ), - }, - ], - }, - { - id: 'spring-question-4', - title: { text: '스프링팀 모임이나 세미나는 어떻게 진행되나요? ' }, - content: [ - { - id: 'spring-question-4-1', - content: ( - <> - 근황 토크를 시작으로 기술 세미나와 토론 및 스터디를 진행해요. -
- 또한, 경험해본 기술이나 겪었던 이슈에 대해 공유하며 다양한 이야기를 나누기도 하고, - 스터디 내용을 공유하는 시간을 갖기도 합니다. - - ), - }, - { - id: 'spring-question-4-2', - content: <>한 달에 2~3번 정도 격주로, 평일 혹은 주말에 Spring 세미나를 진행해요, - }, - { - id: 'spring-question-4-3', - content: ( - <> - 평일의 경우 온라인(Discord)으로, 주말의 경우 상황에 따라 온/오프라인 진행할 예정이에요 - - ), - }, - ], - }, - { - id: 'spring-question-5', - title: { text: '프로젝트 진행을 하게 되면 스프링은 무엇을 하나요? ' }, - content: [ - { - id: 'spring-question-5-1', - content: <>Client, Design, Server가 한 팀이 되어 프로젝트를 진행합니다., - }, - { - id: 'spring-question-5-2', - content: ( - <> - Mash-Up은 저희 모두가 기획자입니다. -
- 함께 팀원들과 기획적 아이디어를 제안하고 가다듬으며, 멋진 서비스를 완성해나가요 - - ), - }, - { - id: 'spring-question-5-3', - content: ( - <> - 프로젝트 팀에서 정한 서비스에 맞는 다양한 성격의 서버(API, Auth, Chatting, Batch, - Crawling...)를 만들 수도 있어요. - - ), - }, - ], - }, - ], }; export default spring; diff --git a/src/constants/platform/web.tsx b/src/constants/platform/web.tsx index 70110fa..be6ddd0 100644 --- a/src/constants/platform/web.tsx +++ b/src/constants/platform/web.tsx @@ -15,242 +15,6 @@ const web = { color: '#2F45B9', emojis: [WebLeftEmoji, WebRightEmoji], }, - introduction: ( - <> - 열정적이고 실력있는 현직자와 학생으로 이루어져 있는 Web팀을 아래의 세 문장으로 소개합니다! -
-
- 1️⃣ 다양한 플랫폼과의 협업을 통한 프로젝트에서 -
- 기본적으로 React를 활용하지만, 이 외에도 평소에 써보고 싶었던 또는 궁금했던 기술을 팀원들과의 - 협의 하에 자유롭게 시도할 수 있습니다. -
-
- 2️⃣ 함께 성장하고자 노력하기에 -
- 모든 팀원이 개발 관련된 고민이 있으면 함께 고민하고, 나만 알기 아까운 인사이트를 서로 - 공유하고, 정기 세미나에서의 기술 발표, 블로그 포스팅 작성, 각종 개발 행사 및 스터디 참여 등을 - 자유롭게 진행하며 서로에게 좋은 영향력을 행사하고 있습니다. -
-
- 3️⃣ 개발과 더불어 좋은 동료도 만들 수 있게끔 -
할 땐 확실히 하지만 놀 때도 누구보다 확실히 놀며 서로에게 좋은 동료이자 든든한 친구가 - 되어줍니다! -
-
- 올해 Web팀과 함께 함께 폭발적으로 성장하기를 갈구하는 모든 분들을 환영합니다. 👨‍👩‍👧‍👦🧡 - - ), - talent: [ - { - id: 'web-talent-1', - content: <>온/오프라인 가리지 않고 활발하게 소통하며 성실하게 참여할 사람, - }, - { - id: 'web-talent-2', - content: <>웹 생태계에 관심이 많고, Javascript에 진심인 사람, - }, - { - id: 'web-talent-3', - content: <>React를 사용해 프로젝트를 완수할 수 있는 기본 역량을 보유한 사람, - }, - { - id: 'web-talent-4', - content: <>최신 웹 기술 동향 및 인사이트에 대해 공유하고 네트워킹하는 것을 좋아하는 사람, - }, - { - id: 'web-talent-5', - content: <>책임감 있게 프로젝트를 끝까지 완수할 수 있는 사람, - }, - { - id: 'web-talent-6', - content: <>할 땐 하고 놀 땐 노는, 웹팀에 좋은 영향력을 행사할 수 있는 사람, - }, - ], - study: [ - { - id: 'web-study-1', - content: <>웹 접근성 케이스 스터디, - }, - { - id: 'web-study-2', - content: <>JavaScript, TypeScript 스터디, - }, - { - id: 'web-study-3', - content: <>CS 스터디 (네트워크, 알고리즘, 운영체제 등), - }, - { - id: 'web-study-4', - content: <>위 스터디 외에도 자유롭게 스터디 개설 가능, - }, - ], - interview: [ - { - id: 'web-interview-1', - content: '2월 4일 (토), 2월 5일(일)', - }, - { - id: 'web-interview-2', - content: '오전 10시 ~ 오후 6시', - }, - ], - - questions: [ - { - id: 'web-question-1', - title: { text: '웹팀은 주로 어떤 활동을 하나요?' }, - content: [ - { - id: 'web-question-1-1', - content: ( - <>Mash-Up 전체 세미나와 별도로 정기적인 온/오프라인을 통해 Web팀 세미나를 진행합니다! - ), - }, - { - id: 'web-question-1-2', - content: ( - <> - 번개 모각코나 모임이 많아요! 누구나 주최할 수 있고 참여할 수 있으니 원한다면 함께 해요 - 🥹💛 - - ), - }, - ], - }, - { - id: 'web-question-2', - title: { text: '세미나 진행은 어떻게 되나요?' }, - content: [ - { - id: 'web-question-2-1', - content: ( - <> - 기본적으로 모든 구성원이 한 번씩 돌아가며 자유 주제로 기술 발표를 진행합니다. 이전에는 - OpenAPI Specification, stale-while-revalidate, Module Federation 등의 주제로 발표가 - 진행됐었어요! - - ), - }, - { - id: 'web-question-2-2', - content: ( - <> - 활동 중 블로그 포스팅도 함께 진행할 예정이에요! 관심있는 주제, 흥미로운 기술 동향 등에 - 대한 글을 정리하고 공유하는 시간이 있을 예정입니다. - - ), - }, - { - id: 'web-question-2-3', - content: ( - <> - 간단한 근황 공유와 각자 개발하면서 쌓은 경험이나 노하우, 공부했던 라이브러리 등을 함께 - 이야기하며 공유하는 시간을 가져요! 이 외에도 개발과 관련된 주제라면 편하게 - 공유해주세요. 나누면 배가 돼요ㅎㅎ - - ), - }, - { - id: 'web-question-2-4', - content: ( - <> - 정기 세션이 끝나면 다함께 재미있고 유익한 액티비티나 다양한 활동을 할 예정이에요! - 선택적으로 참여하시면 됩니다. - - ), - }, - ], - }, - { - id: 'web-question-3', - title: { text: '스터디 진행은 어떻게 되나요?' }, - content: [ - { - id: 'web-question-3-1', - content: ( - <> - 누구나 하고 싶은 스터디를 주최할 수 있으며, 구성원들이 자유롭게 참여하는 형태로 진행할 - 계획입니다! 🥰 - - ), - }, - ], - }, - { - id: 'web-question-4', - title: { text: '리액트를 잘 몰라도 괜찮을까요?' }, - content: [ - { - id: 'web-question-4-1', - content: ( - <> - 프로젝트가 기본적으로 리액트를 사용해서 진행되기 때문에, 리액트로 작은 프로젝트라도 - 진행해본 경험이 있는 분을 우선해서 뽑을 예정입니다. - - ), - }, - ], - }, - { - id: 'web-question-5', - title: { text: '웹 팀은 어떤 사람들이 모여있나요?' }, - content: [ - { - id: 'web-question-5-1', - content: ( - <> - 대부분 실력있는 현직자들로 구성되어 있지만, 웹 분야를 열심히 공부하고 있는 학생도 - 있어요! 지금 하고 있는 업무나 나이에 상관없이 웹에 대한 열정이 넘치는 분이라면 누구나 - 함께할 수 있습니다~ 🎉 - - ), - }, - { - id: 'web-question-5-2', - content: ( - <> - 웹에 관심이 많고, 동아리 활동에 적극적으로 참여할 수 있는 열정 넘치는 분들을 - 기다립니다! 🍺 - - ), - }, - ], - }, - { - id: 'web-question-6', - title: { text: '웹 팀의 목표는 무엇인가요?' }, - content: [ - { - id: 'web-question-6-1', - content: ( - <> - 프로젝트를 성공적으로 배포해서 13기 활동에 성취감을 느낄 수 있는 웹 팀을 만들고 - 싶어요! - - ), - }, - { - id: 'web-question-6-2', - content: ( - <> - 혼자만 알기보단 다같이 공유하고 개발적으로 어려운 부분이 있다면 함께 해결해가고 - 싶어요. 우린 팀이니까요☺️ - - ), - }, - { - id: 'web-question-6-3', - content: ( - <> - 함께 성장하는 재미를 느낄 수 있는 매쉬업의 구성원이 되어 다양한 분야의 사람들과 협업해 - 보아요 - - ), - }, - ], - }, - ], }; export default web; From 4aee99868948f4ef20ff9eac7a7f545976bc293a Mon Sep 17 00:00:00 2001 From: Baek2back Date: Sun, 30 Jul 2023 04:44:54 +0900 Subject: [PATCH 02/11] =?UTF-8?q?Refactor:=20=EB=AF=B8=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=20=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=EB=A5=BC=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BulletedList/BulletedList.component.tsx | 46 ------------------- .../BulletedList/BulletedList.styled.ts | 25 ---------- src/components/common/index.ts | 1 - 3 files changed, 72 deletions(-) delete mode 100644 src/components/common/BulletedList/BulletedList.component.tsx delete mode 100644 src/components/common/BulletedList/BulletedList.styled.ts diff --git a/src/components/common/BulletedList/BulletedList.component.tsx b/src/components/common/BulletedList/BulletedList.component.tsx deleted file mode 100644 index 23e74a1..0000000 --- a/src/components/common/BulletedList/BulletedList.component.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import { forwardRef, ReactNode } from 'react'; -import * as Styled from './BulletedList.styled'; - -export interface Item { - id: string; - content: ReactNode; - subItems?: Item[]; -} - -interface BulletedListItemProps { - item: Item; - subItems?: Item[]; -} - -const BulletedListItem = ({ item, subItems }: BulletedListItemProps) => { - return ( - - {item.content} - {!subItems ? null : ( - - {subItems.map((subItem) => ( - - ))} - - )} - - ); -}; - -interface BulletedListProps { - items: Item[]; -} - -const BulletedList = forwardRef(({ items }, ref) => { - return ( - - {items.map((item) => ( - - ))} - - ); -}); - -BulletedList.displayName = 'BulletedList'; - -export default BulletedList; diff --git a/src/components/common/BulletedList/BulletedList.styled.ts b/src/components/common/BulletedList/BulletedList.styled.ts deleted file mode 100644 index 9839fcd..0000000 --- a/src/components/common/BulletedList/BulletedList.styled.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { css } from '@emotion/react'; -import styled from '@emotion/styled'; - -export const List = styled.ul` - ${({ theme }) => css` - ${theme.fonts.kr.medium16}; - margin-left: 2.4rem; - color: ${theme.colors.gray70}; - list-style-type: disc; - - & > * { - margin: 0.6rem 0; - } - `} -`; - -export const ListItem = styled.li` - &:first-of-type { - margin: 0; - } - - & > ul { - margin: 0.6rem 0 0 2.4rem; - } -`; diff --git a/src/components/common/index.ts b/src/components/common/index.ts index 42ba689..ea7750f 100644 --- a/src/components/common/index.ts +++ b/src/components/common/index.ts @@ -12,7 +12,6 @@ export { default as LabeledTextArea } from './LabeledTextArea/LabeledTextArea.co export { default as LabeledCheckbox } from './LabeledCheckbox/LabeledCheckbox.component'; export { default as Accordion } from './Accordion/Accordion.component'; export { default as MyPageTab } from './MyPageTab/MyPageTab.component'; -export { default as BulletedList } from './BulletedList/BulletedList.component'; export { default as LoadingModal } from './LoadingModal/LoadingModal.component'; export { default as SignInDialog } from './SignInDialog/SignInDialog.component'; export { default as InAppSignInDialog } from './InAppSignInDialog/InAppSignInDialog.component'; From 5a79061624a70e8f1503f53544c51b6a574cc825 Mon Sep 17 00:00:00 2001 From: Baek2back Date: Sun, 30 Jul 2023 04:45:26 +0900 Subject: [PATCH 03/11] =?UTF-8?q?Feat:=20=EC=96=B4=EB=93=9C=EB=AF=BC=20API?= =?UTF-8?q?=20=EB=A9=94=EC=84=9C=EB=93=9C=EB=A5=BC=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/services/admin.ts | 14 ++++++++++++++ src/types/dto/admin.ts | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/api/services/admin.ts b/src/api/services/admin.ts index b1f0255..f9b1998 100644 --- a/src/api/services/admin.ts +++ b/src/api/services/admin.ts @@ -19,6 +19,20 @@ class AdminApiService extends BaseApiService { .then(BaseApiService.handleResponse) .catch(BaseApiService.handleError); } + + public getFaqDataFromStorage({ + accessToken, + key, + }: StorageDataRequest): Promise { + return this.http + .get(`/storage/key/faq-${key}`, { + headers: { + Authorization: `Bearer ${accessToken}`, + }, + }) + .then(BaseApiService.handleResponse) + .catch(BaseApiService.handleError); + } } export default new AdminApiService(); diff --git a/src/types/dto/admin.ts b/src/types/dto/admin.ts index b601b3e..e477773 100644 --- a/src/types/dto/admin.ts +++ b/src/types/dto/admin.ts @@ -5,6 +5,6 @@ export interface StorageDataRequest extends BaseRequest { } export interface StorageDataResponseData { - valueMap: Record; + valueMap: Record; } export interface StorageDataResponse extends BaseResponse {} From 3b532e5f6f82c6af49182727a471fffdbd49d61d Mon Sep 17 00:00:00 2001 From: Baek2back Date: Sun, 30 Jul 2023 04:47:24 +0900 Subject: [PATCH 04/11] =?UTF-8?q?Refactor:=20=EC=BB=B4=ED=8F=AC=EB=84=8C?= =?UTF-8?q?=ED=8A=B8=20=EC=9D=B4=EB=A6=84=EC=9D=84=20=EB=B3=80=EA=B2=BD?= =?UTF-8?q?=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../FaqQuestionList.component.tsx | 21 ++++++++++++++++ .../FaqQuestionList.styled.ts} | 0 .../QuestionList/QuestionList.component.tsx | 24 ------------------ .../QuestionTitle/QuestionTitle.component.tsx | 15 ----------- .../faq/QuestionTitle/QuestionTitle.styled.ts | 25 ------------------- src/components/faq/index.ts | 3 +-- 6 files changed, 22 insertions(+), 66 deletions(-) create mode 100644 src/components/faq/FaqQuestionList/FaqQuestionList.component.tsx rename src/components/faq/{QuestionList/QuestionList.styled.ts => FaqQuestionList/FaqQuestionList.styled.ts} (100%) delete mode 100644 src/components/faq/QuestionList/QuestionList.component.tsx delete mode 100644 src/components/faq/QuestionTitle/QuestionTitle.component.tsx delete mode 100644 src/components/faq/QuestionTitle/QuestionTitle.styled.ts diff --git a/src/components/faq/FaqQuestionList/FaqQuestionList.component.tsx b/src/components/faq/FaqQuestionList/FaqQuestionList.component.tsx new file mode 100644 index 0000000..64cf3c6 --- /dev/null +++ b/src/components/faq/FaqQuestionList/FaqQuestionList.component.tsx @@ -0,0 +1,21 @@ +import { Accordion } from '@/components'; + +import { FaqQuestion } from '@/utils/faq/transformer'; +import * as Styled from './FaqQuestionList.styled'; + +interface FaqQuestionListProps { + questions: FaqQuestion[]; +} + +const FaqQuestionList = ({ questions }: FaqQuestionListProps) => { + return ( + + {questions.map(({ title, content }) => ( +
  • + +
  • + ))} +
    + ); +}; +export default FaqQuestionList; diff --git a/src/components/faq/QuestionList/QuestionList.styled.ts b/src/components/faq/FaqQuestionList/FaqQuestionList.styled.ts similarity index 100% rename from src/components/faq/QuestionList/QuestionList.styled.ts rename to src/components/faq/FaqQuestionList/FaqQuestionList.styled.ts diff --git a/src/components/faq/QuestionList/QuestionList.component.tsx b/src/components/faq/QuestionList/QuestionList.component.tsx deleted file mode 100644 index 3a3a891..0000000 --- a/src/components/faq/QuestionList/QuestionList.component.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { Accordion, QuestionTitle } from '@/components'; -import { Question } from '@/constants'; -import * as Styled from './QuestionList.styled'; - -interface QuestionListProps { - questions: Question[]; -} - -const QuestionList = ({ questions }: QuestionListProps) => { - return ( - - {questions.map(({ id, title, content }) => ( -
  • - } - content={content} - /> -
  • - ))} -
    - ); -}; -export default QuestionList; diff --git a/src/components/faq/QuestionTitle/QuestionTitle.component.tsx b/src/components/faq/QuestionTitle/QuestionTitle.component.tsx deleted file mode 100644 index f8f33d2..0000000 --- a/src/components/faq/QuestionTitle/QuestionTitle.component.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import * as Styled from './QuestionTitle.styled'; - -interface QuestionTitleProps { - emoji?: string; - text: string; -} - -const QuestionTitle = ({ emoji, text }: QuestionTitleProps) => { - return ( - - {text} - - ); -}; -export default QuestionTitle; diff --git a/src/components/faq/QuestionTitle/QuestionTitle.styled.ts b/src/components/faq/QuestionTitle/QuestionTitle.styled.ts deleted file mode 100644 index 5a95889..0000000 --- a/src/components/faq/QuestionTitle/QuestionTitle.styled.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { css } from '@emotion/react'; -import styled from '@emotion/styled'; - -export const Container = styled.div``; - -interface TitleProps { - emoji?: string; -} -export const Title = styled.span` - ${({ emoji }) => css` - display: flex; - - justify-content: space-between; - ${emoji && - css` - &:before { - display: flex; - align-items: center; - justify-content: center; - width: 2.4rem; - content: '${emoji}'; - } - `} - `} -`; diff --git a/src/components/faq/index.ts b/src/components/faq/index.ts index d698859..b86c2d5 100644 --- a/src/components/faq/index.ts +++ b/src/components/faq/index.ts @@ -1,7 +1,6 @@ export { default as FaqLayout } from './FaqLayout/FaqLayout.component'; export { default as SideNavigation } from './SideNavigation/SideNavigation.component'; export { default as FaqHeader } from './FaqHeader/FaqHeader.component'; -export { default as QuestionList } from './QuestionList/QuestionList.component'; +export { default as FaqQuestionList } from './FaqQuestionList/FaqQuestionList.component'; export { default as Navigation } from './Navigation/Navigation.component'; export { default as ModalNavigation } from './ModalNavigation/ModalNavigation.component'; -export { default as QuestionTitle } from './QuestionTitle/QuestionTitle.component'; From fea6ba7547f6cfe630a8257b88764b67abf81149 Mon Sep 17 00:00:00 2001 From: Baek2back Date: Sun, 30 Jul 2023 04:47:59 +0900 Subject: [PATCH 05/11] =?UTF-8?q?Refactor:=20API=20=EC=9D=91=EB=8B=B5=20?= =?UTF-8?q?=ED=83=80=EC=9E=85=EC=97=90=20=EB=94=B0=EB=9D=BC=20Props=20?= =?UTF-8?q?=ED=83=80=EC=9E=85=EC=9D=84=20=EB=B3=80=EA=B2=BD=ED=95=9C?= =?UTF-8?q?=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/Accordion/Accordion.component.tsx | 13 +++++------ .../common/Accordion/Accordion.styled.ts | 23 +++++++++++++++++++ 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/src/components/common/Accordion/Accordion.component.tsx b/src/components/common/Accordion/Accordion.component.tsx index 0c5fe47..1586baf 100644 --- a/src/components/common/Accordion/Accordion.component.tsx +++ b/src/components/common/Accordion/Accordion.component.tsx @@ -1,21 +1,20 @@ -import { ReactNode, useRef, useState } from 'react'; +import { useRef, useState } from 'react'; import Plus from '@/assets/svg/plus.svg'; import Minus from '@/assets/svg/minus.svg'; -import { BulletedList } from '@/components'; -import { Item } from '@/components/common/BulletedList/BulletedList.component'; + import * as Styled from './Accordion.styled'; interface AccordionProps { id: string; - title: ReactNode; - content: Item[]; + title: string; + content: string; headingTagName?: 'h2' | 'h3' | 'h4' | 'h5' | 'h6'; } const Accordion = ({ id, title, content, headingTagName = 'h3' }: AccordionProps) => { const [isExpanded, setIsExpanded] = useState(false); const panelRef = useRef(null); - const contentRef = useRef(null); + const contentRef = useRef(null); const handleClickButton = () => { if (!(panelRef.current && contentRef.current)) return; @@ -47,7 +46,7 @@ const Accordion = ({ id, title, content, headingTagName = 'h3' }: AccordionProps aria-labelledby={`header-${id}`} ref={panelRef} > - + ); diff --git a/src/components/common/Accordion/Accordion.styled.ts b/src/components/common/Accordion/Accordion.styled.ts index 9246e28..d0a6ede 100644 --- a/src/components/common/Accordion/Accordion.styled.ts +++ b/src/components/common/Accordion/Accordion.styled.ts @@ -51,3 +51,26 @@ export const Panel = styled.div` } `} `; + +export const ContentsContainer = styled.div` + ${({ theme }) => css` + ul { + ${theme.fonts.kr.medium16}; + margin-left: 2.4rem; + color: ${theme.colors.gray70}; + list-style-type: disc; + + & > * { + margin: 0.6rem 0; + } + } + + li:first-of-type { + margin: 0; + } + + li > ul { + margin: 0.6rem 0 0 2.4rem; + } + `} +`; From 6b74359feafe3c750c8fcc425979dd86222bacb0 Mon Sep 17 00:00:00 2001 From: Baek2back Date: Sun, 30 Jul 2023 04:51:30 +0900 Subject: [PATCH 06/11] =?UTF-8?q?Feat:=20editorjs=20=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=EB=A5=BC=20=EC=A7=88=EB=AC=B8=20=ED=98=95=EC=8B=9D?= =?UTF-8?q?=EC=97=90=20=EB=A7=9E=EA=B2=8C=20=EB=B3=80=ED=99=98=ED=95=9C?= =?UTF-8?q?=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/faq/[platformName].tsx | 167 +++++++---------------------------- src/utils/faq/transformer.ts | 44 +++++++++ 2 files changed, 76 insertions(+), 135 deletions(-) create mode 100644 src/utils/faq/transformer.ts diff --git a/pages/faq/[platformName].tsx b/pages/faq/[platformName].tsx index 61bcb7c..2c21727 100644 --- a/pages/faq/[platformName].tsx +++ b/pages/faq/[platformName].tsx @@ -2,142 +2,31 @@ import { FaqLayout, FaqHeader, SideNavigation, - QuestionList, + FaqQuestionList, ModalNavigation, SEO, } from '@/components'; +import { objectKeys } from '@/utils/object'; +import { adminApiService } from '@/api/services'; import { GetStaticPaths, GetStaticProps, NextPage } from 'next'; import { ParsedUrlQuery } from 'querystring'; import { useDetectViewPort } from '@/hooks'; -import { FAQ_COMMON_PAGE, PlatformKey, platformMap, VIEWPORT_SIZE } from '@/constants'; +import { + FAQ_COMMON_PAGE, + PlatformKey, + platformKeys, + platformMap, + VIEWPORT_SIZE, +} from '@/constants'; +import transformer, { FaqQuestion } from '@/utils/faq/transformer'; -const platformWithCommonMap = { +const faqPlatformMap = { ...platformMap, common: { name: '공통질문', path: { faq: FAQ_COMMON_PAGE, }, - questions: [ - { - id: 'common-question-1', - title: { text: '지원 마감시간은 언제인가요?' }, - content: [ - { - id: 'common-question-1-1', - content: ( - <> - 1월 25일(수) 오후 11시 59분 59초입니다. 마감 시간 안에 지원서 제출해주시길 바랍니다. - - ), - }, - ], - }, - { - id: 'common-question-2', - title: { text: '매쉬업은 언제 모임을 가지나요?' }, - content: [ - { - id: 'common-question-2-1', - content: ( - <> - Mash-Up은 격주 토요일 오후 2시 ~ 5시에 전체 세미나를 진행하며, 매주 평일 혹은 주말에 - 팀별 스터디가 이루어집니다. 자세한 사항은 페이지 우측 하단에 있는 채팅 상담을 통해 - 각 팀 스태프에게 문의해주세요. - - ), - }, - ], - }, - { - id: 'common-question-3', - title: { text: '모임은 온라인으로 진행되나요, 오프라인으로 진행되나요?' }, - content: [ - { - id: 'common-question-3-1', - content: ( - <> - 세미나 회차별로 상이합니다. 각 세미나별 온라인, 오프라인 여부 계획은 정해져있지만 - 상황에 따라 변동될 수 있습니다. - - ), - }, - ], - }, - { - id: 'common-question-4', - title: { text: '활동 기간은 얼마나 되나요?' }, - content: [ - { - id: 'common-question-4-1', - content: ( - <> - 13기의 경우 2월 11일을 시작으로 8월까지 약 6개월 정도 활동 할 예정입니다. -
    - 2기수 이상 활동을 권장하며 2기수 이상 활동 시 수료증을 발급해드립니다. - - ), - }, - ], - }, - { - id: 'common-question-5', - title: { text: '직장인 또는 대학생, 졸업생인데 참여 가능한가요?' }, - content: [ - { - id: 'common-question-5-1', - content: <>직장인은 물론 대학생, 졸업생, 만 19세 이상이라면 누구나 참여 가능합니다., - }, - ], - }, - { - id: 'common-question-6', - title: { text: '매쉬업에 가면 무엇을 하나요?' }, - content: [ - { - id: 'common-question-6-1', - content: ( - <> - 매쉬업은 팀별 스터디와 프로젝트를 진행하고 있습니다. 각 팀별로 스터디를 진행하고, - 원하시는 주제가 있으시다면 원하시는 스터디를 직접 주최하셔도 됩니다. 프로젝트는 실제 - 스타트업에서 일하는 방법처럼 기획부터 배포, 유지 보수까지 애자일하게 진행 할 - 예정이니 많은 지원 바랍니다. - - ), - }, - ], - }, - { - id: 'common-question-7', - title: { text: '회비 있나요?' }, - content: [ - { - id: 'common-question-7-1', - content: ( - <> - 네. 비용은 10만원으로 최대 3개월 분할납부가 가능합니다. 세미나 장소 대관 및 해커톤 - 진행 비용 등으로 사용되고 있으며 운영진이 내역을 기록하여 공개하고 있습니다. - - ), - }, - ], - }, - { - id: 'common-question-8', - title: { text: '중복지원이 가능한가요?' }, - content: [ - { - id: 'common-question-8-1', - content: ( - <> - 중복지원은 불가합니다. 팀별 지원서 임시저장은 가능하나, 최종 제출은 단 한 개의 - 지원서만 가능하다는 점 참고 부탁드립니다. - - ), - }, - ], - }, - ], }, }; @@ -147,11 +36,14 @@ interface Params extends ParsedUrlQuery { interface PlatformProps { platformName: PlatformKey | 'common'; + questions: FaqQuestion[]; } -const Platform: NextPage = ({ platformName }) => { +const Platform: NextPage = ({ platformName, questions }) => { const { size } = useDetectViewPort(); - const { name, questions, path } = platformWithCommonMap[platformName]; + + const { name, path } = faqPlatformMap[platformName]; + return ( = ({ platformName }) => { ) : ( )} - + ); }; export const getStaticPaths: GetStaticPaths = async () => { + const paths = [ + { params: { platformName: 'common' } } as const, + ...objectKeys(platformKeys).map((platformKey) => { + return { params: { platformName: platformKey } }; + }), + ]; + return { - paths: [ - { params: { platformName: 'common' } }, - { params: { platformName: 'ios' } }, - { params: { platformName: 'web' } }, - { params: { platformName: 'android' } }, - { params: { platformName: 'spring' } }, - { params: { platformName: 'design' } }, - { params: { platformName: 'node' } }, - ], + paths, fallback: false, }; }; @@ -187,9 +78,15 @@ export const getStaticPaths: GetStaticPaths = async () => { export const getStaticProps: GetStaticProps = async (context) => { const { platformName } = context.params!; + const { data } = await adminApiService.getFaqDataFromStorage({ + accessToken: process.env.ADMIN_TOKEN, + key: platformName, + }); + return { props: { platformName, + questions: transformer({ blocks: data.valueMap.editorData.blocks }), }, }; }; diff --git a/src/utils/faq/transformer.ts b/src/utils/faq/transformer.ts new file mode 100644 index 0000000..2188e80 --- /dev/null +++ b/src/utils/faq/transformer.ts @@ -0,0 +1,44 @@ +import editorjsHTML from 'editorjs-html'; + +type ListItem = { + content: string; + items: ListItem[]; +}; + +export type Block = { + type: 'header' | 'list' | 'delimiter'; + data: { + text?: string; + level?: number; + items?: string[] | ListItem[]; + }; +}; + +export type FaqQuestion = { + title: string; + content: string; +}; + +const parser = editorjsHTML(); + +const transformer = ({ blocks }: { blocks: Block[] }): FaqQuestion[] => { + return blocks + .reduce((acc, block) => { + if (block.type === 'header') { + return [...acc, [block]]; + } + if (block.type === 'list') { + return [...acc.slice(0, acc.length - 1), [...acc[acc.length - 1], block]]; + } + return acc; + }, [] as Block[][]) + .map(([headerBlock, listBlock]) => { + return [ + ['title', headerBlock.data.text], + ['content', parser.parseBlock(listBlock)], + ]; + }) + .map(Object.fromEntries) as FaqQuestion[]; +}; + +export default transformer; From a1e1e834942b8bd0b900e836d40269654451a031 Mon Sep 17 00:00:00 2001 From: Baek2back Date: Sun, 30 Jul 2023 04:54:37 +0900 Subject: [PATCH 07/11] =?UTF-8?q?Feat:=20HTML=20=EB=AC=B8=EC=9E=90?= =?UTF-8?q?=EC=97=B4=EC=97=90=20=EB=8C=80=ED=95=B4=20unescape=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=EB=A5=BC=20=EC=88=98=ED=96=89=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/utils/faq/transformer.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/utils/faq/transformer.ts b/src/utils/faq/transformer.ts index 2188e80..e17b02f 100644 --- a/src/utils/faq/transformer.ts +++ b/src/utils/faq/transformer.ts @@ -1,4 +1,5 @@ import editorjsHTML from 'editorjs-html'; +import { unescape } from 'lodash-es'; type ListItem = { content: string; @@ -35,7 +36,7 @@ const transformer = ({ blocks }: { blocks: Block[] }): FaqQuestion[] => { .map(([headerBlock, listBlock]) => { return [ ['title', headerBlock.data.text], - ['content', parser.parseBlock(listBlock)], + ['content', unescape(parser.parseBlock(listBlock))], ]; }) .map(Object.fromEntries) as FaqQuestion[]; From 363b2a6ac317a2ef3139fc6e119e44ae41d1401b Mon Sep 17 00:00:00 2001 From: Baek2back Date: Sat, 12 Aug 2023 16:09:13 +0900 Subject: [PATCH 08/11] =?UTF-8?q?Feat:=20=EC=A4=91=EC=B2=A9=20=EB=A6=AC?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=EC=97=90=20=EB=8C=80=ED=95=9C=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=EB=A5=BC=20=EC=88=98=ED=96=89=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/faq/[platformName].tsx | 3 ++- pages/recruit/[platformName].tsx | 4 +-- .../common/Accordion/Accordion.styled.ts | 14 +++++++++- src/utils/editorjs-html/index.ts | 26 +++++++++++++++++++ src/utils/faq/transformer.ts | 6 ++--- 5 files changed, 45 insertions(+), 8 deletions(-) create mode 100644 src/utils/editorjs-html/index.ts diff --git a/pages/faq/[platformName].tsx b/pages/faq/[platformName].tsx index 2c21727..c2bd96a 100644 --- a/pages/faq/[platformName].tsx +++ b/pages/faq/[platformName].tsx @@ -18,7 +18,8 @@ import { platformMap, VIEWPORT_SIZE, } from '@/constants'; -import transformer, { FaqQuestion } from '@/utils/faq/transformer'; +import transformer from '@/utils/faq/transformer'; +import type { FaqQuestion } from '@/utils/faq/transformer'; const faqPlatformMap = { ...platformMap, diff --git a/pages/recruit/[platformName].tsx b/pages/recruit/[platformName].tsx index cd6809f..48ecc5b 100644 --- a/pages/recruit/[platformName].tsx +++ b/pages/recruit/[platformName].tsx @@ -1,7 +1,7 @@ import { GetStaticPaths, GetStaticProps, NextPage } from 'next'; import { ParsedUrlQuery } from 'querystring'; import { PlatformKey, platformKeys, platformMap, platforms } from '@/constants'; -import editorjsHTML from 'editorjs-html'; +import parser from '@/utils/editorjs-html'; import { unescape, flow } from 'lodash-es'; import { RecruitHeader, @@ -80,7 +80,7 @@ export const getStaticProps: GetStaticProps = async (cont key: platformName, }); - const html = editorjsHTML() + const html = parser .parse(data.valueMap.editorData) .map(flow(removeWrongAmpString, unescape)) .join(''); diff --git a/src/components/common/Accordion/Accordion.styled.ts b/src/components/common/Accordion/Accordion.styled.ts index d0a6ede..0677cd7 100644 --- a/src/components/common/Accordion/Accordion.styled.ts +++ b/src/components/common/Accordion/Accordion.styled.ts @@ -65,11 +65,23 @@ export const ContentsContainer = styled.div` } } + ol { + ${theme.fonts.kr.medium16}; + margin-left: 2.4rem; + color: ${theme.colors.gray70}; + list-style-type: decimal; + + & > * { + margin: 0.6rem 0; + } + } + li:first-of-type { margin: 0; } - li > ul { + li > ul, + li > ol { margin: 0.6rem 0 0 2.4rem; } `} diff --git a/src/utils/editorjs-html/index.ts b/src/utils/editorjs-html/index.ts new file mode 100644 index 0000000..d0afdba --- /dev/null +++ b/src/utils/editorjs-html/index.ts @@ -0,0 +1,26 @@ +import editorjsHTML from 'editorjs-html'; +import type { block } from 'editorjs-html/build/transforms'; + +const listParser = ({ data }: block) => { + const listStyle = data.style === 'unordered' ? 'ul' : 'ol'; + + const recursor = (items: any, style: 'ul' | 'ol') => { + const list = items.map((item: any) => { + if (!item.content && !item.items) return `
  • ${item}
  • `; + + let value = ''; + if (item.items) value = recursor(item.items, style); + if (item.content) { + return `
  • ${item.content} ${value}
  • `; + } + return undefined; + }); + if (!list.length) return ''; + return `<${listStyle}>${list.join('')}`; + }; + return recursor(data.items, listStyle); +}; + +const parser = editorjsHTML({ list: listParser }); + +export default parser; diff --git a/src/utils/faq/transformer.ts b/src/utils/faq/transformer.ts index e17b02f..04970ff 100644 --- a/src/utils/faq/transformer.ts +++ b/src/utils/faq/transformer.ts @@ -1,4 +1,4 @@ -import editorjsHTML from 'editorjs-html'; +import parser from '@/utils/editorjs-html'; import { unescape } from 'lodash-es'; type ListItem = { @@ -7,7 +7,7 @@ type ListItem = { }; export type Block = { - type: 'header' | 'list' | 'delimiter'; + type: 'header' | 'list'; data: { text?: string; level?: number; @@ -20,8 +20,6 @@ export type FaqQuestion = { content: string; }; -const parser = editorjsHTML(); - const transformer = ({ blocks }: { blocks: Block[] }): FaqQuestion[] => { return blocks .reduce((acc, block) => { From fd8aaaf724871f529447673f21d97895626324fd Mon Sep 17 00:00:00 2001 From: Baek2back Date: Sat, 12 Aug 2023 16:22:44 +0900 Subject: [PATCH 09/11] =?UTF-8?q?Feat:=20=EC=9E=90=EC=A3=BC=EB=AC=BB?= =?UTF-8?q?=EB=8A=94=EC=A7=88=EB=AC=B8=20=ED=8E=98=EC=9D=B4=EC=A7=80?= =?UTF-8?q?=EC=97=90=20=EB=8C=80=ED=95=9C=20=EC=BA=90=EC=8B=B1=EC=9D=84=20?= =?UTF-8?q?24=EC=8B=9C=EA=B0=84=EC=9C=BC=EB=A1=9C=20=EC=84=A4=EC=A0=95?= =?UTF-8?q?=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/faq/[platformName].tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/pages/faq/[platformName].tsx b/pages/faq/[platformName].tsx index c2bd96a..6c28450 100644 --- a/pages/faq/[platformName].tsx +++ b/pages/faq/[platformName].tsx @@ -89,6 +89,7 @@ export const getStaticProps: GetStaticProps = async (cont platformName, questions: transformer({ blocks: data.valueMap.editorData.blocks }), }, + revalidate: 60 * 60 * 24, }; }; From d2bdbacb93c6bd0ffdfce950971f20aa8825844c Mon Sep 17 00:00:00 2001 From: Baek2back Date: Sat, 12 Aug 2023 16:38:20 +0900 Subject: [PATCH 10/11] =?UTF-8?q?Fix:=20=EC=A0=84=EB=8B=AC=ED=95=98?= =?UTF-8?q?=EB=8A=94=20prop=EC=9D=98=20=ED=83=80=EC=9E=85=EC=9D=84=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/common/Accordion/Accordion.stories.tsx | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/components/common/Accordion/Accordion.stories.tsx b/src/components/common/Accordion/Accordion.stories.tsx index 6d9b936..d475800 100644 --- a/src/components/common/Accordion/Accordion.stories.tsx +++ b/src/components/common/Accordion/Accordion.stories.tsx @@ -22,11 +22,6 @@ export const Default = Template.bind({}); Default.args = { id: '1', title: '노드에 대해 얼마나 알아야 지원할 수 있나요?', - content: [ - { - id: '1-1', - content: '많이 알아야 합니다!', - }, - ], + content: '많이 알아야 합니다!', headingTagName: 'h3', }; From e1bec892d275b10241a712c893f96e6b3f4b99a4 Mon Sep 17 00:00:00 2001 From: HaJunRyu Date: Thu, 21 Sep 2023 23:19:49 +0900 Subject: [PATCH 11/11] =?UTF-8?q?Feat:=2014=EA=B8=B0=20=EB=AA=A8=EC=A7=91?= =?UTF-8?q?=20=EC=98=88=EC=A0=95=EC=9D=BC=EC=9E=90=EB=A5=BC=2023=EB=85=84?= =?UTF-8?q?=2011=EC=9B=94=20->=2024=EB=85=84=201=EB=B6=84=EA=B8=B0?= =?UTF-8?q?=EB=A1=9C=20=EC=88=98=EC=A0=95=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../NotRecruitmentPeriod/NotRecruitmentPeriod.component.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/home/NotRecruitmentPeriod/NotRecruitmentPeriod.component.tsx b/src/components/home/NotRecruitmentPeriod/NotRecruitmentPeriod.component.tsx index 952e600..0e22ae9 100644 --- a/src/components/home/NotRecruitmentPeriod/NotRecruitmentPeriod.component.tsx +++ b/src/components/home/NotRecruitmentPeriod/NotRecruitmentPeriod.component.tsx @@ -19,7 +19,7 @@ const NotRecruitmentPeriod = ({ setIsOpenModal }: NotRecruitmentPeriodProps) => 지금은 모집 기간이 아니에요! - 다음 기수 모집 시작은{'\n'}23년 11월 이후로 예정되어 있습니다. + 다음 기수 모집 시작은{'\n'}24년 1분기로 예정되어 있습니다. 공식 홈페이지 바로가기