Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
70 commits
Select commit Hold shift + click to select a range
105f463
Decision modal for on close account
jmusial Dec 18, 2025
cae53c0
Merge branch 'main' into feat/domain-member-close-account
jmusial Dec 19, 2025
29a1b2a
add dev buttons update action handlers
jmusial Dec 19, 2025
c911a12
Merge branch 'main' into feat/domain-member-close-account
jmusial Dec 19, 2025
395608f
Merge branch 'main' into feat/domain-member-close-account
jmusial Dec 22, 2025
2006575
code cleanup
jmusial Dec 22, 2025
0a94209
update with RBR and pending
jmusial Dec 22, 2025
5044ec0
Merge branch 'main' into feat/domain-member-close-account
jmusial Dec 22, 2025
953c767
Merge branch 'main' into feat/domain-member-close-account
jmusial Dec 23, 2025
2df3b19
Merge branch 'main' into feat/domain-member-close-account
jmusial Jan 7, 2026
7a5b50d
Merge branch 'main' into feat/domain-member-close-account
jmusial Jan 13, 2026
23a4ee9
Cleanup after merge
jmusial Jan 13, 2026
b572b62
Merge branch 'main' into feat/domain-member-close-account
jmusial Jan 14, 2026
2b9b0ee
Merge branch 'main' into feat/domain-member-close-account
jmusial Jan 14, 2026
4ca3eac
Merge branch 'main' into feat/domain-member-close-account
jmusial Jan 15, 2026
58b92f7
add a second modal confirm modal
jmusial Jan 16, 2026
c538487
cleanup
jmusial Jan 16, 2026
0f41e23
prettier fix
jmusial Jan 16, 2026
c999814
Merge branch 'main' into feat/domain-member-close-account
jmusial Jan 19, 2026
44549c1
use BaseDomainMemberPage
jmusial Jan 19, 2026
c41472d
add test
jmusial Jan 19, 2026
ed8b441
fix lint
jmusial Jan 19, 2026
377c136
Merge branch 'main' into feat/domain-member-close-account
jmusial Jan 20, 2026
a86bfdc
add translations
jmusial Jan 20, 2026
b5bb171
Merge branch 'main' into feat/domain-member-close-account
sumo-slonik Jan 22, 2026
cef1fb3
ready for review
sumo-slonik Jan 22, 2026
167e2cd
fixed comments after review
sumo-slonik Jan 23, 2026
1835e11
fixed comments after review
sumo-slonik Jan 23, 2026
4658537
fix MAX_REQUEST_RETRIES
sumo-slonik Jan 23, 2026
60b407a
fix eslints and prietter
sumo-slonik Jan 23, 2026
c12825b
Merge branch 'main' into feat/domain-member-close-account
sumo-slonik Jan 27, 2026
6e714fe
add unit test to new selectors
sumo-slonik Jan 27, 2026
5bbc20d
run prettier
sumo-slonik Jan 27, 2026
177e059
fix eslint
sumo-slonik Jan 27, 2026
fe9a617
fix prettier
sumo-slonik Jan 27, 2026
eacb1ed
fix ts
sumo-slonik Jan 27, 2026
7492a30
fix ts and prettier
sumo-slonik Jan 28, 2026
8c9015f
Sync Mobile-Expensify
sumo-slonik Jan 28, 2026
94178b6
fix responsive layout
sumo-slonik Jan 28, 2026
dc2ab86
Merge branch 'main' into feat/domain-member-close-account
sumo-slonik Jan 28, 2026
b2b6491
remove unnecessary as const
sumo-slonik Jan 28, 2026
5528ce0
fix buttons
sumo-slonik Jan 29, 2026
e8f6e50
fix escape button bug
sumo-slonik Jan 29, 2026
e3ee397
fix: show second modal only after the first disappeared
war-in Jan 29, 2026
e632d5e
fix: typecheck
war-in Jan 29, 2026
f8d979f
Merge branch 'main' into feat/domain-member-close-account
war-in Jan 30, 2026
2e3d016
fix: eslint
war-in Jan 30, 2026
8248a9a
fix: prettier
war-in Jan 30, 2026
139ff4e
fix offline mode, fixes after Vit's comments
sumo-slonik Feb 2, 2026
b36d8bb
fix types
sumo-slonik Feb 2, 2026
a72ca30
fix ts, es & prettier
sumo-slonik Feb 2, 2026
56e84b1
fix close arguments order
sumo-slonik Feb 2, 2026
f7f431d
fix jest
sumo-slonik Feb 2, 2026
ebd5b5f
fix prettier
sumo-slonik Feb 2, 2026
14a9a5f
fix ts
sumo-slonik Feb 2, 2026
4c3abb5
Merge remote-tracking branch 'origin/main' into feat/domain-member-cl…
sumo-slonik Feb 3, 2026
5567acb
Merge remote-tracking branch 'origin/main' into feat/domain-member-cl…
sumo-slonik Feb 3, 2026
28eeff2
fix marge conflicts
sumo-slonik Feb 3, 2026
f52e6b0
fix prettier
sumo-slonik Feb 3, 2026
be02ad7
change pending action key
jmusial Feb 3, 2026
2201b2b
fix comments v2
jmusial Feb 3, 2026
85f7a16
resolved comments v3
jmusial Feb 3, 2026
6011cde
update jsdoc
jmusial Feb 3, 2026
89f9077
add missing optimistic update data
jmusial Feb 3, 2026
350144e
revert style change
jmusial Feb 4, 2026
85a9bb5
fix offline close account row visibility
jmusial Feb 4, 2026
7767275
Merge branch 'main' into feat/domain-member-close-account
war-in Feb 4, 2026
8173c34
fix: remove unwanted space from translations
war-in Feb 4, 2026
3ce78ff
Merge remote-tracking branch 'origin/feat/domain-member-close-account…
war-in Feb 4, 2026
4b4d31d
fix typos
jmusial Feb 5, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 43 additions & 8 deletions src/components/DecisionModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ import CONST from '@src/CONST';
import Button from './Button';
import Header from './Header';
import Modal from './Modal';
import Text from './Text';
import RenderHTML from './RenderHTML';
import ScrollView from './ScrollView';

