mirror of https://github.com/halo-dev/halo
43 lines
1015 B
TypeScript
43 lines
1015 B
TypeScript
![]() |
import { useWindowFocus } from "@vueuse/core";
|
||
|
import { watch, type Ref } from "vue";
|
||
|
import { onBeforeRouteLeave } from "vue-router";
|
||
|
import { useTimeoutFn } from "@vueuse/core";
|
||
|
import type { ContentCache } from "./use-content-cache";
|
||
|
|
||
|
export function useAutoSaveContent(
|
||
|
currentCache: Ref<ContentCache | undefined>,
|
||
|
raw: Ref<string | undefined>,
|
||
|
callback: () => void
|
||
|
) {
|
||
|
// TODO it may be necessary to know the latest version before saving, otherwise it will overwrite the latest version
|
||
|
const handleAutoSave = () => {
|
||
![]() |
if (currentCache.value) {
|
||
|
callback();
|
||
|
}
|
||
![]() |
};
|
||
|
|
||
|
onBeforeRouteLeave(() => {
|
||
|
handleAutoSave();
|
||
|
});
|
||
|
|
||
|
watch(useWindowFocus(), (newFocus) => {
|
||
![]() |
if (!newFocus) {
|
||
![]() |
handleAutoSave();
|
||
|
}
|
||
|
});
|
||
|
|
||
|
window.addEventListener("beforeunload", () => {
|
||
|
handleAutoSave();
|
||
|
});
|
||
|
|
||
|
const { start, isPending, stop } = useTimeoutFn(() => {
|
||
|
handleAutoSave();
|
||
|
}, 20 * 1000);
|
||
|
watch(raw, () => {
|
||
|
if (isPending.value) {
|
||
|
stop();
|
||
|
}
|
||
|
start();
|
||
|
});
|
||
|
}
|