@carlonicora/nextjs-jsonapi 1.9.0 → 1.10.0

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.
@@ -3,7 +3,7 @@ import {
3
3
  Button,
4
4
  errorToast,
5
5
  useCurrentUserContext
6
- } from "./chunk-YHUK7PFT.mjs";
6
+ } from "./chunk-PH4P2DR6.mjs";
7
7
  import "./chunk-33UYFFIK.mjs";
8
8
  import {
9
9
  BlockNoteDiffUtil,
@@ -380,4 +380,4 @@ __name(BlockNoteEditor, "BlockNoteEditor");
380
380
  export {
381
381
  BlockNoteEditor as default
382
382
  };
383
- //# sourceMappingURL=BlockNoteEditor-MXNV2O43.mjs.map
383
+ //# sourceMappingURL=BlockNoteEditor-F6DZNT6A.mjs.map
@@ -3,7 +3,7 @@
3
3
 
4
4
 
5
5
 
6
- var _chunkPVN4DI3Hjs = require('./chunk-PVN4DI3H.js');
6
+ var _chunkUJEQG3XFjs = require('./chunk-UJEQG3XF.js');
7
7
  require('./chunk-I7OQ5WKX.js');
8
8
 
9
9
 
@@ -79,7 +79,7 @@ var createDiffActionsInlineContentSpec = /* @__PURE__ */ _chunk7QVYU63Ejs.__name
79
79
  const diffIds = props.inlineContent.props.diffIds;
80
80
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "span", { className: "diff-actions-container mx-2 inline-flex items-center gap-1 align-middle", children: [
81
81
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
82
- _chunkPVN4DI3Hjs.Button,
82
+ _chunkUJEQG3XFjs.Button,
83
83
  {
84
84
  title: "Accept change",
85
85
  onClick: (e) => {
@@ -91,7 +91,7 @@ var createDiffActionsInlineContentSpec = /* @__PURE__ */ _chunk7QVYU63Ejs.__name
91
91
  }
92
92
  ),
93
93
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
94
- _chunkPVN4DI3Hjs.Button,
94
+ _chunkUJEQG3XFjs.Button,
95
95
  {
96
96
  title: "Reject change",
97
97
  className: "mx-2 p-0",
@@ -121,7 +121,7 @@ function BlockNoteEditor({
121
121
  bordered
122
122
  }) {
123
123
  const t = _nextintl.useTranslations.call(void 0, );
124
- const { company } = _chunkPVN4DI3Hjs.useCurrentUserContext.call(void 0, );
124
+ const { company } = _chunkUJEQG3XFjs.useCurrentUserContext.call(void 0, );
125
125
  const [acceptedChanges, setAcceptedChanges] = _react3.useState.call(void 0, /* @__PURE__ */ new Set());
126
126
  const [rejectedChanges, setRejectedChanges] = _react3.useState.call(void 0, /* @__PURE__ */ new Set());
127
127
  const editorRef = _react3.useRef.call(void 0, null);
@@ -157,7 +157,7 @@ function BlockNoteEditor({
157
157
  const uploadImage = _react3.useCallback.call(void 0,
158
158
  async (file) => {
159
159
  if (!company) {
160
- _chunkPVN4DI3Hjs.errorToast.call(void 0, {
160
+ _chunkUJEQG3XFjs.errorToast.call(void 0, {
161
161
  title: t(`generic.errors.upload`),
162
162
  error: t(`generic.errors.upload_description`)
163
163
  });
@@ -380,4 +380,4 @@ _chunk7QVYU63Ejs.__name.call(void 0, BlockNoteEditor, "BlockNoteEditor");
380
380
 
381
381
 
382
382
  exports.default = BlockNoteEditor;
383
- //# sourceMappingURL=BlockNoteEditor-O32YPSNN.js.map
383
+ //# sourceMappingURL=BlockNoteEditor-SIIMOS7X.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/nextjs-jsonapi/nextjs-jsonapi/dist/BlockNoteEditor-O32YPSNN.js","../src/components/editors/BlockNoteEditor.tsx","../src/components/editors/BlockNoteEditorFormattingToolbar.tsx"],"names":["jsxs","jsx"],"mappings":"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","file":"/home/runner/work/nextjs-jsonapi/nextjs-jsonapi/dist/BlockNoteEditor-O32YPSNN.js","sourcesContent":[null,"\"use client\";\n\nimport { BlockNoteSchema, defaultInlineContentSpecs, PartialBlock } from \"@blocknote/core\";\nimport { createReactInlineContentSpec, useCreateBlockNote } from \"@blocknote/react\";\nimport { BlockNoteView } from \"@blocknote/shadcn\";\nimport \"@blocknote/shadcn/style.css\";\nimport { CheckIcon, XIcon } from \"lucide-react\";\nimport { useTranslations } from \"next-intl\";\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useCurrentUserContext } from \"../../contexts\";\nimport { S3Interface } from \"../../features/s3/data\";\nimport { UserInterface } from \"../../features/user/data\";\nimport { S3Service } from \"../../features/s3/data/s3.service\";\nimport { Button } from \"../../shadcnui\";\nimport { BlockNoteDiffUtil, BlockNoteWordDiffRendererUtil, cn } from \"../../utils\";\nimport { errorToast } from \"../errors\";\nimport { BlockNoteEditorFormattingToolbar } from \"./BlockNoteEditorFormattingToolbar\";\n\nexport type BlockNoteEditorProps = {\n id: string;\n type: string;\n initialContent?: PartialBlock[];\n onChange?: (content: any, isEmpty: boolean, hasUnresolvedDiff: boolean) => void;\n size?: \"sm\" | \"md\";\n className?: string;\n markdownContent?: string;\n diffContent?: PartialBlock[];\n placeholder?: string;\n bordered?: boolean;\n};\n\nconst createDiffActionsInlineContentSpec = (\n handleAcceptChange: (diffId: string) => void,\n handleRejectChange: (diffId: string) => void,\n) => {\n return createReactInlineContentSpec(\n {\n type: \"diffActions\",\n propSchema: {\n diffIds: {\n default: \"\",\n },\n },\n content: \"none\",\n },\n {\n render: (props) => {\n const diffIds = props.inlineContent.props.diffIds;\n\n return (\n <span className=\"diff-actions-container mx-2 inline-flex items-center gap-1 align-middle\">\n <Button\n title=\"Accept change\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n diffIds.split(\",\").forEach((id: string) => handleAcceptChange(id.trim()));\n }}\n >\n <CheckIcon className=\"h-3 w-3 text-green-600\" />\n </Button>\n <Button\n title=\"Reject change\"\n className=\"mx-2 p-0\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n diffIds.split(\",\").forEach((id: string) => handleRejectChange(id.trim()));\n }}\n >\n <XIcon className=\"h-3 w-3 text-red-600\" />\n </Button>\n </span>\n );\n },\n },\n );\n};\n\nexport default function BlockNoteEditor({\n id,\n type,\n initialContent,\n onChange,\n size,\n className,\n markdownContent,\n diffContent,\n placeholder,\n bordered,\n}: BlockNoteEditorProps): React.JSX.Element {\n const t = useTranslations();\n const { company } = useCurrentUserContext<UserInterface>();\n\n const [acceptedChanges, setAcceptedChanges] = useState<Set<string>>(new Set());\n const [rejectedChanges, setRejectedChanges] = useState<Set<string>>(new Set());\n\n const editorRef = useRef<HTMLDivElement>(null);\n\n const handleAcceptChange = useCallback((diffId: string) => {\n setAcceptedChanges((prev) => new Set([...prev, diffId]));\n setRejectedChanges((prev) => {\n const newSet = new Set(prev);\n newSet.delete(diffId);\n return newSet;\n });\n }, []);\n\n const handleRejectChange = useCallback((diffId: string) => {\n setRejectedChanges((prev) => new Set([...prev, diffId]));\n setAcceptedChanges((prev) => {\n const newSet = new Set(prev);\n newSet.delete(diffId);\n return newSet;\n });\n }, []);\n\n const DiffActionsInlineContent = useMemo(\n () => createDiffActionsInlineContentSpec(handleAcceptChange, handleRejectChange),\n [handleAcceptChange, handleRejectChange],\n );\n\n const schema = useMemo(\n () =>\n BlockNoteSchema.create({\n inlineContentSpecs: {\n ...defaultInlineContentSpecs,\n diffActions: DiffActionsInlineContent,\n },\n } as any),\n [DiffActionsInlineContent],\n );\n\n const uploadImage = useCallback(\n async (file: File): Promise<string> => {\n if (!company) {\n errorToast({\n title: t(`generic.errors.upload`),\n error: t(`generic.errors.upload_description`),\n });\n throw new Error(t(`generic.errors.upload`));\n }\n\n const fileType = file.type;\n const key = `companies/${company.id}/${type}/${id}/${file.name}`;\n\n const s3: S3Interface = await S3Service.getPreSignedUrl({\n key: key,\n contentType: fileType,\n isPublic: true,\n });\n\n await fetch(s3.url, {\n method: \"PUT\",\n headers: s3.headers,\n body: file,\n });\n\n const signedImage: S3Interface = await S3Service.getSignedUrl({\n key: key,\n isPublic: true,\n });\n\n return signedImage.url;\n },\n [company, id, t],\n );\n\n // Utility: Remove trailing empty blocks for read-only display\n const removeTrailingEmptyBlocks = useCallback(\n (blocks: PartialBlock[]): PartialBlock[] => {\n if (!blocks || blocks.length === 0) return blocks;\n\n // Only remove trailing empty blocks in read-only mode\n if (onChange !== undefined) return blocks;\n\n const result = [...blocks];\n\n // Remove trailing empty paragraph blocks, but keep at least one block\n while (result.length > 1) {\n const lastBlock = result[result.length - 1];\n\n // Check if it's an empty paragraph\n const isEmptyParagraph =\n lastBlock.type === \"paragraph\" &&\n (!lastBlock.content ||\n lastBlock.content.length === 0 ||\n (Array.isArray(lastBlock.content) && lastBlock.content.every((c: any) => !c.text || c.text.trim() === \"\")));\n\n if (isEmptyParagraph) {\n result.pop();\n } else {\n break;\n }\n }\n\n return result;\n },\n [onChange],\n );\n\n const processedContent = useMemo(() => {\n if (diffContent && initialContent) {\n try {\n const diffResult = BlockNoteDiffUtil.diff(initialContent, diffContent);\n const renderedDiff = BlockNoteWordDiffRendererUtil.renderWordDiffs(\n diffResult.blocks,\n handleAcceptChange,\n handleRejectChange,\n acceptedChanges,\n rejectedChanges,\n );\n return removeTrailingEmptyBlocks(renderedDiff);\n } catch (error) {\n return initialContent && Array.isArray(initialContent) && initialContent.length > 0\n ? removeTrailingEmptyBlocks(initialContent)\n : [];\n }\n }\n\n if (!initialContent) {\n return [];\n }\n\n if (!Array.isArray(initialContent)) {\n return [];\n }\n\n return initialContent.length > 0 ? removeTrailingEmptyBlocks(initialContent) : [];\n }, [\n initialContent,\n diffContent,\n handleAcceptChange,\n handleRejectChange,\n acceptedChanges,\n rejectedChanges,\n removeTrailingEmptyBlocks,\n ]);\n\n const validatedInitialContent = useMemo(() => {\n if (processedContent && Array.isArray(processedContent) && processedContent.length > 0) {\n const validatedContent = processedContent.filter((block) => {\n if (!block || typeof block !== \"object\") return false;\n if (!(block as any).type) return false;\n return true;\n });\n return validatedContent.length > 0 ? (validatedContent as PartialBlock[]) : undefined;\n }\n return undefined;\n }, [processedContent]);\n\n const editor = useCreateBlockNote(\n useMemo(\n () => ({\n placeholders: {\n emptyDocument: placeholder || t(`generic.blocknote.placeholder`),\n },\n schema,\n initialContent: validatedInitialContent,\n uploadFile: uploadImage,\n }),\n [placeholder, t, schema, validatedInitialContent, uploadImage],\n ),\n );\n\n const handleChange = useCallback(async () => {\n if (!onChange) return;\n const newBlocks = editor.document;\n\n const markdownFromBlocks = (await editor.blocksToMarkdownLossy(editor.document)).trim();\n\n function hasUnresolvedDiffsRecursive(block: any): boolean {\n if (!block || typeof block !== \"object\") return false;\n let diffId = undefined;\n if (block.props && block.props.diffId) diffId = block.props.diffId;\n if (!diffId && block.attrs && block.attrs.diffId) diffId = block.attrs.diffId;\n if (diffId && !acceptedChanges.has(diffId) && !rejectedChanges.has(diffId)) {\n return true;\n }\n\n if (block.content) {\n const contentArr = Array.isArray(block.content) ? block.content : [block.content];\n for (const inline of contentArr) {\n if (inline && typeof inline === \"object\") {\n if (inline.type === \"diffActions\" && inline.props && inline.props.diffIds) {\n const ids =\n typeof inline.props.diffIds === \"string\" ? inline.props.diffIds.split(\",\") : inline.props.diffIds;\n for (const id of ids) {\n const trimmed = (id || \"\").toString().trim();\n if (trimmed && !acceptedChanges.has(trimmed) && !rejectedChanges.has(trimmed)) {\n return true;\n }\n }\n }\n if (inline.props && inline.props.diffId) {\n const diffIdInline = inline.props.diffId;\n if (diffIdInline && !acceptedChanges.has(diffIdInline) && !rejectedChanges.has(diffIdInline)) {\n return true;\n }\n }\n if (inline.children && Array.isArray(inline.children)) {\n for (const child of inline.children) {\n if (hasUnresolvedDiffsRecursive(child)) return true;\n }\n }\n }\n }\n }\n if (Array.isArray(block.children)) {\n for (const child of block.children) {\n if (hasUnresolvedDiffsRecursive(child)) return true;\n }\n }\n return false;\n }\n\n let hasUnresolvedDiff = false;\n if (Array.isArray(newBlocks)) {\n hasUnresolvedDiff = newBlocks.some((block: any) => hasUnresolvedDiffsRecursive(block));\n }\n\n onChange(newBlocks, !markdownFromBlocks.length, hasUnresolvedDiff);\n }, [editor, onChange, id, acceptedChanges, rejectedChanges]);\n\n // Utility: deep equality for arrays of blocks\n const areBlocksEqual = (a: any[], b: any[]): boolean => {\n return JSON.stringify(a) === JSON.stringify(b);\n };\n\n // Only initialize from markdownContent once per value, and only if different\n const hasInitializedFromMarkdown = useRef<string | null>(null);\n useEffect(() => {\n const updateContent = async (markdown: string) => {\n const blocks = await editor.tryParseMarkdownToBlocks(markdown);\n if (!areBlocksEqual(blocks, editor.document)) {\n editor.replaceBlocks(editor.document, blocks);\n }\n };\n\n if (markdownContent && hasInitializedFromMarkdown.current !== markdownContent) {\n hasInitializedFromMarkdown.current = markdownContent;\n updateContent(markdownContent).then(() => handleChange());\n }\n }, [markdownContent, editor]);\n\n // Update editor content when diff content changes, but only if different\n // Prevent unnecessary replaceBlocks calls that reset scroll/cursor.\n const previousContentHashRef = useRef<string | null>(null);\n useEffect(() => {\n if (!processedContent || !editor) return;\n const hash = JSON.stringify(processedContent);\n if (previousContentHashRef.current === hash) return; // no changes\n const currentHash = JSON.stringify(editor.document);\n if (currentHash === hash) {\n previousContentHashRef.current = hash;\n return; // already in sync\n }\n editor.replaceBlocks(editor.document, processedContent as PartialBlock[]);\n previousContentHashRef.current = hash;\n }, [processedContent, editor]);\n\n // Handle audio received from whisper transcription\n const handleAudioReceived = useCallback(\n (message: string) => {\n try {\n // Ensure the editor has focus\n const editorElement = editorRef.current?.querySelector('[contenteditable=\"true\"]') as HTMLElement;\n if (editorElement && document.activeElement !== editorElement) {\n editorElement.focus();\n }\n\n // Insert the transcribed text at the current cursor position\n editor.insertInlineContent(message);\n } catch (error) {\n console.error(\"Error inserting transcribed text:\", error);\n // Fallback: try to insert at the end of the document\n try {\n const blocks = editor.document;\n if (blocks.length > 0) {\n const lastBlock = blocks[blocks.length - 1];\n editor.setTextCursorPosition(lastBlock.id, \"end\");\n editor.insertInlineContent(message);\n }\n } catch (fallbackError) {\n console.error(\"Fallback insertion also failed:\", fallbackError);\n }\n }\n },\n [editor],\n );\n\n return (\n <div ref={editorRef} className={cn(bordered ? \"rounded-md border\" : \"\", \"w-full\")}>\n <BlockNoteView\n editor={editor}\n onChange={handleChange}\n editable={onChange !== undefined}\n formattingToolbar={false}\n theme=\"light\"\n className={cn(`BlockNoteView ${onChange ? \"min-h-96 p-4\" : \"\"}`, className, size === \"sm\" && \"small\")}\n >\n <BlockNoteEditorFormattingToolbar />\n </BlockNoteView>\n </div>\n );\n}\n","\"use client\";\n\nimport {\n BasicTextStyleButton,\n BlockTypeSelect,\n CreateLinkButton,\n FileCaptionButton,\n FileReplaceButton,\n FormattingToolbar,\n FormattingToolbarController,\n TextAlignButton,\n} from \"@blocknote/react\";\n\nexport function BlockNoteEditorFormattingToolbar() {\n return (\n <FormattingToolbarController\n formattingToolbar={() => (\n <FormattingToolbar>\n <BlockTypeSelect key={\"blockTypeSelect\"} />\n\n <FileCaptionButton key={\"fileCaptionButton\"} />\n <FileReplaceButton key={\"replaceFileButton\"} />\n\n <BasicTextStyleButton basicTextStyle={\"bold\"} key={\"boldStyleButton\"} />\n <BasicTextStyleButton basicTextStyle={\"italic\"} key={\"italicStyleButton\"} />\n <BasicTextStyleButton basicTextStyle={\"underline\"} key={\"underlineStyleButton\"} />\n <BasicTextStyleButton basicTextStyle={\"strike\"} key={\"strikeStyleButton\"} />\n\n <TextAlignButton textAlignment={\"left\"} key={\"textAlignLeftButton\"} />\n <TextAlignButton textAlignment={\"center\"} key={\"textAlignCenterButton\"} />\n <TextAlignButton textAlignment={\"right\"} key={\"textAlignRightButton\"} />\n\n <CreateLinkButton key={\"createLinkButton\"} />\n </FormattingToolbar>\n )}\n />\n );\n}\n"]}
1
+ {"version":3,"sources":["/home/runner/work/nextjs-jsonapi/nextjs-jsonapi/dist/BlockNoteEditor-SIIMOS7X.js","../src/components/editors/BlockNoteEditor.tsx","../src/components/editors/BlockNoteEditorFormattingToolbar.tsx"],"names":["jsxs","jsx"],"mappings":"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","file":"/home/runner/work/nextjs-jsonapi/nextjs-jsonapi/dist/BlockNoteEditor-SIIMOS7X.js","sourcesContent":[null,"\"use client\";\n\nimport { BlockNoteSchema, defaultInlineContentSpecs, PartialBlock } from \"@blocknote/core\";\nimport { createReactInlineContentSpec, useCreateBlockNote } from \"@blocknote/react\";\nimport { BlockNoteView } from \"@blocknote/shadcn\";\nimport \"@blocknote/shadcn/style.css\";\nimport { CheckIcon, XIcon } from \"lucide-react\";\nimport { useTranslations } from \"next-intl\";\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useCurrentUserContext } from \"../../contexts\";\nimport { S3Interface } from \"../../features/s3/data\";\nimport { UserInterface } from \"../../features/user/data\";\nimport { S3Service } from \"../../features/s3/data/s3.service\";\nimport { Button } from \"../../shadcnui\";\nimport { BlockNoteDiffUtil, BlockNoteWordDiffRendererUtil, cn } from \"../../utils\";\nimport { errorToast } from \"../errors\";\nimport { BlockNoteEditorFormattingToolbar } from \"./BlockNoteEditorFormattingToolbar\";\n\nexport type BlockNoteEditorProps = {\n id: string;\n type: string;\n initialContent?: PartialBlock[];\n onChange?: (content: any, isEmpty: boolean, hasUnresolvedDiff: boolean) => void;\n size?: \"sm\" | \"md\";\n className?: string;\n markdownContent?: string;\n diffContent?: PartialBlock[];\n placeholder?: string;\n bordered?: boolean;\n};\n\nconst createDiffActionsInlineContentSpec = (\n handleAcceptChange: (diffId: string) => void,\n handleRejectChange: (diffId: string) => void,\n) => {\n return createReactInlineContentSpec(\n {\n type: \"diffActions\",\n propSchema: {\n diffIds: {\n default: \"\",\n },\n },\n content: \"none\",\n },\n {\n render: (props) => {\n const diffIds = props.inlineContent.props.diffIds;\n\n return (\n <span className=\"diff-actions-container mx-2 inline-flex items-center gap-1 align-middle\">\n <Button\n title=\"Accept change\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n diffIds.split(\",\").forEach((id: string) => handleAcceptChange(id.trim()));\n }}\n >\n <CheckIcon className=\"h-3 w-3 text-green-600\" />\n </Button>\n <Button\n title=\"Reject change\"\n className=\"mx-2 p-0\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n diffIds.split(\",\").forEach((id: string) => handleRejectChange(id.trim()));\n }}\n >\n <XIcon className=\"h-3 w-3 text-red-600\" />\n </Button>\n </span>\n );\n },\n },\n );\n};\n\nexport default function BlockNoteEditor({\n id,\n type,\n initialContent,\n onChange,\n size,\n className,\n markdownContent,\n diffContent,\n placeholder,\n bordered,\n}: BlockNoteEditorProps): React.JSX.Element {\n const t = useTranslations();\n const { company } = useCurrentUserContext<UserInterface>();\n\n const [acceptedChanges, setAcceptedChanges] = useState<Set<string>>(new Set());\n const [rejectedChanges, setRejectedChanges] = useState<Set<string>>(new Set());\n\n const editorRef = useRef<HTMLDivElement>(null);\n\n const handleAcceptChange = useCallback((diffId: string) => {\n setAcceptedChanges((prev) => new Set([...prev, diffId]));\n setRejectedChanges((prev) => {\n const newSet = new Set(prev);\n newSet.delete(diffId);\n return newSet;\n });\n }, []);\n\n const handleRejectChange = useCallback((diffId: string) => {\n setRejectedChanges((prev) => new Set([...prev, diffId]));\n setAcceptedChanges((prev) => {\n const newSet = new Set(prev);\n newSet.delete(diffId);\n return newSet;\n });\n }, []);\n\n const DiffActionsInlineContent = useMemo(\n () => createDiffActionsInlineContentSpec(handleAcceptChange, handleRejectChange),\n [handleAcceptChange, handleRejectChange],\n );\n\n const schema = useMemo(\n () =>\n BlockNoteSchema.create({\n inlineContentSpecs: {\n ...defaultInlineContentSpecs,\n diffActions: DiffActionsInlineContent,\n },\n } as any),\n [DiffActionsInlineContent],\n );\n\n const uploadImage = useCallback(\n async (file: File): Promise<string> => {\n if (!company) {\n errorToast({\n title: t(`generic.errors.upload`),\n error: t(`generic.errors.upload_description`),\n });\n throw new Error(t(`generic.errors.upload`));\n }\n\n const fileType = file.type;\n const key = `companies/${company.id}/${type}/${id}/${file.name}`;\n\n const s3: S3Interface = await S3Service.getPreSignedUrl({\n key: key,\n contentType: fileType,\n isPublic: true,\n });\n\n await fetch(s3.url, {\n method: \"PUT\",\n headers: s3.headers,\n body: file,\n });\n\n const signedImage: S3Interface = await S3Service.getSignedUrl({\n key: key,\n isPublic: true,\n });\n\n return signedImage.url;\n },\n [company, id, t],\n );\n\n // Utility: Remove trailing empty blocks for read-only display\n const removeTrailingEmptyBlocks = useCallback(\n (blocks: PartialBlock[]): PartialBlock[] => {\n if (!blocks || blocks.length === 0) return blocks;\n\n // Only remove trailing empty blocks in read-only mode\n if (onChange !== undefined) return blocks;\n\n const result = [...blocks];\n\n // Remove trailing empty paragraph blocks, but keep at least one block\n while (result.length > 1) {\n const lastBlock = result[result.length - 1];\n\n // Check if it's an empty paragraph\n const isEmptyParagraph =\n lastBlock.type === \"paragraph\" &&\n (!lastBlock.content ||\n lastBlock.content.length === 0 ||\n (Array.isArray(lastBlock.content) && lastBlock.content.every((c: any) => !c.text || c.text.trim() === \"\")));\n\n if (isEmptyParagraph) {\n result.pop();\n } else {\n break;\n }\n }\n\n return result;\n },\n [onChange],\n );\n\n const processedContent = useMemo(() => {\n if (diffContent && initialContent) {\n try {\n const diffResult = BlockNoteDiffUtil.diff(initialContent, diffContent);\n const renderedDiff = BlockNoteWordDiffRendererUtil.renderWordDiffs(\n diffResult.blocks,\n handleAcceptChange,\n handleRejectChange,\n acceptedChanges,\n rejectedChanges,\n );\n return removeTrailingEmptyBlocks(renderedDiff);\n } catch (error) {\n return initialContent && Array.isArray(initialContent) && initialContent.length > 0\n ? removeTrailingEmptyBlocks(initialContent)\n : [];\n }\n }\n\n if (!initialContent) {\n return [];\n }\n\n if (!Array.isArray(initialContent)) {\n return [];\n }\n\n return initialContent.length > 0 ? removeTrailingEmptyBlocks(initialContent) : [];\n }, [\n initialContent,\n diffContent,\n handleAcceptChange,\n handleRejectChange,\n acceptedChanges,\n rejectedChanges,\n removeTrailingEmptyBlocks,\n ]);\n\n const validatedInitialContent = useMemo(() => {\n if (processedContent && Array.isArray(processedContent) && processedContent.length > 0) {\n const validatedContent = processedContent.filter((block) => {\n if (!block || typeof block !== \"object\") return false;\n if (!(block as any).type) return false;\n return true;\n });\n return validatedContent.length > 0 ? (validatedContent as PartialBlock[]) : undefined;\n }\n return undefined;\n }, [processedContent]);\n\n const editor = useCreateBlockNote(\n useMemo(\n () => ({\n placeholders: {\n emptyDocument: placeholder || t(`generic.blocknote.placeholder`),\n },\n schema,\n initialContent: validatedInitialContent,\n uploadFile: uploadImage,\n }),\n [placeholder, t, schema, validatedInitialContent, uploadImage],\n ),\n );\n\n const handleChange = useCallback(async () => {\n if (!onChange) return;\n const newBlocks = editor.document;\n\n const markdownFromBlocks = (await editor.blocksToMarkdownLossy(editor.document)).trim();\n\n function hasUnresolvedDiffsRecursive(block: any): boolean {\n if (!block || typeof block !== \"object\") return false;\n let diffId = undefined;\n if (block.props && block.props.diffId) diffId = block.props.diffId;\n if (!diffId && block.attrs && block.attrs.diffId) diffId = block.attrs.diffId;\n if (diffId && !acceptedChanges.has(diffId) && !rejectedChanges.has(diffId)) {\n return true;\n }\n\n if (block.content) {\n const contentArr = Array.isArray(block.content) ? block.content : [block.content];\n for (const inline of contentArr) {\n if (inline && typeof inline === \"object\") {\n if (inline.type === \"diffActions\" && inline.props && inline.props.diffIds) {\n const ids =\n typeof inline.props.diffIds === \"string\" ? inline.props.diffIds.split(\",\") : inline.props.diffIds;\n for (const id of ids) {\n const trimmed = (id || \"\").toString().trim();\n if (trimmed && !acceptedChanges.has(trimmed) && !rejectedChanges.has(trimmed)) {\n return true;\n }\n }\n }\n if (inline.props && inline.props.diffId) {\n const diffIdInline = inline.props.diffId;\n if (diffIdInline && !acceptedChanges.has(diffIdInline) && !rejectedChanges.has(diffIdInline)) {\n return true;\n }\n }\n if (inline.children && Array.isArray(inline.children)) {\n for (const child of inline.children) {\n if (hasUnresolvedDiffsRecursive(child)) return true;\n }\n }\n }\n }\n }\n if (Array.isArray(block.children)) {\n for (const child of block.children) {\n if (hasUnresolvedDiffsRecursive(child)) return true;\n }\n }\n return false;\n }\n\n let hasUnresolvedDiff = false;\n if (Array.isArray(newBlocks)) {\n hasUnresolvedDiff = newBlocks.some((block: any) => hasUnresolvedDiffsRecursive(block));\n }\n\n onChange(newBlocks, !markdownFromBlocks.length, hasUnresolvedDiff);\n }, [editor, onChange, id, acceptedChanges, rejectedChanges]);\n\n // Utility: deep equality for arrays of blocks\n const areBlocksEqual = (a: any[], b: any[]): boolean => {\n return JSON.stringify(a) === JSON.stringify(b);\n };\n\n // Only initialize from markdownContent once per value, and only if different\n const hasInitializedFromMarkdown = useRef<string | null>(null);\n useEffect(() => {\n const updateContent = async (markdown: string) => {\n const blocks = await editor.tryParseMarkdownToBlocks(markdown);\n if (!areBlocksEqual(blocks, editor.document)) {\n editor.replaceBlocks(editor.document, blocks);\n }\n };\n\n if (markdownContent && hasInitializedFromMarkdown.current !== markdownContent) {\n hasInitializedFromMarkdown.current = markdownContent;\n updateContent(markdownContent).then(() => handleChange());\n }\n }, [markdownContent, editor]);\n\n // Update editor content when diff content changes, but only if different\n // Prevent unnecessary replaceBlocks calls that reset scroll/cursor.\n const previousContentHashRef = useRef<string | null>(null);\n useEffect(() => {\n if (!processedContent || !editor) return;\n const hash = JSON.stringify(processedContent);\n if (previousContentHashRef.current === hash) return; // no changes\n const currentHash = JSON.stringify(editor.document);\n if (currentHash === hash) {\n previousContentHashRef.current = hash;\n return; // already in sync\n }\n editor.replaceBlocks(editor.document, processedContent as PartialBlock[]);\n previousContentHashRef.current = hash;\n }, [processedContent, editor]);\n\n // Handle audio received from whisper transcription\n const handleAudioReceived = useCallback(\n (message: string) => {\n try {\n // Ensure the editor has focus\n const editorElement = editorRef.current?.querySelector('[contenteditable=\"true\"]') as HTMLElement;\n if (editorElement && document.activeElement !== editorElement) {\n editorElement.focus();\n }\n\n // Insert the transcribed text at the current cursor position\n editor.insertInlineContent(message);\n } catch (error) {\n console.error(\"Error inserting transcribed text:\", error);\n // Fallback: try to insert at the end of the document\n try {\n const blocks = editor.document;\n if (blocks.length > 0) {\n const lastBlock = blocks[blocks.length - 1];\n editor.setTextCursorPosition(lastBlock.id, \"end\");\n editor.insertInlineContent(message);\n }\n } catch (fallbackError) {\n console.error(\"Fallback insertion also failed:\", fallbackError);\n }\n }\n },\n [editor],\n );\n\n return (\n <div ref={editorRef} className={cn(bordered ? \"rounded-md border\" : \"\", \"w-full\")}>\n <BlockNoteView\n editor={editor}\n onChange={handleChange}\n editable={onChange !== undefined}\n formattingToolbar={false}\n theme=\"light\"\n className={cn(`BlockNoteView ${onChange ? \"min-h-96 p-4\" : \"\"}`, className, size === \"sm\" && \"small\")}\n >\n <BlockNoteEditorFormattingToolbar />\n </BlockNoteView>\n </div>\n );\n}\n","\"use client\";\n\nimport {\n BasicTextStyleButton,\n BlockTypeSelect,\n CreateLinkButton,\n FileCaptionButton,\n FileReplaceButton,\n FormattingToolbar,\n FormattingToolbarController,\n TextAlignButton,\n} from \"@blocknote/react\";\n\nexport function BlockNoteEditorFormattingToolbar() {\n return (\n <FormattingToolbarController\n formattingToolbar={() => (\n <FormattingToolbar>\n <BlockTypeSelect key={\"blockTypeSelect\"} />\n\n <FileCaptionButton key={\"fileCaptionButton\"} />\n <FileReplaceButton key={\"replaceFileButton\"} />\n\n <BasicTextStyleButton basicTextStyle={\"bold\"} key={\"boldStyleButton\"} />\n <BasicTextStyleButton basicTextStyle={\"italic\"} key={\"italicStyleButton\"} />\n <BasicTextStyleButton basicTextStyle={\"underline\"} key={\"underlineStyleButton\"} />\n <BasicTextStyleButton basicTextStyle={\"strike\"} key={\"strikeStyleButton\"} />\n\n <TextAlignButton textAlignment={\"left\"} key={\"textAlignLeftButton\"} />\n <TextAlignButton textAlignment={\"center\"} key={\"textAlignCenterButton\"} />\n <TextAlignButton textAlignment={\"right\"} key={\"textAlignRightButton\"} />\n\n <CreateLinkButton key={\"createLinkButton\"} />\n </FormattingToolbar>\n )}\n />\n );\n}\n"]}
@@ -7594,7 +7594,7 @@ __name(AllowedUsersDetails, "AllowedUsersDetails");
7594
7594
  import dynamic from "next/dynamic";
7595
7595
  import React37 from "react";
7596
7596
  import { jsx as jsx96 } from "react/jsx-runtime";
7597
- var BlockNoteEditor = dynamic(() => import("./BlockNoteEditor-MXNV2O43.mjs"), {
7597
+ var BlockNoteEditor = dynamic(() => import("./BlockNoteEditor-F6DZNT6A.mjs"), {
7598
7598
  ssr: false
7599
7599
  });
7600
7600
  var BlockNoteEditorContainer = React37.memo(/* @__PURE__ */ __name(function EditorContainer(props) {
@@ -9458,16 +9458,43 @@ function PageContainerContentDetails({ items, section, module, id }) {
9458
9458
  __name(PageContainerContentDetails, "PageContainerContentDetails");
9459
9459
 
9460
9460
  // src/components/pages/PageContentContainer.tsx
9461
+ import { useEffect as useEffect29, useState as useState37 } from "react";
9461
9462
  import { jsx as jsx121, jsxs as jsxs73 } from "react/jsx-runtime";
9462
9463
  function PageContentContainer({ details, footer, content }) {
9463
- return /* @__PURE__ */ jsx121("div", { className: "flex h-[calc(100vh-(--spacing(16)))] w-full", children: /* @__PURE__ */ jsxs73(ResizablePanelGroup, { direction: "horizontal", className: "items-stretch", autoSaveId: "page-content-layout", children: [
9464
- /* @__PURE__ */ jsx121(ResizablePanel, { id: "left-panel", defaultSize: 32, minSize: 20, maxSize: 40, children: /* @__PURE__ */ jsxs73("div", { className: "@container flex h-full flex-col pr-4", children: [
9465
- /* @__PURE__ */ jsx121("div", { className: "flex-1 overflow-y-auto", children: details }),
9466
- footer && /* @__PURE__ */ jsx121("div", { className: "flex flex-col gap-y-2 pt-2 pb-2", children: footer })
9467
- ] }) }),
9468
- /* @__PURE__ */ jsx121(ResizableHandle, { withHandle: true }),
9469
- /* @__PURE__ */ jsx121(ResizablePanel, { id: "right-panel", className: "pl-4", children: /* @__PURE__ */ jsx121("div", { className: "h-full overflow-y-auto", children: content }) })
9470
- ] }) });
9464
+ const [mounted, setMounted] = useState37(false);
9465
+ const isMobile = useIsMobile();
9466
+ useEffect29(() => {
9467
+ setMounted(true);
9468
+ }, []);
9469
+ const isReady = mounted && isMobile !== void 0;
9470
+ if (!isReady) {
9471
+ return /* @__PURE__ */ jsx121("div", { className: "flex h-[calc(100vh-(--spacing(16)))] w-full" });
9472
+ }
9473
+ return /* @__PURE__ */ jsx121("div", { className: "flex h-[calc(100vh-(--spacing(16)))] w-full transition-opacity duration-150 animate-in fade-in", children: /* @__PURE__ */ jsxs73(
9474
+ ResizablePanelGroup,
9475
+ {
9476
+ direction: isMobile ? "vertical" : "horizontal",
9477
+ className: "items-stretch",
9478
+ autoSaveId: isMobile ? void 0 : "page-content-layout",
9479
+ children: [
9480
+ /* @__PURE__ */ jsx121(
9481
+ ResizablePanel,
9482
+ {
9483
+ id: "left-panel",
9484
+ defaultSize: isMobile ? 10 : 32,
9485
+ minSize: isMobile ? 10 : 20,
9486
+ maxSize: isMobile ? 90 : 40,
9487
+ children: /* @__PURE__ */ jsxs73("div", { className: `@container flex h-full flex-col ${isMobile ? "pb-4" : "pr-4"}`, children: [
9488
+ /* @__PURE__ */ jsx121("div", { className: "flex-1 overflow-y-auto", children: details }),
9489
+ footer && /* @__PURE__ */ jsx121("div", { className: "flex flex-col gap-y-2 pt-2 pb-2", children: footer })
9490
+ ] })
9491
+ }
9492
+ ),
9493
+ /* @__PURE__ */ jsx121(ResizableHandle, { withHandle: true }),
9494
+ /* @__PURE__ */ jsx121(ResizablePanel, { id: "right-panel", className: isMobile ? "pt-4" : "pl-4", children: /* @__PURE__ */ jsx121("div", { className: "h-full overflow-y-auto", children: content }) })
9495
+ ]
9496
+ }
9497
+ ) });
9471
9498
  }
9472
9499
  __name(PageContentContainer, "PageContentContainer");
9473
9500
 
@@ -9562,10 +9589,10 @@ function useJsonApiConfigOptional() {
9562
9589
  __name(useJsonApiConfigOptional, "useJsonApiConfigOptional");
9563
9590
 
9564
9591
  // src/client/context/JsonApiProvider.tsx
9565
- import { useEffect as useEffect29, useMemo as useMemo10 } from "react";
9592
+ import { useEffect as useEffect30, useMemo as useMemo10 } from "react";
9566
9593
  import { jsx as jsx126 } from "react/jsx-runtime";
9567
9594
  function JsonApiProvider({ config, children }) {
9568
- useEffect29(() => {
9595
+ useEffect30(() => {
9569
9596
  if (config.bootstrapper) {
9570
9597
  config.bootstrapper();
9571
9598
  }
@@ -9576,12 +9603,12 @@ function JsonApiProvider({ config, children }) {
9576
9603
  __name(JsonApiProvider, "JsonApiProvider");
9577
9604
 
9578
9605
  // src/client/hooks/useJsonApiGet.ts
9579
- import { useState as useState37, useEffect as useEffect30, useCallback as useCallback13, useRef as useRef13 } from "react";
9606
+ import { useState as useState38, useEffect as useEffect31, useCallback as useCallback13, useRef as useRef13 } from "react";
9580
9607
  function useJsonApiGet(params) {
9581
- const [data, setData] = useState37(null);
9582
- const [loading, setLoading] = useState37(false);
9583
- const [error, setError] = useState37(null);
9584
- const [response, setResponse] = useState37(null);
9608
+ const [data, setData] = useState38(null);
9609
+ const [loading, setLoading] = useState38(false);
9610
+ const [error, setError] = useState38(null);
9611
+ const [response, setResponse] = useState38(null);
9585
9612
  const isMounted = useRef13(true);
9586
9613
  const fetchData = useCallback13(async () => {
9587
9614
  if (params.options?.enabled === false) return;
@@ -9654,7 +9681,7 @@ function useJsonApiGet(params) {
9654
9681
  }
9655
9682
  }
9656
9683
  }, [response]);
9657
- useEffect30(() => {
9684
+ useEffect31(() => {
9658
9685
  isMounted.current = true;
9659
9686
  fetchData();
9660
9687
  return () => {
@@ -9676,12 +9703,12 @@ function useJsonApiGet(params) {
9676
9703
  __name(useJsonApiGet, "useJsonApiGet");
9677
9704
 
9678
9705
  // src/client/hooks/useJsonApiMutation.ts
9679
- import { useState as useState38, useCallback as useCallback14 } from "react";
9706
+ import { useState as useState39, useCallback as useCallback14 } from "react";
9680
9707
  function useJsonApiMutation(config) {
9681
- const [data, setData] = useState38(null);
9682
- const [loading, setLoading] = useState38(false);
9683
- const [error, setError] = useState38(null);
9684
- const [response, setResponse] = useState38(null);
9708
+ const [data, setData] = useState39(null);
9709
+ const [loading, setLoading] = useState39(false);
9710
+ const [error, setError] = useState39(null);
9711
+ const [response, setResponse] = useState39(null);
9685
9712
  const reset = useCallback14(() => {
9686
9713
  setData(null);
9687
9714
  setLoading(false);
@@ -9906,11 +9933,11 @@ var useRoleTableStructure = /* @__PURE__ */ __name((params) => {
9906
9933
  }, "useRoleTableStructure");
9907
9934
 
9908
9935
  // src/features/user/hooks/useUserSearch.ts
9909
- import { useCallback as useCallback15, useEffect as useEffect31, useRef as useRef14, useState as useState39 } from "react";
9936
+ import { useCallback as useCallback15, useEffect as useEffect32, useRef as useRef14, useState as useState40 } from "react";
9910
9937
  var useUserSearch = /* @__PURE__ */ __name(() => {
9911
- const [users, setUsers] = useState39([]);
9912
- const [searchQuery, setSearchQuery] = useState39("");
9913
- const [isLoading, setIsLoading] = useState39(false);
9938
+ const [users, setUsers] = useState40([]);
9939
+ const [searchQuery, setSearchQuery] = useState40("");
9940
+ const [isLoading, setIsLoading] = useState40(false);
9914
9941
  const searchQueryRef = useRef14("");
9915
9942
  const loadUsers = useCallback15(
9916
9943
  async (search) => {
@@ -9929,7 +9956,7 @@ var useUserSearch = /* @__PURE__ */ __name(() => {
9929
9956
  [users.length]
9930
9957
  );
9931
9958
  const debouncedLoadUsers = useDebounce(loadUsers, 500);
9932
- useEffect31(() => {
9959
+ useEffect32(() => {
9933
9960
  if (searchQuery !== searchQueryRef.current) {
9934
9961
  setIsLoading(true);
9935
9962
  debouncedLoadUsers(searchQuery);
@@ -10165,15 +10192,15 @@ import { memo, useMemo as useMemo16 } from "react";
10165
10192
  // src/components/tables/ContentTableSearch.tsx
10166
10193
  import { RefreshCw, Search, X } from "lucide-react";
10167
10194
  import { useTranslations as useTranslations45 } from "next-intl";
10168
- import { useCallback as useCallback16, useEffect as useEffect32, useRef as useRef15, useState as useState40 } from "react";
10195
+ import { useCallback as useCallback16, useEffect as useEffect33, useRef as useRef15, useState as useState41 } from "react";
10169
10196
  import { jsx as jsx131, jsxs as jsxs76 } from "react/jsx-runtime";
10170
10197
  function ContentTableSearch({ data }) {
10171
10198
  const t = useTranslations45();
10172
10199
  const searchTermRef = useRef15("");
10173
10200
  const inputRef = useRef15(null);
10174
- const [searchTerm, setSearchTerm] = useState40("");
10175
- const [isFocused, setIsFocused] = useState40(false);
10176
- const [isSearching, setIsSearching] = useState40(false);
10201
+ const [searchTerm, setSearchTerm] = useState41("");
10202
+ const [isFocused, setIsFocused] = useState41(false);
10203
+ const [isSearching, setIsSearching] = useState41(false);
10177
10204
  const isExpanded = isFocused || searchTerm.length > 0;
10178
10205
  const search = useCallback16(
10179
10206
  async (searchedTerm) => {
@@ -10188,7 +10215,7 @@ function ContentTableSearch({ data }) {
10188
10215
  [searchTermRef, data]
10189
10216
  );
10190
10217
  const updateSearchTerm = useDebounce(search, 500);
10191
- useEffect32(() => {
10218
+ useEffect33(() => {
10192
10219
  setIsSearching(true);
10193
10220
  updateSearchTerm(searchTerm);
10194
10221
  }, [updateSearchTerm, searchTerm]);
@@ -10340,13 +10367,13 @@ var ContentListTable = memo(/* @__PURE__ */ __name(function ContentListTable2(pr
10340
10367
  import Image10 from "next/image";
10341
10368
 
10342
10369
  // src/features/auth/contexts/AuthContext.tsx
10343
- import { createContext as createContext16, useContext as useContext16, useMemo as useMemo17, useState as useState42 } from "react";
10370
+ import { createContext as createContext16, useContext as useContext16, useMemo as useMemo17, useState as useState43 } from "react";
10344
10371
 
10345
10372
  // src/features/auth/components/forms/Register.tsx
10346
10373
  import { zodResolver as zodResolver5 } from "@hookform/resolvers/zod";
10347
10374
  import { useTranslations as useTranslations46 } from "next-intl";
10348
10375
  import Image9 from "next/image";
10349
- import { useState as useState41 } from "react";
10376
+ import { useState as useState42 } from "react";
10350
10377
  import { useForm as useForm5 } from "react-hook-form";
10351
10378
  import { v4 as v44 } from "uuid";
10352
10379
  import { z as z5 } from "zod";
@@ -10354,7 +10381,7 @@ import { Fragment as Fragment20, jsx as jsx133, jsxs as jsxs78 } from "react/jsx
10354
10381
  function Register() {
10355
10382
  const t = useTranslations46();
10356
10383
  const { setComponentType } = useAuthContext();
10357
- const [showConfirmation, setShowConfirmation] = useState41(false);
10384
+ const [showConfirmation, setShowConfirmation] = useState42(false);
10358
10385
  const formSchema = z5.object({
10359
10386
  company: z5.string().min(1, {
10360
10387
  message: t(`generic.errors.missing_company_name`)
@@ -10478,8 +10505,8 @@ var AuthContextProvider = /* @__PURE__ */ __name(({
10478
10505
  initialComponentType,
10479
10506
  initialParams
10480
10507
  }) => {
10481
- const [componentType, setComponentType] = useState42(initialComponentType);
10482
- const [params, setParams] = useState42(initialParams);
10508
+ const [componentType, setComponentType] = useState43(initialComponentType);
10509
+ const [params, setParams] = useState43(initialParams);
10483
10510
  const activeComponent = useMemo17(() => {
10484
10511
  if (componentType === void 0) return null;
10485
10512
  switch (componentType) {
@@ -10572,17 +10599,17 @@ __name(LandingComponent, "LandingComponent");
10572
10599
  import { zodResolver as zodResolver6 } from "@hookform/resolvers/zod";
10573
10600
  import { useTranslations as useTranslations48 } from "next-intl";
10574
10601
  import Image12 from "next/image";
10575
- import { useEffect as useEffect33, useState as useState43 } from "react";
10602
+ import { useEffect as useEffect34, useState as useState44 } from "react";
10576
10603
  import { useForm as useForm6 } from "react-hook-form";
10577
10604
  import { toast as toast7 } from "sonner";
10578
10605
  import { z as z6 } from "zod";
10579
10606
  import { Fragment as Fragment22, jsx as jsx137, jsxs as jsxs80 } from "react/jsx-runtime";
10580
10607
  function AcceptInvitation() {
10581
10608
  const { setComponentType, params, setParams } = useAuthContext();
10582
- const [showConfirmation, setShowConfirmation] = useState43(false);
10583
- const [error, setError] = useState43(void 0);
10609
+ const [showConfirmation, setShowConfirmation] = useState44(false);
10610
+ const [error, setError] = useState44(void 0);
10584
10611
  const t = useTranslations48();
10585
- useEffect33(() => {
10612
+ useEffect34(() => {
10586
10613
  async function validateCode(code) {
10587
10614
  try {
10588
10615
  const payload = {
@@ -10675,15 +10702,15 @@ __name(AcceptInvitation, "AcceptInvitation");
10675
10702
  // src/features/auth/components/forms/ActivateAccount.tsx
10676
10703
  import { useTranslations as useTranslations49 } from "next-intl";
10677
10704
  import Image13 from "next/image";
10678
- import { useEffect as useEffect34, useState as useState44 } from "react";
10705
+ import { useEffect as useEffect35, useState as useState45 } from "react";
10679
10706
  import { toast as toast8 } from "sonner";
10680
10707
  import { Fragment as Fragment23, jsx as jsx138, jsxs as jsxs81 } from "react/jsx-runtime";
10681
10708
  function ActivateAccount() {
10682
10709
  const { setComponentType, params, setParams } = useAuthContext();
10683
- const [showConfirmation, setShowConfirmation] = useState44(false);
10684
- const [error, setError] = useState44(void 0);
10710
+ const [showConfirmation, setShowConfirmation] = useState45(false);
10711
+ const [error, setError] = useState45(void 0);
10685
10712
  const t = useTranslations49();
10686
- useEffect34(() => {
10713
+ useEffect35(() => {
10687
10714
  async function ActivateAccount2(code) {
10688
10715
  try {
10689
10716
  const payload = {
@@ -10724,12 +10751,12 @@ function ActivateAccount() {
10724
10751
  __name(ActivateAccount, "ActivateAccount");
10725
10752
 
10726
10753
  // src/features/auth/components/forms/Cookies.tsx
10727
- import { useEffect as useEffect35, useState as useState45 } from "react";
10754
+ import { useEffect as useEffect36, useState as useState46 } from "react";
10728
10755
  function Cookies({ dehydratedAuth, page }) {
10729
10756
  const { setUser } = useCurrentUserContext();
10730
10757
  const router = useI18nRouter();
10731
- const [hasSaved, setHasSaved] = useState45(false);
10732
- useEffect35(() => {
10758
+ const [hasSaved, setHasSaved] = useState46(false);
10759
+ useEffect36(() => {
10733
10760
  if (hasSaved) return;
10734
10761
  async function saveTokenOnServer() {
10735
10762
  await AuthService.saveToken({ dehydratedAuth });
@@ -10752,14 +10779,14 @@ __name(Cookies, "Cookies");
10752
10779
  import { zodResolver as zodResolver7 } from "@hookform/resolvers/zod";
10753
10780
  import { useTranslations as useTranslations50 } from "next-intl";
10754
10781
  import Image14 from "next/image";
10755
- import { useState as useState46 } from "react";
10782
+ import { useState as useState47 } from "react";
10756
10783
  import { useForm as useForm7 } from "react-hook-form";
10757
10784
  import { z as z7 } from "zod";
10758
10785
  import { Fragment as Fragment24, jsx as jsx139, jsxs as jsxs82 } from "react/jsx-runtime";
10759
10786
  function ForgotPassword() {
10760
10787
  const t = useTranslations50();
10761
10788
  const { setComponentType } = useAuthContext();
10762
- const [showConfirmation, setShowConfirmation] = useState46(false);
10789
+ const [showConfirmation, setShowConfirmation] = useState47(false);
10763
10790
  const formSchema = z7.object({
10764
10791
  email: z7.string().email({
10765
10792
  message: t(`generic.errors.invalid_email`)
@@ -10920,11 +10947,11 @@ function Login() {
10920
10947
  __name(Login, "Login");
10921
10948
 
10922
10949
  // src/features/auth/components/forms/Logout.tsx
10923
- import { useEffect as useEffect36 } from "react";
10950
+ import { useEffect as useEffect37 } from "react";
10924
10951
  import { Fragment as Fragment26, jsx as jsx141 } from "react/jsx-runtime";
10925
10952
  function Logout() {
10926
10953
  const generateUrl = usePageUrlGenerator();
10927
- useEffect36(() => {
10954
+ useEffect37(() => {
10928
10955
  const logOut = /* @__PURE__ */ __name(async () => {
10929
10956
  await AuthService.logout();
10930
10957
  window.location.href = generateUrl({ page: `/` });
@@ -10937,7 +10964,7 @@ __name(Logout, "Logout");
10937
10964
 
10938
10965
  // src/features/auth/components/forms/RefreshUser.tsx
10939
10966
  import { deleteCookie as deleteCookie2, getCookie as getCookie2 } from "cookies-next";
10940
- import { useEffect as useEffect37 } from "react";
10967
+ import { useEffect as useEffect38 } from "react";
10941
10968
  function RefreshUser() {
10942
10969
  const { setUser } = useCurrentUserContext();
10943
10970
  const loadFullUser = /* @__PURE__ */ __name(async () => {
@@ -10958,7 +10985,7 @@ function RefreshUser() {
10958
10985
  deleteCookie2("reloadData");
10959
10986
  }
10960
10987
  }, "loadFullUser");
10961
- useEffect37(() => {
10988
+ useEffect38(() => {
10962
10989
  const reloadData = getCookie2("reloadData");
10963
10990
  if (reloadData !== void 0) loadFullUser();
10964
10991
  }, []);
@@ -10970,17 +10997,17 @@ __name(RefreshUser, "RefreshUser");
10970
10997
  import { zodResolver as zodResolver9 } from "@hookform/resolvers/zod";
10971
10998
  import { useTranslations as useTranslations52 } from "next-intl";
10972
10999
  import Image16 from "next/image";
10973
- import { useEffect as useEffect38, useState as useState47 } from "react";
11000
+ import { useEffect as useEffect39, useState as useState48 } from "react";
10974
11001
  import { useForm as useForm9 } from "react-hook-form";
10975
11002
  import { toast as toast9 } from "sonner";
10976
11003
  import { z as z9 } from "zod";
10977
11004
  import { Fragment as Fragment27, jsx as jsx142, jsxs as jsxs84 } from "react/jsx-runtime";
10978
11005
  function ResetPassword() {
10979
11006
  const { setComponentType, params, setParams } = useAuthContext();
10980
- const [showConfirmation, setShowConfirmation] = useState47(false);
10981
- const [error, setError] = useState47(void 0);
11007
+ const [showConfirmation, setShowConfirmation] = useState48(false);
11008
+ const [error, setError] = useState48(void 0);
10982
11009
  const t = useTranslations52();
10983
- useEffect38(() => {
11010
+ useEffect39(() => {
10984
11011
  async function validateResetPasswordCode(code) {
10985
11012
  try {
10986
11013
  const payload = {
@@ -11262,7 +11289,7 @@ __name(NotificationsListContainer, "NotificationsListContainer");
11262
11289
  // src/features/notification/components/modals/NotificationModal.tsx
11263
11290
  import { BellIcon } from "lucide-react";
11264
11291
  import { useTranslations as useTranslations58 } from "next-intl";
11265
- import { Fragment as Fragment29, useCallback as useCallback17, useEffect as useEffect39, useMemo as useMemo18, useRef as useRef16, useState as useState48 } from "react";
11292
+ import { Fragment as Fragment29, useCallback as useCallback17, useEffect as useEffect40, useMemo as useMemo18, useRef as useRef16, useState as useState49 } from "react";
11266
11293
  import { toast as toast10 } from "sonner";
11267
11294
  import { jsx as jsx149, jsxs as jsxs89 } from "react/jsx-runtime";
11268
11295
  function NotificationModalContent({ isOpen, setIsOpen }) {
@@ -11279,7 +11306,7 @@ function NotificationModalContent({ isOpen, setIsOpen }) {
11279
11306
  const { socketNotifications, removeSocketNotification, clearSocketNotifications } = useSocketContext();
11280
11307
  const t = useTranslations58();
11281
11308
  const generateUrl = usePageUrlGenerator();
11282
- const [newNotifications, setNewNotifications] = useState48(false);
11309
+ const [newNotifications, setNewNotifications] = useState49(false);
11283
11310
  const preventAutoClose = useRef16(false);
11284
11311
  const circuitBreakerRef = useRef16({
11285
11312
  count: 0,
@@ -11308,7 +11335,7 @@ function NotificationModalContent({ isOpen, setIsOpen }) {
11308
11335
  unreadIds: unreadNotifications2.map((notif) => notif.id)
11309
11336
  };
11310
11337
  }, [notifications]);
11311
- useEffect39(() => {
11338
+ useEffect40(() => {
11312
11339
  setNewNotifications(unreadCount > 0);
11313
11340
  }, [unreadCount]);
11314
11341
  const processSocketNotificationsRef = useRef16(null);
@@ -11351,7 +11378,7 @@ function NotificationModalContent({ isOpen, setIsOpen }) {
11351
11378
  generateUrl,
11352
11379
  checkCircuitBreaker
11353
11380
  ]);
11354
- useEffect39(() => {
11381
+ useEffect40(() => {
11355
11382
  if (processSocketNotificationsRef.current) {
11356
11383
  clearTimeout(processSocketNotificationsRef.current);
11357
11384
  }
@@ -11495,13 +11522,13 @@ __name(FormRoles, "FormRoles");
11495
11522
 
11496
11523
  // src/features/role/components/forms/RemoveUserFromRole.tsx
11497
11524
  import { useTranslations as useTranslations61 } from "next-intl";
11498
- import { useEffect as useEffect40, useState as useState49 } from "react";
11525
+ import { useEffect as useEffect41, useState as useState50 } from "react";
11499
11526
  import { Fragment as Fragment32, jsx as jsx154, jsxs as jsxs92 } from "react/jsx-runtime";
11500
11527
  function RemoveUserFromRole({ role, user, refresh }) {
11501
- const [open, setOpen] = useState49(false);
11502
- const [canRemove, setCanRemove] = useState49(false);
11528
+ const [open, setOpen] = useState50(false);
11529
+ const [canRemove, setCanRemove] = useState50(false);
11503
11530
  const t = useTranslations61();
11504
- useEffect40(() => {
11531
+ useEffect41(() => {
11505
11532
  async function checkCompanyAdminDeletability() {
11506
11533
  const roleUsers = await UserService.findAllUsersByRole({
11507
11534
  roleId: role.id
@@ -11571,14 +11598,14 @@ __name(RemoveUserFromRole, "RemoveUserFromRole");
11571
11598
  // src/features/role/components/forms/UserRoleAdd.tsx
11572
11599
  import { PlusCircle } from "lucide-react";
11573
11600
  import { useTranslations as useTranslations62 } from "next-intl";
11574
- import { useCallback as useCallback18, useEffect as useEffect41, useRef as useRef17, useState as useState50 } from "react";
11601
+ import { useCallback as useCallback18, useEffect as useEffect42, useRef as useRef17, useState as useState51 } from "react";
11575
11602
  import { toast as toast11 } from "sonner";
11576
11603
  import { Fragment as Fragment33, jsx as jsx155, jsxs as jsxs93 } from "react/jsx-runtime";
11577
11604
  function UserRoleAdd({ user, refresh }) {
11578
- const [open, setOpen] = useState50(false);
11605
+ const [open, setOpen] = useState51(false);
11579
11606
  const inputRef = useRef17(null);
11580
- const [searchTerm, setSearchTerm] = useState50("");
11581
- const [roles, setRoles] = useState50([]);
11607
+ const [searchTerm, setSearchTerm] = useState51("");
11608
+ const [roles, setRoles] = useState51([]);
11582
11609
  const t = useTranslations62();
11583
11610
  const addUserToRole = /* @__PURE__ */ __name(async (role) => {
11584
11611
  await RoleService.addUserToRole({
@@ -11614,10 +11641,10 @@ function UserRoleAdd({ user, refresh }) {
11614
11641
  [searchTerm, user]
11615
11642
  );
11616
11643
  const updateSearchTerm = useDebounce(searchRoles, 500);
11617
- useEffect41(() => {
11644
+ useEffect42(() => {
11618
11645
  if (open) updateSearchTerm(searchTerm);
11619
11646
  }, [open, searchTerm]);
11620
- useEffect41(() => {
11647
+ useEffect42(() => {
11621
11648
  if (open) searchRoles("");
11622
11649
  }, [open]);
11623
11650
  return /* @__PURE__ */ jsxs93(Fragment33, { children: [
@@ -12088,4 +12115,4 @@ export {
12088
12115
  useUserTableStructure,
12089
12116
  useContentTableStructure
12090
12117
  };
12091
- //# sourceMappingURL=chunk-YHUK7PFT.mjs.map
12118
+ //# sourceMappingURL=chunk-PH4P2DR6.mjs.map