Skip to content

Commit 7872e27

Browse files
committed
OpenAPI: fix effect cleanup
1 parent 3e8efb0 commit 7872e27

File tree

4 files changed

+19
-11
lines changed

4 files changed

+19
-11
lines changed

.changeset/fast-suits-post.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
'fumadocs-openapi': patch
3+
'@fumari/stf': patch
4+
---
5+
6+
fix change detector

packages/openapi/src/playground/client.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -229,9 +229,10 @@ export default function PlaygroundClient({
229229
});
230230

231231
useEffect(() => {
232-
return () => {
233-
stf.dataEngine.reset(defaultValues);
234-
};
232+
// same object reference = unchanged
233+
if (stf.dataEngine.getData() === defaultValues) return;
234+
235+
stf.dataEngine.reset(defaultValues);
235236
// eslint-disable-next-line react-hooks/exhaustive-deps -- ignore other parts
236237
}, [defaultValues]);
237238

packages/openapi/src/ui/operation/usage-tabs/client.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ export function UsageTabsProvider({
4747
() => ({
4848
example,
4949
route,
50-
setExample: (newKey: string) => {
50+
setExample(newKey: string) {
5151
const example = examples.find((example) => example.id === newKey);
5252
if (!example) return;
5353

packages/stf/src/lib/data-engine.ts

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,12 @@ interface OnUpdateContext {
3636
}
3737

3838
class ListenerManager {
39-
private readonly listeners = new Set<DataEngineListener>();
39+
private readonly unindexed = new Set<DataEngineListener>();
4040
private readonly indexed = new Map<string, Set<DataEngineListener>>();
4141

4242
add(listener: DataEngineListener) {
4343
if (!listener.field) {
44-
this.listeners.add(listener);
44+
this.unindexed.add(listener);
4545
return;
4646
}
4747
const key = stringifyFieldKey(listener.field);
@@ -52,35 +52,36 @@ class ListenerManager {
5252

5353
remove(listener: DataEngineListener) {
5454
if (!listener.field) {
55-
this.listeners.delete(listener);
55+
this.unindexed.delete(listener);
5656
} else {
5757
this.indexed.get(stringifyFieldKey(listener.field))?.delete(listener);
5858
}
5959
}
6060

6161
onUpdate(field: FieldKey, ctx: OnUpdateContext) {
62-
for (const v of this.listeners) v.onUpdate?.(field, ctx);
62+
for (const v of this.unindexed) v.onUpdate?.(field, ctx);
6363
const updatedKey = stringifyFieldKey(field);
6464

6565
if (ctx.swallow) {
6666
const set = this.indexed.get(updatedKey);
6767
if (set) for (const v of set) v.onUpdate?.(field, ctx);
6868
} else {
6969
for (const [k, listeners] of this.indexed.entries()) {
70-
if (k !== updatedKey && !k.startsWith(updatedKey + '.')) continue;
70+
if (updatedKey.length !== 0 && k !== updatedKey && !k.startsWith(updatedKey + '.'))
71+
continue;
7172
for (const v of listeners) v.onUpdate?.(field, ctx);
7273
}
7374
}
7475
}
7576

7677
onInit(field: FieldKey) {
77-
for (const v of this.listeners) v.onInit?.(field);
78+
for (const v of this.unindexed) v.onInit?.(field);
7879
const set = this.indexed.get(stringifyFieldKey(field));
7980
if (set) for (const v of set) v.onInit?.(field);
8081
}
8182

8283
onDelete(field: FieldKey) {
83-
for (const v of this.listeners) v.onDelete?.(field);
84+
for (const v of this.unindexed) v.onDelete?.(field);
8485
const set = this.indexed.get(stringifyFieldKey(field));
8586
if (set) for (const v of set) v.onDelete?.(field);
8687
}

0 commit comments

Comments
 (0)