Skip to content

Commit d0b27e6

Browse files
committed
Merge pull request 'Release/2.2.0' from develop into master
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/onlyoffice-jira-cloud/pulls/6
2 parents 9a78034 + 0a60965 commit d0b27e6

File tree

9 files changed

+39
-163
lines changed

9 files changed

+39
-163
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Change Log
22

3+
## 2.2.0
4+
## Fixed
5+
- replaced reactive session expiration handling with proactive reauthorization
6+
37
## 1.1.0
48
## Added
59
- list of files

locales/de-DE.json

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,6 @@
4141
"editor": {
4242
"messages": {
4343
"stop-editing-by-cause-delete": "Die Bearbeitung dieses Dokuments wurde gestoppt, da es aus der Ausgabe entfernt wurde.",
44-
"stop-editing-by-cause-session-expired": "Die Bearbeitung dieses Dokuments wurde gestoppt, da die aktuelle Sitzung abgelaufen ist.",
45-
"session-expired": "Die aktuelle Sitzung ist abgelaufen.",
46-
"please-save-changes": "Bitte speichern Sie alle Änderungen, um Datenverlust zu vermeiden.",
47-
"editor-will-be-reloaded": "Der Editor wird neu geladen, damit Sie in ({time}) weiterarbeiten können.",
48-
"update-session-failed": "Eine Verlängerung der Sitzung war leider nicht möglich.",
49-
"editin-will-stop": "Die Bearbeitung wird in ({time}) beendet.",
5044
"you-using-demo-server": "Sie verwenden den öffentlichen Demoserver von ONLYOFFICE Docs. Bitte vermeiden Sie die Speicherung privater oder sensibler Daten."
5145
}
5246
},

locales/en-US.json

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,6 @@
4141
"editor": {
4242
"messages": {
4343
"stop-editing-by-cause-delete": "Editing of this document has been stopped because it has been removed from the issue.",
44-
"stop-editing-by-cause-session-expired": "Editing of this document has been stopped because the current session has expired.",
45-
"session-expired": "The current session has expired.",
46-
"please-save-changes": "Please make sure to save any changes to prevent data loss.",
47-
"editor-will-be-reloaded": "The editor will be reloaded to continue working in ({time}).",
48-
"update-session-failed": "Unfortunately, it was not possible to extend the session.",
49-
"editin-will-stop": "Editing will stop in ({time}).",
5044
"you-using-demo-server": "You are using the public demo server of ONLYOFFICE Docs. Please avoid storing any private or sensitive data."
5145
}
5246
},

locales/es-ES.json

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,6 @@
4141
"editor": {
4242
"messages": {
4343
"stop-editing-by-cause-delete": "La edición de este documento se ha detenido porque se ha eliminado de la incidencia.",
44-
"stop-editing-by-cause-session-expired": "La edición de este documento se ha detenido porque la sesión actual ha expirado.",
45-
"session-expired": "La sesión actual ha expirado.",
46-
"please-save-changes": "Por favor, asegúrese de guardar cualquier cambio para evitar la pérdida de datos.",
47-
"editor-will-be-reloaded": "El editor se volverá a cargar para continuar trabajando en ({time}).",
48-
"update-session-failed": "Lamentablemente, no ha sido posible prolongar la sesión.",
49-
"editin-will-stop": "La edición se detendrá en ({time}).",
5044
"you-using-demo-server": "Está utilizando el servidor público de demostración de ONLYOFFICE Docs. Por favor, evite almacenar cualquier dato privado o confidencial."
5145
}
5246
},

locales/fr-FR.json

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,6 @@
4141
"editor": {
4242
"messages": {
4343
"stop-editing-by-cause-delete": "L'édition de ce document a été interrompue, car il a été supprimé du ticket.",
44-
"stop-editing-by-cause-session-expired": "L'édition de ce document a été interrompue car la session a expiré.",
45-
"session-expired": "La session actuelle a expiré.",
46-
"please-save-changes": "Veuillez vous assurer d'enregistrer vos modifications pour éviter toute perte de données.",
47-
"editor-will-be-reloaded": "L'éditeur sera rechargé pour continuer dans ({time}).",
48-
"update-session-failed": "Malheureusement, il n'a pas été possible de prolonger la session.",
49-
"editin-will-stop": "L’édition s'arrêtera dans ({time}).",
5044
"you-using-demo-server": "Vous utilisez le serveur de démonstration public d'ONLYOFFICE Docs. Veuillez éviter d'y stocker des données privées ou sensibles."
5145
}
5246
},

locales/it-IT.json

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,6 @@
4141
"editor": {
4242
"messages": {
4343
"stop-editing-by-cause-delete": "La modifica di questo documento è stata interrotta perché è stato rimosso dal ticket.",
44-
"stop-editing-by-cause-session-expired": "La modifica di questo documento è stata interrotta perché la sessione corrente è scaduta.",
45-
"session-expired": "La sessione corrente è scaduta.",
46-
"please-save-changes": "Assicurati di salvare eventuali modifiche per evitare la perdita dei dati.",
47-
"editor-will-be-reloaded": "L'editor verrà ricaricato per continuare a lavorare in ({time}).",
48-
"update-session-failed": "Purtroppo non è stato possibile estendere la sessione.",
49-
"editin-will-stop": "La modifica terminerà in ({time}).",
5044
"you-using-demo-server": "Stai usando il server demo pubblico di ONLYOFFICE Docs. Evita di salvare dati privati o sensibili."
5145
}
5246
},

