@feedmepos/mf-miniprogram-v2 0.2.8-dev.7 → 0.2.8-dev.8

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.
@@ -5,9 +5,9 @@ import { readonly as te, ref as Z, watch as Ee, defineComponent as Te, computed
5
5
  import { useCoreStore as we } from "@feedmepos/mf-common";
6
6
  import { useRoute as Re, useRouter as Ke, RouterView as Ue } from "vue-router";
7
7
  import { P as St } from "./PortalIcon-DO0VrIoY.js";
8
- import { r as Se, u as Me, w as Ce } from "./adminAccess-B4NYKH6x.js";
8
+ import { r as Se, u as Me, w as Ce } from "./adminAccess-DdZ2qPdx.js";
9
9
  import { c as It } from "./_commonjsHelpers-DaMA6jEr.js";
10
- import { p as De } from "./portalContext-RYc53ma3.js";
10
+ import { p as De } from "./portalContext-DuVkhksq.js";
11
11
  import { e as Ge, p as dt } from "./portalNavigation-L5VwKlps.js";
12
12
  import { _ as Be } from "./_plugin-vue_export-helper-CHgC5LLL.js";
13
13
  var ae = { exports: {} };
@@ -6,17 +6,17 @@ import { D as vi, l as Vr, e as xu, T as ki } from "./index-CIJWcl_6.js";
6
6
  import { useI18n as ha, useCoreStore as io } from "@feedmepos/mf-common";
7
7
  import { useDialog as Rr, useSnackbar as Su } from "@feedmepos/ui-library";
8
8
  import { c as Xe, e as Je, b as ra, d as Jn, f as Tu, g as Eu, s as wi, C as ja, h as fs, i as Gr, j as lo, k as Cu, n as Iu, l as Au, a as $u } from "./controlPlane-DR5ykj4d.js";
9
- import { s as ms, a as gs, b as Sa, M as Ru, r as ys, p as _i, _ as Pu } from "./MobileProjectDialog-CwXuQgpj.js";
9
+ import { s as ms, a as gs, b as Sa, M as Ru, r as ys, p as _i, _ as Pu } from "./MobileProjectDialog-C4wvWZ95.js";
10
10
  import { _ as oo, B as Ou } from "./BrandFontPicker-VX2LAN2w.js";
11
11
  import { g as Nu } from "./_commonjsHelpers-DaMA6jEr.js";
12
12
  import { _ as ht } from "./_plugin-vue_export-helper-CHgC5LLL.js";
13
13
  import { C as co, F as Ns, u as Ds, i as or, a as Du, t as Mu } from "./useBrandKit-CKn1fm2o.js";
14
14
  import { _ as an } from "./StatusBadge.vue_vue_type_script_setup_true_lang-DMm_s9ua.js";
15
- import { a as Ge } from "./routes-BvzMt5vp.js";
16
- import { r as Lu, w as Bu, a as ju, b as Fu, u as Uu, c as xi } from "./adminAccess-B4NYKH6x.js";
15
+ import { a as Ge } from "./routes-CK4kOaoY.js";
16
+ import { r as Lu, w as Bu, a as ju, b as Fu, u as Uu, c as xi } from "./adminAccess-DdZ2qPdx.js";
17
17
  import { p as Ms, w as uo, a as qu, l as zu } from "./portalNavigation-L5VwKlps.js";
18
18
  import { useRoute as yr, useRouter as po } from "vue-router";
19
- import { u as Hu } from "./portalContext-RYc53ma3.js";
19
+ import { u as Hu } from "./portalContext-DuVkhksq.js";
20
20
  function Ls() {
21
21
  return { async: !1, breaks: !1, extensions: null, gfm: !0, hooks: null, pedantic: !1, renderer: null, silent: !1, tokenizer: null, walkTokens: null };
22
22
  }
@@ -1,8 +1,8 @@
1
1
  import { defineComponent as b, computed as p, ref as w, onMounted as D, onScopeDispose as A, resolveComponent as B, openBlock as c, createElementBlock as a, createElementVNode as C, toDisplayString as l, unref as r, Fragment as Z, renderList as E, normalizeStyle as U, createVNode as d, withCtx as H, createTextVNode as g, createCommentVNode as G } from "vue";
2
2
  import { useRoute as S } from "vue-router";
3
- import { a as O } from "./routes-BvzMt5vp.js";
3
+ import { a as O } from "./routes-CK4kOaoY.js";
4
4
  import { a as j, c as N, e as q } from "./controlPlane-DR5ykj4d.js";
5
- import { u as I } from "./portalContext-RYc53ma3.js";
5
+ import { u as I } from "./portalContext-DuVkhksq.js";
6
6
  import { p as u } from "./portalNavigation-L5VwKlps.js";
7
7
  import { i as R, u as T } from "./useBrandKit-CKn1fm2o.js";
8
8
  import { _ as K } from "./StatusBadge.vue_vue_type_script_setup_true_lang-DMm_s9ua.js";
@@ -1,7 +1,7 @@
1
1
  import { defineComponent as I, computed as p, openBlock as a, createElementBlock as l, normalizeClass as J, createCommentVNode as j, ref as b, watch as O, resolveComponent as C, createElementVNode as w, createBlock as z, toDisplayString as x, Fragment as V, renderList as B, createVNode as W, onMounted as Z, withCtx as U } from "vue";
2
2
  import { m as q } from "./index-CIJWcl_6.js";
3
3
  import { c as T, e as E, j as Q } from "./controlPlane-DR5ykj4d.js";
4
- import { a as g } from "./routes-BvzMt5vp.js";
4
+ import { a as g } from "./routes-CK4kOaoY.js";
5
5
  import { _ as Y } from "./_plugin-vue_export-helper-CHgC5LLL.js";
6
6
  const _ = ["miniprogram-vue"];
7
7
  function Me(n) {
@@ -1,11 +1,11 @@
1
1
  import { defineComponent as L, ref as w, computed as C, h as o, withModifiers as j, onMounted as R, onScopeDispose as V, resolveComponent as S, openBlock as r, createElementBlock as n, createElementVNode as a, createTextVNode as I, toDisplayString as M, createCommentVNode as z, createBlock as q, createVNode as _, unref as h } from "vue";
2
2
  import { useRoute as D, useRouter as A } from "vue-router";
3
3
  import { components as T, useDialog as $ } from "@feedmepos/ui-library";
4
- import { a as E } from "./routes-BvzMt5vp.js";
4
+ import { a as E } from "./routes-CK4kOaoY.js";
5
5
  import { c as O, e as U } from "./controlPlane-DR5ykj4d.js";
6
- import { u as Y } from "./portalContext-RYc53ma3.js";
6
+ import { u as Y } from "./portalContext-DuVkhksq.js";
7
7
  import { w as d } from "./portalNavigation-L5VwKlps.js";
8
- import { p as G, M as H } from "./MobileProjectDialog-CwXuQgpj.js";
8
+ import { p as G, M as H } from "./MobileProjectDialog-C4wvWZ95.js";
9
9
  import { _ as k } from "./StatusBadge.vue_vue_type_script_setup_true_lang-DMm_s9ua.js";
10
10
  import { _ as J } from "./_plugin-vue_export-helper-CHgC5LLL.js";
11
11
  const K = { class: "portal-page" }, Q = { class: "portal-page-inner" }, W = { class: "portal-page-heading" }, X = {
@@ -1,7 +1,7 @@
1
1
  import { defineComponent as N, openBlock as o, createElementBlock as l, createElementVNode as s, toDisplayString as u, createCommentVNode as q, ref as V, watch as R, computed as h, onMounted as z, resolveComponent as x, createVNode as v, unref as c, Fragment as C, renderList as $, normalizeClass as D, createBlock as k, withCtx as G } from "vue";
2
2
  import { useRoute as K, useRouter as O } from "vue-router";
3
3
  import { _ as B } from "./_plugin-vue_export-helper-CHgC5LLL.js";
4
- import { u as P, c as U, f as j, _ as b, t as H } from "./useModuleCatalog-D73n52U3.js";
4
+ import { u as P, c as U, f as j, _ as b, t as H } from "./useModuleCatalog-a4dKLnlS.js";
5
5
  const J = { class: "card" }, Q = { class: "card__head" }, W = { class: "card__name fm-typo-en-body-md-600 text-portal-text-primary" }, X = { class: "card__version fm-typo-en-body-sm-400 text-portal-text-muted" }, Y = { class: "card__description fm-typo-en-body-sm-400 text-portal-text-muted" }, Z = { class: "card__tags" }, ee = { class: "card__tag card__tag--tier fm-typo-en-body-sm-600" }, te = {
6
6
  key: 0,
7
7
  class: "card__tag card__tag--slot fm-typo-en-body-sm-400"
@@ -1,6 +1,6 @@
1
1
  import { defineComponent as C, ref as M, computed as u, watch as T, resolveComponent as g, openBlock as n, createElementBlock as l, createElementVNode as e, toDisplayString as i, createCommentVNode as _, Fragment as I, renderList as S, createVNode as k, onMounted as B, unref as d, withCtx as L, createBlock as v } from "vue";
2
2
  import { useRoute as N, useRouter as P } from "vue-router";
3
- import { m as q, i as A, u as F, _ as w } from "./useModuleCatalog-D73n52U3.js";
3
+ import { m as q, i as A, u as F, _ as w } from "./useModuleCatalog-a4dKLnlS.js";
4
4
  import { useDialog as V } from "@feedmepos/ui-library";
5
5
  import { _ as E } from "./_plugin-vue_export-helper-CHgC5LLL.js";
6
6
  const R = { class: "detail" }, j = { class: "detail__head" }, z = { class: "detail__name fm-typo-en-title-sm-600 text-portal-text-primary" }, K = { class: "detail__version fm-typo-en-body-md-400 text-portal-text-muted" }, O = {
@@ -1,6 +1,6 @@
1
1
  import { defineComponent as p, resolveComponent as i, openBlock as l, createElementBlock as m, createElementVNode as o, createVNode as r, unref as t, withCtx as u, createTextVNode as c } from "vue";
2
2
  import { useRoute as d } from "vue-router";
3
- import { u as g } from "./portalContext-RYc53ma3.js";
3
+ import { u as g } from "./portalContext-DuVkhksq.js";
4
4
  import { w as f } from "./portalNavigation-L5VwKlps.js";
5
5
  import { P as k } from "./PortalIcon-DO0VrIoY.js";
6
6
  const w = { class: "portal-page" }, y = { class: "portal-page-inner" }, b = { class: "portal-section portal-empty" }, E = /* @__PURE__ */ p({
@@ -0,0 +1,233 @@
1
+ import { defineComponent as P, ref as l, onMounted as x, resolveComponent as F, openBlock as o, createElementBlock as r, createElementVNode as e, Fragment as M, renderList as B, withDirectives as A, vModelRadio as N, toDisplayString as f, createCommentVNode as b, createBlock as R, computed as w, onScopeDispose as U, createVNode as V, unref as k } from "vue";
2
+ import { useRoute as E } from "vue-router";
3
+ import { e as T, a as L } from "./index-CIJWcl_6.js";
4
+ import { c as $, e as C, m as D } from "./controlPlane-DR5ykj4d.js";
5
+ import { useCoreStore as O } from "@feedmepos/mf-common";
6
+ import { u as H } from "./portalContext-DuVkhksq.js";
7
+ import { b as j } from "./portalNavigation-L5VwKlps.js";
8
+ import { a as q } from "./routes-CK4kOaoY.js";
9
+ import { _ as Q } from "./_plugin-vue_export-helper-CHgC5LLL.js";
10
+ const z = { class: "portal-section qr-routing" }, J = {
11
+ key: 0,
12
+ role: "status"
13
+ }, K = ["disabled"], Y = ["value"], G = { class: "portal-description" }, W = {
14
+ key: 2,
15
+ class: "portal-error",
16
+ role: "alert"
17
+ }, X = {
18
+ key: 3,
19
+ class: "portal-notice",
20
+ role: "status"
21
+ }, Z = { class: "qr-routing__actions" }, ee = /* @__PURE__ */ P({
22
+ __name: "QrRoutingSetting",
23
+ props: {
24
+ businessId: {}
25
+ },
26
+ setup(I) {
27
+ const u = I, i = l("default"), v = l("default"), g = l(!0), d = l(!1), c = l(!1), n = l(""), m = l(""), h = [
28
+ {
29
+ value: "default",
30
+ label: "Follow FeedMe’s rollout",
31
+ description: "Table QR codes move to this app when FeedMe switches your region over."
32
+ },
33
+ { value: "app", label: "This app", description: "Table QR codes open this app at your business link." },
34
+ {
35
+ value: "v3",
36
+ label: "The current ordering page",
37
+ description: "Table QR codes keep opening the ordering page customers use today."
38
+ }
39
+ ];
40
+ async function _() {
41
+ g.value = !0, n.value = "";
42
+ try {
43
+ const a = await $(q.qrRouting(u.businessId));
44
+ i.value = v.value = a.qrTarget ?? "default", d.value = !0;
45
+ } catch (a) {
46
+ n.value = C(a);
47
+ } finally {
48
+ g.value = !1;
49
+ }
50
+ }
51
+ async function y() {
52
+ if (!(!d.value || c.value || i.value === v.value)) {
53
+ c.value = !0, n.value = "", m.value = "";
54
+ try {
55
+ const a = await $(q.qrRouting(u.businessId), {
56
+ method: "PUT",
57
+ body: JSON.stringify({ qrTarget: i.value === "default" ? null : i.value })
58
+ });
59
+ i.value = v.value = a.qrTarget ?? "default", m.value = "Saved. Table QR codes follow the new setting within about five minutes.";
60
+ } catch (a) {
61
+ n.value = C(a);
62
+ } finally {
63
+ c.value = !1;
64
+ }
65
+ }
66
+ }
67
+ return x(() => void _()), (a, t) => {
68
+ const s = F("FmButton");
69
+ return o(), r("section", z, [
70
+ t[2] || (t[2] = e("h2", null, "Table QR codes", -1)),
71
+ t[3] || (t[3] = e("p", { class: "portal-description" }, "Choose where customers land when they scan a table QR code.", -1)),
72
+ g.value ? (o(), r("p", J, "Loading…")) : d.value ? (o(), r("fieldset", {
73
+ key: 1,
74
+ class: "qr-routing__options",
75
+ disabled: c.value
76
+ }, [
77
+ t[1] || (t[1] = e("legend", { class: "qr-routing__legend" }, "Table QR codes open", -1)),
78
+ (o(), r(M, null, B(h, (p) => e("label", {
79
+ key: p.value,
80
+ class: "qr-routing__option"
81
+ }, [
82
+ A(e("input", {
83
+ "onUpdate:modelValue": t[0] || (t[0] = (S) => i.value = S),
84
+ type: "radio",
85
+ name: "qr-routing",
86
+ value: p.value
87
+ }, null, 8, Y), [
88
+ [N, i.value]
89
+ ]),
90
+ e("span", null, [
91
+ e("strong", null, f(p.label), 1),
92
+ e("span", G, f(p.description), 1)
93
+ ])
94
+ ])), 64))
95
+ ], 8, K)) : b("", !0),
96
+ n.value ? (o(), r("p", W, f(n.value), 1)) : b("", !0),
97
+ m.value ? (o(), r("p", X, f(m.value), 1)) : b("", !0),
98
+ e("footer", Z, [
99
+ !d.value && !g.value ? (o(), R(s, {
100
+ key: 0,
101
+ label: "Retry",
102
+ variant: "secondary",
103
+ onClick: _
104
+ })) : (o(), R(s, {
105
+ key: 1,
106
+ label: "Save",
107
+ loading: c.value,
108
+ disabled: g.value || !d.value || i.value === v.value,
109
+ onClick: y
110
+ }, null, 8, ["loading", "disabled"]))
111
+ ])
112
+ ]);
113
+ };
114
+ }
115
+ }), se = /* @__PURE__ */ Q(ee, [["__scopeId", "data-v-5fbd8580"]]), te = { class: "portal-page" }, oe = { class: "portal-page-inner settings-page" }, ae = { class: "portal-page-heading" }, ne = ["href"], le = {
116
+ key: 0,
117
+ class: "portal-error",
118
+ role: "alert"
119
+ }, re = { class: "portal-section" }, ie = { class: "settings-value" }, ue = { class: "portal-section" }, de = { class: "settings-icon-row" }, ce = { class: "settings-icon" }, pe = ["src"], ve = { class: "portal-section" }, ge = { class: "settings-logo" }, me = ["src"], fe = /* @__PURE__ */ P({
120
+ __name: "PortalSettingsView",
121
+ setup(I) {
122
+ const u = H(), i = E(), v = O(), g = w(
123
+ () => {
124
+ var t;
125
+ return new URL(
126
+ j({
127
+ ...i.query,
128
+ businessId: u.businessId.value,
129
+ country: v.currentCountry.value ?? null,
130
+ restaurantId: ((t = v.currentRestaurant.value) == null ? void 0 : t._id) ?? null
131
+ }),
132
+ T("fmmf:dev") === "dev" ? "https://portal.feedmedev.cc" : "https://portal.feedme.cc"
133
+ ).href;
134
+ }
135
+ ), d = l(null), c = l(!0), n = l(null), m = l(!1), h = L(T("fmmf:dev")).apiOrigin, _ = w(() => `${h}/metadata/${u.businessId.value}/pwa-512x512.png`), y = w(() => {
136
+ var t;
137
+ return (t = D()) == null ? void 0 : t.thumbnail;
138
+ }), a = new AbortController();
139
+ return x(async () => {
140
+ var t;
141
+ try {
142
+ const s = await fetch(`${h}/metadata/${u.businessId.value}/config`, {
143
+ signal: AbortSignal.any([a.signal, AbortSignal.timeout(15e3)])
144
+ });
145
+ if (s.status === 404) return;
146
+ if (!s.ok) throw new Error(`Could not load app assets (HTTP ${s.status})`);
147
+ const p = await s.json();
148
+ d.value = ((t = p.pwaConfig) == null ? void 0 : t.name) ?? null;
149
+ } catch (s) {
150
+ a.signal.aborted || (n.value = C(s));
151
+ } finally {
152
+ c.value = !1;
153
+ }
154
+ }), U(() => a.abort()), (t, s) => {
155
+ const p = F("FmIcon");
156
+ return o(), r("div", te, [
157
+ e("div", oe, [
158
+ e("header", ae, [
159
+ s[1] || (s[1] = e("div", null, [
160
+ e("p", { class: "portal-eyebrow" }, "Your app identity"),
161
+ e("h1", null, "Settings")
162
+ ], -1)),
163
+ e("a", {
164
+ href: g.value,
165
+ class: "portal-link-button",
166
+ target: "_blank",
167
+ rel: "noopener"
168
+ }, "Manage assets in original Portal ↗", 8, ne)
169
+ ]),
170
+ s[10] || (s[10] = e("div", { class: "settings-tabs" }, [
171
+ e("span", null, "Assets")
172
+ ], -1)),
173
+ s[11] || (s[11] = e("p", { class: "portal-notice" }, " App assets are still managed by the original Mini Program. Edit them there to preserve existing subscription rules and shared business settings. ", -1)),
174
+ n.value ? (o(), r("p", le, f(n.value), 1)) : b("", !0),
175
+ e("section", re, [
176
+ s[2] || (s[2] = e("h2", null, "App name", -1)),
177
+ s[3] || (s[3] = e("p", { class: "portal-description" }, "Shown under the icon on your customer’s home screen.", -1)),
178
+ e("p", ie, f(c.value ? "Loading…" : n.value ? "Unavailable" : d.value || "Not configured"), 1),
179
+ s[4] || (s[4] = e("p", { class: "portal-description" }, " The original Portal applies the “FeedMe x” naming rule for non-Premium businesses. ", -1))
180
+ ]),
181
+ e("section", ue, [
182
+ s[7] || (s[7] = e("div", { class: "portal-section-head" }, [
183
+ e("div", null, [
184
+ e("h2", null, "App icon"),
185
+ e("p", { class: "portal-description" }, "One square image for the home screen.")
186
+ ])
187
+ ], -1)),
188
+ e("div", de, [
189
+ e("div", ce, [
190
+ m.value ? (o(), r(M, { key: 1 }, [
191
+ V(p, {
192
+ name: "image",
193
+ size: "xl"
194
+ }),
195
+ s[5] || (s[5] = e("span", null, "No icon available", -1))
196
+ ], 64)) : (o(), r("img", {
197
+ key: 0,
198
+ src: _.value,
199
+ alt: "Current app icon",
200
+ onError: s[0] || (s[0] = (S) => m.value = !0)
201
+ }, null, 40, pe))
202
+ ]),
203
+ s[6] || (s[6] = e("div", null, [
204
+ e("h3", null, "Icon guidelines"),
205
+ e("p", { class: "portal-description" }, " Use a square image, ideally at least 1024 × 1024 pixels. Keep the important artwork inside the central 4/5 safe area. "),
206
+ e("p", { class: "portal-description" }, "Changes to this shared icon are not part of a release build.")
207
+ ], -1))
208
+ ])
209
+ ]),
210
+ e("section", ve, [
211
+ s[8] || (s[8] = e("h2", null, "Business branding", -1)),
212
+ e("div", ge, [
213
+ y.value ? (o(), r("img", {
214
+ key: 0,
215
+ src: y.value,
216
+ alt: "Business logo"
217
+ }, null, 8, me)) : b("", !0),
218
+ e("p", null, f(k(u).businessName.value), 1)
219
+ ]),
220
+ s[9] || (s[9] = e("p", { class: "portal-description" }, " Cover images and other shared business assets remain available in the original Portal. ", -1))
221
+ ]),
222
+ k(u).businessId.value ? (o(), R(se, {
223
+ key: 1,
224
+ "business-id": k(u).businessId.value
225
+ }, null, 8, ["business-id"])) : b("", !0)
226
+ ])
227
+ ]);
228
+ };
229
+ }
230
+ }), Se = /* @__PURE__ */ Q(fe, [["__scopeId", "data-v-8ba9debf"]]);
231
+ export {
232
+ Se as default
233
+ };
@@ -1,5 +1,5 @@
1
1
  import { defineComponent as B, ref as n, resolveComponent as A, openBlock as s, createBlock as S, withCtx as J, createElementVNode as a, toDisplayString as p, createVNode as u, createElementBlock as o, createCommentVNode as y, computed as X, Fragment as D, createTextVNode as x, onMounted as Y, renderList as G, normalizeClass as Z } from "vue";
2
- import { a as T } from "./routes-BvzMt5vp.js";
2
+ import { a as T } from "./routes-CK4kOaoY.js";
3
3
  import { useDialog as ee } from "@feedmepos/ui-library";
4
4
  import { useRouter as te } from "vue-router";
5
5
  import { c as F, e as I } from "./controlPlane-DR5ykj4d.js";
@@ -1,6 +1,6 @@
1
1
  import { defineComponent as s, watchEffect as a, openBlock as n, createElementBlock as p } from "vue";
2
2
  import { useRoute as u, useRouter as i } from "vue-router";
3
- import { u as l } from "./portalContext-RYc53ma3.js";
3
+ import { u as l } from "./portalContext-DuVkhksq.js";
4
4
  import { w as m, a as f } from "./portalNavigation-L5VwKlps.js";
5
5
  const _ = {
6
6
  class: "portal-loading",
@@ -1,4 +1,4 @@
1
- import { a as u } from "./routes-BvzMt5vp.js";
1
+ import { a as u } from "./routes-CK4kOaoY.js";
2
2
  import { ref as o } from "vue";
3
3
  import { c as a } from "./controlPlane-DR5ykj4d.js";
4
4
  function l(e, t) {
package/dist/app.js CHANGED
@@ -4,24 +4,24 @@ const o = [
4
4
  path: "/platforms/mobile",
5
5
  name: "miniprogram-v2-mobile-projects",
6
6
  meta: { title: "Mobile" },
7
- component: () => import("./MobileProjectsView-CmL6GQYo.js")
7
+ component: () => import("./MobileProjectsView-CZVTbgqX.js")
8
8
  },
9
9
  {
10
10
  path: "/",
11
11
  name: "miniprogram-v2-ecosystem",
12
12
  meta: { title: "Ecosystem" },
13
13
  beforeEnter: (e) => ["workspace", "releases", "sessions"].includes(String(e.query.view)) ? { name: "miniprogram-v2-control", query: e.query } : !0,
14
- component: () => import("./EcosystemView-CseWybDf.js")
14
+ component: () => import("./EcosystemView-CVunQHEs.js")
15
15
  },
16
16
  {
17
17
  path: "/workspace",
18
18
  name: "miniprogram-v2-control",
19
- component: () => import("./WorkspaceEntryView-CC1214ig.js")
19
+ component: () => import("./WorkspaceEntryView-C4MViyFH.js")
20
20
  },
21
21
  {
22
22
  path: "/p/:projectId/:view(workspace|releases|sessions)?",
23
23
  name: "miniprogram-v2-project",
24
- component: () => import("./ControlPlaneView-DzOE4Rp5.js")
24
+ component: () => import("./ControlPlaneView-BrIrCpIX.js")
25
25
  },
26
26
  {
27
27
  path: "/brand-kit",
@@ -33,13 +33,13 @@ const o = [
33
33
  path: "/pages",
34
34
  name: "miniprogram-v2-pages",
35
35
  meta: { title: "Pages" },
36
- component: () => import("./PagesView-3ETr8RbI.js")
36
+ component: () => import("./PagesView-DgfNxkGp.js")
37
37
  },
38
38
  {
39
39
  path: "/settings",
40
40
  name: "miniprogram-v2-settings",
41
41
  meta: { title: "Settings" },
42
- component: () => import("./PortalSettingsView-DAmx9m4y.js")
42
+ component: () => import("./PortalSettingsView-DBrKVWjp.js")
43
43
  },
44
44
  ...["tablet", "kiosk"].map((e) => ({
45
45
  path: `/platforms/${e}`,
@@ -53,7 +53,7 @@ const o = [
53
53
  path: "/modules",
54
54
  name: "miniprogram-v2-module-center",
55
55
  meta: { title: "Module library" },
56
- component: () => import("./ModuleCenterView-E6ne4DiL.js")
56
+ component: () => import("./ModuleCenterView-D0Bv4sKT.js")
57
57
  },
58
58
  {
59
59
  // Keyed by the module's directory name, which is what the catalog, the
@@ -61,7 +61,7 @@ const o = [
61
61
  path: "/modules/:name",
62
62
  name: "miniprogram-v2-module-detail",
63
63
  meta: { title: "Module library" },
64
- component: () => import("./ModuleDetailView-bTcegMeT.js")
64
+ component: () => import("./ModuleDetailView-Ue3oCNxk.js")
65
65
  },
66
66
  {
67
67
  // Internal-only: linked from the main nav (App.vue), but only once
@@ -72,13 +72,13 @@ const o = [
72
72
  path: "/internal/template-center",
73
73
  name: "miniprogram-v2-template-center",
74
74
  meta: { title: "Template library", requiresAdmin: !0 },
75
- component: () => import("./TemplateCenterView-D0Gn07_x.js")
75
+ component: () => import("./TemplateCenterView-BPJSWb12.js")
76
76
  },
77
77
  {
78
78
  path: "/:pathMatch(.*)*",
79
79
  redirect: (e) => ({ name: "miniprogram-v2-ecosystem", query: e.query, params: {} })
80
80
  }
81
- ], r = {}, a = t(() => import("./App-BXXNMcyn.js")), i = t(() => import("./LegacyWorkspaceEntry-lEMtmdIe.js"));
81
+ ], r = {}, a = t(() => import("./App-CulUM6bp.js")), i = t(() => import("./LegacyWorkspaceEntry-lEMtmdIe.js"));
82
82
  export {
83
83
  a as FmApp,
84
84
  i as MiniprogramWorkspace,
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@feedmepos/mf-miniprogram-v2",
3
- "version": "0.2.8-dev.7",
3
+ "version": "0.2.8-dev.8",
4
4
  "type": "module",
5
5
  "publishConfig": {
6
6
  "access": "public",
@@ -1,4 +1,4 @@
1
- import { a as b } from "./routes-BvzMt5vp.js";
1
+ import { a as b } from "./routes-CK4kOaoY.js";
2
2
  import { useCoreStore as d } from "@feedmepos/mf-common";
3
3
  import { c as g, e as h } from "./controlPlane-DR5ykj4d.js";
4
4
  import { provide as y, computed as f, ref as c, watch as C, onScopeDispose as w, inject as x } from "vue";
@@ -1,6 +1,10 @@
1
1
  const t = (e, s) => `/api/businesses/${e}/projects/${s}`, i = {
2
2
  projects: (e) => `/api/businesses/${e}/projects`,
3
3
  portalContext: (e) => `/api/businesses/${e}/portal-context`,
4
+ /** Where this business's table QR scans open ('app' | 'v3' | default). */
5
+ qrRouting: (e) => `/api/businesses/${e}/qr-routing`,
6
+ /** Public, machine-read list of every business's QR routing, for the feedme.cc redirector. */
7
+ qrRoutingList: () => "/api/public/qr-routing",
4
8
  project: (e, s) => t(e, s),
5
9
  provision: (e, s) => `${t(e, s)}/provision`,
6
10
  refreshSlug: (e, s) => `${t(e, s)}/refresh-slug`,