fix: add posthog error monitor
This commit is contained in:
@ -3,10 +3,12 @@ import { useCallback, useEffect } from 'react';
|
||||
import { useRevalidator } from 'react-router';
|
||||
|
||||
export const RefreshOnFocus = () => {
|
||||
const { revalidate } = useRevalidator();
|
||||
const { revalidate, state } = useRevalidator();
|
||||
|
||||
const onFocus = useCallback(() => {
|
||||
if (state === 'idle') {
|
||||
void revalidate();
|
||||
}
|
||||
}, [revalidate]);
|
||||
|
||||
useEffect(() => {
|
||||
|
@ -1,21 +1,30 @@
|
||||
import { StrictMode, startTransition } from 'react';
|
||||
import { StrictMode, startTransition, useEffect } from 'react';
|
||||
|
||||
import { i18n } from '@lingui/core';
|
||||
import { detect, fromHtmlTag } from '@lingui/detect-locale';
|
||||
import { I18nProvider } from '@lingui/react';
|
||||
import posthog from 'posthog-js';
|
||||
import { hydrateRoot } from 'react-dom/client';
|
||||
import { HydratedRouter } from 'react-router/dom';
|
||||
import { Theme, ThemeProvider } from 'remix-themes';
|
||||
import { match } from 'ts-pattern';
|
||||
|
||||
import { extractPostHogConfig } from '@documenso/lib/constants/feature-flags';
|
||||
import { dynamicActivate } from '@documenso/lib/utils/i18n';
|
||||
|
||||
async function main() {
|
||||
const theme = match(document.documentElement.getAttribute('data-theme'))
|
||||
.with('dark', () => Theme.DARK)
|
||||
.with('light', () => Theme.LIGHT)
|
||||
.otherwise(() => null);
|
||||
function PosthogInit() {
|
||||
const postHogConfig = extractPostHogConfig();
|
||||
|
||||
useEffect(() => {
|
||||
if (postHogConfig) {
|
||||
posthog.init(postHogConfig.key, {
|
||||
api_host: postHogConfig.host,
|
||||
});
|
||||
}
|
||||
}, []);
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
async function main() {
|
||||
const locale = detect(fromHtmlTag('lang')) || 'en';
|
||||
|
||||
await dynamicActivate(locale);
|
||||
@ -25,10 +34,10 @@ async function main() {
|
||||
document,
|
||||
<StrictMode>
|
||||
<I18nProvider i18n={i18n}>
|
||||
<ThemeProvider specifiedTheme={theme} themeAction="/api/theme">
|
||||
<HydratedRouter />
|
||||
</ThemeProvider>
|
||||
</I18nProvider>
|
||||
|
||||
<PosthogInit />
|
||||
</StrictMode>,
|
||||
);
|
||||
});
|
||||
|
@ -7,13 +7,11 @@ import type { RenderToPipeableStreamOptions } from 'react-dom/server';
|
||||
import { renderToPipeableStream } from 'react-dom/server';
|
||||
import type { AppLoadContext, EntryContext } from 'react-router';
|
||||
import { ServerRouter } from 'react-router';
|
||||
import { ThemeProvider } from 'remix-themes';
|
||||
|
||||
import { APP_I18N_OPTIONS } from '@documenso/lib/constants/i18n';
|
||||
import { dynamicActivate, extractLocaleData } from '@documenso/lib/utils/i18n';
|
||||
|
||||
import { langCookie } from './storage/lang-cookie.server';
|
||||
import { themeSessionResolver } from './storage/theme-session.server';
|
||||
|
||||
export const streamTimeout = 5_000;
|
||||
|
||||
@ -32,10 +30,6 @@ export default async function handleRequest(
|
||||
|
||||
await dynamicActivate(language);
|
||||
|
||||
const { getTheme } = await themeSessionResolver(request);
|
||||
|
||||
const theme = getTheme();
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
let shellRendered = false;
|
||||
const userAgent = request.headers.get('user-agent');
|
||||
@ -47,9 +41,7 @@ export default async function handleRequest(
|
||||
|
||||
const { pipe, abort } = renderToPipeableStream(
|
||||
<I18nProvider i18n={i18n}>
|
||||
<ThemeProvider specifiedTheme={theme} themeAction="/api/theme">
|
||||
<ServerRouter context={routerContext} url={request.url} />
|
||||
</ThemeProvider>
|
||||
</I18nProvider>,
|
||||
{
|
||||
[readyOption]() {
|
||||
|
@ -1,47 +0,0 @@
|
||||
import { useEffect } from 'react';
|
||||
|
||||
import posthog from 'posthog-js';
|
||||
import { useLocation, useSearchParams } from 'react-router';
|
||||
|
||||
import { extractPostHogConfig } from '@documenso/lib/constants/feature-flags';
|
||||
|
||||
export function PostHogPageview() {
|
||||
const postHogConfig = extractPostHogConfig();
|
||||
|
||||
const { pathname } = useLocation();
|
||||
const [searchParams] = useSearchParams();
|
||||
|
||||
// const { sessionData } = useOptionalSession();
|
||||
// const user = sessionData?.user;
|
||||
|
||||
if (typeof window !== 'undefined' && postHogConfig) {
|
||||
posthog.init(postHogConfig.key, {
|
||||
api_host: postHogConfig.host,
|
||||
disable_session_recording: true,
|
||||
// loaded: () => {
|
||||
// if (user) {
|
||||
// posthog.identify(user.email ?? user.id.toString());
|
||||
// } else {
|
||||
// posthog.reset();
|
||||
// }
|
||||
// },
|
||||
custom_campaign_params: ['src'],
|
||||
});
|
||||
}
|
||||
|
||||
useEffect(() => {
|
||||
if (!postHogConfig || !pathname) {
|
||||
return;
|
||||
}
|
||||
|
||||
let url = window.origin + pathname;
|
||||
if (searchParams && searchParams.toString()) {
|
||||
url = url + `?${searchParams.toString()}`;
|
||||
}
|
||||
posthog.capture('$pageview', {
|
||||
$current_url: url,
|
||||
});
|
||||
}, [pathname, searchParams, postHogConfig]);
|
||||
|
||||
return null;
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
import { Suspense, useEffect } from 'react';
|
||||
import { useEffect } from 'react';
|
||||
|
||||
import Plausible from 'plausible-tracker';
|
||||
import {
|
||||
@ -12,7 +12,7 @@ import {
|
||||
useLoaderData,
|
||||
useLocation,
|
||||
} from 'react-router';
|
||||
import { PreventFlashOnWrongTheme, useTheme } from 'remix-themes';
|
||||
import { PreventFlashOnWrongTheme, ThemeProvider, useTheme } from 'remix-themes';
|
||||
|
||||
import { getOptionalSession } from '@documenso/auth/server/lib/utils/get-session';
|
||||
import { SessionProvider } from '@documenso/lib/client-only/providers/session';
|
||||
@ -28,7 +28,6 @@ import type { Route } from './+types/root';
|
||||
import stylesheet from './app.css?url';
|
||||
import { GenericErrorLayout } from './components/general/generic-error-layout';
|
||||
import { RefreshOnFocus } from './components/general/refresh-on-focus';
|
||||
import { PostHogPageview } from './providers/posthog';
|
||||
import { langCookie } from './storage/lang-cookie.server';
|
||||
import { themeSessionResolver } from './storage/theme-session.server';
|
||||
import { appMetaTags } from './utils/meta';
|
||||
@ -106,9 +105,7 @@ export async function loader({ request }: Route.LoaderArgs) {
|
||||
}
|
||||
|
||||
export function Layout({ children }: { children: React.ReactNode }) {
|
||||
const { publicEnv, lang, session, ...data } = useLoaderData<typeof loader>() || {};
|
||||
|
||||
const [theme] = useTheme();
|
||||
const { theme } = useLoaderData<typeof loader>() || {};
|
||||
|
||||
const location = useLocation();
|
||||
|
||||
@ -118,6 +115,18 @@ export function Layout({ children }: { children: React.ReactNode }) {
|
||||
}
|
||||
}, [location.pathname]);
|
||||
|
||||
return (
|
||||
<ThemeProvider specifiedTheme={theme} themeAction="/api/theme">
|
||||
<LayoutContent>{children}</LayoutContent>
|
||||
</ThemeProvider>
|
||||
);
|
||||
}
|
||||
|
||||
export function LayoutContent({ children }: { children: React.ReactNode }) {
|
||||
const { publicEnv, session, lang, ...data } = useLoaderData<typeof loader>() || {};
|
||||
|
||||
const [theme] = useTheme();
|
||||
|
||||
return (
|
||||
<html translate="no" lang={lang} data-theme={theme} className={theme ?? ''}>
|
||||
<head>
|
||||
@ -133,10 +142,6 @@ export function Layout({ children }: { children: React.ReactNode }) {
|
||||
<meta name="google" content="notranslate" />
|
||||
<PreventFlashOnWrongTheme ssrTheme={Boolean(data.theme)} />
|
||||
|
||||
<Suspense>
|
||||
<PostHogPageview />
|
||||
</Suspense>
|
||||
|
||||
{/* Fix: https://stackoverflow.com/questions/21147149/flash-of-unstyled-content-fouc-in-firefox-only-is-ff-slow-renderer */}
|
||||
<script>0</script>
|
||||
</head>
|
||||
|
@ -23,6 +23,8 @@ const posthogProxy = async (request: Request) => {
|
||||
method: request.method,
|
||||
headers,
|
||||
body: request.body,
|
||||
// @ts-expect-error - Not really sure about this
|
||||
duplex: 'half',
|
||||
});
|
||||
|
||||
return new Response(response.body, {
|
||||
|
@ -48,8 +48,8 @@
|
||||
"luxon": "^3.4.0",
|
||||
"papaparse": "^5.4.1",
|
||||
"plausible-tracker": "^0.3.9",
|
||||
"posthog-js": "^1.75.3",
|
||||
"posthog-node": "^3.1.1",
|
||||
"posthog-js": "^1.223.3",
|
||||
"posthog-node": "^4.7.0",
|
||||
"react": "^18",
|
||||
"react-call": "^1.3.0",
|
||||
"react-dom": "^18",
|
||||
|
65
package-lock.json
generated
65
package-lock.json
generated
@ -131,8 +131,8 @@
|
||||
"luxon": "^3.4.0",
|
||||
"papaparse": "^5.4.1",
|
||||
"plausible-tracker": "^0.3.9",
|
||||
"posthog-js": "^1.75.3",
|
||||
"posthog-node": "^3.1.1",
|
||||
"posthog-js": "^1.223.3",
|
||||
"posthog-node": "^4.7.0",
|
||||
"react": "^18",
|
||||
"react-call": "^1.3.0",
|
||||
"react-dom": "^18",
|
||||
@ -849,6 +849,17 @@
|
||||
"win32"
|
||||
]
|
||||
},
|
||||
"apps/remix/node_modules/axios": {
|
||||
"version": "1.7.9",
|
||||
"resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz",
|
||||
"integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"follow-redirects": "^1.15.6",
|
||||
"form-data": "^4.0.0",
|
||||
"proxy-from-env": "^1.1.0"
|
||||
}
|
||||
},
|
||||
"apps/remix/node_modules/esbuild": {
|
||||
"version": "0.24.2",
|
||||
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz",
|
||||
@ -890,6 +901,18 @@
|
||||
"@esbuild/win32-x64": "0.24.2"
|
||||
}
|
||||
},
|
||||
"apps/remix/node_modules/posthog-node": {
|
||||
"version": "4.7.0",
|
||||
"resolved": "https://registry.npmjs.org/posthog-node/-/posthog-node-4.7.0.tgz",
|
||||
"integrity": "sha512-RgdUKSW8MfMOkjUa8cYVqWndNjPePNuuxlGbrZC6z1WRBsVc6TdGl8caidmC10RW8mu/BOfmrGbP4cRTo2jARg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"axios": "^1.7.4"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=15.0.0"
|
||||
}
|
||||
},
|
||||
"apps/remix/node_modules/rollup": {
|
||||
"version": "4.34.5",
|
||||
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.5.tgz",
|
||||
@ -9751,6 +9774,16 @@
|
||||
"win32"
|
||||
]
|
||||
},
|
||||
"node_modules/@rrweb/types": {
|
||||
"version": "2.0.0-alpha.17",
|
||||
"resolved": "https://registry.npmjs.org/@rrweb/types/-/types-2.0.0-alpha.17.tgz",
|
||||
"integrity": "sha512-AfDTVUuCyCaIG0lTSqYtrZqJX39ZEYzs4fYKnexhQ+id+kbZIpIJtaut5cto6dWZbB3SEe4fW0o90Po3LvTmfg==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"rrweb-snapshot": "^2.0.0-alpha.17"
|
||||
}
|
||||
},
|
||||
"node_modules/@rtsao/scc": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz",
|
||||
@ -31027,21 +31060,24 @@
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/posthog-js": {
|
||||
"version": "1.215.3",
|
||||
"resolved": "https://registry.npmjs.org/posthog-js/-/posthog-js-1.215.3.tgz",
|
||||
"integrity": "sha512-vTk8/gyjbKP7EbDxWzo/GBCK7Ok7M6RTqEWOzRgIxCPf/KA5faFi5z1T4cRR1oPgcDqLeB1ZGa04Za/cPEHxgA==",
|
||||
"version": "1.223.3",
|
||||
"resolved": "https://registry.npmjs.org/posthog-js/-/posthog-js-1.223.3.tgz",
|
||||
"integrity": "sha512-ZQTc17M21IzkQmECJa2Xjont4tZrvIn252uGT3sTfmahTqZoW4j+kBj4eOJt9SNR6hOheFNkg7MSiI/rA6FaDA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"core-js": "^3.38.1",
|
||||
"fflate": "^0.4.8",
|
||||
"preact": "^10.19.3",
|
||||
"web-vitals": "^4.2.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@rrweb/types": "2.0.0-alpha.17"
|
||||
}
|
||||
},
|
||||
"node_modules/posthog-js/node_modules/preact": {
|
||||
"version": "10.25.4",
|
||||
"resolved": "https://registry.npmjs.org/preact/-/preact-10.25.4.tgz",
|
||||
"integrity": "sha512-jLdZDb+Q+odkHJ+MpW/9U5cODzqnB+fy2EiHSZES7ldV5LK7yjlVzTp7R8Xy6W6y75kfK8iWYtFVH7lvjwrCMA==",
|
||||
"version": "10.26.2",
|
||||
"resolved": "https://registry.npmjs.org/preact/-/preact-10.26.2.tgz",
|
||||
"integrity": "sha512-0gNmv4qpS9HaN3+40CLBAnKe0ZfyE4ZWo5xKlC1rVrr0ckkEvJvAQqKaHANdFKsGstoxrY4AItZ7kZSGVoVjgg==",
|
||||
"license": "MIT",
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
@ -31052,6 +31088,7 @@
|
||||
"version": "3.6.3",
|
||||
"resolved": "https://registry.npmjs.org/posthog-node/-/posthog-node-3.6.3.tgz",
|
||||
"integrity": "sha512-JB+ei0LkwE+rKHyW5z79Nd1jUaGxU6TvkfjFqY9vQaHxU5aU8dRl0UUaEmZdZbHwjp3WmXCBQQRNyimwbNQfCw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"axios": "^1.6.2",
|
||||
@ -31065,6 +31102,7 @@
|
||||
"version": "1.7.9",
|
||||
"resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz",
|
||||
"integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"follow-redirects": "^1.15.6",
|
||||
@ -33884,6 +33922,16 @@
|
||||
"fsevents": "~2.3.2"
|
||||
}
|
||||
},
|
||||
"node_modules/rrweb-snapshot": {
|
||||
"version": "2.0.0-alpha.18",
|
||||
"resolved": "https://registry.npmjs.org/rrweb-snapshot/-/rrweb-snapshot-2.0.0-alpha.18.tgz",
|
||||
"integrity": "sha512-hBHZL/NfgQX6wO1D9mpwqFu1NJPpim+moIcKhFEjVTZVRUfCln+LOugRc4teVTCISYHN8Cw5e2iNTWCSm+SkoA==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"postcss": "^8.4.38"
|
||||
}
|
||||
},
|
||||
"node_modules/run-async": {
|
||||
"version": "2.4.1",
|
||||
"resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz",
|
||||
@ -33921,6 +33969,7 @@
|
||||
"version": "0.8.14",
|
||||
"resolved": "https://registry.npmjs.org/rusha/-/rusha-0.8.14.tgz",
|
||||
"integrity": "sha512-cLgakCUf6PedEu15t8kbsjnwIFFR2D4RfL+W3iWFJ4iac7z4B0ZI8fxy4R3J956kAI68HclCFGL8MPoUVC3qVA==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/rw": {
|
||||
|
@ -20,6 +20,20 @@ export function useAnalytics() {
|
||||
posthog.capture(event, properties);
|
||||
};
|
||||
|
||||
/**
|
||||
* Capture an analytic event.
|
||||
*
|
||||
* @param error The error to capture.
|
||||
* @param properties Properties to attach to the event.
|
||||
*/
|
||||
const captureException = (error: Error, properties?: Record<string, unknown>) => {
|
||||
if (!isPostHogEnabled) {
|
||||
return;
|
||||
}
|
||||
|
||||
posthog.captureException(error, properties);
|
||||
};
|
||||
|
||||
/**
|
||||
* Start the session recording.
|
||||
*
|
||||
@ -53,6 +67,7 @@ export function useAnalytics() {
|
||||
|
||||
return {
|
||||
capture,
|
||||
captureException,
|
||||
startSessionRecording,
|
||||
stopSessionRecording,
|
||||
};
|
||||
|
@ -998,7 +998,7 @@ msgstr "Ein Fehler ist aufgetreten, während der Benutzer aktiviert wurde."
|
||||
msgid "An error occurred while loading team members. Please try again later."
|
||||
msgstr "Ein Fehler ist aufgetreten, während die Teammitglieder geladen wurden. Bitte versuchen Sie es später erneut."
|
||||
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:169
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:167
|
||||
msgid "An error occurred while loading the document."
|
||||
msgstr "Ein Fehler ist beim Laden des Dokuments aufgetreten."
|
||||
|
||||
@ -1410,7 +1410,7 @@ msgstr ""
|
||||
#: apps/remix/app/components/forms/2fa/view-recovery-codes-dialog.tsx:172
|
||||
#: apps/remix/app/components/forms/2fa/enable-authenticator-app-dialog.tsx:263
|
||||
#: apps/remix/app/components/dialogs/webhook-delete-dialog.tsx:156
|
||||
#: apps/remix/app/components/dialogs/webhook-create-dialog.tsx:235
|
||||
#: apps/remix/app/components/dialogs/webhook-create-dialog.tsx:234
|
||||
#: apps/remix/app/components/dialogs/token-delete-dialog.tsx:167
|
||||
#: apps/remix/app/components/dialogs/template-move-dialog.tsx:145
|
||||
#: apps/remix/app/components/dialogs/template-duplicate-dialog.tsx:71
|
||||
@ -2734,7 +2734,7 @@ msgstr "Geben Sie hier Ihren Text ein"
|
||||
#: apps/remix/app/components/dialogs/admin-user-enable-dialog.tsx:59
|
||||
#: apps/remix/app/components/dialogs/admin-user-disable-dialog.tsx:62
|
||||
#: apps/remix/app/components/dialogs/admin-user-delete-dialog.tsx:62
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:168
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:166
|
||||
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:222
|
||||
msgid "Error"
|
||||
msgstr "Fehler"
|
||||
@ -3268,7 +3268,7 @@ msgid "Load older activity"
|
||||
msgstr "Ältere Aktivitäten laden"
|
||||
|
||||
#: apps/remix/app/components/general/skeletons/document-edit-skeleton.tsx:29
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:46
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:44
|
||||
#: packages/ui/primitives/lazy-pdf-viewer.tsx:12
|
||||
msgid "Loading document..."
|
||||
msgstr "Lade Dokument..."
|
||||
@ -3740,7 +3740,7 @@ msgid "Page {0} of {1}"
|
||||
msgstr "Seite {0} von {1}"
|
||||
|
||||
#. placeholder {0}: i + 1
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:261
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:259
|
||||
msgid "Page {0} of {numPages}"
|
||||
msgstr "Seite {0} von {numPages}"
|
||||
|
||||
@ -4009,8 +4009,8 @@ msgstr "Bitte versuchen Sie es erneut und stellen Sie sicher, dass Sie die korre
|
||||
msgid "Please try again later."
|
||||
msgstr "Bitte versuchen Sie es später noch einmal."
|
||||
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:225
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:240
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:223
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:238
|
||||
msgid "Please try again or contact our support."
|
||||
msgstr "Bitte versuchen Sie es erneut oder kontaktieren Sie unseren Support."
|
||||
|
||||
@ -4906,8 +4906,8 @@ msgstr "Etwas ist schiefgelaufen beim Versuch, das Eigentum des Teams <0>{0}</0>
|
||||
msgid "Something went wrong while attempting to verify your email address for <0>{0}</0>. Please try again later."
|
||||
msgstr "Etwas ist schiefgelaufen beim Versuch, Ihre E-Mail-Adresse für <0>{0}</0> zu bestätigen. Bitte versuchen Sie es später erneut."
|
||||
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:222
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:237
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:220
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:235
|
||||
msgid "Something went wrong while loading the document."
|
||||
msgstr "Beim Laden des Dokuments ist ein Fehler aufgetreten."
|
||||
|
||||
|
@ -993,7 +993,7 @@ msgstr "An error occurred while enabling the user."
|
||||
msgid "An error occurred while loading team members. Please try again later."
|
||||
msgstr "An error occurred while loading team members. Please try again later."
|
||||
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:169
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:167
|
||||
msgid "An error occurred while loading the document."
|
||||
msgstr "An error occurred while loading the document."
|
||||
|
||||
@ -1405,7 +1405,7 @@ msgstr "Can prepare"
|
||||
#: apps/remix/app/components/forms/2fa/view-recovery-codes-dialog.tsx:172
|
||||
#: apps/remix/app/components/forms/2fa/enable-authenticator-app-dialog.tsx:263
|
||||
#: apps/remix/app/components/dialogs/webhook-delete-dialog.tsx:156
|
||||
#: apps/remix/app/components/dialogs/webhook-create-dialog.tsx:235
|
||||
#: apps/remix/app/components/dialogs/webhook-create-dialog.tsx:234
|
||||
#: apps/remix/app/components/dialogs/token-delete-dialog.tsx:167
|
||||
#: apps/remix/app/components/dialogs/template-move-dialog.tsx:145
|
||||
#: apps/remix/app/components/dialogs/template-duplicate-dialog.tsx:71
|
||||
@ -2729,7 +2729,7 @@ msgstr "Enter your text here"
|
||||
#: apps/remix/app/components/dialogs/admin-user-enable-dialog.tsx:59
|
||||
#: apps/remix/app/components/dialogs/admin-user-disable-dialog.tsx:62
|
||||
#: apps/remix/app/components/dialogs/admin-user-delete-dialog.tsx:62
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:168
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:166
|
||||
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:222
|
||||
msgid "Error"
|
||||
msgstr "Error"
|
||||
@ -3263,7 +3263,7 @@ msgid "Load older activity"
|
||||
msgstr "Load older activity"
|
||||
|
||||
#: apps/remix/app/components/general/skeletons/document-edit-skeleton.tsx:29
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:46
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:44
|
||||
#: packages/ui/primitives/lazy-pdf-viewer.tsx:12
|
||||
msgid "Loading document..."
|
||||
msgstr "Loading document..."
|
||||
@ -3735,7 +3735,7 @@ msgid "Page {0} of {1}"
|
||||
msgstr "Page {0} of {1}"
|
||||
|
||||
#. placeholder {0}: i + 1
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:261
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:259
|
||||
msgid "Page {0} of {numPages}"
|
||||
msgstr "Page {0} of {numPages}"
|
||||
|
||||
@ -4004,8 +4004,8 @@ msgstr "Please try again and make sure you enter the correct email address."
|
||||
msgid "Please try again later."
|
||||
msgstr "Please try again later."
|
||||
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:225
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:240
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:223
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:238
|
||||
msgid "Please try again or contact our support."
|
||||
msgstr "Please try again or contact our support."
|
||||
|
||||
@ -4901,8 +4901,8 @@ msgstr "Something went wrong while attempting to transfer the ownership of team
|
||||
msgid "Something went wrong while attempting to verify your email address for <0>{0}</0>. Please try again later."
|
||||
msgstr "Something went wrong while attempting to verify your email address for <0>{0}</0>. Please try again later."
|
||||
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:222
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:237
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:220
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:235
|
||||
msgid "Something went wrong while loading the document."
|
||||
msgstr "Something went wrong while loading the document."
|
||||
|
||||
|
@ -998,7 +998,7 @@ msgstr "Se produjo un error al habilitar al usuario."
|
||||
msgid "An error occurred while loading team members. Please try again later."
|
||||
msgstr "Ocurrió un error al cargar los miembros del equipo. Por favor intenta de nuevo más tarde."
|
||||
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:169
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:167
|
||||
msgid "An error occurred while loading the document."
|
||||
msgstr "Se produjo un error al cargar el documento."
|
||||
|
||||
@ -1410,7 +1410,7 @@ msgstr ""
|
||||
#: apps/remix/app/components/forms/2fa/view-recovery-codes-dialog.tsx:172
|
||||
#: apps/remix/app/components/forms/2fa/enable-authenticator-app-dialog.tsx:263
|
||||
#: apps/remix/app/components/dialogs/webhook-delete-dialog.tsx:156
|
||||
#: apps/remix/app/components/dialogs/webhook-create-dialog.tsx:235
|
||||
#: apps/remix/app/components/dialogs/webhook-create-dialog.tsx:234
|
||||
#: apps/remix/app/components/dialogs/token-delete-dialog.tsx:167
|
||||
#: apps/remix/app/components/dialogs/template-move-dialog.tsx:145
|
||||
#: apps/remix/app/components/dialogs/template-duplicate-dialog.tsx:71
|
||||
@ -2734,7 +2734,7 @@ msgstr "Ingresa tu texto aquí"
|
||||
#: apps/remix/app/components/dialogs/admin-user-enable-dialog.tsx:59
|
||||
#: apps/remix/app/components/dialogs/admin-user-disable-dialog.tsx:62
|
||||
#: apps/remix/app/components/dialogs/admin-user-delete-dialog.tsx:62
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:168
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:166
|
||||
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:222
|
||||
msgid "Error"
|
||||
msgstr "Error"
|
||||
@ -3268,7 +3268,7 @@ msgid "Load older activity"
|
||||
msgstr "Cargar actividad anterior"
|
||||
|
||||
#: apps/remix/app/components/general/skeletons/document-edit-skeleton.tsx:29
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:46
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:44
|
||||
#: packages/ui/primitives/lazy-pdf-viewer.tsx:12
|
||||
msgid "Loading document..."
|
||||
msgstr "Cargando documento..."
|
||||
@ -3740,7 +3740,7 @@ msgid "Page {0} of {1}"
|
||||
msgstr "Página {0} de {1}"
|
||||
|
||||
#. placeholder {0}: i + 1
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:261
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:259
|
||||
msgid "Page {0} of {numPages}"
|
||||
msgstr "Página {0} de {numPages}"
|
||||
|
||||
@ -4009,8 +4009,8 @@ msgstr "Por favor, intenta de nuevo y asegúrate de ingresar la dirección de co
|
||||
msgid "Please try again later."
|
||||
msgstr "Por favor, intenta de nuevo más tarde."
|
||||
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:225
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:240
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:223
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:238
|
||||
msgid "Please try again or contact our support."
|
||||
msgstr "Por favor, inténtalo de nuevo o contacta a nuestro soporte."
|
||||
|
||||
@ -4906,8 +4906,8 @@ msgstr "Algo salió mal al intentar transferir la propiedad del equipo <0>{0}</0
|
||||
msgid "Something went wrong while attempting to verify your email address for <0>{0}</0>. Please try again later."
|
||||
msgstr "Algo salió mal al intentar verificar tu dirección de correo electrónico para <0>{0}</0>. Por favor, intenta de nuevo más tarde."
|
||||
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:222
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:237
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:220
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:235
|
||||
msgid "Something went wrong while loading the document."
|
||||
msgstr "Algo salió mal al cargar el documento."
|
||||
|
||||
|
@ -998,7 +998,7 @@ msgstr "Une erreur est survenue lors de l'activation de l'utilisateur."
|
||||
msgid "An error occurred while loading team members. Please try again later."
|
||||
msgstr "Une erreur est survenue lors du chargement des membres de l'équipe. Veuillez réessayer plus tard."
|
||||
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:169
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:167
|
||||
msgid "An error occurred while loading the document."
|
||||
msgstr "Une erreur est survenue lors du chargement du document."
|
||||
|
||||
@ -1410,7 +1410,7 @@ msgstr ""
|
||||
#: apps/remix/app/components/forms/2fa/view-recovery-codes-dialog.tsx:172
|
||||
#: apps/remix/app/components/forms/2fa/enable-authenticator-app-dialog.tsx:263
|
||||
#: apps/remix/app/components/dialogs/webhook-delete-dialog.tsx:156
|
||||
#: apps/remix/app/components/dialogs/webhook-create-dialog.tsx:235
|
||||
#: apps/remix/app/components/dialogs/webhook-create-dialog.tsx:234
|
||||
#: apps/remix/app/components/dialogs/token-delete-dialog.tsx:167
|
||||
#: apps/remix/app/components/dialogs/template-move-dialog.tsx:145
|
||||
#: apps/remix/app/components/dialogs/template-duplicate-dialog.tsx:71
|
||||
@ -2734,7 +2734,7 @@ msgstr "Entrez votre texte ici"
|
||||
#: apps/remix/app/components/dialogs/admin-user-enable-dialog.tsx:59
|
||||
#: apps/remix/app/components/dialogs/admin-user-disable-dialog.tsx:62
|
||||
#: apps/remix/app/components/dialogs/admin-user-delete-dialog.tsx:62
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:168
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:166
|
||||
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:222
|
||||
msgid "Error"
|
||||
msgstr "Erreur"
|
||||
@ -3268,7 +3268,7 @@ msgid "Load older activity"
|
||||
msgstr "Charger l'activité plus ancienne"
|
||||
|
||||
#: apps/remix/app/components/general/skeletons/document-edit-skeleton.tsx:29
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:46
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:44
|
||||
#: packages/ui/primitives/lazy-pdf-viewer.tsx:12
|
||||
msgid "Loading document..."
|
||||
msgstr "Chargement du document..."
|
||||
@ -3740,7 +3740,7 @@ msgid "Page {0} of {1}"
|
||||
msgstr "Page {0} sur {1}"
|
||||
|
||||
#. placeholder {0}: i + 1
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:261
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:259
|
||||
msgid "Page {0} of {numPages}"
|
||||
msgstr "Page {0} sur {numPages}"
|
||||
|
||||
@ -4009,8 +4009,8 @@ msgstr "Veuillez réessayer et assurez-vous d'entrer la bonne adresse email."
|
||||
msgid "Please try again later."
|
||||
msgstr "Veuillez réessayer plus tard."
|
||||
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:225
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:240
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:223
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:238
|
||||
msgid "Please try again or contact our support."
|
||||
msgstr "Veuillez réessayer ou contacter notre support."
|
||||
|
||||
@ -4906,8 +4906,8 @@ msgstr "Quelque chose a mal tourné lors de la tentative de transfert de la prop
|
||||
msgid "Something went wrong while attempting to verify your email address for <0>{0}</0>. Please try again later."
|
||||
msgstr "Quelque chose a mal tourné lors de la tentative de vérification de votre adresse e-mail pour <0>{0}</0>. Veuillez réessayer plus tard."
|
||||
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:222
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:237
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:220
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:235
|
||||
msgid "Something went wrong while loading the document."
|
||||
msgstr "Une erreur s'est produite lors du chargement du document."
|
||||
|
||||
|
@ -998,7 +998,7 @@ msgstr "Si è verificato un errore durante l'abilitazione dell'utente."
|
||||
msgid "An error occurred while loading team members. Please try again later."
|
||||
msgstr "Si è verificato un errore durante il caricamento dei membri del team. Per favore riprova più tardi."
|
||||
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:169
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:167
|
||||
msgid "An error occurred while loading the document."
|
||||
msgstr "Si è verificato un errore durante il caricamento del documento."
|
||||
|
||||
@ -1410,7 +1410,7 @@ msgstr ""
|
||||
#: apps/remix/app/components/forms/2fa/view-recovery-codes-dialog.tsx:172
|
||||
#: apps/remix/app/components/forms/2fa/enable-authenticator-app-dialog.tsx:263
|
||||
#: apps/remix/app/components/dialogs/webhook-delete-dialog.tsx:156
|
||||
#: apps/remix/app/components/dialogs/webhook-create-dialog.tsx:235
|
||||
#: apps/remix/app/components/dialogs/webhook-create-dialog.tsx:234
|
||||
#: apps/remix/app/components/dialogs/token-delete-dialog.tsx:167
|
||||
#: apps/remix/app/components/dialogs/template-move-dialog.tsx:145
|
||||
#: apps/remix/app/components/dialogs/template-duplicate-dialog.tsx:71
|
||||
@ -2734,7 +2734,7 @@ msgstr "Inserisci il tuo testo qui"
|
||||
#: apps/remix/app/components/dialogs/admin-user-enable-dialog.tsx:59
|
||||
#: apps/remix/app/components/dialogs/admin-user-disable-dialog.tsx:62
|
||||
#: apps/remix/app/components/dialogs/admin-user-delete-dialog.tsx:62
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:168
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:166
|
||||
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:222
|
||||
msgid "Error"
|
||||
msgstr "Errore"
|
||||
@ -3268,7 +3268,7 @@ msgid "Load older activity"
|
||||
msgstr "Carica attività precedente"
|
||||
|
||||
#: apps/remix/app/components/general/skeletons/document-edit-skeleton.tsx:29
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:46
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:44
|
||||
#: packages/ui/primitives/lazy-pdf-viewer.tsx:12
|
||||
msgid "Loading document..."
|
||||
msgstr "Caricamento del documento..."
|
||||
@ -3740,7 +3740,7 @@ msgid "Page {0} of {1}"
|
||||
msgstr "Pagina {0} di {1}"
|
||||
|
||||
#. placeholder {0}: i + 1
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:261
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:259
|
||||
msgid "Page {0} of {numPages}"
|
||||
msgstr "Pagina {0} di {numPages}"
|
||||
|
||||
@ -4009,8 +4009,8 @@ msgstr "Si prega di riprovare assicurandosi di inserire l'indirizzo email corret
|
||||
msgid "Please try again later."
|
||||
msgstr "Si prega di riprovare più tardi."
|
||||
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:225
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:240
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:223
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:238
|
||||
msgid "Please try again or contact our support."
|
||||
msgstr "Per favore, riprova o contatta il nostro supporto."
|
||||
|
||||
@ -4906,8 +4906,8 @@ msgstr "Qualcosa è andato storto durante il tentativo di trasferimento della pr
|
||||
msgid "Something went wrong while attempting to verify your email address for <0>{0}</0>. Please try again later."
|
||||
msgstr "Qualcosa è andato storto durante il tentativo di verifica del tuo indirizzo e-mail per <0>{0}</0>. Riprova più tardi."
|
||||
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:222
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:237
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:220
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:235
|
||||
msgid "Something went wrong while loading the document."
|
||||
msgstr "Qualcosa è andato storto durante il caricamento del documento."
|
||||
|
||||
|
@ -998,7 +998,7 @@ msgstr "Wystąpił błąd podczas włączania użytkownika."
|
||||
msgid "An error occurred while loading team members. Please try again later."
|
||||
msgstr "Wystąpił błąd podczas ładowania członków zespołu. Proszę spróbować ponownie później."
|
||||
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:169
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:167
|
||||
msgid "An error occurred while loading the document."
|
||||
msgstr "Wystąpił błąd podczas ładowania dokumentu."
|
||||
|
||||
@ -1410,7 +1410,7 @@ msgstr ""
|
||||
#: apps/remix/app/components/forms/2fa/view-recovery-codes-dialog.tsx:172
|
||||
#: apps/remix/app/components/forms/2fa/enable-authenticator-app-dialog.tsx:263
|
||||
#: apps/remix/app/components/dialogs/webhook-delete-dialog.tsx:156
|
||||
#: apps/remix/app/components/dialogs/webhook-create-dialog.tsx:235
|
||||
#: apps/remix/app/components/dialogs/webhook-create-dialog.tsx:234
|
||||
#: apps/remix/app/components/dialogs/token-delete-dialog.tsx:167
|
||||
#: apps/remix/app/components/dialogs/template-move-dialog.tsx:145
|
||||
#: apps/remix/app/components/dialogs/template-duplicate-dialog.tsx:71
|
||||
@ -2734,7 +2734,7 @@ msgstr "Wprowadź swój tekst tutaj"
|
||||
#: apps/remix/app/components/dialogs/admin-user-enable-dialog.tsx:59
|
||||
#: apps/remix/app/components/dialogs/admin-user-disable-dialog.tsx:62
|
||||
#: apps/remix/app/components/dialogs/admin-user-delete-dialog.tsx:62
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:168
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:166
|
||||
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:222
|
||||
msgid "Error"
|
||||
msgstr "Błąd"
|
||||
@ -3268,7 +3268,7 @@ msgid "Load older activity"
|
||||
msgstr "Załaduj starszą aktywność"
|
||||
|
||||
#: apps/remix/app/components/general/skeletons/document-edit-skeleton.tsx:29
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:46
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:44
|
||||
#: packages/ui/primitives/lazy-pdf-viewer.tsx:12
|
||||
msgid "Loading document..."
|
||||
msgstr "Ładowanie dokumentu..."
|
||||
@ -3740,7 +3740,7 @@ msgid "Page {0} of {1}"
|
||||
msgstr "Strona {0} z {1}"
|
||||
|
||||
#. placeholder {0}: i + 1
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:261
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:259
|
||||
msgid "Page {0} of {numPages}"
|
||||
msgstr "Strona {0} z {numPages}"
|
||||
|
||||
@ -4009,8 +4009,8 @@ msgstr "Spróbuj ponownie i upewnij się, że wprowadzasz poprawny adres email."
|
||||
msgid "Please try again later."
|
||||
msgstr "Proszę spróbować ponownie później."
|
||||
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:225
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:240
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:223
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:238
|
||||
msgid "Please try again or contact our support."
|
||||
msgstr "Spróbuj ponownie lub skontaktuj się z naszym wsparciem."
|
||||
|
||||
@ -4906,8 +4906,8 @@ msgstr "Coś poszło nie tak podczas próby przeniesienia własności zespołu <
|
||||
msgid "Something went wrong while attempting to verify your email address for <0>{0}</0>. Please try again later."
|
||||
msgstr "Coś poszło nie tak podczas próby weryfikacji adresu e-mail dla <0>{0}</0>. Proszę spróbować ponownie później."
|
||||
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:222
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:237
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:220
|
||||
#: packages/ui/primitives/pdf-viewer.tsx:235
|
||||
msgid "Something went wrong while loading the document."
|
||||
msgstr "Coś poszło nie tak podczas ładowania dokumentu."
|
||||
|
||||
|
@ -2,6 +2,8 @@ import { DocumentDataType } from '@prisma/client';
|
||||
import { base64 } from '@scure/base';
|
||||
import { match } from 'ts-pattern';
|
||||
|
||||
import { getPresignGetUrl } from './server-actions';
|
||||
|
||||
export type GetFileOptions = {
|
||||
type: DocumentDataType;
|
||||
data: string;
|
||||
@ -30,8 +32,6 @@ const getFileFromBytes64 = (data: string) => {
|
||||
};
|
||||
|
||||
const getFileFromS3 = async (key: string) => {
|
||||
const { getPresignGetUrl } = await import('./server-actions');
|
||||
|
||||
const { url } = await getPresignGetUrl(key);
|
||||
|
||||
const response = await fetch(url, {
|
||||
|
@ -2,6 +2,8 @@ import { DocumentDataType } from '@prisma/client';
|
||||
import { base64 } from '@scure/base';
|
||||
import { match } from 'ts-pattern';
|
||||
|
||||
import { getAbsolutePresignPostUrl } from './server-actions';
|
||||
|
||||
export type UpdateFileOptions = {
|
||||
type: DocumentDataType;
|
||||
oldData: string;
|
||||
@ -37,8 +39,6 @@ const updateFileWithBytes64 = (data: string) => {
|
||||
};
|
||||
|
||||
const updateFileWithS3 = async (key: string, data: string) => {
|
||||
const { getAbsolutePresignPostUrl } = await import('./server-actions');
|
||||
|
||||
const { url } = await getAbsolutePresignPostUrl(key);
|
||||
|
||||
const response = await fetch(url, {
|
||||
|
Reference in New Issue
Block a user