esoftplay-event 0.0.0-a

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/config.json +11 -0
  2. package/event/additional.tsx +188 -0
  3. package/event/additional_input.tsx +316 -0
  4. package/event/block_invitation.tsx +48 -0
  5. package/event/countdown.tsx +72 -0
  6. package/event/counter_cashier.tsx +180 -0
  7. package/event/counter_cashier_report.tsx +114 -0
  8. package/event/counter_cashier_sell.tsx +135 -0
  9. package/event/counter_eo.tsx +451 -0
  10. package/event/counter_history.tsx +74 -0
  11. package/event/counter_history_item.tsx +48 -0
  12. package/event/counter_info.tsx +96 -0
  13. package/event/counter_lm.tsx +273 -0
  14. package/event/counter_menu.tsx +85 -0
  15. package/event/counter_report.tsx +105 -0
  16. package/event/counter_report_breakdown.tsx +93 -0
  17. package/event/counter_report_detail.tsx +238 -0
  18. package/event/counter_report_detail_list.tsx +56 -0
  19. package/event/counter_request.tsx +136 -0
  20. package/event/counter_request_detail.tsx +211 -0
  21. package/event/counter_section.tsx +32 -0
  22. package/event/counter_send.tsx +277 -0
  23. package/event/counter_status.tsx +32 -0
  24. package/event/counter_type.tsx +23 -0
  25. package/event/counter_user_list.tsx +197 -0
  26. package/event/counter_user_list_item.tsx +143 -0
  27. package/event/coupon.tsx +124 -0
  28. package/event/coupon_claim.tsx +198 -0
  29. package/event/coupon_claim_detail.tsx +175 -0
  30. package/event/coupon_claim_history.tsx +279 -0
  31. package/event/coupon_claim_reimburse.tsx +111 -0
  32. package/event/coupon_claim_reimburse_history.tsx +72 -0
  33. package/event/coupon_claim_reimburse_history_detail.tsx +117 -0
  34. package/event/coupon_claim_staff.tsx +256 -0
  35. package/event/coupon_detail.tsx +98 -0
  36. package/event/coupon_event_list.tsx +77 -0
  37. package/event/coupon_generate.tsx +258 -0
  38. package/event/coupon_generate_event.tsx +79 -0
  39. package/event/coupon_generate_list.tsx +56 -0
  40. package/event/date_picker.tsx +152 -0
  41. package/event/detail.tsx +352 -0
  42. package/event/entrance.tsx +215 -0
  43. package/event/entrance_again.tsx +200 -0
  44. package/event/entrance_failed.tsx +190 -0
  45. package/event/entrance_idcard.tsx +203 -0
  46. package/event/entrance_list.tsx +264 -0
  47. package/event/entrance_list_item.tsx +88 -0
  48. package/event/entrance_log.tsx +130 -0
  49. package/event/entrance_success.tsx +155 -0
  50. package/event/entrance_warning.tsx +91 -0
  51. package/event/exchange_reward.tsx +31 -0
  52. package/event/exchange_reward_result.tsx +137 -0
  53. package/event/exchange_ticket.tsx +234 -0
  54. package/event/exchange_ticket_list.tsx +191 -0
  55. package/event/exchange_ticket_result.tsx +211 -0
  56. package/event/exit.tsx +91 -0
  57. package/event/exit_failed.tsx +135 -0
  58. package/event/exit_list.tsx +118 -0
  59. package/event/exit_log.tsx +131 -0
  60. package/event/exit_success.tsx +143 -0
  61. package/event/exit_temporary.tsx +226 -0
  62. package/event/hall_in.tsx +148 -0
  63. package/event/hall_in_failed.tsx +270 -0
  64. package/event/hall_in_list.tsx +222 -0
  65. package/event/hall_in_log.tsx +134 -0
  66. package/event/hall_in_success.tsx +132 -0
  67. package/event/hall_out.tsx +143 -0
  68. package/event/hall_out_failed.tsx +133 -0
  69. package/event/hall_out_list.tsx +215 -0
  70. package/event/hall_out_log.tsx +133 -0
  71. package/event/hall_out_success.tsx +130 -0
  72. package/event/list.tsx +219 -0
  73. package/event/list_filter.tsx +124 -0
  74. package/event/log.tsx +435 -0
  75. package/event/qc_idcard.tsx +209 -0
  76. package/event/qc_idcard_failed.tsx +78 -0
  77. package/event/qc_idcard_success.tsx +68 -0
  78. package/event/queue_out.tsx +186 -0
  79. package/event/queue_pricing.tsx +152 -0
  80. package/event/randomseat.tsx +33 -0
  81. package/event/review.tsx +117 -0
  82. package/event/review_add.tsx +342 -0
  83. package/event/review_detail.tsx +67 -0
  84. package/event/review_item.tsx +76 -0
  85. package/event/scan_item.tsx +66 -0
  86. package/event/schedule.tsx +135 -0
  87. package/event/seat.tsx +628 -0
  88. package/event/seat_autopick.tsx +120 -0
  89. package/event/seat_map.tsx +408 -0
  90. package/event/seat_map_matrix.tsx +94 -0
  91. package/event/seat_map_test.tsx +401 -0
  92. package/event/ticket_list.tsx +722 -0
  93. package/event/ticket_list2.tsx +680 -0
  94. package/event/timer.tsx +58 -0
  95. package/event/tms.tsx +103 -0
  96. package/event/tms_add.tsx +94 -0
  97. package/event/tms_add_result.tsx +175 -0
  98. package/event/tms_dashboard.tsx +89 -0
  99. package/event/tms_event_list.tsx +66 -0
  100. package/event/turnstile_event_gate.tsx +74 -0
  101. package/event/turnstile_event_item.tsx +41 -0
  102. package/event/turnstile_event_list.tsx +69 -0
  103. package/event/turnstile_event_ticket.tsx +95 -0
  104. package/event/turnstile_settings.tsx +327 -0
  105. package/event/turnstile_settings_otp.tsx +58 -0
  106. package/event/turnstile_settings_status.tsx +50 -0
  107. package/event/voucher.tsx +149 -0
  108. package/event/voucher_multi.tsx +181 -0
  109. package/fonts/Arial.ttf +0 -0
  110. package/fonts/ArialBold.ttf +0 -0
  111. package/fonts/DecoNumbers.ttf +0 -0
  112. package/fonts/MonoSpace.ttf +0 -0
  113. package/fonts/SFProText.ttf +0 -0
  114. package/fonts/digital.ttf +0 -0
  115. package/fonts/mono.ttf +0 -0
  116. package/id.json +1113 -0
  117. package/index.js +2 -0
  118. package/libs.json +1 -0
  119. package/mover.js +0 -0
  120. package/package.json +16 -0
  121. package/publisher.js +84 -0
