Skip to content

Commit c9ae1b0

Browse files
Merge pull request #68 from Palbahngmiyine/master
Update Next.js example
2 parents 80a363a + b34dd12 commit c9ae1b0

6 files changed

Lines changed: 167 additions & 125 deletions

File tree

.travis.yml

Lines changed: 0 additions & 7 deletions
This file was deleted.

examples/README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@ node ${실행 할 자바스크립트 파일}
4141

4242
```text
4343
./nextjs/* Next.js + SOLAPI SDK 연동 예제(UI)
44+
45+
# Next.js 예제만 확인해보고 싶다면 아래의 명령어를 입력해주세요!(npm 설치 필수)
46+
npx degit solapi/solapi-nodejs/examples/nextjs#main sdk-test-app
4447
```
4548

4649
```text

examples/nextjs/src/app/actions.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import {
1313
import {extractVariablesFields, formDataToObject} from '@/lib/formData';
1414

1515
// 주의!! 실제 발송 연동시에는 오로지 서버에서 api key를 관리해서 MessageService를 호출 하도록 해주세요.
16-
// 본인의 Api Key가 유출되어 발생하는 피해는 오로지 개인에게 있습니다!
16+
// 본인의 부주의로 인해 Api Key가 유출되어 발생하는 피해는 오로지 개인에게 있습니다!
1717
export async function getApiKeys(): Promise<Array<string | undefined>> {
1818
return [process.env.SOLAPI_API_KEY, process.env.SOLAPI_API_SECRET];
1919
}
@@ -31,7 +31,7 @@ export async function sendMessage(formData: FormData) {
3131
messageFormSchema.parse(rawFormData);
3232

3333
// 주의!! 실제 발송 연동시에는 오로지 서버에서 api key를 관리해서 MessageService를 호출 하도록 해주세요.
34-
// 본인의 Api Key가 유출되어 발생하는 피해는 오로지 개인에게 있습니다!
34+
// 본인의 부주의로 인해 Api Key가 유출되어 발생하는 피해는 오로지 개인에게 있습니다!
3535
const messageService = new SolapiMessageService(apiKey, apiSecret);
3636
await messageService.send({from, to, text}).then(console.log);
3737

@@ -74,6 +74,8 @@ export async function sendAlimtalk(formData: FormData) {
7474

7575
const variables = extractVariablesFields(data);
7676

77+
// 주의!! 실제 발송 연동시에는 오로지 서버에서 api key를 관리해서 MessageService를 호출 하도록 해주세요.
78+
// 본인의 부주의로 인해 Api Key가 유출되어 발생하는 피해는 오로지 개인에게 있습니다!
7779
const messageService = new SolapiMessageService(data.apiKey, data.apiSecret);
7880
await messageService
7981
.send({

examples/nextjs/src/components/AlimtalkForm.tsx

Lines changed: 45 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -59,15 +59,14 @@ export default function AlimtalkForm() {
5959

6060
useEffect(() => {
6161
if (template != null) {
62-
setVariables(
63-
getKakaoTemplateVariables(
64-
template.content +
65-
' ' +
66-
template.emphasizeTitle +
67-
' ' +
68-
template.emphasizeSubtitle,
69-
),
70-
);
62+
let tempContent: string;
63+
tempContent = `${template.content} ${template.emphasizeTitle} ${template.emphasizeSubtitle}`;
64+
template.buttons?.forEach(btn => {
65+
tempContent += ` ${btn.linkAnd} ${btn.linkIos} ${btn.linkMo} ${btn.linkPc}`;
66+
});
67+
68+
const parsedContent = getKakaoTemplateVariables(tempContent);
69+
setVariables(parsedContent);
7170
}
7271
}, [template]);
7372

@@ -169,6 +168,43 @@ export default function AlimtalkForm() {
169168
{variables.length > 0 && (
170169
<>
171170
<h3 className="text-2xl">템플릿에 등록된 치환문구 목록</h3>
171+
<p className="">
172+
<b className="font-extrabold text-2xl"># 주의사항 #</b>
173+
<br />
174+
등록된 템플릿의 변수 중 링크를 변수화 시켰다면, 템플릿 내용을
175+
확인해주세요.
176+
<br />
177+
http:// 나 https:// 를 변수의 앞에 미리 입력해두었다면, 실제
178+
치환문구 입력시에는 http:// 혹은 https:// 는 제거되어야 합니다!
179+
</p>
180+
<div>
181+
<h4 className="mb-2 text-xl font-bold">
182+
템플릿 치환문구 확인용 내용
183+
</h4>
184+
<ul>
185+
{template?.emphasizeTitle && template.emphasizeTitle != '' && (
186+
<li>강조표기 제목: {template?.emphasizeTitle}</li>
187+
)}
188+
{template?.emphasizeSubtitle &&
189+
template.emphasizeSubtitle != '' && (
190+
<li>강조표기 부제목: {template?.emphasizeSubtitle}</li>
191+
)}
192+
<li>템플릿 내용: {template?.content}</li>
193+
{template?.buttons?.map((btn, idx) => (
194+
<div key={idx}>
195+
<h4 className="text-lg font-bold mt-1.5">
196+
{btn.buttonName} 버튼의 링크 목록:
197+
</h4>
198+
<ul>
199+
{btn.linkMo && <li>모바일 링크: {btn.linkMo}</li>}
200+
{btn.linkPc && <li>PC 링크: {btn.linkPc}</li>}
201+
{btn.linkAnd && <li>{btn.linkAnd}</li>}
202+
{btn.linkIos && <li>{btn.linkIos}</li>}
203+
</ul>
204+
</div>
205+
))}
206+
</ul>
207+
</div>
172208
{variables.map((variable, key) => (
173209
<div className="w-full" key={key}>
174210
<div>

package.json

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -46,27 +46,27 @@
4646
"qs": "^6.14.0"
4747
},
4848
"devDependencies": {
49-
"@eslint/eslintrc": "^3.3.0",
50-
"@eslint/js": "^9.21.0",
49+
"@eslint/eslintrc": "^3",
50+
"@eslint/js": "^9",
5151
"@parcel/packager-ts": "^2.13.3",
5252
"@parcel/transformer-typescript-tsc": "^2.13.3",
5353
"@parcel/transformer-typescript-types": "^2.13.3",
5454
"@parcel/validator-typescript": "^2.13.3",
5555
"@types/crypto-js": "^4.2.2",
5656
"@types/image-to-base64": "^2.1.2",
57-
"@types/node": "^22.13.5",
57+
"@types/node": "^18",
5858
"@types/qs": "^6.9.18",
59-
"@typescript-eslint/eslint-plugin": "^8.25.0",
60-
"@typescript-eslint/parser": "^8.25.0",
61-
"eslint": "^9.21.0",
59+
"@typescript-eslint/eslint-plugin": "^8.26.0",
60+
"@typescript-eslint/parser": "^8.26.0",
61+
"eslint": "^9",
6262
"eslint-plugin-tsdoc": "^0.4.0",
6363
"eslint-plugin-unused-imports": "^4.1.4",
6464
"globals": "^16.0.0",
6565
"parcel": "^2.13.3",
66-
"prettier": "^3.5.2",
66+
"prettier": "^3.5.3",
6767
"rimraf": "^6.0.1",
6868
"typedoc": "^0.27.9",
69-
"typescript": "^5.7.3"
69+
"typescript": "^5.8.2"
7070
},
7171
"packageManager": "yarn@4.6.0",
7272
"engines": {

0 commit comments

Comments
 (0)