enhance(frontend): ウィジェットもpreference管理に

This commit is contained in:
syuilo 2025-03-09 15:13:49 +09:00
parent 2918fb2609
commit 69eee9f050
8 changed files with 57 additions and 61 deletions

View File

@ -154,6 +154,7 @@ export async function mainBoot() {
prefer.set('lightTheme', ColdDeviceStorage.get('lightTheme')); prefer.set('lightTheme', ColdDeviceStorage.get('lightTheme'));
prefer.set('darkTheme', ColdDeviceStorage.get('darkTheme')); prefer.set('darkTheme', ColdDeviceStorage.get('darkTheme'));
prefer.set('syncDeviceDarkMode', ColdDeviceStorage.get('syncDeviceDarkMode')); prefer.set('syncDeviceDarkMode', ColdDeviceStorage.get('syncDeviceDarkMode'));
prefer.set('widgets', store.state.widgets);
prefer.set('keepCw', store.state.keepCw); prefer.set('keepCw', store.state.keepCw);
prefer.set('collapseRenotes', store.state.collapseRenotes); prefer.set('collapseRenotes', store.state.collapseRenotes);
prefer.set('rememberNoteVisibility', store.state.rememberNoteVisibility); prefer.set('rememberNoteVisibility', store.state.rememberNoteVisibility);

View File

@ -35,6 +35,15 @@ export const PREF_DEF = {
accountDependent: true, accountDependent: true,
default: null as string | null, default: null as string | null,
}, },
widgets: {
accountDependent: true,
default: [] as {
name: string;
id: string;
place: string | null;
data: Record<string, any>;
}[],
},
themes: { themes: {
default: [] as Theme[], default: [] as Theme[],

View File

@ -203,7 +203,7 @@ export async function enableAutoBackup() {
export const shouldSuggestRestoreBackup = ref(false); export const shouldSuggestRestoreBackup = ref(false);
if ($i != null) { if ($i != null) {
if (new Date($i.createdAt).getTime() < (Date.now() - 1000 * 60 * 30)) { // アカウント作成直後は意味ないので除外 if (new Date($i.createdAt).getTime() > (Date.now() - 1000 * 60 * 30)) { // アカウント作成直後は意味ないので除外
miLocalStorage.setItem('hidePreferencesRestoreSuggestion', 'true'); miLocalStorage.setItem('hidePreferencesRestoreSuggestion', 'true');
} else { } else {
if (miLocalStorage.getItem('hidePreferencesRestoreSuggestion') !== 'true') { if (miLocalStorage.getItem('hidePreferencesRestoreSuggestion') !== 'true') {

View File

@ -102,15 +102,6 @@ export const store = markRaw(new Storage('base', {
where: 'device', where: 'device',
default: false, default: false,
}, },
widgets: {
where: 'account',
default: [] as {
name: string;
id: string;
place: string | null;
data: Record<string, any>;
}[],
},
tl: { tl: {
where: 'deviceAccount', where: 'deviceAccount',
default: { default: {
@ -187,6 +178,15 @@ export const store = markRaw(new Storage('base', {
}, },
//#region TODO: そのうち消す (preferに移行済み) //#region TODO: そのうち消す (preferに移行済み)
widgets: {
where: 'account',
default: [] as {
name: string;
id: string;
place: string | null;
data: Record<string, any>;
}[],
},
defaultSideView: { defaultSideView: {
where: 'device', where: 'device',
default: false, default: false,

View File

@ -39,15 +39,6 @@ function skip() {
overflow: clip; overflow: clip;
contain: strict; contain: strict;
background: var(--MI_THEME-panel); background: var(--MI_THEME-panel);
@container (max-width: 1000px) {
display: block;
text-align: center;
> .body {
display: none;
}
}
} }
.icon { .icon {

View File

@ -143,20 +143,18 @@ if (window.innerWidth < 1024) {
document.documentElement.style.overflowY = 'scroll'; document.documentElement.style.overflowY = 'scroll';
store.loaded.then(() => { if (prefer.s.widgets.length === 0) {
if (store.state.widgets.length === 0) { prefer.set('widgets', [{
store.set('widgets', [{ name: 'calendar',
name: 'calendar', id: 'a', place: null, data: {},
id: 'a', place: null, data: {}, }, {
}, { name: 'notifications',
name: 'notifications', id: 'b', place: null, data: {},
id: 'b', place: null, data: {}, }, {
}, { name: 'trends',
name: 'trends', id: 'c', place: null, data: {},
id: 'c', place: null, data: {}, }]);
}]); }
}
});
onMounted(() => { onMounted(() => {
window.addEventListener('resize', () => { window.addEventListener('resize', () => {

View File

@ -106,7 +106,6 @@ import type MkStickyContainer from '@/components/global/MkStickyContainer.vue';
import type { PageMetadata } from '@/utility/page-metadata.js'; import type { PageMetadata } from '@/utility/page-metadata.js';
import XDrawerMenu from '@/ui/_common_/navbar-for-mobile.vue'; import XDrawerMenu from '@/ui/_common_/navbar-for-mobile.vue';
import * as os from '@/os.js'; import * as os from '@/os.js';
import { store } from '@/store.js';
import { navbarItemDef } from '@/navbar.js'; import { navbarItemDef } from '@/navbar.js';
import { i18n } from '@/i18n.js'; import { i18n } from '@/i18n.js';
import { $i } from '@/account.js'; import { $i } from '@/account.js';
@ -178,20 +177,18 @@ if (window.innerWidth > 1024) {
} }
} }
store.loaded.then(() => { if (prefer.s.widgets.length === 0) {
if (store.state.widgets.length === 0) { prefer.set('widgets', [{
store.set('widgets', [{ name: 'calendar',
name: 'calendar', id: 'a', place: 'right', data: {},
id: 'a', place: 'right', data: {}, }, {
}, { name: 'notifications',
name: 'notifications', id: 'b', place: 'right', data: {},
id: 'b', place: 'right', data: {}, }, {
}, { name: 'trends',
name: 'trends', id: 'c', place: 'right', data: {},
id: 'c', place: 'right', data: {}, }]);
}]); }
}
});
onMounted(() => { onMounted(() => {
if (!isDesktop.value) { if (!isDesktop.value) {

View File

@ -19,7 +19,7 @@ const editMode = ref(false);
<script lang="ts" setup> <script lang="ts" setup>
import XWidgets from '@/components/MkWidgets.vue'; import XWidgets from '@/components/MkWidgets.vue';
import { i18n } from '@/i18n.js'; import { i18n } from '@/i18n.js';
import { store } from '@/store.js'; import { prefer } from '@/preferences.js';
const props = withDefaults(defineProps<{ const props = withDefaults(defineProps<{
// null = // null =
@ -31,24 +31,24 @@ const props = withDefaults(defineProps<{
}); });
const widgets = computed(() => { const widgets = computed(() => {
if (props.place === null) return store.reactiveState.widgets.value; if (props.place === null) return prefer.r.widgets.value;
if (props.place === 'left') return store.reactiveState.widgets.value.filter(w => w.place === 'left'); if (props.place === 'left') return prefer.r.widgets.value.filter(w => w.place === 'left');
return store.reactiveState.widgets.value.filter(w => w.place !== 'left'); return prefer.r.widgets.value.filter(w => w.place !== 'left');
}); });
function addWidget(widget) { function addWidget(widget) {
store.set('widgets', [{ prefer.set('widgets', [{
...widget, ...widget,
place: props.place, place: props.place,
}, ...store.state.widgets]); }, ...prefer.s.widgets]);
} }
function removeWidget(widget) { function removeWidget(widget) {
store.set('widgets', store.state.widgets.filter(w => w.id !== widget.id)); prefer.set('widgets', prefer.s.widgets.filter(w => w.id !== widget.id));
} }
function updateWidget({ id, data }) { function updateWidget({ id, data }) {
store.set('widgets', store.state.widgets.map(w => w.id === id ? { prefer.set('widgets', prefer.s.widgets.map(w => w.id === id ? {
...w, ...w,
data, data,
place: props.place, place: props.place,
@ -57,18 +57,18 @@ function updateWidget({ id, data }) {
function updateWidgets(thisWidgets) { function updateWidgets(thisWidgets) {
if (props.place === null) { if (props.place === null) {
store.set('widgets', thisWidgets); prefer.set('widgets', thisWidgets);
return; return;
} }
if (props.place === 'left') { if (props.place === 'left') {
store.set('widgets', [ prefer.set('widgets', [
...thisWidgets.map(w => ({ ...w, place: 'left' })), ...thisWidgets.map(w => ({ ...w, place: 'left' })),
...store.state.widgets.filter(w => w.place !== 'left' && !thisWidgets.some(t => w.id === t.id)), ...prefer.s.widgets.filter(w => w.place !== 'left' && !thisWidgets.some(t => w.id === t.id)),
]); ]);
return; return;
} }
store.set('widgets', [ prefer.set('widgets', [
...store.state.widgets.filter(w => w.place === 'left' && !thisWidgets.some(t => w.id === t.id)), ...prefer.s.widgets.filter(w => w.place === 'left' && !thisWidgets.some(t => w.id === t.id)),
...thisWidgets.map(w => ({ ...w, place: 'right' })), ...thisWidgets.map(w => ({ ...w, place: 'right' })),
]); ]);
} }