UNPKG

unleash-server

Version:

Unleash is an enterprise ready feature flag service. It provides different strategies for handling feature flags.

1 lines • 8.86 kB
import{n as e,s as t,t as n}from"./jsx-runtime-ButemYzH.js";import{E as r,Go as i,Gr as a,K as o,La as s,Ls as c,Ms as l,Na as u,Ns as d,Ps as f,Ts as p,Tu as m,Ur as h,Wa as g,Yu as _,dt as v,wu as y,xd as b,yu as x}from"./index-B0RbDPtk.js";var S=t(e(),1),C=n(),w=({isOpen:e,onConfirm:t,onClose:n,safeguardData:r,mode:i,safeguardType:a})=>{let{metricName:o}=r.impactMetric;return(0,C.jsx)(p,{title:`Request changes`,open:e,secondaryButtonText:`Cancel`,onClose:n,customButton:(0,C.jsx)(_,{color:`primary`,variant:`contained`,onClick:t,autoFocus:!0,children:`Add suggestion to draft`}),children:(0,C.jsxs)(`p`,{children:[i===`create`?`Add`:`Update`,` safeguard that an`,` `,a===`featureEnvironment`?`disables the environment`:`pauses automation`,` based on `,(0,C.jsx)(`strong`,{children:o})]})})},T=()=>{let{makeRequest:e,createRequest:t,errors:n,loading:r}=l({propagateErrors:!0});return{createOrUpdateReleasePlanSafeguard:async({projectId:n,featureName:r,environment:i,planId:a,body:o})=>{let s=t(`api/admin/projects/${n}/features/${r}/environments/${i}/release-plans/${a}/safeguards`,{method:`PUT`,body:JSON.stringify(o)},`createOrUpdateReleasePlanSafeguard`);await e(s.caller,s.id)},createOrUpdateFeatureEnvironmentSafeguard:async({projectId:n,featureName:r,environment:i,body:a})=>{let o=t(`api/admin/projects/${n}/features/${r}/environments/${i}/safeguards`,{method:`PUT`,body:JSON.stringify(a)},`createOrUpdateFeatureEnvironmentSafeguard`);await e(o.caller,o.id)},deleteReleasePlanSafeguard:async({projectId:n,featureName:r,environment:i,planId:a,safeguardId:o})=>{let s=t(`api/admin/projects/${n}/features/${r}/environments/${i}/release-plans/${a}/safeguards/${o}`,{method:`DELETE`},`deleteReleasePlanSafeguard`);await e(s.caller,s.id)},deleteFeatureEnvironmentSafeguard:async({projectId:n,featureName:r,environment:i,safeguardId:a})=>{let o=t(`api/admin/projects/${n}/features/${r}/environments/${i}/safeguards/${a}`,{method:`DELETE`},`deleteFeatureEnvironmentSafeguard`);await e(o.caller,o.id)},errors:n,loading:r}},E=({open:e,onClose:t,onConfirm:n,isDeleting:r=!1})=>(0,C.jsxs)(p,{title:`Remove safeguard?`,open:e,primaryButtonText:r?`Removing...`:`Remove safeguard`,secondaryButtonText:`Cancel`,onClick:n,onClose:t,disabledPrimaryButton:r,children:[(0,C.jsx)(`p`,{children:`You are about to remove the safeguard that pauses automation when conditions are met.`}),(0,C.jsx)(`br`,{}),(0,C.jsx)(`p`,{children:`This action cannot be undone.`})]}),D=b(`div`)(({theme:e})=>({display:`flex`,padding:e.spacing(.25,.25),backgroundColor:v(e),borderTop:`1px solid ${e.palette.divider}`,borderBottom:`1px solid ${e.palette.divider}`,"& > form":{borderRadius:0,border:`none`}})),O=b(`div`)(({theme:e})=>({display:`flex`,alignItems:`center`,gap:e.spacing(1),justifyContent:`space-between`,width:`100%`,paddingRight:e.spacing(2)})),k=({onSelect:e,releasePlan:t})=>{let[n,r]=(0,S.useState)(null),{trackEvent:i}=c();return(0,C.jsxs)(D,{children:[(0,C.jsx)(O,{children:(0,C.jsx)(o,{onClick:e=>{i(`safeguards`,{props:{eventType:`choose safeguard opened`}}),r(e.currentTarget)},color:`primary`,startIcon:(0,C.jsx)(s,{}),sx:{m:2},children:`Add safeguard`})}),(0,C.jsxs)(m,{anchorEl:n,open:!!n,onClose:()=>r(null),children:[(0,C.jsx)(y,{onClick:()=>{i(`safeguards`,{props:{eventType:`form opened`,safeguardType:`featureEnvironment`}}),e(`featureEnvironment`),r(null)},children:`Disable environment`}),(0,C.jsx)(x,{title:t?``:`Add a release plan to use this safeguard`,placement:`right`,arrow:!0,children:(0,C.jsx)(`span`,{children:(0,C.jsx)(y,{disabled:!t,onClick:()=>{i(`safeguards`,{props:{eventType:`form opened`,safeguardType:`releasePlan`}}),e(`releasePlan`),r(null)},children:`Pause automation`})})})]})]})},A=({projectId:e,featureId:t,environmentName:n,safeguardType:r,releasePlan:o,safeguard:s,onSafeguardChange:l})=>{let{setToastData:u,setToastApiError:p}=f(),{trackEvent:m}=c(),{addChange:g}=a(),{isChangeRequestConfigured:_}=i(e),{data:v,refetch:y}=h(e),{createOrUpdateReleasePlanSafeguard:b,deleteReleasePlanSafeguard:x,createOrUpdateFeatureEnvironmentSafeguard:C,deleteFeatureEnvironmentSafeguard:w}=T(),[E,D]=(0,S.useState)(!1),[O,k]=(0,S.useState)(!1),[A,j]=(0,S.useState)(!1),[M,N]=(0,S.useState)(null),[P,F]=(0,S.useState)(!1),I=_(n),L=r===`releasePlan`&&o?r=>b({projectId:e,featureName:t,environment:n,planId:o.id,body:r}):r=>C({projectId:e,featureName:t,environment:n,body:r}),R=r===`releasePlan`&&o?r=>x({projectId:e,featureName:t,environment:n,planId:o.id,safeguardId:r}):r=>w({projectId:e,featureName:t,environment:n,safeguardId:r}),z=async e=>{if(m(`safeguards`,{props:{eventType:`safeguard submitted`,safeguardType:r}}),I){N(e),j(!0);return}try{await L(e),u({type:`success`,text:`Safeguard added successfully`}),l()}catch(e){p(d(e))}},B=async()=>{if(M)try{if(r===`featureEnvironment`)await g(e,n,{feature:t,action:`changeFeatureEnvSafeguard`,payload:{safeguard:M}});else{if(!o)return;await g(e,n,{feature:t,action:`changeReleasePlanSafeguard`,payload:{planId:o.id,safeguard:M}})}await y(),u({type:`success`,text:`Added to draft`}),l()}catch(e){p(d(e))}finally{j(!1),N(null)}},V=()=>{s&&(I?k(!0):D(!0))},H=async()=>{if(!(!s||P)){F(!0);try{await R(s.id),u({type:`success`,text:`Safeguard deleted successfully`}),l()}catch(e){p(d(e))}finally{F(!1),D(!1)}}},U=async()=>{if(!(!s||P)){F(!0);try{if(r===`featureEnvironment`)await g(e,n,{feature:t,action:`deleteFeatureEnvSafeguard`,payload:{safeguardId:s.id}});else{if(!o)return;await g(e,n,{feature:t,action:`deleteReleasePlanSafeguard`,payload:{planId:o.id,safeguardId:s.id}})}await y(),u({type:`success`,text:`Added to draft`}),l()}catch(e){p(d(e))}finally{F(!1),k(!1)}}},W=e=>{let t=(e.action===`changeReleasePlanSafeguard`||e.action===`deleteReleasePlanSafeguard`)&&!!o&&e.payload?.planId===o.id,n=e.action===`changeFeatureEnvSafeguard`||e.action===`deleteFeatureEnvSafeguard`;return t||n};return{handleSubmit:z,handleDeleteRequest:V,pendingSafeguardAction:(0,S.useMemo)(()=>{if(!v)return null;for(let e of v){if(e.environment!==n)continue;let r=e.features.find(e=>e.name===t);if(!r)continue;let i=r.changes.find(W);if(i)return i.action}return null},[v,n,t,o?.id]),deleteDialog:{open:E,isDeleting:P,onConfirm:H,onClose:()=>{P||D(!1)}},deleteChangeRequestDialog:{open:O,isDeleting:P,onConfirm:U,onClose:()=>k(!1)},submitChangeRequestDialog:{open:A,data:M,onConfirm:B,onClose:()=>{j(!1),N(null)}}}},j=({safeguardType:e,releasePlan:t,safeguard:n,environmentName:i,featureId:a,onSafeguardChange:o,onCancel:s})=>{let{handleSubmit:c,handleDeleteRequest:l,pendingSafeguardAction:d,deleteDialog:f,deleteChangeRequestDialog:m,submitChangeRequestDialog:h}=A({projectId:u(`projectId`),featureId:a,environmentName:i,safeguardType:e,releasePlan:t,safeguard:n,onSafeguardChange:o});return(0,C.jsxs)(C.Fragment,{children:[(0,C.jsx)(r,{safeguard:n,onSubmit:c,onCancel:s,onDelete:n?l:void 0,environment:i,featureId:a,badge:d===`deleteReleasePlanSafeguard`||d===`deleteFeatureEnvSafeguard`?(0,C.jsx)(g,{color:`error`,children:`Deleted in draft`}):d===`changeReleasePlanSafeguard`||d===`changeFeatureEnvSafeguard`?(0,C.jsx)(g,{color:`warning`,children:`Modified in draft`}):void 0,safeguardType:e}),h.data&&(0,C.jsx)(w,{isOpen:h.open,onConfirm:h.onConfirm,onClose:()=>{h.onClose(),s()},safeguardData:h.data,environment:i,mode:n?`edit`:`create`,safeguardType:e}),n&&(0,C.jsx)(E,{open:f.open,onClose:f.onClose,onConfirm:f.onConfirm,isDeleting:f.isDeleting}),n&&(0,C.jsx)(p,{title:`Request changes`,open:m.open,secondaryButtonText:`Cancel`,onClose:m.onClose,primaryButtonText:`Add suggestion to draft`,onClick:m.onConfirm,disabledPrimaryButton:m.isDeleting,children:(0,C.jsxs)(`p`,{children:[(0,C.jsx)(`strong`,{children:`Remove`}),` safeguard`,t&&(0,C.jsxs)(C.Fragment,{children:[` `,`from release plan`,` `,(0,C.jsx)(`strong`,{children:t.name})]}),` `,`for `,(0,C.jsx)(`strong`,{children:a}),` in`,` `,(0,C.jsx)(`strong`,{children:i})]})})]})},M=({featureEnvSafeguard:e,releasePlan:t,environmentName:n,featureId:r,onSafeguardChange:i})=>{let a=t?.safeguards?.[0],[o,s]=(0,S.useState)(null),c=()=>{s(null),i()};return e||a?(0,C.jsxs)(C.Fragment,{children:[e&&(0,C.jsx)(D,{children:(0,C.jsx)(j,{safeguardType:`featureEnvironment`,safeguard:e,environmentName:n,featureId:r,onSafeguardChange:c,onCancel:()=>{}})}),a&&(0,C.jsx)(D,{children:(0,C.jsx)(j,{safeguardType:`releasePlan`,releasePlan:t,safeguard:a,environmentName:n,featureId:r,onSafeguardChange:c,onCancel:()=>{}})})]}):o===`featureEnvironment`?(0,C.jsx)(D,{children:(0,C.jsx)(j,{safeguardType:`featureEnvironment`,environmentName:n,featureId:r,onSafeguardChange:i,onCancel:()=>s(null)})}):o===`releasePlan`&&t?(0,C.jsx)(D,{children:(0,C.jsx)(j,{safeguardType:`releasePlan`,releasePlan:t,environmentName:n,featureId:r,onSafeguardChange:i,onCancel:()=>s(null)})}):(0,C.jsx)(k,{onSelect:s,releasePlan:t})};export{k as AddSafeguard,M as Safeguard,M as default};