Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor: Demo server, prohibit operation #7433

Merged
merged 2 commits into from
Dec 19, 2024
Merged

Conversation

lan-yonghui
Copy link
Member

No description provided.

Copy link

f2c-ci-robot bot commented Dec 18, 2024

Adding the "do-not-merge/release-note-label-needed" label because no release-note block was detected, please follow our release note process to remove it.

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes/test-infra repository.

}
if (key === 'MenuTabs') {
globalStore.setOpenMenuTabs(val === 'enable');
}
if (param.key === 'Language') {
location.reload();
}
Copy link
Member

Choose a reason for hiding this comment

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

The provided code has no major irregularities or potential issues that I can identify based on the given changes. The differences you've made are mostly identical, which means nothing is changing beyond what was already there. There's no need for optimization suggestions in this case, as the functions and conditional logic remain unchanged.

Here’s the relevant part again for clarity:

const onChangeThemeColor = () => {
}

const onSave = async (key: string, val: any) => {
    loading.value = true;

    let param = {
        key: key,
        value: val + '',
    };
    await updateSetting(param)
        .then(async () => {
            if (key === 'Language') {
                i18n.locale.value = val;
                globalStore.updateLanguage(val);
            }
            if (key === 'Theme') {
                globalStore.themeConfig.theme = val;
                switchTheme();
                if (globalStore.isProductPro) {
                    await updateXpackSettingByKey('Theme', val);
                    let color: string;
                    const themeColor: ThemeColor = JSON.parse(globalStore.themeConfig.themeColor);
                    if (val === 'auto') {
                        const prefersDark = window.matchMedia('(prefers-color-scheme: dark)');
                        color = prefersDark.matches ? themeColor.dark : themeColor.light;
                    } else {
                        color = val === 'dark' ? themeColor.dark : themeColor.light;
                    }
                    globalStore.themeConfig.primary = color;
                    setPrimaryColor(color);
                }
            }
            if (key === 'MenuTabs') {
                globalStore.setOpenMenuTabs(val === 'enable');
            }

            if (param.key === 'Language') {
                location.reload();
            }
        })
        .finally(() => {
            loading.value = false;
        });
}

If this function were to be modified in the future, it might make sense to refactor some of these repeated blocks into helper functions or use more efficient data structures where appropriate. However, without additional context about the larger application architecture or specific requirements, those would not seem necessary at this point.

@@ -130,7 +130,7 @@ class RequestHttp {
response.status,
response.data && response.data['message'] ? response.data['message'] : '',
);
return;
return Promise.reject(error);
default:
globalStore.isLogin = false;
globalStore.errStatus = 'code-' + response.status;
Copy link
Member

Choose a reason for hiding this comment

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

The code appears to be a part of an HTTP request handler that processes different response types and returns appropriate results or errors. Here are some observations and possible improvements:

  1. Return Statement: The original line return; is incorrect because it doesn't handle any specific error conditions when the status code doesn't match expected values like 2xx.

  •            return;
    
    •           // Handle other unexpected statuses with proper error handling
      
  •        }
    
    
    
  1. Error Handling for Non-Expected Statuses: The current logic only returns for unexpected statuses (other than 2xx). You might want to add a more general error handling mechanism to catch all other non-expected cases.

  2. Consistency Across Different Responses: It's generally better to follow a consistent pattern across different parts of the function. For example:

              return Promise.reject(new Error(`Server responded with an unexpected status: ${response.status}`));
          default:
              globalStore.isLogin = false;
              globalStore.errStatus = 'code-' + response.status;
  •    return Promise.reject(new Error('Failed to process GET/PUT requests'));
    

    };

    this.handlePostResponse = async ({ response }) => {

  •    console.log(response.statusText, response.text(), response.status);
    
  •    if ([200, 201].includes(response.status)) { // Add common success codes here
    
  •        const data = await response.json();
    
  •        Logger.info(data); // Log or use the data accordingly
    
  •        return data;
    
  •    } else {
    
  •        return Promise.reject(new Error(`POST request failed, received status: ${response.status}`)); // Specific to POST requests
    

4. **Promise Rejections**: Ensure that every branch of your asynchronous functions correctly rejects promises. This provides a clear indication of what went wrong.

These changes aim to enhance the robustness and maintainability of the code by handling various scenarios more gracefully.

} catch (error) {
} finally {
loading.value = false;
}
};

