{ "version": 3, "sources": ["../../card/link_card.tsx", "../../../../node_modules/p-limit/node_modules/yocto-queue/index.js", "../../../../node_modules/p-limit/index.js", "../../state/update_board_queue.ts"], "sourcesContent": ["import * as React from \"react\"\nimport {observer} from \"mobx-react\"\nimport {\n BlobUID,\n BoardInfo,\n CardColor,\n derive_URLUID,\n EngagementType,\n extract_linked_board_and_card_uid,\n ImageCardDisplayKind,\n is_BlobUID,\n LinkCard as LinkCardModel,\n LinkStyleImage,\n} from \"@cling/lib.shared.model\"\nimport {extract_domain, not_null} from \"@cling/lib.shared.utils\"\nimport {ui_actions, ui_state} from \"../state/index\"\nimport {decorate_emojis} from \"@cling/lib.web.utils/decorate_emojis\"\nimport {board_info_resource, url_info_resource} from \"@cling/lib.web.resources\"\nimport {classNames} from \"@cling/lib.web.utils\"\nimport {ImageCard} from \"./image_card\"\nimport {Lightbox} from \"./lightbox\"\nimport {\n CondensedThumbnail,\n CondensedThumbnailLoading,\n CondensedThumbnailNoImage,\n} from \"./condensed_thumbnail\"\nimport {goto_board, is_cling_hp} from \"../utils\"\nimport {video_player_state, is_playable_media} from \"./video_player\"\nimport {cancel_event} from \"@cling/lib.web.utils\"\nimport {title_tag} from \"./utils\"\nimport {report_user_engagement} from \"@cling/lib.web.analytics\"\nimport {open_intercom} from \"../misc/intercom\"\nimport {schedule_update_board} from \"../state/update_board_queue\"\nimport {board_name} from \"../board/board_name\"\nimport {report_error} from \"@cling/lib.shared.debug\"\nimport {board_background_style} from \"../board/board_chooser_props\"\n\ninterface Props {\n card: LinkCardModel\n}\n/**\n * This is just a very broad heuristic erring on the side of lower height.\n */\nexport function LinkCard_estimated_height(card: LinkCardModel) {\n if (card.link.style.display.kind === ImageCardDisplayKind.cinema) {\n return 210\n }\n return 60\n}\n\nexport const LinkCard = observer(({card}: Props) => {\n let on_click = React.useCallback(\n (e: React.MouseEvent<any>) => {\n e.stopPropagation()\n if (\n process.env.F_PUBLIC &&\n card.link.url.match(/https:\\/\\/cling\\.com\\/[^/]+\\/chat\\.html/)\n ) {\n // Yeah, this is a bit hacky, but what gives.\n e.preventDefault()\n open_intercom(\"new_message\")\n } else {\n report_user_engagement(EngagementType.click_link)\n if (process.env.F_PUBLIC) {\n return\n }\n const linked_board = extract_linked_board_and_card_uid(card.link.url)\n if (linked_board) {\n e.preventDefault()\n goto_board({\n board_uid: linked_board.board_uid,\n highlight_card_uid: linked_board.card_uid,\n }).catch(report_error)\n }\n }\n },\n [card],\n )\n let on_click_on_image = React.useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n e.stopPropagation()\n if (extract_linked_board_and_card_uid(card.link.url)) {\n // For now, nothing happens if you click on a board image.\n e.preventDefault()\n return\n }\n if (is_playable_media(card)) {\n e.preventDefault()\n video_player_state.play({url: card.link.url})\n return\n }\n if (card.link?.style.display.kind === ImageCardDisplayKind.banner) {\n report_user_engagement(EngagementType.click_link)\n return\n }\n e.preventDefault()\n ui_actions.open_lightbox(card)\n },\n [card],\n )\n const {link} = card\n const {url: plain_url} = link\n let {title: plain_title} = link\n const url_info = url_info_resource.read(derive_URLUID(link.url))\n const linked_board_uid = extract_linked_board_and_card_uid(plain_url)?.board_uid\n let featured_blob_uid = url_info?.featured_image_blob?.uid\n const logo_blob_uid = url_info?.logo_image_blob?.uid\n const screenshot_blob_uid = url_info?.screenshot_image_blob?.uid\n let image_style: React.CSSProperties | undefined\n if (!process.env.F_PUBLIC && linked_board_uid) {\n const board_info = board_info_resource.read(linked_board_uid)\n if (board_info) {\n if (!plain_title || plain_title === \"Cling Board\") {\n // Just a bit of convenience of the card title is not set or it is the default name\n // we used to use.\n plain_title = board_name(board_info)\n }\n const x = blob_uids_and_style_of_linked_board(board_info)\n featured_blob_uid = x.featured_blob_uid\n if (!link.style.image_blob && link.style.image !== LinkStyleImage.logo) {\n image_style = x.background_style\n }\n }\n }\n const domain = extract_domain(plain_url) || plain_url\n const matches = ui_state.search_state.search_matches(card)\n const title_html = ui_state.search_state.highlight_match(card, \"title\", matches, plain_title)\n const url_matches = matches.some((x) => x.text_matches.some((y) => y.field === \"url\"))\n const TitleTag = title_tag(card)\n const render_title = (className: string) => (\n <TitleTag\n className={className}\n data-test-id=\"LinkCard_title\"\n dangerouslySetInnerHTML={{__html: decorate_emojis(title_html)}}\n />\n )\n const render_domain = (className: string) => (\n <div className={className} data-test-id=\"LinkCard_domain\">\n {/* We have a match inside the URL (which is not visible to the */}\n {/* user), so we highlight the domain-part instead.*/}\n {url_matches && ui_state.search_state.highlight_all(domain)}\n {!url_matches && domain}\n </div>\n )\n if (!plain_title && url_info?.scrape_info?.title && !linked_board_uid) {\n // We have a link w/o a title but we also have a URLInfo with a title.\n // Let's update the board.\n schedule_update_board(card.board_uid)\n }\n const playable_media = is_playable_media(card)\n const style = link.style\n const lightbox_shown = ui_state.lightbox_shown(card)\n const blob_uid = (() => {\n if (image_style) {\n return undefined\n }\n if (style.image_blob) {\n return style.image_blob.uid\n }\n if (style.image === LinkStyleImage.logo && logo_blob_uid) {\n return logo_blob_uid\n }\n if (style.image === LinkStyleImage.screenshot && screenshot_blob_uid) {\n return screenshot_blob_uid\n }\n return featured_blob_uid || logo_blob_uid || screenshot_blob_uid\n })()\n if (is_cling_hp()) {\n // We always want to play media inline (and never open the URL) and we never want to open\n // the lightbox.\n if (playable_media) {\n on_click = on_click_on_image\n } else {\n on_click_on_image = on_click\n }\n }\n if (\n (style.display.kind === ImageCardDisplayKind.banner ||\n style.display.kind === ImageCardDisplayKind.cinema) &&\n (blob_uid || image_style)\n ) {\n const is_color = card.color !== CardColor.no_color\n return (\n <div\n className={classNames(\"card-details link-card link-card__mode\", {\n \"link-card__mode-image--banner\":\n style.display.kind === ImageCardDisplayKind.banner,\n \"link-card__mode-image--cinema\":\n style.display.kind === ImageCardDisplayKind.cinema,\n })}\n >\n <LinkCardAnchor\n card={card}\n onClick={on_click}\n target={process.env.F_PUBLIC || linked_board_uid ? undefined : \"_blank\"}\n >\n <ImageCard\n card={card}\n blob_uid_or_style={not_null(blob_uid || image_style)}\n key=\"image\"\n playable_media={playable_media}\n display={style.display}\n className={classNames(\"link-card__mode-image\", {\n \"link-card__mode-image--banner\":\n style.display.kind === ImageCardDisplayKind.banner,\n \"link-card__mode-image--cinema\":\n style.display.kind === ImageCardDisplayKind.cinema,\n \"link-card__mode-image--with-color\": is_color,\n })}\n title={\n <div onClick={on_click}>\n {plain_title ? render_title(\"link-card__mode-title\") : plain_url}\n </div>\n }\n title_display={\n style.display.kind === ImageCardDisplayKind.banner ? \"banner\" : \"cinema\"\n }\n onClick={on_click_on_image}\n />\n {render_domain(\"link-card__mode-domain\")}\n </LinkCardAnchor>\n {lightbox_shown && <Lightbox initial_card={card} />}\n </div>\n )\n }\n return (\n <>\n <LinkCardAnchor\n card={card}\n onClick={on_click}\n className=\"card-details card-with-icon link-card\"\n target={process.env.F_PUBLIC || linked_board_uid ? undefined : \"_blank\"}\n >\n <div className=\"card-with-icon__icon-outline\">\n <LinkThumbnail\n blob_uid_or_style={blob_uid || image_style}\n is_loading={!url_info && !linked_board_uid && !blob_uid}\n is_playable={playable_media}\n className=\"card-with-icon__icon\"\n onClick={on_click_on_image}\n />\n </div>\n <div className=\"card-with-icon__content link-card__content\">\n {render_title(\n \"card-with-icon__title link-card__content-title test_LinkCard_link\",\n )}\n {render_domain(\"card-with-icon__caption\")}\n </div>\n </LinkCardAnchor>\n {lightbox_shown && <Lightbox initial_card={card} />}\n </>\n )\n})\n\nexport const LinkCardAnchor = observer(\n ({\n card,\n onClick,\n children,\n target,\n className,\n }: {\n card: LinkCardModel\n onClick: React.MouseEventHandler<any>\n target: \"_blank\" | undefined\n children: any\n className?: string\n }) => {\n return (\n <a\n href={card.link.url}\n className={className}\n rel={\"noopener\" /* ... SEC: see https://bit.ly/2x5jXjn */}\n target={target}\n onClick={onClick}\n draggable={false}\n >\n {children}\n </a>\n )\n },\n)\n\nexport const LinkThumbnail = observer(\n ({\n blob_uid_or_style,\n className,\n onClick,\n is_playable,\n is_loading,\n }: {\n blob_uid_or_style: BlobUID | React.CSSProperties | undefined\n className?: string\n is_playable: boolean\n is_loading: boolean\n onClick?: React.MouseEventHandler<HTMLElement>\n }) => {\n const image_style = is_BlobUID(blob_uid_or_style) ? undefined : blob_uid_or_style\n if (is_loading) {\n return (\n <CondensedThumbnailLoading\n playable_media={is_playable}\n className={className}\n image_style={image_style}\n onClick={is_playable ? onClick : cancel_event}\n />\n )\n }\n if (!blob_uid_or_style) {\n return (\n <CondensedThumbnailNoImage\n playable_media={is_playable}\n className={className}\n image_style={image_style}\n onClick={is_playable ? onClick : cancel_event}\n />\n )\n }\n return (\n <CondensedThumbnail\n blob_uid_or_style={blob_uid_or_style}\n className={className}\n playable_media={is_playable}\n onClick={onClick}\n />\n )\n },\n)\n\nexport function blob_uids_and_style_of_linked_board(\n board_info: BoardInfo,\n):\n | {featured_blob_uid: BlobUID; background_style?: never}\n | {featured_blob_uid?: never; background_style: React.CSSProperties} {\n if (board_info.board_style.background_image_blob) {\n return {featured_blob_uid: board_info.board_style.background_image_blob.uid}\n } else {\n return {background_style: board_background_style(board_info)}\n }\n}\n", "/*\nHow it works:\n`this.#head` is an instance of `Node` which keeps track of its current value and nests another instance of `Node` that keeps the value that comes after it. When a value is provided to `.enqueue()`, the code needs to iterate through `this.#head`, going deeper and deeper to find the last value. However, iterating through every single item is slow. This problem is solved by saving a reference to the last value as `this.#tail` so that it can reference it to add a new value.\n*/\n\nclass Node {\n\tvalue;\n\tnext;\n\n\tconstructor(value) {\n\t\tthis.value = value;\n\t}\n}\n\nexport default class Queue {\n\t#head;\n\t#tail;\n\t#size;\n\n\tconstructor() {\n\t\tthis.clear();\n\t}\n\n\tenqueue(value) {\n\t\tconst node = new Node(value);\n\n\t\tif (this.#head) {\n\t\t\tthis.#tail.next = node;\n\t\t\tthis.#tail = node;\n\t\t} else {\n\t\t\tthis.#head = node;\n\t\t\tthis.#tail = node;\n\t\t}\n\n\t\tthis.#size++;\n\t}\n\n\tdequeue() {\n\t\tconst current = this.#head;\n\t\tif (!current) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#head = this.#head.next;\n\t\tthis.#size--;\n\t\treturn current.value;\n\t}\n\n\tclear() {\n\t\tthis.#head = undefined;\n\t\tthis.#tail = undefined;\n\t\tthis.#size = 0;\n\t}\n\n\tget size() {\n\t\treturn this.#size;\n\t}\n\n\t* [Symbol.iterator]() {\n\t\tlet current = this.#head;\n\n\t\twhile (current) {\n\t\t\tyield current.value;\n\t\t\tcurrent = current.next;\n\t\t}\n\t}\n}\n", "import Queue from 'yocto-queue';\n\nexport default function pLimit(concurrency) {\n\tif (!((Number.isInteger(concurrency) || concurrency === Number.POSITIVE_INFINITY) && concurrency > 0)) {\n\t\tthrow new TypeError('Expected `concurrency` to be a number from 1 and up');\n\t}\n\n\tconst queue = new Queue();\n\tlet activeCount = 0;\n\n\tconst next = () => {\n\t\tactiveCount--;\n\n\t\tif (queue.size > 0) {\n\t\t\tqueue.dequeue()();\n\t\t}\n\t};\n\n\tconst run = async (fn, resolve, args) => {\n\t\tactiveCount++;\n\n\t\tconst result = (async () => fn(...args))();\n\n\t\tresolve(result);\n\n\t\ttry {\n\t\t\tawait result;\n\t\t} catch {}\n\n\t\tnext();\n\t};\n\n\tconst enqueue = (fn, resolve, args) => {\n\t\tqueue.enqueue(run.bind(undefined, fn, resolve, args));\n\n\t\t(async () => {\n\t\t\t// This function needs to wait until the next microtask before comparing\n\t\t\t// `activeCount` to `concurrency`, because `activeCount` is updated asynchronously\n\t\t\t// when the run function is dequeued and called. The comparison in the if-statement\n\t\t\t// needs to happen asynchronously as well to get an up-to-date value for `activeCount`.\n\t\t\tawait Promise.resolve();\n\n\t\t\tif (activeCount < concurrency && queue.size > 0) {\n\t\t\t\tqueue.dequeue()();\n\t\t\t}\n\t\t})();\n\t};\n\n\tconst generator = (fn, ...args) => new Promise(resolve => {\n\t\tenqueue(fn, resolve, args);\n\t});\n\n\tObject.defineProperties(generator, {\n\t\tactiveCount: {\n\t\t\tget: () => activeCount,\n\t\t},\n\t\tpendingCount: {\n\t\t\tget: () => queue.size,\n\t\t},\n\t\tclearQueue: {\n\t\t\tvalue: () => {\n\t\t\t\tqueue.clear();\n\t\t\t},\n\t\t},\n\t});\n\n\treturn generator;\n}\n", "import {BoardUID, UpdateBoardRequest} from \"@cling/lib.shared.model\"\nimport {report_error} from \"@cling/lib.shared.debug\"\nimport p_limit from \"p-limit\"\nimport {call_function} from \"@cling/lib.shared.faas\"\nimport {can_call_faas} from \"@cling/lib.web.auth\"\n\nconst queue = p_limit(1)\nconst outstanding = new Set<BoardUID>()\n\nexport function schedule_update_board(board_uid: BoardUID) {\n if (outstanding.has(board_uid) || !can_call_faas()) {\n return\n }\n outstanding.add(board_uid)\n queue(() => {\n outstanding.delete(board_uid)\n call_function(new UpdateBoardRequest({board_uid})).catch(report_error)\n }).catch(report_error)\n}\n"], "mappings": "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", "names": ["init_compat_module", "_Node", "value", "__publicField", "__name", "Node", "_head", "_tail", "_size", "_Queue", "__privateAdd", "node", "__privateGet", "__privateSet", "__privateWrapper", "current", "Queue", "pLimit", "concurrency", "queue", "Queue", "activeCount", "next", "__name", "run", "fn", "resolve", "args", "result", "enqueue", "generator", "queue", "pLimit", "outstanding", "schedule_update_board", "board_uid", "can_call_faas", "call_function", "UpdateBoardRequest", "report_error", "__name", "LinkCard_estimated_height", "card", "__name", "LinkCard", "observer", "on_click", "q", "e", "report_user_engagement", "linked_board", "extract_linked_board_and_card_uid", "goto_board", "report_error", "on_click_on_image", "is_playable_media", "video_player_state", "ui_actions", "link", "plain_url", "plain_title", "url_info", "url_info_resource", "derive_URLUID", "linked_board_uid", "featured_blob_uid", "logo_blob_uid", "screenshot_blob_uid", "image_style", "board_info", "board_info_resource", "board_name", "x", "blob_uids_and_style_of_linked_board", "domain", "extract_domain", "matches", "ui_state", "title_html", "url_matches", "y", "TitleTag", "title_tag", "render_title", "className", "_", "decorate_emojis", "render_domain", "schedule_update_board", "playable_media", "style", "lightbox_shown", "blob_uid", "is_cling_hp", "is_color", "classNames", "LinkCardAnchor", "ImageCard", "not_null", "Lightbox", "k", "LinkThumbnail", "onClick", "children", "target", "blob_uid_or_style", "is_playable", "is_loading", "is_BlobUID", "CondensedThumbnailLoading", "cancel_event", "CondensedThumbnail", "CondensedThumbnailNoImage", "board_background_style"] }