@btst/stack 1.0.1 → 1.1.1

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 (282) hide show
  1. package/README.md +156 -709
  2. package/dist/api/index.cjs +2 -1
  3. package/dist/api/index.d.cts +4 -3
  4. package/dist/api/index.d.mts +4 -3
  5. package/dist/api/index.d.ts +4 -3
  6. package/dist/api/index.mjs +1 -1
  7. package/dist/client/components/compose.cjs +68 -0
  8. package/dist/client/components/compose.mjs +65 -0
  9. package/dist/client/components/error-boundary.cjs +24 -0
  10. package/dist/client/components/error-boundary.mjs +22 -0
  11. package/dist/client/components/index.cjs +10 -0
  12. package/dist/client/components/index.d.cts +52 -0
  13. package/dist/client/components/index.d.mts +52 -0
  14. package/dist/client/components/index.d.ts +52 -0
  15. package/dist/client/components/index.mjs +2 -0
  16. package/dist/client/index.cjs +24 -5
  17. package/dist/client/index.d.cts +125 -8
  18. package/dist/client/index.d.mts +125 -8
  19. package/dist/client/index.d.ts +125 -8
  20. package/dist/client/index.mjs +21 -4
  21. package/dist/client/meta-utils.cjs +162 -0
  22. package/dist/client/meta-utils.mjs +160 -0
  23. package/dist/client/path-utils.cjs +15 -0
  24. package/dist/client/path-utils.mjs +13 -0
  25. package/dist/client/sitemap-utils.cjs +14 -0
  26. package/dist/client/sitemap-utils.mjs +12 -0
  27. package/dist/context/index.cjs +6 -63
  28. package/dist/context/index.d.cts +21 -24
  29. package/dist/context/index.d.mts +21 -24
  30. package/dist/context/index.d.ts +21 -24
  31. package/dist/context/index.mjs +1 -61
  32. package/dist/context/provider.cjs +51 -0
  33. package/dist/context/provider.mjs +46 -0
  34. package/dist/index.cjs +2 -3
  35. package/dist/index.d.cts +3 -2
  36. package/dist/index.d.mts +3 -2
  37. package/dist/index.d.ts +3 -2
  38. package/dist/index.mjs +1 -2
  39. package/dist/plugins/api/index.cjs +13 -0
  40. package/dist/plugins/api/index.d.cts +40 -0
  41. package/dist/plugins/api/index.d.mts +40 -0
  42. package/dist/plugins/api/index.d.ts +40 -0
  43. package/dist/plugins/api/index.mjs +8 -0
  44. package/dist/plugins/blog/api/index.cjs +11 -0
  45. package/dist/plugins/blog/api/index.d.cts +7 -0
  46. package/dist/plugins/blog/api/index.d.mts +7 -0
  47. package/dist/plugins/blog/api/index.d.ts +7 -0
  48. package/dist/plugins/blog/api/index.mjs +2 -0
  49. package/dist/plugins/blog/api/plugin.cjs +569 -0
  50. package/dist/plugins/blog/api/plugin.mjs +565 -0
  51. package/dist/plugins/blog/client/components/forms/image-field.cjs +133 -0
  52. package/dist/plugins/blog/client/components/forms/image-field.mjs +131 -0
  53. package/dist/plugins/blog/client/components/forms/markdown-editor-styles.css +30 -0
  54. package/dist/plugins/blog/client/components/forms/markdown-editor.cjs +106 -0
  55. package/dist/plugins/blog/client/components/forms/markdown-editor.mjs +104 -0
  56. package/dist/plugins/blog/client/components/forms/post-forms.cjs +401 -0
  57. package/dist/plugins/blog/client/components/forms/post-forms.mjs +398 -0
  58. package/dist/plugins/blog/client/components/forms/tags-multiselect.cjs +71 -0
  59. package/dist/plugins/blog/client/components/forms/tags-multiselect.mjs +65 -0
  60. package/dist/plugins/blog/client/components/index.cjs +17 -0
  61. package/dist/plugins/blog/client/components/index.d.cts +22 -0
  62. package/dist/plugins/blog/client/components/index.d.mts +22 -0
  63. package/dist/plugins/blog/client/components/index.d.ts +22 -0
  64. package/dist/plugins/blog/client/components/index.mjs +12 -0
  65. package/dist/plugins/blog/client/components/loading/form-page-skeleton.cjs +62 -0
  66. package/dist/plugins/blog/client/components/loading/form-page-skeleton.mjs +60 -0
  67. package/dist/plugins/blog/client/components/loading/index.cjs +20 -0
  68. package/dist/plugins/blog/client/components/loading/index.mjs +16 -0
  69. package/dist/plugins/blog/client/components/loading/list-page-skeleton.cjs +26 -0
  70. package/dist/plugins/blog/client/components/loading/list-page-skeleton.mjs +24 -0
  71. package/dist/plugins/blog/client/components/loading/page-header-skeleton.cjs +13 -0
  72. package/dist/plugins/blog/client/components/loading/page-header-skeleton.mjs +11 -0
  73. package/dist/plugins/blog/client/components/loading/post-card-skeleton.cjs +22 -0
  74. package/dist/plugins/blog/client/components/loading/post-card-skeleton.mjs +20 -0
  75. package/dist/plugins/blog/client/components/loading/post-page-skeleton.cjs +56 -0
  76. package/dist/plugins/blog/client/components/loading/post-page-skeleton.mjs +54 -0
  77. package/dist/plugins/blog/client/components/pages/404-page.cjs +19 -0
  78. package/dist/plugins/blog/client/components/pages/404-page.mjs +17 -0
  79. package/dist/plugins/blog/client/components/pages/edit-post-page.cjs +41 -0
  80. package/dist/plugins/blog/client/components/pages/edit-post-page.internal.cjs +57 -0
  81. package/dist/plugins/blog/client/components/pages/edit-post-page.internal.mjs +55 -0
  82. package/dist/plugins/blog/client/components/pages/edit-post-page.mjs +39 -0
  83. package/dist/plugins/blog/client/components/pages/home-page.cjs +41 -0
  84. package/dist/plugins/blog/client/components/pages/home-page.internal.cjs +61 -0
  85. package/dist/plugins/blog/client/components/pages/home-page.internal.mjs +59 -0
  86. package/dist/plugins/blog/client/components/pages/home-page.mjs +39 -0
  87. package/dist/plugins/blog/client/components/pages/new-post-page.cjs +37 -0
  88. package/dist/plugins/blog/client/components/pages/new-post-page.internal.cjs +53 -0
  89. package/dist/plugins/blog/client/components/pages/new-post-page.internal.mjs +51 -0
  90. package/dist/plugins/blog/client/components/pages/new-post-page.mjs +35 -0
  91. package/dist/plugins/blog/client/components/pages/post-page.cjs +39 -0
  92. package/dist/plugins/blog/client/components/pages/post-page.internal.cjs +101 -0
  93. package/dist/plugins/blog/client/components/pages/post-page.internal.mjs +99 -0
  94. package/dist/plugins/blog/client/components/pages/post-page.mjs +37 -0
  95. package/dist/plugins/blog/client/components/pages/tag-page.cjs +39 -0
  96. package/dist/plugins/blog/client/components/pages/tag-page.internal.cjs +61 -0
  97. package/dist/plugins/blog/client/components/pages/tag-page.internal.mjs +59 -0
  98. package/dist/plugins/blog/client/components/pages/tag-page.mjs +37 -0
  99. package/dist/plugins/blog/client/components/shared/better-blog-attribution.cjs +24 -0
  100. package/dist/plugins/blog/client/components/shared/better-blog-attribution.mjs +22 -0
  101. package/dist/plugins/blog/client/components/shared/default-error.cjs +18 -0
  102. package/dist/plugins/blog/client/components/shared/default-error.mjs +16 -0
  103. package/dist/plugins/blog/client/components/shared/defaults.cjs +13 -0
  104. package/dist/plugins/blog/client/components/shared/defaults.mjs +10 -0
  105. package/dist/plugins/blog/client/components/shared/empty-list.cjs +21 -0
  106. package/dist/plugins/blog/client/components/shared/empty-list.mjs +19 -0
  107. package/dist/plugins/blog/client/components/shared/error-placeholder.cjs +24 -0
  108. package/dist/plugins/blog/client/components/shared/error-placeholder.mjs +22 -0
  109. package/dist/plugins/blog/client/components/shared/highlight-text.cjs +53 -0
  110. package/dist/plugins/blog/client/components/shared/highlight-text.mjs +51 -0
  111. package/dist/plugins/blog/client/components/shared/markdown-content-styles.css +328 -0
  112. package/dist/plugins/blog/client/components/shared/markdown-content.cjs +324 -0
  113. package/dist/plugins/blog/client/components/shared/markdown-content.mjs +315 -0
  114. package/dist/plugins/blog/client/components/shared/on-this-page.cjs +161 -0
  115. package/dist/plugins/blog/client/components/shared/on-this-page.mjs +158 -0
  116. package/dist/plugins/blog/client/components/shared/page-header.cjs +40 -0
  117. package/dist/plugins/blog/client/components/shared/page-header.mjs +38 -0
  118. package/dist/plugins/blog/client/components/shared/page-layout.cjs +24 -0
  119. package/dist/plugins/blog/client/components/shared/page-layout.mjs +22 -0
  120. package/dist/plugins/blog/client/components/shared/page-wrapper.cjs +23 -0
  121. package/dist/plugins/blog/client/components/shared/page-wrapper.mjs +21 -0
  122. package/dist/plugins/blog/client/components/shared/post-card.cjs +279 -0
  123. package/dist/plugins/blog/client/components/shared/post-card.mjs +277 -0
  124. package/dist/plugins/blog/client/components/shared/post-navigation.cjs +74 -0
  125. package/dist/plugins/blog/client/components/shared/post-navigation.mjs +72 -0
  126. package/dist/plugins/blog/client/components/shared/posts-list.cjs +48 -0
  127. package/dist/plugins/blog/client/components/shared/posts-list.mjs +46 -0
  128. package/dist/plugins/blog/client/components/shared/recent-posts-carousel.cjs +59 -0
  129. package/dist/plugins/blog/client/components/shared/recent-posts-carousel.mjs +57 -0
  130. package/dist/plugins/blog/client/components/shared/search-input.cjs +136 -0
  131. package/dist/plugins/blog/client/components/shared/search-input.mjs +117 -0
  132. package/dist/plugins/blog/client/components/shared/search-modal.cjs +135 -0
  133. package/dist/plugins/blog/client/components/shared/search-modal.mjs +116 -0
  134. package/dist/plugins/blog/client/components/shared/tags-list.cjs +22 -0
  135. package/dist/plugins/blog/client/components/shared/tags-list.mjs +20 -0
  136. package/dist/plugins/blog/client/components/shared/use-route-lifecycle.cjs +50 -0
  137. package/dist/plugins/blog/client/components/shared/use-route-lifecycle.mjs +48 -0
  138. package/dist/plugins/blog/client/hooks/blog-hooks.cjs +380 -0
  139. package/dist/plugins/blog/client/hooks/blog-hooks.mjs +368 -0
  140. package/dist/plugins/blog/client/hooks/index.cjs +17 -0
  141. package/dist/plugins/blog/client/hooks/index.d.cts +150 -0
  142. package/dist/plugins/blog/client/hooks/index.d.mts +150 -0
  143. package/dist/plugins/blog/client/hooks/index.d.ts +150 -0
  144. package/dist/plugins/blog/client/hooks/index.mjs +1 -0
  145. package/dist/plugins/blog/client/hooks/use-debounce.cjs +16 -0
  146. package/dist/plugins/blog/client/hooks/use-debounce.mjs +14 -0
  147. package/dist/plugins/blog/client/index.cjs +7 -0
  148. package/dist/plugins/blog/client/index.d.cts +414 -0
  149. package/dist/plugins/blog/client/index.d.mts +414 -0
  150. package/dist/plugins/blog/client/index.d.ts +414 -0
  151. package/dist/plugins/blog/client/index.mjs +1 -0
  152. package/dist/plugins/blog/client/localization/blog-card.cjs +7 -0
  153. package/dist/plugins/blog/client/localization/blog-card.mjs +5 -0
  154. package/dist/plugins/blog/client/localization/blog-common.cjs +10 -0
  155. package/dist/plugins/blog/client/localization/blog-common.mjs +8 -0
  156. package/dist/plugins/blog/client/localization/blog-forms.cjs +40 -0
  157. package/dist/plugins/blog/client/localization/blog-forms.mjs +38 -0
  158. package/dist/plugins/blog/client/localization/blog-list.cjs +18 -0
  159. package/dist/plugins/blog/client/localization/blog-list.mjs +16 -0
  160. package/dist/plugins/blog/client/localization/blog-post.cjs +13 -0
  161. package/dist/plugins/blog/client/localization/blog-post.mjs +11 -0
  162. package/dist/plugins/blog/client/localization/index.cjs +17 -0
  163. package/dist/plugins/blog/client/localization/index.mjs +15 -0
  164. package/dist/plugins/blog/client/plugin.cjs +462 -0
  165. package/dist/plugins/blog/client/plugin.mjs +460 -0
  166. package/dist/plugins/blog/client.css +3 -0
  167. package/dist/plugins/blog/db.cjs +90 -0
  168. package/dist/plugins/blog/db.mjs +88 -0
  169. package/dist/plugins/blog/query-keys.cjs +181 -0
  170. package/dist/plugins/blog/query-keys.d.cts +530 -0
  171. package/dist/plugins/blog/query-keys.d.mts +530 -0
  172. package/dist/plugins/blog/query-keys.d.ts +530 -0
  173. package/dist/plugins/blog/query-keys.mjs +179 -0
  174. package/dist/plugins/blog/schemas.cjs +39 -0
  175. package/dist/plugins/blog/schemas.mjs +35 -0
  176. package/dist/plugins/blog/style.css +22 -0
  177. package/dist/plugins/blog/utils.cjs +97 -0
  178. package/dist/plugins/blog/utils.mjs +87 -0
  179. package/dist/plugins/client/index.cjs +15 -0
  180. package/dist/plugins/client/index.d.cts +57 -0
  181. package/dist/plugins/client/index.d.mts +57 -0
  182. package/dist/plugins/client/index.d.ts +57 -0
  183. package/dist/plugins/client/index.mjs +9 -0
  184. package/dist/{shared/stack.3OUyGp_E.mjs → plugins/utils.mjs} +1 -1
  185. package/dist/shared/{stack.DORw_1ps.d.cts → stack.ByOugz9d.d.cts} +17 -1
  186. package/dist/shared/{stack.DORw_1ps.d.mts → stack.ByOugz9d.d.mts} +17 -1
  187. package/dist/shared/{stack.DORw_1ps.d.ts → stack.ByOugz9d.d.ts} +17 -1
  188. package/dist/shared/stack.CoPoHVfV.d.cts +76 -0
  189. package/dist/shared/stack.CoPoHVfV.d.mts +76 -0
  190. package/dist/shared/stack.CoPoHVfV.d.ts +76 -0
  191. package/package.json +102 -14
  192. package/src/__tests__/plugins.test.tsx +539 -0
  193. package/src/__tests__/sitemap.test.ts +60 -0
  194. package/src/api/index.ts +75 -0
  195. package/src/client/components/compose.tsx +116 -0
  196. package/src/client/components/error-boundary.tsx +30 -0
  197. package/src/client/components/index.tsx +2 -0
  198. package/src/client/index.ts +109 -0
  199. package/src/client/meta-utils.ts +228 -0
  200. package/src/client/path-utils.ts +38 -0
  201. package/src/client/sitemap-utils.ts +46 -0
  202. package/src/context/index.ts +1 -0
  203. package/src/context/provider.tsx +157 -0
  204. package/src/index.ts +1 -0
  205. package/src/plugins/api/index.ts +50 -0
  206. package/src/plugins/blog/api/index.ts +2 -0
  207. package/src/plugins/blog/api/plugin.ts +759 -0
  208. package/src/plugins/blog/client/components/forms/image-field.tsx +165 -0
  209. package/src/plugins/blog/client/components/forms/markdown-editor-styles.css +30 -0
  210. package/src/plugins/blog/client/components/forms/markdown-editor.tsx +136 -0
  211. package/src/plugins/blog/client/components/forms/post-forms.tsx +531 -0
  212. package/src/plugins/blog/client/components/forms/tags-multiselect.tsx +79 -0
  213. package/src/plugins/blog/client/components/index.tsx +11 -0
  214. package/src/plugins/blog/client/components/loading/form-page-skeleton.tsx +75 -0
  215. package/src/plugins/blog/client/components/loading/index.tsx +27 -0
  216. package/src/plugins/blog/client/components/loading/list-page-skeleton.tsx +38 -0
  217. package/src/plugins/blog/client/components/loading/page-header-skeleton.tsx +10 -0
  218. package/src/plugins/blog/client/components/loading/post-card-skeleton.tsx +30 -0
  219. package/src/plugins/blog/client/components/loading/post-page-skeleton.tsx +75 -0
  220. package/src/plugins/blog/client/components/pages/404-page.tsx +23 -0
  221. package/src/plugins/blog/client/components/pages/edit-post-page.internal.tsx +60 -0
  222. package/src/plugins/blog/client/components/pages/edit-post-page.tsx +40 -0
  223. package/src/plugins/blog/client/components/pages/home-page.internal.tsx +71 -0
  224. package/src/plugins/blog/client/components/pages/home-page.tsx +42 -0
  225. package/src/plugins/blog/client/components/pages/new-post-page.internal.tsx +59 -0
  226. package/src/plugins/blog/client/components/pages/new-post-page.tsx +36 -0
  227. package/src/plugins/blog/client/components/pages/post-page.internal.tsx +142 -0
  228. package/src/plugins/blog/client/components/pages/post-page.tsx +38 -0
  229. package/src/plugins/blog/client/components/pages/tag-page.internal.tsx +74 -0
  230. package/src/plugins/blog/client/components/pages/tag-page.tsx +38 -0
  231. package/src/plugins/blog/client/components/shared/better-blog-attribution.tsx +19 -0
  232. package/src/plugins/blog/client/components/shared/default-error.tsx +20 -0
  233. package/src/plugins/blog/client/components/shared/defaults.tsx +9 -0
  234. package/src/plugins/blog/client/components/shared/empty-list.tsx +25 -0
  235. package/src/plugins/blog/client/components/shared/error-placeholder.tsx +20 -0
  236. package/src/plugins/blog/client/components/shared/highlight-text.tsx +80 -0
  237. package/src/plugins/blog/client/components/shared/markdown-content-styles.css +328 -0
  238. package/src/plugins/blog/client/components/shared/markdown-content.tsx +448 -0
  239. package/src/plugins/blog/client/components/shared/on-this-page.tsx +234 -0
  240. package/src/plugins/blog/client/components/shared/page-header.tsx +35 -0
  241. package/src/plugins/blog/client/components/shared/page-layout.tsx +23 -0
  242. package/src/plugins/blog/client/components/shared/page-wrapper.tsx +32 -0
  243. package/src/plugins/blog/client/components/shared/post-card.tsx +308 -0
  244. package/src/plugins/blog/client/components/shared/post-navigation.tsx +98 -0
  245. package/src/plugins/blog/client/components/shared/posts-list.tsx +67 -0
  246. package/src/plugins/blog/client/components/shared/recent-posts-carousel.tsx +79 -0
  247. package/src/plugins/blog/client/components/shared/search-input.tsx +146 -0
  248. package/src/plugins/blog/client/components/shared/search-modal.tsx +162 -0
  249. package/src/plugins/blog/client/components/shared/tags-list.tsx +34 -0
  250. package/src/plugins/blog/client/components/shared/use-route-lifecycle.tsx +68 -0
  251. package/src/plugins/blog/client/hooks/blog-hooks.tsx +623 -0
  252. package/src/plugins/blog/client/hooks/index.tsx +1 -0
  253. package/src/plugins/blog/client/hooks/use-debounce.ts +43 -0
  254. package/src/plugins/blog/client/index.ts +9 -0
  255. package/src/plugins/blog/client/localization/blog-card.ts +3 -0
  256. package/src/plugins/blog/client/localization/blog-common.ts +7 -0
  257. package/src/plugins/blog/client/localization/blog-forms.ts +45 -0
  258. package/src/plugins/blog/client/localization/blog-list.ts +14 -0
  259. package/src/plugins/blog/client/localization/blog-post.ts +9 -0
  260. package/src/plugins/blog/client/localization/index.ts +15 -0
  261. package/src/plugins/blog/client/overrides.ts +123 -0
  262. package/src/plugins/blog/client/plugin.tsx +672 -0
  263. package/src/plugins/blog/client.css +3 -0
  264. package/src/plugins/blog/db.ts +90 -0
  265. package/src/plugins/blog/query-keys.ts +267 -0
  266. package/src/plugins/blog/schemas.ts +39 -0
  267. package/src/plugins/blog/style.css +22 -0
  268. package/src/plugins/blog/types.ts +37 -0
  269. package/src/plugins/blog/utils.ts +144 -0
  270. package/src/plugins/client/index.ts +53 -0
  271. package/src/plugins/index.ts +0 -0
  272. package/src/plugins/utils.ts +35 -0
  273. package/src/types.ts +209 -0
  274. package/dist/plugins/index.cjs +0 -15
  275. package/dist/plugins/index.d.cts +0 -64
  276. package/dist/plugins/index.d.mts +0 -64
  277. package/dist/plugins/index.d.ts +0 -64
  278. package/dist/plugins/index.mjs +0 -11
  279. package/dist/shared/stack.DrUAVfIH.d.cts +0 -17
  280. package/dist/shared/stack.DrUAVfIH.d.mts +0 -17
  281. package/dist/shared/stack.DrUAVfIH.d.ts +0 -17
  282. /package/dist/{shared/stack.CktCg4PJ.cjs → plugins/utils.cjs} +0 -0
