{"version":3,"file":"js/common.92e71d2330722d3f405a.js","mappings":"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","sources":["webpack://fider/./public/components/common/HoverInfo.tsx","webpack://fider/./public/components/common/Icon.tsx","webpack://fider/./public/components/common/form/MentionList.tsx","webpack://fider/./public/components/common/form/suggestion.ts","webpack://fider/./public/components/common/form/CustomMention.ts","webpack://fider/./public/components/common/form/CommentEditor.tsx","webpack://fider/./public/components/ErrorBoundary.tsx","webpack://fider/./public/components/ShowPostResponse.tsx","webpack://fider/./public/components/ShowPostStatus.tsx","webpack://fider/./public/components/common/Button.tsx","webpack://fider/./public/components/common/form/Form.tsx","webpack://fider/./public/components/common/form/DisplayError.tsx","webpack://fider/./public/components/common/form/Input.tsx","webpack://fider/./public/components/common/form/ImageUploader.tsx","webpack://fider/./public/components/common/form/MultiImageUploader.tsx","webpack://fider/./public/components/common/form/TextArea.tsx","webpack://fider/./public/components/common/form/RadioButton.tsx","webpack://fider/./public/components/common/form/Select.tsx","webpack://fider/./public/components/common/form/Field.tsx","webpack://fider/./public/components/common/form/Checkbox.tsx","webpack://fider/./public/components/common/form/ImageViewer.tsx","webpack://fider/./public/components/common/Markdown.tsx","webpack://fider/./public/components/common/DevBanner.tsx","webpack://fider/./public/components/common/Avatar.tsx","webpack://fider/./public/components/common/AvatarStack.tsx","webpack://fider/./public/components/common/Message.tsx","webpack://fider/./public/components/common/Hint.tsx","webpack://fider/./public/components/common/Legal.tsx","webpack://fider/./public/components/common/SocialSignInButton.tsx","webpack://fider/./public/components/common/SignInControl.tsx","webpack://fider/./public/components/common/Moment.tsx","webpack://fider/./public/components/common/Modal.tsx","webpack://fider/./public/components/common/UserName.tsx","webpack://fider/./public/components/common/Loader.tsx","webpack://fider/./public/components/common/Logo.tsx","webpack://fider/./public/components/common/Toggle.tsx","webpack://fider/./public/components/common/PoweredByFider.tsx","webpack://fider/./public/components/common/PageTitle.tsx","webpack://fider/./public/components/common/Dropdown.tsx","webpack://fider/./public/components/common/Money.tsx","webpack://fider/./public/components/ShowTag.tsx","webpack://fider/./public/components/Header.tsx","webpack://fider/./public/components/SignInModal.tsx","webpack://fider/./public/components/VoteCounter.tsx","webpack://fider/./public/components/NotificationIndicator.tsx","webpack://fider/./public/components/UserMenu.tsx","webpack://fider/./public/components/Reactions.tsx","webpack://fider/./public/components/ReadOnlyNotice.tsx","webpack://fider/./public/components/layout/Stack.tsx","webpack://fider/./public/components/layout/Divider.tsx","webpack://fider/./public/models/post.ts","webpack://fider/./public/models/identity.ts","webpack://fider/./public/models/settings.ts","webpack://fider/./public/models/billing.ts","webpack://fider/./public/models/webhook.ts","webpack://fider/./public/services/http.ts","webpack://fider/./public/services/cache.ts","webpack://fider/./public/services/analytics.ts","webpack://fider/./public/services/fider.ts","webpack://fider/./public/services/jwt.ts","webpack://fider/./public/services/utils.ts","webpack://fider/./public/services/i18n.ts","webpack://fider/./public/services/markdown.ts","webpack://fider/./public/services/notify.ts","webpack://fider/./public/services/navigator.ts","webpack://fider/./public/services/querystring.ts","webpack://fider/./public/services/device.ts","webpack://fider/./public/services/actions/user.ts","webpack://fider/./public/services/actions/tag.ts","webpack://fider/./public/services/actions/post.ts","webpack://fider/./public/services/actions/tenant.ts","webpack://fider/./public/services/actions/notification.ts","webpack://fider/./public/services/actions/invite.ts","webpack://fider/./public/services/actions/infra.ts","webpack://fider/./public/services/actions/webhook.ts","webpack://fider/./public/services/actions/billing.ts","webpack://fider/./public/services/toastify.tsx"],"sourcesContent":["import \"./HoverInfo.scss\"\n\nimport React from \"react\"\nimport { Icon } from \"./Icon\"\n\nimport IconInformationCircle from \"@fider/assets/images/heroicons-information-circle.svg\"\nimport { classSet } from \"@fider/services\"\n\ninterface InfoProps {\n  text: string\n  onClick?: () => void\n  href?: string\n  target?: \"_self\" | \"_blank\" | \"_parent\" | \"_top\"\n}\n\nexport const HoverInfo = (props: InfoProps) => {\n  const Elem = props.href ? \"a\" : \"span\"\n  const classList = classSet({\n    \"c-hoverinfo\": true,\n    clickable: props.onClick !== undefined,\n  })\n  return (\n    <Elem className={classList} data-tooltip={props.text} onClick={props.onClick} href={props.href} target={props.target}>\n      <Icon width=\"15\" height=\"15\" className=\"c-hoverinfo__icon\" sprite={IconInformationCircle} />\n    </Elem>\n  )\n}\n","import React from \"react\"\n\ninterface IconProps {\n  sprite: SpriteSymbol | string\n  height?: string\n  width?: string\n  className?: string\n  onClick?: () => void\n}\n\nexport const Icon = (props: IconProps) => {\n  if (typeof props.sprite === \"string\") {\n    const styles = { height: props.height && `${props.height}px`, width: props.width && `${props.width}px` }\n    return <img style={styles} height={props.height} width={props.width} className={props.className} src={props.sprite} />\n  }\n\n  return (\n    <svg onClick={props.onClick} height={props.height} width={props.width} className={props.className} viewBox={props.sprite.viewBox}>\n      <use xlinkHref={\"#\" + props.sprite.id} />\n    </svg>\n  )\n}\n","import { MentionNodeAttrs } from \"@tiptap/extension-mention\"\nimport \"./MentionList.scss\"\n\nimport React, { forwardRef, useEffect, useImperativeHandle, useState } from \"react\"\n\ninterface Props {\n  items: MentionNodeAttrs[]\n  command?: (item: MentionNodeAttrs) => void\n}\n\nexport interface MentionListHandle {\n  onKeyDown: (args: { event: KeyboardEvent }) => boolean\n}\n\nconst MentionList = forwardRef<MentionListHandle, Props>((props, ref) => {\n  const [selectedIndex, setSelectedIndex] = useState(0)\n\n  const selectItem = (index: number) => {\n    const item = props.items?.[index]\n\n    if (item) {\n      props.command?.(item)\n    }\n  }\n  const upHandler = () => {\n    setSelectedIndex((selectedIndex + props.items.length - 1) % props.items.length)\n  }\n\n  const downHandler = () => {\n    setSelectedIndex((selectedIndex + 1) % props.items.length)\n  }\n\n  const enterHandler = () => {\n    selectItem(selectedIndex)\n  }\n\n  useEffect(() => setSelectedIndex(0), [props.items])\n\n  useImperativeHandle(ref, () => ({\n    onKeyDown: ({ event }: { event: KeyboardEvent }): boolean => {\n      if (event.key === \"ArrowUp\") {\n        upHandler()\n        return true\n      }\n\n      if (event.key === \"ArrowDown\") {\n        downHandler()\n        return true\n      }\n\n      if (event.key === \"Enter\") {\n        enterHandler()\n        return true\n      }\n\n      return false\n    },\n  }))\n\n  return (\n    <div className=\"dropdown-menu\">\n      {props.items.length ? (\n        props.items.map((item, index) => (\n          <button className={`${index === selectedIndex ? \"is-selected\" : \"\"}`} key={index} onClick={() => selectItem(index)}>\n            {item.label}\n          </button>\n        ))\n      ) : (\n        <div className=\"item\">No result</div>\n      )}\n    </div>\n  )\n})\n\nMentionList.displayName = \"MentionList\"\n\nexport default MentionList\n","import { ReactRenderer } from \"@tiptap/react\"\nimport { actions } from \"@fider/services\"\n\nimport MentionList, { MentionListHandle } from \"./MentionList\"\nimport { MentionNodeAttrs } from \"@tiptap/extension-mention\"\ninterface MentionListProps {\n  items: any[]\n  command?: (item: MentionNodeAttrs) => void\n}\n\n// Cache for storing users\nlet cachedUsers: MentionNodeAttrs[] = []\n\nexport default {\n  items: async ({ query }: { query: string }) => {\n    // If we don't have cached users yet, fetch them\n    if (cachedUsers.length === 0) {\n      const result = await actions.getTaggableUsers(\"\")\n      if (result.ok) {\n        cachedUsers = result.data.map((user) => ({ id: user.id.toString(), label: user.name }))\n      }\n    }\n\n    // Filter the cached users based on the query\n    return cachedUsers.filter((item) => item.label?.toLowerCase().startsWith(query.toLowerCase())).slice(0, 5)\n  },\n  render: () => {\n    let reactRenderer: ReactRenderer<MentionListHandle, MentionListProps>\n    let containerElement: HTMLElement | null = null\n    let scrollListener: EventListener | null = null\n    let clickOutsideListener: EventListener | null = null\n    let initialPosition: { top: number; left: number } | null = null\n\n    return {\n      onStart: (props: { editor: any; clientRect?: (() => DOMRect | null) | null }) => {\n        reactRenderer = new ReactRenderer(MentionList, {\n          props,\n          editor: props.editor,\n        })\n\n        if (!props.clientRect) {\n          return\n        }\n        // Add click outside listener\n        clickOutsideListener = (event: Event) => {\n          if (event instanceof MouseEvent && containerElement && event.target instanceof Node && !containerElement.contains(event.target)) {\n            // Click was outside the container, clean up\n            if (scrollListener) {\n              window.removeEventListener(\"scroll\", scrollListener)\n            }\n            if (clickOutsideListener) {\n              document.removeEventListener(\"click\", clickOutsideListener)\n            }\n            if (containerElement && containerElement.parentNode) {\n              document.body.removeChild(containerElement)\n              containerElement = null\n            }\n\n            // Important: Return focus to editor\n            props.editor.view.focus()\n          }\n        }\n        // Use setTimeout to avoid immediate trigger when creating the popup\n        setTimeout(() => {\n          document.addEventListener(\"click\", clickOutsideListener as EventListener)\n        }, 100)\n\n        // Create container for the suggestion list\n        containerElement = document.createElement(\"div\")\n        containerElement.style.position = \"absolute\"\n        containerElement.style.zIndex = \"1000\"\n        document.body.appendChild(containerElement)\n        containerElement.appendChild(reactRenderer.element)\n\n        // Get initial position\n        const rect = props.clientRect()\n        if (rect) {\n          // Store initial position relative to the document\n          initialPosition = {\n            top: rect.bottom + window.scrollY,\n            left: rect.left + window.scrollX,\n          }\n\n          // Set initial position\n          containerElement.style.left = `${initialPosition.left}px`\n          containerElement.style.top = `${initialPosition.top}px`\n        }\n\n        // Add scroll listener to maintain position during scrolling\n        scrollListener = () => {\n          if (containerElement && initialPosition) {\n            containerElement.style.top = `${initialPosition.top}px`\n          }\n        }\n\n        window.addEventListener(\"scroll\", scrollListener, { passive: true })\n      },\n      onUpdate(props: { clientRect?: (() => DOMRect | null) | null | undefined }) {\n        if (!props.clientRect || !containerElement) {\n          return\n        }\n\n        const rect = props.clientRect()\n        if (!rect) {\n          return\n        }\n\n        reactRenderer.updateProps(props)\n\n        // Update position\n        initialPosition = {\n          top: rect.bottom + window.scrollY,\n          left: rect.left + window.scrollX,\n        }\n\n        containerElement.style.left = `${initialPosition.left}px`\n        containerElement.style.top = `${initialPosition.top}px`\n      },\n\n      onKeyDown(props: { event: KeyboardEvent }) {\n        console.log(props.event.key)\n        if (props.event.key === \"Escape\" && containerElement) {\n          // Clean up\n          if (scrollListener) {\n            window.removeEventListener(\"scroll\", scrollListener)\n          }\n\n          document.body.removeChild(containerElement)\n          containerElement = null\n          return true\n        }\n\n        return reactRenderer.ref?.onKeyDown(props) || false\n      },\n\n      onExit() {\n        if (containerElement) {\n          if (scrollListener) {\n            window.removeEventListener(\"scroll\", scrollListener)\n          }\n          if (clickOutsideListener) {\n            document.removeEventListener(\"click\", clickOutsideListener)\n          }\n\n          document.body.removeChild(containerElement)\n          containerElement = null\n        }\n\n        reactRenderer.destroy()\n      },\n    }\n  },\n}\n","import Mention from \"@tiptap/extension-mention\"\nimport * as MarkdownIt from \"markdown-it\"\n\nexport const CustomMention = Mention.extend({\n  name: \"mention\",\n  addStorage() {\n    return {\n      markdown: {\n        serialize: (state: any, node: { attrs: { id: string; label: string } }) => {\n          state.write(`@[${node.attrs.label}]`)\n        },\n        parse: {\n          setup(markdownit: MarkdownIt) {\n            markdownit.renderer.rules.mention_open = (tokens, idx) => {\n              const token = tokens[idx]\n              const id = token.attrGet(\"id\")\n              const label = token.attrGet(\"label\")\n              return `<span data-type=\"mention\" data-id=\"${id}\" data-label=\"${label}\" class=\"mention\">`\n            }\n\n            markdownit.renderer.rules.mention_close = () => {\n              return \"</span>\"\n            }\n\n            markdownit.inline.ruler.before(\"text\", \"mention\", (state: MarkdownIt.StateInline, silent: boolean) => {\n              const match = state.src.slice(state.pos).match(/^@\\[(.+?)\\]/)\n              if (!match) return false\n              if (!silent) {\n                const label = match[1]\n                const token = state.push(\"mention_open\", \"span\", 1)\n                token.attrs = [[\"label\", label]]\n\n                // Add the text content token\n                const contentToken = state.push(\"text\", \"\", 0)\n                contentToken.content = `@${label}`\n\n                // Close the mention span\n                state.push(\"mention_close\", \"span\", -1)\n              }\n\n              state.pos += match[0].length\n              return true\n            })\n          },\n        },\n      },\n    }\n  },\n})\n","import { Editor } from \"@tiptap/react\"\nimport StarterKit from \"@tiptap/starter-kit\"\nimport React, { useState } from \"react\"\nimport { EditorContent, useEditor } from \"@tiptap/react\"\nimport { Markdown } from \"tiptap-markdown\"\nimport Placeholder from \"@tiptap/extension-placeholder\"\nimport Document from \"@tiptap/extension-document\"\nimport Paragraph from \"@tiptap/extension-paragraph\"\nimport Text from \"@tiptap/extension-text\"\nimport HardBreak from \"@tiptap/extension-hard-break\"\n\nimport \"./CommentEditor.scss\"\n\n// At the top of the file, add imports for your icons\nimport IconH2 from \"@fider/assets/images/heroicons-h2.svg\"\nimport IconH3 from \"@fider/assets/images/heroicons-h3.svg\"\nimport IconItalic from \"@fider/assets/images/heroicons-italic.svg\"\nimport IconBold from \"@fider/assets/images/heroicons-bold.svg\"\nimport IconStrike from \"@fider/assets/images/heroicons-strike.svg\"\nimport IconCode from \"@fider/assets/images/heroicons-code.svg\"\nimport IconAt from \"@fider/assets/images/heroicons-at.svg\"\nimport IconOrderedList from \"@fider/assets/images/heroicons-orderedlist.svg\"\nimport IconBulletList from \"@fider/assets/images/heroicons-bulletlist.svg\"\nimport { Icon } from \"@fider/components\"\n\nimport suggestion from \"./suggestion\"\nimport { CustomMention } from \"./CustomMention\"\nimport { Trans } from \"@lingui/react/macro\"\n\nconst MenuBar = ({\n  editor,\n  isMarkdownMode,\n  toggleMarkdownMode,\n  disabled,\n}: {\n  editor: Editor | null\n  isMarkdownMode: boolean\n  disabled: boolean\n  toggleMarkdownMode: () => void\n}) => {\n  if (!editor) {\n    return null\n  }\n\n  return (\n    <div className=\"c-editor-toolbar\">\n      <div className=\"c-editor-button-group\">\n        {/* Only show formatting buttons when not in markdown mode */}\n        {!isMarkdownMode && (\n          <>\n            <button\n              disabled={disabled}\n              type=\"button\"\n              title=\"Heading 2\"\n              onClick={() => editor.chain().focus().toggleHeading({ level: 2 }).run()}\n              className={`c-editor-button ${editor.isActive(\"heading\", { level: 2 }) ? \"is-active\" : \"\"} ${disabled ? \"is-disabled\" : \"\"}`}\n            >\n              <Icon sprite={IconH2} width=\"18\" height=\"18\" />\n            </button>\n            <button\n              disabled={disabled}\n              type=\"button\"\n              title=\"Heading 3\"\n              onClick={() => editor.chain().focus().toggleHeading({ level: 3 }).run()}\n              className={`c-editor-button ${editor.isActive(\"heading\", { level: 3 }) ? \"is-active\" : \"\"} ${disabled ? \"is-disabled\" : \"\"}`}\n            >\n              <Icon sprite={IconH3} />\n            </button>\n            <button\n              disabled={disabled}\n              type=\"button\"\n              title=\"Bold\"\n              onClick={() => editor.chain().focus().toggleBold().run()}\n              className={`c-editor-button ${editor.isActive(\"bold\") ? \"is-active\" : \"\"} ${disabled ? \"is-disabled\" : \"\"}`}\n            >\n              <Icon sprite={IconBold} />\n            </button>\n            <button\n              disabled={disabled}\n              type=\"button\"\n              title=\"Italic\"\n              onClick={() => editor.chain().focus().toggleItalic().run()}\n              className={`c-editor-button ${editor.isActive(\"italic\") ? \"is-active\" : \"\"} ${disabled ? \"is-disabled\" : \"\"}`}\n            >\n              <Icon sprite={IconItalic} />\n            </button>\n            <button\n              disabled={disabled}\n              type=\"button\"\n              title=\"Strikethrough\"\n              onClick={() => editor.chain().focus().toggleStrike().run()}\n              className={`c-editor-button ${editor.isActive(\"strike\") ? \"is-active\" : \"\"} ${disabled ? \"is-disabled\" : \"\"}`}\n            >\n              <Icon sprite={IconStrike} />\n            </button>\n            <button\n              disabled={disabled}\n              type=\"button\"\n              title=\"BulletList\"\n              onClick={() => editor.chain().focus().toggleBulletList().run()}\n              className={`c-editor-button ${editor.isActive(\"bulletList\") ? \"is-active\" : \"\"} ${disabled ? \"is-disabled\" : \"\"}`}\n            >\n              <Icon sprite={IconBulletList} />\n            </button>\n            <button\n              disabled={disabled}\n              type=\"button\"\n              title=\"OrderedList\"\n              onClick={() => editor.chain().focus().toggleOrderedList().run()}\n              className={`c-editor-button ${editor.isActive(\"orderedList\") ? \"is-active\" : \"\"} ${disabled ? \"is-disabled\" : \"\"}`}\n            >\n              <Icon sprite={IconOrderedList} />\n            </button>\n            <button\n              disabled={disabled}\n              type=\"button\"\n              title=\"Code\"\n              onClick={() => editor.chain().focus().toggleCodeBlock().run()}\n              className={`c-editor-button ${editor.isActive(\"codeBlock\") ? \"is-active\" : \"\"} ${disabled ? \"is-disabled\" : \"\"}`}\n            >\n              <Icon sprite={IconCode} />\n            </button>\n            <button\n              disabled={disabled}\n              type=\"button\"\n              title=\"Mention\"\n              onClick={() => {\n                // Get the current cursor position\n                const { from } = editor.state.selection\n                // Get the character before the cursor\n                const textBefore = editor.state.doc.textBetween(Math.max(0, from - 1), from)\n                // Insert space before @ only if the previous character isn't a space or the cursor is at the beginning\n                if (from === 0 || textBefore === \" \" || textBefore === \"\\n\") {\n                  editor.chain().focus().insertContent(\"@\").run()\n                } else {\n                  editor.chain().focus().insertContent(\" @\").run()\n                }\n              }}\n              className={`c-editor-button ${disabled ? \"is-disabled\" : \"\"}`}\n            >\n              <Icon sprite={IconAt} />\n            </button>\n          </>\n        )}\n        <button\n          disabled={disabled}\n          type=\"button\"\n          title={isMarkdownMode ? \"Rich Text Mode\" : \"Markdown Mode\"}\n          onClick={toggleMarkdownMode}\n          className={`no-focus c-markdown-toggle ${isMarkdownMode ? \"is-active\" : \"\"} ${disabled ? \"is-disabled\" : \"\"} ml-auto text-xs`}\n        >\n          <span className=\"c-editor-button-text\">\n            {isMarkdownMode ? (\n              <Trans id=\"editor.richtextmode\">Switch to rich text editor</Trans>\n            ) : (\n              <Trans id=\"editor.markdownmode\">Switch to markdown editor</Trans>\n            )}\n          </span>\n        </button>\n      </div>\n    </div>\n  )\n}\ninterface CommentEditorProps {\n  initialValue: string | null\n  placeholder?: string\n  onChange?: (value: string) => void\n  onFocus?: () => void\n  disabled: boolean\n}\n\nconst markdownToHtml = (markdownString: string) => {\n  return markdownString\n    .split(\"\\n\\n\")\n    .map((line: string) => `<p>${line}</p>`)\n    .join(\"\")\n    .replace(/\\\\\\n/g, \"<br>\")\n    .replace(/\\n/g, \"<br>\")\n}\n\nconst Tiptap: React.FunctionComponent<CommentEditorProps> = (props) => {\n  const [isRawMarkdownMode, setIsRawMarkdownMode] = useState(false)\n\n  const getIntialContent = () => {\n    if (isRawMarkdownMode) {\n      return markdownToHtml(props.initialValue ?? \"\")\n    } else {\n      return props.initialValue ?? \"\"\n    }\n  }\n\n  const [editorContent, setEditorContent] = useState(getIntialContent())\n\n  const toggleMarkdownMode = () => {\n    if (editor) {\n      // Store current content before switching\n      let currentContent\n      if (isRawMarkdownMode) {\n        currentContent = editor.getText()\n      } else {\n        currentContent = markdownToHtml(editor.storage.markdown.getMarkdown())\n      }\n      // Destroy current editor\n      editor.destroy()\n      setIsRawMarkdownMode(!isRawMarkdownMode)\n      setEditorContent(currentContent)\n    }\n  }\n\n  const updated = ({ editor }: { editor: Editor; transaction: any }): void => {\n    const markdown = isRawMarkdownMode ? editor.getText() : editor.storage.markdown.getMarkdown()\n    props.onChange && props.onChange(markdown)\n  }\n\n  const extensions = isRawMarkdownMode\n    ? [\n        // Minimal extensions for markdown mode\n        Document,\n        Paragraph,\n        Text,\n        HardBreak,\n        Placeholder.configure({\n          placeholder: props.placeholder ?? \"Write your comment here...\",\n          emptyEditorClass: \"tiptap-is-empty\",\n        }),\n      ]\n    : [\n        StarterKit,\n        Markdown.configure({\n          html: true,\n          breaks: true,\n        }),\n        CustomMention.configure({\n          HTMLAttributes: {\n            class: \"mention\",\n          },\n          suggestion,\n        }),\n        Placeholder.configure({\n          placeholder: props.placeholder ?? \"Write your comment here...\",\n          emptyEditorClass: \"tiptap-is-empty\",\n        }),\n      ]\n\n  const editor = useEditor(\n    {\n      extensions,\n      content: editorContent,\n      onUpdate: updated,\n      onFocus: () => {\n        if (props.onFocus) {\n          props.onFocus()\n        }\n      },\n      editorProps: {\n        attributes: {\n          class: isRawMarkdownMode ? \"markdown-mode no-focus\" : \"no-focus\",\n        },\n      },\n    },\n    [isRawMarkdownMode, editorContent]\n  ) // Re-initialize when mode changes\n\n  return (\n    <div className=\"fider-tiptap-editor\">\n      <MenuBar disabled={props.disabled} editor={editor} isMarkdownMode={isRawMarkdownMode} toggleMarkdownMode={toggleMarkdownMode} />\n      <EditorContent editor={editor} />\n    </div>\n  )\n}\n\nconst CommentEditor = React.memo(Tiptap, (prevProps, nextProps) => {\n  return prevProps.placeholder === nextProps.placeholder\n})\n\nexport default CommentEditor\n","import React from \"react\"\nimport { ErrorPage } from \"@fider/pages/Error/Error.page\"\nimport { FiderContext } from \"@fider/services\"\n\ninterface ErrorBoundaryProps {\n  children?: React.ReactNode\n  onError?: (err: Error) => void\n}\n\ninterface ErrorBoundaryState {\n  error?: Error\n  errorInfo?: React.ErrorInfo\n}\n\nexport class ErrorBoundary extends React.Component<ErrorBoundaryProps, ErrorBoundaryState> {\n  constructor(props: any) {\n    super(props)\n\n    this.state = {\n      error: undefined,\n      errorInfo: undefined,\n    }\n  }\n\n  public componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {\n    const onError = this.props.onError\n    if (onError) {\n      onError(error)\n    }\n\n    this.setState({\n      error,\n      errorInfo,\n    })\n  }\n\n  public render() {\n    const { error, errorInfo } = this.state\n\n    if (error && errorInfo) {\n      return <FiderContext.Consumer>{(fider) => <ErrorPage error={error} errorInfo={errorInfo} showDetails={!fider.isProduction()} />}</FiderContext.Consumer>\n    } else {\n      return this.props.children\n    }\n  }\n}\n","import React from \"react\"\nimport { PostResponse, PostStatus } from \"@fider/models\"\nimport { Icon, Markdown } from \"@fider/components\"\nimport HeroIconDuplicate from \"@fider/assets/images/heroicons-duplicate.svg\"\nimport HeroIconCheck from \"@fider/assets/images/heroicons-check-circle.svg\"\nimport HeroIconSparkles from \"@fider/assets/images/heroicons-sparkles-outline.svg\"\nimport HeroIconThumbsUp from \"@fider/assets/images/heroicons-thumbsup.svg\"\nimport HeroIconThumbsDown from \"@fider/assets/images/heroicons-thumbsdown.svg\"\nimport { HStack, VStack } from \"./layout\"\nimport { timeSince } from \"@fider/services\"\n\ninterface PostResponseProps {\n  status: string\n  response: PostResponse | null\n  small?: boolean\n}\n\nexport const ResponseDetails = (props: PostResponseProps): JSX.Element | null => {\n  const status = PostStatus.Get(props.status)\n\n  if (!props.response || status === PostStatus.Open) {\n    return null\n  }\n\n  return (\n    <VStack align=\"start\" spacing={4} className=\"bg-blue-50 p-3 border border-blue-200 rounded\">\n      <ResponseLozenge response={props.response} status={props.status} />\n      <div className=\"text-semibold text-lg\">{timeSince(\"en\", new Date(), props.response.respondedAt, \"date\")}</div>\n      {props.response?.text && status !== PostStatus.Duplicate && (\n        <div className=\"content\">\n          <Markdown text={props.response.text} style=\"full\" />\n        </div>\n      )}\n\n      {status === PostStatus.Duplicate && props.response.original && (\n        <div className=\"content\">\n          <a className=\"text-link\" href={`/posts/${props.response.original.number}/${props.response.original.slug}`}>\n            {props.response.original.title}\n          </a>\n        </div>\n      )}\n    </VStack>\n  )\n}\n\nconst getLozengeProps = (status: PostStatus): { icon: SpriteSymbol; bg: string; color: string; border: string } => {\n  switch (status) {\n    case PostStatus.Declined:\n      return { icon: HeroIconThumbsDown, bg: \"bg-red-100\", color: \"text-red-800\", border: \"border-red-300\" }\n    case PostStatus.Duplicate:\n      return { icon: HeroIconDuplicate, bg: \"bg-yellow-100\", color: \"text-yellow-800\", border: \"border-yellow-400\" }\n    case PostStatus.Completed:\n      return { icon: HeroIconCheck, bg: \"bg-green-300\", color: \"text-green-800\", border: \"border-green-500\" }\n    case PostStatus.Planned:\n      return { icon: HeroIconThumbsUp, bg: \"bg-blue-100\", color: \"text-blue-700\", border: \"border-blue-400\" }\n    default:\n      return { icon: HeroIconSparkles, bg: \"bg-green-100\", color: \"text-green-700\", border: \"border-green-400\" }\n  }\n}\n\nexport const ResponseLozenge = (props: PostResponseProps): JSX.Element | null => {\n  const status = PostStatus.Get(props.status)\n  const { icon, bg, color, border } = getLozengeProps(status)\n\n  if (status === PostStatus.Open) {\n    return <div />\n  }\n\n  return (\n    <div>\n      <HStack align=\"start\" className={`${color} ${bg} border ${border} rounded-full p-1 px-3`}>\n        {!props.small && <Icon sprite={icon} className={`h-5 c-status-col--${status.value}`} />}\n        <span className={`c-status-col--${status.value} ${props.small ? \"text-sm\" : \"text-semibold\"}`}>{status.title}</span>\n      </HStack>\n    </div>\n  )\n}\n","// import \"./ShowPostStatus.scss\"\n\nimport React from \"react\"\nimport { PostStatus } from \"@fider/models\"\nimport { i18n } from \"@lingui/core\"\n\ninterface ShowPostStatusProps {\n  status: PostStatus\n}\n\nexport const ShowPostStatus = (props: ShowPostStatusProps) => {\n  const id = `enum.poststatus.${props.status.value}`\n  const title = i18n._(id, { message: props.status.title })\n\n  return <span className={`c-status-label c-status-label--${props.status.value}`}>{title}</span>\n}\n","import \"./Button.scss\"\n\nimport React, { useEffect, useRef, useState } from \"react\"\nimport { classSet } from \"@fider/services\"\n\ninterface ButtonProps {\n  children?: React.ReactNode\n  className?: string\n  disabled?: boolean\n  href?: string\n  rel?: \"nofollow\"\n  target?: \"_self\" | \"_blank\" | \"_parent\" | \"_top\"\n  type?: \"button\" | \"submit\"\n  variant?: \"primary\" | \"danger\" | \"secondary\" | \"tertiary\"\n  size?: \"small\" | \"default\" | \"large\"\n  style?: React.CSSProperties\n  onClick?: (event: ButtonClickEvent) => Promise<any> | void\n}\n\nexport class ButtonClickEvent {\n  private shouldEnable = true\n  public preventEnable(): void {\n    this.shouldEnable = false\n  }\n  public canEnable(): boolean {\n    return this.shouldEnable\n  }\n}\n\nexport const Button: React.FC<ButtonProps> = ({ size = \"default\", variant = \"secondary\", type = \"button\", ...props }) => {\n  const [clicked, setClicked] = useState(false)\n  const unmountedContainer = useRef(false)\n\n  useEffect(() => {\n    return () => {\n      unmountedContainer.current = true\n    }\n  }, [])\n\n  const className = classSet({\n    \"c-button\": true,\n    [`c-button--${size}`]: size,\n    [`c-button--${variant}`]: variant,\n    \"c-button--loading\": clicked,\n    \"c-button--disabled\": clicked || props.disabled,\n    [props.className || \"\"]: props.className,\n  })\n\n  let buttonContent: JSX.Element\n  const onClickProp = props.onClick\n\n  if (props.href) {\n    buttonContent = (\n      <a href={props.href} rel={props.rel} target={props.target} className={className} style={props.style}>\n        {props.children}\n      </a>\n    )\n  } else if (onClickProp) {\n    const onClick = async (e?: React.SyntheticEvent<HTMLElement>) => {\n      if (e) {\n        e.preventDefault()\n        e.stopPropagation()\n      }\n\n      if (clicked) {\n        return\n      }\n\n      const event = new ButtonClickEvent()\n      setClicked(true)\n\n      await onClickProp(event)\n\n      if (!unmountedContainer.current && event.canEnable()) {\n        setClicked(false)\n      }\n    }\n\n    buttonContent = (\n      <button type={type} className={className} onClick={onClick} style={props.style}>\n        {props.children}\n      </button>\n    )\n  } else {\n    buttonContent = (\n      <button type={type} className={className} style={props.style}>\n        {props.children}\n      </button>\n    )\n  }\n\n  return buttonContent\n}\n","import \"./Form.scss\"\n\nimport React from \"react\"\nimport { Failure, classSet } from \"@fider/services\"\nimport { DisplayError } from \"@fider/components\"\n\ninterface ValidationContext {\n  error?: Failure\n}\n\ninterface FormProps {\n  children?: React.ReactNode\n  className?: string\n  error?: Failure\n}\n\nexport const ValidationContext = React.createContext<ValidationContext>({})\n\nexport const Form: React.FunctionComponent<FormProps> = (props) => {\n  const className = classSet({\n    \"c-form\": true,\n    [props.className || \"\"]: props.className,\n  })\n\n  return (\n    <form autoComplete=\"off\" className={className}>\n      <DisplayError error={props.error} />\n      <ValidationContext.Provider value={{ error: props.error }}>{props.children}</ValidationContext.Provider>\n    </form>\n  )\n}\n","import React from \"react\"\nimport { Failure } from \"@fider/services\"\n\nimport \"./DisplayError.scss\"\n\nconst arrayToTag = (items: string[]) => {\n  return items.map((m) => <li key={m}>{m}</li>)\n}\n\ninterface DisplayErrorProps {\n  error?: Failure\n  fields?: string[]\n}\n\nexport const hasError = (field?: string, error?: Failure): boolean => {\n  if (field && error && error.errors) {\n    for (const err of error.errors) {\n      if (err.field === field) {\n        return true\n      }\n    }\n  }\n  return false\n}\n\nexport const DisplayError = (props: DisplayErrorProps) => {\n  if (!props.error || !props.error.errors) {\n    return null\n  }\n\n  const dict = props.error.errors.reduce((result, err) => {\n    result[err.field || \"\"] = result[err.field || \"\"] || []\n    result[err.field || \"\"].push(err.message)\n    return result\n  }, {} as { [key: string]: string[] })\n\n  let items: JSX.Element[] = []\n\n  if (dict[\"\"] && !props.fields) {\n    items = arrayToTag(dict[\"\"])\n  } else if (props.fields) {\n    for (const field of props.fields || Object.keys(dict)) {\n      if (Object.prototype.hasOwnProperty.call(dict, field)) {\n        const tags = arrayToTag(dict[field])\n        tags.forEach((t) => items.push(t))\n      }\n    }\n  }\n\n  return items.length > 0 ? (\n    <div className={`c-form-error`}>\n      <ul>{items}</ul>\n    </div>\n  ) : null\n}\n","import React from \"react\"\nimport { classSet } from \"@fider/services\"\nimport { ValidationContext } from \"./Form\"\nimport { DisplayError, hasError } from \"./DisplayError\"\nimport { Icon } from \"@fider/components\"\n\nimport \"./Input.scss\"\nimport { HStack } from \"@fider/components/layout\"\n\ninterface InputProps {\n  children?: React.ReactNode\n  field: string\n  label?: string\n  className?: string\n  autoComplete?: string\n  autoFocus?: boolean\n  noTabFocus?: boolean\n  afterLabel?: JSX.Element\n  icon?: SpriteSymbol\n  maxLength?: number\n  value?: string\n  disabled?: boolean\n  suffix?: string | JSX.Element\n  placeholder?: string\n  onIconClick?: () => void\n  onFocus?: () => void\n  inputRef?: React.MutableRefObject<any>\n  onChange?: (value: string) => void\n}\n\nexport const Input: React.FunctionComponent<InputProps> = (props) => {\n  const onChange = (e: React.FormEvent<HTMLInputElement>) => {\n    if (props.onChange) {\n      props.onChange(e.currentTarget.value)\n    }\n  }\n\n  const suffix = typeof props.suffix === \"string\" ? <span className=\"c-input__suffix\">{props.suffix}</span> : props.suffix\n\n  const icon = props.icon ? <Icon sprite={props.icon} onClick={props.onIconClick} className={classSet({ clickable: !!props.onIconClick })} /> : undefined\n\n  return (\n    <ValidationContext.Consumer>\n      {(ctx) => (\n        <div\n          className={classSet({\n            \"c-form-field\": true,\n            [`${props.className}`]: props.className,\n          })}\n        >\n          {!!props.label && (\n            <label htmlFor={`input-${props.field}`}>\n              {props.label}\n              {props.afterLabel}\n            </label>\n          )}\n          <HStack spacing={0} align={props.icon ? \"center\" : \"start\"} className=\"relative\">\n            <input\n              className={classSet({\n                \"c-input\": true,\n                \"c-input--icon\": !!props.icon,\n                \"c-input--error\": hasError(props.field, ctx.error),\n                \"c-input--suffixed\": !!suffix,\n              })}\n              id={`input-${props.field}`}\n              type=\"text\"\n              autoComplete={props.autoComplete}\n              tabIndex={props.noTabFocus ? -1 : undefined}\n              ref={props.inputRef}\n              autoFocus={props.autoFocus}\n              onFocus={props.onFocus}\n              maxLength={props.maxLength}\n              disabled={props.disabled}\n              value={props.value}\n              placeholder={props.placeholder}\n              onChange={onChange}\n            />\n            {icon}\n            {suffix}\n          </HStack>\n          <DisplayError fields={[props.field]} error={ctx.error} />\n          {props.children}\n        </div>\n      )}\n    </ValidationContext.Consumer>\n  )\n}\n","import \"./ImageUploader.scss\"\n\nimport React from \"react\"\nimport { ValidationContext } from \"./Form\"\nimport { DisplayError, hasError } from \"./DisplayError\"\nimport { classSet, fileToBase64, uploadedImageURL } from \"@fider/services\"\nimport { Button, Icon, Modal } from \"@fider/components\"\nimport { ImageUpload } from \"@fider/models\"\nimport IconPhotograph from \"@fider/assets/images/heroicons-photograph.svg\"\n\nconst hardFileSizeLimit = 5 * 1024 * 1024\n\ninterface ImageUploaderProps {\n  children?: React.ReactNode\n  instanceID?: string\n  field: string\n  label?: string\n  bkey?: string\n  disabled?: boolean\n  onChange(state: ImageUpload, instanceID?: string, previewURL?: string): void\n}\n\ninterface ImageUploaderState extends ImageUpload {\n  previewURL?: string\n  showModal: boolean\n}\n\nexport class ImageUploader extends React.Component<ImageUploaderProps, ImageUploaderState> {\n  private fileSelector?: HTMLInputElement | null\n\n  constructor(props: ImageUploaderProps) {\n    super(props)\n    this.state = {\n      upload: undefined,\n      remove: false,\n      showModal: false,\n      previewURL: uploadedImageURL(this.props.bkey),\n    }\n  }\n\n  public fileChanged = async (e: React.ChangeEvent<HTMLInputElement>) => {\n    if (e.target.files && e.target.files[0]) {\n      const file = e.target.files[0]\n      if (file.size > hardFileSizeLimit) {\n        alert(\"The image size must be smaller than 5MB.\")\n        return\n      }\n\n      const base64 = await fileToBase64(file)\n      this.setState(\n        {\n          bkey: this.props.bkey,\n          upload: {\n            fileName: file.name,\n            content: base64,\n            contentType: file.type,\n          },\n          remove: false,\n          previewURL: `data:${file.type};base64,${base64}`,\n        },\n        () => {\n          this.props.onChange(this.state, this.props.instanceID, this.state.previewURL)\n        }\n      )\n    }\n  }\n\n  public removeFile = async () => {\n    if (this.fileSelector) {\n      this.fileSelector.value = \"\"\n    }\n\n    this.setState(\n      {\n        bkey: this.props.bkey,\n        remove: true,\n        upload: undefined,\n        previewURL: undefined,\n      },\n      () => {\n        this.props.onChange(\n          {\n            bkey: this.state.bkey,\n            remove: this.state.remove,\n            upload: this.state.upload,\n          },\n          this.props.instanceID,\n          this.state.previewURL\n        )\n      }\n    )\n  }\n\n  public selectFile = async () => {\n    if (this.fileSelector) {\n      this.fileSelector.click()\n    }\n  }\n\n  private openModal = () => {\n    this.setState({ showModal: true })\n  }\n\n  private closeModal = async () => {\n    this.setState({ showModal: false })\n  }\n\n  private modal() {\n    return (\n      <Modal.Window className=\"c-image-viewer-modal\" isOpen={this.state.showModal} onClose={this.closeModal} center={false} size=\"fluid\">\n        <Modal.Content>{this.props.bkey ? <img alt=\"\" src={uploadedImageURL(this.props.bkey)} /> : <img alt=\"\" src={this.state.previewURL} />}</Modal.Content>\n\n        <Modal.Footer>\n          <Button variant=\"tertiary\" onClick={this.closeModal}>\n            Close\n          </Button>\n        </Modal.Footer>\n      </Modal.Window>\n    )\n  }\n\n  public render() {\n    const isUploading = !!this.state.upload\n    const hasFile = (!this.state.remove && this.props.bkey) || isUploading\n\n    return (\n      <ValidationContext.Consumer>\n        {(ctx) => (\n          <div\n            className={classSet({\n              \"c-form-field\": true,\n              \"c-image-upload\": true,\n              \"m-error\": hasError(this.props.field, ctx.error),\n            })}\n          >\n            {this.modal()}\n            {this.props.label && <label htmlFor={`input-${this.props.field}`}>{this.props.label}</label>}\n\n            {hasFile && (\n              <div className=\"preview h-20\">\n                <img alt=\"\" onClick={this.openModal} src={this.state.previewURL} />\n                {!this.props.disabled && (\n                  <Button onClick={this.removeFile} variant=\"danger\">\n                    X\n                  </Button>\n                )}\n              </div>\n            )}\n\n            <input ref={(e) => (this.fileSelector = e)} type=\"file\" onChange={this.fileChanged} accept=\"image/*\" />\n            {!hasFile && (\n              <Button onClick={this.selectFile} disabled={this.props.disabled}>\n                <Icon sprite={IconPhotograph} />\n              </Button>\n            )}\n            <DisplayError fields={[this.props.field]} error={ctx.error} />\n            {this.props.children}\n          </div>\n        )}\n      </ValidationContext.Consumer>\n    )\n  }\n}\n","import React from \"react\"\nimport { ImageUploader } from \"./ImageUploader\"\nimport { ImageUpload } from \"@fider/models\"\nimport { ValidationContext, hasError, DisplayError } from \"@fider/components\"\nimport { classSet } from \"@fider/services\"\n\nimport \"./MultiImageUploader.scss\"\n\ninterface MultiImageUploaderProps {\n  field: string\n  maxUploads: number\n  bkeys?: string[]\n  onChange?: (uploads: ImageUpload[]) => void\n}\n\ninterface MultiImageUploaderInstances {\n  [key: string]: {\n    element: JSX.Element\n    upload?: ImageUpload\n  }\n}\n\ninterface MultiImageUploaderState {\n  count: number\n  instances: MultiImageUploaderInstances\n  removed: ImageUpload[]\n}\n\nexport class MultiImageUploader extends React.Component<MultiImageUploaderProps, MultiImageUploaderState> {\n  constructor(props: MultiImageUploaderProps) {\n    super(props)\n\n    let count = 1\n    const instances = {}\n    if (props.bkeys) {\n      for (const bkey of props.bkeys) {\n        count++\n        this.addNewElement(instances, bkey)\n      }\n    }\n\n    if (count <= this.props.maxUploads) {\n      count++\n      this.addNewElement(instances)\n    }\n\n    this.state = { instances, count, removed: [] }\n  }\n\n  private imageUploaded = (upload: ImageUpload, instanceID: string) => {\n    const instances = { ...this.state.instances }\n    const removed = [...this.state.removed]\n    let count = this.state.count\n    if (upload.remove) {\n      if (upload.bkey) {\n        removed.push(upload)\n      }\n      delete instances[instanceID]\n      if (--count === this.props.maxUploads) {\n        this.addNewElement(instances)\n      }\n    } else {\n      instances[instanceID].upload = upload\n      if (count++ <= this.props.maxUploads) {\n        this.addNewElement(instances)\n      }\n    }\n    this.setState({ instances, count, removed }, this.triggerOnChange)\n  }\n\n  private triggerOnChange() {\n    if (this.props.onChange) {\n      const uploads = Object.keys(this.state.instances)\n        .map((k) => this.state.instances[k].upload)\n        .concat(this.state.removed)\n        .filter((x) => !!x) as ImageUpload[]\n      this.props.onChange(uploads)\n    }\n  }\n\n  private addNewElement(instances: MultiImageUploaderInstances, bkey?: string) {\n    const id = btoa(Math.random().toString())\n    instances[id] = {\n      element: <ImageUploader key={id} bkey={bkey} instanceID={id} field=\"attachment\" onChange={this.imageUploaded} />,\n    }\n  }\n\n  public render() {\n    const elements = Object.keys(this.state.instances).map((k) => this.state.instances[k].element)\n    return (\n      <ValidationContext.Consumer>\n        {(ctx) => (\n          <div\n            className={classSet({\n              \"c-form-field\": true,\n              \"c-multi-image-uploader\": true,\n              \"m-error\": hasError(this.props.field, ctx.error),\n            })}\n          >\n            <div className=\"c-multi-image-uploader-instances\">{elements}</div>\n            <DisplayError fields={[this.props.field]} error={ctx.error} />\n          </div>\n        )}\n      </ValidationContext.Consumer>\n    )\n  }\n}\n","import React from \"react\"\nimport { classSet } from \"@fider/services\"\nimport { ValidationContext } from \"../\"\nimport { DisplayError, hasError } from \"./DisplayError\"\nimport Textarea from \"react-textarea-autosize\"\n\nimport \"./TextArea.scss\"\n\ninterface TextAreaProps {\n  children?: React.ReactNode\n  label?: string\n  field: string\n  value?: string\n  disabled?: boolean\n  minRows?: number\n  placeholder?: string\n  afterLabel?: JSX.Element\n  onChange?: (value: string, selectionStart?: number) => void\n  onKeyDown?: (e: React.KeyboardEvent<HTMLTextAreaElement>) => void\n  inputRef?: React.MutableRefObject<any>\n  onFocus?: React.FocusEventHandler<HTMLTextAreaElement>\n  className?: string\n}\n\nexport const TextArea: React.FunctionComponent<TextAreaProps> = (props) => {\n  const onChange = (e: React.FormEvent<HTMLTextAreaElement>) => {\n    if (props.onChange) {\n      props.onChange(e.currentTarget.value, e.currentTarget.selectionStart)\n    }\n  }\n\n  const onKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n    if (props.onKeyDown) {\n      props.onKeyDown(e)\n    }\n  }\n\n  return (\n    <ValidationContext.Consumer>\n      {(ctx) => (\n        <>\n          <div className=\"c-form-field\">\n            {!!props.label && (\n              <label htmlFor={`input-${props.field}`}>\n                {props.label}\n                {props.afterLabel}\n              </label>\n            )}\n            <Textarea\n              className={classSet({\n                \"c-textarea\": true,\n                \"c-textarea--error\": hasError(props.field, ctx.error),\n                [props.className || \"\"]: props.className,\n              })}\n              id={`input-${props.field}`}\n              disabled={props.disabled}\n              onChange={onChange}\n              onKeyDown={onKeyDown}\n              value={props.value}\n              minRows={props.minRows || 3}\n              placeholder={props.placeholder}\n              ref={props.inputRef}\n              onFocus={props.onFocus}\n            />\n            <DisplayError fields={[props.field]} error={ctx.error} />\n            {props.children}\n          </div>\n        </>\n      )}\n    </ValidationContext.Consumer>\n  )\n}\n","import { HStack, VStack } from \"@fider/components/layout\"\nimport React, { useState } from \"react\"\n\nimport \"./RadioButton.scss\"\n\ninterface RadioButtonOption {\n  value: string\n  label: string\n}\n\ninterface RadioButtonProps {\n  label: string\n  field: string\n  defaultOption: RadioButtonOption\n  options: RadioButtonOption[]\n  onSelect?: (value: RadioButtonOption) => void\n}\n\nexport const RadioButton = (props: RadioButtonProps) => {\n  const [selected, setSelected] = useState(props.defaultOption)\n\n  const onChange = (option: RadioButtonOption) => () => {\n    setSelected(option)\n    props.onSelect?.(option)\n  }\n\n  const inputs = props.options.map((option) => (\n    <HStack key={option.value} className=\"text-sm\">\n      <input id={`visibility-${option.value}`} type=\"radio\" name={`input-${props.field}`} checked={selected === option} onChange={onChange(option)} />\n      <label htmlFor={`visibility-${option.value}`}>{option.label}</label>\n    </HStack>\n  ))\n\n  return (\n    <div className=\"c-form-field\">\n      <label htmlFor={`input-${props.field}`}>{props.label}</label>\n      <VStack className=\"c-radiobutton\">{inputs}</VStack>\n    </div>\n  )\n}\n","import React from \"react\"\nimport { classSet } from \"@fider/services\"\nimport { ValidationContext } from \"./Form\"\nimport { DisplayError, hasError } from \"./DisplayError\"\n\nimport \"./Select.scss\"\n\nexport interface SelectOption {\n  value: string\n  label: string\n}\n\ninterface SelectProps {\n  children?: React.ReactNode\n  field: string\n  label?: string\n  maxLength?: number\n  defaultValue?: string\n  options: SelectOption[]\n  onChange?: (option?: SelectOption) => void\n}\n\nexport const Select: React.FunctionComponent<SelectProps> = (props) => {\n  const getOption = (value?: string) => {\n    if (value && props.options) {\n      const filtered = props.options.filter((x) => x.value === value)\n      if (filtered && filtered.length > 0) {\n        return filtered[0]\n      }\n    }\n  }\n  const [selected, setSelected] = React.useState<SelectOption | undefined>(getOption(props.defaultValue))\n  const onChange = (e: React.FormEvent<HTMLSelectElement>) => {\n    let selected: SelectOption | undefined\n    if (e.currentTarget.value) {\n      const options = props.options.filter((o) => o.value === e.currentTarget.value)\n      if (options && options.length > 0) {\n        selected = options[0]\n      }\n    }\n\n    setSelected(selected)\n    if (props.onChange) {\n      props.onChange(selected)\n    }\n  }\n\n  return (\n    <ValidationContext.Consumer>\n      {(ctx) => (\n        <>\n          <div className=\"c-form-field\">\n            {!!props.label && <label htmlFor={`input-${props.field}`}>{props.label}</label>}\n            <select\n              className={classSet({\n                \"c-select\": true,\n                \"c-select--error\": hasError(props.field, ctx.error),\n              })}\n              value={selected?.value}\n              id={`input-${props.field}`}\n              defaultValue={props.defaultValue}\n              onChange={onChange}\n            >\n              {props.options.map((option) => (\n                <option key={option.value} value={option.value}>\n                  {option.label}\n                </option>\n              ))}\n            </select>\n            <DisplayError fields={[props.field]} error={ctx.error} />\n            {props.children}\n          </div>\n        </>\n      )}\n    </ValidationContext.Consumer>\n  )\n}\n","import React from \"react\"\nimport { classSet } from \"@fider/services\"\nimport { ValidationContext } from \"./Form\"\nimport { DisplayError, hasError } from \"./DisplayError\"\n\ninterface FieldProps {\n  children?: React.ReactNode\n  className?: string\n  label?: string\n  field?: string\n  afterLabel?: JSX.Element\n}\n\nexport const Field: React.FunctionComponent<FieldProps> = (props) => {\n  const fields = props.field ? [props.field] : undefined\n  return (\n    <ValidationContext.Consumer>\n      {(ctx) => (\n        <div\n          className={classSet({\n            \"c-form-field\": true,\n            \"m-error\": hasError(props.field, ctx.error),\n            [props.className || \"\"]: props.className,\n          })}\n        >\n          {!!props.label && (\n            <label>\n              {props.label}\n              {props.afterLabel}\n            </label>\n          )}\n          {props.children}\n          <DisplayError fields={fields} error={ctx.error} />\n        </div>\n      )}\n    </ValidationContext.Consumer>\n  )\n}\n","import React, { useState } from \"react\"\nimport { classSet } from \"@fider/services\"\nimport { DisplayError, ValidationContext, hasError } from \"../\"\nimport { HStack } from \"@fider/components/layout\"\n\nimport \"./Checkbox.scss\"\n\ninterface CheckboxProps {\n  children?: React.ReactNode\n  field: string\n  checked?: boolean\n  onChange?: (checked: boolean) => void\n}\n\nexport const Checkbox: React.FC<CheckboxProps> = (props) => {\n  const [checked, setChecked] = useState<boolean>(props.checked || false)\n\n  const onChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n    const isChecked: boolean = e.currentTarget.checked\n\n    setChecked(isChecked)\n    if (props.onChange) {\n      props.onChange(isChecked)\n    }\n  }\n\n  return (\n    <ValidationContext.Consumer>\n      {(ctx) => (\n        <div\n          className={classSet({\n            \"c-form-field\": true,\n            \"m-error\": hasError(props.field, ctx.error),\n          })}\n        >\n          <div className=\"c-checkbox\">\n            <HStack>\n              <input id={`input-${props.field}`} type=\"checkbox\" checked={checked} onChange={onChange} />\n              <label htmlFor={`input-${props.field}`} className=\"text-sm\">\n                {props.children}\n              </label>\n            </HStack>\n            <DisplayError fields={[props.field]} error={ctx.error} />\n          </div>\n        </div>\n      )}\n    </ValidationContext.Consumer>\n  )\n}\n","import React, { useState } from \"react\"\nimport { uploadedImageURL } from \"@fider/services\"\nimport { Modal, Button, Loader } from \"@fider/components\"\n\nimport \"./ImageViewer.scss\"\nimport { Trans } from \"@lingui/react/macro\"\n\ninterface ImageViewerModalProps {\n  isOpen: boolean\n  imgSrc: string | undefined\n  loadedPreview: boolean\n  onPreviewLoad: () => void\n  onClose: () => void\n}\n\nconst ImageViewerModal = (props: ImageViewerModalProps) => (\n  <Modal.Window className=\"c-image-viewer-modal\" isOpen={props.isOpen} onClose={props.onClose} center={false} size=\"fluid\">\n    <Modal.Content>\n      {!props.loadedPreview && <Loader />}\n      <img alt=\"\" onLoad={props.onPreviewLoad} src={props.imgSrc} />\n    </Modal.Content>\n\n    <Modal.Footer>\n      <Button variant=\"tertiary\" onClick={props.onClose}>\n        <Trans id=\"action.close\">Close</Trans>\n      </Button>\n    </Modal.Footer>\n  </Modal.Window>\n)\n\ninterface ImageViewerProps {\n  bkey: string\n}\n\nexport const ImageViewer = (props: ImageViewerProps) => {\n  const [showModal, setShowModal] = useState(false)\n  const [loadedThumbnail, setLoadedThumbnail] = useState(false)\n  const [loadedPreview, setLoadedPreview] = useState(false)\n\n  const openModal = () => {\n    if (loadedThumbnail) {\n      setShowModal(true)\n    }\n  }\n\n  const closeModal = () => {\n    setShowModal(false)\n  }\n\n  const onThumbnailLoad = () => {\n    setLoadedThumbnail(true)\n  }\n\n  const onPreviewLoad = () => {\n    setLoadedPreview(true)\n  }\n\n  return (\n    <div className=\"c-image-viewer\">\n      <ImageViewerModal\n        onPreviewLoad={onPreviewLoad}\n        isOpen={showModal}\n        onClose={closeModal}\n        imgSrc={uploadedImageURL(props.bkey, 1500)}\n        loadedPreview={loadedPreview}\n      />\n      {!loadedThumbnail && <Loader />}\n      <img alt=\"\" onClick={openModal} onLoad={onThumbnailLoad} src={uploadedImageURL(props.bkey, 200)} />\n    </div>\n  )\n}\n","import React from \"react\"\nimport { markdown, truncate } from \"@fider/services\"\n\nimport \"./Markdown.scss\"\n\ninterface MarkdownProps {\n  className?: string\n  text?: string\n  maxLength?: number\n  style: \"full\" | \"plainText\"\n}\n\nexport const Markdown = (props: MarkdownProps) => {\n  if (!props.text) {\n    return null\n  }\n\n  const html = markdown[props.style](props.text)\n  const className = `c-markdown ${props.className || \"\"}`\n  const tagName = props.style === \"plainText\" ? \"p\" : \"div\"\n\n  return React.createElement(tagName, {\n    className,\n    dangerouslySetInnerHTML: { __html: props.maxLength ? truncate(html, props.maxLength) : html },\n  })\n}\n","import React from \"react\"\nimport { useFider } from \"@fider/hooks\"\n\nimport \"./DevBanner.scss\"\n\nexport const DevBanner = () => {\n  const fider = useFider()\n\n  if (fider.isProduction()) {\n    return null\n  }\n\n  return <div className=\"c-dev-banner\">DEV</div>\n}\n","import \"./Avatar.scss\"\n\nimport React from \"react\"\nimport { UserRole } from \"@fider/models\"\n\ninterface AvatarProps {\n  user: {\n    role?: UserRole\n    avatarURL: string\n    name: string\n  }\n  size?: \"small\" | \"normal\"\n}\n\nexport const Avatar = (props: AvatarProps) => {\n  const size = props.size === \"small\" ? \"h-6 w-6\" : \"h-8 w-8\"\n  return <img className={`c-avatar ${size}`} alt={props.user.name} src={`${props.user.avatarURL}?size=50`} />\n}\n","import \"./AvatarStack.scss\"\n\nimport React from \"react\"\nimport { UserRole } from \"@fider/models\"\nimport { Avatar } from \"./Avatar\"\nimport { classSet } from \"@fider/services\"\n\ninterface AvatarStackProps {\n  overlap?: boolean\n  users: Array<{\n    role?: UserRole\n    avatarURL: string\n    name: string\n  }>\n}\n\nexport const AvatarStack = (props: AvatarStackProps) => {\n  const classes = classSet({\n    \"c-avatar-stack\": true,\n    \"c-avatar-stack--overlap\": props.overlap ?? true,\n  })\n\n  return (\n    <div className={classes}>\n      {props.users.map((x, i) => (\n        <Avatar key={i} user={x} />\n      ))}\n    </div>\n  )\n}\n","import \"./Message.scss\"\n\nimport React from \"react\"\nimport { classSet } from \"@fider/services\"\nimport IconCheckCircle from \"@fider/assets/images/heroicons-check-circle.svg\"\nimport IconExclamationCircle from \"@fider/assets/images/heroicons-exclamation-circle.svg\"\nimport IconExclamation from \"@fider/assets/images/heroicons-exclamation.svg\"\nimport { HStack } from \"@fider/components/layout\"\nimport { Icon } from \"./Icon\"\n\ninterface MessageProps {\n  children?: React.ReactNode\n  type: \"success\" | \"warning\" | \"error\"\n  className?: string\n  alignment?: \"center\"\n  showIcon?: boolean\n}\n\nexport const Message: React.FunctionComponent<MessageProps> = (props) => {\n  const className = classSet({\n    \"c-message\": true,\n    [`c-message--${props.type}`]: true,\n    [`c-message--icon`]: props.showIcon === true,\n    [`${props.className}`]: props.className,\n  })\n\n  const icon = props.type === \"error\" ? IconExclamation : props.type === \"warning\" ? IconExclamationCircle : IconCheckCircle\n\n  return (\n    <HStack className={className} spacing={2} justify={props.alignment}>\n      {props.showIcon === true && <Icon className=\"h-5\" sprite={icon} />}\n      <span>{props.children}</span>\n    </HStack>\n  )\n}\n","import \"./Hint.scss\"\n\nimport React, { useState } from \"react\"\nimport IconX from \"@fider/assets/images/heroicons-x.svg\"\nimport { HStack } from \"@fider/components/layout\"\nimport { cache } from \"@fider/services\"\nimport { Icon } from \"./Icon\"\n\ninterface HintProps {\n  children?: React.ReactNode\n  permanentCloseKey?: string\n  condition?: boolean\n}\n\nexport const Hint: React.FC<HintProps> = (props) => {\n  const cacheKey: string | undefined = props.permanentCloseKey ? `Hint-Closed-${props.permanentCloseKey}` : undefined\n  const [isClosed, setIsClosed] = useState<boolean>(cacheKey ? cache.local.has(cacheKey) : false)\n\n  const close = () => {\n    if (cacheKey) {\n      cache.local.set(cacheKey, \"true\")\n    }\n    setIsClosed(true)\n  }\n\n  if (props.condition === false || isClosed) {\n    return null\n  }\n\n  return (\n    <HStack className=\"c-hint\" justify=\"between\" spacing={2}>\n      <span>{props.children}</span>\n      {cacheKey && <Icon sprite={IconX} onClick={close} className=\"c-hint__close h-5\" />}\n    </HStack>\n  )\n}\n","import React from \"react\"\nimport { Modal, Checkbox } from \"@fider/components\"\nimport { useFider } from \"@fider/hooks\"\nimport { Trans } from \"@lingui/react/macro\"\n\ninterface LegalAgreementProps {\n  onChange: (agreed: boolean) => void\n}\n\nexport const TermsOfService = () => {\n  const fider = useFider()\n\n  if (fider.settings.hasLegal) {\n    return (\n      <a href=\"/terms\" className=\"text-link\" target=\"_blank\">\n        <Trans id=\"legal.termsofservice\">Terms of Service</Trans>\n      </a>\n    )\n  }\n  return null\n}\n\nexport const PrivacyPolicy = () => {\n  const fider = useFider()\n\n  if (fider.settings.hasLegal) {\n    return (\n      <a href=\"/privacy\" className=\"text-link\" target=\"_blank\">\n        <Trans id=\"legal.privacypolicy\">Privacy Policy</Trans>\n      </a>\n    )\n  }\n  return null\n}\n\nexport const LegalNotice = () => {\n  const fider = useFider()\n\n  if (fider.settings.hasLegal) {\n    return (\n      <p className=\"text-muted\">\n        <Trans id=\"legal.notice\">\n          By signing in, you agree to the <PrivacyPolicy /> and <TermsOfService />.\n        </Trans>\n      </p>\n    )\n  }\n  return null\n}\n\nexport const LegalFooter = () => {\n  const fider = useFider()\n\n  if (fider.settings.hasLegal) {\n    return (\n      <Modal.Footer align=\"center\">\n        <LegalNotice />\n      </Modal.Footer>\n    )\n  }\n  return null\n}\n\nexport const LegalAgreement: React.FunctionComponent<LegalAgreementProps> = (props) => {\n  const fider = useFider()\n\n  if (fider.settings.hasLegal) {\n    return (\n      <Checkbox field=\"legalAgreement\" onChange={props.onChange}>\n        <Trans id=\"legal.agreement\">\n          I have read and agree to the <PrivacyPolicy /> and <TermsOfService />.\n        </Trans>\n      </Checkbox>\n    )\n  }\n  return null\n}\n","import React from \"react\"\nimport { Button, OAuthProviderLogo } from \"@fider/components\"\n\ninterface SocialSignInButtonProps {\n  option: {\n    displayName: string\n    provider?: string\n    url?: string\n    logoBlobKey?: string\n    logoURL?: string\n  }\n  className?: string\n  redirectTo?: string\n}\n\nexport const SocialSignInButton = (props: SocialSignInButtonProps) => {\n  const redirectTo = props.redirectTo || window.location.href\n  const href = props.option.url ? `${props.option.url}?redirect=${redirectTo}` : undefined\n\n  return (\n    <Button href={href} rel=\"nofollow\" className={props.className}>\n      {props.option.logoURL ? <img alt={props.option.displayName} src={props.option.logoURL} /> : <OAuthProviderLogo option={props.option} />}\n      <span>{props.option.displayName}</span>\n    </Button>\n  )\n}\n","import \"./SignInControl.scss\"\n\nimport React, { useState } from \"react\"\nimport { SocialSignInButton, Form, Button, Input, Message } from \"@fider/components\"\nimport { Divider } from \"@fider/components/layout\"\nimport { device, actions, Failure, isCookieEnabled } from \"@fider/services\"\nimport { useFider } from \"@fider/hooks\"\nimport { Trans } from \"@lingui/react/macro\"\n\ninterface SignInControlProps {\n  useEmail: boolean\n  redirectTo?: string\n  onEmailSent?: (email: string) => void\n}\n\nexport const SignInControl: React.FunctionComponent<SignInControlProps> = (props) => {\n  const fider = useFider()\n  const [showEmailForm, setShowEmailForm] = useState(fider.session.tenant ? fider.session.tenant.isEmailAuthAllowed : true)\n  const [email, setEmail] = useState(\"\")\n  const [error, setError] = useState<Failure | undefined>(undefined)\n\n  const forceShowEmailForm = (e: React.MouseEvent<HTMLAnchorElement>) => {\n    e.preventDefault()\n    setShowEmailForm(true)\n  }\n\n  const signIn = async () => {\n    const result = await actions.signIn(email)\n    if (result.ok) {\n      setEmail(\"\")\n      setError(undefined)\n      if (props.onEmailSent) {\n        props.onEmailSent(email)\n      }\n    } else if (result.error) {\n      setError(result.error)\n    }\n  }\n\n  const providersLen = fider.settings.oauth.length\n\n  if (!isCookieEnabled()) {\n    return (\n      <Message type=\"error\">\n        <h3 className=\"text-display\">Cookies Required</h3>\n        <p>Cookies are not enabled on your browser. Please enable cookies in your browser preferences to continue.</p>\n      </Message>\n    )\n  }\n\n  return (\n    <div className=\"c-signin-control\">\n      {providersLen > 0 && (\n        <>\n          <div className=\"c-signin-control__oauth mb-2\">\n            {fider.settings.oauth.map((o) => (\n              <React.Fragment key={o.provider}>\n                <SocialSignInButton option={o} redirectTo={props.redirectTo} />\n              </React.Fragment>\n            ))}\n          </div>\n          {props.useEmail && <Divider />}\n        </>\n      )}\n\n      {props.useEmail &&\n        (showEmailForm ? (\n          <div>\n            <p>\n              <Trans id=\"signin.message.email\">Enter your email address to sign in</Trans>\n            </p>\n            <Form error={error}>\n              <Input\n                field=\"email\"\n                value={email}\n                autoFocus={!device.isTouch()}\n                onChange={setEmail}\n                placeholder=\"yourname@example.com\"\n                suffix={\n                  <Button type=\"submit\" variant=\"primary\" disabled={email === \"\"} onClick={signIn}>\n                    <Trans id=\"action.signin\">Sign in</Trans>\n                  </Button>\n                }\n              />\n            </Form>\n            {!fider.session.tenant.isEmailAuthAllowed && (\n              <p className=\"text-red-700 mt-1\">\n                <Trans id=\"signin.message.onlyadmins\">Currently only allowed to sign in to an administrator account</Trans>\n              </p>\n            )}\n          </div>\n        ) : (\n          <div>\n            <p className=\"text-muted\">\n              <Trans id=\"signin.message.emaildisabled\">\n                Email authentication has been disabled by an administrator. If you have an administrator account and need to bypass this restriction, please{\" \"}\n                <a href=\"#\" className=\"text-bold\" onClick={forceShowEmailForm}>\n                  click here\n                </a>\n                .\n              </Trans>\n            </p>\n          </div>\n        ))}\n    </div>\n  )\n}\n","import React from \"react\"\nimport { classSet, formatDate, timeSince } from \"@fider/services\"\n\ninterface MomentText {\n  locale: string\n  date: Date | string\n  className?: string\n  format?: \"relative\" | \"full\" | \"short\" | \"date\"\n}\n\nexport const Moment = (props: MomentText) => {\n  if (!props.date) {\n    return <span />\n  }\n\n  const format = props.format || \"relative\"\n\n  const now = new Date()\n  const date = props.date instanceof Date ? props.date : new Date(props.date)\n  const diff = (now.getTime() - date.getTime()) / (60 * 60 * 24 * 1000)\n  const display =\n    diff >= 365 && format === \"relative\"\n      ? formatDate(props.locale, props.date, \"short\")\n      : format === \"relative\"\n      ? timeSince(props.locale, now, date)\n      : format === \"date\"\n      ? formatDate(props.locale, props.date, \"date\")\n      : formatDate(props.locale, props.date, format)\n\n  const tooltip = props.format === \"short\" ? formatDate(props.locale, props.date, \"full\") : undefined\n\n  const className = classSet({\n    ...(props.className ? { [props.className]: true } : {}),\n    date: true,\n  })\n\n  return (\n    <span className={className} data-tooltip={tooltip}>\n      {display}\n    </span>\n  )\n}\n","import \"./Modal.scss\"\n\nimport React, { useEffect, useRef } from \"react\"\nimport ReactDOM from \"react-dom\"\nimport { classSet } from \"@fider/services\"\n\ninterface ModalWindowProps {\n  children?: React.ReactNode\n  className?: string\n  isOpen: boolean\n  size?: \"small\" | \"large\" | \"fluid\"\n  canClose?: boolean\n  center?: boolean\n  onClose: () => void\n}\n\ninterface ModalFooterProps {\n  align?: \"left\" | \"center\" | \"right\"\n  children?: React.ReactNode\n}\n\nconst ModalWindow: React.FunctionComponent<ModalWindowProps> = ({ size = \"small\", canClose = true, center = true, ...props }) => {\n  const root = useRef<HTMLElement>(document.getElementById(\"root-modal\"))\n\n  useEffect(() => {\n    if (props.isOpen) {\n      document.body.style.overflow = \"hidden\"\n      document.addEventListener(\"keydown\", keyDown, false)\n    } else {\n      document.body.style.overflow = \"\"\n      document.removeEventListener(\"keydown\", keyDown, false)\n    }\n  }, [props.isOpen])\n\n  const swallow = (evt: React.MouseEvent<HTMLDivElement>) => {\n    evt.stopPropagation()\n  }\n\n  const keyDown = (event: KeyboardEvent) => {\n    if (event.keyCode === 27) {\n      // ESC\n      close()\n    }\n  }\n\n  const close = () => {\n    if (canClose) {\n      props.onClose()\n    }\n  }\n\n  if (!props.isOpen || !root.current) {\n    return null\n  }\n\n  const className = classSet({\n    \"c-modal-window\": true,\n    [`${props.className}`]: !!props.className,\n    \"c-modal-window--center\": center,\n    [`c-modal-window--${size}`]: true,\n  })\n\n  return ReactDOM.createPortal(\n    <div aria-disabled={true} className=\"c-modal-dimmer\" onClick={close}>\n      <div className=\"c-modal-scroller\">\n        <div className={className} data-testid=\"modal\" onClick={swallow}>\n          {props.children}\n        </div>\n      </div>\n    </div>,\n    root.current\n  )\n}\nconst Header = (props: { children: React.ReactNode }) => <div className=\"c-modal-header\">{props.children}</div>\nconst Content = (props: { children: React.ReactNode }) => <div className=\"c-modal-content\">{props.children}</div>\nconst Footer = (props: ModalFooterProps) => {\n  const align = props.align || \"right\"\n  const className = classSet({\n    \"c-modal-footer\": true,\n    [`c-modal-footer--${align}`]: true,\n  })\n  return <div className={className}>{props.children}</div>\n}\n\nexport const Modal = {\n  Window: ModalWindow,\n  Header,\n  Content,\n  Footer,\n}\n","import \"./UserName.scss\"\n\nimport React from \"react\"\nimport { isCollaborator, UserRole } from \"@fider/models\"\nimport { classSet } from \"@fider/services\"\n\ninterface UserNameProps {\n  user: {\n    id: number\n    name: string\n    role?: UserRole\n    email?: string\n  }\n  showEmail?: boolean\n}\n\nexport const UserName = (props: UserNameProps) => {\n  const isStaff = props.user.role && isCollaborator(props.user.role)\n  const className = classSet({\n    \"c-username\": true,\n    \"c-username--staff\": isStaff,\n  })\n\n  return (\n    <div className={className}>\n      <span>{props.user.name || \"Anonymous\"}</span>\n      <>{props.showEmail && props.user.email && <span className=\"c-username--email\">({props.user.email})</span>}</>\n\n      {isStaff && (\n        <div data-tooltip={isStaff ? \"Staff\" : undefined}>\n          <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n            <path\n              fillRule=\"evenodd\"\n              d=\"M6.267 3.455a3.066 3.066 0 001.745-.723 3.066 3.066 0 013.976 0 3.066 3.066 0 001.745.723 3.066 3.066 0 012.812 2.812c.051.643.304 1.254.723 1.745a3.066 3.066 0 010 3.976 3.066 3.066 0 00-.723 1.745 3.066 3.066 0 01-2.812 2.812 3.066 3.066 0 00-1.745.723 3.066 3.066 0 01-3.976 0 3.066 3.066 0 00-1.745-.723 3.066 3.066 0 01-2.812-2.812 3.066 3.066 0 00-.723-1.745 3.066 3.066 0 010-3.976 3.066 3.066 0 00.723-1.745 3.066 3.066 0 012.812-2.812zm7.44 5.252a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z\"\n              clipRule=\"evenodd\"\n            ></path>\n          </svg>\n        </div>\n      )}\n    </div>\n  )\n}\n","import \"./Loader.scss\"\n\nimport React, { useState } from \"react\"\nimport { useTimeout } from \"@fider/hooks\"\nimport { classSet } from \"@fider/services\"\n\ninterface LoaderProps {\n  text?: string\n  className?: string\n}\n\nexport function Loader(props: LoaderProps) {\n  const [show, setShow] = useState(false)\n\n  useTimeout(() => {\n    setShow(true)\n  }, 500)\n\n  const className = classSet({\n    \"c-loader\": true,\n    [props.className || \"\"]: props.className,\n  })\n\n  return show ? (\n    <div className={className}>\n      <div className=\"c-loader__spinner\" />\n      {props.text && <span className=\"c-loader__text\">{props.text}</span>}\n    </div>\n  ) : null\n}\n","import React from \"react\"\nimport { uploadedImageURL } from \"@fider/services\"\nimport { useFider } from \"@fider/hooks\"\nimport { Tenant } from \"@fider/models\"\n\ntype Size = 24 | 50 | 100 | 200\n\ninterface TenantLogoProps {\n  size: Size\n  useFiderIfEmpty?: boolean\n}\n\nexport const TenantLogoURL = (tenant: Tenant, size: Size): string | undefined => {\n  if (tenant && tenant.logoBlobKey) {\n    return uploadedImageURL(tenant.logoBlobKey, size)\n  }\n  return undefined\n}\n\nexport const TenantLogo = ({ size, useFiderIfEmpty = false }: TenantLogoProps) => {\n  const fider = useFider()\n\n  const tenant = fider.session.tenant\n  if (tenant && tenant.logoBlobKey) {\n    return <img src={TenantLogoURL(fider.session.tenant, size)} alt={tenant.name} />\n  } else if (useFiderIfEmpty) {\n    return <img src=\"https://fider.io/images/logo-100x100.png\" alt=\"Fider\" />\n  }\n  return null\n}\n\ninterface OAuthProviderLogoProps {\n  option: {\n    provider?: string\n    displayName: string\n    logoBlobKey?: string\n  }\n}\n\nconst systemProvidersLogo: { [key: string]: string } = {\n  google: `data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/PjwhRE9DVFlQRSBzdmcgIFBVQkxJQyAnLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4nICAnaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkJz48c3ZnIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDQwMCA0MDAiIGhlaWdodD0iNDAwcHgiIGlkPSJMYXllcl8xIiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA0MDAgNDAwIiB3aWR0aD0iNDAwcHgiIHhtbDpzcGFjZT0icHJlc2VydmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPjxnPjxwYXRoIGQ9Ik0xNDIuOSwyNC4yQzk3LjYsMzkuNyw1OSw3My42LDM3LjUsMTE2LjVjLTcuNSwxNC44LTEyLjksMzAuNS0xNi4yLDQ2LjhjLTguMiw0MC40LTIuNSw4My41LDE2LjEsMTIwLjMgICBjMTIuMSwyNCwyOS41LDQ1LjQsNTAuNSw2Mi4xYzE5LjksMTUuOCw0MywyNy42LDY3LjYsMzQuMWMzMSw4LjMsNjQsOC4xLDk1LjIsMWMyOC4yLTYuNSw1NC45LTIwLDc2LjItMzkuNiAgIGMyMi41LTIwLjcsMzguNi00Ny45LDQ3LjEtNzcuMmM5LjMtMzEuOSwxMC41LTY2LDQuNy05OC44Yy01OC4zLDAtMTE2LjcsMC0xNzUsMGMwLDI0LjIsMCw0OC40LDAsNzIuNmMzMy44LDAsNjcuNiwwLDEwMS40LDAgICBjLTMuOSwyMy4yLTE3LjcsNDQuNC0zNy4yLDU3LjVjLTEyLjMsOC4zLTI2LjQsMTMuNi00MSwxNi4yYy0xNC42LDIuNS0yOS44LDIuOC00NC40LTAuMWMtMTQuOS0zLTI5LTkuMi00MS40LTE3LjkgICBjLTE5LjgtMTMuOS0zNC45LTM0LjItNDIuNi01Ny4xYy03LjktMjMuMy04LTQ5LjIsMC03Mi40YzUuNi0xNi40LDE0LjgtMzEuNSwyNy00My45YzE1LTE1LjQsMzQuNS0yNi40LDU1LjYtMzAuOSAgIGMxOC0zLjgsMzctMy4xLDU0LjYsMi4yYzE1LDQuNSwyOC44LDEyLjgsNDAuMSwyMy42YzExLjQtMTEuNCwyMi44LTIyLjgsMzQuMi0zNC4yYzYtNi4xLDEyLjMtMTIsMTguMS0xOC4zICAgYy0xNy4zLTE2LTM3LjctMjguOS01OS45LTM3LjFDMjI4LjIsMTAuNiwxODMuMiwxMC4zLDE0Mi45LDI0LjJ6IiBmaWxsPSIjRkZGRkZGIi8+PGc+PHBhdGggZD0iTTE0Mi45LDI0LjJjNDAuMi0xMy45LDg1LjMtMTMuNiwxMjUuMywxLjFjMjIuMiw4LjIsNDIuNSwyMSw1OS45LDM3LjFjLTUuOCw2LjMtMTIuMSwxMi4yLTE4LjEsMTguMyAgICBjLTExLjQsMTEuNC0yMi44LDIyLjgtMzQuMiwzNC4yYy0xMS4zLTEwLjgtMjUuMS0xOS00MC4xLTIzLjZjLTE3LjYtNS4zLTM2LjYtNi4xLTU0LjYtMi4yYy0yMSw0LjUtNDAuNSwxNS41LTU1LjYsMzAuOSAgICBjLTEyLjIsMTIuMy0yMS40LDI3LjUtMjcsNDMuOWMtMjAuMy0xNS44LTQwLjYtMzEuNS02MS00Ny4zQzU5LDczLjYsOTcuNiwzOS43LDE0Mi45LDI0LjJ6IiBmaWxsPSIjRUE0MzM1Ii8+PC9nPjxnPjxwYXRoIGQ9Ik0yMS40LDE2My4yYzMuMy0xNi4yLDguNy0zMiwxNi4yLTQ2LjhjMjAuMywxNS44LDQwLjYsMzEuNSw2MSw0Ny4zYy04LDIzLjMtOCw0OS4yLDAsNzIuNCAgICBjLTIwLjMsMTUuOC00MC42LDMxLjYtNjAuOSw0Ny4zQzE4LjksMjQ2LjcsMTMuMiwyMDMuNiwyMS40LDE2My4yeiIgZmlsbD0iI0ZCQkMwNSIvPjwvZz48Zz48cGF0aCBkPSJNMjAzLjcsMTY1LjFjNTguMywwLDExNi43LDAsMTc1LDBjNS44LDMyLjcsNC41LDY2LjgtNC43LDk4LjhjLTguNSwyOS4zLTI0LjYsNTYuNS00Ny4xLDc3LjIgICAgYy0xOS43LTE1LjMtMzkuNC0zMC42LTU5LjEtNDUuOWMxOS41LTEzLjEsMzMuMy0zNC4zLDM3LjItNTcuNWMtMzMuOCwwLTY3LjYsMC0xMDEuNCwwQzIwMy43LDIxMy41LDIwMy43LDE4OS4zLDIwMy43LDE2NS4xeiIgZmlsbD0iIzQyODVGNCIvPjwvZz48Zz48cGF0aCBkPSJNMzcuNSwyODMuNWMyMC4zLTE1LjcsNDAuNi0zMS41LDYwLjktNDcuM2M3LjgsMjIuOSwyMi44LDQzLjIsNDIuNiw1Ny4xYzEyLjQsOC43LDI2LjYsMTQuOSw0MS40LDE3LjkgICAgYzE0LjYsMywyOS43LDIuNiw0NC40LDAuMWMxNC42LTIuNiwyOC43LTcuOSw0MS0xNi4yYzE5LjcsMTUuMywzOS40LDMwLjYsNTkuMSw0NS45Yy0yMS4zLDE5LjctNDgsMzMuMS03Ni4yLDM5LjYgICAgYy0zMS4yLDcuMS02NC4yLDcuMy05NS4yLTFjLTI0LjYtNi41LTQ3LjctMTguMi02Ny42LTM0LjFDNjcsMzI4LjksNDkuNiwzMDcuNSwzNy41LDI4My41eiIgZmlsbD0iIzM0QTg1MyIvPjwvZz48L2c+PC9zdmc+`,\n  facebook: `data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/PjwhRE9DVFlQRSBzdmcgIFBVQkxJQyAnLS8vVzNDLy9EVEQgU1ZHIDEuMC8vRU4nICAnaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9SRUMtU1ZHLTIwMDEwOTA0L0RURC9zdmcxMC5kdGQnPjxzdmcgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMzIgMzIiIGhlaWdodD0iMzJweCIgaWQ9IkxheWVyXzEiIHZlcnNpb249IjEuMCIgdmlld0JveD0iMCAwIDMyIDMyIiB3aWR0aD0iMzJweCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+PGc+PHBhdGggZD0iTTMyLDMwYzAsMS4xMDQtMC44OTYsMi0yLDJIMmMtMS4xMDQsMC0yLTAuODk2LTItMlYyYzAtMS4xMDQsMC44OTYtMiwyLTJoMjhjMS4xMDQsMCwyLDAuODk2LDIsMlYzMHoiIGZpbGw9IiMzQjU5OTgiLz48cGF0aCBkPSJNMjIsMzJWMjBoNGwxLTVoLTV2LTJjMC0yLDEuMDAyLTMsMy0zaDJWNWMtMSwwLTIuMjQsMC00LDBjLTMuNjc1LDAtNiwyLjg4MS02LDd2M2gtNHY1aDR2MTJIMjJ6IiBmaWxsPSIjRkZGRkZGIiBpZD0iZiIvPjwvZz48Zy8+PGcvPjxnLz48Zy8+PGcvPjxnLz48L3N2Zz4=`,\n  github:\n    \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/PjwhRE9DVFlQRSBzdmcgIFBVQkxJQyAnLS8vVzNDLy9EVEQgU1ZHIDEuMC8vRU4nICAnaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9SRUMtU1ZHLTIwMDEwOTA0L0RURC9zdmcxMC5kdGQnPjxzdmcgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMzIgMzIiIGhlaWdodD0iMzJweCIgaWQ9IkxheWVyXzEiIHZlcnNpb249IjEuMCIgdmlld0JveD0iMCAwIDMyIDMyIiB3aWR0aD0iMzJweCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+PHBhdGggY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMTYuMDAzLDBDNy4xNywwLDAuMDA4LDcuMTYyLDAuMDA4LDE1Ljk5NyAgYzAsNy4wNjcsNC41ODIsMTMuMDYzLDEwLjk0LDE1LjE3OWMwLjgsMC4xNDYsMS4wNTItMC4zMjgsMS4wNTItMC43NTJjMC0wLjM4LDAuMDA4LTEuNDQyLDAtMi43NzcgIGMtNC40NDksMC45NjctNS4zNzEtMi4xMDctNS4zNzEtMi4xMDdjLTAuNzI3LTEuODQ4LTEuNzc1LTIuMzQtMS43NzUtMi4zNGMtMS40NTItMC45OTIsMC4xMDktMC45NzMsMC4xMDktMC45NzMgIGMxLjYwNSwwLjExMywyLjQ1MSwxLjY0OSwyLjQ1MSwxLjY0OWMxLjQyNywyLjQ0MywzLjc0MywxLjczNyw0LjY1NCwxLjMyOWMwLjE0Ni0xLjAzNCwwLjU2LTEuNzM5LDEuMDE3LTIuMTM5ICBjLTMuNTUyLTAuNDA0LTcuMjg2LTEuNzc2LTcuMjg2LTcuOTA2YzAtMS43NDcsMC42MjMtMy4xNzQsMS42NDYtNC4yOTJDNy4yOCwxMC40NjQsNi43Myw4LjgzNyw3LjYwMiw2LjYzNCAgYzAsMCwxLjM0My0wLjQzLDQuMzk4LDEuNjQxYzEuMjc2LTAuMzU1LDIuNjQ1LTAuNTMyLDQuMDA1LTAuNTM4YzEuMzU5LDAuMDA2LDIuNzI3LDAuMTgzLDQuMDA1LDAuNTM4ICBjMy4wNTUtMi4wNyw0LjM5Ni0xLjY0MSw0LjM5Ni0xLjY0MWMwLjg3MiwyLjIwMywwLjMyMywzLjgzLDAuMTU5LDQuMjM0YzEuMDIzLDEuMTE4LDEuNjQ0LDIuNTQ1LDEuNjQ0LDQuMjkyICBjMCw2LjE0Ni0zLjc0LDcuNDk4LTcuMzA0LDcuODkzQzE5LjQ3OSwyMy41NDgsMjAsMjQuNTA4LDIwLDI2YzAsMiwwLDMuOTAyLDAsNC40MjhjMCwwLjQyOCwwLjI1OCwwLjkwMSwxLjA3LDAuNzQ2ICBDMjcuNDIyLDI5LjA1NSwzMiwyMy4wNjIsMzIsMTUuOTk3QzMyLDcuMTYyLDI0LjgzOCwwLDE2LjAwMywweiIgZmlsbD0iIzE4MTYxNiIgZmlsbC1ydWxlPSJldmVub2RkIi8+PGcvPjxnLz48Zy8+PGcvPjxnLz48Zy8+PC9zdmc+\",\n}\n\nexport const OAuthProviderLogoURL = (logoBlobKey?: string): string | undefined => {\n  if (logoBlobKey) {\n    return uploadedImageURL(logoBlobKey, 100)\n  }\n  return undefined\n}\n\nexport const OAuthProviderLogo = (props: OAuthProviderLogoProps) => {\n  if (props.option.logoBlobKey) {\n    return <img src={OAuthProviderLogoURL(props.option.logoBlobKey)} alt={props.option.displayName} />\n  }\n\n  if (props.option.provider && props.option.provider in systemProvidersLogo) {\n    return <img src={systemProvidersLogo[props.option.provider]} alt={props.option.displayName} />\n  }\n\n  return null\n}\n","import \"./Toggle.scss\"\n\nimport React, { useState } from \"react\"\nimport { classSet } from \"@fider/services\"\nimport { HStack } from \"../layout\"\nimport { DisplayError, ValidationContext } from \"@fider/components\"\n\ninterface ToggleProps {\n  field?: string\n  label?: string\n  active: boolean\n  disabled?: boolean\n  onToggle?: (active: boolean) => void\n}\n\nexport const Toggle: React.FC<ToggleProps> = (props) => {\n  const [active, setActive] = useState(props.active)\n\n  const toggle = () => {\n    if (props.disabled) {\n      return\n    }\n\n    const newActive = !active\n    setActive(newActive)\n    if (props.onToggle) {\n      props.onToggle(newActive)\n    }\n  }\n\n  const className = classSet({\n    \"c-toggle\": true,\n    \"c-toggle--enabled\": active,\n    \"c-toggle--disabled\": !!props.disabled,\n  })\n\n  return (\n    <ValidationContext.Consumer>\n      {(ctx) => (\n        <>\n          <HStack spacing={2}>\n            <button onClick={toggle} type=\"button\" className={className} role=\"switch\">\n              <span aria-hidden=\"true\" className=\"shadow\"></span>\n            </button>\n            {props.label && <span className=\"text-sm\">{props.label}</span>}\n          </HStack>\n          {props.field && <DisplayError fields={[props.field]} error={ctx.error} />}\n        </>\n      )}\n    </ValidationContext.Consumer>\n  )\n}\n","import React from \"react\"\nimport { classSet } from \"@fider/services\"\n\nimport \"./PoweredByFider.scss\"\n\ninterface PoweredByFiderProps {\n  slot: string\n  className?: string\n}\n\nexport const PoweredByFider = (props: PoweredByFiderProps) => {\n  const source = encodeURIComponent(window?.location?.host || \"\")\n  const medium = \"powered-by\"\n  const campaign = props.slot\n\n  const className = classSet({\n    \"c-powered\": true,\n    [props.className || \"\"]: props.className,\n  })\n\n  return (\n    <div className={className}>\n      <a rel=\"noopener\" href={`https://fider.io?utm_source=${source}&utm_medium=${medium}&utm_campaign=${campaign}`} target=\"_blank\">\n        Powered by Fider ⚡\n      </a>\n    </div>\n  )\n}\n","import React from \"react\"\nimport { classSet } from \"@fider/services\"\n\ninterface PageTitleLogo {\n  title: string\n  subtitle?: string\n  className?: string\n}\n\nexport const PageTitle = (props: PageTitleLogo) => {\n  const className = classSet({\n    \"mb-4\": true,\n    [`${props.className}`]: props.className,\n  })\n\n  return (\n    <div className={className}>\n      <div className=\"text-display2 mb-1\">{props.title}</div>\n      <div className=\"text-gray-700\">{props.subtitle}</div>\n    </div>\n  )\n}\n","import \"./Dropdown.scss\"\n\nimport React, { createContext, useContext, useEffect, useRef, useState } from \"react\"\nimport { classSet } from \"@fider/services\"\n\ninterface DropdownListItemProps {\n  href?: string\n  onClick?: () => void\n  className?: string\n  children: React.ReactNode\n}\n\nconst ListItem = (props: DropdownListItemProps) => {\n  const ctx = useContext(DropdownContext)\n  const handleClick = () => {\n    if (props.onClick) {\n      props.onClick()\n    }\n\n    ctx?.close()\n  }\n\n  if (props.href) {\n    return (\n      <a href={props.href} className={`c-dropdown__listitem ${props.className}`}>\n        {props.children}\n      </a>\n    )\n  }\n\n  return (\n    <div onClick={handleClick} className={`c-dropdown__listitem ${props.className}`}>\n      {props.children}\n    </div>\n  )\n}\n\nconst Divider = () => {\n  return <hr className=\"c-dropdown__divider\" />\n}\n\ninterface DropdownProps {\n  renderHandle: JSX.Element\n  position?: \"left\" | \"right\"\n  onToggled?: (isOpen: boolean) => void\n  children: React.ReactNode\n  wide?: boolean\n  fullsceenSm?: boolean\n}\n\ninterface DropdownContextFuncs {\n  close(): void\n}\n\nconst DropdownContext = createContext<DropdownContextFuncs | null>(null)\nDropdownContext.displayName = \"DropdownContext\"\n\nexport const Dropdown = (props: DropdownProps) => {\n  const node = useRef<HTMLDivElement | null>(null)\n  const [isOpen, setIsOpen] = useState(false)\n  const position = props.position || \"right\"\n\n  const changeToggleState = (newState: boolean) => {\n    setIsOpen(newState)\n    if (props.onToggled) {\n      props.onToggled(newState)\n    }\n  }\n\n  const toggleIsOpen = () => {\n    changeToggleState(!isOpen)\n  }\n\n  const close = () => {\n    changeToggleState(false)\n  }\n\n  const handleClick = (e: MouseEvent) => {\n    if (node.current && node.current.contains(e.target as Node)) {\n      return\n    }\n\n    close()\n  }\n\n  useEffect(() => {\n    document.addEventListener(\"mousedown\", handleClick)\n\n    return () => {\n      document.removeEventListener(\"mousedown\", handleClick)\n    }\n  }, [])\n\n  const listClassName = classSet({\n    \"c-dropdown__list--wide\": props.wide,\n    \"c-dropdown__list shadow-lg\": true,\n    \"c-dropdown__list--fullscreen-small\": props.fullsceenSm,\n    [`c-dropdown__list--${position}`]: position === \"left\",\n  })\n\n  return (\n    <DropdownContext.Provider value={{ close }}>\n      <div ref={node} className=\"c-dropdown\">\n        <button type=\"button\" className=\"c-dropdown__handle\" onClick={toggleIsOpen}>\n          {props.renderHandle}\n        </button>\n        {isOpen && <div className={listClassName}>{props.children}</div>}\n      </div>\n    </DropdownContext.Provider>\n  )\n}\n\nDropdown.ListItem = ListItem\nDropdown.Divider = Divider\n","import React from \"react\"\n\ninterface MomentProps {\n  locale: string\n  amount: number\n  currency: string\n}\n\nexport const Money = (props: MomentProps) => {\n  const formatter = new Intl.NumberFormat(props.locale, {\n    style: \"currency\",\n    currency: props.currency,\n  })\n\n  return <span>{formatter.format(props.amount)}</span>\n}\n","import \"./ShowTag.scss\"\n\nimport React from \"react\"\nimport { Tag } from \"@fider/models\"\nimport { classSet } from \"@fider/services\"\nimport ShieldCheck from \"@fider/assets/images/heroicons-shieldcheck.svg\"\nimport { Icon } from \"./common\"\n\ninterface TagProps {\n  tag: Tag\n  circular?: boolean\n  link?: boolean\n}\n\n// const textColor = (color: string) => {\n//   const components = getRGB(color)\n//   const bgDelta = components.R * 0.299 + components.G * 0.587 + components.B * 0.114\n//   return bgDelta > 140 ? \"#333\" : \"#fff\"\n// }\n\nexport const ShowTag = (props: TagProps) => {\n  const className = classSet({\n    \"c-tag\": true,\n    \"c-tag--circular\": props.circular === true,\n  })\n\n  return (\n    <a\n      href={props.link && props.tag.slug ? `/?tags=${props.tag.slug}` : undefined}\n      title={`${props.tag.name}${props.tag.isPublic ? \"\" : \" (Private)\"}`}\n      className={className}\n    >\n      <span\n        style={{\n          backgroundColor: `#${props.tag.color}`,\n        }}\n      ></span>\n      {!props.tag.isPublic && !props.circular && <Icon height=\"14\" width=\"14\" sprite={ShieldCheck} className=\"mr-1\" />}\n      {props.circular ? \"\" : props.tag.name || \"Tag\"}\n    </a>\n  )\n}\n","import React, { useState } from \"react\"\nimport { SignInModal, TenantLogo, NotificationIndicator, UserMenu } from \"@fider/components\"\nimport { useFider } from \"@fider/hooks\"\nimport { HStack } from \"./layout\"\nimport { Trans } from \"@lingui/react/macro\"\n\nexport const Header = () => {\n  const fider = useFider()\n  const [isSignInModalOpen, setIsSignInModalOpen] = useState(false)\n\n  const showModal = (e: React.MouseEvent) => {\n    e.preventDefault()\n    setIsSignInModalOpen(true)\n  }\n\n  const hideModal = () => setIsSignInModalOpen(false)\n\n  return (\n    <div id=\"c-header\" className=\"bg-white\">\n      <SignInModal isOpen={isSignInModalOpen} onClose={hideModal} />\n      <HStack className=\"c-menu shadow p-4 w-full\">\n        <div className=\"container\">\n          <HStack justify=\"between\">\n            <a href=\"/\" className=\"flex flex-x flex-items-center flex--spacing-2 h-8\">\n              <TenantLogo size={100} />\n              <h1 className=\"text-header\">{fider.session.tenant.name}</h1>\n            </a>\n            {fider.session.isAuthenticated && (\n              <HStack spacing={2}>\n                <NotificationIndicator />\n                <UserMenu />\n              </HStack>\n            )}\n            {!fider.session.isAuthenticated && (\n              <a href=\"#\" className=\"uppercase text-sm\" onClick={showModal}>\n                <Trans id=\"action.signin\">Sign in</Trans>\n              </a>\n            )}\n          </HStack>\n        </div>\n      </HStack>\n    </div>\n  )\n}\n","import React, { useState, useEffect } from \"react\"\nimport { Modal, SignInControl, LegalFooter } from \"@fider/components\"\nimport { Button } from \"./common\"\nimport { Trans } from \"@lingui/react/macro\"\n\ninterface SignInModalProps {\n  isOpen: boolean\n  onClose: () => void\n}\n\nexport const SignInModal: React.FC<SignInModalProps> = (props) => {\n  const [email, setEmail] = useState(\"\")\n\n  useEffect(() => {\n    if (email) {\n      setTimeout(() => setEmail(\"\"), 5000)\n    }\n  }, [email])\n\n  const onEmailSent = (value: string): void => {\n    setEmail(value)\n  }\n\n  const closeModal = () => {\n    setEmail(\"\")\n    props.onClose()\n  }\n\n  const content = email ? (\n    <>\n      <p>\n        <Trans id=\"signin.message.emailsent\">\n          We have just sent a confirmation link to <b>{email}</b>. Click the link and you’ll be signed in.\n        </Trans>\n      </p>\n      <p>\n        <Button variant=\"tertiary\" onClick={closeModal}>\n          <Trans id=\"action.ok\">OK</Trans>\n        </Button>\n      </p>\n    </>\n  ) : (\n    <SignInControl useEmail={true} onEmailSent={onEmailSent} />\n  )\n\n  return (\n    <Modal.Window isOpen={props.isOpen} onClose={closeModal}>\n      <Modal.Header>\n        <Trans id=\"modal.signin.header\">Sign in to participate and vote</Trans>\n      </Modal.Header>\n      <Modal.Content>{content}</Modal.Content>\n      <LegalFooter />\n    </Modal.Window>\n  )\n}\n","import \"./VoteCounter.scss\"\n\nimport React, { useState } from \"react\"\nimport { Post, PostStatus } from \"@fider/models\"\nimport { actions, classSet } from \"@fider/services\"\nimport { Icon, SignInModal } from \"@fider/components\"\nimport { useFider } from \"@fider/hooks\"\nimport FaCaretUp from \"@fider/assets/images/fa-caretup.svg\"\n\nexport interface VoteCounterProps {\n  post: Post\n}\n\nexport const VoteCounter = (props: VoteCounterProps) => {\n  const fider = useFider()\n  const [hasVoted, setHasVoted] = useState(props.post.hasVoted)\n  const [votesCount, setVotesCount] = useState(props.post.votesCount)\n  const [isSignInModalOpen, setIsSignInModalOpen] = useState(false)\n\n  const voteOrUndo = async () => {\n    if (!fider.session.isAuthenticated) {\n      setIsSignInModalOpen(true)\n      return\n    }\n\n    const action = hasVoted ? actions.removeVote : actions.addVote\n\n    const response = await action(props.post.number)\n    if (response.ok) {\n      setVotesCount(votesCount + (hasVoted ? -1 : 1))\n      setHasVoted(!hasVoted)\n    }\n  }\n\n  const hideModal = () => setIsSignInModalOpen(false)\n\n  const status = PostStatus.Get(props.post.status)\n  const isDisabled = status.closed || fider.isReadOnly\n\n  const className = classSet({\n    \"border-gray-200 border rounded-md bg-gray-100\": true,\n    \"c-vote-counter__button\": true,\n    \"c-vote-counter__button--voted\": !status.closed && hasVoted,\n    \"c-vote-counter__button--disabled\": isDisabled,\n  })\n\n  const vote = (\n    <button className={className} onClick={voteOrUndo}>\n      <Icon sprite={FaCaretUp} height=\"16\" width=\"16\" />\n      {votesCount}\n    </button>\n  )\n\n  const disabled = (\n    <button className={className}>\n      <Icon sprite={FaCaretUp} height=\"16\" width=\"16\" />\n      {votesCount}\n    </button>\n  )\n\n  return (\n    <>\n      <SignInModal isOpen={isSignInModalOpen} onClose={hideModal} />\n      <div className=\"c-vote-counter\">{isDisabled ? disabled : vote}</div>\n    </>\n  )\n}\n","import \"./NotificationIndicator.scss\"\nimport NoDataIllustration from \"@fider/assets/images/undraw-empty.svg\"\n\nimport React, { useEffect, useState } from \"react\"\nimport IconBell from \"@fider/assets/images/heroicons-bell.svg\"\nimport { useFider } from \"@fider/hooks\"\nimport { actions, Fider } from \"@fider/services\"\nimport { Avatar, Icon, Markdown, Moment } from \"./common\"\nimport { Dropdown } from \"./common/Dropdown\"\nimport { Notification } from \"@fider/models\"\nimport { HStack, VStack } from \"./layout\"\n\nimport { Trans } from \"@lingui/react/macro\"\n\nexport const NotificationItem = ({ notification }: { notification: Notification }) => {\n  const openNotification = () => {\n    window.location.href = `/notifications/${notification.id}`\n  }\n\n  return (\n    <HStack spacing={4} className=\"px-3 pr-5 clickable hover py-4\" onClick={openNotification}>\n      <Avatar user={{ name: notification.authorName, avatarURL: notification.avatarURL }} />\n      <div>\n        <Markdown className=\"c-notification-indicator-text\" text={notification.title} style=\"full\" />\n        <span className=\"text-muted\">\n          <Moment locale={Fider.currentLocale} date={notification.createdAt} />\n        </span>\n      </div>\n    </HStack>\n  )\n}\n\nconst NotificationIcon = ({ unreadNotifications }: { unreadNotifications: number }) => {\n  return (\n    <>\n      <span className=\"c-notification-indicator mr-3\">\n        <Icon sprite={IconBell} className=\"h-6 text-gray-500\" />\n        {unreadNotifications > 0 && <div className=\"c-notification-indicator-unread-counter\" />}\n      </span>\n    </>\n  )\n}\n\nexport const NotificationIndicator = () => {\n  const fider = useFider()\n  const [unreadNotifications, setUnreadNotifications] = useState(0)\n  const [showingNotifications, setShowingNotifications] = useState(false)\n  const [recent, setRecent] = useState<Notification[] | undefined>()\n  const [unread, setUnread] = useState<Notification[] | undefined>()\n\n  useEffect(() => {\n    if (fider.session.isAuthenticated) {\n      actions.getTotalUnreadNotifications().then((result) => {\n        if (result.ok && result.data > 0) {\n          setUnreadNotifications(result.data)\n        }\n      })\n    }\n  }, [fider.session.isAuthenticated])\n\n  useEffect(() => {\n    if (showingNotifications) {\n      actions.getAllNotifications().then((result) => {\n        if (result) {\n          const [unread, recent] = (result.data || []).reduce(\n            (result, item) => {\n              result[item.read ? 1 : 0].push(item)\n              return result\n            },\n            [[] as Notification[], [] as Notification[]]\n          )\n          setRecent(recent)\n          setUnread(unread)\n          setUnreadNotifications(unread.length)\n        }\n      })\n    }\n  }, [showingNotifications])\n\n  const markAllAsRead = async (e: React.MouseEvent) => {\n    e.preventDefault()\n    const response = await actions.markAllAsRead()\n    if (response.ok) {\n      location.reload()\n    }\n  }\n\n  return (\n    <Dropdown\n      wide={true}\n      position=\"left\"\n      fullsceenSm={true}\n      onToggled={(isOpen: boolean) => setShowingNotifications(isOpen)}\n      renderHandle={<NotificationIcon unreadNotifications={unreadNotifications} />}\n    >\n      <div className=\"c-notifications-container\">\n        {showingNotifications && (unread !== undefined || recent !== undefined) && (\n          <>\n            {unread !== undefined && unread?.length > 0 ? (\n              <>\n                <p className=\"text-subtitle px-4 mt-4 mb-0\">\n                  <Trans id=\"modal.notifications.unread\">Unread notifications</Trans>\n                  {unread.length > 1 && (\n                    <a href=\"#\" className=\"text-link text-xs pl-6\" onClick={markAllAsRead}>\n                      <Trans id=\"action.markallasread\">Mark All as Read</Trans>\n                    </a>\n                  )}\n                </p>\n                <VStack spacing={0} className=\"py-2\" divide={false}>\n                  {unread.map((n) => (\n                    <NotificationItem key={n.id} notification={n} />\n                  ))}\n                </VStack>\n              </>\n            ) : (\n              <div className=\"text-center pb-6\">\n                <p className=\"text-display text-center mt-6 px-4\">\n                  <Trans id=\"modal.notifications.nonew\">No new notifications</Trans>\n                </p>\n                {recent?.length === 0 && <Icon sprite={NoDataIllustration} height=\"120\" className=\"mt-6 mb-2\" />}\n              </div>\n            )}\n            {recent !== undefined && recent?.length > 0 && (\n              <>\n                <p className=\"text-subtitle px-4 mb-0 pt-4 bg-gray-50 border-gray-200 bt\">\n                  <Trans id=\"modal.notifications.previous\">Previous notifications</Trans>\n                </p>\n                <VStack spacing={0} className=\"py-2 bg-gray-50\" divide={false}>\n                  {recent.map((n) => (\n                    <NotificationItem key={n.id} notification={n} />\n                  ))}\n                </VStack>\n              </>\n            )}\n          </>\n        )}\n      </div>\n    </Dropdown>\n  )\n}\n","import React from \"react\"\nimport { useFider } from \"@fider/hooks\"\nimport { Avatar, Dropdown } from \"./common\"\nimport { Trans } from \"@lingui/react/macro\"\n\nexport const UserMenu = () => {\n  const fider = useFider()\n\n  return (\n    <div className=\"c-menu-user\">\n      <Dropdown position=\"left\" renderHandle={<Avatar user={fider.session.user} />}>\n        <div className=\"p-2 text-medium uppercase\">{fider.session.user.name}</div>\n        <Dropdown.ListItem href=\"/settings\">\n          <Trans id=\"menu.mysettings\">My Settings</Trans>\n        </Dropdown.ListItem>\n        <Dropdown.Divider />\n\n        {fider.session.user.isCollaborator && (\n          <>\n            <div className=\"p-2 text-medium uppercase\">\n              <Trans id=\"menu.administration\">Administration</Trans>\n            </div>\n            <Dropdown.ListItem href=\"/admin\">\n              <Trans id=\"menu.sitesettings\">Site Settings</Trans>\n            </Dropdown.ListItem>\n            <Dropdown.Divider />\n          </>\n        )}\n        <Dropdown.ListItem href=\"/signout\">\n          <Trans id=\"menu.signout\">Sign out</Trans>\n        </Dropdown.ListItem>\n      </Dropdown>\n    </div>\n  )\n}\n","import React, { useEffect, useState } from \"react\"\nimport { ReactionCount } from \"@fider/models\"\nimport { Icon } from \"@fider/components\"\nimport ReactionAdd from \"@fider/assets/images/reaction-add.svg\"\nimport { HStack } from \"@fider/components/layout\"\nimport { classSet } from \"@fider/services\"\nimport { useFider } from \"@fider/hooks\"\nimport \"./Reactions.scss\"\n\ninterface ReactionsProps {\n  emojiSelectorRef: React.RefObject<HTMLDivElement>\n  toggleReaction: (emoji: string) => void\n  reactions?: ReactionCount[]\n}\n\nconst availableEmojis = [\"👍\", \"👎\", \"😄\", \"🎉\", \"😕\", \"❤️\", \"🚀\", \"👀\"]\n\nexport const Reactions: React.FC<ReactionsProps> = ({ emojiSelectorRef, toggleReaction, reactions }) => {\n  const fider = useFider()\n  const [isEmojiSelectorOpen, setIsEmojiSelectorOpen] = useState(false)\n\n  useEffect(() => {\n    const handleClickOutside = (event: MouseEvent) => {\n      if (emojiSelectorRef.current && !emojiSelectorRef.current.contains(event.target as Node)) {\n        setIsEmojiSelectorOpen(false)\n      }\n    }\n\n    document.addEventListener(\"click\", handleClickOutside)\n    return () => {\n      document.removeEventListener(\"click\", handleClickOutside)\n    }\n  }, [])\n\n  return (\n    <div ref={emojiSelectorRef}>\n      <HStack spacing={2} align=\"center\" className=\"mt-2 c-reactions relative\">\n        {fider.session.isAuthenticated && (\n          <>\n            <span\n              onClick={() => setIsEmojiSelectorOpen(!isEmojiSelectorOpen)}\n              className=\"c-reactions-add-reaction relative text-gray-600 clickable inline-flex items-center px-1 py-1 rounded-full text-xs bg-blue-100 hover:bg-blue-200\"\n            >\n              <Icon width=\"18\" height=\"18\" sprite={ReactionAdd} className=\"\" />\n            </span>\n            {isEmojiSelectorOpen && (\n              <div className=\"c-reactions-emojis p-2 absolute bg-white border rounded shadow-lg\">\n                {availableEmojis.map((emoji) => (\n                  <a\n                    key={emoji}\n                    className=\"clickable p-2 hover:bg-gray-100\"\n                    onClick={() => {\n                      toggleReaction(emoji)\n                      setIsEmojiSelectorOpen(false)\n                    }}\n                  >\n                    {emoji}\n                  </a>\n                ))}\n              </div>\n            )}\n          </>\n        )}\n        {reactions !== undefined && (\n          <>\n            {reactions.map((reaction) => (\n              <span\n                key={reaction.emoji}\n                {...(fider.session.isAuthenticated && { onClick: () => toggleReaction(reaction.emoji) })}\n                className={classSet({\n                  \"inline-flex items-center px-2 py-1 rounded-full text-xs\": true,\n                  \"bg-blue-100\": reaction.includesMe,\n                  \"bg-gray-100\": !reaction.includesMe,\n                  \"clickable hover:bg-blue-200\": fider.session.isAuthenticated && reaction.includesMe,\n                  \"clickable hover:bg-gray-200\": fider.session.isAuthenticated && !reaction.includesMe,\n                })}\n              >\n                {reaction.emoji} <span className=\"ml-1 font-semibold\">{reaction.count}</span>\n              </span>\n            ))}\n          </>\n        )}\n      </HStack>\n    </div>\n  )\n}\n","import React from \"react\"\nimport { useFider } from \"@fider/hooks\"\nimport { Message } from \"./common\"\n\nexport const ReadOnlyNotice = () => {\n  const fider = useFider()\n  if (!fider.isReadOnly) {\n    return null\n  }\n\n  if (fider.session.isAuthenticated && fider.session.user.isAdministrator) {\n    return (\n      <Message alignment=\"center\" type=\"warning\">\n        This website is currently in read-only mode because there is no active subscription. Visit{\" \"}\n        <a className=\"text-link\" href=\"/admin/billing\">\n          Billing\n        </a>{\" \"}\n        to subscribe.\n      </Message>\n    )\n  }\n\n  return (\n    <Message alignment=\"center\" type=\"warning\">\n      This website is currently in read-only mode.\n    </Message>\n  )\n}\n","import React from \"react\"\nimport { classSet } from \"@fider/services\"\n\ninterface StackProps {\n  className?: string\n  children: React.ReactNode\n  onClick?: () => void\n  divide?: boolean\n  justify?: \"between\" | \"evenly\" | \"full\" | \"center\"\n  align?: \"start\" | \"center\" | \"end\"\n  spacing?: 0 | 1 | 2 | 4 | 6 | 8\n}\n\nconst Stack = (props: StackProps, dir: \"x\" | \"y\") => {\n  const spacing = props.spacing === undefined ? 2 : props.spacing\n  const className = classSet({\n    [`${props.className}`]: props.className,\n    flex: true,\n    \"flex-x\": dir === \"x\",\n    \"flex-y\": dir === \"y\",\n    [`flex--spacing-${spacing}`]: spacing > 0 && !props.divide,\n    [`flex--divide-${spacing}`]: spacing > 0 && !!props.divide,\n    \"justify-between\": props.justify === \"between\",\n    \"justify-evenly\": props.justify === \"evenly\",\n    \"justify-full\": props.justify === \"full\",\n    \"justify-center\": props.justify === \"center\",\n    \"flex-items-start\": props.align === \"start\",\n    \"flex-items-center\": props.align === \"center\" || (dir === \"x\" && props.align === undefined),\n    \"flex-items-end\": props.align === \"end\",\n  })\n\n  return (\n    <div onClick={props.onClick} className={className}>\n      {props.children}\n    </div>\n  )\n}\n\nexport const HStack = (props: StackProps) => {\n  return Stack(props, \"x\")\n}\n\nexport const VStack = (props: StackProps) => {\n  return Stack(props, \"y\")\n}\n","import \"./Divider.scss\"\n\nimport React from \"react\"\nimport { Trans } from \"@lingui/react/macro\"\n\nexport const Divider = () => {\n  return (\n    <div className=\"c-divider text-gray-600\">\n      <Trans id=\"label.or\">OR</Trans>\n    </div>\n  )\n}\n","import { User } from \"./identity\"\n\nexport interface Post {\n  id: number\n  number: number\n  slug: string\n  title: string\n  description: string\n  createdAt: string\n  status: string\n  user: User\n  hasVoted: boolean\n  response: PostResponse | null\n  votesCount: number\n  commentsCount: number\n  tags: string[]\n}\n\nexport class PostStatus {\n  constructor(public title: string, public value: string, public show: boolean, public closed: boolean, public filterable: boolean) {}\n\n  public static Open = new PostStatus(\"Open\", \"open\", false, false, true)\n  public static Planned = new PostStatus(\"Planned\", \"planned\", true, false, true)\n  public static Started = new PostStatus(\"Started\", \"started\", true, false, true)\n  public static Completed = new PostStatus(\"Completed\", \"completed\", true, true, true)\n  public static Declined = new PostStatus(\"Declined\", \"declined\", true, true, true)\n  public static Duplicate = new PostStatus(\"Duplicate\", \"duplicate\", true, true, true)\n  public static Deleted = new PostStatus(\"Deleted\", \"deleted\", false, true, true)\n\n  public static Get(value: string): PostStatus {\n    for (const status of PostStatus.All) {\n      if (status.value === value) {\n        return status\n      }\n    }\n    throw new Error(`PostStatus not found for value ${value}.`)\n  }\n\n  public static All = [PostStatus.Open, PostStatus.Planned, PostStatus.Started, PostStatus.Completed, PostStatus.Duplicate, PostStatus.Declined]\n}\n\nexport interface PostResponse {\n  user: User\n  text: string\n  respondedAt: Date\n  original?: {\n    number: number\n    title: string\n    slug: string\n    status: string\n  }\n}\n\nexport interface ReactionCount {\n  emoji: string\n  count: number\n  includesMe: boolean\n}\n\nexport interface Comment {\n  id: number\n  content: string\n  createdAt: string\n  user: User\n  attachments?: string[]\n  reactionCounts?: ReactionCount[]\n  editedAt?: string\n  editedBy?: User\n}\n\nexport interface Tag {\n  id: number\n  slug: string\n  name: string\n  color: string\n  isPublic: boolean\n}\n\nexport interface Vote {\n  createdAt: Date\n  user: {\n    id: number\n    name: string\n    email: string\n    avatarURL: string\n  }\n}\n","export interface Tenant {\n  id: number\n  name: string\n  cname: string\n  subdomain: string\n  locale: string\n  invitation: string\n  welcomeMessage: string\n  status: TenantStatus\n  isPrivate: boolean\n  logoBlobKey: string\n  isEmailAuthAllowed: boolean\n}\n\nexport enum TenantStatus {\n  Active = 1,\n  Pending = 2,\n  Locked = 3,\n  Disabled = 4,\n}\n\nexport interface User {\n  id: number\n  name: string\n  email?: string\n  role: UserRole\n  status: UserStatus\n  avatarURL: string\n}\n\nexport interface UserNames {\n  id: number\n  name: string\n}\n\nexport enum UserAvatarType {\n  Letter = \"letter\",\n  Gravatar = \"gravatar\",\n  Custom = \"custom\",\n}\n\nexport enum UserStatus {\n  Active = \"active\",\n  Deleted = \"deleted\",\n  Blocked = \"blocked\",\n}\n\nexport enum UserRole {\n  Visitor = \"visitor\",\n  Collaborator = \"collaborator\",\n  Administrator = \"administrator\",\n}\n\nexport const isCollaborator = (role: UserRole): boolean => {\n  return role === UserRole.Collaborator || role === UserRole.Administrator\n}\n\nexport interface CurrentUser {\n  id: number\n  name: string\n  email: string\n  avatarType: UserAvatarType\n  avatarBlobKey: string\n  avatarURL: string\n  role: UserRole\n  status: UserStatus\n  isAdministrator: boolean\n  isCollaborator: boolean\n}\n","export interface OAuthProviderOption {\n  provider: string\n  displayName: string\n  clientID: string\n  url: string\n  callbackURL: string\n  logoBlobKey: string\n  isCustomProvider: boolean\n  isEnabled: boolean\n}\n\nexport interface SystemSettings {\n  mode: string\n  locale: string\n  version: string\n  environment: string\n  domain: string\n  hasLegal: boolean\n  isBillingEnabled: boolean\n  baseURL: string\n  assetsURL: string\n  oauth: OAuthProviderOption[]\n}\n\nexport interface UserSettings {\n  [key: string]: string\n}\n\nexport const OAuthConfigStatus = {\n  Disabled: 1,\n  Enabled: 2,\n}\n\nexport interface OAuthConfig {\n  provider: string\n  displayName: string\n  status: number\n  clientID: string\n  clientSecret: string\n  authorizeURL: string\n  tokenURL: string\n  profileURL: string\n  logoBlobKey: string\n  scope: string\n  jsonUserIDPath: string\n  jsonUserNamePath: string\n  jsonUserEmailPath: string\n  isTrusted: boolean\n}\n\nexport interface ImageUpload {\n  bkey?: string\n  upload?: {\n    fileName?: string\n    content?: string\n    contentType?: string\n  }\n  remove: boolean\n}\n\nexport enum EmailVerificationKind {\n  SignIn = 1,\n  SignUp = 2,\n  ChangeEmail = 3,\n  UserInvitation = 4,\n}\n","export enum BillingStatus {\n  Trial = 1,\n  Active = 2,\n  Cancelled = 3,\n  FreeForever = 4,\n  OpenCollective = 5,\n}\n","import { StringObject } from \"@fider/services\"\n\nexport interface WebhookData {\n  name: string\n  type: WebhookType\n  status: WebhookStatus\n  url: string\n  content: string\n  http_method: string\n  http_headers: HttpHeaders\n}\n\nexport interface Webhook extends WebhookData {\n  id: number\n}\n\nexport enum WebhookType {\n  NEW_POST = \"new_post\",\n  NEW_COMMENT = \"new_comment\",\n  CHANGE_STATUS = \"change_status\",\n  DELETE_POST = \"delete_post\",\n}\n\nexport enum WebhookStatus {\n  ENABLED = \"enabled\",\n  DISABLED = \"disabled\",\n  FAILED = \"failed\",\n}\n\nexport type HttpHeaders = StringObject<string>\n\nexport interface WebhookTriggerResult {\n  webhook: Webhook\n  props: StringObject\n  success: boolean\n  url: string\n  content: string\n  status_code: number\n  message: string\n  error: string\n}\n\nexport interface WebhookPreviewResult {\n  url: PreviewedField\n  content: PreviewedField\n}\n\nexport interface PreviewedField {\n  value: string\n  message: string\n  error: string\n}\n","import { analytics, notify, truncate } from \"@fider/services\"\n\nexport interface ErrorItem {\n  field?: string\n  message: string\n}\n\nexport interface Failure {\n  errors?: ErrorItem[]\n}\n\nexport interface Result<T = void> {\n  ok: boolean\n  data: T\n  error?: Failure\n}\n\nasync function toResult<T>(response: Response): Promise<Result<T>> {\n  const body = await response.json()\n\n  if (response.status < 400) {\n    return {\n      ok: true,\n      data: body as T,\n    }\n  }\n\n  if (response.status === 500) {\n    notify.error(\"An unexpected error occurred while processing your request.\")\n  } else if (response.status === 401) {\n    notify.error(\"You need to be authenticated to perform this operation.\")\n  } else if (response.status === 403) {\n    notify.error(\"You are not authorized to perform this operation.\")\n  }\n\n  return {\n    ok: false,\n    data: body as T,\n    error: {\n      errors: body.errors,\n    },\n  }\n}\nasync function request<T>(url: string, method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\", body?: any): Promise<Result<T>> {\n  const headers = [\n    [\"Accept\", \"application/json\"],\n    [\"Content-Type\", \"application/json\"],\n  ]\n  try {\n    const response = await fetch(url, {\n      method,\n      headers,\n      body: JSON.stringify(body),\n      credentials: \"same-origin\",\n    })\n    return await toResult<T>(response)\n  } catch (err) {\n    const truncatedBody = truncate(body ? JSON.stringify(body) : \"<empty>\", 1000)\n    throw new Error(`Failed to ${method} ${url} with body '${truncatedBody}'`)\n  }\n}\n\nexport const http = {\n  get: async <T = void>(url: string): Promise<Result<T>> => {\n    return await request<T>(url, \"GET\")\n  },\n  post: async <T = void>(url: string, body?: any): Promise<Result<T>> => {\n    return await request<T>(url, \"POST\", body)\n  },\n  put: async <T = void>(url: string, body?: any): Promise<Result<T>> => {\n    return await request<T>(url, \"PUT\", body)\n  },\n  delete: async <T = void>(url: string, body?: any): Promise<Result<T>> => {\n    return await request<T>(url, \"DELETE\", body)\n  },\n  event:\n    (category: string, action: string) =>\n    <T>(result: Result<T>): Result<T> => {\n      if (result && result.ok) {\n        analytics.event(category, action)\n      }\n      return result\n    },\n}\n","const set = (storage: Storage, key: string, value: string): void => {\n  if (storage) {\n    storage.setItem(key, value)\n  }\n}\n\nconst get = (storage: Storage, key: string): string | null => {\n  if (window.localStorage) {\n    return storage.getItem(key)\n  }\n  return null\n}\n\nconst has = (storage: Storage, key: string): boolean => {\n  if (storage) {\n    return !!storage.getItem(key)\n  }\n  return false\n}\n\nconst remove = (storage: Storage, ...keys: string[]): void => {\n  if (storage && keys) {\n    for (const key of keys) {\n      storage.removeItem(key)\n    }\n  }\n}\n\nexport const cache = {\n  local: {\n    set: (key: string, value: string): void => {\n      set(window.localStorage, key, value)\n    },\n    get: (key: string): string | null => {\n      return get(window.localStorage, key)\n    },\n    has: (key: string): boolean => {\n      return has(window.localStorage, key)\n    },\n    remove: (...keys: string[]): void => {\n      remove(window.localStorage, ...keys)\n    },\n  },\n  session: {\n    set: (key: string, value: string): void => {\n      set(window.sessionStorage, key, value)\n    },\n    get: (key: string): string | null => {\n      return get(window.sessionStorage, key)\n    },\n    has: (key: string): boolean => {\n      return has(window.sessionStorage, key)\n    },\n    remove: (...keys: string[]): void => {\n      remove(window.sessionStorage, ...keys)\n    },\n  },\n}\n","export const analytics = {\n  event: (eventCategory: string, eventAction: string): void => {\n    if (window.ga) {\n      window.ga(\"send\", \"event\", {\n        eventCategory,\n        eventAction,\n      })\n    }\n  },\n  error: (err?: Error): void => {\n    if (window.ga) {\n      window.ga(\"send\", \"exception\", {\n        exDescription: err ? err.stack : \"<not available>\",\n        exFatal: false,\n      })\n    }\n  },\n}\n","import { createContext } from \"react\"\nimport { CurrentUser, SystemSettings, Tenant, TenantStatus } from \"@fider/models\"\n\nexport class FiderSession {\n  private pPage: string\n  private pContextID: string\n  private pTenant: Tenant\n  private pUser: CurrentUser | undefined\n  private pProps: { [key: string]: any } = {}\n\n  constructor(data: any) {\n    this.pPage = data.page\n    this.pContextID = data.contextID\n    this.pProps = data.props\n    this.pUser = data.user\n    this.pTenant = data.tenant\n  }\n\n  public get page(): string {\n    return this.pPage\n  }\n\n  public get contextID(): string {\n    return this.pContextID\n  }\n\n  public get user(): CurrentUser {\n    if (!this.pUser) throw new Error(\"User is undefined\")\n    return this.pUser\n  }\n\n  public get tenant(): Tenant {\n    return this.pTenant\n  }\n\n  public get props(): { [key: string]: any } {\n    return this.pProps\n  }\n\n  public get isAuthenticated(): boolean {\n    return !!this.pUser\n  }\n}\n\nexport class FiderImpl {\n  private pSettings!: SystemSettings\n  private pSession!: FiderSession\n\n  public initialize = (initData?: any): FiderImpl => {\n    if (initData) {\n      this.pSettings = initData.settings\n      this.pSession = new FiderSession(initData)\n      return this\n    }\n\n    const el = document.getElementById(\"server-data\")\n    const data = el ? JSON.parse(el.textContent || el.innerText) : {}\n    this.pSettings = data.settings\n    this.pSession = new FiderSession(data)\n    return this\n  }\n\n  public get currentLocale(): string {\n    if (this.session.tenant) {\n      return this.session.tenant.locale\n    }\n    return this.settings.locale\n  }\n\n  public get session(): FiderSession {\n    return this.pSession\n  }\n\n  public get settings(): SystemSettings {\n    return this.pSettings\n  }\n\n  public get isReadOnly(): boolean {\n    return this.session.tenant && this.session.tenant.status === TenantStatus.Locked\n  }\n\n  public isProduction(): boolean {\n    return this.pSettings.environment === \"production\"\n  }\n\n  public isSingleHostMode(): boolean {\n    return this.pSettings.mode === \"single\"\n  }\n}\n\nexport const Fider = new FiderImpl()\n\nexport const FiderContext = createContext<FiderImpl>(Fider)\n","export const jwt = {\n  decode: (token: string): any => {\n    if (token) {\n      const segments = token.split(\".\")\n      try {\n        return JSON.parse(window.atob(segments[1]))\n      } catch {\n        return undefined\n      }\n    }\n  },\n}\n","import { Fider } from \".\"\n\nexport const delay = (ms: number) => {\n  return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nexport const classSet = (input?: any): string => {\n  let classes = \"\"\n  if (input) {\n    for (const key in input) {\n      if (key && !!input[key]) {\n        classes += ` ${key}`\n      }\n    }\n    return classes.trim()\n  }\n  return \"\"\n}\n\ntype DateFormat = \"full\" | \"short\" | \"date\"\ntype DateOptsMap = {\n  [key in DateFormat]: Intl.DateTimeFormatOptions\n}\n\nconst dateOpts: DateOptsMap = {\n  date: { day: \"numeric\", month: \"short\", year: \"numeric\" },\n  short: { month: \"short\", year: \"numeric\" },\n  full: { day: \"2-digit\", month: \"long\", year: \"numeric\", hour: \"numeric\", minute: \"numeric\" },\n}\n\nexport const formatDate = (locale: string, input: Date | string, format: DateFormat = \"full\"): string => {\n  const date = input instanceof Date ? input : new Date(input)\n\n  try {\n    return new Intl.DateTimeFormat(locale, dateOpts[format]).format(date)\n  } catch {\n    return date.toLocaleString(locale)\n  }\n}\n\nexport const timeSince = (locale: string, now: Date, date: Date, dateFormat: DateFormat = \"short\"): string => {\n  try {\n    const seconds = Math.round((now.getTime() - date.getTime()) / 1000)\n    const minutes = Math.round(seconds / 60)\n    const hours = Math.round(minutes / 60)\n    const days = Math.round(hours / 24)\n    const months = Math.round(days / 30)\n    const years = Math.round(days / 365)\n\n    const rtf = new Intl.RelativeTimeFormat(locale, { numeric: \"auto\" })\n    return (\n      (seconds < 60 && rtf.format(-1 * seconds, \"seconds\")) ||\n      (minutes < 60 && rtf.format(-1 * minutes, \"minutes\")) ||\n      (hours < 24 && rtf.format(-1 * hours, \"hours\")) ||\n      (days < 30 && rtf.format(-1 * days, \"days\")) ||\n      (days < 365 && rtf.format(-1 * months, \"months\")) ||\n      rtf.format(-1 * years, \"years\")\n    )\n  } catch {\n    return formatDate(locale, date, dateFormat)\n  }\n}\nexport const fileToBase64 = async (file: File): Promise<string> => {\n  return new Promise<string>((resolve, reject) => {\n    const reader = new FileReader()\n    reader.addEventListener(\n      \"load\",\n      () => {\n        const parts = (reader.result as string).split(\"base64,\")\n        resolve(parts[1])\n      },\n      false\n    )\n\n    reader.addEventListener(\n      \"error\",\n      () => {\n        reject(reader.error)\n      },\n      false\n    )\n\n    reader.readAsDataURL(file)\n  })\n}\n\nexport const timeAgo = (date: string | Date): number => {\n  const d = date instanceof Date ? date : new Date(date)\n  return (new Date().getTime() - d.getTime()) / 1000\n}\n\nexport const isCookieEnabled = (): boolean => {\n  try {\n    document.cookie = \"cookietest=1\"\n    const ret = document.cookie.indexOf(\"cookietest=\") !== -1\n    document.cookie = \"cookietest=1; expires=Thu, 01-Jan-1970 00:00:01 GMT\"\n    return ret\n  } catch (e) {\n    return false\n  }\n}\n\nexport const uploadedImageURL = (bkey: string | undefined, size?: number): string | undefined => {\n  if (bkey) {\n    if (size) {\n      return `${Fider.settings.assetsURL}/static/images/${bkey}?size=${size}`\n    }\n    return `${Fider.settings.assetsURL}/static/images/${bkey}`\n  }\n  return undefined\n}\n\nexport const truncate = (input: string, maxLength: number): string => {\n  if (input && input.length > maxLength) {\n    return `${input.substr(0, maxLength)}...`\n  }\n  return input\n}\n\nexport type StringObject<T = any> = {\n  [key: string]: T\n}\n\nexport const copyToClipboard = (text: string): Promise<void> => {\n  if (window.navigator && window.navigator.clipboard && window.navigator.clipboard.writeText) {\n    return window.navigator.clipboard.writeText(text)\n  }\n  return Promise.reject(new Error(\"Clipboard API not available\"))\n}\n\nexport const clearUrlHash = (replace?: boolean) => {\n  const oldURL = window.location.href\n  const newURL = window.location.pathname + window.location.search\n  if (replace) {\n    window.history.replaceState(\"\", document.title, newURL)\n  } else {\n    window.history.pushState(\"\", document.title, newURL)\n  }\n  // Trigger event manually\n  const hashChangeEvent = new HashChangeEvent(\"hashchange\", {\n    oldURL,\n    newURL,\n    cancelable: true,\n    bubbles: true,\n    composed: false,\n  })\n  if (!window.dispatchEvent(hashChangeEvent)) {\n    // Event got cancelled\n    window.history.replaceState(\"\", document.title, oldURL)\n  }\n}\n","import { i18n } from \"@lingui/core\"\n\nexport function activateI18NSync(locale: string, messages?: any) {\n  i18n.load(locale, messages)\n  i18n.activate(locale)\n  return i18n\n}\n\nexport async function activateI18N(locale: string) {\n  try {\n    const content = await import(\n      /* webpackChunkName: \"locale-[request]\" */\n      `@locale/${locale}/client.json`\n    )\n    return activateI18NSync(locale, content.messages)\n  } catch (err) {\n    console.error(err)\n    return activateI18NSync(locale)\n  }\n}\n","import { marked } from \"marked\"\nimport DOMPurify from \"dompurify\"\n\nmarked.setOptions({\n  headerIds: false,\n  xhtml: true,\n  smartLists: true,\n  gfm: true,\n  breaks: true,\n})\n\nif (DOMPurify.isSupported) {\n  DOMPurify.setConfig({\n    USE_PROFILES: {\n      html: true,\n    },\n    ADD_ATTR: [\"target\"],\n  })\n}\n\nconst link = (href: string, title: string, text: string) => {\n  const titleAttr = title ? ` title=${title}` : \"\"\n  return `<a class=\"text-link\" href=\"${href}\"${titleAttr} rel=\"noopener nofollow\" target=\"_blank\">${text}</a>`\n}\n\nconst fullRenderer = new marked.Renderer()\nfullRenderer.image = () => \"\"\nfullRenderer.link = link\nfullRenderer.text = (text: string) => {\n  // Handling mention links (they're in the format @[name])\n  return text.replace(/@\\[(.*?)\\]/g, (match, name) => {\n    return `<span class=\"text-blue-600\">@${name}</span>`\n  })\n}\n\nconst plainTextRenderer = new marked.Renderer()\nplainTextRenderer.link = (_href, _title, text) => text\nplainTextRenderer.image = () => \"\"\nplainTextRenderer.br = () => \" \"\nplainTextRenderer.strong = (text) => text\nplainTextRenderer.list = (body) => body\nplainTextRenderer.listitem = (text) => `${text} `\nplainTextRenderer.heading = (text) => text\nplainTextRenderer.paragraph = (text) => ` ${text} `\nplainTextRenderer.code = (code) => code\nplainTextRenderer.codespan = (code) => code\nplainTextRenderer.html = (html) => html\nplainTextRenderer.del = (text) => text\n\nconst entities: { [key: string]: string } = {\n  // \"<\": \"&lt;\",\n  // \">\": \"&gt;\",\n}\n\nconst encodeHTML = (s: string) => s.replace(/[<>]/g, (tag) => entities[tag] || tag)\nconst sanitize = (input: string) => (DOMPurify.isSupported ? DOMPurify.sanitize(input) : input)\n\nexport const full = (input: string): string => {\n  return sanitize(marked(encodeHTML(input), { renderer: fullRenderer }).trim())\n}\n\nexport const plainText = (input: string): string => {\n  return sanitize(marked(encodeHTML(input), { renderer: plainTextRenderer }).trim())\n}\n","const toastify = () => import(/* webpackChunkName: \"toastify\" */ \"./toastify\")\n\nexport const success = (content: string | JSX.Element) => {\n  return toastify().then((toast) => {\n    toast.success(content)\n  })\n}\n\nexport const error = (content: string | JSX.Element) => {\n  return toastify().then((toast) => {\n    toast.error(content)\n  })\n}\n","import { Fider } from \"@fider/services\"\n\nconst navigator = {\n  url: () => {\n    return window.location.href\n  },\n  goHome: () => {\n    window.location.href = \"/\"\n  },\n  goTo: (url: string) => {\n    const isEqual = window.location.href === url || window.location.pathname === url\n    if (!isEqual) {\n      window.location.href = url\n    }\n  },\n  replaceState: (path: string): void => {\n    if (history.replaceState !== undefined) {\n      const newURL = Fider.settings.baseURL + path\n      window.history.replaceState({ path: newURL }, \"\", newURL)\n    }\n  },\n}\n\nexport default navigator\n","import navigator from \"./navigator\"\n\nexport const getNumber = (name: string): number | undefined => {\n  return parseInt(get(name), 10) || undefined\n}\n\nexport const set = (name: string, value: any): string => {\n  const uri = navigator.url()\n  const re = new RegExp(\"([?&])\" + name + \"=.*?(&|$)\", \"i\")\n  if (uri.match(re)) {\n    return uri.replace(re, \"$1\" + name + \"=\" + value + \"$2\")\n  } else {\n    const separator = uri.indexOf(\"?\") !== -1 ? \"&\" : \"?\"\n    return uri + separator + name + \"=\" + value\n  }\n}\n\nexport const get = (name: string): string => {\n  name = name.replace(/[[\\]]/g, \"\\\\$&\")\n  const regex = new RegExp(\"[?&]\" + name + \"(=([^&#]*)|&|#|$)\")\n  const url = navigator.url()\n  const results = regex.exec(url)\n\n  if (!results || !results[2]) {\n    return \"\"\n  }\n\n  return decodeURIComponent(results[2].replace(/\\+/g, \" \"))\n}\n\nexport const getArray = (name: string): string[] => {\n  const qs = get(name)\n  if (qs) {\n    return qs.split(\",\").filter((i) => i)\n  }\n\n  return []\n}\n\nexport interface QueryString {\n  [key: string]: string | string[] | number | undefined\n}\n\nexport const stringify = (object: QueryString | undefined): string => {\n  if (!object) {\n    return \"\"\n  }\n\n  let qs = \"\"\n\n  for (const key of Object.keys(object)) {\n    const symbol = qs ? \"&\" : \"?\"\n    const value = object[key]\n    if (value instanceof Array) {\n      if (value.length > 0) {\n        qs += `${symbol}${key}=${value.join(\",\")}`\n      }\n    } else if (value) {\n      qs += `${symbol}${key}=${encodeURIComponent(value.toString()).replace(/%20/g, \"+\")}`\n    }\n  }\n\n  return qs\n}\n","export const isTouch = (): boolean => {\n  return \"ontouchstart\" in window || navigator.maxTouchPoints > 0\n}\n","import { http, Result } from \"@fider/services/http\"\nimport { UserSettings, UserAvatarType, ImageUpload } from \"@fider/models\"\n\ninterface UpdateUserSettings {\n  name: string\n  avatar?: ImageUpload\n  avatarType: UserAvatarType\n  settings: UserSettings\n}\n\nexport const updateUserSettings = async (request: UpdateUserSettings): Promise<Result> => {\n  return await http.post(\"/_api/user/settings\", request)\n}\n\nexport const changeUserEmail = async (email: string): Promise<Result> => {\n  return await http.post(\"/_api/user/change-email\", {\n    email,\n  })\n}\n\nexport const deleteCurrentAccount = async (): Promise<Result> => {\n  return await http.delete(\"/_api/user\")\n}\n\nexport const regenerateAPIKey = async (): Promise<Result<{ apiKey: string }>> => {\n  return await http.post<{ apiKey: string }>(\"/_api/user/regenerate-apikey\")\n}\n","import { http, Result } from \"@fider/services/http\"\nimport { Tag } from \"@fider/models\"\n\nexport const createTag = async (name: string, color: string, isPublic: boolean): Promise<Result<Tag>> => {\n  return http.post<Tag>(`/api/v1/tags`, { name, color, isPublic }).then(http.event(\"tag\", \"create\"))\n}\n\nexport const updateTag = async (slug: string, name: string, color: string, isPublic: boolean): Promise<Result<Tag>> => {\n  return http.put<Tag>(`/api/v1/tags/${slug}`, { name, color, isPublic }).then(http.event(\"tag\", \"update\"))\n}\n\nexport const deleteTag = async (slug: string): Promise<Result> => {\n  return http.delete(`/api/v1/tags/${slug}`).then(http.event(\"tag\", \"delete\"))\n}\n\nexport const assignTag = async (slug: string, postNumber: number): Promise<Result> => {\n  return http.post(`/api/v1/posts/${postNumber}/tags/${slug}`).then(http.event(\"tag\", \"assign\"))\n}\n\nexport const unassignTag = async (slug: string, postNumber: number): Promise<Result> => {\n  return http.delete(`/api/v1/posts/${postNumber}/tags/${slug}`).then(http.event(\"tag\", \"unassign\"))\n}\n","import { http, Result, querystring } from \"@fider/services\"\nimport { Post, Vote, ImageUpload, UserNames } from \"@fider/models\"\n\nexport const getAllPosts = async (): Promise<Result<Post[]>> => {\n  return await http.get<Post[]>(\"/api/v1/posts\")\n}\n\nexport interface SearchPostsParams {\n  query?: string\n  view?: string\n  limit?: number\n  tags?: string[]\n  myVotes?: boolean\n  statuses?: string[]\n}\n\nexport const searchPosts = async (params: SearchPostsParams): Promise<Result<Post[]>> => {\n  let qsParams = querystring.stringify({\n    tags: params.tags,\n    statuses: params.statuses,\n    query: params.query,\n    view: params.view,\n    limit: params.limit,\n  })\n  if (params.myVotes) {\n    qsParams += `&myvotes=true`\n  }\n  return await http.get<Post[]>(`/api/v1/posts${qsParams}`)\n}\n\nexport const deletePost = async (postNumber: number, text: string): Promise<Result> => {\n  return http\n    .delete(`/api/v1/posts/${postNumber}`, {\n      text,\n    })\n    .then(http.event(\"post\", \"delete\"))\n}\n\nexport const addVote = async (postNumber: number): Promise<Result> => {\n  return http.post(`/api/v1/posts/${postNumber}/votes`).then(http.event(\"post\", \"vote\"))\n}\n\nexport const removeVote = async (postNumber: number): Promise<Result> => {\n  return http.delete(`/api/v1/posts/${postNumber}/votes`).then(http.event(\"post\", \"unvote\"))\n}\n\nexport const toggleVote = async (postNumber: number): Promise<Result<{ voted: boolean }>> => {\n  return http.post<{ voted: boolean }>(`/api/v1/posts/${postNumber}/votes/toggle`).then(http.event(\"post\", \"toggle-vote\"))\n}\n\nexport const subscribe = async (postNumber: number): Promise<Result> => {\n  return http.post(`/api/v1/posts/${postNumber}/subscription`).then(http.event(\"post\", \"subscribe\"))\n}\n\nexport const unsubscribe = async (postNumber: number): Promise<Result> => {\n  return http.delete(`/api/v1/posts/${postNumber}/subscription`).then(http.event(\"post\", \"unsubscribe\"))\n}\n\nexport const listVotes = async (postNumber: number): Promise<Result<Vote[]>> => {\n  return http.get<Vote[]>(`/api/v1/posts/${postNumber}/votes`)\n}\n\nexport const getTaggableUsers = async (userFilter: string): Promise<Result<UserNames[]>> => {\n  return http.get<UserNames[]>(`/api/v1/taggable-users${querystring.stringify({ query: userFilter })}`)\n}\n\nexport const createComment = async (postNumber: number, content: string, attachments: ImageUpload[]): Promise<Result> => {\n  return http.post(`/api/v1/posts/${postNumber}/comments`, { content, attachments }).then(http.event(\"comment\", \"create\"))\n}\n\nexport const updateComment = async (postNumber: number, commentID: number, content: string, attachments: ImageUpload[]): Promise<Result> => {\n  return http.put(`/api/v1/posts/${postNumber}/comments/${commentID}`, { content, attachments }).then(http.event(\"comment\", \"update\"))\n}\n\nexport const deleteComment = async (postNumber: number, commentID: number): Promise<Result> => {\n  return http.delete(`/api/v1/posts/${postNumber}/comments/${commentID}`).then(http.event(\"comment\", \"delete\"))\n}\ninterface ToggleReactionResponse {\n  added: boolean\n}\n\nexport const toggleCommentReaction = async (postNumber: number, commentID: number, emoji: string): Promise<Result<ToggleReactionResponse>> => {\n  return http.post<ToggleReactionResponse>(`/api/v1/posts/${postNumber}/comments/${commentID}/reactions/${emoji}`)\n}\n\ninterface SetResponseInput {\n  status: string\n  text: string\n  originalNumber: number\n}\n\nexport const respond = async (postNumber: number, input: SetResponseInput): Promise<Result> => {\n  return http\n    .put(`/api/v1/posts/${postNumber}/status`, {\n      status: input.status,\n      text: input.text,\n      originalNumber: input.originalNumber,\n    })\n    .then(http.event(\"post\", \"respond\"))\n}\n\ninterface CreatePostResponse {\n  id: number\n  number: number\n  title: string\n  slug: string\n}\n\nexport const createPost = async (title: string, description: string, attachments: ImageUpload[]): Promise<Result<CreatePostResponse>> => {\n  return http.post<CreatePostResponse>(`/api/v1/posts`, { title, description, attachments }).then(http.event(\"post\", \"create\"))\n}\n\nexport const updatePost = async (postNumber: number, title: string, description: string, attachments: ImageUpload[]): Promise<Result> => {\n  return http.put(`/api/v1/posts/${postNumber}`, { title, description, attachments }).then(http.event(\"post\", \"update\"))\n}\n","import { http, Result } from \"@fider/services/http\"\nimport { UserRole, OAuthConfig, ImageUpload, EmailVerificationKind } from \"@fider/models\"\n\nexport interface CheckAvailabilityResponse {\n  message: string\n}\n\nexport interface CreateTenantRequest {\n  legalAgreement: boolean\n  tenantName: string\n  subdomain?: string\n  name?: string\n  token?: string\n  email?: string\n}\n\nexport interface CreateTenantResponse {\n  token?: string\n}\n\nexport const createTenant = async (request: CreateTenantRequest): Promise<Result<CreateTenantResponse>> => {\n  return await http.post<CreateTenantResponse>(\"/_api/tenants\", request)\n}\n\nexport interface UpdateTenantSettingsRequest {\n  logo?: ImageUpload\n  title: string\n  invitation: string\n  welcomeMessage: string\n  cname: string\n  locale: string\n}\n\nexport const updateTenantSettings = async (request: UpdateTenantSettingsRequest): Promise<Result> => {\n  return await http.post(\"/_api/admin/settings/general\", request)\n}\n\nexport const updateTenantAdvancedSettings = async (customCSS: string): Promise<Result> => {\n  return await http.post(\"/_api/admin/settings/advanced\", { customCSS })\n}\n\nexport const updateTenantPrivacy = async (isPrivate: boolean): Promise<Result> => {\n  return await http.post(\"/_api/admin/settings/privacy\", {\n    isPrivate,\n  })\n}\n\nexport const updateTenantEmailAuthAllowed = async (isEmailAuthAllowed: boolean): Promise<Result> => {\n  return await http.post(\"/_api/admin/settings/emailauth\", {\n    isEmailAuthAllowed,\n  })\n}\n\nexport const checkAvailability = async (subdomain: string): Promise<Result<CheckAvailabilityResponse>> => {\n  return await http.get<CheckAvailabilityResponse>(`/_api/tenants/${subdomain}/availability`)\n}\n\nexport const signIn = async (email: string): Promise<Result> => {\n  return await http.post(\"/_api/signin\", {\n    email,\n  })\n}\n\nexport const completeProfile = async (kind: EmailVerificationKind, key: string, name: string): Promise<Result> => {\n  return await http.post(\"/_api/signin/complete\", {\n    kind,\n    key,\n    name,\n  })\n}\n\nexport const changeUserRole = async (userID: number, role: UserRole): Promise<Result> => {\n  return await http.post(`/_api/admin/roles/${role}/users`, {\n    userID,\n  })\n}\n\nexport const blockUser = async (userID: number): Promise<Result> => {\n  return await http.put(`/_api/admin/users/${userID}/block`)\n}\n\nexport const unblockUser = async (userID: number): Promise<Result> => {\n  return await http.delete(`/_api/admin/users/${userID}/block`)\n}\n\nexport const getOAuthConfig = async (provider: string): Promise<Result<OAuthConfig>> => {\n  return await http.get<OAuthConfig>(`/_api/admin/oauth/${provider}`)\n}\n\nexport interface CreateEditOAuthConfigRequest {\n  provider: string\n  status: number\n  displayName: string\n  clientID: string\n  clientSecret: string\n  authorizeURL: string\n  tokenURL: string\n  scope: string\n  profileURL: string\n  jsonUserIDPath: string\n  jsonUserNamePath: string\n  jsonUserEmailPath: string\n  logo?: ImageUpload\n  isTrusted: boolean\n}\n\nexport const saveOAuthConfig = async (request: CreateEditOAuthConfigRequest): Promise<Result> => {\n  return await http.post(\"/_api/admin/oauth\", request)\n}\n","import { http, Result } from \"@fider/services\"\nimport { Notification } from \"@fider/models\"\n\nexport const getTotalUnreadNotifications = async (): Promise<Result<number>> => {\n  return http.get<{ total: number }>(\"/_api/notifications/unread/total\").then((result) => {\n    return {\n      ok: result.ok,\n      error: result.error,\n      data: result.data ? result.data.total : 0,\n    }\n  })\n}\n\nexport const getAllNotifications = async (): Promise<Result<Notification[]>> => {\n  return http.get<Notification[]>(\"/_api/notifications/unread\")\n}\n\nexport const markAllAsRead = async (): Promise<Result> => {\n  return await http.post(\"/_api/notifications/read-all\")\n}\n","import { http, Result } from \"@fider/services\"\n\nexport const sendInvites = async (subject: string, message: string, recipients: string[]): Promise<Result> => {\n  return http.post(\"/api/v1/invitations/send\", { subject, message, recipients }).then(http.event(\"invite\", \"send\"))\n}\n\nexport const sendSampleInvite = async (subject: string, message: string): Promise<Result> => {\n  return http.post(\"/api/v1/invitations/sample\", { subject, message }).then(http.event(\"invite\", \"sample\"))\n}\n","import { http, Result, navigator, analytics } from \"@fider/services\"\n\nconst ignoreErrors = [\n  \"http://gj.track.uc.cn/collect\", // CSP error: UC Browser tries to use sendBeacon to this domain, which is blocked by our CSP rule\n  \"null is not an object (evaluating 'c.sheet.insertRule')\", // CSP error: UC Browser throws this error even when page is loaded sucessfully\n  \"Refused to evaluate a string as JavaScript because 'unsafe-eval'\", // CSP error: usually thrown because of bad Chrome Extensions\n  \"vid_mate_check is not defined\", // CSP error: thrown by VidMate, an Android Browser\n  \"SecurityError: Failed to read the 'cssRules' property from 'CSSStyleSheet': Cannot access rules\", // CSP error: usually thrown because of bad Chrome Extensions\n]\n\nexport const logError = async (message: string, err?: Error): Promise<Result | undefined> => {\n  for (const pattern of ignoreErrors) {\n    if (message.indexOf(pattern) >= 0) {\n      return\n    }\n  }\n\n  const data = {\n    url: navigator.url(),\n    stack: err ? err.stack : \"<not available>\",\n  }\n\n  try {\n    analytics.error(err)\n    return await http.post(\"/_api/log-error\", { message, data })\n  } catch (err) {\n    console.error(err)\n  }\n}\n","import { http, Result, StringObject } from \"@fider/services\"\nimport { WebhookData, WebhookPreviewResult, WebhookTriggerResult, WebhookType } from \"@fider/models\"\n\nexport const createWebhook = async (data: WebhookData): Promise<Result<{ id: number }>> => {\n  return await http.post(`/_api/admin/webhook`, data)\n}\n\nexport const updateWebhook = async (id: number, data: WebhookData): Promise<Result> => {\n  return await http.put(`/_api/admin/webhook/${id}`, data)\n}\n\nexport const deleteWebhook = async (id: number): Promise<Result> => {\n  return await http.delete(`/_api/admin/webhook/${id}`)\n}\n\nexport const testWebhook = async (id: number): Promise<Result<WebhookTriggerResult>> => {\n  return await http.get(`/_api/admin/webhook/test/${id}`)\n}\n\nexport const previewWebhook = async (type: WebhookType, url: string, content: string): Promise<Result<WebhookPreviewResult>> => {\n  return await http.post(\"/_api/admin/webhook/preview\", { type, url, content })\n}\n\nexport const getWebhookHelp = async (type: WebhookType): Promise<Result<StringObject>> => {\n  return await http.get(`/_api/admin/webhook/props/${type}`)\n}\n","import { http, Result } from \"../http\"\n\ninterface CheckoutPageLink {\n  url: string\n}\n\nexport const generateCheckoutLink = async (planId: string): Promise<Result<CheckoutPageLink>> => {\n  return await http.post(\"/_api/billing/checkout-link\", { planId })\n}\n","import { I18nProvider } from \"@lingui/react\"\nimport React from \"react\"\nimport ReactDOM from \"react-dom/client\"\nimport { i18n } from \"@lingui/core\"\n\nimport { ToastContainer, toast, ToastContent, ToastOptions } from \"react-toastify\"\nimport \"react-toastify/dist/ReactToastify.css\"\n\nlet hasContainer = false\n\nconst setup = () => {\n  if (!hasContainer) {\n    hasContainer = true\n    const rootElement = document.getElementById(\"root-toastify\")\n    if (rootElement) {\n      const root = ReactDOM.createRoot(rootElement)\n      root.render(\n        <I18nProvider i18n={i18n}>\n          <ToastContainer position={toast.POSITION.TOP_RIGHT} />\n        </I18nProvider>\n      )\n    }\n  }\n}\nexport const success = (content: ToastContent, options?: ToastOptions) => {\n  setup()\n  toast.success(content, options)\n}\n\nexport const error = (content: ToastContent, options?: ToastOptions) => {\n  setup()\n  toast.error(content, options)\n}\n"],"names":["HoverInfo","props","Elem","href","classList","classSet","clickable","undefined","onClick","React","className","text","target","Icon","width","height","sprite","IconInformationCircle","styles","style","src","viewBox","xlinkHref","id","MentionList","forwardRef","ref","selectedIndex","setSelectedIndex","useState","selectItem","index","item","items","command","useEffect","useImperativeHandle","onKeyDown","event","key","length","map","label","displayName","cachedUsers","async","query","result","actions","ok","data","user","toString","name","filter","toLowerCase","startsWith","slice","render","reactRenderer","containerElement","scrollListener","clickOutsideListener","initialPosition","onStart","ReactRenderer","editor","clientRect","MouseEvent","Node","contains","window","removeEventListener","document","parentNode","body","removeChild","view","focus","setTimeout","addEventListener","createElement","position","zIndex","appendChild","element","rect","top","bottom","scrollY","left","scrollX","passive","onUpdate","updateProps","console","log","onExit","destroy","CustomMention","Mention","extend","addStorage","markdown","serialize","state","node","write","attrs","parse","setup","markdownit","renderer","rules","mention_open","tokens","idx","token","attrGet","mention_close","inline","ruler","before","silent","match","pos","push","content","MenuBar","isMarkdownMode","toggleMarkdownMode","disabled","type","title","chain","toggleHeading","level","run","isActive","IconH2","IconH3","toggleBold","IconBold","toggleItalic","IconItalic","toggleStrike","IconStrike","toggleBulletList","IconBulletList","toggleOrderedList","IconOrderedList","toggleCodeBlock","IconCode","from","selection","textBefore","doc","textBetween","Math","max","insertContent","IconAt","_Trans","markdownToHtml","markdownString","split","line","join","replace","Tiptap","isRawMarkdownMode","setIsRawMarkdownMode","editorContent","setEditorContent","initialValue","extensions","Document","Paragraph","Text","HardBreak","Placeholder","configure","placeholder","emptyEditorClass","StarterKit","Markdown","html","breaks","HTMLAttributes","class","suggestion","useEditor","updated","getText","storage","getMarkdown","onChange","onFocus","editorProps","attributes","currentContent","EditorContent","prevProps","nextProps","ErrorBoundary","constructor","super","this","error","errorInfo","componentDidCatch","onError","setState","FiderContext","Consumer","fider","ErrorPage","showDetails","isProduction","children","ResponseDetails","status","PostStatus","Get","response","Open","VStack","align","spacing","ResponseLozenge","timeSince","Date","respondedAt","Duplicate","original","number","slug","icon","bg","color","border","Declined","HeroIconThumbsDown","HeroIconDuplicate","Completed","HeroIconCheck","Planned","HeroIconThumbsUp","HeroIconSparkles","getLozengeProps","HStack","small","value","ShowPostStatus","i18n","_","message","ButtonClickEvent","preventEnable","shouldEnable","canEnable","Button","size","variant","clicked","setClicked","unmountedContainer","useRef","current","buttonContent","onClickProp","rel","e","preventDefault","stopPropagation","ValidationContext","Form","autoComplete","DisplayError","Provider","arrayToTag","m","hasError","field","errors","err","dict","reduce","fields","Object","keys","prototype","hasOwnProperty","call","forEach","t","Input","currentTarget","suffix","onIconClick","ctx","htmlFor","afterLabel","tabIndex","noTabFocus","inputRef","autoFocus","maxLength","ImageUploader","_defineProperty","files","file","alert","base64","fileToBase64","bkey","upload","fileName","contentType","remove","previewURL","instanceID","fileSelector","click","showModal","uploadedImageURL","modal","Modal","Window","isOpen","onClose","closeModal","center","Content","alt","Footer","isUploading","hasFile","openModal","removeFile","fileChanged","accept","selectFile","IconPhotograph","MultiImageUploader","instances","removed","count","maxUploads","addNewElement","triggerOnChange","bkeys","uploads","k","concat","x","btoa","random","imageUploaded","elements","TextArea","selectionStart","Textarea","minRows","RadioButton","selected","setSelected","defaultOption","option","onSelect","inputs","options","checked","Select","filtered","getOption","defaultValue","o","Field","Checkbox","setChecked","isChecked","ImageViewerModal","loadedPreview","Loader","onLoad","onPreviewLoad","imgSrc","ImageViewer","setShowModal","loadedThumbnail","setLoadedThumbnail","setLoadedPreview","onThumbnailLoad","tagName","dangerouslySetInnerHTML","__html","truncate","DevBanner","useFider","Avatar","avatarURL","AvatarStack","classes","overlap","users","i","Message","showIcon","IconExclamation","IconExclamationCircle","IconCheckCircle","justify","alignment","Hint","cacheKey","permanentCloseKey","isClosed","setIsClosed","cache","local","has","condition","IconX","close","set","TermsOfService","settings","hasLegal","PrivacyPolicy","LegalNotice","components","0","1","LegalFooter","LegalAgreement","SocialSignInButton","redirectTo","location","url","logoURL","OAuthProviderLogo","SignInControl","showEmailForm","setShowEmailForm","session","tenant","isEmailAuthAllowed","email","setEmail","setError","providersLen","oauth","isCookieEnabled","provider","useEmail","Divider","device","onEmailSent","Moment","date","format","now","display","getTime","formatDate","locale","tooltip","ModalWindow","canClose","root","getElementById","overflow","keyDown","keyCode","ReactDOM","evt","Header","UserName","isStaff","role","isCollaborator","showEmail","xmlns","fill","fillRule","d","clipRule","show","setShow","useTimeout","TenantLogoURL","logoBlobKey","TenantLogo","useFiderIfEmpty","systemProvidersLogo","google","facebook","github","OAuthProviderLogoURL","Toggle","active","setActive","toggle","newActive","onToggle","PoweredByFider","source","encodeURIComponent","host","campaign","slot","PageTitle","subtitle","DropdownContext","createContext","Dropdown","setIsOpen","changeToggleState","newState","onToggled","handleClick","listClassName","wide","fullsceenSm","toggleIsOpen","renderHandle","ListItem","useContext","Money","formatter","Intl","NumberFormat","currency","amount","ShowTag","circular","link","tag","isPublic","backgroundColor","ShieldCheck","isSignInModalOpen","setIsSignInModalOpen","SignInModal","hideModal","isAuthenticated","NotificationIndicator","UserMenu","values","VoteCounter","hasVoted","setHasVoted","post","votesCount","setVotesCount","isDisabled","closed","isReadOnly","vote","action","FaCaretUp","NotificationItem","notification","openNotification","authorName","Fider","currentLocale","createdAt","NotificationIcon","unreadNotifications","IconBell","setUnreadNotifications","showingNotifications","setShowingNotifications","recent","setRecent","unread","setUnread","then","read","reload","divide","n","NoDataIllustration","availableEmojis","Reactions","emojiSelectorRef","toggleReaction","reactions","isEmojiSelectorOpen","setIsEmojiSelectorOpen","handleClickOutside","ReactionAdd","emoji","reaction","_extends","includesMe","ReadOnlyNotice","isAdministrator","Stack","dir","flex","filterable","All","Error","_PostStatus","Started","TenantStatus","UserAvatarType","UserStatus","UserRole","Collaborator","Administrator","OAuthConfigStatus","Disabled","Enabled","BillingStatus","WebhookType","WebhookStatus","request","method","headers","fetch","JSON","stringify","credentials","json","notify","toResult","truncatedBody","http","get","put","delete","category","analytics","setItem","localStorage","getItem","removeItem","sessionStorage","eventCategory","eventAction","ga","exDescription","stack","exFatal","FiderSession","pPage","page","pContextID","contextID","pProps","pUser","pTenant","initData","pSettings","pSession","el","textContent","innerText","Locked","environment","isSingleHostMode","mode","jwt","decode","segments","atob","input","trim","dateOpts","day","month","year","short","full","hour","minute","DateTimeFormat","toLocaleString","dateFormat","seconds","round","minutes","hours","days","months","years","rtf","RelativeTimeFormat","numeric","Promise","resolve","reject","reader","FileReader","parts","readAsDataURL","timeAgo","cookie","ret","indexOf","assetsURL","substr","copyToClipboard","navigator","clipboard","writeText","clearUrlHash","oldURL","newURL","pathname","search","history","replaceState","pushState","hashChangeEvent","HashChangeEvent","cancelable","bubbles","composed","dispatchEvent","activateI18NSync","messages","load","activate","activateI18N","marked","setOptions","headerIds","xhtml","smartLists","gfm","DOMPurify","isSupported","setConfig","USE_PROFILES","ADD_ATTR","fullRenderer","Renderer","image","plainTextRenderer","_href","_title","br","strong","list","listitem","heading","paragraph","code","codespan","del","entities","encodeHTML","s","sanitize","plainText","toastify","success","toast","goHome","goTo","path","baseURL","getNumber","parseInt","uri","re","RegExp","separator","regex","results","exec","decodeURIComponent","getArray","qs","object","symbol","Array","isTouch","maxTouchPoints","updateUserSettings","changeUserEmail","deleteCurrentAccount","regenerateAPIKey","createTag","updateTag","deleteTag","assignTag","postNumber","unassignTag","getAllPosts","searchPosts","qsParams","querystring","tags","params","statuses","limit","myVotes","deletePost","addVote","removeVote","toggleVote","subscribe","unsubscribe","listVotes","getTaggableUsers","userFilter","createComment","attachments","updateComment","commentID","deleteComment","toggleCommentReaction","respond","originalNumber","createPost","description","updatePost","createTenant","updateTenantSettings","updateTenantAdvancedSettings","customCSS","updateTenantPrivacy","isPrivate","updateTenantEmailAuthAllowed","checkAvailability","subdomain","signIn","completeProfile","kind","changeUserRole","userID","blockUser","unblockUser","getOAuthConfig","saveOAuthConfig","getTotalUnreadNotifications","total","getAllNotifications","markAllAsRead","sendInvites","subject","recipients","sendSampleInvite","ignoreErrors","logError","pattern","createWebhook","updateWebhook","deleteWebhook","testWebhook","previewWebhook","getWebhookHelp","generateCheckoutLink","planId","hasContainer","rootElement","I18nProvider","ToastContainer","POSITION","TOP_RIGHT"],"sourceRoot":""}