Skip to content

feat: useOptimisticMutation#10103

Draft
xiaodemen wants to merge 1 commit into
developfrom
feat/use-store
Draft

feat: useOptimisticMutation#10103
xiaodemen wants to merge 1 commit into
developfrom
feat/use-store

Conversation

@xiaodemen

Copy link
Copy Markdown
Contributor

No description provided.

@github-actions

github-actions Bot commented Jun 17, 2026

Copy link
Copy Markdown

✅ Circular References Report

Generated at: 2026-06-17T08:01:58.544Z
Status: ✅ NO CHANGE

Summary

Metric Base (develop) PR Change
Total Circular References 9 9 0 (0.00%)
Click to view all circular references in PR (9)
insomnia-inso/src/db/models/types.ts -> insomnia-inso/src/db/types.ts
insomnia/src/main/prompt-bridge.ts -> insomnia/src/main/window-utils.ts -> insomnia/src/main/plugin-window.ts
insomnia/src/main/window-utils.ts -> insomnia/src/main/plugin-window.ts
insomnia/src/network/network.ts -> insomnia-scripting-environment/src/objects/index.ts -> insomnia-scripting-environment/src/objects/collection.ts -> insomnia-scripting-environment/src/objects/response.ts
insomnia/src/network/network.ts -> insomnia/src/common/render.ts
insomnia/src/ui/components/settings/import-export.tsx -> insomnia/src/ui/components/modals/export-requests-modal.tsx
insomnia/src/ui/components/tabs/tab-list.tsx -> insomnia/src/ui/components/tabs/tab.tsx
insomnia/src/ui/components/templating/tag-editor-arg-sub-form.tsx -> insomnia/src/ui/components/templating/external-vault/external-vault-form.tsx
insomnia/src/ui/components/viewers/response-viewer.tsx -> insomnia/src/ui/components/viewers/response-multipart-viewer.tsx
Click to view all circular references in base branch (9)
insomnia-inso/src/db/models/types.ts -> insomnia-inso/src/db/types.ts
insomnia/src/main/prompt-bridge.ts -> insomnia/src/main/window-utils.ts -> insomnia/src/main/plugin-window.ts
insomnia/src/main/window-utils.ts -> insomnia/src/main/plugin-window.ts
insomnia/src/network/network.ts -> insomnia-scripting-environment/src/objects/index.ts -> insomnia-scripting-environment/src/objects/collection.ts -> insomnia-scripting-environment/src/objects/response.ts
insomnia/src/network/network.ts -> insomnia/src/common/render.ts
insomnia/src/ui/components/settings/import-export.tsx -> insomnia/src/ui/components/modals/export-requests-modal.tsx
insomnia/src/ui/components/tabs/tab-list.tsx -> insomnia/src/ui/components/tabs/tab.tsx
insomnia/src/ui/components/templating/tag-editor-arg-sub-form.tsx -> insomnia/src/ui/components/templating/external-vault/external-vault-form.tsx
insomnia/src/ui/components/viewers/response-viewer.tsx -> insomnia/src/ui/components/viewers/response-multipart-viewer.tsx

Analysis

No Change: This PR does not introduce or remove any circular references.


This report was generated automatically by comparing against the develop branch.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR introduces a small React Query-based “store” layer for app settings, including a reusable useOptimisticMutation hook to support optimistic cache updates and rollback.

Changes:

  • Added useOptimisticMutation helper to perform optimistic setQueryData updates and invalidate/refetch after mutation settles.
  • Added useSettingsStore hook backed by React Query, with DB change listening + semantic settings mutation helpers (hotkeys, plugin toggles, etc.).

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 6 comments.

File Description
packages/insomnia/src/ui/stores/use-optimistic-mutation.ts New optimistic-mutation helper built on React Query.
packages/insomnia/src/ui/stores/settings-store.ts New settings “store” hook using React Query + optimistic updates and DB-change invalidation.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +6 to +9
export function useOptimisticMutation(
options: Parameters<typeof useMutation>[0] & { invalidateKey: any[]; patch: boolean },
) {
const { invalidateKey, mutationFn, onMutate, onSettled, patch, ...rest } = options;
Comment on lines +12 to +18
mutationFn: (...args: any) => {
const [variables, { client }] = args;
const previousSettings = client.getQueryData(invalidateKey);
client.setQueryData(invalidateKey, patch ? { ...previousSettings, ...variables } : variables);

return mutationFn?.(...args);
},
Comment on lines +20 to +25
onMutate: (...args: any) => {
const [_, { client }] = args;
const previous = client.getQueryData(invalidateKey);
const result = onMutate?.(...args) || {};
return { _previous: previous, ...result };
},
Comment on lines +26 to +35
onSettled: (...args: any) => {
const [data, error, variables, { _previous }, { client }] = args;
if (error && _previous) {
// rollback first
client.setQueryData(invalidateKey, _previous);
}
onSettled?.(...args);
// Always refetch after error or success:
client.invalidateQueries({ queryKey: invalidateKey });
},
Comment on lines +42 to +56
export function useSettingsStore(selector?: (settings: Settings) => any) {
const { data: settings, ...rest } = useQuery({
queryKey: SETTINGS_STORE_KEY,
queryFn: async () => {
const settings = await services.settings.get();
return settings;
},
selector,
});

// computed
const httpProxyHasCredentials = settings?.httpProxy?.includes('@');
const isProxyConfigured = Boolean(settings?.proxyEnabled && (settings.httpProxy || settings.httpsProxy));
const hasCustomPluginPath = Boolean(settings?.pluginPath);
const hasDataFolderRestrictions = Boolean(settings?.dataFolders && settings.dataFolders.length > 0);
Comment on lines +58 to +68
const { mutateResult, ...mutation } = useOptimisticMutation({
mutationFn: async (patch: Partial<Settings>, { client }) => {
const updatedSettings = await services.settings.patch(patch);
client.setQueryData(SETTINGS_STORE_KEY, updatedSettings);
if ('enableAnalytics' in patch && !patch.enableAnalytics) {
window.main.trackAnalyticsEvent({ event: AnalyticsEvent.analyticsDisabled });
}
return updatedSettings;
},
invalidateKey: SETTINGS_STORE_KEY,
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants