{"version":3,"sources":["webpack://fider/./public/components/ShowTag.tsx","webpack://fider/./public/components/common/Button.tsx","webpack://fider/./public/components/common/form/Form.tsx","webpack://fider/./public/components/common/form/DisplayError.tsx","webpack://fider/./public/components/common/form/Input.tsx","webpack://fider/./public/components/common/form/ImageUploader.tsx","webpack://fider/./public/components/common/form/MultiImageUploader.tsx","webpack://fider/./public/components/common/form/TextArea.tsx","webpack://fider/./public/components/common/form/RadioButton.tsx","webpack://fider/./public/components/common/form/Select.tsx","webpack://fider/./public/components/common/form/Field.tsx","webpack://fider/./public/components/common/form/Checkbox.tsx","webpack://fider/./public/components/common/form/ImageViewer.tsx","webpack://fider/./public/components/common/MultiLineText.tsx","webpack://fider/./public/components/common/EnvironmentInfo.tsx","webpack://fider/./public/components/common/Avatar.tsx","webpack://fider/./public/components/common/Message.tsx","webpack://fider/./public/components/common/Hint.tsx","webpack://fider/./public/components/common/Header.tsx","webpack://fider/./public/components/common/Heading.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/Segment.tsx","webpack://fider/./public/components/common/List.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/FiderVersion.tsx","webpack://fider/./public/components/common/DropDown.tsx","webpack://fider/./public/components/common/PoweredByFider.tsx","webpack://fider/./public/components/ErrorBoundary.tsx","webpack://fider/./public/components/ShowPostResponse.tsx","webpack://fider/./public/components/SignInModal.tsx","webpack://fider/./public/components/VoteCounter.tsx","webpack://fider/./public/models/post.ts","webpack://fider/./public/models/identity.ts","webpack://fider/./public/models/settings.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/markdown.ts","webpack://fider/./public/services/notify.ts","webpack://fider/./public/services/navigator.ts","webpack://fider/./public/services/querystring.ts","webpack://fider/./public/services/device.ts","webpack://fider/./public/services/actions/user.ts","webpack://fider/./public/services/actions/tag.ts","webpack://fider/./public/services/actions/post.ts","webpack://fider/./public/services/actions/tenant.ts","webpack://fider/./public/services/actions/notification.ts","webpack://fider/./public/services/actions/invite.ts","webpack://fider/./public/services/actions/infra.ts","webpack://fider/./public/services/toastify.tsx"],"names":["textColor","color","components","r","substring","g","b","R","parseInt","G","B","getRGB","ShowTag","props","className","circular","title","tag","name","isPublic","style","backgroundColor","xmlns","viewBox","fill","fillRule","d","clipRule","ButtonClickEvent","shouldEnable","this","Button","super","unmounted","click","e","preventDefault","stopPropagation","state","clicked","event","setState","onClick","canEnable","fluid","size","disabled","href","rel","children","type","defaultProps","ValidationContext","Form","autoComplete","error","Provider","value","arrayToTag","items","map","m","key","hasError","field","errors","err","DisplayError","dict","reduce","result","push","message","fields","Object","keys","prototype","hasOwnProperty","call","forEach","t","length","Input","onChange","currentTarget","suffix","icon","onIconClick","link","undefined","Consumer","ctx","label","htmlFor","afterLabel","id","tabIndex","noTabFocus","ref","inputRef","autoFocus","onFocus","maxLength","placeholder","width","height","ImageUploader","fileChanged","target","files","file","alert","base64","bkey","upload","fileName","content","contentType","remove","previewURL","instanceID","removeFile","fileSelector","selectFile","openModal","showModal","closeModal","previewMaxWidth","isOpen","onClose","center","alt","src","isUploading","hasFile","imgStyles","maxWidth","modal","accept","MultiImageUploader","imageUploaded","instances","removed","count","maxUploads","addNewElement","triggerOnChange","bkeys","uploads","k","concat","filter","x","btoa","Math","random","toString","element","elements","TextArea","minRows","RadioButton","selected","onSelect","defaultOption","options","inputs","option","checked","bind","Select","o","getOption","defaultValue","filtered","Field","Checkbox","setChecked","useState","isChecked","ImageViewer","loadedThumbnail","onThumbnailLoad","onPreviewLoad","loadedPreview","onLoad","MultiLineText","text","html","tagName","dangerouslySetInnerHTML","__html","EnvironmentInfo","fider","isProduction","settings","environment","compiler","version","buildTime","isSingleHostMode","session","tenant","isAuthenticated","user","Avatar","role","avatarURL","Message","showIcon","Hint","cacheKey","permanentCloseKey","isClosed","setIsClosed","condition","Header","isSignInModalOpen","setIsSignInModalOpen","unreadNotifications","setUnreadNotifications","useEffect","then","ok","data","isCollaborator","showRightMenu","isPrivate","level","Heading","dividing","iconClassName","subtitle","TermsOfService","hasLegal","PrivacyPolicy","LegalNotice","LegalFooter","Modal","Footer","align","LegalAgreement","SocialSignInButton","redirectTo","window","location","url","provider","logoURL","displayName","OAuthProviderLogo","SignInControl","email","setEmail","setError","providersLen","oauth","loginUrl","replace","i","useEmail","onEmailSent","Segments","Segment","List","divided","hover","ListItem","Moment","date","format","now","Date","display","getTime","ModalWindow","root","useRef","document","getElementById","body","overflow","addEventListener","keyDown","removeEventListener","keyCode","close","canClose","current","evt","Window","Content","UserName","isStaff","Loader","show","setShow","TenantLogoURL","logoBlobKey","TenantLogo","useFiderIfEmpty","systemProvidersLogo","google","facebook","github","OAuthProviderLogoURL","Toggle","active","setActive","newActive","onToggle","readOnly","FiderVersion","DropDown","mounted","handleMouseDown","button","addListeners","renderItem","item","isSelected","highlightSelected","onMouseDown","setSelected","render","handleDocumentClick","node","rootElementRef","contains","removeListeners","findItem","newState","fireChangeEvent","header","search","onSearchChange","dropdownClass","inline","direction","onTouchEnd","renderControl","searchable","renderText","buildItemList","PoweredByFider","ErrorBoundary","errorInfo","onError","showDetails","ShowPostStatus","status","ShowPostResponse","response","showUser","original","number","slug","DuplicateDetails","StatusDetails","SignInModal","confirmationAddress","setConfirmationAddress","setTimeout","VoteCounter","hasVoted","setHasVoted","post","votesCount","setVotesCount","closed","vote","action","PostStatus","filterable","All","Error","TenantStatus","UserAvatarType","UserStatus","UserRole","Open","Planned","Started","Completed","Declined","Duplicate","Deleted","Collaborator","Administrator","OAuthConfigStatus","Disabled","Enabled","request","method","headers","fetch","JSON","stringify","credentials","json","toResult","truncatedBody","truncate","http","get","put","delete","category","analytics","set","storage","setItem","localStorage","getItem","has","removeItem","cache","local","sessionStorage","eventCategory","eventAction","ga","exDescription","stack","exFatal","FiderSession","pProps","pContextID","contextID","pUser","pTenant","Fider","initialize","initData","pSettings","pSession","el","parse","textContent","innerText","mode","FiderContext","createContext","jwt","decode","token","segments","split","atob","classSet","input","classes","trim","monthNames","twoDigits","formatDate","monthIndex","getMonth","year","getFullYear","day","getDate","hours","getHours","minutes","getMinutes","templates","seconds","minute","hour","days","month","months","years","template","n","abs","round","timeSince","fileToBase64","Promise","resolve","reject","reader","FileReader","parts","readAsDataURL","isCookieEnabled","cookie","ret","indexOf","uploadedImageURL","tenantAssetsURL","substr","headerIds","xhtml","smartLists","gfm","breaks","USE_PROFILES","ADD_ATTR","fullRenderer","image","plainTextRenderer","_href","_title","br","strong","list","listitem","heading","paragraph","code","codespan","del","entities","encodeHTML","s","sanitize","full","renderer","plainText","toastify","success","toast","goHome","goTo","pathname","replaceState","path","history","newURL","baseURL","getNumber","uri","re","RegExp","match","separator","results","exec","decodeURIComponent","getArray","qs","object","symbol","Array","join","encodeURIComponent","isTouch","navigator","maxTouchPoints","msMaxTouchPoints","updateUserSettings","changeUserEmail","deleteCurrentAccount","regenerateAPIKey","createTag","updateTag","deleteTag","assignTag","postNumber","unassignTag","getAllPosts","searchPosts","params","tags","query","view","limit","deletePost","addVote","removeVote","subscribe","unsubscribe","listVotes","createComment","attachments","updateComment","commentID","deleteComment","respond","originalNumber","createPost","description","updatePost","createTenant","updateTenantSettings","updateTenantAdvancedSettings","customCSS","updateTenantPrivacy","checkAvailability","subdomain","signIn","completeProfile","changeUserRole","userID","blockUser","unblockUser","getOAuthConfig","saveOAuthConfig","getTotalUnreadNotifications","total","markAllAsRead","sendInvites","subject","recipients","sendSampleInvite","ignoreErrors","logError","pattern","console","hasContainer","setup","position","toastClassName"],"mappings":"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","file":"js/common.eb6622defe8dc44b761c.js","sourcesContent":["import \"./ShowTag.scss\"\n\nimport React from \"react\"\nimport { Tag } from \"@fider/models\"\nimport { classSet } from \"@fider/services\"\n\ninterface TagProps {\n tag: Tag\n circular?: boolean\n}\n\nconst getRGB = (color: string) => {\n const r = color.substring(0, 2)\n const g = color.substring(2, 4)\n const b = color.substring(4, 6)\n\n return {\n R: parseInt(r, 16),\n G: parseInt(g, 16),\n B: parseInt(b, 16),\n }\n}\n\nconst 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 \"m-circular\": props.circular === true,\n })\n\n return (\n \n {!props.tag.isPublic && !props.circular && (\n \n \n \n )}\n {props.circular ? \"\" : props.tag.name || \"Tag\"}\n \n )\n}\n","import React from \"react\"\nimport { classSet } from \"@fider/services\"\n\ninterface ButtonProps {\n className?: string\n disabled?: boolean\n href?: string\n rel?: \"nofollow\"\n type?: \"button\" | \"submit\"\n color?: \"positive\" | \"danger\" | \"default\" | \"cancel\"\n fluid?: boolean\n size?: \"mini\" | \"tiny\" | \"small\" | \"normal\" | \"large\"\n onClick?: (event: ButtonClickEvent) => Promise\n}\n\ninterface ButtonState {\n clicked: boolean\n}\n\nimport \"./Button.scss\"\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 class Button extends React.Component {\n private unmounted = false\n\n public static defaultProps: Partial = {\n size: \"small\",\n fluid: false,\n color: \"default\",\n type: \"button\",\n }\n\n public constructor(props: ButtonProps) {\n super(props)\n this.state = {\n clicked: false,\n }\n }\n\n public componentWillUnmount() {\n this.unmounted = true\n }\n\n public click = async (e?: React.SyntheticEvent) => {\n if (e) {\n e.preventDefault()\n e.stopPropagation()\n }\n\n if (this.state.clicked) {\n return\n }\n\n const event = new ButtonClickEvent()\n this.setState({ clicked: true })\n if (this.props.onClick) {\n await this.props.onClick(event)\n if (!this.unmounted && event.canEnable()) {\n this.setState({ clicked: false })\n }\n }\n }\n\n public render() {\n const className = classSet({\n \"c-button\": true,\n \"m-fluid\": this.props.fluid,\n [`m-${this.props.size}`]: this.props.size,\n [`m-${this.props.color}`]: this.props.color,\n \"m-loading\": this.state.clicked,\n \"m-disabled\": this.state.clicked || this.props.disabled,\n [this.props.className || \"\"]: this.props.className,\n })\n\n if (this.props.href) {\n return (\n \n {this.props.children}\n \n )\n } else if (this.props.onClick) {\n return (\n \n )\n } else {\n return (\n \n )\n }\n }\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 className?: string\n size?: \"mini\" | \"normal\"\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 [`m-${props.size}`]: props.size,\n })\n\n return (\n
\n \n {props.children}\n \n )\n}\n","import React from \"react\"\nimport { Failure } from \"@fider/services\"\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","/* eslint-disable prettier/prettier */\nimport React from \"react\"\nimport { classSet } from \"@fider/services\"\nimport { ValidationContext } from \"./Form\"\nimport { DisplayError, hasError } from \"./DisplayError\"\nimport { IconType } from \"react-icons\"\n\ninterface InputProps {\n field: string\n label?: string\n className?: string\n autoComplete?: string\n autoFocus?: boolean\n noTabFocus?: boolean\n afterLabel?: JSX.Element\n icon?: IconType\n maxLength?: number\n value?: string\n disabled?: boolean\n suffix?: string | JSX.Element\n placeholder?: string\n onIconClick?: () => void\n onFocus?: () => void\n inputRef?: React.MutableRefObject\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\n ? React.createElement(props.icon, {\n onClick: props.onIconClick,\n className: classSet({ link: !!props.onIconClick }),\n })\n : undefined\n\n return (\n \n {(ctx) => (\n \n {!!props.label && (\n \n )}\n
    \n \n {icon}\n {suffix}\n\n \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, Modal } from \"@fider/components\"\nimport { FaRegImage } from \"react-icons/fa\"\nimport { ImageUpload } from \"@fider/models\"\n\nconst hardFileSizeLimit = 5 * 1024 * 1024\n\ninterface ImageUploaderProps {\n instanceID?: string\n field: string\n label?: string\n bkey?: string\n disabled?: boolean\n previewMaxWidth: number\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, this.props.previewMaxWidth),\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 5MB.\")\n return\n }\n\n const base64 = await fileToBase64(file)\n this.setState(\n {\n bkey: this.props.bkey,\n upload: {\n fileName: file.name,\n content: base64,\n contentType: file.type,\n },\n remove: false,\n previewURL: `data:${file.type};base64,${base64}`,\n },\n () => {\n this.props.onChange(this.state, this.props.instanceID, this.state.previewURL)\n }\n )\n }\n }\n\n public removeFile = async () => {\n if (this.fileSelector) {\n this.fileSelector.value = \"\"\n }\n\n this.setState(\n {\n bkey: this.props.bkey,\n remove: true,\n upload: undefined,\n previewURL: undefined,\n },\n () => {\n this.props.onChange(\n {\n bkey: this.state.bkey,\n remove: this.state.remove,\n upload: this.state.upload,\n },\n this.props.instanceID,\n this.state.previewURL\n )\n }\n )\n }\n\n public selectFile = async () => {\n if (this.fileSelector) {\n this.fileSelector.click()\n }\n }\n\n private openModal = () => {\n this.setState({ showModal: true })\n }\n\n private closeModal = async () => {\n this.setState({ showModal: false })\n }\n\n private modal() {\n return (\n \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 const imgStyles: React.CSSProperties = {\n maxWidth: `${this.props.previewMaxWidth}px`,\n }\n\n return (\n \n {(ctx) => (\n \n {this.modal()}\n \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/*\" />\n \n {!hasFile && (\n
    \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 previewMaxWidth: number\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 }\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\ninterface TextAreaProps {\n label?: string\n field: string\n value?: string\n disabled?: boolean\n minRows?: number\n placeholder?: string\n onChange?: (value: string) => void\n inputRef?: React.MutableRefObject\n onFocus?: React.FocusEventHandler\n}\n\nexport const TextArea: React.FunctionComponent = (props) => {\n const onChange = (e: React.FormEvent) => {\n if (props.onChange) {\n props.onChange(e.currentTarget.value)\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 React from \"react\"\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\ninterface RadioButtonState {\n selected: RadioButtonOption\n}\n\nexport class RadioButton extends React.Component {\n constructor(props: RadioButtonProps) {\n super(props)\n this.state = {\n selected: props.defaultOption || props.options[0],\n }\n }\n\n private onChange = (selected: RadioButtonOption) => {\n this.setState({ selected }, () => {\n if (this.props.onSelect) {\n this.props.onSelect(this.state.selected)\n }\n })\n }\n\n public render() {\n const inputs = this.props.options.map((option) => {\n return (\n
    \n \n \n
    \n )\n })\n\n return (\n
    \n \n {inputs}\n
    \n )\n }\n}\n","import React from \"react\"\nimport { classSet } from \"@fider/services\"\nimport { ValidationContext } from \"./Form\"\nimport { DisplayError, hasError } from \"./DisplayError\"\n\nexport interface SelectOption {\n value: string\n label: string\n}\n\ninterface SelectProps {\n field: string\n label?: string\n maxLength?: number\n defaultValue?: string\n options: SelectOption[]\n onChange?: (option?: SelectOption) => void\n}\n\ninterface SelectState {\n selected?: SelectOption\n}\n\nexport class Select extends React.Component {\n constructor(props: SelectProps) {\n super(props)\n this.state = {\n selected: this.getOption(props.defaultValue),\n }\n }\n\n private getOption(value?: string): SelectOption | undefined {\n if (value && this.props.options) {\n const filtered = this.props.options.filter((x) => x.value === value)\n if (filtered && filtered.length > 0) {\n return filtered[0]\n }\n }\n }\n\n private onChange = (e: React.FormEvent) => {\n let selected: SelectOption | undefined\n if (e.currentTarget.value) {\n const options = this.props.options.filter((o) => o.value === e.currentTarget.value)\n if (options && options.length > 0) {\n selected = options[0]\n }\n }\n\n this.setState({ selected }, () => {\n if (this.props.onChange) {\n this.props.onChange(this.state.selected)\n }\n })\n }\n\n public render() {\n const options = this.props.options.map((option) => {\n return (\n \n )\n })\n\n return (\n \n {(ctx) => (\n <>\n \n {!!this.props.label && }\n
    \n \n
    \n \n {this.props.children}\n \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 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 \"../\"\n\ninterface CheckboxProps {\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 props.onChange(isChecked)\n }\n\n return (\n \n {(ctx) => (\n \n \n \n \n )}\n \n )\n}\n","import React from \"react\"\nimport { uploadedImageURL } from \"@fider/services\"\nimport { Modal, Button, Loader } from \"@fider/components\"\n\nimport \"./ImageViewer.scss\"\n\ninterface ImageViewerProps {\n bkey: string\n}\n\ninterface ImageViewerState {\n showModal: boolean\n loadedThumbnail: boolean\n loadedPreview: boolean\n}\n\nexport class ImageViewer extends React.Component {\n constructor(props: ImageViewerProps) {\n super(props)\n\n this.state = {\n showModal: false,\n loadedThumbnail: false,\n loadedPreview: false,\n }\n }\n\n private openModal = () => {\n if (this.state.loadedThumbnail) {\n this.setState({ showModal: true })\n }\n }\n\n private closeModal = async () => {\n this.setState({ showModal: false })\n }\n\n private onThumbnailLoad = () => {\n this.setState({ loadedThumbnail: true })\n }\n\n private onPreviewLoad = () => {\n this.setState({ loadedPreview: true })\n }\n\n private modal() {\n return (\n \n \n {!this.state.loadedPreview && }\n \"\"\n \n\n \n \n \n \n )\n }\n\n public render() {\n const previewURL = uploadedImageURL(this.props.bkey, 200)\n return (\n
    \n {this.modal()}\n {!this.state.loadedThumbnail && }\n \"\"\n
    \n )\n }\n}\n","import React from \"react\"\nimport { markdown, truncate } from \"@fider/services\"\n\ninterface MultiLineTextProps {\n className?: string\n text?: string\n maxLength?: number\n style: \"full\" | \"plainText\"\n}\n\nexport const MultiLineText = (props: MultiLineTextProps) => {\n if (!props.text) {\n return null\n }\n\n const html = markdown[props.style](props.text)\n const className = `markdown-body ${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\nexport const EnvironmentInfo = () => {\n const fider = useFider()\n\n if (fider.isProduction()) {\n return null\n }\n\n return (\n
    \n Env: {fider.settings.environment} | Compiler: {fider.settings.compiler} | Version: {fider.settings.version} | BuildTime:{\" \"}\n {fider.settings.buildTime || \"N/A\"} |{!fider.isSingleHostMode() && `TenantID: ${fider.session.tenant.id}`} |{\" \"}\n {fider.session.isAuthenticated && `UserID: ${fider.session.user.id}`}\n
    \n )\n}\n","import \"./Avatar.scss\"\n\nimport React from \"react\"\nimport { classSet } from \"@fider/services\"\nimport { isCollaborator, UserRole } from \"@fider/models\"\n\ninterface AvatarProps {\n user: {\n role?: UserRole\n avatarURL: string\n name: string\n }\n size?: \"small\" | \"normal\" | \"large\"\n}\n\nexport const Avatar = (props: AvatarProps) => {\n const size = props.size || \"normal\"\n\n const className = classSet({\n \"c-avatar\": true,\n [`m-${size}`]: true,\n \"m-staff\": props.user.role && isCollaborator(props.user.role),\n })\n\n return {props.user.name}\n}\n","import \"./Message.scss\"\n\nimport React from \"react\"\nimport { classSet } from \"@fider/services\"\nimport { FaBan, FaRegCheckCircle, FaExclamationTriangle } from \"react-icons/fa\"\n\ninterface MessageProps {\n type: \"success\" | \"warning\" | \"error\"\n showIcon?: boolean\n}\n\nexport const Message: React.FunctionComponent = (props) => {\n const className = classSet({\n \"c-message\": true,\n [`m-${props.type}`]: true,\n })\n\n const icon = props.type === \"error\" ? : props.type === \"warning\" ? : \n\n return (\n

    \n {props.showIcon === true && icon}\n {props.children}\n

    \n )\n}\n","import \"./Hint.scss\"\n\nimport React, { useState } from \"react\"\nimport { FaTimes } from \"react-icons/fa\"\n\nimport { cache } from \"@fider/services\"\n\ninterface HintProps {\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 return (\n

    \n HINT: {props.children}\n {cacheKey && }\n

    \n )\n}\n","/* eslint-disable prettier/prettier */\nimport \"./Header.scss\"\n\nimport React, { useState, useEffect } from \"react\"\nimport { SignInModal, EnvironmentInfo, TenantLogo, Avatar } from \"@fider/components\"\nimport { actions } from \"@fider/services\"\nimport { FaUser, FaCog, FaBell, FaSignOutAlt, FaCaretDown } from \"react-icons/fa\"\nimport { useFider } from \"@fider/hooks\"\n\nimport BCCPortal from \"@fider/assets/images/home.svg\"\n\nexport const Header = () => {\n const fider = useFider()\n const [isSignInModalOpen, setIsSignInModalOpen] = useState(false)\n const [unreadNotifications, setUnreadNotifications] = useState(0)\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 const showModal = () => {\n if (!fider.session.isAuthenticated) {\n setIsSignInModalOpen(true)\n }\n }\n\n const hideModal = () => setIsSignInModalOpen(false)\n\n const items = fider.session.isAuthenticated && (\n
    \n
    \n {fider.session.user.name}\n
    \n \n Settings\n \n
    \n\n \n Notifications\n {unreadNotifications > 0 &&
    {unreadNotifications}
    }\n
    \n
    \n {fider.session.user.isCollaborator && [\n //
    \n // Administration\n //
    ,\n \n Site Settings\n ,\n
    ,\n ]}\n \n Sign out\n \n
    \n )\n\n const showRightMenu = fider.session.isAuthenticated || !fider.session.tenant.isPrivate\n return (\n
    \n \n \n
    \n
    \n \"\"\n \n \n \n {showRightMenu && (\n
    \n {fider.session.isAuthenticated && }\n {unreadNotifications > 0 &&
    }\n {!fider.session.isAuthenticated && Sign in}\n {fider.session.isAuthenticated && }\n {items}\n
    \n )}\n
    \n
    \n
    \n )\n}\n","import \"./Heading.scss\"\n\nimport React from \"react\"\nimport { classSet } from \"@fider/services\"\nimport { IconType } from \"react-icons\"\n\ninterface HeadingLogo {\n title: string\n dividing?: boolean\n size?: \"normal\" | \"small\"\n icon?: IconType\n subtitle?: string\n className?: string\n}\n\nconst Header: React.FunctionComponent<{ level: number; className: string }> = (props) =>\n React.createElement(`h${props.level}`, { className: props.className }, props.children)\n\nexport const Heading = (props: HeadingLogo) => {\n const size = props.size || \"normal\"\n const level = size === \"normal\" ? 2 : 3\n const className = classSet({\n \"c-heading\": true,\n \"m-dividing\": props.dividing || false,\n [`m-${size}`]: true,\n [`${props.className}`]: props.className,\n })\n\n const iconClassName = classSet({\n \"c-heading-icon\": true,\n circular: level <= 2,\n })\n\n const icon = props.icon &&
    {React.createElement(props.icon)}
    \n\n return (\n
    \n {icon}\n
    \n {props.title}\n
    {props.subtitle}
    \n
    \n
    \n )\n}\n","import React from \"react\"\nimport { Modal, Checkbox } from \"@fider/components/common\"\nimport { useFider } from \"@fider/hooks\"\n\ninterface LegalAgreementProps {\n onChange: (agreed: boolean) => void\n}\n\nexport const TermsOfService: React.FunctionComponent = () => {\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: React.FunctionComponent = () => {\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: React.FunctionComponent = () => {\n const fider = useFider()\n\n if (fider.settings.hasLegal) {\n return (\n

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

    \n )\n }\n return null\n}\n\nexport const LegalFooter: React.FunctionComponent = () => {\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 I have read and agree to the and .\n \n )\n }\n return null\n}\n","import React from \"react\"\nimport { Button, OAuthProviderLogo } from \"@fider/components/common\"\nimport { classSet } from \"@fider/services\"\n\ninterface SocialSignInButtonProps {\n option: {\n displayName: string\n provider?: string\n url?: string\n logoBlobKey?: string\n logoURL?: string\n }\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 const className = classSet({\n \"m-social\": true,\n [`m-${props.option.provider}`]: props.option.provider,\n })\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 { device, actions, Failure, isCookieEnabled } from \"@fider/services\"\nimport { useFider } from \"@fider/hooks\"\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 [email, setEmail] = useState(\"\")\n const [error, setError] = useState(undefined)\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 if (providersLen > 0) {\n const loginUrl = fider.settings.oauth[0].url + \"?redirect=\" + props.redirectTo\n location.replace(loginUrl)\n return (\n
    \n redirecting you to login automatically. click here if it doesn't work\n
    \n )\n }\n\n return (\n
    \n {providersLen > 0 && (\n
    \n
    \n {fider.settings.oauth.map((o, i) => (\n \n {i % 4 === 0 &&
    }\n
    \n \n
    \n \n ))}\n
    \n

    We will never post to these accounts on your behalf.

    \n
    \n )}\n\n {providersLen > 0 &&
    OR
    }\n\n {props.useEmail && (\n
    \n

    Enter your email address to sign in

    \n
    \n \n Sign in\n \n }\n />\n \n
    \n )}\n
    \n )\n}\n","import \"./Segment.scss\"\n\nimport React from \"react\"\n\ninterface SegmentProps {\n className?: string\n}\n\nexport const Segments: React.FunctionComponent = (props) => {\n return
    {props.children}
    \n}\n\nexport const Segment: React.FunctionComponent = (props) => {\n return
    {props.children}
    \n}\n","import \"./List.scss\"\n\nimport React from \"react\"\nimport { classSet } from \"@fider/services\"\n\ninterface ListProps {\n className?: string\n divided?: boolean\n hover?: boolean\n}\n\ninterface ListItemProps {\n className?: string\n onClick?: () => void\n}\n\nexport const List: React.FunctionComponent = (props) => {\n const className = classSet({\n \"c-list\": true,\n [props.className || \"\"]: true,\n \"m-divided\": props.divided,\n \"m-hover\": props.hover,\n })\n\n return
    {props.children}
    \n}\n\nexport const ListItem: React.FunctionComponent = (props) => {\n const className = classSet({\n \"c-list-item\": true,\n [props.className || \"\"]: true,\n \"m-selectable\": props.onClick,\n })\n\n if (props.onClick) {\n return (\n
    \n {props.children}\n
    \n )\n }\n return
    {props.children}
    \n}\n","import React from \"react\"\nimport { formatDate, timeSince } from \"@fider/services\"\n\ninterface MomentText {\n date: Date | string\n format?: \"relative\" | \"full\" | \"short\"\n}\n\nexport const Moment = (props: MomentText) => {\n if (!props.date) {\n return \n }\n\n const format = props.format || \"relative\"\n\n const now = new Date()\n const date = props.date instanceof Date ? props.date : new Date(props.date)\n const diff = (now.getTime() - date.getTime()) / (60 * 60 * 24 * 1000)\n const display =\n diff >= 365 && format === \"relative\" ? formatDate(props.date, \"short\") : format === \"relative\" ? timeSince(now, date) : formatDate(props.date, format)\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 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 = (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 (props.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 \"m-center\": props.center,\n [`m-${props.size}`]: true,\n })\n\n return ReactDOM.createPortal(\n
    \n
    \n {props.children}\n
    \n
    ,\n root.current\n )\n}\n\nModalWindow.defaultProps = {\n size: \"small\",\n canClose: true,\n center: true,\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 [`m-${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 { isCollaborator, UserRole } from \"@fider/models\"\nimport { classSet } from \"@fider/services\"\n\ninterface UserNameProps {\n user: {\n id: number\n name: string\n role?: UserRole\n }\n}\n\nexport const UserName = (props: UserNameProps) => {\n const isStaff = props.user.role && isCollaborator(props.user.role)\n const className = classSet({\n \"c-username\": true,\n \"m-staff\": isStaff,\n })\n\n return (\n
    \n {props.user.name || \"Anonymous\"}\n {isStaff && (\n
    \n \n \n \n
    \n )}\n
    \n )\n}\n","import \"./Loader.scss\"\n\nimport React, { useState } from \"react\"\nimport { useTimeout } from \"@fider/hooks\"\n\nexport function Loader() {\n const [show, setShow] = useState(false)\n\n useTimeout(() => {\n setShow(true)\n }, 500)\n\n return show ?
    : 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 = (props: TenantLogoProps) => {\n const fider = useFider()\n\n const tenant = fider.session.tenant\n if (tenant && tenant.logoBlobKey) {\n return {tenant.name}\n } else if (props.useFiderIfEmpty) {\n return \"Fider\"\n }\n return null\n}\n\nTenantLogo.defaultProps = {\n useFiderIfEmpty: false,\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\"\n\ninterface ToggleProps {\n label?: string\n active: boolean\n disabled?: boolean\n onToggle?: (active: boolean) => void\n}\n\nexport const Toggle: React.StatelessComponent = (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 \"m-disabled\": !!props.disabled,\n })\n\n return (\n \n \n \n {!!props.label && props.label}\n \n )\n}\n","import React from \"react\"\nimport { useFider } from \"@fider/hooks\"\n\nexport const FiderVersion = () => {\n const fider = useFider()\n\n return (\n

    \n Support our{\" \"}\n \n OpenCollective\n \n
    \n Fider v{fider.settings.version}\n

    \n )\n}\n","import React from \"react\"\nimport { classSet } from \"@fider/services\"\n\nimport \"./DropDown.scss\"\n\nexport interface DropDownItem {\n value: any\n label: string\n render?: JSX.Element\n}\n\nexport interface DropDownProps {\n className?: string\n defaultValue?: any\n items: (DropDownItem | undefined | false)[]\n placeholder?: string\n searchable?: boolean\n inline?: boolean\n style: \"normal\" | \"simple\"\n highlightSelected?: boolean\n header?: string\n direction?: \"left\" | \"right\"\n onChange?: (item: DropDownItem) => void\n onSearchChange?: (e: React.FormEvent) => void\n renderText?: (item?: DropDownItem) => JSX.Element | string | undefined\n renderControl?: (item?: DropDownItem) => JSX.Element | string | undefined\n}\n\nexport interface DropDownState {\n isOpen: boolean\n selected?: DropDownItem\n}\n\nexport class DropDown extends React.Component {\n private rootElementRef: React.RefObject\n private mounted = false\n\n public static defaultProps: Partial = {\n direction: \"right\",\n style: \"normal\",\n highlightSelected: true,\n }\n\n constructor(props: DropDownProps) {\n super(props)\n this.rootElementRef = React.createRef()\n this.state = {\n selected: this.findItem(props.defaultValue, props.items),\n isOpen: false,\n }\n }\n\n public componentDidMount() {\n this.mounted = true\n }\n\n public componentWillUnmount() {\n this.mounted = false\n this.removeListeners()\n }\n\n private addListeners() {\n document.addEventListener(\"click\", this.handleDocumentClick, false)\n document.addEventListener(\"touchend\", this.handleDocumentClick, false)\n }\n\n private removeListeners() {\n document.removeEventListener(\"click\", this.handleDocumentClick, false)\n document.removeEventListener(\"touchend\", this.handleDocumentClick, false)\n }\n\n public handleMouseDown = (event: any) => {\n if (event.type === \"mousedown\" && event.button !== 0) {\n return\n }\n\n event.stopPropagation()\n event.preventDefault()\n\n this.setState(\n {\n isOpen: true,\n },\n this.addListeners\n )\n }\n\n public findItem(value: any, items: (DropDownItem | undefined | false)[]): DropDownItem | undefined {\n for (const item of items) {\n if (item && item.value === value) {\n return item\n }\n }\n return undefined\n }\n\n public setSelected(selected: DropDownItem) {\n const newState = {\n selected,\n isOpen: false,\n }\n this.fireChangeEvent(newState)\n this.setState(newState, this.removeListeners)\n }\n\n public fireChangeEvent(newState: DropDownState) {\n if (newState.selected && newState.selected !== this.state.selected && this.props.onChange) {\n this.props.onChange(newState.selected)\n }\n }\n\n public renderItem = (item: DropDownItem | undefined | false) => {\n if (!item) {\n return\n }\n\n const { label, value } = item\n const isSelected = this.props.highlightSelected && this.state.selected && value === this.state.selected.value\n const className = classSet({\n \"c-dropdown-item\": true,\n \"is-selected\": isSelected,\n })\n\n return (\n
    \n {item.render ? item.render : label}\n
    \n )\n }\n\n public buildItemList() {\n const items = this.props.items.map(this.renderItem)\n\n return (\n
    \n {this.props.header &&
    {this.props.header}
    }\n
    {items.length ? items :
    No results found
    }
    \n
    \n )\n }\n\n public handleDocumentClick = (event: any) => {\n if (this.mounted) {\n const node = this.rootElementRef.current\n if (node && !node.contains(event.target)) {\n if (this.state.isOpen) {\n this.setState(\n {\n isOpen: false,\n },\n this.removeListeners\n )\n }\n }\n }\n }\n\n public render() {\n const text = this.state.selected ? this.state.selected.label : {this.props.placeholder}\n\n const search = \n\n const dropdownClass = classSet({\n \"c-dropdown\": true,\n [`${this.props.className}`]: this.props.className,\n \"is-open\": this.state.isOpen,\n [`m-style-${this.props.style}`]: true,\n \"is-inline\": this.props.inline,\n \"m-right\": this.props.direction === \"right\",\n \"m-left\": this.props.direction === \"left\",\n })\n\n return (\n
    \n
    \n {this.props.renderControl ? (\n
    {this.props.renderControl(this.state.selected)}
    \n ) : (\n
    \n {this.state.isOpen && this.props.searchable ? search : this.props.renderText ? this.props.renderText(this.state.selected) :
    {text}
    }\n \n
    \n )}\n
    \n {this.state.isOpen && this.buildItemList()}\n
    \n )\n }\n}\n","import React from \"react\"\n\nimport \"./PoweredByFider.scss\"\n\nexport const PoweredByFider = () => {\n return (\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 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 \"./ShowPostResponse.scss\"\n\nimport React from \"react\"\nimport { PostResponse, PostStatus } from \"@fider/models\"\nimport { Avatar, MultiLineText, UserName, Segment } from \"@fider/components/common\"\n\ninterface ShowPostStatusProps {\n status: PostStatus\n}\n\nexport const ShowPostStatus = (props: ShowPostStatusProps) => {\n return {props.status.title}\n}\n\nconst DuplicateDetails = (props: PostResponseProps): JSX.Element | null => {\n if (!props.response) {\n return null\n }\n\n const original = props.response.original\n if (!original) {\n return null\n }\n\n return (\n \n )\n}\n\ninterface PostResponseProps {\n status: string\n response: PostResponse | null\n showUser: boolean\n}\n\nconst StatusDetails = (props: PostResponseProps): JSX.Element | null => {\n if (!props.response || !props.response.text) {\n return null\n }\n\n return (\n
    \n \n
    \n )\n}\n\nexport const ShowPostResponse = (props: PostResponseProps): JSX.Element | null => {\n const status = PostStatus.Get(props.status)\n\n if (props.response && (status.show || props.response.text)) {\n return (\n \n {status.show && }\n {props.showUser && (\n <>\n \n \n )}\n {status === PostStatus.Duplicate ? DuplicateDetails(props) : StatusDetails(props)}\n \n )\n }\n\n return null\n}\n","import React, { useState, useEffect } from \"react\"\nimport { Modal, SignInControl, LegalFooter } from \"@fider/components/common\"\n\ninterface SignInModalProps {\n isOpen: boolean\n onClose: () => void\n}\n\nexport const SignInModal: React.StatelessComponent = (props) => {\n const [confirmationAddress, setConfirmationAddress] = useState(\"\")\n\n useEffect(() => {\n if (confirmationAddress) {\n setTimeout(() => setConfirmationAddress(\"\"), 5000)\n }\n }, [confirmationAddress])\n\n const onEmailSent = (email: string): void => {\n setConfirmationAddress(email)\n }\n\n const closeModal = () => {\n setConfirmationAddress(\"\")\n props.onClose()\n }\n\n const content = confirmationAddress ? (\n <>\n

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

    \n

    \n \n OK\n \n

    \n \n ) : (\n \n )\n\n return (\n \n Sign in to post and vote\n {content}\n \n \n )\n}\n","/* eslint-disable prettier/prettier */\nimport \"./VoteCounter.scss\"\n\nimport React, { useState } from \"react\"\nimport { Post, PostStatus } from \"@fider/models\"\nimport { actions, classSet } from \"@fider/services\"\nimport { SignInModal } from \"@fider/components\"\nimport { FaHeart } from \"react-icons/fa\"\nimport { useFider } from \"@fider/hooks\"\ninterface VoteCounterProps {\n post: Post\n}\n\nexport const VoteCounter = (props: VoteCounterProps) => {\n const fider = useFider()\n const [hasVoted, setHasVoted] = useState(props.post.hasVoted)\n const [votesCount, setVotesCount] = useState(props.post.votesCount)\n const [isSignInModalOpen, setIsSignInModalOpen] = useState(false)\n\n const voteOrUndo = async () => {\n if (!fider.session.isAuthenticated) {\n setIsSignInModalOpen(true)\n return\n }\n\n const action = hasVoted ? actions.removeVote : actions.addVote\n\n const response = await action(props.post.number)\n if (response.ok) {\n setVotesCount(votesCount + (hasVoted ? -1 : 1))\n setHasVoted(!hasVoted)\n }\n }\n\n const hideModal = () => setIsSignInModalOpen(false)\n\n const status = PostStatus.Get(props.post.status)\n\n const className = classSet({\n \"c-vote-counter__button\": true,\n \"c-vote-counter__button--voted\": !status.closed && hasVoted,\n \"c-vote-counter__button--disabled\": status.closed,\n })\n\n const vote = (\n \n )\n\n const disabled = (\n \n )\n\n return (\n <>\n \n
    {status.closed ? disabled : vote}
    \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 hasVoted: boolean\n response: PostResponse | null\n votesCount: number\n commentsCount: number\n tags: string[]\n}\n\nexport class PostStatus {\n constructor(public title: string, public value: string, public show: boolean, public closed: boolean, public filterable: boolean) {}\n\n public static Open = new PostStatus(\"Open\", \"open\", false, false, false)\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, false)\n public static Deleted = new PostStatus(\"Deleted\", \"deleted\", false, true, false)\n\n public static Get(value: string): PostStatus {\n for (const status of PostStatus.All) {\n if (status.value === value) {\n return status\n }\n }\n throw new Error(`PostStatus not found for value ${value}.`)\n }\n\n public static All = [PostStatus.Open, PostStatus.Planned, PostStatus.Started, PostStatus.Completed, PostStatus.Duplicate, PostStatus.Declined]\n}\n\nexport interface PostResponse {\n user: User\n text: string\n respondedAt: Date\n original?: {\n number: number\n title: string\n slug: string\n status: string\n }\n}\n\nexport interface Comment {\n id: number\n content: string\n createdAt: string\n user: User\n attachments?: string[]\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 invitation: string\n welcomeMessage: string\n status: TenantStatus\n isPrivate: boolean\n logoBlobKey: string\n}\n\nexport enum TenantStatus {\n Active = 1,\n Pending = 2,\n Locked = 3,\n}\n\nexport interface User {\n id: number\n name: string\n role: UserRole\n status: UserStatus\n avatarURL: string\n}\n\nexport enum UserAvatarType {\n Letter = \"letter\",\n Gravatar = \"gravatar\",\n Custom = \"custom\",\n}\n\nexport enum UserStatus {\n Active = \"active\",\n Deleted = \"deleted\",\n Blocked = \"blocked\",\n}\n\nexport enum UserRole {\n Visitor = \"visitor\",\n Collaborator = \"collaborator\",\n Administrator = \"administrator\",\n}\n\nexport const isCollaborator = (role: UserRole): boolean => {\n return role === UserRole.Collaborator || role === UserRole.Administrator\n}\n\nexport interface CurrentUser {\n id: number\n name: string\n email: string\n avatarType: UserAvatarType\n avatarBlobKey: string\n avatarURL: string\n role: UserRole\n status: UserStatus\n isAdministrator: boolean\n isCollaborator: boolean\n}\n","export interface OAuthProviderOption {\n provider: string\n displayName: string\n clientID: string\n url: string\n callbackURL: string\n logoBlobKey: string\n isCustomProvider: boolean\n isEnabled: boolean\n}\n\nexport interface SystemSettings {\n mode: string\n buildTime: string\n version: string\n environment: string\n compiler: string\n domain: string\n hasLegal: boolean\n baseURL: string\n tenantAssetsURL: string\n globalAssetsURL: 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}\n\nexport interface ImageUpload {\n bkey?: string\n upload?: {\n fileName?: string\n content?: string\n contentType?: string\n }\n remove: boolean\n}\n","import { analytics, notify, truncate } from \"@fider/services\"\n\nexport interface ErrorItem {\n field?: string\n message: string\n}\n\nexport interface Failure {\n errors?: ErrorItem[]\n}\n\nexport interface Result {\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 === 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: (category: string, action: string) => (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 } from \"@fider/models\"\n\nexport class FiderSession {\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.pContextID = data.contextID\n this.pProps = data.props\n this.pUser = data.user\n this.pTenant = data.tenant\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 session(): FiderSession {\n return this.pSession\n }\n\n public get settings(): SystemSettings {\n return this.pSettings\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\nconst monthNames = [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"]\n\nexport const currencySymbol = (currencyCode: string): string => {\n currencyCode = currencyCode ? currencyCode.toLowerCase() : \"\"\n switch (currencyCode) {\n case \"eur\":\n return \"€\"\n case \"usd\":\n return \"$\"\n }\n throw new Error(`Invalid currency code '${currencyCode}'`)\n}\n\nconst twoDigits = (value: number): string => {\n return value <= 9 ? `0${value}` : value.toString()\n}\n\ntype DateFormat = \"full\" | \"short\"\n\nexport const formatDate = (input: Date | string, format: DateFormat = \"full\"): string => {\n const date = input instanceof Date ? input : new Date(input)\n\n const monthIndex = date.getMonth()\n const year = date.getFullYear()\n\n if (format === \"short\") {\n return `${monthNames[monthIndex].substring(0, 3)} '${year.toString().substring(2)}`\n }\n\n const day = date.getDate()\n const hours = twoDigits(date.getHours())\n const minutes = twoDigits(date.getMinutes())\n return `${monthNames[monthIndex]} ${day}, ${year} · ${hours}:${minutes}`\n}\n\nconst templates: { [key: string]: string } = {\n seconds: \"less than a minute\",\n minute: \"about a minute\",\n minutes: \"%d minutes\",\n hour: \"about an hour\",\n hours: \"about %d hours\",\n day: \"a day\",\n days: \"%d days\",\n month: \"about a month\",\n months: \"%d months\",\n year: \"about a year\",\n years: \"%d years\",\n}\n\nconst template = (t: string, n: number): string => {\n return templates[t] && templates[t].replace(/%d/i, Math.abs(Math.round(n)).toString())\n}\n\nexport const timeSince = (now: Date, date: Date): string => {\n const seconds = (now.getTime() - date.getTime()) / 1000\n const minutes = seconds / 60\n const hours = minutes / 60\n const days = hours / 24\n const years = days / 365\n\n return (\n ((seconds < 45 && template(\"seconds\", seconds)) ||\n (seconds < 90 && template(\"minute\", 1)) ||\n (minutes < 45 && template(\"minutes\", minutes)) ||\n (minutes < 90 && template(\"hour\", 1)) ||\n (hours < 24 && template(\"hours\", hours)) ||\n (hours < 42 && template(\"day\", 1)) ||\n (days < 30 && template(\"days\", days)) ||\n (days < 45 && template(\"month\", 1)) ||\n (days < 365 && template(\"months\", days / 30)) ||\n (years < 1.5 && template(\"year\", 1)) ||\n template(\"years\", years)) + \" ago\"\n )\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 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.tenantAssetsURL}/images/${bkey}?size=${size}`\n }\n return `${Fider.settings.tenantAssetsURL}/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","import marked from \"marked\"\nimport DOMPurify from \"dompurify\"\n\nmarked.setOptions({\n headerIds: false,\n xhtml: true,\n smartLists: true,\n gfm: true,\n breaks: true,\n})\n\nif (DOMPurify.isSupported) {\n DOMPurify.setConfig({\n USE_PROFILES: {\n html: true,\n },\n ADD_ATTR: [\"target\"],\n })\n}\n\nconst link = (href: string, title: string, text: string) => {\n const titleAttr = title ? ` title=${title}` : \"\"\n return `${text}`\n}\n\nconst fullRenderer = new marked.Renderer()\nfullRenderer.image = () => \"\"\nfullRenderer.link = link\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 results = regex.exec(navigator.url())\n\n if (!results || !results[2]) {\n return \"\"\n }\n\n return decodeURIComponent(results[2].replace(/\\+/g, \" \"))\n}\n\nexport const getArray = (name: string): string[] => {\n const qs = get(name)\n if (qs) {\n return qs.split(\",\").filter((i) => i)\n }\n\n return []\n}\n\nexport interface QueryString {\n [key: string]: string | string[] | number | undefined\n}\n\nexport const stringify = (object: QueryString | undefined): string => {\n if (!object) {\n return \"\"\n }\n\n let qs = \"\"\n\n for (const key of Object.keys(object)) {\n const symbol = qs ? \"&\" : \"?\"\n const value = object[key]\n if (value instanceof Array) {\n if (value.length > 0) {\n qs += `${symbol}${key}=${value.join(\",\")}`\n }\n } else if (value) {\n qs += `${symbol}${key}=${encodeURIComponent(value.toString()).replace(/%20/g, \"+\")}`\n }\n }\n\n return qs\n}\n","export const isTouch = (): boolean => {\n return \"ontouchstart\" in window || navigator.maxTouchPoints > 0 || navigator.msMaxTouchPoints > 0\n}\n","import { http, Result } from \"@fider/services/http\"\nimport { UserSettings, UserAvatarType, ImageUpload } from \"@fider/models\"\n\ninterface UpdateUserSettings {\n name: string\n avatar?: ImageUpload\n avatarType: UserAvatarType\n settings: UserSettings\n}\n\nexport const updateUserSettings = async (request: UpdateUserSettings): Promise => {\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\n .post(`/api/v1/tags`, { name, color, isPublic })\n .then(http.event(\"tag\", \"create\"))\n}\n\nexport const updateTag = async (slug: string, name: string, color: string, isPublic: boolean): Promise> => {\n return http\n .put(`/api/v1/tags/${slug}`, { name, color, isPublic })\n .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 } 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 tags?: string[]\n}\n\nexport const searchPosts = async (params: SearchPostsParams): Promise> => {\n return await http.get(\n `/api/v1/posts${querystring.stringify({\n tags: params.tags,\n query: params.query,\n view: params.view,\n limit: params.limit,\n })}`\n )\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}/votes`).then(http.event(\"post\", \"vote\"))\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 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 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}\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\n .post(`/api/v1/posts`, { title, description, attachments })\n .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 } 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}\n\nexport const updateTenantSettings = async (request: UpdateTenantSettingsRequest): Promise => {\n return await http.post(\"/_api/admin/settings/general\", request)\n}\n\nexport const updateTenantAdvancedSettings = async (customCSS: string): Promise => {\n return await http.post(\"/_api/admin/settings/advanced\", { customCSS })\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 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 (key: string, name: string): Promise => {\n return await http.post(\"/_api/signin/complete\", {\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}\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\"\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 markAllAsRead = async (): Promise => {\n return await http.post(\"/_api/notifications/read-all\")\n}\n","import { http, Result } from \"@fider/services\"\n\nexport const sendInvites = async (subject: string, message: string, recipients: string[]): Promise => {\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 React from \"react\"\nimport ReactDOM from \"react-dom\"\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 ReactDOM.render(, document.getElementById(\"root-toastify\"))\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"],"sourceRoot":""}