diff --git a/public/assets/img/avatar.png b/public/assets/img/avatar.png new file mode 100644 index 0000000..70840f0 Binary files /dev/null and b/public/assets/img/avatar.png differ diff --git a/src/module/_global/components/notification_custome.tsx b/src/module/_global/components/notification_custome.tsx new file mode 100644 index 0000000..3a827e7 --- /dev/null +++ b/src/module/_global/components/notification_custome.tsx @@ -0,0 +1,79 @@ +"use client" +import { Box, Center, Flex, Grid, rem, Text, Transition } from '@mantine/core'; +import { useShallowEffect } from '@mantine/hooks'; +import React, { useState } from 'react'; +import { IoCloseOutline, IoNotifications } from 'react-icons/io5'; + +export default function NotificationCustome({ onClose, title, desc, bg, color, onClick, borderColor }: { onClose: () => void, title: string, desc: string, bg: string, color: string, onClick: () => void, borderColor: string }) { + const [opened, setOpened] = useState(false); + + useShallowEffect(() => { + const timer = setTimeout(() => { + setOpened(true); + }, 2000); + return () => clearTimeout(timer); + }, []); + + useShallowEffect(() => { + const timer = setTimeout(() => { + setOpened(false) + }, 6000); + return () => clearTimeout(timer); + }, []); + + function reloadData() { + onClose() + } + return ( + <> +
+ + {(state) => ( +
+ + + + + + + + + {title} + {desc} + + + + + + + + +
+ )} +
+
+ + ); +} diff --git a/src/module/_global/components/reload_button_top.tsx b/src/module/_global/components/reload_button_top.tsx new file mode 100644 index 0000000..3aeb1a5 --- /dev/null +++ b/src/module/_global/components/reload_button_top.tsx @@ -0,0 +1,50 @@ +"use client" +import { Button, Center, Transition } from '@mantine/core'; +import { useShallowEffect } from '@mantine/hooks'; +import React, { useState } from 'react'; +import { IoReload } from 'react-icons/io5'; + +export default function ReloadButtonTop({ onReload, title }: { onReload: () => void, title: string }) { + const [opened, setOpened] = useState(false); + + useShallowEffect(() => { + const timer = setTimeout(() => { + setOpened(true); + }, 2000); + return () => clearTimeout(timer); + }, []); + + function reloadData() { + onReload() + setOpened(false) + } + + return ( + <> +
+ + {(state) => ( +
+ +
+ )} +
+
+ + ); +} diff --git a/src/module/_global/components/skeleton_avatar.tsx b/src/module/_global/components/skeleton_avatar.tsx new file mode 100644 index 0000000..7d3247c --- /dev/null +++ b/src/module/_global/components/skeleton_avatar.tsx @@ -0,0 +1,29 @@ +import { Avatar } from '@mantine/core'; +import React from 'react'; +import bgIcon from "../../../../public/assets/img/avatar.png" + +interface AvatarType { + img: string + size: string + sizeNoImg: string +} + +export default function SkeletonAvatar({ img, size, sizeNoImg }: AvatarType) { + return ( + <> + {img == "" ? + + : + + } + + ); +} diff --git a/src/module/_global/components/skeleton_detail_list_tugas_task.tsx b/src/module/_global/components/skeleton_detail_list_tugas_task.tsx index a6eee3f..a72af80 100644 --- a/src/module/_global/components/skeleton_detail_list_tugas_task.tsx +++ b/src/module/_global/components/skeleton_detail_list_tugas_task.tsx @@ -6,58 +6,60 @@ import { TEMA } from '../bin/val_global'; export default function SkeletonDetailListTugasTask() { const tema = useHookstate(TEMA) return ( - - -
- -
-
- - - - - - - - - - - - - + + + + +
+
+
+ + + + + - - - - + + + + + + + + + + + + + + -
-
-
-
+ + + ); } diff --git a/src/module/_global/index.ts b/src/module/_global/index.ts index bcdf19e..81cab87 100644 --- a/src/module/_global/index.ts +++ b/src/module/_global/index.ts @@ -1,5 +1,6 @@ import prisma from "./bin/prisma"; import { DIR, globalRole, pwd_key_config, TEMA } from "./bin/val_global"; +import SkeletonAvatar from "./components/skeleton_avatar"; import SkeletonDetailDiscussionComment from "./components/skeleton_detail_discussion_comment"; import SkeletonDetailDiscussionMember from "./components/skeleton_detail_discussion_member"; import SkeletonDetailListTugasTask from "./components/skeleton_detail_list_tugas_task"; @@ -18,7 +19,9 @@ import LayoutModalViewFile from "./layout/layout_modal_view_file"; import LayoutNavbarHome from "./layout/layout_navbar_home"; import LayoutNavbarNew from "./layout/layout_navbar_new"; import NoZoom from "./layout/no_zoom"; +import ReloadButtonTop from "./components/reload_button_top"; import ViewFilter from "./view/view_filter"; +import NotificationCustome from "./components/notification_custome"; export { WARNA }; export { LayoutLogin }; @@ -44,3 +47,6 @@ export { funDeleteFile } export { DIR } export { TEMA } export { funCopyFile } +export { SkeletonAvatar } +export { ReloadButtonTop } +export { NotificationCustome } \ No newline at end of file diff --git a/src/module/_global/layout/layout_modal.tsx b/src/module/_global/layout/layout_modal.tsx index d364584..e795a31 100644 --- a/src/module/_global/layout/layout_modal.tsx +++ b/src/module/_global/layout/layout_modal.tsx @@ -1,10 +1,11 @@ -import { Box, Button, Flex, Group, Modal, SimpleGrid, Text } from '@mantine/core'; +import { Button, Flex, Modal, SimpleGrid, Text } from '@mantine/core'; import React, { useState } from 'react'; import { BsQuestionCircleFill } from 'react-icons/bs'; -import { WARNA } from '../fun/WARNA'; +import { useMediaQuery } from '@mantine/hooks'; export default function LayoutModal({ opened, onClose, description, onYes }: { opened: boolean, onClose: () => void, description: string, onYes: (val: boolean) => void }) { const [isValModal, setValModal] = useState(opened) + const isMobile = useMediaQuery('(max-width: 768px)'); return ( {description} - - - - + > + {isMobile ? + <> + + + + : + <> + + + + + } + ); } diff --git a/src/module/division_new/ui/list_discussion.tsx b/src/module/division_new/ui/list_discussion.tsx index cbf498c..9f7b45c 100644 --- a/src/module/division_new/ui/list_discussion.tsx +++ b/src/module/division_new/ui/list_discussion.tsx @@ -17,7 +17,7 @@ export default function ListDiscussionOnDetailDivision() { const param = useParams<{ id: string }>() const [data, setData] = useState([]) const [loading, setLoading] = useState(true); - const isMobile = useMediaQuery('(max-width: 369px)'); + const isMobile = useMediaQuery('(max-width: 399px)'); const tema = useHookstate(TEMA) async function fetchData() { diff --git a/src/module/division_new/ui/list_document.tsx b/src/module/division_new/ui/list_document.tsx index 1bb51e0..ba48fdd 100644 --- a/src/module/division_new/ui/list_document.tsx +++ b/src/module/division_new/ui/list_document.tsx @@ -41,7 +41,7 @@ export default function ListDocumentOnDetailDivision() { useShallowEffect(() => { fetchData() }, [param.id]) - const isMobile = useMediaQuery('(max-width: 369px)'); + const isMobile = useMediaQuery('(max-width: 399px)'); return ( diff --git a/src/module/division_new/ui/list_task.tsx b/src/module/division_new/ui/list_task.tsx index 7ab3fac..43f3b26 100644 --- a/src/module/division_new/ui/list_task.tsx +++ b/src/module/division_new/ui/list_task.tsx @@ -42,7 +42,7 @@ export default function ListTaskOnDetailDivision() { fetchData() }, [param.id]) - const isMobile = useMediaQuery('(max-width: 369px)'); + const isMobile = useMediaQuery('(max-width: 399px)'); return ( diff --git a/src/module/home/ui/view_home.tsx b/src/module/home/ui/view_home.tsx index d94ec00..2d90ef9 100644 --- a/src/module/home/ui/view_home.tsx +++ b/src/module/home/ui/view_home.tsx @@ -1,5 +1,5 @@ "use client" -import { LayoutNavbarHome, TEMA, WARNA } from '@/module/_global'; +import { LayoutNavbarHome, NotificationCustome, ReloadButtonTop, TEMA, WARNA } from '@/module/_global'; import { Box, Group, Notification, Stack, Text } from '@mantine/core'; import React, { useState } from 'react'; import Carosole from './carosole'; @@ -11,36 +11,12 @@ import ListDiscussion from './list_discussion'; import ListEventHome from './list_event'; import ChartProgressHome from './chart_progress_tugas'; import ChartDocumentHome from './chart_document'; -import { useShallowEffect } from '@mantine/hooks'; -import { notifications, Notifications } from '@mantine/notifications'; -import { IoNotifications } from 'react-icons/io5'; -import { ImCheckboxUnchecked } from 'react-icons/im'; import { useHookstate } from '@hookstate/core'; export default function ViewHome() { - const [isNotif, setIsNotif] = useState(true); const tema = useHookstate(TEMA) - useShallowEffect(() => { - if (isNotif) { - notifications.show({ - color: tema.get().utama, - title: Pengumuman Upacara bendera Upacara bendera Upacara bendera Upacara bendera, - message: Upacara bendera Upacara bendera Upacara bendera Upacara bendera Upacara bendera, - icon: , - loading: false, - autoClose: 5000, - position: "top-center", - radius: 'lg', - bg: "white", - style: { - border: `1px solid ${tema.get().utama}`, - }, - onClose: () => setIsNotif(false) - }); - } - }, [isNotif]); return ( <> @@ -49,6 +25,23 @@ export default function ViewHome() { + {/* { + '' + } + } + title='UPDATE' + /> */} + {''}} + onClose={() => {''}} + /> diff --git a/src/module/project/ui/list_file_detail_project.tsx b/src/module/project/ui/list_file_detail_project.tsx index da36a83..85c5292 100644 --- a/src/module/project/ui/list_file_detail_project.tsx +++ b/src/module/project/ui/list_file_detail_project.tsx @@ -121,7 +121,9 @@ export default function ListFileDetailProject() { - {item.name + '.' + item.extension} + {item.name + '.' + item.extension} diff --git a/src/module/user/member/ui/navbar_detail_member.tsx b/src/module/user/member/ui/navbar_detail_member.tsx index 8330044..801c804 100644 --- a/src/module/user/member/ui/navbar_detail_member.tsx +++ b/src/module/user/member/ui/navbar_detail_member.tsx @@ -73,7 +73,13 @@ export default function NavbarDetailMember({ id }: IMember) { gap="xs" >
- + {loading ? : + + }
{loading ? <> diff --git a/src/module/user/profile/ui/profile.tsx b/src/module/user/profile/ui/profile.tsx index 1c4ab10..3b6f9ea 100644 --- a/src/module/user/profile/ui/profile.tsx +++ b/src/module/user/profile/ui/profile.tsx @@ -1,5 +1,5 @@ "use client" -import { LayoutIconBack, LayoutNavbarHome, SkeletonDetailProfile, TEMA, WARNA } from "@/module/_global"; +import { LayoutIconBack, LayoutNavbarHome, SkeletonAvatar, SkeletonDetailProfile, TEMA, WARNA } from "@/module/_global"; import { ActionIcon, Avatar, Box, Grid, Group, Skeleton, Stack, Text } from "@mantine/core"; import { RiIdCardFill } from "react-icons/ri"; import { FaSquarePhone } from "react-icons/fa6"; @@ -72,11 +72,14 @@ export default function Profile() { justify="center" gap="xs" > + {loading ? : + } + {/* */} {loading ? :