Files
Gnuboard7/docs/frontend/templates/sirsoft-basic/handlers.md
T
2026-04-01 10:30:52 +09:00

432 lines
10 KiB
Markdown

# sirsoft-basic 핸들러
> **템플릿 식별자**: `sirsoft-basic` (type: user)
> **관련 문서**: [액션 핸들러 개요](../../actions-handlers.md) | [컴포넌트](./components.md) | [레이아웃](./layouts.md)
---
## TL;DR (5초 요약)
```text
1. setTheme/initTheme: 다크/라이트 모드 전환 (admin과 동일 키 공유)
2. 장바구니 6종: 선택/옵션/삭제/재계산 핸들러
3. 상품 옵션 2종: 옵션 완료 시 자동 추가/수량 변경
4. 다중 통화 5종: 가격 표시/포맷/통화 기호/선호 통화 로드/저장
5. 스토리지 6종: 비회원 장바구니 키 관리 (localStorage + API 발급)
```
---
## 목차
1. [테마 핸들러](#테마-핸들러)
2. [장바구니 핸들러](#장바구니-핸들러)
3. [장바구니 옵션 변경 핸들러](#장바구니-옵션-변경-핸들러)
4. [상품 옵션 핸들러](#상품-옵션-핸들러)
5. [다중 통화 핸들러](#다중-통화-핸들러)
6. [스토리지 핸들러](#스토리지-핸들러)
7. [핸들러 등록 맵](#핸들러-등록-맵)
---
## 테마 핸들러
**소스**: `src/handlers/setThemeHandler.ts`
sirsoft-admin_basic과 동일한 localStorage 키(`g7_color_scheme`)를 사용하여 테마 설정을 공유합니다.
### setTheme
```json
{
"type": "click",
"handler": "setTheme",
"params": {
"theme": "dark"
}
}
```
| 필드 | 타입 | 필수 | 설명 |
|------|------|------|------|
| `theme` | string | ✅ | `"light"`, `"dark"`, `"auto"` (시스템 설정 따름) |
### initTheme
앱 시작 시 `init_actions`에서 호출. params 없음.
```json
{
"init_actions": [
{ "handler": "initTheme" }
]
}
```
---
## 장바구니 핸들러
**소스**: `src/handlers/cartHandlers.ts`
장바구니 페이지에서 상품 선택, 옵션 변경, 삭제 등을 처리합니다.
### toggleCartItemSelection
장바구니 아이템 선택/해제를 토글합니다.
```json
{
"handler": "toggleCartItemSelection",
"params": {
"itemId": "{{item.id}}"
}
}
```
### selectAllCartItems
모든 장바구니 아이템을 선택/해제합니다.
```json
{
"handler": "selectAllCartItems",
"params": {
"selected": true
}
}
```
### setCartOption
장바구니 아이템의 옵션을 변경합니다.
```json
{
"handler": "setCartOption",
"params": {
"itemId": "{{item.id}}",
"optionId": "{{selectedOption.id}}"
}
}
```
### openCartDeleteModal
장바구니 삭제 확인 모달을 엽니다.
```json
{
"handler": "openCartDeleteModal",
"params": {
"itemId": "{{item.id}}"
}
}
```
### openCartOptionModal
장바구니 옵션 변경 모달을 엽니다.
```json
{
"handler": "openCartOptionModal",
"params": {
"itemId": "{{item.id}}"
}
}
```
### recalculateCart
장바구니 합계를 재계산합니다.
```json
{
"handler": "recalculateCart"
}
```
### 장바구니 핸들러 요약
| 핸들러 | params | 설명 |
|--------|--------|------|
| `toggleCartItemSelection` | `{ itemId }` | 아이템 선택 토글 |
| `selectAllCartItems` | `{ selected }` | 전체 선택/해제 |
| `setCartOption` | `{ itemId, optionId }` | 옵션 변경 |
| `openCartDeleteModal` | `{ itemId }` | 삭제 모달 열기 |
| `openCartOptionModal` | `{ itemId }` | 옵션 변경 모달 열기 |
| `recalculateCart` | 없음 | 합계 재계산 |
---
## 장바구니 옵션 변경 핸들러
**소스**: `src/handlers/cartOptionChange.ts`
장바구니 옵션 변경 모달에서 옵션 선택 및 매칭을 처리합니다.
### findMatchingOption
선택한 옵션 값들로 매칭되는 상품 옵션을 찾습니다.
```json
{
"handler": "findMatchingOption",
"params": {
"options": "{{_local.options}}",
"selection": "{{_local.optionSelection}}"
}
}
```
### initCartOptionSelection
옵션 변경 모달 초기화 시 현재 선택된 옵션을 설정합니다.
```json
{
"handler": "initCartOptionSelection",
"params": {
"currentOption": "{{item.option}}"
}
}
```
---
## 상품 옵션 핸들러
**소스**: `src/handlers/productOptions.ts`
상품 상세 페이지에서 옵션 선택 및 수량 변경을 처리합니다.
### addSelectedItemIfComplete (sirsoft-basic.addSelectedItemIfComplete)
모든 옵션 그룹 선택 완료 시 선택 아이템 목록에 자동 추가합니다.
```json
{
"handler": "sirsoft-basic.addSelectedItemIfComplete",
"params": {
"newGroupName": "{{groupName}}",
"newValue": "{{selectedValue}}",
"optionGroups": "{{product?.data?.option_groups}}",
"options": "{{product?.data?.options}}"
}
}
```
### updateSelectedItemQuantity (sirsoft-basic.updateSelectedItemQuantity)
선택된 아이템의 수량을 변경합니다.
```json
{
"handler": "sirsoft-basic.updateSelectedItemQuantity",
"params": {
"optionId": "{{option.id}}",
"quantity": "{{newQuantity}}"
}
}
```
---
## 다중 통화 핸들러
### getDisplayPrice (sirsoft-basic.getDisplayPrice)
**소스**: `src/handlers/getDisplayPrice.ts`
사용자 선호 통화에 맞는 가격을 반환합니다.
```json
{
"handler": "sirsoft-basic.getDisplayPrice",
"params": {
"product": "{{product.data}}",
"priceField": "selling_price"
}
}
```
| 필드 | 타입 | 필수 | 설명 |
|------|------|------|------|
| `product` | object | ✅ | 상품 객체 |
| `priceField` | string | ✅ | `"selling_price"` 또는 `"list_price"` |
| `currencyCode` | string | ❌ | 통화 코드 (미지정 시 전역 설정 사용) |
### formatCurrency (sirsoft-basic.formatCurrency)
**소스**: `src/handlers/formatCurrency.ts`
숫자 값을 통화 형식 문자열로 변환합니다.
```json
{
"handler": "sirsoft-basic.formatCurrency",
"params": {
"value": 10000,
"currencyCode": "KRW"
}
}
```
| 필드 | 타입 | 필수 | 설명 |
|------|------|------|------|
| `value` | number | ✅ | 포맷팅할 숫자 값 |
| `currencyCode` | string | ❌ | 통화 코드 (KRW, USD, JPY, CNY, EUR) |
| `locale` | string | ❌ | 로케일 (미지정 시 통화 기본 로케일 사용) |
지원 통화: KRW (₩), USD ($), JPY (¥), CNY (¥), EUR (€)
### getCurrencySymbol (sirsoft-basic.getCurrencySymbol)
통화 기호를 반환합니다.
### loadPreferredCurrency (sirsoft-basic.loadPreferredCurrency)
**소스**: `src/handlers/loadPreferredCurrency.ts`
localStorage에서 선호 통화를 로드하여 전역 상태(`_global.preferredCurrency`)에 설정합니다.
```json
{
"init_actions": [
{
"handler": "sirsoft-basic.loadPreferredCurrency",
"params": { "defaultCurrency": "KRW" }
}
]
}
```
### savePreferredCurrency (sirsoft-basic.savePreferredCurrency)
선호 통화를 localStorage에 저장합니다.
```json
{
"handler": "sirsoft-basic.savePreferredCurrency",
"params": {
"currencyCode": "{{selectedCurrency}}"
}
}
```
---
## 스토리지 핸들러
**소스**: `src/handlers/storageHandlers.ts`
비로그인 사용자의 장바구니 키 등 클라이언트 스토리지를 관리합니다.
### initCartKey
장바구니 키를 초기화합니다. localStorage에 있으면 로드, 없으면 API를 통해 발급합니다.
```json
{
"init_actions": [
{ "handler": "initCartKey" }
]
}
```
### getCartKey / clearCartKey / regenerateCartKey
```json
{ "handler": "getCartKey" }
{ "handler": "clearCartKey" }
{ "handler": "regenerateCartKey" }
```
### saveToStorage / loadFromStorage
범용 localStorage 저장/로드 핸들러입니다.
```json
{
"handler": "saveToStorage",
"params": {
"key": "g7_some_setting",
"value": "{{_local.settingValue}}"
}
}
```
```json
{
"handler": "loadFromStorage",
"params": {
"key": "g7_some_setting",
"stateKey": "savedSetting"
}
}
```
### 스토리지 핸들러 요약
| 핸들러 | params | 설명 |
|--------|--------|------|
| `initCartKey` | 없음 | 장바구니 키 초기화 (localStorage + API) |
| `getCartKey` | 없음 | 현재 장바구니 키 반환 |
| `clearCartKey` | 없음 | 장바구니 키 삭제 |
| `regenerateCartKey` | 없음 | 장바구니 키 재발급 |
| `saveToStorage` | `{ key, value }` | localStorage 저장 |
| `loadFromStorage` | `{ key, stateKey }` | localStorage 로드 → 상태에 설정 |
---
## 핸들러 등록 맵
**소스**: `src/handlers/index.ts`
| 등록 키 | 소스 파일 | 설명 |
|---------|----------|------|
| `setTheme` | setThemeHandler.ts | 테마 변경 |
| `initTheme` | setThemeHandler.ts | 테마 초기화 |
| `toggleCartItemSelection` | cartHandlers.ts | 장바구니 아이템 선택 |
| `selectAllCartItems` | cartHandlers.ts | 장바구니 전체 선택 |
| `setCartOption` | cartHandlers.ts | 장바구니 옵션 변경 |
| `openCartDeleteModal` | cartHandlers.ts | 삭제 모달 열기 |
| `openCartOptionModal` | cartHandlers.ts | 옵션 모달 열기 |
| `recalculateCart` | cartHandlers.ts | 장바구니 재계산 |
| `findMatchingOption` | cartOptionChange.ts | 매칭 옵션 검색 |
| `initCartOptionSelection` | cartOptionChange.ts | 옵션 선택 초기화 |
| `sirsoft-basic.addSelectedItemIfComplete` | productOptions.ts | 옵션 완료 시 자동 추가 |
| `sirsoft-basic.updateSelectedItemQuantity` | productOptions.ts | 수량 변경 |
| `sirsoft-basic.getDisplayPrice` | getDisplayPrice.ts | 통화별 가격 표시 |
| `sirsoft-basic.formatCurrency` | formatCurrency.ts | 통화 포맷팅 |
| `sirsoft-basic.getCurrencySymbol` | formatCurrency.ts | 통화 기호 |
| `sirsoft-basic.loadPreferredCurrency` | loadPreferredCurrency.ts | 선호 통화 로드 |
| `sirsoft-basic.savePreferredCurrency` | loadPreferredCurrency.ts | 선호 통화 저장 |
| `initCartKey` | storageHandlers.ts | 장바구니 키 초기화 |
| `getCartKey` | storageHandlers.ts | 장바구니 키 조회 |
| `clearCartKey` | storageHandlers.ts | 장바구니 키 삭제 |
| `regenerateCartKey` | storageHandlers.ts | 장바구니 키 재발급 |
| `saveToStorage` | storageHandlers.ts | localStorage 저장 |
| `loadFromStorage` | storageHandlers.ts | localStorage 로드 |
---
## 주의사항
```text
이 핸들러들은 sirsoft-basic 템플릿에서만 등록됨
sirsoft-basic. 접두사 핸들러는 풀네임으로 호출해야 함
setLocale은 엔진 레벨(ActionDispatcher) 빌트인 — 별도 등록 불필요
✅ 범용 핸들러(navigate, apiCall, setState 등)는 actions-handlers.md 참조
```
---
## 관련 문서
- [액션 핸들러 개요](../../actions-handlers.md)
- [sirsoft-basic 컴포넌트](./components.md)
- [sirsoft-basic 레이아웃](./layouts.md)
- [sirsoft-admin_basic 핸들러](../sirsoft-admin_basic/handlers.md)