Skip to content

Commit 32c2bc1

Browse files
committed
feeature(blog) merge develop
2 parents 5537e10 + 395db39 commit 32c2bc1

110 files changed

Lines changed: 21150 additions & 5879 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.hintrc

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,13 @@
88
{
99
"aria-valid-attr-value": "off"
1010
}
11-
]
11+
],
12+
"axe/structure": [
13+
"default",
14+
{
15+
"list": "off"
16+
}
17+
],
18+
"no-inline-styles": "off"
1219
}
1320
}

frontend/.env.example

Lines changed: 57 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,77 @@
1+
# --- Core / Environment
2+
APP_ENV=
3+
APP_URL=
4+
NEXT_PUBLIC_SITE_URL=
5+
6+
# --- Database
17
DATABASE_URL=
8+
9+
# --- Auth (app)
210
AUTH_SECRET=
311

4-
CLOUDINARY_CLOUD_NAME=
12+
# --- OAuth: Google
13+
GOOGLE_CLIENT_ID_DEVELOP=
14+
GOOGLE_CLIENT_ID_LOCAL=
15+
GOOGLE_CLIENT_ID_PROD=
16+
GOOGLE_CLIENT_REDIRECT_URI_DEVELOP=
17+
GOOGLE_CLIENT_REDIRECT_URI_LOCAL=
18+
GOOGLE_CLIENT_REDIRECT_URI_PROD=
19+
GOOGLE_CLIENT_SECRET_DEVELOP=
20+
GOOGLE_CLIENT_SECRET_LOCAL=
21+
GOOGLE_CLIENT_SECRET_PROD=
22+
23+
# --- OAuth: GitHub
24+
GITHUB_CLIENT_ID_DEVELOP=
25+
GITHUB_CLIENT_ID_LOCAL=
26+
GITHUB_CLIENT_ID_PROD=
27+
GITHUB_CLIENT_REDIRECT_URI_DEVELOP=
28+
GITHUB_CLIENT_REDIRECT_URI_LOCAL=
29+
GITHUB_CLIENT_REDIRECT_URI_PROD=
30+
GITHUB_CLIENT_SECRET_DEVELOP=
31+
GITHUB_CLIENT_SECRET_LOCAL=
32+
GITHUB_CLIENT_SECRET_PROD=
33+
34+
# --- Cloudinary
535
CLOUDINARY_API_KEY=
636
CLOUDINARY_API_SECRET=
37+
CLOUDINARY_CLOUD_NAME=
738
CLOUDINARY_UPLOAD_FOLDER=
8-
939
CLOUDINARY_URL=
10-
ENABLE_ADMIN_API=
1140

41+
# --- Payments (Stripe)
42+
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=
1243
PAYMENTS_ENABLED=
13-
NEXT_PUBLIC_PAYMENTS_ENABLED=
44+
# Options: test, live (defaults to test in development, live in production)
45+
STRIPE_MODE=
1446
STRIPE_SECRET_KEY=
1547
STRIPE_WEBHOOK_SECRET=
1648

17-
STRIPE_MODE=
18-
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=
49+
# --- Admin / Internal ops
50+
ENABLE_ADMIN_API=
51+
INTERNAL_JANITOR_MIN_INTERVAL_SECONDS=
52+
INTERNAL_JANITOR_SECRET=
53+
JANITOR_URL=
1954

20-
NEXT_PUBLIC_SITE_URL=
21-
NEXT_PUBLIC_SITE_URL=
55+
# --- Quiz
56+
QUIZ_ENCRYPTION_KEY=
2257

58+
# --- Telegram
2359
TELEGRAM_BOT_TOKEN=
2460
TELEGRAM_CHAT_ID=
2561

26-
GOOGLE_CLIENT_ID=
27-
GOOGLE_CLIENT_SECRET=
28-
GOOGLE_CLIENT_REDIRECT_URI_LOCAL=
29-
GOOGLE_CLIENT_REDIRECT_URI_DEVELOP=
30-
GOOGLE_CLIENT_REDIRECT_URI_PROD=
62+
# --- Email (Gmail SMTP)
63+
EMAIL_FROM=
64+
GMAIL_APP_PASSWORD=
65+
GMAIL_USER=
3166

