Skip to content

Commit a792908

Browse files
authored
Merge pull request #9 from ut-code/checksystem
Checksystem
2 parents 0b569bf + b68cd78 commit a792908

File tree

2 files changed

+44
-20
lines changed

2 files changed

+44
-20
lines changed

src/content.ts

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,16 @@
11
export {}
22

3-
type CheckResult = { ok: boolean; details: string }
4-
// 判定する関数
5-
function checkAnswer(): CheckResult {
3+
4+
// -> 要素の「現在の値」を取得するだけの関数に変更
5+
function getActualValue(): string {
66
const el = document.querySelector<HTMLElement>('[data-check]')
7-
if (!el) return { ok: false, details: 'data-check 要素が見つかりません' }
8-
const expected = el.getAttribute('data-check') ?? ''
9-
const actual = (el.textContent ?? '').trim()
10-
return actual === expected
11-
? { ok: true, details: `一致: "${actual}"` }
12-
: { ok: false, details: `不一致: expected="${expected}", actual="${actual}"` }
7+
if (!el) return '' // 見つからなければ空文字を返す
8+
return (el.textContent ?? '').trim()
139
}
1410

1511
// デバウンス
1612
const debounce = <T extends (...a: any[]) => void>(fn: T, delay: number) => {
17-
let t: number | undefined // タイマーの識別子
13+
let t: number | undefined
1814
return (...args: Parameters<T>) => {
1915
if (t) clearTimeout(t)
2016
// @ts-ignore
@@ -24,19 +20,25 @@ const debounce = <T extends (...a: any[]) => void>(fn: T, delay: number) => {
2420

2521
const ports = new Set<chrome.runtime.Port>()
2622

27-
// サイドパネルからの Port 接続のみ対応
2823
chrome.runtime.onConnect.addListener((port) => {
2924
if (port.name !== 'sidepanel') return
3025
ports.add(port)
31-
// 接続直後に最新判定を送る
32-
port.postMessage({ type: 'UPDATE', result: checkAnswer() })
26+
27+
// 接続直後に「現在の値」を送る (判定結果ではない)
28+
port.postMessage({ type: 'DOM_VALUE_UPDATE', actual: getActualValue() })
29+
3330
port.onDisconnect.addListener(() => ports.delete(port))
3431
})
35-
// DevTools等でのDOM変更を監視し、判定結果をサイドパネルへ通知
32+
33+
// DevTools等でのDOM変更を監視し、「現在の値」をサイドパネルへ通知
3634
const notify = debounce(() => {
37-
const result = checkAnswer()
35+
// 判定(checkAnswer)はしない
36+
const actual = getActualValue()
3837
for (const p of ports) {
39-
try { p.postMessage({ type: 'UPDATE', result }) } catch {}
38+
try {
39+
// 判定結果ではなく、「現在の値」をそのまま送る
40+
p.postMessage({ type: 'DOM_VALUE_UPDATE', actual })
41+
} catch {}
4042
}
4143
}, 200) // 200ms ディレイ
4244

src/sidepanel/App.tsx

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,19 @@ import './App.css'
33

44
type CheckResult = { ok: boolean; details: string }
55

6+
const CORRECT_ANSWER = "解答記入"
7+
8+
9+
// 判定ロジックをサイドパネル側に持ってくる
10+
function checkAnswer(actual: string): CheckResult {
11+
if (actual === CORRECT_ANSWER) {
12+
return { ok: true, details: `一致: "${actual}"` }
13+
} else {
14+
// ユーザーにヒントを出す(正解の文字列は見せない)
15+
return { ok: false, details: `不一致: あなたの入力="${actual}"` }
16+
}
17+
}
18+
619
function App() {
720
const [result, setResult] = useState<CheckResult | null>(null)
821
const [error, setError] = useState<string | null>(null)
@@ -14,10 +27,18 @@ function App() {
1427
const [tab] = await chrome.tabs.query({ active: true, currentWindow: true })
1528
if (!tab?.id) return
1629
const port = chrome.tabs.connect(tab.id, { name: 'sidepanel' })
30+
1731
port.onMessage.addListener((msg) => {
1832
if (disconnected) return
19-
if (msg?.type === 'UPDATE' && msg.result) setResult(msg.result as CheckResult)
33+
34+
// 'UPDATE' ではなく 'DOM_VALUE_UPDATE' を受信する
35+
if (msg?.type === 'DOM_VALUE_UPDATE') {
36+
// 送られてきた 'actual' の値を使って、こちら側で判定する
37+
const checkResult = checkAnswer(msg.actual as string)
38+
setResult(checkResult)
39+
}
2040
})
41+
2142
return () => {
2243
disconnected = true
2344
try { port.disconnect() } catch {}
@@ -26,17 +47,18 @@ function App() {
2647
setError(e?.message ?? String(e))
2748
}
2849
})()
29-
}, [])
50+
}, []) // CORRECT_ANSWER は定数なので依存配列に追加不要
3051

3152
return (
3253
<div className="container">
3354
{error && <p style={{ color: 'red' }}>Error: {error}</p>}
3455
{result
3556
? (<><div>判定: {result.ok ? '正解' : '不正解'}</div><div>詳細: {result.details}</div></>)
36-
: (<div>判定の更新を待機中…</div>)
57+
// 初期状態を「判定中」や「入力待ち」などに変更
58+
: (<div>[data-check]要素の入力を待機中…</div>)
3759
}
3860
</div>
3961
)
4062
}
4163

42-
export default App
64+
export default App

0 commit comments

Comments
 (0)