Mini Kabibi Habibi
{"version":3,"file":"1440.js","mappings":"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","sources":["webpack://UniversalAssetBrowser/../src/constants.ts","webpack://UniversalAssetBrowser/../src/contexts/ProjectContext.ts","webpack://UniversalAssetBrowser/../src/components/Collaborators/CollaboratorPopoverContent.tsx","webpack://UniversalAssetBrowser/../src/components/Collaborators/UserIconAndCount.tsx","webpack://UniversalAssetBrowser/../src/components/LoadingPlaceholder/index.tsx","webpack://UniversalAssetBrowser/../src/components/FacePile/index.tsx","webpack://UniversalAssetBrowser/../src/models/collaborators.ts","webpack://UniversalAssetBrowser/../src/components/Collaborators/index.tsx","webpack://UniversalAssetBrowser/../src/components/ProjectInviteDialog/index.tsx","webpack://UniversalAssetBrowser/../src/config/index.ts","webpack://UniversalAssetBrowser/../src/api/floodgate-service/floodgateFetch.ts","webpack://UniversalAssetBrowser/../src/components/withProviders/featureFlags.tsx","webpack://UniversalAssetBrowser/../src/components/withProviders/index.tsx","webpack://UniversalAssetBrowser/../src/hooks/useSpectrumPreloader.ts","webpack://UniversalAssetBrowser/../src/components/ProjectList/EmptyState/EmptyProjectIllustrationSpectrum.tsx","webpack://UniversalAssetBrowser/../src/components/IllustratedMessage/index.tsx","webpack://UniversalAssetBrowser/../src/components/ProjectList/OfflineState/OfflineIllustration.tsx","webpack://UniversalAssetBrowser/../src/components/ProjectList/OfflineState/index.tsx","webpack://UniversalAssetBrowser/../src/components/Dialog/Header/index.tsx","webpack://UniversalAssetBrowser/../../node_modules/@ccx-public/spectrum-wrapper/src/Badge.tsx","webpack://UniversalAssetBrowser/../src/components/ActionMenu/index.tsx","webpack://UniversalAssetBrowser/../src/components/ProjectActionMenu/index.tsx","webpack://UniversalAssetBrowser/../src/components/ProjectInviteButton/index.tsx","webpack://UniversalAssetBrowser/../ui/dist/assets/6ccb8644-Heading.module.css?ef3e","webpack://UniversalAssetBrowser/../../../src/Heading/Heading.tsx","webpack://UniversalAssetBrowser/../../../src/ResponsiveVisibilityWrapper/ResponsiveVisibilityWrapper.tsx","webpack://UniversalAssetBrowser/../ui/dist/assets/21144917-ResponsiveVisibilityWrapper.module.css?7159","webpack://UniversalAssetBrowser/../../src/components/ProjectContents/ErrorState/NotFoundIllustration.tsx","webpack://UniversalAssetBrowser/../../src/components/ProjectContents/ErrorState/RequestAccessIllustration.tsx","webpack://UniversalAssetBrowser/../../src/components/ProjectContents/ErrorState/index.tsx","webpack://UniversalAssetBrowser/../../src/utils/expressLinks.ts","webpack://UniversalAssetBrowser/../../src/components/LibrariesDropdown/index.tsx","webpack://UniversalAssetBrowser/../../src/components/ProjectContents/filter.tsx","webpack://UniversalAssetBrowser/../../src/components/ProjectContents/Header/index.tsx","webpack://UniversalAssetBrowser/../../src/components/ProjectContents/ShowAllFilesButton.tsx","webpack://UniversalAssetBrowser/../../src/components/LinkedBrands/index.tsx","webpack://UniversalAssetBrowser/../../src/components/ProjectContents/index.tsx","webpack://UniversalAssetBrowser/../../src/components/ProjectContents/useProjectContentActions.tsx","webpack://UniversalAssetBrowser/../../src/ProjectContents.tsx","webpack://UniversalAssetBrowser/../src/hooks/useAnalytics.ts","webpack://UniversalAssetBrowser/../src/utils/getEventName.ts","webpack://UniversalAssetBrowser/../src/components/withProviders/useFeatureFlagValue.ts","webpack://UniversalAssetBrowser/../src/actions/copyLink.tsx","webpack://UniversalAssetBrowser/../src/components/Dialog/Content/index.tsx","webpack://UniversalAssetBrowser/../src/components/Dialog/Footer/index.tsx","webpack://UniversalAssetBrowser/../src/components/ProjectDiscardDialog/index.tsx","webpack://UniversalAssetBrowser/../src/actions/discard.tsx","webpack://UniversalAssetBrowser/../src/actions/invite.tsx","webpack://UniversalAssetBrowser/../src/components/ProjectLeaveDialog/index.tsx","webpack://UniversalAssetBrowser/../src/actions/leave.tsx","webpack://UniversalAssetBrowser/../src/actions/rename.tsx","webpack://UniversalAssetBrowser/../src/actions/workfrontOpen.tsx","webpack://UniversalAssetBrowser/../src/hooks/useProjectActions.ts","webpack://UniversalAssetBrowser/../src/hooks/useHostExtendedConfig.ts","webpack://UniversalAssetBrowser/../src/hooks/useRefreshListOnResume.ts","webpack://UniversalAssetBrowser/../src/components/ShareBaseDialog/types.ts","webpack://UniversalAssetBrowser/../src/utils/getPlatform.ts","webpack://UniversalAssetBrowser/../src/components/ShareBaseDialog/index.tsx","webpack://UniversalAssetBrowser/../src/hooks/useShareSheetPropertiesAndCallbacks.ts","webpack://UniversalAssetBrowser/../src/hooks/useShareSheetLoader.ts"],"sourcesContent":["/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nexport const PROJECT_NAME_MAX_LENGTH = 200;\n\nexport const DUMMY_PROJECT_EMAIL_NOTIFICATION = {\n sharing: {\n viewer: 'dummy_template',\n editor: 'dummy_template',\n },\n acceptance: {\n viewer: 'dummy_template',\n editor: 'dummy_template',\n },\n};\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport type { SAM } from '@ccx-public/component-types';\nimport { createContext } from 'react';\n\nexport default createContext<SAM.Project | undefined>(undefined);\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { SAM } from '@ccx-public/component-types';\nimport Rule from '@ccx-public/spectrum-wrapper/dist/Rule';\nimport { useHostConfig, useTheme } from '@csc/common';\nimport classNames from 'classnames';\nimport { observer } from 'mobx-react';\nimport type { ReactElement } from 'react';\nimport React, { useContext } from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport styles from './styles.module.css';\nimport ProjectContext from '../../contexts/ProjectContext';\nimport type { RenderedCollaborator } from '../../models/collaborators';\n\nfunction NoCollaborators() {\n return (\n <div data-testid=\"no-collaborators-popover-body\" className={styles.emptyStateMessage}>\n <FormattedMessage\n id=\"@ace/projects:projects.collaborators.tooltip.emptyState\"\n defaultMessage=\"You are the only person with access to this project.\"\n />\n </div>\n );\n}\n\nexport const SharedWithSection = observer(\n ({ collaborators, limit }: { collaborators: RenderedCollaborator[]; limit: number }) => {\n const { themeIsExpress } = useTheme();\n const people = collaborators.slice(0, limit);\n return (\n <div data-testid=\"shared-with-section\">\n <span className={styles.headerText}>\n {themeIsExpress ? (\n <FormattedMessage\n id=\"@ace/projects:projects.column.sharedWith.express\"\n defaultMessage=\"Members\"\n />\n ) : (\n <FormattedMessage\n id=\"@ace/projects:projects.column.sharedWith\"\n defaultMessage=\"Shared with\"\n />\n )}\n </span>\n {people.map(({ name, email, collaboratorID }, i) => (\n <div key={i} className={styles.sharedWithCollaboratorName}>\n <CollaboratorName name={name} email={email} id={collaboratorID} />\n </div>\n ))}\n {collaborators.length > limit && (\n <span>\n <FormattedMessage\n id=\"@ace/projects:projects.collaborators.tooltip.more\"\n defaultMessage=\"+ {count, number} more\"\n values={{\n count: collaborators.length - limit,\n }}\n />\n </span>\n )}\n </div>\n );\n },\n);\n\nfunction You() {\n return (\n <span data-testid=\"collaborator-popover-is-you\" className={styles.you}>\n <FormattedMessage\n id=\"@ace/projects:projects.collaborators.tooltip.owner.you\"\n defaultMessage=\"(You)\"\n />\n </span>\n );\n}\n\nfunction CollaboratorName({ name, email, id }: { name?: string; email?: string; id?: string }) {\n const { userId } = useHostConfig();\n return (\n <div className={styles.collaboratorName}>\n <span className={styles.ellipsis}>{name ?? email ?? ''}</span>\n {id === userId && <You />}\n </div>\n );\n}\n\ninterface Props {\n // Array of direct collaborators, including the owner\n collaborators: RenderedCollaborator[];\n // Max collaborators shown in the 'Shared with' section, excluding the owner\n limit?: number;\n}\n\nexport function CreatorName() {\n const project = useContext(ProjectContext);\n return <CollaboratorName name={project?.creator?.displayName} id={project?.creator?.id} />;\n}\n\nfunction getProjectOwnerCollaborator(\n project: SAM.Project | undefined,\n): SAM.Collaborator | undefined {\n if (!project) {\n return undefined;\n }\n\n // This is a workaround for project owner tooltip as seen by org commenter, when project owner is the org\n // When project is shared via ShareSheet permission \"Everyone in [org] can comment\", USS does not supply displayName for storageAssignee\n // Since only projects owned by id=\"orgEverybody\" are affected, we can use the predefinedPrincipal in collaborators list (if cached) as a workaround for finding project owner name\n if (!project.hasPermission(SAM.Permission.Write)) {\n const orgEverybody = project.collaboratorArray.find(\n ({ id, type }: SAM.Collaborator) =>\n type === 'predefinedPrincipal' && id === 'orgEverybody',\n );\n\n if (orgEverybody) {\n return orgEverybody;\n }\n }\n\n return project.collaboratorArray.find((c) => c.id === project.storageAssignee.id);\n}\n\nexport default observer(function CollaboratorPopoverContent({ collaborators, limit = 10 }: Props) {\n const project = useContext(ProjectContext);\n const { themeIsExpress } = useTheme();\n\n // NOTE: this logic covers an edge case where none of these fields are available, but the project.repositoryOwner includes the displayName\n // the specific scenario this handles is when the storageAssignee is missing displayName, and the storageAssignee is in the collaboratorArray\n // but there's no name, and the repositoryOwner happens to also be the same entity and includes the displayName.\n const ownerName =\n // the storageAssignee can be a user or an org, used to assign ownership of a directory to an IMS user or an org\n project?.storageAssignee.displayName ??\n // the Collaborator that corresponds to the storageAssignee or the orgEverybody\n getProjectOwnerCollaborator(project)?.name ??\n // the repositoryOwner is the definitive owner of the project, which can be used as a fallback (and may be the same as the storageAssignee)\n project?.repositoryOwner.displayName;\n\n const ownerID = project?.storageAssignee.id;\n\n const collaboratorsExcludingOwner = collaborators.filter((c) => c.collaboratorID !== ownerID);\n\n let contentBelowDivider: ReactElement | null = null;\n if (collaboratorsExcludingOwner.length > 0) {\n contentBelowDivider = (\n <SharedWithSection collaborators={collaboratorsExcludingOwner} limit={limit} />\n );\n } else {\n const projectInSharedStorage = project?.storageAssignee?.type === 'org';\n // The NoCollaborators component shows the message `you are the only member`. We need\n // to check if the project is a user storage/USM project or ashared-storage/ESM\n // project before deciding to show this message. In shared-storage, projects owned by\n // the organization, if there are no direct collaborators and only the user has access,\n // we display the message `you are the only member`. User storage projects always have\n // at least one direct collaborator, the owner. If the logged-in user is the owner and\n // the only person with access, the popover will not be shown initially. This stage\n // is reached only if the user is not the owner but has been directly invited. Therefore,\n // saying 'you are the only member' would be incorrect, and we choose not to display it.\n if (projectInSharedStorage) {\n contentBelowDivider = <NoCollaborators />;\n }\n }\n\n return (\n <div\n data-testid=\"collaborator-summary\"\n className={classNames(styles.collaboratorSummary, { [styles.express]: themeIsExpress })}\n >\n <span className={styles.headerText}>\n <FormattedMessage id=\"@ace/projects:projects.column.owner\" defaultMessage=\"Owner\" />\n </span>\n <div data-testid=\"collaborator-popover-owner\">\n <CollaboratorName name={ownerName} id={ownerID} />\n </div>\n {contentBelowDivider && (\n <>\n <Rule className={styles.divider} variant=\"small\" />\n {contentBelowDivider}\n </>\n )}\n </div>\n );\n});\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport UserGroupIcon from '@ccx-public/spectrum-wrapper/dist/Icon/UserGroup';\nimport { useTheme } from '@csc/common';\nimport classnames from 'classnames';\nimport React from 'react';\nimport { FormattedNumber } from 'react-intl';\n\nimport styles from './styles.module.css';\n\ninterface Props {\n count: number;\n iconSize: 'S' | 'XS';\n}\n\n/**\n * A small component that shows a user group icon and number beside it.\n */\nexport function UserIconAndCount({ count, iconSize }: Props) {\n const { themeIsSpectrum } = useTheme();\n return (\n <div\n className={classnames(styles.userIconAndCount, {\n [styles.spectrum]: themeIsSpectrum,\n })}\n >\n <UserGroupIcon\n data-testid=\"user-group-icon\"\n className={classnames(styles.usersIcon, {\n [styles.iconXS]: iconSize === 'XS',\n })}\n size={iconSize}\n />\n <span data-testid=\"count\" className={styles.userCount}>\n <FormattedNumber value={count} />\n </span>\n </div>\n );\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport classnames from 'classnames';\nimport React from 'react';\n\nimport styles from './styles.module.css';\n\ntype Props = React.PropsWithChildren<{\n loading?: boolean;\n className?: string;\n style?: React.CSSProperties;\n exampleElement?: React.ComponentType<{ className?: string; style?: React.CSSProperties }>;\n 'data-testid'?: string;\n}>;\n\nexport default function LoadingPlaceholder({\n loading,\n className,\n style,\n children,\n exampleElement: ExampleElement,\n 'data-testid': dataTestId,\n}: Props) {\n if (!loading) {\n return <>{children}</>;\n }\n\n if (ExampleElement) {\n return (\n <ExampleElement\n className={classnames(styles.loadingGradient, className)}\n style={style}\n data-testid={dataTestId ?? 'loading-placeholder'}\n />\n );\n }\n\n return (\n <div\n className={classnames(styles.loadingGradient, styles.element, className)}\n style={style}\n data-testid={dataTestId ?? 'loading-placeholder'}\n />\n );\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { SAM } from '@ccx-public/component-types';\nimport { useTheme } from '@csc/common';\nimport classnames from 'classnames';\nimport { observer } from 'mobx-react';\nimport type { PropsWithChildren } from 'react';\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport styles from './styles.module.css';\nimport type { RenderedCollaborator } from '../../models/collaborators';\nimport { getDisplayName } from '../../models/collaborators';\nimport LoadingPlaceholder from '../LoadingPlaceholder';\n\ninterface Props {\n limit?: number;\n items: RenderedCollaborator[];\n loading?: boolean;\n}\n\nexport const FacePileItem = observer(function FacePileItem({\n item,\n}: {\n item: RenderedCollaborator;\n}) {\n const avatarURL = item.getAvatarURL?.(SAM.AvatarSizes.Size50);\n const displayName = getDisplayName(item);\n\n return (\n <div className={classnames(styles.facePileItem, styles.facePileItemBackground)}>\n {avatarURL ? (\n <img src={avatarURL} alt={displayName} className={styles.facePileItemImg} />\n ) : (\n displayName\n ?.split(' ')\n .map((n) => n[0])\n .join('')\n .slice(0, 2)\n )}\n </div>\n );\n});\n\nexport default function FacePile({\n limit = 4,\n items,\n children,\n loading,\n}: PropsWithChildren<Props>) {\n const { themeIsExpress } = useTheme();\n const hasMore = items && items.length > limit;\n const moreCount = hasMore ? items.length - limit + 1 : 0;\n\n const faceCount = Math.min(items.length, hasMore ? limit - 1 : limit);\n const faces = items.slice(0, faceCount);\n\n const facePileItems: Array<RenderedCollaborator | undefined> = loading\n ? Array.from({ length: limit - 1 }, () => undefined)\n : faces.reverse();\n\n return (\n <div\n className={classnames(styles.facePile, { [styles.express]: themeIsExpress })}\n data-testid=\"facepile\"\n >\n {!loading && moreCount > 0 && (\n <div\n className={classnames(\n styles.facePileItem,\n styles.facePileItemBackground,\n styles.facePileMore,\n )}\n >\n <FormattedMessage\n id=\"@ace/projects:facePile.moreCount\"\n defaultMessage=\"+{moreCount, number}\"\n values={{ moreCount }}\n />\n </div>\n )}\n\n {facePileItems.map((collaborator, index) => (\n <LoadingPlaceholder\n key={index}\n data-testid=\"loading-facepile-item\"\n loading={loading}\n className={classnames(\n styles.facePileItem,\n styles.facePileItemBackground,\n styles.facePileItemLoading,\n )}\n >\n {collaborator && (\n <FacePileItem\n key={collaborator.collaboratorID ?? index}\n item={collaborator}\n />\n )}\n </LoadingPlaceholder>\n ))}\n\n {children && <div>{children}</div>}\n </div>\n );\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport type { SAM } from '@ccx-public/component-types';\n\nexport type RenderedCollaborator = Partial<\n Pick<SAM.Collaborator, 'name' | 'email' | 'getAvatarURL' | 'collaboratorID'>\n>;\n\nexport function getDisplayName(user: RenderedCollaborator): string | undefined {\n return user.name || user.email;\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport OverlayTrigger from '@ccx-public/spectrum-wrapper/dist/OverlayTrigger';\nimport Tooltip from '@ccx-public/spectrum-wrapper/dist/Tooltip';\nimport { useMobile } from '@csc/common';\nimport { useDirectCollaborators, useProject } from '@csc/sam-utils';\nimport { observer } from 'mobx-react';\nimport React, { useContext, useMemo } from 'react';\nimport { useIntl } from 'react-intl';\n\nimport CollaboratorPopoverContent, {\n CreatorName,\n SharedWithSection,\n} from './CollaboratorPopoverContent';\nimport { UserIconAndCount } from './UserIconAndCount';\nimport styles from './styles.module.css';\nimport ProjectContext from '../../contexts/ProjectContext';\nimport type { RenderedCollaborator } from '../../models/collaborators';\nimport FacePile from '../FacePile';\n\nexport type FacePileCollaboratorFilter =\n // Show direct collaborators, which implies a filtered set; see useDirectCollaborators\n | 'all'\n // Show all collaborators, unfiltered\n | 'collaborators'\n // Show only the creator in a facepile of one\n | 'creator';\n\nconst DEFAULT_LIMIT = 4;\n\n/**\n * Displays an icon and count of collaborators for a project, using the current\n * Project context. This variant is used in places like mobile and listview,\n * where space is limited. Areas with larger available space use\n * CollaboratorFacepile instead.\n *\n * A popover shows on hover with more details, as with the Facepile.\n */\nexport const CollaboratorCount = observer(function CollaboratorCount({\n iconSize = 'S',\n collaborators,\n className,\n}: {\n iconSize?: 'S' | 'XS';\n collaborators: RenderedCollaborator[];\n className?: string;\n}) {\n const isMobile = useMobile();\n // If you are the only collaborator (or there are none), don't show the icon.\n if (!collaborators.length) {\n return null;\n }\n\n return (\n <span className={className}>\n <OverlayTrigger trigger={isMobile ? 'click' : 'hover'} placement=\"bottom\">\n {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions -- TODO: Handle keyboard events, add an appropriate role */}\n <div\n data-testid=\"collaborators-count\"\n className={styles.trigger}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex -- TODO: Add appropriate role for interactive element\n tabIndex={0}\n >\n <UserIconAndCount count={collaborators.length} iconSize={iconSize} />\n </div>\n <Tooltip open placement=\"bottom\" data-testid=\"collaborator-count-popover\">\n <div className={styles.popoverContent}>\n <CollaboratorPopoverContent collaborators={collaborators} />\n </div>\n </Tooltip>\n </OverlayTrigger>\n </span>\n );\n});\n\ninterface Props {\n collaborators: RenderedCollaborator[];\n filter?: FacePileCollaboratorFilter;\n limit?: number;\n}\n\n/**\n * Displays a facepile of collaborators for a Project, using the current Project context.\n * The facepile should NOT include your own face.\n */\nexport const CollaboratorFacepile = observer(function CollaboratorFacepile({\n collaborators,\n filter = 'all',\n limit = DEFAULT_LIMIT,\n}: Props) {\n const intl = useIntl();\n const isMobile = useMobile();\n\n if (!collaborators.length) {\n return null;\n }\n\n const ariaLabel = intl.formatMessage({\n id: '@ace/projects:projectContentsHeader.collaboraors',\n defaultMessage: 'Collaborators',\n });\n\n return (\n <OverlayTrigger\n trigger={isMobile ? 'click' : 'hover'}\n placement=\"bottom\"\n // OverlayTrigger is interacting somehow with the flex layout by default and adding\n // extra height to the facepile. display: contents; fixes this.\n style={{ display: 'contents' }}\n >\n {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions -- TODO: Handle keyboard events, add an appropriate role */}\n <div\n data-testid=\"collaborators-count\"\n className={styles.trigger}\n aria-label={ariaLabel}\n // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex -- TODO: Add appropriate role for interactive element\n tabIndex={0}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n >\n <FacePile items={collaborators} limit={limit} />\n </div>\n <Tooltip open placement=\"bottom\" data-testid=\"collaborator-facepile-popover\">\n <div className={styles.popoverContent}>\n {filter === 'all' && (\n <CollaboratorPopoverContent collaborators={collaborators} />\n )}\n {filter === 'collaborators' && (\n <SharedWithSection collaborators={collaborators} limit={10} />\n )}\n {filter === 'creator' && <CreatorName />}\n </div>\n </Tooltip>\n </OverlayTrigger>\n );\n});\n\nconst CreatorFacePile = observer(function CreatorFacePile() {\n const project = useContext(ProjectContext);\n const creator = useMemo(() => {\n return project?.collaboratorArray\n .filter((c) => c.collaboratorID === project?.creator?.id)\n .slice(0, 1);\n }, [project]);\n if (!creator) {\n return null;\n }\n return <CollaboratorFacepile collaborators={creator} filter=\"creator\" />;\n});\n\nconst DirectCollaboratorsFacepile = observer(function DirectCollaboratorFacepile({\n limit = DEFAULT_LIMIT,\n}: {\n limit?: number;\n}) {\n const project = useContext(ProjectContext);\n const collaborators = useDirectCollaborators(project);\n return <CollaboratorFacepile collaborators={collaborators} filter=\"all\" limit={limit} />;\n});\n\nexport const ProjectCollaboratorsFacePile = observer(function ProjectCollaboratorsFacePile({\n projectId,\n filter = 'all',\n limit = DEFAULT_LIMIT,\n}: {\n projectId: string;\n filter?: FacePileCollaboratorFilter;\n limit?: number;\n}) {\n const { project, loading } = useProject(projectId);\n\n if (loading || !project) {\n return null;\n }\n\n return (\n <ProjectContext.Provider value={project}>\n {filter === 'all' && <DirectCollaboratorsFacepile limit={limit} />}\n {filter === 'collaborators' && (\n <CollaboratorFacepile\n collaborators={project.collaboratorArray}\n filter={filter}\n limit={limit}\n />\n )}\n {filter === 'creator' && <CreatorFacePile />}\n </ProjectContext.Provider>\n );\n});\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport type { SAM } from '@ccx-public/component-types';\nimport { useTheme } from '@csc/common';\nimport classNames from 'classnames';\nimport React from 'react';\n\nimport styles from './styles.module.css';\nimport { useProjectSharingAnalytics } from '../../hooks/useAnalytics';\nimport useShareSheetLoader from '../../hooks/useShareSheetLoader';\nimport type { ProjectViewLocations } from '../../utils/ingest';\nimport { ShareProjectBaseDialog } from '../ShareBaseDialog';\n\ninterface Props {\n project: SAM.AdobeAsset;\n viewLocation: ProjectViewLocations;\n}\n\nexport default function ProjectInviteDialog({ project, viewLocation }: Props) {\n useShareSheetLoader();\n\n const sendAnalytics = useProjectSharingAnalytics();\n const onIngestEvent = (event: CustomEvent) => {\n sendAnalytics(event, viewLocation);\n };\n\n const { themeIsExpress, themeIsSpectrum } = useTheme();\n\n const expressStyle = {\n width: '100%',\n height: '100%',\n minHeight: '420px',\n minWidth: '330px',\n maxHeight: 'unset',\n };\n\n const spectrumStyle = {\n minHeight: '420px',\n minWidth: '330px',\n height: '480px',\n };\n\n return (\n <div\n className={classNames({\n [styles.spectrum]: themeIsSpectrum,\n [styles.express]: themeIsExpress,\n })}\n data-testid=\"project-invite-dialog\"\n >\n <div style={themeIsExpress ? expressStyle : spectrumStyle}>\n <ShareProjectBaseDialog project={project} onIngestEvent={onIngestEvent} />\n </div>\n </div>\n );\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport type { Env } from '@ccx-public/component-types';\n\nexport const CLIENT_ID = 'CCProjectsClient';\n\nexport interface IConfig {\n CLIENT_ID: string;\n FLOODGATE_ENDPOINT: string;\n FLOODGATE_CLIENT_ID: string;\n FLOODGATE_SANDBOX_NAME: string;\n FLOODGATE_GW_IMS_ORG_ID: string;\n}\n\ninterface IConfigs {\n stage: IConfig;\n prod: IConfig;\n}\n\nexport const environmentConfigs: IConfigs = {\n stage: {\n CLIENT_ID,\n FLOODGATE_ENDPOINT: 'https://p13n-stage.adobe.io',\n FLOODGATE_CLIENT_ID: 'ACEProjects2Stage',\n FLOODGATE_SANDBOX_NAME: 'xlg-stage',\n FLOODGATE_GW_IMS_ORG_ID: '9E1005A551ED61CA0A490D45@AdobeOrg',\n },\n prod: {\n CLIENT_ID,\n FLOODGATE_ENDPOINT: 'https://p13n.adobe.io',\n FLOODGATE_CLIENT_ID: 'ACEProjects2Prod',\n FLOODGATE_SANDBOX_NAME: 'xlg-prod',\n FLOODGATE_GW_IMS_ORG_ID: '9E1005A551ED61CA0A490D45@AdobeOrg',\n },\n};\n\nexport function getEnvironmentConfig(environment: Env): IConfig {\n const configType = environment === 'prod' ? 'prod' : 'stage';\n\n const config: IConfig = environmentConfigs[configType];\n return config;\n}\n\nexport const usingUXP = function () {\n return Boolean(window.navigator.userAgent.indexOf('UXP') > -1);\n};\n\nexport type FeatureType =\n // Test purposes in FLOODGATE stage\n 'test-FF';\n\n// Given example feature flag from FLOODGATE Feature Flag service, \"testFF\"\n// UI render can be gated by generic feature (e.g. testFF && <Component />),\n// host specific feature flag (e.g. testFF-assetsWeb && <Component />),\n// or host technology specific feature flag (e.g. testFF-UXP && <Component />, testFF-web && <Component />)\nexport const hasFeatureFlag = function (\n feature: FeatureType,\n featureFlags: string[],\n productId = '',\n): boolean {\n if (!featureFlags.length) {\n return false;\n }\n\n let featureFlag: string;\n let productSpecificFeatureFlag: string;\n let techSpecificFeatureFlag: string;\n let featureFlagPresent: boolean;\n const hostTech: string = usingUXP() ? 'UXP' : 'web';\n for (let i = 0; i < featureFlags.length; i++) {\n featureFlag = featureFlags[i];\n techSpecificFeatureFlag = `${featureFlag}-${hostTech}`;\n productSpecificFeatureFlag = `${featureFlag}-${productId}`;\n featureFlagPresent =\n feature === featureFlag ||\n feature === techSpecificFeatureFlag ||\n feature === productSpecificFeatureFlag;\n if (featureFlagPresent) {\n return true;\n }\n }\n return false;\n};\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport type HostConfig from '@csc/common/@types/HostConfig';\n\nimport { getEnvironmentConfig } from '../../config/index';\n\nexport interface FloodgateFetchOptions\n extends Pick<HostConfig, 'accessToken' | 'environment' | 'refreshToken'> {\n allowRetry?: boolean;\n}\n\ninterface IFloodgateResponse {\n releases: [{ features: string[] }];\n}\n\nexport const floodgateFetch = async function ({\n accessToken,\n environment,\n refreshToken,\n allowRetry = true,\n}: FloodgateFetchOptions): Promise<string[]> {\n const config = getEnvironmentConfig(environment);\n const url = `${config.FLOODGATE_ENDPOINT}/fg/api/v3/feature?clientId=${config.FLOODGATE_CLIENT_ID}`;\n\n const fetchOptions = {\n method: 'GET',\n headers: {\n 'X-Api-Key': config.CLIENT_ID,\n Authorization: `Bearer ${accessToken}`,\n 'x-sandbox-name': config.FLOODGATE_SANDBOX_NAME,\n 'x-gw-ims-org-id': config.FLOODGATE_GW_IMS_ORG_ID,\n },\n };\n\n const response = await fetch(url, fetchOptions);\n\n // Only refetch once\n if (response.status === 401 && allowRetry) {\n const newToken = await refreshToken(accessToken);\n if (newToken === accessToken) {\n throw new Error('Request was unauthorized');\n } else {\n return floodgateFetch({\n environment,\n refreshToken,\n accessToken: newToken,\n allowRetry: false,\n });\n }\n }\n const floodgateData = (await response.json()) as IFloodgateResponse;\n\n return floodgateData.releases[0]?.features || [];\n};\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport type HostConfig from '@csc/common/@types/HostConfig';\nimport { useEffect, useMemo, useState, createContext } from 'react';\n\nimport { floodgateFetch } from '../../api/floodgate-service/floodgateFetch';\nimport { useLoadPerformance } from '../../hooks/usePerformance';\n\ntype FeatureFlags = string[];\nconst DEFAULT_FEATURE_FLAGS = [];\nlet floodgateFeatureFlagsCache: FeatureFlags | undefined = undefined;\n\ninterface Props\n extends Pick<HostConfig, 'accessToken' | 'refreshToken' | 'environment' | 'featureFlags'> {\n hostFeatureFlags?: HostConfig['featureFlags'];\n}\n\nexport function useFeatureFlagsLoader(props: Props) {\n const { accessToken, refreshToken, environment, hostFeatureFlags = {} } = props;\n const [featureFlags, setFeatureFlags] = useState<FeatureFlags>(DEFAULT_FEATURE_FLAGS);\n const loaded = useLoadPerformance('useFeatureFlagsLoader');\n\n useEffect(() => {\n const fetchFeatureFlags = async () => {\n let cancelled = false;\n\n let newFeatureFlags = floodgateFeatureFlagsCache;\n if (!newFeatureFlags) {\n newFeatureFlags = await floodgateFetch({\n accessToken,\n refreshToken,\n environment,\n });\n loaded();\n floodgateFeatureFlagsCache = newFeatureFlags;\n }\n\n if (!cancelled) {\n setFeatureFlags(newFeatureFlags);\n }\n\n return () => {\n cancelled = true;\n };\n };\n fetchFeatureFlags().catch((e) => {\n console.error('Failed to fetch feature flags: ', e);\n setFeatureFlags(DEFAULT_FEATURE_FLAGS);\n });\n }, [accessToken, refreshToken, environment, loaded]);\n\n const enabledHostFeatureFlags = useMemo(\n () =>\n Object.keys(hostFeatureFlags).filter((key) => {\n const value = hostFeatureFlags[key as keyof typeof hostFeatureFlags];\n return (\n value === true ||\n // @ts-expect-error - FeatureFlag is typed as Record<FeatureFlag, boolean>\n // value, but hosts might provide this as a string. This message disables\n // TypeScript complaining about comparing boolean to string.\n value === 'true'\n );\n }),\n [hostFeatureFlags],\n );\n\n return [...enabledHostFeatureFlags, ...featureFlags];\n}\n\nexport const FeatureFlagsContext = createContext<FeatureFlags>(DEFAULT_FEATURE_FLAGS);\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { AssetBrowser } from '@ccx-public/component-types';\nimport type { SpectrumConfig, ShowModalFn } from '@csc/common';\nimport {\n DocumentCallbacksProvider,\n ProductLocation,\n useToasts,\n handleShowModalResult,\n MobileProvider,\n SpectrumProvider,\n RenderedEvent,\n useHostConfig,\n HostConfigOverrides,\n NetworkProvider,\n} from '@csc/common';\nimport type HostConfig from '@csc/common/@types/HostConfig';\nimport { useSAMInitializer, SAMProvider } from '@csc/sam-utils';\nimport React, { useCallback, useEffect, useMemo } from 'react';\n\nimport { useFeatureFlagsLoader, FeatureFlagsContext } from './featureFlags';\nimport { useIntlLoader, IntlProvider } from './intl';\nimport { useLoadPerformance } from '../../hooks/usePerformance';\nimport { useSpectrumPreloader } from '../../hooks/useSpectrumPreloader';\nimport Ingest from '../../utils/ingest';\n\nfunction getSpectrumTheme(\n spectrumTheme: HostConfig['spectrumTheme'],\n): SpectrumConfig['spectrumTheme'] {\n return spectrumTheme === 'default' ? 'spectrum' : spectrumTheme;\n}\n\nfunction getBrowserData(ua: string) {\n let name = 'unknown',\n version = '';\n const rx = /(edge|opr|chrome|chromium|chrios|safari|firefox|fxios)\\/([\\d.]+)/i;\n const matches = ua.match(rx);\n if (matches?.length) {\n name = matches[1];\n version = matches[2];\n }\n\n return { name, version };\n}\n\ntype RawProvidersProps = Required<{\n featureFlags: NonNullable<ReturnType<typeof useFeatureFlagsLoader>>;\n intl: NonNullable<ReturnType<typeof useIntlLoader>>;\n sam: NonNullable<ReturnType<typeof useSAMInitializer>>;\n}> & {\n // TODO: change this to AssetBrowser.DocumentCallbacks once DocumentCallbacks has these fields\n documentCallbacks?: AssetBrowser.DocumentCallbacks &\n Pick<AssetBrowser.ICDOCallbacks, 'promptUserForFileImport' | 'importFiles'>;\n hostConfigOverrides?: Partial<HostConfig>;\n mobileConfig: { isMobile: boolean };\n isOnline?: boolean;\n style?: React.CSSProperties;\n};\n\nfunction RawProviders(props: React.PropsWithChildren<RawProvidersProps>) {\n const {\n children,\n documentCallbacks,\n featureFlags,\n hostConfigOverrides,\n mobileConfig,\n isOnline,\n intl,\n sam,\n style,\n } = props;\n\n const { enablePerformanceMeasurement, scale, spectrumTheme, theme } = useHostConfig();\n\n // We're using `RawProviders` to measure the time from UAB init in component-loader\n // to the time that the component has its first non-empty render, because the\n // first time we render `RawProviders`, it means that our async dependencies like\n // SAM, Spectrum, and locale messages are done loading and we can actually render\n // the full component for the first time.\n //\n // If a component needs to do data loading, that is not taken into account here.\n // This is about just pure code loading, meaning that this is the first time we're\n // capable of rendering _anything_, even if it's just a loading spinner.\n useEffect(() => {\n if (enablePerformanceMeasurement) {\n try {\n window.performance?.measure(\n 'AssetBrowser:ProjectComponent:first-non-empty-render',\n 'component-loader:load:AssetBrowser:begin',\n );\n } catch {\n // ignore if beginning marker is not present\n }\n }\n }, []); // eslint-disable-line react-hooks/exhaustive-deps -- only run on first render\n\n return (\n <HostConfigOverrides {...hostConfigOverrides}>\n <MobileProvider {...mobileConfig}>\n <NetworkProvider online={isOnline}>\n <SpectrumProvider\n scale={scale}\n spectrumTheme={getSpectrumTheme(spectrumTheme)}\n theme={theme}\n style={style}\n >\n <SAMProvider value={sam}>\n <IntlProvider {...intl}>\n <FeatureFlagsContext.Provider value={featureFlags}>\n <DocumentCallbacksProvider {...documentCallbacks}>\n {children}\n </DocumentCallbacksProvider>\n </FeatureFlagsContext.Provider>\n </IntlProvider>\n </SAMProvider>\n </SpectrumProvider>\n </NetworkProvider>\n </MobileProvider>\n </HostConfigOverrides>\n );\n}\n\nexport interface Props {\n adminModeOrgId?: string;\n // TODO: change this to AssetBrowser.DocumentCallbacks once DocumentCallbacks has these fields\n documentCallbacks?: AssetBrowser.DocumentCallbacks &\n Pick<AssetBrowser.ICDOCallbacks, 'promptUserForFileImport' | 'importFiles'>;\n isMobile: boolean;\n /**\n * Storybook-only prop for testing offline views without having to be offline.\n */\n isOnline?: boolean;\n /**\n * Storybook-only prop for styling components inside of storybook.\n */\n style?: React.CSSProperties;\n}\n\nexport function Providers(props: React.PropsWithChildren<Props>) {\n const { adminModeOrgId, children, isMobile, isOnline, style, documentCallbacks } = props;\n\n const {\n accessToken,\n appName,\n appVersion,\n clientId,\n disableAnalytics,\n dispatchEvent,\n enablePerformanceMeasurement,\n environment,\n featureFlags: hostFeatureFlags,\n imsData,\n locale,\n productId,\n refreshToken,\n scale,\n showModal: hostShowModal,\n showToast: hostShowToast,\n spectrumTheme,\n theme,\n } = useHostConfig();\n\n const userId = imsData?.userId;\n\n const intl = useIntlLoader({ locale });\n const samLoaded = useLoadPerformance('useSAMInitializer');\n const sam = useSAMInitializer({\n accessToken,\n adminModeOrgId,\n clientId,\n environment,\n loaded: samLoaded,\n locale,\n productId,\n productLocation: ProductLocation.Projects,\n refreshToken,\n userId,\n });\n const spectrum = useSpectrumPreloader({\n scale,\n spectrumTheme: getSpectrumTheme(spectrumTheme),\n theme,\n });\n const featureFlags = useFeatureFlagsLoader({\n accessToken,\n refreshToken,\n environment,\n hostFeatureFlags,\n });\n\n const mobileConfig = useMemo(() => ({ isMobile }), [isMobile]);\n\n const [toastContainer, showToastFallback] = useToasts(spectrum);\n\n const showToast = useCallback(\n (config: AssetBrowser.ToastConfig) =>\n hostShowToast ? hostShowToast(config) : showToastFallback(config),\n [hostShowToast, showToastFallback],\n );\n\n const showModal: ShowModalFn = useCallback(\n async (element, options) => {\n const showModalResult = await (intl && sam && spectrum\n ? hostShowModal(\n <>\n <RawProviders\n featureFlags={featureFlags}\n hostConfigOverrides={{ showModal, showToast }}\n mobileConfig={mobileConfig}\n documentCallbacks={documentCallbacks}\n intl={intl}\n sam={sam}\n >\n {element}\n </RawProviders>\n </>,\n {\n ...options,\n // Enable overlay API dialog for all modals in Projects (for Express)\n // TODO: Remove once this becomes the default behavior in Express UAB modals: https://jira.corp.adobe.com/browse/CCPROJ-11446\n useOverlayAPIDialog: isMobile ? true : false,\n },\n )\n : // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors -- TODO: Wrap in Error object\n Promise.reject({ type: AssetBrowser.ShowModalResultType.NotImplemented }));\n\n handleShowModalResult(showModalResult.type, options);\n\n return showModalResult;\n },\n [\n hostShowModal,\n intl,\n sam,\n spectrum,\n featureFlags,\n showToast,\n mobileConfig,\n isMobile,\n documentCallbacks,\n ],\n );\n\n const canRender = intl && sam && spectrum;\n\n const ingestConfig = useMemo(() => {\n const ingestBase = {\n env: { com: getBrowserData(navigator.userAgent) },\n event: {\n category: 'WEB',\n user_agent: navigator.userAgent,\n user_guid: userId,\n },\n source: {\n client_id: clientId,\n name: appName ?? productId,\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- TODO: Use other browser data\n platform: navigator.platform,\n version: appVersion,\n },\n };\n return {\n allowNoToken: true,\n apiKey: 'ace-projects-service',\n data: ingestBase,\n env: environment,\n product: productId,\n project: 'ace-projects',\n };\n }, [clientId, environment, productId, appName, appVersion, userId]);\n\n // Measure very first render\n useEffect(() => {\n if (enablePerformanceMeasurement) {\n try {\n window.performance?.measure(\n 'AssetBrowser:ProjectComponent:first-render',\n 'component-loader:load:AssetBrowser:begin',\n );\n } catch {\n // ignore if beginning marker is not present\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps -- We only want this to trigger on first render\n }, []);\n\n useEffect(() => {\n Ingest.disabled = !!disableAnalytics;\n if (!disableAnalytics) {\n Ingest.init(ingestConfig);\n }\n }, [ingestConfig, disableAnalytics]);\n\n const loaded = useLoadPerformance('Providers');\n useEffect(() => {\n if (canRender) {\n loaded();\n dispatchEvent(new RenderedEvent());\n }\n }, [canRender, loaded, dispatchEvent]);\n\n if (!canRender) {\n return null;\n }\n\n return (\n <>\n <RawProviders\n documentCallbacks={documentCallbacks}\n featureFlags={featureFlags}\n hostConfigOverrides={{ showModal, showToast }}\n mobileConfig={mobileConfig}\n isOnline={isOnline}\n intl={intl}\n sam={sam}\n style={style}\n >\n {children}\n </RawProviders>\n {!hostShowToast && toastContainer}\n </>\n );\n}\n\nexport default function withProviders<T extends object>(\n WrappedComponent: React.ComponentType<T>,\n): React.ComponentType<T & Props> {\n return function WithProviders(props: T & Props) {\n const { adminModeOrgId, isMobile, documentCallbacks, ...rest } = props;\n\n return (\n <Providers\n adminModeOrgId={adminModeOrgId}\n isMobile={isMobile}\n documentCallbacks={documentCallbacks}\n >\n <WrappedComponent {...(rest as T)} />\n </Providers>\n );\n };\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport preload from '@ccx-public/spectrum-wrapper/dist/preload';\nimport type { SpectrumConfig } from '@csc/common';\nimport { useState, useEffect } from 'react';\n\nimport { useLoadPerformance } from './usePerformance';\n\nexport function useSpectrumPreloader(props: Partial<SpectrumConfig>): SpectrumConfig | null {\n const { scale = 'medium', spectrumTheme = 'spectrum', theme = 'light' } = props;\n const [loadedProps, setLoadedProps] = useState<SpectrumConfig | null>(null);\n const loaded = useLoadPerformance('useSpectrumPreloader');\n\n useEffect(() => {\n let cancelled = false;\n preload({ scale, spectrumTheme, theme })\n .then(() => {\n loaded();\n if (!cancelled) {\n setLoadedProps({ scale, spectrumTheme, theme });\n }\n return undefined;\n })\n .catch(console.error);\n\n return () => {\n cancelled = true;\n };\n }, [loaded, scale, spectrumTheme, theme]);\n\n return loadedProps;\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport classnames from 'classnames';\nimport React from 'react';\n\nconst style = '.stroke{ stroke: currentColor; } .fill{ fill: currentColor; }';\n\nconst EmptyProjectIllustrationSpectrum = (props: { className?: string }) => (\n <svg\n role=\"img\"\n height=\"96px\"\n width=\"96px\"\n viewBox=\"0 0 96 96\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n data-testid=\"icon-empty-project\"\n className={classnames(props.className, 'projectContents-EmptyFilterView')}\n >\n <style>{style}</style>\n <defs />\n <path\n className=\"stroke\"\n d=\"M74.7969 62.75L69.8338 50.7129C68.9075 48.4661 66.7172 47 64.2868 47H55.2969M21.5469 62.75L25.1031 54.125M40.2969 72.5L56.7969 72.5M20.7969 65.75V86.75C20.7969 90.0638 23.4832 92.75 26.7969 92.75H69.5469C72.8606 92.75 75.5469 90.0638 75.5469 86.75V65.75C75.5469 62.4363 72.8606 59.75 69.5469 59.75H26.7969C23.4832 59.75 20.7969 62.4363 20.7969 65.75Z\"\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n className=\"stroke\"\n d=\"M28.7768 23.4554L33.357 31.3886C33.8034 32.1617 34.8289 32.4054 35.6476 31.9327L44.0473 27.0831M27.9978 23.9053L20.6416 28.1524C19.0704 29.0595 18.5336 31.0711 19.4426 32.6454L30.4145 51.6494C31.3235 53.2238 33.334 53.7647 34.9052 52.8576L50.0776 44.0977C51.6488 43.1906 52.1856 41.179 51.2767 39.6047L44.8266 28.4328C44.3901 27.6768 43.6718 27.1248 42.8296 26.8982L30.4914 23.5788C29.6492 23.3522 28.7523 23.4697 27.9978 23.9053Z\"\n strokeWidth=\"4\"\n strokeLinejoin=\"round\"\n />\n <path\n className=\"fill\"\n d=\"M41.4704 18.2765L44.4819 18.9551C45.6657 19.2225 46.4879 17.801 45.6632 16.907L43.5705 14.6384C43.2956 14.3388 43.1842 13.9252 43.2733 13.5264L43.9519 10.5149C44.2194 9.33114 42.7978 8.50891 41.9038 9.33361L39.6352 11.4263C39.3356 11.7012 38.922 11.8127 38.5233 11.7235L35.5118 11.0449C34.328 10.7775 33.5057 12.199 34.3304 13.093L36.4231 15.3616C36.698 15.6612 36.8095 16.0748 36.7203 16.4736L36.0417 19.4851C35.7743 20.6689 37.1958 21.4911 38.0899 20.6664L40.3584 18.5737C40.6581 18.2988 41.0717 18.1873 41.4704 18.2765Z\"\n fill=\"#DBDBDB\"\n />\n <circle className=\"fill\" cx=\"59.9468\" cy=\"40.1\" r=\"3\" fill=\"#DBDBDB\" />\n <path\n className=\"stroke\"\n d=\"M77.0846 12.1761C78.5426 13.0236 79.0342 14.9212 78.1813 16.4087L71.7867 27.5603C68.4985 33.2945 61.2643 35.2998 55.6418 32.0314C50.0215 28.7643 48.1258 21.4548 51.4152 15.7183L57.8098 4.56677C58.6628 3.0793 60.5408 2.55919 61.9988 3.40669L77.0846 12.1761Z\"\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n className=\"stroke fill\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M63.2967 20.1428C62.8581 20.4015 62.8521 21.0364 63.2861 21.287L66.8281 23.3319C67.262 23.5825 67.8089 23.2598 67.8136 22.7507L67.8498 18.5981C67.8545 18.0889 67.312 17.7758 66.8734 18.0344L63.2967 20.1428Z\"\n fill=\"#DBDBDB\"\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n className=\"stroke\"\n d=\"M57 16.9607L61.8082 14.4047\"\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nexport default EmptyProjectIllustrationSpectrum;\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport _IllustratedMessage from '@ccx-public/spectrum-wrapper/dist/IllustratedMessage';\nimport { useMobile, useTheme } from '@csc/common';\nimport classnames from 'classnames';\nimport type { ComponentProps } from 'react';\nimport React from 'react';\n\nimport styles from './style.module.css';\n\ninterface Props extends ComponentProps<typeof _IllustratedMessage> {\n imageSrc?: string | React.ReactNode;\n imageAlt?: string;\n}\n\n// Wrapper of spectrum-wrapper IllustratedMessage component\n// uses an <img /> tag for the illustration.\nexport default function IllustratedMessage({\n className,\n heading,\n imageSrc,\n imageAlt,\n ...rest\n}: Props) {\n const isMobile = useMobile();\n const { themeIsExpress, themeIsSpectrum } = useTheme();\n\n const img =\n typeof imageSrc === 'string' ? (\n <img src={imageSrc} className={styles.illustration} alt={imageAlt ?? heading} />\n ) : (\n imageSrc\n );\n\n return (\n <_IllustratedMessage\n {...rest}\n className={classnames(\n styles.illustratedMessage,\n {\n [styles.mobile]: isMobile,\n [styles.spectrum]: themeIsSpectrum,\n [styles.express]: themeIsExpress,\n },\n className,\n )}\n heading={heading}\n illustration={img}\n />\n );\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport React from 'react';\n\nexport default function OfflineIllustration() {\n return (\n <svg\n width=\"96\"\n height=\"96\"\n viewBox=\"0 0 96 96\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M64.75 34C64.75 25.8534 71.3534 19.25 79.5 19.25C87.6466 19.25 94.25 25.8534 94.25 34C94.25 42.1466 87.6466 48.75 79.5 48.75C71.3534 48.75 64.75 42.1466 64.75 34ZM79.5 25.0217C78.3978 25.0217 77.4959 25.9236 77.4959 27.0258V34.7215C77.4959 35.8237 78.3978 36.7255 79.5 36.7255C80.6022 36.7255 81.5041 35.8237 81.5041 34.7215V27.0258C81.5041 25.9236 80.6022 25.0217 79.5 25.0217ZM81.484 41.7959C81.5442 41.6656 81.5842 41.5353 81.6143 41.395L81.6143 41.3949C81.6344 41.2546 81.6544 41.1144 81.6544 40.9742C81.6544 40.834 81.6344 40.6937 81.6143 40.5535L81.6143 40.5533C81.5842 40.413 81.5442 40.2828 81.484 40.1525C81.4339 40.0222 81.3638 39.892 81.2936 39.7717C81.2135 39.6615 81.1233 39.5513 81.0231 39.4511C80.9229 39.3509 80.8127 39.2607 80.6924 39.1805C80.5822 39.1004 80.452 39.0403 80.3217 38.9802L80.3217 38.9801C80.1914 38.93 80.0611 38.8899 79.9209 38.8599C79.6403 38.8098 79.3597 38.8098 79.0791 38.8599C78.9389 38.8899 78.8086 38.93 78.6783 38.9801C78.5481 39.0403 78.4178 39.1004 78.3076 39.1805C78.1873 39.2607 78.0771 39.3509 77.9769 39.4511C77.8767 39.5513 77.7865 39.6615 77.7064 39.7717C77.6262 39.892 77.5661 40.0222 77.506 40.1525C77.4558 40.2828 77.4158 40.413 77.3857 40.5533C77.3456 40.6936 77.3456 40.8339 77.3456 40.9742C77.3456 41.1145 77.3556 41.2548 77.3857 41.395C77.4158 41.5353 77.4558 41.6656 77.506 41.7959C77.5661 41.9261 77.6262 42.0564 77.7064 42.1666C77.7865 42.2869 77.8767 42.3971 77.9769 42.4973C78.0771 42.5975 78.1873 42.6877 78.3076 42.7678C78.4178 42.838 78.5481 42.9081 78.6783 42.9582C78.8086 43.0183 78.9389 43.0584 79.0791 43.0885C79.2194 43.1286 79.3597 43.1286 79.5 43.1286C79.6403 43.1286 79.7806 43.1185 79.9209 43.0885C80.0611 43.0584 80.1914 43.0183 80.3217 42.9582C80.4519 42.9081 80.5822 42.838 80.6924 42.7678C80.8127 42.6877 80.9229 42.5975 81.0231 42.4973C81.1233 42.3971 81.2135 42.2869 81.2936 42.1666C81.3638 42.0564 81.4339 41.9261 81.484 41.7959ZM39.585 64.7681C41.7273 62.5872 44.7041 61.2383 47.9996 61.2383C51.2926 61.2383 54.2674 62.5851 56.4094 64.763C57.1839 65.5505 58.4502 65.5611 59.2377 64.7865C60.0252 64.012 60.0358 62.7457 59.2612 61.9582C56.3982 59.0472 52.4083 57.2383 47.9996 57.2383C43.5875 57.2383 39.595 59.05 36.7315 61.9649C35.9574 62.7529 35.9687 64.0192 36.7566 64.7932C37.5446 65.5673 38.8109 65.556 39.585 64.7681ZM47.9984 49.3086C41.4054 49.3086 35.4436 51.9952 31.1416 56.3382C30.3643 57.123 29.098 57.129 28.3132 56.3517C27.5285 55.5743 27.5225 54.308 28.2998 53.5233C33.3221 48.4529 40.2949 45.3086 47.9984 45.3086C55.7003 45.3086 62.6717 48.4516 67.6938 53.52C68.4713 54.3046 68.4655 55.5709 67.6809 56.3484C66.8962 57.1259 65.6299 57.12 64.8525 56.3354C60.5507 51.994 54.59 49.3086 47.9984 49.3086ZM22.7151 47.8924C29.1755 41.3954 38.1165 37.377 47.9999 37.377C51.721 37.377 55.3054 37.9463 58.6728 39.0012C59.7268 39.3314 60.849 38.7446 61.1792 37.6905C61.5094 36.6365 60.9226 35.5143 59.8685 35.1841C56.1187 34.0094 52.1312 33.377 47.9999 33.377C37.0089 33.377 27.0591 37.8509 19.8787 45.072C19.0998 45.8553 19.1034 47.1216 19.8867 47.9004C20.6699 48.6793 21.9362 48.6757 22.7151 47.8924ZM47.9991 25.4453C34.8148 25.4453 22.8859 30.8042 14.2654 39.4676C13.4863 40.2505 12.2199 40.2537 11.4369 39.4746C10.654 38.6954 10.6508 37.4291 11.4299 36.6461C20.7704 27.2593 33.7077 21.4453 47.9991 21.4453C52.7886 21.4453 57.4289 22.0986 61.834 23.322C62.8983 23.6176 63.5214 24.72 63.2259 25.7843C62.9303 26.8485 61.8279 27.4717 60.7636 27.1761C56.7037 26.0486 52.4235 25.4453 47.9991 25.4453ZM48.0039 74.5596C49.6608 74.5596 51.0039 73.2164 51.0039 71.5596C51.0039 69.9027 49.6608 68.5596 48.0039 68.5596C46.3471 68.5596 45.0039 69.9027 45.0039 71.5596C45.0039 73.2164 46.3471 74.5596 48.0039 74.5596Z\"\n fill=\"var(--spectrum-global-color-gray-800, #292929)\"\n stroke=\"var(--spectrum-global-color-gray-800, #292929)\"\n />\n </svg>\n );\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport React from 'react';\nimport { useIntl } from 'react-intl';\n\nimport OfflineIllustration from './OfflineIllustration';\nimport styles from './styles.module.css';\nimport IllustratedMessage from '../../IllustratedMessage';\n\nexport default function ProjectListOfflineState() {\n const intl = useIntl();\n return (\n <div data-testid=\"projects-list-offline-state\" className={styles.offlineState}>\n <IllustratedMessage\n data-testid=\"projects-list-offline-state-illustrated-message\"\n heading={intl.formatMessage({\n id: '@ace/projects:projects.offline.heading',\n defaultMessage: 'You’re Disconnected',\n })}\n description={intl.formatMessage({\n id: '@ace/projects:projects.offline.description',\n defaultMessage:\n 'You can view and edit shared files when your connection is restored.',\n })}\n imageSrc={<OfflineIllustration />}\n className={styles.noIllustratedMessageTitleToHeading}\n />\n </div>\n );\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { useMobile, useTheme } from '@csc/common';\nimport classnames from 'classnames';\nimport React from 'react';\n\nimport styles from './style.module.css';\n\ntype Props = React.HTMLAttributes<HTMLHeadingElement>;\n\nexport default function Header({ className, children, ...props }: Props) {\n const { themeIsExpress, themeIsSpectrum } = useTheme();\n const isMobile = useMobile();\n\n return (\n <h2\n {...props}\n className={classnames(className, styles.header, {\n [styles.express]: themeIsExpress,\n [styles.spectrum]: themeIsSpectrum,\n [styles.mobile]: isMobile,\n })}\n >\n {children}\n </h2>\n );\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport type { ReactElement } from 'react';\nimport React from 'react';\n\n// https://opensource.adobe.com/spectrum-web-components/components/action-group\n// There will be no RS2 fallback.\nimport type { Badge as BadgeType } from '@ccx-public/spectrum-web-component-fallbacks/dist/badge';\n\nimport createWrapper from './utils/createWrapper';\nimport { SWCLoader } from './utils/SWCLoader';\nimport { cloneElement } from 'react';\n\nlet swcLoader;\nif (!process.env.EXCLUDE_SWC) {\n swcLoader = new SWCLoader(['sp-badge'], async () => {\n const { Badge } = await import(\n /* webpackChunkName: \"SpBadge\" */\n '@ccx-public/spectrum-web-component-fallbacks/dist/badge'\n );\n return [Badge];\n });\n}\n\ntype WrapperCompatProps = {\n // The icon will get transformed into an icon slot for SWC.\n icon?: ReactElement;\n};\n\nexport default createWrapper<BadgeType, WrapperCompatProps>({\n displayName: 'Badge',\n fallback: undefined,\n swcLoader,\n swcProps: (props) => {\n const { children, className, icon, ...rest } = props;\n const optionalIcon = icon\n ? cloneElement(icon, {\n slot: 'icon',\n })\n : undefined;\n\n return {\n ...rest,\n children: (\n <>\n {optionalIcon} {children}\n </>\n ),\n class: className,\n };\n },\n tagName: 'sp-badge',\n});\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport type { SAM } from '@ccx-public/component-types';\nimport DropdownButton from '@ccx-public/spectrum-wrapper/dist/DropdownButton';\nimport type Icon from '@ccx-public/spectrum-wrapper/dist/Icon';\nimport { MenuDivider, MenuItem } from '@ccx-public/spectrum-wrapper/dist/Menu';\nimport { useTheme } from '@csc/common';\nimport React, { useMemo, cloneElement } from 'react';\n\nimport type { Action } from '../../actions';\n\nexport default function ActionMenu({\n actions,\n hideDestructiveActions,\n item,\n ...props\n}: {\n actions: Action[];\n hideDestructiveActions?: boolean;\n item?: SAM.AdobeAsset;\n} & React.ComponentProps<typeof DropdownButton>) {\n const { themeIsExpress } = useTheme();\n const availableActions = useMemo(() => {\n return actions.reduce<Action[]>((memo, action) => {\n if (!item || !action.isVisible(item)) {\n return memo;\n }\n\n return memo.concat(action);\n }, []);\n }, [actions, item]);\n\n const nonDestructiveActions = useMemo(\n () => availableActions.filter((action) => action.groupName !== 'destructiveActions'),\n [availableActions],\n );\n const destructiveActions = useMemo(\n () =>\n hideDestructiveActions\n ? []\n : availableActions.filter((action) => action.groupName === 'destructiveActions'),\n [availableActions, hideDestructiveActions],\n );\n\n return (\n <DropdownButton\n {...props}\n disabled={!item}\n onSelect={(e: string) => {\n const action = actions.find((a) => a.label === e);\n\n if (action && item) {\n action.execute(item).catch(console.error);\n }\n }}\n >\n {nonDestructiveActions.map((action, index) => renderMenuItem(action, index))}\n {!themeIsExpress && destructiveActions.length > 0 && <MenuDivider />}\n {destructiveActions.map((action, index) => renderMenuItem(action, index))}\n </DropdownButton>\n );\n}\nfunction renderMenuItem(action: Action, index: number): React.JSX.Element {\n return (\n <MenuItem\n aria-label={action.label}\n key={index}\n icon={cloneElement(action.icon as React.ReactComponentElement<typeof Icon>, {\n size: 'S',\n })}\n data-testid={`action-${action.value}`}\n >\n {action.label}\n </MenuItem>\n );\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport type { SAM } from '@ccx-public/component-types';\nimport IconMore from '@ccx-public/spectrum-wrapper/dist/Icon/More';\nimport React from 'react';\nimport { useIntl } from 'react-intl';\n\nimport useProjectActions from '../../hooks/useProjectActions';\nimport type { ProjectViewLocations } from '../../utils/ingest';\nimport ActionMenu from '../ActionMenu';\n\ntype Props = {\n hideDestructiveActions?: boolean;\n id?: string;\n project?: SAM.Project;\n onDestructiveActionSuccess?: () => unknown;\n viewLocation: ProjectViewLocations;\n actionFilter?: (value: string) => boolean;\n};\n\nexport default function ProjectActionMenu({\n hideDestructiveActions,\n id,\n project,\n onDestructiveActionSuccess,\n viewLocation,\n actionFilter,\n}: Props) {\n const actions = useProjectActions({\n onDestructiveActionSuccess,\n viewLocation,\n actionFilter,\n });\n const intl = useIntl();\n\n if (!actions.length) {\n return null;\n }\n\n return (\n <ActionMenu\n data-testid=\"project-actions-menu-dropdown-button\"\n hideDestructiveActions={hideDestructiveActions}\n icon={\n <IconMore\n size=\"XS\"\n aria-label={intl.formatMessage({\n id: '@ace/projects:projectActions',\n defaultMessage: 'Project actions',\n })}\n label={intl.formatMessage({\n id: '@ace/projects:projectActions',\n defaultMessage: 'Project actions',\n })}\n />\n }\n id={id}\n quiet\n placement=\"bottom-end\"\n actions={actions}\n item={project}\n disabled={!!project}\n />\n );\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport type { SAM } from '@ccx-public/component-types';\nimport Button from '@ccx-public/spectrum-wrapper/dist/Button';\nimport { useHostConfig } from '@csc/common';\nimport { observer } from 'mobx-react';\nimport React, { useCallback, useEffect, useRef } from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport { useProjectActionAnalytics } from '../../hooks/useAnalytics';\nimport type { ProjectViewLocations } from '../../utils/ingest';\nimport ProjectInviteDialog from '../ProjectInviteDialog';\n\ninterface Props extends Pick<React.ComponentProps<typeof Button>, 'quiet' | 'variant'> {\n id?: string;\n project: SAM.Project;\n viewLocation: ProjectViewLocations;\n}\n\nconst ProjectInviteButton = observer(function ProjectInviteButton({\n id,\n project,\n quiet,\n variant = 'primary',\n viewLocation,\n}: Props) {\n const { showModal, imsData } = useHostConfig();\n const sendAnalytics = useProjectActionAnalytics();\n const ref = useRef<HTMLSlotElement>(null);\n\n const handleClick = useCallback(() => {\n sendAnalytics({\n element: project,\n subcategory: viewLocation,\n type: 'click',\n subtype: 'share',\n sequence: 'context-menu',\n userId: imsData?.userId,\n });\n void showModal(<ProjectInviteDialog project={project} viewLocation={viewLocation} />, {\n size: 'm',\n });\n }, [project, viewLocation, sendAnalytics, showModal, imsData?.userId]);\n\n // NOTE: React synthetic events don't work with web components, so we manage the event listener manually.\n useEffect(() => {\n const { current } = ref;\n if (current) {\n current.addEventListener('click', handleClick);\n }\n return () => {\n if (current) {\n current.removeEventListener('click', handleClick);\n }\n };\n }, [handleClick]);\n\n return (\n <slot data-testid=\"slot-project-invite-button\" name=\"project-invite-button\" ref={ref}>\n <Button id={id} data-testid=\"project-invite-button\" quiet={quiet} variant={variant}>\n <FormattedMessage id=\"@ace/projects:project.button.invite\" defaultMessage=\"Share\" />\n </Button>\n </slot>\n );\n});\n\nexport default ProjectInviteButton;\n","// extracted by mini-css-extract-plugin\nexport default {\"heading\":\"heading--i1ujw\",\"headingXXXL\":\"headingXXXL--IinML\",\"headingXXL\":\"headingXXL--fsIYB\",\"headingXL\":\"headingXL--bc3X0\",\"headingL\":\"headingL--H5H3f\",\"headingM\":\"headingM--rkByp\",\"headingS\":\"headingS--y3poT\",\"headingXS\":\"headingXS--kGs0G\",\"headingXXS\":\"headingXXS--OgpTa\"};","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport classnames from 'classnames';\nimport React from 'react';\n\nimport style from './Heading.module.css';\n\ntype Level = '1' | '2' | '3' | '4' | '5' | '6';\ntype Tag = 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\ntype Size = 'xxxl' | 'xxl' | 'xl' | 'l' | 'm' | 's' | 'xs' | 'xxs';\n\nconst HEADING_TAGS: Record<Level, Tag> = {\n 1: 'h1',\n 2: 'h2',\n 3: 'h3',\n 4: 'h4',\n 5: 'h5',\n 6: 'h6',\n};\n\nconst HEADING_STYLES: Record<Size, string> = {\n xxxl: style.headingXXXL,\n xxl: style.headingXXL,\n xl: style.headingXL,\n l: style.headingL,\n m: style.headingM,\n s: style.headingS,\n xs: style.headingXS,\n xxs: style.headingXXS,\n};\n\ntype Props = React.PropsWithChildren<{\n className?: string;\n level: Level;\n size: Size;\n}>;\n\nexport default function Heading({ className, level, size, ...rest }: Props) {\n const HeadingTag = HEADING_TAGS[level];\n\n return (\n <HeadingTag\n {...rest}\n className={classnames(className, style.heading, HEADING_STYLES[size])}\n />\n );\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport type { PropsWithChildren } from 'react';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\n\nimport styles from './ResponsiveVisibilityWrapper.module.css';\n\n/**\n * A wrapper component that monitors its intersection with the parent container\n * and automatically hides content when it becomes occluded or clipped.\n *\n * This is useful for responsive layouts where you need items to gracefully\n * disappear when there isn't enough space, rather than causing overflow\n * or unwanted wrapping.\n *\n * @example\n * ```tsx\n * <ResponsiveVisibilityWrapper\n * onVisibilityChange={(visible) => handleVisibilityChange(item.id, visible)}\n * >\n * <Button>My Button</Button>\n * </ResponsiveVisibilityWrapper>\n * ```\n */\nexport default function ResponsiveVisibilityWrapper({\n children,\n onVisibilityChange,\n}: PropsWithChildren<{\n /** Callback fired when the visibility state changes due to intersection */\n onVisibilityChange: (visible: boolean) => void;\n}>) {\n const elementRef = useRef<HTMLDivElement>(null);\n const [isVisible, setIsVisible] = useState(true);\n\n const handleVisibilityChange = useCallback(\n (visible: boolean) => {\n setIsVisible(visible);\n onVisibilityChange(visible);\n },\n [onVisibilityChange],\n );\n\n useEffect(() => {\n if (!elementRef.current || !elementRef.current.parentElement) {\n return;\n }\n\n const observer = new IntersectionObserver(\n (entries) => {\n const visible = entries.every((entry) => entry.intersectionRatio === 1);\n handleVisibilityChange(visible);\n },\n {\n root: elementRef.current.parentElement,\n threshold: 1,\n },\n );\n\n observer.observe(elementRef.current);\n\n return () => {\n observer.disconnect();\n };\n }, [handleVisibilityChange]);\n\n return (\n <div ref={elementRef} className={isVisible ? styles.visible : styles.hidden}>\n {children}\n </div>\n );\n}\n","// extracted by mini-css-extract-plugin\nexport default {\"visible\":\"visible--rQJsP\",\"hidden\":\"hidden--Q4Rfg\"};","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport React from 'react';\n\nconst NotFoundIllustration = ({\n color = 'var(--spectrum-gray-800, #292929)',\n className,\n}: {\n className?: string;\n color?: string;\n}) => (\n <svg\n role=\"img\"\n height=\"96px\"\n width=\"96px\"\n viewBox=\"0 0 96 96\"\n fill={color}\n stroke={color}\n xmlns=\"http://www.w3.org/2000/svg\"\n data-testid=\"icon-not-found\"\n className={className}\n strokeWidth=\"0.1\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M18 39.0762C18 27.4782 27.402 18.0762 39 18.0762C50.598 18.0762 60 27.4782 60 39.0762C60 50.6742 50.598 60.0762 39 60.0762C27.402 60.0762 18 50.6742 18 39.0762ZM39 14.0762C25.1929 14.0762 14 25.2691 14 39.0762C14 52.8833 25.1929 64.0762 39 64.0762C45.1836 64.0762 50.8428 61.8312 55.2071 58.1117L56.6984 59.603L55.277 61.0244C54.4959 61.8055 54.4959 63.0718 55.277 63.8528L72.4059 80.9818C74.7363 83.3121 78.5145 83.3121 80.8448 80.9818C83.1752 78.6514 83.1752 74.8732 80.8448 72.5428L63.7159 55.4139C62.9349 54.6329 61.6685 54.6329 60.8875 55.4139L59.5268 56.7746L58.0356 55.2833C61.755 50.919 64 45.2598 64 39.0762C64 25.2691 52.8071 14.0762 39 14.0762ZM62.3017 59.6566L59.5196 62.4386L75.2343 78.1533C76.0026 78.9216 77.2482 78.9216 78.0164 78.1533C78.7847 77.3851 78.7847 76.1395 78.0164 75.3713L62.3017 59.6566ZM49.4142 29.5858C48.6332 28.8047 47.3668 28.8047 46.5858 29.5858L39.5 36.6716L32.4142 29.5858C31.6332 28.8047 30.3668 28.8047 29.5858 29.5858C28.8047 30.3668 28.8047 31.6332 29.5858 32.4142L36.6716 39.5L29.5858 46.5858C28.8047 47.3668 28.8047 48.6332 29.5858 49.4142C30.3668 50.1953 31.6332 50.1953 32.4142 49.4142L39.5 42.3284L46.5858 49.4142C47.3668 50.1953 48.6332 50.1953 49.4142 49.4142C50.1953 48.6332 50.1953 47.3668 49.4142 46.5858L42.3284 39.5L49.4142 32.4142C50.1953 31.6332 50.1953 30.3668 49.4142 29.5858Z\"\n fill={color}\n />\n </svg>\n);\n\nexport default NotFoundIllustration;\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport React from 'react';\n\nconst RequestAccessIllustration = ({\n color = 'var(--spectrum-gray-800, #292929)',\n className,\n}: {\n className?: string;\n color?: string;\n}) => (\n <svg\n role=\"img\"\n height=\"96px\"\n width=\"96px\"\n viewBox=\"0 0 96 96\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n data-testid=\"icon-request-access\"\n className={className}\n strokeWidth=\"0.1\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M34.5 27.5C34.5 19.4919 40.9919 13 49 13C57.0081 13 63.5 19.4919 63.5 27.5V39H68.5C74.0228 39 78.5 43.4772 78.5 49V70C78.5 75.5228 74.0228 80 68.5 80H28.5C22.9772 80 18.5 75.5228 18.5 70V49C18.5 43.4772 22.9772 39 28.5 39H34.5V27.5ZM38.5 39H59.5V27.5C59.5 21.701 54.799 17 49 17C43.201 17 38.5 21.701 38.5 27.5V39ZM61.5 43H28.5C25.1863 43 22.5 45.6863 22.5 49V70C22.5 73.3137 25.1863 76 28.5 76H68.5C71.8137 76 74.5 73.3137 74.5 70V49C74.5 45.6863 71.8137 43 68.5 43H61.5ZM47 60.584C45.2341 59.8124 44 58.0503 44 56C44 53.2386 46.2386 51 49 51C51.7614 51 54 53.2386 54 56C54 58.0503 52.7659 59.8124 51 60.584V65.5011C51 66.6057 50.1046 67.5011 49 67.5011C47.8954 67.5011 47 66.6057 47 65.5011V60.584Z\"\n fill={color}\n stroke={color}\n />\n </svg>\n);\n\nexport default RequestAccessIllustration;\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { AssetBrowser, SAM } from '@ccx-public/component-types';\nimport Button from '@ccx-public/spectrum-wrapper/dist/Button';\nimport { useHostConfig } from '@csc/common';\nimport { isSAMError } from '@csc/sam-utils';\nimport React from 'react';\nimport { FormattedMessage, useIntl } from 'react-intl';\n\nimport NotFoundIllustration from './NotFoundIllustration';\nimport RequestAccessIllustration from './RequestAccessIllustration';\nimport styles from './style.module.css';\nimport IllustratedMessage from '../../IllustratedMessage';\nimport errorStateIllustration from '../../ProjectList/ErrorState/error_state.svg';\nimport { NavigationEvent } from '../../withProviders/events/NavigationEvent';\n\nconst getErrorCode = (error: Error | undefined) => {\n if (isSAMError(error)) {\n return error.code;\n }\n};\n\nexport default function ProjectContentsErrorState(props: {\n isDiscarded?: boolean;\n error: Error | undefined;\n}) {\n const intl = useIntl();\n const { error, isDiscarded } = props;\n const errorCode = getErrorCode(error);\n const { dispatchEvent } = useHostConfig();\n\n if (errorCode === SAM.SAMErrorCode.NOT_FOUND || isDiscarded) {\n return (\n <div\n className={styles.projectContentsErrorState}\n data-testid=\"project-contents-error-state-not-found\"\n >\n <IllustratedMessage\n heading={intl.formatMessage({\n id: '@ace/projects:projects.contents.errorState.notFound.heading',\n defaultMessage: 'Project not found',\n })}\n description={\n <Button\n slot=\"description\"\n variant=\"action\"\n quiet\n onClick={() =>\n dispatchEvent(\n new NavigationEvent({\n name: AssetBrowser.ContentViewType.Projects,\n }),\n )\n }\n >\n <FormattedMessage\n id=\"@ace/projects:projects.contents.errorState.notFound.action\"\n defaultMessage=\"Show all projects\"\n />\n </Button>\n }\n imageSrc={<NotFoundIllustration className={styles.errorIcon} />}\n />\n </div>\n );\n }\n\n if (errorCode === SAM.SAMErrorCode.ACCESS_DENIED) {\n return (\n <div\n className={styles.projectContentsErrorState}\n data-testid=\"project-contents-error-state-request-access\"\n >\n <IllustratedMessage\n heading={intl.formatMessage({\n id: '@ace/projects:projects.contents.errorState.requestAccess.heading',\n defaultMessage: 'Request Access',\n })}\n description={intl.formatMessage({\n id: '@ace/projects:projects.contents.errorState.requestAccess.description',\n defaultMessage:\n 'If you believe you should have access, ask the owner to share it with you or switch to another Adobe ID.',\n })}\n imageSrc={<RequestAccessIllustration className={styles.errorIcon} />}\n />\n </div>\n );\n }\n\n // Messaging for generic error are based on ProjectListings ErrorState until designs arrive\n return (\n <div\n className={styles.projectContentsErrorState}\n data-testid=\"project-contents-error-state-default\"\n >\n <IllustratedMessage\n heading={intl.formatMessage({\n id: '@ace/projects:projects.contents.errorState.default.heading',\n defaultMessage: 'Couldn’t load Project',\n })}\n description={intl.formatMessage({\n id: '@ace/projects:projects.contents.errorState.default.description',\n defaultMessage: 'Please try again.',\n })}\n imageSrc={errorStateIllustration}\n />\n </div>\n );\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { getBaseUrlMap } from '@csc/common';\n\n/**\n * Creates an Adobe Express URL for viewing a specific brand\n * @param environment - The environment string ('stage' or 'prod')\n * @param brandId - The unique identifier for the brand\n * @returns The complete URL to view the brand in Adobe Express\n */\nexport function createExpressBrandUrl(environment: 'stage' | 'prod', brandId: string): string {\n const baseUrls = getBaseUrlMap(environment);\n return `${baseUrls.EXPRESS_WEB}/brands/${brandId}`;\n}\n\n/**\n * Creates an Adobe Express URL for viewing a project (useful for viewing all linked brands in project context)\n * @param environment - The environment string ('stage' or 'prod')\n * @param projectId - The unique identifier for the project\n * @returns The complete URL to view the project in Adobe Express\n */\nexport function createExpressProjectUrl(environment: 'stage' | 'prod', projectId: string): string {\n const baseUrls = getBaseUrlMap(environment);\n return `${baseUrls.EXPRESS_WEB}/your-stuff/projects/${projectId}`;\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { SAM } from '@ccx-public/component-types';\nimport DropdownButton from '@ccx-public/spectrum-wrapper/dist/DropdownButton';\nimport { MenuGroup, MenuItem } from '@ccx-public/spectrum-wrapper/dist/Menu';\nimport OverlayTrigger from '@ccx-public/spectrum-wrapper/dist/OverlayTrigger';\nimport Tooltip from '@ccx-public/spectrum-wrapper/dist/Tooltip';\nimport { constructAssetLink, openLink } from '@csc/adobe-assets-view';\nimport { getBaseUrlMap, useHostConfig } from '@csc/common';\nimport { isBrand, useLibraryList, useSAM } from '@csc/sam-utils';\nimport Brand from '@csc/ui/dist/src/Icons/Brand';\nimport CCLibrary from '@csc/ui/dist/src/Icons/CCLibrary';\nimport { observer } from 'mobx-react';\nimport React, { useMemo } from 'react';\nimport { useIntl, FormattedMessage } from 'react-intl';\n\nimport styles from './styles.module.css';\nimport { createExpressBrandUrl } from '../../utils/expressLinks';\n\nconst renderLibraryMenuItem = (item: SAM.AdobeAsset) => (\n <MenuItem\n className={styles.listItem}\n key={item.id}\n icon={isBrand(item) ? <Brand /> : <CCLibrary />}\n value={item.id}\n >\n {item.displayName}\n </MenuItem>\n);\n\nexport default observer(function LibrariesDropdown({ project }: { project: SAM.Project }) {\n const intl = useIntl();\n const { dispatchEvent, environment } = useHostConfig();\n const baseUrls = useMemo(() => getBaseUrlMap(environment), [environment]);\n const sam = useSAM();\n\n const allLibrariesAndBrandsList = useLibraryList({\n sortBy: 'name',\n sortDirection: 'ascending',\n loadAll: true,\n filterParams: {\n reference: SAM.LibraryReferenceFilter.All,\n project: project.id,\n },\n });\n\n const libraries = useMemo(\n () => allLibrariesAndBrandsList?.items.filter((item) => !isBrand(item)) || [],\n [allLibrariesAndBrandsList?.items],\n );\n const brands = useMemo(\n () =>\n allLibrariesAndBrandsList?.items.filter(\n (item) => isBrand(item) && !item.isReferencedByProject(project.id),\n ) || [],\n [allLibrariesAndBrandsList?.items, project.id],\n );\n const referencedBrands = useMemo(\n () =>\n allLibrariesAndBrandsList?.items.filter(\n (item) => isBrand(item) && item.isReferencedByProject(project.id),\n ) || [],\n [allLibrariesAndBrandsList?.items, project.id],\n );\n const totalCount = brands.length + libraries.length + referencedBrands.length;\n\n if (!totalCount) {\n return null;\n }\n\n const allItemsMap: Record<string, SAM.AdobeAsset> = (\n allLibrariesAndBrandsList?.items ?? []\n ).reduce(\n (acc, item) => {\n acc[item.id] = item;\n return acc;\n },\n {} as Record<string, SAM.AdobeAsset>,\n );\n\n return (\n <OverlayTrigger trigger=\"hover\" placement=\"top\">\n <DropdownButton\n label={intl.formatNumber(totalCount)}\n data-testid=\"project-libraries-dropdown\"\n icon={\n <CCLibrary\n aria-label={intl.formatMessage({\n id: '@ace/projects:projects.librariesBrands',\n defaultMessage: 'Libraries & brands',\n })}\n />\n }\n quiet\n alignRight\n onSelect={(id) => {\n const asset = allItemsMap[id];\n // The referenced brands check Asset.isReferencedByProject(projectID) is only reliable for brands populated from LibraryContext with project passed in the filter.\n // Keeping createExpressBrandUrl logic in projects package instead of constructAssetLink to prevent usage of Asset.isReferencedByProject outside its correct context.\n if (referencedBrands.some((brand) => brand.id === asset.id)) {\n openLink({\n url: createExpressBrandUrl(environment, asset.id),\n dispatchEvent,\n });\n } else {\n constructAssetLink({\n asset,\n baseUrls,\n locale: intl.locale,\n sam,\n })\n .then((url) => {\n openLink({\n url,\n dispatchEvent,\n });\n return undefined;\n })\n .catch((error) => {\n console.error('Error opening Adobe Asset:', error);\n });\n }\n }}\n >\n <div className={styles.librariesDropdown}>\n {!!brands.length && (\n <MenuGroup\n className={styles.listGroup}\n data-testid=\"project-brands-menu-group\"\n header={intl.formatMessage({\n id: '@ace/projects:projects.brands',\n defaultMessage: 'Brands',\n })}\n >\n {brands.map((item) => renderLibraryMenuItem(item))}\n </MenuGroup>\n )}\n\n {!!referencedBrands.length && (\n <MenuGroup\n className={styles.listGroup}\n data-testid=\"project-referenced-brands-menu-group\"\n header={intl.formatMessage({\n id: '@ace/projects:projects.linkedBrands',\n defaultMessage: 'Linked brands',\n })}\n >\n {referencedBrands.map((item) => renderLibraryMenuItem(item))}\n </MenuGroup>\n )}\n\n {!!libraries.length && (\n <MenuGroup\n className={styles.listGroup}\n data-testid=\"project-libraries-menu-group\"\n header={intl.formatMessage({\n id: '@ace/projects:projects.libraries',\n defaultMessage: 'Libraries',\n })}\n >\n {libraries.map((item) => renderLibraryMenuItem(item))}\n </MenuGroup>\n )}\n </div>\n </DropdownButton>\n <Tooltip slot=\"hover-content\" data-testid=\"project-libraries-dropdown-tooltip\">\n <FormattedMessage\n id=\"@ace/projects:projects.librariesBrands\"\n defaultMessage=\"Libraries & brands\"\n />\n </Tooltip>\n </OverlayTrigger>\n );\n});\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { AssetBrowser } from '@ccx-public/component-types';\nimport type { FilterOptionViewModel } from '@csc/adobe-assets-view/dist/src/components/TypeDropdownFilter/utils';\nimport { getTypeViewModel } from '@csc/adobe-assets-view/dist/src/components/TypeDropdownFilter/utils';\nimport { MIMETYPES } from '@csc/common';\nimport type { IntlShape } from 'react-intl';\n\n// TODO: https://jira.corp.adobe.com/browse/CCXCD-14231\n// This should return type FileFilterTypeValues from AssetBrowser\nexport const getProjectFilterTypes = (\n excludeMediaTypes: string[],\n): AssetBrowser.FileFilterTypeValues[] => {\n const includeBrandsAndLibraries = excludeMediaTypes.every(\n (mimeType) => mimeType !== MIMETYPES.LIBRARIES,\n );\n return [\n AssetBrowser.OtherFileTypeValues.AllFiles,\n AssetBrowser.AdobeFileTypeValues.Photoshop,\n AssetBrowser.AdobeFileTypeValues.Illustrator,\n AssetBrowser.AdobeFileTypeValues.Express,\n AssetBrowser.AdobeFileTypeValues.Concept,\n AssetBrowser.AdobeFileTypeValues.Acrobat,\n AssetBrowser.AdobeFileTypeValues.InDesign,\n AssetBrowser.AdobeFileTypeValues.Aero,\n AssetBrowser.AdobeFileTypeValues.XD,\n AssetBrowser.AdobeFileTypeValues.Squirrel,\n AssetBrowser.GenericFileTypeValues.Assets3d,\n ...(includeBrandsAndLibraries\n ? [\n AssetBrowser.LibrariesAndBrandsTypeValues.Libraries,\n AssetBrowser.LibrariesAndBrandsTypeValues.Brands,\n ]\n : []),\n AssetBrowser.GenericFileTypeValues.Images,\n AssetBrowser.GenericFileTypeValues.Videos,\n AssetBrowser.GenericFileTypeValues.Audio,\n ];\n};\n\nexport const getProjectsContentFilterOptions = ({\n excludeMediaTypes,\n intl,\n}: {\n excludeMediaTypes: string[];\n intl: IntlShape;\n}): FilterOptionViewModel[] => {\n const toViewModel = (type: AssetBrowser.FileFilterTypeValues) =>\n getTypeViewModel(intl, type, true);\n\n return getProjectFilterTypes(excludeMediaTypes).map(toViewModel);\n};\n\n/**\n * Decodes a filter string into a FileFilterTypeValues enum based on the Default set of file types\n * @param filter The filter string to decode\n * @returns The decoded filter or undefined if the filter is not found\n */\nexport const decodeFilter = (filter?: string, excludeMediaTypes: string[] = []) => {\n const fileTypes = getProjectFilterTypes(excludeMediaTypes);\n const index = fileTypes.findIndex((option) => {\n return option === filter;\n });\n return index !== -1 ? fileTypes[index] : undefined;\n};\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { AssetBrowser, SAM } from '@ccx-public/component-types';\nimport Badge from '@ccx-public/spectrum-wrapper/dist/Badge';\nimport Rule from '@ccx-public/spectrum-wrapper/dist/Rule';\nimport FileTypeFilter from '@csc/adobe-assets-view/dist/src/components/FileTypesFilter/FileTypesFilter';\nimport HeaderActionButton from '@csc/adobe-assets-view/dist/src/components/HeaderActionButton/HeaderActionButton';\nimport HeaderNavigation from '@csc/adobe-assets-view/dist/src/components/HeaderNavigation/HeaderNavigation';\nimport HeaderViewOptions from '@csc/adobe-assets-view/dist/src/components/HeaderViewOptions';\nimport type { FilterOptionViewModel } from '@csc/adobe-assets-view/dist/src/components/TypeDropdownFilter/utils';\nimport { useHostConfig } from '@csc/common';\nimport { useDirectCollaborators } from '@csc/sam-utils';\nimport { observer } from 'mobx-react';\nimport React, { useCallback } from 'react';\nimport { FormattedMessage, useIntl } from 'react-intl';\n\nimport styles from './styles.module.css';\nimport useHostExtendedConfig from '../../../hooks/useHostExtendedConfig';\nimport { ProjectViewLocations } from '../../../utils/ingest';\nimport { CollaboratorFacepile } from '../../Collaborators';\nimport LibrariesDropdown from '../../LibrariesDropdown';\nimport ProjectActionMenu from '../../ProjectActionMenu';\nimport ProjectInviteButton from '../../ProjectInviteButton';\nimport { NavigationEvent } from '../../withProviders/events/NavigationEvent';\nimport { getProjectsContentFilterOptions } from '../filter';\n\ninterface Props {\n project: SAM.Project;\n filter: AssetBrowser.FileFilterTypeValues;\n actionFilter?: (value: string) => boolean;\n hideFilter?: boolean;\n compatibleTypesFilter?: FilterOptionViewModel;\n}\nexport default observer(function Header({\n project,\n filter,\n actionFilter = () => true,\n hideFilter,\n compatibleTypesFilter,\n}: Props) {\n const collaborators = useDirectCollaborators(project);\n const intl = useIntl();\n const { dispatchEvent } = useHostConfig();\n const { excludeMediaTypes = [], supportLibraryDropdown } = useHostExtendedConfig();\n const navigateBackToProjects = useCallback(\n () => dispatchEvent(new NavigationEvent({ name: AssetBrowser.ContentViewType.Projects })),\n [dispatchEvent],\n );\n const canEdit = project.hasPermission(SAM.Permission.Write);\n const isShareProjectActionAllowed = actionFilter('share-project');\n const filterOptions = getProjectsContentFilterOptions({ excludeMediaTypes, intl });\n\n return (\n <>\n <div className={styles.headerUpper}>\n <div className={styles.headerUpperLeft}>\n <HeaderNavigation\n rootAsset={project}\n rootTitle={intl.formatMessage({\n id: '@ace/projects:heading.name',\n defaultMessage: 'Projects',\n })}\n />\n </div>\n\n <div className={styles.headerUpperRight}>\n {isShareProjectActionAllowed && (\n <CollaboratorFacepile collaborators={collaborators} />\n )}\n {!canEdit && (\n <Badge variant=\"neutral\">\n <FormattedMessage\n id=\"@ace/projects:project.badge.commentOnly\"\n defaultMessage=\"Comment only\"\n />\n </Badge>\n )}\n {isShareProjectActionAllowed && (\n <>\n <ProjectInviteButton\n project={project}\n quiet\n variant=\"action\"\n viewLocation={ProjectViewLocations.ProjectContents}\n />\n\n <Rule\n vertical\n variant=\"small\"\n className={styles.headerUpperRightDivider}\n />\n </>\n )}\n\n {canEdit && <HeaderActionButton />}\n <ProjectActionMenu\n project={project}\n onDestructiveActionSuccess={navigateBackToProjects}\n viewLocation={ProjectViewLocations.ProjectContents}\n actionFilter={actionFilter}\n />\n </div>\n </div>\n <div className={styles.headerLower}>\n <div>\n {!hideFilter && (\n <FileTypeFilter\n filterValue={filter}\n compatibleTypesFilter={compatibleTypesFilter}\n filterOptions={filterOptions}\n />\n )}\n </div>\n <div className={styles.headerLowerRight}>\n {supportLibraryDropdown && <LibrariesDropdown project={project} />}\n <HeaderViewOptions />\n </div>\n </div>\n </>\n );\n});\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { AssetBrowser } from '@ccx-public/component-types';\nimport Button from '@ccx-public/spectrum-wrapper/dist/Button';\nimport { useHostConfig } from '@csc/common';\nimport React from 'react';\nimport { useIntl } from 'react-intl';\n\nimport { NavigationEvent } from '../withProviders/events/NavigationEvent';\n\nconst ShowAllFilesButton = ({ projectId, assetId }: { projectId: string; assetId?: string }) => {\n const intl = useIntl();\n const { dispatchEvent } = useHostConfig();\n return (\n <Button\n key=\"allFilesButton\"\n quiet\n variant=\"primary\"\n treatment=\"fill\"\n onClick={() => {\n dispatchEvent(\n new NavigationEvent({\n name: AssetBrowser.ContentViewType.Project,\n params: {\n projectId,\n assetId: assetId ?? undefined,\n filter: AssetBrowser.FileFilterTypeValues.AllFiles,\n },\n }),\n );\n }}\n label={intl.formatMessage({\n id: '@ace/projects:project.empty.filter.button.showAll',\n defaultMessage: 'Show all',\n })}\n data-testid=\"allFilesButton\"\n />\n );\n};\n\nexport default ShowAllFilesButton;\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { SAM } from '@ccx-public/component-types';\nimport Button from '@ccx-public/spectrum-wrapper/dist/Button';\nimport DropdownButton from '@ccx-public/spectrum-wrapper/dist/DropdownButton';\nimport IconMore from '@ccx-public/spectrum-wrapper/dist/Icon/More';\nimport { MenuDivider, MenuItem } from '@ccx-public/spectrum-wrapper/dist/Menu';\nimport OverlayTrigger from '@ccx-public/spectrum-wrapper/dist/OverlayTrigger';\nimport Rule from '@ccx-public/spectrum-wrapper/dist/Rule';\nimport Tooltip from '@ccx-public/spectrum-wrapper/dist/Tooltip';\nimport { openLink } from '@csc/adobe-assets-view';\nimport { useHostConfig, useMobile } from '@csc/common';\nimport { isBrand, useLibraryList } from '@csc/sam-utils';\nimport Heading from '@csc/ui/dist/src/Heading/Heading';\nimport IconBrand from '@csc/ui/dist/src/Icons/Brand';\nimport CCLibrary from '@csc/ui/dist/src/Icons/CCLibrary';\nimport ResponsiveVisibilityWrapper from '@csc/ui/dist/src/ResponsiveVisibilityWrapper/ResponsiveVisibilityWrapper';\nimport { observer } from 'mobx-react';\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { FormattedMessage, useIntl } from 'react-intl';\n\nimport styles from './styles.module.css';\nimport { useLinkedBrandClickAnalytics } from '../../hooks/useAnalytics';\nimport { createExpressBrandUrl, createExpressProjectUrl } from '../../utils/expressLinks';\n\nfunction useResponsiveBrandDisplay(brands: SAM.AdobeAsset[], limit: number, isMobile: boolean) {\n const effectiveLimit = useMemo(() => (isMobile ? 1 : limit), [isMobile, limit]);\n\n const [visibilityMap, setVisibilityMap] = useState<Record<string, boolean>>(() => {\n const initialMap: Record<string, boolean> = {};\n brands.slice(0, effectiveLimit).forEach((brand) => {\n initialMap[brand.id] = true;\n });\n return initialMap;\n });\n\n useEffect(() => {\n // Seed the visibility map with the initial brands\n setVisibilityMap((prev) => {\n const newMap: Record<string, boolean> = {};\n brands.slice(0, effectiveLimit).forEach((brand) => {\n // Preserve existing visibility state if available, otherwise default to true\n newMap[brand.id] = prev[brand.id] ?? true;\n });\n return newMap;\n });\n }, [brands, effectiveLimit]);\n\n const visibleBrands = useMemo(() => {\n return brands.slice(0, effectiveLimit);\n }, [brands, effectiveLimit]);\n\n const visibleCount = useMemo(() => {\n return Object.values(visibilityMap).filter(Boolean).length;\n }, [visibilityMap]);\n\n const overflowBrands = useMemo(() => {\n if (isMobile) {\n return brands.slice(1);\n } else {\n const hiddenCount = brands.length - visibleCount;\n return brands.slice(brands.length - hiddenCount);\n }\n }, [brands, visibleCount, isMobile]);\n\n const handleVisibilityChange = useCallback((id: string, visible: boolean) => {\n setVisibilityMap((prev) => {\n if (prev[id] === visible) {\n return prev;\n }\n return { ...prev, [id]: visible };\n });\n }, []);\n\n return {\n visibleBrands,\n overflowBrands,\n handleVisibilityChange,\n };\n}\n\nfunction BrandOverflowDropdown({\n overflowBrands,\n onBrandSelect,\n onViewAllInExpress,\n showViewAll,\n}: {\n overflowBrands: SAM.AdobeAsset[];\n onBrandSelect: (assetId: string) => void;\n onViewAllInExpress: () => void;\n showViewAll: boolean;\n}) {\n const intl = useIntl();\n\n if (overflowBrands.length === 0 && !showViewAll) {\n return null;\n }\n\n return (\n <div className={styles.moreCount}>\n <OverlayTrigger trigger={['hover']} placement=\"top\">\n <DropdownButton\n aria-label={intl.formatMessage({\n id: '@ace/projects:linkedBrands.more',\n defaultMessage: 'More linked brands',\n })}\n data-testid=\"linked-brands-dropdown\"\n icon={<IconMore />}\n quiet\n onSelect={(id) => {\n if (id === 'viewAllInExpress') {\n onViewAllInExpress();\n return;\n }\n onBrandSelect(id);\n }}\n >\n {overflowBrands.map((brand) => (\n <MenuItem\n key={brand.id}\n icon={isBrand(brand) ? <IconBrand /> : <CCLibrary />}\n data-testid={`linked-brand-dropdown-item-${brand.id}`}\n value={brand.id}\n >\n {brand.displayName}\n </MenuItem>\n ))}\n {overflowBrands.length > 0 && showViewAll && <MenuDivider />}\n {showViewAll && (\n <MenuItem\n data-testid=\"linked-brand-dropdown-view-all\"\n value=\"viewAllInExpress\"\n >\n <FormattedMessage\n id=\"@ace/projects:linkedBrands.viewAllInExpress\"\n defaultMessage=\"View all in Adobe Express\"\n />\n </MenuItem>\n )}\n </DropdownButton>\n <Tooltip slot=\"hover-content\" data-testid=\"project-libraries-dropdown-tooltip\">\n <FormattedMessage\n id=\"@ace/projects:linkedBrands.more\"\n defaultMessage=\"More linked brands\"\n />\n </Tooltip>\n </OverlayTrigger>\n </div>\n );\n}\n\nexport default observer(function LinkedBrands({\n projectId,\n limit = 4,\n}: {\n projectId: string;\n limit?: number;\n}) {\n const { environment, userId, dispatchEvent } = useHostConfig();\n const isMobile = useMobile();\n const sendBrandAnalytics = useLinkedBrandClickAnalytics();\n\n const referencedBrandsFilterParams = useMemo(\n () => ({\n project: projectId,\n roles: [SAM.LibraryRolesFilter.Brand],\n reference: SAM.LibraryReferenceFilter.Only,\n }),\n [projectId],\n );\n\n const brandsLibrariesList = useLibraryList({\n sortBy: 'name',\n sortDirection: 'ascending',\n filterParams: referencedBrandsFilterParams,\n loadAll: true,\n });\n\n const brands = useMemo(() => brandsLibrariesList?.items ?? [], [brandsLibrariesList?.items]);\n\n const { visibleBrands, overflowBrands, handleVisibilityChange } = useResponsiveBrandDisplay(\n brands,\n limit,\n isMobile,\n );\n\n const handleAnyBrandSelect = useCallback(\n (assetId: string) => {\n const brand = brands.find((b) => b.id === assetId);\n if (brand) {\n const expressUrl = createExpressBrandUrl(environment, brand.id);\n\n sendBrandAnalytics({\n brand,\n projectId,\n subtype: 'open',\n userId,\n });\n\n openLink({\n url: expressUrl,\n dispatchEvent,\n });\n }\n },\n [brands, environment, projectId, sendBrandAnalytics, userId, dispatchEvent],\n );\n\n // TODO: https://jira.corp.adobe.com/browse/CCPROJ-13160 - add queryparam to show ref brands on project 1up in express\n const handleViewAllInExpress = useCallback(() => {\n const expressProjectUrl = createExpressProjectUrl(environment, projectId);\n openLink({\n url: expressProjectUrl,\n dispatchEvent,\n });\n }, [environment, projectId, dispatchEvent]);\n\n if (brands.length === 0) {\n return null;\n }\n\n const showDropdown = isMobile || overflowBrands.length > 0;\n const showViewAllButton = overflowBrands.length === 0 && !isMobile;\n\n return (\n <div className={styles.linkedBrands}>\n <Heading level=\"4\" size=\"xs\">\n <FormattedMessage\n id=\"@ace/projects:linkedBrands.title\"\n defaultMessage=\"Linked Brands\"\n />\n </Heading>\n\n <div className={styles.brandList}>\n <div className={styles.brandItems}>\n {visibleBrands.map((brand) => (\n <ResponsiveVisibilityWrapper\n key={brand.id}\n onVisibilityChange={(visible: boolean) =>\n handleVisibilityChange(brand.id, visible)\n }\n >\n <Button\n variant=\"tool\"\n data-testid={`linked-brand-button-${brand.id}`}\n quiet\n icon={<IconBrand />}\n label={brand.displayName}\n role=\"button\"\n onClick={() => handleAnyBrandSelect(brand.id)}\n />\n </ResponsiveVisibilityWrapper>\n ))}\n\n {showViewAllButton && (\n <Button\n data-testid=\"linked-brand-button-view-all\"\n quiet\n variant=\"tool\"\n onClick={handleViewAllInExpress}\n >\n <FormattedMessage\n id=\"@ace/projects:linkedBrands.viewAllInExpress\"\n defaultMessage=\"View all in Adobe Express\"\n />\n </Button>\n )}\n </div>\n\n {showDropdown && (\n <BrandOverflowDropdown\n overflowBrands={overflowBrands}\n onBrandSelect={handleAnyBrandSelect}\n onViewAllInExpress={handleViewAllInExpress}\n showViewAll\n />\n )}\n </div>\n\n <Rule variant=\"small\" />\n </div>\n );\n});\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { AssetBrowser, SAM } from '@ccx-public/component-types';\nimport Add from '@ccx-public/spectrum-wrapper/dist/Icon/Add';\nimport Wait from '@ccx-public/spectrum-wrapper/dist/Wait';\nimport AdobeAssetsView from '@csc/adobe-assets-view/dist/src/components/AdobeAssetsView/AdobeAssetsView';\nimport HeaderActionButton from '@csc/adobe-assets-view/dist/src/components/HeaderActionButton/HeaderActionButton';\nimport type { HeaderNavigationProps } from '@csc/adobe-assets-view/dist/src/components/HeaderNavigation/HeaderNavigation';\nimport { getTypeViewModel } from '@csc/adobe-assets-view/dist/src/components/TypeDropdownFilter/utils';\nimport type { ViewOptionsButtonProps } from '@csc/adobe-assets-view/dist/src/components/ViewOptionsButton/ViewOptionsButton';\nimport { useCompatibleTypesFilter } from '@csc/adobe-assets-view/dist/src/hooks/useCompatibleTypesFilter';\nimport EmptyCloudDocs from '@csc/adobe-assets-view/dist/src/svgs/EmptyCloudDocs';\nimport type BackedCollectionItem from '@csc/adobe-assets-view/dist/src/types/BackedCollectionItem';\nimport { constructIFilter } from '@csc/adobe-assets-view/dist/src/utils/filtering-utils/filtering-utils';\nimport AAVIngest, { AAVComponentId, Metrics } from '@csc/adobe-assets-view/dist/src/utils/ingest';\nimport { Workflow } from '@csc/adobe-assets-view/dist/src/utils/metrics/aav-metrics';\nimport { PROJECTCONTENTS_SUBCATEGORY } from '@csc/adobe-assets-view/dist/src/utils/metrics/projects-aav-metrics';\nimport { openAdobeAsset, ClickSource } from '@csc/adobe-assets-view/dist/src/utils/open-event';\nimport {\n type IEmptyProps,\n type IOnSelectionChange,\n type ISelectionBehavior,\n type ISelectionManager,\n type ICollectionViewMetrics,\n EventType,\n} from '@csc/collection-view';\nimport { getBaseUrlMap, useHostConfig, useOnline } from '@csc/common';\nimport { useAsset, useAssetList, useProject, useSAM, useAdobeAssetFilter } from '@csc/sam-utils';\nimport { observer } from 'mobx-react';\nimport React, { useCallback, useEffect, useMemo } from 'react';\nimport { useIntl } from 'react-intl';\n\nimport ProjectContentsErrorState from './ErrorState';\nimport Header from './Header';\nimport ShowAllFilesButton from './ShowAllFilesButton';\nimport { decodeFilter, getProjectsContentFilterOptions } from './filter';\nimport styles from './styles.module.css';\nimport useProjectContentActions from './useProjectContentActions';\nimport ProjectContext from '../../contexts/ProjectContext';\nimport useHostExtendedConfig from '../../hooks/useHostExtendedConfig';\nimport { useLoadPerformance } from '../../hooks/usePerformance';\nimport useRefreshListOnResume from '../../hooks/useRefreshListOnResume';\nimport type { OrganizerConfig } from '../../organizerConfig';\nimport LinkedBrands from '../LinkedBrands';\nimport EmptyProjectIllustrationSpectrum from '../ProjectList/EmptyState/EmptyProjectIllustrationSpectrum';\nimport ProjectListOfflineState from '../ProjectList/OfflineState';\nimport { NavigationEvent } from '../withProviders/events/NavigationEvent';\n\nexport const DEFAULT_PROJECT_CONTENTS_CONFIG: Pick<\n OrganizerConfig,\n 'sortBy' | 'sortDirection' | 'view'\n> & {\n filter: AssetBrowser.FileFilterTypeValues;\n} = {\n view: 'grid',\n sortBy: 'modifiedDate',\n sortDirection: 'desc',\n filter: AssetBrowser.FileFilterTypeValues.AllFiles,\n};\n\nfunction useProjectEmptyViews(\n hideEmptyViewActions: boolean, // hide the CTAs in the empty view (i.e UAP)\n filter: AssetBrowser.FileFilterTypeValues,\n project?: SAM.Project,\n asset?: SAM.AdobeAsset,\n): IEmptyProps | undefined {\n const intl = useIntl();\n\n return useMemo(() => {\n if (!project) {\n return undefined;\n }\n\n const metrics = Metrics[AAVComponentId.PROJECTS] as unknown as ICollectionViewMetrics;\n\n // start with folder empty states\n if (asset) {\n const image = <EmptyCloudDocs />;\n\n // empty filter or all files filter applied\n if (!filter || filter === AssetBrowser.FileFilterTypeValues.AllFiles) {\n return {\n image,\n titleId: intl.formatMessage({\n id: '@ace/projects:project.empty.title',\n defaultMessage: 'No files to show',\n }),\n metrics,\n renderEventMetricSubtype: 'empty-project-folder',\n ingestSubcategory: PROJECTCONTENTS_SUBCATEGORY,\n };\n }\n // filter applied\n return {\n image,\n titleId: intl.formatMessage({\n id: '@ace/projects:project.empty.filter.title',\n defaultMessage: 'No compatible files to show',\n }),\n customButtons: [\n <ShowAllFilesButton\n key=\"showAllFilesButton\"\n projectId={project.id}\n assetId={asset.id}\n />,\n ],\n metrics,\n renderEventMetricSubtype: 'empty-project-folder-filtered',\n ingestSubcategory: PROJECTCONTENTS_SUBCATEGORY,\n };\n } else {\n // Project root empty state\n const image = <EmptyProjectIllustrationSpectrum />;\n\n // comment only empty state\n if (!project.hasPermission(SAM.Permission.Write)) {\n return {\n image,\n titleId: intl.formatMessage({\n id: '@ace/projects:project.empty.filter.all.title.commentOnly',\n defaultMessage: 'There aren’t files to comment on—yet',\n }),\n customButtons:\n !filter || filter === AssetBrowser.FileFilterTypeValues.AllFiles\n ? undefined\n : [\n <ShowAllFilesButton\n key=\"showAllFilesButton\"\n projectId={project.id}\n />,\n ],\n metrics,\n renderEventMetricSubtype: 'empty-project-comment-only',\n ingestSubcategory: PROJECTCONTENTS_SUBCATEGORY,\n };\n }\n // default project empty state\n return {\n image,\n titleId: intl.formatMessage({\n id: '@ace/projects:project.empty.filter.all.title',\n defaultMessage: 'Keep all your files together in a project',\n }),\n customButtons: hideEmptyViewActions\n ? undefined\n : [<HeaderActionButton key=\"header-action-button\" icon={<Add size=\"S\" />} />],\n metrics,\n renderEventMetricSubtype: 'empty-project-root',\n ingestSubcategory: PROJECTCONTENTS_SUBCATEGORY,\n };\n }\n }, [asset, filter, hideEmptyViewActions, intl, project]);\n}\n\nexport default observer(function ProjectContents({\n assetId,\n launchUAP,\n projectId,\n actionFilter,\n hideActionToolbar,\n hideEmptyViewActions,\n hideFilter,\n onSelectionChange,\n selectionManager,\n selectionBehavior,\n filter,\n sortBy = DEFAULT_PROJECT_CONTENTS_CONFIG.sortBy,\n sortDirection = DEFAULT_PROJECT_CONTENTS_CONFIG.sortDirection,\n view = DEFAULT_PROJECT_CONTENTS_CONFIG.view,\n onBeforeItemClicked,\n shouldRenderItemAsDisabled,\n routeId,\n header: HeaderComponent,\n compatibleTypes,\n}: Pick<Partial<OrganizerConfig>, 'sortBy' | 'sortDirection' | 'view'> & {\n assetId?: string;\n routeId?: string;\n filter?: string;\n launchUAP: (...args) => Promise<{\n destination: string;\n destinationAsset: AssetBrowser.AssetDescriptor;\n }>;\n projectId: string;\n hideActionToolbar?: boolean;\n // To hide all actions, primarily under the '+ Add' button in the empty view\n // within the illustrated message area. Used for Move UAP, for example.\n hideEmptyViewActions?: boolean;\n hideFilter?: boolean;\n actionFilter?: (value: string) => boolean;\n selectionManager?: ISelectionManager;\n selectionBehavior?: ISelectionBehavior;\n onSelectionChange?: IOnSelectionChange;\n onBeforeItemClicked?: (item: BackedCollectionItem<SAM.AdobeAsset>) => boolean;\n shouldRenderItemAsDisabled?: (\n element: BackedCollectionItem<SAM.AdobeAsset>,\n ) => Promise<boolean>;\n header?: React.FC<HeaderNavigationProps & Partial<ViewOptionsButtonProps>>;\n compatibleTypes?: string[];\n}) {\n const hostConfig = useHostConfig();\n const sam = useSAM();\n const { excludeMediaTypes, supportLinkedBrands } = useHostExtendedConfig();\n const compatibleTypesFilter = useCompatibleTypesFilter(compatibleTypes, true);\n const { dispatchEvent, environment } = hostConfig;\n const { project, error, loading } = useProject(projectId, {\n updateLastAccessed: true,\n });\n\n const isCSCProject = project?.directorySubtype === SAM.ProjectDirectorySubtype.WF_PROJECT;\n const loaded = useLoadPerformance('ProjectContents');\n const asset = useAsset(assetId);\n const intl = useIntl();\n const isOnline = useOnline();\n const currentAsset = asset || project;\n const currentFilter: AssetBrowser.FileFilterTypeValues = useMemo(() => {\n const defaultFilter = compatibleTypesFilter\n ? compatibleTypesFilter.value\n : DEFAULT_PROJECT_CONTENTS_CONFIG.filter;\n return decodeFilter(filter, excludeMediaTypes) ?? defaultFilter;\n }, [filter, compatibleTypesFilter, excludeMediaTypes]);\n\n const emptyViewProps = useProjectEmptyViews(\n hideEmptyViewActions ?? false,\n currentFilter,\n project,\n asset,\n );\n const clientSideFilters = useMemo(() => {\n if (currentFilter === AssetBrowser.FileFilterTypeValues.AllFiles) {\n return [];\n }\n const filterViewModel =\n compatibleTypesFilter ?? getTypeViewModel(intl, currentFilter, true);\n return [\n constructIFilter({\n filter: filterViewModel.filter,\n getFilterEmptyProps: emptyViewProps ? () => emptyViewProps : undefined,\n }),\n ];\n }, [currentFilter, emptyViewProps, intl, compatibleTypesFilter]);\n\n // Used to filter actions for the asset action menus\n const extendedAssetActionFilter = useCallback(\n (value: string): boolean => {\n if (isCSCProject) {\n switch (value) {\n case 'copy-link':\n case 'discard':\n case 'duplicate':\n case 'rename':\n case 'open':\n case 'create':\n return actionFilter?.(value) ?? true;\n default:\n return false;\n }\n }\n return actionFilter?.(value) ?? true;\n },\n [actionFilter, isCSCProject],\n );\n\n // Used to filter project-level actions in the project header\n const extendedProjectActionFilter = useCallback(\n (value: string): boolean => {\n if (isCSCProject) {\n switch (value) {\n case 'workfront-open':\n case 'copy-link-project':\n return actionFilter?.(value) ?? true;\n default:\n return false;\n }\n }\n return actionFilter?.(value) ?? true;\n },\n [actionFilter, isCSCProject],\n );\n\n const samFilter = useAdobeAssetFilter({\n filterType: 'AdobeAssetFilter',\n params: { excludeMediaTypes },\n });\n\n const list = useAssetList({\n samFilter,\n source: currentAsset?.children,\n sortBy: sortBy === 'modifiedDate' ? 'modified' : 'name',\n sortDirection: sortDirection === 'desc' ? 'descending' : 'ascending',\n loadAll: true,\n });\n\n useRefreshListOnResume(list);\n\n const baseUrls = useMemo(() => getBaseUrlMap(environment), [environment]);\n\n const actions = useProjectContentActions({\n launchUAP,\n parentFolder: currentAsset,\n actionFilter: extendedAssetActionFilter,\n project,\n assetList: list,\n compatibleTypes,\n });\n\n const handleViewOptionsChange = useCallback(\n (viewOptions: AssetBrowser.ViewOptions) => {\n // Navigate to the Projects view if the assetId is empty\n if (viewOptions.assetId === '') {\n dispatchEvent(new NavigationEvent({ name: AssetBrowser.ContentViewType.Projects }));\n return;\n }\n\n const isNavigatingToProjectRoot = viewOptions.assetId === projectId;\n // unset assetId if navigating to project root\n const assetIdUpdated = isNavigatingToProjectRoot\n ? undefined\n : viewOptions.assetId || assetId;\n\n const updatedOptions = {\n assetId: assetIdUpdated,\n projectId,\n sortBy:\n (viewOptions.sortBy &&\n (viewOptions.sortBy === 'modifiedDate' ? 'modifiedDate' : 'title')) ||\n sortBy,\n sortDir: viewOptions.sortDir || sortDirection,\n // @deprecated - use sortDir instead\n sortDirection: viewOptions.sortDir || sortDirection,\n // @deprecated - use viewMode instead\n view: viewOptions.viewMode || view,\n viewMode: viewOptions.viewMode || view,\n filter: viewOptions.filter || currentFilter,\n routeId: viewOptions.routeId,\n };\n Metrics[AAVComponentId.PROJECTS].fireEvent({\n event: {\n subcategory: PROJECTCONTENTS_SUBCATEGORY,\n workflow: Workflow.Navigation,\n type: EventType.Click,\n },\n ui: {\n sort_order: updatedOptions.sortDir,\n sort_sequence: updatedOptions.sortBy,\n view: updatedOptions.viewMode,\n filter: updatedOptions.filter,\n },\n });\n dispatchEvent(\n new NavigationEvent({\n name: AssetBrowser.ContentViewType.Project,\n params: updatedOptions,\n }),\n );\n },\n [assetId, currentFilter, dispatchEvent, projectId, sortBy, sortDirection, view],\n );\n\n const onRouted = useCallback(() => {\n // RouteId lets the AAV view scroll to and select the asset. We must reset the routeId\n // after routing by dispatching a new navigation event with undefined routeId, so that\n // when the same routeId is navigated to again, the view will re-render and route properly.\n handleViewOptionsChange({ routeId: undefined });\n return Promise.resolve();\n }, [handleViewOptionsChange]);\n\n // Initialize AAVIngest for ProjectContents\n useEffect(() => {\n new AAVIngest(AAVComponentId.PROJECTS, hostConfig);\n }, [hostConfig]);\n\n useEffect(() => {\n if (project) {\n loaded();\n }\n }, [project, loaded]);\n\n if (!isOnline) {\n return <ProjectListOfflineState />;\n }\n\n if (error || (project && project.isDiscarded)) {\n return <ProjectContentsErrorState isDiscarded={project?.isDiscarded} error={error} />;\n }\n\n if (loading || !project || list === undefined) {\n return (\n <div className={styles.loadingSpinner} data-testid=\"project-contents-loading\">\n <Wait size=\"L\" />\n </div>\n );\n }\n\n return (\n <ProjectContext.Provider value={project}>\n <AdobeAssetsView\n componentId={AAVComponentId.PROJECTS}\n ingestSubcategory={PROJECTCONTENTS_SUBCATEGORY}\n actions={actions}\n asset={currentAsset}\n // SAM list must be fully loaded before setting routeId to ensure\n // routeId properly resolves to an asset within the list\n routeId={list.status === SAM.AssetListStatus.ReadyFullyLoaded ? routeId : undefined}\n hideActionToolbar={hideActionToolbar}\n list={list}\n filters={clientSideFilters}\n selectionManager={selectionManager}\n selectionBehavior={selectionBehavior}\n onSelectionChange={onSelectionChange}\n sortBy={sortBy}\n sortDir={sortDirection}\n viewMode={view}\n onViewOptionsChange={handleViewOptionsChange}\n onBeforeItemClicked={onBeforeItemClicked}\n header={\n HeaderComponent ? (\n <HeaderComponent\n rootAsset={project}\n rootTitle={intl.formatMessage({\n id: '@ace/projects:heading.name',\n defaultMessage: 'Projects',\n })}\n showRootBackButton={false}\n filterOptions={getProjectsContentFilterOptions({\n excludeMediaTypes: excludeMediaTypes || [],\n intl,\n })}\n currentFilter={currentFilter}\n />\n ) : (\n <>\n <Header\n project={project}\n actionFilter={extendedProjectActionFilter}\n filter={currentFilter}\n hideFilter={hideFilter}\n compatibleTypesFilter={compatibleTypesFilter}\n />\n {supportLinkedBrands && currentAsset?.isProject && (\n <LinkedBrands projectId={projectId} />\n )}\n </>\n )\n }\n getEmptyViewProps={emptyViewProps ? () => emptyViewProps : undefined}\n shouldRenderItemAsDisabled={shouldRenderItemAsDisabled}\n launchItems={async (items) => {\n const backedItems = items as BackedCollectionItem<SAM.AdobeAsset>[];\n\n for (const item of backedItems) {\n const asset = item.backingItem;\n await openAdobeAsset({\n asset,\n baseUrls,\n dispatchEvent,\n locale: intl.locale,\n source: ClickSource.Asset,\n sam,\n });\n }\n }}\n onRouted={onRouted}\n />\n </ProjectContext.Provider>\n );\n});\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport type { SAM } from '@ccx-public/component-types';\nimport { AssetBrowser } from '@ccx-public/component-types';\nimport {\n createAddFolderAction,\n createCopyLinkAction,\n createShareAction,\n createDiscardAction,\n createDuplicateAction,\n createMoveAction,\n createMoveFromAction,\n createOpenAction,\n createRenameAction,\n createNewLibraryAction,\n createLeaveAction,\n createReportAbuseAction,\n createRemoveLibraryAction,\n createAddLibraryAction,\n createExportAction,\n checkAllowedAssetsBeforeOp,\n createImportAction,\n createAddToBoardAction,\n} from '@csc/adobe-assets-view';\nimport { ActionAnalyticsValue } from '@csc/adobe-assets-view/dist/src/stores/AAVOperationStore';\nimport type BackedCollectionItem from '@csc/adobe-assets-view/dist/src/types/BackedCollectionItem';\nimport { AAVComponentId, Metrics } from '@csc/adobe-assets-view/dist/src/utils/ingest';\nimport aavRenameCallbacks from '@csc/adobe-assets-view/dist/src/utils/metrics/aav-rename-callbacks';\nimport type { Action } from '@csc/collection-view';\nimport type { LaunchUAPType } from '@csc/common';\nimport { getBaseUrlMap, useHostConfig, useMobile, useDocumentCallbacks } from '@csc/common';\nimport { useSAM } from '@csc/sam-utils';\nimport { useMemo, useRef } from 'react';\nimport { useIntl } from 'react-intl';\n\nimport { useProjectActionAnalytics } from '../../hooks/useAnalytics';\nimport useHostExtendedConfig from '../../hooks/useHostExtendedConfig';\nimport { usePerformance } from '../../hooks/usePerformance';\nimport { ProjectViewLocations } from '../../utils/ingest';\nimport { useFeatureFlagValue } from '../withProviders/useFeatureFlagValue';\n\nexport type Options = {\n launchUAP: LaunchUAPType;\n parentFolder?: SAM.AdobeAsset;\n actionFilter?: (value: string) => boolean;\n project?: SAM.Project;\n assetList?: SAM.GenericAssetList;\n compatibleTypes?: string[];\n};\n\nconst useRenameCallbacks = () => {\n const perf = usePerformance();\n const trackProjectAction = useProjectActionAnalytics();\n\n const perfTracker = useRef<undefined | { finish: () => void }>();\n\n return useMemo(() => {\n const renameEvent = (\n element: SAM.AdobeAsset,\n values: { type: string; subtype: string; sequence?: string; error?: Error },\n ) => {\n trackProjectAction({\n element,\n subcategory: ProjectViewLocations.ProjectContents,\n pagename: 'rename',\n ...values,\n });\n };\n\n const metricLogger = Metrics[AAVComponentId.PROJECTS]?.getOperationalMetricLogger(\n ActionAnalyticsValue.Rename,\n );\n\n return {\n onCancel: (element: SAM.AdobeAsset) => {\n renameEvent(element, { type: 'click', subtype: 'rename-cancel' });\n aavRenameCallbacks(metricLogger).onCancel(element);\n },\n onConfirm: (element: SAM.AdobeAsset) => {\n perfTracker.current = { finish: perf.startMeasure('RenameAsset') };\n renameEvent(element, { type: 'click', subtype: 'rename-confirm' });\n aavRenameCallbacks(metricLogger).onConfirm(element);\n },\n onConflict: (element: SAM.AdobeAsset) => {\n renameEvent(element, { type: 'click', subtype: 'conflict' });\n aavRenameCallbacks(metricLogger).onConflict(element);\n },\n onError: (error: Error, element: SAM.AdobeAsset) => {\n renameEvent(element, {\n type: 'error',\n subtype: 'rename',\n sequence: 'toast',\n error,\n });\n aavRenameCallbacks(metricLogger).onError(error, element);\n },\n onSuccess: (element: SAM.AdobeAsset) => {\n perfTracker.current?.finish();\n renameEvent(element, { type: 'success', subtype: 'rename', sequence: 'toast' });\n aavRenameCallbacks(metricLogger).onSuccess(element);\n },\n };\n }, [perf, trackProjectAction]);\n};\n\nexport const userIsProjectCreator = (userId: string, parentFolder?: SAM.AdobeAsset) => {\n return parentFolder?.createdBy === userId;\n};\n\nexport default function useProjectContentActions({\n parentFolder,\n actionFilter = () => true,\n launchUAP,\n assetList,\n compatibleTypes,\n}: Options): Action<BackedCollectionItem<SAM.AdobeAsset>>[] {\n const intl = useIntl();\n const sam = useSAM();\n const { hostAssetContext, projectContext } = sam;\n const hostConfig = useHostConfig();\n const { supportCreateLibrary } = useHostExtendedConfig();\n const { closeModal, dispatchEvent, environment, showModal, showToast, routes } = hostConfig;\n const isMobile = useMobile();\n const baseUrls = useMemo(() => getBaseUrlMap(environment), [environment]);\n const renameCallbacks = useRenameCallbacks();\n const supportProjectContentsExport = useFeatureFlagValue('enableProjectContentsExport');\n const supportsUpload = useFeatureFlagValue('projectsUploadSupport');\n const supportsAddToBoard = useFeatureFlagValue('enableAddToBoard');\n const {\n getOpenCloudDocuments,\n onBeforeRename,\n onBeforeMove,\n onBeforeDelete,\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- TODO: Use method from DocumentCallbacks\n promptUserForFileImport,\n // eslint-disable-next-line @typescript-eslint/no-deprecated -- TODO: Use method from DocumentCallbacks\n importFiles,\n } = useDocumentCallbacks();\n\n const perf = usePerformance();\n const perfTracker = useRef<undefined | { finish: () => void }>();\n\n const { excludeMediaTypes } = useHostExtendedConfig();\n const isCreator = userIsProjectCreator(hostConfig.imsData.userId, parentFolder);\n\n return useMemo(() => {\n const actions = [\n supportsUpload &&\n parentFolder &&\n createImportAction({\n parentFolder,\n intl,\n showToast,\n samList: assetList ?? ([] as unknown as SAM.GenericAssetList),\n callbacks: {\n promptUserForFileImport,\n importFiles,\n },\n }),\n isCreator &&\n createMoveFromAction({\n getAssetWithCloudID: (id: string) =>\n sam.hostAssetContext.getAssetWithCloudID(id),\n getCurrentlyOpenAssets: getOpenCloudDocuments,\n intl,\n launchUAP,\n showToast,\n showModal,\n metricLogger: Metrics[AAVComponentId.PROJECTS].getOperationalMetricLogger(\n ActionAnalyticsValue.Move,\n ),\n destinationAsset: parentFolder as SAM.AdobeAsset,\n excludeMediaTypes,\n compatibleTypes,\n }),\n createAddFolderAction({\n closeModal,\n intl,\n parentFolder,\n showModal,\n showToast,\n metricLogger: Metrics[AAVComponentId.PROJECTS].getOperationalMetricLogger(\n ActionAnalyticsValue.AddFolder,\n ),\n }),\n supportCreateLibrary &&\n parentFolder &&\n parentFolder.isProject &&\n createNewLibraryAction({\n intl,\n parentProject: parentFolder as SAM.Project,\n projectContext,\n showModal,\n showToast,\n isMobile,\n metricLogger: Metrics[AAVComponentId.PROJECTS].getOperationalMetricLogger(\n ActionAnalyticsValue.NewLibrary,\n ),\n }),\n createOpenAction({\n baseUrls,\n intl,\n canOpenMultiple: false,\n dispatchEvent,\n metricLogger: Metrics[AAVComponentId.PROJECTS].getOperationalMetricLogger(\n ActionAnalyticsValue.Open,\n ),\n sam,\n }),\n createShareAction({ intl, showModal, routes, dispatchEvent, baseUrls, sam }),\n createCopyLinkAction({\n intl,\n showToast,\n routes,\n dispatchEvent,\n baseUrls,\n metricLogger: Metrics[AAVComponentId.PROJECTS].getOperationalMetricLogger(\n ActionAnalyticsValue.CopyLink,\n ),\n sam,\n }),\n createRenameAction({\n intl,\n showModal,\n ...renameCallbacks,\n onBefore: async (elements) =>\n checkAllowedAssetsBeforeOp({\n elements,\n getBlockedAssets: onBeforeRename,\n intl,\n showToast,\n getCurrentlyOpenAssets: getOpenCloudDocuments,\n sam,\n }),\n }),\n createDuplicateAction({\n intl,\n showModal,\n showToast,\n metricLogger: Metrics[AAVComponentId.PROJECTS].getOperationalMetricLogger(\n ActionAnalyticsValue.Duplicate,\n ),\n hostAssetContext,\n }),\n createMoveAction({\n assetContext: hostAssetContext,\n getAssetWithCloudID: (assetId: string) =>\n hostAssetContext.getAssetWithCloudID(assetId),\n intl,\n launchUAP,\n viewId: AssetBrowser.ContentViewType.Project,\n showToast,\n showModal,\n isMobile,\n metricLogger: Metrics[AAVComponentId.PROJECTS].getOperationalMetricLogger(\n ActionAnalyticsValue.Move,\n ),\n getCurrentlyOpenAssets: getOpenCloudDocuments,\n onBefore: async (elements) =>\n checkAllowedAssetsBeforeOp({\n elements,\n getBlockedAssets: onBeforeMove,\n intl,\n showToast,\n getCurrentlyOpenAssets: getOpenCloudDocuments,\n sam,\n }),\n excludeMediaTypes,\n compatibleTypes,\n }),\n ...(supportProjectContentsExport\n ? [\n createExportAction({\n intl,\n metricLogger: Metrics[AAVComponentId.PROJECTS].getOperationalMetricLogger(\n ActionAnalyticsValue.Export,\n ),\n dispatchEvent,\n }),\n ]\n : []),\n createAddLibraryAction({\n intl,\n showModal,\n showToast,\n metricLogger: Metrics[AAVComponentId.PROJECTS].getOperationalMetricLogger(\n ActionAnalyticsValue.AddLibrary,\n ),\n }),\n createRemoveLibraryAction({\n intl,\n showModal,\n showToast,\n metricLogger: Metrics[AAVComponentId.PROJECTS].getOperationalMetricLogger(\n ActionAnalyticsValue.Remove,\n ),\n }),\n createLeaveAction({\n intl,\n showModal,\n showToast,\n metricLogger: Metrics[AAVComponentId.PROJECTS].getOperationalMetricLogger(\n ActionAnalyticsValue.Leave,\n ),\n onBefore: async (elements) => {\n return checkAllowedAssetsBeforeOp({\n elements,\n intl,\n showToast,\n getCurrentlyOpenAssets: getOpenCloudDocuments,\n sam,\n });\n },\n }),\n createReportAbuseAction({\n intl,\n isMobile,\n showModal,\n showToast,\n metricLogger: Metrics[AAVComponentId.PROJECTS].getOperationalMetricLogger(\n ActionAnalyticsValue.ReportAbuse,\n ),\n }),\n createDiscardAction({\n intl,\n showModal,\n showToast,\n includeUndo: true,\n metricLogger: Metrics[AAVComponentId.PROJECTS].getOperationalMetricLogger(\n ActionAnalyticsValue.Discard,\n ),\n undoMetricLogger: Metrics[AAVComponentId.PROJECTS].getUndoOperationalMetricLogger(\n ActionAnalyticsValue.Discard,\n ),\n onBefore: async (elements) => {\n perfTracker.current = { finish: perf.startMeasure('DiscardAsset') };\n return checkAllowedAssetsBeforeOp({\n elements,\n getBlockedAssets: onBeforeDelete,\n intl,\n showToast,\n getCurrentlyOpenAssets: getOpenCloudDocuments,\n sam,\n });\n },\n onAfter: () => {\n perfTracker.current?.finish();\n return Promise.resolve();\n },\n }),\n supportsAddToBoard &&\n createAddToBoardAction({\n intl,\n showToast,\n metricLogger: Metrics[AAVComponentId.CDO].getOperationalMetricLogger(\n ActionAnalyticsValue.AddToBoard,\n ),\n launchUAP,\n }),\n ].filter(Boolean) as Action<BackedCollectionItem<SAM.AdobeAsset>>[];\n\n return actions.filter((action) => actionFilter(action.value));\n }, [\n supportsAddToBoard,\n supportsUpload,\n parentFolder,\n intl,\n showToast,\n promptUserForFileImport,\n importFiles,\n isCreator,\n getOpenCloudDocuments,\n launchUAP,\n showModal,\n excludeMediaTypes,\n compatibleTypes,\n closeModal,\n supportCreateLibrary,\n projectContext,\n isMobile,\n baseUrls,\n dispatchEvent,\n sam,\n routes,\n renameCallbacks,\n hostAssetContext,\n supportProjectContentsExport,\n onBeforeRename,\n onBeforeMove,\n perf,\n onBeforeDelete,\n actionFilter,\n assetList,\n ]);\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport ProjectContents from './components/ProjectContents';\nimport withProviders from './components/withProviders';\nimport './styles.css';\n\nexport default withProviders(ProjectContents);\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport type { IAUPSDK, Analytics } from '@ccx-public/component-types';\nimport { useHostConfig } from '@csc/common';\nimport SharedConfig from '@csc/common/dist/src/config/SharedConfig';\nimport { useCallback } from 'react';\n\nimport getEventName from '../utils/getEventName';\nimport type { ProjectViewLocations } from '../utils/ingest';\nimport Ingest, {\n linkedBrandClickEvent,\n projectActionEvent,\n projectContentsRenderEvent,\n projectFilterEvent,\n projectListRenderEvent,\n projectOrganizerSearchResultItemClickEvent,\n projectOrganizerSearchResultRenderEvent,\n projectOrganizerSearchTriggerEvent,\n projectOrganizerClickEvent,\n projectSharingEvent,\n projectSortEvent,\n} from '../utils/ingest';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Any function with any argument can be used\nexport const useAnalytics = <FactoryFn extends (...args: any[]) => any>(formatter: FactoryFn) => {\n const { dispatchEvent } = useHostConfig();\n\n return useCallback(\n (...data: Parameters<FactoryFn>) => {\n const event = formatter(...data) as ReturnType<FactoryFn>;\n Ingest.fireEvent(event);\n dispatchEvent(\n new CustomEvent('analytics', {\n bubbles: true,\n composed: true,\n detail: event,\n }),\n );\n },\n [dispatchEvent, formatter],\n );\n};\n\nexport const useAupAnalytics = (viewLocation: ProjectViewLocations) => {\n const {\n dispatchEvent,\n }: {\n aupSdk?: IAUPSDK;\n dispatchEvent: (event: CustomEvent) => void;\n } = useHostConfig();\n const aupSdk = SharedConfig.cSdk;\n\n return useCallback(\n async (\n eventName: string,\n workflowData: Partial<Analytics.WorkflowContext>,\n ): Promise<void> => {\n if (!aupSdk) {\n return;\n }\n\n const fullWorkflowData: Analytics.WorkflowContext = {\n module: {\n name: 'AssetBrowser',\n version: global.AssetBrowserVersion as string,\n },\n ...workflowData,\n };\n const fullEventName = getEventName(eventName, viewLocation);\n\n try {\n const workflowContext = await aupSdk.createWorkflowContext(fullWorkflowData);\n await aupSdk.fireAnalyticsEvent(fullEventName, workflowContext.referenceId);\n } catch (error) {\n console.error('Error firing event using the AUP SDK:', error);\n } finally {\n dispatchEvent(\n new CustomEvent('analytics', {\n bubbles: true,\n composed: true,\n detail: {}, // TODO: Assemble payload. Requires https://jira.corp.adobe.com/browse/GLOW-1213 to be completed.\n }),\n );\n }\n },\n [aupSdk, dispatchEvent, viewLocation],\n );\n};\n\nexport const useProjectActionAnalytics = () =>\n useAnalytics<typeof projectActionEvent>(projectActionEvent);\n\nexport const useProjectSortAnalytics = () =>\n useAnalytics<typeof projectSortEvent>(projectSortEvent);\n\nexport const useProjectOrganizerClickAnalytics = () =>\n useAnalytics<typeof projectOrganizerClickEvent>(projectOrganizerClickEvent);\n\nexport const useProjectListRenderAnalytics = () =>\n useAnalytics<typeof projectListRenderEvent>(projectListRenderEvent);\n\nexport const useProjectFilterAnalytics = () =>\n useAnalytics<typeof projectFilterEvent>(projectFilterEvent);\n\nexport const useProjectSharingAnalytics = () =>\n useAnalytics<typeof projectSharingEvent>(projectSharingEvent);\n\n/* [Express only] Project organizer search analytics */\nexport const useProjectOrganizerSearchTriggerAnalytics = () =>\n useAnalytics<typeof projectOrganizerSearchTriggerEvent>(projectOrganizerSearchTriggerEvent);\n\nexport const useProjectOrganizerSearchResultRenderAnalytics = () =>\n useAnalytics<typeof projectOrganizerSearchResultRenderEvent>(\n projectOrganizerSearchResultRenderEvent,\n );\n\nexport const useProjectOrganizerSearchResultItemClickAnalytics = () =>\n useAnalytics<typeof projectOrganizerSearchResultItemClickEvent>(\n projectOrganizerSearchResultItemClickEvent,\n );\n\nexport const useProjectContentsRenderAnalytics = () =>\n useAnalytics<typeof projectContentsRenderEvent>(projectContentsRenderEvent);\n\nexport const useLinkedBrandClickAnalytics = () =>\n useAnalytics<typeof linkedBrandClickEvent>(linkedBrandClickEvent);\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { ProjectViewLocations } from './ingest';\n\nexport default function getEventName(eventName: string, viewLocation: ProjectViewLocations) {\n let location: string;\n\n switch (viewLocation) {\n case ProjectViewLocations.ProjectCreationWizard:\n location = 'dialog.';\n break;\n case ProjectViewLocations.ProjectCreate:\n location = 'component.';\n break;\n case ProjectViewLocations.ProjectContents:\n location = '1up.';\n break;\n default:\n location = '';\n }\n\n return `project.${location}${eventName}`;\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport type { AssetBrowser } from '@ccx-public/component-types';\nimport { useContext } from 'react';\n\nimport { FeatureFlagsContext } from './featureFlags';\n\ntype ProjectsInternalFeatureFlags =\n /* Allows adding compatible assets to a board */\n | 'enableAddToBoard'\n /* Allows loading CSC \"Content Supply Chain\" projects created in Workfront in participating hosts */\n | 'workfrontProjects'\n | 'projectsUploadSupport';\nexport type FeatureFlags = AssetBrowser.FeatureFlag | ProjectsInternalFeatureFlags;\n\n/**\n * Hook to get the boolean value of a specific feature flag.\n */\nexport function useFeatureFlagValue(feature: FeatureFlags): boolean {\n const features = useContext(FeatureFlagsContext);\n return features.includes(feature as string);\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport type { AssetBrowser, SAM } from '@ccx-public/component-types';\nimport IconLink from '@ccx-public/spectrum-wrapper/dist/Icon/Link';\nimport { constructAssetLink } from '@csc/adobe-assets-view/dist/src/utils/asset-link/constructAssetLink';\nimport type { ExternalBaseURLs } from '@csc/common';\nimport type { UABSAMCore } from '@csc/sam-utils';\nimport React from 'react';\nimport type { IntlShape } from 'react-intl';\n\nimport type { Action } from '.';\nimport type { ITrackProjectAction, ProjectViewLocations } from '../utils/ingest';\n\ninterface Dependencies {\n sendAnalytics: (event: ITrackProjectAction) => void;\n intl: IntlShape;\n routes?: AssetBrowser.RouteTemplates;\n showToast: AssetBrowser.ShowToastFn;\n themeInfo: {\n themeIsSpectrum: boolean;\n themeIsExpress: boolean;\n };\n userId: string;\n viewLocation: ProjectViewLocations;\n baseUrls: ExternalBaseURLs;\n dispatchEvent?: (event: CustomEvent) => void;\n sam: UABSAMCore;\n}\n\n// All awaited methods happening between user event and clipboard action must be wrapped in this function. See navigator.clipboard comment below.\nexport const getLinkBlob = async ({\n project,\n baseUrls,\n locale,\n routes,\n dispatchEvent,\n sam,\n}: {\n project: SAM.Project;\n baseUrls: ExternalBaseURLs;\n locale: string;\n routes?: AssetBrowser.RouteTemplates;\n dispatchEvent?: (event: CustomEvent) => void;\n sam: UABSAMCore;\n}) => {\n const link = await constructAssetLink({\n asset: project,\n baseUrls,\n locale,\n routeTemplates: routes,\n linkSource: 'copy-link',\n dispatchEvent,\n sam,\n });\n\n return new Blob([link], { type: 'text/plain' });\n};\n\nexport default function createCopyLinkAction({\n sendAnalytics,\n intl,\n routes,\n showToast,\n themeInfo,\n userId,\n viewLocation,\n baseUrls,\n dispatchEvent,\n sam,\n}: Dependencies): Action {\n return {\n label: themeInfo.themeIsExpress\n ? intl.formatMessage({\n id: '@ace/projects:projects.actionbar.copylink.express',\n defaultMessage: 'Copy Link',\n })\n : intl.formatMessage({\n id: '@ace/projects:projects.actionbar.copylink',\n defaultMessage: 'Copy link',\n }),\n value: 'copy-link-project',\n icon: <IconLink />,\n isVisible: (item) => item.isProject,\n execute: async (item) => {\n sendAnalytics({\n element: item,\n subcategory: viewLocation,\n type: 'click',\n subtype: 'copy-link',\n sequence: 'context-menu',\n userId,\n });\n\n try {\n // WARNING: do NOT await or invoke promises before clipboard.write (including in beforeExecute) or else Safari/Webview will throw clipboard permission error\n await navigator.clipboard.write([\n new ClipboardItem({\n 'text/plain': getLinkBlob({\n project: item as SAM.Project,\n locale: intl.locale,\n routes,\n baseUrls,\n dispatchEvent,\n sam,\n }),\n }),\n ]);\n showToast({\n content: intl.formatMessage(\n {\n id: '@ace/projects:projects.actionbar.copylink.toast.copied',\n defaultMessage: 'Link to {name} is copied to clipboard',\n },\n { name: item.name },\n ),\n variant: 'positive',\n });\n sendAnalytics({\n element: item,\n subcategory: viewLocation,\n type: 'success',\n subtype: 'copy-link',\n sequence: 'toast',\n userId,\n });\n } catch (e) {\n showToast({\n content: intl.formatMessage(\n {\n id: '@ace/projects:projects.actionbar.copylink.toast.failed',\n defaultMessage: 'Failed to copy link to {name}',\n },\n { name: item.name },\n ),\n variant: 'negative',\n });\n sendAnalytics({\n element: item,\n subcategory: viewLocation,\n type: 'error',\n sequence: 'toast',\n subtype: 'copy-link',\n error: e as Error,\n });\n }\n },\n };\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { useTheme } from '@csc/common';\nimport classnames from 'classnames';\nimport type { ComponentPropsWithRef } from 'react';\nimport React, { forwardRef } from 'react';\n\nimport styles from './style.module.css';\n\nexport default forwardRef<HTMLDivElement, ComponentPropsWithRef<'div'>>(function DialogContent(\n { className, children, ...props },\n ref,\n) {\n const { themeIsExpress, themeIsSpectrum } = useTheme();\n return (\n <div\n {...props}\n ref={ref}\n className={classnames(className, styles.content, {\n [styles.express]: themeIsExpress,\n [styles.spectrum]: themeIsSpectrum,\n })}\n >\n {children}\n </div>\n );\n});\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport ButtonGroup from '@ccx-public/spectrum-wrapper/dist/ButtonGroup';\nimport { useTheme } from '@csc/common';\nimport classnames from 'classnames';\nimport React from 'react';\n\nimport styles from './style.module.css';\n\nexport default function DialogFooter({ children, className = '' }) {\n const { themeIsExpress, themeIsSpectrum } = useTheme();\n const buttonSize = themeIsExpress ? 'l' : 'm';\n return (\n <ButtonGroup\n className={classnames(className, styles.footer, {\n [styles.express]: themeIsExpress,\n [styles.spectrum]: themeIsSpectrum,\n })}\n dir=\"ltr\"\n orientation=\"horizontal\"\n size={buttonSize}\n >\n {children}\n </ButtonGroup>\n );\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { AssetBrowser, SAM } from '@ccx-public/component-types';\nimport Button from '@ccx-public/spectrum-wrapper/dist/Button';\nimport Link from '@ccx-public/spectrum-wrapper/dist/Link';\nimport Rule from '@ccx-public/spectrum-wrapper/dist/Rule';\nimport Wait from '@ccx-public/spectrum-wrapper/dist/Wait';\nimport ExternalLink from '@csc/adobe-assets-view/dist/src/components/ExternalLink/ExternalLink';\nimport { localizedGoUrl, useHostConfig, useTheme } from '@csc/common';\nimport { useAssetList } from '@csc/sam-utils';\nimport { observer } from 'mobx-react';\nimport React, { useCallback, useState } from 'react';\nimport type { IntlShape } from 'react-intl';\nimport { FormattedMessage, useIntl } from 'react-intl';\n\nimport { useProjectActionAnalytics } from '../../hooks/useAnalytics';\nimport { usePerformance } from '../../hooks/usePerformance';\nimport type { ITrackProjectAction, ProjectViewLocations } from '../../utils/ingest';\nimport { Content, Footer, Header } from '../Dialog';\nimport dialogStyles from '../Dialog/style.module.css';\nimport { getPrimaryLocale } from '../withProviders/intl';\n\nexport interface Props {\n onSuccess?: () => unknown;\n project: SAM.Project;\n viewLocation: ProjectViewLocations;\n}\n\ninterface UndoProjectDiscardArgs {\n project: SAM.Project;\n intl: IntlShape;\n viewLocation: ProjectViewLocations;\n trackProjectAction: (args: ITrackProjectAction) => void;\n showToast: (config: AssetBrowser.ToastConfig) => void;\n}\n\nexport async function UndoProjectDiscard(args: UndoProjectDiscardArgs) {\n const { project, intl, viewLocation, showToast, trackProjectAction } = args;\n try {\n trackProjectAction({\n element: project,\n subcategory: viewLocation,\n type: 'click',\n subtype: 'undo-delete',\n sequence: 'toast',\n });\n\n await project.restore();\n showToast({\n content: intl.formatMessage({\n id: '@ace/projects:projects.actionbar.discard.toast.undoSuccess',\n defaultMessage: 'Undo complete',\n }),\n variant: 'positive',\n });\n\n trackProjectAction({\n element: project,\n subcategory: viewLocation,\n type: 'success',\n sequence: 'toast',\n subtype: 'restore',\n });\n } catch (e) {\n trackProjectAction({\n element: project,\n subcategory: viewLocation,\n type: 'error',\n sequence: 'toast',\n subtype: 'restore',\n error: e as Error,\n });\n showToast({\n content: intl.formatMessage({\n id: '@ace/projects:projects.actionbar.discard.toast.undoFailure',\n defaultMessage: 'We ran into a problem restoring your project',\n }),\n variant: 'negative',\n });\n }\n}\n\nexport default observer(function ProjectDiscardDialog({ onSuccess, project, viewLocation }: Props) {\n const { closeModal, showToast, environment, locale } = useHostConfig();\n const { themeIsExpress } = useTheme();\n const intl = useIntl();\n const perf = usePerformance();\n const sendAnalytics = useProjectActionAnalytics();\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const TOAST_DISMISS_TIME = 5000;\n\n const assetList = useAssetList({\n source: project.children,\n loadAll: false,\n limit: 1,\n });\n\n const handleCancel = useCallback(() => {\n closeModal({ type: AssetBrowser.ShowModalResultType.Cancel });\n sendAnalytics({\n element: project,\n subcategory: viewLocation,\n type: 'click',\n subtype: 'delete-cancel',\n pagename: 'delete',\n });\n }, [project, closeModal, sendAnalytics, viewLocation]);\n\n const AssetsWebLink = () => {\n const ASSETS_WEB_DELETED = {\n stage: 'https://www.stage.adobe.com/files/deleted',\n prod: 'https://www.adobe.com/files/deleted',\n };\n const ASSETS_WEB_DELETED_LINK = ASSETS_WEB_DELETED[environment];\n\n return (\n <Link target=\"_blank\" href={ASSETS_WEB_DELETED_LINK}>\n <FormattedMessage\n id=\"@ace/projects:projects.dialog.discard.storage\"\n defaultMessage=\"Adobe Cloud storage\"\n />\n </Link>\n );\n };\n\n const handleSubmit = useCallback(async () => {\n if (isLoading) {\n return;\n }\n sendAnalytics({\n element: project,\n subcategory: viewLocation,\n type: 'click',\n subtype: 'delete-confirm',\n pagename: 'delete',\n });\n try {\n const finishMeasure = perf.startMeasure('DiscardProject');\n setIsLoading(true);\n await project.discard();\n finishMeasure();\n onSuccess?.();\n showToast({\n content: intl.formatMessage(\n {\n id: '@ace/projects:projects.actionbar.discard.toast.discarded',\n defaultMessage: 'Project {name} has been deleted',\n },\n { name: project.name },\n ),\n dismissTime: TOAST_DISMISS_TIME,\n actionCallback: {\n label: intl.formatMessage({\n id: '@ace/projects:button.undo',\n defaultMessage: 'Undo',\n }),\n callback: () => {\n void UndoProjectDiscard({\n project,\n intl,\n viewLocation,\n showToast,\n trackProjectAction: (arg: ITrackProjectAction) => sendAnalytics(arg),\n });\n },\n },\n variant: 'positive',\n });\n sendAnalytics({\n element: project,\n subcategory: viewLocation,\n type: 'success',\n subtype: 'delete',\n sequence: 'toast',\n });\n closeModal({ type: AssetBrowser.ShowModalResultType.Success });\n } catch (e) {\n showToast({\n content: intl.formatMessage({\n id: '@ace/projects:projects.actionbar.discard.toast.failed',\n defaultMessage: 'We ran into a problem deleting your project',\n }),\n variant: 'negative',\n });\n sendAnalytics({\n element: project,\n subcategory: viewLocation,\n type: 'error',\n sequence: 'toast',\n subtype: 'delete',\n error: e as Error,\n });\n closeModal({ type: AssetBrowser.ShowModalResultType.Error });\n } finally {\n setIsLoading(false);\n }\n }, [\n perf,\n project,\n sendAnalytics,\n closeModal,\n onSuccess,\n showToast,\n intl,\n viewLocation,\n isLoading,\n ]);\n\n if (themeIsExpress && assetList && assetList.status === SAM.AssetListStatus.Loading) {\n return (\n <Content data-testid=\"project-discard-dialog\">\n <div className={dialogStyles.loadingSpinner} data-testid=\"project-contents-loading\">\n <Wait size=\"L\" />\n </div>\n </Content>\n );\n }\n\n return (\n <Content data-testid=\"project-discard-dialog\">\n <Header>\n <FormattedMessage\n id=\"@ace/projects:projects.dialog.discard.heading\"\n defaultMessage=\"Delete project\"\n />\n </Header>\n <Rule variant=\"small\" className={dialogStyles.divider} />\n <div className={dialogStyles.softDelete}>\n {themeIsExpress ? (\n <FormattedMessage\n id=\"@ace/projects:projects.dialog.discard.softDeleteExpress\"\n defaultMessage=\"{isEmpty,select,true{<strong>Deleted projects can be restored for up to 30 days</strong> in {link}. After 30 days, projects will be <strong>permanently deleted from all apps that use Adobe Cloud storage</strong>.} other{There are assets in here. <strong>Deleted projects can be restored for up to 30 days</strong> in {link}. After 30 days, projects will be <strong>permanently deleted from all apps that use Adobe Cloud storage</strong>.}}\"\n values={{\n link: <AssetsWebLink />,\n strong: (chunks) => <strong>{chunks}</strong>,\n isEmpty: assetList?.items.length === 0,\n }}\n />\n ) : (\n <FormattedMessage\n id=\"@ace/projects:projects.dialog.discard.softDelete\"\n defaultMessage=\"Members won’t have access and files will become unpublished.\"\n />\n )}\n </div>\n <div>\n {themeIsExpress ? (\n <FormattedMessage\n id=\"@ace/projects:projects.dialog.discard.hardDeleteExpress\"\n defaultMessage=\"Upon deletion, published files will be unpublished, and collaborators will lose access to them.\"\n />\n ) : (\n <FormattedMessage\n id=\"@ace/projects:projects.dialog.discard.hardDelete\"\n defaultMessage=\"Deleted projects will be permanently removed from Adobe cloud storage after 30 days. {link}.\"\n values={{\n link: (\n <ExternalLink\n url={`${localizedGoUrl('deleted-files-retention', getPrimaryLocale(locale) ?? 'en')}`}\n >\n <FormattedMessage\n id=\"@ace/projects:learnMore\"\n defaultMessage=\"Learn more\"\n />\n </ExternalLink>\n ),\n }}\n />\n )}\n </div>\n <Footer data-testid=\"project-discard-dialog-footer\">\n <Button\n data-testid=\"cancel-discard-project\"\n variant=\"secondary\"\n onClick={handleCancel}\n >\n <FormattedMessage\n id=\"@ace/projects:projects.dialog.discard.cancel\"\n defaultMessage=\"Cancel\"\n />\n </Button>\n <Button\n data-testid=\"confirm-discard-project\"\n variant=\"negative\"\n onClick={handleSubmit}\n disabled={isLoading}\n >\n <FormattedMessage\n id=\"@ace/projects:projects.dialog.discard.confirm\"\n defaultMessage=\"Delete\"\n />\n </Button>\n </Footer>\n </Content>\n );\n});\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { SAM } from '@ccx-public/component-types';\nimport IconDelete from '@ccx-public/spectrum-wrapper/dist/Icon/Delete';\nimport type { ShowModalFn } from '@csc/common';\nimport React from 'react';\nimport type { IntlShape } from 'react-intl';\n\nimport type { Action } from '.';\nimport ProjectDiscardDialog from '../components/ProjectDiscardDialog';\nimport type { ITrackProjectAction, ProjectViewLocations } from '../utils/ingest';\n\ninterface Dependencies {\n sendAnalytics: (event: ITrackProjectAction) => void;\n intl: IntlShape;\n onSuccess?: () => unknown;\n showModal: ShowModalFn;\n viewLocation: ProjectViewLocations;\n onBefore?: (elements: SAM.AdobeAsset[]) => Promise<SAM.AdobeAsset[]>;\n}\n\nexport default function createDiscardAction({\n sendAnalytics,\n intl,\n onSuccess,\n showModal,\n viewLocation,\n onBefore,\n}: Dependencies): Action {\n return {\n label: intl.formatMessage({\n id: '@ace/projects:projects.actionbar.discard',\n defaultMessage: 'Delete',\n }),\n value: 'discard-project',\n icon: <IconDelete />,\n groupName: 'destructiveActions',\n isVisible: (item) =>\n item.isProject &&\n (item as SAM.Project).directorySubtype !== SAM.ProjectDirectorySubtype.WF_PROJECT &&\n item.hasPermission(SAM.Permission.Discard),\n execute: async (item) => {\n sendAnalytics({\n element: item,\n subcategory: viewLocation,\n type: 'click',\n subtype: 'delete',\n sequence: 'context-menu',\n });\n\n const filteredElements = (await onBefore?.([item])) ?? [item];\n\n if (!filteredElements.length) {\n return;\n }\n\n await showModal(\n <ProjectDiscardDialog\n data-testid=\"project-discard-dialog\"\n onSuccess={onSuccess}\n project={item as SAM.Project}\n viewLocation={viewLocation}\n />,\n {\n size: 'm',\n onClose: () => {\n sendAnalytics({\n element: item,\n subcategory: viewLocation,\n type: 'click',\n subtype: 'close',\n pagename: 'delete',\n });\n },\n },\n );\n },\n };\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { SAM } from '@ccx-public/component-types';\nimport IconInvite from '@ccx-public/spectrum-wrapper/dist/Icon/Invite';\nimport type { ShowModalFn } from '@csc/common';\nimport React from 'react';\nimport type { IntlShape } from 'react-intl';\n\nimport type { Action } from '.';\nimport ProjectInviteDialog from '../components/ProjectInviteDialog';\nimport type { ITrackProjectAction, ProjectViewLocations } from '../utils/ingest';\n\ninterface Dependencies {\n sendAnalytics: (data: ITrackProjectAction) => void;\n intl: IntlShape;\n showModal: ShowModalFn;\n userId: string;\n viewLocation: ProjectViewLocations;\n}\n\nexport default function createInviteAction({\n sendAnalytics,\n intl,\n showModal,\n userId,\n viewLocation,\n}: Dependencies): Action {\n return {\n label: intl.formatMessage({\n id: '@ace/projects:projects.actionbar.invite',\n defaultMessage: 'Share',\n }),\n value: 'share-project',\n icon: <IconInvite />,\n isVisible: (item) =>\n item.isProject &&\n (item as SAM.Project).directorySubtype !== SAM.ProjectDirectorySubtype.WF_PROJECT,\n execute: async (item) => {\n sendAnalytics({\n element: item,\n subcategory: viewLocation,\n type: 'click',\n subtype: 'share',\n sequence: 'context-menu',\n userId,\n });\n await showModal(<ProjectInviteDialog project={item} viewLocation={viewLocation} />, {\n size: 'm',\n onClose: () => {\n sendAnalytics({\n element: item,\n subcategory: viewLocation,\n type: 'click',\n subtype: 'close',\n pagename: 'share',\n userId,\n });\n },\n });\n },\n };\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { AssetBrowser, SAM } from '@ccx-public/component-types';\nimport Button from '@ccx-public/spectrum-wrapper/dist/Button';\nimport Rule from '@ccx-public/spectrum-wrapper/dist/Rule';\nimport { useHostConfig } from '@csc/common';\nimport LoadingState from '@csc/ui/dist/src/LoadingState/LoadingState';\nimport React, { useState, useCallback } from 'react';\nimport type { IntlShape } from 'react-intl';\nimport { FormattedMessage, useIntl } from 'react-intl';\n\nimport leaveDialogStyles from './styles.module.css';\nimport { useProjectActionAnalytics } from '../../hooks/useAnalytics';\nimport type { ProjectViewLocations } from '../../utils/ingest';\nimport { Content, Footer, Header } from '../Dialog';\nimport dialogStyles from '../Dialog/style.module.css';\n\nconst getErrorMessage = ({\n reason,\n intl,\n}: {\n intl: IntlShape;\n reason?: SAM.ProjectLeaveReason;\n}) => {\n switch (reason) {\n case SAM.ProjectLeaveReason.CANNOT_LEAVE_ADDRESS_BOOK_GROUP_MEMBER:\n return intl.formatMessage({\n id: '@ace/projects:projects.actionbar.leave.toast.failed.addressBookGroupMember',\n defaultMessage:\n 'You can’t leave because you belong to an invited group, try leaving the group.',\n });\n case SAM.ProjectLeaveReason.CANNOT_LEAVE_IS_OWNER:\n return intl.formatMessage({\n id: '@ace/projects:projects.actionbar.leave.toast.failed.owner',\n defaultMessage: 'You can’t leave because you’re the owner.',\n });\n case SAM.ProjectLeaveReason.CANNOT_LEAVE_IS_ADMIN_OF_PROJECT:\n return intl.formatMessage({\n id: '@ace/projects:projects.actionbar.leave.toast.failed.isAdmin',\n defaultMessage: 'You can’t leave because you’re an admin.',\n });\n case SAM.ProjectLeaveReason.CANNOT_LEAVE_LAST_COLLABORATOR:\n case SAM.ProjectLeaveReason.CANNOT_LEAVE_NO_COLLABORATORS:\n case SAM.ProjectLeaveReason.CANNOT_LEAVE_LAST_DIRECT_COLLAB_WITH_SHARE_PERMISSION:\n return intl.formatMessage({\n id: '@ace/projects:projects.actionbar.leave.toast.failed.onlyContributor',\n defaultMessage: 'You’re the only editor. Add another before leaving.',\n });\n default:\n return intl.formatMessage({\n id: '@ace/projects:projects.actionbar.leave.toast.failed.default',\n defaultMessage: 'We ran into a problem and couldn’t remove you from the project.',\n });\n }\n};\n\nexport interface Props {\n onSuccess?: () => unknown;\n project: SAM.Project;\n viewLocation: ProjectViewLocations;\n}\n\nexport default function ProjectLeaveDialog({ onSuccess, project, viewLocation }: Props) {\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const { closeModal, showToast } = useHostConfig();\n const intl = useIntl();\n const sendAnalytics = useProjectActionAnalytics();\n\n const handleCanLeave = useCallback(async () => {\n await project.removeCurrentUserFromCollaborationList();\n onSuccess?.();\n showToast({\n content: intl.formatMessage(\n {\n id: '@ace/projects:projects.actionbar.leave.toast.success',\n defaultMessage: 'You have been removed from the “{project}” project',\n },\n { project: project.name },\n ),\n variant: 'positive',\n });\n sendAnalytics({\n element: project,\n subcategory: viewLocation,\n type: 'success',\n subtype: 'leave',\n sequence: 'toast',\n });\n closeModal({ type: AssetBrowser.ShowModalResultType.Success });\n }, [onSuccess, sendAnalytics, showToast, closeModal, intl, project, viewLocation]);\n\n // After user attempts leave, treat CANNOT_LEAVE statuses similar to errors\n const handleCannotLeave = useCallback(\n (leaveStatus: SAM.ProjectLeaveReason) => {\n showToast({\n content: getErrorMessage({\n intl,\n reason: leaveStatus,\n }),\n variant: 'negative',\n });\n sendAnalytics({\n element: project,\n subcategory: viewLocation,\n type: 'error',\n sequence: 'toast',\n subtype: 'leave',\n error: {\n name: SAM.ProjectLeaveReason[leaveStatus],\n } as Error,\n });\n closeModal({ type: AssetBrowser.ShowModalResultType.Error });\n },\n [closeModal, intl, project, sendAnalytics, showToast, viewLocation],\n );\n\n const handleSubmit = useCallback(async () => {\n sendAnalytics({\n element: project,\n subcategory: viewLocation,\n type: 'click',\n pagename: 'leave',\n subtype: 'leave-confirm',\n });\n try {\n setIsLoading(true);\n const leaveStatus = project.leaveStatus();\n\n if (leaveStatus === SAM.ProjectLeaveReason.CAN_LEAVE) {\n await handleCanLeave();\n } else {\n handleCannotLeave(leaveStatus);\n }\n } catch (e) {\n showToast({\n content: getErrorMessage({ intl }),\n variant: 'negative',\n });\n sendAnalytics({\n element: project,\n subcategory: viewLocation,\n type: 'error',\n sequence: 'toast',\n subtype: 'leave',\n error: e as Error,\n });\n closeModal({ type: AssetBrowser.ShowModalResultType.Error });\n } finally {\n setIsLoading(false);\n }\n }, [\n closeModal,\n intl,\n project,\n sendAnalytics,\n showToast,\n viewLocation,\n handleCanLeave,\n handleCannotLeave,\n ]);\n\n const handleCancel = useCallback(() => {\n closeModal({ type: AssetBrowser.ShowModalResultType.Cancel });\n sendAnalytics({\n element: project,\n subcategory: viewLocation,\n type: 'click',\n subtype: 'leave-cancel',\n pagename: 'leave',\n });\n }, [closeModal, project, sendAnalytics, viewLocation]);\n\n return (\n <Content data-testid=\"project-leave-dialog\" className={leaveDialogStyles.container}>\n <Header>\n <FormattedMessage\n id=\"@ace/projects:projects.dialog.leave.header\"\n defaultMessage=\"Saying goodbye?\"\n />\n </Header>\n <div className={dialogStyles.divider}>\n <Rule variant=\"small\" />\n </div>\n {isLoading ? (\n <LoadingState />\n ) : (\n <>\n <div\n className={leaveDialogStyles.warning}\n data-testid=\"project-leave-dialog-warning\"\n >\n <FormattedMessage\n id=\"@ace/projects:projects.dialog.leave.body\"\n defaultMessage=\"You won’t be able to undo this If you remove yourself. Contact a member if you want to be added back to this project.\"\n />\n </div>\n\n <Footer data-testid=\"project-leave-dialog-footer\">\n <Button\n data-testid=\"cancel-leave-project\"\n variant=\"secondary\"\n onClick={handleCancel}\n >\n <FormattedMessage\n id=\"@ace/projects:projects.dialog.discard.cancel\"\n defaultMessage=\"Cancel\"\n />\n </Button>\n <Button\n data-testid=\"confirm-leave-project\"\n variant=\"cta\"\n onClick={handleSubmit}\n >\n <FormattedMessage\n id=\"@ace/projects:projects.dialog.leave.confirm\"\n defaultMessage=\"Leave project\"\n />\n </Button>\n </Footer>\n </>\n )}\n </Content>\n );\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { SAM } from '@ccx-public/component-types';\nimport IconLeave from '@ccx-public/spectrum-wrapper/dist/Icon/Export';\nimport type { ShowModalFn } from '@csc/common';\nimport React from 'react';\nimport type { IntlShape } from 'react-intl';\n\nimport type { Action } from '.';\nimport ProjectLeaveDialog from '../components/ProjectLeaveDialog';\nimport type { ITrackProjectAction, ProjectViewLocations } from '../utils/ingest';\n\ninterface Dependencies {\n sendAnalytics: (event: ITrackProjectAction) => void;\n intl: IntlShape;\n showModal: ShowModalFn;\n onSuccess?: () => unknown;\n userId: string;\n viewLocation: ProjectViewLocations;\n onBefore?: (elements: SAM.AdobeAsset[]) => Promise<SAM.AdobeAsset[]>;\n}\n\nexport default function createLeaveAction({\n sendAnalytics,\n intl,\n onSuccess,\n showModal,\n userId,\n viewLocation,\n onBefore,\n}: Dependencies): Action {\n return {\n label: intl.formatMessage({\n id: '@ace/projects:projects.actionbar.leaveProject',\n defaultMessage: 'Leave',\n }),\n value: 'leave-project',\n icon: <IconLeave />,\n groupName: 'destructiveActions',\n isVisible: (item) =>\n item.isProject &&\n (item as SAM.Project).directorySubtype !== SAM.ProjectDirectorySubtype.WF_PROJECT,\n execute: async (item) => {\n sendAnalytics({\n element: item,\n subcategory: viewLocation,\n type: 'click',\n subtype: 'leave',\n sequence: 'context-menu',\n userId,\n });\n\n // Exclude project that contains open assets\n const filteredElements = (await onBefore?.([item])) ?? [item];\n if (!filteredElements.length) {\n return;\n }\n\n await showModal(\n <ProjectLeaveDialog\n data-testid=\"project-leave-dialog\"\n project={item as SAM.Project}\n onSuccess={onSuccess}\n viewLocation={viewLocation}\n />,\n {\n size: 'm',\n onClose: () => {\n sendAnalytics({\n element: item,\n subcategory: viewLocation,\n type: 'click',\n subtype: 'close',\n pagename: 'leave',\n });\n },\n },\n );\n },\n };\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { SAM } from '@ccx-public/component-types';\nimport Rename from '@ccx-public/spectrum-wrapper/dist/Icon/Rename';\nimport RenameDialog from '@csc/adobe-assets-view/dist/src/components/RenameDialog/RenameDialog';\nimport type { ShowModalFn } from '@csc/common';\nimport React from 'react';\nimport type { IntlShape } from 'react-intl';\n\nimport type { Action } from '.';\nimport type { ITrackProjectAction, ProjectViewLocations } from '../utils/ingest';\n\ninterface Dependencies {\n sendAnalytics: (event: ITrackProjectAction) => void;\n intl: IntlShape;\n performance?: {\n startMeasure: (id: string) => () => void;\n };\n showModal: ShowModalFn;\n viewLocation: ProjectViewLocations;\n onBefore?: (elements: SAM.AdobeAsset[]) => Promise<SAM.AdobeAsset[]>;\n}\n\nexport default function createRenameAction({\n sendAnalytics,\n intl,\n performance,\n showModal,\n viewLocation,\n onBefore,\n}: Dependencies): Action {\n const execute = async (item: SAM.AdobeAsset) => {\n let finishMeasure: (() => void) | undefined;\n\n const [testId, perfId] = item.isProject\n ? ['project-rename-dialog', 'RenameProject']\n : ['rename-dialog', 'RenameAsset'];\n\n sendAnalytics({\n element: item,\n subcategory: viewLocation,\n type: 'click',\n subtype: 'rename',\n sequence: 'context-menu',\n });\n\n const filteredElements = (await onBefore?.([item])) ?? [item];\n if (!filteredElements.length) {\n return;\n }\n\n await showModal(\n <RenameDialog\n data-testid={testId}\n element={item}\n onConfirm={() => {\n finishMeasure = performance?.startMeasure(perfId);\n sendAnalytics({\n element: item,\n subcategory: viewLocation,\n type: 'click',\n subtype: 'rename-confirm',\n pagename: 'rename',\n });\n }}\n />,\n {\n onClose: () => {\n sendAnalytics({\n element: item,\n subcategory: viewLocation,\n type: 'click',\n subtype: 'close',\n pagename: 'rename',\n });\n },\n onCancel: () => {\n sendAnalytics({\n element: item,\n subcategory: viewLocation,\n type: 'click',\n subtype: 'rename-cancel',\n pagename: 'rename',\n });\n },\n onError: () => {\n sendAnalytics({\n element: item,\n subcategory: viewLocation,\n type: 'error',\n sequence: 'toast',\n subtype: 'rename',\n });\n },\n onSuccess: () => {\n sendAnalytics({\n element: item,\n subcategory: viewLocation,\n type: 'success',\n subtype: 'rename',\n pagename: 'toast',\n });\n finishMeasure?.();\n },\n },\n );\n };\n\n const label = intl.formatMessage({\n id: '@ace/projects:projects.actionbar.rename',\n defaultMessage: 'Rename',\n });\n\n const isVisible = (item: SAM.AdobeAsset) =>\n (item.isProject &&\n item.hasPermission(SAM.Permission.Rename) &&\n (item as SAM.Project).directorySubtype !== SAM.ProjectDirectorySubtype.WF_PROJECT) ||\n !item.isProject;\n\n return {\n execute,\n label,\n icon: <Rename />,\n isVisible,\n value: 'rename-project',\n };\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { SAM } from '@ccx-public/component-types';\nimport IconLink from '@ccx-public/spectrum-wrapper/dist/Icon/Link';\nimport { openLink } from '@csc/adobe-assets-view';\nimport React from 'react';\nimport type { IntlShape } from 'react-intl';\n\nimport type { Action } from '.';\nimport type { ITrackProjectAction, ProjectViewLocations } from '../utils/ingest';\n\ninterface Dependencies {\n sendAnalytics: (event: ITrackProjectAction) => void;\n intl: IntlShape;\n userId: string;\n viewLocation: ProjectViewLocations;\n dispatchEvent: (event: CustomEvent) => void;\n getWorkfrontContext: () => Promise<SAM.WorkfrontContext>;\n}\n\nexport default function createWorkfrontOpenAction({\n sendAnalytics,\n intl,\n userId,\n viewLocation,\n dispatchEvent,\n getWorkfrontContext,\n}: Dependencies): Action {\n return {\n label: intl.formatMessage({\n id: '@ace/projects:projects.actionbar.workfrontOpen',\n defaultMessage: 'Open in Workfront',\n }),\n value: 'workfront-open',\n icon: <IconLink />,\n isVisible: (asset) =>\n asset.isProject &&\n (asset as SAM.Project).directorySubtype === SAM.ProjectDirectorySubtype.WF_PROJECT,\n execute: async (asset: SAM.AdobeAsset) => {\n sendAnalytics({\n element: asset,\n subcategory: viewLocation,\n type: 'click',\n subtype: 'workfront-open',\n sequence: 'context-menu',\n userId,\n });\n\n try {\n const workfrontContext = await getWorkfrontContext();\n const link = await workfrontContext.getWorkfrontLink(asset.id);\n\n if (typeof link !== 'string') {\n throw new Error('Error getting link');\n }\n\n openLink({\n dispatchEvent,\n url: link,\n });\n\n sendAnalytics({\n element: asset,\n subcategory: viewLocation,\n type: 'success',\n subtype: 'workfront-open',\n sequence: 'toast',\n userId,\n });\n } catch (e) {\n console.log('Error opening in Workfront', e);\n sendAnalytics({\n element: asset,\n subcategory: viewLocation,\n type: 'error',\n sequence: 'toast',\n subtype: 'workfront-open',\n error: e as Error,\n });\n }\n },\n };\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { checkAllowedAdobeAssetsBeforeOp } from '@csc/adobe-assets-view';\nimport { getBaseUrlMap, useHostConfig, useTheme, useDocumentCallbacks } from '@csc/common';\nimport { useSAM } from '@csc/sam-utils';\nimport { useMemo } from 'react';\nimport { useIntl } from 'react-intl';\n\nimport { useProjectActionAnalytics } from './useAnalytics';\nimport { usePerformance } from './usePerformance';\nimport type { Action } from '../actions';\nimport createCopyLinkAction from '../actions/copyLink';\nimport createDiscardAction from '../actions/discard';\nimport createInviteAction from '../actions/invite';\nimport createLeaveAction from '../actions/leave';\nimport createRenameAction from '../actions/rename';\nimport createWorkfrontOpenAction from '../actions/workfrontOpen';\nimport type { ProjectViewLocations } from '../utils/ingest';\n\nexport type Options = {\n onDestructiveActionSuccess?: () => unknown;\n viewLocation: ProjectViewLocations;\n actionFilter?: (value: string) => boolean;\n};\n\nexport default function useProjectActions({\n onDestructiveActionSuccess,\n viewLocation,\n actionFilter = () => true,\n}: Options): Action[] {\n const intl = useIntl();\n const themeInfo = useTheme();\n const { showModal, showToast, routes, imsData, environment, dispatchEvent } = useHostConfig();\n const sendAnalytics = useProjectActionAnalytics();\n const performance = usePerformance();\n const sam = useSAM();\n const getWorkfrontContext = sam?.getWorkfrontContext;\n const userId = imsData?.userId;\n const baseUrls = useMemo(() => getBaseUrlMap(environment), [environment]);\n const { onBeforeRename, onBeforeDelete, getOpenCloudDocuments } = useDocumentCallbacks();\n\n return useMemo(() => {\n const actions = [\n createWorkfrontOpenAction({\n sendAnalytics,\n intl,\n userId,\n viewLocation,\n dispatchEvent,\n getWorkfrontContext,\n }),\n createInviteAction({ sendAnalytics, intl, showModal, userId, viewLocation }),\n createCopyLinkAction({\n sendAnalytics,\n intl,\n routes,\n showToast,\n themeInfo,\n userId,\n viewLocation,\n baseUrls,\n dispatchEvent,\n sam,\n }),\n createRenameAction({\n sendAnalytics,\n intl,\n performance,\n showModal,\n viewLocation,\n onBefore: async (elements) =>\n checkAllowedAdobeAssetsBeforeOp({\n elements,\n getBlockedAssets: onBeforeRename,\n intl,\n showToast,\n getCurrentlyOpenAssets: getOpenCloudDocuments,\n sam,\n }),\n }),\n createLeaveAction({\n sendAnalytics,\n intl,\n onSuccess: onDestructiveActionSuccess,\n showModal,\n userId,\n viewLocation,\n onBefore: async (elements) =>\n checkAllowedAdobeAssetsBeforeOp({\n elements,\n intl,\n showToast,\n getCurrentlyOpenAssets: getOpenCloudDocuments,\n sam,\n }),\n }),\n createDiscardAction({\n sendAnalytics,\n intl,\n onSuccess: onDestructiveActionSuccess,\n showModal,\n viewLocation,\n onBefore: async (elements) =>\n checkAllowedAdobeAssetsBeforeOp({\n elements,\n getBlockedAssets: onBeforeDelete,\n intl,\n showToast,\n getCurrentlyOpenAssets: getOpenCloudDocuments,\n sam,\n }),\n }),\n ];\n return actions.filter((action) => actionFilter(action.value));\n }, [\n sendAnalytics,\n intl,\n showModal,\n userId,\n viewLocation,\n routes,\n showToast,\n themeInfo,\n baseUrls,\n dispatchEvent,\n performance,\n onDestructiveActionSuccess,\n onBeforeRename,\n getOpenCloudDocuments,\n sam,\n onBeforeDelete,\n actionFilter,\n getWorkfrontContext,\n ]);\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { LIBRARIES_MIMETYPES } from '@csc/adobe-assets-view/dist/src/utils/filtering-utils/filtering-type-enums';\nimport { useHostConfig } from '@csc/common';\n\nimport { useFeatureFlagValue } from '../components/withProviders/useFeatureFlagValue';\n\n// Control a set of host-specific configurations and logic that are not part of the host config.\nexport default function useHostExtendedConfig() {\n const { appId } = useHostConfig();\n const workfrontProjectsEnabled = useFeatureFlagValue('workfrontProjects');\n\n let supportCreateLibrary = true;\n let supportLibraryDropdown = false;\n let supportWorkfrontProjects = false;\n let supportLinkedBrands = true;\n let excludeMediaTypes: string[] | undefined;\n\n if (\n ['photoshop', 'photoshop_web', 'illustrator', 'in_design', 'firefly'].includes(appId ?? '')\n ) {\n excludeMediaTypes = LIBRARIES_MIMETYPES.LIBRARIES;\n // In Photoshop, 'create library' action from project contents view is not allowed.\n supportCreateLibrary = false;\n supportLibraryDropdown = true;\n supportWorkfrontProjects = workfrontProjectsEnabled;\n supportLinkedBrands = false;\n }\n\n if (appId === 'firefly') {\n excludeMediaTypes = undefined; // Firefly has library types\n }\n\n return {\n excludeMediaTypes,\n supportCreateLibrary,\n supportLibraryDropdown,\n supportWorkfrontProjects,\n supportLinkedBrands,\n };\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { SAM } from '@ccx-public/component-types';\nimport { useOnline } from '@csc/common';\nimport { useEffect, useRef } from 'react';\n\n/**\n * Hook to refresh a SAM list automatically when the user comes back online.\n * Must only be called inside a component that is wrapped in a <NetworkContext.Provider>\n * Note - the component where the list is used must NOT be unmounted when the user goes offline (i.e rendering a different Offline Illustrated Message component)\n * Otherwise, the offline to online state change will not be detected and the list will not be refreshed.\n * @param list - The list to refresh on resuming online.\n */\nexport default function useRefreshListOnResume<T extends SAM.AdobeAsset>(\n list?: SAM.IItemList<SAM.IItemSourceConfig<T>>,\n) {\n const isOnline = useOnline();\n const didMount = useRef(false);\n\n // use a ref to store the list to avoid having the list be a dependency on the onResume useEffect\n // Changes in like sortby, sortDirection, etc will change the list object causing the useEffect to run\n // Instead we can use the ref to call various refresh functions against the list\n // and avoid the dependency on the list object directly in the onResume useEffect\n const listRef = useRef(list);\n\n // Update the list ref when the list changes\n useEffect(() => {\n listRef.current = list;\n }, [list]);\n\n // On Resume, refresh the list\n useEffect(() => {\n function onResume() {\n if (!listRef.current) {\n return;\n }\n listRef.current.items.forEach((item) => {\n if (item.thumbnailStatus === SAM.RenditionStatus.Error) {\n item.clearRenditionError();\n }\n });\n if (listRef.current.status === SAM.AssetListStatus.HadLoaderErrors) {\n // If the list had loader errors from going offline, we should try to force a refresh\n // to clear out any error states. In most cases we should avoid using setNeedsRefresh()\n // as it forces an immediate network request\n listRef.current.setNeedsRefresh();\n } else {\n // If the list is not in an error state, we can call refresh()\n // Timeouts on the list are respected when using refresh() so we don't need to worry about fetching too often\n listRef.current.refresh();\n }\n }\n\n if (!didMount.current) {\n // we don't want the first time the hook is called to be considered going back online\n didMount.current = true;\n } else if (isOnline) {\n // This useEffect is triggered only when isOnline changes\n // If the value of isOnline is true, it implies that the user has gone from offline to online\n // and we can call the onResume callback\n onResume();\n }\n }, [isOnline]);\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nexport const projectRoles = [\n { role: 'EDIT_SHARE', label: 'EDIT', preselected: true },\n { role: 'VIEW', label: 'COMMENT' },\n];\n\nexport type ProjectInviteRole = {\n role: string;\n label?: string;\n preselected?: boolean;\n};\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\n/**\n * Normalized platform values\n */\nexport enum Platform {\n Mac,\n Windows,\n Android,\n iOS,\n Web,\n Linux,\n}\n\nexport default function getPlatform(): Platform {\n const userAgent = navigator.userAgent.toLowerCase();\n\n if (/iphone|ipad|ipod/.test(userAgent)) {\n return Platform.iOS;\n } else if (/android/.test(userAgent)) {\n return Platform.Android;\n } else if (/mac/.test(userAgent)) {\n return Platform.Mac;\n } else if (/win/.test(userAgent)) {\n return Platform.Windows;\n } else if (/linux/.test(userAgent)) {\n return Platform.Linux;\n } else {\n return Platform.Web;\n }\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport type { SAM } from '@ccx-public/component-types';\nimport { constructAssetLink } from '@csc/adobe-assets-view/dist/src/utils/asset-link/constructAssetLink';\nimport {\n filterBooleanAttributes,\n getBaseUrlMap,\n INVITE_API_VERSION,\n useHostConfig,\n useTheme,\n} from '@csc/common';\nimport { useSAM } from '@csc/sam-utils';\nimport React, { useEffect, useMemo, useState } from 'react';\n\nimport type { ProjectInviteRole } from './types';\nimport { projectRoles } from './types';\nimport { DUMMY_PROJECT_EMAIL_NOTIFICATION } from '../../constants';\nimport useShareSheetPropertiesAndCallbacks from '../../hooks/useShareSheetPropertiesAndCallbacks';\nimport type { IShareSheetCallbacks } from '../../interfaces/ShareSheetInterface';\n\nconst DUMMY_PROJECT_EMAIL_NOTIFICATION_JSON = JSON.stringify(DUMMY_PROJECT_EMAIL_NOTIFICATION);\n\nexport interface BaseProps extends IShareSheetCallbacks {\n project: SAM.AdobeAsset;\n hideheader?: boolean;\n minHeight?: string;\n minWidth?: string;\n messageConfigLineHeight?: number;\n}\n\ninterface ProjectProps extends BaseProps {\n wizarddata?: string;\n sendmessagerequestevent?: boolean;\n suppressemailnotifications?: boolean;\n disablelinkaccess?: boolean;\n title?: string;\n}\n\ninterface Props extends ProjectProps {\n roles: ProjectInviteRole[];\n emailnotification: string;\n notificationLinkUrl?: string;\n copyLinkUrl?: string;\n}\n\n/**\n * Common sharesheet configuration for share project/shared folder\n */\nexport const ShareBaseDialog = ({\n project,\n wizarddata,\n sendmessagerequestevent,\n suppressemailnotifications,\n disablelinkaccess,\n roles,\n emailnotification,\n notificationLinkUrl,\n copyLinkUrl,\n title,\n hideheader,\n messageConfigLineHeight = 6,\n ...callbacks\n}: Props) => {\n // HTML attributes such as booleans and strings are directly attached to the cc-share-dialog Sharesheet below. However, HTML properties and custom events are managed through this hook.\n const ref = useShareSheetPropertiesAndCallbacks(callbacks, roles, {\n lineHeight: messageConfigLineHeight,\n });\n const { disableAnalytics, scale } = useHostConfig();\n const { themeIsExpress } = useTheme();\n\n return (\n <cc-share-dialog\n ref={ref}\n {...filterBooleanAttributes({\n sendmessagerequestevent,\n suppressemailnotifications,\n disablelinkaccess,\n hideheader,\n analyticsenabled: !disableAnalytics,\n compactlayout: scale === 'large',\n hideclosebutton: themeIsExpress || Boolean(wizarddata),\n })}\n data-testid=\"cc-share-dialog\"\n assetid={project.id}\n assetname={project.name}\n wizarddata={wizarddata}\n title={title}\n assettype=\"project\"\n emailnotification={emailnotification}\n targeturl={copyLinkUrl}\n enablefacepile\n notificationlinkurl={notificationLinkUrl}\n openeddialog=\"share\"\n inviteapiversion={INVITE_API_VERSION}\n />\n );\n};\n\n/**\n * Common sharesheet configuration for share project workflows:\n * wizard (ProjectCreationWizard) and share dialog (ProjectInviteDialog)\n */\nexport const ShareProjectBaseDialog = ({ project, ...rest }: ProjectProps) => {\n const { routes: routeTemplates, environment, dispatchEvent, locale } = useHostConfig();\n const sam = useSAM();\n const baseUrls = useMemo(() => getBaseUrlMap(environment), [environment]);\n const [copyLinkUrl, setCopyLinkUrl] = useState<string | undefined>(undefined);\n const [notificationLinkUrl, setNotificationLinkUrl] = useState<string | undefined>(undefined);\n\n // Split up targeturl to separate tracking source from email invites vs copy-links via the openFrom query param\n // See ShareSheet docs for more info https://git.corp.adobe.com/CCX/ccx-sharing/blob/3216350ef5432f0059dce0df1eff19e145bf081b/packages/component-react/README.md#resourceviewurl-default-logic\n useEffect(() => {\n void (async () => {\n const copyLink = await constructAssetLink({\n asset: project,\n locale,\n baseUrls,\n routeTemplates,\n linkSource: 'copy-link',\n dispatchEvent,\n sam,\n });\n const notificationLink = await constructAssetLink({\n asset: project,\n locale,\n baseUrls,\n routeTemplates,\n linkSource: 'email-invite',\n dispatchEvent,\n sam,\n });\n setCopyLinkUrl(copyLink);\n setNotificationLinkUrl(notificationLink);\n })();\n }, [project, locale, baseUrls, routeTemplates, dispatchEvent, sam]);\n\n if (!copyLinkUrl || !notificationLinkUrl) {\n return null;\n }\n return (\n <ShareBaseDialog\n roles={projectRoles}\n notificationLinkUrl={notificationLinkUrl}\n copyLinkUrl={copyLinkUrl}\n // Share project uses server-side external email, but invitations service expects at least a\n // dummy template. Invite will fail to send if `undefined` template, or will successfully\n // send but with no email out to invitees if empty object `{}` template.\n emailnotification={DUMMY_PROJECT_EMAIL_NOTIFICATION_JSON}\n {...rest}\n project={project}\n />\n );\n};\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2023 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { useHostConfig } from '@csc/common';\nimport { useEffect, useRef } from 'react';\n\nimport type { ProjectInviteRole } from '../components/ShareBaseDialog/types';\nimport type { IShareSheetCallbacks } from '../interfaces/ShareSheetInterface';\nimport getPlatform from '../utils/getPlatform';\n\nexport default function useShareSheetPropertiesAndCallbacks(\n callbacks: IShareSheetCallbacks,\n roles: ProjectInviteRole[],\n messageConfig: { lineHeight: number },\n) {\n const {\n onInviteFulfilled,\n onInviteRejected,\n onRemoveFulfilled,\n onRemoveRejected,\n onSkip,\n onIngestEvent,\n } = callbacks;\n\n const { productId, appVersion, clientId } = useHostConfig();\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const { current } = ref;\n if (current) {\n // ShareSheet HTML properties (objects and arrays)\n current['roles'] = roles;\n current['features'] = { groups: true };\n current['idpClientId'] = clientId;\n current['analyticsData'] = {\n source: {\n client_id: clientId,\n name: productId,\n platform: getPlatform(),\n version: appVersion,\n },\n event: {\n category: 'WEB',\n },\n };\n current['messageConfig'] = messageConfig;\n\n // ShareSheet HTML custom events (callbacks)\n if (onIngestEvent) {\n current.addEventListener('ingestEvent', onIngestEvent as EventListener);\n }\n if (onInviteFulfilled) {\n current.addEventListener('inviteFulfilled', onInviteFulfilled);\n }\n if (onInviteRejected) {\n current.addEventListener('inviteRejected', onInviteRejected);\n }\n if (onRemoveFulfilled) {\n current.addEventListener('removeFulfilled', onRemoveFulfilled);\n }\n if (onRemoveRejected) {\n current.addEventListener('removeRejected', onRemoveRejected);\n }\n if (onSkip) {\n current.addEventListener('skip', onSkip);\n }\n }\n\n return () => {\n if (current) {\n if (onIngestEvent) {\n current.removeEventListener('ingestEvent', onIngestEvent as EventListener);\n }\n if (onInviteFulfilled) {\n current.removeEventListener('inviteFulfilled', onInviteFulfilled);\n }\n if (onInviteRejected) {\n current.removeEventListener('inviteRejected', onInviteRejected);\n }\n if (onRemoveFulfilled) {\n current.removeEventListener('removeFulfilled', onRemoveFulfilled);\n }\n if (onRemoveRejected) {\n current.removeEventListener('removeRejected', onRemoveRejected);\n }\n if (onSkip) {\n current.removeEventListener('skip', onSkip);\n }\n }\n };\n }, [\n appVersion,\n clientId,\n messageConfig,\n onIngestEvent,\n onInviteFulfilled,\n onInviteRejected,\n onRemoveFulfilled,\n onRemoveRejected,\n onSkip,\n productId,\n roles,\n ]);\n\n return ref;\n}\n","/*************************************************************************\n *\n * ADOBE CONFIDENTIAL\n * ___________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n **************************************************************************/\n\nimport { useHostConfig, useShareSheetLoader as useShareSheetLoaderCommon } from '@csc/common';\n\nexport default function useShareSheetLoader() {\n const {\n appId,\n environment,\n locale,\n clientId,\n imsData,\n productId,\n theme,\n spectrumTheme,\n shareSheetVersion,\n } = useHostConfig();\n\n return useShareSheetLoaderCommon({\n appId,\n environment,\n locale,\n clientId,\n productId,\n userId: imsData.userId,\n userEmail: imsData.email,\n themeType: spectrumTheme,\n theme,\n shareSheetVersion,\n });\n}\n"],"names":["PROJECT_NAME_MAX_LENGTH","DUMMY_PROJECT_EMAIL_NOTIFICATION","sharing","viewer","editor","acceptance","ProjectContext","createContext","NoCollaborators","React","className","styles$2","emptyStateMessage","FormattedMessage","id","defaultMessage","SharedWithSection","observer","collaborators","limit","themeIsExpress","useTheme","people","slice","headerText","map","name","email","collaboratorID","i","key","sharedWithCollaboratorName","CollaboratorName","length","values","count","You","you","_a","userId","useHostConfig","collaboratorName","ellipsis","CreatorName","_b","project","useContext","creator","displayName","CollaboratorPopoverContent","_c","_d","ownerName","storageAssignee","hasPermission","SAM","Write","orgEverybody","collaboratorArray","find","type","c","getProjectOwnerCollaborator","repositoryOwner","ownerID","collaboratorsExcludingOwner","filter","contentBelowDivider","classnames","collaboratorSummary","express","Rule","divider","variant","UserIconAndCount","iconSize","themeIsSpectrum","userIconAndCount","spectrum","IconUserGroup","usersIcon","iconXS","size","userCount","FormattedNumber","value","LoadingPlaceholder","loading","style","children","exampleElement","ExampleElement","dataTestId","styles","loadingGradient","element","FacePileItem","item","avatarURL","getAvatarURL","call","Size50","user","styles$1","facePileItem","facePileItemBackground","src","alt","facePileItemImg","split","n","join","FacePile","items","hasMore","moreCount","faceCount","Math","min","faces","facePileItems","Array","from","reverse","facePile","facePileMore","collaborator","index","facePileItemLoading","CollaboratorCount","isMobile","useMobile","OverlayTrigger","trigger","placement","onClick","e","preventDefault","stopPropagation","tabIndex","Tooltip","open","popoverContent","CollaboratorFacepile","intl","useIntl","ariaLabel","formatMessage","display","CreatorFacePile","useMemo","DirectCollaboratorsFacepile","useDirectCollaborators","projectId","useProject","Provider","ProjectInviteDialog","viewLocation","useShareSheetLoader","sendAnalytics","useProjectSharingAnalytics","width","height","minHeight","minWidth","maxHeight","ShareProjectBaseDialog","onIngestEvent","event","CLIENT_ID","environmentConfigs","stage","FLOODGATE_ENDPOINT","FLOODGATE_CLIENT_ID","FLOODGATE_SANDBOX_NAME","FLOODGATE_GW_IMS_ORG_ID","prod","floodgateFetch","async","accessToken","environment","refreshToken","allowRetry","config","getEnvironmentConfig","url","fetchOptions","method","headers","Authorization","response","fetch","status","newToken","Error","json","releases","features","DEFAULT_FEATURE_FLAGS","floodgateFeatureFlagsCache","FeatureFlagsContext","getSpectrumTheme","spectrumTheme","getBrowserData","ua","version","matches","match","RawProviders","props","documentCallbacks","featureFlags","hostConfigOverrides","mobileConfig","isOnline","sam","enablePerformanceMeasurement","scale","theme","useEffect","window","performance","measure","HostConfigOverrides","MobileProvider","NetworkProvider","online","SpectrumProvider","SAMProvider","IntlProvider","DocumentCallbacksProvider","Providers","adminModeOrgId","appName","appVersion","clientId","disableAnalytics","dispatchEvent","hostFeatureFlags","imsData","locale","productId","showModal","hostShowModal","showToast","hostShowToast","useIntlLoader","samLoaded","useLoadPerformance","useSAMInitializer","loaded","productLocation","ProductLocation","Projects","loadedProps","setLoadedProps","useState","cancelled","preloadSpectrum","then","catch","console","error","useSpectrumPreloader","setFeatureFlags","newFeatureFlags","fetchFeatureFlags","Object","keys","useFeatureFlagsLoader","toastContainer","showToastFallback","useToasts","useCallback","options","showModalResult","useOverlayAPIDialog","Promise","reject","AssetBrowser","NotImplemented","handleShowModalResult","canRender","ingestConfig","allowNoToken","apiKey","data","env","com","navigator","userAgent","category","user_agent","user_guid","source","client_id","platform","product","Ingest","disabled","init","RenderedEvent","withProviders","WrappedComponent","rest","EmptyProjectIllustrationSpectrum","role","viewBox","fill","xmlns","d","strokeWidth","strokeLinecap","strokeLinejoin","cx","cy","r","fillRule","clipRule","IllustratedMessage","heading","imageSrc","imageAlt","img","illustration","IllustratedMessage$1","illustratedMessage","mobile","OfflineIllustration","stroke","ProjectListOfflineState","offlineState","description","noIllustratedMessageTitleToHeading","Header","header","createWrapper","fallback","undefined","swcLoader","swcProps","icon","optionalIcon","cloneElement","slot","class","tagName","ActionMenu","actions","hideDestructiveActions","availableActions","reduce","memo","action","isVisible","concat","nonDestructiveActions","groupName","destructiveActions","DropdownButton","onSelect","a","label","execute","renderMenuItem","MenuDivider","MenuItem","ProjectActionMenu","onDestructiveActionSuccess","actionFilter","useProjectActions","IconMore","quiet","ProjectInviteButton","useProjectActionAnalytics","ref","useRef","handleClick","subcategory","subtype","sequence","current","addEventListener","removeEventListener","Button","HEADING_TAGS","HEADING_STYLES","xxxl","xxl","xl","l","m","s","xs","xxs","Heading","level","HeadingTag","ResponsiveVisibilityWrapper","onVisibilityChange","elementRef","setIsVisible","handleVisibilityChange","visible","parentElement","IntersectionObserver","entries","every","entry","intersectionRatio","root","threshold","observe","disconnect","NotFoundIllustration","color","RequestAccessIllustration","ProjectContentsErrorState","isDiscarded","errorCode","isSAMError","code","getErrorCode","NOT_FOUND","styles$4","NavigationEvent","ACCESS_DENIED","errorStateIllustration","createExpressBrandUrl","brandId","getBaseUrlMap","EXPRESS_WEB","renderLibraryMenuItem","isBrand","IconBrand","CCLibrary","LibrariesDropdown","baseUrls","useSAM","allLibrariesAndBrandsList","useLibraryList","sortBy","sortDirection","loadAll","filterParams","reference","All","libraries","brands","isReferencedByProject","referencedBrands","totalCount","allItemsMap","acc","formatNumber","alignRight","asset","some","brand","openLink","constructAssetLink","MenuGroup","getProjectFilterTypes","excludeMediaTypes","includeBrandsAndLibraries","mimeType","MIMETYPES","LIBRARIES","AllFiles","Photoshop","Illustrator","Express","Concept","Acrobat","InDesign","Aero","XD","Squirrel","Assets3d","Libraries","Brands","Images","Videos","Audio","getProjectsContentFilterOptions","getTypeViewModel","hideFilter","compatibleTypesFilter","supportLibraryDropdown","useHostExtendedConfig","navigateBackToProjects","canEdit","isShareProjectActionAllowed","filterOptions","HeaderNavigation","rootAsset","rootTitle","Badge","ProjectViewLocations","ProjectContents","vertical","HeaderActionButton","FileTypeFilter","filterValue","HeaderViewOptions","ShowAllFilesButton","assetId","treatment","Project","params","BrandOverflowDropdown","overflowBrands","onBrandSelect","onViewAllInExpress","showViewAll","LinkedBrands","sendBrandAnalytics","useLinkedBrandClickAnalytics","referencedBrandsFilterParams","roles","Brand","Only","brandsLibrariesList","visibleBrands","effectiveLimit","visibilityMap","setVisibilityMap","initialMap","forEach","prev","newMap","visibleCount","Boolean","hiddenCount","useResponsiveBrandDisplay","handleAnyBrandSelect","b","expressUrl","handleViewAllInExpress","expressProjectUrl","createExpressProjectUrl","showDropdown","showViewAllButton","linkedBrands","brandList","brandItems","DEFAULT_PROJECT_CONTENTS_CONFIG","view","ProjectContents$1","launchUAP","hideActionToolbar","hideEmptyViewActions","onSelectionChange","selectionManager","selectionBehavior","onBeforeItemClicked","shouldRenderItemAsDisabled","routeId","HeaderComponent","compatibleTypes","hostConfig","supportLinkedBrands","useCompatibleTypesFilter","updateLastAccessed","isCSCProject","directorySubtype","WF_PROJECT","useAsset","useOnline","currentAsset","currentFilter","defaultFilter","decodeFilter","fileTypes","findIndex","option","emptyViewProps","metrics","Metrics","AAVComponentId","PROJECTS","image","EmptyCloudDocs","titleId","customButtons","renderEventMetricSubtype","ingestSubcategory","PROJECTCONTENTS_SUBCATEGORY","IconAdd","useProjectEmptyViews","clientSideFilters","filterViewModel","constructIFilter","getFilterEmptyProps","extendedAssetActionFilter","extendedProjectActionFilter","samFilter","useAdobeAssetFilter","filterType","list","useAssetList","useRefreshListOnResume","parentFolder","assetList","hostAssetContext","projectContext","supportCreateLibrary","closeModal","routes","renameCallbacks","useRenameCallbacks","perf","usePerformance","trackProjectAction","perfTracker","renameEvent","pagename","metricLogger","getOperationalMetricLogger","ActionAnalyticsValue","Rename","onCancel","aavRenameCallbacks","onConfirm","finish","startMeasure","onConflict","onError","onSuccess","_a2","supportProjectContentsExport","useFeatureFlagValue","supportsUpload","supportsAddToBoard","getOpenCloudDocuments","onBeforeRename","onBeforeMove","onBeforeDelete","promptUserForFileImport","importFiles","useDocumentCallbacks","isCreator","userIsProjectCreator","createdBy","createImportAction","samList","callbacks","createMoveFromAction","getAssetWithCloudID","getCurrentlyOpenAssets","Move","destinationAsset","createAddFolderAction","AddFolder","isProject","createNewLibraryAction","parentProject","NewLibrary","createOpenAction","canOpenMultiple","Open","createShareAction","createCopyLinkAction","CopyLink","createRenameAction","onBefore","checkAllowedAssetsBeforeOp","elements","getBlockedAssets","createDuplicateAction","Duplicate","createMoveAction","assetContext","viewId","createExportAction","Export","createAddLibraryAction","AddLibrary","createRemoveLibraryAction","Remove","createLeaveAction","Leave","createReportAbuseAction","ReportAbuse","createDiscardAction","includeUndo","Discard","undoMetricLogger","getUndoOperationalMetricLogger","onAfter","resolve","createAddToBoardAction","CDO","AddToBoard","useProjectContentActions","handleViewOptionsChange","viewOptions","updatedOptions","sortDir","viewMode","fireEvent","workflow","Workflow","Navigation","EventType","Click","ui","sort_order","sort_sequence","onRouted","AAVIngest","Wait","AdobeAssetsView","componentId","ReadyFullyLoaded","filters","onViewOptionsChange","showRootBackButton","getEmptyViewProps","launchItems","backedItems","asset2","backingItem","openAdobeAsset","ClickSource","Asset","useAnalytics","formatter","CustomEvent","bubbles","composed","detail","useAupAnalytics","aupSdk","SharedConfig","cSdk","eventName","workflowData","fullWorkflowData","module","global","AssetBrowserVersion","fullEventName","location","ProjectCreationWizard","ProjectCreate","getEventName","workflowContext","createWorkflowContext","fireAnalyticsEvent","referenceId","projectActionEvent","useProjectSortAnalytics","projectSortEvent","useProjectOrganizerClickAnalytics","projectOrganizerClickEvent","useProjectListRenderAnalytics","projectListRenderEvent","useProjectFilterAnalytics","projectFilterEvent","projectSharingEvent","useProjectOrganizerSearchTriggerAnalytics","projectOrganizerSearchTriggerEvent","useProjectOrganizerSearchResultRenderAnalytics","projectOrganizerSearchResultRenderEvent","useProjectOrganizerSearchResultItemClickAnalytics","projectOrganizerSearchResultItemClickEvent","linkedBrandClickEvent","feature","includes","getLinkBlob","link","routeTemplates","linkSource","Blob","themeInfo","IconLink","clipboard","write","ClipboardItem","content","Content","forwardRef","DialogFooter","buttonSize","ButtonGroup","footer","dir","orientation","ProjectDiscardDialog","isLoading","setIsLoading","handleCancel","Cancel","AssetsWebLink","ASSETS_WEB_DELETED_LINK","Link","target","href","handleSubmit","finishMeasure","discard","dismissTime","actionCallback","callback","args","restore","UndoProjectDiscard","arg","Success","Loading","dialogStyles","loadingSpinner","softDelete","strong","chunks","isEmpty","ExternalLink","localizedGoUrl","getPrimaryLocale","IconDelete","onClose","createInviteAction","IconInvite","getErrorMessage","reason","CANNOT_LEAVE_ADDRESS_BOOK_GROUP_MEMBER","CANNOT_LEAVE_IS_OWNER","CANNOT_LEAVE_IS_ADMIN_OF_PROJECT","CANNOT_LEAVE_LAST_COLLABORATOR","CANNOT_LEAVE_NO_COLLABORATORS","CANNOT_LEAVE_LAST_DIRECT_COLLAB_WITH_SHARE_PERMISSION","ProjectLeaveDialog","handleCanLeave","removeCurrentUserFromCollaborationList","handleCannotLeave","leaveStatus","CAN_LEAVE","leaveDialogStyles","container","LoadingState","warning","IconLeave","testId","perfId","RenameDialog","createWorkfrontOpenAction","getWorkfrontContext","workfrontContext","getWorkfrontLink","log","checkAllowedAdobeAssetsBeforeOp","appId","workfrontProjectsEnabled","supportWorkfrontProjects","LIBRARIES_MIMETYPES","didMount","listRef","thumbnailStatus","clearRenditionError","HadLoaderErrors","setNeedsRefresh","refresh","projectRoles","preselected","getPlatform","toLowerCase","test","DUMMY_PROJECT_EMAIL_NOTIFICATION_JSON","JSON","stringify","ShareBaseDialog","wizarddata","sendmessagerequestevent","suppressemailnotifications","disablelinkaccess","emailnotification","notificationLinkUrl","copyLinkUrl","title","hideheader","messageConfigLineHeight","messageConfig","onInviteFulfilled","onInviteRejected","onRemoveFulfilled","onRemoveRejected","onSkip","groups","useShareSheetPropertiesAndCallbacks","lineHeight","filterBooleanAttributes","analyticsenabled","compactlayout","hideclosebutton","assetid","assetname","assettype","targeturl","enablefacepile","notificationlinkurl","openeddialog","inviteapiversion","INVITE_API_VERSION","setCopyLinkUrl","setNotificationLinkUrl","copyLink","notificationLink","shareSheetVersion","useShareSheetLoader$1","userEmail","themeType"],"sourceRoot":""}