32-
GITHUB_CLIENT_ID_DEVELOP=
33-
GITHUB_CLIENT_SECRET_DEVELOP=
34-
GITHUB_CLIENT_REDIRECT_URI_DEVELOP=
67+
# --- Security
68+
CSRF_SECRET=
3569

36-
APP_ENV=
70+
CHECKOUT_RATE_LIMIT_MAX=10
71+
CHECKOUT_RATE_LIMIT_WINDOW_SECONDS=300
3772

38-
INTERNAL_JANITOR_SECRET=
39-
INTERNAL_JANITOR_MIN_INTERVAL_SECONDS=60
40-
JANITOR_URL=
73+
STRIPE_WEBHOOK_INVALID_SIG_RL_MAX=30
74+
STRIPE_WEBHOOK_INVALID_SIG_RL_WINDOW_SECONDS=60
75+
76+
# emergency switch
77+
RATE_LIMIT_DISABLED=0

frontend/app/[locale]/layout.tsx

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,15 @@ export default async function LocaleLayout({
4343
);
4444

4545
const userExists = Boolean(user);
46-
const showAdminNavLink = process.env.NEXT_PUBLIC_ENABLE_ADMIN === 'true';
46+
const enableAdmin =
47+
(
48+
process.env.ENABLE_ADMIN_API ??
49+
process.env.NEXT_PUBLIC_ENABLE_ADMIN ??
50+
''
51+
).toLowerCase() === 'true';
52+
53+
const isAdmin = user?.role === 'admin';
54+
const showAdminNavLink = Boolean(user) && isAdmin && enableAdmin;
4755

4856
return (
4957
<NextIntlClientProvider messages={messages}>
@@ -58,7 +66,13 @@ export default async function LocaleLayout({
5866
showAdminLink={showAdminNavLink}
5967
blogCategories={blogCategories}
6068
>
61-
<MainSwitcher>{children}</MainSwitcher>
69+
<MainSwitcher
70+
userExists={userExists}
71+
showAdminLink={showAdminNavLink}
72+
blogCategories={blogCategories}
73+
>
74+
{children}
75+
</MainSwitcher>
6276
</AppChrome>
6377

6478
<Footer />

frontend/app/[locale]/shop/admin/orders/[id]/RefundButton.tsx

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
'use client';
22

33
import { useRouter } from 'next/navigation';
4-
import { useState, useTransition } from 'react';
4+
import { useId, useState, useTransition } from 'react';
55

66
type Props = {
77
orderId: string;
@@ -12,6 +12,7 @@ export function RefundButton({ orderId, disabled }: Props) {
1212
const router = useRouter();
1313
const [isPending, startTransition] = useTransition();
1414
const [error, setError] = useState<string | null>(null);
15+
const errorId = useId();
1516

1617
async function onRefund() {
1718
setError(null);
@@ -47,12 +48,16 @@ export function RefundButton({ orderId, disabled }: Props) {
4748
});
4849
}
4950

51+
const isDisabled = disabled || isPending;
52+
5053
return (
5154
<div className="flex items-center gap-2">
5255
<button
5356
type="button"
5457
onClick={onRefund}
55-
disabled={disabled || isPending}
58+
disabled={isDisabled}
59+
aria-busy={isPending}
60+
aria-describedby={error ? errorId : undefined}
5661
className="rounded-md border border-border px-3 py-1.5 text-sm font-medium text-foreground transition-colors hover:bg-secondary disabled:cursor-not-allowed disabled:opacity-50"
5762
title={
5863
disabled
@@ -63,7 +68,11 @@ export function RefundButton({ orderId, disabled }: Props) {
6368
{isPending ? 'Refunding…' : 'Refund'}
6469
</button>
6570

66-
{error ? <span className="text-xs text-destructive">{error}</span> : null}
71+
{error ? (
72+
<span id={errorId} role="alert" className="text-xs text-destructive">
73+
{error}
74+
</span>
75+
) : null}
6776
</div>
6877
);
6978
}

0 commit comments

Comments
 (0)