create-nextjs-cms 0.9.30 → 0.9.31

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 (143) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +71 -71
  3. package/dist/helpers/utils.js +16 -16
  4. package/dist/lib/section-creators.js +166 -166
  5. package/package.json +2 -2
  6. package/templates/default/.eslintrc.json +5 -5
  7. package/templates/default/.prettierignore +7 -7
  8. package/templates/default/.prettierrc.json +27 -27
  9. package/templates/default/CHANGELOG.md +140 -140
  10. package/templates/default/_gitignore +57 -57
  11. package/templates/default/app/(auth)/auth/login/LoginPage.tsx +192 -192
  12. package/templates/default/app/(auth)/auth/login/page.tsx +11 -11
  13. package/templates/default/app/(auth)/auth-language-provider.tsx +34 -34
  14. package/templates/default/app/(auth)/layout.tsx +81 -81
  15. package/templates/default/app/(rootLayout)/(plugins)/[...slug]/plugin-server-registry.ts +10 -6
  16. package/templates/default/app/(rootLayout)/admins/page.tsx +10 -10
  17. package/templates/default/app/(rootLayout)/browse/[section]/[page]/page.tsx +22 -22
  18. package/templates/default/app/(rootLayout)/categorized/[section]/page.tsx +15 -15
  19. package/templates/default/app/(rootLayout)/dashboard/page.tsx +70 -70
  20. package/templates/default/app/(rootLayout)/edit/[section]/[itemId]/page.tsx +20 -20
  21. package/templates/default/app/(rootLayout)/layout.tsx +81 -81
  22. package/templates/default/app/(rootLayout)/loading.tsx +10 -10
  23. package/templates/default/app/(rootLayout)/log/page.tsx +7 -7
  24. package/templates/default/app/(rootLayout)/new/[section]/page.tsx +15 -15
  25. package/templates/default/app/(rootLayout)/section/[section]/page.tsx +19 -19
  26. package/templates/default/app/(rootLayout)/settings/page.tsx +13 -13
  27. package/templates/default/app/api/auth/csrf/route.ts +25 -25
  28. package/templates/default/app/api/auth/refresh/route.ts +10 -10
  29. package/templates/default/app/api/auth/route.ts +49 -49
  30. package/templates/default/app/api/auth/session/route.ts +20 -20
  31. package/templates/default/app/api/document/route.ts +165 -165
  32. package/templates/default/app/api/editor/photo/route.ts +49 -49
  33. package/templates/default/app/api/photo/route.ts +27 -27
  34. package/templates/default/app/api/submit/section/item/[slug]/route.ts +95 -95
  35. package/templates/default/app/api/submit/section/item/route.ts +56 -56
  36. package/templates/default/app/api/submit/section/simple/route.ts +86 -86
  37. package/templates/default/app/api/video/route.ts +174 -174
  38. package/templates/default/app/globals.css +236 -236
  39. package/templates/default/cms.config.ts +56 -56
  40. package/templates/default/components/admin/admin-card.tsx +165 -165
  41. package/templates/default/components/admin/admin-edit-page.tsx +124 -124
  42. package/templates/default/components/admin/admin-privilege-card.tsx +184 -184
  43. package/templates/default/components/admin/new-admin-form.tsx +172 -172
  44. package/templates/default/components/container-box.tsx +24 -24
  45. package/templates/default/components/dnd-kit/draggable.tsx +21 -21
  46. package/templates/default/components/dnd-kit/droppable.tsx +20 -20
  47. package/templates/default/components/dnd-kit/sortable-item.tsx +18 -18
  48. package/templates/default/components/feedback/error-component.tsx +16 -16
  49. package/templates/default/components/feedback/info-card.tsx +93 -93
  50. package/templates/default/components/feedback/loading-spinners.tsx +67 -67
  51. package/templates/default/components/feedback/modal.tsx +166 -166
  52. package/templates/default/components/feedback/progress-bar.tsx +48 -48
  53. package/templates/default/components/feedback/tooltip-component.tsx +27 -27
  54. package/templates/default/components/form/form-input-element.tsx +70 -70
  55. package/templates/default/components/form/helpers/_section-hot-reload.js +1 -1
  56. package/templates/default/components/form/helpers/util.ts +17 -17
  57. package/templates/default/components/form/inputs/checkbox-form-input.tsx +46 -46
  58. package/templates/default/components/form/inputs/color-form-input.tsx +44 -44
  59. package/templates/default/components/form/inputs/date-form-input.tsx +93 -93
  60. package/templates/default/components/form/inputs/map-form-input.tsx +141 -141
  61. package/templates/default/components/form/inputs/multiple-select-form-input.tsx +85 -85
  62. package/templates/default/components/form/inputs/number-form-input.tsx +43 -43
  63. package/templates/default/components/form/inputs/password-form-input.tsx +47 -47
  64. package/templates/default/components/form/inputs/photo-form-input.tsx +279 -279
  65. package/templates/default/components/form/inputs/rich-text-form-input.tsx +148 -148
  66. package/templates/default/components/form/inputs/select-form-input.tsx +159 -159
  67. package/templates/default/components/form/inputs/slug-form-input.tsx +131 -131
  68. package/templates/default/components/form/inputs/tags-form-input.tsx +255 -255
  69. package/templates/default/components/form/inputs/text-form-input.tsx +61 -61
  70. package/templates/default/components/form/inputs/textarea-form-input.tsx +61 -61
  71. package/templates/default/components/layout/default-nav-items.tsx +3 -3
  72. package/templates/default/components/layout/layout.tsx +84 -84
  73. package/templates/default/components/layout/navbar.tsx +258 -258
  74. package/templates/default/components/layout/sidebar-dropdown-item.tsx +83 -83
  75. package/templates/default/components/layout/sidebar-item.tsx +24 -24
  76. package/templates/default/components/layout/sidebar.tsx +229 -229
  77. package/templates/default/components/layout/theme-provider.tsx +8 -8
  78. package/templates/default/components/layout/theme-toggle.tsx +39 -39
  79. package/templates/default/components/locale/locale-switcher.tsx +98 -98
  80. package/templates/default/components/media/dropzone.tsx +154 -154
  81. package/templates/default/components/media/protected-document.tsx +44 -44
  82. package/templates/default/components/media/protected-image.tsx +143 -143
  83. package/templates/default/components/media/protected-video.tsx +76 -76
  84. package/templates/default/components/multi-select.tsx +1150 -1150
  85. package/templates/default/components/pages/admins-page.tsx +43 -43
  86. package/templates/default/components/pages/browse-page.tsx +106 -106
  87. package/templates/default/components/pages/categorized-section-page.tsx +31 -31
  88. package/templates/default/components/pages/dashboard-page-alt.tsx +45 -45
  89. package/templates/default/components/pages/item-edit-page.tsx +267 -267
  90. package/templates/default/components/pages/log-page.tsx +107 -107
  91. package/templates/default/components/pages/new-page.tsx +183 -183
  92. package/templates/default/components/pages/section-page.tsx +203 -203
  93. package/templates/default/components/pages/settings-page.tsx +232 -232
  94. package/templates/default/components/pagination/pagination-buttons.tsx +147 -147
  95. package/templates/default/components/pagination/pagination.tsx +36 -36
  96. package/templates/default/components/sections/category-delete-confirm-page.tsx +130 -130
  97. package/templates/default/components/sections/category-section-select-input.tsx +139 -139
  98. package/templates/default/components/sections/conditional-fields.tsx +49 -49
  99. package/templates/default/components/sections/section-icon.tsx +8 -8
  100. package/templates/default/components/sections/section-item-card.tsx +143 -143
  101. package/templates/default/components/sections/section-item-status-badge.tsx +17 -17
  102. package/templates/default/components/sections/select-input-buttons.tsx +125 -125
  103. package/templates/default/components/select-box.tsx +98 -98
  104. package/templates/default/components/ui/accordion.tsx +53 -53
  105. package/templates/default/components/ui/alert-dialog.tsx +113 -113
  106. package/templates/default/components/ui/alert.tsx +47 -47
  107. package/templates/default/components/ui/badge.tsx +38 -38
  108. package/templates/default/components/ui/card.tsx +43 -43
  109. package/templates/default/components/ui/command.tsx +137 -137
  110. package/templates/default/components/ui/custom-alert-dialog.tsx +113 -113
  111. package/templates/default/components/ui/custom-dialog.tsx +123 -123
  112. package/templates/default/components/ui/dialog.tsx +123 -123
  113. package/templates/default/components/ui/direction.tsx +22 -22
  114. package/templates/default/components/ui/dropdown-menu.tsx +182 -182
  115. package/templates/default/components/ui/input-group.tsx +54 -54
  116. package/templates/default/components/ui/input.tsx +22 -22
  117. package/templates/default/components/ui/label.tsx +19 -19
  118. package/templates/default/components/ui/popover.tsx +42 -42
  119. package/templates/default/components/ui/progress.tsx +31 -31
  120. package/templates/default/components/ui/scroll-area.tsx +42 -42
  121. package/templates/default/components/ui/select.tsx +165 -165
  122. package/templates/default/components/ui/separator.tsx +28 -28
  123. package/templates/default/components/ui/sheet.tsx +103 -103
  124. package/templates/default/components/ui/spinner.tsx +16 -16
  125. package/templates/default/components/ui/switch.tsx +29 -29
  126. package/templates/default/components/ui/table.tsx +83 -83
  127. package/templates/default/components/ui/tabs.tsx +55 -55
  128. package/templates/default/components/ui/toast.tsx +113 -113
  129. package/templates/default/components/ui/toaster.tsx +35 -35
  130. package/templates/default/components/ui/tooltip.tsx +30 -30
  131. package/templates/default/components/ui/use-toast.ts +187 -187
  132. package/templates/default/drizzle.config.ts +4 -4
  133. package/templates/default/dynamic-schemas/schema.ts +225 -75
  134. package/templates/default/env/env.ts +46 -46
  135. package/templates/default/envConfig.ts +4 -4
  136. package/templates/default/lib/postinstall.js +14 -14
  137. package/templates/default/lib/utils.ts +6 -6
  138. package/templates/default/next-env.d.ts +6 -6
  139. package/templates/default/next.config.ts +24 -24
  140. package/templates/default/package.json +1 -1
  141. package/templates/default/postcss.config.mjs +6 -6
  142. package/templates/default/proxy.ts +32 -32
  143. package/templates/default/tsconfig.json +48 -48