locales/ru-RU.json

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,6 @@
4141
"editor": {
4242
"messages": {
4343
"stop-editing-by-cause-delete": "Редактирование этого документа прекращено, поскольку он был удален из выпуска.",
44-
"stop-editing-by-cause-session-expired": "Редактирование этого документа прекращено, поскольку текущий сеанс истек.",
45-
"session-expired": "Текущий сеанс истек.",
46-
"please-save-changes": "Обязательно сохраните все изменения, чтобы избежать потери данных.",
47-
"editor-will-be-reloaded": "Редактор будет перезагружен для продолжения работы через ({time}).",
48-
"update-session-failed": "К сожалению, продлить сеанс не удалось.",
49-
"editin-will-stop": "Редактирование будет прекращено через ({time}).",
5044
"you-using-demo-server": "Вы используете публичный демо-сервер ONLYOFFICE Docs. Пожалуйста, не храните на нем личные или конфиденциальные данные."
5145
}
5246
},

static/onlyoffice-docs-jira-cloud-custom-ui/src/pages/Editor/index.tsx

Lines changed: 34 additions & 127 deletions
Original file line numberDiff line numberDiff line change
@@ -16,20 +16,11 @@
1616
*
1717
*/
1818

19-
import React, {
20-
useEffect,
21-
useState,
22-
useRef,
23-
type ReactNode,
24-
useContext,
25-
} from "react";
19+
import React, { useEffect, useState, useRef, useContext } from "react";
2620

2721
import Button from "@atlaskit/button/new";
28-
import Flag, { ActionsType, FlagGroup } from "@atlaskit/flag";
29-
import StatusWarningIcon from "@atlaskit/icon/core/status-warning";
3022
import { Flex, xcss } from "@atlaskit/primitives";
3123
import Spinner from "@atlaskit/spinner";
32-
import { token } from "@atlaskit/tokens";
3324
import { events, invoke, view } from "@forge/bridge";
3425
import { FullContext } from "@forge/bridge/out/types";
3526

@@ -55,26 +46,6 @@ const styles = {
5546
},
5647
};
5748

58-
type SessionExpiredFlag = {
59-
description: string;
60-
icon: ReactNode;
61-
id: string;
62-
time: number;
63-
title: string;
64-
actions: ActionsType;
65-
};
66-
67-
const defaultSessionExpiredFlagData: SessionExpiredFlag = {
68-
id: "session-expired-flag",
69-
title: "",
70-
description: "",
71-
icon: (
72-
<StatusWarningIcon label="Warning" color={token("color.icon.warning")} />
73-
),
74-
time: 59,
75-
actions: [],
76-
};
77-
7849
export type EditorPageProps = {
7950
context: FullContext;
8051
};
@@ -84,8 +55,6 @@ const EditorPage: React.FC<EditorPageProps> = ({ context }) => {
8455
const [loading, setLoading] = useState(true);
8556
const remoteAppUrl = useRef<string | null>(null);
8657
const [token, setToken] = useState<string>();
87-
const [sessionExpiredFlag, setSessionExpiredFlag] =
88-
useState<SessionExpiredFlag>();
8958

9059
const issueId = context.extension.issue.id;
9160
const attachmentId = context.extension.modal.attachmentId;
@@ -129,13 +98,42 @@ const EditorPage: React.FC<EditorPageProps> = ({ context }) => {
12998
});
13099
});
131100

101+
let sessionTimeout: ReturnType<typeof setTimeout>;
102+
103+
const scheduleReauthorization = (sessionExpires: number) => {
104+
const targetTime = new Date(sessionExpires);
105+
const now = new Date();
106+
targetTime.setSeconds(targetTime.getSeconds() - 10);
107+
108+
const delay = targetTime.getTime() - now.getTime();
109+
110+
if (delay > 0) {
111+
sessionTimeout = setTimeout(() => {
112+
invoke<RemoteAppAuthorization>("authorizeRemoteApp", {
113+
issueId,
114+
attachmentId,
115+
})
116+
.then((data: RemoteAppAuthorization) => {
117+
sendMessageToIframe("REFRESH_SESSION", {
118+
sessionExpires: data.sessionExpires,
119+
});
120+
scheduleReauthorization(data.sessionExpires);
121+
})
122+
.catch((error) => {
123+
console.error("Error reauthorizing session:", error);
124+
});
125+
}, delay);
126+
}
127+
};
128+
132129
invoke<RemoteAppAuthorization>("authorizeRemoteApp", {
133130
issueId,
134131
attachmentId,
135132
})
136133
.then((data: RemoteAppAuthorization) => {
137134
setToken(data.token);
138135
remoteAppUrl.current = data.remoteAppUrl;
136+
scheduleReauthorization(data.sessionExpires);
139137
})
140138
.catch((error) => {
141139
console.error("Error fetching data:", error);
@@ -148,30 +146,16 @@ const EditorPage: React.FC<EditorPageProps> = ({ context }) => {
148146
),
149147
});
150148
});
149+
150+
return () => {
151+
clearTimeout(sessionTimeout);
152+
};
151153
}, []);
152154