type DecisionModalProps = {
/** Title describing purpose of modal */
Expand All @@ -20,6 +21,18 @@ type DecisionModalProps = {
/** Text content used in second button */
secondOptionText: string;

/** Whether the first option uses a success-themed button */
isFirstOptionSuccess?: boolean;

/** Whether the second option uses a success-themed button */
isSecondOptionSuccess?: boolean;

/** Whether the first option uses a danger-themed button */
isFirstOptionDanger?: boolean;

/** Whether the second option uses a danger-themed button */
isSecondOptionDanger?: boolean;

/** onSubmit callback fired after clicking on first button */
onFirstOptionSubmit?: () => void;

Expand All @@ -32,11 +45,29 @@ type DecisionModalProps = {
/** Callback for closing modal */
onClose: () => void;

/** Callback when modal has fully disappeared */
onModalHide?: () => void;

/** Whether modal is visible */
isVisible: boolean;
};

function DecisionModal({title, prompt = '', firstOptionText, secondOptionText, onFirstOptionSubmit, onSecondOptionSubmit, isSmallScreenWidth, onClose, isVisible}: DecisionModalProps) {
function DecisionModal({
title,
prompt = '',
firstOptionText,
secondOptionText,
onFirstOptionSubmit,
onSecondOptionSubmit,
isSmallScreenWidth,
onClose,
onModalHide,
isVisible,
isFirstOptionDanger = false,
isFirstOptionSuccess = true,
isSecondOptionSuccess = false,
isSecondOptionDanger = false,
}: DecisionModalProps) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess this is a good example what will soon be agains the new code rule in the App #80222 @sumo-slonik @war-in

Can you please take a look and work on approaching this with that rule in mind so we do not make it worse?

cc @adhorodyski @TMisiukiewicz

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree. What do you think about using a union type for button variants instead?

like this:

type ButtonVariant = 'success' | 'danger' | 'default';
type DecisionModalProps = { 
firstOptionVariant?: ButtonVariant; 
secondOptionVariant?: ButtonVariant};

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am not sure, does that actually follow the merit of the rule? it feels like the same problem just using a struct as a param instead of boolean flags

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@mountiny
Maybe we can slim down this component and go with something like this?

import React, { ReactNode } from 'react';
import { View } from 'react-native';
import useThemeStyles from '@hooks/useThemeStyles';
import Button from './Button';
import Modal from './Modal';
import Header from './Header';
import RenderHTML from './RenderHTML';
import CONST from '@src/CONST';

type DecisionModalProps = {
    children: ReactNode;
    isSmallScreenWidth: boolean;
    isVisible: boolean;
    onClose: () => void;
};

function DecisionModal({ children, isSmallScreenWidth, isVisible, onClose }: DecisionModalProps) {
    const styles = useThemeStyles();
    return (
        <Modal
            onClose={onClose}
            isVisible={isVisible}
            type={isSmallScreenWidth ? CONST.MODAL.MODAL_TYPE.BOTTOM_DOCKED : CONST.MODAL.MODAL_TYPE.CONFIRM}
            innerContainerStyle={styles.pv0}
        >
            <View style={styles.m5}>{children}</View>
        </Modal>
    );
}

function DecisionModalHeader({ title }: { title: string }) {
    const styles = useThemeStyles();
    return (
        <View style={[styles.flexRow, styles.mb5]}>
            <Header title={title} containerStyles={styles.alignItemsCenter} />
        </View>
    );
}

function DecisionModalContent({ html }: { html: string }) {
    return <RenderHTML html={html} />;
}

function DecisionModalFooter({ children }: { children: ReactNode }) {
    const styles = useThemeStyles();
    return <View style={styles.mt5}>{children}</View>;
}

// Attach sub-components
DecisionModal.Header = DecisionModalHeader;
DecisionModal.Content = DecisionModalContent;
DecisionModal.Footer = DecisionModalFooter;

export default DecisionModal;

and usage like this:

<DecisionModal 
    isVisible={isVisible} 
    onClose={onClose} 
    isSmallScreenWidth={isSmallScreenWidth}
>
    <DecisionModal.Header title="Delete Message?" />
    
    <DecisionModal.Content html="Are you sure you want to delete this? This action cannot be undone." />

    <DecisionModal.Footer>
        <Button
            variant="success"
            large
            text="Confirm"
            onPress={handleConfirm}
        />
        <Button
            variant="danger"
            large
            style={styles.mt3}
            text="Delete"
            onPress={handleDelete}
        />
    </DecisionModal.Footer>
</DecisionModal>

I can migrate DecisionModal to this implementation in a separate PR before we merge, so we don’t mix these two changes.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we agree to go this route, I have a PR ready for the DecisionModal migration. We can either merge this one as is and update all DecisionModals (including this one) later, or run the migration first and then use the migrated version in this PR.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We can either merge this one as is

I am fine with it. If we wanna migrate first and then use migrated version, Release 2 for Domain Control will be held for long time.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok but lets follow up on this one! @sumo-slonik can you please create an issue for the PR you made with explanation of the motivation behind it?

const styles = useThemeStyles();

return (
Expand All @@ -45,21 +76,23 @@ function DecisionModal({title, prompt = '', firstOptionText, secondOptionText, o
isVisible={isVisible}
type={isSmallScreenWidth ? CONST.MODAL.MODAL_TYPE.BOTTOM_DOCKED : CONST.MODAL.MODAL_TYPE.CONFIRM}
innerContainerStyle={styles.pv0}
onModalHide={onModalHide}
>
<View style={[styles.m5]}>
<ScrollView contentContainerStyle={styles.m5}>
<View>
<View style={[styles.flexRow, styles.mb5]}>
<Header
title={title}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

❌ CONSISTENCY-3 (docs)

Minor: Inconsistent style array usage. Lines 75 and 79 wrap single styles in arrays [styles.alignItemsCenter] and [styles.m5], while line 89 uses styles.mt5 without an array. For consistency, either always use arrays or only use them when multiple styles are combined.

Suggested fix:
For consistency with the rest of the component, use single styles without arrays when there's only one style:

<Header
    title={title}
    containerStyles={styles.alignItemsCenter}
/>
```\n\n---\n\nPlease rate this suggestion with 👍 or 👎 to help us improve! Reactions are used to monitor reviewer efficiency.

containerStyles={[styles.alignItemsCenter]}
containerStyles={styles.alignItemsCenter}
/>
</View>
<Text>{prompt}</Text>
<RenderHTML html={prompt} />
</View>
{!!firstOptionText && (
<Button
success
style={[styles.mt5]}
success={isFirstOptionSuccess}
danger={isFirstOptionDanger}
style={styles.mt5}
onPress={onFirstOptionSubmit}
pressOnEnter
text={firstOptionText}
Expand All @@ -70,9 +103,11 @@ function DecisionModal({title, prompt = '', firstOptionText, secondOptionText, o
style={[firstOptionText ? styles.mt3 : styles.mt5, styles.noSelect]}
onPress={onSecondOptionSubmit}
text={secondOptionText}
success={isSecondOptionSuccess}
danger={isSecondOptionDanger}
large
/>
</View>
</ScrollView>
</Modal>
);
}
Expand Down
9 changes: 8 additions & 1 deletion src/languages/de.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8306,7 +8306,14 @@ Hier ist ein *Testbeleg*, um dir zu zeigen, wie es funktioniert:`,
findMember: 'Mitglied finden',
addMember: 'Mitglied hinzufügen',
email: 'E-Mail-Adresse',
errors: {
closeAccount: 'Konto schließen',
closeAccountPrompt: 'Bist du sicher? Diese Aktion ist dauerhaft.',
forceCloseAccount: 'Konto zwangsweise schließen',
safeCloseAccount: 'Konto sicher schließen',
closeAccountInfo:
'Wir empfehlen, das Konto sicher zu schließen, um das Schließen zu überspringen, falls Folgendes vorliegt: <ul><li>Ausstehende Genehmigungen</li><li>Aktive Erstattungen</li><li>Keine alternativen Anmeldemethoden</li></ul>Andernfalls können Sie die oben genannten Sicherheitsvorkehrungen ignorieren und das ausgewählte Konto zwangsweise schließen.',
error: {
removeMember: 'Dieser Benutzer kann nicht entfernt werden. Bitte versuche es erneut.',
addMember: 'Dieses Mitglied kann nicht hinzugefügt werden. Bitte versuche es erneut.',
},
},
Expand Down
9 changes: 8 additions & 1 deletion src/languages/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8221,8 +8221,15 @@ const translations = {
findMember: 'Find member',
addMember: 'Add member',
email: 'Email address',
errors: {
closeAccount: 'Close account',
closeAccountPrompt: 'Are you sure? This action is permanent.',
forceCloseAccount: 'Force close account',
safeCloseAccount: 'Close account safely',
closeAccountInfo:
'We recommend closing the account safely to skip closing it in case there are: <ul><li>Pending approvals</li><li>Active reimbursements</li><li>No alternative login methods</li></ul>Otherwise, you can ignore the safety precautions above and force close the selected account.',
error: {
addMember: 'Unable to add this member. Please try again.',
removeMember: 'Unable to remove this user. Please try again.',
},
},
},
Expand Down
9 changes: 8 additions & 1 deletion src/languages/es.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8376,7 +8376,14 @@ ${amount} para ${merchant} - ${date}`,
findMember: 'Buscar miembro',
addMember: 'Añadir miembro',
email: 'Dirección de correo electrónico',
errors: {
closeAccount: 'Cerrar cuenta',
closeAccountPrompt: '¿Estás seguro? Esta acción es permanente.',
forceCloseAccount: 'Forzar cierre de cuenta',
safeCloseAccount: 'Cierre seguro de cuenta',
closeAccountInfo:
'Recomendamos cerrar la cuenta de forma segura para omitir el cierre si hay: <ul><li>Aprobaciones pendientes</li><li>Reembolsos en curso</li><li>No hay otro método de inicio de sesión</li></ul>De lo contrario, puedes ignorar las precauciones de seguridad anteriores y forzar el cierre de las cuentas seleccionadas.',
error: {
removeMember: 'No se pudo eliminar a este usuario. Por favor, inténtalo de nuevo.',
addMember: 'No se pudo añadir este miembro. Por favor, inténtalo de nuevo.',
},
},
Expand Down
9 changes: 8 additions & 1 deletion src/languages/fr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8320,7 +8320,14 @@ Voici un *reçu test* pour vous montrer comment ça fonctionne :`,
findMember: 'Trouver un membre',
addMember: 'Ajouter un membre',
email: 'Adresse e-mail',
errors: {
closeAccount: 'Fermer le compte',
closeAccountPrompt: 'Êtes-vous sûr(e) ? Cette action est définitive.',
forceCloseAccount: 'Forcer la fermeture du compte',
safeCloseAccount: 'Fermer le compte en toute sécurité',
closeAccountInfo:
'Nous recommandons de fermer le compte en toute sécurité afin d’éviter de le fermer dans le cas où il y aurait : <ul><li>Des validations en attente</li><li>Des remboursements actifs</li><li>Aucune autre méthode de connexion</li></ul>Sinon, vous pouvez ignorer les précautions de sécurité ci-dessus et forcer la fermeture du compte sélectionné.',
error: {
removeMember: 'Impossible de supprimer cet utilisateur. Veuillez réessayer.',
addMember: 'Impossible d’ajouter ce membre. Veuillez réessayer.',
},
},
Expand Down
9 changes: 8 additions & 1 deletion src/languages/it.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8287,7 +8287,14 @@ Ecco una *ricevuta di prova* per mostrarti come funziona:`,
findMember: 'Trova membro',
addMember: 'Aggiungi membro',
email: 'Indirizzo email',
errors: {
closeAccount: 'Chiudi account',
closeAccountPrompt: 'Sei sicuro? Questa azione è permanente.',
forceCloseAccount: 'Forza chiusura account',
safeCloseAccount: 'Chiudi il conto in sicurezza',
closeAccountInfo:
'Consigliamo di chiudere l’account in modo sicuro per evitare problemi in caso di: <ul><li>Approvazioni in sospeso</li><li>Rimborsi attivi</li><li>Nessun metodo di accesso alternativo</li></ul>In caso contrario, puoi ignorare le precauzioni di sicurezza sopra indicate e forzare la chiusura dell’account selezionato.',
error: {
removeMember: 'Impossibile rimuovere questo utente. Riprova.',
addMember: 'Impossibile aggiungere questo membro. Riprova.',
},
},
Expand Down
11 changes: 9 additions & 2 deletions src/languages/ja.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8218,8 +8218,15 @@ ${reportName}
findMember: 'メンバーを検索',
addMember: 'メンバーを追加',
email: 'メールアドレス',
errors: {
addMember: 'このメンバーを追加できません。もう一度お試しください。',
closeAccount: 'アカウントを閉じる',
closeAccountPrompt: '本当によろしいですか?この操作は元に戻せません。',
forceCloseAccount: 'アカウントを強制的に閉鎖',
safeCloseAccount: 'アカウントを安全に閉じる',
closeAccountInfo:
'保留中の承認、処理中の精算、代替ログイン方法がない場合などでもアカウントを閉鎖できるように、安全にアカウントを閉鎖することを推奨します: <ul><li>保留中の承認</li><li>進行中の払い戻し</li><li>代替ログイン方法なし</li></ul>それ以外の場合は、上記の安全上の注意を無視して、選択したアカウントを強制的に閉鎖できます。',
error: {
removeMember: 'このユーザーを削除できません。もう一度お試しください。',
addMember: 'このメンバーを追加できませんでした。もう一度お試しください。',
},
},
},
Expand Down
9 changes: 8 additions & 1 deletion src/languages/nl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8274,7 +8274,14 @@ Hier is een *proefbon* om je te laten zien hoe het werkt:`,
findMember: 'Lid zoeken',
addMember: 'Lid toevoegen',
email: 'E-mailadres',
errors: {
closeAccount: 'Account sluiten',
closeAccountPrompt: 'Weet je het zeker? Deze actie is permanent.',
forceCloseAccount: 'Account geforceerd sluiten',
safeCloseAccount: 'Account veilig sluiten',
closeAccountInfo:
'We raden aan om de account veilig te sluiten om te vermijden dat je deze moet sluiten als er zijn: <ul><li>Openstaande goedkeuringen</li><li>Actieve terugbetalingen</li><li>Geen alternatieve inlogmethoden</li></ul>Anders kun je de bovenstaande veiligheidsmaatregelen negeren en de geselecteerde account geforceerd sluiten.',
error: {
removeMember: 'Kan deze gebruiker niet verwijderen. Probeer het opnieuw.',
addMember: 'Kan dit lid niet toevoegen. Probeer het opnieuw.',
},
},
Expand Down
9 changes: 8 additions & 1 deletion src/languages/pl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8254,7 +8254,14 @@ Oto *paragon testowy*, żeby pokazać Ci, jak to działa:`,
findMember: 'Znajdź członka',
addMember: 'Dodaj członka',
email: 'Adres e-mail',
errors: {
closeAccount: 'Zamknij konto',
closeAccountPrompt: 'Czy na pewno? Ta czynność jest nieodwracalna.',
forceCloseAccount: 'Wymuś zamknięcie konta',
safeCloseAccount: 'Zamknij konto bezpiecznie',
closeAccountInfo:
'Zalecamy bezpieczne zamknięcie konta, aby pominąć jego zamykanie w przypadku, gdy występują: <ul><li>Oczekujące zatwierdzenia</li><li>Aktywne zwroty kosztów</li><li>Brak alternatywnych metod logowania</li></ul>W przeciwnym razie możesz zignorować powyższe środki ostrożności i wymusić zamknięcie wybranego konta.',
error: {
removeMember: 'Nie można usunąć tego użytkownika. Spróbuj ponownie.',
addMember: 'Nie można dodać tego członka. Spróbuj ponownie.',
},
},
Expand Down
9 changes: 8 additions & 1 deletion src/languages/pt-BR.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8255,7 +8255,14 @@ Aqui está um *comprovante de teste* para mostrar como funciona:`,
findMember: 'Encontrar membro',
addMember: 'Adicionar membro',
email: 'Endereço de e-mail',
errors: {
closeAccount: 'Encerrar conta',
closeAccountPrompt: 'Tem certeza? Esta ação é permanente.',
forceCloseAccount: 'Forçar encerramento da conta',
safeCloseAccount: 'Fechar conta com segurança',
closeAccountInfo:
'Recomendamos fechar a conta com segurança para evitar o fechamento caso haja: <ul><li>aprovações pendentes</li><li>reembolsos ativos</li><li>nenhum método de login alternativo</li></ul>Caso contrário, você pode ignorar as precauções de segurança acima e forçar o fechamento da conta selecionada.',
error: {
removeMember: 'Não foi possível remover este usuário. Tente novamente.',
addMember: 'Não foi possível adicionar este membro. Tente novamente.',
},
},
Expand Down
11 changes: 9 additions & 2 deletions src/languages/zh-hans.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8096,8 +8096,15 @@ ${reportName}
title: '成员',
findMember: '查找成员',
addMember: '添加成员',
email: '邮箱地址',
errors: {
email: '电子邮箱地址',
closeAccount: '关闭账户',
closeAccountPrompt: '您确定吗?此操作是永久性的。',
forceCloseAccount: '强制关闭账户',
safeCloseAccount: '安全关闭账户',
closeAccountInfo:
'我们建议安全地关闭该账户,以便在存在以下情况时跳过关闭操作:<ul><li>待处理的审批</li><li>正在进行的报销</li><li>没有其他登录方式</li></ul>否则,您可以忽略上述安全预防措施并强制关闭所选账户。',
error: {
removeMember: '无法移除此用户。请重试。',
addMember: '无法添加此成员。请重试。',
},
},
Expand Down
7 changes: 7 additions & 0 deletions src/libs/API/parameters/DeleteDomainMemberParams.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
type DeleteDomainMemberParams = {
targetEmail: string;
domain: string;
overrideProcessingReports: boolean;
};

export default DeleteDomainMemberParams;
1 change: 1 addition & 0 deletions src/libs/API/parameters/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -469,6 +469,7 @@ export type {default as SetPolicyRequireCompanyCardsEnabledParams} from './SetPo
export type {default as SetTechnicalContactEmailParams} from './SetTechnicalContactEmailParams';
export type {default as ToggleConsolidatedDomainBillingParams} from './ToggleConsolidatedDomainBillingParams';
export type {default as RemoveDomainAdminParams} from './RemoveDomainAdminParams';
export type {default as DeleteDomainMemberParams} from './DeleteDomainMemberParams';
export type {default as DeleteDomainParams} from './DeleteDomainParams';
export type {default as GetDuplicateTransactionDetailsParams} from './GetDuplicateTransactionDetailsParams';
export type {default as SetPolicyCodingRuleParams} from './SetPolicyCodingRuleParams';
Expand Down
2 changes: 2 additions & 0 deletions src/libs/API/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -547,6 +547,7 @@ const WRITE_COMMANDS = {
ADD_DOMAIN_ADMIN: 'AddDomainAdmin',
REMOVE_DOMAIN_ADMIN: 'RemoveDomainAdmin',
DELETE_DOMAIN: 'DeleteDomain',
DELETE_DOMAIN_MEMBER: 'DeleteDomainMember',
} as const;

type WriteCommand = ValueOf<typeof WRITE_COMMANDS>;
Expand Down Expand Up @@ -1113,6 +1114,7 @@ type WriteCommandParameters = {
[WRITE_COMMANDS.SET_TECHNICAL_CONTACT_EMAIL]: Parameters.SetTechnicalContactEmailParams;
[WRITE_COMMANDS.TOGGLE_CONSOLIDATED_DOMAIN_BILLING]: Parameters.ToggleConsolidatedDomainBillingParams;
[WRITE_COMMANDS.REMOVE_DOMAIN_ADMIN]: Parameters.RemoveDomainAdminParams;
[WRITE_COMMANDS.DELETE_DOMAIN_MEMBER]: Parameters.DeleteDomainMemberParams;
[WRITE_COMMANDS.DELETE_DOMAIN]: Parameters.DeleteDomainParams;
[WRITE_COMMANDS.ADD_DOMAIN_ADMIN]: Parameters.AddAdminToDomainParams;
[WRITE_COMMANDS.ADD_DOMAIN_MEMBER]: Parameters.AddMemberToDomainParams;
Expand Down
Loading
Loading