규칙
12 |-
13 | {rules?.map((rule, index) => (
14 |
-
15 |
16 | {rule} 17 |
18 | ))}
19 |
= NextPage
& { 6 | getLayout?: (page: ReactElement) => ReactNode; 7 | }; 8 | -------------------------------------------------------------------------------- /src/shared/utils/emoji.ts: -------------------------------------------------------------------------------- 1 | import { EmojiType } from '@/shared/types/feed'; 2 | 3 | export function createEmojiInfo( 4 | type: EmojiType, 5 | count: number, 6 | selected: EmojiType | null, 7 | ) { 8 | return { 9 | type, 10 | count, 11 | selected: selected === type, 12 | }; 13 | } 14 | -------------------------------------------------------------------------------- /src/mocks/index.ts: -------------------------------------------------------------------------------- 1 | async function initMocks() { 2 | if (typeof window === 'undefined') { 3 | const { server } = await import('./server'); 4 | server.listen(); 5 | } else { 6 | const { worker } = await import('./browser'); 7 | worker.start(); 8 | } 9 | } 10 | 11 | initMocks(); 12 | 13 | export {}; 14 | -------------------------------------------------------------------------------- /public/svgs/icon-cancel.svg: -------------------------------------------------------------------------------- 1 | 7 | -------------------------------------------------------------------------------- /src/shared/components/loading/ComponentLoading.tsx: -------------------------------------------------------------------------------- 1 | import { IconLoading } from '@/public/svgs'; 2 | 3 | export const ComponentLoading = () => { 4 | return ( 5 |
{date}
10 | ); 11 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 80, 3 | "tabWidth": 2, 4 | "semi": true, 5 | "singleQuote": true, 6 | "trailingComma": "all", 7 | "arrowParens": "always", 8 | "bracketSpacing": true, 9 | "jsxBracketSameLine": false, 10 | "plugins": [ 11 | "prettier-plugin-tailwindcss" 12 | ], 13 | "tailwindFunctions": ["cva", "clsx"] 14 | } 15 | -------------------------------------------------------------------------------- /makefile: -------------------------------------------------------------------------------- 1 | DOCKER_IMAGE_NAME=jaringobi 2 | DOCKER_IMAGE_TAG=latest 3 | 4 | docker-build: 5 | docker build . -t $(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_TAG) 6 | 7 | docker-rebuild: 8 | docker build . -t $(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_TAG) --no-cache 9 | 10 | docker-run: 11 | docker run -d -it --rm -p 3000:3000 $(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_TAG) 12 | 13 | -------------------------------------------------------------------------------- /src/shared/components/loading/PageLoading.tsx: -------------------------------------------------------------------------------- 1 | import { IconLoading } from '@/public/svgs'; 2 | 3 | export const PageLoading = () => { 4 | return ( 5 |13 | {convertedDate} 14 |
15 |13 | {nickname} 14 |
15 |16 | {convertedCurrentCharge} 17 |
18 |{title}
17 |{`참여 인원 ${participants}명 / ${maxParticipants}명`}
18 |26 | 곧이어 챌린지가 시작됩니다. 27 |
28 |이 소비내역, 거지가 아닌 것 같다면 ?
16 |코멘트로 회초리를 들어줍시다.
17 |{currentCharge}
22 |{`/${goalCharge}`}
23 |25 | {dueDay} 26 |
27 |*
27 |/
28 | {maxLength} 29 |챌린지를 나가면
60 |자린고비 레벨에 변화가 있을 수 있습니다.
61 |그래도 챌린지를 나가겠습니까?
62 |{nickname}
35 |36 | {content} 37 |
38 |39 | {timeDifference(commentDate, new Date())} 40 |
41 |{title}
63 |{convertedPrice}
65 |69 | {content} 70 |
71 | {isChallengeExist && ( 72 | <> 73 |84 | {challengeTitle} 85 |
86 |*/} 40 | {/* 거지방 반응, 자린고비 성장 등 서비스 관련 소식을 전달드릴게요 */} 41 | {/*
*/} 42 | {/*