Skip to content

Commit

Permalink
Merge branch 'main' of https://github.com/catto-labs/drive into main
Browse files Browse the repository at this point in the history
  • Loading branch information
pnxl committed Aug 13, 2023
2 parents 72a3650 + 8c35ec0 commit d9bdb4b
Show file tree
Hide file tree
Showing 5 changed files with 149 additions and 64 deletions.
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
"typescript": "^4.9.4",
"unocss": "^0.54.2",
"unocss-catppuccin": "^0.2.0",
"unocss-preset-primitives": "0.0.1-beta.10",
"unplugin-icons": "^0.16.5",
"vite": "^4.4.6"
},
Expand Down
13 changes: 13 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

70 changes: 70 additions & 0 deletions src/primitives/modal.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
import { type JSX, type FlowComponent, createSignal, onCleanup, batch } from "solid-js";
import { render } from "solid-js/web";
import { Dialog } from "@kobalte/core";

export interface ModalProps {
open: boolean
onOpenChange: (open: boolean) => void
}

const Modal: FlowComponent<ModalProps> & {
Title: typeof Dialog["Title"]
Description: typeof Dialog["Description"]
CloseButton: typeof Dialog["CloseButton"]
} = (props) => (
<Dialog.Root open={props.open} onOpenChange={props.onOpenChange}>
<Dialog.Portal>
<Dialog.Overlay class="fixed inset-0 z-50 animate-fade-out ui-expanded:animate-fade-in animate-duration-150 ui-expanded:animate-duration-150 bg-text/75" />
<div class="fixed inset-0 z-50 flex items-center justify-center">
<Dialog.Content class="z-50 m-[16px] max-w-128 w-full animate-scale-out ui-expanded:animate-scale-in animate-duration-200 ui-expanded:animate-duration-200 rounded-lg bg-surface0 border border-surface1 p-4 shadow">
{props.children}
</Dialog.Content>
</div>
</Dialog.Portal>
</Dialog.Root>
);

Modal.Title = Dialog.Title;
Modal.Description = Dialog.Description;
Modal.CloseButton = Dialog.CloseButton;

export const createModal = <T,>(createModalContent: (components: {
Title: typeof Modal["Title"]
Description: typeof Modal["Description"]
CloseButton: typeof Modal["CloseButton"],
data: T | null
}) => JSX.Element) => {
const [data, setData] = createSignal<T | null>(null);
const [open, setOpen] = createSignal(false);

const portal = document.createElement("div");
document.body.appendChild(portal);

const dispose = render(() => (
<Modal open={open()} onOpenChange={setOpen}>
{createModalContent({
Title: Modal.Title,
Description: Modal.Description,
CloseButton: Modal.CloseButton,
data: data()
})}
</Modal>
), portal);

const show = (new_data?: T) => batch(() => {
setOpen(true);
setData(() => (new_data ?? null));
});

const hide = () => batch(() => {
setOpen(false);
setData(null);
});

onCleanup(() => {
dispose();
portal.remove();
});

return [show, hide] as const;
};
115 changes: 52 additions & 63 deletions src/routes/dashboard/[workspace_id].tsx
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ import { DropdownMenu, Dialog } from "@kobalte/core";

import { useParams } from "solid-start";

import { createModal } from "@/primitives/modal";