@@ -0,0 +1,78 @@
1
+ // withHooks
2
+ import { LibNavigation } from 'esoftplay/cache/lib/navigation/import';
3
+ import { LibPicture } from 'esoftplay/cache/lib/picture/import';
4
+ import { LibStatusbar } from 'esoftplay/cache/lib/statusbar/import';
5
+ import { LibStyle } from 'esoftplay/cache/lib/style/import';
6
+ import { LibUtils } from 'esoftplay/cache/lib/utils/import';
7
+ import esp from 'esoftplay/esp';
8
+
9
+ import { EventQc_idcardProperty } from 'esoftplay/cache/event/qc_idcard/import';
10
+ import React from 'react';
11
+ import { Pressable, ScrollView, Text, View } from 'react-native';
12
+
13
+
14
+ export interface EventQc_idcard_failedArgs {
15
+
16
+ }
17
+ export interface EventQc_idcard_failedProps {
18
+
19
+ }
20
+ export default function m(props: EventQc_idcard_failedProps): any {
21
+
22
+ const { message, result, event_id } = LibNavigation.getArgsAll(props)
23
+
24
+ return (
25
+ <View style={{ flex: 1 }}>
26
+ <LibStatusbar style='light' />
27
+ <View style={{ flex: 1 }}>
28
+ <LibPicture source={esp.assets('failed.png')} style={{ flex: 1, height: LibStyle.height, width: LibStyle.width }} /* resizeMode={"stretch"} */ />
29
+ </View>
30
+
31
+ <View style={{ flex: 1, position: 'absolute', top: 50, left: 0, right: 0, bottom: 0, alignItems: 'center', alignContent: 'center' }} >
32
+ <ScrollView>
33
+ <View style={{ marginBottom: 20, alignSelf: 'center', borderRadius: LibStyle.width / 3, padding: 10, backgroundColor: '#fff' }}>
34
+ <LibPicture
35
+ source={esp.assets('failed_icon.png')}
36
+ style={{ width: LibStyle.width / 3, height: LibStyle.width / 3 }}
37
+ />
38
+ </View>
39
+ <Text allowFontScaling={false} style={{ fontWeight: 'bold', fontSize: 25, color: '#fff', marginHorizontal: 20, textAlign: 'center', letterSpacing: 1 }}>{message ? message : esp.lang("event/qc_idcard_failed", "qr_not_valid")}</Text>
40
+
41
+ {
42
+ !Array.isArray(result) &&
43
+ <View style={{ marginTop: 30, margin: 10, padding: 10, borderRadius: 10, overflow: 'hidden', backgroundColor: '#fff' }}>
44
+ <Text allowFontScaling={false} style={{ fontSize: 18, fontWeight: 'bold', }}>{esp.lang("event/qc_idcard_failed", "scan_by")}</Text>
45
+ <View style={{ padding: 10, backgroundColor: LibStyle.colorBgGrey, borderRadius: 5, marginTop: 10, }}>
46
+ <Text allowFontScaling={false} style={{ fontSize: 16 }}>{result?.print_name}</Text>
47
+ </View>
48
+ <Text allowFontScaling={false} style={{ fontSize: 18, fontWeight: 'bold', marginTop: 20, }}>{esp.lang("event/qc_idcard_failed", "scan_time")}</Text>
49
+ <View style={{ padding: 10, backgroundColor: LibStyle.colorBgGrey, borderRadius: 5, marginTop: 10, }}>
50
+ <Text allowFontScaling={false} style={{ fontSize: 16 }}>{result?.print_date != null ? LibUtils.moment(result?.print_date).localeFormat("DD MMM H:mm:ss ") : result?.print_date}</Text>
51
+ </View>
52
+ </View>
53
+ }
54
+
55
+ </ScrollView>
56
+ <View style={{ marginBottom: 20 }}>
57
+ {/* <Pressable onPress={() => {
58
+
59
+ LibDialog.warningConfirm(esp.lang("event/entrance_failed", "warn_title"), esp.lang("event/entrance_failed", "warn_msg"), esp.lang("event/entrance_failed", "warn_ok"), () => {
60
+ // sendTelegram()
61
+ }, esp.lang("event/entrance_failed", "warn_no"), () => { })
62
+
63
+ }} style={{ width: (LibStyle.width - 45) * 0.5, height: 43, borderRadius: 5, backgroundColor: LibStyle.colorRed, borderWidth: 3, borderColor: "#fff", justifyContent: 'center', alignContent: 'center', alignItems: 'center', ...LibStyle.elevation(10) }}>
64
+ <Text allowFontScaling={false} style={{ textAlign: 'center', fontSize: 14, fontWeight: 'bold', color: "#fff" }}>{esp.lang("event/entrance_failed", "report")}</Text>
65
+ </Pressable> */}
66
+ <Pressable onPress={() => {
67
+ LibNavigation.back()
68
+ EventQc_idcardProperty.openScanner(event_id)
69
+ }} style={{ width: (LibStyle.width - 30), height: 43, borderRadius: 5, backgroundColor: LibStyle.colorGreen, justifyContent: 'center', alignContent: 'center', alignItems: 'center', ...LibStyle.elevation(10) }}>
70
+ <Text allowFontScaling={false} style={{ fontSize: 14, fontWeight: 'bold', color: "#fff" }}>{esp.lang("event/entrance_failed", "back")}</Text>
71
+ </Pressable>
72
+ </View>
73
+
74
+ </View>
75
+
76
+ </View>
77
+ )
78
+ }
@@ -0,0 +1,68 @@
1
+ // withHooks
2
+
3
+ import { ComponentButton } from 'esoftplay/cache/component/button/import';
4
+ import { EventQc_idcardProperty } from 'esoftplay/cache/event/qc_idcard/import';
5
+ import { LibNavigation } from 'esoftplay/cache/lib/navigation/import';
6
+ import { LibPicture } from 'esoftplay/cache/lib/picture/import';
7
+ import { LibStatusbar } from 'esoftplay/cache/lib/statusbar/import';
8
+ import { LibStyle } from 'esoftplay/cache/lib/style/import';
9
+ import esp from 'esoftplay/esp';
10
+ import { LinearGradient } from 'expo-linear-gradient';
11
+ import React from 'react';
12
+ import { Text, View } from 'react-native';
13
+
14
+
15
+ export interface EventQc_idcard_successArgs {
16
+
17
+ }
18
+ export interface EventQc_idcard_successProps {
19
+
20
+ }
21
+ export default function m(props: EventQc_idcard_successProps): any {
22
+ const { data, event_id } = LibNavigation.getArgsAll(props)
23
+
24
+ return (
25
+ <View style={{ flex: 1 }}>
26
+ <LibStatusbar style='dark' />
27
+ <LibPicture source={data?.image == "" ? esp.assets('white_idcard.png') : { uri: data?.image }} style={{ width: LibStyle.width, height: LibStyle.height - (LibStyle.height / 4) }} resizeMode={"contain"} />
28
+ <LinearGradient
29
+ // Background Linear Gradient
30
+ style={{
31
+ height: LibStyle.height - (LibStyle.height / 2),
32
+ width: LibStyle.width,
33
+ position: 'absolute',
34
+ left: 0,
35
+ right: 0,
36
+ bottom: 0,
37
+ }}
38
+ colors={['rgba(255,255,255,0)', 'rgba(0,0,0,0.55)', 'rgba(0,0,0,1)', 'rgba(0,0,0,1)']}>
39
+ <View style={{ flex: 1, padding: 15, justifyContent: 'flex-end', paddingBottom: 50, alignContent: 'center', alignItems: 'center' }}>
40
+ <View style={{ backgroundColor: '#fff', padding: 10, marginTop: 5 }} >
41
+ {/* view nama */}
42
+ <View style={{ flexDirection: 'row' }} >
43
+ <Text allowFontScaling={false} style={{ fontSize: 18, fontWeight: "bold", fontStyle: "normal", lineHeight: 22, letterSpacing: 0, color: "#4a4a4a", flex: 2 }} >{esp.lang("event/entrance_idcard", "name")}</Text>
44
+ <Text allowFontScaling={false} style={{ fontSize: 18, fontWeight: "bold", fontStyle: "normal", lineHeight: 22, letterSpacing: 0, color: "#4a4a4a" }} > : </Text>
45
+ <Text allowFontScaling={false} numberOfLines={2} ellipsizeMode={"tail"} style={{ fontSize: 18, fontWeight: "bold", fontStyle: "normal", lineHeight: 22, letterSpacing: 0, color: "#4a4a4a", flex: 5 }} >{data?.name}</Text>
46
+ </View>
47
+ {/* view company */}
48
+ <View style={{ flexDirection: 'row' }} >
49
+ <Text allowFontScaling={false} style={{ fontSize: 18, fontWeight: "bold", fontStyle: "normal", lineHeight: 22, letterSpacing: 0, color: "#4a4a4a", flex: 2 }} >{esp.lang("event/entrance_idcard", "company")}</Text>
50
+ <Text allowFontScaling={false} style={{ fontSize: 18, fontWeight: "bold", fontStyle: "normal", lineHeight: 22, letterSpacing: 0, color: "#4a4a4a" }} > : </Text>
51
+ <Text allowFontScaling={false} numberOfLines={2} ellipsizeMode={"tail"} style={{ fontSize: 18, fontWeight: "bold", fontStyle: "normal", lineHeight: 22, letterSpacing: 0, color: "#4a4a4a", flex: 5 }} >{data?.exhibitor_name}</Text>
52
+ </View>
53
+
54
+ <View style={{ marginTop: 10, width: LibStyle.width - 20, alignSelf: 'center', backgroundColor: '#4a4a4a', height: 4, marginVertical: 4 }} />
55
+ <Text allowFontScaling={false} style={{ marginTop: -5, fontSize: 22, fontWeight: "bold", fontStyle: "normal", lineHeight: 32, textAlign: 'center', letterSpacing: 0, color: "#4a4a4a" }} >{data?.department_name}</Text>
56
+ </View>
57
+ </View>
58
+ <ComponentButton label={esp.lang("event/qc_idcard_success", "scan_again")} onPress={() => {
59
+ LibNavigation.back()
60
+ EventQc_idcardProperty.openScanner(event_id)
61
+ }}
62
+ backgroundColor={LibStyle.colorGreen} style={{ margin: 10 }}
63
+ />
64
+
65
+ </LinearGradient>
66
+ </View>
67
+ )
68
+ }
@@ -0,0 +1,186 @@
1
+ // withHooks
2
+ import { LibCurl } from 'esoftplay/cache/lib/curl/import';
3
+ import { LibIcon } from 'esoftplay/cache/lib/icon/import';
4
+ import { LibObject } from 'esoftplay/cache/lib/object/import';
5
+ import { LibSlidingup } from 'esoftplay/cache/lib/slidingup/import';
6
+ import { LibStyle } from 'esoftplay/cache/lib/style/import';
7
+ import { LibToastProperty } from 'esoftplay/cache/lib/toast/import';
8
+ import { LibUtils } from 'esoftplay/cache/lib/utils/import';
9
+ import { UseCondition } from 'esoftplay/cache/use/condition/import';
10
+ import esp from 'esoftplay/esp';
11
+ import moment from 'esoftplay/moment';
12
+ import useSafeState from 'esoftplay/state';
13
+ import React, { useEffect, useRef } from 'react';
14
+ import { Pressable, ScrollView, Text, View } from 'react-native';
15
+
16
+ export interface EventQueue_outArgs {
17
+ event_id: number | string,
18
+ notes: string
19
+ }
20
+ export interface EventQueue_outProps {
21
+
22
+ }
23
+
24
+ export default function m(props: EventQueue_outProps): any {
25
+ const LibNavigation = useRef(esp.mod("lib/navigation")).current
26
+ const ComponentHeader = useRef(esp.mod("component/header")).current
27
+ const LibTextstyle = useRef(esp.mod("lib/textstyle")).current
28
+ const UseMap = useRef(esp.mod("use/map")).current
29
+
30
+ const { event_id, notes } = LibNavigation.getArgsAll(props)
31
+ const [types, setTypes] = useSafeState<any[]>([])
32
+ const [dates, setDates] = useSafeState<any[]>([])
33
+ const [post, setPost, getPost] = useSafeState<any>({
34
+ event_id: event_id,
35
+ qty: 1,
36
+ qty_min: 1,
37
+ qty_max: 10
38
+ })
39
+ const datesRef = useRef<LibSlidingup>(null)
40
+
41
+ useEffect(() => {
42
+ LibUtils.getInstallationID().then((iid) => {
43
+ setPost(LibObject.set(getPost(), iid)('installation_id'))
44
+ })
45
+ new LibCurl('event_detail_price?id=' + (event_id || '264'), null, (res) => {
46
+ setTypes(res.price_type)
47
+ }, (err) => {
48
+ LibToastProperty.show(err.message)
49
+ })
50
+ }, [])
51
+
52
+ const isSelectedPriceId = (price_id: string) => post.price_id == price_id
53
+
54
+ return (
55
+ <View style={{ flex: 1, backgroundColor: '#f1f2f2' }} >
56
+ <ComponentHeader title={esp.lang("event/queue_out", "title")} notif />
57
+ <ScrollView>
58
+ <View style={{ padding: 0 }} >
59
+ <View style={[{ margin: 0, marginBottom: 0, backgroundColor: 'white', padding: 12, borderRadius: 0 }, LibStyle.elevation(3)]} >
60
+ <LibTextstyle textStyle="headline" text={notes.replace(/<br\s{0,}\/>/g, '')} style={{ textAlign: 'center', marginBottom: 10 }} />
61
+ </View>
62
+ <View style={[{ margin: 16, backgroundColor: 'white', padding: 12, borderRadius: 16, zIndex: 100 }, LibStyle.elevation(3)]} >
63
+ <LibTextstyle textStyle="title3" text={esp.lang("event/queue_out", "form_title")} style={{ textAlign: 'center', fontWeight: 'bold', marginBottom: 10 }} />
64
+ <View style={{ flexDirection: 'row', marginTop: 20 }} >
65
+ <LibTextstyle textStyle='caption1' text={esp.lang("event/queue_out", "type_title")} style={{ marginBottom: 8, fontWeight: "bold" }} />
66
+ </View>
67
+ <UseMap
68
+ data={types.filter((x) => !(["8", "2", "7", "102", "108"].includes(x.kind)))}
69
+ renderItem={(item) => (
70
+ <Pressable
71
+ onPress={() => {
72
+ if (item.list.length == 1) {
73
+ setPost(
74
+ new (esp.mod("lib/object"))(post)
75
+ .set(item.price_id)('price_id')
76
+ .set(item.qty_max)('qty_max')
77
+ .set(item.qty_min)('qty_min')
78
+ .set(item.qty_min)('qty')
79
+ .set(item.list[0].ondate)('ondate')
80
+ .value()
81
+ )
82
+ } else {
83
+ setPost(
84
+ new (esp.mod("lib/object"))(post)
85
+ .set(item.price_id)('price_id')
86
+ .set(item.qty_max)('qty_max')
87
+ .set(item.qty_min)('qty_min')
88
+ .set(item.qty_min)('qty')
89
+ .value()
90
+ )
91
+ setDates(item.list)
92
+ datesRef.current?.show()
93
+ }
94
+ }}
95
+ style={{ flexDirection: 'row', marginBottom: 8, alignItems: 'center' }} >
96
+ <View style={[{ padding: 10, paddingHorizontal: 20, backgroundColor: isSelectedPriceId(item.price_id) ? LibUtils.hexToRgba('#1DC111', 0.05) : '#f8f8f8', borderRadius: 8, flex: 1, paddingVertical: 12, flexDirection: 'row', alignItems: 'center' }, isSelectedPriceId(item.price_id) ? { borderWidth: 1, borderColor: '#1DC111' } : {}]} >
97
+ <LibTextstyle textStyle="body" text={item.type} style={{ textAlign: 'left', fontWeight: isSelectedPriceId(item.price_id) ? "bold" : "normal" }} />
98
+ <UseCondition if={isSelectedPriceId(item.price_id)} >
99
+ <Text style={{ fontSize: 12, color: "#888" }} > ({post.ondate == '0000-00-00' ? "All Date" : moment(post.ondate).format('DD MMMM YYYY')})</Text>
100
+ <View style={{ flex: 1 }} />
101
+ <LibIcon name='check-circle' color='#1DC111' />
102
+ </UseCondition>
103
+ </View>
104
+ </Pressable>
105
+ )}
106
+ />
107
+ <UseCondition if={post.price_id} >
108
+ <>
109
+ <View style={{ flexDirection: 'row', marginTop: 20 }} >
110
+ <LibTextstyle textStyle='caption1' text={esp.lang("event/queue_out", "qty_title") + (post.qty_min > 1 ? (" " + esp.lang("event/queue_out", "min_order", post.qty_min)) : "")} style={{ marginBottom: 8, fontWeight: "bold" }} />
111
+ </View>
112
+ <View style={{ flexDirection: 'row', justifyContent: 'center', alignItems: 'center' }} >
113
+ <View style={{ flexDirection: 'row', justifyContent: 'center', alignItems: 'center' }} >
114
+ <Pressable
115
+ onPress={() => setPost(LibObject.update(post, (oldQty) => Math.max(Number(oldQty) - 1, Number(post.qty_min)))('qty'))}
116
+ style={{ opacity: post.qty == post.qty_min ? 0.5 : 1, alignItems: 'center', justifyContent: 'center', height: 40, width: 40, borderRadius: 20, backgroundColor: LibUtils.hexToRgba(LibStyle.colorRed, .4) }} >
117
+ <LibIcon.AntDesign name='minus' />
118
+ </Pressable>
119
+ <Text style={{ fontSize: 30, margin: 12, minWidth: 40, textAlign: 'center' }} >{post.qty || post.qty_min}</Text>
120
+ <Pressable
121
+ onPress={() => setPost(LibObject.update(post, (oldQty) => Math.min(Number(oldQty) + 1, post.qty_max))('qty'))}
122
+ style={{ opacity: post.qty == post.qty_max ? 0.5 : 1, alignItems: 'center', justifyContent: 'center', height: 40, width: 40, borderRadius: 20, backgroundColor: LibUtils.hexToRgba(LibStyle.colorGreen, .4) }} >
123
+ <LibIcon.AntDesign name='plus' />
124
+ </Pressable>
125
+ </View>
126
+ </View>
127
+ </>
128
+ </UseCondition>
129
+ <View style={{ backgroundColor: '#f9f9f9', marginHorizontal: -12, paddingHorizontal: 10, marginBottom: -12, borderBottomLeftRadius: 16, borderBottomRightRadius: 16, paddingVertical: 5, paddingTop: 10 }} >
130
+ <LibTextstyle textStyle='caption2' text={esp.lang("event/queue_out", "notes")} style={{ marginBottom: 8 }} />
131
+ </View>
132
+ </View>
133
+ <Pressable
134
+ onPress={() => {
135
+ if (!post.price_id) {
136
+ LibToastProperty.show(esp.lang("event/queue_out", "err_no_type"))
137
+ return
138
+ }
139
+ esp.mod("lib/dialog").confirm(esp.lang("event/queue_out", "dialog_title"), esp.lang("event/queue_out", "dialog_msg"), esp.lang("event/queue_out", "dialog_yes"), () => {
140
+ new LibCurl("event_booking_waiting_allotment", post, (res, msg) => {
141
+ LibToastProperty.show(res)
142
+ LibNavigation.back()
143
+ }, (err) => {
144
+ LibToastProperty.show(err.message)
145
+ })
146
+ }, esp.lang("event/queue_out", "dialog_no"), () => {
147
+
148
+ })
149
+
150
+ }}
151
+ style={[{ backgroundColor: LibStyle.colorPrimary, alignItems: 'center', justifyContent: 'center', paddingVertical: 15, marginHorizontal: 16, borderBottomLeftRadius: 16, borderBottomRightRadius: 16, margin: 10, marginTop: -32, paddingTop: 26 }, LibStyle.elevation(3)]} >
152
+ <Text style={{ color: 'white', fontWeight: 'bold' }} >{esp.lang("event/queue_out", "submit")}</Text>
153
+ </Pressable>
154
+ </View>
155
+ </ScrollView>
156
+ <LibSlidingup ref={datesRef} >
157
+ <View style={{ maxHeight: esp.mod("lib/style").height * 0.5, backgroundColor: 'white', borderTopLeftRadius: 30, borderTopRightRadius: 30 }} >
158
+ <LibTextstyle textStyle='m_h6' text={esp.lang("event/queue_out", "date_title")} style={{ textAlign: 'center', padding: 20 }} />
159
+ <ScrollView>
160
+ <UseMap
161
+ data={dates}
162
+ renderItem={(item) => (
163
+ <Pressable
164
+ onPress={() => {
165
+ setPost(
166
+ new (esp.mod("lib/object"))(post)
167
+ .set(item.price_id)('price_id')
168
+ .set(item.ondate)('ondate')
169
+ .value()
170
+ )
171
+ datesRef.current?.hide()
172
+ }}
173
+ style={{ padding: 10, marginHorizontal: 16, marginBottom: 8, backgroundColor: '#f9f9f9', borderRadius: 8, paddingVertical: 12 }} >
174
+ <LibTextstyle textStyle="body" text={item.ondate == '0000-00-00' ? "All Date" : moment(item.ondate).format('DD MMMM YYYY')} style={{ textAlign: 'center' }} />
175
+ </Pressable>
176
+ )}
177
+ />
178
+ </ScrollView>
179
+ {/* <View style={{ padding: 18 }} >
180
+ <ComponentButton label='Kirim' onPress={() => { }} />
181
+ </View> */}
182
+ </View>
183
+ </LibSlidingup>
184
+ </View>
185
+ )
186
+ }
@@ -0,0 +1,152 @@
1
+ // withHooks
2
+
3
+ import { LibCurl } from 'esoftplay/cache/lib/curl/import';
4
+ import { LibFirebase_socketProperty } from 'esoftplay/cache/lib/firebase_socket/import';
5
+ import { LibNavigation } from 'esoftplay/cache/lib/navigation/import';
6
+ import { LibStyle } from 'esoftplay/cache/lib/style/import';
7
+ import { LibUtils } from 'esoftplay/cache/lib/utils/import';
8
+ import esp from 'esoftplay/esp';
9
+ import useGlobalState, { useGlobalReturn } from 'esoftplay/global';
10
+ import useSafeState from 'esoftplay/state';
11
+ import { useTimeout } from 'esoftplay/timeout';
12
+ import { useKeepAwake } from 'expo-keep-awake';
13
+ import LottieView from 'lottie-react-native';
14
+ import React, { useEffect, useRef } from 'react';
15
+ import { Text, View } from 'react-native';
16
+ import useFirebaseSocket from '../lib/firebase_socket';
17
+
18
+ export interface EventQueueArgs {
19
+
20
+ }
21
+ export interface EventQueueProps {
22
+ event_id: number,
23
+ type: 1 | 2,
24
+ onDone?: () => void
25
+ }
26
+
27
+ let timer: any;
28
+ function debounce(func: Function, timeout: number): any {
29
+ clearTimeout(timer);
30
+ timer = setTimeout(() => { func() }, timeout);
31
+ return timer;
32
+ }
33
+
34
+ const EVENT_PRICING_QUEUE = 'event_pricing_queue'
35
+
36
+ const pricing_queue = useGlobalState<any>({})
37
+
38
+ export function state(): useGlobalReturn<any> {
39
+ return pricing_queue
40
+ }
41
+
42
+
43
+ const queueNumberState = useGlobalState(1)
44
+ export default function m(props: EventQueueProps): any {
45
+ const counter = useRef<number>(0)
46
+ const { addQueue, getQueue, updateQueueExp, doneQueue } = useFirebaseSocket()
47
+ const [queueStatus, setQueueStatus] = useSafeState(0)
48
+ const { isInPricingQueueConfig } = useFirebaseSocket()
49
+ let { event_id, autoPass } = LibNavigation.getArgsAll<any>(props, props)
50
+ event_id = String(event_id)
51
+ const [number, setNumber, getNumber] = useSafeState(esp.lang("event/queue_pricing", "info"))
52
+ const animation = useRef<LottieView>(null)
53
+ let refTimeout = useRef<any>()
54
+ const pathQueue = EVENT_PRICING_QUEUE
55
+ // const limit = LibFirebase_socketProperty.eventQueueConfig.useSelector(x => x.limit)
56
+
57
+ const timeout = useTimeout()
58
+ useKeepAwake()
59
+
60
+ useEffect(() => {
61
+ new LibCurl("https://storage.googleapis.com/bbo-images/bbo.co.id/images/modules/api/queue.json", null,
62
+ (res, message) => {
63
+ if (res == 1) {
64
+ setQueueStatus(1)
65
+ addQueue(String(pathQueue), String(event_id), () => {
66
+ getCurrentQueue(1)
67
+ });
68
+ }
69
+ }, (err) => { console.log(err) }
70
+ )
71
+ timeout(() => {
72
+ animation.current?.play()
73
+ }, 300);
74
+ return () => {
75
+ queueNumberState.reset()
76
+ clearTimeout(timer)
77
+ clearTimeout(refTimeout.current)
78
+ LibNavigation.cancelBackResult(LibNavigation.getResultKey(props))
79
+ }
80
+ }, [])
81
+
82
+ useEffect(() => {
83
+ if (queueStatus == 2) {
84
+ clearTimeout(refTimeout.current)
85
+ } else {
86
+ clearTimeout(refTimeout.current)
87
+ refTimeout.current = setTimeout(() => {
88
+ LibNavigation.replace('event/queue_pricing', { event_id, autoPass })
89
+ }, 10000);
90
+ }
91
+ }, [queueStatus])
92
+
93
+ function getCurrentQueue(timeout?: number) {
94
+ debounce(() => {
95
+ const limit = LibFirebase_socketProperty.eventQueueConfig.get(event_id).limit
96
+ console.log(limit, event_id)
97
+ getQueue(pathQueue, event_id, 60000, (idx, key) => {
98
+ counter.current++
99
+ if (limit == 0) {
100
+ LibNavigation.sendBackResult(1, LibNavigation.getResultKey(props))
101
+ } else
102
+ if (idx < limit) {
103
+ updateQueueExp(pathQueue, event_id)
104
+ setNumber(esp.lang("event/queue_pricing", "info2"))
105
+ pricing_queue.set({ pathQueue, event_id, key })
106
+ clearTimeout(refTimeout.current)
107
+ clearTimeout(timer)
108
+ if (autoPass) {
109
+ doneQueue(pathQueue, event_id, key, () => { })
110
+ }
111
+ LibNavigation.sendBackResult(1, LibNavigation.getResultKey(props))
112
+ } else {
113
+ setQueueStatus(2)
114
+ queueNumberState.set((idx + 1) - limit)
115
+ const updatedCount = (idx + 1) - limit
116
+ if (isNaN(Number(getNumber())) || updatedCount < Number(getNumber()))
117
+ setNumber(String((updatedCount).toFixed(0)))
118
+ }
119
+ })
120
+ getCurrentQueue(Math.max(Math.min((queueNumberState.get() / limit) * 1000, 6000), 3000));
121
+ }, timeout || 3000)
122
+ }
123
+
124
+ return (
125
+ <View style={{ flex: 1, backgroundColor: 'white', justifyContent: 'center', alignItems: 'center' }} >
126
+ <View style={{ alignItems: 'center' }} >
127
+ <LottieView
128
+ ref={animation}
129
+ loop={true}
130
+ style={{ width: 150, height: 150 }}
131
+ source={esp.assets('pending.json')}
132
+ />
133
+ </View>
134
+ {/* {esp.isDebug("timer debug") ? <EventTimer /> : null} */}
135
+ {
136
+ Number(number) > 0 ?
137
+ <>
138
+ <Text style={{ textAlign: 'center', margin: 16, fontSize: 20 }} >{esp.lang("event/queue_pricing", "wait")}</Text>
139
+ <Text style={{ fontSize: 50, textAlign: 'center', margin: 24, fontWeight: 'bold' }}>{LibUtils.number(number)}</Text>
140
+ <View style={{ backgroundColor: LibUtils.hexToRgba(LibStyle.colorPrimary, 0.05), padding: 15, alignItems: 'center', margin: 16, borderRadius: 5, borderWidth: 1, borderColor: LibUtils.hexToRgba(LibStyle.colorPrimary, 0.5) }} >
141
+ <Text style={{ fontSize: 18, textAlign: 'center' }} >{esp.lang("event/queue_pricing", "number")}</Text>
142
+ </View>
143
+ <Text style={{ textAlign: 'center', margin: 16, fontSize: 20 }} >{esp.lang("event/queue_pricing", "dont_go")}</Text>
144
+ </>
145
+ :
146
+ <>
147
+ <Text style={{ fontSize: 20, textAlign: 'center', margin: 24 }}>{number}</Text>
148
+ </>
149
+ }
150
+ </View>
151
+ )
152
+ }
@@ -0,0 +1,33 @@
1
+ // withHooks
2
+ import { LibStyle } from 'esoftplay/cache/lib/style/import';
3
+ import { LibTextstyle } from 'esoftplay/cache/lib/textstyle/import';
4
+ import esp from 'esoftplay/esp';
5
+
6
+ import React from 'react';
7
+ import { Image, Pressable, View } from 'react-native';
8
+
9
+
10
+ export interface EventRandomseatArgs {
11
+
12
+ }
13
+ export interface EventRandomseatProps {
14
+ onPressNo: () => void,
15
+ onPressOk: () => void
16
+ }
17
+
18
+
19
+ export default function m(props: EventRandomseatProps): any {
20
+ return (
21
+ <View style={{}} >
22
+ <Image source={esp.assets('randomseat.png')} resizeMode='contain' style={{ height: 300, width: 300, backgroundColor: 'orange', alignItems: 'center', alignSelf: 'center' }} />
23
+ <View style={{ flexDirection: 'row', marginTop: 10, paddingHorizontal: 10 }} >
24
+ <Pressable onPress={props.onPressNo} style={{ flex: 1, height: 50, alignItems: 'center', justifyContent: 'center' }} >
25
+ <LibTextstyle textStyle="body" text={esp.lang("event/randomseat", "back")} />
26
+ </Pressable>
27
+ <Pressable onPress={props.onPressOk} style={{ flex: 1, height: 50, backgroundColor: LibStyle.colorRed, borderRadius: 25, alignItems: 'center', justifyContent: 'center' }} >
28
+ <LibTextstyle textStyle="body" text={esp.lang("event/randomseat", "next")} style={{ color: "white" }} />
29
+ </Pressable>
30
+ </View>
31
+ </View>
32
+ )
33
+ }
@@ -0,0 +1,117 @@
1
+ // withHooks
2
+
3
+
4
+ import { ComponentHeader } from 'esoftplay/cache/component/header/import';
5
+ import { EventReview_addProperty } from 'esoftplay/cache/event/review_add/import';
6
+ import { EventReview_item } from 'esoftplay/cache/event/review_item/import';
7
+ import { LibCurl } from 'esoftplay/cache/lib/curl/import';
8
+ import { LibList } from 'esoftplay/cache/lib/list/import';
9
+ import { LibNavigation } from 'esoftplay/cache/lib/navigation/import';
10
+ import { LibStyle } from 'esoftplay/cache/lib/style/import';
11
+ import { LibToastProperty } from 'esoftplay/cache/lib/toast/import';
12
+ import esp from 'esoftplay/esp';
13
+ import useGlobalState, { useGlobalReturn } from 'esoftplay/global';
14
+ import React, { useEffect } from 'react';
15
+ import { View } from 'react-native';
16
+
17
+
18
+ export interface EventReviewArgs {
19
+
20
+ }
21
+ export interface EventReviewProps {
22
+
23
+ }
24
+
25
+ const reviewList = useGlobalState<any>(undefined, { persistKey: 'event_review', isUserData: true, inFile: true, loadOnInit: true })
26
+
27
+ export function reviewListState(): useGlobalReturn<any> {
28
+ return reviewList
29
+ }
30
+
31
+ export function calculateProb(probs: any) {
32
+ if (probs.length == 0) return null;
33
+
34
+ let sum = 0;
35
+
36
+ for (let i = 0; i < probs.length; ++i) {
37
+ sum += probs[i].percentage;
38
+ }
39
+
40
+ let gradientProbs = [];
41
+ let stackedProb = 0;
42
+ for (let i = 0; i < probs.length; ++i) {
43
+ const normal = probs[i].percentage / sum;
44
+ stackedProb += normal;
45
+ gradientProbs.push(stackedProb);
46
+ }
47
+
48
+ const random = Math.random();
49
+
50
+ for (let i = 0; i < gradientProbs.length; ++i) {
51
+ if (random < gradientProbs[i]) {
52
+ return probs[i];
53
+ }
54
+ }
55
+
56
+ return probs[0];
57
+ }
58
+
59
+ export default function m(props: EventReviewProps): any {
60
+
61
+ const url = 'event_order_review'
62
+ const [data, setData] = reviewList.useState()
63
+ const dataOfflineReview = EventReview_addProperty.state().get()
64
+
65
+ useEffect(() => {
66
+ loadData()
67
+ }, [])
68
+
69
+ function loadData() {
70
+ let post = {
71
+ options_url_expansion: 1,
72
+ }
73
+ new LibCurl(url, post, (res, msg) => {
74
+ let a = res?.list?.map((item: any) => {
75
+ return {
76
+ ...item,
77
+ is_offline_review: 0
78
+ }
79
+ })
80
+ setData(res)
81
+ }, (msg) => {
82
+ LibToastProperty.show(msg)
83
+ })
84
+ }
85
+
86
+
87
+ return (
88
+ <View style={{ flex: 1, backgroundColor: LibStyle.colorBgGrey }}>
89
+ <ComponentHeader notif title={esp.lang("event/review", "header_title")} />
90
+
91
+ <LibList
92
+ data={data?.list}
93
+ renderItem={(item: any) => {
94
+ let type = calculateProb(item?.config?.review)
95
+ let args = {
96
+ url: "https://api.test.bbo.co.id/event_order_detail?id=" + item.id,
97
+ url_form: item.url_form + (item.url_detail.includes("?") ? "&" : "?") + 'type=' + type?.type,
98
+ booking_id: item.id,
99
+ type: type?.type,
100
+ }
101
+
102
+ const r = dataOfflineReview?.filter?.((elem: any) => elem.booking_id == item.id);
103
+ const newRev = r?.length > 0 ? r[0].review : item.review
104
+ return (
105
+ <EventReview_item
106
+ {...item}
107
+ review={newRev}
108
+ onPress={() => {
109
+ LibNavigation.navigate(newRev == null ? 'event/review_add' : 'ticket/detail', args)
110
+ }}
111
+ />
112
+ )
113
+ }}
114
+ />
115
+ </View>
116
+ )
117
+ }