onMounted(() => {
Copy link
Member

Choose a reason for hiding this comment

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

There appear to be some changes in the structure of the onSave function, particularly around how it handles different keys ('Language', 'Theme', 'MenuTabs'). Here are some improvements and suggestions:

Key Improvements:

  1. Unified Logic for Theme Handling:

    • Combine the logic related to updateXpackSettingByKey, switching themes, updating primary color, and setting menu tabs into a single method (handleThemeChange). This reduces duplication and makes the code cleaner.
  2. Error Handling:

    • Added a catch block within the promise chain to ensure that any errors during processing do not cause the flow to crash.
  3. Loading Value Management:

    • Moved the finalization of the loading state outside both the then and catch blocks. The loading indicator should only be turned off on success or error.
  4. Return Statement:

    • Since you mentioned checking for specific types (e.g., "string"), it would make sense to include these checks at the start of the function to prevent unnecessary operations. However, based on your provided snippet, this is assumed handled elsewhere.
  5. Code Readability:

    • Improved indentation and spacing for better readability.

Here's an updated version of the onSave function with these considerations applied:

const handleThemeChange = async (val: string): Promise<void> => {
    globalStore.themeConfig.theme = val;
    switchTheme();
    if (globalStore.isProductPro) {
        await updateXpackSettingByKey('Theme', val);
        let color: string;
        const themeColor: ThemeColor = JSON.parse(globalStore.themeConfig.themeColor);
        if (val === 'auto') {
            const prefersDark = window.matchMedia('(prefers-color-scheme: dark)');
            color = prefersDark.matches ? themeColor.dark : themeColor.light;
        } else {
            color = val === 'dark' ? themeColor.dark : themeColor.light;
        }
        globalStore.themeConfig.primary = color;
        setPrimaryColor(color);
    }
};

async function onSave(key: string, val: any): Promise<void> {
    loading.value = true;

    // Check if the value is a string before proceeding further
    if (typeof val !== 'string') return;

    let param: { key: string; value: string | number } = {
        key,
        value: val.toString(),
    };

    try {
        await updateSetting(param);

        if (key === 'Language') {
            i18n.locale.value = val;
            globalStore.updateLanguage(val);
            location.reload();
        }

        if (key === 'Theme') {
            await handleThemeChange(val);
        }

        if (key === 'MenuTabs') {
            globalStore.setOpenMenuTabs(val === 'enable');
        }

        Message.success(i18n.t('commons.msg.operationSuccess'));
        await search();
    } catch (error) {
        console.error('An error occurred:', error); // Add logging here or use a more appropriate error handling approach
    }

    finally {
        loading.value = false;
    }
}

onMounted(() => {

Please note that I've included type-checking for strings to handle unexpected data types early in the process. If you prefer logging instead of catching, feel free to adjust accordingly. Additionally, ensure that all external functions used (like location.reload(), setPrimaryColor, search() etc.) exist and perform their intended actions correctly.

@@ -130,7 +130,7 @@ class RequestHttp {
response.status,
response.data && response.data['message'] ? response.data['message'] : '',
);
return;
return Promise.reject(error);
default:
globalStore.isLogin = false;
globalStore.errStatus = 'code-' + response.status;
Copy link
Member

Choose a reason for hiding this comment

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

There is one potential issue with handling the default case. The current implementation will not reject the promise if the status code does not match any of the specified cases (e.g., 401, 403) but still returns the message from the response data. To make this consistent, you should handle all error codes similarly and then resolve or reject the promise appropriately.

Additionally, adding a more descriptive description for the error would be helpful. Here's an updated version:

@@ -130,7 +130,7 @@ class RequestHttp {
                                 response.status,
                                 response.data && response.data['message'] ? response.data['message'] : 'API request failed',
                             );
-                            return;
+                            return Promise.reject(new Error(`Request to ${url} failed with status ${response.status}: ${error.message}`));
                         default:
                             globalStore.isLogin = false;
                             globalStore.errStatus = 'code-' + response.status;

This ensures that the promise is handled consistently, providing a clear failure message when there's an unexpected status code.

Copy link

Copy link
Member

@ssongliu ssongliu left a comment

Choose a reason for hiding this comment

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

/lgtm

@zhengkunwang223
Copy link
Member

/approve

@wanghe-fit2cloud
Copy link
Member

Bot detected the issue body's language is not English, translate it automatically. 👯👭🏻🧑‍🤝‍🧑👫🧑🏿‍🤝‍🧑🏻👩🏾‍🤝‍👨🏿👬🏿


/approve

Copy link

f2c-ci-robot bot commented Dec 19, 2024

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: wanghe-fit2cloud, zhengkunwang223

The full list of commands accepted by this bot can be found here.

The pull request process is described here

Needs approval from an approver in each of these files:
  • OWNERS [wanghe-fit2cloud,zhengkunwang223]

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@f2c-ci-robot f2c-ci-robot bot merged commit 956d47f into dev Dec 19, 2024
7 checks passed
@f2c-ci-robot f2c-ci-robot bot deleted the pr@dev@refactor_demo branch December 19, 2024 02:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants