Compare commits

...

5 Commits

Author SHA1 Message Date
166d8f1c16 upd: notifikasi
Deskripsi:
- update notifikasi android

No Issues
2026-03-05 14:38:45 +08:00
7060a2d165 upd: otp
Deskripsi:
- link otp baru

NOIssues
2026-03-05 14:15:36 +08:00
d6217aecf1 Merge pull request 'upd: notifikasi' (#34) from amalia/04-mar-26 into join
Reviewed-on: #34
2026-03-04 16:39:05 +08:00
608381673f upd: notifikasi
Deskripsi:
- notifikasi saat allowed device
- ios dan android

No Issues
2026-03-04 16:35:59 +08:00
3cc7f76346 Merge pull request 'amalia/03-mar-26' (#33) from amalia/03-mar-26 into join
Reviewed-on: #33
2026-03-03 16:46:19 +08:00
4 changed files with 52 additions and 12 deletions

View File

@@ -33,6 +33,7 @@ export default function ListSetting() {
const registerToken = async () => {
try {
await AsyncStorage.setItem('@notification_permission', "true");
const token = await getToken();
if (token) {
await apiRegisteredToken({ user: entities.id, token, category: "register" });
@@ -44,9 +45,10 @@ export default function ListSetting() {
const unregisterToken = async () => {
try {
await AsyncStorage.setItem('@notification_permission', "false");
const token = await getToken();
if (token) {
await apiUnregisteredToken({ user: entities.id, token });
await apiUnregisteredToken({ user: entities.id, token, category: "unregister" });
}
} catch (error) {
console.warn('Error unregistering token:', error);
@@ -113,10 +115,8 @@ export default function ListSetting() {
// OS Permission is granted, perform in-app toggle
const targetState = !isNotificationEnabled;
if (targetState) {
await AsyncStorage.setItem('@notification_permission', "true");
await registerToken();
} else {
await AsyncStorage.setItem('@notification_permission', "false");
await unregisterToken();
}
// UI will be updated by checkNotif (triggered by state change or manually here)

View File

@@ -45,7 +45,7 @@ export default function ViewLogin({ onValidate }: Props) {
} else {
return Toast.show({ type: 'small', text1: response.message, position: 'bottom' })
}
} catch (error : any ) {
} catch (error: any) {
console.error(error);
const message = error?.response?.data?.message || "Gagal login"

View File

@@ -13,18 +13,21 @@ export const apiCheckPhoneLogin = async (body: { phone: string }) => {
export const apiSendOtp = async (body: { phone: string, otp: number }) => {
const message = "Desa+\nMasukkan kode ini " + body.otp + " pada aplikasi Desa+ anda. Jangan berikan pada siapapun."
const textFix = encodeURIComponent(message)
// const res = await axios.get(`${Constants.expoConfig?.extra?.URL_OTP}/code?nom=${body.phone}&text=*Desa%2B*%0AMasukkan%20kode%20ini%20*${encodeURIComponent(body.otp)}*%20pada%20aplikasi%20Desa%2B%20anda.%20Jangan%20berikan%20pada%20siapapun.`)
const res = await fetch(
`${Constants.expoConfig?.extra?.URL_OTP}/code?nom=${body.phone}&text=${textFix}`,
`${Constants.expoConfig?.extra?.URL_OTP}/api/wa/send-text`,
{
cache: "no-cache",
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${Constants.expoConfig?.extra?.WA_SERVER_TOKEN}`,
},
body: JSON.stringify({
number: body.phone,
text: message
})
}
);
return res.status
}
@@ -745,7 +748,7 @@ export const apiRegisteredToken = async (data: { user: string, token: string, ca
return response.data;
};
export const apiUnregisteredToken = async (data: { user: string, token: string }) => {
export const apiUnregisteredToken = async (data: { user: string, token: string, category?: string }) => {
const response = await api.put(`/mobile/auth-token`, data)
return response.data;
};

View File

@@ -66,11 +66,48 @@ export const openSettings = () => {
export const requestPermission = async () => {
try {
const { status: newStatus } = await Notifications.requestPermissionsAsync();
await AsyncStorage.setItem('@notification_permission', newStatus === 'granted' ? "true" : "false");
return newStatus === 'granted';
const existing = await AsyncStorage.getItem('@notification_permission');
const { status: currentStatus, canAskAgain } = await Notifications.getPermissionsAsync();
// Jika baru pertama kali (fresh install / storage belum ada)
if (existing === null) {
// Cek apakah OS memungkinkan untuk memunculkan popup
if (currentStatus === 'undetermined' || (currentStatus === 'denied' && canAskAgain)) {
const { status: newStatus } = await Notifications.requestPermissionsAsync();
await AsyncStorage.setItem('@notification_permission', newStatus === 'granted' ? 'true' : 'false');
return newStatus === 'granted';
}
// Jika OS sudah granted (sudah diijinkan entah lewat mana), simpan true
if (currentStatus === 'granted') {
await AsyncStorage.setItem('@notification_permission', 'true');
return true;
}
// Jika OS denied dan tidak bisa minta lagi (disables)
if (currentStatus === 'denied' && !canAskAgain) {
await AsyncStorage.setItem('@notification_permission', 'false');
return false;
}
}
const osPermission = await checkPermission();
// Jika sudah pernah di-request sebelumnya (storage sudah ada)
// Selalu sinkronkan jika OS menyatakan Denied
if (osPermission === false) {
await AsyncStorage.setItem('@notification_permission', 'false');
return false;
}
// Jika OS Granted, ikuti nilai tersimpan di storage (menghargai in-app toggle user)
if (osPermission === true) {
return existing === 'true';
}
return false;
} catch (err) {
console.warn('Error requesting notification permissions:', err);
return false;
}
};