fix PatientCard
parent
d41fd496b6
commit
c8e5a7eeef
@ -0,0 +1,446 @@
|
||||
//
|
||||
// ViewController.swift
|
||||
// Lets-Build-OTPublisher
|
||||
//
|
||||
// Created by Roberto Perez Cubero on 11/08/16.
|
||||
// Copyright © 2016 tokbox. All rights reserved.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
import OpenTok
|
||||
|
||||
// The converted code is limited to 2 KB.
|
||||
// Refill your credit or upgrade your plan to remove this limitation.
|
||||
//
|
||||
// Converted to Swift 5.2 by Swiftify v5.2.26743 - https://swiftify.com/
|
||||
//
|
||||
// ClingoVideoCallViewController.m
|
||||
// Runner
|
||||
//
|
||||
// Created by Mohammad Aljammal & Elham on 23/6/20.
|
||||
// Copyright © 2020 The Chromium Authors. All rights reserved.
|
||||
//
|
||||
|
||||
|
||||
|
||||
|
||||
import AVFoundation
|
||||
|
||||
var dateFormatter: DateFormatter?
|
||||
|
||||
|
||||
class ClingoVideoCallViewController : UIViewController, OTSessionDelegate, OTSubscriberDelegate, OTPublisherDelegate{
|
||||
|
||||
var kApiKey: String?
|
||||
var kSessionId: String?
|
||||
var kToken: String?
|
||||
var session: OTSession?
|
||||
var publisher: OTPublisher?
|
||||
var subscriber: OTSubscriber?
|
||||
var callDuration: String?
|
||||
var warningDuration: String?
|
||||
var appLang: String?
|
||||
|
||||
|
||||
|
||||
@IBOutlet weak var localVideo: UIView!
|
||||
@IBOutlet weak var remoteVideo: UIView!
|
||||
@IBOutlet weak var controlButtons: UIView!
|
||||
@IBOutlet weak var remoteVideoMutedIndicator: UIImageView!
|
||||
@IBOutlet weak var localVideoMutedBg: UIImageView!
|
||||
@IBOutlet weak var localVideoMutedIndicator: UIImageView!
|
||||
@IBOutlet weak var remainingTimeLBL: UILabel!
|
||||
@IBOutlet weak var pgView: UIProgressView!
|
||||
var timer: Timer?
|
||||
|
||||
|
||||
|
||||
|
||||
func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
dateFormatter = DateFormatter()
|
||||
|
||||
setupButtons()
|
||||
askForMicrophonePermission()
|
||||
requestCameraPermissionsIfNeeded()
|
||||
hideVideoMuted()
|
||||
setupSession()
|
||||
// Do any additional setup after loading the view.
|
||||
}
|
||||
|
||||
func viewDidDisappear(_ animated: Bool) {
|
||||
sessionDisconnect()
|
||||
timer.invalidate()
|
||||
timer = nil
|
||||
PgView.hidden = true
|
||||
remainingTimeLBL.hidden = true
|
||||
}
|
||||
|
||||
// MARK: -Microphone Camera and Permission Request
|
||||
func askForMicrophonePermission() {
|
||||
switch AVAudioSession.sharedInstance().recordPermission {
|
||||
case AVAudioSessionRecordPermissionGranted:
|
||||
break
|
||||
case AVAudioSessionRecordPermissionDenied:
|
||||
break
|
||||
case AVAudioSessionRecordPermissionUndetermined:
|
||||
// This is the initial state before a user has made any choice
|
||||
// You can use this spot to request permission here if you want
|
||||
AVAudioSession.sharedInstance().requestRecordPermission({ granted in
|
||||
// Check for granted
|
||||
})
|
||||
default:
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Converted to Swift 5.2 by Swiftify v5.2.26743 - https://swiftify.com/
|
||||
func requestCameraPermissionsIfNeeded() {
|
||||
|
||||
// check camera authorization status
|
||||
let authStatus: AVAuthorizationStatus = AVCaptureDevice.authorizationStatus(for: .video)
|
||||
switch authStatus {
|
||||
case .authorized: break
|
||||
// camera authorized
|
||||
// do camera intensive stuff
|
||||
case .notDetermined:
|
||||
// request authorization
|
||||
|
||||
AVCaptureDevice.requestAccess(for: .video, completionHandler: { granted in
|
||||
DispatchQueue.main.async(execute: {
|
||||
|
||||
if granted {
|
||||
// do camera intensive stuff
|
||||
} else {
|
||||
self.notifyUserOfCameraAccessDenial()
|
||||
}
|
||||
})
|
||||
})
|
||||
case .restricted, .denied:
|
||||
DispatchQueue.main.async(execute: {
|
||||
self.notifyUserOfCameraAccessDenial()
|
||||
})
|
||||
default:
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
func notifyUserOfCameraAccessDenial() {
|
||||
// display a useful message asking the user to grant permissions from within Settings > Privacy > Camera
|
||||
}
|
||||
|
||||
// MARK: - OpenTok methods
|
||||
func showAlert(_ string: String?) {
|
||||
// show alertview on main UI
|
||||
DispatchQueue.main.async(execute: {
|
||||
let alertVC = UIAlertController(
|
||||
title: "OTError",
|
||||
message: string,
|
||||
preferredStyle: .alert)
|
||||
self.present(alertVC, animated: true)
|
||||
})
|
||||
}
|
||||
|
||||
// MARK: - OpenTok methods
|
||||
// Converted to Swift 5.2 by Swiftify v5.2.26743 - https://swiftify.com/
|
||||
/// Asynchronously begins the session connect process. Some time later, we will
|
||||
/// expect a delegate method to call us back with the results of this action.
|
||||
func setupSession() {
|
||||
//setup one time session
|
||||
if session {
|
||||
session = nil
|
||||
}
|
||||
session = OTSession(
|
||||
apiKey: kApiKey,
|
||||
sessionId: kSessionId,
|
||||
delegate: self)
|
||||
do {
|
||||
try session.connect(withToken: kToken)
|
||||
} catch {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/// Sets up an instance of OTPublisher to use with this session. OTPubilsher
|
||||
/// binds to the device camera and microphone, and will provide A/V streams
|
||||
/// to the OpenTok session.
|
||||
func setupPublisher() {
|
||||
let settings = OTPublisherSettings()
|
||||
settings.name = UIDevice.current.name
|
||||
publisher = OTPublisher(delegate: self, settings: settings)
|
||||
|
||||
var error: OTError? = nil
|
||||
session.publish(publisher, error: &error)
|
||||
if error != nil {
|
||||
showAlert(error?.localizedDescription())
|
||||
}
|
||||
localVideo.addSubview(publisher.view)
|
||||
publisher.view.frame = CGRect(x: localVideo.bounds.origin.x, y: localVideo.bounds.origin.y, width: localVideo.bounds.size.width, height: localVideo.bounds.size.height)
|
||||
|
||||
}
|
||||
|
||||
/// Cleans up the publisher and its view. At this point, the publisher should not
|
||||
/// be attached to the session any more.
|
||||
func cleanupPublisher() {
|
||||
publisher?.view.removeFromSuperview()
|
||||
publisher = nil
|
||||
// this is a good place to notify the end-user that publishing has stopped.
|
||||
}
|
||||
|
||||
// Converted to Swift 5.2 by Swiftify v5.2.26743 - https://swiftify.com/
|
||||
/// Instantiates a subscriber for the given stream and asynchronously begins the
|
||||
/// process to begin receiving A/V content for this stream. Unlike doPublish,
|
||||
/// this method does not add the subscriber to the view hierarchy. Instead, we
|
||||
/// add the subscriber only after it has connected and begins receiving data.
|
||||
func setupSubscribe(_ stream: OTStream?) {
|
||||
subscriber = OTSubscriber(stream: stream, delegate: self)
|
||||
|
||||
var error: OTError? = nil
|
||||
session.subscribe(subscriber, error: &error)
|
||||
if error != nil {
|
||||
showAlert(error?.localizedDescription())
|
||||
}
|
||||
}
|
||||
|
||||
/// Cleans the subscriber from the view hierarchy, if any.
|
||||
/// NB: You do *not* have to call unsubscribe in your controller in response to
|
||||
/// a streamDestroyed event. Any subscribers (or the publisher) for a stream will
|
||||
/// be automatically removed from the session during cleanup of the stream.
|
||||
func cleanupSubscriber() {
|
||||
subscriber.view.removeFromSuperview()
|
||||
subscriber = nil
|
||||
}
|
||||
|
||||
|
||||
// Converted to Swift 5.2 by Swiftify v5.2.26743 - https://swiftify.com/
|
||||
// MARK: - OTSession delegate callbacks
|
||||
func sessionDidConnect(_ session: OTSession?) {
|
||||
if let sessionId = session?.sessionId {
|
||||
print("sessionDidConnect (\(sessionId))")
|
||||
}
|
||||
|
||||
// Step 2: We have successfully connected, now instantiate a publisher and
|
||||
// begin pushing A/V streams into OpenTok.
|
||||
setupPublisher()
|
||||
}
|
||||
|
||||
func sessionDidDisconnect(_ session: OTSession?) {
|
||||
var alertMessage: String? = nil
|
||||
if let sessionId = session?.sessionId {
|
||||
alertMessage = "Session disconnected: (\(sessionId))"
|
||||
}
|
||||
print("sessionDidDisconnect (\(alertMessage ?? ""))")
|
||||
}
|
||||
|
||||
func session(
|
||||
_ mySession: OTSession?,
|
||||
streamCreated stream: OTStream?
|
||||
) {
|
||||
if let streamId = stream?.streamId {
|
||||
print("session streamCreated (\(streamId))")
|
||||
}
|
||||
|
||||
if nil == subscriber {
|
||||
setupSubscribe(stream)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Converted to Swift 5.2 by Swiftify v5.2.26743 - https://swiftify.com/
|
||||
func session(
|
||||
_ session: OTSession?,
|
||||
streamDestroyed stream: OTStream?
|
||||
) {
|
||||
if let streamId = stream?.streamId {
|
||||
print("session streamDestroyed (\(streamId))")
|
||||
}
|
||||
|
||||
if subscriber.stream.streamId == stream?.streamId {
|
||||
cleanupSubscriber()
|
||||
}
|
||||
}
|
||||
|
||||
func session(
|
||||
_ session: OTSession?,
|
||||
connectionCreated connection: OTConnection?
|
||||
) {
|
||||
startTimer(callDuration, warningDuration)
|
||||
if let connectionId = connection?.connectionId {
|
||||
print("session connectionCreated (\(connectionId))")
|
||||
}
|
||||
}
|
||||
|
||||
func session(
|
||||
_ session: OTSession?,
|
||||
connectionDestroyed connection: OTConnection?
|
||||
) {
|
||||
if let connectionId = connection?.connectionId {
|
||||
print("session connectionDestroyed (\(connectionId))")
|
||||
}
|
||||
if subscriber.stream.connection.connectionId == connection?.connectionId {
|
||||
cleanupSubscriber()
|
||||
}
|
||||
sessionDisconnect()
|
||||
}
|
||||
|
||||
|
||||
// Converted to Swift 5.2 by Swiftify v5.2.26743 - https://swiftify.com/
|
||||
func session(
|
||||
_ session: ARSession,
|
||||
didFailWithError error: Error
|
||||
) {
|
||||
print("didFailWithError: (\(error))")
|
||||
}
|
||||
|
||||
func session(_ session: OTSession, receivedSignalType type: String?, from connection: OTConnection?, with string: String?) {
|
||||
print("\(session)")
|
||||
}
|
||||
|
||||
func sessionDisconnect() {
|
||||
if session && session.sessionConnectionStatus == OTSessionConnectionStatusConnected {
|
||||
print("disconnecting....")
|
||||
session.disconnect(nil)
|
||||
dismiss(animated: true)
|
||||
return
|
||||
}
|
||||
dismiss(animated: true)
|
||||
}
|
||||
|
||||
|
||||
// Converted to Swift 5.2 by Swiftify v5.2.26743 - https://swiftify.com/
|
||||
//do {
|
||||
// print(
|
||||
// "subscriberDidConnectToStream (\(subscriber.stream.connection.connectionId))")
|
||||
// assert(subscriber == subscriber)
|
||||
// remoteVideo.addSubview(subscriber.view)
|
||||
// subscriber.view.frame = remoteVideo.bounds
|
||||
// // self.remoteVideo=_publisher.view;
|
||||
//}
|
||||
|
||||
-
|
||||
do {
|
||||
print(
|
||||
"subscriber \(subscriber.stream.streamId) didFailWithError \(error)")
|
||||
}
|
||||
|
||||
// Converted to Swift 5.2 by Swiftify v5.2.26743 - https://swiftify.com/
|
||||
// MARK: - OTPublisher delegate callbacks
|
||||
func publisher(
|
||||
_ publisher: OTPublisherKit?,
|
||||
streamCreated stream: OTStream?
|
||||
) {
|
||||
print("Publishing")
|
||||
}
|
||||
|
||||
func publisher(
|
||||
_ publisher: OTPublisherKit?,
|
||||
streamDestroyed stream: OTStream?
|
||||
) {
|
||||
if subscriber.stream.streamId == stream?.streamId {
|
||||
cleanupSubscriber()
|
||||
}
|
||||
|
||||
cleanupPublisher()
|
||||
}
|
||||
|
||||
// Converted to Swift 5.2 by Swiftify v5.2.26743 - https://swiftify.com/
|
||||
func publisher(
|
||||
_ publisher: OTPublisherKit?,
|
||||
didFailWithError error: OTError?
|
||||
) {
|
||||
if let error = error {
|
||||
print("publisher didFailWithError \(error)")
|
||||
}
|
||||
cleanupPublisher()
|
||||
}
|
||||
|
||||
// MARK: - Ui Handel
|
||||
func hideVideoMuted() {
|
||||
remoteVideoMutedIndicator.hidden = true
|
||||
localVideoMutedBg.hidden = true
|
||||
localVideoMutedIndicator.hidden = true
|
||||
}
|
||||
|
||||
func setupButtons() {
|
||||
perform(#selector(hideControlButtons), with: nil, afterDelay: 3)
|
||||
let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(remoteVideoTapped(_:)))
|
||||
view.addGestureRecognizer(tapGestureRecognizer)
|
||||
view.isUserInteractionEnabled = true
|
||||
}
|
||||
|
||||
// Converted to Swift 5.2 by Swiftify v5.2.26743 - https://swiftify.com/
|
||||
@objc func hideControlButtons() {
|
||||
controlButtons.hidden = true
|
||||
}
|
||||
|
||||
func remoteVideoTapped(_ recognizer: UITapGestureRecognizer?) {
|
||||
if controlButtons.hidden {
|
||||
controlButtons.hidden = false
|
||||
perform(#selector(hideControlButtons), with: nil, afterDelay: 3)
|
||||
}
|
||||
}
|
||||
|
||||
func resetHideButtonsTimer() {
|
||||
ClingoVideoCallViewController.cancelPreviousPerformRequests(withTarget: self)
|
||||
perform(#selector(hideControlButtons), with: nil, afterDelay: 3)
|
||||
}
|
||||
|
||||
|
||||
// Converted to Swift 5.2 by Swiftify v5.2.26743 - https://swiftify.com/
|
||||
@IBAction func didClickMuteButton(_ sender: UIButton) {
|
||||
sender.isSelected = !sender.isSelected
|
||||
publisher.publishAudio = !sender.isSelected
|
||||
resetHideButtonsTimer()
|
||||
}
|
||||
|
||||
@IBAction func didClickSpeakerButton(_ sender: UIButton) {
|
||||
sender.isSelected = !sender.isSelected
|
||||
subscriber.subscribeToAudio = !sender.isSelected
|
||||
resetHideButtonsTimer()
|
||||
}
|
||||
|
||||
@IBAction func didClickVideoMuteButton(_ sender: UIButton) {
|
||||
sender.isSelected = !sender.isSelected
|
||||
if publisher.publishVideo {
|
||||
publisher.publishVideo = false
|
||||
} else {
|
||||
publisher.publishVideo = true
|
||||
}
|
||||
localVideo.hidden = sender.isSelected
|
||||
localVideoMutedBg.hidden = !sender.isSelected
|
||||
localVideoMutedIndicator.hidden = !sender.isSelected
|
||||
resetHideButtonsTimer()
|
||||
}
|
||||
|
||||
|
||||
// Converted to Swift 5.2 by Swiftify v5.2.26743 - https://swiftify.com/
|
||||
@IBAction func didClickSwitchCameraButton(_ sender: UIButton) {
|
||||
sender.isSelected = !sender.isSelected
|
||||
if sender.isSelected {
|
||||
publisher.cameraPosition = RPCameraPosition(rawValue: AVCaptureDevice.Position.back.rawValue)
|
||||
} else {
|
||||
publisher.cameraPosition = RPCameraPosition(rawValue: AVCaptureDevice.Position.front.rawValue)
|
||||
}
|
||||
resetHideButtonsTimer()
|
||||
}
|
||||
|
||||
@IBAction func hangUp(_ sender: UIButton) {
|
||||
sessionDisconnect()
|
||||
}
|
||||
|
||||
// Converted to Swift 5.2 by Swiftify v5.2.26743 - https://swiftify.com/
|
||||
func startTimer(_ callDuration: String?, _ warningTime: String?) {
|
||||
}
|
||||
|
||||
func -currentTime as? Date!
|
||||
do {
|
||||
let startCallTime = Date()
|
||||
dateFormatter.dateFormat = "yyyyMMddHHmmss"
|
||||
let resultString = dateFormatter.string(from: startCallTime)
|
||||
let date = dateFormatter.date(from: resultString)
|
||||
return date
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,244 @@
|
||||
import 'package:doctor_app_flutter/config/config.dart';
|
||||
import 'package:doctor_app_flutter/config/size_config.dart';
|
||||
import 'package:doctor_app_flutter/icons_app/doctor_app_icons.dart';
|
||||
import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart';
|
||||
import 'package:doctor_app_flutter/util/date-utils.dart';
|
||||
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
|
||||
import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:hexcolor/hexcolor.dart';
|
||||
|
||||
class PatientCard extends StatelessWidget {
|
||||
final PatiantInformtion patientInfo;
|
||||
final Function onTap;
|
||||
final String patientType;
|
||||
const PatientCard({Key key, this.patientInfo, this.onTap, this.patientType}) : super(key: key);
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Container(
|
||||
padding: EdgeInsets.all(10),
|
||||
decoration: myBoxDecoration(),
|
||||
margin: EdgeInsets.only(bottom: 12),
|
||||
child: InkWell(
|
||||
child: Row(
|
||||
children: <Widget>[
|
||||
Column(
|
||||
mainAxisAlignment:
|
||||
MainAxisAlignment
|
||||
.start,
|
||||
children: <
|
||||
Widget>[
|
||||
Padding(
|
||||
padding: EdgeInsets
|
||||
.only(
|
||||
left:
|
||||
12.0),
|
||||
child:
|
||||
Container(
|
||||
decoration:
|
||||
BoxDecoration(
|
||||
boxShadow: [
|
||||
BoxShadow(
|
||||
color: Color.fromRGBO(
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0.08),
|
||||
offset: Offset(0.0,
|
||||
5.0),
|
||||
blurRadius:
|
||||
16.0)
|
||||
],
|
||||
borderRadius:
|
||||
BorderRadius.all(
|
||||
Radius.circular(35.0)),
|
||||
color: Color(
|
||||
0xffCCCCCC),
|
||||
),
|
||||
width: 70,
|
||||
height: 70,
|
||||
child: Icon(
|
||||
patientInfo.genderDescription ==
|
||||
"Male"
|
||||
? DoctorApp
|
||||
.male
|
||||
: DoctorApp
|
||||
.female_icon,
|
||||
size: 70,
|
||||
color: Colors
|
||||
.white,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
|
||||
SizedBox(
|
||||
width: 10,
|
||||
),
|
||||
Expanded(
|
||||
child: Column(
|
||||
crossAxisAlignment:CrossAxisAlignment.start,
|
||||
children: [
|
||||
AppText(
|
||||
patientInfo.firstName +
|
||||
" " +
|
||||
patientInfo.lastName,
|
||||
fontSize:
|
||||
2.0 * SizeConfig.textMultiplier,
|
||||
fontWeight:
|
||||
FontWeight.bold,
|
||||
backGroundcolor:
|
||||
Colors.white,
|
||||
),
|
||||
SizedBox(height: 12,),
|
||||
Table(
|
||||
border: TableBorder.symmetric(
|
||||
// inside: BorderSide(width: 2.0, color: Colors.white),
|
||||
),
|
||||
// defaultVerticalAlignment:TableCellVerticalAlignment.middle ,
|
||||
children: [
|
||||
TableRow(children: [
|
||||
Container(
|
||||
child: RichText(
|
||||
text: new TextSpan(
|
||||
style: new TextStyle(
|
||||
fontSize: 2.0 * SizeConfig.textMultiplier, color: Colors.black),
|
||||
children: <TextSpan>[
|
||||
new TextSpan(
|
||||
text: TranslationBase.of(context).fileNo,
|
||||
style: TextStyle(fontWeight: FontWeight.w700, fontSize: 2.2 * SizeConfig.textMultiplier)),
|
||||
new TextSpan(text: patientInfo.patientId.toString()),
|
||||
],),),
|
||||
),
|
||||
Container(
|
||||
child: RichText(
|
||||
text: new TextSpan(
|
||||
style: new TextStyle(
|
||||
fontSize: 2.0 * SizeConfig.textMultiplier, color: Colors.black),
|
||||
children: <TextSpan>[
|
||||
new TextSpan(
|
||||
text: TranslationBase.of(context).age+ " : ",
|
||||
style: TextStyle(fontWeight: FontWeight.w700, )),
|
||||
new TextSpan(text: "${DateUtils.getAgeByBirthday(patientInfo.dateofBirth, context)}"),
|
||||
],),),
|
||||
),
|
||||
]
|
||||
),
|
||||
TableRow(children: [
|
||||
SizedBox(height: 5,),
|
||||
SizedBox(height: 5,)
|
||||
]),
|
||||
TableRow(children: [
|
||||
Container(
|
||||
child: RichText(
|
||||
text: new TextSpan(
|
||||
style: new TextStyle(
|
||||
fontSize: 2.0 * SizeConfig.textMultiplier, color: Colors.black),
|
||||
children: <TextSpan>[
|
||||
new TextSpan(
|
||||
text: TranslationBase.of(context).nationality + " : ",
|
||||
style: TextStyle(fontWeight: FontWeight.w700, fontSize: 2.2 * SizeConfig.textMultiplier)),
|
||||
new TextSpan(text: (patientInfo.nationalityName ?? patientInfo.nationality)),
|
||||
],),),
|
||||
),
|
||||
|
||||
|
||||
Container(
|
||||
child: RichText(
|
||||
text: new TextSpan(
|
||||
style: new TextStyle(
|
||||
fontSize: 2.0 * SizeConfig.textMultiplier, color: Colors.black),
|
||||
children: <TextSpan>[
|
||||
new TextSpan(
|
||||
text: TranslationBase.of(context).gender + " : ",
|
||||
style: TextStyle(fontWeight: FontWeight.w700, )),
|
||||
new TextSpan(text: patientInfo.gender.toString() == '1' ? 'Male' : 'Female'),
|
||||
],),),
|
||||
),
|
||||
]
|
||||
),
|
||||
|
||||
],
|
||||
),
|
||||
if(SERVICES_PATIANT2[int.parse(patientType)] == "List_MyOutPatient")
|
||||
Container(
|
||||
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: <Widget>[
|
||||
Container(
|
||||
height: 15,
|
||||
width: 60,
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(25),
|
||||
color: HexColor("#20A169"),
|
||||
),
|
||||
child: AppText(
|
||||
patientInfo.startTime,
|
||||
color: Colors.white,
|
||||
fontSize: 1.5 * SizeConfig.textMultiplier,
|
||||
textAlign: TextAlign.center,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
SizedBox(
|
||||
width: 3.5,
|
||||
),
|
||||
Container(
|
||||
child: AppText(
|
||||
convertDateFormat2(patientInfo.appointmentDate.toString()),
|
||||
fontSize: 1.5 * SizeConfig.textMultiplier,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
SizedBox(
|
||||
height: 0.5,
|
||||
)
|
||||
],
|
||||
),
|
||||
margin: EdgeInsets.only(top: 8,),
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
// Divider(color: Colors.grey)
|
||||
],
|
||||
),
|
||||
onTap: onTap,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
convertDateFormat2(String str) {
|
||||
String timeConvert;
|
||||
const start = "/Date(";
|
||||
const end = "+0300)";
|
||||
|
||||
final startIndex = str.indexOf(start);
|
||||
final endIndex = str.indexOf(end, startIndex + start.length);
|
||||
|
||||
var date = new DateTime.fromMillisecondsSinceEpoch(
|
||||
int.parse(str.substring(startIndex + start.length, endIndex)));
|
||||
String newDate = date.year.toString() +
|
||||
"/" +
|
||||
date.month.toString().padLeft(2, '0') +
|
||||
"/" +
|
||||
date.day.toString().padLeft(2, '0');
|
||||
|
||||
return newDate.toString();
|
||||
}
|
||||
|
||||
myBoxDecoration() {
|
||||
return BoxDecoration(
|
||||
border: Border(
|
||||
bottom: BorderSide(
|
||||
color: Color(0xffCCCCCC),
|
||||
width: 0.5,
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue