Skip to content

Commit 8889994

Browse files
committed
refactor setting read/write logic
1 parent 706b2cd commit 8889994

File tree

4 files changed

+44
-35
lines changed

4 files changed

+44
-35
lines changed

src/App.svelte

Lines changed: 16 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,25 @@ import { copyTextToClipboard } from '@qwinsi/utilities-js/clipboard'
66
import CopiedToast from './components/CopiedToast.svelte'
77
import SettingsDialog from './components/SettingsDialog.svelte'
88
import { getRandomFormula } from './random'
9-
import { DEFAULT_SETTINGS } from './default-settings';
9+
import { load_settings, remember_to_save_settings_before_unload } from './settings';
1010
import { version as APP_VERSION } from '../package.json';
1111
import butterup from 'butteruptoasts';
1212
import SwapIcon from './assets/SwapIcon.svelte';
1313
// have to do this because butteruptoasts places CSS in wrong place
1414
import '../node_modules/butteruptoasts/src/butterup.css';
1515
16-
let directionToTypst = $state(true);
17-
18-
let settings = $state(DEFAULT_SETTINGS);
16+
const init_settings = load_settings();
17+
if (!init_settings.rememberDirection) {
18+
init_settings.directionToTypst = true;
19+
}
20+
let settings = $state(init_settings);
1921
2022
let inputStr = $state('');
2123
2224
function get_output(inputStr, settings) {
2325
try {
2426
const tex = inputStr;
25-
if(directionToTypst) {
27+
if(settings.directionToTypst) {
2628
const typst = convertTex2Typst(tex, {
2729
preferShorthands: settings.preferShorthands,
2830
fracToSlash: settings.texFracToTypstSlash,
@@ -114,8 +116,8 @@ function handleSettingsClick() {
114116
}
115117
116118
117-
function get_rendered_html(directionToTypst, inputStr, output, settings) {
118-
const latex = directionToTypst ? inputStr : output.target;
119+
function get_rendered_html(inputStr, output, settings) {
120+
const latex = settings.directionToTypst ? inputStr : output.target;
119121
if (latex === '') {
120122
return null;
121123
} else {
@@ -130,31 +132,22 @@ function get_rendered_html(directionToTypst, inputStr, output, settings) {
130132
}
131133
}
132134
133-
const renderedFormulaHtml = $derived(get_rendered_html(directionToTypst, inputStr, output, settings));
135+
const renderedFormulaHtml = $derived(get_rendered_html(inputStr, output, settings));
134136
135137
136138
137139
function handleNewSettings(data) {
138-
settings = data;
139-
localStorage.setItem('settings', JSON.stringify(data));
140+
settings = Object.assign({directionToTypst: settings.directionToTypst}, data);
140141
}
141142
142143
function handleFlipDirection() {
143144
const outputStr = output.target;
144-
directionToTypst = !directionToTypst;
145+
settings.directionToTypst = !settings.directionToTypst;
145146
inputStr = outputStr;
146147
}
147148
148149
149150
onMount(() => {
150-
const settingsStr = localStorage.getItem('settings');
151-
if(settingsStr) {
152-
settings = Object.assign(settings, JSON.parse(settingsStr));
153-
}
154-
if(settings.rememberDirection && localStorage.getItem('lastDirection')) {
155-
directionToTypst = localStorage.getItem('lastDirection') !== 'false';
156-
}
157-
158151
inputArea.focus();
159152
160153
// Enable ":active" pseudo-class on mobile safari. https://stackoverflow.com/q/3885018/
@@ -165,9 +158,7 @@ onMount(() => {
165158
});
166159
}
167160
168-
window.addEventListener('beforeunload', function() {
169-
localStorage.setItem('lastDirection', directionToTypst.toString());
170-
});
161+
remember_to_save_settings_before_unload(() => settings);
171162
172163
const channel = new BroadcastChannel('SW_MESSAGES');
173164
channel.addEventListener('message', event => {
@@ -220,9 +211,9 @@ To use new version, close all tabs of this website then open again.
220211
<main class="flex-1 flex flex-col justify-between ml-6 mr-6">
221212
<div class="flex justify-between p-2 border-b border-gray-700">
222213
<div class="flex-1 flex justify-between">
223-
<span class="app-text p-2">{ directionToTypst? "LaTeX": "Typst" }</span>
214+
<span class="app-text p-2">{ settings.directionToTypst? "LaTeX": "Typst" }</span>
224215
<div>
225-
<button class="mr-2 op-btn" onclick={() => {inputStr = getRandomFormula(directionToTypst);}}>
216+
<button class="mr-2 op-btn" onclick={() => {inputStr = getRandomFormula(settings.directionToTypst);}}>
226217
<span class="hide-on-mobile">Random</span>
227218
<span class="hide-on-desktop">R</span>
228219
</button>
@@ -238,7 +229,7 @@ To use new version, close all tabs of this website then open again.
238229
</button>
239230

240231
<div class="flex-1 flex justify-between relative">
241-
<span class="app-text p-2">{ directionToTypst? "Typst": "LaTeX" }</span>
232+
<span class="app-text p-2">{ settings.directionToTypst? "Typst": "LaTeX" }</span>
242233
<button class="op-btn"
243234
onclick={sendToClipboard}>Copy</button>
244235
<CopiedToast style="position: absolute; top: -55px; right: -4px;" bind:this={copiedToast} msg="Copied!" />

src/components/SettingsDialog.svelte

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,10 @@
22
import ToggleSwitch from './ToggleSwitch.svelte';
33
import { version as APP_VERSION } from '../../package.json';
44
import { version as TEX2TYPST_VERSION } from '../../node_modules/tex2typst/package.json';
5-
import { DEFAULT_SETTINGS } from '../default-settings';
65
76
87
let {
9-
initial = DEFAULT_SETTINGS,
8+
initial,
109
newSettingsHandler
1110
} = $props();
1211

src/default-settings.js

Lines changed: 0 additions & 8 deletions
This file was deleted.

src/settings.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
const DEFAULT_SETTINGS = {
2+
showPreview: true,
3+
displayStyle: true,
4+
rememberDirection: true,
5+
preferShorthands: true,
6+
texFracToTypstSlash: true,
7+
texInftyToTypstOo: false,
8+
directionToTypst: true,
9+
};
10+
11+
const SETTINGS_KEY = 'typing-practice-settings';
12+
13+
14+
export function load_settings() {
15+
const settings_str = localStorage.getItem(SETTINGS_KEY);
16+
const user_settings = settings_str ? JSON.parse(settings_str) : {};
17+
return Object.assign(DEFAULT_SETTINGS, user_settings);
18+
}
19+
20+
export function remember_to_save_settings_before_unload(fnGetSettings) {
21+
window.addEventListener('beforeunload', function () {
22+
const settings = fnGetSettings();
23+
localStorage.setItem(SETTINGS_KEY, JSON.stringify(settings));
24+
});
25+
}
26+
27+

0 commit comments

Comments
 (0)