diff --git a/frontend/app/(drawer)/_layout.tsx b/frontend/app/(drawer)/_layout.tsx
index b67685b..fc20c2d 100644
--- a/frontend/app/(drawer)/_layout.tsx
+++ b/frontend/app/(drawer)/_layout.tsx
@@ -16,6 +16,7 @@ export default function Layout() {
}}
>
+
-
+
diff --git a/frontend/app/_providers.tsx b/frontend/app/_providers.tsx
index ae9a3c3..15dc0d3 100644
--- a/frontend/app/_providers.tsx
+++ b/frontend/app/_providers.tsx
@@ -36,20 +36,16 @@ const Providers = ({ children }: Props) => {
}, [theme, colorScheme]);
return (
- <>
+
-
-
- {children}
-
-
+ {children}
- >
+
);
};
diff --git a/frontend/components/containers/xtermjs.tsx b/frontend/components/containers/xtermjs.tsx
index 353788f..4ad9d3e 100644
--- a/frontend/components/containers/xtermjs.tsx
+++ b/frontend/components/containers/xtermjs.tsx
@@ -122,7 +122,6 @@ const XTermJs = forwardRef((props, ref) => {
}
function onOpen() {
- console.log("WS Open");
resizeTerminal();
}
diff --git a/frontend/components/ui/grid-view.tsx b/frontend/components/ui/grid-view.tsx
new file mode 100644
index 0000000..6cc9ed3
--- /dev/null
+++ b/frontend/components/ui/grid-view.tsx
@@ -0,0 +1,53 @@
+import React, { useMemo } from "react";
+import { GetProps, ScrollView, View, ViewStyle } from "tamagui";
+
+type GridItem = { key: string };
+
+type GridViewProps = GetProps & {
+ data?: T[] | null;
+ renderItem: (item: T, index: number) => React.ReactNode;
+ columns: {
+ xs?: number;
+ sm?: number;
+ md?: number;
+ lg?: number;
+ xl?: number;
+ };
+};
+
+const GridView = ({
+ data,
+ renderItem,
+ columns,
+ gap,
+ ...props
+}: GridViewProps) => {
+ const basisProps = useMemo(() => {
+ const basis: ViewStyle = { flexBasis: "100%" };
+ if (columns.xs) basis.flexBasis = `${100 / columns.xs}%`;
+ if (columns.sm) basis.$gtXs = { flexBasis: `${100 / columns.sm}%` };
+ if (columns.md) basis.$gtSm = { flexBasis: `${100 / columns.md}%` };
+ if (columns.lg) basis.$gtMd = { flexBasis: `${100 / columns.lg}%` };
+ if (columns.xl) basis.$gtLg = { flexBasis: `${100 / columns.xl}%` };
+ return basis;
+ }, [columns]);
+
+ return (
+
+ {data?.map((item, idx) => (
+
+ {renderItem(item, idx)}
+
+ ))}
+
+ );
+};
+
+export default GridView;
diff --git a/frontend/components/ui/input.tsx b/frontend/components/ui/input.tsx
index e4101b0..4b9acec 100644
--- a/frontend/components/ui/input.tsx
+++ b/frontend/components/ui/input.tsx
@@ -1,6 +1,6 @@
import { Controller, FieldValues } from "react-hook-form";
import { FormFieldBaseProps } from "./utility";
-import { Input, View } from "tamagui";
+import { Input, TextArea } from "tamagui";
import { ComponentPropsWithoutRef } from "react";
import { ErrorMessage } from "./form";
@@ -24,4 +24,24 @@ export const InputField = ({
/>
);
+type TextAreaFieldProps = FormFieldBaseProps &
+ ComponentPropsWithoutRef;
+
+export const TextAreaField = ({
+ form,
+ name,
+ ...props
+}: TextAreaFieldProps) => (
+ (
+ <>
+
+
+ >
+ )}
+ />
+);
+
export default Input;
diff --git a/frontend/components/ui/modal.tsx b/frontend/components/ui/modal.tsx
index e5dcf49..4ef3c18 100644
--- a/frontend/components/ui/modal.tsx
+++ b/frontend/components/ui/modal.tsx
@@ -22,23 +22,24 @@ const Modal = ({
return (