@box/unified-share-modal 3.7.2 → 3.7.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/shared-link-settings-modal.js +1 -1
- package/dist/esm/lib/components/shared-link-settings-modal/shared-link-settings.js +1 -1
- package/dist/esm/lib/containers/shared-link-settings-container.js +1 -1
- package/dist/esm/lib/contexts/shared-link-settings-context.js +1 -1
- package/dist/esm/lib/hooks/use-collaboration-form.js +1 -1
- package/dist/esm/lib/hooks/use-link-settings-form.js +1 -1
- package/dist/esm/lib/utils/date.js +1 -1
- package/dist/esm/lib/utils/form.js +1 -1
- package/dist/esm/lib/utils/index.js +1 -1
- package/dist/types/lib/components/shared-link-settings-modal/shared-link-settings-modal.d.ts +2 -1
- package/dist/types/lib/contexts/shared-link-settings-context.d.ts +3 -3
- package/dist/types/lib/hooks/use-link-settings-form.d.ts +3 -3
- package/dist/types/lib/types.d.ts +5 -5
- package/dist/types/lib/utils/form.d.ts +3 -3
- package/package.json +10 -10
|
@@ -1 +1 @@
|
|
|
1
|
-
import{useUnifiedShareModalContext}from"../esm/lib/contexts/unified-share-modal-context.js";import{useSharedLinkSettingsContext}from"../esm/lib/contexts/shared-link-settings-context.js";import{t as ClassificationStatus}from"./classification-status.js";import messages from"../esm/lib/components/shared-link-settings-modal/messages.js";import{SharedLinkSettings}from"../esm/lib/components/shared-link-settings-modal/shared-link-settings.js";import{useEffect,useState}from"react";import clsx from"clsx";import{useIntl}from"react-intl";import{Divider,LoadingIndicator,Modal}from"@box/blueprint-web";import{jsx,jsxs}from"react/jsx-runtime";import '../styles/shared-link-settings-modal.css';var shared_link_settings_modal_module_default={content:`_content_v2gl6_1`,isFullscreen:`_isFullscreen_v2gl6_4`,body:`_body_v2gl6_13`,title:`_title_v2gl6_23`,form:`_form_v2gl6_43`,isLoading:`_isLoading_v2gl6_50`,loading:`_loading_v2gl6_54`,divider:`_divider_v2gl6_62`};function SharedLinkSettingsModal({isOpen,onOpenChange}){let{formatMessage}=useIntl(),{eventService,isSubmitting,variant
|
|
1
|
+
import{useUnifiedShareModalContext}from"../esm/lib/contexts/unified-share-modal-context.js";import{useSharedLinkSettingsContext}from"../esm/lib/contexts/shared-link-settings-context.js";import{t as ClassificationStatus}from"./classification-status.js";import messages from"../esm/lib/components/shared-link-settings-modal/messages.js";import{SharedLinkSettings}from"../esm/lib/components/shared-link-settings-modal/shared-link-settings.js";import{useEffect,useState}from"react";import clsx from"clsx";import{useIntl}from"react-intl";import{Divider,LoadingIndicator,Modal}from"@box/blueprint-web";import{jsx,jsxs}from"react/jsx-runtime";import '../styles/shared-link-settings-modal.css';var shared_link_settings_modal_module_default={content:`_content_v2gl6_1`,isFullscreen:`_isFullscreen_v2gl6_4`,body:`_body_v2gl6_13`,title:`_title_v2gl6_23`,form:`_form_v2gl6_43`,isLoading:`_isLoading_v2gl6_50`,loading:`_loading_v2gl6_54`,divider:`_divider_v2gl6_62`};function SharedLinkSettingsModal({isActive,isOpen,onOpenChange}){let{formatMessage}=useIntl(),{eventService,isSubmitting,variant}=useUnifiedShareModalContext(),{onSharedLinkSettingsClose,onSharedLinkSettingsLoad}=eventService,canInitialize=isActive??isOpen,isDesktop=variant===`desktop`,{resetForm,setContainerRef,submitForm}=useSharedLinkSettingsContext(),[isLoading,setIsLoading]=useState(!!onSharedLinkSettingsLoad);useEffect(()=>{(async()=>{onSharedLinkSettingsLoad&&(canInitialize&&await onSharedLinkSettingsLoad(),setIsLoading(!canInitialize))})()},[canInitialize,onSharedLinkSettingsLoad]);let handleCancel=()=>{isSubmitting||(resetForm(),onSharedLinkSettingsClose&&onSharedLinkSettingsClose(),onOpenChange(!1))};return jsx(Modal,{onOpenChange:handleCancel,open:isOpen,children:jsxs(Modal.Content,{ref:setContainerRef,className:clsx(shared_link_settings_modal_module_default.content,isDesktop&&shared_link_settings_modal_module_default.isFullscreen),onEscapeKeyDown:event=>{event.stopPropagation()},onPointerDownOutside:event=>{event.preventDefault()},size:`medium`,children:[jsxs(Modal.Header,{children:[jsx(`div`,{className:shared_link_settings_modal_module_default.title,children:formatMessage(messages.title)}),jsx(ClassificationStatus,{})]}),jsxs(`div`,{className:clsx(shared_link_settings_modal_module_default.form),children:[isLoading&&jsx(`div`,{className:shared_link_settings_modal_module_default.loading,children:jsx(LoadingIndicator,{"aria-label":formatMessage(messages.loadingLabel),size:`large`})}),jsxs(Modal.Body,{className:clsx(shared_link_settings_modal_module_default.body,isLoading&&shared_link_settings_modal_module_default.isLoading),children:[isDesktop&&jsx(Divider,{className:shared_link_settings_modal_module_default.divider}),jsx(SharedLinkSettings,{})]}),jsxs(Modal.Footer,{className:clsx(isLoading&&shared_link_settings_modal_module_default.isLoading),children:[jsx(Modal.Footer.SecondaryButton,{disabled:isSubmitting,onClick:handleCancel,children:formatMessage(messages.cancelButton)}),jsx(Modal.Footer.PrimaryButton,{id:`usm-SharedLinkSettingsModal-primaryButton`,loading:isSubmitting,loadingAriaLabel:formatMessage(messages.loadingLabel),onClick:async()=>{await submitForm()||(resetForm(),onOpenChange(!1))},children:formatMessage(messages.saveButton)})]})]}),!isDesktop&&jsx(Modal.Close,{"aria-label":formatMessage(messages.closeButton),disabled:isSubmitting})]})})}export{SharedLinkSettingsModal as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{OTP_MODE}from"../../constants.js";import{useUnifiedShareModalContext}from"../../contexts/unified-share-modal-context.js";import{useAccessLevels}from"../../hooks/use-access-levels.js";import{useSharedLinkSettingsContext}from"../../contexts/shared-link-settings-context.js";import messages from"./messages.js";import{DownloadSection}from"./download-section.js";import{ExpirationSection}from"./expiration-section.js";import{t as OtpSection}from"../../../../chunks/otp-section.js";import{PasswordSection}from"./password-section.js";import{VanitySection}from"./vanity-section.js";import{useMemo}from"react";import{useIntl}from"react-intl";import{InlineNotice,Link,Text}from"@box/blueprint-web";import{Fragment,jsx,jsxs}from"react/jsx-runtime";function SharedLinkSettings(){let{formatMessage}=useIntl(),{eventService,isSubmitting,setView,sharedLink}=useUnifiedShareModalContext(),{settings={},vanityDomain=``}=sharedLink,{canChangeDownload,canChangeExpiration,canChangeOtp,canChangePassword,canChangeVanityName,isDownloadAvailable,isOtpAvailable,isPasswordAvailable,isVanityNameAvailable,otpAccessEntries,otpAllowlistItemCount=0}=settings,{onOtpAllowlistConfigure}=eventService,otpAccessCount=otpAccessEntries?otpAccessEntries.length:otpAllowlistItemCount,{selectedAccess}=useAccessLevels(),{errors,
|
|
1
|
+
import{OTP_MODE}from"../../constants.js";import{useUnifiedShareModalContext}from"../../contexts/unified-share-modal-context.js";import{useAccessLevels}from"../../hooks/use-access-levels.js";import{useSharedLinkSettingsContext}from"../../contexts/shared-link-settings-context.js";import messages from"./messages.js";import{DownloadSection}from"./download-section.js";import{ExpirationSection}from"./expiration-section.js";import{t as OtpSection}from"../../../../chunks/otp-section.js";import{PasswordSection}from"./password-section.js";import{VanitySection}from"./vanity-section.js";import{useMemo}from"react";import{useIntl}from"react-intl";import{InlineNotice,Link,Text}from"@box/blueprint-web";import{Fragment,jsx,jsxs}from"react/jsx-runtime";function SharedLinkSettings(){let{formatMessage}=useIntl(),{eventService,isSubmitting,setView,sharedLink}=useUnifiedShareModalContext(),{settings={},vanityDomain=``}=sharedLink,{canChangeDownload,canChangeExpiration,canChangeOtp,canChangePassword,canChangeVanityName,isDownloadAvailable,isOtpAvailable,isPasswordAvailable,isVanityNameAvailable,otpAccessEntries,otpAllowlistItemCount=0}=settings,{onOtpAllowlistConfigure}=eventService,otpAccessCount=otpAccessEntries?otpAccessEntries.length:otpAllowlistItemCount,{selectedAccess}=useAccessLevels(),{currentForm,errors,initialForm,setFieldError,setFieldValue,validatePassword}=useSharedLinkSettingsContext(),accessNoticeMessage=useMemo(()=>{if(!selectedAccess)return null;switch(selectedAccess.id){case`collaborators`:return messages.subtitleCollaborators;case`open`:{let subtitleOpenMessage=currentForm.isDownloadEnabled?messages.subtitleOpenDownload:messages.subtitleOpenView,subtitleOtpMessage=currentForm.isDownloadEnabled?messages.subtitleOtpDownload:messages.subtitleOtpView;return currentForm.isOtpEnabled?subtitleOtpMessage:subtitleOpenMessage}case`company`:return currentForm.isDownloadEnabled?messages.subtitleCompanyDownload:messages.subtitleCompanyView;default:return null}},[currentForm.isDownloadEnabled,currentForm.isOtpEnabled,selectedAccess]),handleExpirationToggle=nextChecked=>{setFieldError(`expiration`,void 0),setFieldValue(`isExpirationEnabled`,nextChecked)},handleExpirationChange=value=>{setFieldError(`expiration`,void 0),setFieldValue(`expiration`,value)},handleVanityToggle=nextChecked=>{setFieldError(`vanityName`,void 0),setFieldValue(`isVanityNameEnabled`,nextChecked)},handleVanityNameChange=event=>{setFieldError(`vanityName`,void 0),setFieldValue(`vanityName`,event.target.value)},isOtpSectionVisible=!!isOtpAvailable&&selectedAccess?.id===`open`,isPasswordSectionVisible=!!isPasswordAvailable&&selectedAccess?.id===`open`,canTogglePassword=!!canChangePassword&&!(currentForm.isOtpEnabled&&!canChangeOtp),canToggleOtp=!!canChangeOtp&&!(currentForm.isPasswordEnabled&&!canChangePassword),handlePasswordToggle=nextChecked=>{setFieldError(`password`,void 0),setFieldValue(`isPasswordEnabled`,nextChecked),nextChecked&&isOtpSectionVisible&&canChangeOtp&&setFieldValue(`isOtpEnabled`,!1)},handleOtpToggle=nextChecked=>{setFieldValue(`isOtpEnabled`,nextChecked),nextChecked&¤tForm.otpMode===OTP_MODE.NONE&&setFieldValue(`otpMode`,OTP_MODE.OPEN),nextChecked&&isPasswordSectionVisible&&canChangePassword&&(setFieldValue(`isPasswordEnabled`,!1),setFieldValue(`password`,``),setFieldError(`password`,void 0))},handleOtpModeChange=mode=>{setFieldValue(`otpMode`,mode)},handleOtpConfigureClick=()=>{if(onOtpAllowlistConfigure){onOtpAllowlistConfigure();return}setView(`manage-access-list`)},handlePasswordChange=event=>{setFieldError(`password`,void 0),setFieldValue(`password`,event.target.value)},handleDownloadToggle=nextChecked=>{setFieldValue(`isDownloadEnabled`,nextChecked)},handlePasswordBlur=event=>{let isSubmitFocused=document.getElementById(`usm-SharedLinkSettingsModal-primaryButton`)?.contains(event.relatedTarget);initialForm.isPasswordEnabled&&!currentForm.password||isSubmitFocused||validatePassword(currentForm.password)},canChangeAllSettings=canChangeDownload&&canChangeExpiration&&(!isOtpSectionVisible||canChangeOtp)&&(!isPasswordSectionVisible||canChangePassword)&&canChangeVanityName,passwordSection=jsx(PasswordSection,{canChange:canTogglePassword,error:errors.password,isAvailable:isPasswordSectionVisible,isChecked:currentForm.isPasswordEnabled,isDefaultChecked:initialForm.isPasswordEnabled,isDisabled:isSubmitting,onBlur:handlePasswordBlur,onChange:handlePasswordChange,onFocus:()=>setFieldError(`password`,void 0),onToggle:handlePasswordToggle,password:currentForm.password});return jsxs(Fragment,{children:[!canChangeAllSettings&&jsx(InlineNotice,{variant:`warning`,variantIconAriaLabel:formatMessage(messages.warningNoticeIconAriaLabel),children:formatMessage(messages.inaccessibleSettingsNotice)}),accessNoticeMessage&&jsx(Text,{as:`p`,color:`textOnLightSecondary`,children:formatMessage(accessNoticeMessage,{learnSharedLinkSettingsLink:jsx(Link,{href:`https://support.box.com/hc/en-us/articles/360043697554-Configuring-Individual-Shared-Link-Settings`,rel:`noreferrer`,target:`_blank`,children:formatMessage(messages.learnSharedLinkSettingsLink)})})}),jsx(ExpirationSection,{canChange:!!canChangeExpiration,error:errors.expiration,expiration:currentForm.expiration,isChecked:currentForm.isExpirationEnabled,isDisabled:isSubmitting,onChange:handleExpirationChange,onToggle:handleExpirationToggle}),jsx(OtpSection,{accessCount:otpAccessCount,canChange:canToggleOtp,isAvailable:isOtpSectionVisible,isChecked:currentForm.isOtpEnabled,isDisabled:isSubmitting,onConfigureClick:handleOtpConfigureClick,onModeChange:handleOtpModeChange,onToggle:handleOtpToggle,otpMode:currentForm.otpMode}),!isOtpAvailable&&passwordSection,jsx(VanitySection,{canChange:!!canChangeVanityName,error:errors.vanityName,isAvailable:!!isVanityNameAvailable,isChecked:currentForm.isVanityNameEnabled,isDisabled:isSubmitting,onChange:handleVanityNameChange,onToggle:handleVanityToggle,vanityDomain,vanityName:currentForm.vanityName}),jsx(DownloadSection,{canChange:!!canChangeDownload,isAvailable:!!isDownloadAvailable,isChecked:currentForm.isDownloadEnabled,isDisabled:isSubmitting,onToggle:handleDownloadToggle}),isOtpAvailable&&passwordSection]})}export{SharedLinkSettings};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{useUnifiedShareModalContext}from"../contexts/unified-share-modal-context.js";import{SharedLinkSettingsProvider}from"../contexts/shared-link-settings-context.js";import{t as SharedLinkSettingsModal}from"../../../chunks/shared-link-settings-modal.js";import{jsx}from"react/jsx-runtime";function SharedLinkSettingsContainer(){let{isOpen,setView,view}=useUnifiedShareModalContext();return jsx(SharedLinkSettingsProvider,{children:jsx(SharedLinkSettingsModal,{isOpen:isOpen&&view===`shared-link-settings`,onOpenChange:()=>setView(null)})})}export{SharedLinkSettingsContainer};
|
|
1
|
+
import{useUnifiedShareModalContext}from"../contexts/unified-share-modal-context.js";import{SharedLinkSettingsProvider}from"../contexts/shared-link-settings-context.js";import{t as SharedLinkSettingsModal}from"../../../chunks/shared-link-settings-modal.js";import{jsx}from"react/jsx-runtime";function SharedLinkSettingsContainer(){let{isOpen,setView,view,views}=useUnifiedShareModalContext();return jsx(SharedLinkSettingsProvider,{children:jsx(SharedLinkSettingsModal,{isActive:views.includes(`shared-link-settings`),isOpen:isOpen&&view===`shared-link-settings`,onOpenChange:()=>setView(null)})})}export{SharedLinkSettingsContainer};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{OTP_MODE}from"../constants.js";import{formatDateFromTimestampToCalendarDate}from"../utils/date.js";import{useUnifiedShareModalContext}from"./unified-share-modal-context.js";import{useLinkSettingsForm}from"../hooks/use-link-settings-form.js";import{createContext,useContext,useMemo,useState}from"react";import{jsx}from"react/jsx-runtime";var SharedLinkSettingsContext=createContext(null),useSharedLinkSettingsContext=()=>{let context=useContext(SharedLinkSettingsContext);if(!context)throw Error(`useSharedLinkSettingsContext must be used with SharedLinkSettingsProvider`);return context},SharedLinkSettingsProvider=({children})=>{let{sharedLink}=useUnifiedShareModalContext(),{expiresAt=0,settings={},vanityName=``}=sharedLink,{isDownloadEnabled,isPasswordEnabled,otpMode=OTP_MODE.NONE}=settings,[containerRef,setContainerRef]=useState(null),
|
|
1
|
+
import{OTP_MODE}from"../constants.js";import{formatDateFromTimestampToCalendarDate}from"../utils/date.js";import{useUnifiedShareModalContext}from"./unified-share-modal-context.js";import{useLinkSettingsForm}from"../hooks/use-link-settings-form.js";import{createContext,useContext,useMemo,useState}from"react";import{jsx}from"react/jsx-runtime";var SharedLinkSettingsContext=createContext(null),useSharedLinkSettingsContext=()=>{let context=useContext(SharedLinkSettingsContext);if(!context)throw Error(`useSharedLinkSettingsContext must be used with SharedLinkSettingsProvider`);return context},SharedLinkSettingsProvider=({children})=>{let{sharedLink}=useUnifiedShareModalContext(),{expiresAt=0,settings={},vanityName=``}=sharedLink,{isDownloadEnabled,isPasswordEnabled,otpMode=OTP_MODE.NONE}=settings,[containerRef,setContainerRef]=useState(null),initialForm=useMemo(()=>({expiration:expiresAt?formatDateFromTimestampToCalendarDate(expiresAt):null,isDownloadEnabled:!!isDownloadEnabled,isExpirationEnabled:!!expiresAt,isOtpEnabled:otpMode!==OTP_MODE.NONE,isPasswordEnabled:!!isPasswordEnabled,isVanityNameEnabled:!!vanityName,otpMode,password:``,vanityName}),[expiresAt,isDownloadEnabled,isPasswordEnabled,otpMode,vanityName]),{currentForm,errors,onFormReset,onFormSubmit,setFieldError,setFieldValue,validatePassword}=useLinkSettingsForm(initialForm),contextValue=useMemo(()=>({containerRef,currentForm,errors,initialForm,resetForm:onFormReset,setContainerRef,setFieldError,setFieldValue,submitForm:onFormSubmit,validatePassword}),[containerRef,currentForm,errors,initialForm,onFormReset,onFormSubmit,setFieldError,setFieldValue,validatePassword]);return jsx(SharedLinkSettingsContext.Provider,{value:contextValue,children})};export{SharedLinkSettingsContext,SharedLinkSettingsProvider,useSharedLinkSettingsContext};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{parseEmails}from"../utils/email.js";import{useUnifiedShareModalContext}from"../contexts/unified-share-modal-context.js";import{useUnifiedShareFormContext}from"../contexts/unified-share-form-context.js";import{useFormValidation}from"./use-form-validation.js";import{useSharingAction}from"./use-sharing-action.js";import{useCallback}from"react";import differenceBy from"lodash/differenceBy";import uniqBy from"lodash/uniqBy";var useCollaborationForm=(formAction,formNotification)=>{let{errors,setFieldError,validateCollaborationLimit,validateUserContact,validateUserSelector}=useFormValidation(),{config,contactService}=useUnifiedShareModalContext(),{collaborationLimit}=config,{collaborationRole,form,messageValue,setContactValue,setMessageValue,setUserContacts,shieldRestriction,userContacts}=useUnifiedShareFormContext(),{onAction:onFormSubmit}=useSharingAction(formAction,formNotification),{getContactsByEmail}=contactService,updateContactValue=useCallback(input=>{validateCollaborationLimit(userContacts,collaborationLimit)||setFieldError(`userContacts`,``),setContactValue(input)},[collaborationLimit,setContactValue,setFieldError,userContacts,validateCollaborationLimit]),processContacts=useCallback(async emails=>{let fetchedContacts={};if(getContactsByEmail&&emails.length>0){let response=await getContactsByEmail(emails);for(let key of Object.keys(response))fetchedContacts[key.toLowerCase()]=response[key]}return emails.map(email=>fetchedContacts[email.toLowerCase()]||{email,id:0,isExternalUser:!0,name:email,value:email,type:`user`})},[getContactsByEmail]),handleSelectedUsersChange=useCallback(async users=>{setFieldError(`userContacts`,``),validateUserSelector(users);let nextUserContacts;if(users.length<=userContacts.length||users[users.length-1].id!==void 0)nextUserContacts=users;else{let previousContacts=users.slice(0,-1),rawInput=users[users.length-1].value,parsedEmails=parseEmails(rawInput);parsedEmails.length===0&&validateUserContact(rawInput);let processedContacts=await processContacts(uniqBy(differenceBy(parsedEmails,previousContacts.filter(user=>user.email).map(user=>user.email),email=>email.toLowerCase()),email=>email.toLowerCase()));nextUserContacts=[...previousContacts,...processedContacts]}collaborationLimit&&validateCollaborationLimit(nextUserContacts,collaborationLimit),setUserContacts(nextUserContacts)},[collaborationLimit,processContacts,setFieldError,setUserContacts,userContacts,validateCollaborationLimit,validateUserContact,validateUserSelector]),handleUserSelectorBlur=useCallback(event=>{let isInputFocused=event.relatedTarget?.closest(`.usm-UserContacts-input`),isPopupFocused=document.querySelector(`[aria-labelledby^="usm-UserContacts-"]`)?.contains(event.relatedTarget);if(isInputFocused||isPopupFocused)return;let value=event.target.value.trim();value&&handleSelectedUsersChange([...userContacts,{value}])},[handleSelectedUsersChange,userContacts]),handleFormReset=()=>{setUserContacts([]),setContactValue(``),setMessageValue(``),setFieldError(`userContacts`,``)};return{errors,onFormReset:handleFormReset,onFormSubmit:async()=>{if(errors.userContacts||validateUserSelector(userContacts))return!0;let
|
|
1
|
+
import{parseEmails}from"../utils/email.js";import{useUnifiedShareModalContext}from"../contexts/unified-share-modal-context.js";import{useUnifiedShareFormContext}from"../contexts/unified-share-form-context.js";import{useFormValidation}from"./use-form-validation.js";import{useSharingAction}from"./use-sharing-action.js";import{useCallback}from"react";import differenceBy from"lodash/differenceBy";import uniqBy from"lodash/uniqBy";var useCollaborationForm=(formAction,formNotification)=>{let{errors,setFieldError,validateCollaborationLimit,validateUserContact,validateUserSelector}=useFormValidation(),{config,contactService}=useUnifiedShareModalContext(),{collaborationLimit}=config,{collaborationRole,form,messageValue,setContactValue,setMessageValue,setUserContacts,shieldRestriction,userContacts}=useUnifiedShareFormContext(),{onAction:onFormSubmit}=useSharingAction(formAction,formNotification),{getContactsByEmail}=contactService,updateContactValue=useCallback(input=>{validateCollaborationLimit(userContacts,collaborationLimit)||setFieldError(`userContacts`,``),setContactValue(input)},[collaborationLimit,setContactValue,setFieldError,userContacts,validateCollaborationLimit]),processContacts=useCallback(async emails=>{let fetchedContacts={};if(getContactsByEmail&&emails.length>0){let response=await getContactsByEmail(emails);for(let key of Object.keys(response))fetchedContacts[key.toLowerCase()]=response[key]}return emails.map(email=>fetchedContacts[email.toLowerCase()]||{email,id:0,isExternalUser:!0,name:email,value:email,type:`user`})},[getContactsByEmail]),handleSelectedUsersChange=useCallback(async users=>{setFieldError(`userContacts`,``),validateUserSelector(users);let nextUserContacts;if(users.length<=userContacts.length||users[users.length-1].id!==void 0)nextUserContacts=users;else{let previousContacts=users.slice(0,-1),rawInput=users[users.length-1].value,parsedEmails=parseEmails(rawInput);parsedEmails.length===0&&validateUserContact(rawInput);let processedContacts=await processContacts(uniqBy(differenceBy(parsedEmails,previousContacts.filter(user=>user.email).map(user=>user.email),email=>email.toLowerCase()),email=>email.toLowerCase()));nextUserContacts=[...previousContacts,...processedContacts]}collaborationLimit&&validateCollaborationLimit(nextUserContacts,collaborationLimit),setUserContacts(nextUserContacts)},[collaborationLimit,processContacts,setFieldError,setUserContacts,userContacts,validateCollaborationLimit,validateUserContact,validateUserSelector]),handleUserSelectorBlur=useCallback(event=>{let isInputFocused=event.relatedTarget?.closest(`.usm-UserContacts-input`),isPopupFocused=document.querySelector(`[aria-labelledby^="usm-UserContacts-"]`)?.contains(event.relatedTarget);if(isInputFocused||isPopupFocused)return;let value=event.target.value.trim();value&&handleSelectedUsersChange([...userContacts,{value}])},[handleSelectedUsersChange,userContacts]),handleFormReset=()=>{setUserContacts([]),setContactValue(``),setMessageValue(``),setFieldError(`userContacts`,``)};return{errors,onFormReset:handleFormReset,onFormSubmit:async()=>{if(errors.userContacts||validateUserSelector(userContacts))return!0;let collaborationForm={contacts:userContacts,message:messageValue};return form===`invite`&&(collaborationForm.role=collaborationRole.id),shieldRestriction.isJustificationAllowed&&(collaborationForm.justificationReason=shieldRestriction.justificationReason,collaborationForm.classificationId=shieldRestriction.classificationId),await onFormSubmit(collaborationForm),handleFormReset(),!1},onSelectedUsersChange:handleSelectedUsersChange,onUserSelectorBlur:handleUserSelectorBlur,updateContactValue}};export{useCollaborationForm};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{getUpdatedLinkSettingsForm}from"../utils/form.js";import{useUnifiedShareModalContext}from"../contexts/unified-share-modal-context.js";import{useFormValidation}from"./use-form-validation.js";import{useSharingAction}from"./use-sharing-action.js";import{useCallback,useEffect,useRef,useState}from"react";import isEqual from"lodash/isEqual";var useLinkSettingsForm=initialForm=>{let initialFormRef=useRef(initialForm),[currentForm,setCurrentForm]=useState(initialForm),{errors,setErrors,setFieldError,validateExpiration,validatePassword,validateVanityName}=useFormValidation(),{sharingService}=useUnifiedShareModalContext(),{updateSharedLink}=sharingService,{onAction:onUpdate}=useSharingAction(updateSharedLink,`update-shared-link`);useEffect(()=>{isEqual(initialForm,initialFormRef.current)||(setCurrentForm(initialForm),setErrors({}),initialFormRef.current=initialForm)},[initialForm,setErrors]);let setFieldValue=useCallback((field,value)=>{setCurrentForm(prev=>({...prev,[field]:value}))},[]);return{currentForm,errors,onFormReset:useCallback(()=>{setCurrentForm(initialFormRef.current),setErrors({})},[setErrors]),onFormSubmit:useCallback(async()=>{let updatedForm=getUpdatedLinkSettingsForm(currentForm,initialForm),{expiration,isExpirationEnabled,isPasswordEnabled,isVanityNameEnabled,password,vanityName}=updatedForm,hasExpirationError=isExpirationEnabled&&validateExpiration(expiration),hasPasswordError=isPasswordEnabled&&validatePassword(password),hasVanityNameError=isVanityNameEnabled&&validateVanityName(vanityName);if(hasExpirationError||hasPasswordError||hasVanityNameError)return!0;try{await onUpdate({...initialForm,...updatedForm})}catch(_error){return Object.entries(_error).forEach(([field,value])=>setFieldError(field,value)),!0}return!1},[currentForm,initialForm,onUpdate,setFieldError,validateExpiration,validatePassword,validateVanityName]),setFieldError,setFieldValue,validatePassword}};export{useLinkSettingsForm};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{DateFormatter,fromAbsolute,getLocalTimeZone,toCalendarDate}from"@box/blueprint-web";var
|
|
1
|
+
import{DateFormatter,fromAbsolute,getLocalTimeZone,toCalendarDate}from"@box/blueprint-web";var formatDateFromTimestampToCalendarDate=timestamp=>toCalendarDate(fromAbsolute(timestamp,getLocalTimeZone())),formatDateFromTimestampToDateString=timestamp=>{let userLocale=navigator.language||`en-US`,date=formatDateFromTimestampToCalendarDate(timestamp).toDate(getLocalTimeZone());return new DateFormatter(userLocale,{day:`numeric`,month:`long`,year:`numeric`}).format(date)},formatTomorrowDateToCalendarDate=()=>formatDateFromTimestampToCalendarDate(Date.now()).add({days:1});export{formatDateFromTimestampToCalendarDate,formatDateFromTimestampToDateString,formatTomorrowDateToCalendarDate};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{OTP_MODE}from"../constants.js";var
|
|
1
|
+
import{OTP_MODE}from"../constants.js";var getUpdatedLinkSettingsForm=(nextForm,prevForm)=>{let{expiration,isDownloadEnabled,isExpirationEnabled,isOtpEnabled,isPasswordEnabled,isVanityNameEnabled,otpMode,password,vanityName}=nextForm,updatedForm={};return isDownloadEnabled!==prevForm.isDownloadEnabled&&(updatedForm.isDownloadEnabled=isDownloadEnabled),(isExpirationEnabled!==prevForm.isExpirationEnabled||expiration?.toString()!==prevForm.expiration?.toString())&&(updatedForm.isExpirationEnabled=isExpirationEnabled,updatedForm.expiration=isExpirationEnabled?expiration:null),(isPasswordEnabled!==prevForm.isPasswordEnabled||password!==prevForm.password)&&(updatedForm.isPasswordEnabled=isPasswordEnabled,updatedForm.password=isPasswordEnabled?password:null),(isOtpEnabled!==prevForm.isOtpEnabled||otpMode!==prevForm.otpMode)&&(updatedForm.isOtpEnabled=isOtpEnabled,updatedForm.otpMode=isOtpEnabled?otpMode:OTP_MODE.NONE),(isVanityNameEnabled!==prevForm.isVanityNameEnabled||vanityName!==prevForm.vanityName)&&(updatedForm.isVanityNameEnabled=isVanityNameEnabled,updatedForm.vanityName=isVanityNameEnabled?vanityName:null),updatedForm};export{getUpdatedLinkSettingsForm};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{getAvatarBadgeSize,getDefaultCollaborationRole,getFirstInitial,isCollaboratorRestricted,isCollaboratorRoleSupported,isInvitationRoleSupported}from"./collaborator.js";import{formatDateFromTimestampToCalendarDate,formatDateFromTimestampToDateString,formatTomorrowDateToCalendarDate}from"./date.js";import{doesPasswordContainInvalidCharacter,doesPasswordContainLetter,doesPasswordContainMinCharacters,doesPasswordContainMixedCase,doesPasswordContainNumber,doesPasswordContainSymbol,isDomainValid,isEmailValid,isVanityNameValid}from"./validation.js";import{parseEmails}from"./email.js";import{callOnKeyboardEvent}from"./event.js";import{
|
|
1
|
+
import{getAvatarBadgeSize,getDefaultCollaborationRole,getFirstInitial,isCollaboratorRestricted,isCollaboratorRoleSupported,isInvitationRoleSupported}from"./collaborator.js";import{formatDateFromTimestampToCalendarDate,formatDateFromTimestampToDateString,formatTomorrowDateToCalendarDate}from"./date.js";import{doesPasswordContainInvalidCharacter,doesPasswordContainLetter,doesPasswordContainMinCharacters,doesPasswordContainMixedCase,doesPasswordContainNumber,doesPasswordContainSymbol,isDomainValid,isEmailValid,isVanityNameValid}from"./validation.js";import{parseEmails}from"./email.js";import{callOnKeyboardEvent}from"./event.js";import{getUpdatedLinkSettingsForm}from"./form.js";import{getNotificationArgs,getNotificationMessage}from"./notification.js";import{getAllowedAccessLevels,getAllowedPermissionLevels}from"./permission.js";export{callOnKeyboardEvent,doesPasswordContainInvalidCharacter,doesPasswordContainLetter,doesPasswordContainMinCharacters,doesPasswordContainMixedCase,doesPasswordContainNumber,doesPasswordContainSymbol,formatDateFromTimestampToCalendarDate,formatDateFromTimestampToDateString,formatTomorrowDateToCalendarDate,getAllowedAccessLevels,getAllowedPermissionLevels,getAvatarBadgeSize,getDefaultCollaborationRole,getFirstInitial,getNotificationArgs,getNotificationMessage,getUpdatedLinkSettingsForm,isCollaboratorRestricted,isCollaboratorRoleSupported,isDomainValid,isEmailValid,isInvitationRoleSupported,isVanityNameValid,parseEmails};
|
package/dist/types/lib/components/shared-link-settings-modal/shared-link-settings-modal.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export interface SharedLinkSettingsModalProps {
|
|
2
|
+
isActive?: boolean;
|
|
2
3
|
isOpen: boolean;
|
|
3
4
|
onOpenChange: (open: boolean) => void;
|
|
4
5
|
}
|
|
5
|
-
export declare function SharedLinkSettingsModal({ isOpen, onOpenChange }: SharedLinkSettingsModalProps): import("react/jsx-runtime").JSX.Element;
|
|
6
|
+
export declare function SharedLinkSettingsModal({ isActive, isOpen, onOpenChange }: SharedLinkSettingsModalProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { Dispatch, ReactNode, SetStateAction } from 'react';
|
|
2
2
|
import { FieldError, FormErrors } from '../hooks';
|
|
3
|
-
import {
|
|
3
|
+
import { LinkSettingsForm } from '../types';
|
|
4
4
|
export interface SharedLinkSettingsContextValue {
|
|
5
5
|
containerRef: HTMLDivElement | null;
|
|
6
|
+
currentForm: LinkSettingsForm;
|
|
6
7
|
errors: FormErrors;
|
|
7
|
-
|
|
8
|
-
initialFormData: LinkSettingsFormData;
|
|
8
|
+
initialForm: LinkSettingsForm;
|
|
9
9
|
resetForm: () => void;
|
|
10
10
|
setContainerRef: Dispatch<SetStateAction<HTMLDivElement | null>>;
|
|
11
11
|
setFieldError: (field: string, error: FieldError) => void;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export declare const useLinkSettingsForm: (
|
|
1
|
+
import { LinkSettingsForm } from '../types';
|
|
2
|
+
export declare const useLinkSettingsForm: (initialForm: LinkSettingsForm) => {
|
|
3
|
+
currentForm: LinkSettingsForm;
|
|
3
4
|
errors: import('./use-form-validation').FormErrors;
|
|
4
|
-
formData: LinkSettingsFormData;
|
|
5
5
|
onFormReset: () => void;
|
|
6
6
|
onFormSubmit: () => Promise<boolean>;
|
|
7
7
|
setFieldError: (field: string, error: import('./use-form-validation').FieldError) => void;
|
|
@@ -494,7 +494,7 @@ export interface SharingService {
|
|
|
494
494
|
*
|
|
495
495
|
* Called when the user clicks "Send" on the invite view of the sharing form.
|
|
496
496
|
*/
|
|
497
|
-
sendInvitations?: (data:
|
|
497
|
+
sendInvitations?: (data: CollaborationForm) => Promise<SharingResponse | void>;
|
|
498
498
|
/**
|
|
499
499
|
* Function to remove an existing collaborator on the item.
|
|
500
500
|
*
|
|
@@ -506,7 +506,7 @@ export interface SharingService {
|
|
|
506
506
|
*
|
|
507
507
|
* Called when the user clicks "Send" on the email view of the sharing form.
|
|
508
508
|
*/
|
|
509
|
-
sendSharedLink?: (data:
|
|
509
|
+
sendSharedLink?: (data: CollaborationForm) => Promise<SharingResponse | void>;
|
|
510
510
|
/**
|
|
511
511
|
* Function to create a shared link for the item.
|
|
512
512
|
*
|
|
@@ -524,7 +524,7 @@ export interface SharingService {
|
|
|
524
524
|
*
|
|
525
525
|
* Called when the user saves changes to the shared link settings.
|
|
526
526
|
*/
|
|
527
|
-
updateSharedLink?: (data:
|
|
527
|
+
updateSharedLink?: (data: LinkSettingsForm) => Promise<SharingResponse | void>;
|
|
528
528
|
/**
|
|
529
529
|
* Function to change the access level of the shared link.
|
|
530
530
|
*
|
|
@@ -578,7 +578,7 @@ export interface SharingError {
|
|
|
578
578
|
/**
|
|
579
579
|
* Form data structure for the collaboration form in the Unified Share Modal.
|
|
580
580
|
*/
|
|
581
|
-
export interface
|
|
581
|
+
export interface CollaborationForm {
|
|
582
582
|
/**
|
|
583
583
|
* The classification ID of the item for inviting restricted collaborators.
|
|
584
584
|
*/
|
|
@@ -607,7 +607,7 @@ export interface CollaborationFormData {
|
|
|
607
607
|
/**
|
|
608
608
|
* Form data structure for the link settings form in the Unified Share Modal.
|
|
609
609
|
*/
|
|
610
|
-
export interface
|
|
610
|
+
export interface LinkSettingsForm {
|
|
611
611
|
/**
|
|
612
612
|
* The selected calendar date when the item will be unshared.
|
|
613
613
|
*/
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
declare const
|
|
3
|
-
export {
|
|
1
|
+
import { LinkSettingsForm } from '../types';
|
|
2
|
+
declare const getUpdatedLinkSettingsForm: (nextForm: LinkSettingsForm, prevForm: LinkSettingsForm) => Partial<LinkSettingsForm>;
|
|
3
|
+
export { getUpdatedLinkSettingsForm };
|
package/package.json
CHANGED
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@box/unified-share-modal",
|
|
3
|
-
"version": "3.7.
|
|
3
|
+
"version": "3.7.4",
|
|
4
4
|
"license": "SEE LICENSE IN LICENSE",
|
|
5
5
|
"peerDependencies": {
|
|
6
|
-
"@box/blueprint-web": "^18.
|
|
7
|
-
"@box/blueprint-web-assets": "^5.13.
|
|
8
|
-
"@box/copy-input": "^2.3.
|
|
9
|
-
"@box/user-selector": "^3.1.
|
|
6
|
+
"@box/blueprint-web": "^18.6.0",
|
|
7
|
+
"@box/blueprint-web-assets": "^5.13.4",
|
|
8
|
+
"@box/copy-input": "^2.3.28",
|
|
9
|
+
"@box/user-selector": "^3.1.28",
|
|
10
10
|
"lodash": "^4.17.15",
|
|
11
11
|
"react": "^18.0.0",
|
|
12
12
|
"react-dom": "^18.0.0",
|
|
13
13
|
"react-intl": "^6.4.2"
|
|
14
14
|
},
|
|
15
15
|
"devDependencies": {
|
|
16
|
-
"@box/blueprint-web": "^18.
|
|
17
|
-
"@box/blueprint-web-assets": "^5.13.
|
|
18
|
-
"@box/copy-input": "^2.3.
|
|
19
|
-
"@box/eslint-plugin-blueprint": "2.
|
|
20
|
-
"@box/storybook-utils": "1.4.
|
|
16
|
+
"@box/blueprint-web": "^18.6.0",
|
|
17
|
+
"@box/blueprint-web-assets": "^5.13.4",
|
|
18
|
+
"@box/copy-input": "^2.3.28",
|
|
19
|
+
"@box/eslint-plugin-blueprint": "2.3.0",
|
|
20
|
+
"@box/storybook-utils": "1.4.23",
|
|
21
21
|
"react-intl": "^6.4.2"
|
|
22
22
|
},
|
|
23
23
|
"publishConfig": {
|