@mgarlik/datastore 0.1.1 → 0.1.2
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/index.cjs +939 -936
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +30 -3
- package/dist/index.d.ts +30 -3
- package/dist/index.js +950 -937
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -3,7 +3,17 @@ import {
|
|
|
3
3
|
} from "./chunk-7XDRKNJQ.js";
|
|
4
4
|
|
|
5
5
|
// src/DataStoreProvider.tsx
|
|
6
|
-
import {
|
|
6
|
+
import {
|
|
7
|
+
createContext,
|
|
8
|
+
forwardRef,
|
|
9
|
+
useCallback,
|
|
10
|
+
useContext,
|
|
11
|
+
useEffect,
|
|
12
|
+
useImperativeHandle,
|
|
13
|
+
useMemo,
|
|
14
|
+
useRef,
|
|
15
|
+
useState
|
|
16
|
+
} from "react";
|
|
7
17
|
|
|
8
18
|
// src/handleSocketMessage.ts
|
|
9
19
|
var handleSocketMessage = (model, msg, dataProvider) => {
|
|
@@ -878,1018 +888,1021 @@ var resolveLocale = () => {
|
|
|
878
888
|
}
|
|
879
889
|
return void 0;
|
|
880
890
|
};
|
|
881
|
-
var DataStoreProvider = (
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
891
|
+
var DataStoreProvider = forwardRef(
|
|
892
|
+
({ socketServer, restServer, usePersistentStorage = true, locale, storage = null, ...props }, ref) => {
|
|
893
|
+
const [isLive, setIsLive] = useState(false);
|
|
894
|
+
const [isSynchronizing, setIsSynchronizing] = useState(true);
|
|
895
|
+
const [sockets, setSockets] = useState({});
|
|
896
|
+
const [providers, setProviders] = useState({});
|
|
897
|
+
const [documents, setDocuments] = useState({});
|
|
898
|
+
const externalProvidersRef = useRef({});
|
|
899
|
+
const externalDocumentsRef = useRef({});
|
|
900
|
+
const providerSubscribersRef = useRef(/* @__PURE__ */ new Map());
|
|
901
|
+
const previousProviderUpdateIdsRef = useRef({});
|
|
902
|
+
const [dispatcher, setDispatcher] = useState({ isBussy: false, actions: [] });
|
|
903
|
+
const [counterProviders, setCounterProviders] = useState({});
|
|
904
|
+
const [counterDocuments, setCounterDocuments] = useState({});
|
|
905
|
+
const didInitialLiveSyncRef = useRef(false);
|
|
906
|
+
const persistenceStorage = useMemo(
|
|
907
|
+
() => usePersistentStorage ? storage : null,
|
|
908
|
+
[storage, usePersistentStorage]
|
|
909
|
+
);
|
|
910
|
+
useEffect(() => {
|
|
911
|
+
if (!restServer) return;
|
|
912
|
+
const resolvedLocale = locale || resolveLocale();
|
|
913
|
+
axios2.defaults.baseURL = restServer;
|
|
914
|
+
if (resolvedLocale) {
|
|
915
|
+
axios2.defaults.headers.common["Accept-Language"] = resolvedLocale;
|
|
916
|
+
}
|
|
917
|
+
systemLog("dsp", "[INIT] Axios baseURL:", restServer);
|
|
918
|
+
async function checkServer() {
|
|
919
|
+
try {
|
|
920
|
+
const response = await axios2.head("/", {
|
|
921
|
+
timeout: 7e3,
|
|
922
|
+
validateStatus: () => true
|
|
923
|
+
});
|
|
924
|
+
systemLog("dsp", "[INIT] Axios Success, status:", response.status);
|
|
925
|
+
} catch (e) {
|
|
926
|
+
if (axios2.isAxiosError(e)) {
|
|
927
|
+
systemLog("dsp", "[INIT] Axios Error:", e.code ?? "UNKNOWN", e.message);
|
|
928
|
+
} else {
|
|
929
|
+
systemLog("dsp", "[INIT] Axios Error:", String(e));
|
|
930
|
+
}
|
|
931
|
+
} finally {
|
|
932
|
+
systemLog("dsp", "[INIT] Axios check done");
|
|
919
933
|
}
|
|
920
|
-
} finally {
|
|
921
|
-
systemLog("dsp", "[INIT] Axios check done");
|
|
922
934
|
}
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
systemLog("dsp", "[INIT] Persistence is enabled but no storage adapter was provided.");
|
|
929
|
-
}
|
|
930
|
-
}, [persistenceStorage, storage, usePersistentStorage]);
|
|
931
|
-
const socketRoomHandlersRef = useRef({});
|
|
932
|
-
const socketActionHandlersRef = useRef({});
|
|
933
|
-
systemLog("dsp", "START");
|
|
934
|
-
const socket = useMemo(() => ioSockets(socketServer?.url, socketServer?.params), [socketServer?.url, socketServer.params]);
|
|
935
|
-
const handleSocketConnect = useCallback(() => setIsLive(true), []);
|
|
936
|
-
const handleSocketDisconnect = useCallback(() => setIsLive(false), []);
|
|
937
|
-
const getSocketAuthToken = useCallback(() => {
|
|
938
|
-
const authorizationHeader = axios2.defaults.headers.common["Authorization"];
|
|
939
|
-
if (typeof authorizationHeader === "string" && authorizationHeader.length > 0) {
|
|
940
|
-
return authorizationHeader.startsWith("Bearer ") ? authorizationHeader : `Bearer ${authorizationHeader}`;
|
|
941
|
-
}
|
|
942
|
-
return "Bearer ";
|
|
943
|
-
}, []);
|
|
944
|
-
const subscribeToProvider = useCallback((providerId, callback) => {
|
|
945
|
-
const subscribersByProvider = providerSubscribersRef.current;
|
|
946
|
-
const providerSubscribers = subscribersByProvider.get(providerId) || /* @__PURE__ */ new Set();
|
|
947
|
-
providerSubscribers.add(callback);
|
|
948
|
-
subscribersByProvider.set(providerId, providerSubscribers);
|
|
949
|
-
return () => {
|
|
950
|
-
const activeSubscribers = subscribersByProvider.get(providerId);
|
|
951
|
-
if (!activeSubscribers) return;
|
|
952
|
-
activeSubscribers.delete(callback);
|
|
953
|
-
if (activeSubscribers.size === 0) subscribersByProvider.delete(providerId);
|
|
954
|
-
};
|
|
955
|
-
}, []);
|
|
956
|
-
const getProviderLastUpdate = useCallback((providerId) => {
|
|
957
|
-
return externalProvidersRef.current?.[providerId]?.lastUpdate?.id ?? null;
|
|
958
|
-
}, []);
|
|
959
|
-
const getExternalDocuments = useCallback(() => externalDocumentsRef.current, []);
|
|
960
|
-
const getExternalProviders = useCallback(() => externalProvidersRef.current, []);
|
|
961
|
-
useEffect(() => {
|
|
962
|
-
externalProvidersRef.current = providers;
|
|
963
|
-
const currentUpdateIds = {};
|
|
964
|
-
Object.keys(providers).forEach((providerId) => {
|
|
965
|
-
currentUpdateIds[providerId] = providers[providerId]?.lastUpdate?.id ?? null;
|
|
966
|
-
if (previousProviderUpdateIdsRef.current[providerId] !== currentUpdateIds[providerId]) {
|
|
967
|
-
const subscribers = providerSubscribersRef.current.get(providerId);
|
|
968
|
-
subscribers?.forEach((callback) => callback());
|
|
935
|
+
checkServer();
|
|
936
|
+
}, [locale, restServer]);
|
|
937
|
+
useEffect(() => {
|
|
938
|
+
if (usePersistentStorage && !storage) {
|
|
939
|
+
systemLog("dsp", "[INIT] Persistence is enabled but no storage adapter was provided.");
|
|
969
940
|
}
|
|
970
|
-
});
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
941
|
+
}, [persistenceStorage, storage, usePersistentStorage]);
|
|
942
|
+
const socketRoomHandlersRef = useRef({});
|
|
943
|
+
const socketActionHandlersRef = useRef({});
|
|
944
|
+
systemLog("dsp", "START");
|
|
945
|
+
const socket = useMemo(() => ioSockets(socketServer?.url, socketServer?.params), [socketServer?.url, socketServer.params]);
|
|
946
|
+
const handleSocketConnect = useCallback(() => setIsLive(true), []);
|
|
947
|
+
const handleSocketDisconnect = useCallback(() => setIsLive(false), []);
|
|
948
|
+
const getSocketAuthToken = useCallback(() => {
|
|
949
|
+
const authorizationHeader = axios2.defaults.headers.common["Authorization"];
|
|
950
|
+
if (typeof authorizationHeader === "string" && authorizationHeader.length > 0) {
|
|
951
|
+
return authorizationHeader.startsWith("Bearer ") ? authorizationHeader : `Bearer ${authorizationHeader}`;
|
|
975
952
|
}
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
953
|
+
return "Bearer ";
|
|
954
|
+
}, []);
|
|
955
|
+
const subscribeToProvider = useCallback((providerId, callback) => {
|
|
956
|
+
const subscribersByProvider = providerSubscribersRef.current;
|
|
957
|
+
const providerSubscribers = subscribersByProvider.get(providerId) || /* @__PURE__ */ new Set();
|
|
958
|
+
providerSubscribers.add(callback);
|
|
959
|
+
subscribersByProvider.set(providerId, providerSubscribers);
|
|
960
|
+
return () => {
|
|
961
|
+
const activeSubscribers = subscribersByProvider.get(providerId);
|
|
962
|
+
if (!activeSubscribers) return;
|
|
963
|
+
activeSubscribers.delete(callback);
|
|
964
|
+
if (activeSubscribers.size === 0) subscribersByProvider.delete(providerId);
|
|
965
|
+
};
|
|
966
|
+
}, []);
|
|
967
|
+
const getProviderLastUpdate = useCallback((providerId) => {
|
|
968
|
+
return externalProvidersRef.current?.[providerId]?.lastUpdate?.id ?? null;
|
|
969
|
+
}, []);
|
|
970
|
+
const getExternalDocuments = useCallback(() => externalDocumentsRef.current, []);
|
|
971
|
+
const getExternalProviders = useCallback(() => externalProvidersRef.current, []);
|
|
972
|
+
useEffect(() => {
|
|
973
|
+
externalProvidersRef.current = providers;
|
|
974
|
+
const currentUpdateIds = {};
|
|
975
|
+
Object.keys(providers).forEach((providerId) => {
|
|
976
|
+
currentUpdateIds[providerId] = providers[providerId]?.lastUpdate?.id ?? null;
|
|
977
|
+
if (previousProviderUpdateIdsRef.current[providerId] !== currentUpdateIds[providerId]) {
|
|
978
|
+
const subscribers = providerSubscribersRef.current.get(providerId);
|
|
979
|
+
subscribers?.forEach((callback) => callback());
|
|
980
|
+
}
|
|
981
|
+
});
|
|
982
|
+
Object.keys(previousProviderUpdateIdsRef.current).forEach((providerId) => {
|
|
983
|
+
if (!(providerId in currentUpdateIds)) {
|
|
984
|
+
const subscribers = providerSubscribersRef.current.get(providerId);
|
|
985
|
+
subscribers?.forEach((callback) => callback());
|
|
986
|
+
}
|
|
987
|
+
});
|
|
988
|
+
previousProviderUpdateIdsRef.current = currentUpdateIds;
|
|
989
|
+
}, [providers]);
|
|
990
|
+
useEffect(() => {
|
|
991
|
+
externalDocumentsRef.current = documents;
|
|
992
|
+
}, [documents]);
|
|
993
|
+
const persistDocument = useCallback(
|
|
994
|
+
async ({
|
|
991
995
|
documentId,
|
|
992
|
-
JSON.stringify(data),
|
|
993
996
|
model,
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
997
|
+
data,
|
|
998
|
+
lastUpdate = (/* @__PURE__ */ new Date()).toISOString()
|
|
999
|
+
}) => {
|
|
1000
|
+
if (!persistenceStorage) return;
|
|
1001
|
+
await persistenceStorage.query("INSERT OR REPLACE INTO documents (id, data, model, lastUpdate) VALUES (?, ?, ?, ?)", [
|
|
1002
|
+
documentId,
|
|
1003
|
+
JSON.stringify(data),
|
|
1004
|
+
model,
|
|
1005
|
+
lastUpdate
|
|
1006
|
+
]);
|
|
1007
|
+
},
|
|
1008
|
+
[persistenceStorage]
|
|
1009
|
+
);
|
|
1010
|
+
const removePersistedDocument = useCallback(
|
|
1011
|
+
async (documentId) => {
|
|
1012
|
+
if (!persistenceStorage) return;
|
|
1013
|
+
await persistenceStorage.query("DELETE FROM documents WHERE id = ?", [documentId]);
|
|
1014
|
+
},
|
|
1015
|
+
[persistenceStorage]
|
|
1016
|
+
);
|
|
1017
|
+
const synchronizeDataStore = useCallback(async () => {
|
|
1018
|
+
setIsSynchronizing(true);
|
|
1019
|
+
const stats = { processed: 0, updated: 0, failed: 0 };
|
|
1020
|
+
try {
|
|
1021
|
+
for (const key of Object.keys(providers)) {
|
|
1022
|
+
stats.processed++;
|
|
1023
|
+
try {
|
|
1024
|
+
const { data, lastUpdate, ...rest } = providers[key];
|
|
1025
|
+
const response = await getData({
|
|
1026
|
+
id: key,
|
|
1027
|
+
...rest,
|
|
1028
|
+
changeTime: lastUpdate.time
|
|
1024
1029
|
});
|
|
1025
|
-
|
|
1026
|
-
|
|
1030
|
+
if (response.length > 0) {
|
|
1031
|
+
const updateData = {};
|
|
1032
|
+
response.forEach((item) => {
|
|
1033
|
+
const { id, ...d } = item;
|
|
1034
|
+
updateData[id] = d;
|
|
1035
|
+
});
|
|
1036
|
+
await updateDocuments({ model: key, documents: updateData, mode: "replace" });
|
|
1037
|
+
stats.updated++;
|
|
1038
|
+
}
|
|
1039
|
+
} catch (e) {
|
|
1040
|
+
stats.failed++;
|
|
1041
|
+
console.error("[DSP] synchronizeDataStore provider error:", key, e);
|
|
1027
1042
|
}
|
|
1028
|
-
} catch (e) {
|
|
1029
|
-
stats.failed++;
|
|
1030
|
-
console.error("[DSP] synchronizeDataStore provider error:", key, e);
|
|
1031
1043
|
}
|
|
1044
|
+
} finally {
|
|
1045
|
+
setIsSynchronizing(false);
|
|
1046
|
+
systemLog("dsp", "[synchronizeDataStore] Hotovo:", stats);
|
|
1032
1047
|
}
|
|
1033
|
-
}
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
synchronizeDataStore();
|
|
1048
|
+
}, [providers]);
|
|
1049
|
+
useEffect(() => {
|
|
1050
|
+
if (isLive) {
|
|
1051
|
+
systemLog("dsp", "useEffect[isLive] Sockets: ", JSON.stringify(sockets, null, 2));
|
|
1052
|
+
const ss = Object.keys(sockets);
|
|
1053
|
+
systemLog("dsp", "useEffect[isLive] registruji", ss);
|
|
1054
|
+
if (ss?.length > 0) socket.emit("joinRooms", JSON.stringify(ss));
|
|
1055
|
+
if (!didInitialLiveSyncRef.current) {
|
|
1056
|
+
didInitialLiveSyncRef.current = true;
|
|
1057
|
+
systemLog("dsp", "useEffect[isLive] Zacinam synchronizovat");
|
|
1058
|
+
synchronizeDataStore();
|
|
1059
|
+
}
|
|
1060
|
+
} else {
|
|
1061
|
+
didInitialLiveSyncRef.current = false;
|
|
1048
1062
|
}
|
|
1049
|
-
}
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
};
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
console.time("[DSP] resetDataStore");
|
|
1077
|
-
if (persistenceStorage?.emptyTable) {
|
|
1078
|
-
await persistenceStorage.emptyTable("documents");
|
|
1079
|
-
}
|
|
1080
|
-
setSockets({});
|
|
1081
|
-
setProviders({});
|
|
1082
|
-
setDocuments({});
|
|
1083
|
-
setCounterProviders({});
|
|
1084
|
-
setCounterDocuments({});
|
|
1085
|
-
console.timeEnd("[DSP] resetDataStore");
|
|
1086
|
-
}, [persistenceStorage]);
|
|
1087
|
-
const resetProvider = useCallback(
|
|
1088
|
-
async (provider) => {
|
|
1089
|
-
if (!persistenceStorage) return;
|
|
1090
|
-
await persistenceStorage.query(`DELETE FROM documents WHERE model='${provider}'`);
|
|
1091
|
-
},
|
|
1092
|
-
[persistenceStorage]
|
|
1093
|
-
);
|
|
1094
|
-
const initProvider = useCallback(
|
|
1095
|
-
async (id, data) => {
|
|
1096
|
-
const providerPreset = presetProviders[id];
|
|
1097
|
-
const prov = renderJSONTemplate({ ...providerPreset || {}, id }, data);
|
|
1098
|
-
systemLog("dsp", "[INIT PROVIDER] ", id, "(", data || "", ")");
|
|
1099
|
-
if (typeof prov !== "boolean") {
|
|
1100
|
-
return await registerProvider(prov);
|
|
1063
|
+
}, [isLive, socket, sockets, synchronizeDataStore]);
|
|
1064
|
+
const presetProviders = props.providers;
|
|
1065
|
+
useEffect(() => {
|
|
1066
|
+
socket.on("connect", handleSocketConnect);
|
|
1067
|
+
socket.on("disconnect", handleSocketDisconnect);
|
|
1068
|
+
return () => {
|
|
1069
|
+
socket.off("connect", handleSocketConnect);
|
|
1070
|
+
socket.off("disconnect", handleSocketDisconnect);
|
|
1071
|
+
};
|
|
1072
|
+
}, [socket, handleSocketConnect, handleSocketDisconnect]);
|
|
1073
|
+
const startSockets = useCallback(() => {
|
|
1074
|
+
socket.auth = {
|
|
1075
|
+
...socket.auth || {},
|
|
1076
|
+
...socketServer?.params?.auth || {},
|
|
1077
|
+
token: getSocketAuthToken()
|
|
1078
|
+
};
|
|
1079
|
+
systemLog("dsp", "PRIPOJUJI LIVE SOCKETS");
|
|
1080
|
+
socket.connect();
|
|
1081
|
+
}, [socket, socketServer?.params?.auth, getSocketAuthToken]);
|
|
1082
|
+
const stopSockets = useCallback(() => {
|
|
1083
|
+
systemLog("dsp", "[DSP] ODPOJUJI LIVE SOCKETS");
|
|
1084
|
+
socket.disconnect();
|
|
1085
|
+
}, [socket]);
|
|
1086
|
+
const resetDataStore = useCallback(async () => {
|
|
1087
|
+
console.time("[DSP] resetDataStore");
|
|
1088
|
+
if (persistenceStorage?.emptyTable) {
|
|
1089
|
+
await persistenceStorage.emptyTable("documents");
|
|
1101
1090
|
}
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
const
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1091
|
+
setSockets({});
|
|
1092
|
+
setProviders({});
|
|
1093
|
+
setDocuments({});
|
|
1094
|
+
setCounterProviders({});
|
|
1095
|
+
setCounterDocuments({});
|
|
1096
|
+
console.timeEnd("[DSP] resetDataStore");
|
|
1097
|
+
}, [persistenceStorage]);
|
|
1098
|
+
const resetProvider = useCallback(
|
|
1099
|
+
async (provider) => {
|
|
1100
|
+
if (!persistenceStorage) return;
|
|
1101
|
+
await persistenceStorage.query(`DELETE FROM documents WHERE model='${provider}'`);
|
|
1102
|
+
},
|
|
1103
|
+
[persistenceStorage]
|
|
1104
|
+
);
|
|
1105
|
+
const initProvider = useCallback(
|
|
1106
|
+
async (id, data) => {
|
|
1107
|
+
const providerPreset = presetProviders[id];
|
|
1108
|
+
const prov = renderJSONTemplate({ ...providerPreset || {}, id }, data);
|
|
1109
|
+
systemLog("dsp", "[INIT PROVIDER] ", id, "(", data || "", ")");
|
|
1110
|
+
if (typeof prov !== "boolean") {
|
|
1111
|
+
return await registerProvider(prov);
|
|
1112
|
+
}
|
|
1113
|
+
return false;
|
|
1114
|
+
},
|
|
1115
|
+
[persistenceStorage, presetProviders, usePersistentStorage]
|
|
1116
|
+
);
|
|
1117
|
+
const dispatch = useCallback((action, data, callback) => {
|
|
1118
|
+
systemLog("dsp", "[DSP] DISPATCH Ukladam akci", action, ",", data);
|
|
1119
|
+
setDispatcher((prev) => ({
|
|
1120
|
+
isBussy: prev.isBussy,
|
|
1121
|
+
actions: [...prev.actions, { action, data, callback }]
|
|
1122
|
+
}));
|
|
1123
|
+
}, []);
|
|
1124
|
+
useEffect(() => {
|
|
1125
|
+
async function processDispatcher() {
|
|
1126
|
+
if (dispatcher.actions.length > 0) {
|
|
1127
|
+
let result;
|
|
1128
|
+
systemLog("dsp", "[DSP] DISPATCHER Zpracovavam", dispatcher.actions[0].action);
|
|
1129
|
+
const timeCode = uuid();
|
|
1130
|
+
console.time(`Dispatcher ${dispatcher.actions[0].action} ${timeCode}`);
|
|
1131
|
+
setDispatcher((prev) => ({ ...prev, isBussy: true }));
|
|
1132
|
+
const item = dispatcher.actions[0];
|
|
1133
|
+
switch (item.action) {
|
|
1134
|
+
case "registerProvider":
|
|
1135
|
+
await registerProvider(item.data);
|
|
1136
|
+
break;
|
|
1137
|
+
case "unregisterProvider":
|
|
1138
|
+
await unregisterProvider(item.data);
|
|
1139
|
+
break;
|
|
1140
|
+
case "updateDataStore":
|
|
1141
|
+
result = await updateDataStore(item.data);
|
|
1142
|
+
break;
|
|
1143
|
+
case "createDocument":
|
|
1144
|
+
await createDocument(item.data);
|
|
1145
|
+
break;
|
|
1146
|
+
case "updateDocument":
|
|
1147
|
+
await updateDocument(item.data);
|
|
1148
|
+
break;
|
|
1149
|
+
case "updateDocuments":
|
|
1150
|
+
await updateDocuments(item.data);
|
|
1151
|
+
break;
|
|
1152
|
+
case "removeItem":
|
|
1153
|
+
break;
|
|
1154
|
+
case "deleteDocument":
|
|
1155
|
+
await deleteDocument(item.data);
|
|
1156
|
+
break;
|
|
1157
|
+
case "createProviderItem":
|
|
1158
|
+
result = await createProviderItem(item.data);
|
|
1159
|
+
break;
|
|
1160
|
+
case "deleteProviderItem":
|
|
1161
|
+
result = await deleteProviderItem(item.data);
|
|
1162
|
+
break;
|
|
1163
|
+
default:
|
|
1164
|
+
console.error("Unknown Action ", item.action, "Data: ", item.data);
|
|
1165
|
+
}
|
|
1166
|
+
item.callback && item.callback(result);
|
|
1167
|
+
setDispatcher((prev) => ({
|
|
1168
|
+
isBussy: false,
|
|
1169
|
+
actions: prev.actions.slice(1)
|
|
1170
|
+
}));
|
|
1171
|
+
console.timeEnd(`Dispatcher ${dispatcher.actions[0].action} ${timeCode}`);
|
|
1154
1172
|
}
|
|
1155
|
-
item.callback && item.callback(result);
|
|
1156
|
-
setDispatcher((prev) => ({
|
|
1157
|
-
isBussy: false,
|
|
1158
|
-
actions: prev.actions.slice(1)
|
|
1159
|
-
}));
|
|
1160
|
-
console.timeEnd(`Dispatcher ${dispatcher.actions[0].action} ${timeCode}`);
|
|
1161
|
-
}
|
|
1162
|
-
}
|
|
1163
|
-
if (!dispatcher.isBussy) processDispatcher();
|
|
1164
|
-
}, [dispatcher]);
|
|
1165
|
-
const updateDocuments = useCallback(
|
|
1166
|
-
async ({
|
|
1167
|
-
model,
|
|
1168
|
-
documents: uDocuments,
|
|
1169
|
-
mode = "update"
|
|
1170
|
-
}) => {
|
|
1171
|
-
systemLog("dsp", "[DSP] updateDocuments updatuji model:", model, "Documents:", Object.keys(uDocuments).length);
|
|
1172
|
-
const modelProvider = providers[model];
|
|
1173
|
-
if (!modelProvider) {
|
|
1174
|
-
systemLog("dsp", "[DSP] updateDocuments - provider neexistuje:", model);
|
|
1175
|
-
return;
|
|
1176
1173
|
}
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
systemLog("dsp", "updateDocuments -
|
|
1203
|
-
data.push(id);
|
|
1174
|
+
if (!dispatcher.isBussy) processDispatcher();
|
|
1175
|
+
}, [dispatcher]);
|
|
1176
|
+
const updateDocuments = useCallback(
|
|
1177
|
+
async ({
|
|
1178
|
+
model,
|
|
1179
|
+
documents: uDocuments,
|
|
1180
|
+
mode = "update"
|
|
1181
|
+
}) => {
|
|
1182
|
+
systemLog("dsp", "[DSP] updateDocuments updatuji model:", model, "Documents:", Object.keys(uDocuments).length);
|
|
1183
|
+
const modelProvider = providers[model];
|
|
1184
|
+
if (!modelProvider) {
|
|
1185
|
+
systemLog("dsp", "[DSP] updateDocuments - provider neexistuje:", model);
|
|
1186
|
+
return;
|
|
1187
|
+
}
|
|
1188
|
+
let data = [...modelProvider.data || []];
|
|
1189
|
+
const documentsToPersist = [];
|
|
1190
|
+
const documentIdsToDelete = [];
|
|
1191
|
+
setDocuments((prev) => {
|
|
1192
|
+
console.time("updateDocuments");
|
|
1193
|
+
let newDocs = { ...prev };
|
|
1194
|
+
if (Array.isArray(uDocuments)) {
|
|
1195
|
+
uDocuments.forEach((document) => {
|
|
1196
|
+
const { id, ...doc } = document;
|
|
1197
|
+
switch (mode) {
|
|
1198
|
+
case "replace":
|
|
1199
|
+
systemLog("dsp", "updateDocuments - replace", id);
|
|
1204
1200
|
newDocs[id] = doc;
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1201
|
+
if (doc._deleted) {
|
|
1202
|
+
data = data.filter((d) => d !== id);
|
|
1203
|
+
documentIdsToDelete.push(id);
|
|
1204
|
+
delete newDocs[id];
|
|
1205
|
+
} else {
|
|
1206
|
+
if (!data.includes(id)) data.push(id);
|
|
1207
|
+
documentsToPersist.push({ id, data: newDocs[id] });
|
|
1208
|
+
}
|
|
1209
|
+
break;
|
|
1210
|
+
case "update":
|
|
1211
|
+
default:
|
|
1212
|
+
if (!newDocs[id]) {
|
|
1213
|
+
systemLog("dsp", "updateDocuments - vytvarim", id);
|
|
1214
|
+
data.push(id);
|
|
1215
|
+
newDocs[id] = doc;
|
|
1216
|
+
documentsToPersist.push({ id, data: newDocs[id] });
|
|
1217
|
+
} else if (doc._deleted) {
|
|
1218
|
+
systemLog("dsp", "updateDocuments - mazu", id);
|
|
1219
|
+
data = data.filter((d) => d !== id);
|
|
1220
|
+
documentIdsToDelete.push(id);
|
|
1221
|
+
delete newDocs[id];
|
|
1222
|
+
} else {
|
|
1223
|
+
systemLog("dsp", "updateDocuments - updatuji", id);
|
|
1224
|
+
newDocs[id] = { ...newDocs[id], ...doc };
|
|
1225
|
+
documentsToPersist.push({ id, data: newDocs[id] });
|
|
1226
|
+
}
|
|
1227
|
+
break;
|
|
1228
|
+
}
|
|
1229
|
+
});
|
|
1230
|
+
} else {
|
|
1231
|
+
for (const key in uDocuments) {
|
|
1232
|
+
switch (mode) {
|
|
1233
|
+
case "replace":
|
|
1234
|
+
if (!newDocs[key]) {
|
|
1235
|
+
data.push(key);
|
|
1236
|
+
}
|
|
1237
|
+
if (uDocuments[key]._deleted) {
|
|
1238
|
+
data = data.filter((d) => d !== key);
|
|
1239
|
+
documentIdsToDelete.push(key);
|
|
1240
|
+
}
|
|
1241
1241
|
newDocs[key] = uDocuments[key];
|
|
1242
|
-
|
|
1242
|
+
if (uDocuments[key]._deleted) {
|
|
1243
|
+
delete newDocs[key];
|
|
1244
|
+
} else {
|
|
1245
|
+
documentsToPersist.push({ id: key, data: newDocs[key] });
|
|
1246
|
+
}
|
|
1243
1247
|
break;
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1248
|
+
case "update":
|
|
1249
|
+
default:
|
|
1250
|
+
if (!newDocs[key]) {
|
|
1251
|
+
data.push(key);
|
|
1252
|
+
newDocs[key] = uDocuments[key];
|
|
1253
|
+
documentsToPersist.push({ id: key, data: newDocs[key] });
|
|
1254
|
+
break;
|
|
1255
|
+
}
|
|
1256
|
+
if (uDocuments[key]._deleted) {
|
|
1257
|
+
data = data.filter((d) => d !== key);
|
|
1258
|
+
documentIdsToDelete.push(key);
|
|
1259
|
+
delete newDocs[key];
|
|
1260
|
+
} else {
|
|
1261
|
+
newDocs[key] = { ...newDocs[key], ...uDocuments[key] };
|
|
1262
|
+
documentsToPersist.push({ id: key, data: newDocs[key] });
|
|
1263
|
+
}
|
|
1264
|
+
break;
|
|
1265
|
+
}
|
|
1254
1266
|
}
|
|
1255
1267
|
}
|
|
1268
|
+
console.timeEnd("updateDocuments");
|
|
1269
|
+
return newDocs;
|
|
1270
|
+
});
|
|
1271
|
+
const unique = uuid();
|
|
1272
|
+
setProviders((prev) => {
|
|
1273
|
+
const newP = { ...prev };
|
|
1274
|
+
newP[model] = {
|
|
1275
|
+
...newP[model],
|
|
1276
|
+
data,
|
|
1277
|
+
lastUpdate: { id: unique, time: /* @__PURE__ */ new Date() }
|
|
1278
|
+
};
|
|
1279
|
+
return newP;
|
|
1280
|
+
});
|
|
1281
|
+
if (modelProvider?.isPersisting && persistenceStorage) {
|
|
1282
|
+
await Promise.all(documentsToPersist.map((item) => persistDocument({ documentId: item.id, model, data: item.data })));
|
|
1283
|
+
await Promise.all(documentIdsToDelete.map((documentId) => removePersistedDocument(documentId)));
|
|
1256
1284
|
}
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
if (fields) {
|
|
1283
|
-
systemLog("dsp", "[updateDocument] Stahovani ", model, ", document: ", documentId, ", fields: ", fields);
|
|
1284
|
-
systemLog("dsp", "[updateDocument] Providers: ", Object.keys(providers));
|
|
1285
|
-
const provider = presetProviders[model];
|
|
1286
|
-
systemLog("dsp", "[updateDocument]", provider);
|
|
1287
|
-
let dP = renderJSONTemplate(presetProviders[model], buildDocumentTemplateParams(model, documentId));
|
|
1288
|
-
if (dP) {
|
|
1289
|
-
const dataFromSource = await getData({
|
|
1290
|
-
id: dP.id,
|
|
1291
|
-
dataSource: { ...dP.dataSource, params: { select: fields.join(" ") } },
|
|
1292
|
-
isPersisting: !!dP.isPersisting && !!persistenceStorage,
|
|
1293
|
-
schema: dP.schema,
|
|
1294
|
-
SQLite: persistenceStorage || void 0
|
|
1295
|
-
});
|
|
1296
|
-
systemLog("dsp", "[updateDocument] DATA: ", dataFromSource);
|
|
1297
|
-
data = dataFromSource;
|
|
1285
|
+
},
|
|
1286
|
+
[providers, setDocuments, setProviders, persistDocument, removePersistedDocument, persistenceStorage]
|
|
1287
|
+
);
|
|
1288
|
+
const updateDocument = useCallback(
|
|
1289
|
+
async ({ documentId, model, fields, data: pData }) => {
|
|
1290
|
+
systemLog("dsp", "[updateDocument]:", documentId, ", model:", model);
|
|
1291
|
+
let data = pData;
|
|
1292
|
+
if (typeof pData === "function") data = pData(documents[documentId]);
|
|
1293
|
+
if (fields) {
|
|
1294
|
+
systemLog("dsp", "[updateDocument] Stahovani ", model, ", document: ", documentId, ", fields: ", fields);
|
|
1295
|
+
systemLog("dsp", "[updateDocument] Providers: ", Object.keys(providers));
|
|
1296
|
+
const provider = presetProviders[model];
|
|
1297
|
+
systemLog("dsp", "[updateDocument]", provider);
|
|
1298
|
+
let dP = renderJSONTemplate(presetProviders[model], buildDocumentTemplateParams(model, documentId));
|
|
1299
|
+
if (dP) {
|
|
1300
|
+
const dataFromSource = await getData({
|
|
1301
|
+
id: dP.id,
|
|
1302
|
+
dataSource: { ...dP.dataSource, params: { select: fields.join(" ") } },
|
|
1303
|
+
isPersisting: !!dP.isPersisting && !!persistenceStorage,
|
|
1304
|
+
schema: dP.schema,
|
|
1305
|
+
SQLite: persistenceStorage || void 0
|
|
1306
|
+
});
|
|
1307
|
+
systemLog("dsp", "[updateDocument] DATA: ", dataFromSource);
|
|
1308
|
+
data = dataFromSource;
|
|
1309
|
+
}
|
|
1298
1310
|
}
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1311
|
+
if (data) {
|
|
1312
|
+
var listeningProviders = 0;
|
|
1313
|
+
var isProvidersUpdated = false;
|
|
1314
|
+
const rand = uuid();
|
|
1315
|
+
setProviders((prev) => {
|
|
1316
|
+
systemLog("dsp", "[updateDocument] setProviders", rand);
|
|
1317
|
+
console.time("[DSP UPDATE PROVIDERS INSIDE]");
|
|
1318
|
+
var newProviders = { ...prev };
|
|
1319
|
+
Object.keys(newProviders).forEach((key) => {
|
|
1320
|
+
const provider = newProviders[key];
|
|
1321
|
+
const providerNext = {
|
|
1322
|
+
...provider,
|
|
1323
|
+
data: Array.isArray(provider?.data) ? [...provider.data] : []
|
|
1324
|
+
};
|
|
1325
|
+
var socketListeners = providerNext.dataSource?.socketListeners || [];
|
|
1326
|
+
if (socketListeners.length === 0) {
|
|
1327
|
+
if (providerNext.data.includes(documentId)) {
|
|
1328
|
+
if (!providerNext.dataSource?.filter || filterDocuments(data, providerNext.dataSource?.filter)) {
|
|
1329
|
+
systemLog("dsp", "[updateDocument] - zustava v Provider bez Listeners:", key);
|
|
1330
|
+
listeningProviders++;
|
|
1331
|
+
providerNext.lastUpdate = {
|
|
1332
|
+
id: uuid(),
|
|
1333
|
+
time: /* @__PURE__ */ new Date(),
|
|
1334
|
+
documentId
|
|
1335
|
+
};
|
|
1336
|
+
} else {
|
|
1337
|
+
providerNext.data = providerNext.data.filter((item) => item !== documentId);
|
|
1338
|
+
isProvidersUpdated = true;
|
|
1339
|
+
providerNext.lastUpdate = {
|
|
1340
|
+
id: uuid(),
|
|
1341
|
+
time: /* @__PURE__ */ new Date(),
|
|
1342
|
+
documentId
|
|
1343
|
+
};
|
|
1344
|
+
}
|
|
1345
|
+
}
|
|
1346
|
+
} else if (socketListeners.includes(model) || // socketListeners.includes(documentId) ||
|
|
1347
|
+
key === model) {
|
|
1348
|
+
if (!providerNext.dataSource.filter || filterDocuments(data, providerNext.dataSource.filter)) {
|
|
1319
1349
|
listeningProviders++;
|
|
1320
1350
|
providerNext.lastUpdate = {
|
|
1321
1351
|
id: uuid(),
|
|
1322
1352
|
time: /* @__PURE__ */ new Date(),
|
|
1323
1353
|
documentId
|
|
1324
1354
|
};
|
|
1355
|
+
if (!providerNext.data.includes(documentId)) {
|
|
1356
|
+
providerNext.data.push(documentId);
|
|
1357
|
+
isProvidersUpdated = true;
|
|
1358
|
+
}
|
|
1325
1359
|
} else {
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1360
|
+
if (providerNext.data.includes(documentId)) {
|
|
1361
|
+
systemLog("dsp", "[updateDocument] - mazu:", key);
|
|
1362
|
+
providerNext.data = providerNext.data.filter((item) => item !== documentId);
|
|
1363
|
+
isProvidersUpdated = true;
|
|
1364
|
+
providerNext.lastUpdate = {
|
|
1365
|
+
id: uuid(),
|
|
1366
|
+
time: /* @__PURE__ */ new Date(),
|
|
1367
|
+
documentId
|
|
1368
|
+
};
|
|
1369
|
+
}
|
|
1333
1370
|
}
|
|
1334
1371
|
}
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
}
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
isProvidersUpdated = true;
|
|
1353
|
-
providerNext.lastUpdate = {
|
|
1354
|
-
id: uuid(),
|
|
1355
|
-
time: /* @__PURE__ */ new Date(),
|
|
1356
|
-
documentId
|
|
1372
|
+
newProviders[key] = providerNext;
|
|
1373
|
+
});
|
|
1374
|
+
console.timeEnd("[DSP UPDATE PROVIDERS INSIDE]");
|
|
1375
|
+
console.time("[DSP UPDATE DOCUMENTS OUTSIDE]");
|
|
1376
|
+
setDocuments((prev2) => {
|
|
1377
|
+
console.time("[DSP UPDATE DOCUMENTS INSIDE]");
|
|
1378
|
+
if (prev2[documentId]) {
|
|
1379
|
+
if (listeningProviders === 0) {
|
|
1380
|
+
const newD = { ...prev2 };
|
|
1381
|
+
delete newD[documentId];
|
|
1382
|
+
console.timeEnd("[DSP UPDATE DOCUMENTS INSIDE]");
|
|
1383
|
+
return newD;
|
|
1384
|
+
} else {
|
|
1385
|
+
console.timeEnd("[DSP UPDATE DOCUMENTS INSIDE]");
|
|
1386
|
+
return {
|
|
1387
|
+
...prev2,
|
|
1388
|
+
[documentId]: { ...prev2[documentId], ...data }
|
|
1357
1389
|
};
|
|
1358
1390
|
}
|
|
1391
|
+
} else if (listeningProviders > 0) {
|
|
1392
|
+
console.timeEnd("[DSP UPDATE DOCUMENTS INSIDE]");
|
|
1393
|
+
return { ...prev2, [documentId]: data };
|
|
1359
1394
|
}
|
|
1360
|
-
|
|
1361
|
-
|
|
1395
|
+
console.timeEnd("[DSP UPDATE DOCUMENTS INSIDE]");
|
|
1396
|
+
return prev2;
|
|
1397
|
+
});
|
|
1398
|
+
console.timeEnd("[DSP UPDATE DOCUMENTS OUTSIDE]");
|
|
1399
|
+
systemLog("dsp", "OUTSIDE", documentId);
|
|
1400
|
+
return newProviders;
|
|
1362
1401
|
});
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
if (prev2[documentId]) {
|
|
1402
|
+
systemLog("dsp", "updateDocument - meni se pocet naslouchajicich Provideru ?", isProvidersUpdated ? "true" : "false");
|
|
1403
|
+
if (isProvidersUpdated) {
|
|
1404
|
+
systemLog("dsp", "updateDocument - menim counterDocuments pro", listeningProviders, "Providers");
|
|
1405
|
+
setCounterDocuments((prev) => {
|
|
1368
1406
|
if (listeningProviders === 0) {
|
|
1369
|
-
const newD = { ...
|
|
1407
|
+
const newD = { ...prev };
|
|
1370
1408
|
delete newD[documentId];
|
|
1371
|
-
console.timeEnd("[DSP UPDATE DOCUMENTS INSIDE]");
|
|
1372
1409
|
return newD;
|
|
1373
1410
|
} else {
|
|
1374
|
-
|
|
1375
|
-
return {
|
|
1376
|
-
...prev2,
|
|
1377
|
-
[documentId]: { ...prev2[documentId], ...data }
|
|
1378
|
-
};
|
|
1411
|
+
return { ...prev, [documentId]: listeningProviders };
|
|
1379
1412
|
}
|
|
1380
|
-
} else if (listeningProviders > 0) {
|
|
1381
|
-
console.timeEnd("[DSP UPDATE DOCUMENTS INSIDE]");
|
|
1382
|
-
return { ...prev2, [documentId]: data };
|
|
1383
|
-
}
|
|
1384
|
-
console.timeEnd("[DSP UPDATE DOCUMENTS INSIDE]");
|
|
1385
|
-
return prev2;
|
|
1386
|
-
});
|
|
1387
|
-
console.timeEnd("[DSP UPDATE DOCUMENTS OUTSIDE]");
|
|
1388
|
-
systemLog("dsp", "OUTSIDE", documentId);
|
|
1389
|
-
return newProviders;
|
|
1390
|
-
});
|
|
1391
|
-
systemLog("dsp", "updateDocument - meni se pocet naslouchajicich Provideru ?", isProvidersUpdated ? "true" : "false");
|
|
1392
|
-
if (isProvidersUpdated) {
|
|
1393
|
-
systemLog("dsp", "updateDocument - menim counterDocuments pro", listeningProviders, "Providers");
|
|
1394
|
-
setCounterDocuments((prev) => {
|
|
1395
|
-
if (listeningProviders === 0) {
|
|
1396
|
-
const newD = { ...prev };
|
|
1397
|
-
delete newD[documentId];
|
|
1398
|
-
return newD;
|
|
1399
|
-
} else {
|
|
1400
|
-
return { ...prev, [documentId]: listeningProviders };
|
|
1401
|
-
}
|
|
1402
|
-
});
|
|
1403
|
-
} else {
|
|
1404
|
-
systemLog("dsp", "updateDocument - nemenim counterDocuments. Dokument zustava v", listeningProviders, "Providers");
|
|
1405
|
-
}
|
|
1406
|
-
if (providers[model]?.isPersisting && persistenceStorage) {
|
|
1407
|
-
if (listeningProviders > 0) {
|
|
1408
|
-
await persistDocument({
|
|
1409
|
-
documentId,
|
|
1410
|
-
model,
|
|
1411
|
-
data: { ...documents[documentId], ...data }
|
|
1412
1413
|
});
|
|
1413
1414
|
} else {
|
|
1414
|
-
|
|
1415
|
+
systemLog("dsp", "updateDocument - nemenim counterDocuments. Dokument zustava v", listeningProviders, "Providers");
|
|
1416
|
+
}
|
|
1417
|
+
if (providers[model]?.isPersisting && persistenceStorage) {
|
|
1418
|
+
if (listeningProviders > 0) {
|
|
1419
|
+
await persistDocument({
|
|
1420
|
+
documentId,
|
|
1421
|
+
model,
|
|
1422
|
+
data: { ...documents[documentId], ...data }
|
|
1423
|
+
});
|
|
1424
|
+
} else {
|
|
1425
|
+
await removePersistedDocument(documentId);
|
|
1426
|
+
}
|
|
1415
1427
|
}
|
|
1416
1428
|
}
|
|
1417
|
-
}
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
async ({
|
|
1423
|
-
id,
|
|
1424
|
-
documentId,
|
|
1425
|
-
params,
|
|
1426
|
-
variant,
|
|
1427
|
-
data
|
|
1428
|
-
}) => {
|
|
1429
|
-
if (!providers[id]) {
|
|
1430
|
-
systemLog("dsp", "[updateDataStore] Provider neexistuje:", id);
|
|
1431
|
-
return;
|
|
1432
|
-
}
|
|
1433
|
-
if (!providers[id].dataSource?.uri && !providers[id].dataSource?.crud) {
|
|
1434
|
-
if (!documents[documentId] && providers[id]?.autoCreate) {
|
|
1435
|
-
await createProviderItem({ id, data: { id: documentId, ...data } });
|
|
1436
|
-
} else updateDocument({ documentId, model: id, data });
|
|
1437
|
-
return true;
|
|
1438
|
-
}
|
|
1439
|
-
systemLog(
|
|
1440
|
-
"dsp",
|
|
1441
|
-
"[updateDataStore] Posilam patchData: ",
|
|
1429
|
+
},
|
|
1430
|
+
[documents, providers, setDocuments, setProviders, setCounterDocuments, persistDocument, removePersistedDocument, persistenceStorage]
|
|
1431
|
+
);
|
|
1432
|
+
const updateDataStore = useCallback(
|
|
1433
|
+
async ({
|
|
1442
1434
|
id,
|
|
1443
|
-
|
|
1444
|
-
|
|
1445
|
-
"\n data: ",
|
|
1446
|
-
JSON.stringify(data, null, 2)
|
|
1447
|
-
);
|
|
1448
|
-
const result = await patchData({
|
|
1449
|
-
dataSource: renderJSONTemplate(providers[id].dataSource, params),
|
|
1435
|
+
documentId,
|
|
1436
|
+
params,
|
|
1450
1437
|
variant,
|
|
1451
1438
|
data
|
|
1452
|
-
})
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
1456
|
-
systemLog("dsp", "[updateDataStore] UPDATE DATA STORE RESULT: ", result);
|
|
1457
|
-
updateDocument({ documentId: rDocumentId, model: id, data: document });
|
|
1458
|
-
} else {
|
|
1459
|
-
systemLog("dsp", "[updateDataStore] Updatuje Socket");
|
|
1439
|
+
}) => {
|
|
1440
|
+
if (!providers[id]) {
|
|
1441
|
+
systemLog("dsp", "[updateDataStore] Provider neexistuje:", id);
|
|
1442
|
+
return;
|
|
1460
1443
|
}
|
|
1461
|
-
|
|
1462
|
-
|
|
1463
|
-
|
|
1464
|
-
|
|
1465
|
-
|
|
1466
|
-
useEffect(() => {
|
|
1467
|
-
socketActionHandlersRef.current = { dispatch, updateDocument };
|
|
1468
|
-
}, [dispatch, updateDocument]);
|
|
1469
|
-
const createDocument = useCallback(
|
|
1470
|
-
async ({ model, documentId, data }) => {
|
|
1471
|
-
const newDocument = data;
|
|
1472
|
-
systemLog("dsp", `Registruji model ${model}, documentId ${documentId}, data: ${JSON.stringify(data)}`);
|
|
1473
|
-
var providerListenersCount = 0;
|
|
1474
|
-
Object.keys(providers).forEach((key) => {
|
|
1475
|
-
const provider = providers[key];
|
|
1476
|
-
var socketListeners = provider.dataSource?.socketListeners;
|
|
1477
|
-
if ((socketListeners?.includes(model) || key === model) && (!provider.dataSource?.filter || filterDocuments(data, provider.dataSource?.filter))) {
|
|
1478
|
-
systemLog("dsp", "[createDocument] Provider data: ", provider.data.length, " Bytes, documentId: ", documentId);
|
|
1479
|
-
if (!provider.data.includes(documentId)) {
|
|
1480
|
-
providerListenersCount++;
|
|
1481
|
-
setProviders((prev) => ({
|
|
1482
|
-
...prev,
|
|
1483
|
-
[key]: {
|
|
1484
|
-
...prev[key],
|
|
1485
|
-
data: [...prev[key].data, documentId],
|
|
1486
|
-
lastUpdate: { id: uuid(), time: /* @__PURE__ */ new Date() }
|
|
1487
|
-
}
|
|
1488
|
-
}));
|
|
1489
|
-
}
|
|
1444
|
+
if (!providers[id].dataSource?.uri && !providers[id].dataSource?.crud) {
|
|
1445
|
+
if (!documents[documentId] && providers[id]?.autoCreate) {
|
|
1446
|
+
await createProviderItem({ id, data: { id: documentId, ...data } });
|
|
1447
|
+
} else updateDocument({ documentId, model: id, data });
|
|
1448
|
+
return true;
|
|
1490
1449
|
}
|
|
1491
|
-
|
|
1492
|
-
|
|
1493
|
-
|
|
1494
|
-
|
|
1450
|
+
systemLog(
|
|
1451
|
+
"dsp",
|
|
1452
|
+
"[updateDataStore] Posilam patchData: ",
|
|
1453
|
+
id,
|
|
1454
|
+
",\n params: ",
|
|
1455
|
+
JSON.stringify(params, null, 2),
|
|
1456
|
+
"\n data: ",
|
|
1457
|
+
JSON.stringify(data, null, 2)
|
|
1458
|
+
);
|
|
1459
|
+
const result = await patchData({
|
|
1460
|
+
dataSource: renderJSONTemplate(providers[id].dataSource, params),
|
|
1461
|
+
variant,
|
|
1462
|
+
data
|
|
1463
|
+
});
|
|
1464
|
+
if (typeof result === "object") {
|
|
1465
|
+
const { id: rDocumentId, ...document } = result;
|
|
1466
|
+
if (!isLive) {
|
|
1467
|
+
systemLog("dsp", "[updateDataStore] UPDATE DATA STORE RESULT: ", result);
|
|
1468
|
+
updateDocument({ documentId: rDocumentId, model: id, data: document });
|
|
1469
|
+
} else {
|
|
1470
|
+
systemLog("dsp", "[updateDataStore] Updatuje Socket");
|
|
1471
|
+
}
|
|
1495
1472
|
}
|
|
1473
|
+
return result;
|
|
1474
|
+
},
|
|
1475
|
+
[providers, documents, isLive, updateDocument]
|
|
1476
|
+
);
|
|
1477
|
+
useEffect(() => {
|
|
1478
|
+
socketActionHandlersRef.current = { dispatch, updateDocument };
|
|
1479
|
+
}, [dispatch, updateDocument]);
|
|
1480
|
+
const createDocument = useCallback(
|
|
1481
|
+
async ({ model, documentId, data }) => {
|
|
1482
|
+
const newDocument = data;
|
|
1483
|
+
systemLog("dsp", `Registruji model ${model}, documentId ${documentId}, data: ${JSON.stringify(data)}`);
|
|
1484
|
+
var providerListenersCount = 0;
|
|
1485
|
+
Object.keys(providers).forEach((key) => {
|
|
1486
|
+
const provider = providers[key];
|
|
1487
|
+
var socketListeners = provider.dataSource?.socketListeners;
|
|
1488
|
+
if ((socketListeners?.includes(model) || key === model) && (!provider.dataSource?.filter || filterDocuments(data, provider.dataSource?.filter))) {
|
|
1489
|
+
systemLog("dsp", "[createDocument] Provider data: ", provider.data.length, " Bytes, documentId: ", documentId);
|
|
1490
|
+
if (!provider.data.includes(documentId)) {
|
|
1491
|
+
providerListenersCount++;
|
|
1492
|
+
setProviders((prev) => ({
|
|
1493
|
+
...prev,
|
|
1494
|
+
[key]: {
|
|
1495
|
+
...prev[key],
|
|
1496
|
+
data: [...prev[key].data, documentId],
|
|
1497
|
+
lastUpdate: { id: uuid(), time: /* @__PURE__ */ new Date() }
|
|
1498
|
+
}
|
|
1499
|
+
}));
|
|
1500
|
+
}
|
|
1501
|
+
}
|
|
1502
|
+
});
|
|
1503
|
+
if (providerListenersCount > 0) {
|
|
1504
|
+
if (providers[model]?.isPersisting && persistenceStorage) {
|
|
1505
|
+
await persistDocument({ documentId, model, data: newDocument });
|
|
1506
|
+
}
|
|
1507
|
+
setCounterDocuments((prev) => {
|
|
1508
|
+
const newC = { ...prev };
|
|
1509
|
+
if (newC[documentId]) {
|
|
1510
|
+
setDocuments((prev2) => ({
|
|
1511
|
+
...prev2,
|
|
1512
|
+
[documentId]: { ...prev2[documentId], ...newDocument }
|
|
1513
|
+
}));
|
|
1514
|
+
newC[documentId] = prev[documentId] + providerListenersCount;
|
|
1515
|
+
} else {
|
|
1516
|
+
setDocuments((prev2) => ({ ...prev2, [documentId]: newDocument }));
|
|
1517
|
+
newC[documentId] = providerListenersCount;
|
|
1518
|
+
}
|
|
1519
|
+
return newC;
|
|
1520
|
+
});
|
|
1521
|
+
return { id: documentId, document: newDocument };
|
|
1522
|
+
} else return false;
|
|
1523
|
+
},
|
|
1524
|
+
[providers, setProviders, setCounterDocuments, setDocuments, persistDocument, persistenceStorage]
|
|
1525
|
+
);
|
|
1526
|
+
const deleteDocument = useCallback(
|
|
1527
|
+
async ({ documentId }) => {
|
|
1528
|
+
systemLog("dsp", `[deleteDocument] Mazu document ${documentId}}`);
|
|
1529
|
+
await removePersistedDocument(documentId);
|
|
1530
|
+
setDocuments((prev) => {
|
|
1531
|
+
const newDocs = { ...prev };
|
|
1532
|
+
systemLog("dsp", "[deleteDocument] MAZU ", documentId, " z ", newDocs);
|
|
1533
|
+
delete newDocs[documentId];
|
|
1534
|
+
systemLog("dsp", "[deleteDocument] NEW DOCS: ", newDocs);
|
|
1535
|
+
return newDocs;
|
|
1536
|
+
});
|
|
1496
1537
|
setCounterDocuments((prev) => {
|
|
1497
1538
|
const newC = { ...prev };
|
|
1498
|
-
|
|
1499
|
-
setDocuments((prev2) => ({
|
|
1500
|
-
...prev2,
|
|
1501
|
-
[documentId]: { ...prev2[documentId], ...newDocument }
|
|
1502
|
-
}));
|
|
1503
|
-
newC[documentId] = prev[documentId] + providerListenersCount;
|
|
1504
|
-
} else {
|
|
1505
|
-
setDocuments((prev2) => ({ ...prev2, [documentId]: newDocument }));
|
|
1506
|
-
newC[documentId] = providerListenersCount;
|
|
1507
|
-
}
|
|
1539
|
+
delete newC[documentId];
|
|
1508
1540
|
return newC;
|
|
1509
1541
|
});
|
|
1510
|
-
|
|
1511
|
-
|
|
1512
|
-
|
|
1513
|
-
|
|
1514
|
-
|
|
1515
|
-
|
|
1516
|
-
|
|
1517
|
-
|
|
1518
|
-
|
|
1519
|
-
|
|
1520
|
-
|
|
1521
|
-
|
|
1522
|
-
|
|
1523
|
-
|
|
1524
|
-
|
|
1525
|
-
|
|
1526
|
-
|
|
1527
|
-
|
|
1528
|
-
|
|
1529
|
-
|
|
1530
|
-
});
|
|
1531
|
-
setProviders((prev) => {
|
|
1532
|
-
var deletedCount = 0;
|
|
1533
|
-
const updatedDataObj = { ...prev };
|
|
1534
|
-
for (const key in updatedDataObj) {
|
|
1535
|
-
const initialLength = updatedDataObj[key].data.length;
|
|
1536
|
-
updatedDataObj[key].data = updatedDataObj[key].data.filter((element) => element !== documentId);
|
|
1537
|
-
updatedDataObj[key].lastUpdate = { id: uuid(), time: /* @__PURE__ */ new Date() };
|
|
1538
|
-
deletedCount += initialLength - updatedDataObj[key].data.length;
|
|
1539
|
-
if (initialLength - updatedDataObj[key].data.length > 0) systemLog("dsp", "[deleteDocument] Smazan zaznam...", deletedCount);
|
|
1542
|
+
setProviders((prev) => {
|
|
1543
|
+
var deletedCount = 0;
|
|
1544
|
+
const updatedDataObj = { ...prev };
|
|
1545
|
+
for (const key in updatedDataObj) {
|
|
1546
|
+
const initialLength = updatedDataObj[key].data.length;
|
|
1547
|
+
updatedDataObj[key].data = updatedDataObj[key].data.filter((element) => element !== documentId);
|
|
1548
|
+
updatedDataObj[key].lastUpdate = { id: uuid(), time: /* @__PURE__ */ new Date() };
|
|
1549
|
+
deletedCount += initialLength - updatedDataObj[key].data.length;
|
|
1550
|
+
if (initialLength - updatedDataObj[key].data.length > 0) systemLog("dsp", "[deleteDocument] Smazan zaznam...", deletedCount);
|
|
1551
|
+
}
|
|
1552
|
+
return updatedDataObj;
|
|
1553
|
+
});
|
|
1554
|
+
},
|
|
1555
|
+
[setDocuments, setCounterDocuments, setProviders, removePersistedDocument]
|
|
1556
|
+
);
|
|
1557
|
+
const createProviderItem = useCallback(
|
|
1558
|
+
async ({ id, data }) => {
|
|
1559
|
+
if (!providers[id]) {
|
|
1560
|
+
systemLog("dsp", "[createProviderItem] Provider neexistuje:", id);
|
|
1561
|
+
return;
|
|
1540
1562
|
}
|
|
1541
|
-
|
|
1542
|
-
|
|
1543
|
-
|
|
1544
|
-
|
|
1545
|
-
|
|
1546
|
-
|
|
1547
|
-
|
|
1548
|
-
|
|
1549
|
-
|
|
1550
|
-
|
|
1551
|
-
|
|
1552
|
-
|
|
1553
|
-
|
|
1554
|
-
|
|
1555
|
-
|
|
1556
|
-
|
|
1557
|
-
}
|
|
1558
|
-
|
|
1559
|
-
|
|
1560
|
-
|
|
1561
|
-
|
|
1562
|
-
|
|
1563
|
-
|
|
1564
|
-
|
|
1565
|
-
|
|
1566
|
-
|
|
1567
|
-
|
|
1568
|
-
|
|
1569
|
-
|
|
1570
|
-
|
|
1571
|
-
|
|
1572
|
-
|
|
1573
|
-
|
|
1574
|
-
|
|
1575
|
-
|
|
1576
|
-
|
|
1577
|
-
|
|
1578
|
-
|
|
1579
|
-
|
|
1580
|
-
|
|
1581
|
-
|
|
1582
|
-
|
|
1583
|
-
|
|
1584
|
-
|
|
1585
|
-
|
|
1563
|
+
if (!providers[id].dataSource) {
|
|
1564
|
+
const { id: dId, ...rData } = data;
|
|
1565
|
+
const documentId = dId || uuid();
|
|
1566
|
+
const result2 = createDocument({ model: id, documentId, data: rData });
|
|
1567
|
+
return result2;
|
|
1568
|
+
}
|
|
1569
|
+
const result = await postData({
|
|
1570
|
+
dataSource: providers[id].dataSource,
|
|
1571
|
+
schema: providers[id].schema,
|
|
1572
|
+
val: data
|
|
1573
|
+
});
|
|
1574
|
+
return result;
|
|
1575
|
+
},
|
|
1576
|
+
[providers, createDocument]
|
|
1577
|
+
);
|
|
1578
|
+
const deleteProviderItem = useCallback(
|
|
1579
|
+
async ({ providerId, data, params }) => {
|
|
1580
|
+
if (!providers[providerId]) {
|
|
1581
|
+
systemLog("dsp", "[deleteProviderItem] Provider neexistuje:", providerId);
|
|
1582
|
+
return;
|
|
1583
|
+
}
|
|
1584
|
+
const response = await deleteData({
|
|
1585
|
+
dataSource: renderJSONTemplate(providers[providerId].dataSource, params),
|
|
1586
|
+
// dataSource: providers[providerId].dataSource,
|
|
1587
|
+
data
|
|
1588
|
+
});
|
|
1589
|
+
return response;
|
|
1590
|
+
},
|
|
1591
|
+
[providers]
|
|
1592
|
+
);
|
|
1593
|
+
const registerProviderSockets = useCallback(
|
|
1594
|
+
(sockets2) => {
|
|
1595
|
+
if (sockets2) {
|
|
1596
|
+
systemLog("dsp", "[registerProviderSockets]", sockets2);
|
|
1597
|
+
var d = Array.isArray(sockets2) ? sockets2 : [sockets2];
|
|
1598
|
+
setSockets((prev) => {
|
|
1599
|
+
const newS = { ...prev };
|
|
1600
|
+
d.forEach((item) => {
|
|
1601
|
+
if (newS[item]) {
|
|
1602
|
+
newS[item].listeners = newS[item].listeners + 1;
|
|
1603
|
+
} else {
|
|
1604
|
+
const roomHandler = (msg) => {
|
|
1605
|
+
const { dispatch: currentDispatch, updateDocument: currentUpdateDocument } = socketActionHandlersRef.current;
|
|
1606
|
+
handleSocketMessage(item, msg, {
|
|
1607
|
+
dispatch: currentDispatch,
|
|
1608
|
+
updateDocument: currentUpdateDocument
|
|
1609
|
+
});
|
|
1610
|
+
};
|
|
1611
|
+
socketRoomHandlersRef.current[item] = roomHandler;
|
|
1612
|
+
newS[item] = { listeners: 1, data: [] };
|
|
1613
|
+
socket.emit("joinRoom", item);
|
|
1614
|
+
socket.on(item, roomHandler);
|
|
1615
|
+
}
|
|
1616
|
+
});
|
|
1617
|
+
return newS;
|
|
1618
|
+
});
|
|
1619
|
+
}
|
|
1620
|
+
},
|
|
1621
|
+
[setSockets, socket]
|
|
1622
|
+
);
|
|
1623
|
+
const unregisterProviderSockets = useCallback(
|
|
1624
|
+
(sockets2) => {
|
|
1625
|
+
systemLog("dsp", "[unregisterProviderSockets] Mazu sockety ", JSON.stringify(sockets2, null, 2));
|
|
1626
|
+
var removeSocketListeners = [];
|
|
1586
1627
|
var d = Array.isArray(sockets2) ? sockets2 : [sockets2];
|
|
1587
1628
|
setSockets((prev) => {
|
|
1588
1629
|
const newS = { ...prev };
|
|
1589
1630
|
d.forEach((item) => {
|
|
1590
|
-
if (newS[item]) {
|
|
1591
|
-
|
|
1592
|
-
|
|
1593
|
-
|
|
1594
|
-
|
|
1595
|
-
|
|
1596
|
-
|
|
1597
|
-
|
|
1598
|
-
|
|
1599
|
-
};
|
|
1600
|
-
socketRoomHandlersRef.current[item] = roomHandler;
|
|
1601
|
-
newS[item] = { listeners: 1, data: [] };
|
|
1602
|
-
socket.emit("joinRoom", item);
|
|
1603
|
-
socket.on(item, roomHandler);
|
|
1604
|
-
}
|
|
1631
|
+
if (newS[item]?.listeners <= 1) {
|
|
1632
|
+
removeSocketListeners.push(item);
|
|
1633
|
+
const roomHandler = socketRoomHandlersRef.current[item];
|
|
1634
|
+
if (roomHandler) {
|
|
1635
|
+
socket.off(item, roomHandler);
|
|
1636
|
+
delete socketRoomHandlersRef.current[item];
|
|
1637
|
+
}
|
|
1638
|
+
delete newS[item];
|
|
1639
|
+
} else if (newS[item]) newS[item].listeners = newS[item].listeners - 1;
|
|
1605
1640
|
});
|
|
1641
|
+
if (removeSocketListeners.length > 0) {
|
|
1642
|
+
socket.emit("leaveRooms", JSON.stringify(removeSocketListeners));
|
|
1643
|
+
}
|
|
1606
1644
|
return newS;
|
|
1607
1645
|
});
|
|
1608
|
-
}
|
|
1609
|
-
|
|
1610
|
-
|
|
1611
|
-
|
|
1612
|
-
|
|
1613
|
-
|
|
1614
|
-
|
|
1615
|
-
|
|
1616
|
-
|
|
1617
|
-
|
|
1618
|
-
|
|
1619
|
-
|
|
1620
|
-
|
|
1621
|
-
|
|
1622
|
-
|
|
1623
|
-
|
|
1624
|
-
|
|
1625
|
-
|
|
1626
|
-
|
|
1627
|
-
|
|
1628
|
-
|
|
1629
|
-
|
|
1630
|
-
|
|
1631
|
-
|
|
1632
|
-
|
|
1633
|
-
|
|
1634
|
-
|
|
1635
|
-
|
|
1636
|
-
|
|
1637
|
-
|
|
1638
|
-
|
|
1639
|
-
|
|
1640
|
-
systemLog("dsp", `[updateProviderListeners] provider:`, id, "menim o", val);
|
|
1641
|
-
setCounterProviders((prev) => {
|
|
1642
|
-
if (!prev[id]) return prev;
|
|
1643
|
-
if (prev[id] + val > 0) {
|
|
1644
|
-
return {
|
|
1645
|
-
...prev,
|
|
1646
|
-
[id]: prev[id] + val
|
|
1647
|
-
};
|
|
1648
|
-
} else {
|
|
1649
|
-
setProviders((prevP) => {
|
|
1650
|
-
systemLog("dsp", "[DSP] UPDATE PROVIDER - mazu sockets ", id);
|
|
1651
|
-
setSockets((prevS) => {
|
|
1652
|
-
var removeSocketListeners = [];
|
|
1653
|
-
const newS = { ...prevS };
|
|
1654
|
-
const providerSocketListeners = prevP[id].dataSource?.socketListeners || [];
|
|
1655
|
-
providerSocketListeners.forEach((socketName) => {
|
|
1656
|
-
if (!newS[socketName]) return;
|
|
1657
|
-
if (newS[socketName].listeners + val <= 0) {
|
|
1658
|
-
const roomHandler = socketRoomHandlersRef.current[socketName];
|
|
1659
|
-
if (roomHandler) {
|
|
1660
|
-
socket.off(socketName, roomHandler);
|
|
1661
|
-
delete socketRoomHandlersRef.current[socketName];
|
|
1646
|
+
},
|
|
1647
|
+
[setSockets, socket]
|
|
1648
|
+
);
|
|
1649
|
+
const updateProviderListeners = useCallback(
|
|
1650
|
+
async (id, val) => {
|
|
1651
|
+
systemLog("dsp", `[updateProviderListeners] provider:`, id, "menim o", val);
|
|
1652
|
+
setCounterProviders((prev) => {
|
|
1653
|
+
if (!prev[id]) return prev;
|
|
1654
|
+
if (prev[id] + val > 0) {
|
|
1655
|
+
return {
|
|
1656
|
+
...prev,
|
|
1657
|
+
[id]: prev[id] + val
|
|
1658
|
+
};
|
|
1659
|
+
} else {
|
|
1660
|
+
setProviders((prevP) => {
|
|
1661
|
+
systemLog("dsp", "[DSP] UPDATE PROVIDER - mazu sockets ", id);
|
|
1662
|
+
setSockets((prevS) => {
|
|
1663
|
+
var removeSocketListeners = [];
|
|
1664
|
+
const newS = { ...prevS };
|
|
1665
|
+
const providerSocketListeners = prevP[id].dataSource?.socketListeners || [];
|
|
1666
|
+
providerSocketListeners.forEach((socketName) => {
|
|
1667
|
+
if (!newS[socketName]) return;
|
|
1668
|
+
if (newS[socketName].listeners + val <= 0) {
|
|
1669
|
+
const roomHandler = socketRoomHandlersRef.current[socketName];
|
|
1670
|
+
if (roomHandler) {
|
|
1671
|
+
socket.off(socketName, roomHandler);
|
|
1672
|
+
delete socketRoomHandlersRef.current[socketName];
|
|
1673
|
+
}
|
|
1674
|
+
delete newS[socketName];
|
|
1675
|
+
removeSocketListeners.push(socketName);
|
|
1676
|
+
} else {
|
|
1677
|
+
newS[socketName].listeners = newS[socketName].listeners + val;
|
|
1662
1678
|
}
|
|
1663
|
-
|
|
1664
|
-
|
|
1665
|
-
|
|
1666
|
-
newS[socketName].listeners = newS[socketName].listeners + val;
|
|
1679
|
+
});
|
|
1680
|
+
if (removeSocketListeners.length > 0) {
|
|
1681
|
+
socket.emit("leaveRooms", JSON.stringify(removeSocketListeners));
|
|
1667
1682
|
}
|
|
1683
|
+
return newS;
|
|
1668
1684
|
});
|
|
1669
|
-
|
|
1670
|
-
|
|
1685
|
+
setCounterDocuments((prevC) => {
|
|
1686
|
+
const newC = { ...prevC };
|
|
1687
|
+
prevP[id].data.forEach((document) => {
|
|
1688
|
+
if (newC[document] + val <= 0) {
|
|
1689
|
+
setDocuments((prev2) => {
|
|
1690
|
+
const newD = { ...prev2 };
|
|
1691
|
+
delete newD[document];
|
|
1692
|
+
return newD;
|
|
1693
|
+
});
|
|
1694
|
+
delete newC[document];
|
|
1695
|
+
} else {
|
|
1696
|
+
newC[document] = newC[document] + val;
|
|
1697
|
+
}
|
|
1698
|
+
});
|
|
1699
|
+
return newC;
|
|
1700
|
+
});
|
|
1701
|
+
const newP = { ...prevP };
|
|
1702
|
+
delete newP[id];
|
|
1703
|
+
return newP;
|
|
1704
|
+
});
|
|
1705
|
+
const newProvs = { ...prev };
|
|
1706
|
+
delete newProvs[id];
|
|
1707
|
+
return newProvs;
|
|
1708
|
+
}
|
|
1709
|
+
});
|
|
1710
|
+
},
|
|
1711
|
+
[setCounterProviders, setProviders, setCounterDocuments, setDocuments, socket]
|
|
1712
|
+
);
|
|
1713
|
+
const registerProvider = useCallback(
|
|
1714
|
+
async (newItem) => {
|
|
1715
|
+
systemLog("dsp", "[registerProvider]", newItem.id);
|
|
1716
|
+
let result;
|
|
1717
|
+
const { id, ...provider } = newItem;
|
|
1718
|
+
if (providers[id]) {
|
|
1719
|
+
setCounterProviders((prev) => {
|
|
1720
|
+
systemLog("dsp", "[registerProvider] Pouze navysuji ", id, " ", prev[id], " -> ", prev[id] + 1);
|
|
1721
|
+
return {
|
|
1722
|
+
...prev,
|
|
1723
|
+
[id]: prev[id] + 1
|
|
1724
|
+
};
|
|
1725
|
+
});
|
|
1726
|
+
result = providers[id];
|
|
1727
|
+
} else {
|
|
1728
|
+
try {
|
|
1729
|
+
const dataFromSource = await getData({
|
|
1730
|
+
schema: newItem.schema,
|
|
1731
|
+
dataSource: newItem.dataSource || {},
|
|
1732
|
+
id: newItem.id,
|
|
1733
|
+
isPersisting: !!newItem.isPersisting && !!persistenceStorage,
|
|
1734
|
+
SQLite: persistenceStorage || void 0
|
|
1735
|
+
});
|
|
1736
|
+
console.time(`[DSP] VYTVARENI PROVIDERA ${id}`);
|
|
1737
|
+
var dataList = [];
|
|
1738
|
+
var items = {};
|
|
1739
|
+
const dataS = Array.isArray(dataFromSource) ? dataFromSource : [dataFromSource];
|
|
1740
|
+
dataS.forEach((item) => {
|
|
1741
|
+
if (!item) return;
|
|
1742
|
+
const { id: itId, ...data } = item;
|
|
1743
|
+
const normalizedId = itId || uuid();
|
|
1744
|
+
dataList.push(normalizedId);
|
|
1745
|
+
if (documents[normalizedId]) {
|
|
1746
|
+
items[normalizedId] = {
|
|
1747
|
+
...documents[normalizedId],
|
|
1748
|
+
...data
|
|
1749
|
+
};
|
|
1750
|
+
} else {
|
|
1751
|
+
items[normalizedId] = data;
|
|
1671
1752
|
}
|
|
1672
|
-
return newS;
|
|
1673
1753
|
});
|
|
1674
|
-
setCounterDocuments((
|
|
1675
|
-
const newC = { ...
|
|
1676
|
-
|
|
1677
|
-
if (newC[
|
|
1678
|
-
|
|
1679
|
-
const newD = { ...prev2 };
|
|
1680
|
-
delete newD[document];
|
|
1681
|
-
return newD;
|
|
1682
|
-
});
|
|
1683
|
-
delete newC[document];
|
|
1754
|
+
setCounterDocuments((prev) => {
|
|
1755
|
+
const newC = { ...prev };
|
|
1756
|
+
dataList.forEach((itemId) => {
|
|
1757
|
+
if (newC[itemId]) {
|
|
1758
|
+
newC[itemId] = newC[itemId] + 1;
|
|
1684
1759
|
} else {
|
|
1685
|
-
newC[
|
|
1760
|
+
newC[itemId] = 1;
|
|
1686
1761
|
}
|
|
1687
1762
|
});
|
|
1688
1763
|
return newC;
|
|
1689
1764
|
});
|
|
1690
|
-
|
|
1691
|
-
|
|
1692
|
-
|
|
1693
|
-
|
|
1694
|
-
|
|
1695
|
-
|
|
1696
|
-
|
|
1765
|
+
if (Object.keys(items).length > 0) {
|
|
1766
|
+
setDocuments((prev) => ({ ...prev, ...items }));
|
|
1767
|
+
}
|
|
1768
|
+
result = {
|
|
1769
|
+
...provider,
|
|
1770
|
+
data: dataList,
|
|
1771
|
+
lastUpdate: { id: uuid(), time: /* @__PURE__ */ new Date() }
|
|
1772
|
+
};
|
|
1773
|
+
setProviders((prev) => ({
|
|
1774
|
+
...prev,
|
|
1775
|
+
[id]: result
|
|
1776
|
+
}));
|
|
1777
|
+
setCounterProviders((prev) => ({
|
|
1778
|
+
...prev,
|
|
1779
|
+
[id]: 1
|
|
1780
|
+
}));
|
|
1781
|
+
if (provider.dataSource?.socketListeners) {
|
|
1782
|
+
registerProviderSockets(provider.dataSource.socketListeners);
|
|
1783
|
+
}
|
|
1784
|
+
console.timeEnd(`[DSP] VYTVARENI PROVIDERA ${id}`);
|
|
1785
|
+
} catch (error) {
|
|
1786
|
+
console.error("[DataStoreProvider] registerProvider:error", { id: newItem.id, error });
|
|
1787
|
+
throw error;
|
|
1788
|
+
}
|
|
1697
1789
|
}
|
|
1698
|
-
|
|
1699
|
-
|
|
1700
|
-
|
|
1701
|
-
|
|
1702
|
-
|
|
1703
|
-
|
|
1704
|
-
systemLog("dsp", "[registerProvider]", newItem.id);
|
|
1705
|
-
let result;
|
|
1706
|
-
const { id, ...provider } = newItem;
|
|
1707
|
-
if (providers[id]) {
|
|
1790
|
+
return result;
|
|
1791
|
+
},
|
|
1792
|
+
[providers, documents, setDocuments, setProviders, setCounterProviders, registerProviderSockets, persistenceStorage]
|
|
1793
|
+
);
|
|
1794
|
+
const unregisterProvider = useCallback(
|
|
1795
|
+
async (itemId) => {
|
|
1708
1796
|
setCounterProviders((prev) => {
|
|
1709
|
-
|
|
1710
|
-
|
|
1711
|
-
|
|
1712
|
-
|
|
1713
|
-
|
|
1714
|
-
|
|
1715
|
-
result = providers[id];
|
|
1716
|
-
} else {
|
|
1717
|
-
try {
|
|
1718
|
-
const dataFromSource = await getData({
|
|
1719
|
-
schema: newItem.schema,
|
|
1720
|
-
dataSource: newItem.dataSource || {},
|
|
1721
|
-
id: newItem.id,
|
|
1722
|
-
isPersisting: !!newItem.isPersisting && !!persistenceStorage,
|
|
1723
|
-
SQLite: persistenceStorage || void 0
|
|
1724
|
-
});
|
|
1725
|
-
console.time(`[DSP] VYTVARENI PROVIDERA ${id}`);
|
|
1726
|
-
var dataList = [];
|
|
1727
|
-
var items = {};
|
|
1728
|
-
const dataS = Array.isArray(dataFromSource) ? dataFromSource : [dataFromSource];
|
|
1729
|
-
dataS.forEach((item) => {
|
|
1730
|
-
if (!item) return;
|
|
1731
|
-
const { id: itId, ...data } = item;
|
|
1732
|
-
const normalizedId = itId || uuid();
|
|
1733
|
-
dataList.push(normalizedId);
|
|
1734
|
-
if (documents[normalizedId]) {
|
|
1735
|
-
items[normalizedId] = {
|
|
1736
|
-
...documents[normalizedId],
|
|
1737
|
-
...data
|
|
1797
|
+
if (prev[itemId]) {
|
|
1798
|
+
if (prev[itemId] > 1) {
|
|
1799
|
+
systemLog("dsp", "[unregisterProvider] snizuji ", itemId, "z ", prev[itemId], " na ", prev[itemId] - 1);
|
|
1800
|
+
return {
|
|
1801
|
+
...prev,
|
|
1802
|
+
[itemId]: prev[itemId] - 1
|
|
1738
1803
|
};
|
|
1739
1804
|
} else {
|
|
1740
|
-
|
|
1741
|
-
|
|
1742
|
-
|
|
1743
|
-
|
|
1744
|
-
|
|
1745
|
-
|
|
1746
|
-
|
|
1747
|
-
|
|
1748
|
-
|
|
1749
|
-
|
|
1750
|
-
|
|
1751
|
-
});
|
|
1752
|
-
return newC;
|
|
1753
|
-
});
|
|
1754
|
-
if (Object.keys(items).length > 0) {
|
|
1755
|
-
setDocuments((prev) => ({ ...prev, ...items }));
|
|
1756
|
-
}
|
|
1757
|
-
result = {
|
|
1758
|
-
...provider,
|
|
1759
|
-
data: dataList,
|
|
1760
|
-
lastUpdate: { id: uuid(), time: /* @__PURE__ */ new Date() }
|
|
1761
|
-
};
|
|
1762
|
-
setProviders((prev) => ({
|
|
1763
|
-
...prev,
|
|
1764
|
-
[id]: result
|
|
1765
|
-
}));
|
|
1766
|
-
setCounterProviders((prev) => ({
|
|
1767
|
-
...prev,
|
|
1768
|
-
[id]: 1
|
|
1769
|
-
}));
|
|
1770
|
-
if (provider.dataSource?.socketListeners) {
|
|
1771
|
-
registerProviderSockets(provider.dataSource.socketListeners);
|
|
1772
|
-
}
|
|
1773
|
-
console.timeEnd(`[DSP] VYTVARENI PROVIDERA ${id}`);
|
|
1774
|
-
} catch (error) {
|
|
1775
|
-
console.error("[DataStoreProvider] registerProvider:error", { id: newItem.id, error });
|
|
1776
|
-
throw error;
|
|
1777
|
-
}
|
|
1778
|
-
}
|
|
1779
|
-
return result;
|
|
1780
|
-
},
|
|
1781
|
-
[providers, documents, setDocuments, setProviders, setCounterProviders, registerProviderSockets, persistenceStorage]
|
|
1782
|
-
);
|
|
1783
|
-
const unregisterProvider = useCallback(
|
|
1784
|
-
async (itemId) => {
|
|
1785
|
-
setCounterProviders((prev) => {
|
|
1786
|
-
if (prev[itemId]) {
|
|
1787
|
-
if (prev[itemId] > 1) {
|
|
1788
|
-
systemLog("dsp", "[unregisterProvider] snizuji ", itemId, "z ", prev[itemId], " na ", prev[itemId] - 1);
|
|
1789
|
-
return {
|
|
1790
|
-
...prev,
|
|
1791
|
-
[itemId]: prev[itemId] - 1
|
|
1792
|
-
};
|
|
1793
|
-
} else {
|
|
1794
|
-
systemLog("dsp", "[unregisterProvider] mazu ", Object.keys(providers));
|
|
1795
|
-
unregisterProviderSockets(providers[itemId]?.dataSource.socketListeners);
|
|
1796
|
-
systemLog("dsp", "[unregisterProvider] Mazu dokumenty providera ", itemId);
|
|
1797
|
-
setCounterDocuments((cd) => {
|
|
1798
|
-
const newC = { ...cd };
|
|
1799
|
-
const deleteDocumentIds = [];
|
|
1800
|
-
providers[itemId].data.forEach((docId) => {
|
|
1801
|
-
if (newC[docId] <= 1) {
|
|
1802
|
-
deleteDocumentIds.push(docId);
|
|
1803
|
-
delete newC[docId];
|
|
1804
|
-
} else newC[docId] = newC[docId] - 1;
|
|
1805
|
-
});
|
|
1806
|
-
if (deleteDocumentIds.length > 0) {
|
|
1807
|
-
setDocuments((pd) => {
|
|
1808
|
-
const newD = { ...pd };
|
|
1809
|
-
deleteDocumentIds.forEach((docId) => {
|
|
1810
|
-
delete newD[docId];
|
|
1811
|
-
});
|
|
1812
|
-
return newD;
|
|
1805
|
+
systemLog("dsp", "[unregisterProvider] mazu ", Object.keys(providers));
|
|
1806
|
+
unregisterProviderSockets(providers[itemId]?.dataSource.socketListeners);
|
|
1807
|
+
systemLog("dsp", "[unregisterProvider] Mazu dokumenty providera ", itemId);
|
|
1808
|
+
setCounterDocuments((cd) => {
|
|
1809
|
+
const newC = { ...cd };
|
|
1810
|
+
const deleteDocumentIds = [];
|
|
1811
|
+
providers[itemId].data.forEach((docId) => {
|
|
1812
|
+
if (newC[docId] <= 1) {
|
|
1813
|
+
deleteDocumentIds.push(docId);
|
|
1814
|
+
delete newC[docId];
|
|
1815
|
+
} else newC[docId] = newC[docId] - 1;
|
|
1813
1816
|
});
|
|
1814
|
-
|
|
1815
|
-
|
|
1816
|
-
|
|
1817
|
-
|
|
1818
|
-
|
|
1819
|
-
|
|
1820
|
-
|
|
1821
|
-
|
|
1822
|
-
|
|
1823
|
-
|
|
1824
|
-
|
|
1825
|
-
|
|
1826
|
-
|
|
1827
|
-
|
|
1828
|
-
|
|
1829
|
-
|
|
1830
|
-
|
|
1831
|
-
|
|
1832
|
-
|
|
1833
|
-
|
|
1834
|
-
|
|
1835
|
-
|
|
1836
|
-
|
|
1837
|
-
|
|
1838
|
-
|
|
1839
|
-
|
|
1840
|
-
|
|
1841
|
-
|
|
1842
|
-
|
|
1843
|
-
|
|
1844
|
-
|
|
1845
|
-
|
|
1846
|
-
|
|
1847
|
-
|
|
1848
|
-
|
|
1849
|
-
|
|
1850
|
-
|
|
1851
|
-
|
|
1852
|
-
|
|
1853
|
-
|
|
1854
|
-
|
|
1855
|
-
|
|
1856
|
-
|
|
1857
|
-
|
|
1858
|
-
|
|
1859
|
-
|
|
1860
|
-
|
|
1861
|
-
|
|
1862
|
-
|
|
1863
|
-
|
|
1864
|
-
|
|
1865
|
-
|
|
1866
|
-
|
|
1867
|
-
|
|
1868
|
-
|
|
1869
|
-
|
|
1870
|
-
|
|
1871
|
-
|
|
1872
|
-
|
|
1873
|
-
|
|
1874
|
-
|
|
1875
|
-
|
|
1876
|
-
|
|
1877
|
-
|
|
1878
|
-
|
|
1879
|
-
|
|
1880
|
-
|
|
1881
|
-
|
|
1882
|
-
|
|
1883
|
-
|
|
1884
|
-
|
|
1885
|
-
|
|
1886
|
-
|
|
1887
|
-
|
|
1888
|
-
|
|
1889
|
-
|
|
1890
|
-
|
|
1891
|
-
|
|
1892
|
-
|
|
1817
|
+
if (deleteDocumentIds.length > 0) {
|
|
1818
|
+
setDocuments((pd) => {
|
|
1819
|
+
const newD = { ...pd };
|
|
1820
|
+
deleteDocumentIds.forEach((docId) => {
|
|
1821
|
+
delete newD[docId];
|
|
1822
|
+
});
|
|
1823
|
+
return newD;
|
|
1824
|
+
});
|
|
1825
|
+
}
|
|
1826
|
+
return newC;
|
|
1827
|
+
});
|
|
1828
|
+
setProviders((pp) => {
|
|
1829
|
+
const newProvs2 = { ...pp };
|
|
1830
|
+
delete newProvs2[itemId];
|
|
1831
|
+
return newProvs2;
|
|
1832
|
+
});
|
|
1833
|
+
const newProvs = { ...prev };
|
|
1834
|
+
delete newProvs[itemId];
|
|
1835
|
+
return newProvs;
|
|
1836
|
+
}
|
|
1837
|
+
} else return prev;
|
|
1838
|
+
});
|
|
1839
|
+
},
|
|
1840
|
+
[setCounterProviders, providers, setCounterDocuments, setDocuments, setProviders, unregisterProviderSockets]
|
|
1841
|
+
);
|
|
1842
|
+
const actionsValue = useMemo(
|
|
1843
|
+
() => ({
|
|
1844
|
+
dispatch,
|
|
1845
|
+
initProvider,
|
|
1846
|
+
resetProvider,
|
|
1847
|
+
registerProvider,
|
|
1848
|
+
unregisterProvider,
|
|
1849
|
+
updateProviderListeners,
|
|
1850
|
+
resetDataStore,
|
|
1851
|
+
startSockets,
|
|
1852
|
+
stopSockets,
|
|
1853
|
+
registerProviderSockets,
|
|
1854
|
+
unregisterProviderSockets,
|
|
1855
|
+
updateDocuments,
|
|
1856
|
+
presetProviders
|
|
1857
|
+
}),
|
|
1858
|
+
[
|
|
1859
|
+
dispatch,
|
|
1860
|
+
initProvider,
|
|
1861
|
+
resetProvider,
|
|
1862
|
+
registerProvider,
|
|
1863
|
+
unregisterProvider,
|
|
1864
|
+
updateProviderListeners,
|
|
1865
|
+
resetDataStore,
|
|
1866
|
+
startSockets,
|
|
1867
|
+
stopSockets,
|
|
1868
|
+
registerProviderSockets,
|
|
1869
|
+
unregisterProviderSockets,
|
|
1870
|
+
updateDocuments,
|
|
1871
|
+
presetProviders
|
|
1872
|
+
]
|
|
1873
|
+
);
|
|
1874
|
+
const metaValue = useMemo(
|
|
1875
|
+
() => ({ isLive, isSynchronizing, sockets, counterProviders, counterDocuments }),
|
|
1876
|
+
[isLive, isSynchronizing, sockets, counterProviders, counterDocuments]
|
|
1877
|
+
);
|
|
1878
|
+
const stableValue = useMemo(
|
|
1879
|
+
() => ({
|
|
1880
|
+
dispatch,
|
|
1881
|
+
presetProviders,
|
|
1882
|
+
updateProviderListeners,
|
|
1883
|
+
subscribeToProvider,
|
|
1884
|
+
getProviderLastUpdate,
|
|
1885
|
+
getExternalDocuments,
|
|
1886
|
+
getExternalProviders
|
|
1887
|
+
}),
|
|
1888
|
+
[
|
|
1889
|
+
dispatch,
|
|
1890
|
+
presetProviders,
|
|
1891
|
+
updateProviderListeners,
|
|
1892
|
+
subscribeToProvider,
|
|
1893
|
+
getProviderLastUpdate,
|
|
1894
|
+
getExternalDocuments,
|
|
1895
|
+
getExternalProviders
|
|
1896
|
+
]
|
|
1897
|
+
);
|
|
1898
|
+
useImperativeHandle(ref, () => actionsValue, [actionsValue]);
|
|
1899
|
+
systemLog("dsp", "END");
|
|
1900
|
+
return (
|
|
1901
|
+
// <DatabaseProvider>
|
|
1902
|
+
/* @__PURE__ */ jsx(DataStoreStableContext.Provider, { value: stableValue, children: /* @__PURE__ */ jsx(DataStoreActionsContext.Provider, { value: actionsValue, children: /* @__PURE__ */ jsx(DataStoreProvidersContext.Provider, { value: providers, children: /* @__PURE__ */ jsx(DataStoreDocumentsContext.Provider, { value: documents, children: /* @__PURE__ */ jsx(DataStoreContext.Provider, { value: metaValue, children: props.children }) }) }) }) })
|
|
1903
|
+
);
|
|
1904
|
+
}
|
|
1905
|
+
);
|
|
1893
1906
|
var DataStoreProvider_default = DataStoreProvider;
|
|
1894
1907
|
|
|
1895
1908
|
// src/useDataProvider.tsx
|