@@ -0,0 +1,401 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ const jsxRuntime = require('react/jsx-runtime');
5
+ const schemas = require('../../../schemas.cjs');
6
+ const button = require('@workspace/ui/components/button');
7
+ const form = require('@workspace/ui/components/form');
8
+ const input = require('@workspace/ui/components/input');
9
+ const _switch = require('@workspace/ui/components/switch');
10
+ const textarea = require('@workspace/ui/components/textarea');
11
+ const blogHooks = require('../../hooks/blog-hooks.cjs');
12
+ const utils = require('../../../utils.cjs');
13
+ const zod = require('@hookform/resolvers/zod');
14
+ const lucideReact = require('lucide-react');
15
+ const React = require('react');
16
+ const reactHookForm = require('react-hook-form');
17
+ const sonner = require('sonner');
18
+ const imageField = require('./image-field.cjs');
19
+ const index = require('../../localization/index.cjs');
20
+ const context = require('@btst/stack/context');
21
+ const emptyList = require('../shared/empty-list.cjs');
22
+ const tagsMultiselect = require('./tags-multiselect.cjs');
23
+
24
+ const MarkdownEditor = React.lazy(
25
+ () => import('./markdown-editor.cjs').then((module) => ({
26
+ default: module.MarkdownEditor
27
+ }))
28
+ );
29
+ function PostFormBody({
30
+ form: form$1,
31
+ onSubmit,
32
+ submitLabel,
33
+ onCancel,
34
+ disabled,
35
+ errorMessage,
36
+ setFeaturedImageUploading,
37
+ initialSlugTouched = false
38
+ }) {
39
+ const { localization } = context.usePluginOverrides("blog", {
40
+ localization: index.BLOG_LOCALIZATION
41
+ });
42
+ const [slugTouched, setSlugTouched] = React.useState(initialSlugTouched);
43
+ const nameTitle = "title";
44
+ const nameSlug = "slug";
45
+ const nameExcerpt = "excerpt";
46
+ const nameImage = "image";
47
+ const nameTags = "tags";
48
+ const nameContent = "content";
49
+ const namePublished = "published";
50
+ return /* @__PURE__ */ jsxRuntime.jsx(form.Form, { ...form$1, children: /* @__PURE__ */ jsxRuntime.jsxs("form", { className: "w-full space-y-4", onSubmit: form$1.handleSubmit(onSubmit), children: [
51
+ errorMessage && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rounded-md border border-red-200 bg-red-50 p-3 text-red-600 text-sm", children: errorMessage }),
52
+ /* @__PURE__ */ jsxRuntime.jsx(
53
+ form.FormField,
54
+ {
55
+ control: form$1.control,
56
+ name: nameTitle,
57
+ render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsxs(form.FormItem, { children: [
58
+ /* @__PURE__ */ jsxRuntime.jsxs(form.FormLabel, { children: [
59
+ localization.BLOG_FORMS_TITLE_LABEL,
60
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-destructive", children: localization.BLOG_FORMS_REQUIRED_ASTERISK })
61
+ ] }),
62
+ /* @__PURE__ */ jsxRuntime.jsx(form.FormControl, { children: /* @__PURE__ */ jsxRuntime.jsx(
63
+ input.Input,
64
+ {
65
+ placeholder: localization.BLOG_FORMS_TITLE_PLACEHOLDER,
66
+ ...field,
67
+ value: String(field.value ?? ""),
68
+ onChange: (e) => {
69
+ const newTitle = e.target.value;
70
+ field.onChange(e);
71
+ if (!slugTouched) {
72
+ form$1.setValue(nameSlug, utils.slugify(newTitle));
73
+ }
74
+ }
75
+ }
76
+ ) }),
77
+ /* @__PURE__ */ jsxRuntime.jsx(form.FormMessage, {})
78
+ ] })
79
+ }
80
+ ),
81
+ /* @__PURE__ */ jsxRuntime.jsx(
82
+ form.FormField,
83
+ {
84
+ control: form$1.control,
85
+ name: nameSlug,
86
+ render: ({ field }) => {
87
+ const currentTitle = form$1.getValues(nameTitle);
88
+ const autoGeneratedSlug = utils.slugify(String(currentTitle ?? ""));
89
+ const currentSlug = String(field.value ?? "");
90
+ return /* @__PURE__ */ jsxRuntime.jsxs(form.FormItem, { children: [
91
+ /* @__PURE__ */ jsxRuntime.jsx(form.FormLabel, { children: localization.BLOG_FORMS_SLUG_LABEL }),
92
+ /* @__PURE__ */ jsxRuntime.jsx(form.FormControl, { children: /* @__PURE__ */ jsxRuntime.jsx(
93
+ input.Input,
94
+ {
95
+ placeholder: localization.BLOG_FORMS_SLUG_PLACEHOLDER,
96
+ ...field,
97
+ value: currentSlug,
98
+ onChange: (e) => {
99
+ const newSlug = e.target.value;
100
+ field.onChange(e);
101
+ if (newSlug !== autoGeneratedSlug) {
102
+ setSlugTouched(true);
103
+ }
104
+ }
105
+ }
106
+ ) }),
107
+ /* @__PURE__ */ jsxRuntime.jsx(form.FormMessage, {})
108
+ ] });
109
+ }
110
+ }
111
+ ),
112
+ /* @__PURE__ */ jsxRuntime.jsx(
113
+ form.FormField,
114
+ {
115
+ control: form$1.control,
116
+ name: nameExcerpt,
117
+ render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsxs(form.FormItem, { className: "flex flex-col", children: [
118
+ /* @__PURE__ */ jsxRuntime.jsxs(form.FormLabel, { children: [
119
+ localization.BLOG_FORMS_EXCERPT_LABEL,
120
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-destructive", children: localization.BLOG_FORMS_REQUIRED_ASTERISK })
121
+ ] }),
122
+ /* @__PURE__ */ jsxRuntime.jsx(form.FormControl, { children: /* @__PURE__ */ jsxRuntime.jsx(
123
+ textarea.Textarea,
124
+ {
125
+ placeholder: localization.BLOG_FORMS_EXCERPT_PLACEHOLDER,
126
+ className: "min-h-20",
127
+ value: String(field.value ?? ""),
128
+ onChange: field.onChange
129
+ }
130
+ ) }),
131
+ /* @__PURE__ */ jsxRuntime.jsx(form.FormDescription, {}),
132
+ /* @__PURE__ */ jsxRuntime.jsx(form.FormMessage, {})
133
+ ] })
134
+ }
135
+ ),
136
+ /* @__PURE__ */ jsxRuntime.jsx(
137
+ form.FormField,
138
+ {
139
+ control: form$1.control,
140
+ name: nameImage,
141
+ render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsx(
142
+ imageField.FeaturedImageField,
143
+ {
144
+ isRequired: false,
145
+ value: String(field.value ?? ""),
146
+ onChange: field.onChange,
147
+ setFeaturedImageUploading
148
+ }
149
+ )
150
+ }
151
+ ),
152
+ /* @__PURE__ */ jsxRuntime.jsx(
153
+ form.FormField,
154
+ {
155
+ control: form$1.control,
156
+ name: nameTags,
157
+ render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsxs(form.FormItem, { className: "flex flex-col", children: [
158
+ /* @__PURE__ */ jsxRuntime.jsx(form.FormLabel, { children: localization.BLOG_FORMS_TAGS_LABEL }),
159
+ /* @__PURE__ */ jsxRuntime.jsx(form.FormControl, { children: /* @__PURE__ */ jsxRuntime.jsx(
160
+ tagsMultiselect.TagsMultiSelect,
161
+ {
162
+ value: Array.isArray(field.value) ? field.value : [],
163
+ onChange: field.onChange,
164
+ placeholder: localization.BLOG_FORMS_TAGS_PLACEHOLDER
165
+ }
166
+ ) }),
167
+ /* @__PURE__ */ jsxRuntime.jsx(form.FormDescription, {}),
168
+ /* @__PURE__ */ jsxRuntime.jsx(form.FormMessage, {})
169
+ ] })
170
+ }
171
+ ),
172
+ /* @__PURE__ */ jsxRuntime.jsx(
173
+ form.FormField,
174
+ {
175
+ control: form$1.control,
176
+ name: nameContent,
177
+ render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsxs(form.FormItem, { className: "flex flex-col", children: [
178
+ /* @__PURE__ */ jsxRuntime.jsxs(form.FormLabel, { children: [
179
+ localization.BLOG_FORMS_CONTENT_LABEL,
180
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-destructive", children: localization.BLOG_FORMS_REQUIRED_ASTERISK })
181
+ ] }),
182
+ /* @__PURE__ */ jsxRuntime.jsx(form.FormControl, { children: /* @__PURE__ */ jsxRuntime.jsx(
183
+ React.Suspense,
184
+ {
185
+ fallback: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-h-80 max-w-full border-input rounded-md border shadow-xs flex items-center justify-center bg-muted/50", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "h-6 w-6 animate-spin text-muted-foreground" }) }),
186
+ children: /* @__PURE__ */ jsxRuntime.jsx(
187
+ MarkdownEditor,
188
+ {
189
+ className: "min-h-80 max-w-full border-input rounded-md border shadow-xs",
190
+ value: typeof field.value === "string" ? field.value : "",
191
+ onChange: (content) => {
192
+ field.onChange(content);
193
+ }
194
+ }
195
+ )
196
+ }
197
+ ) }),
198
+ /* @__PURE__ */ jsxRuntime.jsx(form.FormDescription, {}),
199
+ /* @__PURE__ */ jsxRuntime.jsx(form.FormMessage, {})
200
+ ] })
201
+ }
202
+ ),
203
+ /* @__PURE__ */ jsxRuntime.jsx(
204
+ form.FormField,
205
+ {
206
+ control: form$1.control,
207
+ name: namePublished,
208
+ render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsxs(form.FormItem, { className: "flex flex-row items-center justify-between rounded-lg border p-3 shadow-sm", children: [
209
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-0.5", children: [
210
+ /* @__PURE__ */ jsxRuntime.jsx(form.FormLabel, { children: localization.BLOG_FORMS_PUBLISHED_LABEL }),
211
+ /* @__PURE__ */ jsxRuntime.jsx(form.FormDescription, { children: localization.BLOG_FORMS_PUBLISHED_DESCRIPTION })
212
+ ] }),
213
+ /* @__PURE__ */ jsxRuntime.jsx(form.FormControl, { children: /* @__PURE__ */ jsxRuntime.jsx(
214
+ _switch.Switch,
215
+ {
216
+ checked: !!field.value,
217
+ onCheckedChange: field.onChange
218
+ }
219
+ ) })
220
+ ] })
221
+ }
222
+ ),
223
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex gap-2 pt-4", children: [
224
+ /* @__PURE__ */ jsxRuntime.jsx(button.Button, { type: "submit", disabled, children: submitLabel }),
225
+ /* @__PURE__ */ jsxRuntime.jsx(
226
+ button.Button,
227
+ {
228
+ variant: "outline",
229
+ onClick: onCancel,
230
+ disabled,
231
+ type: "button",
232
+ children: localization.BLOG_FORMS_CANCEL_BUTTON
233
+ }
234
+ )
235
+ ] })
236
+ ] }) });
237
+ }
238
+ const CustomPostCreateSchema = schemas.createPostSchema.omit({
239
+ createdAt: true,
240
+ updatedAt: true,
241
+ publishedAt: true
242
+ });
243
+ const CustomPostUpdateSchema = schemas.updatePostSchema.omit({
244
+ id: true,
245
+ createdAt: true,
246
+ updatedAt: true,
247
+ publishedAt: true
248
+ });
249
+ const addPostFormPropsAreEqual = (prevProps, nextProps) => {
250
+ if (prevProps.onClose !== nextProps.onClose) return false;
251
+ if (prevProps.onSuccess !== nextProps.onSuccess) return false;
252
+ return true;
253
+ };
254
+ const AddPostFormComponent = ({ onClose, onSuccess }) => {
255
+ const [featuredImageUploading, setFeaturedImageUploading] = React.useState(false);
256
+ const { localization } = context.usePluginOverrides("blog", {
257
+ localization: index.BLOG_LOCALIZATION
258
+ });
259
+ const schema = CustomPostCreateSchema;
260
+ const {
261
+ mutateAsync: createPost,
262
+ isPending: isCreatingPost,
263
+ error: createPostError
264
+ } = blogHooks.useCreatePost();
265
+ const onSubmit = async (data) => {
266
+ const slug = data.slug || utils.slugify(data.title);
267
+ const createdPost = await createPost({
268
+ title: data.title,
269
+ content: data.content,
270
+ excerpt: data.excerpt ?? "",
271
+ slug,
272
+ published: data.published ?? false,
273
+ publishedAt: data.published ? /* @__PURE__ */ new Date() : void 0,
274
+ image: data.image,
275
+ tags: data.tags || []
276
+ });
277
+ sonner.toast.success(localization.BLOG_FORMS_TOAST_CREATE_SUCCESS);
278
+ onSuccess({ published: createdPost?.published ?? false });
279
+ };
280
+ const form = reactHookForm.useForm({
281
+ resolver: zod.zodResolver(schema),
282
+ defaultValues: {
283
+ title: "",
284
+ content: "",
285
+ excerpt: "",
286
+ slug: void 0,
287
+ published: false,
288
+ image: "",
289
+ tags: []
290
+ }
291
+ });
292
+ return /* @__PURE__ */ jsxRuntime.jsx(
293
+ PostFormBody,
294
+ {
295
+ form,
296
+ onSubmit,
297
+ submitLabel: isCreatingPost ? localization.BLOG_FORMS_SUBMIT_CREATE_PENDING : localization.BLOG_FORMS_SUBMIT_CREATE_IDLE,
298
+ onCancel: onClose,
299
+ disabled: isCreatingPost || featuredImageUploading,
300
+ errorMessage: createPostError?.message,
301
+ setFeaturedImageUploading
302
+ }
303
+ );
304
+ };
305
+ const AddPostForm = React.memo(AddPostFormComponent, addPostFormPropsAreEqual);
306
+ const editPostFormPropsAreEqual = (prevProps, nextProps) => {
307
+ if (prevProps.postSlug !== nextProps.postSlug) return false;
308
+ if (prevProps.onClose !== nextProps.onClose) return false;
309
+ if (prevProps.onSuccess !== nextProps.onSuccess) return false;
310
+ return true;
311
+ };
312
+ const EditPostFormComponent = ({
313
+ postSlug,
314
+ onClose,
315
+ onSuccess
316
+ }) => {
317
+ const [featuredImageUploading, setFeaturedImageUploading] = React.useState(false);
318
+ const { localization } = context.usePluginOverrides("blog", {
319
+ localization: index.BLOG_LOCALIZATION
320
+ });
321
+ const { post } = blogHooks.useSuspensePost(postSlug);
322
+ const initialData = React.useMemo(() => {
323
+ if (!post) return {};
324
+ return {
325
+ title: post.title,
326
+ content: post.content,
327
+ excerpt: post.excerpt,
328
+ slug: post.slug,
329
+ published: post.published,
330
+ image: post.image || "",
331
+ tags: post.tags.map((tag) => ({
332
+ id: tag.id,
333
+ name: tag.name,
334
+ slug: tag.slug
335
+ }))
336
+ };
337
+ }, [post]);
338
+ const schema = CustomPostUpdateSchema;
339
+ const {
340
+ mutateAsync: updatePost,
341
+ isPending: isUpdatingPost,
342
+ error: updatePostError
343
+ } = blogHooks.useUpdatePost();
344
+ const onSubmit = async (data) => {
345
+ const updatedPost = await updatePost({
346
+ id: post.id,
347
+ data: {
348
+ id: post.id,
349
+ title: data.title,
350
+ content: data.content,
351
+ excerpt: data.excerpt ?? "",
352
+ slug: data.slug,
353
+ published: data.published ?? false,
354
+ publishedAt: data.published && !post?.published ? /* @__PURE__ */ new Date() : post?.publishedAt ? new Date(post.publishedAt) : void 0,
355
+ image: data.image,
356
+ tags: data.tags || []
357
+ }
358
+ });
359
+ sonner.toast.success(localization.BLOG_FORMS_TOAST_UPDATE_SUCCESS);
360
+ onSuccess({
361
+ slug: updatedPost?.slug ?? "",
362
+ published: updatedPost?.published ?? false
363
+ });
364
+ };
365
+ const form = reactHookForm.useForm({
366
+ resolver: zod.zodResolver(schema),
367
+ defaultValues: {
368
+ title: "",
369
+ content: "",
370
+ excerpt: "",
371
+ slug: "",
372
+ published: false,
373
+ image: "",
374
+ tags: []
375
+ },
376
+ values: initialData
377
+ });
378
+ if (!post) {
379
+ return /* @__PURE__ */ jsxRuntime.jsx(emptyList.EmptyList, { message: localization.BLOG_PAGE_NOT_FOUND_DESCRIPTION });
380
+ }
381
+ return /* @__PURE__ */ jsxRuntime.jsx(
382
+ PostFormBody,
383
+ {
384
+ form,
385
+ onSubmit,
386
+ submitLabel: isUpdatingPost ? localization.BLOG_FORMS_SUBMIT_UPDATE_PENDING : localization.BLOG_FORMS_SUBMIT_UPDATE_IDLE,
387
+ onCancel: onClose,
388
+ disabled: isUpdatingPost || featuredImageUploading,
389
+ errorMessage: updatePostError?.message,
390
+ setFeaturedImageUploading,
391
+ initialSlugTouched: !!post?.slug
392
+ }
393
+ );
394
+ };
395
+ const EditPostForm = React.memo(
396
+ EditPostFormComponent,
397
+ editPostFormPropsAreEqual
398
+ );
399
+
400
+ exports.AddPostForm = AddPostForm;
401
+ exports.EditPostForm = EditPostForm;