import {
createFileImporter,
downloadUploadedFile,
Expand All @@ -50,7 +52,7 @@ import {

import { getContentOfWorkspace, createWorkspace } from "@/utils/workspaces";

import type { WorkspaceContent } from "@/types/api";
import type { UploadedFile, WorkspaceContent } from "@/types/api";
import { Switch } from "solid-js";

const Page: Component = () => {
Expand Down Expand Up @@ -108,7 +110,50 @@ const Page: Component = () => {
window.scrollTo(0, 0);
});

const [openDeletion, setOpenDeletion] = createSignal(false);
const [openDeleteModal] = createModal<UploadedFile>(({ Description, CloseButton, data: file }) => (
<>
<div class="text-text flex justify-between">
<h1 class="text-xl font-semibold my-auto">
Delete file
</h1>
<CloseButton class="p-2 hover:bg-maroon/20 my-auto rounded-lg">
<IconClose class="text-lg" />
</CloseButton>
</div>
<Description class="text-subtext0">
Are you sure you want to
permanently delete this file? You
won't be able to restore this from
the trash bin later on.
</Description>
<form
class="flex w-full justify-end gap-x-4 mt-2"
onSubmit={async (event) => {
event.preventDefault();
await removePermanentlyFile(file!.id);

setWorkspaceContent((prev) => prev
? prev.filter(item =>
item.type === "workspace" ||
(item.type === "file" && item.data.id !== file!.id)
)
: []
);
}}
>
<CloseButton type="submit"
class="py-2 px-4 border-surface1 bg-base/50 hover:bg-base border transition-all hover:border-lavender my-auto rounded-lg"
>
Yes
</CloseButton>
<CloseButton type="button"
class="py-2 px-4 border-surface1 bg-base/50 hover:bg-base border transition-all hover:border-lavender my-auto rounded-lg"
>
No
</CloseButton>
</form>
</>
))

return (
<>
Expand Down Expand Up @@ -362,68 +407,12 @@ const Page: Component = () => {
<IconStarOutline class="text-lg" />
Favorite
</DropdownMenu.Item>
<Dialog.Root
open={openDeletion()}
onOpenChange={setOpenDeletion}
<DropdownMenu.Item class="flex flex-row items-center gap-2 pl-2 pr-4 py-1 hover:bg-maroon/20 text-maroon rounded-md"
onSelect={() => openDeleteModal(file())}
>
<Dialog.Trigger class="flex flex-row items-center gap-2 pl-2 pr-4 py-1 hover:bg-maroon/20 text-maroon rounded-md">
<IconDeleteOutline class="text-lg" />
Delete permanently
</Dialog.Trigger>
<Dialog.Portal>
<Dialog.Overlay class="fixed inset-0 z-50 bg-text/75 dialog-overlay-animation" />
<div class="fixed inset-0 z-50 flex items-center justify-center">
<Dialog.Content class="dialog-content-animation z-50 flex flex-col gap-y-2 border rounded-lg bg-surface0 border-surface1 p-4 max-w-128">
<div class="text-text flex justify-between">
<h1 class="text-xl font-semibold my-auto">
Delete file
</h1>
<Dialog.CloseButton class="p-2 hover:bg-maroon/20 my-auto rounded-lg">
<IconClose class="text-lg" />
</Dialog.CloseButton>
</div>
<Dialog.Description class="text-subtext0">
Are you sure you want to
permanently delete this file? You
won't be able to restore this from
the trash bin later on.
</Dialog.Description>
<div class="flex w-full justify-end gap-x-4 mt-2">
<Dialog.CloseButton>
<button
onClick={async () => {
await removePermanentlyFile(
file().id
);
setWorkspaceContent(
(prev) =>
prev
? prev.filter(
(item) =>
item.type ===
"workspace" ||
(item.type ===
"file" &&
item.data
.id !==
file().id)
)
: []
);
}}
class="py-2 px-4 border-surface1 bg-base/50 hover:bg-base border transition-all hover:border-lavender my-auto rounded-lg"
>
Yes
</button>
</Dialog.CloseButton>
<Dialog.CloseButton class="py-2 px-4 border-surface1 bg-base/50 hover:bg-base border transition-all hover:border-lavender my-auto rounded-lg">
No
</Dialog.CloseButton>
</div>
</Dialog.Content>
</div>
</Dialog.Portal>
</Dialog.Root>
<IconDeleteOutline class="text-lg" />
Delete permanently
</DropdownMenu.Item>
</DropdownMenu.Content>
</DropdownMenu.Portal>
</DropdownMenu.Root>
Expand Down
14 changes: 13 additions & 1 deletion uno.config.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,27 @@
import { defineConfig, presetUno } from "unocss";
import { type Preset, defineConfig, presetUno } from "unocss";
import { extendCatppuccin } from "unocss-catppuccin";

import presetRemToPx from "@unocss/preset-rem-to-px";
import { presetKobalte } from "unocss-preset-primitives";

import transformerVariantGroup from "@unocss/transformer-variant-group";

export default defineConfig({
presets: [
presetUno(),
presetRemToPx(),
presetKobalte() as Preset,
extendCatppuccin({ prefix: "", defaultVariant: "latte" }),
],

transformers: [transformerVariantGroup()],

theme: {
animation: {
keyframes: {
"scale-in": "{from{opacity:0;transform:scale(0.96)}to{opacity:1;transform:scale(1)}}",
"scale-out": "{from{opacity:1;transform:scale(&)}to{opacity:0;transform:scale(0.96)}}"
}
}
}
});

0 comments on commit d9bdb4b

Please sign in to comment.