Integrasi API: Voting admin

Add:
- app/(application)/admin/voting/[id]/[status]/reject-input.tsx
- app/(application)/admin/voting/history.tsx
- components/Box/ReportBox.tsx
- screens/Admin/Voting/
- utils/colorBadge.ts

Fix:
- app/(application)/(user)/job/[id]/[status]/detail.tsx
- app/(application)/(user)/voting/[id]/[status]/detail.tsx
- app/(application)/admin/job/[id]/[status]/index.tsx
- app/(application)/admin/job/[id]/[status]/reject-input.tsx
- app/(application)/admin/voting/[id]/[status]/index.tsx
- app/(application)/admin/voting/[id]/reject-input.tsx
- app/(application)/admin/voting/[status]/status.tsx
- components/Container/CircleContainer.tsx
- components/Text/TextCustom.tsx
- components/_ShareComponent/Admin/ButtonReview.tsx
- screens/Admin/Job/funUpdateStatus.ts
- screens/Admin/listPageAdmin.tsx
- service/api-admin/api-admin-voting.ts

### No Issue
This commit is contained in:
2025-10-21 16:52:17 +08:00
parent faf0f36e53
commit 4da55a5a8a
18 changed files with 494 additions and 162 deletions

View File

@@ -0,0 +1,16 @@
import StackCustom from "../Stack/StackCustom";
import TextCustom from "../Text/TextCustom";
import BaseBox from "./BaseBox";
export default function ReportBox({ text }: { text: string }) {
return (
<BaseBox>
<StackCustom gap={"sm"}>
<TextCustom bold>
Catatan penolakan
</TextCustom>
<TextCustom>{text}</TextCustom>
</StackCustom>
</BaseBox>
);
}

View File

@@ -1,27 +1,39 @@
import { MainColor } from "@/constants/color-palet";
import React from "react";
import { StyleProp, StyleSheet, TextInput, View, ViewStyle } from "react-native";
import {
StyleProp,
StyleSheet,
View,
ViewStyle
} from "react-native";
import TextCustom from "../Text/TextCustom";
interface CircularInputProps {
value?: string | number
value?: string | number;
onChange?: (value: string | number) => void;
icon?: React.ReactNode;
style?: StyleProp<ViewStyle>
style?: StyleProp<ViewStyle>;
}
const CircularInput: React.FC<CircularInputProps> = ({ value, onChange, icon, style }) => {
const CircularInput: React.FC<CircularInputProps> = ({
value,
onChange,
icon,
style,
}) => {
return (
<View style={[styles.circleContainer, style]}>
{icon ? (
icon
) : (
<TextInput
value={String(value)}
onChangeText={onChange}
<TextCustom
// text={String(value)}
style={styles.input}
keyboardType="numeric"
maxLength={2} // Batasan maksimal karakter
/>
// keyboardType="numeric"
// maxLength={2} // Batasan maksimal karakter
>
{value}
</TextCustom>
)}
</View>
);
@@ -39,7 +51,7 @@ const styles = StyleSheet.create({
},
input: {
color: MainColor.yellow, // Warna kuning
fontSize: 24,
fontSize: 18,
fontWeight: "bold",
textAlign: "center",
padding: 0,

View File

@@ -23,7 +23,7 @@ interface TextCustomProps {
bold?: boolean;
semiBold?: boolean;
size?: "default" | "large" | "small" | "xlarge" | number
color?: "default" | "yellow" | "red" | "gray" | "green" | "black"
color?: "default" | "yellow" | "red" | "gray" | "green" | "black" | "orange"
align?: TextAlign; // Prop untuk alignment
truncate?: boolean | number;
onPress?: () => void;
@@ -62,6 +62,7 @@ const TextCustom: React.FC<TextCustomProps> = ({
else if (color === "gray") selectedStyles.push(styles.gray);
else if (color === "green") selectedStyles.push(styles.green);
else if (color === "black") selectedStyles.push(styles.black);
else if (color === "orange") selectedStyles.push(styles.orange);
// Alignment
if (align) {
@@ -140,4 +141,7 @@ export const styles = StyleSheet.create({
black: {
color: MainColor.black,
},
orange: {
color: MainColor.orange,
},
});

View File

@@ -4,9 +4,11 @@ import Grid from "@/components/Grid/GridCustom";
import { MainColor } from "@/constants/color-palet";
export default function AdminButtonReview({
isLoading,
onPublish,
onReject,
}: {
isLoading?: boolean;
onPublish: () => void;
onReject: () => void;
}) {
@@ -15,6 +17,7 @@ export default function AdminButtonReview({
<Grid>
<Grid.Col span={6} style={{ paddingRight: 10 }}>
<ButtonCustom
isLoading={isLoading}
iconLeft={<IconPublish />}
backgroundColor={MainColor.green}
textColor="white"