Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
74 changes: 74 additions & 0 deletions .github/labeler.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
# labeler "full" schema

# enable labeler on issues, prs, or both.
enable:
issues: true
prs: true
# comments object allows you to specify a different message for issues and prs

comments:
issues: |
Thanks for opening this issue!
I have applied any labels matching special text in your title and description.

Please review the labels and make any necessary changes.
prs: |
Thanks for the contribution!
I have applied any labels matching special text in your title and description.

Please review the labels and make any necessary changes.

# Labels is an object where:
# - keys are labels
# - values are objects of { include: [ pattern ], exclude: [ pattern ] }
# - pattern must be a valid regex, and is applied globally to
# title + description of issues and/or prs (see enabled config above)
# - 'include' patterns will associate a label if any of these patterns match
# - 'exclude' patterns will ignore this label if any of these patterns match
# - 'branches' is an optional array of branch names (or patterns) to limit labeling according to PR target branch
labels:
'bug':
include:
- '(?i)bug'
- '(?i)fix'
exclude: []
'feature':
include:
- '(?i)feat'
exclude: []
'mod':
include:
- '(?i)mod'
exclude: []
'chore':
include:
- '(?i)chore'
exclude: []
'del':
include:
- '(?i)del'
exclude: []
'merge':
include:
- '(?i)merge'
exclude: []
'move':
include:
- '(?i)move'
exclude: []
'rename':
include:
- '(?i)rename'
exclude: []
'refactor':
include:
- '(?i)refactor'
exclude: []
'docs':
include:
- '(?i)docs'
exclude: []
'deploy':
include:
- '(?i)deploy'
exclude: []
18 changes: 18 additions & 0 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
## 📝 요약
-

## ⚙️ 작업 내용
-
-

## 🔗 관련 이슈
- Closes #

## ✅ 체크리스트
- [ ] 코딩 컨벤션(Biome/Lint)을 준수하였습니다.
- [ ] 모든 타입 에러를 해결하였습니다. (Typecheck)
- [ ] 변경 사항에 대한 테스트를 마쳤습니다.
- [ ] 불필요한 로그(console.log)를 제거하였습니다.

## 💬 리뷰어에게
-
22 changes: 22 additions & 0 deletions .github/workflows/ai-labeler.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
name: Community
on:
issues:
types: [opened, edited, milestoned]
pull_request_target:
types: [opened]

permissions:
issues: write
pull-requests: write

jobs:

labeler:
runs-on: ubuntu-latest

steps:
- name: Check Labels
id: labeler
uses: jimschubert/labeler-action@v2
env:
GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
95 changes: 95 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
name: CI

on:
push:
branches: [main, master, develop]
pull_request:
branches: [main, master, develop]

jobs:
# 린트 검사
lint:
name: Lint
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 20
cache: 'yarn'

- name: Install dependencies
run: yarn install --frozen-lockfile

- name: Run Biome
run: yarn biome:lint

# 타입 검사
typecheck:
name: Typecheck
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 20
cache: 'yarn'

- name: Install dependencies
run: yarn install --frozen-lockfile

- name: Run tsc
run: yarn typecheck

# 프로젝트 진단 및 빌드 테스트
doctor:
name: Expo Doctor
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 20
cache: 'yarn'

- name: Install dependencies
run: yarn install --frozen-lockfile

- name: Run expo-doctor
run: npx expo-doctor

export:
name: Expo Export Check (${{ matrix.platform }})
runs-on: ubuntu-latest
timeout-minutes: 20
needs: [lint, typecheck, doctor]

strategy:
fail-fast: false
matrix:
platform: [ios, android]

steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 20
cache: 'yarn'

- name: Install dependencies
run: yarn install --frozen-lockfile

- name: Expo Export Check (${{ matrix.platform }})
run: npx expo export --platform ${{ matrix.platform }}
43 changes: 43 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# Learn more https://docs.github.com/en/get-started/getting-started-with-git/ignoring-files

# dependencies
node_modules/

# Expo
.expo/
dist/
web-build/
expo-env.d.ts

# Native
.kotlin/
*.orig.*
*.jks
*.p8
*.p12
*.key
*.mobileprovision

# Metro
.metro-health-check*

# debug
npm-debug.*
yarn-debug.*
yarn-error.*

# macOS
.DS_Store
*.pem

# local env files
.env*.local

# typescript
*.tsbuildinfo

app-example

# generated native folders
/ios
/android
1 change: 1 addition & 0 deletions .vscode/extensions.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{ "recommendations": ["expo.vscode-expo-tools"] }
7 changes: 7 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"editor.codeActionsOnSave": {
"source.fixAll": "explicit",
"source.organizeImports": "explicit",
"source.sortMembers": "explicit"
}
}
56 changes: 27 additions & 29 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,24 +1,27 @@
# A:SSU Frontend (React Native + Expo)

