Dibya Malla
2 years ago
16 changed files with 799 additions and 9 deletions
-
124GME Remit.xcodeproj/project.pbxproj
-
37GME Remit/Modules/BeneficiaryDetail/Application Logic/Interactor/BeneficiaryDetailInteractor.swift
-
16GME Remit/Modules/BeneficiaryDetail/Application Logic/Interactor/BeneficiaryDetailInteractorIO.swift
-
31GME Remit/Modules/BeneficiaryDetail/Application Logic/Service/BeneficiaryDetailService.swift
-
16GME Remit/Modules/BeneficiaryDetail/Application Logic/Service/BeneficiaryDetailServiceType.swift
-
11GME Remit/Modules/BeneficiaryDetail/Module Interface/BeneficiaryDetailModuleInterface.swift
-
43GME Remit/Modules/BeneficiaryDetail/User Interface/Presenter/BeneficiaryDetailPresenter.swift
-
387GME Remit/Modules/BeneficiaryDetail/User Interface/View/BeneficiaryDetail.storyboard
-
58GME Remit/Modules/BeneficiaryDetail/User Interface/View/BeneficiaryDetailViewController.swift
-
14GME Remit/Modules/BeneficiaryDetail/User Interface/View/BeneficiaryDetailViewInterface.swift
-
34GME Remit/Modules/BeneficiaryDetail/User Interface/Wireframe/BeneficiaryDetailWireframe.swift
-
13GME Remit/Modules/BeneficiaryDetail/User Interface/Wireframe/BeneficiaryDetailWireframeInput.swift
-
6GME Remit/Modules/Home/User Interface/View/HomeViewController.swift
-
7GME Remit/Modules/RecipientModules/Recipients/User Interface/View/Recipients.storyboard
-
4GME Remit/Modules/RecipientModules/Recipients/User Interface/View/RecipientsViewController.swift
-
7GME Remit/Modules/TransferList/User Interface/View/TransferListTableViewCell.swift
@ -0,0 +1,37 @@ |
|||
// |
|||
// BeneficiaryDetailInteractor.swift |
|||
// GME Remit |
|||
// |
|||
// Created by Manish Adhikari on 24/03/2023. |
|||
//Copyright © 2023 Gobal Money Express Co. Ltd. All rights reserved. |
|||
// |
|||
|
|||
import Foundation |
|||
|
|||
class BeneficiaryDetailInteractor { |
|||
|
|||
// MARK: Properties |
|||
|
|||
weak var output: BeneficiaryDetailInteractorOutput? |
|||
private let service: BeneficiaryDetailServiceType |
|||
|
|||
// MARK: Initialization |
|||
|
|||
init(service: BeneficiaryDetailServiceType) { |
|||
self.service = service |
|||
} |
|||
|
|||
// MARK: Converting entities |
|||
} |
|||
|
|||
// MARK: BeneficiaryDetail interactor input interface |
|||
|
|||
extension BeneficiaryDetailInteractor: BeneficiaryDetailInteractorInput { |
|||
func makeApiRequest() { |
|||
self.service.makeApiRequest(success: { (message) in |
|||
self.output?.success(message: message ?? "") |
|||
}) { (error) in |
|||
self.output?.show(error: error) |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,16 @@ |
|||
// |
|||
// BeneficiaryDetailInteractorIO.swift |
|||
// GME Remit |
|||
// |
|||
// Created by Manish Adhikari on 24/03/2023. |
|||
//Copyright © 2023 Gobal Money Express Co. Ltd. All rights reserved. |
|||
// |
|||
|
|||
protocol BeneficiaryDetailInteractorInput: class { |
|||
func makeApiRequest() |
|||
} |
|||
|
|||
protocol BeneficiaryDetailInteractorOutput: class { |
|||
func show(error: Error) |
|||
func success(message: String) |
|||
} |
@ -0,0 +1,31 @@ |
|||
// |
|||
// BeneficiaryDetailService.swift |
|||
// GME Remit |
|||
// |
|||
// Created by Manish Adhikari on 24/03/2023. |
|||
//Copyright © 2023 Gobal Money Express Co. Ltd. All rights reserved. |
|||
// |
|||
|
|||
import Foundation |
|||
|
|||
class BeneficiaryDetailService: BeneficiaryDetailServiceType { |
|||
func makeApiRequest( |
|||
success: @escaping (String?) -> Void, |
|||
failure: @escaping (Error) -> Void |
|||
){ |
|||
APIRouter |
|||
// .requestOTP(mobileNumber: mobile) |
|||
.request( |
|||
needsAuthorization: false, |
|||
success: {(response: ResponseMessage) in |
|||
if (response.errorCode ?? "") == "1" { |
|||
let error = NSError(domain: "Network", code: 0, message: response.message ?? "") |
|||
failure(error) |
|||
} else { |
|||
success(response.message ?? "") |
|||
} |
|||
}, |
|||
failure: {failure($0)} |
|||
) |
|||
} |
|||
} |
@ -0,0 +1,16 @@ |
|||
// |
|||
// BeneficiaryDetailServiceType.swift |
|||
// GME Remit |
|||
// |
|||
// Created by Manish Adhikari on 24/03/2023. |
|||
//Copyright © 2023 Gobal Money Express Co. Ltd. All rights reserved. |
|||
// |
|||
|
|||
import Foundation |
|||
|
|||
protocol BeneficiaryDetailServiceType: class { |
|||
func makeApiRequest( |
|||
success: @escaping (String?) -> Void, |
|||
failure: @escaping (Error) -> Void |
|||
) |
|||
} |
@ -0,0 +1,11 @@ |
|||
// |
|||
// BeneficiaryDetailModuleInterface.swift |
|||
// GME Remit |
|||
// |
|||
// Created by Manish Adhikari on 24/03/2023. |
|||
//Copyright © 2023 Gobal Money Express Co. Ltd. All rights reserved. |
|||
// |
|||
|
|||
protocol BeneficiaryDetailModuleInterface: class { |
|||
func makeApiRequest() |
|||
} |
@ -0,0 +1,43 @@ |
|||
// |
|||
// BeneficiaryDetailPresenter.swift |
|||
// GME Remit |
|||
// |
|||
// Created by Manish Adhikari on 24/03/2023. |
|||
//Copyright © 2023 Gobal Money Express Co. Ltd. All rights reserved. |
|||
// |
|||
|
|||
import Foundation |
|||
|
|||
class BeneficiaryDetailPresenter { |
|||
|
|||
// MARK: Properties |
|||
|
|||
weak var view: BeneficiaryDetailViewInterface? |
|||
var interactor: BeneficiaryDetailInteractorInput? |
|||
var wireframe: BeneficiaryDetailWireframeInput? |
|||
|
|||
// MARK: Converting entities |
|||
} |
|||
|
|||
// MARK: BeneficiaryDetail module interface |
|||
|
|||
extension BeneficiaryDetailPresenter: BeneficiaryDetailModuleInterface { |
|||
func makeApiRequest(){ |
|||
self.view?.showLoading() |
|||
self.interactor?.makeApiRequest() |
|||
} |
|||
} |
|||
|
|||
// MARK: BeneficiaryDetail interactor output interface |
|||
|
|||
extension BeneficiaryDetailPresenter: BeneficiaryDetailInteractorOutput { |
|||
func show(error: Error) { |
|||
self.view?.hideLoading() |
|||
self.view?.show(error: error.localizedDescription) |
|||
} |
|||
|
|||
func success(message: String) { |
|||
self.view?.hideLoading() |
|||
self.view?.show(message: message) |
|||
} |
|||
} |
@ -0,0 +1,387 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="21507" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="HSb-ou-7T5"> |
|||
<device id="retina4_7" orientation="portrait" appearance="light"/> |
|||
<dependencies> |
|||
<deployment identifier="iOS"/> |
|||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21505"/> |
|||
<capability name="Named colors" minToolsVersion="9.0"/> |
|||
<capability name="Safe area layout guides" minToolsVersion="9.0"/> |
|||
<capability name="System colors in document resources" minToolsVersion="11.0"/> |
|||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> |
|||
</dependencies> |
|||
<customFonts key="customFonts"> |
|||
<array key="volte-semibold.otf"> |
|||
<string>FONTSPRINGDEMO-VolteSemiboldRegular</string> |
|||
</array> |
|||
</customFonts> |
|||
<scenes> |
|||
<!--BeneficiaryDetail--> |
|||
<scene sceneID="R60-Pu-Hpy"> |
|||
<objects> |
|||
<viewController storyboardIdentifier="BeneficiaryDetailViewController" title="BeneficiaryDetail" id="HSb-ou-7T5" customClass="BeneficiaryDetailViewController" sceneMemberID="viewController"> |
|||
<view key="view" contentMode="scaleToFill" id="9Uc-9s-KgO"> |
|||
<rect key="frame" x="0.0" y="0.0" width="375" height="700"/> |
|||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> |
|||
<subviews> |
|||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Msg-ak-twI"> |
|||
<rect key="frame" x="16" y="0.0" width="343" height="62"/> |
|||
<subviews> |
|||
<stackView opaque="NO" contentMode="scaleToFill" alignment="center" translatesAutoresizingMaskIntoConstraints="NO" id="SgC-Zr-M2U"> |
|||
<rect key="frame" x="16" y="16" width="311" height="30"/> |
|||
<subviews> |
|||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="GAb-k2-WAx"> |
|||
<rect key="frame" x="0.0" y="0.0" width="50" height="30"/> |
|||
<constraints> |
|||
<constraint firstAttribute="width" constant="50" id="Sa2-BD-8P0"/> |
|||
</constraints> |
|||
<state key="normal" title="Button"/> |
|||
<buttonConfiguration key="configuration" style="plain" image="backIconBlack"/> |
|||
</button> |
|||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Beneficiary details" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="QwU-Sh-1vb"> |
|||
<rect key="frame" x="50" y="6.5" width="261" height="17"/> |
|||
<fontDescription key="fontDescription" name="FONTSPRINGDEMO-VolteSemiboldRegular" family="FONTSPRING DEMO - Volte Semibold" pointSize="17"/> |
|||
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.86325538079470199" colorSpace="custom" customColorSpace="calibratedRGB"/> |
|||
<nil key="highlightedColor"/> |
|||
</label> |
|||
</subviews> |
|||
</stackView> |
|||
</subviews> |
|||
<color key="backgroundColor" systemColor="systemBackgroundColor"/> |
|||
<constraints> |
|||
<constraint firstItem="SgC-Zr-M2U" firstAttribute="leading" secondItem="Msg-ak-twI" secondAttribute="leading" constant="16" id="3Xa-AO-VoQ"/> |
|||
<constraint firstItem="SgC-Zr-M2U" firstAttribute="top" secondItem="Msg-ak-twI" secondAttribute="top" constant="16" id="CuX-Gi-EvT"/> |
|||
<constraint firstAttribute="bottom" secondItem="SgC-Zr-M2U" secondAttribute="bottom" constant="16" id="Kvb-vm-c4K"/> |
|||
<constraint firstAttribute="trailing" secondItem="SgC-Zr-M2U" secondAttribute="trailing" constant="16" id="nqt-j4-gnI"/> |
|||
</constraints> |
|||
</view> |
|||
<tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="-1" estimatedSectionHeaderHeight="-1" sectionFooterHeight="-1" estimatedSectionFooterHeight="-1" translatesAutoresizingMaskIntoConstraints="NO" id="nhb-o1-ekZ"> |
|||
<rect key="frame" x="0.0" y="62" width="375" height="638"/> |
|||
<color key="backgroundColor" systemColor="systemBackgroundColor"/> |
|||
<view key="tableHeaderView" contentMode="scaleToFill" id="7d8-Fv-619"> |
|||
<rect key="frame" x="0.0" y="0.0" width="375" height="165"/> |
|||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> |
|||
<subviews> |
|||
<stackView opaque="NO" contentMode="scaleToFill" alignment="center" spacing="32" translatesAutoresizingMaskIntoConstraints="NO" id="IC7-5u-2hN"> |
|||
<rect key="frame" x="0.0" y="0.0" width="375" height="165"/> |
|||
<subviews> |
|||
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="20" translatesAutoresizingMaskIntoConstraints="NO" id="dhs-ZH-QJw"> |
|||
<rect key="frame" x="0.0" y="9" width="96" height="147"/> |
|||
<subviews> |
|||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="_" translatesAutoresizingMaskIntoConstraints="NO" id="Owc-cl-DGR"> |
|||
<rect key="frame" x="0.0" y="0.0" width="96" height="96"/> |
|||
<constraints> |
|||
<constraint firstAttribute="width" constant="96" id="Sdd-mF-eJ1"/> |
|||
<constraint firstAttribute="height" constant="96" id="ghA-ui-z0y"/> |
|||
</constraints> |
|||
</imageView> |
|||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="0xQ-e7-Vqb"> |
|||
<rect key="frame" x="0.0" y="116" width="96" height="31"/> |
|||
<constraints> |
|||
<constraint firstAttribute="height" constant="31" id="coG-v2-wbe"/> |
|||
</constraints> |
|||
<color key="tintColor" red="0.1803921568627451" green="0.53725490196078429" blue="1" alpha="1" colorSpace="custom" customColorSpace="displayP3"/> |
|||
<state key="normal" title="Button"/> |
|||
<buttonConfiguration key="configuration" style="plain" title="Update"/> |
|||
</button> |
|||
</subviews> |
|||
</stackView> |
|||
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="8" translatesAutoresizingMaskIntoConstraints="NO" id="lmj-Vg-SQG"> |
|||
<rect key="frame" x="128" y="6.5" width="247" height="152"/> |
|||
<subviews> |
|||
<stackView opaque="NO" contentMode="scaleToFill" alignment="center" spacing="8" translatesAutoresizingMaskIntoConstraints="NO" id="4GK-BA-lCj"> |
|||
<rect key="frame" x="0.0" y="0.0" width="247" height="32"/> |
|||
<subviews> |
|||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="avatar" translatesAutoresizingMaskIntoConstraints="NO" id="OCx-bC-rJb"> |
|||
<rect key="frame" x="0.0" y="4" width="24" height="24"/> |
|||
<constraints> |
|||
<constraint firstAttribute="height" constant="24" id="cW1-rO-ZVt"/> |
|||
<constraint firstAttribute="width" constant="24" id="rgL-Dy-xiR"/> |
|||
</constraints> |
|||
</imageView> |
|||
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" distribution="fillEqually" translatesAutoresizingMaskIntoConstraints="NO" id="klu-Fm-Zi4"> |
|||
<rect key="frame" x="32" y="0.0" width="215" height="32"/> |
|||
<subviews> |
|||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Name" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="MaY-cJ-z8a"> |
|||
<rect key="frame" x="0.0" y="0.0" width="215" height="16"/> |
|||
<fontDescription key="fontDescription" name="FONTSPRINGDEMO-VolteSemiboldRegular" family="FONTSPRING DEMO - Volte Semibold" pointSize="12"/> |
|||
<color key="textColor" red="0.62352941176470589" green="0.62352941176470589" blue="0.62352941176470589" alpha="0.87" colorSpace="calibratedRGB"/> |
|||
<nil key="highlightedColor"/> |
|||
</label> |
|||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Rajesh Sharma" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="0Gz-4k-o6Q"> |
|||
<rect key="frame" x="0.0" y="16" width="215" height="16"/> |
|||
<fontDescription key="fontDescription" name="FONTSPRINGDEMO-VolteSemiboldRegular" family="FONTSPRING DEMO - Volte Semibold" pointSize="16"/> |
|||
<nil key="textColor"/> |
|||
<nil key="highlightedColor"/> |
|||
</label> |
|||
</subviews> |
|||
</stackView> |
|||
</subviews> |
|||
</stackView> |
|||
<stackView opaque="NO" contentMode="scaleToFill" alignment="center" spacing="8" translatesAutoresizingMaskIntoConstraints="NO" id="Xb1-GV-d3u"> |
|||
<rect key="frame" x="0.0" y="40" width="247" height="32"/> |
|||
<subviews> |
|||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="avatar" translatesAutoresizingMaskIntoConstraints="NO" id="j4v-FU-Ds2"> |
|||
<rect key="frame" x="0.0" y="4" width="24" height="24"/> |
|||
<constraints> |
|||
<constraint firstAttribute="height" constant="24" id="R0Y-Tx-F1P"/> |
|||
<constraint firstAttribute="width" constant="24" id="bIj-c3-R0e"/> |
|||
</constraints> |
|||
</imageView> |
|||
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" distribution="fillEqually" translatesAutoresizingMaskIntoConstraints="NO" id="Eb6-ZA-13J"> |
|||
<rect key="frame" x="32" y="0.0" width="215" height="32"/> |
|||
<subviews> |
|||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Name" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="zCs-ye-DFj"> |
|||
<rect key="frame" x="0.0" y="0.0" width="215" height="16"/> |
|||
<fontDescription key="fontDescription" name="FONTSPRINGDEMO-VolteSemiboldRegular" family="FONTSPRING DEMO - Volte Semibold" pointSize="12"/> |
|||
<color key="textColor" red="0.62352941179999999" green="0.62352941179999999" blue="0.62352941179999999" alpha="0.87" colorSpace="calibratedRGB"/> |
|||
<nil key="highlightedColor"/> |
|||
</label> |
|||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Rajesh Sharma" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="m7c-cG-URc"> |
|||
<rect key="frame" x="0.0" y="16" width="215" height="16"/> |
|||
<fontDescription key="fontDescription" name="FONTSPRINGDEMO-VolteSemiboldRegular" family="FONTSPRING DEMO - Volte Semibold" pointSize="16"/> |
|||
<nil key="textColor"/> |
|||
<nil key="highlightedColor"/> |
|||
</label> |
|||
</subviews> |
|||
</stackView> |
|||
</subviews> |
|||
</stackView> |
|||
<stackView opaque="NO" contentMode="scaleToFill" alignment="center" spacing="8" translatesAutoresizingMaskIntoConstraints="NO" id="hNK-BM-IaB"> |
|||
<rect key="frame" x="0.0" y="80" width="247" height="32"/> |
|||
<subviews> |
|||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="avatar" translatesAutoresizingMaskIntoConstraints="NO" id="I4m-uD-kOg"> |
|||
<rect key="frame" x="0.0" y="4" width="24" height="24"/> |
|||
<constraints> |
|||
<constraint firstAttribute="width" constant="24" id="BbE-aU-YkS"/> |
|||
<constraint firstAttribute="height" constant="24" id="l0O-kk-XQ4"/> |
|||
</constraints> |
|||
</imageView> |
|||
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" distribution="fillEqually" translatesAutoresizingMaskIntoConstraints="NO" id="fey-vZ-Um0"> |
|||
<rect key="frame" x="32" y="0.0" width="215" height="32"/> |
|||
<subviews> |
|||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Name" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="xm3-HN-iIf"> |
|||
<rect key="frame" x="0.0" y="0.0" width="215" height="16"/> |
|||
<fontDescription key="fontDescription" name="FONTSPRINGDEMO-VolteSemiboldRegular" family="FONTSPRING DEMO - Volte Semibold" pointSize="12"/> |
|||
<color key="textColor" red="0.62352941179999999" green="0.62352941179999999" blue="0.62352941179999999" alpha="0.87" colorSpace="calibratedRGB"/> |
|||
<nil key="highlightedColor"/> |
|||
</label> |
|||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Rajesh Sharma" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="fKe-CP-Ddg"> |
|||
<rect key="frame" x="0.0" y="16" width="215" height="16"/> |
|||
<fontDescription key="fontDescription" name="FONTSPRINGDEMO-VolteSemiboldRegular" family="FONTSPRING DEMO - Volte Semibold" pointSize="16"/> |
|||
<nil key="textColor"/> |
|||
<nil key="highlightedColor"/> |
|||
</label> |
|||
</subviews> |
|||
</stackView> |
|||
</subviews> |
|||
</stackView> |
|||
<stackView opaque="NO" contentMode="scaleToFill" alignment="center" spacing="8" translatesAutoresizingMaskIntoConstraints="NO" id="RBy-tS-3qS"> |
|||
<rect key="frame" x="0.0" y="120" width="247" height="32"/> |
|||
<subviews> |
|||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="avatar" translatesAutoresizingMaskIntoConstraints="NO" id="5p1-o0-fpz"> |
|||
<rect key="frame" x="0.0" y="4" width="24" height="24"/> |
|||
<constraints> |
|||
<constraint firstAttribute="height" constant="24" id="5JQ-Kc-bPr"/> |
|||
<constraint firstAttribute="width" constant="24" id="AF7-91-LCr"/> |
|||
</constraints> |
|||
</imageView> |
|||
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" distribution="fillEqually" translatesAutoresizingMaskIntoConstraints="NO" id="m8D-Yz-pGU"> |
|||
<rect key="frame" x="32" y="0.0" width="215" height="32"/> |
|||
<subviews> |
|||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Name" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="5SO-tq-90r"> |
|||
<rect key="frame" x="0.0" y="0.0" width="215" height="16"/> |
|||
<fontDescription key="fontDescription" name="FONTSPRINGDEMO-VolteSemiboldRegular" family="FONTSPRING DEMO - Volte Semibold" pointSize="12"/> |
|||
<color key="textColor" red="0.62352941179999999" green="0.62352941179999999" blue="0.62352941179999999" alpha="0.87" colorSpace="calibratedRGB"/> |
|||
<nil key="highlightedColor"/> |
|||
</label> |
|||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Rajesh Sharma" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="6Wd-hf-ec0"> |
|||
<rect key="frame" x="0.0" y="16" width="215" height="16"/> |
|||
<fontDescription key="fontDescription" name="FONTSPRINGDEMO-VolteSemiboldRegular" family="FONTSPRING DEMO - Volte Semibold" pointSize="16"/> |
|||
<nil key="textColor"/> |
|||
<nil key="highlightedColor"/> |
|||
</label> |
|||
</subviews> |
|||
</stackView> |
|||
</subviews> |
|||
</stackView> |
|||
</subviews> |
|||
</stackView> |
|||
</subviews> |
|||
</stackView> |
|||
</subviews> |
|||
<color key="backgroundColor" systemColor="systemBackgroundColor"/> |
|||
<constraints> |
|||
<constraint firstAttribute="bottom" secondItem="IC7-5u-2hN" secondAttribute="bottom" id="7qu-Ex-WEz"/> |
|||
<constraint firstAttribute="trailing" secondItem="IC7-5u-2hN" secondAttribute="trailing" id="Wbe-4z-K8p"/> |
|||
<constraint firstItem="IC7-5u-2hN" firstAttribute="leading" secondItem="7d8-Fv-619" secondAttribute="leading" id="Zje-WD-T2K"/> |
|||
<constraint firstItem="IC7-5u-2hN" firstAttribute="top" secondItem="7d8-Fv-619" secondAttribute="top" id="cPy-nI-7Mm"/> |
|||
</constraints> |
|||
</view> |
|||
<view key="tableFooterView" contentMode="scaleToFill" id="bfe-KV-1bh"> |
|||
<rect key="frame" x="0.0" y="446" width="375" height="89"/> |
|||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> |
|||
<subviews> |
|||
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="12" translatesAutoresizingMaskIntoConstraints="NO" id="D0P-MT-gyH"> |
|||
<rect key="frame" x="16" y="0.0" width="343" height="73"/> |
|||
<subviews> |
|||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="View JME Remit Policies and your payment method rights" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="7Ix-yU-Ptr"> |
|||
<rect key="frame" x="0.0" y="0.0" width="343" height="13"/> |
|||
<fontDescription key="fontDescription" name="FONTSPRINGDEMO-VolteSemiboldRegular" family="FONTSPRING DEMO - Volte Semibold" pointSize="10"/> |
|||
<nil key="textColor"/> |
|||
<nil key="highlightedColor"/> |
|||
</label> |
|||
<button opaque="NO" contentMode="scaleToFill" semanticContentAttribute="forceRightToLeft" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" reversesTitleShadowWhenHighlighted="YES" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="jac-30-JTB"> |
|||
<rect key="frame" x="0.0" y="25" width="343" height="48"/> |
|||
<color key="backgroundColor" red="0.1803921568627451" green="0.53725490196078429" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> |
|||
<constraints> |
|||
<constraint firstAttribute="height" constant="48" id="Y4A-kf-84t"/> |
|||
</constraints> |
|||
<color key="tintColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/> |
|||
<state key="normal" title="Button"/> |
|||
<buttonConfiguration key="configuration" style="plain" image="arrow.forward" catalog="system" title="Continue "/> |
|||
</button> |
|||
</subviews> |
|||
</stackView> |
|||
</subviews> |
|||
<color key="backgroundColor" systemColor="systemBackgroundColor"/> |
|||
<constraints> |
|||
<constraint firstAttribute="bottom" secondItem="D0P-MT-gyH" secondAttribute="bottom" constant="16" id="7UP-kH-wBg"/> |
|||
<constraint firstItem="D0P-MT-gyH" firstAttribute="leading" secondItem="bfe-KV-1bh" secondAttribute="leading" constant="16" id="Kq6-4j-XYF"/> |
|||
<constraint firstAttribute="trailing" secondItem="D0P-MT-gyH" secondAttribute="trailing" constant="16" id="LPb-dQ-oMr"/> |
|||
<constraint firstItem="D0P-MT-gyH" firstAttribute="top" secondItem="bfe-KV-1bh" secondAttribute="top" id="lvz-Mg-ou2"/> |
|||
</constraints> |
|||
</view> |
|||
<prototypes> |
|||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" rowHeight="203" id="Zvf-x1-Wi5"> |
|||
<rect key="frame" x="0.0" y="215" width="375" height="203"/> |
|||
<autoresizingMask key="autoresizingMask"/> |
|||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="Zvf-x1-Wi5" id="44G-xa-BlV"> |
|||
<rect key="frame" x="0.0" y="0.0" width="375" height="203"/> |
|||
<autoresizingMask key="autoresizingMask"/> |
|||
<subviews> |
|||
<stackView opaque="NO" contentMode="scaleToFill" alignment="center" spacing="16" translatesAutoresizingMaskIntoConstraints="NO" id="Keh-9H-RzY"> |
|||
<rect key="frame" x="0.0" y="0.0" width="359" height="203"/> |
|||
<subviews> |
|||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="rgh-8D-QlR"> |
|||
<rect key="frame" x="0.0" y="84.5" width="50" height="34"/> |
|||
<color key="tintColor" red="0.0" green="0.80000000000000004" blue="0.59999999999999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> |
|||
<state key="normal" title="Button"/> |
|||
<buttonConfiguration key="configuration" style="plain" image="circle.inset.filled" catalog="system"/> |
|||
</button> |
|||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ZDM-LN-544"> |
|||
<rect key="frame" x="66" y="12" width="293" height="179"/> |
|||
<subviews> |
|||
<stackView opaque="NO" contentMode="scaleToFill" alignment="top" spacing="16" translatesAutoresizingMaskIntoConstraints="NO" id="DHQ-Um-OF3"> |
|||
<rect key="frame" x="16" y="16" width="212.5" height="82"/> |
|||
<subviews> |
|||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="bank_deposit" translatesAutoresizingMaskIntoConstraints="NO" id="hqc-cx-rzh"> |
|||
<rect key="frame" x="0.0" y="0.0" width="54" height="54"/> |
|||
<constraints> |
|||
<constraint firstAttribute="height" constant="40" id="2AX-wg-DHd"/> |
|||
<constraint firstAttribute="width" constant="40" id="jBV-OA-jx3"/> |
|||
</constraints> |
|||
</imageView> |
|||
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="8" translatesAutoresizingMaskIntoConstraints="NO" id="Cnn-41-XDg"> |
|||
<rect key="frame" x="70" y="0.0" width="142.5" height="82"/> |
|||
<subviews> |
|||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="IME Pay Mobile Wallet" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Ae7-L0-gY3"> |
|||
<rect key="frame" x="0.0" y="0.0" width="142.5" height="14"/> |
|||
<fontDescription key="fontDescription" name="FONTSPRINGDEMO-VolteSemiboldRegular" family="FONTSPRING DEMO - Volte Semibold" pointSize="14"/> |
|||
<nil key="textColor"/> |
|||
<nil key="highlightedColor"/> |
|||
</label> |
|||
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="4" translatesAutoresizingMaskIntoConstraints="NO" id="Lh7-U6-fWO"> |
|||
<rect key="frame" x="0.0" y="22" width="142.5" height="60"/> |
|||
<subviews> |
|||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="ID: 9841303676" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="doi-P7-z1R"> |
|||
<rect key="frame" x="0.0" y="0.0" width="142.5" height="12"/> |
|||
<fontDescription key="fontDescription" name="FONTSPRINGDEMO-VolteSemiboldRegular" family="FONTSPRING DEMO - Volte Semibold" pointSize="12"/> |
|||
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="sRGB"/> |
|||
<nil key="highlightedColor"/> |
|||
</label> |
|||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="ID: 9841303676" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="O58-Ke-fq6"> |
|||
<rect key="frame" x="0.0" y="16" width="142.5" height="12"/> |
|||
<fontDescription key="fontDescription" name="FONTSPRINGDEMO-VolteSemiboldRegular" family="FONTSPRING DEMO - Volte Semibold" pointSize="12"/> |
|||
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="sRGB"/> |
|||
<nil key="highlightedColor"/> |
|||
</label> |
|||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="ID: 9841303676" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="9uL-wQ-mZd"> |
|||
<rect key="frame" x="0.0" y="32" width="142.5" height="12"/> |
|||
<fontDescription key="fontDescription" name="FONTSPRINGDEMO-VolteSemiboldRegular" family="FONTSPRING DEMO - Volte Semibold" pointSize="12"/> |
|||
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="sRGB"/> |
|||
<nil key="highlightedColor"/> |
|||
</label> |
|||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="ID: 9841303676" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="jsp-NN-jLM"> |
|||
<rect key="frame" x="0.0" y="48" width="142.5" height="12"/> |
|||
<fontDescription key="fontDescription" name="FONTSPRINGDEMO-VolteSemiboldRegular" family="FONTSPRING DEMO - Volte Semibold" pointSize="12"/> |
|||
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="sRGB"/> |
|||
<nil key="highlightedColor"/> |
|||
</label> |
|||
</subviews> |
|||
</stackView> |
|||
</subviews> |
|||
</stackView> |
|||
</subviews> |
|||
</stackView> |
|||
</subviews> |
|||
<color key="backgroundColor" name="ThemeSeparate"/> |
|||
<constraints> |
|||
<constraint firstItem="DHQ-Um-OF3" firstAttribute="top" secondItem="ZDM-LN-544" secondAttribute="top" constant="16" id="IPG-sG-484"/> |
|||
<constraint firstAttribute="trailing" secondItem="DHQ-Um-OF3" secondAttribute="trailing" id="JfO-A7-ABO"/> |
|||
<constraint firstAttribute="bottom" secondItem="DHQ-Um-OF3" secondAttribute="bottom" constant="16" id="hMX-bV-B8j"/> |
|||
<constraint firstItem="DHQ-Um-OF3" firstAttribute="leading" secondItem="ZDM-LN-544" secondAttribute="leading" constant="16" id="s4K-Rw-9Ce"/> |
|||
</constraints> |
|||
</view> |
|||
</subviews> |
|||
<constraints> |
|||
<constraint firstAttribute="width" constant="20" id="gM0-Jm-Ifw"/> |
|||
<constraint firstAttribute="height" constant="20" id="jnK-ah-iGd"/> |
|||
</constraints> |
|||
</stackView> |
|||
</subviews> |
|||
<constraints> |
|||
<constraint firstItem="Keh-9H-RzY" firstAttribute="leading" secondItem="44G-xa-BlV" secondAttribute="leading" id="3p6-L5-hAV"/> |
|||
<constraint firstAttribute="bottom" secondItem="Keh-9H-RzY" secondAttribute="bottom" id="3sU-Za-UiA"/> |
|||
<constraint firstAttribute="trailing" secondItem="Keh-9H-RzY" secondAttribute="trailing" constant="16" id="Elb-0n-Fik"/> |
|||
<constraint firstItem="Keh-9H-RzY" firstAttribute="top" secondItem="44G-xa-BlV" secondAttribute="top" id="yAW-2k-ZfN"/> |
|||
</constraints> |
|||
</tableViewCellContentView> |
|||
</tableViewCell> |
|||
</prototypes> |
|||
</tableView> |
|||
</subviews> |
|||
<viewLayoutGuide key="safeArea" id="93B-7y-U8z"/> |
|||
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> |
|||
<constraints> |
|||
<constraint firstItem="nhb-o1-ekZ" firstAttribute="top" secondItem="Msg-ak-twI" secondAttribute="bottom" id="2RT-CE-MJT"/> |
|||
<constraint firstItem="93B-7y-U8z" firstAttribute="bottom" secondItem="nhb-o1-ekZ" secondAttribute="bottom" id="3Ug-Pm-YXc"/> |
|||
<constraint firstItem="Msg-ak-twI" firstAttribute="top" secondItem="93B-7y-U8z" secondAttribute="top" id="JAR-Nf-npW"/> |
|||
<constraint firstItem="Msg-ak-twI" firstAttribute="leading" secondItem="9Uc-9s-KgO" secondAttribute="leadingMargin" id="PHa-tz-sP5"/> |
|||
<constraint firstItem="93B-7y-U8z" firstAttribute="trailing" secondItem="nhb-o1-ekZ" secondAttribute="trailing" id="QOl-bd-eHQ"/> |
|||
<constraint firstItem="nhb-o1-ekZ" firstAttribute="leading" secondItem="93B-7y-U8z" secondAttribute="leading" id="o9y-fh-flB"/> |
|||
<constraint firstAttribute="trailingMargin" secondItem="Msg-ak-twI" secondAttribute="trailing" id="xct-nP-Sgi"/> |
|||
</constraints> |
|||
</view> |
|||
<size key="freeformSize" width="375" height="700"/> |
|||
</viewController> |
|||
<placeholder placeholderIdentifier="IBFirstResponder" id="8je-5K-XuW" userLabel="First Responder" sceneMemberID="firstResponder"/> |
|||
</objects> |
|||
<point key="canvasLocation" x="-92" y="232.08395802098951"/> |
|||
</scene> |
|||
</scenes> |
|||
<color key="tintColor" red="0.78177064659999995" green="0.55228364470000002" blue="0.018981300289999999" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> |
|||
<resources> |
|||
<image name="_" width="200" height="200"/> |
|||
<image name="arrow.forward" catalog="system" width="128" height="95"/> |
|||
<image name="avatar" width="57" height="55"/> |
|||
<image name="backIconBlack" width="21" height="16"/> |
|||
<image name="bank_deposit" width="54" height="54"/> |
|||
<image name="circle.inset.filled" catalog="system" width="128" height="123"/> |
|||
<namedColor name="ThemeSeparate"> |
|||
<color red="0.82352941176470584" green="0.82352941176470584" blue="0.82352941176470584" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> |
|||
</namedColor> |
|||
<systemColor name="systemBackgroundColor"> |
|||
<color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> |
|||
</systemColor> |
|||
</resources> |
|||
</document> |
@ -0,0 +1,58 @@ |
|||
// |
|||
// BeneficiaryDetailViewController.swift |
|||
// GME Remit |
|||
// |
|||
// Created by Manish Adhikari on 24/03/2023. |
|||
//Copyright © 2023 Gobal Money Express Co. Ltd. All rights reserved. |
|||
// |
|||
|
|||
import UIKit |
|||
|
|||
class BeneficiaryDetailViewController: UIViewController { |
|||
|
|||
// MARK: Properties |
|||
|
|||
var presenter: BeneficiaryDetailModuleInterface? |
|||
|
|||
// MARK: IBOutlets |
|||
|
|||
// MARK: VC's Life cycle |
|||
|
|||
override func viewDidLoad() { |
|||
super.viewDidLoad() |
|||
self.setup() |
|||
} |
|||
|
|||
// MARK: IBActions |
|||
|
|||
// MARK: Other Functions |
|||
|
|||
private func setup() { |
|||
// all setup should be done here |
|||
} |
|||
} |
|||
|
|||
// MARK: BeneficiaryDetailViewInterface |
|||
extension BeneficiaryDetailViewController: BeneficiaryDetailViewInterface { |
|||
func showLoading() { |
|||
self.showProgressHud() |
|||
} |
|||
|
|||
func hideLoading() { |
|||
self.hideProgressHud() |
|||
} |
|||
|
|||
func show(error: String) { |
|||
self.alert(type: .error, message: error) |
|||
} |
|||
|
|||
func show(message: String) { |
|||
self.alertWithOk( |
|||
type: .success, |
|||
message: message, |
|||
title: "Success", |
|||
okTitle: "Ok" |
|||
) { |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,14 @@ |
|||
// |
|||
// BeneficiaryDetailViewInterface.swift |
|||
// GME Remit |
|||
// |
|||
// Created by Manish Adhikari on 24/03/2023. |
|||
//Copyright © 2023 Gobal Money Express Co. Ltd. All rights reserved. |
|||
// |
|||
|
|||
protocol BeneficiaryDetailViewInterface: class { |
|||
func showLoading() |
|||
func hideLoading() |
|||
func show(error: String) |
|||
func show(message: String) |
|||
} |
@ -0,0 +1,34 @@ |
|||
// |
|||
// BeneficiaryDetailWireframe.swift |
|||
// GME Remit |
|||
// |
|||
// Created by Manish Adhikari on 24/03/2023. |
|||
//Copyright © 2023 Gobal Money Express Co. Ltd. All rights reserved. |
|||
// |
|||
|
|||
import UIKit |
|||
|
|||
class BeneficiaryDetailWireframe { |
|||
weak var view: UIViewController! |
|||
} |
|||
|
|||
extension BeneficiaryDetailWireframe: BeneficiaryDetailWireframeInput { |
|||
|
|||
var storyboardName: String {return "BeneficiaryDetail"} |
|||
|
|||
func getMainView() -> UIViewController { |
|||
let service = BeneficiaryDetailService() |
|||
let interactor = BeneficiaryDetailInteractor(service: service) |
|||
let presenter = BeneficiaryDetailPresenter() |
|||
let viewController = viewControllerFromStoryboard(of: BeneficiaryDetailViewController.self) |
|||
|
|||
viewController.presenter = presenter |
|||
interactor.output = presenter |
|||
presenter.interactor = interactor |
|||
presenter.wireframe = self |
|||
presenter.view = viewController |
|||
|
|||
self.view = viewController |
|||
return viewController |
|||
} |
|||
} |
@ -0,0 +1,13 @@ |
|||
// |
|||
// BeneficiaryDetailWireframeInput.swift |
|||
// GME Remit |
|||
// |
|||
// Created by Manish Adhikari on 24/03/2023. |
|||
//Copyright © 2023 Gobal Money Express Co. Ltd. All rights reserved. |
|||
// |
|||
|
|||
import Foundation |
|||
|
|||
protocol BeneficiaryDetailWireframeInput: WireframeInput { |
|||
|
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue