Skip to content

Commit 56345a7

Browse files
committed
feat: update flex style
1 parent 01f1c6c commit 56345a7

File tree

8 files changed

+86
-30
lines changed

8 files changed

+86
-30
lines changed

apps/web/@/messages/en.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,10 +112,11 @@
112112
"post_created": "Post created successfully",
113113
"post_updated": "Post updated successfully"
114114
},
115-
"upload": {
115+
"uploads": {
116116
"asset_management": "Asset Management",
117117
"upload_image": "Upload Image",
118118
"select": "Select",
119-
"upload": "Upload"
119+
"upload": "Upload",
120+
"has_been_selected": "has been selected"
120121
}
121122
}

apps/web/@/molecules/upload/AssetsManagement.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@ const AssetManagement = () => {
3838
}
3939

4040
return (
41-
<div className="gap-4">
42-
<div className="flex gap-4 px-1 py-1">
41+
<div className="py-4">
42+
<div className="flex gap-4 p-1">
4343
<SearchBar />
4444
<div>filter...</div>
4545
</div>

apps/web/@/molecules/upload/FileManagerContainer.tsx

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,7 @@
11
import React, { createContext, useCallback, useContext, useReducer } from "react"
22

3-
import { OrderBy } from "database"
3+
import { Image, OrderBy } from "database"
44

5-
// newest
6-
// oldest
7-
// name A-Z
8-
// name Z-A
95
export const OrderField = {
106
newest: "createdAt",
117
oldest: "createdAt",
@@ -14,13 +10,13 @@ export const OrderField = {
1410
}
1511

1612
export type FileManagerState = {
17-
selectedFiles: File[]
13+
selectedFiles: Image[]
1814
search: string
1915
orderBy: OrderBy
2016
order: (typeof OrderField)[keyof typeof OrderField]
2117
}
2218
export type FileManagerContextType = FileManagerState & {
23-
setSelectedFiles: (files: File[]) => void
19+
setSelectedFiles: (files: Image[]) => void
2420
setSearch: (search: string) => void
2521
setOrder: (order: "asc" | "desc") => void
2622
setOrderBy: (orderBy: string) => void
@@ -64,7 +60,7 @@ const FileManagerContainer = ({ children }: { children: React.ReactNode }) => {
6460
orderBy: "asc",
6561
})
6662

67-
const setSelectedFiles = useCallback((files: File[]) => {
63+
const setSelectedFiles = useCallback((files: Image[]) => {
6864
dispatch({ type: "SET_SELECTED_FILES", payload: files })
6965
}, [])
7066

apps/web/@/molecules/upload/ImageList.tsx

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,25 @@
1-
import React, { useState } from "react"
1+
import React from "react"
22
import Image from "next/image"
33

44
import { Image as ImageType } from "database"
55
import { Check, Circle, TrashIcon } from "lucide-react"
66
import { Button } from "ui"
77

8+
import { useFileManager } from "./FileManagerContainer"
9+
810
type ImageListProps = {
911
images: ImageType[]
1012
}
1113

1214
const ImageList: React.FC<ImageListProps> = ({ images }) => {
13-
const [selectedImage, setSelectedImage] = useState<ImageType | null>(null)
15+
const { selectedFiles, setSelectedFiles } = useFileManager()
16+
17+
const handleSelect = (image: ImageType) => {
18+
setSelectedFiles([image])
19+
}
1420

1521
return (
16-
<div className="mt-2 flex flex-wrap gap-3">
22+
<div className="mt-2 flex flex-wrap gap-3 p-1">
1723
{images?.map((image) => (
1824
<div
1925
key={image.id}
@@ -38,15 +44,17 @@ const ImageList: React.FC<ImageListProps> = ({ images }) => {
3844
variant="outline"
3945
className="absolute right-1 top-1 h-7 w-7 rounded-full p-0"
4046
onClick={() => {
41-
console.log(image)
42-
43-
setSelectedImage(image)
47+
if (selectedFiles?.at(0)?.id === image.id) {
48+
setSelectedFiles([])
49+
} else {
50+
handleSelect(image)
51+
}
4452
}}
4553
>
46-
{selectedImage?.id === image.id ? (
54+
{selectedFiles?.at(0)?.id === image.id ? (
4755
<Check
4856
strokeWidth={1.5}
49-
className="h-6 w-6 text-blue-500"
57+
className="h-5 w-5 text-blue-500"
5058
/>
5159
) : (
5260
<Circle className="h-6 w-6" />

apps/web/@/molecules/upload/index.tsx

Lines changed: 59 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
import { ReactNode, useState } from "react"
1+
import { ReactNode } from "react"
22

3+
import { Image } from "database"
34
import { useTranslations } from "next-intl"
45
import {
56
Button,
@@ -9,35 +10,83 @@ import {
910
DialogHeader,
1011
DialogTitle,
1112
DialogTrigger,
13+
Typography,
1214
} from "ui"
1315

1416
import AssetManagement from "./AssetsManagement"
15-
import FileManagerContainer from "./FileManagerContainer"
17+
import FileManagerContainer, { useFileManager } from "./FileManagerContainer"
1618
import UploadImageButton from "./UploadImageButton"
1719

1820
interface UploadProps {
1921
children: ReactNode
22+
onSelect: (image?: Image) => void
2023
}
2124

22-
const Upload: React.FC<UploadProps> = ({ children }) => {
23-
const t = useTranslations("common")
25+
interface SelectButtonProps {
26+
onSelect: (image?: Image) => void
27+
}
28+
29+
const SelectButton: React.FC<SelectButtonProps> = ({ onSelect }) => {
30+
const t = useTranslations("uploads")
31+
const { selectedFiles } = useFileManager()
32+
33+
const handleSelect = () => {
34+
onSelect(selectedFiles?.at(0) || null)
35+
}
36+
37+
return <Button onClick={handleSelect}>{t("select")}</Button>
38+
}
39+
40+
const SelectedFiles: React.FC = () => {
41+
const t = useTranslations("uploads")
42+
43+
const { selectedFiles } = useFileManager()
44+
45+
if (!selectedFiles || selectedFiles.length === 0) return null
46+
47+
if (selectedFiles.length === 1) {
48+
return (
49+
<div className="flex h-full items-center justify-center">
50+
<Typography
51+
variant="span"
52+
className="max-w-[100px] truncate text-sm font-semibold"
53+
>
54+
{selectedFiles[0].name}
55+
</Typography>
56+
<Typography
57+
variant="span"
58+
className="ml-1 text-sm"
59+
>
60+
{t("has_been_selected")}
61+
</Typography>
62+
</div>
63+
)
64+
}
65+
66+
return <div className="flex h-full items-center">{selectedFiles?.length} files selected</div>
67+
}
68+
69+
const Upload: React.FC<UploadProps> = ({ children, onSelect }) => {
70+
const t = useTranslations("uploads")
2471

2572
return (
2673
<FileManagerContainer>
2774
<Dialog>
2875
<DialogTrigger asChild>{children}</DialogTrigger>
29-
<DialogContent className="w-full max-w-[800px]">
30-
<DialogHeader className="flex flex-row items-center gap-4">
31-
<DialogTitle className="mb-0">Asset Management</DialogTitle>
76+
<DialogContent className="w-full max-w-[800px] gap-0 p-0">
77+
<DialogHeader className="mb-0 flex flex-row items-center gap-4 border-b px-4 py-1">
78+
<DialogTitle className="mb-0">{t("asset_management")}</DialogTitle>
3279
<UploadImageButton />
3380
</DialogHeader>
3481

35-
<div className="h-[300px] overflow-scroll">
82+
<div className="h-[400px] overflow-scroll px-4 py-0">
3683
<AssetManagement />
3784
</div>
3885

39-
<DialogFooter>
40-
<Button>Select</Button>
86+
<DialogFooter className="mt-0 flex flex-row items-center justify-between border-t px-4 py-2">
87+
<SelectedFiles />
88+
89+
<SelectButton onSelect={onSelect} />
4190
</DialogFooter>
4291
</DialogContent>
4392
</Dialog>
30.2 KB
Loading
7 KB
Loading

packages/ui/@/components/ui/typography.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ const typographyVariants = cva("text-foreground", {
2525
largeText: "text-lg font-semibold",
2626
smallText: "text-sm font-medium leading-none",
2727
mutedText: "text-sm text-muted-foreground",
28+
span: "text-sm",
2829
},
2930
},
3031
defaultVariants: {
@@ -49,6 +50,7 @@ const variantElementMap: Record<NonNullable<VariantPropType["variant"]>, string>
4950
lead: "p",
5051
mutedText: "p",
5152
ul: "ul",
53+
span: "span",
5254
}
5355

5456
export interface TypographyProps

0 commit comments

Comments
 (0)