NowChatThemeable 프로토콜 - iOS

  • 릴리스 버전: Xanadu
  • 업데이트 날짜 2024년 08월 01일
  • 읽기14분
  • NowWebThemeable 프로토콜은 네이티브 웹 보기의 인스턴스에 호스팅된 ServiceNow 웹 페이지 내에서 사용되는 색상을 재정의할 수 있는 속성을 제공합니다.

    이 프로토콜에는 ColorAdaptable을 확장하는 NowWebColoring 색 개체가 포함되어 있습니다. ColorAdaptable 은 디바이스 디스플레이 설정에 따라 밝은 색을 표시할지 아니면 어두운 색을 표시할지 여부를 자동으로 결정하는 데 사용됩니다.
    public protocol NowChatThemeable {
        var color: NowChatColoring { get }
    }

    NowChatColoring 프로토콜에는 가 포함되어 있습니다NowUIColoring. 이 속성은 NowWebThemeable 에서 사용할 수 있는 기본 색 변수를 참조하는 데 사용됩니다.

    UI를 테마로 지정하는 방법에 대한 자세한 내용은 Mobile SDK 개발자 가이드 - iOS를 참조하십시오 NowUIColoring을 사용하여 NowWebTheme 및 NowChatTheme 테마 적용 .

    기본 색상을 사용하여 ChatColors 정의

    /// Sample structure for using default colors that comes with Mobile SDK.
    struct ChatColors: NowUIColoring {
    }
    

    사용자 지정 색을 사용하여 ChatColors 정의

    /// Use Custom Colors with light and dark theme
    struct ChatColors: NowUIColoring {
        private var defaultTheme: NowChatDefaultTheme {
            NowChatDefaultTheme(nowUITheme: NowUIDefaultTheme())
        }
     
        var brand: UIColor {
            adaptiveColor(lightBrand, darkBrand)
        }
        var primary: UIColor {
            adaptiveColor(lightPrimary, darkPrimary)
        }
        var secondary: UIColor {
            adaptiveColor(lightSecondary, darkSecondary)
        }
        var textTertiary: UIColor {
            adaptiveColor(lightTextTertiary, darkTextTertiary)
        }
        var destructive: UIColor {
            adaptiveColor(lightDestructive, darkDestructive)
        }
        var textPrimary: UIColor {
            adaptiveColor(lightTextPrimary, darkTextPrimary)
        }
        var textSecondary: UIColor {
            adaptiveColor(lightTextSecondary, darkTextSecondary)
        }
        var textActionable: UIColor {
            adaptiveColor(lightTextActionable, darkTextActionable)
        }
        var screenHeaderText: UIColor {
            adaptiveColor(lightScreenHeaderText, darkScreenHeaderText)
        }
        var backgroundPrimary: UIColor {
            adaptiveColor(lightBackgroundPrimary, darkBackgroundPrimary)
        }
        var backgroundSecondary: UIColor {
            adaptiveColor(lightBackgroundSecondary, darkBackgroundSecondary)
        }
        var backgroundTertiary: UIColor {
            adaptiveColor(lightBackgroundTertiary, darkBackgroundTertiary)
        }
        var backgroundPrimaryActionable: UIColor {
            adaptiveColor(lightBackgroundPrimaryActionable, darkBackgroundPrimaryActionable)
        }
        var backgroundSecondaryActionable: UIColor {
            adaptiveColor(lightBackgroundSecondaryActionable, darkBackgroundSecondaryActionable)
        }
        var brandBackground: UIColor {
            adaptiveColor(lightBrandBackground, darkBrandBackground)
        }
        var linkPrimaryText: UIColor {
            adaptiveColor(lightLinkPrimary, darkLinkPrimary)
        }
        var linkSecondary: UIColor {
            adaptiveColor(lightLinkSecondary, darkLinkSecondary)
        }
        var separatorPrimary: UIColor {
            adaptiveColor(lightSeparatorPrimary, darkSeparatorPrimary)
        }
        var separatorTertiary: UIColor {
            adaptiveColor(lightSeparatorTertiary, darkSeparatorTertiary)
        }
        var borderTertiary: UIColor {
            adaptiveColor(lightBorderTertiary, darkBorderTertiary)
        }
        var shadow: UIColor {
            adaptiveColor(lightShadow, darkShadow)
        }
        var notification: UIColor {
            adaptiveColor(lightNotification, darkNotification)
        }
        var alertCritical0: UIColor {
            adaptiveColor(lightAlertCritical0, darkAlertCritical0)
        }
        var alertCritical3: UIColor {
            adaptiveColor(lightAlertCritical3, darkAlertCritical3)
        }
    
        // Light Colors
        var lightBrand: UIColor { defaultTheme.color.nowUIColor.brand }
        var lightPrimary: UIColor { defaultTheme.color.nowUIColor.primary }
        var lightSecondary: UIColor { defaultTheme.color.nowUIColor.secondary }
        var lightDestructive: UIColor { defaultTheme.color.nowUIColor.destructive }
        var lightTextPrimary: UIColor { defaultTheme.color.nowUIColor.textPrimary }
        var lightTextSecondary: UIColor { defaultTheme.color.nowUIColor.textSecondary }
        var lightTextTertiary: UIColor { defaultTheme.color.nowUIColor.textTertiary }
        var lightTextActionable: UIColor { defaultTheme.color.nowUIColor.textActionable }
        var lightScreenHeaderText: UIColor { defaultTheme.color.nowUIColor.screenHeaderText }
        var lightBackgroundPrimary: UIColor { defaultTheme.color.nowUIColor.backgroundPrimary }
        var lightBackgroundSecondary: UIColor { defaultTheme.color.nowUIColor.backgroundSecondary }
        var lightBackgroundTertiary: UIColor { defaultTheme.color.nowUIColor.backgroundTertiary }
        var lightBackgroundPrimaryActionable: UIColor { defaultTheme.color.nowUIColor.backgroundPrimaryActionable
        }
        var lightBackgroundSecondaryActionable: UIColor { defaultTheme.color.nowUIColor.backgroundSecondaryActionable
        }
        var lightBrandBackground: UIColor { defaultTheme.color.nowUIColor.brandBackground }
        var lightLinkPrimary: UIColor { defaultTheme.color.nowUIColor.linkPrimaryText }
        var lightLinkSecondary: UIColor { defaultTheme.color.nowUIColor.linkSecondary }
        var lightSeparatorPrimary: UIColor { defaultTheme.color.nowUIColor.separatorPrimary }
        var lightSeparatorTertiary: UIColor { defaultTheme.color.nowUIColor.separatorTertiary }
        var lightBorderTertiary: UIColor { defaultTheme.color.nowUIColor.borderTertiary }
        var lightShadow: UIColor { defaultTheme.color.nowUIColor.shadow }
        var lightNotification: UIColor { defaultTheme.color.nowUIColor.notification }
        var lightAlertCritical0: UIColor { defaultTheme.color.nowUIColor.alertCritical0 }
        var lightAlertCritical3: UIColor { defaultTheme.color.nowUIColor.alertCritical3 }
    
        // Dark Colors
        var darkBrand: UIColor { defaultTheme.color.nowUIColor.brand }
        var darkPrimary = UIColor(hex: "#8486FF")
        var darkSecondary = UIColor(hex: "#CECFFF")
        var darkDestructive = UIColor(hex: "#E46876")
        var darkTextPrimary = UIColor(hex: "#FFFFFF")
        var darkTextSecondary = UIColor(hex: "#C1C5CD")
        var darkTextTertiary = UIColor(hex: "#8F95A1")
        var darkTextActionable = UIColor(hex: "#07080B")
        var darkScreenHeaderText = UIColor(hex: "#FFFFFF")
        var darkBackgroundPrimary = UIColor(hex: "#07080B")
        var darkBackgroundSecondary = UIColor(hex: "#151920")
        var darkBackgroundTertiary = UIColor(hex: "#252A35")
        var darkBackgroundPrimaryActionable = UIColor(hex: "#FFFFFF")
        var darkBackgroundSecondaryActionable = UIColor(hex: "#C1C5CD")
        var darkBrandBackground = UIColor(hex: "#28284D")
        var darkLinkPrimary = UIColor(hex: "#647BFD")
        var darkLinkSecondary = UIColor(hex: "#93A3FE")
        var darkSeparatorPrimary = UIColor(hex: "#8F95A1")
        var darkSeparatorTertiary = UIColor(hex: "#353B49")
        var darkBorderTertiary = UIColor(hex: "#454D5B")
        var darkShadow = UIColor(hex: "#151920")
        var darkNotification = UIColor(hex: "#E46876")
        var darkAlertCritical0 = UIColor(hex: "#7B1E28")
        var darkAlertCritical3 = UIColor(hex: "#E46876")
    }

    NowChatThemeable 프로토콜로 ChatTheme 구조 정의

    struct CarrascoChatTheme: NowChatThemeable {
        var color: NowChatColoring
        
        struct Color: NowChatColoring {
            var nowUIColor: NowUIColoring
        
            var backgroundPrimary: UIColor
            var backgroundSecondary: UIColor
            var backgroundPrimaryActionable: UIColor
            var backgroundSecondaryActionable: UIColor
            var brandBackground: UIColor
            var backgroundTertiary: UIColor
            var separatorPrimary: UIColor
            var separatorTertiary: UIColor
            var borderTertiary: UIColor
            var shadow: UIColor
            var linkSecondary: UIColor
    
            init(inputs: ChatColors) {
                nowUIColor = ThemeColor(inputs)
                
                backgroundPrimary = inputs.backgroundPrimary
                backgroundSecondary = inputs.backgroundSecondary
                backgroundTertiary = inputs.backgroundTertiary
                backgroundPrimaryActionable = inputs.backgroundPrimaryActionable
                backgroundSecondaryActionable = inputs.backgroundSecondaryActionable
                brandBackground = inputs.brandBackground
                separatorPrimary = inputs.separatorPrimary
                separatorTertiary = inputs.separatorTertiary
                borderTertiary = inputs.borderTertiary
                shadow = inputs.shadow
                linkSecondary = inputs.linkSecondary
            }
        }
    
        init(chatColors: ChatColors) {
            color = Color(inputs: chatColors)
        }
    }

    ChatColor를 입력으로 전달하여 ChatTheme 개체를 인스턴스화합니다

    let chatTheme = CarrascoChatTheme(chatColors: ChatColors())

    ChatTheme 객체를 NowChatService.makeChatUI에 전달 ()

    func makeChatScreen() -> UIViewController? {
      guard let chatService = chatService else { return nil }
      let result = chatService.makeChatUI(theme: CarrascoChatTheme(chatColors: ChatColors()))
            
      switch result {
      case .success(let chatViewController):
        return chatViewController
      case .failure(let error):
        debugPrint("Chat screen creation failed with error: \(error)")
        return nil
      }
    }