153155
const closeWindow = () => {
154156
view.close();
155157
};
156158

157-
const onSessionExpired = () => {
158-
invoke<RemoteAppAuthorization>("authorizeRemoteApp", {
159-
issueId,
160-
attachmentId,
161-
})
162-
.then((data: RemoteAppAuthorization) => {
163-
sendMessageToIframe("UPDATE_CONFIG", {
164-
mode: mode,
165-
token: data.token,
166-
});
167-
})
168-
.catch((error) => {
169-
console.error(error);
170-
171-
sessionFailedToExtend();
172-
});
173-
};
174-
175159
const onRequestUsers = (c: string, ids: string[]) => {
176160
getUsers(ids)
177161
.then((values) => {
@@ -192,60 +176,6 @@ const EditorPage: React.FC<EditorPageProps> = ({ context }) => {
192176
});
193177
};
194178

195-
const sessionSuccessfullyExtended = () => {
196-
const timer = setInterval(() => {
197-
const onFinal = () => {
198-
clearInterval(timer);
199-
sendMessageToIframe("RELOAD_EDITOR", null);
200-
};
201-
202-
setSessionExpiredFlag((prev) => {
203-
if (prev && prev.time - 1 < 0) {
204-
onFinal();
205-
return undefined;
206-
}
207-
208-
return {
209-
...defaultSessionExpiredFlagData,
210-
time: prev ? prev.time - 1 : defaultSessionExpiredFlagData.time,
211-
title: t("labels.warning"),
212-
description: `${t("page.editor.messages.session-expired")}
213-
${t("page.editor.messages.please-save-changes")}
214-
${t("page.editor.messages.editor-will-be-reloaded").replace("{time}", String(prev ? prev.time - 1 : defaultSessionExpiredFlagData.time))}`,
215-
};
216-
});
217-
}, 1000);
218-
};
219-
220-
const sessionFailedToExtend = () => {
221-
const timer = setInterval(() => {
222-
const onFinal = () => {
223-
clearInterval(timer);
224-
sendMessageToIframe("STOP_EDITING", {
225-
message: t(
226-
"page.editor.messages.stop-editing-by-cause-session-expired",
227-
),
228-
});
229-
};
230-
231-
setSessionExpiredFlag((prev) => {
232-
if (prev && prev.time - 1 < 0) {
233-
onFinal();
234-
return undefined;
235-
}
236-
237-
return {
238-
...defaultSessionExpiredFlagData,
239-
time: prev ? prev.time - 1 : defaultSessionExpiredFlagData.time,
240-
title: t("labels.warning"),
241-
description: `${t("page.editor.messages.session-expired")}
242-
${t("page.editor.messages.update-session-failed")} ${t("page.editor.messages.please-save-changes")}
243-
${t("page.editor.messages.editin-will-stop").replace("{time}", String(prev ? prev.time - 1 : defaultSessionExpiredFlagData.time))}`,
244-
};
245-
});
246-
}, 1000);
247-
};
248-
249179
useEffect(() => {
250180
if (remoteAppUrl.current) {
251181
const handleMessage = (event: MessageEvent) => {
@@ -286,18 +216,6 @@ const EditorPage: React.FC<EditorPageProps> = ({ context }) => {
286216

287217
onRequestUsers(c, ids);
288218
}
289-
290-
if (type === "SESSION_EXPIRED") {
291-
onSessionExpired();
292-
}
293-
294-
if (type === "CONFIG_UPDATED") {
295-
sessionSuccessfullyExtended();
296-
}
297-
298-
if (type === "ERROR_UPDATE_CONFIG") {
299-
sessionFailedToExtend();
300-
}
301219
};
302220

303221
window.addEventListener("message", handleMessage);
@@ -321,17 +239,6 @@ const EditorPage: React.FC<EditorPageProps> = ({ context }) => {
321239
src={`${remoteAppUrl.current}/editor/jira?mode=${mode}&token=${token}`}
322240
/>
323241
)}
324-
{sessionExpiredFlag && (
325-
<FlagGroup>
326-
<Flag
327-
id={sessionExpiredFlag.id}
328-
title={sessionExpiredFlag.title}
329-
description={sessionExpiredFlag.description}
330-
icon={sessionExpiredFlag.icon}
331-
actions={sessionExpiredFlag.actions}
332-
/>
333-
</FlagGroup>
334-
)}
335242
</Flex>
336243
);
337244
};

static/onlyoffice-docs-jira-cloud-custom-ui/src/types/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ export interface Format {
2727
export interface RemoteAppAuthorization {
2828
token: string;
2929
remoteAppUrl: string;
30+
sessionExpires: number;
3031
}
3132

3233
export interface User {

0 commit comments

Comments
 (0)