Component
Fix: fix nama upload dan delete file service Invesment: Fix: - Edit data dan edit prospektus - View file dengan metode react-native-webview ### No issue
This commit is contained in:
@@ -1,9 +1,13 @@
|
||||
import { BackButton, ViewWrapper } from "@/components";
|
||||
import { MainColor } from "@/constants/color-palet";
|
||||
import { FontAwesome } from "@expo/vector-icons";
|
||||
import { Stack } from "expo-router";
|
||||
import { BackButton } from "@/components";
|
||||
import PdfViewer from "@/components/_ShareComponent/PdfViewer";
|
||||
import API_STRORAGE from "@/constants/base-url-api-strorage";
|
||||
import { Stack, useLocalSearchParams } from "expo-router";
|
||||
import { SafeAreaView } from "react-native-safe-area-context";
|
||||
|
||||
export default function FileScreen() {
|
||||
const { id } = useLocalSearchParams();
|
||||
const url = API_STRORAGE.GET({ fileId: id as string });
|
||||
|
||||
return (
|
||||
<>
|
||||
<Stack.Screen
|
||||
@@ -12,14 +16,9 @@ export default function FileScreen() {
|
||||
headerLeft: () => <BackButton />,
|
||||
}}
|
||||
/>
|
||||
<ViewWrapper>
|
||||
<FontAwesome
|
||||
name="file-pdf-o"
|
||||
size={300}
|
||||
style={{ alignSelf: "center" }}
|
||||
color={MainColor.white}
|
||||
/>
|
||||
</ViewWrapper>
|
||||
<SafeAreaView style={{ flex: 1 }} edges={["bottom"]}>
|
||||
<PdfViewer uri={url} />
|
||||
</SafeAreaView>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -42,7 +42,7 @@ export default function InvestmentDetailStatus() {
|
||||
const response = await apiInvestmentGetById({
|
||||
id: id as string,
|
||||
});
|
||||
// console.log("[DATA]", JSON.stringify(response.data, null, 2));
|
||||
|
||||
setData(response.data);
|
||||
} catch (error) {
|
||||
console.log("[ERROR]", error);
|
||||
@@ -63,7 +63,8 @@ export default function InvestmentDetailStatus() {
|
||||
|
||||
const bottomSection = (
|
||||
<Invesment_ComponentBoxOnBottomDetail
|
||||
id={id as string}
|
||||
id={data?.id}
|
||||
prospectusId={data?.prospektusFileId}
|
||||
status={status as string}
|
||||
/>
|
||||
);
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
/* eslint-disable react-hooks/exhaustive-deps */
|
||||
import {
|
||||
BaseBox,
|
||||
BoxButtonOnFooter,
|
||||
@@ -5,38 +6,149 @@ import {
|
||||
ButtonCustom,
|
||||
CenterCustom,
|
||||
InformationBox,
|
||||
LoaderCustom,
|
||||
Spacing,
|
||||
StackCustom,
|
||||
TextCustom,
|
||||
ViewWrapper,
|
||||
} from "@/components";
|
||||
import { MainColor } from "@/constants/color-palet";
|
||||
import { FontAwesome5 } from "@expo/vector-icons";
|
||||
import { router } from "expo-router";
|
||||
import DIRECTORY_ID from "@/constants/directory-id";
|
||||
import {
|
||||
apiInvestmentGetById,
|
||||
apiInvestmentUpdateData,
|
||||
} from "@/service/api-client/api-investment";
|
||||
import { deleteFileService, uploadFileService } from "@/service/upload-service";
|
||||
import pickFile, { IFileData } from "@/utils/pickFile";
|
||||
import { router, useFocusEffect, useLocalSearchParams } from "expo-router";
|
||||
import _ from "lodash";
|
||||
import { useCallback, useState } from "react";
|
||||
import Toast from "react-native-toast-message";
|
||||
|
||||
export default function InvestmentEditProspectus() {
|
||||
const { id } = useLocalSearchParams();
|
||||
const [data, setData] = useState<any>(null);
|
||||
const [loadingGet, setLoadingGet] = useState(false);
|
||||
const [isLoading, setIsLoading] = useState(false);
|
||||
const [pdf, setPdf] = useState<IFileData | null>(null);
|
||||
|
||||
useFocusEffect(
|
||||
useCallback(() => {
|
||||
onLoadData();
|
||||
}, [id])
|
||||
);
|
||||
|
||||
const onLoadData = async () => {
|
||||
try {
|
||||
setLoadingGet(true);
|
||||
const response = await apiInvestmentGetById({
|
||||
id: id as string,
|
||||
});
|
||||
setData(response.data);
|
||||
} catch (error) {
|
||||
console.log("[ERROR]", error);
|
||||
} finally {
|
||||
setLoadingGet(false);
|
||||
}
|
||||
};
|
||||
|
||||
const handleSubmitUpdate = async () => {
|
||||
const prevProspectusFileId = data?.prospektusFileId;
|
||||
try {
|
||||
setIsLoading(true);
|
||||
|
||||
const responseUploadImage = await uploadFileService({
|
||||
imageUri: pdf?.uri as any,
|
||||
dirId: DIRECTORY_ID.investasi_prospektus,
|
||||
});
|
||||
|
||||
if (!responseUploadImage.success) {
|
||||
Toast.show({
|
||||
type: "error",
|
||||
text1: "Gagal mengunggah gambar",
|
||||
});
|
||||
return;
|
||||
}
|
||||
const prospektusFileId = responseUploadImage.data.id;
|
||||
|
||||
const responseUpdate = await apiInvestmentUpdateData({
|
||||
id: id as string,
|
||||
data: prospektusFileId,
|
||||
category: "prospectus",
|
||||
});
|
||||
|
||||
if (responseUpdate.success) {
|
||||
const deletePrevImage = await deleteFileService({
|
||||
id: prevProspectusFileId as any,
|
||||
});
|
||||
|
||||
if (!deletePrevImage.success) {
|
||||
console.log("[ERROR DELETE PREV IMAGE]", deletePrevImage.message);
|
||||
return;
|
||||
}
|
||||
|
||||
Toast.show({
|
||||
type: "success",
|
||||
text1: "Data berhasil diupdate",
|
||||
});
|
||||
router.back();
|
||||
} else {
|
||||
Toast.show({
|
||||
type: "error",
|
||||
text1: responseUpdate.message,
|
||||
});
|
||||
}
|
||||
} catch (error) {
|
||||
console.log("[ERROR]", error);
|
||||
} finally {
|
||||
setIsLoading(false);
|
||||
}
|
||||
};
|
||||
|
||||
const buttonFooter = (
|
||||
<BoxButtonOnFooter>
|
||||
<ButtonCustom onPress={() => router.back()}>Update</ButtonCustom>
|
||||
<ButtonCustom
|
||||
disabled={pdf === null}
|
||||
isLoading={isLoading}
|
||||
onPress={handleSubmitUpdate}
|
||||
>
|
||||
Update
|
||||
</ButtonCustom>
|
||||
</BoxButtonOnFooter>
|
||||
);
|
||||
return (
|
||||
<ViewWrapper footerComponent={buttonFooter}>
|
||||
<ViewWrapper footerComponent={!loadingGet && buttonFooter}>
|
||||
<StackCustom gap={"xs"}>
|
||||
<InformationBox text="File prospektus wajib untuk diupload, agar calon investor paham dengan prospek investasi yang akan anda jalankan kedepan." />
|
||||
<Spacing />
|
||||
|
||||
<BaseBox>
|
||||
<CenterCustom>
|
||||
<FontAwesome5
|
||||
name="file-pdf"
|
||||
size={30}
|
||||
color={MainColor.disabled}
|
||||
/>
|
||||
{loadingGet ? (
|
||||
<LoaderCustom />
|
||||
) : pdf ? (
|
||||
<TextCustom truncate>{pdf.name}</TextCustom>
|
||||
) : (
|
||||
<TextCustom truncate>
|
||||
{_.snakeCase(data?.title || "").replace(/_/g, "-")}.pdf
|
||||
</TextCustom>
|
||||
)}
|
||||
</CenterCustom>
|
||||
</BaseBox>
|
||||
<ButtonCenteredOnly
|
||||
disabled={loadingGet}
|
||||
icon="upload"
|
||||
onPress={() => router.push("/(application)/(image)/take-picture/123")}
|
||||
onPress={() => {
|
||||
pickFile({
|
||||
allowedType: "pdf",
|
||||
setPdfUri(file: any) {
|
||||
setPdf({
|
||||
uri: file.uri,
|
||||
name: file.name,
|
||||
size: file.size,
|
||||
});
|
||||
},
|
||||
});
|
||||
}}
|
||||
>
|
||||
Upload
|
||||
</ButtonCenteredOnly>
|
||||
|
||||
@@ -19,8 +19,8 @@ import {
|
||||
} from "@/service/api-client/api-investment";
|
||||
import { apiMasterInvestment } from "@/service/api-client/api-master";
|
||||
import {
|
||||
deleteImageService,
|
||||
uploadImageService,
|
||||
deleteFileService,
|
||||
uploadFileService,
|
||||
} from "@/service/upload-service";
|
||||
import { formatCurrencyDisplay } from "@/utils/formatCurrencyDisplay";
|
||||
import pickFile from "@/utils/pickFile";
|
||||
@@ -93,7 +93,6 @@ export default function InvestmentEdit() {
|
||||
const response = await apiInvestmentGetById({
|
||||
id: id as string,
|
||||
});
|
||||
// console.log("[DATA]", JSON.stringify(response.data, null, 2));
|
||||
setData(response.data);
|
||||
} catch (error) {
|
||||
console.log("[ERROR]", error);
|
||||
@@ -145,7 +144,7 @@ export default function InvestmentEdit() {
|
||||
setIsLoading(true);
|
||||
|
||||
if (image) {
|
||||
const responseUploadImage = await uploadImageService({
|
||||
const responseUploadImage = await uploadFileService({
|
||||
imageUri: image,
|
||||
dirId: DIRECTORY_ID.investasi_image,
|
||||
});
|
||||
@@ -158,7 +157,7 @@ export default function InvestmentEdit() {
|
||||
return;
|
||||
}
|
||||
|
||||
const deletePrevImage = await deleteImageService({
|
||||
const deletePrevImage = await deleteFileService({
|
||||
id: data?.imageId as any,
|
||||
});
|
||||
|
||||
@@ -179,13 +178,9 @@ export default function InvestmentEdit() {
|
||||
const responseUpdate = await apiInvestmentUpdateData({
|
||||
id: id as string,
|
||||
data: newData,
|
||||
category: "data"
|
||||
});
|
||||
|
||||
console.log(
|
||||
"[RESPONSE UPDATE]",
|
||||
JSON.parse(JSON.stringify(responseUpdate))
|
||||
);
|
||||
|
||||
if (responseUpdate.success) {
|
||||
Toast.show({
|
||||
type: "success",
|
||||
@@ -219,7 +214,6 @@ export default function InvestmentEdit() {
|
||||
onPress={() => {
|
||||
pickFile({
|
||||
setImageUri: ({ uri }) => {
|
||||
console.log("URI IMAGE", uri);
|
||||
setImage(uri);
|
||||
},
|
||||
allowedType: "image",
|
||||
|
||||
@@ -18,7 +18,7 @@ import DIRECTORY_ID from "@/constants/directory-id";
|
||||
import { useAuth } from "@/hooks/use-auth";
|
||||
import { apiInvestmentCreate } from "@/service/api-client/api-investment";
|
||||
import { apiMasterInvestment } from "@/service/api-client/api-master";
|
||||
import { uploadImageService } from "@/service/upload-service";
|
||||
import { uploadFileService } from "@/service/upload-service";
|
||||
import { formatCurrencyDisplay } from "@/utils/formatCurrencyDisplay";
|
||||
import pickFile, { IFileData } from "@/utils/pickFile";
|
||||
import { FontAwesome5 } from "@expo/vector-icons";
|
||||
@@ -118,7 +118,7 @@ export default function InvestmentCreate() {
|
||||
|
||||
try {
|
||||
setIsLoading(true);
|
||||
const responseUploadImage = await uploadImageService({
|
||||
const responseUploadImage = await uploadFileService({
|
||||
imageUri: image,
|
||||
dirId: DIRECTORY_ID.investasi_image,
|
||||
});
|
||||
@@ -132,7 +132,7 @@ export default function InvestmentCreate() {
|
||||
}
|
||||
|
||||
const imageId = responseUploadImage.data.id;
|
||||
const responseUploadPdf = await uploadImageService({
|
||||
const responseUploadPdf = await uploadFileService({
|
||||
imageUri: pdf.uri,
|
||||
dirId: DIRECTORY_ID.investasi_prospektus,
|
||||
});
|
||||
@@ -161,7 +161,7 @@ export default function InvestmentCreate() {
|
||||
};
|
||||
|
||||
const response = await apiInvestmentCreate({ data: newData });
|
||||
console.log("[RESPONSE]", JSON.stringify(response, null, 2));
|
||||
|
||||
if (response.success) {
|
||||
Toast.show({
|
||||
type: "success",
|
||||
@@ -194,7 +194,6 @@ export default function InvestmentCreate() {
|
||||
onPress={() => {
|
||||
pickFile({
|
||||
setImageUri: ({ uri }) => {
|
||||
console.log("URI IMAGE", uri);
|
||||
setImage(uri);
|
||||
},
|
||||
allowedType: "image",
|
||||
@@ -226,7 +225,7 @@ export default function InvestmentCreate() {
|
||||
onPress={() => {
|
||||
pickFile({
|
||||
setPdfUri: ({ uri, name, size }) => {
|
||||
console.log("URI PDF", JSON.stringify(uri, null, 2));
|
||||
|
||||
setPdf({ uri, name, size });
|
||||
},
|
||||
allowedType: "pdf",
|
||||
|
||||
@@ -1,23 +1,23 @@
|
||||
/* eslint-disable react-hooks/exhaustive-deps */
|
||||
import {
|
||||
BaseBox,
|
||||
ButtonCenteredOnly,
|
||||
ButtonCustom,
|
||||
DummyLandscapeImage,
|
||||
InformationBox,
|
||||
LandscapeFrameUploaded,
|
||||
LoaderCustom,
|
||||
Spacing,
|
||||
StackCustom,
|
||||
TextAreaCustom,
|
||||
TextInputCustom,
|
||||
ViewWrapper,
|
||||
BaseBox,
|
||||
ButtonCenteredOnly,
|
||||
ButtonCustom,
|
||||
DummyLandscapeImage,
|
||||
InformationBox,
|
||||
LandscapeFrameUploaded,
|
||||
LoaderCustom,
|
||||
Spacing,
|
||||
StackCustom,
|
||||
TextAreaCustom,
|
||||
TextInputCustom,
|
||||
ViewWrapper,
|
||||
} from "@/components";
|
||||
import DIRECTORY_ID from "@/constants/directory-id";
|
||||
import { apiJobGetOne, apiJobUpdateData } from "@/service/api-client/api-job";
|
||||
import {
|
||||
deleteImageService,
|
||||
uploadImageService,
|
||||
deleteFileService,
|
||||
uploadFileService,
|
||||
} from "@/service/upload-service";
|
||||
import pickImage from "@/utils/pickImage";
|
||||
import { router, useLocalSearchParams } from "expo-router";
|
||||
@@ -69,7 +69,7 @@ export default function JobEdit() {
|
||||
let newImageId = "";
|
||||
|
||||
if (imageUri) {
|
||||
const responseUploadImage = await uploadImageService({
|
||||
const responseUploadImage = await uploadFileService({
|
||||
imageUri: imageUri,
|
||||
dirId: DIRECTORY_ID.job_image,
|
||||
});
|
||||
@@ -80,7 +80,7 @@ export default function JobEdit() {
|
||||
}
|
||||
|
||||
if (data?.imageId) {
|
||||
const responseDeleteImage = await deleteImageService({
|
||||
const responseDeleteImage = await deleteFileService({
|
||||
id: data.imageId,
|
||||
});
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ import {
|
||||
import DIRECTORY_ID from "@/constants/directory-id";
|
||||
import { useAuth } from "@/hooks/use-auth";
|
||||
import { apiJobCreate } from "@/service/api-client/api-job";
|
||||
import { uploadImageService } from "@/service/upload-service";
|
||||
import { uploadFileService } from "@/service/upload-service";
|
||||
import pickImage from "@/utils/pickImage";
|
||||
import { router } from "expo-router";
|
||||
import { useState } from "react";
|
||||
@@ -66,7 +66,7 @@ export default function JobCreate() {
|
||||
return;
|
||||
}
|
||||
|
||||
const responseUploadImage = await uploadImageService({
|
||||
const responseUploadImage = await uploadFileService({
|
||||
imageUri: image,
|
||||
dirId: DIRECTORY_ID.job_image,
|
||||
});
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
import {
|
||||
BaseBox,
|
||||
BoxButtonOnFooter,
|
||||
ButtonCenteredOnly,
|
||||
ButtonCustom,
|
||||
ViewWrapper
|
||||
BaseBox,
|
||||
BoxButtonOnFooter,
|
||||
ButtonCenteredOnly,
|
||||
ButtonCustom,
|
||||
ViewWrapper
|
||||
} from "@/components";
|
||||
import API_STRORAGE from "@/constants/base-url-api-strorage";
|
||||
import DIRECTORY_ID from "@/constants/directory-id";
|
||||
@@ -11,10 +11,10 @@ import DUMMY_IMAGE from "@/constants/dummy-image-value";
|
||||
import { useAuth } from "@/hooks/use-auth";
|
||||
import { apiFileDelete } from "@/service/api-client/api-file";
|
||||
import {
|
||||
apiGetOnePortofolio,
|
||||
apiUpdatePortofolio,
|
||||
apiGetOnePortofolio,
|
||||
apiUpdatePortofolio,
|
||||
} from "@/service/api-client/api-portofolio";
|
||||
import { uploadImageService } from "@/service/upload-service";
|
||||
import { uploadFileService } from "@/service/upload-service";
|
||||
import pickImage from "@/utils/pickImage";
|
||||
import { Image } from "expo-image";
|
||||
import { router, useLocalSearchParams } from "expo-router";
|
||||
@@ -45,7 +45,7 @@ export default function PortofolioEditLogo() {
|
||||
try {
|
||||
setIsLoading(true);
|
||||
|
||||
const response = await uploadImageService({
|
||||
const response = await uploadFileService({
|
||||
imageUri,
|
||||
dirId: DIRECTORY_ID.portofolio_logo,
|
||||
});
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import {
|
||||
BaseBox,
|
||||
BoxButtonOnFooter,
|
||||
ButtonCenteredOnly,
|
||||
ButtonCustom,
|
||||
BaseBox,
|
||||
BoxButtonOnFooter,
|
||||
ButtonCenteredOnly,
|
||||
ButtonCustom,
|
||||
} from "@/components";
|
||||
import ViewWrapper from "@/components/_ShareComponent/ViewWrapper";
|
||||
import API_STRORAGE from "@/constants/base-url-api-strorage";
|
||||
@@ -11,7 +11,7 @@ import DUMMY_IMAGE from "@/constants/dummy-image-value";
|
||||
import { useAuth } from "@/hooks/use-auth";
|
||||
import { apiFileDelete } from "@/service/api-client/api-file";
|
||||
import { apiProfile, apiUpdateProfile } from "@/service/api-client/api-profile";
|
||||
import { uploadImageService } from "@/service/upload-service";
|
||||
import { uploadFileService } from "@/service/upload-service";
|
||||
import { IProfile } from "@/types/Type-Profile";
|
||||
import pickImage from "@/utils/pickImage";
|
||||
import { router, useFocusEffect, useLocalSearchParams } from "expo-router";
|
||||
@@ -45,7 +45,7 @@ export default function UpdateBackgroundProfile() {
|
||||
try {
|
||||
setIsLoading(true);
|
||||
|
||||
const response = await uploadImageService({
|
||||
const response = await uploadFileService({
|
||||
imageUri,
|
||||
dirId: DIRECTORY_ID.profile_background,
|
||||
});
|
||||
|
||||
@@ -8,16 +8,16 @@ import ViewWrapper from "@/components/_ShareComponent/ViewWrapper";
|
||||
import API_STRORAGE from "@/constants/base-url-api-strorage";
|
||||
import DIRECTORY_ID from "@/constants/directory-id";
|
||||
import DUMMY_IMAGE from "@/constants/dummy-image-value";
|
||||
import { useAuth } from "@/hooks/use-auth";
|
||||
import { apiFileDelete } from "@/service/api-client/api-file";
|
||||
import { apiProfile, apiUpdateProfile } from "@/service/api-client/api-profile";
|
||||
import { uploadImageService } from "@/service/upload-service";
|
||||
import { uploadFileService } from "@/service/upload-service";
|
||||
import { IProfile } from "@/types/Type-Profile";
|
||||
import pickImage from "@/utils/pickImage";
|
||||
import { router, useFocusEffect, useLocalSearchParams } from "expo-router";
|
||||
import { useCallback, useState } from "react";
|
||||
import { Image } from "react-native";
|
||||
import Toast from "react-native-toast-message";
|
||||
import { useAuth } from "@/hooks/use-auth";
|
||||
import { apiFileDelete } from "@/service/api-client/api-file";
|
||||
|
||||
export default function UpdatePhotoProfile() {
|
||||
const { id } = useLocalSearchParams();
|
||||
@@ -46,7 +46,7 @@ export default function UpdatePhotoProfile() {
|
||||
try {
|
||||
setIsLoading(true);
|
||||
|
||||
const response = await uploadImageService({
|
||||
const response = await uploadFileService({
|
||||
imageUri,
|
||||
dirId: DIRECTORY_ID.profile_foto,
|
||||
});
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
import {
|
||||
BaseBox,
|
||||
ButtonCenteredOnly,
|
||||
ButtonCustom,
|
||||
SelectCustom,
|
||||
Spacing,
|
||||
StackCustom,
|
||||
TextInputCustom,
|
||||
ViewWrapper,
|
||||
BaseBox,
|
||||
ButtonCenteredOnly,
|
||||
ButtonCustom,
|
||||
SelectCustom,
|
||||
Spacing,
|
||||
StackCustom,
|
||||
TextInputCustom,
|
||||
ViewWrapper,
|
||||
} from "@/components";
|
||||
import BoxButtonOnFooter from "@/components/Box/BoxButtonOnFooter";
|
||||
import InformationBox from "@/components/Box/InformationBox";
|
||||
@@ -15,7 +15,7 @@ import DUMMY_IMAGE from "@/constants/dummy-image-value";
|
||||
import { useAuth } from "@/hooks/use-auth";
|
||||
import { apiCreateProfile } from "@/service/api-client/api-profile";
|
||||
import { apiValidationEmail } from "@/service/api-client/api-validation";
|
||||
import { uploadImageService } from "@/service/upload-service";
|
||||
import { uploadFileService } from "@/service/upload-service";
|
||||
import pickImage from "@/utils/pickImage";
|
||||
import { router } from "expo-router";
|
||||
import { useState } from "react";
|
||||
@@ -69,7 +69,7 @@ export default function CreateProfile() {
|
||||
|
||||
if (imagePhoto) {
|
||||
try {
|
||||
const responseUploadPhoto = await uploadImageService({
|
||||
const responseUploadPhoto = await uploadFileService({
|
||||
imageUri: imagePhoto,
|
||||
dirId: DIRECTORY_ID.profile_foto,
|
||||
});
|
||||
@@ -90,7 +90,7 @@ export default function CreateProfile() {
|
||||
|
||||
if (imageBackground) {
|
||||
try {
|
||||
const responseUploadBackground = await uploadImageService({
|
||||
const responseUploadBackground = await uploadFileService({
|
||||
imageUri: imageBackground,
|
||||
dirId: DIRECTORY_ID.profile_background,
|
||||
});
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
import {
|
||||
AvatarCustom,
|
||||
BoxButtonOnFooter,
|
||||
ButtonCustom,
|
||||
StackCustom,
|
||||
ViewWrapper,
|
||||
AvatarCustom,
|
||||
BoxButtonOnFooter,
|
||||
ButtonCustom,
|
||||
StackCustom,
|
||||
ViewWrapper,
|
||||
} from "@/components";
|
||||
import DIRECTORY_ID from "@/constants/directory-id";
|
||||
import DUMMY_IMAGE from "@/constants/dummy-image-value";
|
||||
import { uploadImageService } from "@/service/upload-service";
|
||||
import { uploadFileService } from "@/service/upload-service";
|
||||
import AsyncStorage from "@react-native-async-storage/async-storage";
|
||||
import { router } from "expo-router";
|
||||
import { useState } from "react";
|
||||
@@ -21,7 +21,7 @@ export default function ScreenUpload() {
|
||||
async function onUpload() {
|
||||
setIsLoading(true);
|
||||
try {
|
||||
const response = await uploadImageService({
|
||||
const response = await uploadFileService({
|
||||
imageUri,
|
||||
dirId: DIRECTORY_ID.profile_foto,
|
||||
});
|
||||
|
||||
6
bun.lock
6
bun.lock
@@ -23,7 +23,7 @@
|
||||
"expo-constants": "~18.0.8",
|
||||
"expo-dev-client": "~6.0.12",
|
||||
"expo-document-picker": "~14.0.7",
|
||||
"expo-file-system": "~19.0.12",
|
||||
"expo-file-system": "^19.0.15",
|
||||
"expo-font": "~14.0.8",
|
||||
"expo-haptics": "~15.0.7",
|
||||
"expo-image": "~3.0.8",
|
||||
@@ -1171,7 +1171,7 @@
|
||||
|
||||
"expo-document-picker": ["expo-document-picker@14.0.7", "", { "peerDependencies": { "expo": "*" } }, "sha512-81Jh8RDD0GYBUoSTmIBq30hXXjmkDV1ZY2BNIp1+3HR5PDSh2WmdhD/Ezz5YFsv46hIXHsQc+Kh1q8vn6OLT9Q=="],
|
||||
|
||||
"expo-file-system": ["expo-file-system@19.0.12", "", { "peerDependencies": { "expo": "*", "react-native": "*" } }, "sha512-gqpxpnjfhzXLcqMOi49isB5S1Af49P9410fsaFfnLZWN3X6Dwc8EplDwbaolOI/wnGwP81P+/nDn5RNmU6m7mQ=="],
|
||||
"expo-file-system": ["expo-file-system@19.0.15", "", { "peerDependencies": { "expo": "*", "react-native": "*" } }, "sha512-sRLW+3PVJDiuoCE2LuteHhC7OxPjh1cfqLylf1YG1TDEbbQXnzwjfsKeRm6dslEPZLkMWfSLYIrVbnuq5mF7kQ=="],
|
||||
|
||||
"expo-font": ["expo-font@14.0.8", "", { "dependencies": { "fontfaceobserver": "^2.1.0" }, "peerDependencies": { "expo": "*", "react": "*", "react-native": "*" } }, "sha512-bTUHaJWRZ7ywP8dg3f+wfOwv6RwMV3mWT2CDUIhsK70GjNGlCtiWOCoHsA5Od/esPaVxqc37cCBvQGQRFStRlA=="],
|
||||
|
||||
@@ -2567,6 +2567,8 @@
|
||||
|
||||
"expo/babel-preset-expo": ["babel-preset-expo@54.0.0", "", { "dependencies": { "@babel/helper-module-imports": "^7.25.9", "@babel/plugin-proposal-decorators": "^7.12.9", "@babel/plugin-proposal-export-default-from": "^7.24.7", "@babel/plugin-syntax-export-default-from": "^7.24.7", "@babel/plugin-transform-class-static-block": "^7.27.1", "@babel/plugin-transform-export-namespace-from": "^7.25.9", "@babel/plugin-transform-flow-strip-types": "^7.25.2", "@babel/plugin-transform-modules-commonjs": "^7.24.8", "@babel/plugin-transform-object-rest-spread": "^7.24.7", "@babel/plugin-transform-parameters": "^7.24.7", "@babel/plugin-transform-private-methods": "^7.24.7", "@babel/plugin-transform-private-property-in-object": "^7.24.7", "@babel/plugin-transform-runtime": "^7.24.7", "@babel/preset-react": "^7.22.15", "@babel/preset-typescript": "^7.23.0", "@react-native/babel-preset": "0.81.4", "babel-plugin-react-compiler": "^19.1.0-rc.2", "babel-plugin-react-native-web": "~0.21.0", "babel-plugin-syntax-hermes-parser": "^0.25.1", "babel-plugin-transform-flow-enums": "^0.0.2", "debug": "^4.3.4", "resolve-from": "^5.0.0" }, "peerDependencies": { "@babel/runtime": "^7.20.0", "expo": "*", "react-refresh": ">=0.14.0 <1.0.0" }, "optionalPeers": ["@babel/runtime", "expo"] }, "sha512-a0Ej4ik6xzvtrA4Ivblov3XVvfntIoqnXOy2jG2k/3hzWqzrJxKyY2gUW9ZCMAicGevj2ju28q+TsK29uTe0eQ=="],
|
||||
|
||||
"expo/expo-file-system": ["expo-file-system@19.0.12", "", { "peerDependencies": { "expo": "*", "react-native": "*" } }, "sha512-gqpxpnjfhzXLcqMOi49isB5S1Af49P9410fsaFfnLZWN3X6Dwc8EplDwbaolOI/wnGwP81P+/nDn5RNmU6m7mQ=="],
|
||||
|
||||
"expo-module-scripts/typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="],
|
||||
|
||||
"expo-modules-autolinking/commander": ["commander@7.2.0", "", {}, "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw=="],
|
||||
|
||||
@@ -10,15 +10,18 @@ interface ButtonCenteredOnlyProps {
|
||||
icon?: "plus" | "upload" | string;
|
||||
onPress: () => void;
|
||||
isLoading?: boolean;
|
||||
disabled?: boolean;
|
||||
}
|
||||
export default function ButtonCenteredOnly({
|
||||
onPress,
|
||||
children,
|
||||
icon = "plus",
|
||||
isLoading = false,
|
||||
disabled = false,
|
||||
}: ButtonCenteredOnlyProps) {
|
||||
return (
|
||||
<ButtonCustom
|
||||
disabled={disabled}
|
||||
isLoading={isLoading}
|
||||
onPress={onPress}
|
||||
iconLeft={
|
||||
|
||||
63
components/_ShareComponent/PdfViewer.tsx
Normal file
63
components/_ShareComponent/PdfViewer.tsx
Normal file
@@ -0,0 +1,63 @@
|
||||
// PdfViewer.tsx
|
||||
import React, { useState } from "react";
|
||||
import { ActivityIndicator, StyleSheet, View } from "react-native";
|
||||
import WebView from "react-native-webview";
|
||||
|
||||
interface PdfViewerProps {
|
||||
uri: string; // URL PDF dari API
|
||||
}
|
||||
|
||||
const PdfViewer: React.FC<PdfViewerProps> = ({ uri }) => {
|
||||
const [loading, setLoading] = useState(true);
|
||||
|
||||
return (
|
||||
<>
|
||||
{loading && (
|
||||
<View style={styles.loadingContainer}>
|
||||
<ActivityIndicator size="large" color="#007AFF" />
|
||||
</View>
|
||||
)}
|
||||
<WebView
|
||||
source={{ uri }}
|
||||
style={styles.webView}
|
||||
onLoadEnd={() => setLoading(false)}
|
||||
onError={(syntheticEvent) => {
|
||||
const { nativeEvent } = syntheticEvent;
|
||||
console.warn("WebView error:", nativeEvent);
|
||||
setLoading(false);
|
||||
}}
|
||||
scalesPageToFit={true}
|
||||
javaScriptEnabled={true}
|
||||
domStorageEnabled={true}
|
||||
originWhitelist={["*"]}
|
||||
/>
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
// const { width, height } = Dimensions.get("window");
|
||||
|
||||
const styles = StyleSheet.create({
|
||||
container: {
|
||||
flex: 1,
|
||||
backgroundColor: "#f0f0f0",
|
||||
},
|
||||
loadingContainer: {
|
||||
position: "absolute",
|
||||
top: 0,
|
||||
left: 0,
|
||||
right: 0,
|
||||
bottom: 0,
|
||||
justifyContent: "center",
|
||||
alignItems: "center",
|
||||
backgroundColor: "rgba(255,255,255,0.8)",
|
||||
zIndex: 1,
|
||||
},
|
||||
webView: {
|
||||
// width: width,
|
||||
// height: height,
|
||||
flex: 1,
|
||||
},
|
||||
});
|
||||
|
||||
export default PdfViewer;
|
||||
@@ -30,7 +30,7 @@
|
||||
"expo-constants": "~18.0.8",
|
||||
"expo-dev-client": "~6.0.12",
|
||||
"expo-document-picker": "~14.0.7",
|
||||
"expo-file-system": "~19.0.12",
|
||||
"expo-file-system": "^19.0.15",
|
||||
"expo-font": "~14.0.8",
|
||||
"expo-haptics": "~15.0.7",
|
||||
"expo-image": "~3.0.8",
|
||||
|
||||
@@ -3,7 +3,7 @@ import {
|
||||
apiInvestmentDelete,
|
||||
apiInvestmentUpdateStatus,
|
||||
} from "@/service/api-client/api-investment";
|
||||
import { deleteImageService } from "@/service/upload-service";
|
||||
import { deleteFileService } from "@/service/upload-service";
|
||||
import { router } from "expo-router";
|
||||
import { useState } from "react";
|
||||
import Toast from "react-native-toast-message";
|
||||
@@ -138,7 +138,7 @@ export default function Investment_ButtonStatusSection({
|
||||
|
||||
console.log("[RESPONSE]", JSON.stringify(response, null, 2));
|
||||
if (response.success) {
|
||||
const deleteImage = await deleteImageService({
|
||||
const deleteImage = await deleteFileService({
|
||||
id: response?.data?.imageId as string,
|
||||
});
|
||||
|
||||
@@ -150,7 +150,7 @@ export default function Investment_ButtonStatusSection({
|
||||
return;
|
||||
}
|
||||
|
||||
const deleteFile = await deleteImageService({
|
||||
const deleteFile = await deleteFileService({
|
||||
id: response?.data?.prospektusFileId as string,
|
||||
});
|
||||
|
||||
|
||||
@@ -11,11 +11,14 @@ import { Ionicons } from "@expo/vector-icons";
|
||||
|
||||
export default function Invesment_ComponentBoxOnBottomDetail({
|
||||
id,
|
||||
prospectusId,
|
||||
status,
|
||||
}: {
|
||||
id: string;
|
||||
prospectusId: string;
|
||||
status: string;
|
||||
}) {
|
||||
|
||||
return (
|
||||
<>
|
||||
{status === "publish" ? (
|
||||
@@ -94,7 +97,7 @@ export default function Invesment_ComponentBoxOnBottomDetail({
|
||||
<BaseBox
|
||||
backgroundColor={AccentColor.blue}
|
||||
style={{ borderColor: AccentColor.softblue, borderWidth: 1 }}
|
||||
href={`/(file)/${id}`}
|
||||
href={`/(file)/${prospectusId}`}
|
||||
>
|
||||
<StackCustom>
|
||||
<TextCustom align="center">Prospektus</TextCustom>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { BoxButtonOnFooter, ButtonCustom } from "@/components";
|
||||
import DIRECTORY_ID from "@/constants/directory-id";
|
||||
import { apiPortofolioCreate } from "@/service/api-client/api-portofolio";
|
||||
import { uploadImageService } from "@/service/upload-service";
|
||||
import { uploadFileService } from "@/service/upload-service";
|
||||
import { router } from "expo-router";
|
||||
import Toast from "react-native-toast-message";
|
||||
|
||||
@@ -72,7 +72,7 @@ export default function Portofolio_ButtonCreate({
|
||||
setIsLoadingCreate(true);
|
||||
let fileId = "";
|
||||
if (imageUri) {
|
||||
const response = await uploadImageService({
|
||||
const response = await uploadFileService({
|
||||
imageUri: imageUri,
|
||||
dirId: DIRECTORY_ID.portofolio_logo,
|
||||
});
|
||||
|
||||
@@ -44,7 +44,7 @@ export async function apiInvestmentUpdateStatus({
|
||||
id: string;
|
||||
status: "publish" | "draft" | "review" | "reject";
|
||||
}) {
|
||||
console.log("[DATA FETCH]", JSON.stringify({ id, status }, null, 2));
|
||||
|
||||
try {
|
||||
const response = await apiConfig.put(`/mobile/investment/${id}/${status}`);
|
||||
return response.data;
|
||||
@@ -65,12 +65,15 @@ export async function apiInvestmentDelete({ id }: { id: string }) {
|
||||
export async function apiInvestmentUpdateData({
|
||||
id,
|
||||
data,
|
||||
category,
|
||||
}: {
|
||||
id: string;
|
||||
data: any;
|
||||
category: "data" | "prospectus";
|
||||
}) {
|
||||
|
||||
try {
|
||||
const response = await apiConfig.put(`/mobile/investment/${id}`, {
|
||||
const response = await apiConfig.put(`/mobile/investment/${id}?category=${category}`, {
|
||||
data: data,
|
||||
});
|
||||
return response.data;
|
||||
|
||||
@@ -2,9 +2,9 @@ import { API_BASE_URL } from "@/service/api-config";
|
||||
import AsyncStorage from "@react-native-async-storage/async-storage";
|
||||
import { apiFileDelete, apiFileUpload } from "./api-client/api-file";
|
||||
|
||||
export async function uploadImageService({
|
||||
export async function uploadFileService({
|
||||
dirId,
|
||||
imageUri,
|
||||
imageUri: fileUri,
|
||||
}: {
|
||||
dirId: string;
|
||||
imageUri: string | null;
|
||||
@@ -14,12 +14,12 @@ export async function uploadImageService({
|
||||
|
||||
console.log("url >>", url);
|
||||
|
||||
if (!imageUri) {
|
||||
if (!fileUri) {
|
||||
throw new Error("Harap pilih gambar terlebih dahulu");
|
||||
}
|
||||
|
||||
try {
|
||||
const uri = imageUri;
|
||||
const uri = fileUri;
|
||||
const filename = uri.split("/").pop();
|
||||
const match = /\.(\w+)$/.exec(filename || "");
|
||||
const type = match ? `image/${match[1]}` : "image";
|
||||
@@ -50,7 +50,7 @@ export async function uploadImageService({
|
||||
}
|
||||
}
|
||||
|
||||
export async function deleteImageService({ id }: { id: string }) {
|
||||
export async function deleteFileService({ id }: { id: string }) {
|
||||
const token = await AsyncStorage.getItem("authToken");
|
||||
|
||||
try {
|
||||
|
||||
Reference in New Issue
Block a user