dsh-rss 0.6.3 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -0
- package/lib/client.js +72 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
package/lib/client.js
CHANGED
|
@@ -1,6 +1,77 @@
|
|
|
1
1
|
// This is the browser source. tsc does not rebuild it; check with node --check.
|
|
2
2
|
window.__ModuleLoader__.load({ id: 'dsh-rss', factory: require => {
|
|
3
3
|
const React = require('react');
|
|
4
|
+
var __FR_KEY = "dsh-first-run:dsh-rss:v1";
|
|
5
|
+
var __FR_TITLE = "RSS 订阅 · 首次使用(3 步)";
|
|
6
|
+
var __FR_STEPS = [{"title":"先加一个源","body":"粘贴 RSS/Atom 地址,插件会先抓一次验证可用,再存进列表。"},{"title":"增量比全量好用","body":"抓取时选「增量」,只返回上次之后的新条目,适合定时巡检。"},{"title":"跨源搜索","body":"在对话里直接问关键词最近有没有更新,比逐个源翻快得多。","tryIt":"搜一下最近一周提到 DeepSeek 的订阅条目"}];
|
|
7
|
+
|
|
8
|
+
// ---- first-run guide (shared snippet; keep in sync across plugins) ----
|
|
9
|
+
var __FR_STYLE_ID = 'dsh-first-run-css';
|
|
10
|
+
var __FR_CSS = [
|
|
11
|
+
'.fr-card{border:1px solid var(--dsw-border,rgba(0,0,0,.10));border-radius:12px;padding:14px 16px;margin:0 0 14px;background:linear-gradient(180deg,rgba(59,130,246,.06),rgba(59,130,246,.02))}',
|
|
12
|
+
'.fr-head{display:flex;align-items:center;gap:8px;margin-bottom:6px}',
|
|
13
|
+
'.fr-dot{width:6px;height:6px;border-radius:50%;background:var(--dsw-accent,#3b82f6)}',
|
|
14
|
+
'.fr-title{font-weight:650;font-size:13.5px}',
|
|
15
|
+
'.fr-count{margin-left:auto;font-size:11px;color:var(--dsw-text-weak,#6b7280);font-variant-numeric:tabular-nums}',
|
|
16
|
+
'.fr-step{font-weight:600;font-size:13px;margin:2px 0 4px}',
|
|
17
|
+
'.fr-body{color:var(--dsw-text-weak,#4b5563);font-size:12.5px;line-height:1.65}',
|
|
18
|
+
'.fr-try{margin-top:8px;padding:7px 9px;border-radius:8px;background:rgba(59,130,246,.09);font-size:12px;display:flex;gap:8px}',
|
|
19
|
+
'.fr-try code{font-family:ui-monospace,monospace;white-space:pre-wrap;word-break:break-word}',
|
|
20
|
+
'.fr-bar{display:flex;gap:8px;align-items:center;margin-top:12px}',
|
|
21
|
+
'.fr-progress{display:flex;gap:4px;margin-right:auto}',
|
|
22
|
+
'.fr-seg{width:16px;height:3px;border-radius:2px;background:var(--dsw-border,rgba(0,0,0,.12))}',
|
|
23
|
+
'.fr-seg.on{background:var(--dsw-accent,#3b82f6)}',
|
|
24
|
+
'.fr-btn{border:1px solid var(--dsw-border,rgba(0,0,0,.14));background:transparent;color:inherit;border-radius:8px;padding:4px 10px;font-size:12px;cursor:pointer}',
|
|
25
|
+
'.fr-btn:hover{background:rgba(0,0,0,.04)}',
|
|
26
|
+
'.fr-btn.primary{background:var(--dsw-accent,#3b82f6);border-color:transparent;color:#fff}',
|
|
27
|
+
'.fr-btn.ghost{border-color:transparent;color:var(--dsw-text-weak,#6b7280)}',
|
|
28
|
+
].join('\n');
|
|
29
|
+
function __frEnsureCss() {
|
|
30
|
+
if (typeof document === 'undefined' || document.getElementById(__FR_STYLE_ID)) return;
|
|
31
|
+
var el = document.createElement('style');
|
|
32
|
+
el.id = __FR_STYLE_ID;
|
|
33
|
+
el.textContent = __FR_CSS;
|
|
34
|
+
document.head.appendChild(el);
|
|
35
|
+
}
|
|
36
|
+
function __frRead() { try { return localStorage.getItem(__FR_KEY) === 'done'; } catch (e) { return false; } }
|
|
37
|
+
function __frWrite() { try { localStorage.setItem(__FR_KEY, 'done'); } catch (e) {} }
|
|
38
|
+
function __FirstRunCard() {
|
|
39
|
+
var doneState = React.useState(__frRead);
|
|
40
|
+
var done = doneState[0], setDone = doneState[1];
|
|
41
|
+
var idxState = React.useState(0);
|
|
42
|
+
var index = idxState[0], setIndex = idxState[1];
|
|
43
|
+
React.useEffect(function () { __frEnsureCss(); }, []);
|
|
44
|
+
if (done) return null;
|
|
45
|
+
var step = __FR_STEPS[index];
|
|
46
|
+
var last = index >= __FR_STEPS.length - 1;
|
|
47
|
+
var close = function () { __frWrite(); setDone(true); };
|
|
48
|
+
var kids = [
|
|
49
|
+
React.createElement('div', { className: 'fr-head', key: 'h' },
|
|
50
|
+
React.createElement('span', { className: 'fr-dot' }),
|
|
51
|
+
React.createElement('span', { className: 'fr-title' }, __FR_TITLE),
|
|
52
|
+
React.createElement('span', { className: 'fr-count' }, (index + 1) + ' / ' + __FR_STEPS.length)),
|
|
53
|
+
React.createElement('div', { className: 'fr-step', key: 't' }, step.title),
|
|
54
|
+
React.createElement('div', { className: 'fr-body', key: 'b' }, step.body),
|
|
55
|
+
];
|
|
56
|
+
if (step.tryIt) kids.push(React.createElement('div', { className: 'fr-try', key: 'y' },
|
|
57
|
+
React.createElement('span', null, '可以直接说'),
|
|
58
|
+
React.createElement('code', null, '「' + step.tryIt + '」')));
|
|
59
|
+
var buttons = [React.createElement('div', { className: 'fr-progress', key: 'p' }, __FR_STEPS.map(function (_, i) {
|
|
60
|
+
return React.createElement('span', { key: i, className: 'fr-seg' + (i <= index ? ' on' : '') });
|
|
61
|
+
}))];
|
|
62
|
+
buttons.push(React.createElement('button', { className: 'fr-btn ghost', type: 'button', onClick: close, key: 's' }, '跳过'));
|
|
63
|
+
if (index > 0) buttons.push(React.createElement('button', { className: 'fr-btn', type: 'button', key: 'prev', onClick: function () { setIndex(index - 1); } }, '上一步'));
|
|
64
|
+
buttons.push(React.createElement('button', { className: 'fr-btn primary', type: 'button', key: 'next', onClick: function () { if (last) close(); else setIndex(index + 1); } }, last ? '开始使用' : '下一步'));
|
|
65
|
+
kids.push(React.createElement('div', { className: 'fr-bar', key: 'bar' }, buttons));
|
|
66
|
+
return React.createElement('div', { className: 'fr-card' }, kids);
|
|
67
|
+
}
|
|
68
|
+
function __withFirstRun(Component) {
|
|
69
|
+
return function FirstRunWrapped(props) {
|
|
70
|
+
return React.createElement(React.Fragment, null, React.createElement(__FirstRunCard, null), React.createElement(Component, props));
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
// ---- end first-run guide ----
|
|
74
|
+
|
|
4
75
|
const { useState, useEffect, useRef, useId } = React;
|
|
5
76
|
const h = React.createElement;
|
|
6
77
|
const ROUTE = '_dsh/dsh-rss/subscriptions';
|
|
@@ -271,7 +342,7 @@ window.__ModuleLoader__.load({ id: 'dsh-rss', factory: require => {
|
|
|
271
342
|
let lang = language;
|
|
272
343
|
try { const service = ctx.get ? ctx.get('locale') : ctx.locale; if (service?.getSnapshot) lang = String(service.getSnapshot().active || '').startsWith('en') ? 'en' : 'zh'; } catch {}
|
|
273
344
|
return words.title[lang === 'en' ? 1 : 0];
|
|
274
|
-
}, inject: () => ({}) }, Panel));
|
|
345
|
+
}, inject: () => ({}) }, __withFirstRun(Panel)));
|
|
275
346
|
}
|
|
276
347
|
return { apply, inject: ['slots', 'locale'] };
|
|
277
348
|
} });
|