e9d42eae创建于 22 天前历史提交
<template>
    <a-config-provider :locale="locale" :global="true">
        <div
            ref="main"
            id="main"
            :class="{ 'no-active-plugin': !manager.activePlugin }"
        >
            <MainSearch ref="mainSearch" @onClose="onClose" />
            <MainResult ref="mainResult" />
        </div>
    </a-config-provider>
</template>

<script setup lang="ts">
import { onMounted, ref } from "vue";

import { useLocale } from "./app/locale";
import { doCheckForUpdate } from "./components/common/util";
import { useMainOperate } from "./pages/Main/Lib/mainOperate";
import { ignoreNextResultResize } from "./pages/Main/Lib/resultResize";
import MainResult from "./pages/Main/MainResult.vue";
import MainSearch from "./pages/Main/MainSearch.vue";
import { useManagerStore } from "./store/modules/manager";
import { PluginRecord } from "./types/Manager";

const manager = useManagerStore();

const main = ref<HTMLElement | null>(null);
const mainSearch = ref<InstanceType<typeof MainSearch> | null>(null);
const mainResult = ref<InstanceType<typeof MainResult> | null>(null);

const { locale } = useLocale();

const { onKeyDown } = useMainOperate();

const onClose = () => {
    mainResult.value?.onClose();
};

window.__page.onShow(() => {
    // console.log('main.onShow')
    manager.showFirstRun = true;
    mainSearch.value?.onShow();
});
window.__page.onPluginInit(
    (data: {
        plugin: PluginRecord;
        param: {
            alwaysOnTop: boolean;
        };
    }) => {
        // console.log('main.onPluginInit', data)
        manager.setActivePluginLoading(true);
        manager.setActivePlugin(data.plugin);
        manager.setSubInput({
            placeholder: "",
            isFocus: false,
            isVisible: false,
        });
        manager.setSubInputValue("");
        mainSearch.value?.focus(true);
    },
);
window.__page.onPluginInitReady(() => {
    // console.log('main.onPluginInitReady')
    manager.setActivePluginLoading(false);
});
window.__page.onPluginAlreadyOpened(() => {
    // console.log('main.onPluginAlreadyOpened')
    manager.search("");
    manager.hideMainWindow();
});
window.__page.onPluginExit((data: { openForNext: boolean }) => {
    // console.log('main.onPluginExit', data);
    if (data.openForNext) {
        ignoreNextResultResize();
    }
    manager.setActivePlugin(null);
    manager.search("");
    mainResult.value?.onPluginExit();
    setTimeout(() => {
        if (manager.activePlugin) {
            return;
        }
        mainSearch.value?.focus(true);
    }, 100);
});
window.__page.onPluginDetached(() => {
    // console.log('main.onPluginDetached')
    manager.setActivePlugin(null);
    manager.search("");
    mainResult.value?.onPluginDetached();
});
window.__page.onDetachWindowClosed(async () => {
    if (!manager.activePlugin) {
        await manager.detachWindowActionsRefresh();
    }
});
window.__page.onPluginState(() => {
    return {
        value: manager.searchValue,
        placeholder: manager.searchSubPlaceholder,
    };
});
window.__page.onPluginCodeInit(
    (data: {
        plugin: PluginRecord;
        type: "list" | never;
        placeholder: string;
    }) => {
        // console.log('main.onPluginCodeInit', data);
        manager.setActivePlugin(data.plugin, "code");
        manager.setActivePluginLoading(false);
        manager.setSubInput({
            placeholder: data.placeholder,
            isFocus: true,
            isVisible: true,
        });
        manager.actionCodeType = data.type;
        setTimeout(() => {
            mainSearch.value?.focus(false);
        }, 1000);
    },
);
window.__page.onPluginCodeSetting(
    (data: { loading?: boolean; error?: string; placeholder?: string }) => {
        // console.log('main.onPluginCodeData', data);
        if ("loading" in data) {
            manager.actionCodeLoading = data.loading || false;
        }
        if ("error" in data) {
            manager.actionCodeError = data.error || "";
        }
        if ("placeholder" in data) {
            manager.setSubInput({
                placeholder: data.placeholder as string,
                isFocus: true,
                isVisible: true,
            });
        }
    },
);
window.__page.onPluginCodeData(
    (data: { items: { id: string; [key: string]: unknown }[] }) => {
        // console.log('main.onPluginCodeData', data);
        manager.actionCodeError = null;
        manager.actionCodeLoading = false;
        manager.actionCodeItems = data.items.map((o, oIndex) => {
            return {
                shortcutIndex: oIndex <= 8 ? oIndex + 1 : -1,
                ...o,
            };
        });
        manager.actionCodeItemActiveId =
            data.items.length > 0 ? data.items[0].id : null;
    },
);
window.__page.onPluginCodeExit(() => {
    // console.log('main.onPluginCodeExit');
    manager.setActivePlugin(null);
    manager.search("");
    mainResult.value?.onPluginExit();
    manager.actionCodeItems = [];
    manager.actionCodeItemActiveId = null;
    manager.actionCodeType = null;
    setTimeout(() => {
        mainSearch.value?.focus(true);
    }, 1000);
});
window.__page.onSetSubInput(
    (param: { placeholder: string; isFocus: boolean; isVisible: boolean }) => {
        // console.log('main.onSetSubInput', param)
        manager.setSubInput(param);
        if (param.isFocus) {
            setTimeout(() => {
                mainSearch.value?.focus(false);
            }, 1000);
        }
    },
);
window.__page.onRemoveSubInput(() => {
    // console.log('main.onRemoveSubInput')
    manager.removeSubInput();
});
window.__page.onSetSubInputValue((value: string) => {
    // console.log('main.onSetSubInputValue', value)
    manager.setSubInputValue(value);
});

window.addEventListener("keydown", (e) => {
    const { resultKey } = onKeyDown(e);
    // console.log('main.onKeyDown', e, resultKey);
    if (resultKey) {
        mainResult.value?.onInputKey(resultKey);
    } else if (manager.activePlugin && manager.activePluginType === "code") {
        if (["1", "2", "3", "4", "5", "6", "7", "8", "9"].includes(e.key)) {
            mainResult.value?.onInputHotKey(e);
        }
    }
});

onMounted(() => {
    setTimeout(async () => {
        const checkAtLaunch = await window.$mapi.config.get(
            "updaterCheckAtLaunch",
            "yes",
        );
        if ("yes" !== checkAtLaunch) {
            return;
        }
        doCheckForUpdate().then();
    }, 6000);
});
</script>

<style lang="less">
@mainBorderRadius: 15px;
#main {
    height: 100vh;
    overflow: hidden;
    border-radius: @mainBorderRadius;
    background: #ffffff;

    &.no-active-plugin {
        &::before {
            content: "";
            position: absolute;
            inset: 0;
            padding: 4px;
            border-radius: @mainBorderRadius;
            background-image: linear-gradient(
                130deg,
                #a8c8f4,
                #61c4f5,
                #ba59ff
            );
            background-size: 300% 300%;
            animation: border-flow 2s linear infinite;
            -webkit-mask:
                linear-gradient(#fff 0 0) content-box,
                linear-gradient(#fff 0 0);
            -webkit-mask-composite: xor;
            pointer-events: none;
        }

        @keyframes border-flow {
            0% {
                background-position: 0% 50%;
            }
            50% {
                background-position: 100% 50%;
            }
            100% {
                background-position: 0% 50%;
            }
        }
    }
}

[data-theme="dark"] {
    #main {
        background: #1e1e1e;
    }
}
</style>