Compare commits
4 Commits
api-portof
...
api/10-sep
| Author | SHA1 | Date | |
|---|---|---|---|
| 3854db9330 | |||
| fc181bda7c | |||
| fb822d20b6 | |||
| 0e708dde0f |
@@ -3,17 +3,32 @@ import {
|
||||
SelectCustom,
|
||||
StackCustom,
|
||||
TextAreaCustom,
|
||||
TextCustom,
|
||||
TextInputCustom,
|
||||
ViewWrapper,
|
||||
} from "@/components";
|
||||
import DateTimePickerCustom from "@/components/DateInput/DateTimePickerCustom";
|
||||
import { useAuth } from "@/hooks/use-auth";
|
||||
import { masterTypeEvent } from "@/lib/dummy-data/event/master-type-event";
|
||||
import { DateTimePickerEvent } from "@react-native-community/datetimepicker";
|
||||
import { router } from "expo-router";
|
||||
import React, { useState } from "react";
|
||||
import { Platform } from "react-native";
|
||||
|
||||
interface EventCreateProps {
|
||||
title?: string;
|
||||
lokasi?: string;
|
||||
deskripsi?: string;
|
||||
eventMaster_TipeAcaraId?: string;
|
||||
tanggal?: string;
|
||||
tanggalSelesai?: string;
|
||||
authorId?: string;
|
||||
}
|
||||
|
||||
export default function EventCreate() {
|
||||
const [data, setData] = useState<EventCreateProps>();
|
||||
const { user } = useAuth();
|
||||
|
||||
const [selectedDate, setSelectedDate] = useState<
|
||||
Date | DateTimePickerEvent | null
|
||||
>(null);
|
||||
@@ -24,24 +39,24 @@ export default function EventCreate() {
|
||||
|
||||
const handlerSubmit = () => {
|
||||
try {
|
||||
if (selectedDate) {
|
||||
console.log("Tanggal yang dipilih:", selectedDate);
|
||||
console.log(`ISO Format ${Platform.OS}:`, selectedDate.toString());
|
||||
// Kirim ke API atau proses lanjutan
|
||||
} else {
|
||||
console.log("Tanggal belum dipilih");
|
||||
}
|
||||
// if (selectedDate) {
|
||||
// console.log("Tanggal yang dipilih:", selectedDate);
|
||||
// console.log(`ISO Format ${Platform.OS}:`, selectedDate.toString());
|
||||
// // Kirim ke API atau proses lanjutan
|
||||
// } else {
|
||||
// console.log("Tanggal belum dipilih");
|
||||
// }
|
||||
|
||||
if (selectedEndDate) {
|
||||
console.log("Tanggal yang dipilih:", selectedEndDate);
|
||||
console.log(`ISO Format ${Platform.OS}:`, selectedEndDate.toString());
|
||||
// Kirim ke API atau proses lanjutan
|
||||
} else {
|
||||
console.log("Tanggal berakhir belum dipilih");
|
||||
}
|
||||
// if (selectedEndDate) {
|
||||
// console.log("Tanggal yang dipilih:", selectedEndDate);
|
||||
// console.log(`ISO Format ${Platform.OS}:`, selectedEndDate.toString());
|
||||
// // Kirim ke API atau proses lanjutan
|
||||
// } else {
|
||||
// console.log("Tanggal berakhir belum dipilih");
|
||||
// }
|
||||
|
||||
console.log("Data berhasil disimpan");
|
||||
router.navigate("/event/status");
|
||||
console.log("Data berhasil disimpan", JSON.stringify(data, null, 2));
|
||||
// router.navigate("/event/status");
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
}
|
||||
@@ -61,17 +76,21 @@ export default function EventCreate() {
|
||||
placeholder="Masukkan nama event"
|
||||
label="Nama Event"
|
||||
required
|
||||
onChangeText={(value: any) => setData({ ...data, title: value })}
|
||||
/>
|
||||
<SelectCustom
|
||||
label="Tipe Event"
|
||||
placeholder="Pilih tipe event"
|
||||
data={masterTypeEvent}
|
||||
onChange={(value) => console.log(value)}
|
||||
onChange={(value: any) =>
|
||||
setData({ ...data, eventMaster_TipeAcaraId: value })
|
||||
}
|
||||
/>
|
||||
<TextInputCustom
|
||||
label="Lokasi"
|
||||
placeholder="Masukkan lokasi event"
|
||||
required
|
||||
onChangeText={(value: any) => setData({ ...data, lokasi: value })}
|
||||
/>
|
||||
|
||||
<DateTimePickerCustom
|
||||
|
||||
357
app/(application)/(user)/portofolio/[id]/edit.back.txt
Normal file
357
app/(application)/(user)/portofolio/[id]/edit.back.txt
Normal file
@@ -0,0 +1,357 @@
|
||||
import {
|
||||
ActionIcon,
|
||||
BoxButtonOnFooter,
|
||||
ButtonCustom,
|
||||
CenterCustom,
|
||||
SelectCustom,
|
||||
Spacing,
|
||||
StackCustom,
|
||||
TextAreaCustom,
|
||||
TextCustom,
|
||||
TextInputCustom,
|
||||
ViewWrapper,
|
||||
} from "@/components";
|
||||
import { MainColor } from "@/constants/color-palet";
|
||||
import { ICON_SIZE_XLARGE } from "@/constants/constans-value";
|
||||
import {
|
||||
apiMasterBidangBisnis,
|
||||
apiMasterSubBidangBisnis,
|
||||
} from "@/service/api-client/api-master";
|
||||
import {
|
||||
apiGetOnePortofolio,
|
||||
apiUpdatePortofolio,
|
||||
} from "@/service/api-client/api-portofolio";
|
||||
import {
|
||||
IMasterBidangBisnis,
|
||||
IMasterSubBidangBisnis,
|
||||
} from "@/types/Type-Master";
|
||||
import { Ionicons } from "@expo/vector-icons";
|
||||
import { router, useLocalSearchParams } from "expo-router";
|
||||
import _ from "lodash";
|
||||
import { useEffect, useState } from "react";
|
||||
import { Text, View } from "react-native";
|
||||
import PhoneInput, { ICountry } from "react-native-international-phone-number";
|
||||
import Toast from "react-native-toast-message";
|
||||
|
||||
interface IFormData {
|
||||
id_Portofolio: string;
|
||||
namaBisnis: string;
|
||||
alamatKantor: string;
|
||||
tlpn: string;
|
||||
deskripsi: string;
|
||||
masterBidangBisnisId: string;
|
||||
subBidang: any[];
|
||||
}
|
||||
|
||||
interface IListSubBidangSelected {
|
||||
id: string;
|
||||
MasterSubBidangBisnis: {
|
||||
id: string;
|
||||
name: string;
|
||||
masterBidangBisnisId: string;
|
||||
};
|
||||
}
|
||||
|
||||
export default function PortofolioEdit() {
|
||||
const { id } = useLocalSearchParams();
|
||||
const [isLoading, setIsLoading] = useState(false);
|
||||
const [data, setData] = useState<any>({});
|
||||
|
||||
const [selectedCountry, setSelectedCountry] = useState<null | ICountry>(null);
|
||||
const [bidangBisnis, setBidangBisnis] = useState<IMasterBidangBisnis[]>([]);
|
||||
const [subBidangBisnis, setSubBidangBisnis] = useState<
|
||||
IMasterSubBidangBisnis[]
|
||||
>([]);
|
||||
const [selectedSubBidang, setSelectedSubBidang] = useState<string[]>([]);
|
||||
const [listSubBidangSelected, setListSubBidangSelected] = useState<
|
||||
IListSubBidangSelected[]
|
||||
>([
|
||||
{
|
||||
id: "",
|
||||
MasterSubBidangBisnis: {
|
||||
id: "",
|
||||
name: "",
|
||||
masterBidangBisnisId: "",
|
||||
},
|
||||
},
|
||||
]);
|
||||
|
||||
function handleInputValue(phoneNumber: string) {
|
||||
setData({ ...data, tlpn: phoneNumber });
|
||||
}
|
||||
|
||||
function handleSelectedCountry(country: ICountry) {
|
||||
setSelectedCountry(country);
|
||||
}
|
||||
|
||||
useEffect(() => {
|
||||
onLoadData(id as string);
|
||||
onLoadMasterBidang();
|
||||
onLoadMasterSubBidangBisnis();
|
||||
}, [id]);
|
||||
|
||||
const onLoadData = async (id: string) => {
|
||||
const response = await apiGetOnePortofolio({ id: id });
|
||||
|
||||
if (response.data.tlpn && response.data.tlpn.includes("62")) {
|
||||
const fixNumber = response.data.tlpn.replace("62", "");
|
||||
|
||||
setData({ ...response.data, tlpn: fixNumber });
|
||||
}
|
||||
};
|
||||
|
||||
const onLoadMasterBidang = async () => {
|
||||
try {
|
||||
const response = await apiMasterBidangBisnis();
|
||||
setBidangBisnis(response.data);
|
||||
} catch (error) {
|
||||
setBidangBisnis([]);
|
||||
console.log("Error onLoadMasterBidangBisnis", error);
|
||||
}
|
||||
};
|
||||
|
||||
async function onLoadMasterSubBidangBisnis() {
|
||||
try {
|
||||
const response = await apiMasterSubBidangBisnis({});
|
||||
|
||||
if (response.success) {
|
||||
setSubBidangBisnis(response.data);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("Error on load master sub bidang bisnis", error);
|
||||
}
|
||||
}
|
||||
|
||||
const handleSubmitUpdate = async () => {
|
||||
try {
|
||||
setIsLoading(true);
|
||||
const callingCode = selectedCountry?.callingCode.replace(/^\+/, "") || "";
|
||||
const fixNumber = data.tlpn.replace(/\s+/g, "");
|
||||
const realNumber = callingCode + fixNumber;
|
||||
|
||||
const newData: IFormData = {
|
||||
id_Portofolio: data.id_Portofolio,
|
||||
namaBisnis: data.namaBisnis,
|
||||
alamatKantor: data.alamatKantor,
|
||||
tlpn: realNumber,
|
||||
deskripsi: data.deskripsi,
|
||||
masterBidangBisnisId: data.masterBidangBisnisId,
|
||||
subBidang: listSubBidangSelected,
|
||||
};
|
||||
|
||||
const response = await apiUpdatePortofolio({
|
||||
id: id as string,
|
||||
data: newData,
|
||||
category: "detail",
|
||||
});
|
||||
|
||||
if (!response.success) {
|
||||
Toast.show({
|
||||
type: "info",
|
||||
text1: "Info",
|
||||
text2: response.message,
|
||||
});
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
Toast.show({
|
||||
type: "success",
|
||||
text1: "Sukses",
|
||||
text2: "Data terupdate",
|
||||
});
|
||||
|
||||
router.back();
|
||||
} catch (error) {
|
||||
console.log("Error handleSubmitUpdate", error);
|
||||
} finally {
|
||||
setIsLoading(false);
|
||||
}
|
||||
};
|
||||
|
||||
const buttonUpdate = (
|
||||
<BoxButtonOnFooter>
|
||||
<ButtonCustom
|
||||
isLoading={isLoading}
|
||||
disabled={isLoading}
|
||||
onPress={handleSubmitUpdate}
|
||||
>
|
||||
Update
|
||||
</ButtonCustom>
|
||||
</BoxButtonOnFooter>
|
||||
);
|
||||
|
||||
return (
|
||||
<>
|
||||
<ViewWrapper footerComponent={buttonUpdate}>
|
||||
<StackCustom gap={"xs"}>
|
||||
<TextInputCustom
|
||||
required
|
||||
label="Nama Bisnis"
|
||||
placeholder="Masukkan nama bisnis"
|
||||
value={data.namaBisnis}
|
||||
onChangeText={(value: any) =>
|
||||
setData({ ...data, namaBisnis: value })
|
||||
}
|
||||
/>
|
||||
|
||||
<SelectCustom
|
||||
label="Bidang Usaha"
|
||||
required
|
||||
data={bidangBisnis?.map((item) => ({
|
||||
label: item.name,
|
||||
value: item.id,
|
||||
}))}
|
||||
value={data.masterBidangBisnisId}
|
||||
onChange={(value) => {
|
||||
setData({ ...(data as any), masterBidangBisnisId: value });
|
||||
}}
|
||||
/>
|
||||
|
||||
{listSubBidangSelected.map((item, index) => (
|
||||
<SelectCustom
|
||||
key={index}
|
||||
label="Sub Bidang Usaha"
|
||||
required
|
||||
data={subBidangBisnis?.map((item) => ({
|
||||
label: item.name,
|
||||
value: item.id,
|
||||
}))}
|
||||
value={item.id || null}
|
||||
onChange={(value) => {
|
||||
console.log("Value >>", value);
|
||||
}}
|
||||
/>
|
||||
))}
|
||||
|
||||
<CenterCustom>
|
||||
<View
|
||||
style={{ flexDirection: "row", alignItems: "center", gap: 10 }}
|
||||
>
|
||||
<ActionIcon
|
||||
// disabled={
|
||||
// selectedSubBidang.length === listSubBidangSelected.length
|
||||
// }
|
||||
onPress={() => {
|
||||
setListSubBidangSelected([
|
||||
...listSubBidangSelected,
|
||||
{
|
||||
id: "",
|
||||
MasterSubBidangBisnis: {
|
||||
id: "",
|
||||
name: "",
|
||||
masterBidangBisnisId: "",
|
||||
},
|
||||
},
|
||||
]);
|
||||
}}
|
||||
icon={
|
||||
<Ionicons
|
||||
name="add-circle-outline"
|
||||
size={ICON_SIZE_XLARGE}
|
||||
color={MainColor.black}
|
||||
/>
|
||||
}
|
||||
size="xl"
|
||||
/>
|
||||
<ActionIcon
|
||||
// disabled={listSubBidangSelected.length <= 1}
|
||||
onPress={() => {
|
||||
const list = _.clone(listSubBidangSelected);
|
||||
list.pop();
|
||||
setListSubBidangSelected(list);
|
||||
}}
|
||||
icon={
|
||||
<Ionicons
|
||||
name="remove-circle-outline"
|
||||
size={ICON_SIZE_XLARGE}
|
||||
color={MainColor.black}
|
||||
/>
|
||||
}
|
||||
size="xl"
|
||||
/>
|
||||
</View>
|
||||
</CenterCustom>
|
||||
<Spacing />
|
||||
|
||||
{/* <Grid>
|
||||
<Grid.Col span={10}>
|
||||
<SelectCustom
|
||||
// disabled
|
||||
label="Sub Bidang Usaha"
|
||||
required
|
||||
data={dummyMasterSubBidangBisnis.map((item) => ({
|
||||
label: item.name,
|
||||
value: item.id,
|
||||
}))}
|
||||
value={data.masterSubBidangBisnisId}
|
||||
onChange={(value) => {
|
||||
setData({ ...(data as any), masterSubBidangBisnisId: value });
|
||||
}}
|
||||
/>
|
||||
</Grid.Col>
|
||||
<Grid.Col
|
||||
span={2}
|
||||
style={{ alignItems: "center", justifyContent: "center" }}
|
||||
>
|
||||
<TouchableOpacity onPress={() => console.log("delete")}>
|
||||
<Ionicons name="trash" size={24} color={MainColor.red} />
|
||||
</TouchableOpacity>
|
||||
</Grid.Col>
|
||||
</Grid> */}
|
||||
{/* <ButtonCenteredOnly onPress={() => console.log("add")}>
|
||||
Tambah Pilihan
|
||||
</ButtonCenteredOnly>
|
||||
<Spacing /> */}
|
||||
|
||||
<View>
|
||||
<View style={{ flexDirection: "row", alignItems: "center" }}>
|
||||
<TextCustom semiBold style={{ color: MainColor.white_gray }}>
|
||||
Nomor Telepon
|
||||
</TextCustom>
|
||||
<Text style={{ color: "red" }}> *</Text>
|
||||
</View>
|
||||
<Spacing height={5} />
|
||||
<PhoneInput
|
||||
value={data.tlpn}
|
||||
onChangePhoneNumber={handleInputValue}
|
||||
selectedCountry={selectedCountry}
|
||||
onChangeSelectedCountry={handleSelectedCountry}
|
||||
defaultCountry="ID"
|
||||
placeholder="xxx-xxx-xxx"
|
||||
/>
|
||||
</View>
|
||||
<Spacing />
|
||||
|
||||
<TextInputCustom
|
||||
required
|
||||
label="Alamat Bisnis"
|
||||
placeholder="Masukkan alamat bisnis"
|
||||
value={data.alamatKantor}
|
||||
onChangeText={(value: any) =>
|
||||
setData({ ...data, alamatKantor: value })
|
||||
}
|
||||
/>
|
||||
|
||||
<TextAreaCustom
|
||||
label="Deskripsi Bisnis"
|
||||
placeholder="Masukkan deskripsi bisnis"
|
||||
value={data.deskripsi}
|
||||
onChangeText={(value: any) =>
|
||||
setData({ ...data, deskripsi: value })
|
||||
}
|
||||
autosize
|
||||
minRows={2}
|
||||
maxRows={5}
|
||||
required
|
||||
showCount
|
||||
maxLength={1000}
|
||||
/>
|
||||
<Spacing />
|
||||
|
||||
<TextCustom>{JSON.stringify(subBidangBisnis, null, 2)}</TextCustom>
|
||||
</StackCustom>
|
||||
</ViewWrapper>
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -1,6 +1,9 @@
|
||||
/* eslint-disable react-hooks/exhaustive-deps */
|
||||
import {
|
||||
ActionIcon,
|
||||
BoxButtonOnFooter,
|
||||
ButtonCustom,
|
||||
CenterCustom,
|
||||
SelectCustom,
|
||||
Spacing,
|
||||
StackCustom,
|
||||
@@ -10,16 +13,26 @@ import {
|
||||
ViewWrapper,
|
||||
} from "@/components";
|
||||
import { MainColor } from "@/constants/color-palet";
|
||||
import { apiMasterBidangBisnis } from "@/service/api-client/api-master";
|
||||
import { ICON_SIZE_XLARGE } from "@/constants/constans-value";
|
||||
import {
|
||||
apiMasterBidangBisnis,
|
||||
apiMasterSubBidangBisnis,
|
||||
} from "@/service/api-client/api-master";
|
||||
import {
|
||||
apiGetOnePortofolio,
|
||||
apiUpdatePortofolio,
|
||||
} from "@/service/api-client/api-portofolio";
|
||||
import { IMasterBidangBisnis } from "@/types/Type-Master";
|
||||
import {
|
||||
IMasterBidangBisnis,
|
||||
IMasterSubBidangBisnis,
|
||||
} from "@/types/Type-Master";
|
||||
import { Ionicons } from "@expo/vector-icons";
|
||||
import { router, useLocalSearchParams } from "expo-router";
|
||||
import _ from "lodash";
|
||||
import { useEffect, useState } from "react";
|
||||
import { Text, View } from "react-native";
|
||||
import PhoneInput, { ICountry } from "react-native-international-phone-number";
|
||||
import { ActivityIndicator } from "react-native-paper";
|
||||
import Toast from "react-native-toast-message";
|
||||
|
||||
interface IFormData {
|
||||
@@ -29,15 +42,35 @@ interface IFormData {
|
||||
tlpn: string;
|
||||
deskripsi: string;
|
||||
masterBidangBisnisId: string;
|
||||
subBidang: any[];
|
||||
}
|
||||
|
||||
interface IListSubBidangSelected {
|
||||
id: string;
|
||||
MasterSubBidangBisnis?: {
|
||||
id?: string;
|
||||
name?: string;
|
||||
masterBidangBisnisId?: string;
|
||||
};
|
||||
}
|
||||
|
||||
export default function PortofolioEdit() {
|
||||
const { id } = useLocalSearchParams();
|
||||
const [isLoading, setIsLoading] = useState(false);
|
||||
const [selectedCountry, setSelectedCountry] = useState<null | ICountry>(null);
|
||||
const [bidangBisnis, setBidangBisnis] = useState<IMasterBidangBisnis[]>([]);
|
||||
const [data, setData] = useState<any>({});
|
||||
|
||||
const [selectedCountry, setSelectedCountry] = useState<null | ICountry>(null);
|
||||
const [bidangBisnis, setBidangBisnis] = useState<
|
||||
IMasterBidangBisnis[] | null
|
||||
>(null);
|
||||
const [subBidangBisnis, setSubBidangBisnis] = useState<
|
||||
IMasterSubBidangBisnis[] | null
|
||||
>(null);
|
||||
const [selectedSubBidang, setSelectedSubBidang] = useState<string[]>([]);
|
||||
const [listSubBidangSelected, setListSubBidangSelected] = useState<
|
||||
IListSubBidangSelected[]
|
||||
>([]);
|
||||
|
||||
function handleInputValue(phoneNumber: string) {
|
||||
setData({ ...data, tlpn: phoneNumber });
|
||||
}
|
||||
@@ -46,46 +79,200 @@ export default function PortofolioEdit() {
|
||||
setSelectedCountry(country);
|
||||
}
|
||||
|
||||
useEffect(() => {
|
||||
onLoadData(id as string);
|
||||
onLoadMaster();
|
||||
}, [id]);
|
||||
|
||||
const onLoadData = async (id: string) => {
|
||||
const response = await apiGetOnePortofolio({ id: id });
|
||||
|
||||
if (response.data.tlpn && response.data.tlpn.includes("62")) {
|
||||
const fixNumber = response.data.tlpn.replace("62", "");
|
||||
console.log("Fix Number >>", fixNumber);
|
||||
setData({ ...response.data, tlpn: fixNumber });
|
||||
}
|
||||
};
|
||||
|
||||
const onLoadMaster = async () => {
|
||||
const onLoadMasterBidang = async () => {
|
||||
try {
|
||||
const response = await apiMasterBidangBisnis();
|
||||
setBidangBisnis(response.data);
|
||||
|
||||
return response.success;
|
||||
} catch (error) {
|
||||
setBidangBisnis([]);
|
||||
console.log("Error onLoadMasterBidangBisnis", error);
|
||||
}
|
||||
};
|
||||
|
||||
async function onLoadMasterSubBidangBisnis() {
|
||||
try {
|
||||
const response = await apiMasterSubBidangBisnis({});
|
||||
setSubBidangBisnis(response.data);
|
||||
|
||||
return response.success;
|
||||
} catch (error) {
|
||||
console.error("Error on load master sub bidang bisnis", error);
|
||||
}
|
||||
}
|
||||
|
||||
const handleLoadMaster = async (id: string) => {
|
||||
const loadBidang = await onLoadMasterBidang();
|
||||
const loadSubBidang = await onLoadMasterSubBidangBisnis();
|
||||
|
||||
if (!loadBidang || !loadSubBidang) {
|
||||
return;
|
||||
}
|
||||
|
||||
onLoadData(id);
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
handleLoadMaster(id as any);
|
||||
}, [id]);
|
||||
|
||||
const onLoadData = async (id: string) => {
|
||||
const response = await apiGetOnePortofolio({ id: id });
|
||||
|
||||
if (response.success) {
|
||||
const fixNumber = response.data.tlpn.replace("62", "");
|
||||
setData({ ...response.data, tlpn: fixNumber });
|
||||
|
||||
// Cek apakah ada sub bidang bisnis yang terpilih
|
||||
const prevSubBidang = response.data.Portofolio_BidangDanSubBidangBisnis;
|
||||
if (prevSubBidang && prevSubBidang.length > 0) {
|
||||
setListSubBidangSelected(prevSubBidang);
|
||||
} else {
|
||||
// Jika tidak ada sub bidang yang terpilih sebelumnya, tetap inisialisasi dengan array kosong
|
||||
setListSubBidangSelected([
|
||||
{
|
||||
id: "",
|
||||
MasterSubBidangBisnis: {
|
||||
id: "",
|
||||
name: "",
|
||||
},
|
||||
},
|
||||
]);
|
||||
}
|
||||
|
||||
const bisnisId = response.data.masterBidangBisnisId;
|
||||
handleLoadSelectedSubBidang({
|
||||
id: bisnisId,
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
// Handler untuk saat komponen pertama kali load
|
||||
const handleLoadSelectedSubBidang = ({ id }: { id: string }) => {
|
||||
if (!subBidangBisnis) return;
|
||||
|
||||
const filteredSubBidang: any = subBidangBisnis.filter((item) => {
|
||||
return item.masterBidangBisnisId === id;
|
||||
});
|
||||
setSelectedSubBidang(filteredSubBidang);
|
||||
};
|
||||
|
||||
// Handler untuk menambah sub bidang bisnis
|
||||
const handleAddSubBidang = () => {
|
||||
setListSubBidangSelected([
|
||||
...listSubBidangSelected,
|
||||
{
|
||||
id: "",
|
||||
MasterSubBidangBisnis: { id: "", name: "" },
|
||||
},
|
||||
]);
|
||||
};
|
||||
|
||||
// Handler untuk menghapus sub bidang bisnis
|
||||
const handleRemoveSubBidang = (index: number) => {
|
||||
if (listSubBidangSelected.length <= 1) return;
|
||||
|
||||
const updatedList = [...listSubBidangSelected];
|
||||
updatedList.splice(index, 1);
|
||||
setListSubBidangSelected(updatedList);
|
||||
};
|
||||
|
||||
// Handler untuk perubahan bidang bisnis
|
||||
const handleBidangBisnisChange = (val: string) => {
|
||||
const isSameBidang = data?.MasterBidangBisnis?.id === val;
|
||||
|
||||
setData({ ...(data as any), masterBidangBisnisId: val });
|
||||
|
||||
// Reset sub bidang jika ganti bidang
|
||||
if (!isSameBidang) {
|
||||
setListSubBidangSelected([
|
||||
{
|
||||
id: "",
|
||||
MasterSubBidangBisnis: { id: "", name: "" },
|
||||
},
|
||||
]);
|
||||
}
|
||||
|
||||
handleLoadSelectedSubBidang({ id: val });
|
||||
};
|
||||
|
||||
// Handler untuk update sub bidang
|
||||
const handleSubBidangChange = (value: string, index: number) => {
|
||||
const select = selectedSubBidang.find((sub: any) => sub.id === value);
|
||||
const list: any = _.cloneDeep(listSubBidangSelected);
|
||||
list[index] = {
|
||||
id: "",
|
||||
MasterSubBidangBisnis: select || {
|
||||
id: value,
|
||||
name: "",
|
||||
masterBidangBisnisId: "",
|
||||
},
|
||||
};
|
||||
setListSubBidangSelected(list);
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
if (subBidangBisnis?.length !== undefined && data.masterBidangBisnisId) {
|
||||
handleLoadSelectedSubBidang({
|
||||
id: data.masterBidangBisnisId,
|
||||
});
|
||||
}
|
||||
}, [subBidangBisnis, data.masterBidangBisnisId]);
|
||||
|
||||
function validateData(data: any) {
|
||||
if (
|
||||
!data.namaBisnis ||
|
||||
!data.alamatKantor ||
|
||||
!data.tlpn ||
|
||||
!data.deskripsi ||
|
||||
!data.masterBidangBisnisId
|
||||
) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
function validateDataSubBidang(dataArray: any[]) {
|
||||
return !dataArray.some(
|
||||
(item: any) =>
|
||||
!item.MasterSubBidangBisnis.id ||
|
||||
item.MasterSubBidangBisnis.id.trim() === ""
|
||||
);
|
||||
}
|
||||
|
||||
const handleSubmitUpdate = async () => {
|
||||
const callingCode = selectedCountry?.callingCode.replace(/^\+/, "") || "";
|
||||
const fixNumber = data.tlpn.replace(/\s+/g, "");
|
||||
const realNumber = callingCode + fixNumber;
|
||||
|
||||
const newData: IFormData = {
|
||||
id_Portofolio: data.id_Portofolio,
|
||||
namaBisnis: data.namaBisnis,
|
||||
alamatKantor: data.alamatKantor,
|
||||
tlpn: realNumber,
|
||||
deskripsi: data.deskripsi,
|
||||
masterBidangBisnisId: data.masterBidangBisnisId,
|
||||
subBidang: listSubBidangSelected,
|
||||
};
|
||||
|
||||
if (!validateData(newData)) {
|
||||
return Toast.show({
|
||||
type: "error",
|
||||
text1: "Harap lengkapi data",
|
||||
});
|
||||
}
|
||||
|
||||
if (!validateDataSubBidang(listSubBidangSelected as any)) {
|
||||
return Toast.show({
|
||||
type: "error",
|
||||
text1: "Harap lengkapi sub bidang",
|
||||
});
|
||||
}
|
||||
|
||||
try {
|
||||
setIsLoading(true);
|
||||
const callingCode = selectedCountry?.callingCode.replace(/^\+/, "") || "";
|
||||
const fixNumber = data.tlpn.replace(/\s+/g, "");
|
||||
const realNumber = callingCode + fixNumber;
|
||||
|
||||
const newData: IFormData = {
|
||||
id_Portofolio: data.id_Portofolio,
|
||||
namaBisnis: data.namaBisnis,
|
||||
alamatKantor: data.alamatKantor,
|
||||
tlpn: realNumber,
|
||||
deskripsi: data.deskripsi,
|
||||
masterBidangBisnisId: data.masterBidangBisnisId,
|
||||
};
|
||||
|
||||
const response = await apiUpdatePortofolio({
|
||||
id: id as string,
|
||||
@@ -100,14 +287,14 @@ export default function PortofolioEdit() {
|
||||
text2: response.message,
|
||||
});
|
||||
|
||||
return
|
||||
return;
|
||||
}
|
||||
|
||||
Toast.show({
|
||||
type: "success",
|
||||
text1: "Sukses",
|
||||
text2: "Data terupdate",
|
||||
});
|
||||
Toast.show({
|
||||
type: "success",
|
||||
text1: "Sukses",
|
||||
text2: "Data terupdate",
|
||||
});
|
||||
|
||||
router.back();
|
||||
} catch (error) {
|
||||
@@ -129,6 +316,16 @@ export default function PortofolioEdit() {
|
||||
</BoxButtonOnFooter>
|
||||
);
|
||||
|
||||
if (!bidangBisnis || !subBidangBisnis) {
|
||||
return (
|
||||
<>
|
||||
<ViewWrapper>
|
||||
<ActivityIndicator size="large" color={MainColor.yellow} />
|
||||
</ViewWrapper>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<>
|
||||
<ViewWrapper footerComponent={buttonUpdate}>
|
||||
@@ -151,40 +348,83 @@ export default function PortofolioEdit() {
|
||||
value: item.id,
|
||||
}))}
|
||||
value={data.masterBidangBisnisId}
|
||||
onChange={(value) => {
|
||||
setData({ ...(data as any), masterBidangBisnisId: value });
|
||||
onChange={(value: any) => {
|
||||
handleBidangBisnisChange(value);
|
||||
}}
|
||||
/>
|
||||
|
||||
{/* <Grid>
|
||||
<Grid.Col span={10}>
|
||||
{listSubBidangSelected.map((item, index) => {
|
||||
// Filter data untuk select sub bidang, menghilangkan yang sudah dipilih kecuali untuk item ini sendiri
|
||||
const selectedIds = listSubBidangSelected
|
||||
.filter((_, i) => i !== index)
|
||||
.map((s) => s.MasterSubBidangBisnis?.id)
|
||||
.filter((id) => id); // Filter hanya yang memiliki id (tidak kosong)
|
||||
|
||||
const availableSubBidangOptions = (selectedSubBidang || [])
|
||||
.filter((sub: any) => {
|
||||
// Tampilkan jika ini adalah opsi yang dipilih saat ini atau belum dipilih di sub bidang lainnya
|
||||
|
||||
return (
|
||||
sub.id === item.MasterSubBidangBisnis?.id ||
|
||||
!selectedIds.includes(sub.id)
|
||||
);
|
||||
})
|
||||
.map((sub: any) => ({
|
||||
value: sub.id,
|
||||
label: sub.name,
|
||||
}));
|
||||
|
||||
return (
|
||||
<SelectCustom
|
||||
// disabled
|
||||
key={index}
|
||||
label="Sub Bidang Usaha"
|
||||
required
|
||||
data={dummyMasterSubBidangBisnis.map((item) => ({
|
||||
label: item.name,
|
||||
value: item.id,
|
||||
}))}
|
||||
value={data.masterSubBidangBisnisId}
|
||||
onChange={(value) => {
|
||||
setData({ ...(data as any), masterSubBidangBisnisId: value });
|
||||
data={availableSubBidangOptions}
|
||||
value={item.MasterSubBidangBisnis?.id || null}
|
||||
onChange={(value: any) => {
|
||||
handleSubBidangChange(value, index);
|
||||
}}
|
||||
/>
|
||||
</Grid.Col>
|
||||
<Grid.Col
|
||||
span={2}
|
||||
style={{ alignItems: "center", justifyContent: "center" }}
|
||||
);
|
||||
})}
|
||||
|
||||
<CenterCustom>
|
||||
<View
|
||||
style={{ flexDirection: "row", alignItems: "center", gap: 10 }}
|
||||
>
|
||||
<TouchableOpacity onPress={() => console.log("delete")}>
|
||||
<Ionicons name="trash" size={24} color={MainColor.red} />
|
||||
</TouchableOpacity>
|
||||
</Grid.Col>
|
||||
</Grid> */}
|
||||
{/* <ButtonCenteredOnly onPress={() => console.log("add")}>
|
||||
Tambah Pilihan
|
||||
</ButtonCenteredOnly>
|
||||
<Spacing /> */}
|
||||
<ActionIcon
|
||||
disabled={
|
||||
selectedSubBidang.length === listSubBidangSelected.length
|
||||
}
|
||||
onPress={() => {
|
||||
handleAddSubBidang();
|
||||
}}
|
||||
icon={
|
||||
<Ionicons
|
||||
name="add-circle-outline"
|
||||
size={ICON_SIZE_XLARGE}
|
||||
color={MainColor.black}
|
||||
/>
|
||||
}
|
||||
size="xl"
|
||||
/>
|
||||
<ActionIcon
|
||||
disabled={listSubBidangSelected.length <= 1}
|
||||
onPress={() => {
|
||||
handleRemoveSubBidang(listSubBidangSelected.length - 1);
|
||||
}}
|
||||
icon={
|
||||
<Ionicons
|
||||
name="remove-circle-outline"
|
||||
size={ICON_SIZE_XLARGE}
|
||||
color={MainColor.black}
|
||||
/>
|
||||
}
|
||||
size="xl"
|
||||
/>
|
||||
</View>
|
||||
</CenterCustom>
|
||||
<Spacing />
|
||||
|
||||
<View>
|
||||
<View style={{ flexDirection: "row", alignItems: "center" }}>
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import { DrawerCustom, Spacing, StackCustom } from "@/components";
|
||||
/* eslint-disable react-hooks/exhaustive-deps */
|
||||
import { DrawerCustom, LoaderCustom, Spacing, StackCustom } from "@/components";
|
||||
import LeftButtonCustom from "@/components/Button/BackButton";
|
||||
import ViewWrapper from "@/components/_ShareComponent/ViewWrapper";
|
||||
import { MainColor } from "@/constants/color-palet";
|
||||
@@ -10,6 +11,7 @@ import { drawerItemsPortofolio } from "@/screens/Portofolio/ListPage";
|
||||
import Portofolio_MenuDrawerSection from "@/screens/Portofolio/MenuDrawer";
|
||||
import Portofolio_SocialMediaSection from "@/screens/Portofolio/SocialMediaSection";
|
||||
import { apiGetOnePortofolio } from "@/service/api-client/api-portofolio";
|
||||
import { apiUser } from "@/service/api-client/api-user";
|
||||
import { GStyles } from "@/styles/global-styles";
|
||||
import { Ionicons } from "@expo/vector-icons";
|
||||
import { Stack, useFocusEffect, useLocalSearchParams } from "expo-router";
|
||||
@@ -18,10 +20,12 @@ import { TouchableOpacity } from "react-native";
|
||||
|
||||
export default function Portofolio() {
|
||||
const { id } = useLocalSearchParams();
|
||||
const { user } = useAuth();
|
||||
const [isDrawerOpen, setIsDrawerOpen] = useState(false);
|
||||
const [isLoadingDelete, setIsLoadingDelete] = useState(false);
|
||||
const [data, setData] = useState<any>();
|
||||
const [profileId, setProfileId] = useState<any>();
|
||||
|
||||
const { user } = useAuth();
|
||||
|
||||
const openDrawer = () => {
|
||||
setIsDrawerOpen(true);
|
||||
@@ -33,24 +37,27 @@ export default function Portofolio() {
|
||||
useFocusEffect(
|
||||
useCallback(() => {
|
||||
onLoadData(id as string);
|
||||
onLoadUserByToken();
|
||||
}, [id])
|
||||
);
|
||||
|
||||
async function onLoadData(id: string) {
|
||||
const response = await apiGetOnePortofolio({ id: id });
|
||||
console.log(
|
||||
"Response portofolio >>",
|
||||
JSON.stringify(response.data, null, 2)
|
||||
"[PROFILE ID]>>",
|
||||
JSON.stringify(response.data.Profile.id, null, 2)
|
||||
);
|
||||
|
||||
setData(response.data);
|
||||
}
|
||||
|
||||
const userId = user?.id;
|
||||
const userLoginId = data?.Profile?.userId
|
||||
|
||||
console.log("User ID >>", userId);
|
||||
console.log("User Login ID >>", userLoginId);
|
||||
const onLoadUserByToken = async () => {
|
||||
const response = await apiUser(user?.id as string);
|
||||
console.log(
|
||||
"[PROFILE LOGIN]>>",
|
||||
JSON.stringify(response.data?.Profile.id, null, 2)
|
||||
);
|
||||
setProfileId(response?.data?.Profile?.id);
|
||||
};
|
||||
|
||||
return (
|
||||
<>
|
||||
@@ -59,32 +66,41 @@ export default function Portofolio() {
|
||||
options={{
|
||||
title: "Portofolio",
|
||||
headerLeft: () => <LeftButtonCustom />,
|
||||
headerRight: () => (
|
||||
<TouchableOpacity onPress={openDrawer}>
|
||||
<Ionicons
|
||||
name="ellipsis-vertical"
|
||||
size={20}
|
||||
color={MainColor.yellow}
|
||||
/>
|
||||
</TouchableOpacity>
|
||||
),
|
||||
headerRight: () =>
|
||||
data?.Profile?.id !== profileId ? null : (
|
||||
<TouchableOpacity onPress={openDrawer}>
|
||||
<Ionicons
|
||||
name="ellipsis-vertical"
|
||||
size={20}
|
||||
color={MainColor.yellow}
|
||||
/>
|
||||
</TouchableOpacity>
|
||||
),
|
||||
headerStyle: GStyles.headerStyle,
|
||||
headerTitleStyle: GStyles.headerTitleStyle,
|
||||
}}
|
||||
/>
|
||||
<ViewWrapper>
|
||||
{/* <PorfofolioSection setShowDeleteAlert={setDeleteAlert} data={data} /> */}
|
||||
<StackCustom>
|
||||
<Portofolio_Data data={data} listSubBidang={data?.Portofolio_BidangDanSubBidangBisnis as any []} />
|
||||
<Portofolio_BusinessLocation />
|
||||
<Portofolio_SocialMediaSection data={data?.Portofolio_MediaSosial} />
|
||||
<Portofolio_ButtonDelete
|
||||
id={id as string}
|
||||
isLoadingDelete={isLoadingDelete}
|
||||
setIsLoadingDelete={setIsLoadingDelete}
|
||||
/>
|
||||
<Spacing />
|
||||
</StackCustom>
|
||||
{!data || !profileId ? (
|
||||
<LoaderCustom />
|
||||
) : (
|
||||
<StackCustom>
|
||||
<Portofolio_Data
|
||||
data={data}
|
||||
listSubBidang={data?.Portofolio_BidangDanSubBidangBisnis as any[]}
|
||||
/>
|
||||
<Portofolio_BusinessLocation />
|
||||
<Portofolio_SocialMediaSection
|
||||
data={data?.Portofolio_MediaSosial}
|
||||
/>
|
||||
<Portofolio_ButtonDelete
|
||||
id={id as string}
|
||||
isLoadingDelete={isLoadingDelete}
|
||||
setIsLoadingDelete={setIsLoadingDelete}
|
||||
/>
|
||||
<Spacing />
|
||||
</StackCustom>
|
||||
)}
|
||||
</ViewWrapper>
|
||||
|
||||
{/* Drawer Komponen Eksternal */}
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
/* eslint-disable react-hooks/exhaustive-deps */
|
||||
import { LoaderCustom } from "@/components";
|
||||
import ViewWrapper from "@/components/_ShareComponent/ViewWrapper";
|
||||
import LeftButtonCustom from "@/components/Button/BackButton";
|
||||
import DrawerCustom from "@/components/Drawer/DrawerCustom";
|
||||
@@ -9,6 +11,7 @@ import Profile_PortofolioSection from "@/screens/Profile/PortofolioSection";
|
||||
import ProfileSection from "@/screens/Profile/ProfileSection";
|
||||
import { apiGetPortofolio } from "@/service/api-client/api-portofolio";
|
||||
import { apiProfile } from "@/service/api-client/api-profile";
|
||||
import { apiUser } from "@/service/api-client/api-user";
|
||||
import { GStyles } from "@/styles/global-styles";
|
||||
import { IProfile } from "@/types/Type-Profile";
|
||||
import { Ionicons } from "@expo/vector-icons";
|
||||
@@ -20,9 +23,10 @@ export default function Profile() {
|
||||
const { id } = useLocalSearchParams();
|
||||
const [isDrawerOpen, setIsDrawerOpen] = useState(false);
|
||||
const [data, setData] = useState<IProfile>();
|
||||
const [dataPortofolio, setDataPortofolio] = useState<any[]>();
|
||||
const [dataToken, setDataToken] = useState<IProfile>();
|
||||
const [listPortofolio, setListPortofolio] = useState<any[]>();
|
||||
|
||||
const { logout, isAdmin } = useAuth();
|
||||
const { logout, isAdmin, user } = useAuth();
|
||||
|
||||
const openDrawer = () => {
|
||||
setIsDrawerOpen(true);
|
||||
@@ -36,14 +40,28 @@ export default function Profile() {
|
||||
useCallback(() => {
|
||||
onLoadData(id as string);
|
||||
onLoadPortofolio(id as string);
|
||||
onLoadUserByToken();
|
||||
isUserCheck();
|
||||
}, [id])
|
||||
);
|
||||
|
||||
const isUserCheck = () => {
|
||||
const userId = id;
|
||||
const userLoginId = dataToken?.id;
|
||||
|
||||
return userId === userLoginId;
|
||||
};
|
||||
|
||||
const onLoadData = async (id: string) => {
|
||||
const response = await apiProfile({ id: id });
|
||||
setData(response.data);
|
||||
};
|
||||
|
||||
const onLoadUserByToken = async () => {
|
||||
const response = await apiUser(user?.id as string);
|
||||
setDataToken(response?.data?.Profile);
|
||||
};
|
||||
|
||||
const onLoadPortofolio = async (id: string) => {
|
||||
const response = await apiGetPortofolio({ id: id });
|
||||
const lastTwoByDate = response.data
|
||||
@@ -52,7 +70,7 @@ export default function Profile() {
|
||||
new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime()
|
||||
) // urut desc
|
||||
.slice(0, 2);
|
||||
setDataPortofolio(lastTwoByDate);
|
||||
setListPortofolio(lastTwoByDate);
|
||||
};
|
||||
|
||||
return (
|
||||
@@ -61,27 +79,34 @@ export default function Profile() {
|
||||
options={{
|
||||
title: "Profile",
|
||||
headerLeft: () => <LeftButtonCustom />,
|
||||
headerRight: () => (
|
||||
<TouchableOpacity onPress={openDrawer}>
|
||||
<Ionicons
|
||||
name="ellipsis-vertical"
|
||||
size={20}
|
||||
color={MainColor.yellow}
|
||||
/>
|
||||
</TouchableOpacity>
|
||||
),
|
||||
headerRight: () =>
|
||||
isUserCheck() && (
|
||||
<TouchableOpacity onPress={openDrawer}>
|
||||
<Ionicons
|
||||
name="ellipsis-vertical"
|
||||
size={20}
|
||||
color={MainColor.yellow}
|
||||
/>
|
||||
</TouchableOpacity>
|
||||
),
|
||||
headerStyle: GStyles.headerStyle,
|
||||
headerTitleStyle: GStyles.headerTitleStyle,
|
||||
}}
|
||||
/>
|
||||
{/* Main View */}
|
||||
<ViewWrapper>
|
||||
<ProfileSection data={data as any} />
|
||||
{!data || !dataToken ? (
|
||||
<LoaderCustom />
|
||||
) : (
|
||||
<>
|
||||
<ProfileSection data={data as any} />
|
||||
|
||||
<Profile_PortofolioSection
|
||||
data={dataPortofolio as any}
|
||||
profileId={id as string}
|
||||
/>
|
||||
<Profile_PortofolioSection
|
||||
data={listPortofolio as any}
|
||||
profileId={id as string}
|
||||
/>
|
||||
</>
|
||||
)}
|
||||
</ViewWrapper>
|
||||
|
||||
{/* Drawer Komponen Eksternal */}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import {
|
||||
AvatarCustom,
|
||||
AvatarComp,
|
||||
ClickableCustom,
|
||||
Grid,
|
||||
Spacing,
|
||||
@@ -10,39 +10,42 @@ import {
|
||||
} from "@/components";
|
||||
import { MainColor } from "@/constants/color-palet";
|
||||
import { ICON_SIZE_SMALL } from "@/constants/constans-value";
|
||||
import { apiAllUser } from "@/service/api-client/api-user";
|
||||
import { Ionicons } from "@expo/vector-icons";
|
||||
import { router } from "expo-router";
|
||||
import _ from "lodash";
|
||||
import { useEffect, useState } from "react";
|
||||
|
||||
export default function UserSearch() {
|
||||
function generateRandomPhoneNumber(index: number) {
|
||||
let prefix;
|
||||
const [data, setData] = useState<any[]>([]);
|
||||
const [search, setSearch] = useState<string>("");
|
||||
|
||||
// Menentukan prefix berdasarkan index genap atau ganjil
|
||||
if (index % 2 === 0) {
|
||||
const evenPrefixes = ["6288", "6289", "6281"];
|
||||
prefix = evenPrefixes[Math.floor(Math.random() * evenPrefixes.length)];
|
||||
} else {
|
||||
const oddPrefixes = ["6285", "6283"];
|
||||
prefix = oddPrefixes[Math.floor(Math.random() * oddPrefixes.length)];
|
||||
useEffect(() => {
|
||||
onLoadData(search);
|
||||
}, [search]);
|
||||
|
||||
const onLoadData = async (search: string) => {
|
||||
try {
|
||||
const response = await apiAllUser({ search: search });
|
||||
console.log("[DATA USER] >", JSON.stringify(response.data, null, 2));
|
||||
setData(response.data);
|
||||
} catch (error) {
|
||||
console.log("Error fetching data", error);
|
||||
}
|
||||
};
|
||||
|
||||
// Menghitung panjang sisa nomor acak (antara 10 - 12 digit)
|
||||
const remainingLength = Math.floor(Math.random() * 3) + 10; // 10, 11, atau 12
|
||||
const handleSearch = (search: string) => {
|
||||
setSearch(search);
|
||||
onLoadData(search);
|
||||
};
|
||||
|
||||
// Membuat sisa nomor acak
|
||||
let randomNumber = "";
|
||||
for (let i = 0; i < remainingLength; i++) {
|
||||
randomNumber += Math.floor(Math.random() * 10); // Digit acak antara 0-9
|
||||
}
|
||||
|
||||
// Menggabungkan prefix dan sisa nomor
|
||||
return prefix + randomNumber;
|
||||
}
|
||||
return (
|
||||
<>
|
||||
<ViewWrapper
|
||||
headerComponent={
|
||||
<TextInputCustom
|
||||
value={search}
|
||||
onChangeText={handleSearch}
|
||||
iconLeft={
|
||||
<Ionicons
|
||||
name="search"
|
||||
@@ -57,41 +60,46 @@ export default function UserSearch() {
|
||||
}
|
||||
>
|
||||
<StackCustom>
|
||||
{Array.from({ length: 20 }).map((e, index) => {
|
||||
return (
|
||||
<Grid key={index}>
|
||||
<Grid.Col span={2}>
|
||||
<AvatarCustom href={`/profile/${index}`}/>
|
||||
</Grid.Col>
|
||||
<Grid.Col span={9}>
|
||||
<TextCustom size="large">Nama user {index}</TextCustom>
|
||||
<TextCustom size="small">
|
||||
+{generateRandomPhoneNumber(index)}
|
||||
</TextCustom>
|
||||
</Grid.Col>
|
||||
<Grid.Col
|
||||
span={1}
|
||||
style={{
|
||||
justifyContent: "center",
|
||||
alignItems: "flex-end",
|
||||
{!_.isEmpty(data) ? (
|
||||
data?.map((e, index) => {
|
||||
return (
|
||||
<ClickableCustom
|
||||
key={index}
|
||||
onPress={() => {
|
||||
console.log("Ke Profile");
|
||||
router.push(`/profile/${e?.Profile?.id}`);
|
||||
}}
|
||||
>
|
||||
<ClickableCustom
|
||||
onPress={() => {
|
||||
console.log("Ke Profile");
|
||||
router.push(`/profile/${index}`);
|
||||
}}
|
||||
>
|
||||
<Ionicons
|
||||
name="chevron-forward"
|
||||
size={ICON_SIZE_SMALL}
|
||||
color={MainColor.white}
|
||||
/>
|
||||
</ClickableCustom>
|
||||
</Grid.Col>
|
||||
</Grid>
|
||||
);
|
||||
})}
|
||||
<Grid>
|
||||
<Grid.Col span={2}>
|
||||
<AvatarComp fileId={e?.Profile?.imageId} size="base" />
|
||||
</Grid.Col>
|
||||
<Grid.Col span={9}>
|
||||
<StackCustom gap={"sm"}>
|
||||
<TextCustom size="large">{e?.username}</TextCustom>
|
||||
<TextCustom size="small">+{e?.nomor}</TextCustom>
|
||||
</StackCustom>
|
||||
</Grid.Col>
|
||||
<Grid.Col
|
||||
span={1}
|
||||
style={{
|
||||
justifyContent: "center",
|
||||
alignItems: "flex-end",
|
||||
}}
|
||||
>
|
||||
<Ionicons
|
||||
name="chevron-forward"
|
||||
size={ICON_SIZE_SMALL}
|
||||
color={MainColor.white}
|
||||
/>
|
||||
</Grid.Col>
|
||||
</Grid>
|
||||
</ClickableCustom>
|
||||
);
|
||||
})
|
||||
) : (
|
||||
<TextCustom align="center">Tidak ditemukan</TextCustom>
|
||||
)}
|
||||
</StackCustom>
|
||||
<Spacing height={50} />
|
||||
</ViewWrapper>
|
||||
|
||||
8
components/Loader/LoaderCustom.tsx
Normal file
8
components/Loader/LoaderCustom.tsx
Normal file
@@ -0,0 +1,8 @@
|
||||
import { MainColor } from "@/constants/color-palet";
|
||||
import { ActivityIndicator } from "react-native";
|
||||
|
||||
export default function LoaderCustom({ size }: { size?: "small" | "large" }) {
|
||||
return (
|
||||
<ActivityIndicator size={size ? size : "small"} color={MainColor.yellow} />
|
||||
);
|
||||
}
|
||||
@@ -61,6 +61,8 @@ import DummyLandscapeImage from "./_ShareComponent/DummyLandscapeImage";
|
||||
import GridComponentView from "./_ShareComponent/GridSectionView";
|
||||
// Progress
|
||||
import ProgressCustom from "./Progress/ProgressCustom";
|
||||
// Loader
|
||||
import LoaderCustom from "./Loader/LoaderCustom";
|
||||
|
||||
export {
|
||||
// ActionIcon
|
||||
@@ -128,4 +130,6 @@ export {
|
||||
TextInputCustom,
|
||||
// ViewWrapper
|
||||
ViewWrapper,
|
||||
// Loader
|
||||
LoaderCustom,
|
||||
};
|
||||
|
||||
@@ -92,7 +92,7 @@ export const AuthProvider = ({ children }: { children: React.ReactNode }) => {
|
||||
await AsyncStorage.setItem("authToken", token);
|
||||
|
||||
const responseUser = await apiConfig.get(
|
||||
`/mobile/user?token=${token}`,
|
||||
`/mobile?token=${token}`,
|
||||
{
|
||||
headers: {
|
||||
Authorization: `Bearer ${token}`,
|
||||
|
||||
@@ -89,7 +89,7 @@ export default function Portofolio_Data({
|
||||
// },
|
||||
// ];
|
||||
|
||||
console.log("List Sub Bidang >>", JSON.stringify(listSubBidang, null, 2));
|
||||
// console.log("List Sub Bidang >>", JSON.stringify(listSubBidang, null, 2));
|
||||
|
||||
return (
|
||||
<>
|
||||
|
||||
@@ -20,3 +20,7 @@ export async function apiMasterSubBidangBisnis({ id }: { id?: string }) {
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
// export async function apiMasterEventType(params:type) {
|
||||
|
||||
// }
|
||||
@@ -1,6 +1,12 @@
|
||||
import { apiConfig } from "../api-config";
|
||||
|
||||
export async function apiUser(id: string) {
|
||||
const response = await apiConfig.get(`/user/${id}`);
|
||||
const response = await apiConfig.get(`/mobile/user/${id}`);
|
||||
return response.data;
|
||||
}
|
||||
|
||||
export async function apiAllUser({ search }: { search: string }) {
|
||||
const response = await apiConfig.get(`/mobile/user?search=${search}`);
|
||||
return response.data;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user