@fayz-ai/storefront 0.84.0 → 0.84.2
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.
- package/dist/CheckoutPage-DDY4WLFJ.js +12 -0
- package/dist/CheckoutPage-DDY4WLFJ.js.map +1 -0
- package/dist/MyPurchasesPage-IHCB5QRR.js +11 -0
- package/dist/MyPurchasesPage-IHCB5QRR.js.map +1 -0
- package/dist/OrderConfirmationPage-SAKAGOCC.js +10 -0
- package/dist/OrderConfirmationPage-SAKAGOCC.js.map +1 -0
- package/dist/analytics/meta-pixel.d.ts +13 -0
- package/dist/analytics/meta-pixel.d.ts.map +1 -1
- package/dist/app/createStorefrontApp.d.ts.map +1 -1
- package/dist/chunk-45R7CIEA.js +234 -0
- package/dist/chunk-45R7CIEA.js.map +1 -0
- package/dist/{chunk-QU5O4CKY.js → chunk-6NUBVJJY.js} +5 -4
- package/dist/chunk-6NUBVJJY.js.map +1 -0
- package/dist/chunk-BKO2AQ3Q.js +329 -0
- package/dist/chunk-BKO2AQ3Q.js.map +1 -0
- package/dist/chunk-CV6RYJIC.js +454 -0
- package/dist/chunk-CV6RYJIC.js.map +1 -0
- package/dist/chunk-D5C5U2SG.js +267 -0
- package/dist/chunk-D5C5U2SG.js.map +1 -0
- package/dist/chunk-DRMDBXMT.js +2123 -0
- package/dist/chunk-DRMDBXMT.js.map +1 -0
- package/dist/chunk-DVQHKNNX.js +29 -0
- package/dist/chunk-DVQHKNNX.js.map +1 -0
- package/dist/chunk-FCPOPWG3.js +31 -0
- package/dist/chunk-FCPOPWG3.js.map +1 -0
- package/dist/chunk-GQ3TCJVX.js +216 -0
- package/dist/chunk-GQ3TCJVX.js.map +1 -0
- package/dist/{chunk-7N5HKQBM.js → chunk-GVZ2SAOI.js} +5 -552
- package/dist/chunk-GVZ2SAOI.js.map +1 -0
- package/dist/{chunk-7FR6KOW2.js → chunk-JLCF7CPP.js} +1256 -6590
- package/dist/chunk-JLCF7CPP.js.map +1 -0
- package/dist/chunk-K27LYMSF.js +435 -0
- package/dist/chunk-K27LYMSF.js.map +1 -0
- package/dist/chunk-MFAU3AWK.js +817 -0
- package/dist/chunk-MFAU3AWK.js.map +1 -0
- package/dist/chunk-OHWX6BEY.js +436 -0
- package/dist/chunk-OHWX6BEY.js.map +1 -0
- package/dist/chunk-PATS4DIF.js +484 -0
- package/dist/chunk-PATS4DIF.js.map +1 -0
- package/dist/chunk-WDQFNHYO.js +41 -0
- package/dist/chunk-WDQFNHYO.js.map +1 -0
- package/dist/chunk-WPWNYBNG.js +68 -0
- package/dist/chunk-WPWNYBNG.js.map +1 -0
- package/dist/chunk-WXXYJZE6.js +99 -0
- package/dist/chunk-WXXYJZE6.js.map +1 -0
- package/dist/host.js +4 -2
- package/dist/host.js.map +1 -1
- package/dist/index.js +26 -6
- package/dist/index.js.map +1 -1
- package/dist/render.js +11 -3
- package/dist/render.js.map +1 -1
- package/dist/tanstack.js +10 -2
- package/dist/tanstack.js.map +1 -1
- package/package.json +4 -4
- package/dist/chunk-7FR6KOW2.js.map +0 -1
- package/dist/chunk-7N5HKQBM.js.map +0 -1
- package/dist/chunk-QU5O4CKY.js.map +0 -1
|
@@ -0,0 +1,436 @@
|
|
|
1
|
+
import { useDeliveryStore, selectSubtotal, useCartStore } from './chunk-K27LYMSF.js';
|
|
2
|
+
import { useSessionStore, TID } from './chunk-PATS4DIF.js';
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import { ChevronLeft, X, MapPin, Check, Pencil, Trash2, Plus } from 'lucide-react';
|
|
5
|
+
import { normalizePostalCode, formatPostalCode } from '@fayz-ai/core';
|
|
6
|
+
import { getShopProvider } from '@fayz-ai/shop/runtime';
|
|
7
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
8
|
+
|
|
9
|
+
var LABELS = ["Casa", "Trabalho"];
|
|
10
|
+
function AddressSheet({ onClose, onSignIn }) {
|
|
11
|
+
const saved = useDeliveryStore((s) => s.savedAddresses);
|
|
12
|
+
const selectedId = useDeliveryStore((s) => s.selectedAddressId);
|
|
13
|
+
const selectAddress = useDeliveryStore((s) => s.selectAddress);
|
|
14
|
+
const removeAddress = useDeliveryStore((s) => s.removeAddress);
|
|
15
|
+
const saveAddress = useDeliveryStore((s) => s.saveAddress);
|
|
16
|
+
const current = useDeliveryStore((s) => s.address);
|
|
17
|
+
const subtotal = selectSubtotal(useCartStore());
|
|
18
|
+
const customerId = useSessionStore((s) => s.customerId);
|
|
19
|
+
const accountBook = useAccountAddresses(customerId);
|
|
20
|
+
const unsavedCurrent = current && !saved.some((a) => a.id === selectedId) ? current : null;
|
|
21
|
+
const fromAccount = accountBook.filter((a) => !saved.some((b) => normalizePostalCode(b.postalCode) === normalizePostalCode(a.postalCode) && b.number.trim().toLowerCase() === (a.number ?? "").trim().toLowerCase()));
|
|
22
|
+
const nothingToList = saved.length === 0 && !unsavedCurrent && fromAccount.length === 0 && !customerId;
|
|
23
|
+
const [editing, setEditing] = React.useState(
|
|
24
|
+
nothingToList && !onSignIn ? {} : null
|
|
25
|
+
);
|
|
26
|
+
function pickAccountAddress(a) {
|
|
27
|
+
const id = saveAddress({
|
|
28
|
+
label: a.label ?? null,
|
|
29
|
+
postalCode: a.postalCode,
|
|
30
|
+
street: a.street,
|
|
31
|
+
number: a.number ?? "",
|
|
32
|
+
complement: a.complement ?? null,
|
|
33
|
+
reference: null,
|
|
34
|
+
district: a.district ?? "",
|
|
35
|
+
city: a.city,
|
|
36
|
+
state: a.state,
|
|
37
|
+
country: a.country
|
|
38
|
+
});
|
|
39
|
+
void selectAddress(id, subtotal);
|
|
40
|
+
onClose();
|
|
41
|
+
}
|
|
42
|
+
const closeRef = React.useRef(() => {
|
|
43
|
+
});
|
|
44
|
+
closeRef.current = () => {
|
|
45
|
+
if (editing && !nothingToList) setEditing(null);
|
|
46
|
+
else onClose();
|
|
47
|
+
};
|
|
48
|
+
React.useEffect(() => {
|
|
49
|
+
const onKey = (e) => {
|
|
50
|
+
if (e.key === "Escape") closeRef.current();
|
|
51
|
+
};
|
|
52
|
+
window.addEventListener("keydown", onKey);
|
|
53
|
+
return () => window.removeEventListener("keydown", onKey);
|
|
54
|
+
}, []);
|
|
55
|
+
return /* @__PURE__ */ jsx(
|
|
56
|
+
"div",
|
|
57
|
+
{
|
|
58
|
+
role: "dialog",
|
|
59
|
+
"aria-modal": "true",
|
|
60
|
+
"aria-label": "Endere\xE7o de entrega",
|
|
61
|
+
"data-testid": TID.addressSheet,
|
|
62
|
+
onClick: (e) => {
|
|
63
|
+
if (e.target === e.currentTarget) onClose();
|
|
64
|
+
},
|
|
65
|
+
className: "fixed inset-0 z-50 flex flex-col justify-end bg-black/50 sm:items-center sm:justify-center sm:p-6",
|
|
66
|
+
children: /* @__PURE__ */ jsxs("div", { className: "flex max-h-[85vh] w-full flex-col overflow-hidden rounded-t-2xl bg-background sm:max-w-md sm:rounded-2xl", children: [
|
|
67
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 border-b border-border p-4", children: [
|
|
68
|
+
editing && !nothingToList && /* @__PURE__ */ jsx(
|
|
69
|
+
"button",
|
|
70
|
+
{
|
|
71
|
+
type: "button",
|
|
72
|
+
onClick: () => setEditing(null),
|
|
73
|
+
"aria-label": "Voltar",
|
|
74
|
+
className: "-ml-2 grid h-9 w-9 place-items-center rounded-full",
|
|
75
|
+
children: /* @__PURE__ */ jsx(ChevronLeft, { className: "h-5 w-5" })
|
|
76
|
+
}
|
|
77
|
+
),
|
|
78
|
+
/* @__PURE__ */ jsx("h2", { className: "flex-1 text-lg font-semibold", children: editing ? editing.replaces ? "Editar endere\xE7o" : "Novo endere\xE7o" : "Onde voc\xEA quer receber?" }),
|
|
79
|
+
/* @__PURE__ */ jsx(
|
|
80
|
+
"button",
|
|
81
|
+
{
|
|
82
|
+
type: "button",
|
|
83
|
+
onClick: onClose,
|
|
84
|
+
"aria-label": "Fechar",
|
|
85
|
+
className: "-mr-2 grid h-9 w-9 place-items-center rounded-full",
|
|
86
|
+
children: /* @__PURE__ */ jsx(X, { className: "h-5 w-5" })
|
|
87
|
+
}
|
|
88
|
+
)
|
|
89
|
+
] }),
|
|
90
|
+
editing ? /* @__PURE__ */ jsx(
|
|
91
|
+
AddressForm,
|
|
92
|
+
{
|
|
93
|
+
initial: editing.initial,
|
|
94
|
+
replaces: editing.replaces,
|
|
95
|
+
onDone: () => {
|
|
96
|
+
setEditing(null);
|
|
97
|
+
onClose();
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
) : /* @__PURE__ */ jsxs("div", { className: "min-h-0 flex-1 overflow-y-auto p-4", children: [
|
|
101
|
+
unsavedCurrent && /* @__PURE__ */ jsxs("section", { className: "mb-4", "data-testid": "address-current", children: [
|
|
102
|
+
/* @__PURE__ */ jsx("h3", { className: "mb-2 text-xs font-semibold uppercase tracking-wide text-muted-foreground", children: "Endere\xE7o atual" }),
|
|
103
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-start gap-3 rounded-lg border border-primary p-3", children: [
|
|
104
|
+
/* @__PURE__ */ jsx(MapPin, { className: "mt-0.5 h-5 w-5 shrink-0 text-primary" }),
|
|
105
|
+
/* @__PURE__ */ jsxs("span", { className: "min-w-0 flex-1", children: [
|
|
106
|
+
/* @__PURE__ */ jsx("span", { className: "block truncate text-sm", children: unsavedCurrent.street }),
|
|
107
|
+
/* @__PURE__ */ jsx("span", { className: "block truncate text-xs text-muted-foreground", children: [unsavedCurrent.district, unsavedCurrent.city].filter(Boolean).join(" \xB7 ") })
|
|
108
|
+
] }),
|
|
109
|
+
/* @__PURE__ */ jsx(
|
|
110
|
+
"button",
|
|
111
|
+
{
|
|
112
|
+
type: "button",
|
|
113
|
+
"data-testid": "address-complete-current",
|
|
114
|
+
onClick: () => setEditing({ initial: { postalCode: unsavedCurrent.postalCode } }),
|
|
115
|
+
className: "shrink-0 text-sm font-semibold text-primary",
|
|
116
|
+
children: "Completar"
|
|
117
|
+
}
|
|
118
|
+
)
|
|
119
|
+
] })
|
|
120
|
+
] }),
|
|
121
|
+
saved.length > 0 && /* @__PURE__ */ jsxs("section", { className: "mb-4", children: [
|
|
122
|
+
/* @__PURE__ */ jsx("h3", { className: "mb-2 text-xs font-semibold uppercase tracking-wide text-muted-foreground", children: "Seus endere\xE7os" }),
|
|
123
|
+
/* @__PURE__ */ jsx("ul", { className: "space-y-2", children: saved.map((address) => /* @__PURE__ */ jsxs("li", { className: "flex items-start gap-1", children: [
|
|
124
|
+
/* @__PURE__ */ jsxs(
|
|
125
|
+
"button",
|
|
126
|
+
{
|
|
127
|
+
type: "button",
|
|
128
|
+
"data-testid": TID.savedAddress(address.id),
|
|
129
|
+
"aria-pressed": selectedId === address.id,
|
|
130
|
+
onClick: () => {
|
|
131
|
+
void selectAddress(address.id, subtotal);
|
|
132
|
+
onClose();
|
|
133
|
+
},
|
|
134
|
+
className: `flex min-w-0 flex-1 items-start gap-3 rounded-lg border p-3 text-left ${selectedId === address.id ? "border-primary" : "border-border"}`,
|
|
135
|
+
children: [
|
|
136
|
+
selectedId === address.id ? /* @__PURE__ */ jsx(Check, { className: "mt-0.5 h-5 w-5 shrink-0 text-primary" }) : /* @__PURE__ */ jsx(MapPin, { className: "mt-0.5 h-5 w-5 shrink-0 text-muted-foreground" }),
|
|
137
|
+
/* @__PURE__ */ jsx(AddressLines, { address })
|
|
138
|
+
]
|
|
139
|
+
}
|
|
140
|
+
),
|
|
141
|
+
/* @__PURE__ */ jsx(
|
|
142
|
+
"button",
|
|
143
|
+
{
|
|
144
|
+
type: "button",
|
|
145
|
+
"data-testid": `edit-address-${address.id}`,
|
|
146
|
+
onClick: () => setEditing({ initial: address, replaces: address.id }),
|
|
147
|
+
"aria-label": `Editar ${address.street}, ${address.number}`,
|
|
148
|
+
className: "mt-1 grid h-10 w-10 shrink-0 place-items-center rounded-full text-muted-foreground",
|
|
149
|
+
children: /* @__PURE__ */ jsx(Pencil, { className: "h-4 w-4" })
|
|
150
|
+
}
|
|
151
|
+
),
|
|
152
|
+
/* @__PURE__ */ jsx(
|
|
153
|
+
"button",
|
|
154
|
+
{
|
|
155
|
+
type: "button",
|
|
156
|
+
onClick: () => removeAddress(address.id),
|
|
157
|
+
"aria-label": `Remover ${address.street}, ${address.number}`,
|
|
158
|
+
className: "mt-1 grid h-10 w-10 shrink-0 place-items-center rounded-full text-muted-foreground",
|
|
159
|
+
children: /* @__PURE__ */ jsx(Trash2, { className: "h-4 w-4" })
|
|
160
|
+
}
|
|
161
|
+
)
|
|
162
|
+
] }, address.id)) })
|
|
163
|
+
] }),
|
|
164
|
+
fromAccount.length > 0 && /* @__PURE__ */ jsxs("section", { className: "mb-4", "data-testid": "address-account-book", children: [
|
|
165
|
+
/* @__PURE__ */ jsx("h3", { className: "mb-2 text-xs font-semibold uppercase tracking-wide text-muted-foreground", children: "Da sua conta" }),
|
|
166
|
+
/* @__PURE__ */ jsx("ul", { className: "space-y-2", children: fromAccount.map((address) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsxs(
|
|
167
|
+
"button",
|
|
168
|
+
{
|
|
169
|
+
type: "button",
|
|
170
|
+
onClick: () => pickAccountAddress(address),
|
|
171
|
+
className: "flex w-full min-w-0 items-start gap-3 rounded-lg border border-border p-3 text-left",
|
|
172
|
+
children: [
|
|
173
|
+
/* @__PURE__ */ jsx(MapPin, { className: "mt-0.5 h-5 w-5 shrink-0 text-muted-foreground" }),
|
|
174
|
+
/* @__PURE__ */ jsx(AddressLines, { address: {
|
|
175
|
+
label: address.label ?? null,
|
|
176
|
+
street: address.street,
|
|
177
|
+
number: address.number ?? "",
|
|
178
|
+
complement: address.complement ?? null,
|
|
179
|
+
district: address.district ?? "",
|
|
180
|
+
city: address.city,
|
|
181
|
+
reference: null
|
|
182
|
+
} })
|
|
183
|
+
]
|
|
184
|
+
}
|
|
185
|
+
) }, address.id)) })
|
|
186
|
+
] }),
|
|
187
|
+
!customerId && onSignIn && /* @__PURE__ */ jsxs("div", { "data-testid": "address-sign-in", className: "mb-4 rounded-lg bg-muted/40 p-3 text-sm", children: [
|
|
188
|
+
/* @__PURE__ */ jsx("p", { children: "Entre na sua conta para usar os endere\xE7os salvos nela." }),
|
|
189
|
+
/* @__PURE__ */ jsx(
|
|
190
|
+
"button",
|
|
191
|
+
{
|
|
192
|
+
type: "button",
|
|
193
|
+
onClick: onSignIn,
|
|
194
|
+
className: "mt-2 font-semibold text-primary",
|
|
195
|
+
children: "Entrar ou criar conta"
|
|
196
|
+
}
|
|
197
|
+
)
|
|
198
|
+
] }),
|
|
199
|
+
/* @__PURE__ */ jsxs(
|
|
200
|
+
"button",
|
|
201
|
+
{
|
|
202
|
+
type: "button",
|
|
203
|
+
"data-testid": TID.addressAddNew,
|
|
204
|
+
onClick: () => setEditing({}),
|
|
205
|
+
className: "flex w-full items-center justify-center gap-2 rounded-full border border-border px-4 py-3 text-sm font-semibold",
|
|
206
|
+
children: [
|
|
207
|
+
/* @__PURE__ */ jsx(Plus, { className: "h-4 w-4" }),
|
|
208
|
+
"Adicionar novo endere\xE7o"
|
|
209
|
+
]
|
|
210
|
+
}
|
|
211
|
+
)
|
|
212
|
+
] })
|
|
213
|
+
] })
|
|
214
|
+
}
|
|
215
|
+
);
|
|
216
|
+
}
|
|
217
|
+
function AddressLines({ address }) {
|
|
218
|
+
return /* @__PURE__ */ jsxs("span", { className: "min-w-0 flex-1", children: [
|
|
219
|
+
address.label && /* @__PURE__ */ jsx("span", { className: "block text-sm font-semibold", children: address.label }),
|
|
220
|
+
/* @__PURE__ */ jsxs("span", { className: "block truncate text-sm", children: [
|
|
221
|
+
address.street,
|
|
222
|
+
address.number ? `, ${address.number}` : ""
|
|
223
|
+
] }),
|
|
224
|
+
/* @__PURE__ */ jsx("span", { className: "block truncate text-xs text-muted-foreground", children: [address.complement, address.district, address.city].filter(Boolean).join(" \xB7 ") }),
|
|
225
|
+
address.reference && /* @__PURE__ */ jsx("span", { className: "mt-0.5 block truncate text-xs text-muted-foreground", children: address.reference })
|
|
226
|
+
] });
|
|
227
|
+
}
|
|
228
|
+
function useAccountAddresses(customerId) {
|
|
229
|
+
const [rows, setRows] = React.useState([]);
|
|
230
|
+
React.useEffect(() => {
|
|
231
|
+
if (!customerId) {
|
|
232
|
+
setRows([]);
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
const shop = getShopProvider();
|
|
236
|
+
if (typeof shop.listCustomerAddresses !== "function") return;
|
|
237
|
+
let cancelled = false;
|
|
238
|
+
shop.listCustomerAddresses(customerId).then((list) => {
|
|
239
|
+
if (!cancelled) setRows(list);
|
|
240
|
+
}).catch(() => {
|
|
241
|
+
if (!cancelled) setRows([]);
|
|
242
|
+
});
|
|
243
|
+
return () => {
|
|
244
|
+
cancelled = true;
|
|
245
|
+
};
|
|
246
|
+
}, [customerId]);
|
|
247
|
+
return rows;
|
|
248
|
+
}
|
|
249
|
+
function AddressForm({ onDone, initial, replaces }) {
|
|
250
|
+
const resolve = useDeliveryStore((s) => s.resolve);
|
|
251
|
+
const saveAddress = useDeliveryStore((s) => s.saveAddress);
|
|
252
|
+
const removeAddress = useDeliveryStore((s) => s.removeAddress);
|
|
253
|
+
const looked = useDeliveryStore((s) => s.address);
|
|
254
|
+
const status = useDeliveryStore((s) => s.status);
|
|
255
|
+
const storeError = useDeliveryStore((s) => s.error);
|
|
256
|
+
const refusedZone = useDeliveryStore((s) => s.refusedZone);
|
|
257
|
+
const subtotal = selectSubtotal(useCartStore());
|
|
258
|
+
const [cep, setCep] = React.useState(initial?.postalCode ? formatPostalCode(initial.postalCode) : "");
|
|
259
|
+
const [number, setNumber] = React.useState(initial?.number ?? "");
|
|
260
|
+
const [complement, setComplement] = React.useState(initial?.complement ?? "");
|
|
261
|
+
const [reference, setReference] = React.useState(initial?.reference ?? "");
|
|
262
|
+
const [label, setLabel] = React.useState(initial?.label ?? "");
|
|
263
|
+
const [touched, setTouched] = React.useState(false);
|
|
264
|
+
const numberRef = React.useRef(null);
|
|
265
|
+
const digits = normalizePostalCode(cep);
|
|
266
|
+
const found = Boolean(looked) && normalizePostalCode(looked.postalCode) === digits;
|
|
267
|
+
React.useEffect(() => {
|
|
268
|
+
if (found) numberRef.current?.focus();
|
|
269
|
+
}, [found]);
|
|
270
|
+
async function lookUp() {
|
|
271
|
+
if (digits.length !== 8) return;
|
|
272
|
+
await resolve(digits, subtotal);
|
|
273
|
+
}
|
|
274
|
+
const prefilled = React.useRef(false);
|
|
275
|
+
React.useEffect(() => {
|
|
276
|
+
if (prefilled.current || !initial?.postalCode) return;
|
|
277
|
+
prefilled.current = true;
|
|
278
|
+
if (!found) void lookUp();
|
|
279
|
+
}, []);
|
|
280
|
+
function submit(event) {
|
|
281
|
+
event.preventDefault();
|
|
282
|
+
setTouched(true);
|
|
283
|
+
if (!found || !number.trim()) return;
|
|
284
|
+
if (replaces) removeAddress(replaces);
|
|
285
|
+
saveAddress({
|
|
286
|
+
label: label.trim() || null,
|
|
287
|
+
postalCode: looked.postalCode,
|
|
288
|
+
street: looked.street,
|
|
289
|
+
number: number.trim(),
|
|
290
|
+
complement: complement.trim() || null,
|
|
291
|
+
reference: reference.trim() || null,
|
|
292
|
+
district: looked.district,
|
|
293
|
+
city: looked.city,
|
|
294
|
+
state: looked.state
|
|
295
|
+
});
|
|
296
|
+
onDone();
|
|
297
|
+
}
|
|
298
|
+
const numberMissing = touched && !number.trim();
|
|
299
|
+
return /* @__PURE__ */ jsxs("form", { onSubmit: submit, className: "min-h-0 flex-1 overflow-y-auto p-4", children: [
|
|
300
|
+
/* @__PURE__ */ jsx("label", { htmlFor: "address-cep", className: "text-sm font-medium", children: "CEP" }),
|
|
301
|
+
/* @__PURE__ */ jsxs("div", { className: "mt-1 flex gap-2", children: [
|
|
302
|
+
/* @__PURE__ */ jsx(
|
|
303
|
+
"input",
|
|
304
|
+
{
|
|
305
|
+
id: "address-cep",
|
|
306
|
+
"data-testid": TID.addressCep,
|
|
307
|
+
value: cep,
|
|
308
|
+
onChange: (e) => setCep(formatPostalCode(e.target.value)),
|
|
309
|
+
onBlur: () => void lookUp(),
|
|
310
|
+
inputMode: "numeric",
|
|
311
|
+
autoComplete: "postal-code",
|
|
312
|
+
placeholder: "00000-000",
|
|
313
|
+
className: "h-12 flex-1 rounded-lg border border-border bg-transparent px-3 text-base"
|
|
314
|
+
}
|
|
315
|
+
),
|
|
316
|
+
/* @__PURE__ */ jsx(
|
|
317
|
+
"button",
|
|
318
|
+
{
|
|
319
|
+
type: "button",
|
|
320
|
+
onClick: () => void lookUp(),
|
|
321
|
+
disabled: digits.length !== 8 || status === "loading",
|
|
322
|
+
className: "h-12 rounded-lg bg-primary px-4 text-sm font-semibold text-primary-foreground disabled:opacity-40",
|
|
323
|
+
children: status === "loading" ? "Buscando\u2026" : "Buscar"
|
|
324
|
+
}
|
|
325
|
+
)
|
|
326
|
+
] }),
|
|
327
|
+
storeError && /* @__PURE__ */ jsx("p", { className: "mt-2 text-sm text-destructive", children: storeError }),
|
|
328
|
+
refusedZone && /* @__PURE__ */ jsxs("p", { className: "mt-2 text-sm text-destructive", children: [
|
|
329
|
+
"Ainda n\xE3o entregamos nessa regi\xE3o (",
|
|
330
|
+
refusedZone,
|
|
331
|
+
")."
|
|
332
|
+
] }),
|
|
333
|
+
found && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
334
|
+
/* @__PURE__ */ jsxs("p", { className: "mt-4 rounded-lg bg-muted/40 p-3 text-sm", children: [
|
|
335
|
+
/* @__PURE__ */ jsx("span", { className: "block font-medium", children: looked.street }),
|
|
336
|
+
/* @__PURE__ */ jsxs("span", { className: "block text-muted-foreground", children: [
|
|
337
|
+
looked.district,
|
|
338
|
+
" \xB7 ",
|
|
339
|
+
looked.city,
|
|
340
|
+
" \u2014 ",
|
|
341
|
+
looked.state
|
|
342
|
+
] })
|
|
343
|
+
] }),
|
|
344
|
+
/* @__PURE__ */ jsxs("div", { className: "mt-4 grid grid-cols-2 gap-3", children: [
|
|
345
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
346
|
+
/* @__PURE__ */ jsx("label", { htmlFor: "address-number", className: "text-sm font-medium", children: "N\xFAmero" }),
|
|
347
|
+
/* @__PURE__ */ jsx(
|
|
348
|
+
"input",
|
|
349
|
+
{
|
|
350
|
+
id: "address-number",
|
|
351
|
+
ref: numberRef,
|
|
352
|
+
"data-testid": TID.addressNumber,
|
|
353
|
+
value: number,
|
|
354
|
+
onChange: (e) => setNumber(e.target.value),
|
|
355
|
+
inputMode: "numeric",
|
|
356
|
+
autoComplete: "address-line2",
|
|
357
|
+
"aria-invalid": numberMissing || void 0,
|
|
358
|
+
"aria-describedby": numberMissing ? "address-number-error" : void 0,
|
|
359
|
+
className: `mt-1 h-12 w-full rounded-lg border bg-transparent px-3 text-base ${numberMissing ? "border-destructive" : "border-border"}`
|
|
360
|
+
}
|
|
361
|
+
),
|
|
362
|
+
numberMissing && // Junto do campo e não num resumo no topo: o erro é sobre ESTE
|
|
363
|
+
// campo, e a pessoa está olhando para ele.
|
|
364
|
+
/* @__PURE__ */ jsx("p", { id: "address-number-error", className: "mt-1 text-xs text-destructive", children: "Informe o n\xFAmero." })
|
|
365
|
+
] }),
|
|
366
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
367
|
+
/* @__PURE__ */ jsx("label", { htmlFor: "address-complement", className: "text-sm font-medium", children: "Complemento" }),
|
|
368
|
+
/* @__PURE__ */ jsx(
|
|
369
|
+
"input",
|
|
370
|
+
{
|
|
371
|
+
id: "address-complement",
|
|
372
|
+
"data-testid": TID.addressComplement,
|
|
373
|
+
value: complement,
|
|
374
|
+
onChange: (e) => setComplement(e.target.value),
|
|
375
|
+
placeholder: "Apto, bloco\u2026",
|
|
376
|
+
className: "mt-1 h-12 w-full rounded-lg border border-border bg-transparent px-3 text-base"
|
|
377
|
+
}
|
|
378
|
+
)
|
|
379
|
+
] })
|
|
380
|
+
] }),
|
|
381
|
+
/* @__PURE__ */ jsxs("div", { className: "mt-4", children: [
|
|
382
|
+
/* @__PURE__ */ jsx("label", { htmlFor: "address-reference", className: "text-sm font-medium", children: "Ponto de refer\xEAncia" }),
|
|
383
|
+
/* @__PURE__ */ jsx(
|
|
384
|
+
"input",
|
|
385
|
+
{
|
|
386
|
+
id: "address-reference",
|
|
387
|
+
"data-testid": TID.addressReference,
|
|
388
|
+
value: reference,
|
|
389
|
+
onChange: (e) => setReference(e.target.value),
|
|
390
|
+
placeholder: "Port\xE3o azul, ao lado da padaria",
|
|
391
|
+
className: "mt-1 h-12 w-full rounded-lg border border-border bg-transparent px-3 text-base"
|
|
392
|
+
}
|
|
393
|
+
)
|
|
394
|
+
] }),
|
|
395
|
+
/* @__PURE__ */ jsxs("fieldset", { className: "mt-4", children: [
|
|
396
|
+
/* @__PURE__ */ jsx("legend", { className: "text-sm font-medium", children: "Salvar como" }),
|
|
397
|
+
/* @__PURE__ */ jsxs("div", { className: "mt-2 flex flex-wrap gap-2", children: [
|
|
398
|
+
LABELS.map((name) => /* @__PURE__ */ jsx(
|
|
399
|
+
"button",
|
|
400
|
+
{
|
|
401
|
+
type: "button",
|
|
402
|
+
"aria-pressed": label === name,
|
|
403
|
+
onClick: () => setLabel(label === name ? "" : name),
|
|
404
|
+
className: `rounded-full px-4 py-2 text-sm font-medium ${label === name ? "bg-foreground text-background" : "border border-border text-muted-foreground"}`,
|
|
405
|
+
children: name
|
|
406
|
+
},
|
|
407
|
+
name
|
|
408
|
+
)),
|
|
409
|
+
/* @__PURE__ */ jsx(
|
|
410
|
+
"input",
|
|
411
|
+
{
|
|
412
|
+
value: LABELS.includes(label) ? "" : label,
|
|
413
|
+
onChange: (e) => setLabel(e.target.value),
|
|
414
|
+
placeholder: "Outro",
|
|
415
|
+
"aria-label": "Outro apelido",
|
|
416
|
+
className: "h-10 min-w-24 flex-1 rounded-full border border-border bg-transparent px-4 text-sm"
|
|
417
|
+
}
|
|
418
|
+
)
|
|
419
|
+
] })
|
|
420
|
+
] }),
|
|
421
|
+
/* @__PURE__ */ jsx(
|
|
422
|
+
"button",
|
|
423
|
+
{
|
|
424
|
+
type: "submit",
|
|
425
|
+
"data-testid": TID.addressSave,
|
|
426
|
+
className: "mt-6 h-12 w-full rounded-full bg-primary font-semibold text-primary-foreground",
|
|
427
|
+
children: "Salvar endere\xE7o"
|
|
428
|
+
}
|
|
429
|
+
)
|
|
430
|
+
] })
|
|
431
|
+
] });
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
export { AddressSheet, useAccountAddresses };
|
|
435
|
+
//# sourceMappingURL=chunk-OHWX6BEY.js.map
|
|
436
|
+
//# sourceMappingURL=chunk-OHWX6BEY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/delivery/AddressSheet.tsx"],"names":[],"mappings":"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","file":"chunk-OHWX6BEY.js","sourcesContent":["import React from 'react'\nimport { Check, ChevronLeft, MapPin, Pencil, Plus, Trash2, X } from 'lucide-react'\nimport { formatPostalCode, normalizePostalCode } from '@fayz-ai/core'\nimport { useDeliveryStore, type SavedDeliveryAddress } from '../../stores/delivery.store'\nimport { useCartStore, selectSubtotal } from '../../stores/cart.store'\nimport { TID } from '../../lib/testids'\nimport { useSessionStore } from '../../stores/session.store'\nimport { getShopProvider } from '@fayz-ai/shop/runtime'\nimport type { CustomerAddress } from '@fayz-ai/shop/types'\n\n/** Os apelidos que quase todo mundo usa. \"Outro\" abre o campo livre. */\nconst LABELS = ['Casa', 'Trabalho'] as const\n\n/**\n * \"Onde você quer receber?\" — o caderno de endereços do navegador.\n *\n * Copiado do fluxo que os apps de delivery usam, e a razão de ele ser assim é\n * a ordem das perguntas: o CEP resolve rua, bairro e cidade de graça, então a\n * primeira tela pede só o CEP; a segunda pede exatamente o que nenhuma consulta\n * de CEP sabe — número, complemento e ponto de referência — e o número é o\n * único obrigatório.\n *\n * O que faz isso valer a pena é a terceira visita: quem já salvou não digita\n * nada, escolhe da lista. Um checkout que pede o endereço inteiro toda vez é o\n * atrito que faz a pessoa voltar para o app que já sabe onde ela mora.\n *\n * Fica no NAVEGADOR, e é uma escolha, não uma limitação aceita em silêncio: no\n * delivery o endereço vem antes do login. O caderno da conta (`CustomerAddress`)\n * continua existindo e continua ganhando no checkout quando existe.\n */\nexport function AddressSheet({ onClose, onSignIn }: {\n onClose: () => void\n /** Opens the sign-in modal; absent, the signed-out prompt is not drawn. */\n onSignIn?: () => void\n}) {\n const saved = useDeliveryStore((s) => s.savedAddresses)\n const selectedId = useDeliveryStore((s) => s.selectedAddressId)\n const selectAddress = useDeliveryStore((s) => s.selectAddress)\n const removeAddress = useDeliveryStore((s) => s.removeAddress)\n const saveAddress = useDeliveryStore((s) => s.saveAddress)\n const current = useDeliveryStore((s) => s.address)\n const subtotal = selectSubtotal(useCartStore())\n const customerId = useSessionStore((s) => s.customerId)\n const accountBook = useAccountAddresses(customerId)\n\n // The address on screen that is NOT in the book — typed at checkout, or a\n // CEP looked up without a number. It is what the strip shows, so it is what\n // the sheet must show first; opening straight on «Novo endereço» hid it.\n const unsavedCurrent = current && !saved.some((a) => a.id === selectedId) ? current : null\n // Account addresses not already copied into this browser's book.\n const fromAccount = accountBook.filter((a) => !saved.some((b) =>\n normalizePostalCode(b.postalCode) === normalizePostalCode(a.postalCode)\n && b.number.trim().toLowerCase() === (a.number ?? '').trim().toLowerCase()))\n\n const nothingToList = saved.length === 0 && !unsavedCurrent && fromAccount.length === 0 && !customerId\n // Nothing at all to choose from: the form IS the screen.\n const [editing, setEditing] = React.useState<null | { initial?: Partial<SavedDeliveryAddress>; replaces?: string }>(\n nothingToList && !onSignIn ? {} : null,\n )\n\n function pickAccountAddress(a: CustomerAddress) {\n const id = saveAddress({\n label: a.label ?? null,\n postalCode: a.postalCode,\n street: a.street,\n number: a.number ?? '',\n complement: a.complement ?? null,\n reference: null,\n district: a.district ?? '',\n city: a.city,\n state: a.state,\n country: a.country,\n })\n void selectAddress(id, subtotal)\n onClose()\n }\n\n // Esc and a tap outside close it, as the account drawer does; inside the\n // form, Esc steps back to the list first.\n const closeRef = React.useRef<() => void>(() => {})\n closeRef.current = () => { if (editing && !nothingToList) setEditing(null); else onClose() }\n React.useEffect(() => {\n const onKey = (e: KeyboardEvent) => { if (e.key === 'Escape') closeRef.current() }\n window.addEventListener('keydown', onKey)\n return () => window.removeEventListener('keydown', onKey)\n }, [])\n\n return (\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Endereço de entrega\"\n data-testid={TID.addressSheet}\n onClick={(e) => { if (e.target === e.currentTarget) onClose() }}\n className=\"fixed inset-0 z-50 flex flex-col justify-end bg-black/50 sm:items-center sm:justify-center sm:p-6\"\n >\n <div className=\"flex max-h-[85vh] w-full flex-col overflow-hidden rounded-t-2xl bg-background sm:max-w-md sm:rounded-2xl\">\n <div className=\"flex items-center gap-2 border-b border-border p-4\">\n {editing && !nothingToList && (\n <button\n type=\"button\"\n onClick={() => setEditing(null)}\n aria-label=\"Voltar\"\n className=\"-ml-2 grid h-9 w-9 place-items-center rounded-full\"\n >\n <ChevronLeft className=\"h-5 w-5\" />\n </button>\n )}\n <h2 className=\"flex-1 text-lg font-semibold\">\n {editing ? (editing.replaces ? 'Editar endereço' : 'Novo endereço') : 'Onde você quer receber?'}\n </h2>\n <button\n type=\"button\"\n onClick={onClose}\n aria-label=\"Fechar\"\n className=\"-mr-2 grid h-9 w-9 place-items-center rounded-full\"\n >\n <X className=\"h-5 w-5\" />\n </button>\n </div>\n\n {editing ? (\n <AddressForm\n initial={editing.initial}\n replaces={editing.replaces}\n onDone={() => {\n setEditing(null)\n onClose()\n }}\n />\n ) : (\n <div className=\"min-h-0 flex-1 overflow-y-auto p-4\">\n {unsavedCurrent && (\n <section className=\"mb-4\" data-testid=\"address-current\">\n <h3 className=\"mb-2 text-xs font-semibold uppercase tracking-wide text-muted-foreground\">Endereço atual</h3>\n <div className=\"flex items-start gap-3 rounded-lg border border-primary p-3\">\n <MapPin className=\"mt-0.5 h-5 w-5 shrink-0 text-primary\" />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-sm\">{unsavedCurrent.street}</span>\n <span className=\"block truncate text-xs text-muted-foreground\">\n {[unsavedCurrent.district, unsavedCurrent.city].filter(Boolean).join(' · ')}\n </span>\n </span>\n <button\n type=\"button\"\n data-testid=\"address-complete-current\"\n onClick={() => setEditing({ initial: { postalCode: unsavedCurrent.postalCode } })}\n className=\"shrink-0 text-sm font-semibold text-primary\"\n >\n Completar\n </button>\n </div>\n </section>\n )}\n\n {saved.length > 0 && (\n <section className=\"mb-4\">\n <h3 className=\"mb-2 text-xs font-semibold uppercase tracking-wide text-muted-foreground\">Seus endereços</h3>\n <ul className=\"space-y-2\">\n {saved.map((address) => (\n <li key={address.id} className=\"flex items-start gap-1\">\n <button\n type=\"button\"\n data-testid={TID.savedAddress(address.id)}\n aria-pressed={selectedId === address.id}\n onClick={() => {\n void selectAddress(address.id, subtotal)\n onClose()\n }}\n className={`flex min-w-0 flex-1 items-start gap-3 rounded-lg border p-3 text-left ${\n selectedId === address.id ? 'border-primary' : 'border-border'\n }`}\n >\n {selectedId === address.id\n ? <Check className=\"mt-0.5 h-5 w-5 shrink-0 text-primary\" />\n : <MapPin className=\"mt-0.5 h-5 w-5 shrink-0 text-muted-foreground\" />}\n <AddressLines address={address} />\n </button>\n <button\n type=\"button\"\n data-testid={`edit-address-${address.id}`}\n onClick={() => setEditing({ initial: address, replaces: address.id })}\n aria-label={`Editar ${address.street}, ${address.number}`}\n className=\"mt-1 grid h-10 w-10 shrink-0 place-items-center rounded-full text-muted-foreground\"\n >\n <Pencil className=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n onClick={() => removeAddress(address.id)}\n aria-label={`Remover ${address.street}, ${address.number}`}\n className=\"mt-1 grid h-10 w-10 shrink-0 place-items-center rounded-full text-muted-foreground\"\n >\n <Trash2 className=\"h-4 w-4\" />\n </button>\n </li>\n ))}\n </ul>\n </section>\n )}\n\n {fromAccount.length > 0 && (\n <section className=\"mb-4\" data-testid=\"address-account-book\">\n <h3 className=\"mb-2 text-xs font-semibold uppercase tracking-wide text-muted-foreground\">Da sua conta</h3>\n <ul className=\"space-y-2\">\n {fromAccount.map((address) => (\n <li key={address.id}>\n <button\n type=\"button\"\n onClick={() => pickAccountAddress(address)}\n className=\"flex w-full min-w-0 items-start gap-3 rounded-lg border border-border p-3 text-left\"\n >\n <MapPin className=\"mt-0.5 h-5 w-5 shrink-0 text-muted-foreground\" />\n <AddressLines address={{\n label: address.label ?? null,\n street: address.street,\n number: address.number ?? '',\n complement: address.complement ?? null,\n district: address.district ?? '',\n city: address.city,\n reference: null,\n }} />\n </button>\n </li>\n ))}\n </ul>\n </section>\n )}\n\n {!customerId && onSignIn && (\n <div data-testid=\"address-sign-in\" className=\"mb-4 rounded-lg bg-muted/40 p-3 text-sm\">\n <p>Entre na sua conta para usar os endereços salvos nela.</p>\n <button\n type=\"button\"\n onClick={onSignIn}\n className=\"mt-2 font-semibold text-primary\"\n >\n Entrar ou criar conta\n </button>\n </div>\n )}\n\n <button\n type=\"button\"\n data-testid={TID.addressAddNew}\n onClick={() => setEditing({})}\n className=\"flex w-full items-center justify-center gap-2 rounded-full border border-border px-4 py-3 text-sm font-semibold\"\n >\n <Plus className=\"h-4 w-4\" />\n Adicionar novo endereço\n </button>\n </div>\n )}\n </div>\n </div>\n )\n}\n\nfunction AddressLines({ address }: {\n address: Pick<SavedDeliveryAddress, 'label' | 'street' | 'number' | 'complement' | 'district' | 'city' | 'reference'>\n}) {\n return (\n <span className=\"min-w-0 flex-1\">\n {address.label && <span className=\"block text-sm font-semibold\">{address.label}</span>}\n <span className=\"block truncate text-sm\">\n {address.street}{address.number ? `, ${address.number}` : ''}\n </span>\n <span className=\"block truncate text-xs text-muted-foreground\">\n {[address.complement, address.district, address.city].filter(Boolean).join(' · ')}\n </span>\n {address.reference && (\n <span className=\"mt-0.5 block truncate text-xs text-muted-foreground\">{address.reference}</span>\n )}\n </span>\n )\n}\n\n/**\n * The signed-in customer's own address book (public.addresses, RLS-scoped to\n * them). Empty for a guest, and on any failure: the browser's book still works.\n */\nexport function useAccountAddresses(customerId: string | null): CustomerAddress[] {\n const [rows, setRows] = React.useState<CustomerAddress[]>([])\n React.useEffect(() => {\n if (!customerId) { setRows([]); return }\n const shop = getShopProvider()\n if (typeof shop.listCustomerAddresses !== 'function') return\n let cancelled = false\n shop.listCustomerAddresses(customerId)\n .then((list) => { if (!cancelled) setRows(list) })\n .catch(() => { if (!cancelled) setRows([]) })\n return () => { cancelled = true }\n }, [customerId])\n return rows\n}\n\n/**\n * CEP primeiro, resto depois.\n *\n * Uma tela só com sete campos, sendo quatro deles preenchíveis por consulta, é\n * a forma mais rápida de fazer alguém desistir. Os campos da consulta ficam\n * VISÍVEIS mas em leitura: a pessoa precisa conferir que o CEP achou a rua\n * certa — e conferir é diferente de digitar.\n */\nfunction AddressForm({ onDone, initial, replaces }: {\n onDone: () => void\n /** Prefill: a saved address being edited, or the current one being completed. */\n initial?: Partial<SavedDeliveryAddress>\n /** The saved address this form rewrites; removed when the new one is saved. */\n replaces?: string\n}) {\n const resolve = useDeliveryStore((s) => s.resolve)\n const saveAddress = useDeliveryStore((s) => s.saveAddress)\n const removeAddress = useDeliveryStore((s) => s.removeAddress)\n const looked = useDeliveryStore((s) => s.address)\n const status = useDeliveryStore((s) => s.status)\n const storeError = useDeliveryStore((s) => s.error)\n const refusedZone = useDeliveryStore((s) => s.refusedZone)\n const subtotal = selectSubtotal(useCartStore())\n\n const [cep, setCep] = React.useState(initial?.postalCode ? formatPostalCode(initial.postalCode) : '')\n const [number, setNumber] = React.useState(initial?.number ?? '')\n const [complement, setComplement] = React.useState(initial?.complement ?? '')\n const [reference, setReference] = React.useState(initial?.reference ?? '')\n const [label, setLabel] = React.useState<string>(initial?.label ?? '')\n const [touched, setTouched] = React.useState(false)\n const numberRef = React.useRef<HTMLInputElement>(null)\n\n const digits = normalizePostalCode(cep)\n const found = Boolean(looked) && normalizePostalCode(looked!.postalCode) === digits\n\n // O foco cai no número assim que a rua chega. É o único campo que sobrou\n // para digitar, e fazer a pessoa procurá-lo desfaz o que a consulta ganhou.\n React.useEffect(() => {\n if (found) numberRef.current?.focus()\n }, [found])\n\n async function lookUp() {\n if (digits.length !== 8) return\n await resolve(digits, subtotal)\n }\n\n // A prefilled CEP is looked up at once: editing an address or completing the\n // current one must land on the number, not on a «Buscar» button.\n const prefilled = React.useRef(false)\n React.useEffect(() => {\n if (prefilled.current || !initial?.postalCode) return\n prefilled.current = true\n if (!found) void lookUp()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n function submit(event: React.FormEvent) {\n event.preventDefault()\n setTouched(true)\n if (!found || !number.trim()) return\n if (replaces) removeAddress(replaces)\n saveAddress({\n label: label.trim() || null,\n postalCode: looked!.postalCode,\n street: looked!.street,\n number: number.trim(),\n complement: complement.trim() || null,\n reference: reference.trim() || null,\n district: looked!.district,\n city: looked!.city,\n state: looked!.state,\n })\n onDone()\n }\n\n const numberMissing = touched && !number.trim()\n\n return (\n <form onSubmit={submit} className=\"min-h-0 flex-1 overflow-y-auto p-4\">\n <label htmlFor=\"address-cep\" className=\"text-sm font-medium\">\n CEP\n </label>\n <div className=\"mt-1 flex gap-2\">\n <input\n id=\"address-cep\"\n data-testid={TID.addressCep}\n value={cep}\n onChange={(e) => setCep(formatPostalCode(e.target.value))}\n onBlur={() => void lookUp()}\n // inputMode numérico: um teclado alfabético para oito dígitos é o\n // erro de formulário mobile mais fácil de cometer e de corrigir.\n inputMode=\"numeric\"\n autoComplete=\"postal-code\"\n placeholder=\"00000-000\"\n className=\"h-12 flex-1 rounded-lg border border-border bg-transparent px-3 text-base\"\n />\n <button\n type=\"button\"\n onClick={() => void lookUp()}\n disabled={digits.length !== 8 || status === 'loading'}\n className=\"h-12 rounded-lg bg-primary px-4 text-sm font-semibold text-primary-foreground disabled:opacity-40\"\n >\n {status === 'loading' ? 'Buscando…' : 'Buscar'}\n </button>\n </div>\n {storeError && <p className=\"mt-2 text-sm text-destructive\">{storeError}</p>}\n {/* A recusa da loja (0048) aparece aqui e não só no checkout: descobrir\n que não entregam no seu CEP depois de montar o carrinho é a pior hora\n possível para descobrir. */}\n {refusedZone && (\n <p className=\"mt-2 text-sm text-destructive\">\n Ainda não entregamos nessa região ({refusedZone}).\n </p>\n )}\n\n {found && (\n <>\n <p className=\"mt-4 rounded-lg bg-muted/40 p-3 text-sm\">\n <span className=\"block font-medium\">{looked!.street}</span>\n <span className=\"block text-muted-foreground\">\n {looked!.district} · {looked!.city} — {looked!.state}\n </span>\n </p>\n\n <div className=\"mt-4 grid grid-cols-2 gap-3\">\n <div>\n <label htmlFor=\"address-number\" className=\"text-sm font-medium\">\n Número\n </label>\n <input\n id=\"address-number\"\n ref={numberRef}\n data-testid={TID.addressNumber}\n value={number}\n onChange={(e) => setNumber(e.target.value)}\n inputMode=\"numeric\"\n autoComplete=\"address-line2\"\n aria-invalid={numberMissing || undefined}\n aria-describedby={numberMissing ? 'address-number-error' : undefined}\n className={`mt-1 h-12 w-full rounded-lg border bg-transparent px-3 text-base ${\n numberMissing ? 'border-destructive' : 'border-border'\n }`}\n />\n {numberMissing && (\n // Junto do campo e não num resumo no topo: o erro é sobre ESTE\n // campo, e a pessoa está olhando para ele.\n <p id=\"address-number-error\" className=\"mt-1 text-xs text-destructive\">\n Informe o número.\n </p>\n )}\n </div>\n <div>\n <label htmlFor=\"address-complement\" className=\"text-sm font-medium\">\n Complemento\n </label>\n <input\n id=\"address-complement\"\n data-testid={TID.addressComplement}\n value={complement}\n onChange={(e) => setComplement(e.target.value)}\n placeholder=\"Apto, bloco…\"\n className=\"mt-1 h-12 w-full rounded-lg border border-border bg-transparent px-3 text-base\"\n />\n </div>\n </div>\n\n <div className=\"mt-4\">\n <label htmlFor=\"address-reference\" className=\"text-sm font-medium\">\n Ponto de referência\n </label>\n <input\n id=\"address-reference\"\n data-testid={TID.addressReference}\n value={reference}\n onChange={(e) => setReference(e.target.value)}\n placeholder=\"Portão azul, ao lado da padaria\"\n className=\"mt-1 h-12 w-full rounded-lg border border-border bg-transparent px-3 text-base\"\n />\n </div>\n\n <fieldset className=\"mt-4\">\n <legend className=\"text-sm font-medium\">Salvar como</legend>\n <div className=\"mt-2 flex flex-wrap gap-2\">\n {LABELS.map((name) => (\n <button\n key={name}\n type=\"button\"\n aria-pressed={label === name}\n onClick={() => setLabel(label === name ? '' : name)}\n className={`rounded-full px-4 py-2 text-sm font-medium ${\n label === name\n ? 'bg-foreground text-background'\n : 'border border-border text-muted-foreground'\n }`}\n >\n {name}\n </button>\n ))}\n <input\n value={LABELS.includes(label as (typeof LABELS)[number]) ? '' : label}\n onChange={(e) => setLabel(e.target.value)}\n placeholder=\"Outro\"\n aria-label=\"Outro apelido\"\n className=\"h-10 min-w-24 flex-1 rounded-full border border-border bg-transparent px-4 text-sm\"\n />\n </div>\n </fieldset>\n\n <button\n type=\"submit\"\n data-testid={TID.addressSave}\n className=\"mt-6 h-12 w-full rounded-full bg-primary font-semibold text-primary-foreground\"\n >\n Salvar endereço\n </button>\n </>\n )}\n </form>\n )\n}\n"]}
|