diff --git a/common/ASC.Common/Threading/Channel/ChannelExtension.cs b/common/ASC.Common/Threading/Channel/ChannelExtension.cs index 7e799890a7..e0dbe86d4d 100644 --- a/common/ASC.Common/Threading/Channel/ChannelExtension.cs +++ b/common/ASC.Common/Threading/Channel/ChannelExtension.cs @@ -58,7 +58,7 @@ public static class ChannelExtension await outputs[index].Writer.WriteAsync(item, cancellationToken); } } - catch (OperationCanceledException ex) + catch (OperationCanceledException) { // TODO: catch error via additional channel // var error = Channel.CreateUnbounded(); @@ -96,7 +96,7 @@ public static class ChannelExtension await Task.WhenAll(inputs.Select(i => Redirect(i)).ToArray()); } - catch (OperationCanceledException ex) + catch (OperationCanceledException) { // TODO: catch error via additional channel // var error = Channel.CreateUnbounded(); diff --git a/packages/client/src/helpers/confirmRoute.js b/packages/client/src/helpers/confirmRoute.js index 9094535e77..9cf9d6bdbe 100644 --- a/packages/client/src/helpers/confirmRoute.js +++ b/packages/client/src/helpers/confirmRoute.js @@ -18,7 +18,7 @@ class ConfirmRoute extends React.Component { } componentDidMount() { - const { forUnauthorized, history, isAuthenticated } = this.props; + const { forUnauthorized, isAuthenticated } = this.props; if (forUnauthorized && isAuthenticated) { this.props.logout(); @@ -42,18 +42,25 @@ class ConfirmRoute extends React.Component { .then((validationResult) => { switch (validationResult) { case ValidationResult.Ok: - const confirmHeader = `${confirmLinkData}&${search.slice(1)}`; + const confirmHeader = search.slice(1); const linkData = { ...confirmLinkData, confirmHeader, }; + + console.log("checkConfirmLink", { + confirmLinkData, + validationResult, + linkData, + }); + this.setState({ isLoaded: true, linkData, }); break; case ValidationResult.Invalid: - console.error("invlid link"); + console.error("invlid link", { confirmLinkData, validationResult }); window.location.href = combineUrl( window.DocSpaceConfig?.proxy?.url, path, @@ -61,7 +68,10 @@ class ConfirmRoute extends React.Component { ); break; case ValidationResult.Expired: - console.error("expired link"); + console.error("expired link", { + confirmLinkData, + validationResult, + }); window.location.href = combineUrl( window.DocSpaceConfig?.proxy?.url, path, @@ -69,7 +79,10 @@ class ConfirmRoute extends React.Component { ); break; default: - console.error("unknown link"); + console.error("unknown link", { + confirmLinkData, + validationResult, + }); window.location.href = combineUrl( window.DocSpaceConfig?.proxy?.url, path, @@ -79,7 +92,7 @@ class ConfirmRoute extends React.Component { } }) .catch((error) => { - console.error(error); + console.error("FAILED checkConfirmLink", { error, confirmLinkData }); window.location.href = combineUrl( window.DocSpaceConfig?.proxy?.url, path, diff --git a/packages/client/src/store/FilesStore.js b/packages/client/src/store/FilesStore.js index ed40c4e2f8..de853c1150 100644 --- a/packages/client/src/store/FilesStore.js +++ b/packages/client/src/store/FilesStore.js @@ -159,13 +159,13 @@ class FilesStore { if (!(this.isLoading || this.operationAction)) switch (opt?.cmd) { case "create": - this.wsModifyFolderCreate(); + this.wsModifyFolderCreate(opt); break; case "update": - this.wsModifyFolderUpdate(); + this.wsModifyFolderUpdate(opt); break; case "delete": - this.wsModifyFolderDelete(); + this.wsModifyFolderDelete(opt); break; } diff --git a/packages/common/components/MediaViewer/sub-components/ImageViewer/index.tsx b/packages/common/components/MediaViewer/sub-components/ImageViewer/index.tsx index 3844a9f7c9..3664dcf461 100644 --- a/packages/common/components/MediaViewer/sub-components/ImageViewer/index.tsx +++ b/packages/common/components/MediaViewer/sub-components/ImageViewer/index.tsx @@ -61,7 +61,6 @@ function ImageViewer({ const isDoubleTapRef = useRef(false); const setTimeoutIDTapRef = useRef(); const startAngleRef = useRef(0); - const scaleRef = useRef(1); const toolbarRef = useRef(null); const [scale, setScale] = useState(1); @@ -73,7 +72,7 @@ function ImageViewer({ height: 0, x: 0, y: 0, - scale: 5, + scale: 1, rotate: 0, opacity: 1, })); @@ -702,8 +701,6 @@ function ImageViewer({ const point = calculateAdjustBounds(dx, dy, ratio, dRotate); - scaleRef.current = dScale; - api.start({ ...point, scale: dScale, @@ -813,7 +810,6 @@ function ImageViewer({ onWheel: ({ first, offset: [, yWheel], - lastOffset: [, lYWheel], movement: [, mYWheel], pinching, memo, @@ -827,8 +823,8 @@ function ImageViewer({ ) return memo; + resetToolbarVisibleTimer(); const dScale = (-1 * yWheel) / RatioWheel; - const lScale = (-1 * lYWheel) / RatioWheel; const mScale = (-1 * mYWheel) / RatioWheel; if (first || !memo) { @@ -845,7 +841,7 @@ function ImageViewer({ const dx = memo[0] - mScale * memo[2]; const dy = memo[1] - mScale * memo[3]; - const ratio = dScale / lScale; + const ratio = dScale / style.scale.get(); const point = calculateAdjustImage( calculateAdjustBounds(dx, dy, ratio), @@ -957,6 +953,7 @@ function ImageViewer({ JSX.Element; + percentValue: number; setIsOpenContextMenu: Dispatch>; toolbarEvent: (item: ToolbarItemType) => void; } diff --git a/packages/common/components/MediaViewer/sub-components/ImageViewerToolbar/index.tsx b/packages/common/components/MediaViewer/sub-components/ImageViewerToolbar/index.tsx index c09b0959ee..b326126014 100644 --- a/packages/common/components/MediaViewer/sub-components/ImageViewerToolbar/index.tsx +++ b/packages/common/components/MediaViewer/sub-components/ImageViewerToolbar/index.tsx @@ -21,6 +21,7 @@ import MediaContextMenu from "PUBLIC_DIR/images/vertical-dots.react.svg"; function ImageViewerToolbar( { toolbar, + percentValue, toolbarEvent, generateContextMenu, setIsOpenContextMenu, @@ -28,7 +29,9 @@ function ImageViewerToolbar( ref: ForwardedRef ) { const [isOpen, setIsOpen] = useState(false); - const [percent, setPercent] = useState(100); + const [percent, setPercent] = useState(() => + Math.round(percentValue * 100) + ); useImperativeHandle( ref, diff --git a/packages/common/utils/tryRedirectTo.js b/packages/common/utils/tryRedirectTo.js index e50fc6de85..98a21aa0ad 100644 --- a/packages/common/utils/tryRedirectTo.js +++ b/packages/common/utils/tryRedirectTo.js @@ -1,4 +1,3 @@ -import history from "../history"; export default function (page) { if ( window.location.pathname === page || @@ -6,9 +5,8 @@ export default function (page) { ) { return false; } - //TODO: check if we already on default page + window.location.replace(page); - history.push(page); // SSR crash return true; } diff --git a/packages/login/src/client/components/sub-components/LoginForm.tsx b/packages/login/src/client/components/sub-components/LoginForm.tsx index b0d1a467a7..25820a59e0 100644 --- a/packages/login/src/client/components/sub-components/LoginForm.tsx +++ b/packages/login/src/client/components/sub-components/LoginForm.tsx @@ -102,7 +102,7 @@ const LoginForm: React.FC = ({ focusInput(); window.authCallback = authCallback; - }, []); + }, [message, confirmedEmail]); const onChangeLogin = (e: React.ChangeEvent) => { //console.log("onChangeLogin", e.target.value); diff --git a/products/ASC.Files/Service/Startup.cs b/products/ASC.Files/Service/Startup.cs index 4feed7d7bb..77b8df7f8a 100644 --- a/products/ASC.Files/Service/Startup.cs +++ b/products/ASC.Files/Service/Startup.cs @@ -110,7 +110,7 @@ public class Startup : BaseWorkerStartup services.AddBaseDbContextPool(); - services.AddSingleton(Channel.CreateUnbounded>(new UnboundedChannelOptions { SingleReader = true, SingleWriter = false })); + services.AddSingleton(Channel.CreateUnbounded>()); services.AddSingleton(svc => svc.GetRequiredService>>().Reader); services.AddSingleton(svc => svc.GetRequiredService>>().Writer); } diff --git a/products/ASC.Files/Service/Thumbnail/Builder.cs b/products/ASC.Files/Service/Thumbnail/Builder.cs index 560a74209e..6f713c7872 100644 --- a/products/ASC.Files/Service/Thumbnail/Builder.cs +++ b/products/ASC.Files/Service/Thumbnail/Builder.cs @@ -25,6 +25,8 @@ // International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode +using ASC.Data.Storage.DiscStorage; + namespace ASC.Files.ThumbnailBuilder; [Scope] @@ -354,10 +356,20 @@ public class Builder { using var sourceImg = await Image.LoadAsync(stream); - Parallel.ForEach(_config.Sizes, async w => + if (_globalStore.GetStore() is DiscDataStore) { - await CropAsync(sourceImg, fileDao, file, w.Width, w.Height); - }); + foreach(var w in _config.Sizes) + { + await CropAsync(sourceImg, fileDao, file, w.Width, w.Height); + } + } + else + { + await Parallel.ForEachAsync(_config.Sizes, new ParallelOptions { MaxDegreeOfParallelism = 4 }, async (w, t) => + { + await CropAsync(sourceImg, fileDao, file, w.Width, w.Height); + }); + } GC.Collect(); } diff --git a/products/ASC.Files/Service/Thumbnail/ThumbnailBuilderService.cs b/products/ASC.Files/Service/Thumbnail/ThumbnailBuilderService.cs index 93fcbac9c9..2d8f69474a 100644 --- a/products/ASC.Files/Service/Thumbnail/ThumbnailBuilderService.cs +++ b/products/ASC.Files/Service/Thumbnail/ThumbnailBuilderService.cs @@ -66,8 +66,7 @@ public class ThumbnailBuilderService : BackgroundService for (var i = 0; i < readers.Count; i++) { var reader = readers[i]; - var index = i; - + tasks.Add(Task.Run(async () => { await foreach (var fileData in reader.ReadAllAsync(stoppingToken))