From eae5ed80d6630c7ad8ea44d5f8bdc21e8fe26042 Mon Sep 17 00:00:00 2001 From: yooseohyeon Date: Thu, 6 Aug 2026 10:23:56 +0900 Subject: [PATCH 1/3] =?UTF-8?q?fix:=20=EC=B9=B4=EC=B9=B4=EC=98=A4=ED=86=A1?= =?UTF-8?q?=20=EA=B3=B5=EC=9C=A0=20=EC=8B=9C=20=EC=83=81=EC=84=B8=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20PATH=EB=A5=BC=20=ED=85=9C?= =?UTF-8?q?=ED=94=8C=EB=A6=BF=EC=97=90=20=EC=A0=84=EB=8B=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/mover/detail/MoverDetailShare.tsx | 8 ++++++-- src/lib/kakao/share.ts | 9 +++++++++ src/lib/kakao/shareTemplate.ts | 12 +++++++++++- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/components/mover/detail/MoverDetailShare.tsx b/src/components/mover/detail/MoverDetailShare.tsx index 5d75cdba..4cf60d38 100644 --- a/src/components/mover/detail/MoverDetailShare.tsx +++ b/src/components/mover/detail/MoverDetailShare.tsx @@ -3,7 +3,7 @@ import { useRef, useState } from "react"; import { Text } from "@/components/common/Text"; -import { shareKakaoMoverCustom, toKakaoShareImageUrl } from "@/lib/kakao/share"; +import { shareKakaoMoverCustom, toKakaoShareImageUrl, toKakaoSharePath } from "@/lib/kakao/share"; import { usePageShare } from "@/hooks/usePageShare"; import { ClipIcon } from "@/icons"; import { hasFacebookAppId } from "@/lib/facebook/share"; @@ -70,7 +70,11 @@ export default function MoverDetailShare({ setIsKakaoSharing(true); try { await shareKakaoMoverCustom({ - templateArgs: kakaoShare, + templateArgs: { + ...kakaoShare, + PATH: toKakaoSharePath(), + }, + onMissingConfig: () => onToastMessage?.("카카오톡 공유 설정이 필요합니다."), onError: (message) => onToastMessage?.(message), }); } finally { diff --git a/src/lib/kakao/share.ts b/src/lib/kakao/share.ts index 9d4aa05c..d3114aba 100644 --- a/src/lib/kakao/share.ts +++ b/src/lib/kakao/share.ts @@ -1,5 +1,6 @@ import { buildKakaoShareImageUrl, + buildKakaoSharePath, getKakaoJavascriptKey, getMoverShareTemplateId, hasKakaoJavascriptKey, @@ -168,3 +169,11 @@ export function toKakaoShareImageUrl(src: string | null | undefined): string { const origin = typeof window !== "undefined" ? window.location.origin : undefined; return buildKakaoShareImageUrl(src, origin); } + +/** 클라이언트 현재 경로를 카카오 템플릿 ${PATH} 인자로 변환 */ +export function toKakaoSharePath(): string { + if (typeof window === "undefined") { + return ""; + } + return buildKakaoSharePath(window.location.pathname, window.location.search); +} diff --git a/src/lib/kakao/shareTemplate.ts b/src/lib/kakao/shareTemplate.ts index 6f97983e..f5079ef9 100644 --- a/src/lib/kakao/shareTemplate.ts +++ b/src/lib/kakao/shareTemplate.ts @@ -1,12 +1,22 @@ import { DEFAULT_MOVER_PROFILE_IMAGE } from "@/lib/utils/moverProfileImage"; -/** 기사님 상세 카카오톡 메시지 공유 템플릿 인자 */ +/** + * 기사님 상세 카카오톡 메시지 공유 템플릿 인자 + * PATH: 템플릿 링크 `https://도메인/${PATH}` 용 (앞 슬래시 없이, 예: movers/{id}) + */ export interface KakaoMoverShareTemplateArgs { + PATH: string; driver_name: string; like_count: string; driver_profile: string; } +/** 카카오 템플릿 ${PATH}용 — `/movers/1` → `movers/1` */ +export function buildKakaoSharePath(pathname: string, search = ""): string { + const path = pathname.replace(/^\//, ""); + return search ? `${path}${search}` : path; +} + export function parseKakaoTemplateId(raw: string | undefined): number | null { const trimmed = raw?.trim(); if (!trimmed) { From da3c215952bb45cdf5043021c6dd088ce3fc6420 Mon Sep 17 00:00:00 2001 From: yooseohyeon Date: Thu, 6 Aug 2026 10:30:53 +0900 Subject: [PATCH 2/3] =?UTF-8?q?fix:=20buildKakaoSharePath=EA=B0=80=20?= =?UTF-8?q?=EC=84=A0=ED=96=89=20=EC=8A=AC=EB=9E=98=EC=8B=9C=EB=A5=BC=20?= =?UTF-8?q?=EB=AA=A8=EB=91=90=20=EC=A0=9C=EA=B1=B0=ED=95=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/lib/kakao/shareTemplate.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/kakao/shareTemplate.ts b/src/lib/kakao/shareTemplate.ts index f5079ef9..27f9b94d 100644 --- a/src/lib/kakao/shareTemplate.ts +++ b/src/lib/kakao/shareTemplate.ts @@ -13,7 +13,7 @@ export interface KakaoMoverShareTemplateArgs { /** 카카오 템플릿 ${PATH}용 — `/movers/1` → `movers/1` */ export function buildKakaoSharePath(pathname: string, search = ""): string { - const path = pathname.replace(/^\//, ""); + const path = pathname.replace(/^\/+/, ""); return search ? `${path}${search}` : path; } From 84b5f8c0b4a80e2bd065c6f15c2a0404d20e7d2b Mon Sep 17 00:00:00 2001 From: yooseohyeon Date: Thu, 6 Aug 2026 10:49:08 +0900 Subject: [PATCH 3/3] =?UTF-8?q?fix:=20=EB=B9=88=20PATH=EC=9D=B8=20?= =?UTF-8?q?=EA=B2=BD=EC=9A=B0=20=EB=AA=85=EC=8B=9C=EC=A0=81=20=EC=97=90?= =?UTF-8?q?=EB=9F=AC=20throw=20=EB=B0=8F=20=ED=86=A0=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=95=88=EB=82=B4=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/mover/detail/MoverDetailShare.tsx | 6 +++++- src/lib/kakao/share.ts | 10 ++++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/components/mover/detail/MoverDetailShare.tsx b/src/components/mover/detail/MoverDetailShare.tsx index 4cf60d38..2ce78ba0 100644 --- a/src/components/mover/detail/MoverDetailShare.tsx +++ b/src/components/mover/detail/MoverDetailShare.tsx @@ -69,14 +69,18 @@ export default function MoverDetailShare({ kakaoSharingRef.current = true; setIsKakaoSharing(true); try { + const PATH = toKakaoSharePath(); await shareKakaoMoverCustom({ templateArgs: { ...kakaoShare, - PATH: toKakaoSharePath(), + PATH, }, onMissingConfig: () => onToastMessage?.("카카오톡 공유 설정이 필요합니다."), onError: (message) => onToastMessage?.(message), }); + } catch (error) { + const message = error instanceof Error ? error.message : "카카오톡 공유에 실패했습니다."; + onToastMessage?.(message); } finally { kakaoSharingRef.current = false; setIsKakaoSharing(false); diff --git a/src/lib/kakao/share.ts b/src/lib/kakao/share.ts index d3114aba..8733bb3a 100644 --- a/src/lib/kakao/share.ts +++ b/src/lib/kakao/share.ts @@ -173,7 +173,13 @@ export function toKakaoShareImageUrl(src: string | null | undefined): string { /** 클라이언트 현재 경로를 카카오 템플릿 ${PATH} 인자로 변환 */ export function toKakaoSharePath(): string { if (typeof window === "undefined") { - return ""; + throw new Error("카카오톡 공유 경로는 브라우저에서만 사용할 수 있습니다."); } - return buildKakaoSharePath(window.location.pathname, window.location.search); + + const path = buildKakaoSharePath(window.location.pathname, window.location.search); + if (!path) { + throw new Error("카카오톡 공유 경로를 확인할 수 없습니다."); + } + + return path; }