{"version":3,"file":"js/common.1f3b9d768608095ccc32.js","mappings":"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","sources":["webpack://fider/./public/components/Footer.tsx","webpack://fider/./public/components/common/CollapsiblePanel.tsx","webpack://fider/./public/components/common/HoverInfo.tsx","webpack://fider/./public/components/common/Icon.tsx","webpack://fider/./public/components/common/Tabs.tsx","webpack://fider/./public/components/common/form/ImageViewer.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/CommentEditor.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/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/device.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/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/actions/file.ts","webpack://fider/./public/services/toastify.tsx"],"sourcesContent":["import \"./Footer.scss\"\nimport React from \"react\"\n\nconst Footer: React.FC = () => {\n const currentYear = new Date().getFullYear()\n\n return (\n \n )\n}\n\nexport default Footer\n","import React, { useState, useRef } from \"react\"\nimport { classSet } from \"@fider/services\"\n\nimport \"./CollapsiblePanel.scss\"\n\ninterface CollapsiblePanelProps {\n title: string\n children: React.ReactNode\n defaultOpen?: boolean\n className?: string\n icon?: React.ReactNode\n}\n\nexport const CollapsiblePanel: React.FC = ({ \n title, \n children, \n defaultOpen = false,\n className,\n icon\n}) => {\n const [isOpen, setIsOpen] = useState(defaultOpen)\n const contentRef = useRef(null)\n\n const togglePanel = () => {\n setIsOpen(!isOpen)\n }\n\n return (\n
\n
{\n e.preventDefault();\n e.stopPropagation();\n togglePanel();\n }}\n onKeyPress={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n togglePanel();\n }\n }}\n >\n

\n {icon && {icon}}\n {title}\n

