Compare commits
3 Commits
X30N1/fix/
...
fix/lock-n
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d5410799e4 | ||
|
|
5540cdce42 | ||
|
|
e469426809 |
@@ -1,4 +1,5 @@
|
||||
import { useRef, useState } from "react";
|
||||
import { useTheme } from "next-themes";
|
||||
import { useEffect, useRef, useState } from "react";
|
||||
import {
|
||||
TbLayoutSidebarLeftCollapse,
|
||||
TbLayoutSidebarLeftExpand,
|
||||
@@ -10,10 +11,7 @@ import { authClient } from "@kan/auth/client";
|
||||
|
||||
import { useClickOutside } from "~/hooks/useClickOutside";
|
||||
import { useModal } from "~/providers/modal";
|
||||
import { useTheme } from "next-themes";
|
||||
import { WorkspaceProvider } from "~/providers/workspace";
|
||||
import FeedbackModal from "./FeedbackModal";
|
||||
import Modal from "./modal";
|
||||
import { useWorkspace, WorkspaceProvider } from "~/providers/workspace";
|
||||
import SideNavigation from "./SideNavigation";
|
||||
|
||||
interface DashboardProps {
|
||||
@@ -42,7 +40,8 @@ export default function Dashboard({
|
||||
hasRightPanel = false,
|
||||
}: DashboardProps) {
|
||||
const { theme } = useTheme();
|
||||
const { modalContentType } = useModal();
|
||||
const { openModal } = useModal();
|
||||
const { availableWorkspaces, hasLoaded } = useWorkspace();
|
||||
|
||||
const { data: session, isPending: sessionLoading } = authClient.useSession();
|
||||
|
||||
@@ -90,6 +89,12 @@ export default function Dashboard({
|
||||
}
|
||||
});
|
||||
|
||||
useEffect(() => {
|
||||
if (hasLoaded && availableWorkspaces.length === 0) {
|
||||
openModal("NEW_WORKSPACE", undefined, undefined, false);
|
||||
}
|
||||
}, [hasLoaded, availableWorkspaces.length, openModal]);
|
||||
|
||||
const isDarkMode = theme === "dark";
|
||||
|
||||
return (
|
||||
|
||||
@@ -8,6 +8,7 @@ interface Props {
|
||||
modalSize?: "sm" | "md" | "lg";
|
||||
positionFromTop?: "sm" | "md" | "lg";
|
||||
isVisible?: boolean;
|
||||
closeOnClickOutside?: boolean;
|
||||
}
|
||||
|
||||
const Modal: React.FC<Props> = ({
|
||||
@@ -15,10 +16,17 @@ const Modal: React.FC<Props> = ({
|
||||
modalSize = "sm",
|
||||
positionFromTop = "md",
|
||||
isVisible,
|
||||
closeOnClickOutside,
|
||||
}) => {
|
||||
const { isOpen, closeModal } = useModal();
|
||||
const {
|
||||
isOpen,
|
||||
closeModal,
|
||||
closeOnClickOutside: modalCloseOnClickOutside,
|
||||
} = useModal();
|
||||
|
||||
const shouldShow = isVisible !== undefined ? isVisible : isOpen;
|
||||
const shouldShow = isVisible ?? isOpen;
|
||||
const shouldCloseOnClickOutside =
|
||||
closeOnClickOutside ?? modalCloseOnClickOutside;
|
||||
|
||||
const modalSizeMap = {
|
||||
sm: "max-w-[400px]",
|
||||
@@ -34,7 +42,11 @@ const Modal: React.FC<Props> = ({
|
||||
|
||||
return (
|
||||
<Transition.Root show={shouldShow} as={Fragment}>
|
||||
<Dialog as="div" className="relative z-50" onClose={closeModal}>
|
||||
<Dialog
|
||||
as="div"
|
||||
className="relative z-50"
|
||||
onClose={shouldCloseOnClickOutside ? closeModal : () => null}
|
||||
>
|
||||
<Transition.Child
|
||||
as={Fragment}
|
||||
enter="ease-out duration-300"
|
||||
|
||||
@@ -973,6 +973,8 @@ msgid "For long-term sustainability, we recognise all good open source projects
|
||||
msgstr "Für langfristige Nachhaltigkeit erkennen wir an, dass alle guten Open-Source-Projekte eine Einnahmequelle benötigen. Unsere stammt aus dem kostenpflichtigen Cloud-Angebot für Workspaces mit mehreren Benutzern (kostenlos während der Beta-Phase) und für benutzerdefinierte Workspace-Slugs. Es besteht keine Verpflichtung, dieses Angebot zu nutzen, und Sie können die Software kostenlos auf Ihrer eigenen Infrastruktur selbst hosten."
|
||||
|
||||
#: src/views/pricing/components/Pricing.tsx:32
|
||||
#: src/views/pricing/components/Pricing.tsx:32
|
||||
#: src/views/pricing/components/PricingTiers.tsx:30
|
||||
#: src/views/pricing/components/PricingTiers.tsx:30
|
||||
msgid "Free"
|
||||
msgstr "Kostenlos"
|
||||
|
||||
@@ -973,6 +973,8 @@ msgid "For long-term sustainability, we recognise all good open source projects
|
||||
msgstr "Para la sostenibilidad a largo plazo, reconocemos que todos los buenos proyectos de código abierto necesitan una fuente de ingresos. La nuestra proviene de la oferta de pago en la nube para espacios de trabajo con múltiples usuarios (gratuita durante la beta) y para slugs personalizados de espacios de trabajo. No hay obligación de usarla, y puedes autoalojar el software en tu propia infraestructura sin costo alguno."
|
||||
|
||||
#: src/views/pricing/components/Pricing.tsx:32
|
||||
#: src/views/pricing/components/Pricing.tsx:32
|
||||
#: src/views/pricing/components/PricingTiers.tsx:30
|
||||
#: src/views/pricing/components/PricingTiers.tsx:30
|
||||
msgid "Free"
|
||||
msgstr "Gratis"
|
||||
|
||||
@@ -973,6 +973,8 @@ msgid "For long-term sustainability, we recognise all good open source projects
|
||||
msgstr "Pour une durabilité à long terme, nous reconnaissons que tous les bons projets open source ont besoin d'une source de revenus. La nôtre provient de l'offre cloud payante pour les espaces de travail avec plusieurs utilisateurs (gratuite pendant la bêta) et pour les slugs d'espace de travail personnalisés. Il n'y a aucune obligation de l'utiliser, et vous pouvez auto-héberger le logiciel sur votre propre infrastructure gratuitement."
|
||||
|
||||
#: src/views/pricing/components/Pricing.tsx:32
|
||||
#: src/views/pricing/components/Pricing.tsx:32
|
||||
#: src/views/pricing/components/PricingTiers.tsx:30
|
||||
#: src/views/pricing/components/PricingTiers.tsx:30
|
||||
msgid "Free"
|
||||
msgstr "Gratuit"
|
||||
|
||||
@@ -973,6 +973,8 @@ msgid "For long-term sustainability, we recognise all good open source projects
|
||||
msgstr "Per la sostenibilità a lungo termine, riconosciamo che tutti i buoni progetti open source necessitano di una fonte di entrate. La nostra proviene dall'offerta cloud a pagamento per workspace con più utenti (gratuita durante la beta) e per slug di workspace personalizzati. Non c'è alcun obbligo di utilizzarla, e puoi ospitare autonomamente il software sulla tua infrastruttura gratuitamente."
|
||||
|
||||
#: src/views/pricing/components/Pricing.tsx:32
|
||||
#: src/views/pricing/components/Pricing.tsx:32
|
||||
#: src/views/pricing/components/PricingTiers.tsx:30
|
||||
#: src/views/pricing/components/PricingTiers.tsx:30
|
||||
msgid "Free"
|
||||
msgstr "Gratuito"
|
||||
|
||||
@@ -973,6 +973,8 @@ msgid "For long-term sustainability, we recognise all good open source projects
|
||||
msgstr "Voor duurzaamheid op lange termijn erkennen we dat alle goede open source projecten een inkomstenbron nodig hebben. De onze komt van de betaalde cloudoplossing voor werkruimtes met meerdere gebruikers (gratis tijdens de bèta) en voor aangepaste werkruimte-slugs. Je bent niet verplicht om hiervan gebruik te maken en je kunt de software gratis op je eigen infrastructuur hosten."
|
||||
|
||||
#: src/views/pricing/components/Pricing.tsx:32
|
||||
#: src/views/pricing/components/Pricing.tsx:32
|
||||
#: src/views/pricing/components/PricingTiers.tsx:30
|
||||
#: src/views/pricing/components/PricingTiers.tsx:30
|
||||
msgid "Free"
|
||||
msgstr "Gratis"
|
||||
|
||||
@@ -35,7 +35,8 @@ msgstr "{0}"
|
||||
#. placeholder {0}: isTemplate ? "Templates" : "Boards"
|
||||
#. placeholder {1}: board?.name ?? "Board"
|
||||
#. placeholder {1}: workspace.name ?? "Workspace"
|
||||
#: src/views/boards/index.tsx:29 src/views/card/index.tsx:216
|
||||
#: src/views/boards/index.tsx:29
|
||||
#: src/views/card/index.tsx:216
|
||||
msgid "{0} | {1}"
|
||||
msgstr "{0} | {1}"
|
||||
|
||||
@@ -79,7 +80,8 @@ msgstr "Konto"
|
||||
msgid "Account deleted"
|
||||
msgstr "Konto zostało usunięte"
|
||||
|
||||
#: src/views/card/index.tsx:291 src/views/public/board/CardModal.tsx:143
|
||||
#: src/views/card/index.tsx:291
|
||||
#: src/views/public/board/CardModal.tsx:143
|
||||
msgid "Activity"
|
||||
msgstr "Aktywność"
|
||||
|
||||
@@ -403,7 +405,8 @@ msgstr "Zmień hasło"
|
||||
msgid "Change your language preferences."
|
||||
msgstr "Zmień swoje preferencje językowe."
|
||||
|
||||
#: src/views/auth/login/index.tsx:43 src/views/auth/signup/index.tsx:69
|
||||
#: src/views/auth/login/index.tsx:43
|
||||
#: src/views/auth/signup/index.tsx:69
|
||||
msgid "Check your inbox"
|
||||
msgstr "Sprawdź swoją skrzynkę odbiorczą"
|
||||
|
||||
@@ -420,7 +423,8 @@ msgstr "Listy kontrolne"
|
||||
msgid "Clear filters"
|
||||
msgstr "Wyczyść filtry"
|
||||
|
||||
#: src/views/auth/login/index.tsx:48 src/views/auth/signup/index.tsx:74
|
||||
#: src/views/auth/login/index.tsx:48
|
||||
#: src/views/auth/signup/index.tsx:74
|
||||
msgid "Click on the link we've sent to {magicLinkRecipient} to sign in."
|
||||
msgstr "Kliknij w link, który wysłaliśmy na {magicLinkRecipient}, aby się zalogować."
|
||||
|
||||
@@ -580,7 +584,8 @@ msgstr "Utwórz nową listę"
|
||||
msgid "Create template"
|
||||
msgstr "Utwórz szablon"
|
||||
|
||||
#: src/components/NewWorkspaceForm.tsx:384 src/components/WorkspaceMenu.tsx:149
|
||||
#: src/components/NewWorkspaceForm.tsx:384
|
||||
#: src/components/WorkspaceMenu.tsx:149
|
||||
msgid "Create workspace"
|
||||
msgstr "Utwórz przestrzeń roboczą"
|
||||
|
||||
@@ -951,7 +956,8 @@ msgstr "Prośba o funkcję"
|
||||
msgid "Features"
|
||||
msgstr "Funkcje"
|
||||
|
||||
#: src/components/FeedbackModal.tsx:59 src/components/UserMenu.tsx:199
|
||||
#: src/components/FeedbackModal.tsx:59
|
||||
#: src/components/UserMenu.tsx:199
|
||||
msgid "Feedback"
|
||||
msgstr "Opinie"
|
||||
|
||||
@@ -972,6 +978,8 @@ msgid "For long-term sustainability, we recognise all good open source projects
|
||||
msgstr "Na rzecz długotrwałego rozwoju i utrzymania projektu uznaliśmy, że wszystkie dobre projekty otwartoźródłowe potrzebują źródła dochodu. Nasze środki pochodzą z płatnej oferty chmurowej dla przestrzeni roboczych z wieloma użytkownikami (bezpłatne podczas wersji beta) oraz dla niestandardowych nazw przestrzeni roboczych. Nie ma obowiązku korzystania z niej, a oprogramowanie można hostować samodzielnie na własnej infrastrukturze bez opłat i bez limitów."
|
||||
|
||||
#: src/views/pricing/components/Pricing.tsx:32
|
||||
#: src/views/pricing/components/Pricing.tsx:32
|
||||
#: src/views/pricing/components/PricingTiers.tsx:30
|
||||
#: src/views/pricing/components/PricingTiers.tsx:30
|
||||
msgid "Free"
|
||||
msgstr "Darmowy"
|
||||
@@ -1021,7 +1029,8 @@ msgstr "Rozpocznij, tworząc nową listę"
|
||||
msgid "Get started for free today"
|
||||
msgstr "Rozpocznij za darmo już dziś"
|
||||
|
||||
#: src/views/pricing/components/Pricing.tsx:92 src/views/pricing/index.tsx:46
|
||||
#: src/views/pricing/components/Pricing.tsx:92
|
||||
#: src/views/pricing/index.tsx:46
|
||||
msgid "Get started for free, with no usage limits. For collaboration, upgrade to a plan that fits the size of your team."
|
||||
msgstr "Rozpocznij za darmo, bez ograniczeń użytkowania. Aby współpracować, przejdź na plan dopasowany do wielkości Twojego zespołu."
|
||||
|
||||
@@ -1192,7 +1201,8 @@ msgstr "Zaproś członka"
|
||||
msgid "Inviting members requires a Team Plan. You'll be redirected to upgrade your workspace."
|
||||
msgstr "Zapraszanie członków wymaga planu Team. Zostaniesz przekierowany, aby ulepszyć swoje środowisko pracy."
|
||||
|
||||
#: src/views/invite/index.tsx:79 src/views/invite/index.tsx:129
|
||||
#: src/views/invite/index.tsx:79
|
||||
#: src/views/invite/index.tsx:129
|
||||
msgid "Join workspace"
|
||||
msgstr "Dołącz do środowiska pracy"
|
||||
|
||||
@@ -1226,7 +1236,8 @@ msgid "Keep in mind that this action is irreversible."
|
||||
msgstr "Pamiętaj, że ta akcja jest nieodwracalna."
|
||||
|
||||
#: src/views/board/components/Filters.tsx:101
|
||||
#: src/views/board/components/NewCardForm.tsx:408 src/views/card/index.tsx:117
|
||||
#: src/views/board/components/NewCardForm.tsx:408
|
||||
#: src/views/card/index.tsx:117
|
||||
msgid "Labels"
|
||||
msgstr "Etykiety"
|
||||
|
||||
@@ -1323,7 +1334,8 @@ msgstr "Średni priorytet"
|
||||
|
||||
#: src/components/SideNavigation.tsx:80
|
||||
#: src/views/board/components/Filters.tsx:93
|
||||
#: src/views/board/components/NewCardForm.tsx:366 src/views/card/index.tsx:126
|
||||
#: src/views/board/components/NewCardForm.tsx:366
|
||||
#: src/views/card/index.tsx:126
|
||||
#: src/views/members/index.tsx:179
|
||||
msgid "Members"
|
||||
msgstr "Członkowie"
|
||||
@@ -1333,7 +1345,8 @@ msgstr "Członkowie"
|
||||
msgid "Members | {0}"
|
||||
msgstr "Członkowie | {0}"
|
||||
|
||||
#: src/views/pricing/components/Pricing.tsx:14 src/views/pricing/index.tsx:19
|
||||
#: src/views/pricing/components/Pricing.tsx:14
|
||||
#: src/views/pricing/index.tsx:19
|
||||
msgid "Monthly"
|
||||
msgstr "Miesięcznie"
|
||||
|
||||
@@ -1361,7 +1374,8 @@ msgstr "Nazwa"
|
||||
msgid "Need help?"
|
||||
msgstr "Potrzebujesz pomocy?"
|
||||
|
||||
#: src/views/boards/index.tsx:57 src/views/home/components/Features.tsx:73
|
||||
#: src/views/boards/index.tsx:57
|
||||
#: src/views/home/components/Features.tsx:73
|
||||
msgid "New"
|
||||
msgstr "Nowy"
|
||||
|
||||
@@ -1390,7 +1404,8 @@ msgstr "Nowy import"
|
||||
msgid "New label"
|
||||
msgstr "Nowa etykieta"
|
||||
|
||||
#: src/views/board/components/NewListForm.tsx:112 src/views/board/index.tsx:439
|
||||
#: src/views/board/components/NewListForm.tsx:112
|
||||
#: src/views/board/index.tsx:439
|
||||
msgid "New list"
|
||||
msgstr "Nowa lista"
|
||||
|
||||
@@ -1518,7 +1533,8 @@ msgid "Pending"
|
||||
msgstr "Oczekujące"
|
||||
|
||||
#: src/views/pricing/components/Pricing.tsx:15
|
||||
#: src/views/pricing/components/Pricing.tsx:20 src/views/pricing/index.tsx:20
|
||||
#: src/views/pricing/components/Pricing.tsx:20
|
||||
#: src/views/pricing/index.tsx:20
|
||||
#: src/views/pricing/index.tsx:25
|
||||
msgid "per user/month"
|
||||
msgstr "na użytkownika/miesiąc"
|
||||
@@ -1556,14 +1572,16 @@ msgid "Please select a file to upload."
|
||||
msgstr "Proszę wybrać plik do przesłania."
|
||||
|
||||
#: src/components/DeleteLabelConfirmation.tsx:26
|
||||
#: src/components/FeedbackModal.tsx:41 src/components/NewWorkspaceForm.tsx:155
|
||||
#: src/components/FeedbackModal.tsx:41
|
||||
#: src/components/NewWorkspaceForm.tsx:155
|
||||
#: src/views/board/components/NewCardForm.tsx:176
|
||||
#: src/views/board/components/NewListForm.tsx:78
|
||||
#: src/views/board/components/NewTemplateForm.tsx:61
|
||||
#: src/views/board/components/NewTemplateForm.tsx:77
|
||||
#: src/views/board/components/UpdateBoardSlugForm.tsx:72
|
||||
#: src/views/board/components/VisibilityButton.tsx:53
|
||||
#: src/views/board/index.tsx:149 src/views/board/index.tsx:205
|
||||
#: src/views/board/index.tsx:149
|
||||
#: src/views/board/index.tsx:205
|
||||
#: src/views/boards/components/ImportBoardsForm.tsx:205
|
||||
#: src/views/card/components/ChecklistItemRow.tsx:60
|
||||
#: src/views/card/components/ChecklistItemRow.tsx:88
|
||||
@@ -1577,7 +1595,8 @@ msgstr "Proszę wybrać plik do przesłania."
|
||||
#: src/views/card/components/MemberSelector.tsx:79
|
||||
#: src/views/card/components/NewChecklistForm.tsx:70
|
||||
#: src/views/card/components/NewChecklistItemForm.tsx:89
|
||||
#: src/views/card/components/NewCommentForm.tsx:31 src/views/card/index.tsx:175
|
||||
#: src/views/card/components/NewCommentForm.tsx:31
|
||||
#: src/views/card/index.tsx:175
|
||||
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
|
||||
#: src/views/members/components/InviteMemberForm.tsx:104
|
||||
#: src/views/members/components/InviteMemberForm.tsx:234
|
||||
@@ -1789,7 +1808,8 @@ msgstr "Prześlij opinię"
|
||||
msgid "Senior"
|
||||
msgstr "Starszy"
|
||||
|
||||
#: src/components/SettingsLayout.tsx:82 src/components/SideNavigation.tsx:85
|
||||
#: src/components/SettingsLayout.tsx:82
|
||||
#: src/components/SideNavigation.tsx:85
|
||||
msgid "Settings"
|
||||
msgstr "Ustawienia"
|
||||
|
||||
@@ -1825,7 +1845,8 @@ msgstr "Zaloguj się"
|
||||
msgid "Sign Up"
|
||||
msgstr "Zarejestruj się"
|
||||
|
||||
#: src/views/auth/signup/index.tsx:34 src/views/auth/signup/index.tsx:59
|
||||
#: src/views/auth/signup/index.tsx:34
|
||||
#: src/views/auth/signup/index.tsx:59
|
||||
msgid "Sign up | kan.bn"
|
||||
msgstr "Zarejestruj się | kan.bn"
|
||||
|
||||
@@ -1841,7 +1862,8 @@ msgstr "Rejestracja jest obecnie wyłączona. Spróbuj ponownie później."
|
||||
msgid "Sign up with "
|
||||
msgstr "Zarejestruj się za pomocą "
|
||||
|
||||
#: src/views/pricing/components/Pricing.tsx:89 src/views/pricing/index.tsx:43
|
||||
#: src/views/pricing/components/Pricing.tsx:89
|
||||
#: src/views/pricing/index.tsx:43
|
||||
msgid "Simple pricing"
|
||||
msgstr "Prosty cennik"
|
||||
|
||||
@@ -1865,7 +1887,8 @@ msgstr "Oznacz gwiazdką na Githubie"
|
||||
msgid "Subscription Required"
|
||||
msgstr "Wymagana subskrypcja"
|
||||
|
||||
#: src/components/AuthForm.tsx:215 src/components/AuthForm.tsx:232
|
||||
#: src/components/AuthForm.tsx:215
|
||||
#: src/components/AuthForm.tsx:232
|
||||
msgid "Success"
|
||||
msgstr "Sukces"
|
||||
|
||||
@@ -1897,7 +1920,8 @@ msgstr "Plan zespołowy"
|
||||
msgid "Teams"
|
||||
msgstr "Zespoły"
|
||||
|
||||
#: src/views/board/index.tsx:361 src/views/board/index.tsx:396
|
||||
#: src/views/board/index.tsx:361
|
||||
#: src/views/board/index.tsx:396
|
||||
msgid "Template"
|
||||
msgstr "Szablon"
|
||||
|
||||
@@ -2090,7 +2114,8 @@ msgstr "Nie można zaktualizować adresu URL tablicy"
|
||||
msgid "Unable to update board visibility"
|
||||
msgstr "Nie można zaktualizować widoczności tablicy"
|
||||
|
||||
#: src/views/board/index.tsx:204 src/views/card/index.tsx:174
|
||||
#: src/views/board/index.tsx:204
|
||||
#: src/views/card/index.tsx:174
|
||||
msgid "Unable to update card"
|
||||
msgstr "Nie można zaktualizować karty"
|
||||
|
||||
@@ -2110,7 +2135,8 @@ msgstr "Nie można zaktualizować komentarza"
|
||||
msgid "Unable to update labels"
|
||||
msgstr "Nie można zaktualizować etykiet"
|
||||
|
||||
#: src/views/board/index.tsx:148 src/views/card/components/ListSelector.tsx:51
|
||||
#: src/views/board/index.tsx:148
|
||||
#: src/views/card/components/ListSelector.tsx:51
|
||||
msgid "Unable to update list"
|
||||
msgstr "Nie można zaktualizować listy"
|
||||
|
||||
@@ -2379,7 +2405,8 @@ msgstr "workspace-url"
|
||||
msgid "Writing"
|
||||
msgstr "Pisanie"
|
||||
|
||||
#: src/views/pricing/components/Pricing.tsx:19 src/views/pricing/index.tsx:24
|
||||
#: src/views/pricing/components/Pricing.tsx:19
|
||||
#: src/views/pricing/index.tsx:24
|
||||
msgid "Yearly"
|
||||
msgstr "Rocznie"
|
||||
|
||||
|
||||
@@ -973,6 +973,8 @@ msgid "For long-term sustainability, we recognise all good open source projects
|
||||
msgstr "Для долгосрочной устойчивости мы признаем, что всем хорошим проектам с открытым исходным кодом нужен источник дохода. Наш доход поступает от платного облачного предложения для рабочих пространств с несколькими пользователями (бесплатно в период бета-тестирования) и для пользовательских адресов рабочих пространств. Нет обязательства использовать это, и вы можете самостоятельно разместить программное обеспечение на своей инфраструктуре бесплатно."
|
||||
|
||||
#: src/views/pricing/components/Pricing.tsx:32
|
||||
#: src/views/pricing/components/Pricing.tsx:32
|
||||
#: src/views/pricing/components/PricingTiers.tsx:30
|
||||
#: src/views/pricing/components/PricingTiers.tsx:30
|
||||
msgid "Free"
|
||||
msgstr "Бесплатно"
|
||||
|
||||
@@ -4,6 +4,7 @@ interface ModalState {
|
||||
contentType: string;
|
||||
entityId?: string;
|
||||
entityLabel?: string;
|
||||
closeOnClickOutside?: boolean;
|
||||
}
|
||||
|
||||
interface Props {
|
||||
@@ -16,6 +17,7 @@ interface ModalContextType {
|
||||
contentType: string,
|
||||
entityId?: string,
|
||||
entityLabel?: string,
|
||||
closeOnClickOutside?: boolean,
|
||||
) => void;
|
||||
closeModal: () => void;
|
||||
closeModals: (count: number) => void;
|
||||
@@ -23,6 +25,7 @@ interface ModalContextType {
|
||||
modalContentType: string;
|
||||
entityId: string;
|
||||
entityLabel: string;
|
||||
closeOnClickOutside: boolean;
|
||||
modalStates: Record<string, any>;
|
||||
setModalState: (modalType: string, state: any) => void;
|
||||
getModalState: (modalType: string) => any;
|
||||
@@ -41,10 +44,21 @@ export const ModalProvider: React.FC<Props> = ({ children }) => {
|
||||
const modalContentType = currentModal?.contentType || "";
|
||||
const entityId = currentModal?.entityId || "";
|
||||
const entityLabel = currentModal?.entityLabel || "";
|
||||
const closeOnClickOutside = currentModal?.closeOnClickOutside ?? true;
|
||||
|
||||
const openModal = useCallback(
|
||||
(contentType: string, entityId?: string, entityLabel?: string) => {
|
||||
const newModal: ModalState = { contentType, entityId, entityLabel };
|
||||
(
|
||||
contentType: string,
|
||||
entityId?: string,
|
||||
entityLabel?: string,
|
||||
closeOnClickOutside?: boolean,
|
||||
) => {
|
||||
const newModal: ModalState = {
|
||||
contentType,
|
||||
entityId,
|
||||
entityLabel,
|
||||
closeOnClickOutside,
|
||||
};
|
||||
setModalStack((prev) => [...prev, newModal]);
|
||||
},
|
||||
[],
|
||||
@@ -107,6 +121,7 @@ export const ModalProvider: React.FC<Props> = ({ children }) => {
|
||||
modalContentType,
|
||||
entityId,
|
||||
entityLabel,
|
||||
closeOnClickOutside,
|
||||
modalStates,
|
||||
setModalState,
|
||||
getModalState,
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import { t } from "@lingui/core/macro";
|
||||
import { useEffect } from "react";
|
||||
import { HiArrowDownTray, HiOutlinePlusSmall } from "react-icons/hi2";
|
||||
|
||||
import Button from "~/components/Button";
|
||||
@@ -15,18 +14,12 @@ import { NewBoardForm } from "./components/NewBoardForm";
|
||||
|
||||
export default function BoardsPage({ isTemplate }: { isTemplate?: boolean }) {
|
||||
const { openModal, modalContentType, isOpen } = useModal();
|
||||
const { availableWorkspaces, workspace, hasLoaded } = useWorkspace();
|
||||
|
||||
useEffect(() => {
|
||||
if (hasLoaded && availableWorkspaces.length === 0) {
|
||||
openModal("NEW_WORKSPACE");
|
||||
}
|
||||
}, [hasLoaded, availableWorkspaces.length, openModal]);
|
||||
const { workspace } = useWorkspace();
|
||||
|
||||
return (
|
||||
<>
|
||||
<PageHead
|
||||
title={t`${isTemplate ? "Templates" : "Boards"} | ${workspace.name ?? "Workspace"}`}
|
||||
title={t`${isTemplate ? "Templates" : "Boards"} | ${workspace.name || "Workspace"}`}
|
||||
/>
|
||||
<div className="m-auto h-full max-w-[1100px] p-6 px-5 md:px-28 md:py-12">
|
||||
<div className="relative z-10 mb-8 flex w-full items-center justify-between">
|
||||
|
||||
@@ -240,7 +240,14 @@ export const initAuth = (db: dbClient) => {
|
||||
]
|
||||
: []),
|
||||
// @todo: hasing is disabled due to a bug in the api key plugin
|
||||
apiKey({ disableKeyHashing: true }),
|
||||
apiKey({
|
||||
disableKeyHashing: true,
|
||||
rateLimit: {
|
||||
enabled: true,
|
||||
timeWindow: 1000 * 60, // 1 minute
|
||||
maxRequests: 100, // 100 requests per minute
|
||||
},
|
||||
}),
|
||||
magicLink({
|
||||
expiresIn: 60 * 60 * 24 * 7, // 7 days
|
||||
sendMagicLink: async ({ email, url }) => {
|
||||
|
||||
Reference in New Issue
Block a user