From 60c3bd1cce4ee93b7eda55dead35bcf722f888d3 Mon Sep 17 00:00:00 2001 From: Abner <22141172+Silentely@users.noreply.github.com> Date: Thu, 28 May 2026 19:20:48 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat:=20=E6=96=B0=E5=A2=9E=E3=80=8C?= =?UTF-8?q?=E5=B7=B2=E6=94=AF=E4=BB=98=E7=9B=B4=E5=8F=96=20eSIM=E3=80=8D?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=EF=BC=8C=E6=94=AF=E6=8C=81=E5=B7=B2=E8=B4=AD?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E7=9B=B4=E6=8E=A5=E6=8B=89=E5=8F=96=20eSIM?= =?UTF-8?q?=20=E7=94=9F=E6=88=90=E4=BA=8C=E7=BB=B4=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在第 4 步新增第三张卡片「已支付直取 eSIM」,跳过 reserve/swap 流程, 直接调用 eSims(DOWNLOADABLE) 查询账户已有 eSIM 并生成 QR 码。 - BFF 白名单追加 eSims 查询的 App 头判定 - 新增 getESims GraphQL 查询与 fetchExistingESims/directFetchFlow 方法 - 支持多 eSIM 选择器(radio 列表)与空列表/错误状态处理 - 状态面板新增 directFetchMode 模式显示(运行时,不持久化) - 补充 zh/en 双语 i18n 文案与 .status.info 样式 - 新增 9 个单元测试,全量测试 118 用例通过 Closes #62 --- jest.config.js | 6 +- netlify/functions/giffgaff-graphql.js | 3 +- src/giffgaff/giffgaff_modular.html | 42 +++- src/giffgaff/js/giffgaff-app.js | 114 +++++++++++ src/giffgaff/js/modules/api-config.js | 7 + src/giffgaff/js/modules/esim-service.js | 76 ++++++++ src/giffgaff/js/modules/state-manager.js | 2 + src/giffgaff/js/modules/ui-controller.js | 5 +- src/giffgaff/styles/giffgaff-components.css | 4 + src/js/modules/i18n-data.js | 22 +++ tests/giffgaff/direct-fetch.test.js | 202 ++++++++++++++++++++ 11 files changed, 479 insertions(+), 4 deletions(-) create mode 100644 tests/giffgaff/direct-fetch.test.js diff --git a/jest.config.js b/jest.config.js index d187f06..a495c6b 100644 --- a/jest.config.js +++ b/jest.config.js @@ -27,8 +27,12 @@ module.exports = { // 覆盖率收集 collectCoverageFrom: [ 'src/js/modules/**/*.js', + 'src/giffgaff/js/modules/**/*.js', + 'src/simyo/js/modules/**/*.js', '!src/js/modules/**/*.test.js', '!src/js/modules/**/*.spec.js', + '!src/giffgaff/js/modules/**/*.test.js', + '!src/simyo/js/modules/**/*.test.js', '!**/node_modules/**', '!**/dist/**' ], @@ -73,4 +77,4 @@ module.exports = { // 恢复模拟 restoreMocks: true -}; \ No newline at end of file +}; diff --git a/netlify/functions/giffgaff-graphql.js b/netlify/functions/giffgaff-graphql.js index 0bedce2..b4dd15d 100644 --- a/netlify/functions/giffgaff-graphql.js +++ b/netlify/functions/giffgaff-graphql.js @@ -66,7 +66,8 @@ exports.handler = withAuth(async (event, context, { auth, body }) => { const isSwap = /swapSim\s*\(/i.test(String(query || '')) || /swapSim/i.test(opName); const isToken = /eSimDownloadToken\s*\(/i.test(String(query || '')) || /eSimDownloadToken/i.test(opName); const isMfaChallenge = /simSwapMfaChallenge/i.test(String(query || '')) || /simSwapMfaChallenge/i.test(opName); - const needsAppHeaders = isReserve || isSwap || isToken || isMfaChallenge; + const isESims = /eSims\s*\(/i.test(String(query || '')) || /getESims/i.test(opName); + const needsAppHeaders = isReserve || isSwap || isToken || isMfaChallenge || isESims; if (needsAppHeaders) { requestHeaders['x-gg-app-device-manufacturer'] = process.env.GG_APP_DEVICE_MANUFACTURER || 'Apple'; diff --git a/src/giffgaff/giffgaff_modular.html b/src/giffgaff/giffgaff_modular.html index e58f444..0c135cc 100644 --- a/src/giffgaff/giffgaff_modular.html +++ b/src/giffgaff/giffgaff_modular.html @@ -623,7 +623,7 @@ 请选择一种方式完成 eSIM 激活:

-
+
@@ -653,6 +653,28 @@
+
+
+
+ +
+ 已支付直取 eSIM + Fetch eSIM directly +
+

+ 已在官方 App 完成支付,直接拉取 eSIM。 + Already paid in the official app — fetch the eSIM directly. +

+
+ + 新购用户专用 + For new-purchase users + +
+
+
+
@@ -690,6 +712,24 @@
+ + +