\n \n {isOpen ? \"▲\" : \"▼\"}\n \n
\n
\n {isOpen && children}\n
\n
\n )\n}","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 \n \n \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 \n }\n\n return (\n \n \n \n )\n}\n","import \"./Tabs.scss\"\nimport React from \"react\"\nimport { classSet } from \"@fider/services\"\n\ninterface TabItem {\n value: string\n label: React.ReactNode\n counter?: number\n}\n\ninterface TabsProps {\n tabs: TabItem[]\n activeTab: string\n onChange: (value: string) => void\n className?: string\n}\n\nexport const Tabs: React.FC = (props) => {\n const { tabs, activeTab, onChange, className } = props\n\n const handleTabClick = (value: string) => {\n if (value !== activeTab) {\n onChange(value)\n }\n }\n\n return (\n
\n
\n {tabs.map((tab) => (\n handleTabClick(tab.value)}\n >\n {tab.label}\n {tab.counter !== undefined && (\n {tab.counter}\n )}\n
\n ))}\n
\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 \n \n {!props.loadedPreview && }\n \"\"\n \n\n \n \n \n \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
\n \n {!loadedThumbnail && }\n \"\"\n
\n )\n}\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 {\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 {(fider) => }\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 \n \n
{timeSince(\"en\", new Date(), props.response.respondedAt, \"date\")}
\n {props.response?.text && status !== PostStatus.Duplicate && (\n
\n \n
\n )}\n\n {status === PostStatus.Duplicate && props.response.original && (\n \n )}\n
\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
\n }\n\n return (\n
\n \n {!props.small && }\n {status.title}\n \n
\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 {title}\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 | 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 = ({ 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 \"shadow-sm\": variant == \"primary\" || variant == \"secondary\",\n })\n\n let buttonContent: JSX.Element\n const onClickProp = props.onClick\n\n if (props.href) {\n buttonContent = (\n \n {props.children}\n \n )\n } else if (onClickProp) {\n const onClick = async (e?: React.SyntheticEvent) => {\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 \n )\n } else {\n buttonContent = (\n \n )\n }\n\n return buttonContent\n}\n\nButton.defaultProps = {\n size: \"default\",\n variant: \"secondary\",\n type: \"button\",\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({})\n\nexport const Form: React.FunctionComponent = (props) => {\n const className = classSet({\n \"c-form\": true,\n [props.className || \"\"]: props.className,\n })\n\n return (\n
\n \n {props.children}\n \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) =>
  • {m}
  • )\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
    \n
      {items}
    \n
    \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 type?: string\n min?: number\n max?: number\n onIconClick?: () => void\n onFocus?: () => void\n inputRef?: React.MutableRefObject\n onChange?: (value: string) => void\n}\n\nexport const Input: React.FunctionComponent = (props) => {\n const onChange = (e: React.FormEvent) => {\n if (props.onChange) {\n props.onChange(e.currentTarget.value)\n }\n }\n\n const suffix = typeof props.suffix === \"string\" ? {props.suffix} : props.suffix\n\n const icon = props.icon ? : undefined\n\n return (\n \n {(ctx) => (\n \n {!!props.label && (\n \n )}\n \n \n {icon}\n {suffix}\n \n \n {props.children}\n
    \n )}\n \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 = 7.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 {\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) => {\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 7MB.\")\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 \n {this.props.bkey ? \"\" : \"\"}\n\n \n \n \n \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 \n {(ctx) => (\n \n {this.modal()}\n {this.props.label && }\n\n {hasFile && (\n
    \n \"\"\n {!this.props.disabled && (\n \n )}\n
    \n )}\n\n (this.fileSelector = e)} type=\"file\" onChange={this.fileChanged} accept=\"image/png, image/jpeg, image/jpg, image/webp\" />\n {!hasFile && (\n \n )}\n \n {this.props.children}\n \n )}\n
    \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 {\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: ,\n }\n }\n\n public render() {\n const elements = Object.keys(this.state.instances).map((k) => this.state.instances[k].element)\n return (\n \n {(ctx) => (\n \n
    {elements}
    \n \n \n )}\n
    \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) => void\n inputRef?: React.MutableRefObject\n onFocus?: React.FocusEventHandler\n className?: string\n maxLength?: number\n}\n\nexport const TextArea: React.FunctionComponent = (props) => {\n const onChange = (e: React.FormEvent) => {\n if (props.onChange) {\n props.onChange(e.currentTarget.value, e.currentTarget.selectionStart)\n }\n }\n\n const onKeyDown = (e: React.KeyboardEvent) => {\n if (props.onKeyDown) {\n props.onKeyDown(e)\n }\n }\n\n return (\n \n {(ctx) => (\n <>\n
    \n {!!props.label && (\n \n )}\n \n \n {props.children}\n
    \n \n )}\n
    \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 \n \n \n \n ))\n\n return (\n
    \n \n {inputs}\n
    \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 = (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(getOption(props.defaultValue))\n const onChange = (e: React.FormEvent) => {\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 \n {(ctx) => (\n <>\n
    \n {!!props.label && }\n \n {props.options.map((option) => (\n \n ))}\n \n \n {props.children}\n
    \n \n )}\n
    \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 = (props) => {\n const fields = props.field ? [props.field] : undefined\n return (\n \n {(ctx) => (\n \n {!!props.label && (\n \n )}\n {props.children}\n \n \n )}\n \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 = (props) => {\n const [checked, setChecked] = useState(props.checked || false)\n\n const onChange = (e: React.ChangeEvent) => {\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 \n {(ctx) => (\n \n
    \n \n \n \n \n \n
    \n \n )}\n
    \n )\n}\n","import React, { useMemo, useCallback, useRef, useEffect, useState, Fragment, ReactNode } from \"react\"\nimport { Element, Editor, Transforms, Range, createEditor, Descendant, BaseEditor, BaseRange, Node } from \"slate\"\nimport { HistoryEditor, withHistory } from \"slate-history\"\nimport { Slate, Editable, ReactEditor, withReact, useSelected, useFocused, RenderPlaceholderProps } from \"slate-react\"\n\nexport const IS_MAC = typeof navigator !== \"undefined\" && /Mac OS X/.test(navigator.userAgent)\n\nimport ReactDOM from \"react-dom\"\nimport { UserNames } from \"@fider/models\"\nimport { actions } from \"@fider/services\"\n\nimport \"./CommentEditor.scss\"\n\nexport type TextType = { text: string }\n\ninterface RenderElementProps {\n attributes: React.HTMLAttributes\n element: CustomElement\n children: React.ReactNode\n}\n\ntype MentionElement = {\n type: \"mention\"\n character: string\n children: TextType[]\n}\n\nexport type ParagraphElement = {\n type: \"paragraph\"\n children: Descendant[]\n}\n\ntype CustomElement = MentionElement | ParagraphElement\n\ntype CustomEditor = BaseEditor &\n ReactEditor &\n HistoryEditor & {\n nodeToDecorations?: Map\n }\n\nconst emptyValue: Descendant[] = [\n {\n type: \"paragraph\",\n children: [{ text: \"\" }],\n },\n]\n\ndeclare module \"slate\" {\n interface CustomTypes {\n Editor: CustomEditor\n Element: CustomElement\n Text: TextType\n Range: BaseRange & {\n [key: string]: unknown\n }\n }\n}\n\nconst Portal = ({ children }: { children?: ReactNode }) => {\n return typeof document === \"object\" ? ReactDOM.createPortal(children, document.body) : null\n}\n\ninterface CommentEditorProps {\n initialValue?: string\n placeholder?: string\n onChange?: (value: string) => void\n onFocus?: React.FocusEventHandler\n className?: string\n readOnly?: boolean\n}\n\nconst Placeholder = ({ attributes, children }: RenderPlaceholderProps) => {\n return (\n \n {children}\n \n )\n}\n\nexport const CommentEditor: React.FunctionComponent = (props) => {\n const [users, setUsers] = useState([])\n const ref = useRef(null)\n const [target, setTarget] = useState()\n const [index, setIndex] = useState(0)\n const [search, setSearch] = useState(\"\")\n\n useEffect(() => {\n if (target) {\n const loadUsers = async () => {\n const result = await actions.getTaggableUsers(search)\n if (result.ok) {\n setUsers(result.data)\n }\n }\n loadUsers()\n }\n }, [search, target])\n const filteredUsers = users\n\n const renderElement = useCallback((props: RenderElementProps) => , [])\n const editor = useMemo(() => withMentions(withReact(withHistory(createEditor()))), [])\n\n const onKeyDown = useCallback(\n (event: React.KeyboardEvent) => {\n if (target && filteredUsers.length > 0) {\n switch (event.key) {\n case \"ArrowDown\": {\n event.preventDefault()\n const prevIndex = index >= filteredUsers.length - 1 ? 0 : index + 1\n setIndex(prevIndex)\n break\n }\n case \"ArrowUp\": {\n event.preventDefault()\n const nextIndex = index <= 0 ? filteredUsers.length - 1 : index - 1\n setIndex(nextIndex)\n break\n }\n case \"Tab\":\n case \"Enter\":\n event.preventDefault()\n Transforms.select(editor, target)\n insertMention(editor, filteredUsers[index])\n setTarget(undefined)\n break\n case \"Escape\":\n event.preventDefault()\n setTarget(undefined)\n break\n }\n }\n },\n [filteredUsers, editor, index, target]\n )\n\n // Where to show the mentions portal\n useEffect(() => {\n if (target && filteredUsers.length > 0 && ref.current) {\n const el = ref.current\n const domRange = ReactEditor.toDOMRange(editor, target)\n const rect = domRange.getBoundingClientRect()\n el.style.top = `${rect.top + window.pageYOffset + 24}px`\n el.style.left = `${rect.left + window.pageXOffset}px`\n }\n }, [filteredUsers.length, editor, index, search, target])\n\n const initialValue = props.initialValue ? deserialize(props.initialValue) : emptyValue\n\n return (\n {\n const { selection } = editor\n\n if (selection && Range.isCollapsed(selection)) {\n const [start] = Range.edges(selection)\n \n const currentPoint = { path: start.path, offset: start.offset }\n const [node] = Editor.node(editor, start.path)\n const textBeforeCursor = Node.string(node).slice(0, start.offset)\n const lastAtIndex = textBeforeCursor.lastIndexOf('@')\n if (lastAtIndex !== -1) {\n const potentialMention = textBeforeCursor.slice(lastAtIndex + 1)\n const after = Editor.after(editor, currentPoint)\n const isAtEndOrFollowedBySpace = !after || /^\\s/.test(Editor.string(editor, Editor.range(editor, currentPoint, after)))\n \n if (!potentialMention.includes(' ') && isAtEndOrFollowedBySpace) {\n const mentionRange = {\n anchor: { path: start.path, offset: lastAtIndex },\n focus: currentPoint\n }\n \n setTarget(mentionRange)\n setSearch(potentialMention)\n setIndex(0)\n props.onChange && props.onChange(serialize(descendant))\n return\n }\n }\n\n props.onChange && props.onChange(serialize(descendant))\n }\n\n setTarget(undefined)\n props.onChange && props.onChange(serialize(descendant))\n }}\n >\n \n {target && filteredUsers.length > 0 && !props.readOnly && (\n \n
    \n {filteredUsers.map((user, i) => (\n {\n Transforms.select(editor, target)\n insertMention(editor, user)\n setTarget(undefined)\n }}\n style={{\n padding: \"6px 12px\",\n borderRadius: \"3px\",\n cursor: \"pointer\",\n background: i === index ? \"#B4D5FF\" : \"transparent\",\n }}\n >\n {user.name}\n
    \n ))}\n \n
    \n )}\n \n )\n}\n\nconst withMentions = (editor: CustomEditor) => {\n const { isInline, isVoid, markableVoid } = editor\n\n editor.isInline = (element: CustomElement) => {\n return element.type === \"mention\" ? true : isInline(element)\n }\n\n editor.isVoid = (element: CustomElement) => {\n return element.type === \"mention\" ? true : isVoid(element)\n }\n\n editor.markableVoid = (element: CustomElement) => {\n return element.type === \"mention\" || markableVoid(element)\n }\n\n return editor\n}\n\nconst insertMention = (editor: Editor, user: UserNames) => {\n const newMention = { ...user, isNew: true }\n const mention: MentionElement = {\n type: \"mention\",\n character: user.name,\n children: [{ text: \"@\" + JSON.stringify(newMention) }],\n }\n Transforms.insertNodes(editor, mention)\n Transforms.move(editor)\n}\n\nconst SlateElement = (props: RenderElementProps) => {\n const { attributes, children, element } = props\n switch (element.type) {\n case \"mention\":\n return ; children: React.ReactNode; element: MentionElement })} />\n default:\n return

    {children}

    \n }\n}\n\nconst Mention = ({\n attributes,\n children,\n element,\n}: {\n attributes: React.HTMLAttributes\n children: React.ReactNode\n element: MentionElement\n}) => {\n const selected = useSelected()\n const focused = useFocused()\n const style: React.CSSProperties = {\n boxShadow: selected && focused ? \"0 0 0 2px #B4D5FF\" : \"none\",\n }\n // See if our empty text child has any styling marks applied and apply those\n return (\n \n {/* Prevent Chromium from interrupting IME when moving the cursor */}\n {/* 1. span + inline-block 2. div + contenteditable=false */}\n
    \n {IS_MAC ? (\n // Mac OS IME https://github.com/ianstormtaylor/slate/issues/3490\n \n {children}@{element.character}\n \n ) : (\n // Others like Android https://github.com/ianstormtaylor/slate/pull/5360\n \n @{element.character}\n {children}\n \n )}\n
    \n
    \n )\n}\n\nconst serialize = (nodes: Descendant[]): string => {\n return nodes.map((n) => Node.string(n)).join(\"\\n\")\n}\n\nconst deserialize = (markdown: string): Descendant[] => {\n return markdown.split(\"\\n\").map((line) => {\n const children: Descendant[] = []\n const regex = /@{\\\\?\"id\\\\?\":\\d+,\\\\?\"name\\\\?\":\\\\?\"[^\"]+\\\\?\"(,\\\\?\"isNew\\\\?\":[^}]+)?}/g\n let lastIndex = 0\n\n let match\n while ((match = regex.exec(line)) !== null) {\n // Add text before the mention\n if (match.index > lastIndex) {\n children.push({ text: line.slice(lastIndex, match.index) })\n }\n\n // Handle mention\n try {\n const jsonStr = match[0].replace(/\\\\/g, \"\").slice(1)\n const mentionData = JSON.parse(jsonStr)\n children.push({\n type: \"mention\",\n character: mentionData.name,\n children: [{ text: match[0] }],\n })\n } catch (err) {\n console.error(\"Error parsing mention:\", err)\n // Just add the text as a normal paragraph\n children.push({ text: line })\n }\n\n lastIndex = match.index + match[0].length\n }\n\n // Add remaining text after last mention\n if (lastIndex <= line.length) {\n children.push({ text: line.slice(lastIndex) })\n }\n\n return {\n type: \"paragraph\",\n children,\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
    DEV
    \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 {props.user.name}\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
    \n {props.users.map((x, i) => (\n \n ))}\n
    \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 = (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 \n {props.showIcon === true && }\n {props.children}\n \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 = (props) => {\n const cacheKey: string | undefined = props.permanentCloseKey ? `Hint-Closed-${props.permanentCloseKey}` : undefined\n const [isClosed, setIsClosed] = useState(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 \n {props.children}\n {cacheKey && }\n \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 \n Terms of Service\n \n )\n }\n return null\n}\n\nexport const PrivacyPolicy = () => {\n const fider = useFider()\n\n if (fider.settings.hasLegal) {\n return (\n \n Privacy Policy\n \n )\n }\n return null\n}\n\nexport const LegalNotice = () => {\n const fider = useFider()\n\n if (fider.settings.hasLegal) {\n return (\n

    \n \n By signing in, you agree to the and .\n \n

    \n )\n }\n return null\n}\n\nexport const LegalFooter = () => {\n const fider = useFider()\n\n if (fider.settings.hasLegal) {\n return (\n \n \n \n )\n }\n return null\n}\n\nexport const LegalAgreement: React.FunctionComponent = (props) => {\n const fider = useFider()\n\n if (fider.settings.hasLegal) {\n return (\n \n \n I have read and agree to the and .\n \n \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 \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 = (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(undefined)\n\n const forceShowEmailForm = (e: React.MouseEvent) => {\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 \n

    Cookies Required

    \n

    Cookies are not enabled on your browser. Please enable cookies in your browser preferences to continue.

    \n
    \n )\n }\n\n return (\n
    \n {providersLen > 0 && (\n <>\n
    \n {fider.settings.oauth.map((o) => (\n \n \n \n ))}\n
    \n {props.useEmail && }\n \n )}\n\n {props.useEmail &&\n (showEmailForm ? (\n
    \n

    \n Enter your email address to sign in\n

    \n
    \n \n Sign in\n \n }\n />\n \n {!fider.session.tenant.isEmailAuthAllowed && (\n

    \n Currently only allowed to sign in to an administrator account\n

    \n )}\n
    \n ) : (\n
    \n

    \n \n Email authentication has been disabled by an administrator. If you have an administrator account and need to bypass this restriction, please{\" \"}\n \n click here\n \n .\n \n

    \n
    \n ))}\n
    \n )\n}\n","import React, { useState, useEffect } 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\" | \"short\" | \"full\" | \"date\"\n}\n\nexport const Moment = (props: MomentText) => {\n if (!props.date) {\n return \n }\n\n const [display, setDisplay] = useState(\"\")\n const setNow = useState(new Date())[1]\n\n const format = props.format || \"relative\"\n const date = props.date instanceof Date ? props.date : new Date(props.date)\n\n const getTimeDiff = (): number => {\n return (new Date().getTime() - date.getTime()) / 1000\n }\n\n const getRefreshInterval = (): number => {\n const diffInSeconds = getTimeDiff()\n \n if (diffInSeconds < 60) {\n return 1000\n } else if (diffInSeconds < 3600) {\n return 60 * 1000\n } else if (diffInSeconds < 86400) {\n return 60 * 60 * 1000\n } else {\n return 24 * 60 * 60 * 1000\n }\n }\n\n const updateDisplayText = () => {\n const currentNow = new Date()\n const diffInDays = (currentNow.getTime() - date.getTime()) / (60 * 60 * 24 * 1000)\n \n const newDisplay =\n diffInDays >= 365 && format === \"relative\"\n ? formatDate(props.locale, props.date, \"short\")\n : format === \"relative\"\n ? timeSince(props.locale, currentNow, date)\n : format === \"date\"\n ? formatDate(props.locale, props.date, \"date\")\n : formatDate(props.locale, props.date, format)\n \n setDisplay(newDisplay)\n setNow(currentNow)\n }\n\n useEffect(() => {\n updateDisplayText()\n if (format === \"relative\") {\n const interval = setInterval(() => {\n updateDisplayText()\n }, getRefreshInterval())\n\n return () => clearInterval(interval)\n }\n \n return undefined\n }, [props.date, props.format, props.locale])\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 \n {display}\n \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 = ({ size = \"small\", canClose = true, center = true, ...props }) => {\n const root = useRef(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) => {\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
    \n
    \n
    \n {props.children}\n
    \n
    \n
    ,\n root.current\n )\n}\nconst Header = (props: { children: React.ReactNode }) =>
    {props.children}
    \nconst Content = (props: { children: React.ReactNode }) =>
    {props.children}
    \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
    {props.children}
    \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 { isAdministrator, isCollaborator, isModerator, UserRole, VisualRole, getVisualRoleName } from \"@fider/models\"\nimport { classSet } from \"@fider/services\"\n\ninterface UserNameProps {\n user: {\n id: number\n name: string\n role?: UserRole\n visualRole?: VisualRole\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 isMod = props.user.role && isModerator(props.user.role)\n const isAdmin = props.user.role && isAdministrator(props.user.role)\n \n const getDefaultVisualRole = (): VisualRole => {\n if (!props.user.role) return VisualRole.Visitor\n \n if (isAdmin) return VisualRole.Administrator\n if (isMod) return VisualRole.Moderator\n if (isStaff) return VisualRole.BSGCrew\n return VisualRole.Visitor\n }\n \n let visualRole: VisualRole = VisualRole.None\n \n if (props.user.visualRole !== undefined && props.user.visualRole !== 0) {\n visualRole = props.user.visualRole\n } else {\n visualRole = getDefaultVisualRole()\n }\n \n const classNames: Record = {\n \"c-username\": true,\n }\n \n if (isAdmin) {\n classNames[\"c-username--Admin\"] = true\n } else if (isMod) {\n classNames[\"c-username--Moderator\"] = true\n } else if (isStaff) {\n classNames[\"c-username--BSG\"] = true\n }\n \n if (visualRole !== VisualRole.None) {\n classNames[`vr-${visualRole}`] = true\n }\n \n const className = classSet(classNames)\n const visualRoleName = getVisualRoleName(visualRole)\n\n return (\n
    \n {props.user.name || \"Anonymous\"}\n <>{props.showEmail && props.user.email && ({props.user.email})}\n\n {isStaff && (\n
    \n \n \n \n
    \n )}\n \n {visualRoleName && visualRole !== VisualRole.Visitor && (\n ({visualRoleName})\n )}\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
    \n
    \n {props.text && {props.text}}\n
    \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 {tenant.name}\n } else if (useFiderIfEmpty) {\n return \"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 {props.option.displayName}\n }\n\n if (props.option.provider && props.option.provider in systemProvidersLogo) {\n return {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 = (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 \n {(ctx) => (\n <>\n \n \n {props.label && {props.label}}\n \n {props.field && }\n \n )}\n \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
    \n
    {props.title}
    \n
    {props.subtitle}
    \n
    \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 \n {props.children}\n \n )\n }\n\n return (\n
    \n {props.children}\n
    \n )\n}\n\nconst Divider = () => {\n return
    \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(null)\nDropdownContext.displayName = \"DropdownContext\"\n\nexport const Dropdown = (props: DropdownProps) => {\n const node = useRef(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 \n
    \n \n {isOpen &&
    {props.children}
    }\n
    \n
    \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 {formatter.format(props.amount)}\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 \n \n {!props.tag.isPublic && !props.circular && }\n {props.circular ? \"\" : props.tag.name || \"Tag\"}\n \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
    \n \n \n
    \n \n \n \n

    {fider.session.tenant.name}

    \n
    \n {fider.session.isAuthenticated && (\n \n \n \n \n )}\n {!fider.session.isAuthenticated && (\n \n Sign in\n \n )}\n
    \n
    \n
    \n
    \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 = (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

    \n \n We have just sent a confirmation link to {email}. Click the link and you’ll be signed in.\n \n

    \n

    \n \n

    \n \n ) : (\n \n )\n\n return (\n \n \n Sign in to participate and vote\n \n {content}\n \n \n )\n}\n","import \"./VoteCounter.scss\"\n\nimport React, { useState } from \"react\"\nimport { Post, PostStatus, isPostLocked } 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\"\nimport FaCaretDown from \"@fider/assets/images/fa-caretdown.svg\"\n\n\nexport interface VoteCounterProps {\n post: Post\n}\n\nexport const VoteCounter = (props: VoteCounterProps) => {\n const fider = useFider()\n // Initialize with the post's voteType value: -1 for down, 0 for none, 1 for up\n const [voteType, setVoteType] = useState<'up' | 'down' | 'none'>(\n props.post.voteType === 1 ? 'up' : props.post.voteType === -1 ? 'down' : 'none'\n )\n const [votesCount, setVotesCount] = useState(props.post.votesCount)\n const [isSignInModalOpen, setIsSignInModalOpen] = useState(false)\n\n const handleVote = async (type: 'up' | 'down') => {\n if (!fider.session.isAuthenticated) {\n setIsSignInModalOpen(true)\n return\n }\n\n const status = PostStatus.Get(props.post.status)\n if (status.closed || fider.isReadOnly) {\n return\n }\n\n let response;\n let newVoteType: 'up' | 'down' | 'none';\n let countChange = 0;\n\n // If clicking the same button that is already active, remove the vote\n if (voteType === type) {\n response = await actions.removeVote(props.post.number);\n newVoteType = 'none';\n countChange = type === 'up' ? -1 : 1; // When removing upvote, decrease count; when removing downvote, increase count\n } \n // If clicking the opposite button, switch the vote type\n else if (voteType !== 'none') {\n response = await actions.toggleVote(props.post.number, type);\n newVoteType = type;\n countChange = type === 'up' ? 2 : -2; // +2 for down -> up, -2 for up -> down\n } \n // If no vote currently, add the selected vote type\n else {\n if (type === 'up') {\n response = await actions.addVote(props.post.number);\n newVoteType = 'up';\n countChange = 1;\n } else {\n response = await actions.addDownVote(props.post.number);\n newVoteType = 'down';\n countChange = -1;\n }\n }\n\n if (response.ok) {\n setVotesCount(votesCount + countChange);\n setVoteType(newVoteType);\n }\n }\n\n const hideModal = () => setIsSignInModalOpen(false)\n\n const status = PostStatus.Get(props.post.status)\n const isDisabled = status.closed || fider.isReadOnly || isPostLocked(props.post)\n\n const upvoteClassName = classSet({\n \"c-vote-counter__button\": true,\n \"c-vote-counter__button--voted\": !status.closed && voteType === 'up',\n \"c-vote-counter__button--disabled\": isDisabled,\n })\n\n const downvoteClassName = classSet({\n \"c-vote-counter__button\": true, \n \"c-vote-counter__button--down\": true,\n \"c-vote-counter__button--voted\": !status.closed && voteType === 'down',\n \"c-vote-counter__button--disabled\": isDisabled,\n })\n\n const countClassName = classSet({\n \"c-vote-counter__count\": true,\n \"c-vote-counter__count--positive\": votesCount > 0,\n \"c-vote-counter__count--negative\": votesCount < 0,\n \"c-vote-counter__count--neutral\": votesCount === 0,\n })\n\n return (\n <>\n \n
    \n \n \n
    \n {votesCount}\n
    \n \n \n
    \n \n )\n}","import \"./NotificationIndicator.scss\"\nimport React, { useEffect, useState, useRef } from \"react\"\nimport IconTrash from \"@fider/assets/images/heroicons-trash.svg\"\nimport NoDataIllustration from \"@fider/assets/images/undraw-empty.svg\"\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, Button, ButtonClickEvent } from \"./common\"\nimport { Tabs } from \"./common/Tabs\"\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 \n \n
    \n \n \n \n \n
    \n
    \n )\n}\n\nconst NotificationIcon = ({ unreadNotifications }: { unreadNotifications: number }) => {\n const isOverMaxCount = unreadNotifications > 99;\n const displayCount = isOverMaxCount ? \"99+\" : unreadNotifications.toString();\n \n return (\n <>\n \n \n {unreadNotifications > 0 && (\n
    \n {displayCount}\n
    \n )}\n
    \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 [activeTab, setActiveTab] = useState(\"unread\")\n const [loading, setLoading] = useState(false)\n const [unread, setUnread] = useState([])\n const [read, setRead] = useState([])\n const [unreadPage, setUnreadPage] = useState(1)\n const [readPage, setReadPage] = useState(1)\n const [unreadTotal, setUnreadTotal] = useState(0)\n const [readTotal, setReadTotal] = useState(0)\n const [purging, setPurging] = useState(false)\n \n const unreadContainerRef = useRef(null)\n const readContainerRef = useRef(null)\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 loadNotifications(\"unread\", 1, true)\n loadNotifications(\"read\", 1, true)\n }\n }, [showingNotifications])\n\n const loadNotifications = async (type: string, page: number, reset: boolean = false) => {\n if (loading) return\n \n setLoading(true)\n \n const result = await actions.getNotifications(page, 10, type)\n \n if (result.ok && result.data) {\n const { notifications, total } = result.data\n\n if (type === \"unread\") {\n setUnreadTotal(total)\n setUnread(prev => reset ? notifications : [...(prev || []), ...notifications])\n setUnreadPage(page)\n setUnreadNotifications(total)\n } else {\n setReadTotal(total)\n setRead(prev => reset ? notifications : [...(prev || []), ...notifications])\n setReadPage(page)\n }\n }\n \n setLoading(false)\n }\n\n const handleScroll = (type: string) => {\n const container = type === \"unread\" ? unreadContainerRef.current : readContainerRef.current\n if (!container) return\n \n const { scrollTop, scrollHeight, clientHeight } = container\n const scrolledToBottom = scrollHeight - scrollTop - clientHeight < 50\n \n if (scrolledToBottom) {\n if (type === \"unread\" && (unread || []).length < unreadTotal && !loading) {\n loadNotifications(\"unread\", unreadPage + 1)\n } else if (type === \"read\" && (read || []).length < readTotal && !loading) {\n loadNotifications(\"read\", readPage + 1)\n }\n }\n }\n\n const handleUnreadScroll = () => handleScroll(\"unread\")\n const handleReadScroll = () => handleScroll(\"read\")\n\n useEffect(() => {\n const unreadContainer = unreadContainerRef.current\n if (unreadContainer && activeTab === \"unread\") {\n unreadContainer.addEventListener(\"scroll\", handleUnreadScroll)\n return () => {\n unreadContainer.removeEventListener(\"scroll\", handleUnreadScroll)\n }\n }\n }, [activeTab, unreadPage, unread, unreadTotal, loading])\n\n useEffect(() => {\n const readContainer = readContainerRef.current\n if (readContainer && activeTab === \"read\") {\n readContainer.addEventListener(\"scroll\", handleReadScroll)\n return () => {\n readContainer.removeEventListener(\"scroll\", handleReadScroll)\n }\n }\n }, [activeTab, readPage, read, readTotal, loading])\n\n const markAllAsRead = async (event: ButtonClickEvent) => {\n const response = await actions.markAllAsRead()\n if (response.ok) {\n loadNotifications(\"unread\", 1, true)\n loadNotifications(\"read\", 1, true)\n }\n }\n\n const purgeReadNotifications = async (event: ButtonClickEvent) => {\n if (purging) return\n \n setPurging(true)\n const response = await actions.purgeReadNotifications()\n \n if (response.ok) {\n setRead([])\n setReadTotal(0)\n \n actions.getTotalUnreadNotifications().then((result) => {\n if (result.ok) {\n setUnreadNotifications(result.data || 0)\n }\n })\n }\n \n setPurging(false)\n }\n\n const handleTabChange = (tab: string) => {\n setActiveTab(tab)\n setTimeout(() => {\n if (tab === \"unread\" && unreadContainerRef.current) {\n handleScroll(\"unread\")\n } else if (tab === \"read\" && readContainerRef.current) {\n handleScroll(\"read\")\n }\n }, 100)\n }\n\n return (\n setShowingNotifications(isOpen)}\n renderHandle={}\n >\n
    \n {showingNotifications && (\n <>\n Unread, counter: unreadTotal },\n { value: \"read\", label: Read, counter: readTotal },\n ]}\n activeTab={activeTab}\n onChange={handleTabChange}\n className=\"px-2 pt-2\"\n />\n \n {activeTab === \"unread\" && (\n
    \n {unreadTotal > 0 ? (\n <>\n
    \n

    \n Unread notifications\n

    \n {unreadTotal > 1 && (\n \n )}\n
    \n \n {unread.map((n) => (\n \n ))}\n \n {loading && unread.length < unreadTotal && (\n
    \n Loading more...\n
    \n )}\n \n ) : (\n
    \n

    \n No new notifications\n

    \n \n
    \n )}\n
    \n )}\n \n {activeTab === \"read\" && (\n
    \n {readTotal > 0 ? (\n <>\n
    \n

    \n Read notifications\n

    \n \n \n Purge All\n \n
    \n \n {read.map((n) => (\n \n ))}\n \n {loading && read.length < readTotal && (\n
    \n Loading more...\n
    \n )}\n \n ) : (\n
    \n

    \n No read notifications\n

    \n \n
    \n )}\n
    \n )}\n \n )}\n
    \n \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
    \n }>\n
    {fider.session.user.name}
    \n \n My Settings\n \n \n\n {fider.session.user.isCollaborator && (\n <>\n
    \n Administration\n
    \n \n Site Settings\n \n \n \n )}\n \n Sign out\n \n
    \n
    \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\n toggleReaction: (emoji: string) => void\n reactions?: ReactionCount[]\n}\n\nconst availableEmojis = [\"👍\", \"👎\", \"❤️\", \"🤔\", \"👏\", \"😂\", \"😲\"]\n\nexport const Reactions: React.FC = ({ 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
    \n \n {fider.session.isAuthenticated && (\n <>\n 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 \n \n {isEmojiSelectorOpen && (\n
    \n {availableEmojis.map((emoji) => (\n {\n toggleReaction(emoji)\n setIsEmojiSelectorOpen(false)\n }}\n >\n {emoji}\n \n ))}\n
    \n )}\n \n )}\n {reactions !== undefined && (\n <>\n {reactions.map((reaction) => (\n 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} {reaction.count}\n \n ))}\n \n )}\n
    \n
    \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 \n This website is currently in read-only mode because there is no active subscription. Visit{\" \"}\n \n Billing\n {\" \"}\n to subscribe.\n \n )\n }\n\n return (\n \n This website is currently in read-only mode.\n \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
    \n {props.children}\n
    \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
    \n OR\n
    \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 voteType: number\n response: PostResponse | null\n votesCount: number\n commentsCount: number\n tags: string[]\n lockedSettings?: PostLockedSettings\n}\n\nexport function isPostLocked(post: Post): boolean {\n return !!post.lockedSettings && post.lockedSettings.locked;\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 PostLockedSettings {\n locked: boolean;\n lockedAt: string;\n lockedBy: User;\n lockMessage?: string;\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 profanityWords: string\n generalSettings?: {\n titleLengthMin: number\n titleLengthMax: number\n descriptionLengthMin: number\n descriptionLengthMax: number\n maxImagesPerPost: number\n maxImagesPerComment: number\n postLimits: Record\n commentLimits: Record\n postingDisabledFor: string[]\n commentingDisabledFor: string[]\n postingGloballyDisabled: boolean\n commentingGloballyDisabled: boolean\n }\n messageBanner: string\n}\n\nexport enum TenantStatus {\n Active = 1,\n Pending = 2,\n Locked = 3,\n Disabled = 4,\n}\n\nexport enum VisualRole {\n None = 0,\n Visitor = 1,\n Helpful = 2,\n Administrator = 3,\n Moderator = 4,\n BSGCrew = 5,\n Developer = 6,\n Sherpa = 7,\n TCStaff = 8,\n Emissary = 9\n}\n\nexport interface User {\n id: number\n name: string\n email?: string\n role: UserRole\n visualRole?: VisualRole\n status: UserStatus\n avatarURL: string\n providers?: Array<{\n name: string\n uid: string\n }>\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 Moderator = \"moderator\",\n}\n\nexport const isCollaborator = (role: UserRole): boolean => {\n return role === UserRole.Collaborator || role === UserRole.Administrator\n}\n\nexport const isModerator = (role: UserRole): boolean => {\n return role === UserRole.Moderator || role === UserRole.Administrator\n}\n\nexport const isAdministrator = (role: UserRole): boolean => {\n return 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 visualRole?: VisualRole\n status: UserStatus\n isAdministrator: boolean\n isCollaborator: boolean\n isModerator: boolean\n}\n\nexport const getVisualRoleName = (visualRole?: VisualRole): string => {\n if (visualRole === undefined || visualRole === VisualRole.None) return \"\";\n \n switch (visualRole) {\n case VisualRole.Visitor: return \"Visitor\";\n case VisualRole.Helpful: return \"Helpful\";\n case VisualRole.Administrator: return \"Administrator\";\n case VisualRole.Moderator: return \"Moderator\";\n case VisualRole.BSGCrew: return \"BSG Crew\";\n case VisualRole.Developer: return \"Developer\";\n case VisualRole.Sherpa: return \"Sherpa\";\n case VisualRole.TCStaff: return \"TC Staff\";\n case VisualRole.Emissary: return \"Emissary\";\n default: return \"\";\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\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","export const DISMISSED_CONTENT_PREFIX = 'fider_dismissed';\n\nexport const isTouch = (): boolean => {\n return \"ontouchstart\" in window || navigator.maxTouchPoints > 0\n}\n\nexport const generateHash = (str: string): string => {\n let hash = 0;\n if (str.length === 0) return hash.toString();\n \n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash; // 32 bit int should be fine?\n }\n \n return hash.toString();\n}\n\nexport const isDismissed = (contentType: string, contentHash: string): boolean => {\n const dismissedHashes = getDismissedHashes(contentType);\n return dismissedHashes.includes(contentHash);\n}\n\nexport const dismissContent = (contentType: string, contentHash: string): void => {\n const dismissedHashes = getDismissedHashes(contentType);\n if (!dismissedHashes.includes(contentHash)) {\n dismissedHashes.push(contentHash);\n localStorage.setItem(getStorageKey(contentType), JSON.stringify(dismissedHashes));\n }\n}\n\nexport const getDismissedHashes = (contentType: string): string[] => {\n try {\n const stored = localStorage.getItem(getStorageKey(contentType));\n return stored ? JSON.parse(stored) : [];\n } catch (e) {\n return [];\n }\n}\n\nexport const clearDismissedContent = (contentType: string): void => {\n localStorage.removeItem(getStorageKey(contentType));\n}\n\nconst getStorageKey = (contentType: string): string => {\n return `${DISMISSED_CONTENT_PREFIX}_${contentType}`;\n}\n\nexport const DismissableContentTypes = {\n MESSAGE_BANNER: 'message_banner'\n} as const;\n\nexport const dismissContentByValue = (contentType: string, content: string): void => {\n const contentHash = generateHash(content);\n dismissContent(contentType, contentHash);\n}\n\nexport const isContentDismissed = (contentType: string, content: string): boolean => {\n const contentHash = generateHash(content);\n return isDismissed(contentType, contentHash);\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 {\n ok: boolean\n data: T\n error?: Failure\n}\n\nasync function toResult(response: Response): Promise> {\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(url: string, method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\", body?: any): Promise> {\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(response)\n } catch (err) {\n const truncatedBody = truncate(body ? JSON.stringify(body) : \"\", 1000)\n throw new Error(`Failed to ${method} ${url} with body '${truncatedBody}'`)\n }\n}\n\nexport const http = {\n get: async (url: string): Promise> => {\n return await request(url, \"GET\")\n },\n post: async (url: string, body?: any): Promise> => {\n return await request(url, \"POST\", body)\n },\n put: async (url: string, body?: any): Promise> => {\n return await request(url, \"PUT\", body)\n },\n delete: async (url: string, body?: any): Promise> => {\n return await request(url, \"DELETE\", body)\n },\n event:\n (category: string, action: string) =>\n (result: Result): Result => {\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 : \"\",\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(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 => {\n return new Promise((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 = {\n [key: string]: T\n}\n\nexport const copyToClipboard = (text: string): Promise => {\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: { html: true },\n ADD_TAGS: [\"iframe\"],\n ADD_ATTR: [\n \"allow\",\n \"allowfullscreen\",\n \"frameborder\",\n \"sandbox\",\n \"src\",\n \"width\",\n \"height\",\n \"title\",\n \"target\",\n \"href\",\n ]\n })\n}\n\nconst defaultLink = (href: string, title: string, text: string) => {\n const titleAttr = title ? ` title=\"${title}\"` : \"\"\n return `${text}`\n}\n\nconst parseYouTubeLink = (href: string) => {\n if (href.includes('youtube.com/watch')) {\n const url = new URL(href);\n const videoId = url.searchParams.get('v');\n let timestamp = url.searchParams.get('t') || url.searchParams.get('start') || '0';\n\n if (typeof timestamp === 'string' && timestamp.endsWith('s')) {\n timestamp = timestamp.slice(0, -1);\n }\n\n return videoId ? { videoId, timestamp } : null;\n }\n \n if (href.includes('youtu.be/')) {\n const url = new URL(href);\n const pathParts = url.pathname.split('/').filter(Boolean);\n const videoId = pathParts[0];\n \n let timestamp = url.searchParams.get('t') || '0';\n \n if (typeof timestamp === 'string' && timestamp.endsWith('s')) {\n timestamp = timestamp.slice(0, -1);\n }\n \n return { videoId, timestamp };\n }\n \n return null;\n}\n\nconst fullRenderer = new marked.Renderer()\nfullRenderer.image = () => \"\"\n\nfullRenderer.link = (href: string | null, title: string, text: string) => {\n if (!href) return text\n\n if ((href.includes('youtube.com/watch') || href.includes('youtu.be/'))) {\n const parsedLink = parseYouTubeLink(href)\n \n if (parsedLink) {\n const { videoId, timestamp } = parsedLink\n const embedUrl = `https://www.youtube.com/embed/${videoId}?start=${timestamp}`\n \n return ``\n }\n }\n \n return defaultLink(href, title, text)\n}\n\nfullRenderer.text = (text: string) => {\n // Handling mention links (they're in the format @{id:1234, name:'John Doe'})\n return text.replace(/@{([^}]+)}/g, (match) => {\n try {\n const json = match.substring(1).replace(/"/g, '\"')\n const mention = JSON.parse(json)\n return `@${mention.name}`\n } catch {\n return match\n }\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 \"<\": \"<\",\n \">\": \">\",\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","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 => {\n return await http.post(\"/_api/user/settings\", request)\n}\n\nexport const changeUserEmail = async (email: string): Promise => {\n return await http.post(\"/_api/user/change-email\", {\n email,\n })\n}\n\nexport const deleteCurrentAccount = async (): Promise => {\n return await http.delete(\"/_api/user\")\n}\n\nexport const regenerateAPIKey = async (): Promise> => {\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> => {\n return http.post(`/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> => {\n return http.put(`/api/v1/tags/${slug}`, { name, color, isPublic }).then(http.event(\"tag\", \"update\"))\n}\n\nexport const deleteTag = async (slug: string): Promise => {\n return http.delete(`/api/v1/tags/${slug}`).then(http.event(\"tag\", \"delete\"))\n}\n\nexport const assignTag = async (slug: string, postNumber: number): Promise => {\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 => {\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> => {\n return await http.get(\"/api/v1/posts\")\n}\n\nexport interface SearchPostsParams {\n query?: string\n view?: string\n limit?: number\n offset?: number\n tags?: string[]\n myVotes?: boolean\n myPosts?: boolean\n notMyVotes?: boolean\n statuses?: string[]\n date?: string\n tagLogic?: \"OR\" | \"AND\"\n}\n\nexport const searchPosts = async (params: SearchPostsParams): Promise> => {\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 offset: params.offset,\n date: params.date,\n tagLogic: params.tagLogic\n })\n if (params.myVotes) {\n qsParams += `&myvotes=true`\n }\n if (params.myPosts) {\n qsParams += `&myposts=true`\n }\n if (params.notMyVotes) {\n qsParams += `¬myvotes=true`\n }\n return await http.get(`/api/v1/posts${qsParams}`)\n}\n\nexport const deletePost = async (postNumber: number, text: string): Promise => {\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 => {\n return http.post(`/api/v1/posts/${postNumber}/up`).then(http.event(\"post\", \"upvote\"))\n}\n\nexport const addDownVote = async (postNumber: number): Promise => {\n return http.post(`/api/v1/posts/${postNumber}/down`).then(http.event(\"post\", \"downvote\"))\n}\n\nexport const removeVote = async (postNumber: number): Promise => {\n return http.delete(`/api/v1/posts/${postNumber}/votes`).then(http.event(\"post\", \"unvote\"))\n}\n\nexport const toggleVote = async (postNumber: number, _direction?: \"up\" | \"down\"): Promise => {\n return http.post(`/api/v1/posts/${postNumber}/votes/toggle`).then(http.event(\"post\", \"toggle-vote\"))\n}\n\nexport const subscribe = async (postNumber: number): Promise => {\n return http.post(`/api/v1/posts/${postNumber}/subscription`).then(http.event(\"post\", \"subscribe\"))\n}\n\nexport const unsubscribe = async (postNumber: number): Promise => {\n return http.delete(`/api/v1/posts/${postNumber}/subscription`).then(http.event(\"post\", \"unsubscribe\"))\n}\n\nexport const listVotes = async (postNumber: number): Promise> => {\n return http.get(`/api/v1/posts/${postNumber}/votes`)\n}\n\nexport const getTaggableUsers = async (nameFilter: string): Promise> => {\n return http.get(`/api/v1/taggable-users${querystring.stringify({ name: nameFilter })}`)\n}\n\nexport const createComment = async (postNumber: number, content: string, attachments: ImageUpload[]): Promise => {\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 => {\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 => {\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> => {\n return http.post(`/api/v1/posts/${postNumber}/comments/${commentID}/reactions/${emoji}`)\n}\n\nexport const lockPost = async (postNumber: number, message: string): Promise => {\n return await http.put(`/api/v1/posts/${postNumber}/lock`, { message });\n};\n\nexport const unlockPost = async (postNumber: number): Promise => {\n return await http.delete(`/api/v1/posts/${postNumber}/lock`);\n};\n\ninterface SetResponseInput {\n status: string\n text: string\n originalNumber: number\n}\n\nexport const respond = async (postNumber: number, input: SetResponseInput): Promise => {\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> => {\n return http.post(`/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 => {\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> => {\n return await http.post(\"/_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 updateGeneralSettings = async (data: { settings: any }): Promise => {\n return await http.post(\"/_api/admin/settings/general-settings\", data)\n}\n\nexport const updateTenantSettings = async (request: UpdateTenantSettingsRequest): Promise => {\n return await http.post(\"/_api/admin/settings/general\", request)\n}\n\nexport const updateTenantMessageBanner = async (messageBanner: string): Promise => {\n return await http.post(\"/_api/admin/settings/message-banner\", {\n messageBanner,\n })\n}\n\nexport const updateTenantAdvancedSettings = async (customCSS: string): Promise => {\n return await http.post(\"/_api/admin/settings/advanced\", { \n customCSS,\n })\n}\n\nexport async function updateProfanityWords(profanityWords: string) {\n return await http.post(\"/_api/admin/settings/profanity\", {\n profanityWords,\n })\n}\n\nexport const updateTenantPrivacy = async (isPrivate: boolean): Promise => {\n return await http.post(\"/_api/admin/settings/privacy\", {\n isPrivate,\n })\n}\n\nexport const updateTenantEmailAuthAllowed = async (isEmailAuthAllowed: boolean): Promise => {\n return await http.post(\"/_api/admin/settings/emailauth\", {\n isEmailAuthAllowed,\n })\n}\n\nexport const checkAvailability = async (subdomain: string): Promise> => {\n return await http.get(`/_api/tenants/${subdomain}/availability`)\n}\n\nexport const signIn = async (email: string): Promise => {\n return await http.post(\"/_api/signin\", {\n email,\n })\n}\n\nexport const completeProfile = async (kind: EmailVerificationKind, key: string, name: string): Promise => {\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 => {\n return await http.post(`/_api/admin/roles/${role}/users`, {\n userID,\n })\n}\n\nexport const blockUser = async (userID: number): Promise => {\n return await http.put(`/_api/admin/users/${userID}/block`)\n}\n\nexport const unblockUser = async (userID: number): Promise => {\n return await http.delete(`/_api/admin/users/${userID}/block`)\n}\n\nexport const getOAuthConfig = async (provider: string): Promise> => {\n return await http.get(`/_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 => {\n return await http.post(\"/_api/admin/oauth\", request)\n}\n","import { http, Result } from \"@fider/services\"\nimport { Notification } from \"@fider/models\"\n\ninterface PaginatedNotifications {\n notifications: Notification[]\n total: number\n page: number\n perPage: number\n}\n\nexport const getTotalUnreadNotifications = async (): Promise> => {\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 getNotifications = async (\n page: number = 1, \n perPage: number = 10, \n type?: string\n): Promise> => {\n let url = `/_api/notifications?page=${page}&perPage=${perPage}`\n if (type) {\n url += `&type=${type}`\n }\n return http.get(url)\n}\n\nexport const markAllAsRead = async (): Promise => {\n return await http.post(\"/_api/notifications/read-all\")\n}\n\nexport const purgeReadNotifications = async (): Promise> => {\n return await http.post(\"/_api/notifications/purge-read\")\n}","import { http, Result } from \"@fider/services\"\n\nexport const sendInvites = async (subject: string, message: string, recipients: string[]): Promise => {\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 => {\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 => {\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 : \"\",\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> => {\n return await http.post(`/_api/admin/webhook`, data)\n}\n\nexport const updateWebhook = async (id: number, data: WebhookData): Promise => {\n return await http.put(`/_api/admin/webhook/${id}`, data)\n}\n\nexport const deleteWebhook = async (id: number): Promise => {\n return await http.delete(`/_api/admin/webhook/${id}`)\n}\n\nexport const testWebhook = async (id: number): Promise> => {\n return await http.get(`/_api/admin/webhook/test/${id}`)\n}\n\nexport const previewWebhook = async (type: WebhookType, url: string, content: string): Promise> => {\n return await http.post(\"/_api/admin/webhook/preview\", { type, url, content })\n}\n\nexport const getWebhookHelp = async (type: WebhookType): Promise> => {\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> => {\n return await http.post(\"/_api/billing/checkout-link\", { planId })\n}\n","import { http, Result } from \"@fider/services/http\"\nimport { ImageUpload } from \"@fider/models\"\n\nexport interface FileInfo {\n name: string\n blobKey: string\n size: number\n contentType: string\n createdAt: string\n isInUse: boolean\n usedIn?: string[]\n}\n\nexport interface FileListResponse {\n files: FileInfo[]\n total: number\n page: number\n pageSize: number\n totalPages: number\n}\n\nexport interface FileUploadRequest {\n name: string\n file: ImageUpload\n uploadType: \"file\" | \"attachment\"\n}\n\nexport const listFiles = async (url: string): Promise> => {\n return await http.get(url)\n}\n\nexport const uploadFile = async (request: FileUploadRequest): Promise> => {\n return await http.post(\"/api/v1/admin/files\", request)\n}\n\nexport const renameFile = async (blobKey: string, newName: string): Promise> => {\n return await http.put(`/api/v1/admin/files/${blobKey}`, { name: newName })\n}\n\nexport const deleteFile = async (blobKey: string, force: boolean = false): Promise> => {\n const url = force \n ? `/api/v1/admin/files/${blobKey}?force=true` \n : `/api/v1/admin/files/${blobKey}`;\n \n return await http.delete(url)\n}\n\nexport const getFileUsage = async (blobKey: string): Promise> => {\n return await http.get(`/api/v1/admin/files/${blobKey}/usage`)\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 \n \n \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":["Footer","currentYear","Date","getFullYear","React","className","href","target","rel","CollapsiblePanel","title","children","defaultOpen","icon","isOpen","setIsOpen","useState","contentRef","useRef","togglePanel","classSet","role","replace","toLowerCase","tabIndex","onClick","e","preventDefault","stopPropagation","onKeyPress","key","id","ref","style","display","HoverInfo","props","Elem","classList","clickable","undefined","text","Icon","width","height","sprite","IconInformationCircle","styles","src","viewBox","xlinkHref","Tabs","tabs","activeTab","onChange","map","tab","value","label","counter","ImageViewerModal","Modal","Window","onClose","center","size","Content","loadedPreview","Loader","alt","onLoad","onPreviewLoad","imgSrc","Button","variant","_Trans","ImageViewer","showModal","setShowModal","loadedThumbnail","setLoadedThumbnail","setLoadedPreview","closeModal","uploadedImageURL","bkey","openModal","onThumbnailLoad","ErrorBoundary","constructor","super","this","state","error","errorInfo","componentDidCatch","onError","setState","render","FiderContext","Consumer","fider","ErrorPage","showDetails","isProduction","ResponseDetails","status","PostStatus","Get","response","Open","VStack","align","spacing","ResponseLozenge","timeSince","respondedAt","Duplicate","Markdown","original","number","slug","bg","color","border","Declined","HeroIconThumbsDown","HeroIconDuplicate","Completed","HeroIconCheck","Planned","HeroIconThumbsUp","HeroIconSparkles","getLozengeProps","HStack","small","ShowPostStatus","i18n","_","message","ButtonClickEvent","preventEnable","shouldEnable","canEnable","type","clicked","setClicked","unmountedContainer","useEffect","current","disabled","buttonContent","onClickProp","async","event","defaultProps","ValidationContext","Form","autoComplete","DisplayError","Provider","arrayToTag","items","m","hasError","field","errors","err","dict","reduce","result","push","fields","Object","keys","prototype","hasOwnProperty","call","forEach","t","length","Input","currentTarget","suffix","onIconClick","ctx","htmlFor","afterLabel","noTabFocus","inputRef","autoFocus","onFocus","maxLength","placeholder","ImageUploader","_defineProperty","files","file","alert","base64","fileToBase64","upload","fileName","name","content","contentType","remove","previewURL","instanceID","fileSelector","click","modal","isUploading","hasFile","removeFile","fileChanged","accept","selectFile","IconPhotograph","MultiImageUploader","instances","removed","count","maxUploads","addNewElement","triggerOnChange","bkeys","uploads","k","concat","filter","x","btoa","Math","random","toString","element","imageUploaded","elements","TextArea","selectionStart","onKeyDown","Textarea","minRows","RadioButton","selected","setSelected","defaultOption","option","onSelect","inputs","options","checked","Select","filtered","getOption","defaultValue","o","Field","Checkbox","setChecked","isChecked","IS_MAC","navigator","test","userAgent","emptyValue","Portal","document","ReactDOM","body","Placeholder","attributes","_extends","position","opacity","userSelect","pointerEvents","CommentEditor","users","setUsers","setTarget","index","setIndex","search","setSearch","actions","ok","data","loadUsers","filteredUsers","renderElement","useCallback","SlateElement","editor","useMemo","withMentions","withReact","withHistory","createEditor","prevIndex","nextIndex","Transforms","select","insertMention","el","rect","ReactEditor","toDOMRange","getBoundingClientRect","top","window","pageYOffset","left","pageXOffset","initialValue","deserialize","Slate","descendant","selection","Range","isCollapsed","start","edges","currentPoint","path","offset","node","Editor","textBeforeCursor","Node","string","slice","lastAtIndex","lastIndexOf","potentialMention","after","isAtEndOrFollowedBySpace","range","includes","mentionRange","anchor","focus","serialize","Editable","readOnly","renderPlaceholder","user","i","padding","borderRadius","cursor","background","isInline","isVoid","markableVoid","newMention","isNew","mention","character","JSON","stringify","insertNodes","move","Mention","useSelected","focused","useFocused","boxShadow","contentEditable","Fragment","nodes","n","join","markdown","split","line","regex","match","lastIndex","exec","jsonStr","mentionData","parse","console","html","tagName","dangerouslySetInnerHTML","__html","truncate","DevBanner","useFider","Avatar","avatarURL","AvatarStack","classes","overlap","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","displayName","OAuthProviderLogo","SignInControl","showEmailForm","setShowEmailForm","session","tenant","isEmailAuthAllowed","email","setEmail","setError","providersLen","oauth","isCookieEnabled","provider","useEmail","Divider","device","onEmailSent","Moment","date","setDisplay","setNow","format","updateDisplayText","currentNow","newDisplay","getTime","formatDate","locale","interval","setInterval","getRefreshInterval","diffInSeconds","clearInterval","tooltip","ModalWindow","canClose","root","getElementById","overflow","addEventListener","keyDown","removeEventListener","keyCode","evt","Header","UserName","isStaff","isCollaborator","isMod","isModerator","isAdmin","isAdministrator","visualRole","VisualRole","None","Administrator","Moderator","BSGCrew","Visitor","classNames","visualRoleName","getVisualRoleName","showEmail","xmlns","fill","fillRule","d","clipRule","show","setShow","useTimeout","TenantLogoURL","logoBlobKey","TenantLogo","useFiderIfEmpty","systemProvidersLogo","google","facebook","github","OAuthProviderLogoURL","Toggle","active","setActive","toggle","newActive","onToggle","PageTitle","subtitle","DropdownContext","createContext","Dropdown","changeToggleState","newState","onToggled","handleClick","contains","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","setTimeout","values","VoteCounter","voteType","setVoteType","post","votesCount","setVotesCount","handleVote","closed","isReadOnly","newVoteType","countChange","isDisabled","isPostLocked","upvoteClassName","downvoteClassName","countClassName","FaCaretUp","FaCaretDown","NotificationItem","notification","openNotification","authorName","Fider","currentLocale","createdAt","NotificationIcon","unreadNotifications","isOverMaxCount","displayCount","IconBell","setUnreadNotifications","showingNotifications","setShowingNotifications","setActiveTab","loading","setLoading","unread","setUnread","read","setRead","unreadPage","setUnreadPage","readPage","setReadPage","unreadTotal","setUnreadTotal","readTotal","setReadTotal","purging","setPurging","unreadContainerRef","readContainerRef","then","loadNotifications","page","reset","notifications","total","prev","handleScroll","container","scrollTop","scrollHeight","clientHeight","handleUnreadScroll","handleReadScroll","unreadContainer","readContainer","maxHeight","divide","NoDataIllustration","IconTrash","availableEmojis","Reactions","emojiSelectorRef","toggleReaction","reactions","isEmojiSelectorOpen","setIsEmojiSelectorOpen","handleClickOutside","ReactionAdd","emoji","reaction","includesMe","ReadOnlyNotice","Stack","dir","flex","lockedSettings","locked","filterable","All","Error","_PostStatus","Started","TenantStatus","UserAvatarType","UserStatus","UserRole","Collaborator","Helpful","Developer","Sherpa","TCStaff","Emissary","OAuthConfigStatus","Disabled","Enabled","BillingStatus","WebhookType","WebhookStatus","DISMISSED_CONTENT_PREFIX","isTouch","maxTouchPoints","generateHash","str","hash","charCodeAt","isDismissed","contentHash","getDismissedHashes","dismissContent","dismissedHashes","localStorage","setItem","getStorageKey","stored","getItem","clearDismissedContent","removeItem","DismissableContentTypes","MESSAGE_BANNER","dismissContentByValue","isContentDismissed","request","method","headers","fetch","credentials","json","notify","toResult","truncatedBody","http","get","put","delete","category","action","analytics","storage","sessionStorage","eventCategory","eventAction","ga","exDescription","stack","exFatal","FiderSession","pPage","pContextID","contextID","pProps","pUser","pTenant","initData","pSettings","pSession","textContent","innerText","Locked","environment","isSingleHostMode","mode","jwt","decode","token","segments","atob","input","trim","dateOpts","day","month","year","short","full","hour","minute","DateTimeFormat","toLocaleString","now","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","clipboard","writeText","clearUrlHash","oldURL","newURL","pathname","history","replaceState","pushState","hashChangeEvent","HashChangeEvent","cancelable","bubbles","composed","dispatchEvent","activateI18NSync","messages","load","activate","activateI18N","marked","setOptions","headerIds","xhtml","smartLists","gfm","breaks","DOMPurify","USE_PROFILES","ADD_TAGS","ADD_ATTR","fullRenderer","Renderer","image","parsedLink","URL","videoId","searchParams","timestamp","endsWith","Boolean","parseYouTubeLink","defaultLink","substring","plainTextRenderer","_href","_title","br","strong","list","listitem","heading","paragraph","code","codespan","del","entities","encodeHTML","s","sanitize","renderer","plainText","toastify","success","toast","goHome","goTo","baseURL","getNumber","parseInt","uri","re","RegExp","separator","results","decodeURIComponent","getArray","qs","object","symbol","Array","encodeURIComponent","updateUserSettings","changeUserEmail","deleteCurrentAccount","regenerateAPIKey","createTag","updateTag","deleteTag","assignTag","postNumber","unassignTag","getAllPosts","searchPosts","qsParams","querystring","tags","params","statuses","query","view","limit","tagLogic","myVotes","myPosts","notMyVotes","deletePost","addVote","addDownVote","removeVote","toggleVote","_direction","subscribe","unsubscribe","listVotes","getTaggableUsers","nameFilter","createComment","attachments","updateComment","commentID","deleteComment","toggleCommentReaction","lockPost","unlockPost","respond","originalNumber","createPost","description","updatePost","createTenant","updateGeneralSettings","updateTenantSettings","updateTenantMessageBanner","messageBanner","updateTenantAdvancedSettings","customCSS","updateProfanityWords","profanityWords","updateTenantPrivacy","isPrivate","updateTenantEmailAuthAllowed","checkAvailability","subdomain","signIn","completeProfile","kind","changeUserRole","userID","blockUser","unblockUser","getOAuthConfig","saveOAuthConfig","getTotalUnreadNotifications","getNotifications","perPage","markAllAsRead","purgeReadNotifications","sendInvites","subject","recipients","sendSampleInvite","ignoreErrors","logError","pattern","createWebhook","updateWebhook","deleteWebhook","testWebhook","previewWebhook","getWebhookHelp","generateCheckoutLink","planId","listFiles","uploadFile","renameFile","blobKey","newName","deleteFile","force","getFileUsage","hasContainer","setup","rootElement","I18nProvider","ToastContainer","POSITION","TOP_RIGHT"],"sourceRoot":""}