safeAreaBehavior.js 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import { getSystemInfoSync } from '../hooks/useNativeAPI'
  2. import { checkIPhoneX } from '../hooks/useSafeArea'
  3. export const safeAreaProps = {
  4. safeArea: {
  5. type: [Boolean, String, Object],
  6. optionalTypes: [Boolean, String, Object],
  7. value: false,
  8. },
  9. safeAreaStyle: {
  10. type: String,
  11. value: 'default',
  12. },
  13. }
  14. const getDefaultSafeArea = () => ({
  15. top: false,
  16. bottom: false,
  17. })
  18. const setSafeArea = (params) => {
  19. if (typeof params === 'boolean') {
  20. return Object.assign({}, getDefaultSafeArea(), {
  21. top: params,
  22. bottom: params,
  23. })
  24. } else if (params !== null && typeof params === 'object') {
  25. return Object.assign({}, getDefaultSafeArea(), params)
  26. } else if (typeof params === 'string') {
  27. return Object.assign({}, getDefaultSafeArea(), {
  28. [params]: true,
  29. })
  30. }
  31. return getDefaultSafeArea()
  32. }
  33. export default Behavior({
  34. properties: { ...safeAreaProps },
  35. data: {
  36. safeAreaConfig: getDefaultSafeArea(),
  37. isIPhoneX: false,
  38. },
  39. observers: {
  40. safeArea(newVal) {
  41. this.setData({ safeAreaConfig: setSafeArea(newVal) })
  42. },
  43. },
  44. definitionFilter(defFields) {
  45. const windowInfo = getSystemInfoSync(['window', 'device'])
  46. const isIPhoneX = checkIPhoneX(windowInfo)
  47. Object.assign(defFields.data = (defFields.data || {}), {
  48. safeAreaConfig: getDefaultSafeArea(),
  49. isIPhoneX,
  50. })
  51. },
  52. })