From df1f02fdefc52c3ef7ac003d6b39c8b05093407e Mon Sep 17 00:00:00 2001 From: Eden Date: Sat, 5 Oct 2024 10:34:12 +0900 Subject: [PATCH] =?UTF-8?q?Feat/#60=20=EB=A6=AC=EB=B7=B0=20=EC=B9=B4?= =?UTF-8?q?=ED=85=8C=EA=B3=A0=EB=A6=AC=20=EC=84=A0=ED=83=9D=ED=99=94?= =?UTF-8?q?=EB=A9=B4=EC=9D=84=20=EC=B6=94=EA=B0=80=ED=95=A9=EB=8B=88?= =?UTF-8?q?=EB=8B=A4.=20(#76)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * refactor: 리뷰 탭을 제거한다. * feat: 태그 스타일을 추가합니다. * refactor: 카테고리 스타일을 변경합니다. * feat: 리뷰 카테고리 선택화면을 추가합니다. * refactor: 주소에 맞게 페이지를 수정합니다. --- app/(app)/_layout.tsx | 36 +++---- .../{detail/[id] => [id]/detail}/index.tsx | 20 +++- .../{detail/[id] => [id]/detail}/style.ts | 0 app/(app)/project/[id]/review/_layout.tsx | 40 ++++++++ app/(app)/project/[id]/review/create.tsx | 93 +++++++++++++++++++ app/(app)/{ => project/[id]}/review/index.tsx | 6 +- app/(app)/project/_layout.tsx | 16 +++- app/(app)/project/delete.tsx | 13 --- app/(app)/review/_layout.tsx | 31 ------- app/(app)/review/create.tsx | 13 --- app/(app)/review/delete.tsx | 13 --- src/components/common/icon/fire-svg.tsx | 23 ----- .../onboarding/OnboardingSection/index.tsx | 45 ++------- .../project/ProjectDetail/index.tsx | 15 ++- src/components/project/ProjectItem/index.tsx | 3 +- .../QuestionnaireCheckList/index.tsx | 6 +- .../QuestionnaireCheckList/style.ts | 2 +- .../SelectCategoryChipList/index.tsx | 73 +++++++++++++++ .../SelectCategoryChipList/style.ts | 12 +++ .../questionnaire/category/index.tsx | 9 +- .../questionnaire/category/style.ts | 7 +- src/components/review/Tag/index.tsx | 16 +--- src/components/review/Tag/style.ts | 1 + src/constants/navigations.ts | 2 +- src/constants/siteUrls.ts | 8 ++ src/styles/category.ts | 36 +++---- src/styles/tag.ts | 56 +++++++++++ 27 files changed, 383 insertions(+), 212 deletions(-) rename app/(app)/project/{detail/[id] => [id]/detail}/index.tsx (76%) rename app/(app)/project/{detail/[id] => [id]/detail}/style.ts (100%) create mode 100644 app/(app)/project/[id]/review/_layout.tsx create mode 100644 app/(app)/project/[id]/review/create.tsx rename app/(app)/{ => project/[id]}/review/index.tsx (58%) delete mode 100644 app/(app)/project/delete.tsx delete mode 100644 app/(app)/review/_layout.tsx delete mode 100644 app/(app)/review/create.tsx delete mode 100644 app/(app)/review/delete.tsx delete mode 100644 src/components/common/icon/fire-svg.tsx create mode 100644 src/components/questionnaire/SelectCategoryChipList/index.tsx create mode 100644 src/components/questionnaire/SelectCategoryChipList/style.ts create mode 100644 src/styles/tag.ts diff --git a/app/(app)/_layout.tsx b/app/(app)/_layout.tsx index f361bb3..50463ee 100644 --- a/app/(app)/_layout.tsx +++ b/app/(app)/_layout.tsx @@ -5,7 +5,6 @@ import { Redirect, Tabs } from 'expo-router'; import React from 'react'; import { Text } from 'react-native'; -import FireSvg from '@/components/common/icon/fire-svg'; import Typography from '@/components/common/typography'; import type { MainNavigations } from '@/constants'; import { MAIN_NAVIGATIONS } from '@/constants'; @@ -13,6 +12,7 @@ import { SITE_URLS } from '@/constants'; import { useSession } from '@/store'; import { useOnboarding } from '@/store/useOnboarding'; import useTabBar from '@/store/useTabBar'; +import { flexDirectionRow, flexItemCenter } from '@/styles/common'; import { color } from '@/styles/theme'; const tabBarOptions = { @@ -36,15 +36,6 @@ const tabBarOptions = { /> ), }, - [MAIN_NAVIGATIONS.REVIEW]: { - label: '리뷰', - icon: (color: string) => ( - - ), - }, [MAIN_NAVIGATIONS.MY]: { label: '마이', icon: (color: string) => ( @@ -72,7 +63,7 @@ const TabBar = ({ state, descriptors, navigation }: BottomTabBarProps) => { const isFocused = state.index === index; - if (route.name === 'alarm' || typeof label === 'function') { + if (route.name === 'alarm' || typeof label === 'function' || !tabBarOptions[label]) { return null; } @@ -103,14 +94,13 @@ const TabBar = ({ state, descriptors, navigation }: BottomTabBarProps) => { accessibilityLabel={options.tabBarAccessibilityLabel} testID={options.tabBarTestID} onPress={onPress} - onLongPress={onLongPress} - style={{ flex: 1 }}> - {tabBarOptions[label].icon(isFocused ? '#000000' : '#cccccc')} - + onLongPress={onLongPress}> + {tabBarOptions[label].icon(isFocused ? color.Common['0'] : '#cccccc')} + {tabBarOptions[label].label} - + ); })} @@ -145,7 +135,6 @@ export default function Layout() { tabBar={(tabBar) => }> - ); @@ -153,9 +142,9 @@ export default function Layout() { const S = { TabBar: styled.View` + ${flexDirectionRow}; position: absolute; bottom: 0; - flex-direction: row; align-items: center; justify-content: space-between; width: 100%; @@ -163,8 +152,11 @@ const S = { background-color: white; `, TabBarItem: styled.TouchableOpacity` + ${flexItemCenter}; + flex: 1; gap: 4px; - align-items: center; - justify-content: center; + `, + TabBarText: styled(Typography)<{ $isFocused: boolean }>` + color: ${({ $isFocused }) => ($isFocused ? '#000000' : '#cccccc')}; `, }; diff --git a/app/(app)/project/detail/[id]/index.tsx b/app/(app)/project/[id]/detail/index.tsx similarity index 76% rename from app/(app)/project/detail/[id]/index.tsx rename to app/(app)/project/[id]/detail/index.tsx index ed6d998..349d1fe 100644 --- a/app/(app)/project/detail/[id]/index.tsx +++ b/app/(app)/project/[id]/detail/index.tsx @@ -1,16 +1,17 @@ import { Feather } from '@expo/vector-icons'; -import { useNavigation, useRouter } from 'expo-router'; +import { useLocalSearchParams, useNavigation, useRouter } from 'expo-router'; import { useLayoutEffect } from 'react'; import { Platform, Pressable } from 'react-native'; import { MOCK_PROJECT_DETAIL } from '@/__mock__/project'; import Typography from '@/components/common/typography'; import ProjectDetail from '@/components/project/ProjectDetail'; +import { PROJECT_URLS } from '@/constants'; import { color } from '@/styles/theme'; function Page() { const router = useRouter(); - // const { id } = useLocalSearchParams(); 실제 데이터로 올 경우 해당 id를 이용하여 조회 + const { id } = useLocalSearchParams<{ id: string }>(); const navigation = useNavigation(); const data = MOCK_PROJECT_DETAIL; @@ -37,7 +38,7 @@ function Page() { ), headerRight: () => Platform.OS !== 'web' ? ( - router.push('/project/create')}> + router.push(PROJECT_URLS.PROJECT_CREATE)}> ) : null, }); - }, [navigation]); + }, [data.name, navigation, router]); - return ; + if (!id) { + return null; + } + + return ( + + ); } export default Page; diff --git a/app/(app)/project/detail/[id]/style.ts b/app/(app)/project/[id]/detail/style.ts similarity index 100% rename from app/(app)/project/detail/[id]/style.ts rename to app/(app)/project/[id]/detail/style.ts diff --git a/app/(app)/project/[id]/review/_layout.tsx b/app/(app)/project/[id]/review/_layout.tsx new file mode 100644 index 0000000..c40314e --- /dev/null +++ b/app/(app)/project/[id]/review/_layout.tsx @@ -0,0 +1,40 @@ +import { Feather } from '@expo/vector-icons'; +import { Stack, useRouter } from 'expo-router'; +import { Pressable } from 'react-native'; + +import { PROJECT_URLS, REVIEW_NAVIGATIONS } from '@/constants'; +import { color } from '@/styles/theme'; + +function Layout() { + const router = useRouter(); + return ( + ({ + headerStyle: { height: 40, backgroundColor: color.Background.Normal }, + headerTitleStyle: { + paddingTop: 12, + fontFamily: 'Pretendard-Bold', + }, + headerTitleAlign: 'center', + headerShadowVisible: false, + })}> + ( + (canGoBack ? router.back() : router.push(PROJECT_URLS.PROJECT_HOME))}> + + + ), + }} + /> + + ); +} + +export default Layout; diff --git a/app/(app)/project/[id]/review/create.tsx b/app/(app)/project/[id]/review/create.tsx new file mode 100644 index 0000000..bd8edc3 --- /dev/null +++ b/app/(app)/project/[id]/review/create.tsx @@ -0,0 +1,93 @@ +import styled from '@emotion/native'; +import { useCallback, useState } from 'react'; + +import SolidButton from '@/components/common/button/SolidButton'; +import Typography from '@/components/common/typography'; +import SelectCategoryChipList from '@/components/questionnaire/SelectCategoryChipList'; +import { useTabBarEffect } from '@/hooks'; +import { flexDirectionColumn } from '@/styles/common'; + +const MINIMUM_CATEGORY_COUNT = 5; + +function Review() { + useTabBarEffect(); + // const { id } = useLocalSearchParams<{ id: string }>(); + + const [error, setError] = useState(null); + const [selectedCategoryList, setSelectedCategoryList] = useState([]); + + const addCategory = (category: string) => { + if (error) { + setError(null); + } + setSelectedCategoryList([...selectedCategoryList, category]); + }; + const removeCategory = (category: string) => + setSelectedCategoryList(selectedCategoryList.filter((item) => item !== category)); + + const selectCategory = useCallback(() => { + if (selectedCategoryList.length < MINIMUM_CATEGORY_COUNT) { + setError('5개를 선택해주세요'); + return; + } + setError(null); + }, [selectedCategoryList]); + + return ( + + + + + 받고 싶은 리뷰의{`\n`}카테고리 5개를 골라주세요 + + + 카테고리 별로 설문이 구성돼요 + + + + + + + + 다음 + + + ); +} + +const S = { + Container: styled.SafeAreaView` + flex: 1; + gap: 32px; + justify-content: space-between; + padding: 33px 20px 52px; + background: ${({ theme }) => theme.color.Background.Normal}; + `, + WrapperBox: styled.View` + ${flexDirectionColumn}; + gap: 32px; + `, + ReviewTitle: styled.View` + ${flexDirectionColumn}; + gap: 8px; + `, + TitleText: styled(Typography)` + color: ${({ theme }) => theme.color.Label.Normal}; + `, + SubTitleText: styled(Typography)` + color: ${({ theme }) => theme.color.Label.Alternative}; + `, +}; + +export default Review; diff --git a/app/(app)/review/index.tsx b/app/(app)/project/[id]/review/index.tsx similarity index 58% rename from app/(app)/review/index.tsx rename to app/(app)/project/[id]/review/index.tsx index 7a5fbca..538fe70 100644 --- a/app/(app)/review/index.tsx +++ b/app/(app)/project/[id]/review/index.tsx @@ -2,12 +2,12 @@ import { View } from 'react-native'; import Typography from '@/components/common/typography'; -function Review() { +function Page() { return ( - Review + Page ); } -export default Review; +export default Page; diff --git a/app/(app)/project/_layout.tsx b/app/(app)/project/_layout.tsx index c3a07d6..40eebcf 100644 --- a/app/(app)/project/_layout.tsx +++ b/app/(app)/project/_layout.tsx @@ -1,9 +1,10 @@ import { AntDesign, Feather } from '@expo/vector-icons'; import { Stack, useRouter } from 'expo-router'; -import { Platform, Pressable } from 'react-native'; +import { Pressable } from 'react-native'; -import { PROJECT_NAVIGATIONS } from '@/constants'; +import { PROJECT_NAVIGATIONS, PROJECT_URLS } from '@/constants'; import { color } from '@/styles/theme'; +import { isMobile } from '@/utils'; import * as S from './style'; @@ -32,8 +33,8 @@ function Layout() { size={24} /> - {Platform.OS !== 'web' && ( - router.push('/project/create')}> + {isMobile && ( + router.push(PROJECT_URLS.PROJECT_CREATE)}> ( - (canGoBack ? router.back() : router.push('/project'))}> + (canGoBack ? router.back() : router.push(PROJECT_URLS.PROJECT_HOME))}> + ); } diff --git a/app/(app)/project/delete.tsx b/app/(app)/project/delete.tsx deleted file mode 100644 index 06e96ab..0000000 --- a/app/(app)/project/delete.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import { View } from 'react-native'; - -import Typography from '@/components/common/typography'; - -function Delete() { - return ( - - Delete - - ); -} - -export default Delete; diff --git a/app/(app)/review/_layout.tsx b/app/(app)/review/_layout.tsx deleted file mode 100644 index 284e9b6..0000000 --- a/app/(app)/review/_layout.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import { Stack } from 'expo-router'; -import { fontFace } from 'polished'; - -function Layout() { - return ( - - - - - ); -} - -export default Layout; diff --git a/app/(app)/review/create.tsx b/app/(app)/review/create.tsx deleted file mode 100644 index 9b11115..0000000 --- a/app/(app)/review/create.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import { View } from 'react-native'; - -import Typography from '@/components/common/typography'; - -function Create() { - return ( - - Create - - ); -} - -export default Create; diff --git a/app/(app)/review/delete.tsx b/app/(app)/review/delete.tsx deleted file mode 100644 index 06e96ab..0000000 --- a/app/(app)/review/delete.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import { View } from 'react-native'; - -import Typography from '@/components/common/typography'; - -function Delete() { - return ( - - Delete - - ); -} - -export default Delete; diff --git a/src/components/common/icon/fire-svg.tsx b/src/components/common/icon/fire-svg.tsx deleted file mode 100644 index bfa205b..0000000 --- a/src/components/common/icon/fire-svg.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import Svg, { Path } from 'react-native-svg'; - -type Props = { - size: number; - color: string; -}; - -function FireSvg({ size, color }: Props) { - return ( - - - - ); -} - -export default FireSvg; diff --git a/src/components/onboarding/OnboardingSection/index.tsx b/src/components/onboarding/OnboardingSection/index.tsx index 5ec4a7c..22836fc 100644 --- a/src/components/onboarding/OnboardingSection/index.tsx +++ b/src/components/onboarding/OnboardingSection/index.tsx @@ -14,42 +14,15 @@ function OnboardingSection({ step }: Props) { case 0: return ( - - - - - - - - - + + + + + + + + + ); case 1: diff --git a/src/components/project/ProjectDetail/index.tsx b/src/components/project/ProjectDetail/index.tsx index 7524fd4..a36c6b5 100644 --- a/src/components/project/ProjectDetail/index.tsx +++ b/src/components/project/ProjectDetail/index.tsx @@ -1,10 +1,11 @@ import { AntDesign } from '@expo/vector-icons'; +import { router } from 'expo-router'; import { ScrollView } from 'react-native'; import SolidButton from '@/components/common/button/SolidButton'; import SlideBar from '@/components/common/slide-bar'; import Typography from '@/components/common/typography'; -import { COMPONENT_SIZE } from '@/constants'; +import { COMPONENT_SIZE, PROJECT_URLS } from '@/constants'; import { shadow } from '@/styles/shadow'; import { color } from '@/styles/theme'; import { getSize } from '@/utils'; @@ -18,6 +19,7 @@ export type ProjectDetailType = { profile: string; startDate: string; endDate: string; + hasReviewCard: boolean; review_count: number; userList: UserType[]; link: string; @@ -29,10 +31,11 @@ type UserType = { }; type Props = { + id: string; data: ProjectDetailType; }; -function ProjectDetail({ data }: Props) { +function ProjectDetail({ id, data }: Props) { return ( - 설문지 만들기 + + router.push({ pathname: PROJECT_URLS.PROJECT_REVIEW_CREATE, params: { id } }) + } + full> + 설문지 만들기 + ); diff --git a/src/components/project/ProjectItem/index.tsx b/src/components/project/ProjectItem/index.tsx index 746b1ed..e63997d 100644 --- a/src/components/project/ProjectItem/index.tsx +++ b/src/components/project/ProjectItem/index.tsx @@ -4,6 +4,7 @@ import SlideBar from '@/components/common/slide-bar'; import Typography from '@/components/common/typography'; import ProjectImage from '@/components/project/ProjectImage'; import type { ProjectItemType } from '@/components/project/ProjectList'; +import { PROJECT_URLS } from '@/constants'; import { color } from '@/styles/theme'; import * as S from './style'; @@ -13,7 +14,7 @@ function ProjectItem({ name, member_num, profile, review_count, id }: ProjectIte return ( router.push({ pathname: '/project/detail/[id]', params: { id } })}> + onPress={() => router.push({ pathname: PROJECT_URLS.PROJECT_DETAIL, params: { id } })}> ) { const { checkValue, setCheckValue } = useContext(ListContext); const isChecked = checkValue === value; return ( - + setCheckValue(value)} + $isChecked={isChecked}> {children} - setCheckValue(value)}> + css` border: 1px solid ${theme.color.Primary.Normal}; `; -export const ItemContainer = styled.View<{ $isChecked: boolean }>` +export const ItemContainer = styled.Pressable<{ $isChecked: boolean }>` display: flex; flex-direction: row; align-items: center; diff --git a/src/components/questionnaire/SelectCategoryChipList/index.tsx b/src/components/questionnaire/SelectCategoryChipList/index.tsx new file mode 100644 index 0000000..2a53ed9 --- /dev/null +++ b/src/components/questionnaire/SelectCategoryChipList/index.tsx @@ -0,0 +1,73 @@ +import ErrorText from '@/components/common/error-text'; +import Category from '@/components/questionnaire/category'; + +import * as S from './style'; + +type Props = { + item: string[]; + addItem: (item: string) => void; + removeItem: (item: string) => void; + error: string | null; +}; + +function SelectCategoryChipList({ item, addItem, removeItem, error }: Props) { + const isActive = (category: string) => item.includes(category); + return ( + + + (isActive('기술') ? removeItem('기술') : addItem('기술'))} + /> + (isActive('성실성') ? removeItem('성실성') : addItem('성실성'))} + /> + (isActive('배려심') ? removeItem('배려심') : addItem('배려심'))} + /> + + isActive('아이데이션') ? removeItem('아이데이션') : addItem('아이데이션') + } + /> + (isActive('문서화') ? removeItem('문서화') : addItem('문서화'))} + /> + (isActive('문제해결') ? removeItem('문제해결') : addItem('문제해결'))} + /> + (isActive('리더십') ? removeItem('리더십') : addItem('리더십'))} + /> + (isActive('팔로워십') ? removeItem('팔로워십') : addItem('팔로워십'))} + /> + + isActive('커뮤니케이션') ? removeItem('커뮤니케이션') : addItem('커뮤니케이션') + } + /> + + {error && } + + ); +} + +export default SelectCategoryChipList; diff --git a/src/components/questionnaire/SelectCategoryChipList/style.ts b/src/components/questionnaire/SelectCategoryChipList/style.ts new file mode 100644 index 0000000..0023927 --- /dev/null +++ b/src/components/questionnaire/SelectCategoryChipList/style.ts @@ -0,0 +1,12 @@ +import styled from '@emotion/native'; + +import { flexDirectionColumn } from '@/styles/common'; + +export const Container = styled.View` + ${flexDirectionColumn}; + gap: 12px; +`; +export const Wrapper = styled.View` + flex-flow: row wrap; + gap: 8px; +`; diff --git a/src/components/questionnaire/category/index.tsx b/src/components/questionnaire/category/index.tsx index 555488a..23910ad 100644 --- a/src/components/questionnaire/category/index.tsx +++ b/src/components/questionnaire/category/index.tsx @@ -1,4 +1,5 @@ import { memo } from 'react'; +import type { PressableProps } from 'react-native'; import CategoryIcon from '@/components/common/icon/category-icon'; import Typography from '@/components/common/typography'; @@ -15,20 +16,20 @@ type Props = { hasIcon?: boolean; hasShadow?: boolean; category: CategoryType; -}; +} & PressableProps; function Category({ category, - onboarding = false, hasIcon = true, isActive = false, hasShadow = false, + ...rest }: Props) { return ( + style={hasShadow && shadow[2]} + {...rest}> {hasIcon && ( diff --git a/src/components/questionnaire/category/style.ts b/src/components/questionnaire/category/style.ts index 8e5bd52..e18e1d3 100644 --- a/src/components/questionnaire/category/style.ts +++ b/src/components/questionnaire/category/style.ts @@ -3,19 +3,18 @@ import styled from '@emotion/native'; import { flexDirectionRowItemsCenter } from '@/styles/common'; -export const Container = styled.View<{ - $onboarding: boolean; +export const Container = styled.Pressable<{ $isActive: ReactNativeStyle | boolean; }>` box-sizing: border-box; ${({ $isActive }) => $isActive && $isActive} ${flexDirectionRowItemsCenter}; gap: 6px; + align-self: flex-start; width: fit-content; height: 48px; padding: 12px 16px; - background: ${({ theme, $isActive, $onboarding }) => - $onboarding ? theme.color.Background.Normal : !$isActive && theme.color.Background.Alternative}; + background: ${({ theme, $isActive }) => !$isActive && theme.color.Background.Alternative}; border: ${({ theme, $isActive }) => !$isActive && `1px solid ${theme.color.Background.Alternative}`}; border-radius: 4px; diff --git a/src/components/review/Tag/index.tsx b/src/components/review/Tag/index.tsx index 53c24d6..0f0b695 100644 --- a/src/components/review/Tag/index.tsx +++ b/src/components/review/Tag/index.tsx @@ -1,24 +1,12 @@ import CategoryIcon from '@/components/common/icon/category-icon'; import Typography from '@/components/common/typography'; -import { CategoryStyle } from '@/styles/category'; import { shadow } from '@/styles/shadow'; +import { TagEnum, TagStyle } from '@/styles/tag'; import { color } from '@/styles/theme'; import type { CategoryType } from '@/types/category'; import * as S from './style'; -enum TagEnum { - '걸어다니는 위키' = '기술', - '아이디어 화수분' = '아이데이션', - '글도 잘쓰는 일잘러' = '문서화', - '확신의 J' = '문제해결', - '책임감 넘치는 리더' = '리더십', - '책임감 넘치는 팀원' = '팔로워십', - '갈등을 못참는 박애주의자' = '커뮤니케이션', - '성실함의 아이콘' = '성실성', - '몸에 밴 배려' = '배려심', -} - type Props = { tag: keyof typeof TagEnum; hasIcon?: boolean; @@ -30,7 +18,7 @@ function Tag({ tag, hasIcon = true, isActive = false, hasShadow = false }: Props const category: CategoryType = TagEnum[tag]; return ( {hasIcon && ( diff --git a/src/components/review/Tag/style.ts b/src/components/review/Tag/style.ts index 6f21249..b91f7c4 100644 --- a/src/components/review/Tag/style.ts +++ b/src/components/review/Tag/style.ts @@ -10,6 +10,7 @@ export const Container = styled.View<{ ${({ $isActive }) => $isActive && $isActive} ${flexDirectionRowItemsCenter}; gap: 6px; + align-items: flex-start; width: fit-content; height: 48px; padding: 12px 16px; diff --git a/src/constants/navigations.ts b/src/constants/navigations.ts index 55f8359..29db173 100644 --- a/src/constants/navigations.ts +++ b/src/constants/navigations.ts @@ -1,7 +1,6 @@ export const MAIN_NAVIGATIONS = { HOME: 'index', PROJECT: 'project', - REVIEW: 'review', MY: 'my', } as const; @@ -17,6 +16,7 @@ export const PROJECT_NAVIGATIONS = { HOME: 'index', CREATE: 'create', DELETE: 'delete', + REVIEW: '[id]/review', }; export const REVIEW_NAVIGATIONS = { diff --git a/src/constants/siteUrls.ts b/src/constants/siteUrls.ts index 5b26eae..0ec51ff 100644 --- a/src/constants/siteUrls.ts +++ b/src/constants/siteUrls.ts @@ -3,3 +3,11 @@ export const SITE_URLS = { SIGN_IN: '/sign-in', ON_BOARDING: '/onboarding', } as const; + +export const PROJECT_URLS = { + PROJECT_HOME: '/project', + PROJECT_CREATE: '/project/create', + PROJECT_DETAIL: '/project/[id]/detail', + PROJECT_REVIEW: '/project/[id]/review', + PROJECT_REVIEW_CREATE: '/project/[id]/review/create', +} as const; diff --git a/src/styles/category.ts b/src/styles/category.ts index 1bb7f79..3bf0823 100644 --- a/src/styles/category.ts +++ b/src/styles/category.ts @@ -6,39 +6,39 @@ import type { CategoryType } from '@/types/category'; export const CategoryStyle: Record = { 기술: css` - background: ${color.Blue['95']}; - border: 1px solid ${color.Blue['90']}; + background: ${color.Blue['99']}; + border: 1px solid ${color.Blue['55']}; `, 성실성: css` - background: ${color.Pink['95']}; - border: 1px solid ${color.Pink['90']}; + background: ${color.Pink['99']}; + border: 1px solid ${color.Pink['50']}; `, 아이데이션: css` - background: ${color.Orange['95']}; - border: 1px solid ${color.Orange['90']}; + background: ${color.Orange['99']}; + border: 1px solid ${color.Orange['50']}; `, 문서화: css` - background: ${color.Red['95']}; - border: 1px solid ${color.Red['90']}; + background: ${color.Red['99']}; + border: 1px solid ${color.Red['50']}; `, 커뮤니케이션: css` - background: ${color.LightBlue['95']}; - border: 1px solid ${color.LightBlue['90']}; + background: ${color.LightBlue['99']}; + border: 1px solid ${color.LightBlue['50']}; `, 문제해결: css` - background: ${color.Violet['95']}; - border: 1px solid ${color.Violet['90']}; + background: ${color.Violet['99']}; + border: 1px solid ${color.Violet['50']}; `, 리더십: css` - background: #e6fad9; - border: 1px solid #c3f0a3; + background: #f7fff1; + border: 1px solid #93ec67; `, 배려심: css` - background: ${color.Purple['95']}; - border: 1px solid ${color.Purple['90']}; + background: ${color.Purple['99']}; + border: 1px solid ${color.Purple['50']}; `, 팔로워십: css` - background: #d9fade; - border: 1px solid #a3f0b8; + background: #edfff0; + border: 1px solid #4af377; `, } as const; diff --git a/src/styles/tag.ts b/src/styles/tag.ts new file mode 100644 index 0000000..e9abd5f --- /dev/null +++ b/src/styles/tag.ts @@ -0,0 +1,56 @@ +import type { ReactNativeStyle } from '@emotion/native'; +import { css } from '@emotion/native'; + +import { color } from '@/styles/theme'; +import type { CategoryType } from '@/types/category'; + +export enum TagEnum { + '걸어다니는 위키' = '기술', + '아이디어 화수분' = '아이데이션', + '글도 잘쓰는 일잘러' = '문서화', + '확신의 J' = '문제해결', + '책임감 넘치는 리더' = '리더십', + '책임감 넘치는 팀원' = '팔로워십', + '갈등을 못참는 박애주의자' = '커뮤니케이션', + '성실함의 아이콘' = '성실성', + '몸에 밴 배려' = '배려심', +} + +export const TagStyle: Record = { + 기술: css` + background: ${color.Blue['95']}; + border: 1px solid ${color.Blue['90']}; + `, + 성실성: css` + background: ${color.Pink['95']}; + border: 1px solid ${color.Pink['90']}; + `, + 아이데이션: css` + background: ${color.Orange['95']}; + border: 1px solid ${color.Orange['90']}; + `, + 문서화: css` + background: ${color.Red['95']}; + border: 1px solid ${color.Red['90']}; + `, + 커뮤니케이션: css` + background: ${color.LightBlue['95']}; + border: 1px solid ${color.LightBlue['90']}; + `, + 문제해결: css` + background: ${color.Violet['95']}; + border: 1px solid ${color.Violet['90']}; + `, + 리더십: css` + background: #e6fad9; + border: 1px solid #c3f0a3; + `, + 배려심: css` + background: ${color.Purple['95']}; + border: 1px solid ${color.Purple['90']}; + `, + 팔로워십: css` + background: #d9fade; + border: 1px solid #a3f0b8; + `, +} as const;