napp-wallet-post-feed-test 1.0.47
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/README.md +157 -0
- package/dist/0ae4e6254fc19607c79e.woff2 +0 -0
- package/dist/1f38a564cd9eae27ebc3.woff2 +0 -0
- package/dist/432.napp.bundle.js +1 -0
- package/dist/661bd6b7245d5205d3e1.woff2 +0 -0
- package/dist/Post.browser.js +24 -0
- package/dist/Post.js +606 -0
- package/dist/components/CodeSplitting.js +88 -0
- package/dist/components/Deeplink/Deeplink.js +813 -0
- package/dist/components/EditPostModal.js +916 -0
- package/dist/components/ErrorBoundary.js +74 -0
- package/dist/components/ExpandedTest/ExpandableText.js +38 -0
- package/dist/components/FilterDropdown.js +71 -0
- package/dist/components/ImagePreloader.js +1194 -0
- package/dist/components/Loader.js +42 -0
- package/dist/components/LoadingSkeletons.js +978 -0
- package/dist/components/MediaRenderer.js +759 -0
- package/dist/components/MemoryManager.js +302 -0
- package/dist/components/PostCard.js +446 -0
- package/dist/components/PostViews.js +247 -0
- package/dist/components/Postfeed.js +251 -0
- package/dist/components/Svgloader.js +231 -0
- package/dist/components/UploadPostModal.js +1352 -0
- package/dist/components/VideoPlayer.js +1304 -0
- package/dist/components/ViewPostModal/MediaPreloadManager.js +379 -0
- package/dist/components/ViewPostModal/README.md +164 -0
- package/dist/components/ViewPostModal/ShareModal.js +96 -0
- package/dist/components/ViewPostModal/VirtualPost.js +248 -0
- package/dist/components/ViewPostModal/useBodyScrollLock.js +42 -0
- package/dist/components/ViewPostModal/useDeviceDetection.js +38 -0
- package/dist/components/ViewPostModal/useFullscreenManager.js +43 -0
- package/dist/components/ViewPostModal/useNavigationManager.js +185 -0
- package/dist/components/ViewPostModal/usePostDataManager.js +143 -0
- package/dist/components/ViewPostModal/usePreloadManager.js +97 -0
- package/dist/components/ViewPostModal/useShareManager.js +76 -0
- package/dist/components/ViewPostModal.js +552 -0
- package/dist/components/VirtualPostFeed.js +475 -0
- package/dist/components/hooks/useFeedVisibility.js +72 -0
- package/dist/components/hooks/useIntersectionObserver.js +54 -0
- package/dist/components/hooks/usePerformanceMonitor.js +159 -0
- package/dist/components/hooks/usePostApi.js +381 -0
- package/dist/components/hooks/usePostState.js +116 -0
- package/dist/components/useImagePreloading.js +231 -0
- package/dist/e7461d69dbbff1310a5c.woff2 +0 -0
- package/dist/helper/Helper.js +504 -0
- package/dist/index.browser.js +5 -0
- package/dist/index.js +3 -0
- package/dist/napp.bundle.js +2 -0
- package/dist/napp.bundle.js.LICENSE.txt +733 -0
- package/dist/style/post.css +5751 -0
- package/dist/style/post.css.map +1 -0
- package/dist/style/post.purged.css +3236 -0
- package/dist/style/post.scss +5910 -0
- package/dist/utils/bootstrap.js +4 -0
- package/dist/utils/ffmpegLoader.js +40 -0
- package/package.json +70 -0
package/dist/Post.js
ADDED
|
@@ -0,0 +1,606 @@
|
|
|
1
|
+
function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i.return) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
|
|
2
|
+
function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { if (r) i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n;else { var o = function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); }; o("next", 0), o("throw", 1), o("return", 2); } }, _regeneratorDefine2(e, r, n, t); }
|
|
3
|
+
function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
|
|
4
|
+
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
5
|
+
function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
|
|
6
|
+
function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
|
|
7
|
+
function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
|
|
8
|
+
function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
|
|
9
|
+
function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
|
|
10
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
11
|
+
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
12
|
+
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
13
|
+
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
|
14
|
+
function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
|
|
15
|
+
import React from "react";
|
|
16
|
+
import useState from "react";
|
|
17
|
+
import useEffect from "react";
|
|
18
|
+
import useCallback from "react";
|
|
19
|
+
import useMemo from "react";
|
|
20
|
+
import memo from "react";
|
|
21
|
+
import useRef from "react";
|
|
22
|
+
import PropTypes from "prop-types";
|
|
23
|
+
import "./style/post.scss";
|
|
24
|
+
import "bootstrap/dist/css/bootstrap.min.css";
|
|
25
|
+
import "bootstrap/dist/js/bootstrap.min.js";
|
|
26
|
+
import { newwalletpostapi } from "./helper/Helper";
|
|
27
|
+
import { ToastContainer, toast } from 'react-toastify';
|
|
28
|
+
import 'react-toastify/dist/ReactToastify.css';
|
|
29
|
+
|
|
30
|
+
// Enhanced imports with all available components
|
|
31
|
+
import { FeedLoadingSkeleton } from "./components/LoadingSkeletons";
|
|
32
|
+
import { LazyUploadPostModal, LazyViewPostModal, LazyEditPostModal } from "./components/CodeSplitting";
|
|
33
|
+
import VirtualPostFeed from "./components/VirtualPostFeed";
|
|
34
|
+
import { useFeedVisibility } from "./components/hooks/useFeedVisibility";
|
|
35
|
+
import ErrorBoundary from "./components/ErrorBoundary";
|
|
36
|
+
import { memoryManager } from "./components/MemoryManager";
|
|
37
|
+
|
|
38
|
+
// Fallback imports for direct component access
|
|
39
|
+
import UploadPostModal from "./components/UploadPostModal";
|
|
40
|
+
import ViewPostModal from "./components/ViewPostModal";
|
|
41
|
+
import EditPostModal from "./components/EditPostModal";
|
|
42
|
+
import PostFeed from "./components/Postfeed";
|
|
43
|
+
import InfiniteScroll from "react-infinite-scroll-component";
|
|
44
|
+
import Loader from "./components/Loader";
|
|
45
|
+
|
|
46
|
+
// CRITICAL: Mobile detection for memory optimization
|
|
47
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
48
|
+
var isMobile = function isMobile() {
|
|
49
|
+
return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
|
|
50
|
+
};
|
|
51
|
+
var Post = function Post(_ref) {
|
|
52
|
+
var parameters = _ref.parameters;
|
|
53
|
+
var _useState = useState([]),
|
|
54
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
55
|
+
apiData = _useState2[0],
|
|
56
|
+
setApiData = _useState2[1];
|
|
57
|
+
var _useState3 = useState([]),
|
|
58
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
|
59
|
+
displayData = _useState4[0],
|
|
60
|
+
setDisplayData = _useState4[1];
|
|
61
|
+
var _useState5 = useState(""),
|
|
62
|
+
_useState6 = _slicedToArray(_useState5, 2),
|
|
63
|
+
selectedFilter = _useState6[0],
|
|
64
|
+
setSelectedFilter = _useState6[1];
|
|
65
|
+
var _useState7 = useState(1),
|
|
66
|
+
_useState8 = _slicedToArray(_useState7, 2),
|
|
67
|
+
pageNum = _useState8[0],
|
|
68
|
+
setPageNum = _useState8[1];
|
|
69
|
+
var _useState9 = useState(false),
|
|
70
|
+
_useState0 = _slicedToArray(_useState9, 2),
|
|
71
|
+
toggle = _useState0[0],
|
|
72
|
+
setToggle = _useState0[1];
|
|
73
|
+
var _useState1 = useState(false),
|
|
74
|
+
_useState10 = _slicedToArray(_useState1, 2),
|
|
75
|
+
showModal = _useState10[0],
|
|
76
|
+
setShowModal = _useState10[1];
|
|
77
|
+
var _useState11 = useState(false),
|
|
78
|
+
_useState12 = _slicedToArray(_useState11, 2),
|
|
79
|
+
loading = _useState12[0],
|
|
80
|
+
setLoading = _useState12[1];
|
|
81
|
+
var _useState13 = useState(true),
|
|
82
|
+
_useState14 = _slicedToArray(_useState13, 2),
|
|
83
|
+
initialLoading = _useState14[0],
|
|
84
|
+
setInitialLoading = _useState14[1];
|
|
85
|
+
var _useState15 = useState(true),
|
|
86
|
+
_useState16 = _slicedToArray(_useState15, 2),
|
|
87
|
+
isRefreshing = _useState16[0],
|
|
88
|
+
setIsRefreshing = _useState16[1];
|
|
89
|
+
var _useState17 = useState(true),
|
|
90
|
+
_useState18 = _slicedToArray(_useState17, 2),
|
|
91
|
+
hasMoreData = _useState18[0],
|
|
92
|
+
setHasMoreData = _useState18[1];
|
|
93
|
+
var _useState19 = useState(null),
|
|
94
|
+
_useState20 = _slicedToArray(_useState19, 2),
|
|
95
|
+
activeSettings = _useState20[0],
|
|
96
|
+
setActiveSettings = _useState20[1];
|
|
97
|
+
var _useState21 = useState(null),
|
|
98
|
+
_useState22 = _slicedToArray(_useState21, 2),
|
|
99
|
+
isShareOpen = _useState22[0],
|
|
100
|
+
setIsShareOpen = _useState22[1];
|
|
101
|
+
var _useState23 = useState(false),
|
|
102
|
+
_useState24 = _slicedToArray(_useState23, 2),
|
|
103
|
+
isViewPostModalOpen = _useState24[0],
|
|
104
|
+
setIsViewPostModalOpen = _useState24[1];
|
|
105
|
+
var _useState25 = useState(false),
|
|
106
|
+
_useState26 = _slicedToArray(_useState25, 2),
|
|
107
|
+
showViewPostModal = _useState26[0],
|
|
108
|
+
setShowViewPostModal = _useState26[1];
|
|
109
|
+
var _useState27 = useState(null),
|
|
110
|
+
_useState28 = _slicedToArray(_useState27, 2),
|
|
111
|
+
viewPostData = _useState28[0],
|
|
112
|
+
setViewPostData = _useState28[1];
|
|
113
|
+
var _useState29 = useState(null),
|
|
114
|
+
_useState30 = _slicedToArray(_useState29, 2),
|
|
115
|
+
currentPost = _useState30[0],
|
|
116
|
+
setCurrentPost = _useState30[1];
|
|
117
|
+
var _useState31 = useState(false),
|
|
118
|
+
_useState32 = _slicedToArray(_useState31, 2),
|
|
119
|
+
showEditModal = _useState32[0],
|
|
120
|
+
setShowEditModal = _useState32[1];
|
|
121
|
+
|
|
122
|
+
// Mobile detection for optimization
|
|
123
|
+
var mobileDevice = useMemo(function () {
|
|
124
|
+
return isMobile();
|
|
125
|
+
}, []);
|
|
126
|
+
|
|
127
|
+
// Feed visibility management hook
|
|
128
|
+
var _useFeedVisibility = useFeedVisibility(showViewPostModal),
|
|
129
|
+
getFeedClasses = _useFeedVisibility.getFeedClasses,
|
|
130
|
+
getModalClasses = _useFeedVisibility.getModalClasses;
|
|
131
|
+
|
|
132
|
+
// Fetch posts with mobile optimization and simple error handling
|
|
133
|
+
var fetchApiData = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
|
|
134
|
+
var response, newFeeds, updatedData, existingGuids, uniqueNewFeeds, _t;
|
|
135
|
+
return _regenerator().w(function (_context) {
|
|
136
|
+
while (1) switch (_context.n) {
|
|
137
|
+
case 0:
|
|
138
|
+
if (!(loading || !hasMoreData)) {
|
|
139
|
+
_context.n = 1;
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
142
|
+
return _context.a(2);
|
|
143
|
+
case 1:
|
|
144
|
+
setLoading(true);
|
|
145
|
+
_context.p = 2;
|
|
146
|
+
console.log('[Post] fetchApiData start', {
|
|
147
|
+
pageNum: pageNum,
|
|
148
|
+
hasMoreData: hasMoreData
|
|
149
|
+
});
|
|
150
|
+
_context.n = 3;
|
|
151
|
+
return newwalletpostapi(pageNum, parameters);
|
|
152
|
+
case 3:
|
|
153
|
+
response = _context.v;
|
|
154
|
+
newFeeds = response.dataPayload || [];
|
|
155
|
+
console.log('[Post] fetchApiData response', {
|
|
156
|
+
newFeedsCount: newFeeds.length
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
// CRITICAL: Optimize data merging for mobile - preserve first posts
|
|
160
|
+
|
|
161
|
+
if (pageNum === 1) {
|
|
162
|
+
updatedData = newFeeds;
|
|
163
|
+
} else {
|
|
164
|
+
// CRITICAL: More efficient deduplication for mobile - preserve existing data
|
|
165
|
+
existingGuids = new Set(apiData.map(function (feed) {
|
|
166
|
+
return feed.originalRSMGUID;
|
|
167
|
+
}));
|
|
168
|
+
uniqueNewFeeds = newFeeds.filter(function (feed) {
|
|
169
|
+
return !existingGuids.has(feed.originalRSMGUID);
|
|
170
|
+
});
|
|
171
|
+
updatedData = [].concat(_toConsumableArray(apiData), _toConsumableArray(uniqueNewFeeds));
|
|
172
|
+
}
|
|
173
|
+
setHasMoreData(newFeeds.length > 0);
|
|
174
|
+
setApiData(updatedData);
|
|
175
|
+
console.log('[Post] fetchApiData merged', {
|
|
176
|
+
totalCount: updatedData.length,
|
|
177
|
+
hasMore: newFeeds.length > 0
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
// Always clear initial loading when we successfully get data
|
|
181
|
+
if (pageNum === 1) {
|
|
182
|
+
setInitialLoading(false);
|
|
183
|
+
}
|
|
184
|
+
_context.n = 5;
|
|
185
|
+
break;
|
|
186
|
+
case 4:
|
|
187
|
+
_context.p = 4;
|
|
188
|
+
_t = _context.v;
|
|
189
|
+
// Error handling for failed post fetch
|
|
190
|
+
// Failed to fetch posts
|
|
191
|
+
|
|
192
|
+
// Clear initial loading on error if we have no data
|
|
193
|
+
if (pageNum === 1 && apiData.length === 0) {
|
|
194
|
+
setInitialLoading(false);
|
|
195
|
+
}
|
|
196
|
+
case 5:
|
|
197
|
+
_context.p = 5;
|
|
198
|
+
setLoading(false);
|
|
199
|
+
console.log('[Post] fetchApiData end');
|
|
200
|
+
return _context.f(5);
|
|
201
|
+
case 6:
|
|
202
|
+
return _context.a(2);
|
|
203
|
+
}
|
|
204
|
+
}, _callee, null, [[2, 4, 5, 6]]);
|
|
205
|
+
})), [loading, hasMoreData, pageNum, apiData, parameters]);
|
|
206
|
+
useEffect(function () {
|
|
207
|
+
// CRITICAL: Trigger initial load when component mounts
|
|
208
|
+
if (apiData.length === 0) {
|
|
209
|
+
setPageNum(1);
|
|
210
|
+
}
|
|
211
|
+
}, [apiData.length]);
|
|
212
|
+
useEffect(function () {
|
|
213
|
+
// Always fetch data when component mounts or pageNum changes
|
|
214
|
+
if (pageNum === 1) {
|
|
215
|
+
// Use refresh function for first load
|
|
216
|
+
handleRefresh('first');
|
|
217
|
+
} else {
|
|
218
|
+
fetchApiData();
|
|
219
|
+
}
|
|
220
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
221
|
+
}, [pageNum]);
|
|
222
|
+
|
|
223
|
+
// Ensure initial loading shows for at least a short time
|
|
224
|
+
useEffect(function () {
|
|
225
|
+
if (initialLoading) {
|
|
226
|
+
var timer = setTimeout(function () {
|
|
227
|
+
// Only clear if we still have no data
|
|
228
|
+
if (apiData.length === 0) {
|
|
229
|
+
setInitialLoading(false);
|
|
230
|
+
}
|
|
231
|
+
}, 2000); // Reduced to 2 seconds for faster loading
|
|
232
|
+
|
|
233
|
+
return function () {
|
|
234
|
+
return clearTimeout(timer);
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
}, [initialLoading, apiData.length]);
|
|
238
|
+
useEffect(function () {
|
|
239
|
+
var filteredData = selectedFilter ? apiData.filter(function (feed) {
|
|
240
|
+
return selectedFilter === "wallet" ? feed.isFromWallet : feed.isFromToken;
|
|
241
|
+
}) : apiData;
|
|
242
|
+
setDisplayData(filteredData);
|
|
243
|
+
}, [apiData, selectedFilter]);
|
|
244
|
+
|
|
245
|
+
// CRITICAL: Memory cleanup when component unmounts
|
|
246
|
+
useEffect(function () {
|
|
247
|
+
// Register cleanup callback with memory manager
|
|
248
|
+
var unregisterCleanup = memoryManager.registerCleanupCallback(function () {
|
|
249
|
+
// Clear data to free memory - DISABLED to prevent data loss
|
|
250
|
+
// setApiData([]);
|
|
251
|
+
// Memory cleanup triggered but disabled to prevent data loss
|
|
252
|
+
});
|
|
253
|
+
return function () {
|
|
254
|
+
// Unregister cleanup callback
|
|
255
|
+
unregisterCleanup();
|
|
256
|
+
|
|
257
|
+
// Clear data to free memory - DISABLED to prevent data loss
|
|
258
|
+
// setApiData([]);
|
|
259
|
+
|
|
260
|
+
// CRITICAL: Trigger memory cleanup only on unmount
|
|
261
|
+
if (mobileDevice) {
|
|
262
|
+
memoryManager.manualCleanup();
|
|
263
|
+
}
|
|
264
|
+
};
|
|
265
|
+
}, [mobileDevice]);
|
|
266
|
+
|
|
267
|
+
// CRITICAL: Enhanced load more function with performance monitoring
|
|
268
|
+
var loadMoreData = useCallback(function () {
|
|
269
|
+
if (!loading && hasMoreData) {
|
|
270
|
+
console.log('[Post] loadMoreData trigger', {
|
|
271
|
+
currentPage: pageNum
|
|
272
|
+
});
|
|
273
|
+
// Minimal delay for faster loading
|
|
274
|
+
if (mobileDevice) {
|
|
275
|
+
setTimeout(function () {
|
|
276
|
+
setPageNum(function (prev) {
|
|
277
|
+
return prev + 1;
|
|
278
|
+
});
|
|
279
|
+
console.log('[Post] loadMoreData setPageNum (mobile)');
|
|
280
|
+
}, 50); // Minimal delay for mobile
|
|
281
|
+
} else {
|
|
282
|
+
setPageNum(function (prev) {
|
|
283
|
+
return prev + 1;
|
|
284
|
+
});
|
|
285
|
+
console.log('[Post] loadMoreData setPageNum');
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}, [loading, hasMoreData, mobileDevice]);
|
|
289
|
+
var handleSelectFilter = function handleSelectFilter(value) {
|
|
290
|
+
setSelectedFilter(value);
|
|
291
|
+
setToggle(false);
|
|
292
|
+
};
|
|
293
|
+
useEffect(function () {
|
|
294
|
+
var handleClickOutsideSettings = function handleClickOutsideSettings(event) {
|
|
295
|
+
var _document$getElementB;
|
|
296
|
+
if (activeSettings && !((_document$getElementB = document.getElementById(activeSettings)) !== null && _document$getElementB !== void 0 && _document$getElementB.contains(event.target))) {
|
|
297
|
+
setActiveSettings(null);
|
|
298
|
+
}
|
|
299
|
+
};
|
|
300
|
+
var handleClickOutsideShare = function handleClickOutsideShare(event) {
|
|
301
|
+
var _document$getElementB2;
|
|
302
|
+
if (isShareOpen && !((_document$getElementB2 = document.getElementById(isShareOpen)) !== null && _document$getElementB2 !== void 0 && _document$getElementB2.contains(event.target))) {
|
|
303
|
+
setIsShareOpen(null);
|
|
304
|
+
}
|
|
305
|
+
};
|
|
306
|
+
document.addEventListener("mousedown", handleClickOutsideSettings);
|
|
307
|
+
document.addEventListener("mousedown", handleClickOutsideShare);
|
|
308
|
+
return function () {
|
|
309
|
+
document.removeEventListener("mousedown", handleClickOutsideSettings);
|
|
310
|
+
document.removeEventListener("mousedown", handleClickOutsideShare);
|
|
311
|
+
};
|
|
312
|
+
}, [activeSettings, isShareOpen]);
|
|
313
|
+
var handleToggleFilter = function handleToggleFilter() {
|
|
314
|
+
setToggle(function (prevToggle) {
|
|
315
|
+
return !prevToggle;
|
|
316
|
+
});
|
|
317
|
+
};
|
|
318
|
+
var handleModalToggle = useCallback(function () {
|
|
319
|
+
setShowModal(function (prev) {
|
|
320
|
+
return !prev;
|
|
321
|
+
});
|
|
322
|
+
}, []);
|
|
323
|
+
|
|
324
|
+
// Copy handler
|
|
325
|
+
var handleCopy = useCallback(/*#__PURE__*/function () {
|
|
326
|
+
var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(text) {
|
|
327
|
+
var _t2;
|
|
328
|
+
return _regenerator().w(function (_context2) {
|
|
329
|
+
while (1) switch (_context2.n) {
|
|
330
|
+
case 0:
|
|
331
|
+
_context2.p = 0;
|
|
332
|
+
_context2.n = 1;
|
|
333
|
+
return navigator.clipboard.writeText(text);
|
|
334
|
+
case 1:
|
|
335
|
+
_context2.n = 3;
|
|
336
|
+
break;
|
|
337
|
+
case 2:
|
|
338
|
+
_context2.p = 2;
|
|
339
|
+
_t2 = _context2.v;
|
|
340
|
+
case 3:
|
|
341
|
+
return _context2.a(2);
|
|
342
|
+
}
|
|
343
|
+
}, _callee2, null, [[0, 2]]);
|
|
344
|
+
}));
|
|
345
|
+
return function (_x) {
|
|
346
|
+
return _ref3.apply(this, arguments);
|
|
347
|
+
};
|
|
348
|
+
}(), []);
|
|
349
|
+
|
|
350
|
+
// Robust refresh handler for all scenarios (first, edit, upload, delete)
|
|
351
|
+
var handleRefresh = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3() {
|
|
352
|
+
var refreshType,
|
|
353
|
+
refreshMessages,
|
|
354
|
+
forceRefresh,
|
|
355
|
+
response,
|
|
356
|
+
newData,
|
|
357
|
+
_args3 = arguments,
|
|
358
|
+
_t3;
|
|
359
|
+
return _regenerator().w(function (_context3) {
|
|
360
|
+
while (1) switch (_context3.n) {
|
|
361
|
+
case 0:
|
|
362
|
+
refreshType = _args3.length > 0 && _args3[0] !== undefined ? _args3[0] : 'general';
|
|
363
|
+
console.log('[Post] handleRefresh start', {
|
|
364
|
+
refreshType: refreshType
|
|
365
|
+
});
|
|
366
|
+
refreshMessages = {
|
|
367
|
+
'first': 'Loading posts...',
|
|
368
|
+
'edit': 'Refreshing after edit...',
|
|
369
|
+
'upload': 'Refreshing after upload...',
|
|
370
|
+
'delete': 'Refreshing after delete...',
|
|
371
|
+
'general': 'Refreshing posts...'
|
|
372
|
+
}; // Prevent multiple simultaneous refreshes
|
|
373
|
+
if (!(loading && refreshType === 'first')) {
|
|
374
|
+
_context3.n = 1;
|
|
375
|
+
break;
|
|
376
|
+
}
|
|
377
|
+
return _context3.a(2);
|
|
378
|
+
case 1:
|
|
379
|
+
setLoading(true);
|
|
380
|
+
setPageNum(1);
|
|
381
|
+
setApiData([]);
|
|
382
|
+
setIsRefreshing(true);
|
|
383
|
+
setInitialLoading(true);
|
|
384
|
+
_context3.p = 2;
|
|
385
|
+
// Force refresh with cache-busting for edit/upload operations
|
|
386
|
+
forceRefresh = refreshType === 'edit' || refreshType === 'upload'; // Post refresh
|
|
387
|
+
_context3.n = 3;
|
|
388
|
+
return newwalletpostapi(1, parameters, forceRefresh);
|
|
389
|
+
case 3:
|
|
390
|
+
response = _context3.v;
|
|
391
|
+
newData = response.dataPayload || []; // Received data
|
|
392
|
+
setApiData(newData);
|
|
393
|
+
setHasMoreData(newData.length > 0);
|
|
394
|
+
setIsRefreshing(false);
|
|
395
|
+
setInitialLoading(false);
|
|
396
|
+
console.log('[Post] handleRefresh response', {
|
|
397
|
+
newCount: newData.length,
|
|
398
|
+
hasMore: newData.length > 0
|
|
399
|
+
});
|
|
400
|
+
_context3.n = 5;
|
|
401
|
+
break;
|
|
402
|
+
case 4:
|
|
403
|
+
_context3.p = 4;
|
|
404
|
+
_t3 = _context3.v;
|
|
405
|
+
setIsRefreshing(false);
|
|
406
|
+
setInitialLoading(false);
|
|
407
|
+
console.log('[Post] handleRefresh error', _t3);
|
|
408
|
+
case 5:
|
|
409
|
+
_context3.p = 5;
|
|
410
|
+
setLoading(false);
|
|
411
|
+
console.log('[Post] handleRefresh end');
|
|
412
|
+
return _context3.f(5);
|
|
413
|
+
case 6:
|
|
414
|
+
return _context3.a(2);
|
|
415
|
+
}
|
|
416
|
+
}, _callee3, null, [[2, 4, 5, 6]]);
|
|
417
|
+
})), [loading, parameters]);
|
|
418
|
+
|
|
419
|
+
// Settings/Share dropdown logic (delegated to children)
|
|
420
|
+
var handleToggleSettings = useCallback(function (dropdownId) {
|
|
421
|
+
setActiveSettings(activeSettings === dropdownId ? null : dropdownId);
|
|
422
|
+
}, [activeSettings]);
|
|
423
|
+
var toggleShareOptions = useCallback(function (sharedbtnId) {
|
|
424
|
+
setIsShareOpen(isShareOpen === sharedbtnId ? null : sharedbtnId);
|
|
425
|
+
}, [isShareOpen]);
|
|
426
|
+
|
|
427
|
+
// CRITICAL: Memoize feed data to prevent unnecessary re-renders
|
|
428
|
+
var memoizedFeedData = useMemo(function () {
|
|
429
|
+
return apiData;
|
|
430
|
+
}, [apiData]);
|
|
431
|
+
|
|
432
|
+
// CRITICAL: ViewPostModal state handlers for performance optimization
|
|
433
|
+
var handleViewPostModalOpen = useCallback(function () {
|
|
434
|
+
setIsViewPostModalOpen(true);
|
|
435
|
+
}, []);
|
|
436
|
+
var handleViewPostModalClose = useCallback(function () {
|
|
437
|
+
setIsViewPostModalOpen(false);
|
|
438
|
+
}, []);
|
|
439
|
+
var handleOpenViewPostModal = useCallback(function (post) {
|
|
440
|
+
setViewPostData(post);
|
|
441
|
+
setShowViewPostModal(true);
|
|
442
|
+
handleViewPostModalOpen();
|
|
443
|
+
}, [handleViewPostModalOpen]);
|
|
444
|
+
var handleCloseViewPostModal = useCallback(function () {
|
|
445
|
+
setShowViewPostModal(false);
|
|
446
|
+
setViewPostData(null);
|
|
447
|
+
handleViewPostModalClose();
|
|
448
|
+
}, [handleViewPostModalClose]);
|
|
449
|
+
var handleOpenEditModal = useCallback(function (post) {
|
|
450
|
+
setCurrentPost(post);
|
|
451
|
+
setShowEditModal(true);
|
|
452
|
+
}, []);
|
|
453
|
+
var handleRemovePost = useCallback(/*#__PURE__*/function () {
|
|
454
|
+
var _ref5 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4(rsmguid) {
|
|
455
|
+
return _regenerator().w(function (_context4) {
|
|
456
|
+
while (1) switch (_context4.n) {
|
|
457
|
+
case 0:
|
|
458
|
+
try {
|
|
459
|
+
// Remove post from local state immediately for better UX
|
|
460
|
+
setApiData(function (prevData) {
|
|
461
|
+
return prevData.filter(function (post) {
|
|
462
|
+
return post.rsmguid !== rsmguid;
|
|
463
|
+
});
|
|
464
|
+
});
|
|
465
|
+
|
|
466
|
+
// Refresh data to sync with server
|
|
467
|
+
handleRefresh('delete');
|
|
468
|
+
} catch (error) {
|
|
469
|
+
// Error handling for post removal
|
|
470
|
+
}
|
|
471
|
+
case 1:
|
|
472
|
+
return _context4.a(2);
|
|
473
|
+
}
|
|
474
|
+
}, _callee4);
|
|
475
|
+
}));
|
|
476
|
+
return function (_x2) {
|
|
477
|
+
return _ref5.apply(this, arguments);
|
|
478
|
+
};
|
|
479
|
+
}(), [handleRefresh]);
|
|
480
|
+
return /*#__PURE__*/_jsxs("div", {
|
|
481
|
+
className: "post-modal-desktop pb-3",
|
|
482
|
+
id: "postsModal",
|
|
483
|
+
style: {
|
|
484
|
+
backgroundColor: '#03001c',
|
|
485
|
+
minHeight: '100vh',
|
|
486
|
+
overflow: 'hidden'
|
|
487
|
+
},
|
|
488
|
+
children: [/*#__PURE__*/_jsx("section", {
|
|
489
|
+
id: "post-section",
|
|
490
|
+
children: /*#__PURE__*/_jsx("div", {
|
|
491
|
+
className: "container-fluid",
|
|
492
|
+
children: /*#__PURE__*/_jsx("div", {
|
|
493
|
+
className: "row justify-content-center",
|
|
494
|
+
children: /*#__PURE__*/_jsx("div", {
|
|
495
|
+
className: "col-sm-12 ",
|
|
496
|
+
children: /*#__PURE__*/_jsx("div", {
|
|
497
|
+
className: "tab-content",
|
|
498
|
+
children: /*#__PURE__*/_jsx("div", {
|
|
499
|
+
id: "myfeeds-tab",
|
|
500
|
+
children: memoizedFeedData.length === 0 && (initialLoading || isRefreshing) ?
|
|
501
|
+
/*#__PURE__*/
|
|
502
|
+
// Show skeleton loader during initial load, refresh, or retry
|
|
503
|
+
_jsx("div", {
|
|
504
|
+
className: "initial-loading-container",
|
|
505
|
+
children: /*#__PURE__*/_jsx(FeedLoadingSkeleton, {
|
|
506
|
+
count: isRefreshing ? 1 : 3
|
|
507
|
+
})
|
|
508
|
+
}) : memoizedFeedData.length === 0 && !initialLoading ? /*#__PURE__*/_jsx("div", {
|
|
509
|
+
className: "no-data-message mt-2 py-5 bg-dark",
|
|
510
|
+
children: /*#__PURE__*/_jsxs("div", {
|
|
511
|
+
className: "align-items-center d-flex flex-column justify-content-center",
|
|
512
|
+
children: [/*#__PURE__*/_jsxs("div", {
|
|
513
|
+
className: "text-center mb-2",
|
|
514
|
+
children: [/*#__PURE__*/_jsx("h4", {
|
|
515
|
+
className: "text-white",
|
|
516
|
+
children: "There are currently no post from this wallet"
|
|
517
|
+
}), /*#__PURE__*/_jsx("p", {
|
|
518
|
+
className: "text-white",
|
|
519
|
+
children: "Let's post something!"
|
|
520
|
+
})]
|
|
521
|
+
}), /*#__PURE__*/_jsx("div", {
|
|
522
|
+
className: "text-white align-items-center d-flex no-feed-icon justify-content-center",
|
|
523
|
+
children: /*#__PURE__*/_jsx("i", {
|
|
524
|
+
className: "fas fa-mail-bulk"
|
|
525
|
+
})
|
|
526
|
+
})]
|
|
527
|
+
})
|
|
528
|
+
}) :
|
|
529
|
+
/*#__PURE__*/
|
|
530
|
+
// Always render post feed but with smooth transitions when ViewPostModal opens/closes
|
|
531
|
+
_jsx("div", {
|
|
532
|
+
className: getFeedClasses(),
|
|
533
|
+
children: /*#__PURE__*/_jsx(ErrorBoundary, {
|
|
534
|
+
children: /*#__PURE__*/_jsx(VirtualPostFeed, {
|
|
535
|
+
posts: memoizedFeedData,
|
|
536
|
+
isLoading: loading || isRefreshing,
|
|
537
|
+
hasMoreData: hasMoreData,
|
|
538
|
+
onLoadMore: loadMoreData,
|
|
539
|
+
onRefresh: function onRefresh() {
|
|
540
|
+
return handleRefresh('general');
|
|
541
|
+
},
|
|
542
|
+
onRemovePost: handleRemovePost,
|
|
543
|
+
handleToggleSettings: handleToggleSettings,
|
|
544
|
+
activeSettings: activeSettings,
|
|
545
|
+
toggleShareOptions: toggleShareOptions,
|
|
546
|
+
isShareOpen: isShareOpen,
|
|
547
|
+
onEdit: handleOpenEditModal,
|
|
548
|
+
onView: handleOpenViewPostModal,
|
|
549
|
+
onCopy: handleCopy,
|
|
550
|
+
settingsRefs: {},
|
|
551
|
+
shareRefs: {}
|
|
552
|
+
})
|
|
553
|
+
})
|
|
554
|
+
})
|
|
555
|
+
})
|
|
556
|
+
})
|
|
557
|
+
})
|
|
558
|
+
})
|
|
559
|
+
})
|
|
560
|
+
}), /*#__PURE__*/_jsx(LazyUploadPostModal, {
|
|
561
|
+
show: showModal,
|
|
562
|
+
handleClose: handleModalToggle,
|
|
563
|
+
refreshData: function refreshData() {
|
|
564
|
+
return handleRefresh('upload');
|
|
565
|
+
},
|
|
566
|
+
onUploadSuccess: function onUploadSuccess(result) {
|
|
567
|
+
handleRefresh('upload');
|
|
568
|
+
}
|
|
569
|
+
}), currentPost && /*#__PURE__*/_jsx(LazyEditPostModal, {
|
|
570
|
+
show: showEditModal,
|
|
571
|
+
handleClose: function handleClose() {
|
|
572
|
+
return setShowEditModal(false);
|
|
573
|
+
},
|
|
574
|
+
postData: currentPost,
|
|
575
|
+
refreshData: function refreshData() {
|
|
576
|
+
return handleRefresh('edit');
|
|
577
|
+
}
|
|
578
|
+
}), /*#__PURE__*/_jsx(LazyViewPostModal, {
|
|
579
|
+
show: showViewPostModal,
|
|
580
|
+
handleClose: handleCloseViewPostModal,
|
|
581
|
+
postData: viewPostData,
|
|
582
|
+
handleOpenEditModal: handleOpenEditModal,
|
|
583
|
+
handleRemovePost: handleRemovePost,
|
|
584
|
+
alreadyLogin: true,
|
|
585
|
+
isOnMyOwnWalletfunc: true,
|
|
586
|
+
allPosts: memoizedFeedData,
|
|
587
|
+
hasMoreData: hasMoreData,
|
|
588
|
+
pageNum: pageNum,
|
|
589
|
+
setPageNum: setPageNum,
|
|
590
|
+
className: getModalClasses()
|
|
591
|
+
}), /*#__PURE__*/_jsx(ToastContainer, {
|
|
592
|
+
position: "bottom-right",
|
|
593
|
+
autoClose: 3000,
|
|
594
|
+
hideProgressBar: false,
|
|
595
|
+
newestOnTop: true,
|
|
596
|
+
closeOnClick: true,
|
|
597
|
+
pauseOnFocusLoss: true,
|
|
598
|
+
draggable: true,
|
|
599
|
+
pauseOnHover: true
|
|
600
|
+
})]
|
|
601
|
+
});
|
|
602
|
+
};
|
|
603
|
+
Post.propTypes = {
|
|
604
|
+
parameters: PropTypes.object
|
|
605
|
+
};
|
|
606
|
+
export default Post;
|