visitor-session.ts 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. const STORAGE_PREFIX = "visitor_access_token_";
  2. const EMAIL_PREFIX = "visitor_contact_email_";
  3. const EMAIL_PROMPT_DONE_PREFIX = "visitor_email_prompt_done_";
  4. export function saveVisitorContactEmail(visitorId: number, email: string): void {
  5. if (typeof window === "undefined" || !visitorId || !email.trim()) {
  6. return;
  7. }
  8. window.localStorage.setItem(`${EMAIL_PREFIX}${visitorId}`, email.trim());
  9. }
  10. export function getVisitorContactEmail(visitorId: number): string | null {
  11. if (typeof window === "undefined" || !visitorId) {
  12. return null;
  13. }
  14. return window.localStorage.getItem(`${EMAIL_PREFIX}${visitorId}`);
  15. }
  16. /** 标记邮箱采集提示已完成(已填邮箱或已发过首条消息),清除浏览器缓存前不再展示 */
  17. export function saveVisitorEmailPromptDone(visitorId: number): void {
  18. if (typeof window === "undefined" || !visitorId) return;
  19. window.localStorage.setItem(`${EMAIL_PROMPT_DONE_PREFIX}${visitorId}`, "1");
  20. }
  21. export function isVisitorEmailPromptDone(visitorId: number): boolean {
  22. if (typeof window === "undefined" || !visitorId) return false;
  23. return window.localStorage.getItem(`${EMAIL_PROMPT_DONE_PREFIX}${visitorId}`) === "1";
  24. }
  25. /** 是否还需要展示邮箱采集行(无已存邮箱且未完成采集流程) */
  26. export function shouldShowVisitorEmailPrompt(visitorId: number): boolean {
  27. if (!visitorId) return true;
  28. if (getVisitorContactEmail(visitorId)) return false;
  29. if (isVisitorEmailPromptDone(visitorId)) return false;
  30. return true;
  31. }
  32. export function saveVisitorAccessToken(conversationId: number, token: string): void {
  33. if (typeof window === "undefined" || !conversationId || !token) {
  34. return;
  35. }
  36. window.localStorage.setItem(`${STORAGE_PREFIX}${conversationId}`, token);
  37. }
  38. export function getVisitorAccessToken(conversationId: number): string | null {
  39. if (typeof window === "undefined" || !conversationId) {
  40. return null;
  41. }
  42. return window.localStorage.getItem(`${STORAGE_PREFIX}${conversationId}`);
  43. }
  44. export function clearVisitorAccessToken(conversationId: number): void {
  45. if (typeof window === "undefined" || !conversationId) {
  46. return;
  47. }
  48. window.localStorage.removeItem(`${STORAGE_PREFIX}${conversationId}`);
  49. }
  50. /** 访客会话 API 请求头(携带 access_token) */
  51. export function getVisitorConversationHeaders(
  52. conversationId: number,
  53. accessToken?: string | null
  54. ): Record<string, string> {
  55. const token = accessToken ?? getVisitorAccessToken(conversationId);
  56. if (!token) {
  57. return {};
  58. }
  59. return { "X-Conversation-Token": token };
  60. }