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:
2025-09-30 17:30:07 +08:00
parent 3d8d8568a3
commit 5f05d1f7f0
21 changed files with 292 additions and 113 deletions

View File

@@ -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>
</>
);
}

View File

@@ -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}
/>
);

View File

@@ -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>

View File

@@ -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",

View File

@@ -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",

View File

@@ -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,
});

View File

@@ -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,
});

View File

@@ -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,
});

View File

@@ -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,
});

View File

@@ -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,
});

View File

@@ -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,
});

View File

@@ -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,
});

View File

@@ -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=="],

View File

@@ -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={

View 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;

View File

@@ -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",

View File

@@ -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,
});

View File

@@ -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>

View File

@@ -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,
});

View File

@@ -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;

View File

@@ -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 {