@@ -1,27 +1,27 @@
1
- import { NextRequest, NextResponse } from 'next/server'
2
- import { getPhoto } from 'nextjs-cms/api/server/actions'
3
-
4
- export async function GET(request: NextRequest) {
5
- const searchParams = request.nextUrl.searchParams
6
-
7
- const name = searchParams.get('name')
8
- const folder = searchParams.get('folder')
9
- const isThumb = searchParams.get('isThumb')
10
-
11
- if (!name || !folder || !isThumb) {
12
- return NextResponse.json(
13
- {
14
- error: 'Invalid request',
15
- },
16
- { status: 400 },
17
- )
18
- }
19
-
20
- const base64String = await getPhoto({
21
- name,
22
- folder,
23
- isThumb: isThumb === 'true',
24
- })
25
-
26
- return NextResponse.json(base64String)
27
- }
1
+ import { NextRequest, NextResponse } from 'next/server'
2
+ import { getPhoto } from 'nextjs-cms/api/server/actions'
3
+
4
+ export async function GET(request: NextRequest) {
5
+ const searchParams = request.nextUrl.searchParams
6
+
7
+ const name = searchParams.get('name')
8
+ const folder = searchParams.get('folder')
9
+ const isThumb = searchParams.get('isThumb')
10
+
11
+ if (!name || !folder || !isThumb) {
12
+ return NextResponse.json(
13
+ {
14
+ error: 'Invalid request',
15
+ },
16
+ { status: 400 },
17
+ )
18
+ }
19
+
20
+ const base64String = await getPhoto({
21
+ name,
22
+ folder,
23
+ isThumb: isThumb === 'true',
24
+ })
25
+
26
+ return NextResponse.json(base64String)
27
+ }
@@ -1,95 +1,95 @@
1
- import { NextRequest, NextResponse } from 'next/server'
2
- import { EditSubmit, LocaleSubmit } from 'nextjs-cms/core/submit'
3
- import auth from 'nextjs-cms/auth'
4
- import { getRequestMetadataFromHeaders } from 'nextjs-cms/logging'
5
- import { getCMSConfig } from 'nextjs-cms/core/config'
6
- import { resolveLocale } from 'nextjs-cms/core/localization'
7
- import getString from 'nextjs-cms/translations'
8
-
9
- export async function PUT(request: NextRequest, { params }: { params: Promise<{ slug: string }> }) {
10
- const session = await auth()
11
- const { slug: itemId } = await params
12
-
13
- if (!session || !session.user) {
14
- return NextResponse.json(
15
- {
16
- error: 'Access token not provided',
17
- },
18
- { status: 401 },
19
- )
20
- }
21
-
22
- if (itemId === null) {
23
- return NextResponse.json(
24
- {
25
- error: 'Item id not provided',
26
- },
27
- { status: 401 },
28
- )
29
- }
30
-
31
- const user = session.user
32
- const formData = await request.formData()
33
- const sectionName = formData.get('sectionName') as string | null
34
- const requestMetadata = getRequestMetadataFromHeaders(request.headers)
35
-
36
- if (!sectionName) {
37
- return NextResponse.json(
38
- {
39
- error: 'Section name not provided',
40
- },
41
- { status: 400 },
42
- )
43
- }
44
-
45
- const localeCode = formData.get('locale')
46
- const localeValue = typeof localeCode === 'string' ? localeCode : undefined
47
- const cmsConfig = await getCMSConfig()
48
- const localeResult = resolveLocale({
49
- localization: cmsConfig.localization,
50
- locale: localeValue,
51
- })
52
- const isLocaleSubmit = localeValue && localeResult.localizationEnabled && localeResult.isDefault === false
53
- const localeForSubmit = localeResult.resolvedLocale?.code
54
-
55
- if (isLocaleSubmit && !localeForSubmit) {
56
- return NextResponse.json(
57
- {
58
- error: getString('invalidLocale', user.language, {
59
- locale: localeValue,
60
- locales: localeResult.availableLocales.map((l) => l.code).join(', '),
61
- }),
62
- },
63
- { status: 400 },
64
- )
65
- }
66
-
67
- const config = {
68
- itemId: itemId as string,
69
- sectionName,
70
- user,
71
- postData: formData,
72
- requestMetadata,
73
- }
74
-
75
- const submit = isLocaleSubmit
76
- ? new LocaleSubmit({ ...config, locale: localeForSubmit as string })
77
- : new EditSubmit(config)
78
-
79
- await submit.initialize()
80
- await submit.submit()
81
- if (submit.error) {
82
- return NextResponse.json(
83
- {
84
- error: submit.errorMessage,
85
- },
86
- { status: 400 },
87
- )
88
- }
89
- return NextResponse.json(
90
- {
91
- message: 'Section item submitted successfully',
92
- },
93
- { status: 200 },
94
- )
95
- }
1
+ import { NextRequest, NextResponse } from 'next/server'
2
+ import { EditSubmit, LocaleSubmit } from 'nextjs-cms/core/submit'
3
+ import auth from 'nextjs-cms/auth'
4
+ import { getRequestMetadataFromHeaders } from 'nextjs-cms/logging'
5
+ import { getCMSConfig } from 'nextjs-cms/core/config'
6
+ import { resolveLocale } from 'nextjs-cms/core/localization'
7
+ import getString from 'nextjs-cms/translations'
8
+
9
+ export async function PUT(request: NextRequest, { params }: { params: Promise<{ slug: string }> }) {
10
+ const session = await auth()
11
+ const { slug: itemId } = await params
12
+
13
+ if (!session || !session.user) {
14
+ return NextResponse.json(
15
+ {
16
+ error: 'Access token not provided',
17
+ },
18
+ { status: 401 },
19
+ )
20
+ }
21
+
22
+ if (itemId === null) {
23
+ return NextResponse.json(
24
+ {
25
+ error: 'Item id not provided',
26
+ },
27
+ { status: 401 },
28
+ )
29
+ }
30
+
31
+ const user = session.user
32
+ const formData = await request.formData()
33
+ const sectionName = formData.get('sectionName') as string | null
34
+ const requestMetadata = getRequestMetadataFromHeaders(request.headers)
35
+
36
+ if (!sectionName) {
37
+ return NextResponse.json(
38
+ {
39
+ error: 'Section name not provided',
40
+ },
41
+ { status: 400 },
42
+ )
43
+ }
44
+
45
+ const localeCode = formData.get('locale')
46
+ const localeValue = typeof localeCode === 'string' ? localeCode : undefined
47
+ const cmsConfig = await getCMSConfig()
48
+ const localeResult = resolveLocale({
49
+ localization: cmsConfig.localization,
50
+ locale: localeValue,
51
+ })
52
+ const isLocaleSubmit = localeValue && localeResult.localizationEnabled && localeResult.isDefault === false
53
+ const localeForSubmit = localeResult.resolvedLocale?.code
54
+
55
+ if (isLocaleSubmit && !localeForSubmit) {
56
+ return NextResponse.json(
57
+ {
58
+ error: getString('invalidLocale', user.language, {
59
+ locale: localeValue,
60
+ locales: localeResult.availableLocales.map((l) => l.code).join(', '),
61
+ }),
62
+ },
63
+ { status: 400 },
64
+ )
65
+ }
66
+
67
+ const config = {
68
+ itemId: itemId as string,
69
+ sectionName,
70
+ user,
71
+ postData: formData,
72
+ requestMetadata,
73
+ }
74
+
75
+ const submit = isLocaleSubmit
76
+ ? new LocaleSubmit({ ...config, locale: localeForSubmit as string })
77
+ : new EditSubmit(config)
78
+
79
+ await submit.initialize()
80
+ await submit.submit()
81
+ if (submit.error) {
82
+ return NextResponse.json(
83
+ {
84
+ error: submit.errorMessage,
85
+ },
86
+ { status: 400 },
87
+ )
88
+ }
89
+ return NextResponse.json(
90
+ {
91
+ message: 'Section item submitted successfully',
92
+ },
93
+ { status: 200 },
94
+ )
95
+ }
@@ -1,56 +1,56 @@
1
- import { NextRequest, NextResponse } from 'next/server'
2
- import { NewSubmit } from 'nextjs-cms/core/submit'
3
- import auth from 'nextjs-cms/auth'
4
- import { getRequestMetadataFromHeaders } from 'nextjs-cms/logging'
5
-
6
- export async function POST(request: NextRequest) {
7
- const session = await auth()
8
-
9
- if (!session || !session.user) {
10
- return NextResponse.json(
11
- {
12
- error: 'Access token not provided',
13
- },
14
- { status: 401 },
15
- )
16
- }
17
-
18
- const user = session.user
19
- const formData = await request.formData()
20
- const sectionName = formData.get('sectionName') as string | null
21
- const requestMetadata = getRequestMetadataFromHeaders(request.headers)
22
-
23
- if (!sectionName) {
24
- return NextResponse.json(
25
- {
26
- error: 'Section name not provided',
27
- },
28
- { status: 400 },
29
- )
30
- }
31
-
32
- const submit = new NewSubmit({
33
- sectionName,
34
- user,
35
- postData: formData,
36
- requestMetadata,
37
- })
38
-
39
- await submit.initialize()
40
- await submit.submit()
41
- if (submit.error) {
42
- return NextResponse.json(
43
- {
44
- error: submit.errorMessage,
45
- },
46
- { status: 400 },
47
- )
48
- }
49
-
50
- return NextResponse.json(
51
- {
52
- message: 'Section item submitted successfully',
53
- },
54
- { status: 200 },
55
- )
56
- }
1
+ import { NextRequest, NextResponse } from 'next/server'
2
+ import { NewSubmit } from 'nextjs-cms/core/submit'
3
+ import auth from 'nextjs-cms/auth'
4
+ import { getRequestMetadataFromHeaders } from 'nextjs-cms/logging'
5
+
6
+ export async function POST(request: NextRequest) {
7
+ const session = await auth()
8
+
9
+ if (!session || !session.user) {
10
+ return NextResponse.json(
11
+ {
12
+ error: 'Access token not provided',
13
+ },
14
+ { status: 401 },
15
+ )
16
+ }
17
+
18
+ const user = session.user
19
+ const formData = await request.formData()
20
+ const sectionName = formData.get('sectionName') as string | null
21
+ const requestMetadata = getRequestMetadataFromHeaders(request.headers)
22
+
23
+ if (!sectionName) {
24
+ return NextResponse.json(
25
+ {
26
+ error: 'Section name not provided',
27
+ },
28
+ { status: 400 },
29
+ )
30
+ }
31
+
32
+ const submit = new NewSubmit({
33
+ sectionName,
34
+ user,
35
+ postData: formData,
36
+ requestMetadata,
37
+ })
38
+
39
+ await submit.initialize()
40
+ await submit.submit()
41
+ if (submit.error) {
42
+ return NextResponse.json(
43
+ {
44
+ error: submit.errorMessage,
45
+ },
46
+ { status: 400 },
47
+ )
48
+ }
49
+
50
+ return NextResponse.json(
51
+ {
52
+ message: 'Section item submitted successfully',
53
+ },
54
+ { status: 200 },
55
+ )
56
+ }
@@ -1,86 +1,86 @@
1
- import { NextRequest, NextResponse } from 'next/server'
2
- import { SimpleSectionSubmit, LocaleSubmit } from 'nextjs-cms/core/submit'
3
- import auth from 'nextjs-cms/auth'
4
- import { getRequestMetadataFromHeaders } from 'nextjs-cms/logging'
5
- import { getCMSConfig } from 'nextjs-cms/core/config'
6
- import { resolveLocale } from 'nextjs-cms/core/localization'
7
- import getString from 'nextjs-cms/translations'
8
-
9
- export async function PUT(request: NextRequest) {
10
- const session = await auth()
11
-
12
- if (!session || !session.user) {
13
- return NextResponse.json(
14
- {
15
- error: 'Access token not provided',
16
- },
17
- { status: 401 },
18
- )
19
- }
20
-
21
- const user = session.user
22
- const formData = await request.formData()
23
- const sectionName = formData.get('sectionName') as string | null
24
- const requestMetadata = getRequestMetadataFromHeaders(request.headers)
25
-
26
- if (!sectionName) {
27
- return NextResponse.json(
28
- {
29
- error: 'Section name not provided',
30
- },
31
- { status: 400 },
32
- )
33
- }
34
-
35
- const localeCode = formData.get('locale')
36
- const localeValue = typeof localeCode === 'string' ? localeCode : undefined
37
- const cmsConfig = await getCMSConfig()
38
- const localeResult = resolveLocale({
39
- localization: cmsConfig.localization,
40
- locale: localeValue,
41
- })
42
- const isLocaleSubmit = localeValue && localeResult.localizationEnabled && localeResult.isDefault === false
43
- const localeForSubmit = localeResult.resolvedLocale?.code
44
-
45
- if (isLocaleSubmit && !localeForSubmit) {
46
- return NextResponse.json(
47
- {
48
- error: getString('invalidLocale', user.language, {
49
- locale: localeValue,
50
- locales: localeResult.availableLocales.map((l) => l.code).join(', '),
51
- }),
52
- },
53
- { status: 400 },
54
- )
55
- }
56
-
57
- const config = {
58
- itemId: '1',
59
- sectionName,
60
- user,
61
- postData: formData,
62
- requestMetadata,
63
- }
64
-
65
- const submit = isLocaleSubmit
66
- ? new LocaleSubmit({ ...config, locale: localeForSubmit as string })
67
- : new SimpleSectionSubmit(config)
68
-
69
- await submit.initialize()
70
- await submit.submit()
71
- if (submit.error) {
72
- return NextResponse.json(
73
- {
74
- error: submit.errorMessage,
75
- },
76
- { status: 400 },
77
- )
78
- }
79
-
80
- return NextResponse.json(
81
- {
82
- message: 'Section item submitted successfully',
83
- },
84
- { status: 200 },
85
- )
86
- }
1
+ import { NextRequest, NextResponse } from 'next/server'
2
+ import { SimpleSectionSubmit, LocaleSubmit } from 'nextjs-cms/core/submit'
3
+ import auth from 'nextjs-cms/auth'
4
+ import { getRequestMetadataFromHeaders } from 'nextjs-cms/logging'
5
+ import { getCMSConfig } from 'nextjs-cms/core/config'
6
+ import { resolveLocale } from 'nextjs-cms/core/localization'
7
+ import getString from 'nextjs-cms/translations'
8
+
9
+ export async function PUT(request: NextRequest) {
10
+ const session = await auth()
11
+
12
+ if (!session || !session.user) {
13
+ return NextResponse.json(
14
+ {
15
+ error: 'Access token not provided',
16
+ },
17
+ { status: 401 },
18
+ )
19
+ }
20
+
21
+ const user = session.user
22
+ const formData = await request.formData()
23
+ const sectionName = formData.get('sectionName') as string | null
24
+ const requestMetadata = getRequestMetadataFromHeaders(request.headers)
25
+
26
+ if (!sectionName) {
27
+ return NextResponse.json(
28
+ {
29
+ error: 'Section name not provided',
30
+ },
31
+ { status: 400 },
32
+ )
33
+ }
34
+
35
+ const localeCode = formData.get('locale')
36
+ const localeValue = typeof localeCode === 'string' ? localeCode : undefined
37
+ const cmsConfig = await getCMSConfig()
38
+ const localeResult = resolveLocale({
39
+ localization: cmsConfig.localization,
40
+ locale: localeValue,
41
+ })
42
+ const isLocaleSubmit = localeValue && localeResult.localizationEnabled && localeResult.isDefault === false
43
+ const localeForSubmit = localeResult.resolvedLocale?.code
44
+
45
+ if (isLocaleSubmit && !localeForSubmit) {
46
+ return NextResponse.json(
47
+ {
48
+ error: getString('invalidLocale', user.language, {
49
+ locale: localeValue,
50
+ locales: localeResult.availableLocales.map((l) => l.code).join(', '),
51
+ }),
52
+ },
53
+ { status: 400 },
54
+ )
55
+ }
56
+
57
+ const config = {
58
+ itemId: '1',
59
+ sectionName,
60
+ user,
61
+ postData: formData,
62
+ requestMetadata,
63
+ }
64
+
65
+ const submit = isLocaleSubmit
66
+ ? new LocaleSubmit({ ...config, locale: localeForSubmit as string })
67
+ : new SimpleSectionSubmit(config)
68
+
69
+ await submit.initialize()
70
+ await submit.submit()
71
+ if (submit.error) {
72
+ return NextResponse.json(
73
+ {
74
+ error: submit.errorMessage,
75
+ },
76
+ { status: 400 },
77
+ )
78
+ }
79
+
80
+ return NextResponse.json(
81
+ {
82
+ message: 'Section item submitted successfully',
83
+ },
84
+ { status: 200 },
85
+ )
86
+ }