Skip to content

Commit a1d9586

Browse files
committed
Merge branch 'release/1.4.0'
2 parents e2e0b94 + 916fc31 commit a1d9586

File tree

2 files changed

+225
-0
lines changed

2 files changed

+225
-0
lines changed

Sources/Pam/flex/FlexParser.swift

Lines changed: 218 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,218 @@
1+
//
2+
// File.swift
3+
//
4+
//
5+
// Created by narongrit kanhanoi on 19/3/2565 BE.
6+
//
7+
8+
import Foundation
9+
10+
public class PView {
11+
var props: [String: String] = [:]
12+
13+
public func describe()->String{
14+
var r = ""
15+
if self is PImage {
16+
r += "Image\n"
17+
}else if self is PContainer {
18+
r += "Container\n"
19+
}else if self is PText {
20+
r += "TextView\n"
21+
}
22+
for (k,v) in props{
23+
r += "\t\(k)=\(v)\n"
24+
}
25+
return r
26+
}
27+
28+
public func createView(parser: FlexParser) -> UIView {
29+
return UIView()
30+
}
31+
32+
}
33+
34+
public class PContainer: PView{
35+
var childs:[PView] = []
36+
func appendChild(e: PView){
37+
childs.append(e)
38+
}
39+
40+
override public func describe()->String{
41+
var r = super.describe()
42+
for v in childs{
43+
r += v.describe()
44+
}
45+
return r
46+
}
47+
48+
public override func createView(parser: FlexParser) -> UIView {
49+
let view = UIStackView()
50+
view.distribution = .fill
51+
view.axis = .vertical
52+
53+
view.frame = parser.containerSize ??
54+
CGRect(x: 0, y: 0, width: 300, height: 300)
55+
56+
for v in childs {
57+
let subView = v.createView(parser: parser)
58+
print(subView)
59+
view.addArrangedSubview(subView)
60+
}
61+
62+
return view
63+
}
64+
}
65+
66+
public class PImage: PView {
67+
override public func createView(parser: FlexParser) -> UIView {
68+
let view = UIImageView()
69+
view.backgroundColor = .red
70+
if let urlStr = props["src"] {
71+
if let url = URL(string: urlStr){
72+
let req = URLRequest(url: url)
73+
URLSession.shared.dataTask(with: req) { data, res, err in
74+
if let data = data {
75+
if let img = UIImage(data: data) {
76+
view.image = UIImage(data: data)
77+
view.frame = CGRect(x: view.frame.minX, y: view.frame.minY, width: img.size.width, height: img.size.height)
78+
79+
DispatchQueue.main.async {
80+
81+
view.widthAnchor.constraint(equalToConstant: img.size.width).isActive = true
82+
view.heightAnchor.constraint(equalToConstant: img.size.height).isActive = true
83+
}
84+
}
85+
}
86+
}.resume()
87+
}
88+
}
89+
90+
91+
92+
return view
93+
}
94+
}
95+
96+
public class PText: PView {
97+
override public func createView(parser: FlexParser) -> UIView {
98+
let view = UILabel()
99+
view.numberOfLines = 3
100+
view.text = props["text"] ?? ""
101+
let size = props["size"]?.CGFloatValue() ?? 0
102+
view.font = UIFont.systemFont(ofSize: size)
103+
view.sizeToFit()
104+
105+
view.widthAnchor.constraint(equalToConstant: view.frame.size.width).isActive = true
106+
view.heightAnchor.constraint(equalToConstant: view.frame.size.height).isActive = true
107+
108+
return view
109+
}
110+
}
111+
112+
public enum TextSize: String{
113+
case body = "body"
114+
case title = "title"
115+
}
116+
public class FlexParser {
117+
118+
public static let shared = FlexParser()
119+
120+
var textSize: [String: Int] = [
121+
"body": 14,
122+
"title": 18
123+
]
124+
125+
var containerSize: CGRect?
126+
127+
public func setTextSize(for name: TextSize, size: Int){
128+
textSize[name.rawValue] = size
129+
}
130+
131+
public func getTextSize(_ name: TextSize) -> Int {
132+
return textSize[name.rawValue] ?? 6
133+
}
134+
135+
public func parse(flex: String) -> PView? {
136+
let flex = removingWhitespaces(flex)
137+
var buffer = ""
138+
var root: PContainer?
139+
var currentElement: PView?
140+
141+
var propName = ""
142+
var startProp = false
143+
for c in flex {
144+
if c == "(" {
145+
146+
let e = createElement(type: buffer)
147+
if buffer == "root" {
148+
root = e as? PContainer
149+
}else{
150+
root?.appendChild(e: e)
151+
}
152+
currentElement = e
153+
buffer = ""
154+
}else if c == "=" {
155+
propName = buffer
156+
buffer = ""
157+
}else if c == "\"" {
158+
if !startProp {
159+
startProp = true
160+
}else{
161+
startProp = false
162+
var _size = buffer
163+
if currentElement is PText && propName == "size" {
164+
let k = TextSize.init(rawValue: buffer) ?? .body
165+
let size = getTextSize(k)
166+
_size = String(describing:size)
167+
}
168+
169+
currentElement?.props[propName] = _size
170+
buffer = ""
171+
}
172+
}else if c == ")" {
173+
currentElement = nil
174+
buffer = ""
175+
}else{
176+
buffer.append(c)
177+
}
178+
}
179+
return root
180+
}
181+
182+
func createElement(type: String) -> PView {
183+
if type == "root" {
184+
return PContainer()
185+
}else if type == "image" {
186+
return PImage()
187+
}else if type == "text" {
188+
return PText()
189+
}
190+
return PView()
191+
}
192+
193+
public func createView(pView: PContainer?, frame: CGRect? = nil) -> UIView? {
194+
containerSize = frame
195+
let root = pView?.createView(parser: self)
196+
return root
197+
}
198+
199+
private func removingWhitespaces(_ str:String) -> String {
200+
return str.filter { s in
201+
if s != " " && s != "\n" {
202+
return true
203+
}
204+
return false
205+
}
206+
}
207+
}
208+
209+
extension String {
210+
211+
func CGFloatValue() -> CGFloat? {
212+
guard let doubleValue = Double(self) else {
213+
return nil
214+
}
215+
216+
return CGFloat(doubleValue)
217+
}
218+
}

Sources/Pam/noti/models/PamPushMessage.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,13 @@ public struct PamPushMessage {
4646
let popupType = item["popupType"] as? String
4747
let date = item["created_date"] as? String
4848
let isRead = item["is_open"] as? Bool
49+
var bannerUrl: String?
50+
51+
if let flexView = FlexParser.shared.parse(flex: flex) as? PContainer {
52+
if let img = flexView.childs[0] as? PImage {
53+
bannerUrl = img.props["src"]
54+
}
55+
}
4956

5057
return PamPushMessage(
5158
deliverID: deliverID,

0 commit comments

Comments
 (0)