@ynput/ayon-frontend-shared 0.4.2 → 0.4.3
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/dist/ProjectTreeTable.cjs.js +1 -1
- package/dist/ProjectTreeTable.es.js +247 -243
- package/dist/_virtual/index.cjs22.js +1 -1
- package/dist/_virtual/index.cjs23.js +1 -1
- package/dist/_virtual/index.cjs24.js +1 -1
- package/dist/_virtual/index.cjs4.js +1 -1
- package/dist/_virtual/index.cjs5.js +1 -1
- package/dist/_virtual/index.cjs6.js +1 -1
- package/dist/_virtual/index.cjs8.js +1 -1
- package/dist/_virtual/index.es22.js +3 -3
- package/dist/_virtual/index.es23.js +5 -5
- package/dist/_virtual/index.es24.js +5 -5
- package/dist/_virtual/index.es4.js +2 -5
- package/dist/_virtual/index.es4.js.map +1 -1
- package/dist/_virtual/index.es5.js +5 -2
- package/dist/_virtual/index.es5.js.map +1 -1
- package/dist/_virtual/index.es6.js +2 -2
- package/dist/_virtual/index.es8.js +2 -2
- package/dist/api.cjs.js +1 -1
- package/dist/api.es.js +446 -445
- package/dist/index.cjs.js +1 -1
- package/dist/index.es.js +20 -9
- package/dist/index.es.js.map +1 -1
- package/dist/node_modules/match-sorter/dist/match-sorter.esm.cjs.js +1 -1
- package/dist/node_modules/match-sorter/dist/match-sorter.esm.es.js +1 -1
- package/dist/node_modules/parse-numeric-range/index.cjs.js +1 -1
- package/dist/node_modules/parse-numeric-range/index.es.js +1 -1
- package/dist/node_modules/rehype/node_modules/unified/lib/index.cjs.js +1 -1
- package/dist/node_modules/rehype/node_modules/unified/lib/index.es.js +2 -2
- package/dist/node_modules/rehype/node_modules/vfile/lib/index.cjs.js +1 -1
- package/dist/node_modules/rehype/node_modules/vfile/lib/index.es.js +1 -1
- package/dist/node_modules/rehype-parse/lib/index.cjs.js +1 -1
- package/dist/node_modules/rehype-parse/lib/index.es.js +1 -1
- package/dist/node_modules/remove-accents/index.cjs.js +1 -1
- package/dist/node_modules/remove-accents/index.es.js +1 -1
- package/dist/shared/node_modules/@module-federation/error-codes/dist/index.cjs.js +1 -1
- package/dist/shared/node_modules/@module-federation/error-codes/dist/index.es.js +1 -1
- package/dist/shared/node_modules/@module-federation/runtime/dist/index.cjs.js +1 -1
- package/dist/shared/node_modules/@module-federation/runtime/dist/index.es.js +1 -1
- package/dist/shared/node_modules/@module-federation/runtime-core/dist/index.cjs.js +1 -1
- package/dist/shared/node_modules/@module-federation/runtime-core/dist/index.es.js +1 -1
- package/dist/shared/node_modules/react-is/index.cjs.js +1 -1
- package/dist/shared/node_modules/react-is/index.es.js +1 -1
- package/dist/shared/src/api/generated/graphql.cjs.js +85 -28
- package/dist/shared/src/api/generated/graphql.cjs.js.map +1 -1
- package/dist/shared/src/api/generated/graphql.es.js +129 -68
- package/dist/shared/src/api/generated/graphql.es.js.map +1 -1
- package/dist/shared/src/api/queries/columnStats/metricTargets.cjs.js +1 -1
- package/dist/shared/src/api/queries/columnStats/metricTargets.cjs.js.map +1 -1
- package/dist/shared/src/api/queries/columnStats/metricTargets.es.js +36 -36
- package/dist/shared/src/api/queries/columnStats/metricTargets.es.js.map +1 -1
- package/dist/shared/src/components/Chips/Chips.cjs.js +12 -6
- package/dist/shared/src/components/Chips/Chips.cjs.js.map +1 -1
- package/dist/shared/src/components/Chips/Chips.es.js +69 -62
- package/dist/shared/src/components/Chips/Chips.es.js.map +1 -1
- package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.cjs.js +1 -1
- package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.cjs.js.map +1 -1
- package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.es.js +32 -12
- package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.es.js.map +1 -1
- package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.cjs.js +2 -2
- package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.cjs.js.map +1 -1
- package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.es.js +33 -33
- package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.es.js.map +1 -1
- package/dist/shared/src/components/RemotePage/RemotePageWrapper.cjs.js.map +1 -1
- package/dist/shared/src/components/RemotePage/RemotePageWrapper.es.js.map +1 -1
- package/dist/shared/src/components/SubtasksManager/SubtasksManagerWrapper.cjs.js +1 -1
- package/dist/shared/src/components/SubtasksManager/SubtasksManagerWrapper.cjs.js.map +1 -1
- package/dist/shared/src/components/SubtasksManager/SubtasksManagerWrapper.es.js +39 -8
- package/dist/shared/src/components/SubtasksManager/SubtasksManagerWrapper.es.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/DetailsPanel.cjs.js +1 -1
- package/dist/shared/src/containers/DetailsPanel/DetailsPanel.cjs.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/DetailsPanel.es.js +32 -31
- package/dist/shared/src/containers/DetailsPanel/DetailsPanel.es.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/containers/FeedWrapper.cjs.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/containers/FeedWrapper.es.js.map +1 -1
- package/dist/shared/src/containers/Feed/helpers/buildBackendFilter.cjs.js +1 -1
- package/dist/shared/src/containers/Feed/helpers/buildBackendFilter.cjs.js.map +1 -1
- package/dist/shared/src/containers/Feed/helpers/buildBackendFilter.es.js +24 -18
- package/dist/shared/src/containers/Feed/helpers/buildBackendFilter.es.js.map +1 -1
- package/dist/shared/src/containers/Feed/helpers/feedFilterAdapter.cjs.js +1 -1
- package/dist/shared/src/containers/Feed/helpers/feedFilterAdapter.cjs.js.map +1 -1
- package/dist/shared/src/containers/Feed/helpers/feedFilterAdapter.es.js +26 -25
- package/dist/shared/src/containers/Feed/helpers/feedFilterAdapter.es.js.map +1 -1
- package/dist/shared/src/containers/ListTable/ListTableCell.cjs.js +1 -1
- package/dist/shared/src/containers/ListTable/ListTableCell.cjs.js.map +1 -1
- package/dist/shared/src/containers/ListTable/ListTableCell.es.js +14 -2
- package/dist/shared/src/containers/ListTable/ListTableCell.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.es.js +125 -126
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.styled.cjs.js +6 -0
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.styled.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.styled.es.js +14 -8
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.styled.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.es.js +200 -178
- package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.es.js +14 -3
- package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/constants.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/constants.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/constants.es.js +6 -3
- package/dist/shared/src/containers/ProjectTreeTable/constants.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useSortBySettings.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useSortBySettings.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useSortBySettings.es.js +19 -19
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useSortBySettings.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.cjs.js +5 -3
- package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.es.js +100 -97
- package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/DateWidget.cjs.js +9 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/DateWidget.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/DateWidget.es.js +47 -31
- package/dist/shared/src/containers/ProjectTreeTable/widgets/DateWidget.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EntityNameWidget.cjs.js +28 -9
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EntityNameWidget.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EntityNameWidget.es.js +58 -39
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EntityNameWidget.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumCellValue.cjs.js +53 -25
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumCellValue.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumCellValue.es.js +150 -103
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumCellValue.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumWidget.cjs.js +9 -2
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumWidget.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumWidget.es.js +66 -57
- package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumWidget.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/SubtasksWidget.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/SubtasksWidget.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/SubtasksWidget.es.js +9 -8
- package/dist/shared/src/containers/ProjectTreeTable/widgets/SubtasksWidget.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/TextWidget.cjs.js +20 -4
- package/dist/shared/src/containers/ProjectTreeTable/widgets/TextWidget.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/TextWidget.es.js +86 -67
- package/dist/shared/src/containers/ProjectTreeTable/widgets/TextWidget.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/widgets/wrapMode.cjs.js +6 -0
- package/dist/shared/src/containers/ProjectTreeTable/widgets/wrapMode.cjs.js.map +1 -0
- package/dist/shared/src/containers/ProjectTreeTable/widgets/wrapMode.es.js +11 -0
- package/dist/shared/src/containers/ProjectTreeTable/widgets/wrapMode.es.js.map +1 -0
- package/dist/shared/src/containers/Views/context/ViewsContext.cjs.js +1 -1
- package/dist/shared/src/containers/Views/context/ViewsContext.cjs.js.map +1 -1
- package/dist/shared/src/containers/Views/context/ViewsContext.es.js +67 -62
- package/dist/shared/src/containers/Views/context/ViewsContext.es.js.map +1 -1
- package/dist/shared/src/containers/Views/utils/viewUpdateHelper.cjs.js +1 -1
- package/dist/shared/src/containers/Views/utils/viewUpdateHelper.cjs.js.map +1 -1
- package/dist/shared/src/containers/Views/utils/viewUpdateHelper.es.js +47 -46
- package/dist/shared/src/containers/Views/utils/viewUpdateHelper.es.js.map +1 -1
- package/dist/shared/src/context/ProjectContext.cjs.js +1 -1
- package/dist/shared/src/context/ProjectContext.cjs.js.map +1 -1
- package/dist/shared/src/context/ProjectContext.es.js +1 -1
- package/dist/shared/src/context/ProjectContext.es.js.map +1 -1
- package/dist/shared/src/util/buildHierarchicalTableRows.cjs.js +1 -1
- package/dist/shared/src/util/buildHierarchicalTableRows.cjs.js.map +1 -1
- package/dist/shared/src/util/buildHierarchicalTableRows.es.js +36 -33
- package/dist/shared/src/util/buildHierarchicalTableRows.es.js.map +1 -1
- package/dist/types/api/generated/graphql.d.ts +71 -0
- package/dist/types/api/queries/activities/getActivities.d.ts +28 -0
- package/dist/types/api/queries/entities/getEntity.d.ts +14 -0
- package/dist/types/api/queries/entities/getEntityPanel.d.ts +14 -0
- package/dist/types/api/queries/entities/updateEntity.d.ts +14 -0
- package/dist/types/api/queries/entityLists/getLists.d.ts +14 -0
- package/dist/types/api/queries/overview/getOverview.d.ts +14 -0
- package/dist/types/api/queries/project/getProject.d.ts +14 -0
- package/dist/types/api/queries/userDashboard/getUserDashboard.d.ts +14 -0
- package/dist/types/api/queries/users/getUsers.d.ts +14 -0
- package/dist/types/api/queries/versions/getVersionsProducts.d.ts +28 -0
- package/dist/types/components/SubtasksManager/SubtasksManagerWrapper.d.ts +4 -1
- package/dist/types/containers/Feed/helpers/buildBackendFilter.d.ts +1 -0
- package/dist/types/containers/ProjectTreeTable/buildTreeTableColumns.d.ts +1 -0
- package/dist/types/containers/ProjectTreeTable/constants.d.ts +3 -0
- package/dist/types/containers/ProjectTreeTable/widgets/SubtasksWidget.d.ts +1 -0
- package/dist/types/containers/ProjectTreeTable/widgets/wrapMode.d.ts +2 -0
- package/dist/types/containers/Views/context/ViewsContext.d.ts +1 -0
- package/dist/types/util/buildHierarchicalTableRows.d.ts +2 -0
- package/package.json +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { j as
|
|
2
|
-
import { useContext as
|
|
3
|
-
import { BASE_VIEW_ID as
|
|
1
|
+
import { j as pi } from "../../../../../_virtual/jsx-runtime.es.js";
|
|
2
|
+
import { useContext as ai, useState as G, useMemo as O, useCallback as Q } from "react";
|
|
3
|
+
import { BASE_VIEW_ID as di, WORKING_VIEW_ID as wi } from "../types.es.js";
|
|
4
4
|
import "../../../api/base/client.es.js";
|
|
5
5
|
import "../../../api/generated/graphql.es.js";
|
|
6
6
|
import "../../../api/generated/graphqlLinks.es.js";
|
|
@@ -84,7 +84,7 @@ import "../../../api/queries/project/updateProject.es.js";
|
|
|
84
84
|
import "../../../api/queries/projectFolders/projectFolders.es.js";
|
|
85
85
|
import "../../../api/queries/review/getReview.es.js";
|
|
86
86
|
import "../../../api/queries/review/updateReview.es.js";
|
|
87
|
-
import { useGetShareOptionsQuery as
|
|
87
|
+
import { useGetShareOptionsQuery as ci } from "../../../api/queries/share/share.es.js";
|
|
88
88
|
import "../../../api/queries/system/getSystem.es.js";
|
|
89
89
|
import "../../../api/queries/tasks/getTasks.es.js";
|
|
90
90
|
import "../../../api/queries/tasks/updateTasks.es.js";
|
|
@@ -94,32 +94,32 @@ import "../../../api/queries/users/getUsers.es.js";
|
|
|
94
94
|
import "../../../api/queries/users/updateUsers.es.js";
|
|
95
95
|
import "../../../api/queries/users/guests.es.js";
|
|
96
96
|
import "../../../api/queries/versions/updateVersions.es.js";
|
|
97
|
-
import { useListViewsQuery as
|
|
98
|
-
import { viewsQueries as
|
|
97
|
+
import { useListViewsQuery as ui, useGetWorkingViewQuery as Vi, useGetBaseViewQuery as U, useGetViewQuery as gi } from "../../../api/queries/views/getViews.es.js";
|
|
98
|
+
import { viewsQueries as li } from "../../../api/queries/views/updateViews.es.js";
|
|
99
99
|
import "../../../api/queries/watchers/getWatchers.es.js";
|
|
100
100
|
import "../../../api/queries/uris/getUris.es.js";
|
|
101
|
-
import
|
|
102
|
-
import { useGlobalContext as
|
|
103
|
-
import { usePowerpack as
|
|
101
|
+
import fi from "../hooks/useBuildViewMenuItems.es.js";
|
|
102
|
+
import { useGlobalContext as Si } from "../../../context/GlobalContext.es.js";
|
|
103
|
+
import { usePowerpack as ki } from "../../../context/PowerpackContext.es.js";
|
|
104
104
|
import { useSelectedView as Li } from "../hooks/useSelectedView.es.js";
|
|
105
|
-
import { useViewsMutations as
|
|
106
|
-
import { useBaseViewMutations as
|
|
107
|
-
import { useSaveViewFromCurrent as
|
|
108
|
-
import { useViewSettingsChanged as
|
|
109
|
-
import { useLocalStorage as
|
|
110
|
-
import { isViewStudioScope as
|
|
105
|
+
import { useViewsMutations as Ci } from "../hooks/useViewsMutations.es.js";
|
|
106
|
+
import { useBaseViewMutations as Ii } from "../hooks/useBaseViewMutations.es.js";
|
|
107
|
+
import { useSaveViewFromCurrent as Di } from "../hooks/useSaveViewFromCurrent.es.js";
|
|
108
|
+
import { useViewSettingsChanged as Wi } from "../hooks/useViewSettingsChanged.es.js";
|
|
109
|
+
import { useLocalStorage as hi } from "../../../hooks/useLocalStorage.es.js";
|
|
110
|
+
import { isViewStudioScope as Bi } from "../utils/isViewStudioScope.es.js";
|
|
111
111
|
import { ViewsContext as _ } from "./ViewsContextInstance.es.js";
|
|
112
|
-
const
|
|
112
|
+
const Ei = "view", Oo = ({
|
|
113
113
|
children: p,
|
|
114
114
|
viewType: i,
|
|
115
|
-
viewAlias: S =
|
|
115
|
+
viewAlias: S = Ei,
|
|
116
116
|
projectName: o,
|
|
117
|
-
dispatch:
|
|
117
|
+
dispatch: k,
|
|
118
118
|
debug: u
|
|
119
119
|
}) => {
|
|
120
|
-
let { powerLicense: a } =
|
|
120
|
+
let { powerLicense: a } = ki();
|
|
121
121
|
u?.powerLicense !== void 0 && (console.warn("Using debug power license:", u.powerLicense), a = u.powerLicense);
|
|
122
|
-
const { user:
|
|
122
|
+
const { user: L } = Si(), [F, C] = G(!1), [r, I] = G(null), P = "viewsMenuCollapsed", [V, D] = hi(
|
|
123
123
|
P,
|
|
124
124
|
{}
|
|
125
125
|
), R = (t) => {
|
|
@@ -128,59 +128,63 @@ const Bi = "view", Go = ({
|
|
|
128
128
|
const M = { ...V };
|
|
129
129
|
M[c] = !1, D(M);
|
|
130
130
|
}
|
|
131
|
-
}, { data: b } =
|
|
131
|
+
}, { data: b } = ci(
|
|
132
132
|
{ projectName: o },
|
|
133
133
|
{ skip: !a || !r }
|
|
134
134
|
), [s, n, g, A] = Li({
|
|
135
135
|
viewType: i,
|
|
136
136
|
projectName: o
|
|
137
|
-
}), [K, d] =
|
|
137
|
+
}), [K, d] = Wi({
|
|
138
138
|
viewType: i
|
|
139
|
-
}), { currentData: W = [], isLoading: q } =
|
|
139
|
+
}), { currentData: W = [], isLoading: q } = ui(
|
|
140
140
|
{ projectName: o, viewType: i },
|
|
141
141
|
{ skip: !i }
|
|
142
142
|
), m = O(
|
|
143
143
|
() => W.filter(
|
|
144
|
-
(t) => t.label !==
|
|
144
|
+
(t) => t.label !== di && !(o && t.working && t.scope === "studio")
|
|
145
145
|
),
|
|
146
146
|
[W]
|
|
147
|
-
), { onCreateView: y, onDeleteView: z, onUpdateView: w, onResetWorkingView: h } =
|
|
147
|
+
), { onCreateView: y, onDeleteView: z, onUpdateView: w, onResetWorkingView: h } = Ci({
|
|
148
148
|
viewType: i,
|
|
149
149
|
projectName: o,
|
|
150
150
|
viewsList: m,
|
|
151
151
|
onCreate: R
|
|
152
|
-
}), {
|
|
152
|
+
}), {
|
|
153
|
+
currentData: e,
|
|
154
|
+
isLoading: H,
|
|
155
|
+
isError: J
|
|
156
|
+
} = Vi(
|
|
153
157
|
{ projectName: o, viewType: i },
|
|
154
158
|
{ skip: !i }
|
|
155
|
-
), { currentData:
|
|
159
|
+
), { currentData: X, isLoading: Y } = U(
|
|
156
160
|
{ projectName: o, viewType: i },
|
|
157
161
|
{ skip: !i }
|
|
158
|
-
), { currentData:
|
|
162
|
+
), { currentData: Z, isLoading: $ } = U(
|
|
159
163
|
{ projectName: void 0, viewType: i },
|
|
160
164
|
{ skip: !i }
|
|
161
|
-
),
|
|
165
|
+
), j = q || A || H || Y || $, B = e?.settings, l = s?.id === wi ? B : s?.settings, E = s?.id === e?.id, x = K && E && g && g !== e?.id ? g : void 0, { currentData: f, isFetching: N } = gi(
|
|
162
166
|
{
|
|
163
167
|
viewId: r,
|
|
164
|
-
projectName:
|
|
168
|
+
projectName: Bi(r, m) ? void 0 : o,
|
|
165
169
|
viewType: i
|
|
166
170
|
},
|
|
167
171
|
{ skip: typeof r != "string" || !a }
|
|
168
|
-
),
|
|
172
|
+
), T = O(
|
|
169
173
|
() => r === f?.id ? f : void 0,
|
|
170
174
|
[r, f]
|
|
171
|
-
), { onSaveViewFromCurrent:
|
|
175
|
+
), { onSaveViewFromCurrent: ii } = Di({
|
|
172
176
|
viewType: i,
|
|
173
177
|
projectName: o,
|
|
174
178
|
viewsList: m,
|
|
175
179
|
sourceSettings: l,
|
|
176
180
|
onUpdateView: w
|
|
177
|
-
}), { onCreateBaseView:
|
|
181
|
+
}), { onCreateBaseView: ti, onUpdateBaseView: oi, onDeleteBaseView: ei, onLoadBaseView: ri } = Ii({
|
|
178
182
|
viewType: i,
|
|
179
183
|
projectName: o,
|
|
180
184
|
viewSettings: l,
|
|
181
185
|
workingView: e,
|
|
182
|
-
dispatch:
|
|
183
|
-
}),
|
|
186
|
+
dispatch: k
|
|
187
|
+
}), si = Q(
|
|
184
188
|
async (t, { selectView: c } = {}) => {
|
|
185
189
|
if (!e?.id) {
|
|
186
190
|
console.error("No working view to update");
|
|
@@ -201,15 +205,15 @@ const Bi = "view", Go = ({
|
|
|
201
205
|
} catch (t) {
|
|
202
206
|
console.error("Failed to reset view:", t);
|
|
203
207
|
}
|
|
204
|
-
}, [e, h, s, n, d]),
|
|
208
|
+
}, [e, h, s, n, d]), ni = fi({
|
|
205
209
|
viewsList: m,
|
|
206
210
|
workingView: e,
|
|
207
211
|
viewType: i,
|
|
208
212
|
viewAlias: S,
|
|
209
213
|
projectName: o,
|
|
210
|
-
currentUser:
|
|
214
|
+
currentUser: L,
|
|
211
215
|
useWorkingView: !a,
|
|
212
|
-
editingViewId:
|
|
216
|
+
editingViewId: x,
|
|
213
217
|
selectedId: s?.id,
|
|
214
218
|
collapsed: V,
|
|
215
219
|
setCollapsed: D,
|
|
@@ -218,35 +222,36 @@ const Bi = "view", Go = ({
|
|
|
218
222
|
n(t), d(!1), C(!1);
|
|
219
223
|
},
|
|
220
224
|
onEdit: (t) => I(t),
|
|
221
|
-
onSave: async (t) =>
|
|
222
|
-
}),
|
|
225
|
+
onSave: async (t) => ii(t)
|
|
226
|
+
}), mi = {
|
|
223
227
|
viewType: i,
|
|
224
228
|
viewAlias: S,
|
|
225
229
|
projectName: o,
|
|
226
230
|
isMenuOpen: F,
|
|
227
231
|
editingView: r,
|
|
228
|
-
currentUser:
|
|
232
|
+
currentUser: L,
|
|
229
233
|
selectedView: s,
|
|
230
234
|
viewSettings: l,
|
|
231
|
-
editingViewData:
|
|
232
|
-
isLoadingEditingViewData:
|
|
235
|
+
editingViewData: T,
|
|
236
|
+
isLoadingEditingViewData: N,
|
|
233
237
|
viewsList: m,
|
|
234
238
|
// Working view
|
|
235
239
|
workingSettings: B,
|
|
236
240
|
workingView: e,
|
|
237
|
-
isViewWorking:
|
|
238
|
-
onUpdateWorkingView:
|
|
241
|
+
isViewWorking: E,
|
|
242
|
+
onUpdateWorkingView: si,
|
|
239
243
|
// base views
|
|
240
|
-
projectBaseView:
|
|
241
|
-
studioBaseView:
|
|
244
|
+
projectBaseView: X,
|
|
245
|
+
studioBaseView: Z,
|
|
242
246
|
// base view mutations
|
|
243
|
-
onCreateBaseView:
|
|
244
|
-
onUpdateBaseView:
|
|
245
|
-
onDeleteBaseView:
|
|
246
|
-
onLoadBaseView:
|
|
247
|
-
editingViewId:
|
|
248
|
-
viewMenuItems:
|
|
249
|
-
isLoadingViews:
|
|
247
|
+
onCreateBaseView: ti,
|
|
248
|
+
onUpdateBaseView: oi,
|
|
249
|
+
onDeleteBaseView: ei,
|
|
250
|
+
onLoadBaseView: ri,
|
|
251
|
+
editingViewId: x,
|
|
252
|
+
viewMenuItems: ni,
|
|
253
|
+
isLoadingViews: j,
|
|
254
|
+
isErrorWorkingView: J,
|
|
250
255
|
// data
|
|
251
256
|
shareOptions: b,
|
|
252
257
|
setIsMenuOpen: C,
|
|
@@ -260,19 +265,19 @@ const Bi = "view", Go = ({
|
|
|
260
265
|
// shared actions
|
|
261
266
|
resetWorkingView: v,
|
|
262
267
|
// api
|
|
263
|
-
api:
|
|
264
|
-
dispatch:
|
|
268
|
+
api: li,
|
|
269
|
+
dispatch: k
|
|
265
270
|
};
|
|
266
|
-
return /* @__PURE__ */
|
|
267
|
-
},
|
|
268
|
-
const p =
|
|
271
|
+
return /* @__PURE__ */ pi.jsx(_.Provider, { value: mi, children: p });
|
|
272
|
+
}, Qo = () => {
|
|
273
|
+
const p = ai(_);
|
|
269
274
|
if (!p)
|
|
270
275
|
throw new Error("useViewsContext must be used within a ViewsProvider");
|
|
271
276
|
return p;
|
|
272
277
|
};
|
|
273
278
|
export {
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
279
|
+
Oo as ViewsProvider,
|
|
280
|
+
Bi as isViewStudioScope,
|
|
281
|
+
Qo as useViewsContext
|
|
277
282
|
};
|
|
278
283
|
//# sourceMappingURL=ViewsContext.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ViewsContext.es.js","sources":["../../../../../../src/containers/Views/context/ViewsContext.tsx"],"sourcesContent":["import { useContext, FC, ReactNode, useState, useMemo, useCallback } from 'react'\nimport { type ViewType, WORKING_VIEW_ID, BASE_VIEW_ID } from '../types'\nimport {\n GetDefaultViewApiResponse,\n useGetWorkingViewQuery,\n useGetViewQuery,\n useListViewsQuery,\n UserModel,\n ViewListItemModel,\n viewsQueries,\n useGetShareOptionsQuery,\n ShareOption,\n useGetBaseViewQuery,\n} from '@shared/api'\nimport useBuildViewMenuItems from '../hooks/useBuildViewMenuItems'\nimport { ViewMenuItem } from '../ViewsMenu/ViewsMenu'\nimport { useGlobalContext } from '@shared/context/GlobalContext'\nimport { usePowerpack } from '@shared/context/PowerpackContext'\nimport { useSelectedView } from '../hooks/useSelectedView'\nimport { type UseViewMutations, useViewsMutations } from '../hooks/useViewsMutations'\nimport { useBaseViewMutations } from '../hooks/useBaseViewMutations'\nimport { useSaveViewFromCurrent } from '../hooks/useSaveViewFromCurrent'\nimport { useViewSettingsChanged } from '../hooks/useViewSettingsChanged'\nimport { useLocalStorage } from '@shared/hooks/useLocalStorage'\n\nexport type ViewData = GetDefaultViewApiResponse\nexport type ViewSettings = GetDefaultViewApiResponse['settings']\nexport type SelectedViewState = ViewData | undefined // id of view otherwise null with use working\nexport type EditingViewState = string | true | null // id of view being edited otherwise null\n\nexport type CollapsedViewState = Record<string, boolean>\n\nexport interface ViewsContextValue {\n // State\n viewType?: ViewType\n viewAlias: string\n projectName?: string\n currentUser?: UserModel\n isMenuOpen: boolean\n editingView: EditingViewState\n selectedView: SelectedViewState\n\n // Views data\n viewsList: ViewListItemModel[]\n viewSettings: ViewSettings | undefined\n // Working view\n workingSettings: ViewSettings | undefined\n workingView: ViewListItemModel | undefined\n isViewWorking: boolean\n onUpdateWorkingView: (\n payload: Partial<ViewData>,\n options?: { selectView?: boolean },\n ) => Promise<void>\n // base views\n projectBaseView: ViewListItemModel | undefined\n studioBaseView: ViewListItemModel | undefined\n editingViewId: string | undefined\n viewMenuItems: ViewMenuItem[]\n editingViewData?: ViewData\n isLoadingEditingViewData: boolean\n isLoadingViews: boolean\n\n // Data\n shareOptions?: ShareOption[] // available users to share with (undefined means loading)\n\n // Actions\n setIsMenuOpen: (open: boolean) => void\n setEditingView: (editing: EditingViewState) => void\n setSelectedView: (viewId: string) => void\n onSettingsChanged: (changed: boolean) => void\n\n // Mutations\n onCreateView: UseViewMutations['onCreateView']\n onDeleteView: UseViewMutations['onDeleteView']\n onUpdateView: UseViewMutations['onUpdateView']\n\n // Base view mutations\n onCreateBaseView: (isStudioScope: boolean) => Promise<void>\n onUpdateBaseView: (baseViewId: string, isStudioScope: boolean) => Promise<void>\n onDeleteBaseView: (baseViewId: string, isStudioScope: boolean) => Promise<void>\n onLoadBaseView: (isStudioScope: boolean) => Promise<void>\n\n // Actions (shared)\n resetWorkingView: () => Promise<void>\n\n // api\n api: typeof viewsQueries\n dispatch: any // dispatch is used to dispatch api mutations in pp like the share one.\n}\n\nconst DEFAULT_VIEW_ALIAS = 'view'\n\nexport interface ViewsProviderProps {\n children: ReactNode\n viewType?: string\n viewAlias?: string\n projectName?: string\n dispatch?: any\n debug?: {\n powerLicense?: boolean\n }\n}\n\nexport const ViewsProvider: FC<ViewsProviderProps> = ({\n children,\n viewType,\n viewAlias = DEFAULT_VIEW_ALIAS,\n projectName,\n dispatch,\n debug,\n}) => {\n let { powerLicense } = usePowerpack()\n if (debug?.powerLicense !== undefined) {\n console.warn('Using debug power license:', debug.powerLicense)\n powerLicense = debug.powerLicense\n }\n\n const { user: currentUser } = useGlobalContext()\n\n const [isMenuOpen, setIsMenuOpen] = useState(false)\n const [editingView, setEditingView] = useState<EditingViewState>(null)\n // Collapsed state persisted globally across all viewTypes and projects\n const stateKey = 'viewsMenuCollapsed'\n\n const [collapsedSections, setCollapsedSections] = useLocalStorage<CollapsedViewState>(\n stateKey,\n {},\n )\n\n // anything extra to do when a view is created successfully\n const handleOnViewCreated = (view: ViewData) => {\n const key = view.visibility === 'private' ? 'myViews' : 'sharedViews'\n // if the section is collapsed, expand it\n if (collapsedSections[key]) {\n const newCollapsedSections = { ...collapsedSections }\n newCollapsedSections[key] = false\n setCollapsedSections(newCollapsedSections)\n }\n }\n\n // when editing the view, get all users that can be shared to that view\n const { data: shareOptions } = useGetShareOptionsQuery(\n { projectName },\n { skip: !powerLicense || !editingView },\n )\n\n // setting of default views\n const [selectedView, setSelectedView, previousSelectedViewId, isLoadingDefaultView] =\n useSelectedView({\n viewType: viewType as string,\n projectName: projectName,\n })\n\n const [viewSettingsChanged, setViewSettingsChanged] = useViewSettingsChanged({\n viewType: viewType as ViewType,\n })\n\n // Fetch views data and filter out base views\n const { currentData: viewsListRaw = [], isLoading: isLoadingViewsList } = useListViewsQuery(\n { projectName: projectName, viewType: viewType as string },\n { skip: !viewType },\n )\n\n // Filter out base views from the list\n // Filter out studio working view if in project scope\n const viewsList = useMemo(\n () =>\n viewsListRaw.filter(\n (view) =>\n view.label !== BASE_VIEW_ID && !(projectName && view.working && view.scope === 'studio'),\n ),\n [viewsListRaw],\n )\n\n const { onCreateView, onDeleteView, onUpdateView, onResetWorkingView } = useViewsMutations({\n viewType,\n projectName,\n viewsList,\n onCreate: handleOnViewCreated,\n })\n\n // always get your working view\n const { currentData: workingView, isLoading: isLoadingWorkingView } = useGetWorkingViewQuery(\n { projectName: projectName, viewType: viewType as string },\n { skip: !viewType },\n )\n\n // Fetch both project and studio base views\n const { currentData: projectBaseView, isLoading: isLoadingProjectBaseView } = useGetBaseViewQuery(\n { projectName: projectName, viewType: viewType as string },\n { skip: !viewType },\n )\n const { currentData: studioBaseView, isLoading: isLoadingStudioBaseView } = useGetBaseViewQuery(\n { projectName: undefined, viewType: viewType as string },\n { skip: !viewType },\n )\n\n // isLoadingViews is true ONLY on the very first fetch (no cached data yet).\n // It does NOT flip back to true during background re-fetches (e.g. after a save),\n // which prevents UI flickering in consumers like ProjectOverviewContext.\n const isLoadingViews =\n isLoadingViewsList ||\n isLoadingDefaultView ||\n isLoadingWorkingView ||\n isLoadingProjectBaseView ||\n isLoadingStudioBaseView\n\n const workingSettings = workingView?.settings\n\n // which settings to use for the view\n const viewSettings =\n selectedView?.id === WORKING_VIEW_ID ? workingSettings : selectedView?.settings\n\n // is the working view selected?\n const isViewWorking = selectedView?.id === workingView?.id\n // were we just on a custom view and then edited it and ended up on the working view\n const editingViewId =\n viewSettingsChanged &&\n isViewWorking &&\n !!previousSelectedViewId &&\n previousSelectedViewId !== workingView?.id\n ? previousSelectedViewId\n : undefined\n\n // get data for the view we are editing\n const { currentData: editingViewDataData, isFetching: isLoadingEditingViewData } =\n useGetViewQuery(\n {\n viewId: editingView as string,\n projectName: isViewStudioScope(editingView as string, viewsList) ? undefined : projectName,\n viewType: viewType as string,\n },\n { skip: !(typeof editingView === 'string') || !powerLicense },\n )\n\n const editingViewData = useMemo(\n () => (editingView === editingViewDataData?.id ? editingViewDataData : undefined),\n [editingView, editingViewDataData],\n )\n\n const { onSaveViewFromCurrent } = useSaveViewFromCurrent({\n viewType: viewType,\n projectName,\n viewsList,\n sourceSettings: viewSettings,\n onUpdateView: onUpdateView,\n })\n\n // Base view mutations\n const { onCreateBaseView, onUpdateBaseView, onDeleteBaseView, onLoadBaseView } =\n useBaseViewMutations({\n viewType: viewType as string,\n projectName,\n viewSettings,\n workingView,\n dispatch,\n })\n\n const onUpdateWorkingView = useCallback(\n async (payload: Partial<ViewData>, { selectView }: { selectView?: boolean } = {}) => {\n if (!workingView?.id) {\n console.error('No working view to update')\n return\n }\n await onUpdateView(workingView.id, payload, !projectName)\n if (selectView) {\n setSelectedView(workingView.id)\n }\n },\n [onUpdateView, workingView],\n )\n\n // Reset working view to default (empty) settings\n const resetWorkingView = useCallback(async () => {\n try {\n await onResetWorkingView({\n existingWorkingViewId: workingView?.id,\n selectedViewId: selectedView?.id,\n setSelectedView,\n setSettingsChanged: setViewSettingsChanged,\n notify: true,\n })\n } catch (error) {\n console.error('Failed to reset view:', error)\n }\n }, [workingView, onResetWorkingView, selectedView, setSelectedView, setViewSettingsChanged])\n\n // build the menu items for the views\n const viewMenuItems = useBuildViewMenuItems({\n viewsList,\n workingView,\n viewType,\n viewAlias,\n projectName,\n currentUser,\n useWorkingView: !powerLicense,\n editingViewId,\n selectedId: selectedView?.id,\n collapsed: collapsedSections,\n setCollapsed: setCollapsedSections,\n onResetWorkingView: resetWorkingView,\n onSelect: (viewId) => {\n setSelectedView(viewId)\n // reset the settings changed state when switching views\n setViewSettingsChanged(false)\n // close the menu when selecting a view\n setIsMenuOpen(false)\n },\n onEdit: (viewId) => setEditingView(viewId),\n onSave: async (viewId) => onSaveViewFromCurrent(viewId),\n })\n\n const value: ViewsContextValue = {\n viewType,\n viewAlias,\n projectName,\n isMenuOpen,\n editingView,\n currentUser,\n selectedView,\n viewSettings,\n editingViewData,\n isLoadingEditingViewData,\n viewsList,\n // Working view\n workingSettings,\n workingView,\n isViewWorking,\n onUpdateWorkingView,\n // base views\n projectBaseView,\n studioBaseView,\n // base view mutations\n onCreateBaseView,\n onUpdateBaseView,\n onDeleteBaseView,\n onLoadBaseView,\n editingViewId,\n viewMenuItems,\n isLoadingViews,\n // data\n shareOptions,\n setIsMenuOpen,\n setEditingView,\n setSelectedView,\n onSettingsChanged: setViewSettingsChanged,\n // mutations\n onCreateView,\n onUpdateView,\n onDeleteView,\n // shared actions\n resetWorkingView,\n // api\n api: viewsQueries,\n dispatch,\n }\n\n return <ViewsContext.Provider value={value}>{children}</ViewsContext.Provider>\n}\n\nexport const useViewsContext = (): ViewsContextValue => {\n const context = useContext(ViewsContext)\n if (!context) {\n throw new Error('useViewsContext must be used within a ViewsProvider')\n }\n return context\n}\n\nimport { isViewStudioScope } from '../utils/isViewStudioScope'\nimport { ViewsContext } from './ViewsContextInstance'\nexport { isViewStudioScope }\n"],"names":["DEFAULT_VIEW_ALIAS","ViewsProvider","children","viewType","viewAlias","projectName","dispatch","debug","powerLicense","usePowerpack","currentUser","useGlobalContext","isMenuOpen","setIsMenuOpen","useState","editingView","setEditingView","stateKey","collapsedSections","setCollapsedSections","useLocalStorage","handleOnViewCreated","view","key","newCollapsedSections","shareOptions","useGetShareOptionsQuery","selectedView","setSelectedView","previousSelectedViewId","isLoadingDefaultView","useSelectedView","viewSettingsChanged","setViewSettingsChanged","useViewSettingsChanged","viewsListRaw","isLoadingViewsList","useListViewsQuery","viewsList","useMemo","BASE_VIEW_ID","onCreateView","onDeleteView","onUpdateView","onResetWorkingView","useViewsMutations","workingView","isLoadingWorkingView","useGetWorkingViewQuery","projectBaseView","isLoadingProjectBaseView","useGetBaseViewQuery","studioBaseView","isLoadingStudioBaseView","isLoadingViews","workingSettings","viewSettings","WORKING_VIEW_ID","isViewWorking","editingViewId","editingViewDataData","isLoadingEditingViewData","useGetViewQuery","isViewStudioScope","editingViewData","onSaveViewFromCurrent","useSaveViewFromCurrent","onCreateBaseView","onUpdateBaseView","onDeleteBaseView","onLoadBaseView","useBaseViewMutations","onUpdateWorkingView","useCallback","payload","selectView","resetWorkingView","error","viewMenuItems","useBuildViewMenuItems","viewId","value","viewsQueries","jsx","ViewsContext","useViewsContext","context","useContext"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ViewsContext.es.js","sources":["../../../../../../src/containers/Views/context/ViewsContext.tsx"],"sourcesContent":["import { useContext, FC, ReactNode, useState, useMemo, useCallback } from 'react'\nimport { type ViewType, WORKING_VIEW_ID, BASE_VIEW_ID } from '../types'\nimport {\n GetDefaultViewApiResponse,\n useGetWorkingViewQuery,\n useGetViewQuery,\n useListViewsQuery,\n UserModel,\n ViewListItemModel,\n viewsQueries,\n useGetShareOptionsQuery,\n ShareOption,\n useGetBaseViewQuery,\n} from '@shared/api'\nimport useBuildViewMenuItems from '../hooks/useBuildViewMenuItems'\nimport { ViewMenuItem } from '../ViewsMenu/ViewsMenu'\nimport { useGlobalContext } from '@shared/context/GlobalContext'\nimport { usePowerpack } from '@shared/context/PowerpackContext'\nimport { useSelectedView } from '../hooks/useSelectedView'\nimport { type UseViewMutations, useViewsMutations } from '../hooks/useViewsMutations'\nimport { useBaseViewMutations } from '../hooks/useBaseViewMutations'\nimport { useSaveViewFromCurrent } from '../hooks/useSaveViewFromCurrent'\nimport { useViewSettingsChanged } from '../hooks/useViewSettingsChanged'\nimport { useLocalStorage } from '@shared/hooks/useLocalStorage'\n\nexport type ViewData = GetDefaultViewApiResponse\nexport type ViewSettings = GetDefaultViewApiResponse['settings']\nexport type SelectedViewState = ViewData | undefined // id of view otherwise null with use working\nexport type EditingViewState = string | true | null // id of view being edited otherwise null\n\nexport type CollapsedViewState = Record<string, boolean>\n\nexport interface ViewsContextValue {\n // State\n viewType?: ViewType\n viewAlias: string\n projectName?: string\n currentUser?: UserModel\n isMenuOpen: boolean\n editingView: EditingViewState\n selectedView: SelectedViewState\n\n // Views data\n viewsList: ViewListItemModel[]\n viewSettings: ViewSettings | undefined\n // Working view\n workingSettings: ViewSettings | undefined\n workingView: ViewListItemModel | undefined\n isViewWorking: boolean\n onUpdateWorkingView: (\n payload: Partial<ViewData>,\n options?: { selectView?: boolean },\n ) => Promise<void>\n // base views\n projectBaseView: ViewListItemModel | undefined\n studioBaseView: ViewListItemModel | undefined\n editingViewId: string | undefined\n viewMenuItems: ViewMenuItem[]\n editingViewData?: ViewData\n isLoadingEditingViewData: boolean\n isLoadingViews: boolean\n isErrorWorkingView: boolean\n\n // Data\n shareOptions?: ShareOption[] // available users to share with (undefined means loading)\n\n // Actions\n setIsMenuOpen: (open: boolean) => void\n setEditingView: (editing: EditingViewState) => void\n setSelectedView: (viewId: string) => void\n onSettingsChanged: (changed: boolean) => void\n\n // Mutations\n onCreateView: UseViewMutations['onCreateView']\n onDeleteView: UseViewMutations['onDeleteView']\n onUpdateView: UseViewMutations['onUpdateView']\n\n // Base view mutations\n onCreateBaseView: (isStudioScope: boolean) => Promise<void>\n onUpdateBaseView: (baseViewId: string, isStudioScope: boolean) => Promise<void>\n onDeleteBaseView: (baseViewId: string, isStudioScope: boolean) => Promise<void>\n onLoadBaseView: (isStudioScope: boolean) => Promise<void>\n\n // Actions (shared)\n resetWorkingView: () => Promise<void>\n\n // api\n api: typeof viewsQueries\n dispatch: any // dispatch is used to dispatch api mutations in pp like the share one.\n}\n\nconst DEFAULT_VIEW_ALIAS = 'view'\n\nexport interface ViewsProviderProps {\n children: ReactNode\n viewType?: string\n viewAlias?: string\n projectName?: string\n dispatch?: any\n debug?: {\n powerLicense?: boolean\n }\n}\n\nexport const ViewsProvider: FC<ViewsProviderProps> = ({\n children,\n viewType,\n viewAlias = DEFAULT_VIEW_ALIAS,\n projectName,\n dispatch,\n debug,\n}) => {\n let { powerLicense } = usePowerpack()\n if (debug?.powerLicense !== undefined) {\n console.warn('Using debug power license:', debug.powerLicense)\n powerLicense = debug.powerLicense\n }\n\n const { user: currentUser } = useGlobalContext()\n\n const [isMenuOpen, setIsMenuOpen] = useState(false)\n const [editingView, setEditingView] = useState<EditingViewState>(null)\n // Collapsed state persisted globally across all viewTypes and projects\n const stateKey = 'viewsMenuCollapsed'\n\n const [collapsedSections, setCollapsedSections] = useLocalStorage<CollapsedViewState>(\n stateKey,\n {},\n )\n\n // anything extra to do when a view is created successfully\n const handleOnViewCreated = (view: ViewData) => {\n const key = view.visibility === 'private' ? 'myViews' : 'sharedViews'\n // if the section is collapsed, expand it\n if (collapsedSections[key]) {\n const newCollapsedSections = { ...collapsedSections }\n newCollapsedSections[key] = false\n setCollapsedSections(newCollapsedSections)\n }\n }\n\n // when editing the view, get all users that can be shared to that view\n const { data: shareOptions } = useGetShareOptionsQuery(\n { projectName },\n { skip: !powerLicense || !editingView },\n )\n\n // setting of default views\n const [selectedView, setSelectedView, previousSelectedViewId, isLoadingDefaultView] =\n useSelectedView({\n viewType: viewType as string,\n projectName: projectName,\n })\n\n const [viewSettingsChanged, setViewSettingsChanged] = useViewSettingsChanged({\n viewType: viewType as ViewType,\n })\n\n // Fetch views data and filter out base views\n const { currentData: viewsListRaw = [], isLoading: isLoadingViewsList } = useListViewsQuery(\n { projectName: projectName, viewType: viewType as string },\n { skip: !viewType },\n )\n\n // Filter out base views from the list\n // Filter out studio working view if in project scope\n const viewsList = useMemo(\n () =>\n viewsListRaw.filter(\n (view) =>\n view.label !== BASE_VIEW_ID && !(projectName && view.working && view.scope === 'studio'),\n ),\n [viewsListRaw],\n )\n\n const { onCreateView, onDeleteView, onUpdateView, onResetWorkingView } = useViewsMutations({\n viewType,\n projectName,\n viewsList,\n onCreate: handleOnViewCreated,\n })\n\n // always get your working view\n const {\n currentData: workingView,\n isLoading: isLoadingWorkingView,\n isError: isErrorWorkingView,\n } = useGetWorkingViewQuery(\n { projectName: projectName, viewType: viewType as string },\n { skip: !viewType },\n )\n\n // Fetch both project and studio base views\n const { currentData: projectBaseView, isLoading: isLoadingProjectBaseView } = useGetBaseViewQuery(\n { projectName: projectName, viewType: viewType as string },\n { skip: !viewType },\n )\n const { currentData: studioBaseView, isLoading: isLoadingStudioBaseView } = useGetBaseViewQuery(\n { projectName: undefined, viewType: viewType as string },\n { skip: !viewType },\n )\n\n // isLoadingViews is true ONLY on the very first fetch (no cached data yet).\n // It does NOT flip back to true during background re-fetches (e.g. after a save),\n // which prevents UI flickering in consumers like ProjectOverviewContext.\n const isLoadingViews =\n isLoadingViewsList ||\n isLoadingDefaultView ||\n isLoadingWorkingView ||\n isLoadingProjectBaseView ||\n isLoadingStudioBaseView\n\n const workingSettings = workingView?.settings\n\n // which settings to use for the view\n const viewSettings =\n selectedView?.id === WORKING_VIEW_ID ? workingSettings : selectedView?.settings\n\n // is the working view selected?\n const isViewWorking = selectedView?.id === workingView?.id\n // were we just on a custom view and then edited it and ended up on the working view\n const editingViewId =\n viewSettingsChanged &&\n isViewWorking &&\n !!previousSelectedViewId &&\n previousSelectedViewId !== workingView?.id\n ? previousSelectedViewId\n : undefined\n\n // get data for the view we are editing\n const { currentData: editingViewDataData, isFetching: isLoadingEditingViewData } =\n useGetViewQuery(\n {\n viewId: editingView as string,\n projectName: isViewStudioScope(editingView as string, viewsList) ? undefined : projectName,\n viewType: viewType as string,\n },\n { skip: !(typeof editingView === 'string') || !powerLicense },\n )\n\n const editingViewData = useMemo(\n () => (editingView === editingViewDataData?.id ? editingViewDataData : undefined),\n [editingView, editingViewDataData],\n )\n\n const { onSaveViewFromCurrent } = useSaveViewFromCurrent({\n viewType: viewType,\n projectName,\n viewsList,\n sourceSettings: viewSettings,\n onUpdateView: onUpdateView,\n })\n\n // Base view mutations\n const { onCreateBaseView, onUpdateBaseView, onDeleteBaseView, onLoadBaseView } =\n useBaseViewMutations({\n viewType: viewType as string,\n projectName,\n viewSettings,\n workingView,\n dispatch,\n })\n\n const onUpdateWorkingView = useCallback(\n async (payload: Partial<ViewData>, { selectView }: { selectView?: boolean } = {}) => {\n if (!workingView?.id) {\n console.error('No working view to update')\n return\n }\n await onUpdateView(workingView.id, payload, !projectName)\n if (selectView) {\n setSelectedView(workingView.id)\n }\n },\n [onUpdateView, workingView],\n )\n\n // Reset working view to default (empty) settings\n const resetWorkingView = useCallback(async () => {\n try {\n await onResetWorkingView({\n existingWorkingViewId: workingView?.id,\n selectedViewId: selectedView?.id,\n setSelectedView,\n setSettingsChanged: setViewSettingsChanged,\n notify: true,\n })\n } catch (error) {\n console.error('Failed to reset view:', error)\n }\n }, [workingView, onResetWorkingView, selectedView, setSelectedView, setViewSettingsChanged])\n\n // build the menu items for the views\n const viewMenuItems = useBuildViewMenuItems({\n viewsList,\n workingView,\n viewType,\n viewAlias,\n projectName,\n currentUser,\n useWorkingView: !powerLicense,\n editingViewId,\n selectedId: selectedView?.id,\n collapsed: collapsedSections,\n setCollapsed: setCollapsedSections,\n onResetWorkingView: resetWorkingView,\n onSelect: (viewId) => {\n setSelectedView(viewId)\n // reset the settings changed state when switching views\n setViewSettingsChanged(false)\n // close the menu when selecting a view\n setIsMenuOpen(false)\n },\n onEdit: (viewId) => setEditingView(viewId),\n onSave: async (viewId) => onSaveViewFromCurrent(viewId),\n })\n\n const value: ViewsContextValue = {\n viewType,\n viewAlias,\n projectName,\n isMenuOpen,\n editingView,\n currentUser,\n selectedView,\n viewSettings,\n editingViewData,\n isLoadingEditingViewData,\n viewsList,\n // Working view\n workingSettings,\n workingView,\n isViewWorking,\n onUpdateWorkingView,\n // base views\n projectBaseView,\n studioBaseView,\n // base view mutations\n onCreateBaseView,\n onUpdateBaseView,\n onDeleteBaseView,\n onLoadBaseView,\n editingViewId,\n viewMenuItems,\n isLoadingViews,\n isErrorWorkingView,\n // data\n shareOptions,\n setIsMenuOpen,\n setEditingView,\n setSelectedView,\n onSettingsChanged: setViewSettingsChanged,\n // mutations\n onCreateView,\n onUpdateView,\n onDeleteView,\n // shared actions\n resetWorkingView,\n // api\n api: viewsQueries,\n dispatch,\n }\n\n return <ViewsContext.Provider value={value}>{children}</ViewsContext.Provider>\n}\n\nexport const useViewsContext = (): ViewsContextValue => {\n const context = useContext(ViewsContext)\n if (!context) {\n throw new Error('useViewsContext must be used within a ViewsProvider')\n }\n return context\n}\n\nimport { isViewStudioScope } from '../utils/isViewStudioScope'\nimport { ViewsContext } from './ViewsContextInstance'\nexport { isViewStudioScope }\n"],"names":["DEFAULT_VIEW_ALIAS","ViewsProvider","children","viewType","viewAlias","projectName","dispatch","debug","powerLicense","usePowerpack","currentUser","useGlobalContext","isMenuOpen","setIsMenuOpen","useState","editingView","setEditingView","stateKey","collapsedSections","setCollapsedSections","useLocalStorage","handleOnViewCreated","view","key","newCollapsedSections","shareOptions","useGetShareOptionsQuery","selectedView","setSelectedView","previousSelectedViewId","isLoadingDefaultView","useSelectedView","viewSettingsChanged","setViewSettingsChanged","useViewSettingsChanged","viewsListRaw","isLoadingViewsList","useListViewsQuery","viewsList","useMemo","BASE_VIEW_ID","onCreateView","onDeleteView","onUpdateView","onResetWorkingView","useViewsMutations","workingView","isLoadingWorkingView","isErrorWorkingView","useGetWorkingViewQuery","projectBaseView","isLoadingProjectBaseView","useGetBaseViewQuery","studioBaseView","isLoadingStudioBaseView","isLoadingViews","workingSettings","viewSettings","WORKING_VIEW_ID","isViewWorking","editingViewId","editingViewDataData","isLoadingEditingViewData","useGetViewQuery","isViewStudioScope","editingViewData","onSaveViewFromCurrent","useSaveViewFromCurrent","onCreateBaseView","onUpdateBaseView","onDeleteBaseView","onLoadBaseView","useBaseViewMutations","onUpdateWorkingView","useCallback","payload","selectView","resetWorkingView","error","viewMenuItems","useBuildViewMenuItems","viewId","value","viewsQueries","jsx","ViewsContext","useViewsContext","context","useContext"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require("../../../api/base/client.cjs.js");require("../../../api/generated/graphql.cjs.js");require("../../../api/generated/graphqlLinks.cjs.js");require("../../../api/generated/access.cjs.js");require("../../../api/generated/actions.cjs.js");require("../../../api/generated/activityFeed.cjs.js");require("../../../api/generated/addons.cjs.js");require("../../../api/generated/anatomy.cjs.js");require("../../../api/generated/attributes.cjs.js");require("../../../api/generated/authentication.cjs.js");require("../../../api/generated/bundles.cjs.js");require("../../../api/generated/configuration.cjs.js");require("../../../api/generated/dataImport.cjs.js");require("../../../api/generated/desktop.cjs.js");require("../../../api/generated/entityLists.cjs.js");require("../../../api/generated/events.cjs.js");require("../../../api/generated/files.cjs.js");require("../../../api/generated/folders.cjs.js");require("../../../api/generated/inbox.cjs.js");require("../../../api/generated/links.cjs.js");require("../../../api/generated/market.cjs.js");require("../../../api/generated/onboarding.cjs.js");require("../../../api/generated/operations.cjs.js");require("../../../api/generated/products.cjs.js");require("../../../api/generated/projectDashboard.cjs.js");require("../../../api/generated/projects.cjs.js");require("../../../api/generated/projectFolders.cjs.js");require("../../../api/generated/reviewables.cjs.js");require("../../../api/generated/services.cjs.js");require("../../../api/generated/system.cjs.js");require("../../../api/generated/tasks.cjs.js");require("../../../api/generated/teams.cjs.js");require("../../../api/generated/thumbnails.cjs.js");require("../../../api/generated/uRIs.cjs.js");require("../../../api/generated/users.cjs.js");require("../../../api/generated/versions.cjs.js");require("../../../api/generated/workfiles.cjs.js");require("../../../api/generated/ynputCloud.cjs.js");require("../../../api/generated/grouping.cjs.js");require("../../../api/generated/views.cjs.js");require("../../../api/queries/actions/getActions.cjs.js");require("../../../api/queries/activities/getActivities.cjs.js");require("../../../api/queries/activities/updateReaction.cjs.js");require("../../../api/queries/activities/getMentions.cjs.js");require("../../../api/queries/activities/getCategories.cjs.js");require("../../../api/queries/addons/getAddons.cjs.js");require("../../../api/queries/addons/updateAddons.cjs.js");require("../../../api/queries/attributes/getAttributes.cjs.js");require("../../../api/queries/attributes/updateAttributes.cjs.js");require("../../../api/queries/authentication/getAuthentication.cjs.js");require("../../../api/queries/bundles/getBundles.cjs.js");require("../../../api/queries/bundles/updateBundles.cjs.js");require("../../../api/queries/cloud/cloud.cjs.js");require("../../../api/queries/columnStats/metricTargets.cjs.js");require("../../../api/queries/columnStats/groupCounts.cjs.js");require("../../../api/queries/config/getConfig.cjs.js");require("../../../api/queries/config/updateConfig.cjs.js");require("../../../api/queries/entities/getEntity.cjs.js");require("../../../api/queries/entities/getEntityPanel.cjs.js");require("../../../api/queries/overview/getOverview.cjs.js");require("../../../api/queries/overview/updateOverview.cjs.js");require("../../../api/queries/versions/getVersionsProducts.cjs.js");require("../../../api/queries/links/getEntityLinks.cjs.js");require("../../../api/queries/entities/updateEntity.cjs.js");require("../../../api/queries/entityLists/getLists.cjs.js");require("../../../api/queries/entityLists/updateLists.cjs.js");require("../../../api/queries/entityLists/getListsAttributes.cjs.js");require("../../../api/queries/entityLists/listItemsColumnStats.cjs.js");require("../../../api/queries/entityLists/updateListsAttributes.cjs.js");require("../../../api/queries/entityLists/listFolders.cjs.js");require("../../../api/queries/folders/getFolders.cjs.js");require("../../../api/queries/folders/getFolderDeleteInfo.cjs.js");require("../../../api/queries/grouping/getGrouping.cjs.js");require("../../../api/queries/links/updateLinks.cjs.js");require("../../../api/queries/links/getLinks.cjs.js");require("../../../api/queries/permissions/getPermissions.cjs.js");require("../../../api/queries/products/createProduct.cjs.js");require("../../../api/queries/products/getFolderProducts.cjs.js");require("../../../api/queries/project/getProject.cjs.js");require("../../../api/queries/project/updateProject.cjs.js");require("../../../api/queries/projectFolders/projectFolders.cjs.js");require("../../../api/queries/review/getReview.cjs.js");require("../../../api/queries/review/updateReview.cjs.js");require("../../../api/queries/share/share.cjs.js");require("../../../api/queries/system/getSystem.cjs.js");require("../../../api/queries/tasks/getTasks.cjs.js");require("../../../api/queries/tasks/updateTasks.cjs.js");require("../../../api/queries/teams/getTeams.cjs.js");require("../../../api/queries/userDashboard/getUserDashboard.cjs.js");require("../../../api/queries/users/getUsers.cjs.js");require("../../../api/queries/users/updateUsers.cjs.js");require("../../../api/queries/users/guests.cjs.js");require("../../../api/queries/versions/updateVersions.cjs.js");require("../../../api/queries/views/getViews.cjs.js");const y=require("../../../api/queries/views/updateViews.cjs.js");require("../../../api/queries/watchers/getWatchers.cjs.js");require("../../../api/queries/uris/getUris.cjs.js");const
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require("../../../api/base/client.cjs.js");require("../../../api/generated/graphql.cjs.js");require("../../../api/generated/graphqlLinks.cjs.js");require("../../../api/generated/access.cjs.js");require("../../../api/generated/actions.cjs.js");require("../../../api/generated/activityFeed.cjs.js");require("../../../api/generated/addons.cjs.js");require("../../../api/generated/anatomy.cjs.js");require("../../../api/generated/attributes.cjs.js");require("../../../api/generated/authentication.cjs.js");require("../../../api/generated/bundles.cjs.js");require("../../../api/generated/configuration.cjs.js");require("../../../api/generated/dataImport.cjs.js");require("../../../api/generated/desktop.cjs.js");require("../../../api/generated/entityLists.cjs.js");require("../../../api/generated/events.cjs.js");require("../../../api/generated/files.cjs.js");require("../../../api/generated/folders.cjs.js");require("../../../api/generated/inbox.cjs.js");require("../../../api/generated/links.cjs.js");require("../../../api/generated/market.cjs.js");require("../../../api/generated/onboarding.cjs.js");require("../../../api/generated/operations.cjs.js");require("../../../api/generated/products.cjs.js");require("../../../api/generated/projectDashboard.cjs.js");require("../../../api/generated/projects.cjs.js");require("../../../api/generated/projectFolders.cjs.js");require("../../../api/generated/reviewables.cjs.js");require("../../../api/generated/services.cjs.js");require("../../../api/generated/system.cjs.js");require("../../../api/generated/tasks.cjs.js");require("../../../api/generated/teams.cjs.js");require("../../../api/generated/thumbnails.cjs.js");require("../../../api/generated/uRIs.cjs.js");require("../../../api/generated/users.cjs.js");require("../../../api/generated/versions.cjs.js");require("../../../api/generated/workfiles.cjs.js");require("../../../api/generated/ynputCloud.cjs.js");require("../../../api/generated/grouping.cjs.js");require("../../../api/generated/views.cjs.js");require("../../../api/queries/actions/getActions.cjs.js");require("../../../api/queries/activities/getActivities.cjs.js");require("../../../api/queries/activities/updateReaction.cjs.js");require("../../../api/queries/activities/getMentions.cjs.js");require("../../../api/queries/activities/getCategories.cjs.js");require("../../../api/queries/addons/getAddons.cjs.js");require("../../../api/queries/addons/updateAddons.cjs.js");require("../../../api/queries/attributes/getAttributes.cjs.js");require("../../../api/queries/attributes/updateAttributes.cjs.js");require("../../../api/queries/authentication/getAuthentication.cjs.js");require("../../../api/queries/bundles/getBundles.cjs.js");require("../../../api/queries/bundles/updateBundles.cjs.js");require("../../../api/queries/cloud/cloud.cjs.js");require("../../../api/queries/columnStats/metricTargets.cjs.js");require("../../../api/queries/columnStats/groupCounts.cjs.js");require("../../../api/queries/config/getConfig.cjs.js");require("../../../api/queries/config/updateConfig.cjs.js");require("../../../api/queries/entities/getEntity.cjs.js");require("../../../api/queries/entities/getEntityPanel.cjs.js");require("../../../api/queries/overview/getOverview.cjs.js");require("../../../api/queries/overview/updateOverview.cjs.js");require("../../../api/queries/versions/getVersionsProducts.cjs.js");require("../../../api/queries/links/getEntityLinks.cjs.js");require("../../../api/queries/entities/updateEntity.cjs.js");require("../../../api/queries/entityLists/getLists.cjs.js");require("../../../api/queries/entityLists/updateLists.cjs.js");require("../../../api/queries/entityLists/getListsAttributes.cjs.js");require("../../../api/queries/entityLists/listItemsColumnStats.cjs.js");require("../../../api/queries/entityLists/updateListsAttributes.cjs.js");require("../../../api/queries/entityLists/listFolders.cjs.js");require("../../../api/queries/folders/getFolders.cjs.js");require("../../../api/queries/folders/getFolderDeleteInfo.cjs.js");require("../../../api/queries/grouping/getGrouping.cjs.js");require("../../../api/queries/links/updateLinks.cjs.js");require("../../../api/queries/links/getLinks.cjs.js");require("../../../api/queries/permissions/getPermissions.cjs.js");require("../../../api/queries/products/createProduct.cjs.js");require("../../../api/queries/products/getFolderProducts.cjs.js");require("../../../api/queries/project/getProject.cjs.js");require("../../../api/queries/project/updateProject.cjs.js");require("../../../api/queries/projectFolders/projectFolders.cjs.js");require("../../../api/queries/review/getReview.cjs.js");require("../../../api/queries/review/updateReview.cjs.js");require("../../../api/queries/share/share.cjs.js");require("../../../api/queries/system/getSystem.cjs.js");require("../../../api/queries/tasks/getTasks.cjs.js");require("../../../api/queries/tasks/updateTasks.cjs.js");require("../../../api/queries/teams/getTeams.cjs.js");require("../../../api/queries/userDashboard/getUserDashboard.cjs.js");require("../../../api/queries/users/getUsers.cjs.js");require("../../../api/queries/users/updateUsers.cjs.js");require("../../../api/queries/users/guests.cjs.js");require("../../../api/queries/versions/updateVersions.cjs.js");require("../../../api/queries/views/getViews.cjs.js");const y=require("../../../api/queries/views/updateViews.cjs.js");require("../../../api/queries/watchers/getWatchers.cjs.js");require("../../../api/queries/uris/getUris.cjs.js");const R=require("./generateWorkingView.cjs.js"),m=require("react-toastify"),V=require("react"),x=require("react-redux"),N=require("../context/ViewsContext.cjs.js");let S=!1;const M=()=>{S||(S=!0,queueMicrotask(()=>{S=!1}))},j=async(e,s,u,r={},o,w,k,i)=>{const{viewSettings:a,viewType:n,projectName:p,selectedView:t,setSelectedView:d,workingView:q,onSettingsChanged:c,isErrorWorkingView:l}=o;if(!n)throw new Error("No view type provided for updating view settings");const g=t?.id,C=t?.working;try{s(u);const{settings:v,workingViewId:W}=k(),h=v??a;if(h===void 0&&!l){console.warn("updateViewSettings: no settings baseline available, aborting to prevent data loss.");return}const I={...h,...e},b=R.generateWorkingView(I),f=W??q?.id;f&&(b.id=f);const F=b.id,H=w({payload:f?{settings:I}:b,viewType:n,projectName:p},f);i(),(!C||t?.id!==f)&&(t&&c(!0),d(F)),await H,s(null),r.successMessage&&m.toast.success(r.successMessage)}catch(v){s(null),g&&d(g),t&&!C&&c(!1),console.error(v);const W=r.errorMessage||`Failed to update view settings: ${v}`;m.toast.error(W)}},L=()=>{const[e]=y.useCreateViewMutation(),[s]=y.useUpdateViewMutation(),u=N.useViewsContext(),r=x.useStore(),o=V.useCallback(async(i,a)=>{if(a){const n={};return["label","owner","settings"].forEach(t=>{i.payload[t]!==void 0&&(n[t]=i.payload[t])}),await s({viewType:i.viewType,projectName:i.projectName,viewId:a,payload:n}).unwrap()}else return await e(i).unwrap()},[e,s]),w=V.useCallback(()=>{const{viewType:i,projectName:a,selectedView:n,workingView:p}=u;if(!i)return{};const t=r.getState(),d=y.viewsQueries.endpoints.getWorkingView.select({viewType:i,projectName:a})(t),c=d?.data?.id||p?.id,l=y.viewsQueries.endpoints.getDefaultView.select({viewType:i,projectName:a})(t),g=l?.data?.id||n?.id;return(!!c&&g===c||S)&&d?.data?.settings?{settings:d.data.settings,workingViewId:c}:l?.data?.settings?{settings:l.data.settings,workingViewId:c}:{workingViewId:c}},[r,u]);return{updateViewSettings:V.useCallback(async(...i)=>await j(...i,u,o,w,M),[u,o,w]),onCreateView:o,getLatestSettings:w,markCacheDirty:M}},T=(e,s)=>s.split(".").reduce((u,r)=>u?.[r],e),E=(e,s,u)=>{const[r,...o]=s.split(".");return r?{...e,[r]:o.length?E(e[r]||{},o.join("."),u):u}:e},A=(e,s)=>{const{viewSettings:u,isLoadingViews:r}=N.useViewsContext(),{updateViewSettings:o,getLatestSettings:w}=L(),[k,i]=V.useState(null),a=V.useRef(null),n=u,p=k!==null?k:T(n,e)??s,t=V.useCallback(q=>{a.current=q,i(q)},[]),d=V.useCallback(q=>{if(r||!n)return;const c=w().settings??n,l=a.current!==null?a.current:T(c,e)??s,g=typeof q=="function"?q(l):q;o(E(c,e,g),t,g,{})},[s,w,r,e,n,t,o]);return[p,d]};exports.updateViewSettings=j;exports.useViewUpdateHelper=L;exports.useViewsState=A;
|
|
2
2
|
//# sourceMappingURL=viewUpdateHelper.cjs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"viewUpdateHelper.cjs.js","sources":["../../../../../../src/containers/Views/utils/viewUpdateHelper.ts"],"sourcesContent":["/**\n * Shared helper for updating view settings with optimistic local state management.\n *\n * Sequential updateViewSettings calls in the same event tick MUST chain correctly:\n * the second call has to see the first call's changes. Closure-captured\n * `viewSettings` does not refresh between sync calls (no re-render yet), so we\n * read the latest settings from the RTK Query cache at call time instead.\n * RTK's updateView mutation performs an optimistic cache write in\n * `onQueryStarted`, so the cache is already up-to-date by the time the next\n * call reads it.\n */\n\nimport {\n EntityIdResponse,\n useCreateViewMutation,\n useUpdateViewMutation,\n viewsQueries,\n} from '@shared/api'\nimport { generateWorkingView } from './generateWorkingView'\nimport { toast } from 'react-toastify'\nimport { SetStateAction, useCallback, useRef, useState } from 'react'\nimport { useStore } from 'react-redux'\nimport { useViewsContext, ViewsContextValue } from '../context/ViewsContext'\n\ninterface UpdateOptions {\n successMessage?: string\n errorMessage?: string\n}\n\n// Module-level flag shared across every useViewUpdateHelper instance. Set true\n// when a mutation has been dispatched in the current tick (RTK cache is now\n// optimistically fresh); reset on the next microtask. Must be module-level so\n// that two different hook instances (e.g. ProjectOverviewDataProvider +\n// ProjectOverviewContext) coordinate correctly when writes flow through one\n// and subsequent reads come from the other in the same event tick.\nlet cacheDirtyThisTick = false\nconst markCacheDirty = () => {\n if (cacheDirtyThisTick) return\n cacheDirtyThisTick = true\n queueMicrotask(() => {\n cacheDirtyThisTick = false\n })\n}\n\nexport type UpdateViewSettingsFn = (\n updatedSettings: any,\n localStateSetter: (value: any) => void,\n newLocalValue: any,\n options: UpdateOptions,\n) => Promise<void>\n\nexport interface LatestSettingsResult {\n settings?: any\n workingViewId?: string\n}\n\nexport const updateViewSettings = async (\n updatedSettings: any,\n localStateSetter: (value: any) => void,\n newLocalValue: any,\n options: UpdateOptions = {},\n viewContext: ViewsContextValue,\n onApplyViewChanges: (arg: any, viewId?: string) => Promise<EntityIdResponse | void>,\n // Reads latest effective settings from RTK Query cache at call time. Required to\n // prevent stale-closure races when two updates fire in the same tick.\n getLatest: () => LatestSettingsResult,\n // Invoked synchronously right after the mutation is dispatched. The caller\n // uses this to flip a \"cache is fresh this tick\" flag so subsequent sync\n // calls in the same tick read the just-updated cache instead of stale state.\n markCacheDirty: () => void,\n): Promise<void> => {\n const {\n viewSettings,\n viewType,\n projectName,\n selectedView,\n setSelectedView,\n workingView,\n onSettingsChanged,\n } = viewContext\n\n if (!viewType) throw new Error('No view type provided for updating view settings')\n\n const previousSelectedViewId = selectedView?.id\n const wasWorking = selectedView?.working\n\n try {\n // Immediately update local state for fast UI response\n localStateSetter(newLocalValue)\n\n // Read latest settings from RTK cache (includes prior same-tick optimistic writes).\n // Fallback to closure-captured value if cache has nothing (first render, etc.).\n const { settings: latestSettingsFromCache, workingViewId: latestWorkingViewIdFromCache } =\n getLatest()\n const latestSettings = latestSettingsFromCache ?? viewSettings\n\n // If we have no settings baseline at all (neither from cache nor from context),\n // abort to prevent writing a partial payload that would overwrite saved settings.\n // This is a defence-in-depth guard; in normal flow isLoadingViews prevents callers\n // from triggering updates before data is available.\n if (latestSettings === undefined) {\n console.warn(\n 'updateViewSettings: no settings baseline available, aborting to prevent data loss.',\n )\n return\n }\n\n // Create settings with updates\n const newSettings = { ...latestSettings, ...updatedSettings }\n\n // always update the working view no matter what\n const newWorkingView = generateWorkingView(newSettings)\n\n // Ensure the payload uses the consistent ID if we already have a working view\n const viewId = latestWorkingViewIdFromCache ?? workingView?.id\n if (viewId) {\n newWorkingView.id = viewId\n }\n const newWorkingViewId = newWorkingView.id\n\n // Make API call in background\n // only include the fields that are updating (just settings)\n const payload = viewId ? { settings: newSettings } : newWorkingView\n\n const promise = onApplyViewChanges(\n {\n payload,\n viewType: viewType,\n projectName: projectName,\n },\n viewId,\n )\n\n // Mutation dispatch above ran onQueryStarted synchronously → RTK cache now\n // reflects `newSettings`. Signal this so any subsequent sync call in the\n // same tick reads the fresh cache instead of the stale closure baseline.\n markCacheDirty()\n\n // if not already on the working view: set that the settings have been changed to show the little blue save button and switch to the working view\n // Note: selectedView?.id is always a real UUID from the server, never the WORKING_VIEW_ID sentinel.\n if (!wasWorking || selectedView?.id !== viewId) {\n if (selectedView) {\n onSettingsChanged(true)\n }\n setSelectedView(newWorkingViewId as string)\n }\n\n await promise\n\n // Clear local state after successful API call - the server data will take over\n localStateSetter(null)\n\n if (options.successMessage) {\n toast.success(options.successMessage)\n }\n } catch (error) {\n // Revert local state on error\n localStateSetter(null)\n\n if (previousSelectedViewId) {\n setSelectedView(previousSelectedViewId)\n }\n\n if (selectedView && !wasWorking) {\n onSettingsChanged(false)\n }\n\n console.error(error)\n const errorMsg = options.errorMessage || `Failed to update view settings: ${error}`\n toast.error(errorMsg)\n }\n}\n\nexport const useViewUpdateHelper = () => {\n const [createView] = useCreateViewMutation()\n const [updateView] = useUpdateViewMutation()\n\n const viewContext = useViewsContext()\n const store = useStore()\n\n const onApplyViewChanges = useCallback(\n async (arg: any, viewId?: string) => {\n if (viewId) {\n // Filter the payload to only include valid patch fields\n // and ideally only include fields that are actually being updated.\n // Expecting the caller to provide only the fields they want to update in the payload.\n const patchPayload: any = {}\n const patchFields = ['label', 'owner', 'settings']\n patchFields.forEach((key) => {\n if (arg.payload[key] !== undefined) {\n patchPayload[key] = arg.payload[key]\n }\n })\n\n return await updateView({\n viewType: arg.viewType,\n projectName: arg.projectName,\n viewId,\n payload: patchPayload,\n }).unwrap()\n } else {\n return await createView(arg).unwrap()\n }\n },\n [createView, updateView],\n )\n\n // Returns cached settings when a same-tick prior write has refreshed the\n // cache. Otherwise returns undefined and the caller falls back to the\n // closure-captured viewSettings (correct baseline for the first write in a\n // tick, including the named-view → working-view fork).\n const getLatest = useCallback((): LatestSettingsResult => {\n const { viewType, projectName, selectedView, workingView } = viewContext\n if (!viewType) return {}\n\n const state = store.getState() as any\n\n // 1. Get the working view from the store — most authoritative after optimistic writes.\n const workingViewEntry = viewsQueries.endpoints.getWorkingView.select({\n viewType,\n projectName,\n })(state)\n const storeWorkingViewId = workingViewEntry?.data?.id\n // Prefer the store's working view ID over the potentially stale context closure value.\n const resolvedWorkingViewId = storeWorkingViewId || workingView?.id\n\n // 2. Determine the currently targeted view ID.\n // Use the store's getDefaultView cache (updated optimistically by setSelectedView) so that\n // an in-flight selection change is visible before React re-renders the context.\n const defaultViewEntry = viewsQueries.endpoints.getDefaultView.select({\n viewType,\n projectName,\n })(state)\n const targetViewId = defaultViewEntry?.data?.id || selectedView?.id\n\n // 3. Determine if the working view is active.\n // IMPORTANT: use !!resolvedWorkingViewId to avoid the undefined === undefined false-positive\n // that would occur on a new project before any working view exists.\n // Note: WORKING_VIEW_ID ('_working_') is a UI-only sentinel; it never appears in\n // server-side cache IDs, so there is no point checking for it here.\n const isWorkingViewActive =\n (!!resolvedWorkingViewId && targetViewId === resolvedWorkingViewId) || cacheDirtyThisTick\n\n // 4. If the working view is active, use its cache as the baseline to prevent stale merges.\n if (isWorkingViewActive && workingViewEntry?.data?.settings) {\n return {\n settings: workingViewEntry.data.settings,\n workingViewId: resolvedWorkingViewId,\n }\n }\n\n // 5. For named views: use the defaultView cache settings as the baseline.\n // This is populated by the initial useGetDefaultViewQuery fetch and is more reliable\n // than the getView endpoint cache (which is only fetched on-demand when editing).\n if (defaultViewEntry?.data?.settings) {\n return {\n settings: defaultViewEntry.data.settings,\n workingViewId: resolvedWorkingViewId,\n }\n }\n\n return { workingViewId: resolvedWorkingViewId }\n }, [store, viewContext])\n\n const updateViewSettingsHandler = useCallback<UpdateViewSettingsFn>(\n async (...args) =>\n await updateViewSettings(...args, viewContext, onApplyViewChanges, getLatest, markCacheDirty),\n [viewContext, onApplyViewChanges, getLatest],\n )\n\n return {\n updateViewSettings: updateViewSettingsHandler,\n onCreateView: onApplyViewChanges,\n getLatestSettings: getLatest,\n markCacheDirty,\n }\n}\n\ntype SettingsObject = Record<string, any>\n\nexport type PathKeys<T> = T extends SettingsObject\n ? {\n [K in keyof T & string]: NonNullable<T[K]> extends readonly any[]\n ? K\n : NonNullable<T[K]> extends SettingsObject\n ? K | `${K}.${PathKeys<NonNullable<T[K]>>}`\n : K\n }[keyof T & string]\n : never\n\nexport type PathValue<T, P extends string> = P extends `${infer K}.${infer Rest}`\n ? K extends keyof T\n ? PathValue<NonNullable<T[K]>, Rest>\n : never\n : P extends keyof T\n ? T[P]\n : never\n\nconst getNestedValue = <T extends SettingsObject, P extends PathKeys<T>>(\n settings: T | undefined,\n path: P,\n): PathValue<T, P> | undefined => {\n return path.split('.').reduce<any>((value, key) => value?.[key], settings)\n}\n\nconst setNestedValue = <T extends SettingsObject>(settings: T, path: string, value: any): T => {\n const [key, ...rest] = path.split('.')\n\n if (!key) return settings\n\n return {\n ...settings,\n [key]: rest.length\n ? setNestedValue((settings[key] as SettingsObject) || {}, rest.join('.'), value)\n : value,\n }\n}\n\nexport const useViewsState = <\n Settings extends SettingsObject = SettingsObject,\n P extends PathKeys<Settings> = PathKeys<Settings>,\n>(\n path: P,\n defaultValue?: PathValue<Settings, P>,\n): [\n PathValue<Settings, P> | undefined,\n (value: SetStateAction<PathValue<Settings, P>>) => void,\n] => {\n const { viewSettings, isLoadingViews } = useViewsContext()\n const { updateViewSettings, getLatestSettings } = useViewUpdateHelper()\n const [localValue, setLocalValueState] = useState<PathValue<Settings, P> | null>(null)\n const localValueRef = useRef<PathValue<Settings, P> | null>(null)\n\n const settings = viewSettings as Settings | undefined\n const value = localValue !== null ? localValue : getNestedValue(settings, path) ?? defaultValue\n\n const setLocalValue = useCallback((newValue: PathValue<Settings, P> | null) => {\n localValueRef.current = newValue\n setLocalValueState(newValue)\n }, [])\n\n const setValue = useCallback(\n (nextValue: SetStateAction<PathValue<Settings, P>>) => {\n if (isLoadingViews || !settings) return\n\n const latestSettings = (getLatestSettings().settings as Settings | undefined) ?? settings\n const currentValue =\n localValueRef.current !== null\n ? localValueRef.current\n : getNestedValue(latestSettings, path) ?? defaultValue\n const resolvedValue =\n typeof nextValue === 'function'\n ? (nextValue as (value: PathValue<Settings, P>) => PathValue<Settings, P>)(\n currentValue as PathValue<Settings, P>,\n )\n : nextValue\n\n void updateViewSettings(\n setNestedValue(latestSettings, path, resolvedValue),\n setLocalValue,\n resolvedValue,\n {},\n )\n },\n [\n defaultValue,\n getLatestSettings,\n isLoadingViews,\n path,\n settings,\n setLocalValue,\n updateViewSettings,\n ],\n )\n\n return [value, setValue]\n}\n"],"names":["cacheDirtyThisTick","markCacheDirty","updateViewSettings","updatedSettings","localStateSetter","newLocalValue","options","viewContext","onApplyViewChanges","getLatest","viewSettings","viewType","projectName","selectedView","setSelectedView","workingView","onSettingsChanged","previousSelectedViewId","wasWorking","latestSettingsFromCache","latestWorkingViewIdFromCache","latestSettings","newSettings","newWorkingView","generateWorkingView","viewId","newWorkingViewId","promise","toast","error","errorMsg","useViewUpdateHelper","createView","useCreateViewMutation","updateView","useUpdateViewMutation","useViewsContext","store","useStore","useCallback","arg","patchPayload","key","state","workingViewEntry","viewsQueries","resolvedWorkingViewId","defaultViewEntry","targetViewId","args","getNestedValue","settings","path","value","setNestedValue","rest","useViewsState","defaultValue","isLoadingViews","getLatestSettings","localValue","setLocalValueState","useState","localValueRef","useRef","setLocalValue","newValue","setValue","nextValue","currentValue","resolvedValue"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"viewUpdateHelper.cjs.js","sources":["../../../../../../src/containers/Views/utils/viewUpdateHelper.ts"],"sourcesContent":["/**\n * Shared helper for updating view settings with optimistic local state management.\n *\n * Sequential updateViewSettings calls in the same event tick MUST chain correctly:\n * the second call has to see the first call's changes. Closure-captured\n * `viewSettings` does not refresh between sync calls (no re-render yet), so we\n * read the latest settings from the RTK Query cache at call time instead.\n * RTK's updateView mutation performs an optimistic cache write in\n * `onQueryStarted`, so the cache is already up-to-date by the time the next\n * call reads it.\n */\n\nimport {\n EntityIdResponse,\n useCreateViewMutation,\n useUpdateViewMutation,\n viewsQueries,\n} from '@shared/api'\nimport { generateWorkingView } from './generateWorkingView'\nimport { toast } from 'react-toastify'\nimport { SetStateAction, useCallback, useRef, useState } from 'react'\nimport { useStore } from 'react-redux'\nimport { useViewsContext, ViewsContextValue } from '../context/ViewsContext'\n\ninterface UpdateOptions {\n successMessage?: string\n errorMessage?: string\n}\n\n// Module-level flag shared across every useViewUpdateHelper instance. Set true\n// when a mutation has been dispatched in the current tick (RTK cache is now\n// optimistically fresh); reset on the next microtask. Must be module-level so\n// that two different hook instances (e.g. ProjectOverviewDataProvider +\n// ProjectOverviewContext) coordinate correctly when writes flow through one\n// and subsequent reads come from the other in the same event tick.\nlet cacheDirtyThisTick = false\nconst markCacheDirty = () => {\n if (cacheDirtyThisTick) return\n cacheDirtyThisTick = true\n queueMicrotask(() => {\n cacheDirtyThisTick = false\n })\n}\n\nexport type UpdateViewSettingsFn = (\n updatedSettings: any,\n localStateSetter: (value: any) => void,\n newLocalValue: any,\n options: UpdateOptions,\n) => Promise<void>\n\nexport interface LatestSettingsResult {\n settings?: any\n workingViewId?: string\n}\n\nexport const updateViewSettings = async (\n updatedSettings: any,\n localStateSetter: (value: any) => void,\n newLocalValue: any,\n options: UpdateOptions = {},\n viewContext: ViewsContextValue,\n onApplyViewChanges: (arg: any, viewId?: string) => Promise<EntityIdResponse | void>,\n // Reads latest effective settings from RTK Query cache at call time. Required to\n // prevent stale-closure races when two updates fire in the same tick.\n getLatest: () => LatestSettingsResult,\n // Invoked synchronously right after the mutation is dispatched. The caller\n // uses this to flip a \"cache is fresh this tick\" flag so subsequent sync\n // calls in the same tick read the just-updated cache instead of stale state.\n markCacheDirty: () => void,\n): Promise<void> => {\n const {\n viewSettings,\n viewType,\n projectName,\n selectedView,\n setSelectedView,\n workingView,\n onSettingsChanged,\n isErrorWorkingView,\n } = viewContext\n\n if (!viewType) throw new Error('No view type provided for updating view settings')\n\n const previousSelectedViewId = selectedView?.id\n const wasWorking = selectedView?.working\n\n try {\n // Immediately update local state for fast UI response\n localStateSetter(newLocalValue)\n\n // Read latest settings from RTK cache (includes prior same-tick optimistic writes).\n // Fallback to closure-captured value if cache has nothing (first render, etc.).\n const { settings: latestSettingsFromCache, workingViewId: latestWorkingViewIdFromCache } =\n getLatest()\n const latestSettings = latestSettingsFromCache ?? viewSettings\n\n // If we have no settings baseline at all (neither from cache nor from context), AND there is no error\n // abort to prevent writing a partial payload that would overwrite saved settings.\n // This is a defence-in-depth guard; in normal flow isLoadingViews prevents callers\n // from triggering updates before data is available.\n if (latestSettings === undefined && !isErrorWorkingView) {\n console.warn(\n 'updateViewSettings: no settings baseline available, aborting to prevent data loss.',\n )\n return\n }\n\n // Create settings with updates\n const newSettings = { ...latestSettings, ...updatedSettings }\n\n // always update the working view no matter what\n const newWorkingView = generateWorkingView(newSettings)\n\n // Ensure the payload uses the consistent ID if we already have a working view\n const viewId = latestWorkingViewIdFromCache ?? workingView?.id\n if (viewId) {\n newWorkingView.id = viewId\n }\n const newWorkingViewId = newWorkingView.id\n\n // Make API call in background\n // only include the fields that are updating (just settings)\n const payload = viewId ? { settings: newSettings } : newWorkingView\n\n const promise = onApplyViewChanges(\n {\n payload,\n viewType: viewType,\n projectName: projectName,\n },\n viewId,\n )\n\n // Mutation dispatch above ran onQueryStarted synchronously → RTK cache now\n // reflects `newSettings`. Signal this so any subsequent sync call in the\n // same tick reads the fresh cache instead of the stale closure baseline.\n markCacheDirty()\n\n // if not already on the working view: set that the settings have been changed to show the little blue save button and switch to the working view\n // Note: selectedView?.id is always a real UUID from the server, never the WORKING_VIEW_ID sentinel.\n if (!wasWorking || selectedView?.id !== viewId) {\n if (selectedView) {\n onSettingsChanged(true)\n }\n setSelectedView(newWorkingViewId as string)\n }\n\n await promise\n\n // Clear local state after successful API call - the server data will take over\n localStateSetter(null)\n\n if (options.successMessage) {\n toast.success(options.successMessage)\n }\n } catch (error) {\n // Revert local state on error\n localStateSetter(null)\n\n if (previousSelectedViewId) {\n setSelectedView(previousSelectedViewId)\n }\n\n if (selectedView && !wasWorking) {\n onSettingsChanged(false)\n }\n\n console.error(error)\n const errorMsg = options.errorMessage || `Failed to update view settings: ${error}`\n toast.error(errorMsg)\n }\n}\n\nexport const useViewUpdateHelper = () => {\n const [createView] = useCreateViewMutation()\n const [updateView] = useUpdateViewMutation()\n\n const viewContext = useViewsContext()\n const store = useStore()\n\n const onApplyViewChanges = useCallback(\n async (arg: any, viewId?: string) => {\n if (viewId) {\n // Filter the payload to only include valid patch fields\n // and ideally only include fields that are actually being updated.\n // Expecting the caller to provide only the fields they want to update in the payload.\n const patchPayload: any = {}\n const patchFields = ['label', 'owner', 'settings']\n patchFields.forEach((key) => {\n if (arg.payload[key] !== undefined) {\n patchPayload[key] = arg.payload[key]\n }\n })\n\n return await updateView({\n viewType: arg.viewType,\n projectName: arg.projectName,\n viewId,\n payload: patchPayload,\n }).unwrap()\n } else {\n return await createView(arg).unwrap()\n }\n },\n [createView, updateView],\n )\n\n // Returns cached settings when a same-tick prior write has refreshed the\n // cache. Otherwise returns undefined and the caller falls back to the\n // closure-captured viewSettings (correct baseline for the first write in a\n // tick, including the named-view → working-view fork).\n const getLatest = useCallback((): LatestSettingsResult => {\n const { viewType, projectName, selectedView, workingView } = viewContext\n if (!viewType) return {}\n\n const state = store.getState() as any\n\n // 1. Get the working view from the store — most authoritative after optimistic writes.\n const workingViewEntry = viewsQueries.endpoints.getWorkingView.select({\n viewType,\n projectName,\n })(state)\n const storeWorkingViewId = workingViewEntry?.data?.id\n // Prefer the store's working view ID over the potentially stale context closure value.\n const resolvedWorkingViewId = storeWorkingViewId || workingView?.id\n\n // 2. Determine the currently targeted view ID.\n // Use the store's getDefaultView cache (updated optimistically by setSelectedView) so that\n // an in-flight selection change is visible before React re-renders the context.\n const defaultViewEntry = viewsQueries.endpoints.getDefaultView.select({\n viewType,\n projectName,\n })(state)\n const targetViewId = defaultViewEntry?.data?.id || selectedView?.id\n\n // 3. Determine if the working view is active.\n // IMPORTANT: use !!resolvedWorkingViewId to avoid the undefined === undefined false-positive\n // that would occur on a new project before any working view exists.\n // Note: WORKING_VIEW_ID ('_working_') is a UI-only sentinel; it never appears in\n // server-side cache IDs, so there is no point checking for it here.\n const isWorkingViewActive =\n (!!resolvedWorkingViewId && targetViewId === resolvedWorkingViewId) || cacheDirtyThisTick\n\n // 4. If the working view is active, use its cache as the baseline to prevent stale merges.\n if (isWorkingViewActive && workingViewEntry?.data?.settings) {\n return {\n settings: workingViewEntry.data.settings,\n workingViewId: resolvedWorkingViewId,\n }\n }\n\n // 5. For named views: use the defaultView cache settings as the baseline.\n // This is populated by the initial useGetDefaultViewQuery fetch and is more reliable\n // than the getView endpoint cache (which is only fetched on-demand when editing).\n if (defaultViewEntry?.data?.settings) {\n return {\n settings: defaultViewEntry.data.settings,\n workingViewId: resolvedWorkingViewId,\n }\n }\n\n return { workingViewId: resolvedWorkingViewId }\n }, [store, viewContext])\n\n const updateViewSettingsHandler = useCallback<UpdateViewSettingsFn>(\n async (...args) =>\n await updateViewSettings(...args, viewContext, onApplyViewChanges, getLatest, markCacheDirty),\n [viewContext, onApplyViewChanges, getLatest],\n )\n\n return {\n updateViewSettings: updateViewSettingsHandler,\n onCreateView: onApplyViewChanges,\n getLatestSettings: getLatest,\n markCacheDirty,\n }\n}\n\ntype SettingsObject = Record<string, any>\n\nexport type PathKeys<T> = T extends SettingsObject\n ? {\n [K in keyof T & string]: NonNullable<T[K]> extends readonly any[]\n ? K\n : NonNullable<T[K]> extends SettingsObject\n ? K | `${K}.${PathKeys<NonNullable<T[K]>>}`\n : K\n }[keyof T & string]\n : never\n\nexport type PathValue<T, P extends string> = P extends `${infer K}.${infer Rest}`\n ? K extends keyof T\n ? PathValue<NonNullable<T[K]>, Rest>\n : never\n : P extends keyof T\n ? T[P]\n : never\n\nconst getNestedValue = <T extends SettingsObject, P extends PathKeys<T>>(\n settings: T | undefined,\n path: P,\n): PathValue<T, P> | undefined => {\n return path.split('.').reduce<any>((value, key) => value?.[key], settings)\n}\n\nconst setNestedValue = <T extends SettingsObject>(settings: T, path: string, value: any): T => {\n const [key, ...rest] = path.split('.')\n\n if (!key) return settings\n\n return {\n ...settings,\n [key]: rest.length\n ? setNestedValue((settings[key] as SettingsObject) || {}, rest.join('.'), value)\n : value,\n }\n}\n\nexport const useViewsState = <\n Settings extends SettingsObject = SettingsObject,\n P extends PathKeys<Settings> = PathKeys<Settings>,\n>(\n path: P,\n defaultValue?: PathValue<Settings, P>,\n): [\n PathValue<Settings, P> | undefined,\n (value: SetStateAction<PathValue<Settings, P>>) => void,\n] => {\n const { viewSettings, isLoadingViews } = useViewsContext()\n const { updateViewSettings, getLatestSettings } = useViewUpdateHelper()\n const [localValue, setLocalValueState] = useState<PathValue<Settings, P> | null>(null)\n const localValueRef = useRef<PathValue<Settings, P> | null>(null)\n\n const settings = viewSettings as Settings | undefined\n const value = localValue !== null ? localValue : getNestedValue(settings, path) ?? defaultValue\n\n const setLocalValue = useCallback((newValue: PathValue<Settings, P> | null) => {\n localValueRef.current = newValue\n setLocalValueState(newValue)\n }, [])\n\n const setValue = useCallback(\n (nextValue: SetStateAction<PathValue<Settings, P>>) => {\n if (isLoadingViews || !settings) return\n\n const latestSettings = (getLatestSettings().settings as Settings | undefined) ?? settings\n const currentValue =\n localValueRef.current !== null\n ? localValueRef.current\n : getNestedValue(latestSettings, path) ?? defaultValue\n const resolvedValue =\n typeof nextValue === 'function'\n ? (nextValue as (value: PathValue<Settings, P>) => PathValue<Settings, P>)(\n currentValue as PathValue<Settings, P>,\n )\n : nextValue\n\n void updateViewSettings(\n setNestedValue(latestSettings, path, resolvedValue),\n setLocalValue,\n resolvedValue,\n {},\n )\n },\n [\n defaultValue,\n getLatestSettings,\n isLoadingViews,\n path,\n settings,\n setLocalValue,\n updateViewSettings,\n ],\n )\n\n return [value, setValue]\n}\n"],"names":["cacheDirtyThisTick","markCacheDirty","updateViewSettings","updatedSettings","localStateSetter","newLocalValue","options","viewContext","onApplyViewChanges","getLatest","viewSettings","viewType","projectName","selectedView","setSelectedView","workingView","onSettingsChanged","isErrorWorkingView","previousSelectedViewId","wasWorking","latestSettingsFromCache","latestWorkingViewIdFromCache","latestSettings","newSettings","newWorkingView","generateWorkingView","viewId","newWorkingViewId","promise","toast","error","errorMsg","useViewUpdateHelper","createView","useCreateViewMutation","updateView","useUpdateViewMutation","useViewsContext","store","useStore","useCallback","arg","patchPayload","key","state","workingViewEntry","viewsQueries","resolvedWorkingViewId","defaultViewEntry","targetViewId","args","getNestedValue","settings","path","value","setNestedValue","rest","useViewsState","defaultValue","isLoadingViews","getLatestSettings","localValue","setLocalValueState","useState","localValueRef","useRef","setLocalValue","newValue","setValue","nextValue","currentValue","resolvedValue"],"mappings":"slLAmCA,IAAIA,EAAqB,GACzB,MAAMC,EAAiB,IAAM,CACvBD,IACJA,EAAqB,GACrB,eAAe,IAAM,CACnBA,EAAqB,EACvB,CAAC,EACH,EAcaE,EAAqB,MAChCC,EACAC,EACAC,EACAC,EAAyB,CAAA,EACzBC,EACAC,EAGAC,EAIAR,IACkB,CAClB,KAAM,CACJ,aAAAS,EACA,SAAAC,EACA,YAAAC,EACA,aAAAC,EACA,gBAAAC,EACA,YAAAC,EACA,kBAAAC,EACA,mBAAAC,CAAA,EACEV,EAEJ,GAAI,CAACI,EAAU,MAAM,IAAI,MAAM,kDAAkD,EAEjF,MAAMO,EAAyBL,GAAc,GACvCM,EAAaN,GAAc,QAEjC,GAAI,CAEFT,EAAiBC,CAAa,EAI9B,KAAM,CAAE,SAAUe,EAAyB,cAAeC,CAAA,EACxDZ,EAAA,EACIa,EAAiBF,GAA2BV,EAMlD,GAAIY,IAAmB,QAAa,CAACL,EAAoB,CACvD,QAAQ,KACN,oFAAA,EAEF,MACF,CAGA,MAAMM,EAAc,CAAE,GAAGD,EAAgB,GAAGnB,CAAA,EAGtCqB,EAAiBC,EAAAA,oBAAoBF,CAAW,EAGhDG,EAASL,GAAgCN,GAAa,GACxDW,IACFF,EAAe,GAAKE,GAEtB,MAAMC,EAAmBH,EAAe,GAMlCI,EAAUpB,EACd,CACE,QAJYkB,EAAS,CAAE,SAAUH,GAAgBC,EAKjD,SAAAb,EACA,YAAAC,CAAA,EAEFc,CAAA,EAMFzB,EAAAA,GAII,CAACkB,GAAcN,GAAc,KAAOa,KAClCb,GACFG,EAAkB,EAAI,EAExBF,EAAgBa,CAA0B,GAG5C,MAAMC,EAGNxB,EAAiB,IAAI,EAEjBE,EAAQ,gBACVuB,QAAM,QAAQvB,EAAQ,cAAc,CAExC,OAASwB,EAAO,CAEd1B,EAAiB,IAAI,EAEjBc,GACFJ,EAAgBI,CAAsB,EAGpCL,GAAgB,CAACM,GACnBH,EAAkB,EAAK,EAGzB,QAAQ,MAAMc,CAAK,EACnB,MAAMC,EAAWzB,EAAQ,cAAgB,mCAAmCwB,CAAK,GACjFD,EAAAA,MAAM,MAAME,CAAQ,CACtB,CACF,EAEaC,EAAsB,IAAM,CACvC,KAAM,CAACC,CAAU,EAAIC,wBAAA,EACf,CAACC,CAAU,EAAIC,wBAAA,EAEf7B,EAAc8B,EAAAA,gBAAA,EACdC,EAAQC,EAAAA,SAAA,EAER/B,EAAqBgC,EAAAA,YACzB,MAAOC,EAAUf,IAAoB,CACnC,GAAIA,EAAQ,CAIV,MAAMgB,EAAoB,CAAA,EAE1B,MADoB,CAAC,QAAS,QAAS,UAAU,EACrC,QAASC,GAAQ,CACvBF,EAAI,QAAQE,CAAG,IAAM,SACvBD,EAAaC,CAAG,EAAIF,EAAI,QAAQE,CAAG,EAEvC,CAAC,EAEM,MAAMR,EAAW,CACtB,SAAUM,EAAI,SACd,YAAaA,EAAI,YACjB,OAAAf,EACA,QAASgB,CAAA,CACV,EAAE,OAAA,CACL,KACE,QAAO,MAAMT,EAAWQ,CAAG,EAAE,OAAA,CAEjC,EACA,CAACR,EAAYE,CAAU,CAAA,EAOnB1B,EAAY+B,EAAAA,YAAY,IAA4B,CACxD,KAAM,CAAE,SAAA7B,EAAU,YAAAC,EAAa,aAAAC,EAAc,YAAAE,GAAgBR,EAC7D,GAAI,CAACI,EAAU,MAAO,CAAA,EAEtB,MAAMiC,EAAQN,EAAM,SAAA,EAGdO,EAAmBC,EAAAA,aAAa,UAAU,eAAe,OAAO,CACpE,SAAAnC,EACA,YAAAC,CAAA,CACD,EAAEgC,CAAK,EAGFG,EAFqBF,GAAkB,MAAM,IAEC9B,GAAa,GAK3DiC,EAAmBF,EAAAA,aAAa,UAAU,eAAe,OAAO,CACpE,SAAAnC,EACA,YAAAC,CAAA,CACD,EAAEgC,CAAK,EACFK,EAAeD,GAAkB,MAAM,IAAMnC,GAAc,GAWjE,OAHG,CAAC,CAACkC,GAAyBE,IAAiBF,GAA0B/C,IAG9C6C,GAAkB,MAAM,SAC1C,CACL,SAAUA,EAAiB,KAAK,SAChC,cAAeE,CAAA,EAOfC,GAAkB,MAAM,SACnB,CACL,SAAUA,EAAiB,KAAK,SAChC,cAAeD,CAAA,EAIZ,CAAE,cAAeA,CAAA,CAC1B,EAAG,CAACT,EAAO/B,CAAW,CAAC,EAQvB,MAAO,CACL,mBAPgCiC,EAAAA,YAChC,SAAUU,IACR,MAAMhD,EAAmB,GAAGgD,EAAM3C,EAAaC,EAAoBC,EAAWR,CAAc,EAC9F,CAACM,EAAaC,EAAoBC,CAAS,CAAA,EAK3C,aAAcD,EACd,kBAAmBC,EACnB,eAAAR,CAAA,CAEJ,EAsBMkD,EAAiB,CACrBC,EACAC,IAEOA,EAAK,MAAM,GAAG,EAAE,OAAY,CAACC,EAAOX,IAAQW,IAAQX,CAAG,EAAGS,CAAQ,EAGrEG,EAAiB,CAA2BH,EAAaC,EAAcC,IAAkB,CAC7F,KAAM,CAACX,EAAK,GAAGa,CAAI,EAAIH,EAAK,MAAM,GAAG,EAErC,OAAKV,EAEE,CACL,GAAGS,EACH,CAACT,CAAG,EAAGa,EAAK,OACRD,EAAgBH,EAAST,CAAG,GAAwB,CAAA,EAAIa,EAAK,KAAK,GAAG,EAAGF,CAAK,EAC7EA,CAAA,EANWF,CAQnB,EAEaK,EAAgB,CAI3BJ,EACAK,IAIG,CACH,KAAM,CAAE,aAAAhD,EAAc,eAAAiD,CAAA,EAAmBtB,kBAAA,EACnC,CAAE,mBAAAnC,EAAoB,kBAAA0D,CAAA,EAAsB5B,EAAA,EAC5C,CAAC6B,EAAYC,CAAkB,EAAIC,EAAAA,SAAwC,IAAI,EAC/EC,EAAgBC,EAAAA,OAAsC,IAAI,EAE1Db,EAAW1C,EACX4C,EAAQO,IAAe,KAAOA,EAAaV,EAAeC,EAAUC,CAAI,GAAKK,EAE7EQ,EAAgB1B,cAAa2B,GAA4C,CAC7EH,EAAc,QAAUG,EACxBL,EAAmBK,CAAQ,CAC7B,EAAG,CAAA,CAAE,EAECC,EAAW5B,EAAAA,YACd6B,GAAsD,CACrD,GAAIV,GAAkB,CAACP,EAAU,OAEjC,MAAM9B,EAAkBsC,IAAoB,UAAqCR,EAC3EkB,EACJN,EAAc,UAAY,KACtBA,EAAc,QACdb,EAAe7B,EAAgB+B,CAAI,GAAKK,EACxCa,EACJ,OAAOF,GAAc,WAChBA,EACCC,CAAA,EAEFD,EAEDnE,EACHqD,EAAejC,EAAgB+B,EAAMkB,CAAa,EAClDL,EACAK,EACA,CAAA,CAAC,CAEL,EACA,CACEb,EACAE,EACAD,EACAN,EACAD,EACAc,EACAhE,CAAA,CACF,EAGF,MAAO,CAACoD,EAAOc,CAAQ,CACzB"}
|