CPDFDisplaySettingsScreen.tsx 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  1. /**
  2. * Copyright © 2014-2025 PDF Technologies, Inc. All Rights Reserved.
  3. *
  4. * THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
  5. * AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
  6. * UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
  7. * This notice may not be removed from this file.
  8. */
  9. import PDFReaderContext, { CPDFDisplayMode, CPDFThemes } from "@compdfkit_pdf_sdk/react_native";
  10. import { useContext, useEffect, useState } from "react";
  11. import { Image, Modal, Platform, ScrollView, StyleSheet, Switch, Text, TouchableOpacity, TouchableWithoutFeedback, View } from "react-native";
  12. import { CPDFReaderView } from "../../../lib/typescript/src";
  13. interface CPDFDisplaySettingsScreenProps {
  14. visible: boolean;
  15. onClose: () => void;
  16. }
  17. export const CPDFDisplaySettingsScreen: React.FC<CPDFDisplaySettingsScreenProps> = ({ visible, onClose }) => {
  18. const [isVertical, setIsVertical] = useState(false);
  19. const [displayMode, setDisplayMode] = useState(CPDFDisplayMode.SINGLE_PAGE);
  20. const [isFormFieldHighlight, setIsFormFieldHighlight] = useState(false);
  21. const [isLinkHighlight, setIsLinkHighlight] = useState(false);
  22. const [isContinuousScrolling, setIsContinuousScrolling] = useState(false);
  23. const [isCrop, setIsCrop] = useState(false);
  24. const [themes, setThemes] = useState(CPDFThemes.LIGHT);
  25. const [isCanScale, setCanScale] = useState(true);
  26. const pdfReader = useContext(PDFReaderContext) as CPDFReaderView | null;
  27. useEffect(() => {
  28. const checkSettings = async () => {
  29. if(pdfReader){
  30. const isVertical = await pdfReader.isVerticalMode();
  31. console.log('isVertical', isVertical);
  32. setIsVertical(isVertical);
  33. const isDoublePageMode = await pdfReader.isDoublePageMode();
  34. const isCoverPageMode = await pdfReader.isCoverPageMode();
  35. if(!isDoublePageMode){
  36. setDisplayMode(CPDFDisplayMode.SINGLE_PAGE);
  37. } else {
  38. setDisplayMode(isCoverPageMode ? CPDFDisplayMode.COVER_PAGE : CPDFDisplayMode.DOUBLE_PAGE);
  39. }
  40. const formFieldHighlight = await pdfReader?.isFormFieldHighlight();
  41. console.log('formFieldHighlight', formFieldHighlight);
  42. setIsFormFieldHighlight(formFieldHighlight);
  43. const isLinkHighlight = await pdfReader?.isLinkHighlight();
  44. console.log('isLinkHighlight', isLinkHighlight);
  45. setIsLinkHighlight(isLinkHighlight);
  46. setIsContinuousScrolling(await pdfReader?.isContinueMode());
  47. setIsCrop(await pdfReader?.isCropMode());
  48. setThemes(await pdfReader?.getReadBackgroundColor());
  49. }
  50. }
  51. if(visible){
  52. checkSettings();
  53. }
  54. }, [visible, pdfReader])
  55. const renderScrollItem = () =>{
  56. return (
  57. <View>
  58. <View style={styles.subTitleView}>
  59. <Text style={styles.subTitle}>Scroll</Text>
  60. </View>
  61. {_item('Vertical Scrolling', isVertical, () => {
  62. pdfReader?.setVerticalMode(true);
  63. setIsVertical(true);
  64. })}
  65. {_item('Horizontal Scrolling', !isVertical, () => {
  66. pdfReader?.setVerticalMode(false);
  67. setIsVertical(false);
  68. })}
  69. </View>
  70. );
  71. }
  72. const renderDisplayMode = () => {
  73. return (
  74. <View>
  75. <View style={styles.subTitleView}>
  76. <Text style={styles.subTitle}>Display Mode</Text>
  77. </View>
  78. {_item('Single Page', displayMode == CPDFDisplayMode.SINGLE_PAGE, () => {
  79. pdfReader?.setDoublePageMode(false)
  80. setDisplayMode(CPDFDisplayMode.SINGLE_PAGE)
  81. })}
  82. {_item('Two Page', displayMode == CPDFDisplayMode.DOUBLE_PAGE, () => {
  83. pdfReader?.setDoublePageMode(true)
  84. setDisplayMode(CPDFDisplayMode.DOUBLE_PAGE)
  85. })}
  86. {_item('Cover Mode', displayMode == CPDFDisplayMode.COVER_PAGE, () => {
  87. pdfReader?.setCoverPageMode(true);
  88. setDisplayMode(CPDFDisplayMode.COVER_PAGE)
  89. })}
  90. </View>
  91. );
  92. }
  93. const renderOtherSettings = () => {
  94. return (
  95. <View>
  96. <View style={styles.subTitleView} ></View>
  97. {_switchItem('Highlight Links', isLinkHighlight, (value) => {
  98. pdfReader?.setLinkHighlight(value);
  99. setIsLinkHighlight(value);
  100. })}
  101. {_switchItem('Highlight Form Fields', isFormFieldHighlight, (value) => {
  102. pdfReader?.setFormFieldHighlight(value);
  103. setIsFormFieldHighlight(value);
  104. })}
  105. {_switchItem('Continuous Scrolling', isContinuousScrolling, (value) => {
  106. pdfReader?.setContinueMode(value);
  107. setIsContinuousScrolling(value);
  108. })}
  109. {_switchItem('Crop', isCrop, (value) => {
  110. pdfReader?.setCropMode(value);
  111. setIsCrop(value);
  112. })}
  113. {Platform.OS === 'android' && _switchItem('Can Scale', isCanScale, (value) => {
  114. pdfReader?.setCanScale(value);
  115. setCanScale(value);
  116. })}
  117. </View>
  118. );
  119. }
  120. const renderThemes = () => {
  121. return (
  122. <View>
  123. <View style={styles.subTitleView}>
  124. <Text style={styles.subTitle}>Themes</Text>
  125. </View>
  126. {_item('Light', themes == CPDFThemes.LIGHT, () => {
  127. pdfReader?.setReadBackgroundColor(CPDFThemes.LIGHT);
  128. setThemes(CPDFThemes.LIGHT);
  129. })}
  130. {_item('Dark', themes == CPDFThemes.DARK, () => {
  131. pdfReader?.setReadBackgroundColor(CPDFThemes.DARK);
  132. setThemes(CPDFThemes.DARK);
  133. })}
  134. {_item('Sepia', themes == CPDFThemes.SEPIA, () => {
  135. pdfReader?.setReadBackgroundColor(CPDFThemes.SEPIA);
  136. setThemes(CPDFThemes.SEPIA);
  137. })}
  138. {_item('Reseda', themes == CPDFThemes.RESEDA, () => {
  139. pdfReader?.setReadBackgroundColor(CPDFThemes.RESEDA);
  140. setThemes(CPDFThemes.RESEDA);
  141. })}
  142. </View>
  143. );
  144. }
  145. const _item = (title : string, isChecked : boolean, onPress : () =>void) => {
  146. return (
  147. <TouchableOpacity onPress={onPress}>
  148. <View style={styles.item}>
  149. <Text style={isChecked ? styles.itemTextSelect : styles.itemTextNormal}>{title}</Text>
  150. {isChecked && (
  151. <Image source={require('../../assets/right.png')} style={{width: 24, height: 24, marginStart: 8}}/>
  152. )}
  153. </View>
  154. </TouchableOpacity>
  155. );
  156. }
  157. const _switchItem = (title : string, isChecked : boolean, onValueChange : (value : boolean) => void) => {
  158. return (
  159. <TouchableOpacity>
  160. <View style={styles.item}>
  161. <Text style={styles.itemTextNormal}>{title}</Text>
  162. <Switch
  163. thumbColor={isChecked ? '#1460F3' : 'white'}
  164. trackColor={{false: '#E0E0E0', true: '#1460F34D'}}
  165. value={isChecked} onValueChange={onValueChange}/>
  166. </View>
  167. </TouchableOpacity>
  168. );
  169. }
  170. return (
  171. <Modal
  172. animationType="slide"
  173. transparent={true}
  174. visible={visible}
  175. onRequestClose={onClose}>
  176. <TouchableWithoutFeedback onPress={onClose}>
  177. <View style={styles.container}>
  178. <TouchableWithoutFeedback>
  179. <View style={styles.modalView}>
  180. <Text style={styles.title}>Settings</Text>
  181. <ScrollView>
  182. {renderScrollItem()}
  183. {renderDisplayMode()}
  184. {renderOtherSettings()}
  185. {renderThemes()}
  186. </ScrollView>
  187. </View>
  188. </TouchableWithoutFeedback>
  189. </View>
  190. </TouchableWithoutFeedback>
  191. </Modal>
  192. );
  193. }
  194. const styles = StyleSheet.create({
  195. container: {
  196. flex: 1,
  197. justifyContent: 'flex-end',
  198. backgroundColor: 'rgba(0, 0, 0, 0.1)'
  199. },
  200. modalView: {
  201. backgroundColor: 'white',
  202. height: '80%',
  203. justifyContent: 'flex-start',
  204. borderTopLeftRadius: 20,
  205. borderTopRightRadius: 20
  206. },
  207. title : {
  208. fontSize: 20,
  209. fontWeight: 'bold',
  210. marginTop : 16,
  211. marginStart : 16,
  212. marginBottom : 16,
  213. color: 'black',
  214. },
  215. subTitleView : {
  216. justifyContent:'center',
  217. height: 32,
  218. marginHorizontal: 16,
  219. lineHeight:32,
  220. fontWeight : 'bold',
  221. backgroundColor: '#DDE9FF',
  222. paddingStart:8,
  223. borderRadius: 4
  224. },
  225. subTitle : {
  226. fontSize : 14,
  227. textAlignVertical: 'center',
  228. alignContent:'center',
  229. color : 'black',
  230. fontWeight : 'bold',
  231. },
  232. item : {
  233. height : 48,
  234. marginStart : 16,
  235. flexDirection: 'row',
  236. alignItems: 'center',
  237. justifyContent: 'space-between',
  238. marginEnd : 16,
  239. },
  240. itemTextNormal : {
  241. textAlignVertical: 'center',
  242. fontSize: 12,
  243. color: 'gray'
  244. },
  245. itemTextSelect : {
  246. textAlignVertical: 'center',
  247. color: 'black',
  248. fontSize: 12
  249. }
  250. });