issue-sticker 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +44 -0
- package/README.md +82 -415
- package/dist/NetworkCollector-BlY2qUKF.js +12278 -0
- package/dist/createLucideIcon-B457EluY.js +27415 -0
- package/dist/{index-DD-r5zA8.js → index-D6SaRFm4.js} +100 -3
- package/dist/issue-sticker-headless-react.js +764 -0
- package/dist/issue-sticker-headless.js +1914 -0
- package/dist/issue-sticker-react.js +12049 -24846
- package/dist/tooltip-BkQcdrki.js +512 -0
- package/headless-react.d.ts +12 -0
- package/headless.d.ts +172 -0
- package/package.json +32 -30
- package/react.d.ts +29 -2
- package/dist/index.d.ts +0 -25
- package/dist/issue-sticker-demo-react.js +0 -51761
- package/dist/issue-sticker-runtime.js +0 -37
- package/dist/issue-sticker.js +0 -2105
- package/dist/issue-sticker.umd.js +0 -1
- package/dist/sdkEventListeners-CtYEkXOR.js +0 -498
- package/runtime.d.ts +0 -11
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# 변경 이력
|
|
2
|
+
|
|
3
|
+
npm 패키지 `issue-sticker`의 변경 이력입니다. 설치·업그레이드에 영향을 주는 변경만 기록합니다.
|
|
4
|
+
|
|
5
|
+
## 0.2.0 - 2026-08-05
|
|
6
|
+
|
|
7
|
+
### 주의가 필요한 변경
|
|
8
|
+
|
|
9
|
+
- 패키지 루트(`issue-sticker`)와 `issue-sticker/runtime` 엔트리를 제거했습니다. 공개 엔트리는 `issue-sticker/react`, `issue-sticker/headless`, `issue-sticker/headless/react` 세 개입니다.
|
|
10
|
+
- UMD 산출물(`dist/issue-sticker.umd.js`) 배포를 중단했습니다. `<script>` 태그로 패키지 파일을 직접 불러오는 방식은 지원하지 않습니다.
|
|
11
|
+
|
|
12
|
+
마이그레이션:
|
|
13
|
+
|
|
14
|
+
```diff
|
|
15
|
+
-import { IssueSticker } from 'issue-sticker';
|
|
16
|
+
+import { IssueSticker } from 'issue-sticker/react';
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
`issue-sticker/runtime`을 직접 사용하던 코드는 `issue-sticker/react`의 `useIssueSticker()` 또는 `IssueSticker.init()`으로 옮기세요. 위젯 UI 없이 이슈 플로우를 직접 제어하려면 `issue-sticker/headless`를 사용하세요.
|
|
20
|
+
|
|
21
|
+
### 추가
|
|
22
|
+
|
|
23
|
+
- `issue-sticker/headless` — 위젯 UI 없이 이슈 플로우를 구독·제어하는 controller API. `subscribe()`로 snapshot을 구독하고 `startIssueCapture()`·`submitDraft()`로 이슈를 생성합니다. 제목·설명·동적 필드 입력은 호스트 앱이 소유하며 `submitDraft({ title, description, dynamicFields })`로 전달합니다.
|
|
24
|
+
- `issue-sticker/headless/react` — Headless UI를 직접 만들 때 사용하는 최소 React helper.
|
|
25
|
+
- 이슈 팝오버에서 코딩 에이전트에 붙여 넣을 LLM 프롬프트 복사.
|
|
26
|
+
- 이슈 상세에서 네트워크 요청의 메서드·상태·헤더·본문과 콘솔 로그 확인.
|
|
27
|
+
- `multi_select` 커스텀 필드를 이슈 필터에서 사용.
|
|
28
|
+
|
|
29
|
+
### 개선
|
|
30
|
+
|
|
31
|
+
- 이슈 생성 시 클릭 즉시 폼이 뜨고 스크린샷은 백그라운드에서 캡처됩니다. 캡처가 끝나기 전에 제출해도 완료를 기다린 뒤 업로드하며, 캡처가 실패하면 스크린샷 없이 제출을 계속합니다.
|
|
32
|
+
- FAB 트리거와 툴바를 브랜드 컬러 기반으로 정리하고 심볼을 인라인 SVG로 교체했습니다.
|
|
33
|
+
- 캡처 단축키 안내에 `⌘⌥`와 `⌃⌥`를 함께 표시합니다.
|
|
34
|
+
- 세션 리플레이 녹화에서 이슈스티커 위젯 자체가 남기던 노이즈를 제거했습니다.
|
|
35
|
+
- 마커 렌더링을 문서 좌표 기준으로 단일화해 스크롤·리사이즈 시 위치가 어긋나는 경로를 없앴습니다.
|
|
36
|
+
|
|
37
|
+
### 수정
|
|
38
|
+
|
|
39
|
+
- `issue-sticker/react`를 서버에서 평가하는 환경(Next.js client component의 SSR 패스 등)에서 import 즉시 `document is not defined`로 실패하던 문제를 수정했습니다. 번들에 포함되던 마크다운 의존성이 모듈 스코프에서 `document`를 사용하던 것이 원인입니다.
|
|
40
|
+
- 이슈 생성 모드와 화면 녹화가 동시에 켜질 수 있던 문제를 양방향으로 차단했습니다.
|
|
41
|
+
- 온보딩을 시작하면 이슈 생성 모드가 먼저 해제됩니다.
|
|
42
|
+
- 외부 연동 생성이 실패해도 아무 안내가 없던 문제를 toast 알림으로 수정했습니다.
|
|
43
|
+
- 성공 toast가 회색 표면으로 표시되던 문제를 수정했습니다.
|
|
44
|
+
- 이슈 목록·스티커, Jira 연동 필드 응답 처리를 서버 응답 형식에 맞게 정정했습니다.
|
package/README.md
CHANGED
|
@@ -1,483 +1,150 @@
|
|
|
1
1
|
# IssueSticker SDK
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
사용자가 페이지 위에서 직접 클릭하여 이슈를 생성하고, 스크린샷/네트워크 로그/콘솔 로그를 자동으로 수집합니다.
|
|
3
|
+
**IssueSticker**는 웹서비스에서 발견한 버그를 화면 위에서 바로 기록하는 도구입니다. 문제 지점을 클릭해 이슈를 남기면 스크린샷·네트워크 로그·콘솔 로그·화면 녹화가 함께 수집되어, 재현에 필요한 맥락이 빠짐없이 남습니다.
|
|
5
4
|
|
|
6
|
-
|
|
5
|
+
이 npm 패키지 `issue-sticker`는 **SDK 위젯**입니다. 자사 웹앱에 몇 줄만 추가하면 고객·베타 사용자·내부 QA가 제품을 벗어나지 않고 그 자리에서 피드백을 남길 수 있습니다. 수집된 이슈는 [관리자 콘솔](https://app.issuesticker.com)에서 관리하고 Jira·Notion으로 내보낼 수 있습니다. 임의의 웹페이지에서 사용할 수 있는 [Chrome Extension](https://issuesticker.com/guide/products/extension)은 별도 제품으로 제공합니다.
|
|
7
6
|
|
|
8
|
-
##
|
|
7
|
+
## 문서
|
|
9
8
|
|
|
10
|
-
|
|
11
|
-
- [설치](#설치)
|
|
12
|
-
- [빠른 시작](#빠른-시작)
|
|
13
|
-
- [동작 모드](#동작-모드)
|
|
14
|
-
- [API 레퍼런스](#api-레퍼런스)
|
|
15
|
-
- [설정 옵션](#설정-옵션)
|
|
16
|
-
- [이벤트](#이벤트)
|
|
17
|
-
- [키보드 단축키](#키보드-단축키)
|
|
18
|
-
- [위젯 기능](#위젯-기능)
|
|
19
|
-
- [브라우저 지원](#브라우저-지원)
|
|
20
|
-
- [FAQ](#faq)
|
|
21
|
-
- [라이선스](#라이선스)
|
|
9
|
+
이 README는 설치와 API 표면만 다룹니다. 자세한 설명은 홈페이지 가이드에서 확인하세요.
|
|
22
10
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
- **화면 녹화** — 버그 재현 과정을 영상으로 기록
|
|
31
|
-
- **마커 표시** — 생성된 이슈를 페이지 위에 마커로 표시
|
|
32
|
-
|
|
33
|
-
---
|
|
11
|
+
| 문서 | 내용 |
|
|
12
|
+
| ---------------------------------------------------------------- | ------------------------------------- |
|
|
13
|
+
| [시작 준비](https://issuesticker.com/guide/products/setup) | 프로젝트·허용 도메인·API key 발급 |
|
|
14
|
+
| [SDK Widget](https://issuesticker.com/guide/products/sdk) | 위젯 설치, 초기화, 운영에서 켜는 조건 |
|
|
15
|
+
| [SDK Headless](https://issuesticker.com/guide/products/headless) | Headless 클라이언트 전체 레퍼런스 |
|
|
16
|
+
| [외부 연동](https://issuesticker.com/guide/integrations) | Jira·Notion 연결과 필드 동기화 |
|
|
17
|
+
| [FAQ](https://issuesticker.com/guide/faq) | 권한·도메인·key·필드 동기화 문제 해결 |
|
|
34
18
|
|
|
35
19
|
## 설치
|
|
36
20
|
|
|
37
|
-
### npm
|
|
38
|
-
|
|
39
21
|
```bash
|
|
40
22
|
npm install issue-sticker
|
|
41
23
|
```
|
|
42
24
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
```bash
|
|
46
|
-
yarn add issue-sticker
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
### pnpm
|
|
50
|
-
|
|
51
|
-
```bash
|
|
52
|
-
pnpm add issue-sticker
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
### React 어댑터 사용 시 peer dependency
|
|
56
|
-
|
|
57
|
-
`issue-sticker/react`를 사용할 경우 호스트 앱에 `react`, `react-dom`이 필요합니다.
|
|
58
|
-
|
|
59
|
-
### CDN (script 태그)
|
|
60
|
-
|
|
61
|
-
```html
|
|
62
|
-
<script src="https://cdn.issuesticker.com/sdk/issue-sticker.umd.js"></script>
|
|
63
|
-
<script>
|
|
64
|
-
IssueSticker.init({ apiKey: 'YOUR_API_KEY' });
|
|
65
|
-
</script>
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
---
|
|
69
|
-
|
|
70
|
-
## 빠른 시작
|
|
71
|
-
|
|
72
|
-
### 엔트리포인트
|
|
73
|
-
|
|
74
|
-
- `issue-sticker/runtime` — 프레임워크 비의존 코어 런타임 API (`IssueSticker`) (UI 마운트 없음)
|
|
75
|
-
- `issue-sticker/react` — React 어댑터 API (`IssueSticker`, `useIssueSticker`) (위젯 UI 마운트 포함)
|
|
76
|
-
|
|
77
|
-
화면 위젯(FAB/이슈 폼/마커)을 사용하려면 `issue-sticker/react` 경로를 사용해야 합니다.
|
|
78
|
-
|
|
79
|
-
### React / Next.js
|
|
80
|
-
|
|
81
|
-
`useIssueSticker` 훅을 사용하면 초기화와 정리를 자동으로 처리합니다.
|
|
82
|
-
|
|
83
|
-
```tsx
|
|
84
|
-
import { useIssueSticker } from 'issue-sticker/react';
|
|
85
|
-
|
|
86
|
-
function App() {
|
|
87
|
-
useIssueSticker({ apiKey: 'YOUR_API_KEY' });
|
|
88
|
-
|
|
89
|
-
return <div>My Application</div>;
|
|
90
|
-
}
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
### Vanilla JavaScript
|
|
94
|
-
|
|
95
|
-
```typescript
|
|
96
|
-
import { IssueSticker } from 'issue-sticker/runtime';
|
|
97
|
-
|
|
98
|
-
IssueSticker.init({ apiKey: 'YOUR_API_KEY' });
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
`issue-sticker/runtime`은 코어 런타임 경로로, React UI 마운트 없이 SDK 엔진 라이프사이클/API 이벤트를 다룰 때 사용합니다.
|
|
102
|
-
|
|
103
|
-
### HTML
|
|
104
|
-
|
|
105
|
-
```html
|
|
106
|
-
<script src="https://cdn.issuesticker.com/sdk/issue-sticker.umd.js"></script>
|
|
107
|
-
<script>
|
|
108
|
-
IssueSticker.init({ apiKey: 'YOUR_API_KEY' });
|
|
109
|
-
</script>
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
UMD(`issue-sticker.umd.js`)는 런타임 경로 기준입니다.
|
|
113
|
-
UMD 경로는 위젯 UI를 자동 마운트하지 않습니다.
|
|
25
|
+
`issue-sticker/react`와 `issue-sticker/headless/react`를 사용하려면 호스트 앱에 `react`, `react-dom`(18 또는 19)이 설치되어 있어야 합니다.
|
|
114
26
|
|
|
115
|
-
|
|
27
|
+
## 엔트리포인트
|
|
116
28
|
|
|
117
|
-
|
|
29
|
+
| 경로 | 용도 |
|
|
30
|
+
| ------------------------------ | ----------------------------------------------------- |
|
|
31
|
+
| `issue-sticker/react` | 위젯 UI(FAB·이슈 폼·마커)를 마운트하는 React 어댑터 |
|
|
32
|
+
| `issue-sticker/headless` | UI 없이 이슈 플로우를 구독·제어하는 controller API |
|
|
33
|
+
| `issue-sticker/headless/react` | Headless UI를 직접 만들 때 사용하는 최소 React helper |
|
|
118
34
|
|
|
119
|
-
|
|
120
|
-
아래 화면 동작(폼/마커/FAB)은 `issue-sticker/react` 경로로 위젯이 마운트된 상태를 기준으로 설명합니다.
|
|
35
|
+
패키지 루트(`issue-sticker`)와 `issue-sticker/runtime`은 공개 엔트리포인트가 아닙니다.
|
|
121
36
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
`user` 옵션 없이 초기화합니다. 이슈는 익명으로 생성되며, 사용자별 이슈 조회는 불가능합니다.
|
|
37
|
+
## 빠른 시작 — 위젯
|
|
125
38
|
|
|
126
39
|
```tsx
|
|
127
|
-
|
|
128
|
-
```
|
|
129
|
-
|
|
130
|
-
| 항목 | 동작 |
|
|
131
|
-
| ----------- | ------------------ |
|
|
132
|
-
| 이슈 생성 | 익명으로 생성 |
|
|
133
|
-
| 이슈 조회 | 불가 (생성만 가능) |
|
|
134
|
-
| 보고자 표시 | 표시 안 됨 |
|
|
135
|
-
|
|
136
|
-
### 사용자 식별 모드
|
|
137
|
-
|
|
138
|
-
호스트 앱의 사용자 정보를 `user`에 전달합니다. 이슈에 보고자 정보가 기록되고, 해당 사용자가 생성한 이슈만 조회할 수 있습니다.
|
|
139
|
-
|
|
140
|
-
```tsx
|
|
141
|
-
useIssueSticker({
|
|
142
|
-
apiKey: 'YOUR_API_KEY',
|
|
143
|
-
user: {
|
|
144
|
-
id: 'user-123',
|
|
145
|
-
name: 'Hong Gildong',
|
|
146
|
-
},
|
|
147
|
-
});
|
|
148
|
-
```
|
|
149
|
-
|
|
150
|
-
| 항목 | 동작 |
|
|
151
|
-
| ----------- | -------------------------------- |
|
|
152
|
-
| 이슈 생성 | 사용자 정보와 함께 생성 |
|
|
153
|
-
| 이슈 조회 | 해당 사용자가 생성한 이슈만 표시 |
|
|
154
|
-
| 보고자 표시 | `user.name`으로 표시 |
|
|
155
|
-
|
|
156
|
-
### 멤버 모드
|
|
157
|
-
|
|
158
|
-
워크스페이스에 등록된 멤버 계정으로 로그인합니다. FAB 메뉴의 "멤버 로그인"을 통해 진입할 수 있습니다.
|
|
159
|
-
멤버 모드에서는 프로젝트의 모든 이슈를 조회/관리할 수 있으며, 마커를 페이지 위에 표시합니다.
|
|
160
|
-
|
|
161
|
-
| 항목 | 동작 |
|
|
162
|
-
| --------- | ----------------------------------------- |
|
|
163
|
-
| 이슈 생성 | 멤버 계정으로 생성 |
|
|
164
|
-
| 이슈 조회 | 프로젝트의 모든 이슈 조회 가능 |
|
|
165
|
-
| 마커 | 현재 페이지의 이슈를 마커로 표시 |
|
|
166
|
-
| 이슈 관리 | 상태 변경, 심각도 변경, 댓글 등 전체 기능 |
|
|
40
|
+
'use client'; // Next.js App Router
|
|
167
41
|
|
|
168
|
-
---
|
|
169
|
-
|
|
170
|
-
## API 레퍼런스
|
|
171
|
-
|
|
172
|
-
### `useIssueSticker(config)`
|
|
173
|
-
|
|
174
|
-
React 커스텀 훅. 컴포넌트 마운트 시 SDK를 초기화하고, 언마운트 시 자동으로 정리합니다.
|
|
175
|
-
|
|
176
|
-
```tsx
|
|
177
42
|
import { useIssueSticker } from 'issue-sticker/react';
|
|
178
43
|
|
|
179
44
|
function App() {
|
|
180
45
|
useIssueSticker({
|
|
181
|
-
apiKey:
|
|
182
|
-
user: { id: 'user-123', name: 'Hong Gildong' },
|
|
46
|
+
apiKey: process.env.NEXT_PUBLIC_ISSUE_STICKER_SDK_KEY!,
|
|
47
|
+
user: { id: 'user-123', name: 'Hong Gildong' }, // 선택: 보고자 식별
|
|
48
|
+
enabled: isStaging || isAdmin, // 선택: 노출 조건 (기본 true)
|
|
183
49
|
});
|
|
184
50
|
|
|
185
|
-
return <div>My
|
|
51
|
+
return <div>My Application</div>;
|
|
186
52
|
}
|
|
187
53
|
```
|
|
188
54
|
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
---
|
|
192
|
-
|
|
193
|
-
### `IssueSticker.init(config)`
|
|
194
|
-
|
|
195
|
-
SDK 코어 런타임을 초기화합니다.
|
|
196
|
-
이 API(`issue-sticker/runtime`)는 위젯 UI를 자동 마운트하지 않습니다.
|
|
197
|
-
React 환경에서는 `useIssueSticker` 훅 사용을 권장합니다.
|
|
198
|
-
|
|
199
|
-
```typescript
|
|
200
|
-
import { IssueSticker } from 'issue-sticker/runtime';
|
|
201
|
-
```
|
|
202
|
-
|
|
203
|
-
```typescript
|
|
204
|
-
IssueSticker.init(config: SDKConfig): void
|
|
205
|
-
```
|
|
206
|
-
|
|
207
|
-
| 이름 | 타입 | 필수 | 설명 |
|
|
208
|
-
| -------- | ----------- | ---- | ------------- |
|
|
209
|
-
| `config` | `SDKConfig` | Yes | SDK 설정 객체 |
|
|
210
|
-
|
|
211
|
-
이미 초기화된 상태에서 다시 호출하면, 기존 런타임 상태를 정리한 뒤 새로 초기화합니다.
|
|
212
|
-
|
|
213
|
-
---
|
|
55
|
+
앱 최상위에서 한 번만 호출하세요. 훅이 마운트 시 초기화하고 언마운트 시 정리합니다.
|
|
214
56
|
|
|
215
|
-
|
|
57
|
+
우측 하단에 표시되는 FAB(드래그로 위치 이동 가능)에서는 이슈 생성, 화면 녹화, 마커 표시 토글, 마커 표시 기준 전환(생성 위치 기준 / 대상 요소 기준), 미표시 스티커 확인, 가이드 다시 보기, 멤버 로그인·로그아웃을 사용할 수 있습니다. 이슈 생성 모드와 화면 녹화는 동시에 켤 수 없습니다.
|
|
216
58
|
|
|
217
|
-
|
|
218
|
-
`issue-sticker/runtime` 경로에서는 위젯 언마운트를 수행하지 않습니다.
|
|
59
|
+
## 빠른 시작 — Headless
|
|
219
60
|
|
|
220
61
|
```typescript
|
|
221
|
-
|
|
222
|
-
```
|
|
223
|
-
|
|
224
|
-
---
|
|
62
|
+
import { createIssueStickerHeadless } from 'issue-sticker/headless';
|
|
225
63
|
|
|
226
|
-
|
|
64
|
+
const client = createIssueStickerHeadless({
|
|
65
|
+
apiKey: 'YOUR_API_KEY',
|
|
66
|
+
user: { id: 'user-123', name: 'Hong Gildong' },
|
|
67
|
+
});
|
|
227
68
|
|
|
228
|
-
|
|
69
|
+
client.subscribe((snapshot) => renderIssueUI(snapshot));
|
|
229
70
|
|
|
230
|
-
|
|
231
|
-
|
|
71
|
+
await client.initialize();
|
|
72
|
+
await client.refreshIssues();
|
|
232
73
|
```
|
|
233
74
|
|
|
234
|
-
|
|
75
|
+
현재 상태는 읽기 전용 snapshot으로 제공되며, 이슈 생성은 `startIssueCapture()`로 시작합니다. 전체 메서드·snapshot 타입·동적 필드 descriptor·에러 코드는 [Headless 가이드](https://issuesticker.com/guide/products/headless)를 참고하세요.
|
|
235
76
|
|
|
236
|
-
|
|
237
|
-
IssueSticker.on('issue:created', (issue) => {
|
|
238
|
-
console.log('새 이슈:', issue);
|
|
239
|
-
});
|
|
240
|
-
|
|
241
|
-
IssueSticker.on('error', (error) => {
|
|
242
|
-
console.error('SDK 오류:', error);
|
|
243
|
-
});
|
|
244
|
-
```
|
|
77
|
+
## API — `issue-sticker/react`
|
|
245
78
|
|
|
246
|
-
|
|
79
|
+
### `useIssueSticker(config)`
|
|
247
80
|
|
|
248
|
-
|
|
81
|
+
React 훅. `apiKey` 또는 `enabled`가 바뀌면 위젯을 다시 초기화하고, `user`가 바뀌면 위젯은 유지하고 설정만 갱신합니다.
|
|
249
82
|
|
|
250
|
-
|
|
83
|
+
### `IssueSticker`
|
|
251
84
|
|
|
252
|
-
|
|
253
|
-
IssueSticker.off(event: SDKEvent, callback: (...args: unknown[]) => void): void
|
|
254
|
-
```
|
|
85
|
+
훅을 사용할 수 없는 환경에서 직접 제어할 때 사용합니다.
|
|
255
86
|
|
|
256
|
-
|
|
87
|
+
| 메서드 | 설명 |
|
|
88
|
+
| --------------------------------- | --------------------------------------------------------------------------------------------- |
|
|
89
|
+
| `init(config: SDKConfig)` | SDK를 초기화하고 위젯을 마운트. 이미 초기화된 상태라면 설정을 갱신하고 위젯을 다시 마운트한다 |
|
|
90
|
+
| `updateConfig(config: SDKConfig)` | 위젯을 유지한 채 설정만 교체. 초기화 전이면 `init`과 동일하게 동작 |
|
|
91
|
+
| `destroy()` | 위젯을 언마운트하고 SDK를 종료 |
|
|
257
92
|
|
|
258
93
|
```typescript
|
|
259
|
-
|
|
260
|
-
IssueSticker.on('issue:created', handler);
|
|
94
|
+
import { IssueSticker } from 'issue-sticker/react';
|
|
261
95
|
|
|
262
|
-
|
|
263
|
-
IssueSticker.off('issue:created', handler);
|
|
96
|
+
IssueSticker.init({ apiKey: 'YOUR_API_KEY' });
|
|
264
97
|
```
|
|
265
98
|
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
## 설정 옵션
|
|
99
|
+
이슈 생성·제출 같은 흐름을 호스트 앱에서 직접 구독하거나 제어해야 한다면 Headless 클라이언트를 사용하세요. 상태는 `subscribe()`로 구독하고 캡처·제출은 메서드로 제어할 수 있습니다. 자세한 내용은 [Headless 가이드](https://issuesticker.com/guide/products/headless)를 참고하세요.
|
|
269
100
|
|
|
270
101
|
### `SDKConfig`
|
|
271
102
|
|
|
272
|
-
| 속성
|
|
273
|
-
|
|
|
274
|
-
| `apiKey`
|
|
275
|
-
| `user`
|
|
276
|
-
| `
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
| 속성 | 타입 | 필수 | 설명 |
|
|
281
|
-
| ------ | -------- | ---- | ------------------ |
|
|
282
|
-
| `id` | `string` | Yes | 사용자 고유 식별자 |
|
|
283
|
-
| `name` | `string` | Yes | 사용자 표시 이름 |
|
|
284
|
-
|
|
285
|
-
---
|
|
286
|
-
|
|
287
|
-
## 이벤트
|
|
288
|
-
|
|
289
|
-
SDK는 다양한 이벤트를 발생시켜 위젯의 상태 변화를 알려줍니다.
|
|
290
|
-
|
|
291
|
-
| 이벤트 | 발생 시점 | 콜백 인자 |
|
|
292
|
-
| ------------------- | ------------------- | ------------------- |
|
|
293
|
-
| `ready` | SDK 초기화 완료 | — |
|
|
294
|
-
| `error` | 오류 발생 | `error: string` |
|
|
295
|
-
| `issue:created` | 이슈 생성 완료 | `issue: object` |
|
|
296
|
-
| `issue:updated` | 이슈 수정 완료 | `issue: object` |
|
|
297
|
-
| `issue:clicked` | 마커 클릭 | `issueId: string` |
|
|
298
|
-
| `mode:changed` | 이슈 생성 모드 변경 | `isActive: boolean` |
|
|
299
|
-
| `recording:started` | 화면 녹화 시작 | — |
|
|
300
|
-
| `recording:stopped` | 화면 녹화 종료 | — |
|
|
301
|
-
| `auth:login` | 멤버 로그인 성공 | — |
|
|
302
|
-
| `auth:logout` | 로그아웃 완료 | — |
|
|
303
|
-
|
|
304
|
-
---
|
|
305
|
-
|
|
306
|
-
## 키보드 단축키
|
|
307
|
-
|
|
308
|
-
| 단축키 | 기능 |
|
|
309
|
-
| -------------------- | ------------------- |
|
|
310
|
-
| `Ctrl/Cmd + Alt + 1` | 이슈 생성 모드 토글 |
|
|
311
|
-
| `Ctrl/Cmd + Alt + 2` | 화면 녹화 시작/중지 |
|
|
312
|
-
| `Esc` | 이슈 생성 모드 종료 |
|
|
313
|
-
|
|
314
|
-
---
|
|
315
|
-
|
|
316
|
-
## 위젯 기능
|
|
317
|
-
|
|
318
|
-
### FAB (Floating Action Button)
|
|
319
|
-
|
|
320
|
-
`issue-sticker/react` 경로로 SDK를 초기화하면 우측 하단에 플로팅 버튼이 나타납니다.
|
|
321
|
-
|
|
322
|
-
| 메뉴 | 설명 | 조건 |
|
|
323
|
-
| ---------------- | ------------------------ | -------------- |
|
|
324
|
-
| 이슈 생성 | 이슈 생성 모드 진입/종료 | 항상 표시 |
|
|
325
|
-
| 화면 녹화 | 화면 녹화 시작/중지 | 항상 표시 |
|
|
326
|
-
| 마커 보기/숨기기 | 마커 표시 토글 | 멤버 로그인 시 |
|
|
327
|
-
| 멤버 로그인 | 워크스페이스 멤버 로그인 | 비로그인 시 |
|
|
328
|
-
| 로그아웃 | 멤버 로그아웃 | 로그인 시 |
|
|
329
|
-
|
|
330
|
-
### 이슈 생성 모드
|
|
331
|
-
|
|
332
|
-
이슈 생성은 **스크린샷 모드**와 **영상 녹화 모드** 두 가지 방식을 지원합니다.
|
|
333
|
-
|
|
334
|
-
#### 스크린샷 모드
|
|
335
|
-
|
|
336
|
-
이슈 생성 시점의 화면을 정지 이미지로 캡처합니다.
|
|
337
|
-
|
|
338
|
-
1. FAB 메뉴에서 "이슈 생성" 클릭 또는 `Ctrl/Cmd + Alt + 1`
|
|
339
|
-
2. 커서가 십자 모양으로 변경되고, 마우스 오버 시 요소가 하이라이트됨
|
|
340
|
-
3. 원하는 위치 클릭 → 이슈 생성 폼 표시 (스크린샷 자동 첨부)
|
|
341
|
-
4. 폼 작성 후 제출
|
|
342
|
-
|
|
343
|
-
#### 영상 녹화 모드
|
|
344
|
-
|
|
345
|
-
버그 재현 과정을 영상으로 기록한 후 이슈에 첨부합니다.
|
|
346
|
-
|
|
347
|
-
1. FAB 메뉴에서 "화면 녹화" 클릭 또는 `Ctrl/Cmd + Alt + 2`
|
|
348
|
-
2. 화면 녹화가 시작됨 (녹화 인디케이터 표시)
|
|
349
|
-
3. 버그를 재현한 후, FAB 메뉴에서 "녹화 중지" 클릭 또는 `Ctrl/Cmd + Alt + 2`
|
|
350
|
-
4. 녹화 종료 후 자동으로 이슈 생성 모드 진입
|
|
351
|
-
5. 원하는 위치 클릭 → 이슈 생성 폼 표시 (녹화 영상 자동 첨부)
|
|
352
|
-
6. 폼 작성 후 제출
|
|
353
|
-
|
|
354
|
-
> **참고**: SDK의 영상 녹화는 브라우저 `getDisplayMedia` API를 사용합니다. 녹화 중 페이지를 리로드하거나 다른 페이지로 이동하면 녹화가 중단되며 녹화 데이터가 유실됩니다. 페이지 이동에도 끊김 없는 녹화가 필요한 경우, [IssueSticker Chrome Extension](https://chrome.google.com/webstore)을 설치하면 백그라운드 녹화를 지원하여 페이지 리로드에도 녹화가 유지됩니다.
|
|
103
|
+
| 속성 | 타입 | 필수 | 설명 |
|
|
104
|
+
| ----------------------- | ------------------------------------ | ---- | ------------------------------------------------------------------------------ |
|
|
105
|
+
| `apiKey` | `string` | Yes | [관리자 콘솔](https://app.issuesticker.com)에서 발급한 SDK API key |
|
|
106
|
+
| `user` | `SDKUser` | No | 호스트 앱의 사용자 정보. 전달하면 보고자가 기록되고 본인 이슈를 조회할 수 있다 |
|
|
107
|
+
| `onboarding` | `'off' \| 'onMount' \| 'onFABClick'` | No | 온보딩 가이드 트리거 (기본 `'onMount'`). `'off'`면 "가이드 다시 보기"도 숨긴다 |
|
|
108
|
+
| `screenshotCompression` | `{ useWebWorker?: boolean }` | No | 스크린샷 압축을 Web Worker에서 수행할지 여부 |
|
|
109
|
+
| `enabled` | `boolean` | No | 위젯 활성화 여부 (기본 `true`). `useIssueSticker` 전용 옵션 |
|
|
355
110
|
|
|
356
|
-
|
|
111
|
+
`SDKUser`는 `id`, `name` 두 필드 모두 필수입니다.
|
|
357
112
|
|
|
358
|
-
|
|
359
|
-
| ------------- | ---------------------------------------------- |
|
|
360
|
-
| 스크린샷 | 클릭 시점의 페이지 스크린샷 |
|
|
361
|
-
| 영상 | 화면 녹화 영상 (녹화 모드 사용 시) |
|
|
362
|
-
| 네트워크 로그 | 최근 50개 네트워크 요청 (URL, 상태, 소요 시간) |
|
|
363
|
-
| 콘솔 로그 | 최근 50개 콘솔 출력 (log, warn, error) |
|
|
364
|
-
| User Agent | 브라우저 및 OS 정보 |
|
|
365
|
-
| 클릭 위치 | 클릭한 요소의 CSS 선택자 및 XPath |
|
|
113
|
+
### 키보드 단축키
|
|
366
114
|
|
|
367
|
-
|
|
115
|
+
| 기능 | macOS | Windows·Linux |
|
|
116
|
+
| ------------------- | ----------- | ------------- |
|
|
117
|
+
| 이슈 생성 모드 토글 | `⌘⌥1` `⌃⌥1` | `Ctrl+Alt+1` |
|
|
118
|
+
| 화면 녹화 시작/중지 | `⌘⌥2` `⌃⌥2` | `Ctrl+Alt+2` |
|
|
119
|
+
| 이슈 생성 모드 종료 | `Esc` | `Esc` |
|
|
368
120
|
|
|
369
|
-
|
|
121
|
+
## 이슈에 담기는 정보
|
|
370
122
|
|
|
371
|
-
|
|
123
|
+
- 스크린샷 — 화면 전체와 클릭한 요소 영역 (클릭 직후 백그라운드에서 캡처)
|
|
124
|
+
- 화면 녹화 영상 — 녹화 모드로 생성한 경우
|
|
125
|
+
- 네트워크·콘솔 로그 — 각각 최근 50개, IssueSticker 자체 트래픽은 제외
|
|
126
|
+
- 브라우저·OS 정보, 발생 URL, 클릭한 요소의 CSS 선택자와 XPath
|
|
127
|
+
- 세션 리플레이 — 워크스페이스에서 사용할 수 있는 경우, 이슈 폼에서 첨부 여부를 선택
|
|
372
128
|
|
|
373
|
-
|
|
374
|
-
| -------- | --------- |
|
|
375
|
-
| Chrome | 90+ |
|
|
376
|
-
| Firefox | 90+ |
|
|
377
|
-
| Safari | 15+ |
|
|
378
|
-
| Edge | 90+ |
|
|
129
|
+
화면의 마커를 클릭하면 이슈 팝오버에서 제목·설명 수정, 삭제, 코딩 에이전트에 붙여 넣을 LLM 프롬프트를 복사할 수 있습니다. 연동된 Jira·Notion 정보는 멤버로 로그인했을 때 함께 표시됩니다.
|
|
379
130
|
|
|
380
|
-
|
|
131
|
+
화면 녹화는 브라우저 `getDisplayMedia` API를 사용하므로, 녹화 중 페이지를 새로고침하거나 다른 페이지로 이동하면 녹화가 중단되고 데이터가 유실됩니다. 페이지 이동에도 끊기지 않는 녹화가 필요하면 [Chrome Extension](https://issuesticker.com/guide/products/extension)을 사용하세요.
|
|
381
132
|
|
|
382
|
-
##
|
|
133
|
+
## 사용자 식별
|
|
383
134
|
|
|
384
|
-
|
|
135
|
+
| 모드 | 진입 방법 | 이슈 조회 범위 |
|
|
136
|
+
| ----------- | ------------------- | ----------------------------------------------------- |
|
|
137
|
+
| 익명 | `user` 없이 초기화 | 조회 없음 (이번 세션에서 생성한 이슈만 화면에 표시됨) |
|
|
138
|
+
| 사용자 식별 | `user` 전달 | 해당 사용자가 생성한 이슈 |
|
|
139
|
+
| 멤버 | FAB의 "멤버 로그인" | 프로젝트의 모든 이슈 |
|
|
385
140
|
|
|
386
|
-
|
|
141
|
+
## 문제 해결
|
|
387
142
|
|
|
388
|
-
|
|
143
|
+
`Invalid hook call` 또는 `Cannot read properties of null (reading 'useRef')` 오류는 대부분 React 인스턴스가 중복으로 로드될 때 발생합니다. `npm ls react react-dom`으로 중복을 확인하고, Vite는 `resolve.dedupe: ['react', 'react-dom']`, Webpack/Next.js는 alias로 경로를 단일화하세요.
|
|
389
144
|
|
|
390
|
-
`
|
|
391
|
-
|
|
392
|
-
### SPA(Single Page Application)에서 사용할 수 있나요?
|
|
393
|
-
|
|
394
|
-
네. URL 변경을 자동으로 감지하여 새 페이지의 이슈를 로드합니다. 위젯 UI까지 사용하려면 `useIssueSticker`를 `issue-sticker/react`에서 import해 앱 최상위에서 사용하는 방식을 권장합니다.
|
|
395
|
-
|
|
396
|
-
### `Invalid hook call` / `Cannot read properties of null (reading 'useRef')` 오류가 나요
|
|
397
|
-
|
|
398
|
-
이 오류는 대부분 **호스트 앱에 React 인스턴스가 2개 이상 로드**될 때 발생합니다.
|
|
399
|
-
|
|
400
|
-
1. 의존성 중복 확인
|
|
401
|
-
|
|
402
|
-
```bash
|
|
403
|
-
npm ls react react-dom
|
|
404
|
-
```
|
|
405
|
-
|
|
406
|
-
`react`, `react-dom`이 단일 버전으로 정리되어 있는지 확인하세요.
|
|
407
|
-
|
|
408
|
-
2. Vite 사용 시 dedupe 설정
|
|
409
|
-
|
|
410
|
-
```ts
|
|
411
|
-
// vite.config.ts
|
|
412
|
-
import { defineConfig } from 'vite';
|
|
413
|
-
|
|
414
|
-
export default defineConfig({
|
|
415
|
-
resolve: {
|
|
416
|
-
dedupe: ['react', 'react-dom'],
|
|
417
|
-
},
|
|
418
|
-
});
|
|
419
|
-
```
|
|
420
|
-
|
|
421
|
-
Webpack/Next.js 사용 시에는 alias로 React 경로를 단일화하세요.
|
|
422
|
-
|
|
423
|
-
```js
|
|
424
|
-
// next.config.js 또는 webpack config
|
|
425
|
-
const path = require('path');
|
|
426
|
-
|
|
427
|
-
module.exports = {
|
|
428
|
-
webpack: (config) => {
|
|
429
|
-
config.resolve.alias = {
|
|
430
|
-
...(config.resolve.alias || {}),
|
|
431
|
-
react: path.resolve(__dirname, 'node_modules/react'),
|
|
432
|
-
'react-dom': path.resolve(__dirname, 'node_modules/react-dom'),
|
|
433
|
-
};
|
|
434
|
-
return config;
|
|
435
|
-
},
|
|
436
|
-
};
|
|
437
|
-
```
|
|
438
|
-
|
|
439
|
-
3. import 경로 점검
|
|
440
|
-
|
|
441
|
-
- React 환경: `import { useIssueSticker } from 'issue-sticker/react'`
|
|
442
|
-
- 비 React 환경: `import { IssueSticker } from 'issue-sticker/runtime'`
|
|
443
|
-
|
|
444
|
-
루트(`issue-sticker`)에서 React 훅을 import하지 않도록 주의하세요.
|
|
445
|
-
`issue-sticker/react`를 사용할 때는 호스트 앱에 `react`, `react-dom`이 반드시 설치되어 있어야 합니다.
|
|
446
|
-
|
|
447
|
-
`[plugin:vite:import-analysis] Missing "./react" specifier in "issue-sticker" package` 오류가 보이면,
|
|
448
|
-
설치된 SDK tarball/lockfile이 오래된 상태일 가능성이 큽니다. `node_modules`와 lockfile을 갱신한 뒤 SDK를 재설치하세요.
|
|
449
|
-
|
|
450
|
-
### 리액트 없이도 사용할 수 있나요?
|
|
451
|
-
|
|
452
|
-
네. `issue-sticker/runtime`으로 코어 런타임 초기화/이벤트 연동은 가능합니다.
|
|
453
|
-
다만 FAB/이슈 폼/마커 같은 위젯 UI 기능은 `issue-sticker/react` 경로(React 환경)에서만 동작합니다.
|
|
454
|
-
|
|
455
|
-
### user 정보를 넣으면 어떤 효과가 있나요?
|
|
456
|
-
|
|
457
|
-
[동작 모드](#동작-모드) 섹션을 참조하세요. `user.id`를 전달하면 사용자 식별 모드로 동작하여 해당 사용자가 생성한 이슈만 조회할 수 있고, `user.name`이 보고자로 기록됩니다.
|
|
458
|
-
|
|
459
|
-
### 이슈 데이터는 어디에 저장되나요?
|
|
460
|
-
|
|
461
|
-
IssueSticker 클라우드 서버에 안전하게 저장됩니다. API 키에 연결된 프로젝트에 이슈가 귀속됩니다.
|
|
462
|
-
|
|
463
|
-
### 프로덕션 환경에서도 사용해도 되나요?
|
|
464
|
-
|
|
465
|
-
네. 다만 일반 사용자에게 노출하지 않으려면 특정 조건(예: 관리자 모드, 스테이징 환경)에서만 SDK를 초기화하도록 분기 처리하는 것을 권장합니다.
|
|
466
|
-
|
|
467
|
-
```tsx
|
|
468
|
-
import { useIssueSticker } from 'issue-sticker/react';
|
|
469
|
-
|
|
470
|
-
function App() {
|
|
471
|
-
useIssueSticker({
|
|
472
|
-
apiKey: 'YOUR_API_KEY',
|
|
473
|
-
enabled: isAdminMode || isStagingEnv,
|
|
474
|
-
});
|
|
475
|
-
|
|
476
|
-
return <div>My App</div>;
|
|
477
|
-
}
|
|
478
|
-
```
|
|
145
|
+
`Missing "./react" specifier in "issue-sticker" package` 오류는 설치된 패키지가 오래된 경우입니다. `node_modules`와 lockfile을 갱신한 뒤 다시 설치하세요.
|
|
479
146
|
|
|
480
|
-
|
|
147
|
+
그 밖의 문제는 [FAQ](https://issuesticker.com/guide/faq)를 참고하세요.
|
|
481
148
|
|
|
482
149
|
## 라이선스
|
|
483
150
|
|