mirror of
https://github.com/misskey-dev/misskey.git
synced 2026-05-14 12:15:44 +02:00
* wip * fix * ref -> reactive * tweak throttle threshold * tweak throttle threshold * rss設定にはmanualSaveを使用するように * Update MkWidgetSettingsDialog.vue --------- Co-authored-by: syuilo <4439005+syuilo@users.noreply.github.com>
This commit is contained in:
@@ -28,7 +28,6 @@ import { useWidgetPropsManager } from './widget.js';
|
||||
import type { WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget.js';
|
||||
import type { FormWithDefault, GetFormResultType } from '@/utility/form.js';
|
||||
import MkContainer from '@/components/MkContainer.vue';
|
||||
import { i18n } from '@/i18n.js';
|
||||
|
||||
const name = 'rss';
|
||||
|
||||
@@ -36,6 +35,7 @@ const widgetPropsDef = {
|
||||
url: {
|
||||
type: 'string',
|
||||
default: 'http://feeds.afpbb.com/rss/afpbb/afpbbnews',
|
||||
manualSave: true,
|
||||
},
|
||||
refreshIntervalSec: {
|
||||
type: 'number',
|
||||
@@ -68,7 +68,7 @@ const fetching = ref(true);
|
||||
const fetchEndpoint = computed(() => {
|
||||
const url = new URL('/api/fetch-rss', base);
|
||||
url.searchParams.set('url', widgetProps.url);
|
||||
return url;
|
||||
return url.toString();
|
||||
});
|
||||
const intervalClear = ref<(() => void) | undefined>();
|
||||
|
||||
@@ -83,7 +83,7 @@ const tick = () => {
|
||||
});
|
||||
};
|
||||
|
||||
watch(() => fetchEndpoint, tick);
|
||||
watch(fetchEndpoint, tick);
|
||||
watch(() => widgetProps.refreshIntervalSec, () => {
|
||||
if (intervalClear.value) {
|
||||
intervalClear.value();
|
||||
|
||||
@@ -44,6 +44,7 @@ const widgetPropsDef = {
|
||||
url: {
|
||||
type: 'string',
|
||||
default: 'http://feeds.afpbb.com/rss/afpbb/afpbbnews',
|
||||
manualSave: true,
|
||||
},
|
||||
shuffle: {
|
||||
type: 'boolean',
|
||||
@@ -119,7 +120,7 @@ const tick = () => {
|
||||
});
|
||||
};
|
||||
|
||||
watch(() => fetchEndpoint, tick);
|
||||
watch(fetchEndpoint, tick);
|
||||
watch(() => widgetProps.refreshIntervalSec, () => {
|
||||
if (intervalClear.value) {
|
||||
intervalClear.value();
|
||||
|
||||
@@ -4,8 +4,9 @@
|
||||
*/
|
||||
|
||||
import { defineAsyncComponent, reactive, watch } from 'vue';
|
||||
import type { Reactive } from 'vue';
|
||||
import { throttle } from 'throttle-debounce';
|
||||
import { getDefaultFormValues } from '@/utility/form.js';
|
||||
import type { Reactive } from 'vue';
|
||||
import type { FormWithDefault, GetFormResultType } from '@/utility/form.js';
|
||||
import * as os from '@/os.js';
|
||||
import { deepClone } from '@/utility/clone.js';
|
||||
@@ -39,19 +40,23 @@ export const useWidgetPropsManager = <F extends FormWithDefault>(
|
||||
save: () => void;
|
||||
configure: () => void;
|
||||
} => {
|
||||
const widgetProps = reactive<GetFormResultType<F>>((props.widget ? deepClone(props.widget.data) : {}) as GetFormResultType<F>);
|
||||
|
||||
const mergeProps = () => {
|
||||
for (const prop of Object.keys(propsDef)) {
|
||||
if (typeof widgetProps[prop] === 'undefined') {
|
||||
widgetProps[prop] = propsDef[prop].default;
|
||||
const widgetProps = reactive((() => {
|
||||
const np = getDefaultFormValues(propsDef);
|
||||
if (props.widget?.data != null) {
|
||||
for (const key of Object.keys(props.widget.data) as (keyof F)[]) {
|
||||
np[key] = props.widget.data[key] as GetFormResultType<F>[typeof key];
|
||||
}
|
||||
}
|
||||
};
|
||||
return np;
|
||||
})());
|
||||
|
||||
watch(widgetProps, () => {
|
||||
mergeProps();
|
||||
}, { deep: true, immediate: true });
|
||||
watch(() => props.widget?.data, (to) => {
|
||||
if (to != null) {
|
||||
for (const key of Object.keys(propsDef)) {
|
||||
widgetProps[key] = to[key];
|
||||
}
|
||||
}
|
||||
}, { deep: true });
|
||||
|
||||
const save = throttle(3000, () => {
|
||||
emit('updateProps', widgetProps as GetFormResultType<F>);
|
||||
|
||||
Reference in New Issue
Block a user