22581b2f创建于 2025年12月16日历史提交
/*

 * -------------------------------------------------------------------------

 * This file is part of the MindStudio project.

 * Copyright (c) 2025 Huawei Technologies Co.,Ltd.

 *

 * MindStudio is licensed under Mulan PSL v2.

 * You can use this software according to the terms and conditions of the Mulan PSL v2.

 * You may obtain a copy of Mulan PSL v2 at:

 *

 *          http://license.coscl.org.cn/MulanPSL2

 *

 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,

 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,

 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.

 * See the Mulan PSL v2 for more details.

 * -------------------------------------------------------------------------

 */



import React, { useState } from 'react';

import type { Session } from '../entity/session';

import type { CardMetaData } from '../entity/data';

import styled from '@emotion/styled';

import { observer } from 'mobx-react';

import { useTranslation } from 'react-i18next';

import { useTheme } from '@emotion/react';

import { themeInstance } from '@insight/lib/theme';

import { Input, Button } from '@insight/lib/components';

import { runInAction } from 'mobx';

import { Modal, message, type InputRef } from 'antd';

import { setCardAliasReq } from '../api/request';



const SetAliasTitleDiv = styled.div`

    font-size: 16px;

    font-weight: 500;

    margin: 0 0 20px;

    box-shadow: inset 0 -1px 0 0 ${(props): string => `${props.theme.splitLineColor}`};

    padding: 0 0 10px 10px;

`;



const FlexDiv = styled.div`

    display: flex;

    align-items: center;

`;



const AliasInputBox = styled(FlexDiv)`

    margin: 0 0 20px;

    flex-wrap: wrap;

    gap: 24px;

    padding: 0 24px;

`;



const ButtonContainer = styled.div`

    display: flex;

    align-items: center;

    justify-content: center;

    gap: 20px;

    padding: 36px 0 30px;

`;



const SetAliasDiv = styled.div`

    pointer-events: auto;

    padding-top: 13px;

    box-shadow: 0 10px 100px 0 rgba(0,0,0,0.50);

    border-radius: 4px;

`;



const handleCancelSetAlias = (session: Session): void => {

    runInAction(() => {

        Modal.destroyAll();

    });

};



const handleConfirmSetAlias = (session: Session, newCardAlias: string): void => {

    runInAction(async () => {

        try {

            const { cardId, dbPath } = session.selectedUnits[0].metadata as CardMetaData;

            await setCardAliasReq({ rankId: cardId, dbPath, cardAlias: newCardAlias });

            (session.selectedUnits[0].metadata as CardMetaData).label = newCardAlias;

        } catch (error) {

            message.error('Set card alias error!');

        }

        Modal.destroyAll();

    });

};



export const SetAlias = observer(({ session }: {session: Session}) => {

    const [cardAlias, setCardAlias] = useState<string>('');

    const { t } = useTranslation('timeline');

    const [theme, setTheme] = useState(useTheme());

    const inputRef = React.useRef<InputRef>(null);

    React.useEffect(() => {

        if (theme !== themeInstance.getThemeType()) {

            setTheme(themeInstance.getThemeType());

        }

    }, [themeInstance.getThemeType()]);



    React.useEffect(() => {

        inputRef.current?.focus({ cursor: 'end' });

    }, []);



    const cancelSetAlias = (): void => { handleCancelSetAlias(session); };

    const confirmSetAlias = (): void => { handleConfirmSetAlias(session, cardAlias); };



    return (

        <SetAliasDiv style={{ color: theme.textColorPrimary, background: theme.bgColorLight }}>

            <SetAliasTitleDiv>

                <span>{t('contextMenu.Set alias')}</span>

            </SetAliasTitleDiv>

            <AliasInputBox>

                <FlexDiv>

                    <span>{`${t('contextMenu.Alias')}:`}</span>

                </FlexDiv>

                <FlexDiv>

                    <Input

                        ref={inputRef}

                        style={{ color: theme.textColorPrimary, backgroundColor: theme.bgColorLight }}

                        value={cardAlias}

                        onChange={(e): void => { setCardAlias(e.target.value); }}

                        onPressEnter={confirmSetAlias}

                    />

                </FlexDiv>

            </AliasInputBox>

            <ButtonContainer>

                <Button onClick={ cancelSetAlias }>{t('timelineMarker:cancelButton')}</Button>

                <Button type={'primary'} onClick={ confirmSetAlias }>{t('timelineMarker:confirmButton')}</Button>

            </ButtonContainer>

        </SetAliasDiv>

    );

});