mirror of
https://github.com/vrtmrz/obsidian-livesync.git
synced 2026-02-22 20:18:48 +00:00
Improved - New Translation: `es` (Spanish) by @zeedif (Thank you so much)! - Now all of messages can be selectable and copyable, also on the iPhone, iPad, and Android devices. Now we can copy or share the messages easily. New Feature - Peer-to-Peer Synchronisation has been implemented! Fixed - No longer memory or resource leaks when the plug-in is disabled. - Now deleted chunks are correctly detected on conflict resolution, and we are guided to resurrect them. - Hanging issue during the initial synchronisation has been fixed. - Some unnecessary logs have been removed. - Now all modal dialogues are correctly closed when the plug-in is disabled. Refactor - Several interfaces have been moved to the separated library. - Translations have been moved to each language file, and during the build, they are merged into one file. - Non-mobile friendly code has been removed and replaced with the safer code. - Started writing Platform impedance-matching-layer. - Svelte has been updated to v5. - Some function have got more robust type definitions. - Terser optimisation has slightly improved. - During the build, analysis meta-file of the bundled codes will be generated.
106 lines
2.8 KiB
Svelte
106 lines
2.8 KiB
Svelte
<script lang="ts">
|
|
import { onDestroy, onMount } from "svelte";
|
|
import { logMessages } from "../../../lib/src/mock_and_interop/stores";
|
|
import { reactive, type ReactiveInstance } from "../../../lib/src/dataobject/reactive";
|
|
import { Logger } from "../../../lib/src/common/logger";
|
|
import { $msg as msg, currentLang as lang } from "../../../lib/src/common/i18n.ts";
|
|
|
|
let unsubscribe: () => void;
|
|
let messages = $state([] as string[]);
|
|
let wrapRight = $state(false);
|
|
let autoScroll = $state(true);
|
|
let suspended = $state(false);
|
|
|
|
type Props = {
|
|
close: () => void;
|
|
};
|
|
let { close }: Props = $props();
|
|
// export let close: () => void;
|
|
function updateLog(logs: ReactiveInstance<string[]>) {
|
|
const e = logs.value;
|
|
if (!suspended) {
|
|
messages = [...e];
|
|
setTimeout(() => {
|
|
if (scroll) scroll.scrollTop = scroll.scrollHeight;
|
|
}, 10);
|
|
}
|
|
}
|
|
onMount(async () => {
|
|
const _logMessages = reactive(() => logMessages.value);
|
|
_logMessages.onChanged(updateLog);
|
|
Logger(msg("logPane.logWindowOpened", {}, lang));
|
|
unsubscribe = () => _logMessages.offChanged(updateLog);
|
|
});
|
|
onDestroy(() => {
|
|
if (unsubscribe) unsubscribe();
|
|
});
|
|
let scroll: HTMLDivElement;
|
|
function closeDialogue() {
|
|
close();
|
|
}
|
|
</script>
|
|
|
|
<div class="logpane">
|
|
<!-- <h1>{msg("logPane.title", {}, lang)}</h1> -->
|
|
<div class="control">
|
|
<div class="row">
|
|
<label>
|
|
<input type="checkbox" bind:checked={wrapRight} />
|
|
<span>{msg("logPane.wrap", {}, lang)}</span>
|
|
</label>
|
|
<label>
|
|
<input type="checkbox" bind:checked={autoScroll} />
|
|
<span>{msg("logPane.autoScroll", {}, lang)}</span>
|
|
</label>
|
|
<label>
|
|
<input type="checkbox" bind:checked={suspended} />
|
|
<span>{msg("logPane.pause", {}, lang)}</span>
|
|
</label>
|
|
<span class="spacer"></span>
|
|
<button onclick={() => closeDialogue()}>Close</button>
|
|
</div>
|
|
</div>
|
|
<div class="log" bind:this={scroll}>
|
|
{#each messages as line}
|
|
<pre class:wrap-right={wrapRight}>{line}</pre>
|
|
{/each}
|
|
</div>
|
|
</div>
|
|
|
|
<style>
|
|
* {
|
|
box-sizing: border-box;
|
|
}
|
|
.logpane {
|
|
display: flex;
|
|
height: 100%;
|
|
flex-direction: column;
|
|
}
|
|
.log {
|
|
overflow-y: scroll;
|
|
user-select: text;
|
|
-webkit-user-select: text;
|
|
padding-bottom: 2em;
|
|
}
|
|
.log > pre {
|
|
margin: 0;
|
|
}
|
|
.log > pre.wrap-right {
|
|
word-break: break-all;
|
|
max-width: 100%;
|
|
width: 100%;
|
|
white-space: normal;
|
|
}
|
|
.row {
|
|
display: flex;
|
|
flex-direction: row;
|
|
justify-content: flex-end;
|
|
}
|
|
.row > label {
|
|
display: flex;
|
|
align-items: center;
|
|
min-width: 5em;
|
|
margin-right: 1em;
|
|
}
|
|
</style>
|