From 23faa66d48d06c7afdc8535e84208a78627ee7c8 Mon Sep 17 00:00:00 2001 From: Henry Date: Sun, 5 May 2024 15:12:20 +0100 Subject: [PATCH] feat: extend skeleton loaders --- src/components/SideNavigation.tsx | 7 +- src/components/UserMenu.tsx | 58 +++--- src/components/WorkspaceMenu.tsx | 28 ++- src/components/dashboard.tsx | 4 +- src/providers/workspace.tsx | 5 +- src/views/card/components/LabelSelector.tsx | 188 ++++++++++--------- src/views/card/components/ListSelector.tsx | 122 ++++++------ src/views/card/components/MemberSelector.tsx | 173 +++++++++-------- src/views/card/index.tsx | 18 +- 9 files changed, 334 insertions(+), 269 deletions(-) diff --git a/src/components/SideNavigation.tsx b/src/components/SideNavigation.tsx index 0007984a..f79e729d 100644 --- a/src/components/SideNavigation.tsx +++ b/src/components/SideNavigation.tsx @@ -15,6 +15,7 @@ import WorkspaceMenu from "~/components/WorkspaceMenu"; interface SideNavigationProps { user: UserType; + isLoading: boolean; } interface UserType { @@ -22,7 +23,10 @@ interface UserType { image?: string | null | undefined; } -export default function SideNavigation({ user }: SideNavigationProps) { +export default function SideNavigation({ + user, + isLoading, +}: SideNavigationProps) { const pathname = usePathname(); const { theme } = useTheme(); @@ -65,6 +69,7 @@ export default function SideNavigation({ user }: SideNavigationProps) { diff --git a/src/components/UserMenu.tsx b/src/components/UserMenu.tsx index 4616e0a6..55ea899c 100644 --- a/src/components/UserMenu.tsx +++ b/src/components/UserMenu.tsx @@ -7,13 +7,18 @@ import createClient from "~/utils/supabase/client"; interface UserMenuProps { imageUrl: string | undefined; email: string; + isLoading: boolean; } function classNames(...classes: string[]): string { return classes.filter(Boolean).join(" "); } -export default function UserMenu({ imageUrl, email }: UserMenuProps) { +export default function UserMenu({ + imageUrl, + email, + isLoading, +}: UserMenuProps) { const router = useRouter(); const { theme, switchTheme } = useTheme(); @@ -28,28 +33,35 @@ export default function UserMenu({ imageUrl, email }: UserMenuProps) { return (
- - {imageUrl ? ( - - ) : ( - - - - - - )} - {email} - + {isLoading ? ( +
+
+
+
+ ) : ( + + {imageUrl ? ( + + ) : ( + + + + + + )} + {email} + + )}
- - - - {workspace?.name.charAt(0).toUpperCase()} + {isLoading ? ( +
+
+
+
+ ) : ( + + + + {workspace?.name.charAt(0).toUpperCase()} + - - - {workspace?.name} - - + + {workspace?.name} + + + )}
@@ -17,7 +17,7 @@ export default function Dashboard(props: { children: React.ReactNode }) {
- +
{props.children}
diff --git a/src/providers/workspace.tsx b/src/providers/workspace.tsx index 4691d1b8..91fff323 100644 --- a/src/providers/workspace.tsx +++ b/src/providers/workspace.tsx @@ -12,6 +12,7 @@ import { useRouter } from "next/navigation"; interface WorkspaceContextProps { workspace: Workspace; + isLoading: boolean; switchWorkspace: (_workspace: Workspace) => void; availableWorkspaces: Workspace[]; } @@ -41,7 +42,7 @@ export const WorkspaceProvider: React.FC<{ children: ReactNode }> = ({ initialAvailableWorkspaces, ); - const { data } = api.workspace.all.useQuery(); + const { data, isLoading } = api.workspace.all.useQuery(); const switchWorkspace = (_workspace: Workspace) => { localStorage.setItem("workspacePublicId", _workspace.publicId); @@ -97,7 +98,7 @@ export const WorkspaceProvider: React.FC<{ children: ReactNode }> = ({ return ( {children} diff --git a/src/views/card/components/LabelSelector.tsx b/src/views/card/components/LabelSelector.tsx index 8064d9b1..0264d76b 100644 --- a/src/views/card/components/LabelSelector.tsx +++ b/src/views/card/components/LabelSelector.tsx @@ -14,11 +14,13 @@ interface LabelSelectorProps { selected: boolean; colourCode: string; }[]; + isLoading: boolean; } export default function LabelSelector({ cardPublicId, labels, + isLoading, }: LabelSelectorProps) { const { openModal } = useModal(); const utils = api.useUtils(); @@ -47,104 +49,110 @@ export default function LabelSelector({ return ( <> - - {selectedLabels.length ? ( - <> - {selectedLabels.map((label) => ( - -
+
+ ) : ( + + {selectedLabels.length ? ( + <> + {selectedLabels.map((label) => ( + - - -
{label.name}
+ +
{label.name}
+
+ ))} + + + Add label - ))} - - + + ) : ( + + Add label - - ) : ( - - - Add label - - )} + )} - - -
-
- {labels?.map((label) => ( - - {() => ( -
{ - e.preventDefault(); - await formik.setFieldValue( - label.publicId, - !formik.values[label.publicId], - ); + + +
+ + {labels?.map((label) => ( + + {() => ( +
{ + e.preventDefault(); + await formik.setFieldValue( + label.publicId, + !formik.values[label.publicId], + ); - addOrRemoveLabel.mutate({ - cardPublicId, - labelPublicId: label.publicId, - }); + addOrRemoveLabel.mutate({ + cardPublicId, + labelPublicId: label.publicId, + }); - await formik.submitForm(); - }} - > - event.stopPropagation()} - onChange={formik.handleChange} - checked={formik.values[label.publicId]} - /> - -
- )} -
- ))} - - -
-
-
-
+ event.stopPropagation()} + onChange={formik.handleChange} + checked={formik.values[label.publicId]} + /> + +
+ )} + + ))} + + +
+ + +
+ )} ); } diff --git a/src/views/card/components/ListSelector.tsx b/src/views/card/components/ListSelector.tsx index 5a6f171e..51130d00 100644 --- a/src/views/card/components/ListSelector.tsx +++ b/src/views/card/components/ListSelector.tsx @@ -10,11 +10,13 @@ interface ListSelectorProps { name: string; selected: boolean; }[]; + isLoading: boolean; } export default function ListSelector({ cardPublicId, lists, + isLoading, }: ListSelectorProps) { const utils = api.useUtils(); @@ -42,66 +44,72 @@ export default function ListSelector({ return ( <> - - - {selectedList?.name} - - - +
+
+ ) : ( + - -
-
- {lists?.map((list) => ( - -
{ - e.preventDefault(); - await formik.setFieldValue( - list.publicId, - !formik.values[list.publicId], - ); + + {selectedList?.name} + - updateCardList.mutate({ - cardId: cardPublicId, - newListId: list.publicId, - }); + + +
+ + {lists?.map((list) => ( + +
{ + e.preventDefault(); + await formik.setFieldValue( + list.publicId, + !formik.values[list.publicId], + ); - await formik.submitForm(); - }} - > - event.stopPropagation()} - onChange={formik.handleChange} - checked={formik.values[list.publicId]} - /> - -
-
- ))} - -
-
-
-
+ updateCardList.mutate({ + cardId: cardPublicId, + newListId: list.publicId, + }); + + await formik.submitForm(); + }} + > + event.stopPropagation()} + onChange={formik.handleChange} + checked={formik.values[list.publicId]} + /> + + + + ))} + + + +
+
+ )} ); } diff --git a/src/views/card/components/MemberSelector.tsx b/src/views/card/components/MemberSelector.tsx index a40f852b..8dd85e38 100644 --- a/src/views/card/components/MemberSelector.tsx +++ b/src/views/card/components/MemberSelector.tsx @@ -14,11 +14,13 @@ interface MemberSelectorProps { }; selected: boolean; }[]; + isLoading: boolean; } export default function LabelSelector({ cardPublicId, members, + isLoading, }: MemberSelectorProps) { const utils = api.useUtils(); @@ -46,89 +48,98 @@ export default function LabelSelector({ return ( <> - - - {selectedMembers.length ? ( -
- {selectedMembers.map((member) => ( - - - {member.user?.name - ? member.user?.name - .split(" ") - .map((namePart) => namePart.charAt(0).toUpperCase()) - .join("") - : null} - - - ))} -
- ) : ( - <> - - {"Add member"} - - )} -
- - +
+
+ ) : ( + - -
-
- {members?.map((member) => ( - -
{ - e.preventDefault(); - await formik.setFieldValue( - member.publicId, - !formik.values[member.publicId], - ); - - addOrRemoveMember.mutate({ - cardPublicId, - workspaceMemberPublicId: member.publicId, - }); - - await formik.submitForm(); - }} - > - event.stopPropagation()} - onChange={formik.handleChange} - checked={formik.values[member.publicId]} - /> - -
-
+ + {selectedMembers.length ? ( +
+ {selectedMembers.map((member) => ( + + + {member.user?.name + ? member.user?.name + .split(" ") + .map((namePart) => namePart.charAt(0).toUpperCase()) + .join("") + : null} + + ))} - -
- - -
+ + ) : ( + <> + + {"Add member"} + + )} + + + + +
+
+ {members?.map((member) => ( + +
{ + e.preventDefault(); + await formik.setFieldValue( + member.publicId, + !formik.values[member.publicId], + ); + + addOrRemoveMember.mutate({ + cardPublicId, + workspaceMemberPublicId: member.publicId, + }); + + await formik.submitForm(); + }} + > + event.stopPropagation()} + onChange={formik.handleChange} + checked={formik.values[member.publicId]} + /> + +
+
+ ))} +
+
+
+
+
+ )} ); } diff --git a/src/views/card/index.tsx b/src/views/card/index.tsx index eeed7d3f..d6000ce1 100644 --- a/src/views/card/index.tsx +++ b/src/views/card/index.tsx @@ -152,15 +152,27 @@ export default function CardPage() {

List

- +

Labels

- +

Members

- +