@feedmepos/mf-connect 0.1.98-beta.32 → 0.1.98-beta.34

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.
Files changed (108) hide show
  1. package/dist/{App-CNxXYDQA.js → App-BR2UXO7l.js} +8 -8
  2. package/dist/{AuditLogs-1BQil5oX.js → AuditLogs-BBD1wTXb.js} +9 -9
  3. package/dist/{Bin-aAMGXyy9.js → Bin-DwrHg3SM.js} +8 -8
  4. package/dist/{Broadcast-D5bqpEmf.js → Broadcast-CDD_5WRc.js} +11 -11
  5. package/dist/{CampaignAnalytic-CN2WcXYn.js → CampaignAnalytic-RrQKMFge.js} +700 -540
  6. package/dist/{CampaignTypeDialog.vue_vue_type_script_setup_true_lang-D9GfSdXq.js → CampaignTypeDialog.vue_vue_type_script_setup_true_lang-BqJ4eBqz.js} +6 -6
  7. package/dist/{Card-DfEuS5gl.js → Card-DtNiiVL5.js} +18 -18
  8. package/dist/{Collections-1OTkyEYN.js → Collections-DmHTGdZr.js} +8 -8
  9. package/dist/{Credit-qCK-zP2Y.js → Credit-XUkEFWyO.js} +12 -12
  10. package/dist/{EditCampaignSheet.vue_vue_type_script_setup_true_lang-9NWM4yOR.js → EditCampaignSheet.vue_vue_type_script_setup_true_lang-D1flbVc5.js} +31 -31
  11. package/dist/{EffectSheet.vue_vue_type_style_index_0_lang-Dnhei4AU.js → EffectSheet.vue_vue_type_style_index_0_lang-B9RTx5e6.js} +6 -6
  12. package/dist/{Experience-BBU56znM.js → Experience-8FQBl3Jk.js} +12 -12
  13. package/dist/{FileSaver.min-D_mPZjeB.js → FileSaver.min-CJx_XKAF.js} +1 -1
  14. package/dist/{Game-B9mElf85.js → Game-DtG-3-20.js} +13 -13
  15. package/dist/{Grab-CbsGHZfG.js → Grab-D-d1UWrd.js} +9 -9
  16. package/dist/{ImageInput.vue_vue_type_script_setup_true_lang-VL01SI_I.js → ImageInput.vue_vue_type_script_setup_true_lang-CKScubJr.js} +1 -1
  17. package/dist/{Index-CZIwtF0k.js → Index-CQFVY2_M.js} +10 -10
  18. package/dist/{LocationPicker.vue_vue_type_script_setup_true_lang-juzVYVi0.js → LocationPicker.vue_vue_type_script_setup_true_lang-BWaMK57y.js} +1 -1
  19. package/dist/{LottieAnimation.vue_vue_type_script_setup_true_lang-Br92n7M3.js → LottieAnimation.vue_vue_type_script_setup_true_lang-CyANZcR6.js} +1 -1
  20. package/dist/{LoyaltyDashboard-DjkNjh1M.js → LoyaltyDashboard-hdaNCbqS.js} +7 -7
  21. package/dist/{MainLayout-BHdPdHlp.js → MainLayout-IoBUK1t1.js} +1 -1
  22. package/dist/{Marketing-CQdgWswq.js → Marketing-CjmMZIjz.js} +4 -4
  23. package/dist/{MarketingMaterialEdit-jzSiHrVn.js → MarketingMaterialEdit-C1W9eMIl.js} +6 -6
  24. package/dist/{Member-CdnKnmuC.js → Member-BNH1jrcb.js} +11 -11
  25. package/dist/{MemberList-nA2eRYW6.js → MemberList-BqINyMhD.js} +25 -25
  26. package/dist/{MemberTransactions-BHALSRqB.js → MemberTransactions-0ajNUHJh.js} +1 -1
  27. package/dist/{MessageInput.vue_vue_type_script_setup_true_lang-TXiPUFjM.js → MessageInput.vue_vue_type_script_setup_true_lang-CwJaBsFN.js} +9 -9
  28. package/dist/{Mission-B0aReKMJ.js → Mission-CjKBQ4hb.js} +13 -13
  29. package/dist/Overview-AX_6SxrE.js +1284 -0
  30. package/dist/{Overview-CIB61CBG.js → Overview-CKnshNlU.js} +18 -18
  31. package/dist/{Point-BgUEcVbF.js → Point-ggQx_C1t.js} +12 -12
  32. package/dist/{Promotion-CBHfk3xI.js → Promotion-2eipp2Ey.js} +13 -13
  33. package/dist/{Queue-DdQHEsaR.js → Queue-Dt8Qh-VK.js} +10 -10
  34. package/dist/{Record-BkLjJ-kq.js → Record-Ykk-3IbY.js} +9 -9
  35. package/dist/{Review-Cxa2Bi2q.js → Review-Bc7rBVWg.js} +2 -2
  36. package/dist/{ReviewFacebookCallback-BhSWj_BK.js → ReviewFacebookCallback-BqCM0C5t.js} +5 -5
  37. package/dist/{ReviewGoogleCallback-DlKlinv4.js → ReviewGoogleCallback-AusPx9Qd.js} +5 -5
  38. package/dist/{Reward-1_9Thzxv.js → Reward-BBuWaXxY.js} +16 -16
  39. package/dist/{RewardGroup.vue_vue_type_script_setup_true_lang-D-pu0qTL.js → RewardGroup.vue_vue_type_script_setup_true_lang-BmFszOzd.js} +11 -11
  40. package/dist/{RuleGroup.vue_vue_type_script_setup_true_lang-C55MTCd6.js → RuleGroup.vue_vue_type_script_setup_true_lang-BmebXPla.js} +14 -14
  41. package/dist/{Segment-CbuM0oqp.js → Segment-BRzfoGuE.js} +24 -24
  42. package/dist/{SelectItems.vue_vue_type_script_setup_true_lang-DTw26WFe.js → SelectItems.vue_vue_type_script_setup_true_lang-ll1Zl1NM.js} +2 -2
  43. package/dist/{SendCollectionSheet.vue_vue_type_script_setup_true_lang-ChIeh5kM.js → SendCollectionSheet.vue_vue_type_script_setup_true_lang-xYvyDS15.js} +12 -12
  44. package/dist/{SendVoucherSheet.vue_vue_type_script_setup_true_lang-BtRbHWrt.js → SendVoucherSheet.vue_vue_type_script_setup_true_lang-1_KEGmQS.js} +4 -4
  45. package/dist/{Setting-D6XLdUHo.js → Setting-Dqd70ZVG.js} +14 -14
  46. package/dist/{SettingAdvertisements-CROGLyf0.js → SettingAdvertisements-k0WfcX1K.js} +12 -12
  47. package/dist/{Settings-DgJFEIpt.js → Settings-BJtDdCkJ.js} +5 -5
  48. package/dist/{Store-DDojtoEi.js → Store-Ob71BJHB.js} +21 -21
  49. package/dist/{StoreRewards-BTVhqRbW.js → StoreRewards-DJ3Ugt_h.js} +15 -15
  50. package/dist/{StoreTransactions.vue_vue_type_script_setup_true_lang-BxCy3Fk5.js → StoreTransactions.vue_vue_type_script_setup_true_lang-CazJrfSC.js} +386 -445
  51. package/dist/{TargetLocationInput.vue_vue_type_script_setup_true_lang-y2NxEq4f.js → TargetLocationInput.vue_vue_type_script_setup_true_lang-DVDxB8wn.js} +2 -2
  52. package/dist/{Tier-BWVosUHF.js → Tier-rtR9s70b.js} +24 -24
  53. package/dist/{Title-Dcu9e-na.js → Title-Cj96AOQB.js} +21 -21
  54. package/dist/{Transaction-B0V2qZBQ.js → Transaction-oyGtjd_T.js} +2 -2
  55. package/dist/{UserRuleGroup.vue_vue_type_script_setup_true_lang-CE1HmXwU.js → UserRuleGroup.vue_vue_type_script_setup_true_lang-SPHicnDN.js} +6 -6
  56. package/dist/{Voucher-u2IJaAHw.js → Voucher-B5N-YGJK.js} +14 -14
  57. package/dist/{VoucherEditor.vue_vue_type_script_setup_true_lang-DlCEICsf.js → VoucherEditor.vue_vue_type_script_setup_true_lang-der0dPTi.js} +12 -12
  58. package/dist/{ZodTextField.vue_vue_type_script_setup_true_lang-BqcVNJY1.js → ZodTextField.vue_vue_type_script_setup_true_lang-YICmUY9J.js} +2 -2
  59. package/dist/{app-J_0SevWd.js → app-DM6oVZsM.js} +120 -65
  60. package/dist/app.js +1 -1
  61. package/dist/{business-CsYOIMmN.js → business-BGKVouFN.js} +1 -1
  62. package/dist/{campaign-CEuSGs0P.js → campaign-lNt9Yuxj.js} +2 -2
  63. package/dist/{campaign-B7AmOe4b.js → campaign-u9WwQFI9.js} +7 -7
  64. package/dist/{campaign.fn-i8dPJ25D.js → campaign.fn-Cadt9swf.js} +20 -20
  65. package/dist/{collection.fn-BQ8wuiDD.js → collection.fn-RLwjpdkT.js} +2 -2
  66. package/dist/{duplicateCampaign-CU-vJAMn.js → duplicateCampaign-QMgpeHWr.js} +2 -2
  67. package/dist/{effect-CdiluX3c.js → effect-CqtFAMMC.js} +1 -1
  68. package/dist/{email-addresses-CRks2VoS.js → email-addresses-h8wGPJ7R.js} +2 -2
  69. package/dist/{export-BzO_R_tT.js → export-DY3Hegrb.js} +3 -3
  70. package/dist/{helper-DQ1hga5s.js → helper-DPKh_ZjU.js} +1 -1
  71. package/dist/{index-Ci4w7iLa.js → index-2iE9rOed.js} +1 -1
  72. package/dist/{index-yrH8x1-i.js → index-BSZynXOw.js} +1 -1
  73. package/dist/{index-CUhcefIe.js → index-BkQrvkOb.js} +2 -2
  74. package/dist/{index-B09Leh3n.js → index-BzhAfqFB.js} +13 -8
  75. package/dist/{index-DQGjv4xY.js → index-C-AVWuWN.js} +2 -2
  76. package/dist/{index-CCEi8Zf_.js → index-CJQKTuIk.js} +1 -1
  77. package/dist/{index-0O1t0S4q.js → index-CTOeD7L9.js} +1 -1
  78. package/dist/{index-DtlnuU5Q.js → index-D7gOjsR0.js} +3 -3
  79. package/dist/{index-MjBzQEFO.js → index-DNAHL9AU.js} +2 -2
  80. package/dist/{index-BsnVJG1F.js → index-DQ1APEdi.js} +1 -1
  81. package/dist/{index-BXOpGbAX.js → index-DkNqohh9.js} +23 -16
  82. package/dist/{index-DJUdhmNI.js → index-DqX1Vli-.js} +1 -1
  83. package/dist/{index-C_fi9WV2.js → index-oM-xH8hF.js} +1 -1
  84. package/dist/{index-D_7zLq-s.js → index-oVSJYEzS.js} +1 -1
  85. package/dist/{index-BmpKqhfv.js → index-ogxSJTLh.js} +2 -2
  86. package/dist/{index.esm2017-BIjrnzt3.js → index.esm2017-CG7XIwEp.js} +1 -1
  87. package/dist/{loading-Oo_J76T6.js → loading-4amdJgCm.js} +1 -1
  88. package/dist/{lodash-D_m_JBgX.js → lodash-DGzcyEFQ.js} +1 -1
  89. package/dist/{membership-BzicPSED.js → membership-Pu5_24FL.js} +2 -2
  90. package/dist/{money-D_TgioqX.js → money-bExnxIDJ.js} +1 -1
  91. package/dist/{number-C69W9t0P.js → number-CfKE2tk7.js} +1 -1
  92. package/dist/{objectid-8WROvPOV.js → objectid-Ku2j_Y91.js} +9 -9
  93. package/dist/{plugins-DU_sWFOn.js → plugins-BiRxH8HH.js} +3 -3
  94. package/dist/{reward-gUVChY_n.js → reward-CTrFirP6.js} +1 -1
  95. package/dist/{rule-DN1rfxVA.js → rule-Bpp0MdS0.js} +3 -3
  96. package/dist/{rule-builder-BnU36OpM.js → rule-builder-DgUulIzK.js} +1 -1
  97. package/dist/{template-BOXPK0-P.js → template-Dh3E1B5P.js} +6 -6
  98. package/dist/{timezone-CV5vHYYz.js → timezone-cJCD0TZs.js} +1 -1
  99. package/dist/transaction.fn-Dd-nFQlz.js +64 -0
  100. package/dist/{trigger-GP4mC5kc.js → trigger-CzJeib_t.js} +5 -5
  101. package/dist/{useMarketingMaterialActions-CC06kGq3.js → useMarketingMaterialActions-DRPPq_f7.js} +3 -3
  102. package/dist/{usePagination-BjV6asuC.js → usePagination-B_aAFhhT.js} +1 -1
  103. package/dist/{user-B_1Zm_6U.js → user-Bi_keaVG.js} +1 -1
  104. package/dist/{vue-i18n-CGoM6XkW.js → vue-i18n-Smvd1GuG.js} +351 -351
  105. package/dist/{xlsx-yGcEutsz.js → xlsx-hKexV5wm.js} +440 -440
  106. package/dist/{zod-BtYgzWyF.js → zod-Bik7Qsx7.js} +1 -1
  107. package/package.json +1 -1
  108. package/dist/Overview-DeeB3zo1.js +0 -1117
