{"version":3,"sources":["webpack:///./public/services/http.ts","webpack:///./public/services/cache.ts","webpack:///./public/services/analytics.ts","webpack:///./public/services/fider.ts","webpack:///./public/services/jwt.ts","webpack:///./public/services/utils.ts","webpack:///./public/services/markdown.ts","webpack:///./public/services/notify.ts","webpack:///./public/services/navigator.ts","webpack:///./public/services/querystring.ts","webpack:///./public/services/device.ts","webpack:///./public/services/actions/user.ts","webpack:///./public/services/actions/tag.ts","webpack:///./public/services/actions/post.ts","webpack:///./public/services/actions/tenant.ts","webpack:///./public/services/actions/billing.ts","webpack:///./public/services/actions/notification.ts","webpack:///./public/services/actions/invite.ts","webpack:///./public/services/actions/infra.ts","webpack:///./public/services/index.ts","webpack:///./public/components/ErrorBoundary.tsx","webpack:///./public/components/ShowPostResponse.tsx","webpack:///./public/components/SignInModal.tsx","webpack:///./public/components/VoteCounter.tsx","webpack:///./public/components/index.tsx","webpack:///./public/components/common/Button.tsx","webpack:///./public/components/common/CardInfo.tsx","webpack:///./public/components/common/form/Form.tsx","webpack:///./public/components/common/form/DisplayError.tsx","webpack:///./public/components/common/form/Input.tsx","webpack:///./public/components/common/form/ImageUploader.tsx","webpack:///./public/components/common/form/MultiImageUploader.tsx","webpack:///./public/components/common/form/TextArea.tsx","webpack:///./public/components/common/form/RadioButton.tsx","webpack:///./public/components/common/form/Select.tsx","webpack:///./public/components/common/form/Field.tsx","webpack:///./public/components/common/form/Checkbox.tsx","webpack:///./public/components/common/form/ImageViewer.tsx","webpack:///./public/components/common/MultiLineText.tsx","webpack:///./public/components/common/EnvironmentInfo.tsx","webpack:///./public/components/common/Message.tsx","webpack:///./public/components/common/TenantStatusInfo.tsx","webpack:///./public/components/common/Avatar.tsx","webpack:///./public/components/common/Hint.tsx","webpack:///./public/components/common/Footer.tsx","webpack:///./public/components/common/Header.tsx","webpack:///./public/components/common/Heading.tsx","webpack:///./public/components/common/Legal.tsx","webpack:///./public/components/common/SocialSignInButton.tsx","webpack:///./public/components/common/SignInControl.tsx","webpack:///./public/components/common/Segment.tsx","webpack:///./public/components/common/List.tsx","webpack:///./public/components/common/Moment.tsx","webpack:///./public/components/common/Modal.tsx","webpack:///./public/components/common/UserName.tsx","webpack:///./public/components/common/Loader.tsx","webpack:///./public/components/common/Logo.tsx","webpack:///./public/components/common/Toggle.tsx","webpack:///./public/components/common/FiderVersion.tsx","webpack:///./public/components/common/DropDown.tsx","webpack:///./public/components/common/index.tsx","webpack:///./public/models/index.ts","webpack:///./public/components/ShowTag.tsx","webpack:///./public/models/post.ts","webpack:///./public/models/identity.ts","webpack:///./public/models/settings.ts","webpack:///./public/services/toastify.tsx"],"names":["toResult","response","Promise","json","body","status","ok","data","error","errors","url","method","headers","fetch","JSON","stringify","credentials","truncatedBody","truncate","Error","http","get","post","put","delete","event","category","action","result","analytics","set","storage","key","value","setItem","window","localStorage","getItem","has","remove","keys","removeItem","cache","local","session","sessionStorage","eventCategory","eventAction","ga","err","exDescription","stack","exFatal","pProps","this","pContextID","contextID","props","pUser","user","pTenant","tenant","Fider","initialize","el","document","getElementById","parse","textContent","innerText","pSettings","settings","pSession","FiderSession","isBillingEnabled","stripePublicKey","isProduction","environment","isSingleHostMode","mode","FiderContext","jwt","decode","token","segments","split","atob","classSet","input","classes","trim","monthNames","currencySymbol","currencyCode","toLowerCase","twoDigits","toString","formatDate","format","date","Date","monthIndex","getMonth","year","getFullYear","substring","day","getDate","hours","getHours","minutes","getMinutes","templates","seconds","minute","hour","days","month","months","years","template","t","n","replace","Math","abs","round","timeSince","now","getTime","fileToBase64","file","resolve","reject","reader","FileReader","addEventListener","parts","readAsDataURL","isCookieEnabled","cookie","ret","indexOf","e","uploadedImageURL","bkey","size","tenantAssetsURL","maxLength","length","substr","setOptions","headerIds","xhtml","smartLists","gfm","breaks","setConfig","ADD_ATTR","href","title","text","simpleRenderer","Renderer","heading","level","raw","image","link","fullRenderer","entities","encodeHTML","s","tag","sanitize","full","renderer","simple","toastify","success","content","then","toast","userAgent","navigator","appVersion","location","isBrowserSupported","goHome","goTo","pathname","replaceState","path","history","newURL","baseURL","getCountryCode","countryCode","res","country","getNumber","name","parseInt","undefined","uri","re","RegExp","match","separator","results","exec","decodeURIComponent","getArray","qs","filter","i","object","Object","symbol","Array","join","encodeURIComponent","isTouch","maxTouchPoints","msMaxTouchPoints","updateUserSettings","request","changeUserEmail","email","deleteCurrentAccount","regenerateAPIKey","createTag","color","isPublic","updateTag","slug","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","isPrivate","checkAvailability","subdomain","signIn","completeProfile","changeUserRole","userID","role","blockUser","unblockUser","getOAuthConfig","provider","saveOAuthConfig","listBillingPlans","updatePaymentInfo","billingSubscribe","planID","cancelBillingSubscription","getTotalUnreadNotifications","total","markAllAsRead","sendInvites","subject","message","recipients","sendSampleInvite","ignoreErrors","logError","pattern","state","errorInfo","componentDidCatch","onError","setState","render","Consumer","fider","showDetails","children","Component","ShowPostStatus","className","Get","show","showUser","Duplicate","original","number","DuplicateDetails","style","StatusDetails","SignInModal","confirmationAddress","setConfirmationAddress","setTimeout","closeModal","onClose","onClick","useEmail","onEmailSent","Window","isOpen","Header","Content","hasVoted","setHasVoted","votesCount","setVotesCount","isSignInModalOpen","setIsSignInModalOpen","closed","vote","isAuthenticated","disabled","shouldEnable","preventEnable","canEnable","unmounted","click","preventDefault","stopPropagation","clicked","ButtonClickEvent","componentWillUnmount","fluid","rel","type","defaultProps","visa","diners","americanExpress","discover","jcb","unknown","masterCard","src","globalAssetsURL","brandImage","brand","alt","last4","expMonth","expYear","ValidationContext","createContext","autoComplete","Provider","arrayToTag","items","map","m","hasError","field","DisplayError","dict","reduce","push","fields","hasOwnProperty","forEach","Input","onChange","currentTarget","suffix","icon","createElement","onIconClick","ctx","label","htmlFor","afterLabel","id","tabIndex","noTabFocus","ref","inputRef","autoFocus","onFocus","placeholder","hardFileSizeLimit","fileChanged","target","files","alert","base64","upload","fileName","contentType","previewURL","instanceID","removeFile","fileSelector","selectFile","openModal","showModal","previewMaxWidth","modal","center","Footer","isUploading","hasFile","imgStyles","maxWidth","accept","imageUploaded","instances","removed","count","maxUploads","addNewElement","triggerOnChange","bkeys","uploads","k","concat","x","btoa","random","element","elements","TextArea","minRows","selected","onSelect","defaultOption","options","inputs","option","checked","bind","o","getOption","defaultValue","filtered","Field","Checkbox","setChecked","isChecked","loadedThumbnail","onThumbnailLoad","onPreviewLoad","loadedPreview","onLoad","MultiLineText","func","dangerouslySetInnerHTML","__html","EnvironmentInfo","compiler","version","buildTime","showIcon","TenantStatusInfo","Locked","avatarURL","cacheKey","permanentCloseKey","isClosed","setIsClosed","condition","hasLegal","unreadNotifications","setUnreadNotifications","isCollaborator","showRightMenu","dividing","iconClassName","circular","subtitle","TermsOfService","PrivacyPolicy","LegalNotice","LegalFooter","align","LegalAgreement","SocialSignInButton","redirectTo","logoURL","OAuthProviderLogo","displayName","setEmail","setError","providersLen","oauth","Fragment","Segments","divided","hover","ListItem","Moment","useRelative","diff","display","ModalWindow","root","overflow","keyDown","removeEventListener","keyCode","close","canClose","createPortal","evt","current","setShow","TenantLogoURL","logoBlobKey","TenantLogo","useFiderIfEmpty","systemProvidersLogo","google","facebook","github","OAuthProviderLogoURL","active","setActive","newActive","onToggle","readOnly","FiderVersion","mounted","handleMouseDown","button","addListeners","renderItem","item","isSelected","highlightSelected","onMouseDown","setSelected","handleDocumentClick","node","rootElementRef","contains","removeListeners","createRef","findItem","componentDidMount","newState","fireChangeEvent","buildItemList","header","search","onSearchChange","dropdownClass","inline","direction","onTouchEnd","renderControl","searchable","renderText","textColor","components","r","g","b","R","G","B","getRGB","ShowTag","backgroundColor","filterable","PostStatus","All","Open","Planned","Started","Completed","Declined","Deleted","TenantStatus","UserAvatarType","UserStatus","UserRole","Collaborator","Administrator","OAuthConfigStatus","Disabled","Enabled","hasContainer","setup","position","POSITION","TOP_RIGHT","toastClassName"],"mappings":"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","file":"js/common.b2f17a88558619f3d059.js","sourcesContent":["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 } else if (response.status === 423) {\n notify.error(\"This operation is not allowed. Update your billing settings to unlock it.\");\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 = [[\"Accept\", \"application/json\"], [\"Content-Type\", \"application/json\"]];\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?: {}): Promise> => {\n return await request(url, \"POST\", body);\n },\n put: async (url: string, body?: {}): Promise> => {\n return await request(url, \"PUT\", body);\n },\n delete: async (url: string, body?: {}): 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 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 = (): FiderImpl => {\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 isBillingEnabled(): boolean {\n return !!this.pSettings.stripePublicKey;\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 let 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 = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\"\n];\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}`;\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 > 1000) {\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\nDOMPurify.setConfig({\n ADD_ATTR: [\"target\"]\n});\n\nconst link = (href: string, title: string, text: string) => {\n const titleAttr = title ? ` title=${title}` : \"\";\n return `${text}`;\n};\n\nconst simpleRenderer = new marked.Renderer();\nsimpleRenderer.heading = (text, level, raw) => `

${raw}

`;\nsimpleRenderer.image = (href, title, text) => \"\";\nsimpleRenderer.link = link;\n\nconst fullRenderer = new marked.Renderer();\nfullRenderer.link = link;\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.sanitize(input);\n\nexport const full = (input: string): string => {\n return sanitize(marked(encodeHTML(input), { renderer: fullRenderer }).trim());\n};\n\nexport const simple = (input: string): string => {\n return sanitize(marked(encodeHTML(input), { renderer: simpleRenderer }).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, http } from \"@fider/services\";\nimport { cache } from \"./cache\";\n\nconst navigator = {\n userAgent: () => {\n return window.navigator.userAgent || window.navigator.appVersion;\n },\n url: () => {\n return window.location.href;\n },\n isBrowserSupported() {\n const ua = this.userAgent();\n const isIE = ua.indexOf(\"MSIE\") >= 0;\n if (isIE) {\n // On IE, the only supported version is IE 11\n return window.navigator.appVersion.indexOf(\"MSIE 11\") >= 0;\n }\n return true;\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) {\n const newURL = Fider.settings.baseURL + path;\n window.history.replaceState({ path: newURL }, \"\", newURL);\n }\n },\n getCountryCode: (): Promise => {\n const countryCode = cache.session.get(\"geolocation_countrycode\");\n if (countryCode) {\n return Promise.resolve(countryCode);\n }\n\n return http.get(\"https://ipinfo.io/geo\").then(res => {\n if (res.ok) {\n cache.session.set(\"geolocation_countrycode\", res.data.country);\n return res.data.country;\n }\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.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 } 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 (\n postNumber: number,\n content: string,\n attachments: ImageUpload[]\n): Promise => {\n return http\n .post(`/api/v1/posts/${postNumber}/comments`, { content, attachments })\n .then(http.event(\"comment\", \"create\"));\n};\n\nexport const updateComment = async (\n postNumber: number,\n commentID: number,\n content: string,\n attachments: ImageUpload[]\n): Promise => {\n return http\n .put(`/api/v1/posts/${postNumber}/comments/${commentID}`, { content, attachments })\n .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 (\n title: string,\n description: string,\n attachments: ImageUpload[]\n): Promise> => {\n return http\n .post(`/api/v1/posts`, { title, description, attachments })\n .then(http.event(\"post\", \"create\"));\n};\n\nexport const updatePost = async (\n postNumber: number,\n title: string,\n description: string,\n attachments: ImageUpload[]\n): Promise => {\n return http\n .put(`/api/v1/posts/${postNumber}`, { title, description, attachments })\n .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\";\nimport { BillingPlan } from \"@fider/models\";\n\ninterface UpdatePaymentInfoRequest {\n name: string;\n card?: {\n type: string;\n token: string;\n country: string;\n };\n addressLine1: string;\n addressLine2: string;\n addressCity: string;\n addressState: string;\n addressPostalCode: string;\n addressCountry: string;\n vatNumber: string;\n}\n\nexport const listBillingPlans = async (countryCode: string): Promise> => {\n return http.get(`/_api/admin/billing/plans/${countryCode}`);\n};\n\nexport const updatePaymentInfo = async (request: UpdatePaymentInfoRequest): Promise => {\n return http.post(\"/_api/admin/billing/paymentinfo\", request).then(http.event(\"billing\", \"updatepaymentinfo\"));\n};\n\nexport const billingSubscribe = async (planID: string): Promise => {\n return http.post(`/_api/admin/billing/subscription/${planID}`).then(http.event(\"billing\", \"billingsubscribe\"));\n};\n\nexport const cancelBillingSubscription = async (planID: string): Promise => {\n return http\n .delete(`/_api/admin/billing/subscription/${planID}`)\n .then(http.event(\"billing\", \"cancelbillingsubscription\"));\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 // tslint:disable-next-line:no-empty\n }\n};\n","export * from \"./http\";\nexport * from \"./cache\";\nexport * from \"./analytics\";\nexport * from \"./fider\";\nexport * from \"./jwt\";\nexport * from \"./utils\";\nimport * as markdown from \"./markdown\";\nimport * as notify from \"./notify\";\nimport * as querystring from \"./querystring\";\nimport * as device from \"./device\";\nimport * as actions from \"./actions\";\nimport navigator from \"./navigator\";\nexport { actions, querystring, navigator, device, notify, markdown };\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 (\n \n {fider => }\n \n );\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 => {\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
;\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\n signed in.\n

\n

\n \n OK\n \n

\n \n ) : (\n \n );\n\n return (\n \n Sign in to raise your voice\n {content}\n \n \n );\n};\n","import \"./VoteCounter.scss\";\n\nimport React, { useState } from \"react\";\nimport { Post, PostStatus } from \"@fider/models\";\nimport { actions, device, classSet } from \"@fider/services\";\nimport { SignInModal } from \"@fider/components\";\nimport { FaCaretUp } from \"react-icons/fa\";\nimport { useFider } from \"@fider/hooks\";\n\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 \"m-voted\": !status.closed && hasVoted,\n \"m-disabled\": status.closed,\n \"no-touch\": !device.isTouch()\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","export * from \"./ErrorBoundary\";\nexport * from \"./ShowPostResponse\";\nexport * from \"./ShowTag\";\nexport * from \"./SignInModal\";\nexport * from \"./VoteCounter\";\nexport * from \"./common\";\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: boolean = 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 React from \"react\";\nimport \"./CardInfo.scss\";\nimport { useFider } from \"@fider/hooks\";\n\nconst visa = require(\"@fider/assets/images/card-visa.svg\");\nconst diners = require(\"@fider/assets/images/card-diners.svg\");\nconst americanExpress = require(\"@fider/assets/images/card-americanexpress.svg\");\nconst discover = require(\"@fider/assets/images/card-discover.svg\");\nconst jcb = require(\"@fider/assets/images/card-jcb.svg\");\nconst unknown = require(\"@fider/assets/images/card-unknown.svg\");\nconst masterCard = require(\"@fider/assets/images/card-mastercard.svg\");\n\ninterface CardBrandProps {\n brand: string;\n last4: string;\n expMonth: number;\n expYear: number;\n}\n\nexport const CardInfo = (props: CardBrandProps) => {\n const fider = useFider();\n\n return (\n

\n {props.brand}\n \n **** **** **** {props.last4}{\" \"}\n \n Exp. {props.expMonth}/{props.expYear}\n \n \n

\n );\n};\n\nconst brandImage = (brand: string) => {\n switch (brand) {\n case \"Visa\":\n return visa;\n case \"American Express\":\n return americanExpress;\n case \"MasterCard\":\n return masterCard;\n case \"Discover\":\n return discover;\n case \"JCB\":\n return jcb;\n case \"Diners Club\":\n return diners;\n }\n return unknown;\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(\n (result, err) => {\n result[err.field || \"\"] = result[err.field || \"\"] || [];\n result[err.field || \"\"].push(err.message);\n return result;\n },\n {} as { [key: string]: string[] }\n );\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 (dict.hasOwnProperty(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 { 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 =\n 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 {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, ButtonClickEvent, 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 (e: ButtonClickEvent) => {\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 (e: ButtonClickEvent) => {\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 \n {this.props.bkey ? : }\n \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 {options}\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 } from \"@fider/services\";\n\ninterface MultiLineText {\n className?: string;\n text?: string;\n style: \"full\" | \"simple\";\n}\n\nexport const MultiLineText = (props: MultiLineText) => {\n if (!props.text) {\n return

    ;\n }\n\n const func = props.style === \"full\" ? markdown.full : markdown.simple;\n return (\n

    \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} |\n BuildTime: {fider.settings.buildTime || \"N/A\"} |\n {!fider.isSingleHostMode() && `TenantID: ${fider.session.tenant.id}`} |{\" \"}\n {fider.session.isAuthenticated && `UserID: ${fider.session.user.id}`}\n
    \n );\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 =\n props.type === \"error\" ? : props.type === \"warning\" ? : ;\n\n return (\n

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

    \n );\n};\n","import React from \"react\";\nimport { TenantStatus } from \"@fider/models\";\nimport { Message } from \"./Message\";\nimport { useFider } from \"@fider/hooks\";\n\nexport const TenantStatusInfo = () => {\n const fider = useFider();\n\n if (!fider.isBillingEnabled() || fider.session.tenant.status !== TenantStatus.Locked) {\n return null;\n }\n\n return (\n
    \n \n This site is locked due to lack of a subscription. Visit the Billing settings to\n update it.\n \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 ;\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","import \"./Footer.scss\";\n\nimport React from \"react\";\nimport { PrivacyPolicy, TermsOfService } from \"@fider/components\";\nimport { useFider } from \"@fider/hooks\";\n\nexport const Footer = () => {\n const fider = useFider();\n\n return (\n
    \n
    \n {fider.settings.hasLegal && (\n
    \n \n ·\n \n
    \n )}\n \n \"Fider\"\n Powered by Fider\n \n
    \n
    \n );\n};\n","import \"./Header.scss\";\n\nimport React, { useState, useEffect } from \"react\";\nimport { SignInModal, EnvironmentInfo, Avatar, TenantLogo, TenantStatusInfo } from \"@fider/components\";\nimport { actions } from \"@fider/services\";\nimport { FaUser, FaCog, FaCaretDown } from \"react-icons/fa\";\nimport { useFider } from \"@fider/hooks\";\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 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 {fider.session.tenant.name}\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};\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 || 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 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 e-mail address to receive a temporary access link

    \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 useRelative?: boolean;\n format?: \"full\" | \"short\";\n}\n\nexport const Moment = (props: MomentText) => {\n if (!props.date) {\n return ;\n }\n\n const format = props.format || \"full\";\n const useRelative = typeof props.useRelative !== \"undefined\" ? props.useRelative : true;\n\n const now = new Date();\n const date = props.date instanceof Date ? props.date : new Date(props.date);\n\n const diff = (now.getTime() - date.getTime()) / (60 * 60 * 24 * 1000);\n const display = !useRelative || diff >= 365 ? formatDate(props.date, format) : timeSince(now, date);\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.StatelessComponent = 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) {\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\nexport const Modal = {\n Window: ModalWindow,\n Header: (props: { children: React.ReactNode }) => {\n return
    {props.children}
    ;\n },\n Content: (props: { children: React.ReactNode }) => {\n return
    {props.children}
    ;\n },\n 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};\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 className = classSet({\n \"c-username\": true,\n \"m-staff\": props.user.role && isCollaborator(props.user.role)\n });\n\n return {props.user.name || \"Anonymous\"};\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 {!fider.isBillingEnabled() && (\n <>\n Support our{\" \"}\n \n OpenCollective\n \n
    \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: Array;\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: Array): 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
    \n {items.length ? items :
    No results found
    }\n
    \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 ? (\n this.state.selected.label\n ) : (\n {this.props.placeholder}\n );\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 ? (\n search\n ) : this.props.renderText ? (\n this.props.renderText(this.state.selected)\n ) : (\n
    {text}
    \n )}\n \n
    \n )}\n
    \n {this.state.isOpen && this.buildItemList()}\n
    \n );\n }\n}\n","export * from \"./Button\";\nexport * from \"./CardInfo\";\nexport * from \"./form/Form\";\nexport * from \"./form/Input\";\nexport * from \"./form/ImageUploader\";\nexport * from \"./form/MultiImageUploader\";\nexport * from \"./form/TextArea\";\nexport * from \"./form/RadioButton\";\nexport * from \"./form/DisplayError\";\nexport * from \"./form/Select\";\nexport * from \"./form/Field\";\nexport * from \"./form/Checkbox\";\nexport * from \"./form/ImageViewer\";\nexport * from \"./MultiLineText\";\nexport * from \"./EnvironmentInfo\";\nexport * from \"./TenantStatusInfo\";\nexport * from \"./Avatar\";\nexport * from \"./Message\";\nexport * from \"./Hint\";\nexport * from \"./Footer\";\nexport * from \"./Header\";\nexport * from \"./Heading\";\nexport * from \"./Legal\";\nexport * from \"./SocialSignInButton\";\nexport * from \"./SignInControl\";\nexport * from \"./Segment\";\nexport * from \"./List\";\nexport * from \"./Moment\";\nexport * from \"./Modal\";\nexport * from \"./UserName\";\nexport * from \"./Loader\";\nexport * from \"./Logo\";\nexport * from \"./Toggle\";\nexport * from \"./FiderVersion\";\nexport * from \"./DropDown\";\n\nimport Textarea from \"react-textarea-autosize\";\nexport { Textarea };\n","export * from \"./post\";\nexport * from \"./identity\";\nexport * from \"./billing\";\nexport * from \"./settings\";\nexport * from \"./notification\";\n","import \"./ShowTag.scss\";\n\nimport React from \"react\";\nimport { Tag } from \"@fider/models\";\nimport { classSet } from \"@fider/services\";\nimport { FaLock } from \"react-icons/fa\";\n\ninterface TagProps {\n tag: Tag;\n size?: \"mini\" | \"tiny\" | \"small\" | \"normal\";\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-${props.size || \"normal\"}`]: true,\n \"m-circular\": props.circular === true\n });\n\n return (\n \n {!props.tag.isPublic && !props.circular && }\n {props.circular ? \"\" : props.tag.name || \"Tag\"}\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(\n public title: string,\n public value: string,\n public show: boolean,\n public closed: boolean,\n public filterable: boolean\n ) {}\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 = [\n PostStatus.Open,\n PostStatus.Planned,\n PostStatus.Started,\n PostStatus.Completed,\n PostStatus.Duplicate,\n PostStatus.Declined\n ];\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 billing?: {\n stripePlanID: string;\n subscriptionEndsAt: string;\n trialEndsAt: string;\n };\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 stripePublicKey?: 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 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(\n ,\n document.getElementById(\"root-toastify\")\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"],"sourceRoot":""}