diff --git a/src/components/flag/FlagRow.tsx b/src/components/flag/FlagRow.tsx index 164d26f..9c59f8f 100644 --- a/src/components/flag/FlagRow.tsx +++ b/src/components/flag/FlagRow.tsx @@ -18,6 +18,8 @@ interface LineItemProps { setFlags: (flags: Flag[]) => void; item: Flag; setDisableSave: (toggle: boolean) => void; + handleSave: () => Promise; + handleDeleteFlag: (id: number) => Promise; } const FlagRow = ({ @@ -25,6 +27,8 @@ const FlagRow = ({ setFlags, item, setDisableSave, + handleSave, + handleDeleteFlag, }: LineItemProps): JSX.Element => { const [isOpen, setOpen] = useState(false); @@ -42,12 +46,6 @@ const FlagRow = ({ } }, [inputRef, item]); - const handleDeleteFlag = (flagId: number) => { - const updatedFlags = flags.filter((flag: Flag) => flag.id !== flagId); - setFlags(updatedFlags); - closeModal(); - }; - const handleFlagToggle = (flagId: number) => { const updatedFlags = flags.map((flag: Flag) => { if (flag.id === flagId) { @@ -56,6 +54,7 @@ const FlagRow = ({ return flag; }); setFlags(updatedFlags); + handleSave(); }; const handleFlagEdit = (value: string, flagId: number) => { @@ -82,6 +81,7 @@ const FlagRow = ({ } return flag; }); + setFlags(updatedFlags); }; @@ -101,6 +101,7 @@ const FlagRow = ({ openModal(); return; } + handleDeleteFlag(flag.id); }; diff --git a/src/components/flag/Flags.tsx b/src/components/flag/Flags.tsx index 2c47b11..871348c 100644 --- a/src/components/flag/Flags.tsx +++ b/src/components/flag/Flags.tsx @@ -1,20 +1,22 @@ -import { useState, useEffect } from '@wordpress/element'; +import { useState, useEffect, useCallback } from '@wordpress/element'; import { Spinner } from '@wordpress/components'; import FlagRow from './FlagRow'; import { Flag } from '../../../types'; import SubmitControls from './SubmitControls'; -import { getFlags } from '../../utils'; +import { getFlags, updateFlags } from '../../utils'; import Header from './Header'; import { __ } from '@wordpress/i18n'; +import { dispatch } from '@wordpress/data'; const Layout = (): JSX.Element => { const [flags, setFlags] = useState([]); const [isLoading, setIsLoading] = useState(true); + const [isSaving, setIsSaving] = useState(false); + // const isFirstRender = useRef(true); useEffect(() => { const logFlags = async () => { const fetchedFlags = await getFlags(); - if (fetchedFlags) { setFlags(fetchedFlags); } @@ -24,10 +26,41 @@ const Layout = (): JSX.Element => { logFlags(); }, [setFlags, setIsLoading]); + const remoteApi = useCallback(async (input: Flag[]) => { + await updateFlags({ ...input }); + //@ts-ignore + dispatch('core/notices').createSuccessNotice('Saved successfully!', { + type: 'snackbar', + id: 'mr-feature-flags-snackbar', + icon: <>✅, + }); + }, []); + const [disableSave, setDisableSave] = useState(false); const lastFlag = flags?.at(-1)?.id || 0; + const handleSave = async () => { + setIsSaving(true); + + setFlags((prevFlags: Flag[]) => { + return prevFlags.filter((f) => f.name !== ''); + }); + + remoteApi(flags); + setIsSaving(false); + }; + + const handleDeleteFlag = async (flagId: number) => { + setIsSaving(true); + + const latestFlags = flags.filter((f) => f.id !== flagId); + setFlags(latestFlags); + + remoteApi(latestFlags); + setIsSaving(false); + }; + return ( <>
@@ -47,6 +80,8 @@ const Layout = (): JSX.Element => { flags={flags} setFlags={setFlags} setDisableSave={setDisableSave} + handleSave={handleSave} + handleDeleteFlag={handleDeleteFlag} /> ); }) @@ -58,6 +93,8 @@ const Layout = (): JSX.Element => { flags={flags} lastFlag={lastFlag} disableSave={disableSave} + isSaving={isSaving} + handleSave={handleSave} /> )}
diff --git a/src/components/flag/SubmitControls.tsx b/src/components/flag/SubmitControls.tsx index 2cc92ef..a510c38 100644 --- a/src/components/flag/SubmitControls.tsx +++ b/src/components/flag/SubmitControls.tsx @@ -1,9 +1,6 @@ import { Flex, FlexItem, Button } from '@wordpress/components'; import { Flag } from '../../../types'; -import { updateFlags } from '../../utils'; -import { useState } from '@wordpress/element'; import Notices from '../common/Snackbar'; -import { dispatch } from '@wordpress/data'; import { __ } from '@wordpress/i18n'; interface SubmitControlsProps { @@ -11,6 +8,8 @@ interface SubmitControlsProps { setFlags: (flags: Flag[]) => void; lastFlag: number; disableSave: boolean; + isSaving: boolean; + handleSave: () => Promise; } const SubmitControls = ({ @@ -18,14 +17,14 @@ const SubmitControls = ({ setFlags, lastFlag, disableSave, + isSaving, + handleSave, }: SubmitControlsProps): JSX.Element => { - const [isSaving, setIsSaving] = useState(false); - const handleNewFlag = () => { const newFlag = { id: lastFlag + 1, name: '', - enabled: false, + enabled: true, }; let latestFlags = []; @@ -39,23 +38,6 @@ const SubmitControls = ({ setFlags(latestFlags); }; - const handleSave = async () => { - setIsSaving(true); - const cleanFlags: Flag[] = flags.filter( - (item: Flag) => item.name !== '' - ); - - await updateFlags({ ...cleanFlags }); - - setIsSaving(false); - - //@ts-ignore - dispatch('core/notices').createSuccessNotice('Saved successfully!', { - type: 'snackbar', - id: 'mr-feature-flags-snackbar', - icon: <>✅, - }); - }; return (
diff --git a/src/utils/index.ts b/src/utils/index.ts index 38654d5..e55fe06 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -17,7 +17,7 @@ export const updateFlags = async ( { method: 'POST', path: `${FEATURE_FLAG_NAMESPACE}/${FEATURE_FLAG_ROUTE}`, - data: flags, + data: { flags }, } ); diff --git a/types/index.ts b/types/index.ts index be233d0..5d20de7 100644 --- a/types/index.ts +++ b/types/index.ts @@ -2,5 +2,4 @@ export interface Flag { id: number; name: string; enabled: boolean; - preProdEnabled?: boolean; } diff --git a/webpack.config.js b/webpack.config.js index 7f0c2fc..daa9f6d 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -11,7 +11,6 @@ const config = { }, output: { ...defaultConfig.output, - // publicPath: '/wp-content/plugins/tm-wp-desknet/build', }, module: { ...defaultConfig.module,