@@ -1,1117 +0,0 @@
1
- import { defineComponent as O, ref as x, computed as v, resolveComponent as j, openBlock as a, createBlock as B, unref as e, withCtx as V, createVNode as g, normalizeClass as q, createElementVNode as t, toDisplayString as d, createElementBlock as u, Fragment as R, renderList as Q, useModel as L, onMounted as te, isRef as z, createCommentVNode as C, watch as K, withModifiers as $, renderSlot as Z, createTextVNode as X, Teleport as ve, createSlots as fe, onUnmounted as ge, normalizeStyle as ee, nextTick as we } from "vue";
2
- import { h as T } from "./moment-D7p2TMB-.js";
3
- import { u as H } from "./vue-i18n-CGoM6XkW.js";
4
- import { _ as pe } from "./DateRangeChip.vue_vue_type_script_setup_true_lang-eIoPtgO5.js";
5
- import { _ as ie } from "./FilterChip.vue_vue_type_script_setup_true_lang-DaU-9GzO.js";
6
- import { u as ye } from "./business-CsYOIMmN.js";
7
- import { components as k } from "@feedmepos/ui-library";
8
- import { g as he } from "./google-C3S8u0mT.js";
9
- import { r as se } from "./index-BXOpGbAX.js";
10
- const be = { class: "fm-typo-en-body-md-600 select-none text-ellipsis overflow-hidden whitespace-nowrap" }, ce = /* @__PURE__ */ O({
11
- __name: "SortChip",
12
- props: {
13
- modelValue: {
14
- type: String,
15
- required: !0
16
- },
17
- items: {
18
- type: Array,
19
- required: !0
20
- },
21
- label: {
22
- type: String,
23
- default: "Sort by: "
24
- },
25
- placement: {
26
- type: String,
27
- default: "bottom-end"
28
- },
29
- class: {
30
- type: String,
31
- default: "text-fm-color-neutral-gray-400 cursor-pointer"
32
- }
33
- },
34
- emits: ["update:model-value"],
35
- setup(o, { emit: s }) {
36
- const r = o, n = s, l = x(!1), i = v(
37
- () => {
38
- var w;
39
- return ((w = r.items.find((b) => b.value === r.modelValue)) == null ? void 0 : w.label) ?? "";
40
- }
41
- );
42
- function c(w) {
43
- n("update:model-value", w), l.value = !1;
44
- }
45
- return (w, b) => {
46
- const A = j("FmIcon"), E = j("FmChip"), F = j("FmMenuItem"), y = j("FmMenu");
47
- return a(), B(y, {
48
- placement: o.placement,
49
- "model-value": e(l),
50
- "close-on-click": !0,
51
- onMenuChanged: b[0] || (b[0] = (m) => l.value = m)
52
- }, {
53
- "menu-button": V(() => [
54
- g(E, {
55
- label: `${o.label}${e(i)}`,
56
- class: q(r.class)
57
- }, {
58
- default: V(() => [
59
- t("div", be, d(o.label) + d(e(i)), 1),
60
- g(A, {
61
- name: e(l) ? "keyboard_arrow_up" : "keyboard_arrow_down",
62
- class: q(r.class),
63
- outline: "",
64
- size: "sm"
65
- }, null, 8, ["name", "class"])
66
- ]),
67
- _: 1
68
- }, 8, ["label", "class"])
69
- ]),
70
- default: V(() => [
71
- (a(!0), u(R, null, Q(o.items, (m) => (a(), B(F, {
72
- key: m.value,
73
- value: m.value,
74
- label: m.label,
75
- onClick: (f) => c(m.value)
76
- }, null, 8, ["value", "label", "onClick"]))), 128))
77
- ]),
78
- _: 1
79
- }, 8, ["placement", "model-value"]);
80
- };
81
- }
82
- }), xe = { class: "flex justify-between gap-8" }, Ce = { class: "flex flex-wrap gap-8" }, ke = /* @__PURE__ */ O({
83
- __name: "ReviewListingController",
84
- props: {
85
- source: {
86
- required: !0
87
- },
88
- sourceModifiers: {},
89
- dateFrom: { required: !0 },
90
- dateFromModifiers: {},
91
- dateTo: { required: !0 },
92
- dateToModifiers: {},
93
- locationId: { required: !0 },
94
- locationIdModifiers: {},
95
- deletedFilter: {
96
- required: !0
97
- },
98
- deletedFilterModifiers: {},
99
- sort: { required: !0 },
100
- sortModifiers: {}
101
- },
102
- emits: ["update:source", "update:dateFrom", "update:dateTo", "update:locationId", "update:deletedFilter", "update:sort"],
103
- setup(o) {
104
- const { t: s } = H(), r = L(o, "source"), n = L(o, "dateFrom"), l = L(o, "dateTo"), i = L(o, "locationId"), c = L(o, "deletedFilter"), w = L(o, "sort"), b = ye(), A = v(() => [
105
- { label: "Google", value: "google" },
106
- { label: "FeedMe", value: "feedme" },
107
- { label: "Feedvibe", value: "feedvibe" }
108
- ]), E = v(() => [
109
- ...b.locationOptions.map((S) => ({
110
- label: S.label,
111
- value: S.value
112
- }))
113
- ]), F = v(() => [
114
- {
115
- label: s("connect.review.filter.sort.createTime_desc"),
116
- value: "createTime_desc"
117
- },
118
- {
119
- label: s("connect.review.filter.sort.createTime_asc"),
120
- value: "createTime_asc"
121
- },
122
- { label: s("connect.review.filter.sort.rating_asc"), value: "rating_asc" },
123
- { label: s("connect.review.filter.sort.rating_desc"), value: "rating_desc" }
124
- ]), y = v(() => [
125
- {
126
- label: s("connect.review.filter.deleted.all"),
127
- value: "all"
128
- },
129
- {
130
- label: s("connect.review.filter.deleted.exclude"),
131
- value: "excludeDeleted"
132
- }
133
- ]), m = v({
134
- get: () => r.value ?? [],
135
- set: (S) => {
136
- r.value = S.length ? S : null;
137
- }
138
- }), f = v({
139
- get: () => i.value ? [i.value] : [],
140
- set: (S) => {
141
- i.value = S.length === 1 && S[0] ? S[0] : "";
142
- }
143
- }), p = v({
144
- get: () => ({
145
- startDate: n.value ?? void 0,
146
- endDate: l.value ?? void 0
147
- }),
148
- set: (S) => {
149
- n.value = S.startDate ?? null, l.value = S.endDate ?? null;
150
- }
151
- }), G = v(() => b.locations.length > 0);
152
- return te(() => b.readLocations()), (S, h) => (a(), u("div", xe, [
153
- t("div", Ce, [
154
- g(ie, {
155
- modelValue: e(m),
156
- "onUpdate:modelValue": h[0] || (h[0] = (U) => z(m) ? m.value = U : null),
157
- label: `${e(s)("connect.review.filter.source")}: `,
158
- "show-item-label": !0,
159
- items: e(A),
160
- searchable: !1,
161
- placement: "bottom-start"
162
- }, null, 8, ["modelValue", "label", "items"]),
163
- e(G) ? (a(), B(ie, {
164
- key: 0,
165
- modelValue: e(f),
166
- "onUpdate:modelValue": h[1] || (h[1] = (U) => z(f) ? f.value = U : null),
167
- label: `${e(s)("connect.review.filter.location")}: `,
168
- "show-item-label": !0,
169
- items: e(E),
170
- placement: "bottom-start"
171
- }, null, 8, ["modelValue", "label", "items"])) : C("", !0),
172
- g(pe, {
173
- modelValue: e(p),
174
- "onUpdate:modelValue": h[2] || (h[2] = (U) => z(p) ? p.value = U : null)
175
- }, null, 8, ["modelValue"]),
176
- g(ce, {
177
- modelValue: c.value,
178
- "onUpdate:modelValue": h[3] || (h[3] = (U) => c.value = U),
179
- label: `${e(s)("connect.review.filter.deleted.label")}: `,
180
- items: e(y),
181
- placement: "bottom-start"
182
- }, null, 8, ["modelValue", "label", "items"])
183
- ]),
184
- g(ce, {
185
- modelValue: w.value,
186
- "onUpdate:modelValue": h[4] || (h[4] = (U) => w.value = U),
187
- label: `${e(s)("connect.review.filter.sort.label")}: `,
188
- items: e(F),
189
- placement: "bottom-start"
190
- }, null, 8, ["modelValue", "label", "items"])
191
- ]));
192
- }
193
- }), Ae = "data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20fill='%231877F2'%3e%3cpath%20d='M24%2012.073c0-6.627-5.373-12-12-12s-12%205.373-12%2012c0%205.99%204.388%2010.954%2010.125%2011.854v-8.385H7.078v-3.47h3.047V9.43c0-3.007%201.792-4.669%204.533-4.669%201.312%200%202.686.235%202.686.235v2.953H15.83c-1.491%200-1.956.925-1.956%201.874v2.25h3.328l-.532%203.47h-2.796v8.385C19.612%2023.027%2024%2018.062%2024%2012.073z'/%3e%3c/svg%3e", Ie = { class: "flex h-full flex-col" }, De = { class: "shrink-0 border-b border-fm-color-neutral-gray-200 pb-[12px] pt-18" }, Me = { class: "flex items-center gap-[10px]" }, Fe = { class: "min-w-0 flex-1" }, Se = { class: "fm-typo-en-body-md-600 text-fm-color-neutral-gray-400" }, Be = { class: "flex items-center gap-4" }, Ee = { class: "ml-4 fm-typo-en-body-sm-400 text-fm-color-neutral-gray-400" }, Ue = ["title"], Re = { class: "min-h-0 flex-1 overflow-y-auto py-[20px]" }, Ve = { class: "flex flex-col gap-16" }, Oe = {
194
- key: 0,
195
- class: "rounded-lg border border-red-200 bg-red-50 px-12 py-8 fm-typo-en-body-sm-600 text-red-700"
196
- }, Qe = { class: "m-0 fm-typo-en-body-md-400 leading-22" }, Ye = { key: 1 }, Ge = { class: "mb-8 fm-typo-en-body-sm-600 uppercase tracking-wide text-fm-color-neutral-gray-400" }, Pe = { class: "flex flex-wrap gap-8" }, ze = ["src", "alt"], qe = { class: "flex flex-col gap-[10px] rounded-xl bg-fm-color-neutral-gray-100 py-[14px] px-[24px]" }, Ne = { class: "flex justify-between gap-12 fm-typo-en-body-sm-400" }, Te = { class: "text-fm-color-neutral-gray-400" }, He = { class: "font-semibold text-fm-color-neutral-gray-400" }, Le = { class: "flex justify-between gap-12 fm-typo-en-body-sm-400" }, Je = { class: "text-fm-color-neutral-gray-400" }, je = { class: "text-right font-semibold text-fm-color-neutral-gray-400" }, Ke = { class: "flex justify-between gap-12 fm-typo-en-body-sm-400" }, _e = { class: "text-fm-color-neutral-gray-400" }, Ze = { class: "font-semibold text-fm-color-neutral-gray-400" }, We = {
197
- key: 0,
198
- class: "flex justify-between gap-12 fm-typo-en-body-sm-400"
199
- }, Xe = { class: "text-fm-color-neutral-gray-400" }, $e = { class: "font-semibold text-fm-color-neutral-gray-400" }, et = {
200
- key: 1,
201
- class: "flex justify-between gap-12 fm-typo-en-body-sm-400"
202
- }, tt = { class: "text-red-700" }, ot = { class: "font-semibold text-red-700" }, lt = { class: "flex justify-between gap-12 fm-typo-en-body-sm-400" }, nt = { class: "text-fm-color-neutral-gray-400" }, st = { class: "font-mono text-xs text-fm-color-neutral-gray-400" }, at = {
203
- key: 0,
204
- class: "shrink-0 border-t border-fm-color-neutral-gray-200 py-[12px]"
205
- }, rt = /* @__PURE__ */ O({
206
- __name: "ReviewDetailSheet",
207
- props: {
208
- modelValue: { type: Boolean },
209
- review: {},
210
- referenceId: {},
211
- location: {},
212
- platformName: {},
213
- reviewerPictureUrl: {}
214
- },
215
- emits: ["update:modelValue"],
216
- setup(o, { emit: s }) {
217
- const { FmButton: r } = k, { t: n } = H(), l = o, i = s, c = v({
218
- get: () => l.modelValue,
219
- set: (p) => i("update:modelValue", p)
220
- }), w = v(() => {
221
- var p;
222
- return (p = l.review.reviewer) == null ? void 0 : p.name;
223
- }), b = v(() => {
224
- if (l.review.source === "google" || l.review.source === "feedme")
225
- return l.review.starRating;
226
- if (l.review.source === "feedvibe") return l.review.rating.overall;
227
- }), A = v(() => l.review.source === "google" || l.review.source === "feedme" || l.review.source === "feedvibe" ? l.review.mediaItems : []), E = v(
228
- () => T(l.review.createTime).format("D MMM YYYY, hh:mm A")
229
- ), F = v(
230
- () => l.review.updateTime ? T(l.review.updateTime).format("D MMM YYYY, hh:mm A") : void 0
231
- ), y = v(
232
- () => l.review.deletedAt ? T(l.review.deletedAt).format("D MMM YYYY, hh:mm A") : void 0
233
- ), m = v(() => {
234
- if (l.review.source === "google")
235
- return l.review.originalUrl;
236
- });
237
- function f() {
238
- m.value && window.open(m.value, "_blank", "noopener,noreferrer");
239
- }
240
- return (p, G) => {
241
- const S = j("FmSideSheet");
242
- return a(), B(S, {
243
- modelValue: c.value,
244
- "onUpdate:modelValue": G[1] || (G[1] = (h) => c.value = h),
245
- "max-width": 560,
246
- "close-button": !1,
247
- "dismiss-away": !0
248
- }, {
249
- default: V(() => [
250
- t("div", Ie, [
251
- t("div", De, [
252
- t("div", Me, [
253
- g(e(k).FmAvatar, {
254
- name: o.reviewerPictureUrl ? void 0 : w.value,
255
- src: o.reviewerPictureUrl,
256
- size: "md",
257
- class: "h-40 w-40 shrink-0"
258
- }, null, 8, ["name", "src"]),
259
- t("div", Fe, [
260
- t("div", Se, d(w.value || e(n)("connect.review.detail.anonymous")), 1),
261
- t("div", Be, [
262
- (a(), u(R, null, Q(5, (h) => g(e(k).FmIcon, {
263
- key: h,
264
- name: "star",
265
- size: "sm",
266
- class: q(
267
- h <= Math.round(b.value || 0) ? "text-fm-color-primary" : "text-fm-color-neutral-gray-200"
268
- )
269
- }, null, 8, ["class"])), 64)),
270
- t("span", Ee, d(E.value), 1)
271
- ])
272
- ]),
273
- t("button", {
274
- type: "button",
275
- title: e(n)("connect.review.detail.close"),
276
- class: "flex h-[30px] w-[30px] items-center justify-center rounded-lg border-0 bg-transparent text-fm-color-neutral-gray-400 hover:bg-fm-color-neutral-gray-100",
277
- onClick: G[0] || (G[0] = (h) => c.value = !1)
278
- }, [
279
- g(e(k).FmIcon, {
280
- name: "close",
281
- size: "sm"
282
- })
283
- ], 8, Ue)
284
- ])
285
- ]),
286
- t("div", Re, [
287
- t("div", Ve, [
288
- y.value ? (a(), u("div", Oe, d(e(n)("connect.review.detail.deleted")), 1)) : C("", !0),
289
- t("p", Qe, d(o.review.comment || e(n)("connect.review.detail.noComment")), 1),
290
- A.value.length ? (a(), u("div", Ye, [
291
- t("div", Ge, d(e(n)("connect.review.detail.photos", { n: A.value.length })), 1),
292
- t("div", Pe, [
293
- (a(!0), u(R, null, Q(A.value, (h, U) => (a(), u("div", {
294
- key: h.externalId || U,
295
- class: "flex h-[76px] w-[76px] items-center justify-center overflow-hidden rounded-lg bg-fm-color-neutral-gray-100"
296
- }, [
297
- t("img", {
298
- src: h.thumbnailUrl,
299
- alt: h.thumbnailLabel,
300
- class: "h-full w-full object-cover"
301
- }, null, 8, ze)
302
- ]))), 128))
303
- ])
304
- ])) : C("", !0),
305
- t("div", qe, [
306
- t("div", Ne, [
307
- t("span", Te, d(e(n)("connect.review.detail.source")), 1),
308
- t("span", He, d(o.platformName), 1)
309
- ]),
310
- t("div", Le, [
311
- t("span", Je, d(e(n)("connect.review.detail.outlet")), 1),
312
- t("span", je, d(o.location || e(n)("connect.review.detail.emptyValue")), 1)
313
- ]),
314
- t("div", Ke, [
315
- t("span", _e, d(e(n)("connect.review.detail.createTime")), 1),
316
- t("span", Ze, d(E.value), 1)
317
- ]),
318
- F.value ? (a(), u("div", We, [
319
- t("span", Xe, d(e(n)("connect.review.detail.updateTime")), 1),
320
- t("span", $e, d(F.value), 1)
321
- ])) : C("", !0),
322
- y.value ? (a(), u("div", et, [
323
- t("span", tt, d(e(n)("connect.review.detail.deletedAt")), 1),
324
- t("span", ot, d(y.value), 1)
325
- ])) : C("", !0),
326
- t("div", lt, [
327
- t("span", nt, d(e(n)("connect.review.detail.referenceId")), 1),
328
- t("span", st, d(o.referenceId), 1)
329
- ])
330
- ])
331
- ])
332
- ]),
333
- m.value ? (a(), u("div", at, [
334
- g(e(r), {
335
- variant: "primary",
336
- size: "md",
337
- "prepend-icon": "open_in_new",
338
- label: e(n)("connect.review.detail.openOriginalLink"),
339
- class: "w-full",
340
- onClick: f
341
- }, null, 8, ["label"])
342
- ])) : C("", !0)
343
- ])
344
- ]),
345
- _: 1
346
- }, 8, ["modelValue"]);
347
- };
348
- }
349
- }), it = 300, de = /* @__PURE__ */ new Map();
350
- let ue = Promise.resolve();
351
- function ct(o) {
352
- const s = de.get(o);
353
- if (s) return s;
354
- const r = ue.then(
355
- () => new Promise((n) => {
356
- const l = new Image();
357
- l.onload = () => n(!0), l.onerror = () => n(!1), l.src = o;
358
- })
359
- );
360
- return de.set(o, r), ue = r.then(
361
- () => new Promise(
362
- (n) => setTimeout(n, it)
363
- )
364
- ), r;
365
- }
366
- const dt = /* @__PURE__ */ O({
367
- __name: "ReviewerProfileImage",
368
- props: {
369
- name: {},
370
- pictureUrl: {},
371
- isGoogle: { type: Boolean }
372
- },
373
- emits: ["loaded"],
374
- setup(o, { emit: s }) {
375
- const r = o, n = s, l = x();
376
- return K(
377
- () => [r.pictureUrl, r.isGoogle],
378
- async ([i, c]) => {
379
- l.value = c ? void 0 : i, n("loaded", l.value), c && i && await ct(i) && r.pictureUrl === i && r.isGoogle === c && (l.value = i, n("loaded", i));
380
- },
381
- { immediate: !0 }
382
- ), (i, c) => (a(), B(e(k).FmAvatar, {
383
- name: l.value ? void 0 : o.name,
384
- src: l.value,
385
- size: "md",
386
- class: "h-40 w-40 shrink-0"
387
- }, null, 8, ["name", "src"]));
388
- }
389
- }), ut = { class: "absolute right-[16px] top-[16px] z-10" }, mt = { class: "flex items-start gap-12" }, vt = { class: "min-w-0 flex flex-col flex-1 gap-8" }, ft = { class: "flex flex-wrap items-start justify-between gap-8" }, gt = { class: "flex min-w-0 flex-wrap items-center gap-x-8 gap-y-4" }, wt = { class: "fm-typo-en-body-md-600 text-fm-color-neutral-gray-400" }, pt = { class: "fm-typo-en-body-sm-400 text-fm-color-neutral-gray-400" }, yt = {
390
- key: 0,
391
- class: "inline-flex items-center gap-4 rounded-full bg-red-100 px-8 py-4 fm-typo-en-body-sm-600 text-red-700"
392
- }, ht = { class: "flex flex-wrap items-center gap-8" }, bt = { class: "inline-flex items-center gap-4 rounded-full bg-fm-color-neutral-gray-100 px-12 py-4" }, xt = ["src", "alt"], Ct = { class: "fm-typo-en-body-sm-400 text-fm-color-neutral-gray-400" }, kt = {
393
- key: 0,
394
- class: "fm-typo-en-body-sm-400 text-fm-color-neutral-gray-400"
395
- }, At = {
396
- key: 0,
397
- class: "rounded-lg bg-fm-color-neutral-gray-100 px-12 py-8"
398
- }, It = { class: "mb-4 flex items-center justify-between gap-8 fm-typo-en-body-sm-600 text-fm-color-neutral-gray-400" }, Dt = { class: "font-normal" }, Mt = { class: "m-0 whitespace-pre-line fm-typo-en-body-sm-400" }, Ft = {
399
- key: 1,
400
- class: "mt-4"
401
- }, oe = /* @__PURE__ */ O({
402
- __name: "ReviewCardTemplate",
403
- props: {
404
- review: {},
405
- logo: {},
406
- logoAlt: {},
407
- gap: {},
408
- onReply: { type: Function }
409
- },
410
- setup(o) {
411
- const { FmButton: s } = k, { t: r } = H(), n = o, l = v(() => {
412
- var y;
413
- return (y = n.review.reviewer) == null ? void 0 : y.name;
414
- }), i = v(() => {
415
- var y;
416
- return (y = n.review.reviewer) == null ? void 0 : y.pictureUrl;
417
- }), c = x(), w = v(() => n.review.restaurantName), b = v(() => {
418
- if (n.review.source === "google" || n.review.source === "feedme")
419
- return n.review.reply;
420
- }), A = v(() => {
421
- switch (n.review.source) {
422
- case "google":
423
- return "Google";
424
- case "facebook":
425
- return "Facebook";
426
- case "feedme":
427
- return "FeedMe";
428
- case "feedvibe":
429
- return "Feedvibe";
430
- }
431
- }), E = v(
432
- () => n.review.source === "feedme" ? n.review.billId : n.review.externalId || ""
433
- ), F = x(!1);
434
- return (y, m) => (a(), u(R, null, [
435
- t("div", {
436
- class: "relative cursor-pointer rounded-xl border border-fm-color-neutral-gray-200 bg-white p-16 transition-colors hover:border-fm-color-neutral-gray-300",
437
- onClick: m[2] || (m[2] = (f) => F.value = !0)
438
- }, [
439
- t("div", ut, [
440
- o.onReply ? (a(), B(e(s), {
441
- key: 0,
442
- variant: "primary",
443
- size: "md",
444
- "prepend-icon": "reply",
445
- label: e(r)("connect.review.overview.reply"),
446
- onClick: m[0] || (m[0] = $((f) => o.onReply(o.review), ["stop"]))
447
- }, null, 8, ["label"])) : C("", !0)
448
- ]),
449
- t("div", mt, [
450
- g(dt, {
451
- name: l.value,
452
- "picture-url": i.value,
453
- "is-google": o.review.source === "google",
454
- onLoaded: m[1] || (m[1] = (f) => c.value = f)
455
- }, null, 8, ["name", "picture-url", "is-google"]),
456
- t("div", vt, [
457
- t("div", ft, [
458
- t("div", gt, [
459
- t("span", wt, d(l.value || e(r)("connect.review.overview.anonymous")), 1),
460
- Z(y.$slots, "rating"),
461
- t("span", pt, d(e(T)(o.review.updateTime ?? o.review.createTime).format(
462
- "D MMM YYYY, hh:mm A"
463
- )), 1)
464
- ]),
465
- o.review.deletedAt ? (a(), u("span", yt, [
466
- g(e(k).FmTooltip, {
467
- content: e(r)("connect.review.overview.deletedInfo"),
468
- "content-class": "max-w-[min(320px,calc(100vw-32px))] whitespace-normal",
469
- placement: "left"
470
- }, {
471
- default: V(() => [
472
- g(e(k).FmIcon, {
473
- name: "info",
474
- outline: "",
475
- size: "sm"
476
- })
477
- ]),
478
- _: 1
479
- }, 8, ["content"]),
480
- X(" " + d(e(r)("connect.review.overview.deleted")), 1)
481
- ])) : C("", !0)
482
- ]),
483
- t("div", ht, [
484
- t("span", bt, [
485
- t("img", {
486
- src: o.logo,
487
- alt: o.logoAlt || A.value,
488
- class: "h-16 w-16"
489
- }, null, 8, xt),
490
- t("span", Ct, d(A.value), 1)
491
- ]),
492
- m[4] || (m[4] = t("span", { class: "text-fm-color-neutral-gray-400" }, "·", -1)),
493
- w.value ? (a(), u("span", kt, d(w.value), 1)) : C("", !0)
494
- ]),
495
- Z(y.$slots, "details"),
496
- Z(y.$slots, "comment", {}, () => [
497
- t("p", {
498
- class: q(["mt-8 line-clamp-3 fm-typo-en-body-md-400", {
499
- "italic text-fm-color-neutral-gray-400": !o.review.comment
500
- }])
501
- }, d(o.review.comment || e(r)("connect.review.overview.noComment")), 3)
502
- ]),
503
- b.value ? (a(), u("div", At, [
504
- t("div", It, [
505
- t("span", null, d(e(r)("connect.review.overview.reply")), 1),
506
- t("span", Dt, d(e(T)(b.value.updateTime).format("D MMM YYYY, hh:mm A")), 1)
507
- ]),
508
- t("p", Mt, d(b.value.comment), 1)
509
- ])) : C("", !0),
510
- y.$slots.media ? (a(), u("div", Ft, [
511
- Z(y.$slots, "media")
512
- ])) : C("", !0)
513
- ])
514
- ])
515
- ]),
516
- g(rt, {
517
- modelValue: F.value,
518
- "onUpdate:modelValue": m[3] || (m[3] = (f) => F.value = f),
519
- review: o.review,
520
- "reference-id": E.value,
521
- location: w.value,
522
- "platform-name": A.value,
523
- "reviewer-picture-url": c.value
524
- }, null, 8, ["modelValue", "review", "reference-id", "location", "platform-name", "reviewer-picture-url"])
525
- ], 64));
526
- }
527
- }), St = {
528
- key: 0,
529
- class: "flex items-center gap-4"
530
- }, Bt = /* @__PURE__ */ O({
531
- __name: "FacebookReviewCard",
532
- props: {
533
- review: {}
534
- },
535
- setup(o) {
536
- const { t: s } = H();
537
- return (r, n) => (a(), B(oe, {
538
- review: o.review,
539
- logo: e(Ae)
540
- }, {
541
- rating: V(() => [
542
- o.review.isPositive != null ? (a(), u("div", St, [
543
- g(e(k).FmIcon, {
544
- name: o.review.isPositive ? "thumb_up" : "thumb_down",
545
- size: "sm",
546
- class: q(
547
- o.review.isPositive ? "text-fm-color-typo-success" : "text-fm-color-system-error-500"
548
- )
549
- }, null, 8, ["name", "class"]),
550
- t("span", {
551
- class: q([
552
- "fm-typo-en-body-sm-400",
553
- o.review.isPositive ? "text-fm-color-typo-success" : "text-fm-color-system-error-500"
554
- ])
555
- }, d(o.review.isPositive ? e(s)("connect.review.overview.positive") : e(s)("connect.review.overview.negative")), 3)
556
- ])) : C("", !0)
557
- ]),
558
- _: 1
559
- }, 8, ["review", "logo"]));
560
- }
561
- }), Et = "data:image/svg+xml,%3csvg%20width='388'%20height='388'%20viewBox='0%200%20388%20388'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M239.449%200H148.553C66.5106%200%200.00195312%2066.5086%200.00195312%20148.551V239.447C0.00195312%20321.489%2066.5106%20387.998%20148.553%20387.998H239.449C321.491%20387.998%20388%20321.489%20388%20239.447V148.551C388%2066.5086%20321.491%200%20239.449%200Z'%20fill='url(%23paint0_linear_feedme_logo)'%20/%3e%3cmask%20id='mask0_feedme_logo'%20style='mask-type:luminance'%20maskUnits='userSpaceOnUse'%20x='0'%20y='0'%20width='388'%20height='388'%3e%3cpath%20d='M239.447%200H148.551C66.5086%200%200%2066.5086%200%20148.551V239.447C0%20321.489%2066.5086%20387.998%20148.551%20387.998H239.447C321.49%20387.998%20387.998%20321.489%20387.998%20239.447V148.551C387.998%2066.5086%20321.49%200%20239.447%200Z'%20fill='white'%20/%3e%3c/mask%3e%3cg%20mask='url(%23mask0_feedme_logo)'%3e%3cpath%20d='M82.587%20258.589V258.76C83.2747%20264.893%2084.1917%20271.598%2085.3953%20278.648L101.271%20392.296H127.462V253.946C127.462%20241.395%20137.033%20231.194%20148.839%20231.194H150.329C162.135%20231.194%20171.706%20241.395%20171.706%20253.946V392.296H216.352V253.946C216.352%20241.395%20225.923%20231.194%20237.729%20231.194H239.219C251.025%20231.194%20260.596%20241.395%20260.596%20253.946V392.296H286.959L302.835%20277.788C303.981%20271.025%20304.841%20264.549%20305.471%20258.589V258.187C307.649%20238.759%20307.649%20225.061%20307.649%20225.061C307.649%20182.938%20290.054%20148.264%20252.286%20119.78C241.97%20112.043%20233.029%20100.466%20232.17%2075.7079C232.17%2075.7079%20229.705%2012.9519%20253.719%20-33.7568H134.339C158.353%2012.9519%20155.888%2075.7079%20155.888%2075.7079C155.029%20100.409%20146.088%20111.986%20135.772%20119.78C97.9465%20148.321%2080.4092%20182.938%2080.4092%20225.061C80.4092%20225.061%2080.4092%20238.873%2082.587%20258.474V258.589Z'%20fill='white'%20/%3e%3c/g%3e%3cdefs%3e%3clinearGradient%20id='paint0_linear_feedme_logo'%20x1='43.5013'%20y1='344.556'%20x2='344.501'%20y2='43.5567'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20stop-color='%23FF5D53'%20/%3e%3cstop%20offset='1'%20stop-color='%23FCA23E'%20/%3e%3c/linearGradient%3e%3c/defs%3e%3c/svg%3e", Ut = {
562
- key: 0,
563
- class: "flex flex-wrap gap-8"
564
- }, Rt = ["onClick"], Vt = ["src", "alt"], Ot = {
565
- key: 0,
566
- class: "absolute inset-0 flex items-center justify-center bg-black/30"
567
- }, Qt = ["src"], Yt = ["src", "alt"], ae = /* @__PURE__ */ O({
568
- __name: "ReviewCardMedia",
569
- props: {
570
- mediaItems: {}
571
- },
572
- setup(o) {
573
- const s = x(null);
574
- return (r, n) => o.mediaItems && o.mediaItems.length > 0 ? (a(), u("div", Ut, [
575
- (a(!0), u(R, null, Q(o.mediaItems, (l, i) => (a(), u("div", {
576
- key: i,
577
- class: "relative w-72 h-72 rounded-lg overflow-hidden border border-fm-color-neutral-gray-200 shrink-0 cursor-pointer hover:opacity-90",
578
- onClick: $((c) => s.value = l, ["stop"])
579
- }, [
580
- t("img", {
581
- src: l.thumbnailUrl,
582
- alt: l.thumbnailLabel,
583
- class: "w-full h-full object-cover"
584
- }, null, 8, Vt),
585
- l.videoUrl ? (a(), u("div", Ot, [
586
- g(e(k).FmIcon, {
587
- name: "play_arrow",
588
- class: "text-white"
589
- })
590
- ])) : C("", !0)
591
- ], 8, Rt))), 128)),
592
- (a(), B(ve, { to: "body" }, [
593
- s.value ? (a(), u("div", {
594
- key: 0,
595
- class: "fixed inset-0 z-50 flex items-center justify-center bg-black/80 backdrop-blur-sm",
596
- onClick: n[2] || (n[2] = (l) => s.value = null)
597
- }, [
598
- t("button", {
599
- class: "absolute top-16 right-16 z-50 p-8 text-white hover:text-fm-color-neutral-gray-300 transition-colors",
600
- onClick: n[0] || (n[0] = (l) => s.value = null)
601
- }, [
602
- g(e(k).FmIcon, {
603
- name: "close",
604
- size: "lg"
605
- })
606
- ]),
607
- t("div", {
608
- class: "relative max-w-[90vw] max-h-[90vh] flex items-center justify-center",
609
- onClick: n[1] || (n[1] = $(() => {
610
- }, ["stop"]))
611
- }, [
612
- s.value.videoUrl ? (a(), u("video", {
613
- key: 0,
614
- src: s.value.videoUrl,
615
- controls: "",
616
- autoplay: "",
617
- class: "max-w-full max-h-[90vh] rounded-lg shadow-lg"
618
- }, null, 8, Qt)) : (a(), u("img", {
619
- key: 1,
620
- src: s.value.thumbnailUrl,
621
- alt: s.value.thumbnailLabel,
622
- class: "max-w-full max-h-[90vh] rounded-lg shadow-lg object-contain"
623
- }, null, 8, Yt))
624
- ])
625
- ])) : C("", !0)
626
- ]))
627
- ])) : C("", !0);
628
- }
629
- }), Gt = { class: "flex items-center gap-4" }, Pt = /* @__PURE__ */ O({
630
- __name: "FeedmeReviewCard",
631
- props: {
632
- review: {}
633
- },
634
- setup(o) {
635
- const s = o, r = v(() => {
636
- var i, c;
637
- const l = (c = (i = s.review.reviewer) == null ? void 0 : i.phoneNumber) == null ? void 0 : c.replace(/\D/g, "");
638
- return l ? `https://wa.me/${l}` : void 0;
639
- });
640
- function n() {
641
- r.value && window.open(r.value, "_blank", "noopener,noreferrer");
642
- }
643
- return (l, i) => (a(), B(oe, {
644
- review: o.review,
645
- logo: e(Et),
646
- "logo-alt": "FeedMe",
647
- "on-reply": r.value ? n : void 0
648
- }, {
649
- rating: V(() => [
650
- t("div", Gt, [
651
- (a(), u(R, null, Q(5, (c) => g(e(k).FmIcon, {
652
- key: c,
653
- name: "star",
654
- size: "sm",
655
- class: q(
656
- c <= o.review.starRating ? "text-yellow-400" : "text-fm-color-neutral-gray-200"
657
- )
658
- }, null, 8, ["class"])), 64))
659
- ])
660
- ]),
661
- media: V(() => [
662
- g(ae, {
663
- "media-items": o.review.mediaItems
664
- }, null, 8, ["media-items"])
665
- ]),
666
- _: 1
667
- }, 8, ["review", "logo", "on-reply"]));
668
- }
669
- }), zt = "data:image/png;base64,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", qt = { class: "flex items-center gap-4" }, Nt = { class: "flex flex-wrap items-center gap-x-8 gap-y-4 fm-typo-en-body-sm-400 text-fm-color-neutral-gray-500" }, Tt = { class: "font-semibold text-fm-color-neutral-gray-400" }, Ht = { class: "font-semibold text-fm-color-neutral-gray-400" }, Lt = { class: "font-semibold text-fm-color-neutral-gray-400" }, Jt = /* @__PURE__ */ O({
670
- __name: "FeedvibeReviewCard",
671
- props: {
672
- review: {}
673
- },
674
- setup(o) {
675
- const { t: s } = H();
676
- return (r, n) => (a(), B(oe, {
677
- review: o.review,
678
- logo: e(zt),
679
- "logo-alt": "Feedvibe",
680
- gap: "12"
681
- }, {
682
- rating: V(() => [
683
- t("div", qt, [
684
- (a(), u(R, null, Q(5, (l) => g(e(k).FmIcon, {
685
- key: l,
686
- name: "star",
687
- size: "sm",
688
- class: q(
689
- l <= Math.round(o.review.rating.overall) ? "text-yellow-400" : "text-fm-color-neutral-gray-200"
690
- )
691
- }, null, 8, ["class"])), 64))
692
- ])
693
- ]),
694
- details: V(() => [
695
- t("div", Nt, [
696
- t("span", null, [
697
- X(d(e(s)("connect.review.overview.food")) + ": ", 1),
698
- t("strong", Tt, d(o.review.rating.food) + "/5 ", 1)
699
- ]),
700
- n[0] || (n[0] = t("span", { "aria-hidden": "true" }, "|", -1)),
701
- t("span", null, [
702
- X(d(e(s)("connect.review.overview.service")) + ": ", 1),
703
- t("strong", Ht, d(o.review.rating.service) + "/5 ", 1)
704
- ]),
705
- n[1] || (n[1] = t("span", { "aria-hidden": "true" }, "|", -1)),
706
- t("span", null, [
707
- X(d(e(s)("connect.review.overview.atmosphere")) + ": ", 1),
708
- t("strong", Lt, d(o.review.rating.atmosphere) + "/5 ", 1)
709
- ])
710
- ])
711
- ]),
712
- media: V(() => [
713
- g(ae, {
714
- "media-items": o.review.mediaItems
715
- }, null, 8, ["media-items"])
716
- ]),
717
- _: 1
718
- }, 8, ["review", "logo"]));
719
- }
720
- }), jt = { class: "flex items-center gap-4" }, Kt = { class: "mt-8" }, _t = { class: "line-clamp-3 fm-typo-en-body-md-400" }, Zt = {
721
- key: 0,
722
- class: "mt-4 fm-typo-en-body-sm-400 text-fm-color-neutral-gray-400"
723
- }, Wt = /* @__PURE__ */ O({
724
- __name: "GoogleReviewCard",
725
- props: {
726
- review: {}
727
- },
728
- setup(o) {
729
- const { t: s } = H(), r = x(!1);
730
- function n(l) {
731
- l.originalUrl && window.open(l.originalUrl, "_blank", "noopener,noreferrer");
732
- }
733
- return (l, i) => (a(), B(oe, {
734
- review: o.review,
735
- logo: e(he),
736
- "on-reply": o.review.originalUrl ? n : void 0
737
- }, fe({
738
- rating: V(() => [
739
- t("div", jt, [
740
- (a(), u(R, null, Q(5, (c) => g(e(k).FmIcon, {
741
- key: c,
742
- name: "star",
743
- size: "sm",
744
- class: q(
745
- c <= o.review.starRating ? "text-yellow-400" : "text-fm-color-neutral-gray-200"
746
- )
747
- }, null, 8, ["class"])), 64))
748
- ])
749
- ]),
750
- media: V(() => [
751
- g(ae, {
752
- "media-items": o.review.mediaItems
753
- }, null, 8, ["media-items"])
754
- ]),
755
- _: 2
756
- }, [
757
- o.review.translatedComment ? {
758
- name: "comment",
759
- fn: V(() => [
760
- t("div", Kt, [
761
- t("p", _t, d(r.value ? o.review.comment : o.review.translatedComment), 1),
762
- r.value ? C("", !0) : (a(), u("p", Zt, d(e(s)("connect.review.overview.translatedByGoogle")), 1)),
763
- t("button", {
764
- type: "button",
765
- class: "mt-4 border-0 bg-transparent p-0 fm-typo-en-body-sm-600 text-blue-500 hover:underline",
766
- onClick: i[0] || (i[0] = $((c) => r.value = !r.value, ["stop"]))
767
- }, d(r.value ? e(s)("connect.review.overview.seeTranslation") : e(s)("connect.review.overview.seeOriginal")), 1)
768
- ])
769
- ]),
770
- key: "0"
771
- } : void 0
772
- ]), 1032, ["review", "logo", "on-reply"]));
773
- }
774
- }), Xt = /* @__PURE__ */ O({
775
- __name: "ReviewCard",
776
- props: {
777
- review: {}
778
- },
779
- setup(o) {
780
- const s = o, r = v(
781
- () => s.review.source === "google" ? s.review : null
782
- ), n = v(
783
- () => s.review.source === "facebook" ? s.review : null
784
- ), l = v(
785
- () => s.review.source === "feedme" ? s.review : null
786
- ), i = v(
787
- () => s.review.source === "feedvibe" ? s.review : null
788
- );
789
- return (c, w) => r.value ? (a(), B(Wt, {
790
- key: 0,
791
- review: r.value
792
- }, null, 8, ["review"])) : n.value ? (a(), B(Bt, {
793
- key: 1,
794
- review: n.value
795
- }, null, 8, ["review"])) : l.value ? (a(), B(Pt, {
796
- key: 2,
797
- review: l.value
798
- }, null, 8, ["review"])) : i.value ? (a(), B(Jt, {
799
- key: 3,
800
- review: i.value
801
- }, null, 8, ["review"])) : C("", !0);
802
- }
803
- }), $t = {
804
- key: 0,
805
- class: "flex justify-center py-32"
806
- }, eo = {
807
- key: 1,
808
- class: "flex flex-col items-center justify-center py-48 gap-8"
809
- }, to = { class: "fm-typo-en-body-md-400 text-fm-color-neutral-gray-400" }, oo = ["data-sentinel"], lo = { class: "flex flex-col gap-12" }, no = {
810
- key: 3,
811
- class: "flex justify-center py-16"
812
- }, W = 100, le = 20, me = 220, so = /* @__PURE__ */ O({
813
- __name: "ReviewFeed",
814
- props: {
815
- reviews: {},
816
- loading: { type: Boolean },
817
- hasMore: { type: Boolean }
818
- },
819
- emits: ["loadMore"],
820
- setup(o, { emit: s }) {
821
- const { t: r } = H(), n = o, l = s, i = x(0), c = v(
822
- () => Math.min(i.value + W, n.reviews.length)
823
- ), w = v(
824
- () => n.reviews.slice(i.value, c.value)
825
- ), b = v(() => {
826
- const D = w.value, I = [];
827
- for (let M = 0; M < D.length; M += le)
828
- I.push({
829
- start: i.value + M,
830
- items: D.slice(M, M + le)
831
- });
832
- return I;
833
- }), A = v(
834
- () => i.value * me
835
- ), E = v(
836
- () => (n.reviews.length - c.value) * me
837
- );
838
- K(
839
- () => n.reviews.length,
840
- (D, I) => {
841
- if (D < I) {
842
- i.value = 0;
843
- return;
844
- }
845
- i.value + W >= I && (i.value = Math.max(0, D - W));
846
- }
847
- );
848
- const F = x(null), y = x(null), m = x(null), f = x(null), p = x(!1);
849
- async function G(D, I) {
850
- var N;
851
- const M = Math.max(0, n.reviews.length - W), P = Math.min(Math.max(D - le, 0), M);
852
- if (P === i.value || p.value) return;
853
- p.value = !0;
854
- const J = I == null ? void 0 : I.getBoundingClientRect().top;
855
- if (i.value = P, await we(), I && J !== void 0) {
856
- const _ = (N = F.value) == null ? void 0 : N.querySelector(`[data-sentinel="${D}"]`);
857
- _ && window.scrollBy(0, _.getBoundingClientRect().top - J);
858
- }
859
- p.value = !1;
860
- }
861
- function S() {
862
- const D = window.innerHeight, I = [
863
- { el: y.value, base: 0, span: i.value },
864
- {
865
- el: m.value,
866
- base: c.value,
867
- span: n.reviews.length - c.value
868
- }
869
- ];
870
- for (const { el: M, base: P, span: J } of I) {
871
- if (!M || J <= 0) continue;
872
- const N = M.getBoundingClientRect();
873
- if (N.top <= 0 && N.bottom >= D && N.height > 0) {
874
- const _ = (D / 2 - N.top) / N.height;
875
- G(Math.floor(P + _ * J));
876
- return;
877
- }
878
- }
879
- }
880
- let h = !1;
881
- function U() {
882
- h || (h = !0, requestAnimationFrame(() => {
883
- h = !1, S();
884
- }));
885
- }
886
- let Y = null;
887
- function re() {
888
- var D;
889
- Y == null || Y.disconnect(), (D = F.value) == null || D.querySelectorAll("[data-sentinel]").forEach((I) => Y == null ? void 0 : Y.observe(I));
890
- }
891
- return te(() => {
892
- Y = new IntersectionObserver((I) => {
893
- for (const M of I)
894
- if (M.isIntersecting) {
895
- const P = Number(M.target.dataset.sentinel);
896
- G(P, M.target);
897
- }
898
- }), re(), K([i, () => n.reviews.length], re, {
899
- flush: "post"
900
- });
901
- const D = new IntersectionObserver(
902
- (I) => {
903
- I[0].isIntersecting && n.hasMore && !n.loading && l("loadMore");
904
- },
905
- { threshold: 0.5 }
906
- );
907
- f.value && D.observe(f.value), window.addEventListener("scroll", U, { passive: !0 }), ge(() => {
908
- Y == null || Y.disconnect(), D.disconnect(), window.removeEventListener("scroll", U);
909
- });
910
- }), (D, I) => (a(), u(R, null, [
911
- o.loading && o.reviews.length === 0 ? (a(), u("div", $t, [
912
- g(e(k).FmIcon, {
913
- name: "sync",
914
- size: "xl",
915
- class: "animate-spin text-fm-color-neutral-gray-400"
916
- })
917
- ])) : o.reviews.length === 0 ? (a(), u("div", eo, [
918
- g(e(k).FmIcon, {
919
- name: "rate_review",
920
- size: "xl",
921
- class: "text-fm-color-neutral-gray-300"
922
- }),
923
- t("p", to, d(e(r)("connect.review.overview.empty")), 1)
924
- ])) : (a(), u("div", {
925
- key: 2,
926
- ref_key: "listEl",
927
- ref: F
928
- }, [
929
- e(i) > 0 ? (a(), u("div", {
930
- key: 0,
931
- ref_key: "topSpacerEl",
932
- ref: y,
933
- style: ee({ height: `${e(A)}px` })
934
- }, null, 4)) : C("", !0),
935
- (a(!0), u(R, null, Q(e(b), (M) => (a(), u(R, {
936
- key: M.start
937
- }, [
938
- t("div", {
939
- "data-sentinel": M.start,
940
- class: "h-1"
941
- }, null, 8, oo),
942
- t("div", lo, [
943
- (a(!0), u(R, null, Q(M.items, (P) => (a(), B(Xt, {
944
- key: P._id,
945
- review: P
946
- }, null, 8, ["review"]))), 128))
947
- ])
948
- ], 64))), 128)),
949
- e(E) > 0 ? (a(), u("div", {
950
- key: 1,
951
- ref_key: "bottomSpacerEl",
952
- ref: m,
953
- style: ee({ height: `${e(E)}px` })
954
- }, null, 4)) : C("", !0)
955
- ], 512)),
956
- t("div", {
957
- ref_key: "sentinel",
958
- ref: f,
959
- class: "h-1"
960
- }, null, 512),
961
- o.loading && o.reviews.length > 0 ? (a(), u("div", no, [
962
- g(e(k).FmIcon, {
963
- name: "sync",
964
- size: "md",
965
- class: "animate-spin text-fm-color-neutral-gray-400"
966
- })
967
- ])) : C("", !0)
968
- ], 64));
969
- }
970
- }), ao = { class: "w-1/2 rounded-lg border border-fm-color-neutral-gray-200 bg-white p-5" }, ro = { class: "fm-typo-en-title-md-600 text-fm-color-typo-primary" }, io = { class: "mt-16 grid grid-cols-[minmax(0,1fr)_minmax(140px,0.5fr)] gap-5" }, co = { class: "mt-12 flex flex-col gap-8" }, uo = { class: "w-16 fm-typo-en-body-sm-400 text-fm-color-neutral-gray-500" }, mo = { class: "h-8 flex-1 overflow-hidden rounded-full bg-fm-color-neutral-gray-100" }, vo = { class: "w-24 text-right fm-typo-en-body-sm-400 text-fm-color-neutral-gray-500" }, fo = { class: "mt-8 flex flex-col items-center" }, go = { class: "fm-typo-en-display-lg-800 text-fm-color-typo-primary" }, wo = {
971
- class: "mt-8 flex items-center gap-1",
972
- "aria-label": "Average rating"
973
- }, po = { class: "mt-4 fm-typo-en-body-sm-400 text-fm-color-neutral-gray-400" }, yo = /* @__PURE__ */ O({
974
- __name: "ReviewSummary",
975
- setup(o) {
976
- const s = x({
977
- averageScore: 0,
978
- total: 0,
979
- starCounts: [5, 4, 3, 2, 1].map((l) => ({ star: l, count: 0 }))
980
- }), r = v(() => s.value.averageScore.toFixed(1));
981
- function n(l) {
982
- return `${Math.min(Math.max(s.value.averageScore - l + 1, 0), 1) * 100}%`;
983
- }
984
- return te(async () => {
985
- s.value = await se.getReviewSummary();
986
- }), (l, i) => (a(), u("div", ao, [
987
- t("h2", ro, d(l.$t("connect.review.overview.summary")), 1),
988
- t("div", io, [
989
- t("div", co, [
990
- (a(!0), u(R, null, Q(e(s).starCounts, (c) => (a(), u("div", {
991
- key: c.star,
992
- class: "flex items-center gap-8"
993
- }, [
994
- t("span", uo, d(c.star), 1),
995
- g(e(k).FmIcon, {
996
- name: "star",
997
- size: "sm",
998
- class: "text-amber-400"
999
- }),
1000
- t("div", mo, [
1001
- t("div", {
1002
- class: "h-full rounded-full bg-amber-400 transition-[width]",
1003
- style: ee({
1004
- width: `${e(s).total ? c.count / e(s).total * 100 : 0}%`
1005
- })
1006
- }, null, 4)
1007
- ]),
1008
- t("span", vo, d(c.count), 1)
1009
- ]))), 128))
1010
- ]),
1011
- t("div", fo, [
1012
- t("span", go, d(e(r)), 1),
1013
- t("div", wo, [
1014
- (a(), u(R, null, Q(5, (c) => t("span", {
1015
- key: c,
1016
- class: "relative"
1017
- }, [
1018
- g(e(k).FmIcon, {
1019
- name: "star",
1020
- size: "md",
1021
- class: "text-fm-color-neutral-gray-200"
1022
- }),
1023
- t("span", {
1024
- class: "absolute inset-y-0 left-0 overflow-hidden",
1025
- style: ee({ width: n(c) })
1026
- }, [
1027
- g(e(k).FmIcon, {
1028
- name: "star",
1029
- size: "md",
1030
- class: "text-amber-400"
1031
- })
1032
- ], 4)
1033
- ])), 64))
1034
- ]),
1035
- t("span", po, " (" + d(e(s).total) + ") ", 1)
1036
- ])
1037
- ])
1038
- ]));
1039
- }
1040
- }), ho = { class: "p-24 flex flex-col gap-12" }, ne = 20, So = /* @__PURE__ */ O({
1041
- __name: "Overview",
1042
- setup(o) {
1043
- const s = x([]), r = x(!1), n = x(!0), l = x(null), i = x(null), c = x(null), w = x(""), b = x("all"), A = x("createTime_desc");
1044
- K(l, () => {
1045
- w.value = "";
1046
- });
1047
- function E(m) {
1048
- var f;
1049
- return {
1050
- source: ((f = l.value) == null ? void 0 : f.join(",")) || void 0,
1051
- dateFrom: i.value ? T(i.value).startOf("day").toISOString() : void 0,
1052
- dateTo: c.value ? T(c.value).endOf("day").toISOString() : void 0,
1053
- locationId: w.value || void 0,
1054
- excludeDeleted: b.value === "excludeDeleted" ? !0 : void 0,
1055
- sort: A.value,
1056
- limit: ne,
1057
- skip: m
1058
- };
1059
- }
1060
- async function F() {
1061
- r.value = !0, n.value = !0;
1062
- try {
1063
- const m = await se.listReviews(E(0));
1064
- s.value = m, n.value = m.length === ne;
1065
- } finally {
1066
- r.value = !1;
1067
- }
1068
- }
1069
- async function y() {
1070
- if (!(r.value || !n.value)) {
1071
- r.value = !0;
1072
- try {
1073
- const m = await se.listReviews(E(s.value.length));
1074
- s.value = [...s.value, ...m], n.value = m.length === ne;
1075
- } finally {
1076
- r.value = !1;
1077
- }
1078
- }
1079
- }
1080
- return K(
1081
- [
1082
- l,
1083
- i,
1084
- c,
1085
- w,
1086
- b,
1087
- A
1088
- ],
1089
- F
1090
- ), te(F), (m, f) => (a(), u("div", ho, [
1091
- g(yo),
1092
- g(ke, {
1093
- source: e(l),
1094
- "onUpdate:source": f[0] || (f[0] = (p) => z(l) ? l.value = p : null),
1095
- "date-from": e(i),
1096
- "onUpdate:dateFrom": f[1] || (f[1] = (p) => z(i) ? i.value = p : null),
1097
- "date-to": e(c),
1098
- "onUpdate:dateTo": f[2] || (f[2] = (p) => z(c) ? c.value = p : null),
1099
- "location-id": e(w),
1100
- "onUpdate:locationId": f[3] || (f[3] = (p) => z(w) ? w.value = p : null),
1101
- "deleted-filter": e(b),
1102
- "onUpdate:deletedFilter": f[4] || (f[4] = (p) => z(b) ? b.value = p : null),
1103
- sort: e(A),
1104
- "onUpdate:sort": f[5] || (f[5] = (p) => z(A) ? A.value = p : null)
1105
- }, null, 8, ["source", "date-from", "date-to", "location-id", "deleted-filter", "sort"]),
1106
- g(so, {
1107
- reviews: e(s),
1108
- loading: e(r),
1109
- "has-more": e(n),
1110
- onLoadMore: y
1111
- }, null, 8, ["reviews", "loading", "has-more"])
1112
- ]));
1113
- }
1114
- });
1115
- export {
1116
- So as default
1117
- };