![Expo](https://img.shields.io/badge/Expo-54.0-000?logo=expo)
![React Native](https://img.shields.io/badge/React%20Native-0.81-61DAFB?logo=react)
![Expo](https://img.shields.io/badge/Expo-54.0.33-000?logo=expo)
![React Native](https://img.shields.io/badge/React%20Native-0.81.5-61DAFB?logo=react)
![React](https://img.shields.io/badge/React-19.1-61DAFB?logo=react)
![TypeScript](https://img.shields.io/badge/TypeScript-5.9-3178C6?logo=typescript)
![Tailwind%20CSS](https://img.shields.io/badge/Tailwind-3.4-38B2AC?logo=tailwindcss)
![NativeWind](https://img.shields.io/badge/NativeWind-4.2-06B6D4)
![Reanimated](https://img.shields.io/badge/Reanimated-3.17-FF6F61)
![Biome](https://img.shields.io/badge/Biome-2.3-2D2E83)
![React Query](https://img.shields.io/badge/React%20Query-5.x-FF4154?logo=reactquery)
![Zustand](https://img.shields.io/badge/Zustand-5.x-444444)
![TypeScript](https://img.shields.io/badge/TypeScript-5.9.3-3178C6?logo=typescript)
![Tailwind%20CSS](https://img.shields.io/badge/Tailwind-3.4.17-38B2AC?logo=tailwindcss)
![NativeWind](https://img.shields.io/badge/NativeWind-4.2.1-06B6D4)
![Reanimated](https://img.shields.io/badge/Reanimated-4.1.1-FF6F61)
![Biome](https://img.shields.io/badge/Biome-2.3.14-2D2E83)
![React Query](https://img.shields.io/badge/React%20Query-5.90-FF4154?logo=reactquery)
![Zustand](https://img.shields.io/badge/Zustand-5.0-444444)

## 기술 스택
- **앱 런타임**: Expo SDK 54 / React Native 0.81
- **언어**: TypeScript 5.9
- **상태 관리**: Zustand 5
- **서버 상태**: @tanstack/react-query 5
- **스타일링**: Tailwind 3.4 + NativeWind 4
- **애니메이션**: react-native-reanimated 3 + worklets
- **품질 도구**: Biome
- **앱 런타임**: Expo SDK 54 / React Native 0.81.5 / React 19.1
- **라우팅**: Expo Router (`typedRoutes: true`)
- **언어**: TypeScript 5.9.3
- **상태 관리**: Zustand 5
- **서버 상태**: @tanstack/react-query 5
- **스타일링**: Tailwind 3.4.17 + NativeWind 4.2.1
- 전역 토큰: `src/shared/styles/global.styles.css`
- Tailwind 설정: `tailwind.config.js`
- **애니메이션**: react-native-reanimated 4 + react-native-worklets
- **품질 도구**: Biome 2.3.14

## 아키텍처 (FSD)
```
Expand All @@ -28,24 +31,19 @@ src/
widgets/ # 화면에서 공용으로 사용하는 독립적인 UI 컴포넌트
features/ # 특정 기능의 로직, UI, API 호출
entities/ # 도메인 모델과 관련된 데이터 처리
shared/ # 공용 lib/api/ui/config
shared/ # 공용 assets/hooks/styles/utils 등
```

## 스크립트 (yarn)
- `yarn start` / `yarn android` / `yarn ios` / `yarn web`
- `yarn lint` — Biome lint
- `yarn format` — Biome format (write)
- `yarn check` — Biome check (type-aware, write)
- `yarn start` — Expo 개발 서버 실행
- `yarn typecheck` — TypeScript 타입체크 (`tsc --noEmit`)
- `yarn biome:lint` — Biome lint (`./src`)
- `yarn biome:format` — Biome formatter (`./src`, write)
- `yarn biome:fix` — Biome check + 자동 수정 (`./src`, write)

## 개발 가이드
- 스타일: `global.css` + `tailwind.config.js` 프리셋, RN 컴포넌트에 `className`.
- 비동기: `QueryClientProvider`로 감싸고 글로벌 상태는 Zustand store와 조합.
- 품질 체크: 커밋 전 `yarn format && yarn lint && yarn check`.
- 리소스 배치: 공용 색상/상수 `src/shared/config`, 네트워크 모듈 `src/shared/api`.

## 빠른 시작
1) 의존성: `yarn install`
1) 의존성: `yarn install --frozen-lockfile`
2) 실행: `yarn start` 후 a/i/w 선택
3) 포맷 & 린트: `yarn format && yarn lint && yarn check`
3) 품질 체크(권장): `yarn biome:format && yarn biome:lint && yarn typecheck`

> 패키지 매니저: **yarn** 고정
48 changes: 48 additions & 0 deletions app.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
{
"expo": {
"name": "ASSU_FE_RN",
"slug": "ASSU_FE_RN",
"version": "1.0.0",
"orientation": "portrait",
"icon": "./src/shared/assets/images/icon.png",
"scheme": "assufern",
"userInterfaceStyle": "automatic",
"newArchEnabled": true,
"ios": {
"supportsTablet": true
},
"android": {
"adaptiveIcon": {
"backgroundColor": "#E6F4FE",
"foregroundImage": "./src/shared/assets/images/android-icon-foreground.png",
"backgroundImage": "./src/shared/assets/images/android-icon-background.png",
"monochromeImage": "./src/shared/assets/images/android-icon-monochrome.png"
},
"edgeToEdgeEnabled": true,
"predictiveBackGestureEnabled": false
},
"web": {
"output": "static",
"favicon": "./src/shared/assets/images/favicon.png"
},
"plugins": [
"expo-router",
[
"expo-splash-screen",
{
"image": "./src/shared/assets/images/splash-icon.png",
"imageWidth": 200,
"resizeMode": "contain",
"backgroundColor": "#ffffff",
"dark": {
"backgroundColor": "#000000"
}
}
]
],
"experiments": {
"typedRoutes": true,
"reactCompiler": true
}
}
}
Loading